Merge "Deprecate ORMTable::getFieldPrefix"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 14 Oct 2014 18:28:57 +0000 (18:28 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 14 Oct 2014 18:28:57 +0000 (18:28 +0000)
1705 files changed:
COPYING
CREDITS
RELEASE-NOTES-1.24
RELEASE-NOTES-1.25 [new file with mode: 0644]
composer.json
docs/hooks.txt
docs/kss/Makefile
docs/kss/styleguide-template/index.html
docs/kss/styleguide-template/public/kss.less
docs/skin.txt
docs/uidesign/design.html
img_auth.php
includes/AjaxDispatcher.php
includes/AjaxResponse.php
includes/AutoLoader.php
includes/Block.php
includes/CategoryFinder.php [new file with mode: 0644]
includes/CategoryViewer.php
includes/Categoryfinder.php [deleted file]
includes/ChangeTags.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/Export.php
includes/Feed.php
includes/GlobalFunctions.php
includes/HistoryBlob.php
includes/Hooks.php
includes/Html.php
includes/HttpFunctions.php
includes/Import.php
includes/Linker.php
includes/MagicWord.php
includes/MediaWiki.php
includes/Message.php
includes/MessageBlobStore.php
includes/MimeMagic.php
includes/MovePage.php [new file with mode: 0644]
includes/OutputPage.php
includes/PHPVersionError.php
includes/Pager.php [deleted file]
includes/Preferences.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/Revision.php
includes/Sanitizer.php
includes/Setup.php
includes/SiteConfiguration.php
includes/StatCounter.php
includes/Status.php
includes/TimestampException.php [deleted file]
includes/Title.php
includes/User.php
includes/UserMailer.php [deleted file]
includes/WatchedItem.php
includes/WebRequest.php
includes/WebStart.php
includes/Xml.php
includes/actions/Action.php
includes/actions/HistoryAction.php
includes/actions/RawAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiClearHasMsg.php [new file with mode: 0644]
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatDbg.php
includes/api/ApiFormatDump.php
includes/api/ApiFormatFeedWrapper.php [new file with mode: 0644]
includes/api/ApiFormatJson.php
includes/api/ApiFormatNone.php
includes/api/ApiFormatPhp.php
includes/api/ApiFormatRaw.php
includes/api/ApiFormatTxt.php
includes/api/ApiFormatWddx.php
includes/api/ApiFormatXml.php
includes/api/ApiFormatYaml.php
includes/api/ApiHelp.php
includes/api/ApiImageRotate.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/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPatrol.php
includes/api/ApiProtect.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBacklinksprop.php [new file with mode: 0644]
includes/api/ApiQueryBase.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRedirects.php [deleted file]
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryTokens.php [new file with mode: 0644]
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiResult.php
includes/api/ApiRevisionDelete.php
includes/api/ApiRollback.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiTokens.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiWatch.php
includes/api/i18n/en.json [new file with mode: 0644]
includes/api/i18n/qqq.json [new file with mode: 0644]
includes/cache/HTMLFileCache.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/LocalisationCache.php
includes/cache/MapCacheLRU.php
includes/cache/MessageCache.php
includes/cache/bloom/BloomCache.php [new file with mode: 0644]
includes/cache/bloom/BloomCacheRedis.php [new file with mode: 0644]
includes/cache/bloom/BloomFilters.php [new file with mode: 0644]
includes/changes/ChangesFeed.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/config/Config.php
includes/config/ConfigFactory.php
includes/config/GlobalVarConfig.php
includes/config/HashConfig.php [new file with mode: 0644]
includes/config/MultiConfig.php [new file with mode: 0644]
includes/config/MutableConfig.php [new file with mode: 0644]
includes/content/AbstractContent.php
includes/content/CodeContentHandler.php [new file with mode: 0644]
includes/content/ContentHandler.php
includes/content/CssContent.php
includes/content/CssContentHandler.php
includes/content/JSONContent.php [deleted file]
includes/content/JSONContentHandler.php [deleted file]
includes/content/JavaScriptContent.php
includes/content/JavaScriptContentHandler.php
includes/content/JsonContent.php [new file with mode: 0644]
includes/content/JsonContentHandler.php [new file with mode: 0644]
includes/content/MessageContent.php
includes/content/TextContent.php
includes/content/TextContentHandler.php
includes/content/WikitextContent.php
includes/content/WikitextContentHandler.php
includes/context/RequestContext.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseMysqli.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/DatabaseUtility.php
includes/db/IORMTable.php
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/db/ORMTable.php
includes/debug/MWDebug.php
includes/deferred/DeferredUpdates.php
includes/deferred/SearchUpdate.php
includes/deferred/SqlDataUpdate.php
includes/deferred/SquidUpdate.php
includes/diff/DifferenceEngine.php
includes/exception/MWExceptionHandler.php
includes/exception/TimestampException.php [new file with mode: 0644]
includes/externalstore/ExternalStoreDB.php
includes/filebackend/FileBackend.php
includes/filebackend/SwiftFileBackend.php
includes/filerepo/FileRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/gallery/ImageGalleryBase.php
includes/gallery/PackedImageGallery.php
includes/gallery/PackedOverlayImageGallery.php
includes/htmlform/HTMLAutoCompleteSelectField.php [new file with mode: 0644]
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLCheckMatrix.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLFormFieldCloner.php
includes/htmlform/HTMLHiddenField.php
includes/htmlform/HTMLMultiSelectField.php
includes/htmlform/HTMLTextField.php
includes/installer/CliInstaller.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/be-tarask.json
includes/installer/i18n/be.json
includes/installer/i18n/bg.json
includes/installer/i18n/bn.json
includes/installer/i18n/br.json
includes/installer/i18n/ca.json
includes/installer/i18n/cs.json
includes/installer/i18n/de.json
includes/installer/i18n/en-gb.json
includes/installer/i18n/en.json
includes/installer/i18n/es.json
includes/installer/i18n/et.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/gl.json
includes/installer/i18n/he.json
includes/installer/i18n/ia.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/ko.json
includes/installer/i18n/ksh.json
includes/installer/i18n/lb.json
includes/installer/i18n/mai.json
includes/installer/i18n/mk.json
includes/installer/i18n/ms.json
includes/installer/i18n/mt.json
includes/installer/i18n/nap.json
includes/installer/i18n/nb.json
includes/installer/i18n/ne.json
includes/installer/i18n/nl.json
includes/installer/i18n/oc.json
includes/installer/i18n/pa.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/ro.json
includes/installer/i18n/ru.json
includes/installer/i18n/sc.json
includes/installer/i18n/sco.json
includes/installer/i18n/sl.json
includes/installer/i18n/su.json
includes/installer/i18n/sv.json
includes/installer/i18n/uk.json
includes/installer/i18n/vi.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/jobqueue/Job.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobRunner.php
includes/jobqueue/jobs/AssembleUploadChunksJob.php
includes/jobqueue/jobs/PublishStashedFileJob.php
includes/jobqueue/jobs/ThumbnailRenderJob.php [new file with mode: 0644]
includes/json/FormatJson.php
includes/libs/APACHE-LICENSE-2.0.txt [new file with mode: 0644]
includes/libs/CSSJanus.php
includes/libs/CSSMin.php
includes/libs/ProcessCacheLRU.php
includes/libs/XmlTypeCheck.php
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/MoveLogFormatter.php
includes/mail/EmailNotification.php [new file with mode: 0644]
includes/mail/MailAddress.php [new file with mode: 0644]
includes/mail/UserMailer.php [new file with mode: 0644]
includes/media/Bitmap.php
includes/media/DjVuImage.php
includes/media/Exif.php
includes/media/ExifBitmap.php
includes/media/MediaHandler.php
includes/media/PNG.php
includes/media/TransformationalImageHandler.php [new file with mode: 0644]
includes/media/XCF.php
includes/media/XMP.php
includes/mime.info
includes/mime.types
includes/objectcache/BagOStuff.php
includes/objectcache/HashBagOStuff.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/pager/AlphabeticPager.php [new file with mode: 0644]
includes/pager/IndexPager.php [new file with mode: 0644]
includes/pager/Pager.php [new file with mode: 0644]
includes/pager/ReverseChronologicalPager.php [new file with mode: 0644]
includes/pager/TablePager.php [new file with mode: 0644]
includes/parser/CoreParserFunctions.php
includes/parser/LinkHolderArray.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/password/PasswordFactory.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimpleDB.php
includes/rcfeed/MachineReadableRCFeedFormatter.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderEditToolbarModule.php [new file with mode: 0644]
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderLESSFunctions.php [deleted file]
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderSkinModule.php [new file with mode: 0644]
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelItem.php [new file with mode: 0644]
includes/revisiondelete/RevDelList.php [new file with mode: 0644]
includes/revisiondelete/RevisionDeleteAbstracts.php [deleted file]
includes/search/SearchHighlighter.php
includes/search/SearchMssql.php
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/search/SearchResult.php
includes/search/SearchResultSet.php
includes/site/SiteSQLStore.php
includes/skins/BaseTemplate.php [new file with mode: 0644]
includes/skins/MediaWikiI18N.php [new file with mode: 0644]
includes/skins/QuickTemplate.php [new file with mode: 0644]
includes/skins/Skin.php
includes/skins/SkinApi.php [new file with mode: 0644]
includes/skins/SkinApiTemplate.php [new file with mode: 0644]
includes/skins/SkinFactory.php
includes/skins/SkinFallback.php
includes/skins/SkinFallbackTemplate.php
includes/skins/SkinTemplate.php
includes/specialpage/ImageQueryPage.php
includes/specialpage/QueryPage.php
includes/specialpage/RedirectSpecialPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialApiHelp.php [new file with mode: 0644]
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialCategories.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialImport.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialListusers.php
includes/specials/SpecialLog.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMediaStatistics.php [new file with mode: 0644]
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRandomInCategory.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialResetTokens.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/templates/NoLocalSettings.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/utils/Cdb.php
includes/utils/MWCryptHKDF.php
includes/utils/MWCryptRand.php
includes/utils/UIDGenerator.php
includes/utils/ZipDirectoryReader.php
languages/Language.php
languages/LanguageConverter.php
languages/Names.php
languages/i18n/ace.json
languages/i18n/aeb.json
languages/i18n/af.json
languages/i18n/aln.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/arc.json
languages/i18n/arn.json
languages/i18n/arq.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/avk.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/bho.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/bo.json
languages/i18n/bpy.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/bto.json [new file with mode: 0644]
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ceb.json
languages/i18n/ch.json
languages/i18n/ckb.json
languages/i18n/co.json
languages/i18n/cps.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/csb.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/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/fur.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gag.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/gv.json
languages/i18n/hak.json
languages/i18n/haw.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/ht.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ie.json
languages/i18n/ig.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jam.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kaa.json
languages/i18n/kab.json
languages/i18n/kbd-cyrl.json
languages/i18n/khw.json
languages/i18n/kiu.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/kw.json
languages/i18n/ky.json
languages/i18n/la.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lfn.json
languages/i18n/lg.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/lmo.json
languages/i18n/loz.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/ltg.json
languages/i18n/lus.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/mhr.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/mwl.json
languages/i18n/my.json
languages/i18n/myv.json
languages/i18n/mzn.json
languages/i18n/nah.json
languages/i18n/nan.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/or.json
languages/i18n/os.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pcd.json
languages/i18n/pdc.json
languages/i18n/pfl.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/pnt.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/qug.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/sat.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sdc.json
languages/i18n/se.json
languages/i18n/sei.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/so.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/tet.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/tly.json
languages/i18n/to.json
languages/i18n/tr.json
languages/i18n/tru.json
languages/i18n/ts.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/tyv.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vmf.json
languages/i18n/vo.json
languages/i18n/vot.json
languages/i18n/vro.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/MessagesAf.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBr.php
languages/messages/MessagesBxr.php
languages/messages/MessagesCdo.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesGsw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHt.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKm.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKw.php
languages/messages/MessagesLb.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMr.php
languages/messages/MessagesMyv.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesPa.php
languages/messages/MessagesPl.php
languages/messages/MessagesQu.php
languages/messages/MessagesRu.php
languages/messages/MessagesScn.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSv.php
languages/messages/MessagesTh.php
languages/messages/MessagesTly.php
languages/messages/MessagesTr.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUk.php
languages/messages/MessagesVi.php
languages/messages/MessagesYue.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
load.php
maintenance/Maintenance.php
maintenance/archives/patch-fa_major_mime-chemical.sql [new file with mode: 0644]
maintenance/archives/patch-img_major_mime-chemical.sql [new file with mode: 0644]
maintenance/archives/patch-oi_major_mime-chemical.sql [new file with mode: 0644]
maintenance/archives/patch-restructure.sql [deleted file]
maintenance/archives/upgradeLogging.php
maintenance/backupTextPass.inc
maintenance/checkSyntax.php
maintenance/cleanupRemovedModules.php
maintenance/cleanupTitles.php
maintenance/commandLine.inc
maintenance/cssjanus/COPYING [deleted file]
maintenance/cssjanus/LICENSE [deleted file]
maintenance/cssjanus/README [deleted file]
maintenance/cssjanus/cssjanus.py [deleted file]
maintenance/cssjanus/csslex.py [deleted file]
maintenance/deleteEqualMessages.php
maintenance/dictionary/mediawiki.dic
maintenance/doMaintenance.php
maintenance/findHooks.php
maintenance/findMissingFiles.php
maintenance/getConfiguration.php
maintenance/importSiteScripts.php
maintenance/jsduck/config.json
maintenance/language/generateCollationData.php
maintenance/mssql/archives/patch-fa_major_mime-chemical.sql [new file with mode: 0644]
maintenance/mssql/archives/patch-img_major_mime-chemical.sql [new file with mode: 0644]
maintenance/mssql/archives/patch-oi_major_mime-chemical.sql [new file with mode: 0644]
maintenance/mssql/tables.sql
maintenance/mssql/update-keys.sql [new file with mode: 0644]
maintenance/mwdoc-filter.php
maintenance/oracle/tables.sql
maintenance/populateBloomCache.php [new file with mode: 0644]
maintenance/preprocessorFuzzTest.php
maintenance/purgeChangedPages.php
maintenance/purgeOldText.inc [deleted file]
maintenance/resources/update-oojs-ui.sh
maintenance/showJobs.php
maintenance/sql.php
maintenance/sqlite.inc
maintenance/storage/compressOld.php
maintenance/storage/recompressTracked.php
maintenance/storage/resolveStubs.php
maintenance/syncFileBackend.php
maintenance/tables.sql
maintenance/update-keys.sql [new file with mode: 0644]
maintenance/updateCollation.php
maintenance/userOptions.inc
mw-config/config.js
mw-config/images/installer-logo.png
resources/Resources.php
resources/assets/file-type-icons/COPYING [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-c.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-cpp.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-deb.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-djvu.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-djvu.xcf [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-dvi.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-exe.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-h.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-html.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-iso.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-java.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-mid.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-mov.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-o.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-ogg.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-ogg.xcf [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-pdf.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-ps.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-psd.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-rm.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-rpm.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-svg.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-tar.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-tex.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-ttf.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-txt.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon-xcf.png [new file with mode: 0644]
resources/assets/file-type-icons/fileicon.png [new file with mode: 0644]
resources/assets/licenses/cc-0.png [new file with mode: 0644]
resources/assets/licenses/cc-by-nc-sa.png [new file with mode: 0644]
resources/assets/licenses/cc-by-sa.png [new file with mode: 0644]
resources/assets/licenses/cc-by.png [new file with mode: 0644]
resources/assets/licenses/gnu-fdl.png [new file with mode: 0644]
resources/assets/licenses/public-domain.png [new file with mode: 0644]
resources/assets/mediawiki.png [new file with mode: 0644]
resources/assets/poweredby_mediawiki_88x31.png [new file with mode: 0644]
resources/assets/wiki.png [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css
resources/lib/jquery/jquery.json.js [deleted file]
resources/lib/moment/lang/af.js [deleted file]
resources/lib/moment/lang/ar-ma.js [deleted file]
resources/lib/moment/lang/ar-sa.js [deleted file]
resources/lib/moment/lang/ar.js [deleted file]
resources/lib/moment/lang/az.js [deleted file]
resources/lib/moment/lang/be.js [deleted file]
resources/lib/moment/lang/bg.js [deleted file]
resources/lib/moment/lang/bn.js [deleted file]
resources/lib/moment/lang/bo.js [deleted file]
resources/lib/moment/lang/br.js [deleted file]
resources/lib/moment/lang/bs.js [deleted file]
resources/lib/moment/lang/ca.js [deleted file]
resources/lib/moment/lang/cs.js [deleted file]
resources/lib/moment/lang/cv.js [deleted file]
resources/lib/moment/lang/cy.js [deleted file]
resources/lib/moment/lang/da.js [deleted file]
resources/lib/moment/lang/de-at.js [deleted file]
resources/lib/moment/lang/de.js [deleted file]
resources/lib/moment/lang/el.js [deleted file]
resources/lib/moment/lang/en-au.js [deleted file]
resources/lib/moment/lang/en-ca.js [deleted file]
resources/lib/moment/lang/en-gb.js [deleted file]
resources/lib/moment/lang/eo.js [deleted file]
resources/lib/moment/lang/es.js [deleted file]
resources/lib/moment/lang/et.js [deleted file]
resources/lib/moment/lang/eu.js [deleted file]
resources/lib/moment/lang/fa.js [deleted file]
resources/lib/moment/lang/fi.js [deleted file]
resources/lib/moment/lang/fo.js [deleted file]
resources/lib/moment/lang/fr-ca.js [deleted file]
resources/lib/moment/lang/fr.js [deleted file]
resources/lib/moment/lang/gl.js [deleted file]
resources/lib/moment/lang/he.js [deleted file]
resources/lib/moment/lang/hi.js [deleted file]
resources/lib/moment/lang/hr.js [deleted file]
resources/lib/moment/lang/hu.js [deleted file]
resources/lib/moment/lang/hy-am.js [deleted file]
resources/lib/moment/lang/id.js [deleted file]
resources/lib/moment/lang/is.js [deleted file]
resources/lib/moment/lang/it.js [deleted file]
resources/lib/moment/lang/ja.js [deleted file]
resources/lib/moment/lang/ka.js [deleted file]
resources/lib/moment/lang/km.js [deleted file]
resources/lib/moment/lang/ko.js [deleted file]
resources/lib/moment/lang/lb.js [deleted file]
resources/lib/moment/lang/lt.js [deleted file]
resources/lib/moment/lang/lv.js [deleted file]
resources/lib/moment/lang/mk.js [deleted file]
resources/lib/moment/lang/ml.js [deleted file]
resources/lib/moment/lang/mr.js [deleted file]
resources/lib/moment/lang/ms-my.js [deleted file]
resources/lib/moment/lang/my.js [deleted file]
resources/lib/moment/lang/nb.js [deleted file]
resources/lib/moment/lang/ne.js [deleted file]
resources/lib/moment/lang/nl.js [deleted file]
resources/lib/moment/lang/nn.js [deleted file]
resources/lib/moment/lang/pl.js [deleted file]
resources/lib/moment/lang/pt-br.js [deleted file]
resources/lib/moment/lang/pt.js [deleted file]
resources/lib/moment/lang/ro.js [deleted file]
resources/lib/moment/lang/ru.js [deleted file]
resources/lib/moment/lang/sk.js [deleted file]
resources/lib/moment/lang/sl.js [deleted file]
resources/lib/moment/lang/sq.js [deleted file]
resources/lib/moment/lang/sr-cyrl.js [deleted file]
resources/lib/moment/lang/sr.js [deleted file]
resources/lib/moment/lang/sv.js [deleted file]
resources/lib/moment/lang/ta.js [deleted file]
resources/lib/moment/lang/th.js [deleted file]
resources/lib/moment/lang/tl-ph.js [deleted file]
resources/lib/moment/lang/tr.js [deleted file]
resources/lib/moment/lang/tzm-latn.js [deleted file]
resources/lib/moment/lang/tzm.js [deleted file]
resources/lib/moment/lang/uk.js [deleted file]
resources/lib/moment/lang/uz.js [deleted file]
resources/lib/moment/lang/vi.js [deleted file]
resources/lib/moment/lang/zh-cn.js [deleted file]
resources/lib/moment/lang/zh-tw.js [deleted file]
resources/lib/moment/locale/af.js [new file with mode: 0644]
resources/lib/moment/locale/ar-ma.js [new file with mode: 0644]
resources/lib/moment/locale/ar-sa.js [new file with mode: 0644]
resources/lib/moment/locale/ar.js [new file with mode: 0644]
resources/lib/moment/locale/az.js [new file with mode: 0644]
resources/lib/moment/locale/be.js [new file with mode: 0644]
resources/lib/moment/locale/bg.js [new file with mode: 0644]
resources/lib/moment/locale/bn.js [new file with mode: 0644]
resources/lib/moment/locale/bo.js [new file with mode: 0644]
resources/lib/moment/locale/br.js [new file with mode: 0644]
resources/lib/moment/locale/bs.js [new file with mode: 0644]
resources/lib/moment/locale/ca.js [new file with mode: 0644]
resources/lib/moment/locale/cs.js [new file with mode: 0644]
resources/lib/moment/locale/cv.js [new file with mode: 0644]
resources/lib/moment/locale/cy.js [new file with mode: 0644]
resources/lib/moment/locale/da.js [new file with mode: 0644]
resources/lib/moment/locale/de-at.js [new file with mode: 0644]
resources/lib/moment/locale/de.js [new file with mode: 0644]
resources/lib/moment/locale/el.js [new file with mode: 0644]
resources/lib/moment/locale/en-au.js [new file with mode: 0644]
resources/lib/moment/locale/en-ca.js [new file with mode: 0644]
resources/lib/moment/locale/en-gb.js [new file with mode: 0644]
resources/lib/moment/locale/eo.js [new file with mode: 0644]
resources/lib/moment/locale/es.js [new file with mode: 0644]
resources/lib/moment/locale/et.js [new file with mode: 0644]
resources/lib/moment/locale/eu.js [new file with mode: 0644]
resources/lib/moment/locale/fa.js [new file with mode: 0644]
resources/lib/moment/locale/fi.js [new file with mode: 0644]
resources/lib/moment/locale/fo.js [new file with mode: 0644]
resources/lib/moment/locale/fr-ca.js [new file with mode: 0644]
resources/lib/moment/locale/fr.js [new file with mode: 0644]
resources/lib/moment/locale/gl.js [new file with mode: 0644]
resources/lib/moment/locale/he.js [new file with mode: 0644]
resources/lib/moment/locale/hi.js [new file with mode: 0644]
resources/lib/moment/locale/hr.js [new file with mode: 0644]
resources/lib/moment/locale/hu.js [new file with mode: 0644]
resources/lib/moment/locale/hy-am.js [new file with mode: 0644]
resources/lib/moment/locale/id.js [new file with mode: 0644]
resources/lib/moment/locale/is.js [new file with mode: 0644]
resources/lib/moment/locale/it.js [new file with mode: 0644]
resources/lib/moment/locale/ja.js [new file with mode: 0644]
resources/lib/moment/locale/ka.js [new file with mode: 0644]
resources/lib/moment/locale/km.js [new file with mode: 0644]
resources/lib/moment/locale/ko.js [new file with mode: 0644]
resources/lib/moment/locale/lb.js [new file with mode: 0644]
resources/lib/moment/locale/lt.js [new file with mode: 0644]
resources/lib/moment/locale/lv.js [new file with mode: 0644]
resources/lib/moment/locale/mk.js [new file with mode: 0644]
resources/lib/moment/locale/ml.js [new file with mode: 0644]
resources/lib/moment/locale/mr.js [new file with mode: 0644]
resources/lib/moment/locale/ms-my.js [new file with mode: 0644]
resources/lib/moment/locale/my.js [new file with mode: 0644]
resources/lib/moment/locale/nb.js [new file with mode: 0644]
resources/lib/moment/locale/ne.js [new file with mode: 0644]
resources/lib/moment/locale/nl.js [new file with mode: 0644]
resources/lib/moment/locale/nn.js [new file with mode: 0644]
resources/lib/moment/locale/pl.js [new file with mode: 0644]
resources/lib/moment/locale/pt-br.js [new file with mode: 0644]
resources/lib/moment/locale/pt.js [new file with mode: 0644]
resources/lib/moment/locale/ro.js [new file with mode: 0644]
resources/lib/moment/locale/ru.js [new file with mode: 0644]
resources/lib/moment/locale/sk.js [new file with mode: 0644]
resources/lib/moment/locale/sl.js [new file with mode: 0644]
resources/lib/moment/locale/sq.js [new file with mode: 0644]
resources/lib/moment/locale/sr-cyrl.js [new file with mode: 0644]
resources/lib/moment/locale/sr.js [new file with mode: 0644]
resources/lib/moment/locale/sv.js [new file with mode: 0644]
resources/lib/moment/locale/ta.js [new file with mode: 0644]
resources/lib/moment/locale/th.js [new file with mode: 0644]
resources/lib/moment/locale/tl-ph.js [new file with mode: 0644]
resources/lib/moment/locale/tr.js [new file with mode: 0644]
resources/lib/moment/locale/tzm-latn.js [new file with mode: 0644]
resources/lib/moment/locale/tzm.js [new file with mode: 0644]
resources/lib/moment/locale/uk.js [new file with mode: 0644]
resources/lib/moment/locale/uz.js [new file with mode: 0644]
resources/lib/moment/locale/vi.js [new file with mode: 0644]
resources/lib/moment/locale/zh-cn.js [new file with mode: 0644]
resources/lib/moment/locale/zh-tw.js [new file with mode: 0644]
resources/lib/moment/moment.js
resources/lib/oojs-ui/dist/themes/apex/images/icons/add.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/advanced.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/alert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/check.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/clear.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/close.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/code.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/collapse.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/comment.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/expand.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/help.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/info.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/link.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/menu.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/move-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/move-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/picture.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/remove.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/search.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/settings.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/tag.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/icons/window.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/indicators/alert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-down.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-up.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/indicators/required.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/apex/images/textures/transparency.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-constructive.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-primary.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-destructive.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/mediawiki/images/textures/transparency.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/minerva/images/icons/check-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/dist/themes/minerva/images/icons/check.png [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ar.json
resources/lib/oojs-ui/i18n/arq.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/br.json
resources/lib/oojs-ui/i18n/el.json
resources/lib/oojs-ui/i18n/gu.json
resources/lib/oojs-ui/i18n/hr.json
resources/lib/oojs-ui/i18n/hu.json
resources/lib/oojs-ui/i18n/hy.json
resources/lib/oojs-ui/i18n/ja.json
resources/lib/oojs-ui/i18n/kn.json
resources/lib/oojs-ui/i18n/ko.json
resources/lib/oojs-ui/i18n/nb.json
resources/lib/oojs-ui/i18n/nl.json
resources/lib/oojs-ui/i18n/sr-el.json
resources/lib/oojs-ui/i18n/sw.json
resources/lib/oojs-ui/i18n/uk.json
resources/lib/oojs-ui/i18n/yue.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/zh-hant.json
resources/lib/oojs-ui/images/anchor.svg [deleted file]
resources/lib/oojs-ui/images/icons/accept.png [deleted file]
resources/lib/oojs-ui/images/icons/accept.svg [deleted file]
resources/lib/oojs-ui/images/icons/add-item.png [deleted file]
resources/lib/oojs-ui/images/icons/add-item.svg [deleted file]
resources/lib/oojs-ui/images/icons/advanced.png [deleted file]
resources/lib/oojs-ui/images/icons/advanced.svg [deleted file]
resources/lib/oojs-ui/images/icons/alert.png [deleted file]
resources/lib/oojs-ui/images/icons/alert.svg [deleted file]
resources/lib/oojs-ui/images/icons/arched-arrow-ltr.png [deleted file]
resources/lib/oojs-ui/images/icons/arched-arrow-ltr.svg [deleted file]
resources/lib/oojs-ui/images/icons/arched-arrow-rtl.png [deleted file]
resources/lib/oojs-ui/images/icons/arched-arrow-rtl.svg [deleted file]
resources/lib/oojs-ui/images/icons/check.png [deleted file]
resources/lib/oojs-ui/images/icons/check.svg [deleted file]
resources/lib/oojs-ui/images/icons/clear.png [deleted file]
resources/lib/oojs-ui/images/icons/clear.svg [deleted file]
resources/lib/oojs-ui/images/icons/close.png [deleted file]
resources/lib/oojs-ui/images/icons/close.svg [deleted file]
resources/lib/oojs-ui/images/icons/code.png [deleted file]
resources/lib/oojs-ui/images/icons/code.svg [deleted file]
resources/lib/oojs-ui/images/icons/collapse.png [deleted file]
resources/lib/oojs-ui/images/icons/collapse.svg [deleted file]
resources/lib/oojs-ui/images/icons/comment.png [deleted file]
resources/lib/oojs-ui/images/icons/comment.svg [deleted file]
resources/lib/oojs-ui/images/icons/expand.png [deleted file]
resources/lib/oojs-ui/images/icons/expand.svg [deleted file]
resources/lib/oojs-ui/images/icons/help.png [deleted file]
resources/lib/oojs-ui/images/icons/help.svg [deleted file]
resources/lib/oojs-ui/images/icons/history.png [deleted file]
resources/lib/oojs-ui/images/icons/history.svg [deleted file]
resources/lib/oojs-ui/images/icons/info.png [deleted file]
resources/lib/oojs-ui/images/icons/info.svg [deleted file]
resources/lib/oojs-ui/images/icons/link.png [deleted file]
resources/lib/oojs-ui/images/icons/link.svg [deleted file]
resources/lib/oojs-ui/images/icons/menu.png [deleted file]
resources/lib/oojs-ui/images/icons/menu.svg [deleted file]
resources/lib/oojs-ui/images/icons/move-ltr.png [deleted file]
resources/lib/oojs-ui/images/icons/move-ltr.svg [deleted file]
resources/lib/oojs-ui/images/icons/move-rtl.png [deleted file]
resources/lib/oojs-ui/images/icons/move-rtl.svg [deleted file]
resources/lib/oojs-ui/images/icons/picture.png [deleted file]
resources/lib/oojs-ui/images/icons/picture.svg [deleted file]
resources/lib/oojs-ui/images/icons/remove-item.png [deleted file]
resources/lib/oojs-ui/images/icons/remove-item.svg [deleted file]
resources/lib/oojs-ui/images/icons/remove.png [deleted file]
resources/lib/oojs-ui/images/icons/remove.svg [deleted file]
resources/lib/oojs-ui/images/icons/search.png [deleted file]
resources/lib/oojs-ui/images/icons/search.svg [deleted file]
resources/lib/oojs-ui/images/icons/settings.png [deleted file]
resources/lib/oojs-ui/images/icons/settings.svg [deleted file]
resources/lib/oojs-ui/images/icons/tag.png [deleted file]
resources/lib/oojs-ui/images/icons/tag.svg [deleted file]
resources/lib/oojs-ui/images/icons/window.png [deleted file]
resources/lib/oojs-ui/images/icons/window.svg [deleted file]
resources/lib/oojs-ui/images/indicators/alert.png [deleted file]
resources/lib/oojs-ui/images/indicators/alert.svg [deleted file]
resources/lib/oojs-ui/images/indicators/arrow-down.png [deleted file]
resources/lib/oojs-ui/images/indicators/arrow-down.svg [deleted file]
resources/lib/oojs-ui/images/indicators/arrow-ltr.png [deleted file]
resources/lib/oojs-ui/images/indicators/arrow-ltr.svg [deleted file]
resources/lib/oojs-ui/images/indicators/arrow-rtl.png [deleted file]
resources/lib/oojs-ui/images/indicators/arrow-rtl.svg [deleted file]
resources/lib/oojs-ui/images/indicators/arrow-up.png [deleted file]
resources/lib/oojs-ui/images/indicators/arrow-up.svg [deleted file]
resources/lib/oojs-ui/images/indicators/required.png [deleted file]
resources/lib/oojs-ui/images/indicators/required.svg [deleted file]
resources/lib/oojs-ui/images/textures/pending.gif [deleted file]
resources/lib/oojs-ui/images/textures/transparency.png [deleted file]
resources/lib/oojs-ui/images/toolbar-shadow.png [deleted file]
resources/lib/oojs-ui/oojs-ui-agora.css [deleted file]
resources/lib/oojs-ui/oojs-ui-agora.rtl.css [deleted file]
resources/lib/oojs-ui/oojs-ui-apex.css
resources/lib/oojs-ui/oojs-ui-apex.js [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-apex.rtl.css
resources/lib/oojs-ui/oojs-ui-apex.svg.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-apex.svg.rtl.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-mediawiki.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-mediawiki.js [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-mediawiki.rtl.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-mediawiki.svg.rtl.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-minerva.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-minerva.js [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-minerva.rtl.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-minerva.svg.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-minerva.svg.rtl.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui.css [deleted file]
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.rtl.css
resources/lib/oojs-ui/oojs-ui.svg.css [deleted file]
resources/lib/oojs-ui/oojs-ui.svg.rtl.css
resources/lib/oojs-ui/themes/agora/images/icons/check.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/add.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/advanced.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/alert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/check.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/clear.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/close.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/code.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/collapse.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/comment.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/expand.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/help.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/info.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/link.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/menu.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/picture.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/remove.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/search.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/settings.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/tag.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/window.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/indicators/alert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/indicators/required.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/textures/pending.gif [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/textures/transparency.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/add.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-primary.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/check.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/clear-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/clear.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/code-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/code.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/collapse-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/collapse.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/comment-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/comment.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/expand-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/expand.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/info-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/info.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/link.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-destructive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/remove.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/search-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/search.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/settings-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/settings.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/window-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/window.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/textures/pending.gif [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/textures/transparency.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/minerva/images/icons/check-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/minerva/images/icons/check.svg [new file with mode: 0644]
resources/lib/oojs/oojs.jquery.js
resources/src/jquery.json-deprecate.js [deleted file]
resources/src/jquery/jquery.autoEllipsis.js
resources/src/jquery/jquery.byteLimit.js
resources/src/jquery/jquery.confirmable.js
resources/src/jquery/jquery.confirmable.mediawiki.js
resources/src/jquery/jquery.farbtastic.js
resources/src/jquery/jquery.hidpi.js
resources/src/jquery/jquery.mwExtension.js
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.action/images/nextredirect-ltr.png [new file with mode: 0644]
resources/src/mediawiki.action/images/nextredirect-rtl.png [new file with mode: 0644]
resources/src/mediawiki.action/images/redirect-ltr.png [new file with mode: 0644]
resources/src/mediawiki.action/images/redirect-rtl.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js
resources/src/mediawiki.action/mediawiki.action.edit.js
resources/src/mediawiki.action/mediawiki.action.edit.styles.css
resources/src/mediawiki.action/mediawiki.action.history.diff.css
resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js
resources/src/mediawiki.action/mediawiki.action.view.metadata.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.metadata.js
resources/src/mediawiki.action/mediawiki.action.view.redirect.js [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.redirectToFragment.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.category.js
resources/src/mediawiki.api/mediawiki.api.edit.js
resources/src/mediawiki.api/mediawiki.api.js
resources/src/mediawiki.api/mediawiki.api.parse.js
resources/src/mediawiki.api/mediawiki.api.watch.js
resources/src/mediawiki.language/languages/fi.js
resources/src/mediawiki.language/languages/he.js
resources/src/mediawiki.language/languages/hy.js
resources/src/mediawiki.language/languages/os.js
resources/src/mediawiki.language/languages/ru.js
resources/src/mediawiki.language/languages/uk.js
resources/src/mediawiki.language/mediawiki.language.fallback.js [new file with mode: 0644]
resources/src/mediawiki.language/mediawiki.language.init.js
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.language/mediawiki.language.numbers.js
resources/src/mediawiki.legacy/ajax.js [new file with mode: 0644]
resources/src/mediawiki.legacy/commonPrint.css [new file with mode: 0644]
resources/src/mediawiki.legacy/images/ajax-loader.gif [new file with mode: 0644]
resources/src/mediawiki.legacy/images/checker.png [new file with mode: 0644]
resources/src/mediawiki.legacy/images/feed-icon.png [new file with mode: 0644]
resources/src/mediawiki.legacy/images/feed-icon.svg [new file with mode: 0644]
resources/src/mediawiki.legacy/images/help-question-hover.gif [new file with mode: 0644]
resources/src/mediawiki.legacy/images/help-question.gif [new file with mode: 0644]
resources/src/mediawiki.legacy/images/question.png [new file with mode: 0644]
resources/src/mediawiki.legacy/images/question.svg [new file with mode: 0644]
resources/src/mediawiki.legacy/images/spinner.gif [new file with mode: 0644]
resources/src/mediawiki.legacy/oldshared.css [new file with mode: 0644]
resources/src/mediawiki.legacy/protect.js [new file with mode: 0644]
resources/src/mediawiki.legacy/shared.css [new file with mode: 0644]
resources/src/mediawiki.legacy/wikibits.js [new file with mode: 0644]
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.less/mediawiki.ui/variables.less
resources/src/mediawiki.libs/CLDRPluralRuleParser.js
resources/src/mediawiki.page/mediawiki.page.image.pagination.js
resources/src/mediawiki.page/mediawiki.page.ready.js
resources/src/mediawiki.skinning/content.css [new file with mode: 0644]
resources/src/mediawiki.skinning/content.externallinks.css [new file with mode: 0644]
resources/src/mediawiki.skinning/content.parsoid.less
resources/src/mediawiki.skinning/elements.css [new file with mode: 0755]
resources/src/mediawiki.skinning/images/audio-ltr.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/audio-ltr.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/audio-rtl.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/audio-rtl.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/chat-ltr.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/chat-ltr.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/chat-rtl.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/chat-rtl.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/document-ltr.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/document-ltr.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/document-rtl.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/document-rtl.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/external link icons.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/external-ltr.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/external-ltr.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/external-rtl.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/external-rtl.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/ftp-ltr.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/ftp-ltr.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/ftp-rtl.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/ftp-rtl.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/magnify-clip-ltr.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/magnify-clip-rtl.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/mail.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/mail.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/video.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/video.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/interface.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.import.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.preferences.css
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.special/mediawiki.special.search.js
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.userlogin.common.css
resources/src/mediawiki.special/mediawiki.special.version.css
resources/src/mediawiki.toolbar/images/ar/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/ar/button_headline.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/ar/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/ar/button_link.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/ar/button_nowiki.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/be-tarask/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/be-tarask/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/be-tarask/button_link.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/de/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/de/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/en/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/en/button_extlink.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/en/button_headline.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/en/button_hr.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/en/button_image.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/en/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/en/button_link.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/en/button_media.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/en/button_nowiki.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/en/button_sig.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/fa/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/fa/button_headline.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/fa/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/fa/button_link.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/fa/button_nowiki.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/ksh/LICENSE [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/ksh/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/ru/LICENSE [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/ru/button_bold.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/ru/button_italic.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/ru/button_link.png [new file with mode: 0644]
resources/src/mediawiki.toolbar/toolbar.js [new file with mode: 0644]
resources/src/mediawiki.toolbar/toolbar.less [new file with mode: 0644]
resources/src/mediawiki.ui/components/anchors.less
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/forms.less
resources/src/mediawiki.ui/components/icons.less [new file with mode: 0644]
resources/src/mediawiki.ui/components/images/ok.png [new file with mode: 0644]
resources/src/mediawiki.ui/components/images/ok.svg [new file with mode: 0644]
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.ui/components/text.less [new file with mode: 0644]
resources/src/mediawiki/images/arrow-sort-ascending.png [new file with mode: 0644]
resources/src/mediawiki/images/arrow-sort-ascending.svg [new file with mode: 0644]
resources/src/mediawiki/images/arrow-sort-descending.png [new file with mode: 0644]
resources/src/mediawiki/images/arrow-sort-descending.svg [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-forward-ltr.png [new file with mode: 0644]
resources/src/mediawiki/images/pager-arrow-forward-rtl.png [new file with mode: 0644]
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.apihelp.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.apipretty.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.confirmCloseWindow.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.debug.js
resources/src/mediawiki/mediawiki.debug.profile.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.notification.js
resources/src/mediawiki/mediawiki.pager.tablePager.less [new file with mode: 0644]
resources/src/mediawiki/mediawiki.user.js
resources/src/mediawiki/mediawiki.userSuggest.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.util.js
resources/src/polyfill-object-create.js [new file with mode: 0644]
resources/src/startup.js
skins/common/ajax.js [changed from file to symlink]
skins/common/commonContent.css [deleted file]
skins/common/commonElements.css [deleted file]
skins/common/commonInterface.css [deleted file]
skins/common/commonPrint.css [deleted file]
skins/common/feed.css [deleted file]
skins/common/images/Arr_d.png [deleted file]
skins/common/images/Arr_u.png [deleted file]
skins/common/images/Checker-16x16.png [deleted file]
skins/common/images/ajax-loader.gif [deleted file]
skins/common/images/ar/button_bold.png [deleted file]
skins/common/images/ar/button_headline.png [deleted file]
skins/common/images/ar/button_italic.png [deleted file]
skins/common/images/ar/button_link.png [deleted file]
skins/common/images/ar/button_nowiki.png [deleted file]
skins/common/images/arrow_disabled_first_25.png [deleted file]
skins/common/images/arrow_disabled_last_25.png [deleted file]
skins/common/images/arrow_disabled_left_25.png [deleted file]
skins/common/images/arrow_disabled_right_25.png [deleted file]
skins/common/images/arrow_first_25.png [deleted file]
skins/common/images/arrow_last_25.png [deleted file]
skins/common/images/arrow_left_25.png [deleted file]
skins/common/images/arrow_right_25.png [deleted file]
skins/common/images/be-tarask/button_bold.png [deleted file]
skins/common/images/be-tarask/button_italic.png [deleted file]
skins/common/images/be-tarask/button_link.png [deleted file]
skins/common/images/button_bold.png [deleted file]
skins/common/images/button_extlink.png [deleted file]
skins/common/images/button_headline.png [deleted file]
skins/common/images/button_hr.png [deleted file]
skins/common/images/button_image.png [deleted file]
skins/common/images/button_italic.png [deleted file]
skins/common/images/button_link.png [deleted file]
skins/common/images/button_media.png [deleted file]
skins/common/images/button_nowiki.png [deleted file]
skins/common/images/button_sig.png [deleted file]
skins/common/images/button_template.png [deleted file]
skins/common/images/cc-0.png [deleted file]
skins/common/images/cc-by-nc-sa.png [deleted file]
skins/common/images/cc-by-sa.png [deleted file]
skins/common/images/cc-by.png [deleted file]
skins/common/images/closewindow19x19.png [deleted file]
skins/common/images/cyrl/LICENSE [deleted file]
skins/common/images/cyrl/button_bold.png [deleted file]
skins/common/images/cyrl/button_italic.png [deleted file]
skins/common/images/cyrl/button_link.png [deleted file]
skins/common/images/de/button_bold.png [deleted file]
skins/common/images/de/button_italic.png [deleted file]
skins/common/images/fa/button_bold.png [deleted file]
skins/common/images/fa/button_headline.png [deleted file]
skins/common/images/fa/button_italic.png [deleted file]
skins/common/images/fa/button_link.png [deleted file]
skins/common/images/fa/button_nowiki.png [deleted file]
skins/common/images/feed-icon.png [deleted file]
skins/common/images/feed-icon.svg [deleted file]
skins/common/images/gnu-fdl.png [deleted file]
skins/common/images/help-question-hover.gif [deleted file]
skins/common/images/help-question.gif [deleted file]
skins/common/images/icons/COPYING [deleted file]
skins/common/images/icons/fileicon-c.png [deleted file]
skins/common/images/icons/fileicon-cpp.png [deleted file]
skins/common/images/icons/fileicon-deb.png [deleted file]
skins/common/images/icons/fileicon-djvu.png [deleted file]
skins/common/images/icons/fileicon-djvu.xcf [deleted file]
skins/common/images/icons/fileicon-dvi.png [deleted file]
skins/common/images/icons/fileicon-exe.png [deleted file]
skins/common/images/icons/fileicon-h.png [deleted file]
skins/common/images/icons/fileicon-html.png [deleted file]
skins/common/images/icons/fileicon-iso.png [deleted file]
skins/common/images/icons/fileicon-java.png [deleted file]
skins/common/images/icons/fileicon-mid.png [deleted file]
skins/common/images/icons/fileicon-mov.png [deleted file]
skins/common/images/icons/fileicon-o.png [deleted file]
skins/common/images/icons/fileicon-ogg.png [deleted file]
skins/common/images/icons/fileicon-ogg.xcf [deleted file]
skins/common/images/icons/fileicon-pdf.png [deleted file]
skins/common/images/icons/fileicon-ps.png [deleted file]
skins/common/images/icons/fileicon-psd.png [deleted file]
skins/common/images/icons/fileicon-rm.png [deleted file]
skins/common/images/icons/fileicon-rpm.png [deleted file]
skins/common/images/icons/fileicon-svg.png [deleted file]
skins/common/images/icons/fileicon-tar.png [deleted file]
skins/common/images/icons/fileicon-tex.png [deleted file]
skins/common/images/icons/fileicon-ttf.png [deleted file]
skins/common/images/icons/fileicon-txt.png [deleted file]
skins/common/images/icons/fileicon-xcf.png [deleted file]
skins/common/images/icons/fileicon.png [deleted file]
skins/common/images/ksh/LICENSE [deleted file]
skins/common/images/ksh/button_S_italic.png [deleted file]
skins/common/images/mediawiki.png [deleted file]
skins/common/images/nextredirectltr.png [deleted file]
skins/common/images/nextredirectrtl.png [deleted file]
skins/common/images/poweredby_mediawiki_88x31.png [deleted file]
skins/common/images/public-domain.png [deleted file]
skins/common/images/question-small.png [deleted file]
skins/common/images/question.svg [deleted file]
skins/common/images/spinner.gif [deleted file]
skins/common/images/wiki.png [deleted file]
skins/common/oldshared.css [deleted file]
skins/common/protect.js [deleted file]
skins/common/shared.css [deleted file]
skins/common/upload.js [deleted file]
skins/common/wikibits.js [changed from file to symlink]
tests/TestsAutoLoader.php
tests/browser/Gemfile [changed mode: 0755->0644]
tests/browser/Gemfile.lock
tests/browser/features/create_account.feature
tests/browser/features/create_and_follow_wiki_link.feature
tests/browser/features/edit_page.feature
tests/browser/features/file.feature
tests/browser/features/login.feature
tests/browser/features/main_page_links.feature
tests/browser/features/preferences.feature
tests/browser/features/support/pages/preferences_appearance_page.rb
tests/browser/features/view_history.feature
tests/frontend/Gruntfile.js
tests/frontend/package.json
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/parser/preprocess/All_system_messages.expected
tests/parser/preprocess/All_system_messages.txt
tests/parserTests.php
tests/phpunit/LessFileCompilationTest.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/data/css/expected.css [new file with mode: 0644]
tests/phpunit/data/css/simple-ltr.gif [new file with mode: 0644]
tests/phpunit/data/css/simple-rtl.gif [new file with mode: 0644]
tests/phpunit/data/css/test.css [new file with mode: 0644]
tests/phpunit/data/cssmin/circle.svg [new file with mode: 0644]
tests/phpunit/data/localisationcache/en.json [new file with mode: 0644]
tests/phpunit/data/localisationcache/ru.json [new file with mode: 0644]
tests/phpunit/data/localisationcache/uk.json [new file with mode: 0644]
tests/phpunit/includes/ArticleTablesTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/GitInfoTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfAppendQueryTest.php [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
tests/phpunit/includes/HttpTest.php
tests/phpunit/includes/ImportTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/LocalisationCacheTest.php [deleted file]
tests/phpunit/includes/MWTimestampTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/MovePageTest.php [new file with mode: 0644]
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PasswordTest.php
tests/phpunit/includes/PrefixSearchTest.php [new file with mode: 0644]
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TitleArrayFromResultTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/UserArrayFromResultTest.php
tests/phpunit/includes/UserMailerTest.php [deleted file]
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/XmlJsTest.php
tests/phpunit/includes/actions/ActionTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiModuleManagerTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/PrefixUniquenessTest.php
tests/phpunit/includes/api/RandomImageGenerator.php
tests/phpunit/includes/api/format/ApiFormatNoneTest.php [new file with mode: 0644]
tests/phpunit/includes/api/format/ApiFormatTestBase.php
tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
tests/phpunit/includes/api/query/ApiQueryContinueTest.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/api/query/ApiQueryTestBase.php
tests/phpunit/includes/cache/LocalisationCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/cache/RedisBloomCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/EnhancedChangesListTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/OldChangesListTest.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.php
tests/phpunit/includes/config/GlobalVarConfigTest.php
tests/phpunit/includes/config/HashConfigTest.php [new file with mode: 0644]
tests/phpunit/includes/config/MultiConfigTest.php [new file with mode: 0644]
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/JSONContentTest.php [deleted file]
tests/phpunit/includes/content/JsonContentTest.php [new file with mode: 0644]
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/ORMRowTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/deferred/DeferredUpdatesTest.php [new file with mode: 0644]
tests/phpunit/includes/diff/DifferenceEngineTest.php
tests/phpunit/includes/exception/MWExceptionTest.php
tests/phpunit/includes/htmlform/HTMLAutoCompleteSelectFieldTest.php [new file with mode: 0644]
tests/phpunit/includes/installer/DatabaseUpdaterTest.php [new file with mode: 0644]
tests/phpunit/includes/jobqueue/JobTest.php [new file with mode: 0644]
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/libs/CSSJanusTest.php [deleted file]
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/IPSetTest.php
tests/phpunit/includes/libs/MWMessagePackTest.php
tests/phpunit/includes/mail/MailAddressTest.php [new file with mode: 0644]
tests/phpunit/includes/mail/UserMailerTest.php [new file with mode: 0644]
tests/phpunit/includes/media/ExifRotationTest.php
tests/phpunit/includes/media/GIFTest.php
tests/phpunit/includes/media/MediaWikiMediaTestCase.php
tests/phpunit/includes/media/PNGTest.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/media/SVGTest.php
tests/phpunit/includes/normal/CleanUpTest.php
tests/phpunit/includes/objectcache/BagOStuffTest.php
tests/phpunit/includes/parser/MediaWikiParserTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/TidyTest.php
tests/phpunit/includes/password/BcryptPasswordTest.php
tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php
tests/phpunit/includes/password/PasswordTestCase.php
tests/phpunit/includes/password/Pbkdf2PasswordTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderLESSTest.php [deleted file]
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/fixtures/001-embeddable.css [deleted file]
tests/phpunit/includes/resourceloader/fixtures/001-embeddable.less [deleted file]
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/skins/SkinFactoryTest.php
tests/phpunit/includes/specialpage/SpecialPageFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/ImageListPagerTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/SpecialBooksourcesTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/SpecialListFilesTest.php [deleted file]
tests/phpunit/includes/specials/SpecialMIMESearchTest.php
tests/phpunit/includes/specials/SpecialMyLanguageTest.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/upload/UploadFromUrlTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/includes/utils/MWCryptHKDFTest.php
tests/phpunit/includes/utils/StringUtilsTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/mocks/media/MockImageHandler.php
tests/phpunit/structure/ResourcesTest.php
tests/phpunit/structure/StructureTest.php
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/qunit/suites/resources/startup.test.js
tests/testHelpers.inc
thumb.php

diff --git a/COPYING b/COPYING
index c3bed28..1cdc9d4 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -30,8 +30,10 @@ under the GPL for use of the whole code or other sections thereof.
 MediaWiki uses the following Creative Commons icons to illustrate links to the
 CC licenses:
 
-* skins/common/images/cc-by-nc-sa.png
-* skins/common/images/cc-by-sa.png
+* resources/assets/licenses/cc-0.png
+* resources/assets/licenses/cc-by-nc-sa.png
+* resources/assets/licenses/cc-by-sa.png
+* resources/assets/licenses/cc-by.png
 
 These icons are trademarked, and used subject to the CC trademark license,
 available at http://creativecommons.org/policies#trademark
diff --git a/CREDITS b/CREDITS
index 776e51b..e70a035 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -12,12 +12,13 @@ following names for their contribution to the product.
 * Alexander Monk
 * Alexandre Emsenhuber
 * Andrew Garrett
+* Antoine Musso
 * Arthur Richards
 * Aryeh Gregor
-* Antoine Musso
-* Brian Wolff
+* Bartosz Dziewoński
 * Bertrand Grondin
 * Brad Jorsch
+* Brian Wolff
 * Brion Vibber
 * Bryan Tong Minh
 * Chad Horohoe
@@ -40,13 +41,13 @@ following names for their contribution to the product.
 * Ilmari Karonen
 * Jack D. Pond
 * Jack Phoenix
+* Jackmcbarn
 * Jan Paul Posma
 * Jason Richey
 * Jeroen De Dauw
 * John Du Hart
 * Jon Harald Søby
 * Juliano F. Ravasi
-* Ryan Kaldari
 * Leo Koppelkamm
 * Leon Weber
 * Leslie Hoare
@@ -73,26 +74,27 @@ following names for their contribution to the product.
 * Robert Stojnić
 * Robin Pepermans
 * Rotem Liss
+* Ryan Kaldari
 * Ryan Lane
 * Ryan Schmidt
 * Sam Reed
 * Shinjiman
 * Siebrand Mazeland
-* SQL
 * Soxred93
+* SQL
 * Szymon Świerkosz
 * Thomas Bleher
+* Thomas Gries
 * Tim Starling
 * Timo Tijhof
-* Thomas Gries
 * Trevor Parscal
 * Victor Vasiliev
 * Yesid Carrillo
 * Yuri Astrakhan
 
 == Patch Contributors ==
-* Aaron Pramana
 * Aaron Ball
+* Aaron Pramana
 * Agbad
 * Ahmad Sherif
 * Alejandro Mery
@@ -103,7 +105,6 @@ following names for their contribution to the product.
 * Asier Lostalé
 * Azliq7
 * Bagariavivek
-* Bartosz Dziewoński
 * Beau
 * Benny Situ
 * Bergi
@@ -114,8 +115,8 @@ following names for their contribution to the product.
 * Carlin
 * Carsten Nielsen
 * Chris Steipp
-* Christian Neubauer
 * Christian Aistleitner
+* Christian Neubauer
 * Conrad Irwin
 * cryptocoryne
 * Dan Barrett
@@ -133,8 +134,8 @@ following names for their contribution to the product.
 * Erwin Dokter
 * Étienne Beaulé
 * Federico Leva
-* FunPika
 * fomafix
+* FunPika
 * Gabriel Wicke
 * Gero Scholz
 * Gilles van den Hoven
@@ -148,8 +149,8 @@ following names for their contribution to the product.
 * Jeremy Baron
 * Jidanni
 * Jimmy Xu
-* Jonathan Wiltshire
 * John N
+* Jonathan Wiltshire
 * JuneHyeon Bae
 * Jure Kajzer
 * Karun Dambiec
@@ -166,16 +167,16 @@ following names for their contribution to the product.
 * Lupo
 * Madman
 * Manuel Menal
+* Marc-André Pelletier
 * Marcin Cieślak
 * Marcus Buck
-* Marc-André Pelletier
 * Mark Hershberger
 * Mark Holmquist
 * Marooned
 * Mathias Ertl
-* Matthias Mullie
-* Matthew Britton
 * mati
+* Matthew Britton
+* Matthias Mullie
 * Max
 * Max Sikström
 * merl
@@ -185,20 +186,20 @@ following names for their contribution to the product.
 * Michael Newton
 * Michael Walsh
 * Mike Horvath
-* Mormegil
 * moejoe0000
+* Mormegil
 * MrBlueSky
 * MrPete
-* MZMcBride
 * mybugs.mail
+* MZMcBride
 * Nakon
 * Nathan Larson
 * nephele
 * Nik
-* Nx.devnull
 * Nikola Kovacs
 * Nikolaos S. Karastathis
 * Nischay Nahata
+* Nx.devnull
 * Olaf Lenz
 * Olivier Finlay Beaton
 * Patricio Molina
index d5446ae..2b5136e 100644 (file)
@@ -42,12 +42,13 @@ production.
   configurations are $wgDeletedDirectory and $wgHashedUploadDirectory.
 * The deprecated $wgUseCommaCount variable has been removed.
 * $wgEnableSorbs and $wgSorbsUrl have been removed.
-* The UserCryptPassword and UserComparePassword hooks are no longer called. Any extensions
-  using them must be updated to use the Password Hashing API.
+* The UserCryptPassword and UserComparePassword hooks are no longer called.
+  Any extensions using them must be updated to use the Password Hashing API.
 * $wgCompiledFiles has been removed.
 * $wgSortSpecialPages was removed, the listing on Special:SpecialPages is
   now always sorted.
-* Users must be able to edit a page to be able to delete it.
+* $wgSpecialPages may now use callback functions as an alternative to plain class names.
+  This allows more control over constructor parameters.
 * $wgHTCPMulticastAddress, $wgHTCPMulticastRouting and $wgHTCPPort were removed.
 * $wgRC2UDPAddress, $wgRC2UDPInterwikiPrefix, $wgRC2UDPOmitBots, $wgRC2UDPPort
   and $wgRC2UDPPrefix have been removed.
@@ -57,8 +58,27 @@ production.
   there is a maintenance script wrapOldPassword.php that can wrap all passwords in
   PBKDF2 (or the hashing algorithm of your choice) if you don't want to wait for your
   users to log in.
+* $wgImportSources can now 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. Existing configurations will still work.
+* Users must be able to edit through a page's protection to be able to delete it.
+* The default thumb size ($wgDefaultUserOptions['thumbsize']) is now 300px, up from
+  180px. If you have altered the number of entries in $wgThumbLimits for your wiki, you
+  may need to adjust your default user settings to compensate for the index change.
+* $wgDeferredUpdateList is now deprecated, you should use DeferredUpdates::addUpdate()
+  instead.
+* $wgCanonicalLanguageLinks has been removed. Per Google recommendations, we
+  will not send a rel=canonical pointing to a variant-neutral page, however
+  we will send rel=alternate.
+* $wgResourceLoaderLESSFunctions has been deprecated and will be removed in the future.
+* $wgGoToEdit has been removed. Use the SpecialSearchNogomatch hook for similar
+  functionality.
 
 === New features in 1.24 ===
+* Added new hook WatchlistEditorBeforeFormRender, allowing subscribers to
+  manipulate the list of pages and/or preload lots of data at once.
+* Added new argument &$link in hook WatchlistEditorBuildRemoveLine, allowing the
+  link to the title to be changed.
 * Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
   WhatLinksHere entries.
 * Added a new hook, "ContentGetParserOutput", to customize parser output for
@@ -131,7 +151,7 @@ production.
   Special:PageLanguage. All pages are set to wiki language by default.
   The feature needs to be enabled with $wgPageLanguageUseDB=true and
   permission needs to be set for 'pagelang'.
-* Upgrade Moment.js to v2.8.1.
+* Upgrade Moment.js to v2.8.3.
 * (bug 67042) Added support for the HTML5 <rtc> tag for East Asian typography.
 * Upgrade Sinon.JS to 1.10.3.
 * Added the es5-shim polyfill for older or non-compliant javascript engines.
@@ -147,7 +167,7 @@ production.
   similar way, links like [[localInterwikiPrefix:File:Image.png]] and
   [[localInterwikiPrefix:Category:Hello]] will now render as regular links, and
   will not include the file or add the page to the category.
-* New special page, MyLanguages, to redirect users to subpages with localised
+* New special page, MyLanguage, to redirect users to subpages with localised
   versions of a page. (Integrated from Extension:Translate)
 * MediaWiki now supports multiple password types, including bcrypt and PBKDF2.
   The default type can be changed with $wgPasswordDefault and the type
@@ -159,7 +179,23 @@ production.
 * (bug 15484) Users will now be redirected to the login page when they need to
   log in, rather than being shown a page asking them to log in and having to click
   another link to actually get to the login page.
-* A JSONContent and JSONContentHandler were added for extensions to extend.
+* A JsonContent and JsonContentHandler were added for extensions to extend.
+* (bug 35045) Redirects to sections will now update the URL in browser's address
+  bar using the HTML5 History API. When [[Dog]] redirects to [[Animals#Dog]],
+  the user will now see "Animals#Dog" in their browser instead of "Dog#Dog".
+* API token handling has been rewritten. Any API module using tokens will need
+  to be updated. See the entry below under "Action API internal changes".
+* Added HTMLAutoCompleteSelectField.
+* Added a new hook, "SkinPreloadExistence", to allow extensions to add titles to
+  link existence cache before the page is rendered.
+* Config::set() was moved to its own interface, MutableConfig. GlobalVarConfig::set()
+  is now deprecated, does not implement MutableConfig.
+* A MutableConfig named HashConfig was added, that stores an array of configuration
+  settings.
+* (bug 69418) A MultiConfig implementation was added that supports fallback
+  to multiple Config instances.
+* Update CSSJanus to v1.1.0.
+* Added FormatJson::parse() returning status with result or localized error message
 
 === Bug fixes in 1.24 ===
 * (bug 50572) MediaWiki:Blockip should support gender
@@ -190,21 +226,28 @@ production.
 * (bug 67870) wfShellExec() cuts off stdout at multiples of 8192 bytes.
 * $wgRunJobsAsync now works with private wikis (e.g. read requires login).
 * (bugs 57238, 65206) Blank pages can now be directly created.
-
-=== Web API changes in 1.24 ===
+* (bug 69789) Title::getContentModel() now loads from the database when
+  necessary instead of incorrectly returning the default content model.
+* (bug 69249) wfBaseConvert() now works around PHP Bug #50175 when using GMP.
+* (bug 57909) URLs in the externallinks table will no longer have certain
+  characters decoded in the query string.
+* (bug 67368) LESS mixins like .background-image() correctly flip image
+  references for RTL stylesheets now.
+
+=== Action API changes in 1.24 ===
 * action=parse API now supports prop=modules, which provides the list of
   ResourceLoader modules that should be used to enhance the parsed content.
 * action=query&meta=siteinfo&siprop=interwikimap returns a new "protorel"
-  field which is true iff protocol-relative urls can be used to access
+  field which is true if protocol-relative urls can be used to access
   a particular interwiki map entry.
-* ApiQueryLogEvents now provides logpage, which is the page ID from the
+* list=logevents now provides logpage, which is the page ID from the
   logging table, if ids are requested and the user has the permissions.
 * action=edit now requires that appendtext, prependtext, or section=new be used
   when using the 'redirect' parameter, to prevent clients accidentally
   overwriting the target page with the content of the redirect.
-* action=logevents will now return an error if both letitle and leprefix are
+* list=logevents will now return an error if both letitle and leprefix are
   specified.
-* action=logevents has a new parameter, lenamespace, to allow filtering by
+* list=logevents has a new parameter, lenamespace, to allow filtering by
   namespace.
 * action=expandtemplates has a new parameter, prop, and a new output format.
   The old format is still used if prop isn't provided, but this is deprecated.
@@ -216,6 +259,31 @@ production.
 * (bug 60734) Actions that use ApiPageSet (e.g. purge, watch,
   setnotificationtimestamp) will now include continuation information when
   using a generator.
+* Removed 'props' and 'errors' from action=paraminfo, as they have extremely
+  limited use and are generally inaccurate, unmaintained, and impossible to
+  properly maintain.
+* Formats dbg, dump, txt, wddx, and yaml are now deprecated.
+* action=paraminfo now indicates when a parameter is specifying a submodule.
+* The iwurl parameter to prop=iwlinks is deprecated in favor of iwprop=url, for
+  parallelism with prop=langlinks.
+* All tokens should be fetched from action=query&meta=tokens; all other methods
+  of fetching tokens are deprecated. The value needed for meta=tokens's 'type'
+  parameter for each module is documented in the action=help output and is
+  returned from action=paraminfo.
+* New action ClearHasMsg that can be used to clear HasMsg flag.
+* The cmstartsortkey and cmendsortkey parameters to list=categorymembers are
+  deprecated in favor of cmstarthexsortkey and cmendhexsortkey.
+* (bug 63326) Add blockedtimestamp field to output of blockinfo property for
+  the list=allusers and list=users modules.
+* prop=imageinfo no longer requires iiurlwidth to be set when using iiurlparam.
+* Added prop=linkshere, prop=fileusage, and prop=transcludedin, which are
+  roughly equivalent to list=backlinks, list=imageusage, and list=embeddedin
+  but can work on a list of titles (including titles from a generator).
+* prop=redirects can now filter returned redirects by namespace.
+
+=== Action API internal changes in 1.24 ===
+* Methods for handling continuation are added to ApiResult, so actions other
+  than query that use generators can easily support continuation.
 * $wgAPIModules (and the related $wgAPIFormatModules, $wgAPIMetaModules,
   $wgAPIPropModules, and $wgAPIListModules settings) now allow API modules
   to be specified using a "module spec" array instead of a plain class name.
@@ -224,11 +292,74 @@ production.
   to use for the module. This is intended for extensions that want control over
   the instantiation of their API modules, to allow for proper dependency
   injection.
-* Removed 'props' and 'errors' from action=paraminfo, as they have extremely
-  limited use and are generally inaccurate, unmaintained, and impossible to
-  properly maintain. Also removed the corresponding methods from ApiBase and
-  the 'APIGetPossibleErrors' and 'APIGetResultProperties' hooks.
-* Formats dbg, dump, txt, wddx, and yaml are now deprecated.
+* A new param type 'submodule' is available. Parameters of this type will take
+  the list of valid values from the module's ApiModuleManager for the group
+  corresponding to the parameter name.
+* The 'APIGetPossibleErrors' and 'APIGetResultProperties' hooks are no longer used.
+* API token handling has been rewritten. Any API module using tokens will need
+  to be updated:
+  * ApiBase::needsToken now returns a token type instead of boolean true when a
+    token is needed. Returning true will throw an exception. See documentation
+    of that method for details.
+  * Information for the 'token' parameter is automatically set by ApiBase
+    getFinalParams and getFinalParamDescription.
+  * ApiBase::getTokenSalt has been removed.
+  * The hooks APIQueryInfoTokens, APIQueryRevisionsTokens,
+    APIQueryRecentChangesTokens, APIQueryUsersTokens, and
+    ApiTokensGetTokenTypes are deprecated, but are still called to support
+    backwards-compatible token access.
+* ApiBase::validateLimit and ApiBase::validateTimestamp are now protected.
+* ApiQueryRedirects was removed; prop=redirects is now implemented by
+  ApiQueryBacklinksProp along with the newly-added prop modules.
+* The following methods have been deprecated and may be removed in a future
+  release:
+  * ApiBase::getResultProperties
+  * ApiBase::getFinalResultProperties
+  * ApiBase::addTokenProperties
+  * ApiBase::getRequireOnlyOneParameterErrorMessages
+  * ApiBase::getRequireMaxOneParameterErrorMessages
+  * ApiBase::getRequireAtLeastOneParameterErrorMessages
+  * ApiBase::getTitleOrPageIdErrorMessage
+  * ApiBase::getPossibleErrors
+  * ApiBase::getFinalPossibleErrors
+  * ApiBase::parseErrors
+  * ApiQuery::setGeneratorContinue
+  * ApiQueryBase::checkRowCount
+  * ApiQueryBase::titleToKey
+  * ApiQueryBase::keyToTitle
+  * ApiQueryBase::keyPartToTitle
+  * ApiQueryInfo::getTokenFunctions
+  * ApiQueryInfo::resetTokenCache
+  * ApiQueryInfo::getEditToken
+  * ApiQueryInfo::getDeleteToken
+  * ApiQueryInfo::getProtectToken
+  * ApiQueryInfo::getMoveToken
+  * ApiQueryInfo::getBlockToken
+  * ApiQueryInfo::getUnblockToken
+  * ApiQueryInfo::getEmailToken
+  * ApiQueryInfo::getImportToken
+  * ApiQueryInfo::getWatchToken
+  * ApiQueryInfo::getOptionsToken
+  * ApiQueryRecentChanges::getTokenFunctions
+  * ApiQueryRecentChanges::getPatrolToken
+  * ApiQueryRevisions::getTokenFunctions
+  * ApiQueryRevisions::getRollbackToken
+  * ApiQueryUsers::getTokenFunctions
+  * ApiQueryUsers::getUserrightsToken
+* The following classes have been deprecated and may be removed in a future
+  release:
+  * ApiFormatDbg
+  * ApiFormatDump
+  * ApiFormatTxt
+  * ApiFormatWddx
+  * ApiFormatYaml
+  * ApiTokens
+* The following class constants have been deprecated and may be removed in a
+  future release:
+  * ApiBase::PROP_ROOT
+  * ApiBase::PROP_LIST
+  * ApiBase::PROP_TYPE
+  * ApiBase::PROP_NULLABLE
 
 === Languages updated in 1.24 ===
 
@@ -259,6 +390,13 @@ changes to languages because of Bugzilla reports.
   the "headelement" template key are no longer supported. Setting
   $useHeadElement = false; is no longer supported and will not cause old keys
   like "headlinks", "skinnameclass", etc. to be defined.
+* BREAKING CHANGE: The files commonElements.css, commonContent.css and
+  commonInterface.css (in skins/common/) have been removed. Skins may no longer
+  rely on their presence and include them in their style modules. ResourceLoader
+  modules introduced in MediaWiki 1.23 should be loaded instead:
+  - skins/common/commonElements.css  → 'mediawiki.skinning.elements' module
+  - skins/common/commonContent.css   → 'mediawiki.skinning.content' module
+  - skins/common/commonInterface.css → 'mediawiki.skinning.interface' module
 * The deprecated 'SpecialVersionExtensionTypes' hook was removed.
 * (bug 63891) Add 'X-Robots-Tag: noindex' header in action=render pages.
 * SpecialPage no longer supports the syntax for invoking wfSpecial*() functions.
@@ -288,7 +426,7 @@ changes to languages because of Bugzilla reports.
   set of hooks has been removed and replaced by a single new hook
   SpecialPageBeforeFormDisplay.
 * (bug 65781) Removed block warning on included {{Special:Contributions}}
-* Removed Skin::makeGlobalVariablesScript. (deprecated since 1.19)
+* Removed Skin::makeGlobalVariablesScript(). (deprecated since 1.19)
 * Removed MWNamespace::isMain(). (deprecated since 1.19)
 * Removed Preferences::loadOldSearchNs(). (deprecated since 1.19)
 * Removed OutputPage::getStatusMessage(). (deprecated since 1.18)
@@ -326,14 +464,47 @@ changes to languages because of Bugzilla reports.
   setPreloadedText() from EditPage.php. (deprecated since 1.21)
 * Removed global functions wfArrayLookup(), wfArrayMerge(), wfDebugDieBacktrace()
   and wfTime(). (deprecated since 1.22)
-* Microsoft Internet Explorer 6 is now a "grade C" browser, meaning that
-  JavaScript is no longer executed in this browser. The IEFixes script, which
-  existed purely to provide support for MSIE versions below 7 and which was
-  conditionally loaded for those browsers, was also removed.
+* Browser support for Internet Explorer 6 and 7 lowered from Grade A to Grade C,
+  meaning that JavaScript is no longer executed in these browser versions.
+* Browser support for Opera 11 lowered from Grade A to Grade C.
+* Removed IEFixes module which existed purely to provide support for MSIE versions
+* Deprecated SpecialPageFactory::getList() in favor of
+  SpecialPageFactory::getNames()
+  below 7 (conditionally loaded only for those browsers).
 * Action::checkCanExecute() no longer has a return value.
 * Removed cleanupForIRC(), loadFromCurRow(), newFromCurRow(), notifyRC2UDP()
   and sendToUDP() from RecentChange.php. (deprecated since 1.22)
 * Removed EnhancedChangesList::arrow(), sideArrow(), downArrow(), spacerArrow().
+* Removed Xml::namespaceSelector(). (deprecated since 1.19)
+* Removed WikiPage::estimateRevisionCount(). (deprecated since 1.19)
+* MYSQL: Enum item added to "major MIME type" columns.
+  Running update.php on MySQL < v5.1 may result in heavy processing.
+* RSS and Atom feeds generated by MediaWiki no longer include a fallback
+  stylesheet. It was ignored by most browsers these days anyway.
+* SpecialSearchNoResults hook has been removed. SpecialSearchResults is now
+  called unconditionally.
+* TablePager::getBody() is now 'final' and can't be overridden in subclasses.
+* TablePager::getBody() is deprecated, use getBodyOutput() or getFullOutput().
+* Added $outputPage parameter to the SkinTemplateGetLanguageLink hook.
+* log_page for move log entries store the original page ID, rather than that
+  of the new redirect page. This is not retroactive.
+* LCStoreAccel was removed. $wgLocalisationCacheConf can no longer be set to
+  use this store class.
+* Html::infoBox() no longer accepts paths relative to skins/common/images/.
+* Deprecated defunct Skin::getCommonStylePath().
+* Some extensions had their ResourceLoader modules depend on the "mediawiki"
+  and "jquery" modules. In the past, this behavior was undefined, now it will
+  throw an error.
+* Removed BagOStuff::replace(). (deprecated since 1.23)
+* In Linker.php, link(), linkText() and makeBrokenImageLinkObj() now display
+  warnings if their first parameter is not a Title object. Also makeImageLink()
+  now requires a Parser as its first parameter.
+* (bug 67368) LESS functions embed() and embeddable(), added in MediaWiki 1.23
+  and broken by design, have been removed. Use appropriate LESS mixins instead.
+* Removed cssjanus.py from maintenance directory as it was unused.
+* Removed maintenance/purgeOldText.inc and the PurgeRedundantText() function
+  it contained (superseded by Maintenance::purgeRedundantText() in 1.16).
+  The purgeOldText.php maintenance script has been retained.
 
 ==== Renamed classes ====
 * CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
@@ -382,10 +553,143 @@ changes to languages because of Bugzilla reports.
 * RawPage - Use RawAction directly
 * StubContLang - Use Language::factory() instead
 * XMLReader2 - Use XMLReader directly
+* ResourceLoaderLESSFunctions - No longer in use, not intended for public usage
+
+==== Removed files ====
+The skins/common/ directory, previously containing some assets intended to be
+used by skins and a number of legacy styles and scripts, has been removed. Its
+contents have been deleted or relocated into the resources/ directory. Full list
+of files that are no longer available follows.
+
+* skins/common/ajax.js
+* skins/common/commonContent.css
+* skins/common/commonElements.css
+* skins/common/commonInterface.css
+* skins/common/commonPrint.css
+* skins/common/config-cc.css
+* skins/common/config.css
+* skins/common/config.js
+* skins/common/feed.css
+* skins/common/IEFixes.js
+* skins/common/oldshared.css
+* skins/common/protect.js
+* skins/common/shared.css
+* skins/common/upload.js
+* skins/common/wikibits.js
+* skins/common/images/add.png
+* skins/common/images/ajax-loader.gif
+* skins/common/images/arrow_disabled_first_25.png
+* skins/common/images/arrow_disabled_last_25.png
+* skins/common/images/arrow_disabled_left_25.png
+* skins/common/images/arrow_disabled_right_25.png
+* skins/common/images/arrow_first_25.png
+* skins/common/images/arrow_last_25.png
+* skins/common/images/arrow_left_25.png
+* skins/common/images/arrow_right_25.png
+* skins/common/images/Arr_.png
+* skins/common/images/Arr_d.png
+* skins/common/images/Arr_l.png
+* skins/common/images/Arr_r.png
+* skins/common/images/Arr_u.png
+* skins/common/images/bullet.gif
+* skins/common/images/button_bold.png
+* skins/common/images/button_extlink.png
+* skins/common/images/button_headline.png
+* skins/common/images/button_hr.png
+* skins/common/images/button_image.png
+* skins/common/images/button_italic.png
+* skins/common/images/button_link.png
+* skins/common/images/button_media.png
+* skins/common/images/button_nowiki.png
+* skins/common/images/button_sig.png
+* skins/common/images/button_template.png
+* skins/common/images/cc-0.png
+* skins/common/images/cc-by-nc-sa.png
+* skins/common/images/cc-by-sa.png
+* skins/common/images/cc-by.png
+* skins/common/images/Checker-16x16.png
+* skins/common/images/closewindow.png
+* skins/common/images/closewindow19x19.png
+* skins/common/images/critical-32.png
+* skins/common/images/diffunderline.gif
+* skins/common/images/download-32.png
+* skins/common/images/feed-icon.png
+* skins/common/images/feed-icon.svg
+* skins/common/images/gnu-fdl.png
+* skins/common/images/help-question-hover.gif
+* skins/common/images/help-question.gif
+* skins/common/images/info-32.png
+* skins/common/images/link_icon.gif
+* skins/common/images/magnify-clip-rtl.png
+* skins/common/images/magnify-clip.png
+* skins/common/images/mediawiki.png
+* skins/common/images/nextredirectltr.png
+* skins/common/images/nextredirectrtl.png
+* skins/common/images/poweredby_mediawiki_88x31.png
+* skins/common/images/public-domain.png
+* skins/common/images/question-small.png
+* skins/common/images/question.svg
+* skins/common/images/redirectltr.png
+* skins/common/images/redirectrtl.png
+* skins/common/images/remove.png
+* skins/common/images/spinner.gif
+* skins/common/images/tick-32.png
+* skins/common/images/tipsy-arrow.gif
+* skins/common/images/tooltip_icon.png
+* skins/common/images/warning-32.png
+* skins/common/images/wiki.png
+* skins/common/images/Zoom_sans.gif
+* skins/common/images/ar/button_bold.png
+* skins/common/images/ar/button_headline.png
+* skins/common/images/ar/button_italic.png
+* skins/common/images/ar/button_link.png
+* skins/common/images/ar/button_nowiki.png
+* skins/common/images/be-tarask/button_bold.png
+* skins/common/images/be-tarask/button_italic.png
+* skins/common/images/be-tarask/button_link.png
+* skins/common/images/cyrl/button_bold.png
+* skins/common/images/cyrl/button_italic.png
+* skins/common/images/cyrl/button_link.png
+* skins/common/images/de/button_bold.png
+* skins/common/images/de/button_italic.png
+* skins/common/images/fa/button_bold.png
+* skins/common/images/fa/button_headline.png
+* skins/common/images/fa/button_italic.png
+* skins/common/images/fa/button_link.png
+* skins/common/images/fa/button_nowiki.png
+* skins/common/images/icons/fileicon-c.png
+* skins/common/images/icons/fileicon-cpp.png
+* skins/common/images/icons/fileicon-deb.png
+* skins/common/images/icons/fileicon-djvu.png
+* skins/common/images/icons/fileicon-djvu.xcf
+* skins/common/images/icons/fileicon-dvi.png
+* skins/common/images/icons/fileicon-exe.png
+* skins/common/images/icons/fileicon-h.png
+* skins/common/images/icons/fileicon-html.png
+* skins/common/images/icons/fileicon-iso.png
+* skins/common/images/icons/fileicon-java.png
+* skins/common/images/icons/fileicon-mid.png
+* skins/common/images/icons/fileicon-mov.png
+* skins/common/images/icons/fileicon-o.png
+* skins/common/images/icons/fileicon-ogg.png
+* skins/common/images/icons/fileicon-ogg.xcf
+* skins/common/images/icons/fileicon-pdf.png
+* skins/common/images/icons/fileicon-ps.png
+* skins/common/images/icons/fileicon-psd.png
+* skins/common/images/icons/fileicon-rm.png
+* skins/common/images/icons/fileicon-rpm.png
+* skins/common/images/icons/fileicon-svg.png
+* skins/common/images/icons/fileicon-tar.png
+* skins/common/images/icons/fileicon-tex.png
+* skins/common/images/icons/fileicon-ttf.png
+* skins/common/images/icons/fileicon-txt.png
+* skins/common/images/icons/fileicon.png
+* skins/common/images/ksh/button_S_italic.png
 
 == Compatibility ==
 
-MediaWiki 1.24 requires PHP 5.3.2 or later.
+MediaWiki 1.24 requires PHP 5.3.2 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
diff --git a/RELEASE-NOTES-1.25 b/RELEASE-NOTES-1.25
new file mode 100644 (file)
index 0000000..93f3be8
--- /dev/null
@@ -0,0 +1,186 @@
+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.25 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.25 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.25 ===
+* $wgPageShowWatchingUsers was removed.
+* $wgLocalVirtualHosts has been added to replace $wgConf->localVHosts.
+* $wgAntiLockFlags was removed.
+
+=== New features in 1.25 ===
+* (bug 58139) ResourceLoaderFileModule now supports language fallback
+  for 'languageScripts'.
+* Added a new hook, "ContentAlterParserOutput", to allow extensions to modify the
+  parser output for a content object before links update.
+* (bug 67341) SVG images will no longer be base64-encoded when being embedded
+  in CSS. This results in slight size increase before gzip compression (due to
+  percent-encoding), but up to 20% decrease after it.
+
+=== Bug fixes in 1.25 ===
+* (bug 71003) No additional code will be generated to try to load CSS-embedded
+  SVG images in Internet Explorer 6 and 7, as they don't support them anyway.
+* (bug 67021) On Special:BookSources, corrected validation of ISBNs (both
+  10- and 13-digit forms) containing "X".
+
+=== Action API changes in 1.25 ===
+* (bug 65403) XML tag highlighting is now only performed for formats
+  "xmlfm" and "wddxfm".
+* action=paraminfo supports generalized submodules (modules=query+value),
+  querymodules and formatmodules are deprecated
+* action=paraminfo no longer outputs descriptions and other help text by
+  default. If needed, it may be requested using the new 'helpformat' parameter.
+* action=help has been completely rewritten, and outputs help in HTML
+  rather than plain text.
+* Hitting api.php without specifying an action now displays only the help for
+  the main module, with links to submodule help.
+* API help is no longer displayed on errors.
+* Internationalized messages returned by the API will be in the wiki's content
+  language by default. 'uselang' is now a recognized API parameter;
+  "uselang=user" may be used to select the language from the current user's
+  preferences.
+* Default output format for the API is now jsonfm.
+* Simplified continuation will return a "batchcomplete" property in the result
+  when a batch of pages is complete.
+* Pretty-printed HTML output now has nicer formatting and (if available)
+  better syntax highlighting.
+
+=== Action API internal changes in 1.25 ===
+* ApiHelp has been rewritten to support i18n and paginated HTML output.
+  Most existing modules should continue working without changes, but should do
+  the following:
+  * Add an i18n message "apihelp-{$moduleName}-description" to replace getDescription().
+  * Add i18n messages "apihelp-{$moduleName}-param-{$param}" for each parameter
+    to replace getParamDescription(). If necessary, the settings array returned
+    by getParams() can use the new ApiBase::PARAM_HELP_MSG key to override the
+    message.
+  * Implement getExamplesMessages() to replace getExamples().
+* Modules with submodules (like action=query) must have their submodules
+  override ApiBase::getParent() to return the correct parent object.
+* The 'APIGetDescription' and 'APIGetParamDescription' hooks are deprecated,
+  and will have no effect for modules using i18n messages. Use
+  'APIGetDescriptionMessages' and 'APIGetParamDescriptionMessages' instead.
+* Api formatters will no longer be asked to display the help screen on errors.
+* ApiMain::getCredits() was removed. The credits are available in the
+  'api-credits' i18n message.
+* ApiFormatBase has been changed to support i18n and syntax highlighting via
+  extensions with the new 'ApiFormatHighlight' hook. Core syntax highlighting
+  has been removed.
+* ApiFormatBase now always buffers. Output is done when
+  ApiFormatBase::closePrinter is called.
+* The following methods have been deprecated and may be removed in a future
+  release:
+  * ApiBase::getDescription
+  * ApiBase::getParamDescription
+  * ApiBase::getExamples
+  * ApiBase::makeHelpMsg
+  * ApiBase::makeHelpArrayToString
+  * ApiBase::makeHelpMsgParameters
+  * ApiFormatBase::setUnescapeAmps
+  * ApiFormatBase::getWantsHelp
+  * ApiFormatBase::setHelp
+  * ApiFormatBase::formatHTML
+  * ApiFormatBase::setBufferResult
+  * ApiFormatBase::getDescription
+  * ApiMain::setHelp
+  * ApiMain::reallyMakeHelpMsg
+  * ApiMain::makeHelpMsgHeader
+
+=== Languages updated in 1.25 ===
+
+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.25 ===
+* The skin autodiscovery mechanism, deprecated in MediaWiki 1.23, has been
+  removed. See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for
+  migration guide for creators and users of custom skins that relied on it.
+* Javascript variable 'wgFileCanRotate' now only available on Special:Upload.
+* (bug 56257) Set site logo from mediawiki.skinning.interface module instead of
+  inline styles in the HTML.
+* Removed ApiQueryUsers::getAutoGroups(). (deprecated since 1.20)
+* Removed XmlDumpWriter::schemaVersion(). (deprecated since 1.20)
+* Removed LogEventsList::getDisplayTitle(). (deprecated since 1.20)
+* Removed Preferences::trySetUserEmail(). (deprecated since 1.20)
+* Removed mw.user.name() and mw.user.anonymous() methods. (deprecated since 1.20)
+* Removed 'ok' and 'err' parameters in the mediawiki.api modules. (deprecated
+  since 1.20)
+* Removed 'async' parameter from the  mw.Api#getCategories() method. (deprecated
+  since 1.20)
+* Removed 'jquery.json' module. (deprecated since 1.24)
+  Use the 'json' module and global JSON object instead.
+* Deprecated OutputPage::readOnlyPage() and OutputPage::rateLimited().
+  Also, the former will now throw an MWException if called with one or more
+  arguments.
+
+== Compatibility ==
+
+MediaWiki 1.25 requires PHP 5.3.2 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.2 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.25 has several database changes since 1.24, 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.23.x and older releases, see HISTORY.
+
+== Online documentation ==
+
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
+
+       https://www.mediawiki.org/wiki/Documentation
+
+== Mailing list ==
+
+A mailing list is available for MediaWiki user support and discussion:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+It's highly recommended that you sign up for one of these lists if you're
+going to run a public MediaWiki, so you can be notified of security fixes.
+
+== IRC help ==
+
+There's usually someone online in #mediawiki on irc.freenode.net.
index 8389f00..3b18933 100644 (file)
                "ext-wikidiff2": "*",
                "ext-apc": "*",
                "monolog/monolog": "*"
+       },
+       "autoload": {
+               "psr-0": {
+                       "ComposerHookHandler": "includes/composer"
+               }
+       },
+       "scripts": {
+               "pre-update-cmd": "ComposerHookHandler::onPreUpdate",
+               "pre-install-cmd": "ComposerHookHandler::onPreInstall"
        }
 }
index fc29858..c60cc76 100644 (file)
@@ -379,20 +379,41 @@ $editPage : the EditPage object
 $text : the new text of the article (has yet to be saved)
 &$resultArr : data in this array will be added to the API result
 
+'ApiFormatHighlight': Use to syntax-highlight API pretty-printed output. When
+highlighting, add output to $context->getOutput() and return false.
+$context: An IContextSource.
+$text: Text to be highlighted.
+$mime: MIME type of $text.
+$format: API format code for $text.
+
 'APIGetAllowedParams': Use this hook to modify a module's parameters.
 &$module: ApiBase Module object
 &$params: Array of parameters
 $flags: int zero or OR-ed flags like ApiBase::GET_VALUES_FOR_HELP
 
-'APIGetDescription': Use this hook to modify a module's description.
+'APIGetDescription': DEPRECATED! Use APIGetDescriptionMessages instead.
+Use this hook to modify a module's description.
 &$module: ApiBase Module object
-&$desc: Array of descriptions
+&$desc: String description, or array of description strings
+
+'APIGetDescriptionMessages': Use this hook to modify a module's help message.
+$module: ApiBase Module object
+&$msg: Array of Message objects
 
-'APIGetParamDescription': Use this hook to modify a module's parameter
-descriptions.
+'APIGetParamDescription': DEPRECATED! Use APIGetParamDescriptionMessages instead.
+Use this hook to modify a module's parameter descriptions.
 &$module: ApiBase Module object
 &$desc: Array of parameter descriptions
 
+'APIGetParamDescriptionMessages': Use this hook to modify a module's parameter descriptions.
+$module: ApiBase Module object
+&$msg: Array of arrays of Message objects
+
+'APIHelpModifyOutput': Use this hook to modify an API module's help output.
+$module: ApiBase Module object
+&$help: Array of HTML strings to be joined for the output.
+$options: Array Options passed to ApiHelp::getHelp
+
 'APIQueryAfterExecute': After calling the execute() method of an
 action=query submodule. Use this to extend core API modules.
 &$module: Module object
@@ -402,36 +423,39 @@ an action=query submodule. Use this to extend core API modules.
 &$module: Module object
 &$resultPageSet: ApiPageSet object
 
-'APIQueryInfoTokens': Use this hook to add custom tokens to prop=info. Every
-token has an action, which will be used in the intoken parameter and in the
-output (actiontoken="..."), and a callback function which should return the
-token, or false if the user isn't allowed to obtain it. The prototype of the
-callback function is func($pageid, $title), where $pageid is the page ID of the
-page the token is requested for and $title is the associated Title object. In
-the hook, just add your callback to the $tokenFunctions array and return true
-(returning false makes no sense).
+'APIQueryInfoTokens': DEPRECATED! Use ApiQueryTokensRegisterTypes instead.
+Use this hook to add custom tokens to prop=info. Every token has an action,
+which will be used in the intoken parameter and in the output
+(actiontoken="..."), and a callback function which should return the token, or
+false if the user isn't allowed to obtain it. The prototype of the callback
+function is func($pageid, $title), where $pageid is the page ID of the page the
+token is requested for and $title is the associated Title object. In the hook,
+just add your callback to the $tokenFunctions array and return true (returning
+false makes no sense).
 $tokenFunctions: array(action => callback)
 
-'APIQueryRevisionsTokens': Use this hook to add custom tokens to prop=revisions.
-Every token has an action, which will be used in the rvtoken parameter and in
-the output (actiontoken="..."), and a callback function which should return the
-token, or false if the user isn't allowed to obtain it. The prototype of the
-callback function is func($pageid, $title, $rev), where $pageid is the page ID
-of the page associated to the revision the token is requested for, $title the
+'APIQueryRevisionsTokens': DEPRECATED! Use ApiQueryTokensRegisterTypes instead.
+Use this hook to add custom tokens to prop=revisions. Every token has an
+action, which will be used in the rvtoken parameter and in the output
+(actiontoken="..."), and a callback function which should return the token, or
+false if the user isn't allowed to obtain it. The prototype of the callback
+function is func($pageid, $title, $rev), where $pageid is the page ID of the
+page associated to the revision the token is requested for, $title the
 associated Title object and $rev the associated Revision object. In the hook,
 just add your callback to the $tokenFunctions array and return true (returning
 false makes no sense).
 $tokenFunctions: array(action => callback)
 
-'APIQueryRecentChangesTokens': Use this hook to add custom tokens to
-list=recentchanges. Every token has an action, which will be used in the rctoken
-parameter and in the output (actiontoken="..."), and a callback function which
-should return the token, or false if the user isn't allowed to obtain it. The
-prototype of the callback function is func($pageid, $title, $rc), where $pageid
-is the page ID of the page associated to the revision the token is requested
-for, $title the associated Title object and $rc the associated RecentChange
-object. In the hook, just add your callback to the $tokenFunctions array and
-return true (returning false makes no sense).
+'APIQueryRecentChangesTokens': DEPRECATED! Use ApiQueryTokensRegisterTypes instead.
+Use this hook to add custom tokens to list=recentchanges. Every token has an
+action, which will be used in the rctoken parameter and in the output
+(actiontoken="..."), and a callback function which should return the token, or
+false if the user isn't allowed to obtain it. The prototype of the callback
+function is func($pageid, $title, $rc), where $pageid is the page ID of the
+page associated to the revision the token is requested for, $title the
+associated Title object and $rc the associated RecentChange object. In the
+hook, just add your callback to the $tokenFunctions array and return true
+(returning false makes no sense).
 $tokenFunctions: array(action => callback)
 
 'APIQuerySiteInfoGeneralInfo': Use this hook to add extra information to the
@@ -443,13 +467,19 @@ $module: the current ApiQuerySiteInfo module
 sites statistics information.
 &$results: array of results, add things here
 
-'APIQueryUsersTokens': Use this hook to add custom token to list=users. Every
-token has an action, which will be used in the ustoken parameter and in the
-output (actiontoken="..."), and a callback function which should return the
-token, or false if the user isn't allowed to obtain it. The prototype of the
-callback function is func($user) where $user is the User object. In the hook,
-just add your callback to the $tokenFunctions array and return true (returning
-false makes no sense).
+'ApiQueryTokensRegisterTypes': Use this hook to add additional token types to
+action=query&meta=tokens. Note that most modules will probably be able to use
+the 'csrf' token instead of creating their own token types.
+&$salts: array( type => salt to pass to User::getEditToken() )
+
+'APIQueryUsersTokens': DEPRECATED! Use ApiQueryTokensRegisterTypes instead.
+Use this hook to add custom token to list=users. Every token has an action,
+which will be used in the ustoken parameter and in the output
+(actiontoken="..."), and a callback function which should return the token, or
+false if the user isn't allowed to obtain it. The prototype of the callback
+function is func($user) where $user is the User object. In the hook, just add
+your callback to the $tokenFunctions array and return true (returning false
+makes no sense).
 $tokenFunctions: array(action => callback)
 
 'ApiMain::onException': Called by ApiMain::executeActionWithErrorHandling() when
@@ -463,8 +493,8 @@ key for the array that represents the service data. In this data array, the
 key-value-pair identified by the apiLink key is required.
 &$apis: array of services
 
-'ApiTokensGetTokenTypes': Use this hook to extend action=tokens with new token
-types.
+'ApiTokensGetTokenTypes': DEPRECATED! Use ApiQueryTokensRegisterTypes instead.
+Use this hook to extend action=tokens with new token types.
 &$tokenTypes: supported token types in format 'type' => callback function
 used to retrieve this type of tokens.
 
@@ -854,6 +884,14 @@ $name: name of the special page, e.g. 'Watchlist'
 &$join_conds: join conditions for the tables
 $opts: FormOptions for this request
 
+'LoginUserMigrated': Called during login to allow extensions the opportunity to
+inform a user that their username doesn't exist for a specific reason, instead
+of letting the login form give the generic error message that the account does
+not exist. For example, when the account has been renamed or deleted.
+$user: the User object being authenticated against.
+&$msg: the message identifier for abort reason, or an array to pass a message
+  key and parameters.
+
 'Collation::factory': Called if $wgCategoryCollation is an unknown collation.
 $collationName: Name of the collation in question
 &$collationObject: Null. Replace with a subclass of the Collation class that
@@ -895,6 +933,15 @@ generation of HTML may be skipped, but other information should still be present
 ParserOutput object.
 &$output: ParserOutput, to manipulate or replace
 
+'ContentAlterParserOutput': Modify parser output for a given content object.
+Called by Content::getParserOutput after parsing has finished. Can be used
+for changes that depend on the result of the parsing but have to be done
+before LinksUpdate is called (such as adding tracking categories based on
+the rendered HTML).
+$content: The Content to render
+$title: Title of the page, as context
+$parserOutput: ParserOutput to manipulate
+
 'ConvertContent': Called by AbstractContent::convert when a conversion to another
 content model is requested.
 $content: The Content object to be converted.
@@ -1359,6 +1406,10 @@ page history view, i.e. undo, rollback, etc.
 $rev: Revision object
 &$links: Array of HTML links
 
+'HTMLFileCache::useFileCache': Override whether a page should be cached in file
+cache.
+$context: An IContextSource object with information about the request being served.
+
 'ImageBeforeProduceHTML': Called before producing the HTML created by a wiki
 image insertion. You can skip the default logic entirely by returning false, or
 just modify a few things using call-by-reference.
@@ -1533,6 +1584,10 @@ $title: The page's Title.
   Currently unused, but planned to provide support for marking individual
   language links in the UI, e.g. for featured articles.
 
+'LanguageSelector': Hook to change the language selector available on a page.
+$out: The output page.
+$cssClassName: CSS class name of the language selector.
+
 'LinkBegin': Used when generating internal and interwiki links in
 Linker::link(), before processing starts.  Return false to skip default
 processing and return $ret. See documentation for Linker::link() for details on
@@ -1626,6 +1681,13 @@ $code: language code
 &$alldata: The localisation data from core and extensions
 &purgeBlobs: whether to purge/update the message blobs via MessageBlobStore::clear()
 
+'LocalisationCacheRecacheFallback': Called for each language when merging
+fallback data into the cache.
+$cache: The LocalisationCache object
+$code: language code
+&$alldata: The localisation data from core and extensions. Note some keys may
+  be omitted if they won't be merged into the final result.
+
 'LocalisationChecksBlacklist': When fetching the blacklist of
 localisation checks.
 &$blacklist: array of checks to blacklist. See the bottom of
@@ -1773,13 +1835,6 @@ $db: The database object to be queried.
 &$opts: Options for the query.
 &$join_conds: Join conditions for the query.
 
-'MonoBookTemplateToolboxEnd': DEPRECATED. Called by Monobook skin after toolbox
-links have been rendered (useful for adding more). Note: this is only run for
-the Monobook skin. To add items to the toolbox you should use the
-SkinTemplateToolboxEnd hook instead, which works for all "SkinTemplate"-type
-skins.
-$tools: array of tools
-
 'BaseTemplateToolbox': Called by BaseTemplate when building the $toolbox array
 and returning it for the skin to output. You can add items to the toolbox while
 still letting the skin make final decisions on skin-specific markup conventions
@@ -2290,6 +2345,11 @@ $type: 'normal' or 'history' for old/diff views
 the MediaWiki icon but plain text instead.
 $skin: Skin object
 
+'SkinPreloadExistence': Supply titles that should be added to link existence
+cache before the page is rendered.
+&$titles: Array of Title objects
+$skin: Skin object
+
 'SkinSubPageSubtitle': At the beginning of Skin::subPageSubtitle().
 &$subpages: Subpage links HTML
 $skin: Skin object
@@ -2308,8 +2368,9 @@ $nav_urls: array of tabs
 which the actual html is constructed.
 &$languageLink: array containing data about the link. The following keys can be
   modified: href, text, title, class, lang, hreflang. Each of them is a string.
-$languageLinkTitle: Title object belonging to the external language link
-$title: Title object of the page the link belongs to
+$languageLinkTitle: Title object belonging to the external language link.
+$title: Title object of the page the link belongs to.
+$outputPage: The OutputPage object the links are built from.
 
 To alter the structured navigation links in SkinTemplates, there are three
 hooks called in different spots:
@@ -2511,16 +2572,11 @@ $specialSearch: SpecialSearch object ($this)
 $output: $wgOut
 $term: Search term specified by the user
 
-'SpecialSearchResults': Called before search result display when there are
-matches.
+'SpecialSearchResults': Called before search result display
 $term: string of search term
 &$titleMatches: empty or SearchResultSet object
 &$textMatches: empty or SearchResultSet object
 
-'SpecialSearchNoResults': Called before search result display when there are no
-matches.
-$term: string of search term
-
 'SpecialStatsAddExtra': Add extra statistic at the end of Special:Statistics.
 &$extraStats: Array to save the new stats
   ( $extraStats['<name of statistic>'] => <value>; )
@@ -2572,6 +2628,10 @@ database result.
 &$titleArray: set this to an object to override the default object returned
 $res: database result used to create the object
 
+'TitleExists': Called when determining whether a page exists at a given title.
+$title: The title being tested.
+&$exists: Whether the title exists.
+
 'TitleQuickPermissions': Called from Title::checkQuickPermissions to add to
 or override the quick permissions check.
 $title: The Title object being accessed
@@ -2945,12 +3005,18 @@ $page: WikiPage object to be watched
 $user: user that watched
 $page: WikiPage object watched
 
+'WatchlistEditorBeforeFormRender': Before building the Special:EditWatchlist
+form, used to manipulate the list of pages or preload data based on that list.
+&$watchlistInfo: array of watchlisted pages in
+  [namespaceId => ['title1' => 1, 'title2' => 1]] format
+
 'WatchlistEditorBuildRemoveLine': when building remove lines in
 Special:Watchlist/edit.
 &$tools: array of extra links
 $title: Title object
 $redirect: whether the page is a redirect
 $skin: Skin object
+&$link: HTML link to title
 
 'WebRequestPathInfoRouter': While building the PathRouter to parse the
 REQUEST_URI.
index ff735d5..a28bf3e 100644 (file)
@@ -4,7 +4,9 @@ kss: kssnodecheck
 # Generates CSS of mediawiki.ui and mediawiki.ui.button using ResourceLoader, then applies it to the
 # KSS style guide
        $(eval KSS_RL_TMP := $(shell mktemp /tmp/tmp.XXXXXXXXXX))
-       @curl -sG "${MEDIAWIKI_LOAD_URL}?modules=mediawiki.ui.anchor|mediawiki.ui.checkbox|mediawiki.ui.input|mediawiki.legacy.shared|mediawiki.legacy.commonPrint|mediawiki.ui|mediawiki.ui.button&only=styles" > $(KSS_RL_TMP)
+# Keep module names in strict alphabetical order, so CSS loads in the same order as ResourceLoader's addModuleStyles does; this can affect rendering.
+# See OutputPage::makeResourceLoaderLink.
+       @curl -sG "${MEDIAWIKI_LOAD_URL}?modules=mediawiki.legacy.commonPrint|mediawiki.legacy.shared|mediawiki.ui|mediawiki.ui.anchor|mediawiki.ui.button|mediawiki.ui.checkbox|mediawiki.ui.icon|mediawiki.ui.input|mediawiki.ui.text&only=styles" > $(KSS_RL_TMP)
        @node_modules/.bin/kss-node ../../resources/src/mediawiki.ui static/ --css $(KSS_RL_TMP) -t styleguide-template
        @rm $(KSS_RL_TMP)
 
index b6036b2..933260e 100644 (file)
        </header>
 
        <div class="container">
-               <nav class="content">
+               <nav>
                        <ul>
                                <li><a href="index.html"><span>0.0</span> Overview</a></li>
                                {{#eachRoot}}
-                                       <li><a href="section-{{reference}}.html"><span>{{reference}}.0</span> {{header}}</a></li>
+                                       <li>
+                                               <a href="section-{{ reference }}.html">
+                                                       <span>{{ reference }}.0</span> {{ header }}
+                                               </a>
+                                               <ul>
+                                               {{#eachSection reference}}
+                                                       {{#whenDepth  2}}
+                                                               <li>
+                                                                       <a href="section-{{../../reference}}.html#section-{{ reference }}">
+                                                                               <span>{{ reference }}</span>
+                                                                               {{ header }}
+                                                                       </a>
+                                                               </li>
+                                                       {{/whenDepth}}
+                                               {{/eachSection}}
+                                               </ul>
+                                       </li>
                                {{/eachRoot}}
                        </ul>
                </nav>
 
-               <article>
+               <div class="content">
                        {{#if overview}}
                                {{html overview}}
                        {{else}}
                                {{#eachSection rootNumber}}
-                               <section>
+                               <div>
                                        {{#whenDepth 1}}
                                                <h1>{{ reference }}.0 {{ header }}</h1>
                                        {{else}}
                                                {{#whenDepth 2}}
+                                               <a name="section-{{ reference }}"></a>
                                                <h2>{{ reference }} {{ header }}</h2>
                                                {{/whenDepth}}
                                                {{#whenDepth 3}}
                                                                {{html description}}
                                                        {{/if}}
                                        {{/ifAny}}
-                               </section>
+                               </div>
                                {{/eachSection}}
                        {{/if}}
-               </article>
+               </div>
        </div>
 </div></body>
 </html>
index f5ddff1..eeea1a8 100644 (file)
@@ -1,4 +1,3 @@
-
 .container {
        width: 100%;
 }
@@ -7,7 +6,7 @@ nav {
        display: none;
 }
 
-article {
+.content {
        .example {
                blockquote {
                        margin-top: 20px;
@@ -25,7 +24,8 @@ body {
        font-family: "Nimbus Sans L", "Liberation Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
 }
 
-.content.kss-no-margin {
+.kss-no-margin {
+       // FIXME: Is this being used anywhere? Remove if not.
        margin: 0;
 }
 
@@ -85,11 +85,22 @@ nav {
                                        width: 35px;
                                }
                        }
+
+                       ul {
+                               li {
+                                       margin: 0;
+                               }
+
+                               li a {
+                                       text-transform: none;
+                                       font-weight: normal;
+                               }
+                       }
                }
        }
 }
 
-article {
+.content {
        -webkit-flex: 1;
        flex: 1;
 
@@ -130,6 +141,10 @@ article {
                        display: block;
                        margin: 0;
                        margin-left: 20px;
+
+                       div {
+                               margin-bottom: 5px;
+                       }
                }
        }
 }
@@ -154,7 +169,7 @@ article {
                width: auto;
        }
 
-       article {
+       .content {
                margin-left: 30px;
        }
 
index 58f77cf..e998ebd 100644 (file)
@@ -53,40 +53,30 @@ server-side source files. This is done by editing some pages on the wiki:
 These can also be customised on a per-user basis, by editing
 [[User:<name>/vector.css]], [[User:<name>/vector.js]], etc.
 
-This feature has led to a wide variety of "user styles" becoming available:
 
-https://www.mediawiki.org/wiki/Manual:Gallery_of_user_styles
+== Custom skins ==
 
-If you want a different look for your wiki, that gallery is a good place to start.
+Several custom skins are available as of 2014.
 
-== Drop-in custom skins ==
+https://www.mediawiki.org/wiki/Category:All_skins
 
-If you put a file in MediaWiki's skins directory, ending in .php, the name of 
-the file will automatically be added as a skin name, and the file will be
-expected to contain a class called Skin<name> with the skin class. You can then
-make that skin the default by adding to LocalSettings.php:
+Installing a skin requires adding its files in a subdirectory under skins/ and
+adding an appropriate require_once line to LocalSettings.php, similarly to how
+extensions are installed.
 
-$wgDefaultSkin = '<name>';
+You can then make that skin the default by adding:
+  $wgDefaultSkin = '<name>';
 
-You can also disable dropped-in or core skins using:
+Or disable it entirely by removing the require_once line. (User settings will
+not be lost if it's reenabled later.)
 
-$wgSkipSkins[] = '<name>';
+See https://www.mediawiki.org/wiki/Manual:Skinning for more information on
+writing new skins.
 
-This technique is used by the more ambitious MediaWiki site operators, to 
-create complex custom skins for their wikis. It should be preferred over 
-editing the core Monobook skin directly.
-
-See https://www.mediawiki.org/wiki/Manual:Skinning for more information.
-
-== Extension skins ==
-
-It is now possible (since MediaWiki 1.12) to write a skin as a standard
-MediaWiki extension, enabled via LocalSettings.php. This is done by adding 
-it to $wgValidSkinNames, for example:
-
-$wgValidSkinNames['mycoolskin'] = 'MyCoolSkin';
-
-and then registering a class in $wgAutoloadClasses called SkinMycoolSkin, which 
-derives from Skin. This technique is apparently not yet used (as of 2008) 
-outside the DumpHTML extension.
 
+Until MediaWiki 1.25 it used to be possible to just put a <name>.php file in
+MediaWiki's skins/ directory, which would be loaded and expected to contain the
+Skin<name> class. This way has always been discouraged because of its limitations
+(inability to add localisation messages, ResourceLoader modules, etc.) and
+awkwardness in managing such skins. For information on migrating skins using
+this old method, see <https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery>.
index a285a5b..51c1b55 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html lang="en" dir="ltr">
 <head>
-       <link rel="stylesheet" href="../../skins/common/shared.css">
+       <link rel="stylesheet" href="../../resources/src/mediawiki.legacy/shared.css">
 </head>
 <body style="font-size: small;">
 
index 55f17ac..dcd171f 100644 (file)
@@ -47,6 +47,7 @@ $wgArticlePath = false; # Don't let a "/*" article path clober our action path
 $wgActionPaths = array( "$wgUploadPath/" );
 
 wfImageAuthMain();
+wfProfileOut( 'img_auth.php' );
 wfLogProfilingData();
 // Commit and close up!
 $factory = wfGetLBFactory();
index dde8467..9bc92be 100644 (file)
@@ -47,12 +47,19 @@ class AjaxDispatcher {
         */
        private $args;
 
+       /**
+        * @var Config
+        */
+       private $config;
+
        /**
         * Load up our object with user supplied data
         */
-       function __construct() {
+       function __construct( Config $config ) {
                wfProfileIn( __METHOD__ );
 
+               $this->config = $config;
+
                $this->mode = "";
 
                if ( !empty( $_GET["rs"] ) ) {
@@ -95,17 +102,17 @@ class AjaxDispatcher {
         * BEWARE! Data are passed as they have been supplied by the user,
         * they should be carefully handled in the function processing the
         * request.
+        *
+        * @param User $user
         */
-       function performAction() {
-               global $wgAjaxExportList, $wgUser;
-
+       function performAction( User $user ) {
                if ( empty( $this->mode ) ) {
                        return;
                }
 
                wfProfileIn( __METHOD__ );
 
-               if ( !in_array( $this->func_name, $wgAjaxExportList ) ) {
+               if ( !in_array( $this->func_name, $this->config->get( 'AjaxExportList' ) ) ) {
                        wfDebug( __METHOD__ . ' Bad Request for unknown function ' . $this->func_name . "\n" );
 
                        wfHttpError(
@@ -113,7 +120,7 @@ class AjaxDispatcher {
                                'Bad Request',
                                "unknown function " . $this->func_name
                        );
-               } elseif ( !User::isEveryoneAllowed( 'read' ) && !$wgUser->isAllowed( 'read' ) ) {
+               } elseif ( !User::isEveryoneAllowed( 'read' ) && !$user->isAllowed( 'read' ) ) {
                        wfHttpError(
                                403,
                                'Forbidden',
index 41cbd24..8e9f490 100644 (file)
@@ -70,12 +70,19 @@ class AjaxResponse {
         */
        private $mText;
 
+       /**
+        * @var Config
+        */
+       private $mConfig;
+
        /**
         * @param string|null $text
+        * @param Config|null $config
         */
-       function __construct( $text = null ) {
+       function __construct( $text = null, Config $config = null ) {
                $this->mCacheDuration = null;
                $this->mVary = null;
+               $this->mConfig = $config ?: ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
 
                $this->mDisabled = false;
                $this->mText = '';
@@ -150,8 +157,6 @@ class AjaxResponse {
         * Construct the header and output it
         */
        function sendHeaders() {
-               global $wgUseSquid, $wgUseESI;
-
                if ( $this->mResponseCode ) {
                        $n = preg_replace( '/^ *(\d+)/', '\1', $this->mResponseCode );
                        header( "Status: " . $this->mResponseCode, true, (int)$n );
@@ -170,12 +175,12 @@ class AjaxResponse {
                        # and tell the client to always check with the squid. Otherwise,
                        # tell the client to use a cached copy, without a way to purge it.
 
-                       if ( $wgUseSquid ) {
+                       if ( $this->mConfig->get( 'UseSquid' ) ) {
                                # Expect explicit purge of the proxy cache, but require end user agents
                                # to revalidate against the proxy on each visit.
                                # Surrogate-Control controls our Squid, Cache-Control downstream caches
 
-                               if ( $wgUseESI ) {
+                               if ( $this->mConfig->get( 'UseESI' ) ) {
                                        header( 'Surrogate-Control: max-age=' . $this->mCacheDuration . ', content="ESI/1.0"' );
                                        header( 'Cache-Control: s-maxage=0, must-revalidate, max-age=0' );
                                } else {
index f7f4c59..cd6a8ca 100644 (file)
@@ -31,14 +31,17 @@ $wgAutoloadLocalClasses = array(
        # Includes
        'AjaxDispatcher' => 'includes/AjaxDispatcher.php',
        'AjaxResponse' => 'includes/AjaxResponse.php',
-       'AlphabeticPager' => 'includes/Pager.php',
        'AtomFeed' => 'includes/Feed.php',
        'AuthPlugin' => 'includes/AuthPlugin.php',
        'AuthPluginUser' => 'includes/AuthPlugin.php',
        'Autopromote' => 'includes/Autopromote.php',
        'Block' => 'includes/Block.php',
+       'BloomCache' => 'includes/cache/bloom/BloomCache.php',
+       'BloomCacheRedis' => 'includes/cache/bloom/BloomCacheRedis.php',
+       'BloomFilterTitleHasLogs' => 'includes/cache/bloom/BloomFilters.php',
+       'CacheHelper' => 'includes/CacheHelper.php',
        'Category' => 'includes/Category.php',
-       'Categoryfinder' => 'includes/Categoryfinder.php',
+       'CategoryFinder' => 'includes/CategoryFinder.php',
        'CategoryViewer' => 'includes/CategoryViewer.php',
        'ChangeTags' => 'includes/ChangeTags.php',
        'ChannelFeed' => 'includes/Feed.php',
@@ -65,7 +68,7 @@ $wgAutoloadLocalClasses = array(
        'DumpOutput' => 'includes/Export.php',
        'DumpPipeOutput' => 'includes/Export.php',
        'EditPage' => 'includes/EditPage.php',
-       'EmailNotification' => 'includes/UserMailer.php',
+       'EmptyBloomCache' => 'includes/cache/bloom/BloomCache.php',
        'Fallback' => 'includes/Fallback.php',
        'FauxRequest' => 'includes/WebRequest.php',
        'FauxResponse' => 'includes/WebResponse.php',
@@ -82,6 +85,7 @@ $wgAutoloadLocalClasses = array(
        'Html' => 'includes/Html.php',
        'HtmlFormatter' => 'includes/HtmlFormatter.php',
        'HTMLApiField' => 'includes/htmlform/HTMLApiField.php',
+       'HTMLAutoCompleteSelectField' => 'includes/htmlform/HTMLAutoCompleteSelectField.php',
        'HTMLButtonField' => 'includes/htmlform/HTMLButtonField.php',
        'HTMLCheckField' => 'includes/htmlform/HTMLCheckField.php',
        'HTMLCheckMatrix' => 'includes/htmlform/HTMLCheckMatrix.php',
@@ -110,7 +114,6 @@ $wgAutoloadLocalClasses = array(
        'IdentityCollation' => 'includes/Collation.php',
        'ImportStreamSource' => 'includes/Import.php',
        'ImportStringSource' => 'includes/Import.php',
-       'IndexPager' => 'includes/Pager.php',
        'Interwiki' => 'includes/interwiki/Interwiki.php',
        'License' => 'includes/Licenses.php',
        'Licenses' => 'includes/Licenses.php',
@@ -118,17 +121,16 @@ $wgAutoloadLocalClasses = array(
        'LinkFilter' => 'includes/LinkFilter.php',
        'MagicWord' => 'includes/MagicWord.php',
        'MagicWordArray' => 'includes/MagicWord.php',
-       'MailAddress' => 'includes/UserMailer.php',
        'MediaWiki' => 'includes/MediaWiki.php',
        'MediaWikiVersionFetcher' => 'includes/MediaWikiVersionFetcher.php',
        'Message' => 'includes/Message.php',
        'MessageBlobStore' => 'includes/MessageBlobStore.php',
        'MimeMagic' => 'includes/MimeMagic.php',
+       'MovePage' => 'includes/MovePage.php',
        'MWHookException' => 'includes/Hooks.php',
        'MWHttpRequest' => 'includes/HttpFunctions.php',
        'MWNamespace' => 'includes/MWNamespace.php',
        'OutputPage' => 'includes/OutputPage.php',
-       'Pager' => 'includes/Pager.php',
        'PathRouter' => 'includes/PathRouter.php',
        'PathRouterPatternReplacer' => 'includes/PathRouter.php',
        'PhpHttpRequest' => 'includes/HttpFunctions.php',
@@ -143,7 +145,6 @@ $wgAutoloadLocalClasses = array(
        'PrefixSearch' => 'includes/PrefixSearch.php',
        'ProtectionForm' => 'includes/ProtectionForm.php',
        'RawMessage' => 'includes/Message.php',
-       'ReverseChronologicalPager' => 'includes/Pager.php',
        'RevisionItem' => 'includes/RevisionList.php',
        'RevisionItemBase' => 'includes/RevisionList.php',
        'RevisionListBase' => 'includes/RevisionList.php',
@@ -162,9 +163,7 @@ $wgAutoloadLocalClasses = array(
        'StringPrefixSearch' => 'includes/PrefixSearch.php',
        'StubObject' => 'includes/StubObject.php',
        'StubUserLang' => 'includes/StubObject.php',
-       'TablePager' => 'includes/Pager.php',
        'MWTimestamp' => 'includes/MWTimestamp.php',
-       'TimestampException' => 'includes/TimestampException.php',
        'Title' => 'includes/Title.php',
        'TitleArray' => 'includes/TitleArray.php',
        'TitleArrayFromResult' => 'includes/TitleArrayFromResult.php',
@@ -174,7 +173,6 @@ $wgAutoloadLocalClasses = array(
        'User' => 'includes/User.php',
        'UserArray' => 'includes/UserArray.php',
        'UserArrayFromResult' => 'includes/UserArrayFromResult.php',
-       'UserMailer' => 'includes/UserMailer.php',
        'UserRightsProxy' => 'includes/UserRightsProxy.php',
        'WatchedItem' => 'includes/WatchedItem.php',
        'WebRequest' => 'includes/WebRequest.php',
@@ -218,6 +216,7 @@ $wgAutoloadLocalClasses = array(
        # includes/api
        'ApiBase' => 'includes/api/ApiBase.php',
        'ApiBlock' => 'includes/api/ApiBlock.php',
+       'ApiClearHasMsg' => 'includes/api/ApiClearHasMsg.php',
        'ApiComparePages' => 'includes/api/ApiComparePages.php',
        'ApiCreateAccount' => 'includes/api/ApiCreateAccount.php',
        'ApiDelete' => 'includes/api/ApiDelete.php',
@@ -232,7 +231,7 @@ $wgAutoloadLocalClasses = array(
        'ApiFormatBase' => 'includes/api/ApiFormatBase.php',
        'ApiFormatDbg' => 'includes/api/ApiFormatDbg.php',
        'ApiFormatDump' => 'includes/api/ApiFormatDump.php',
-       'ApiFormatFeedWrapper' => 'includes/api/ApiFormatBase.php',
+       'ApiFormatFeedWrapper' => 'includes/api/ApiFormatFeedWrapper.php',
        'ApiFormatJson' => 'includes/api/ApiFormatJson.php',
        'ApiFormatNone' => 'includes/api/ApiFormatNone.php',
        'ApiFormatPhp' => 'includes/api/ApiFormatPhp.php',
@@ -267,6 +266,7 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryAllPages' => 'includes/api/ApiQueryAllPages.php',
        'ApiQueryAllUsers' => 'includes/api/ApiQueryAllUsers.php',
        'ApiQueryBacklinks' => 'includes/api/ApiQueryBacklinks.php',
+       'ApiQueryBacklinksprop' => 'includes/api/ApiQueryBacklinksprop.php',
        'ApiQueryBase' => 'includes/api/ApiQueryBase.php',
        'ApiQueryBlocks' => 'includes/api/ApiQueryBlocks.php',
        'ApiQueryCategories' => 'includes/api/ApiQueryCategories.php',
@@ -300,12 +300,12 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php',
        'ApiQueryRecentChanges' => 'includes/api/ApiQueryRecentChanges.php',
        'ApiQueryFileRepoInfo' => 'includes/api/ApiQueryFileRepoInfo.php',
-       'ApiQueryRedirects' => 'includes/api/ApiQueryRedirects.php',
        'ApiQueryRevisions' => 'includes/api/ApiQueryRevisions.php',
        'ApiQuerySearch' => 'includes/api/ApiQuerySearch.php',
        'ApiQuerySiteinfo' => 'includes/api/ApiQuerySiteinfo.php',
        'ApiQueryStashImageInfo' => 'includes/api/ApiQueryStashImageInfo.php',
        'ApiQueryTags' => 'includes/api/ApiQueryTags.php',
+       'ApiQueryTokens' => 'includes/api/ApiQueryTokens.php',
        'ApiQueryUserInfo' => 'includes/api/ApiQueryUserInfo.php',
        'ApiQueryUsers' => 'includes/api/ApiQueryUsers.php',
        'ApiQueryWatchlist' => 'includes/api/ApiQueryWatchlist.php',
@@ -336,7 +336,6 @@ $wgAutoloadLocalClasses = array(
        'HTMLFileCache' => 'includes/cache/HTMLFileCache.php',
        'ICacheHelper' => 'includes/cache/CacheHelper.php',
        'LCStore' => 'includes/cache/LocalisationCache.php',
-       'LCStoreAccel' => 'includes/cache/LocalisationCache.php',
        'LCStoreCDB' => 'includes/cache/LocalisationCache.php',
        'LCStoreDB' => 'includes/cache/LocalisationCache.php',
        'LCStoreNull' => 'includes/cache/LocalisationCache.php',
@@ -372,23 +371,27 @@ $wgAutoloadLocalClasses = array(
        'ConfigException' => 'includes/config/ConfigException.php',
        'ConfigFactory' => 'includes/config/ConfigFactory.php',
        'GlobalVarConfig' => 'includes/config/GlobalVarConfig.php',
+       'HashConfig' => 'includes/config/HashConfig.php',
+       'MultiConfig' => 'includes/config/MultiConfig.php',
+       'MutableConfig' => 'includes/config/MutableConfig.php',
 
        # includes/content
        'AbstractContent' => 'includes/content/AbstractContent.php',
-       'ContentHandler' => 'includes/content/ContentHandler.php',
+       'CodeContentHandler' => 'includes/content/CodeContentHandler.php',
        'Content' => 'includes/content/Content.php',
-       'CssContentHandler' => 'includes/content/CssContentHandler.php',
+       'ContentHandler' => 'includes/content/ContentHandler.php',
        'CssContent' => 'includes/content/CssContent.php',
-       'JavaScriptContentHandler' => 'includes/content/JavaScriptContentHandler.php',
+       'CssContentHandler' => 'includes/content/CssContentHandler.php',
        'JavaScriptContent' => 'includes/content/JavaScriptContent.php',
-       'JSONContentHandler' => 'includes/content/JSONContentHandler.php',
-       'JSONContent' => 'includes/content/JSONContent.php',
+       'JavaScriptContentHandler' => 'includes/content/JavaScriptContentHandler.php',
+       'JsonContent' => 'includes/content/JsonContent.php',
+       'JsonContentHandler' => 'includes/content/JsonContentHandler.php',
        'MessageContent' => 'includes/content/MessageContent.php',
        'MWContentSerializationException' => 'includes/content/ContentHandler.php',
-       'TextContentHandler' => 'includes/content/TextContentHandler.php',
        'TextContent' => 'includes/content/TextContent.php',
-       'WikitextContentHandler' => 'includes/content/WikitextContentHandler.php',
+       'TextContentHandler' => 'includes/content/TextContentHandler.php',
        'WikitextContent' => 'includes/content/WikitextContent.php',
+       'WikitextContentHandler' => 'includes/content/WikitextContentHandler.php',
 
        # includes/context
        'ContextSource' => 'includes/context/ContextSource.php',
@@ -496,6 +499,7 @@ $wgAutoloadLocalClasses = array(
        'UserBlockedError' => 'includes/exception/UserBlockedError.php',
        'UserNotLoggedIn' => 'includes/exception/UserNotLoggedIn.php',
        'ThrottledError' => 'includes/exception/ThrottledError.php',
+       'TimestampException' => 'includes/exception/TimestampException.php',
        'ReadOnlyError' => 'includes/exception/ReadOnlyError.php',
        'PermissionsError' => 'includes/exception/PermissionsError.php',
        'MWException' => 'includes/exception/MWException.php',
@@ -650,6 +654,7 @@ $wgAutoloadLocalClasses = array(
        'UploadFromUrlJob' => 'includes/jobqueue/jobs/UploadFromUrlJob.php',
        'AssembleUploadChunksJob' => 'includes/jobqueue/jobs/AssembleUploadChunksJob.php',
        'PublishStashedFileJob' => 'includes/jobqueue/jobs/PublishStashedFileJob.php',
+       'ThumbnailRenderJob' => 'includes/jobqueue/jobs/ThumbnailRenderJob.php',
 
        # includes/jobqueue/utils
        'BacklinkJobUtils' => 'includes/jobqueue/utils/BacklinkJobUtils.php',
@@ -722,6 +727,11 @@ $wgAutoloadLocalClasses = array(
        'PackedHoverImageGallery' => 'includes/gallery/PackedOverlayImageGallery.php',
        'PackedOverlayImageGallery' => 'includes/gallery/PackedOverlayImageGallery.php',
 
+       # includes/mail
+       'EmailNotification' => 'includes/mail/EmailNotification.php',
+       'MailAddress' => 'includes/mail/MailAddress.php',
+       'UserMailer' => 'includes/mail/UserMailer.php',
+
        # includes/media
        'BitmapHandler' => 'includes/media/Bitmap.php',
        'BitmapHandler_ClientOnly' => 'includes/media/Bitmap_ClientOnly.php',
@@ -748,6 +758,7 @@ $wgAutoloadLocalClasses = array(
        'SVGReader' => 'includes/media/SVGMetadataExtractor.php',
        'ThumbnailImage' => 'includes/media/MediaTransformOutput.php',
        'TiffHandler' => 'includes/media/Tiff.php',
+       'TransformationalImageHandler' => 'includes/media/TransformationalImageHandler.php',
        'TransformParameterError' => 'includes/media/MediaTransformOutput.php',
        'XCFHandler' => 'includes/media/XCF.php',
        'XMPInfo' => 'includes/media/XMPInfo.php',
@@ -787,6 +798,13 @@ $wgAutoloadLocalClasses = array(
        'WikiFilePage' => 'includes/page/WikiFilePage.php',
        'WikiPage' => 'includes/page/WikiPage.php',
 
+       # includes/pager
+       'AlphabeticPager' => 'includes/pager/AlphabeticPager.php',
+       'IndexPager' => 'includes/pager/IndexPager.php',
+       'Pager' => 'includes/pager/Pager.php',
+       'ReverseChronologicalPager' => 'includes/pager/ReverseChronologicalPager.php',
+       'TablePager' => 'includes/pager/TablePager.php',
+
        # includes/parser
        'CacheTime' => 'includes/parser/CacheTime.php',
        'CoreParserFunctions' => 'includes/parser/CoreParserFunctions.php',
@@ -865,13 +883,14 @@ $wgAutoloadLocalClasses = array(
                'includes/resourceloader/DerivativeResourceLoaderContext.php',
        'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
        'ResourceLoaderContext' => 'includes/resourceloader/ResourceLoaderContext.php',
+       'ResourceLoaderEditToolbarModule' => 'includes/resourceloader/ResourceLoaderEditToolbarModule.php',
        'ResourceLoaderFileModule' => 'includes/resourceloader/ResourceLoaderFileModule.php',
        'ResourceLoaderFilePageModule' => 'includes/resourceloader/ResourceLoaderFilePageModule.php',
        'ResourceLoaderFilePath' => 'includes/resourceloader/ResourceLoaderFilePath.php',
-       'ResourceLoaderLESSFunctions' => 'includes/resourceloader/ResourceLoaderLESSFunctions.php',
        'ResourceLoaderModule' => 'includes/resourceloader/ResourceLoaderModule.php',
        'ResourceLoaderNoscriptModule' => 'includes/resourceloader/ResourceLoaderNoscriptModule.php',
        'ResourceLoaderSiteModule' => 'includes/resourceloader/ResourceLoaderSiteModule.php',
+       'ResourceLoaderSkinModule' => 'includes/resourceloader/ResourceLoaderSkinModule.php',
        'ResourceLoaderStartUpModule' => 'includes/resourceloader/ResourceLoaderStartUpModule.php',
        'ResourceLoaderUserCSSPrefsModule' =>
                'includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php',
@@ -893,8 +912,8 @@ $wgAutoloadLocalClasses = array(
        'RevDelArchiveList' => 'includes/revisiondelete/RevDelArchiveList.php',
        'RevDelFileItem' => 'includes/revisiondelete/RevDelFileItem.php',
        'RevDelFileList' => 'includes/revisiondelete/RevDelFileList.php',
-       'RevDelItem' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
-       'RevDelList' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
+       'RevDelItem' => 'includes/revisiondelete/RevDelItem.php',
+       'RevDelList' => 'includes/revisiondelete/RevDelList.php',
        'RevDelLogItem' => 'includes/revisiondelete/RevDelLogItem.php',
        'RevDelLogList' => 'includes/revisiondelete/RevDelLogList.php',
        'RevDelRevisionItem' => 'includes/revisiondelete/RevDelRevisionItem.php',
@@ -928,10 +947,12 @@ $wgAutoloadLocalClasses = array(
        'SiteStore' => 'includes/site/SiteStore.php',
 
        # includes/skins
-       'BaseTemplate' => 'includes/skins/SkinTemplate.php',
-       'MediaWikiI18N' => 'includes/skins/SkinTemplate.php',
-       'QuickTemplate' => 'includes/skins/SkinTemplate.php',
+       'BaseTemplate' => 'includes/skins/BaseTemplate.php',
+       'MediaWikiI18N' => 'includes/skins/MediaWikiI18N.php',
+       'QuickTemplate' => 'includes/skins/QuickTemplate.php',
        'Skin' => 'includes/skins/Skin.php',
+       'SkinApi' => 'includes/skins/SkinApi.php',
+       'SkinApiTemplate' => 'includes/skins/SkinApiTemplate.php',
        'SkinException' => 'includes/skins/SkinException.php',
        'SkinFactory' => 'includes/skins/SkinFactory.php',
        'SkinFallback' => 'includes/skins/SkinFallback.php',
@@ -979,6 +1000,7 @@ $wgAutoloadLocalClasses = array(
        'LoginForm' => 'includes/specials/SpecialUserlogin.php',
        'LonelyPagesPage' => 'includes/specials/SpecialLonelypages.php',
        'LongPagesPage' => 'includes/specials/SpecialLongpages.php',
+       'MediaStatisticsPage' => 'includes/specials/SpecialMediaStatistics.php',
        'MergeHistoryPager' => 'includes/specials/SpecialMergeHistory.php',
        'MIMEsearchPage' => 'includes/specials/SpecialMIMEsearch.php',
        'MostcategoriesPage' => 'includes/specials/SpecialMostcategories.php',
@@ -1001,6 +1023,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialAllMessages' => 'includes/specials/SpecialAllMessages.php',
        'SpecialAllMyUploads' => 'includes/specials/SpecialMyRedirectPages.php',
        'SpecialAllPages' => 'includes/specials/SpecialAllPages.php',
+       'SpecialApiHelp' => 'includes/specials/SpecialApiHelp.php',
        'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
        'SpecialBlock' => 'includes/specials/SpecialBlock.php',
        'SpecialBlockList' => 'includes/specials/SpecialBlockList.php',
index 5881353..8e52bf0 100644 (file)
@@ -80,6 +80,20 @@ class Block {
        /**
         * @todo FIXME: Don't know what the best format to have for this constructor
         *   is, but fourteen optional parameters certainly isn't it.
+        * @param string $address
+        * @param int $user
+        * @param int $by
+        * @param string $reason
+        * @param mixed $timestamp
+        * @param int $auto
+        * @param string $expiry
+        * @param int $anonOnly
+        * @param int $createAccount
+        * @param int $enableAutoblock
+        * @param int $hideName
+        * @param int $blockEmail
+        * @param int $allowUsertalk
+        * @param string $byText
         */
        function __construct( $address = '', $user = 0, $by = 0, $reason = '',
                $timestamp = 0, $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
@@ -582,7 +596,6 @@ class Block {
         *
         * @param Block $block
         * @param array &$blockIds
-        * @return array Block IDs of retroactive autoblocks made
         */
        protected static function defaultRetroactiveAutoblock( Block $block, array &$blockIds ) {
                global $wgPutIPinRC;
@@ -872,7 +885,7 @@ class Block {
        /**
         * Get/set a flag determining whether the master is used for reads
         *
-        * @param bool $x
+        * @param bool|null $x
         * @return bool
         */
        public function fromMaster( $x = null ) {
@@ -881,7 +894,7 @@ class Block {
 
        /**
         * Get/set whether the Block is a hardblock (affects logged-in users on a given IP/range
-        * @param bool $x
+        * @param bool|null $x
         * @return bool
         */
        public function isHardblock( $x = null ) {
@@ -893,6 +906,10 @@ class Block {
                        : $this->isHardblock;
        }
 
+       /**
+        * @param null|bool $x
+        * @return bool
+        */
        public function isAutoblocking( $x = null ) {
                wfSetVar( $this->isAutoblocking, $x );
 
@@ -906,7 +923,7 @@ class Block {
        /**
         * Get/set whether the Block prevents a given action
         * @param string $action
-        * @param bool $x
+        * @param bool|null $x
         * @return bool
         */
        public function prevents( $action, $x = null ) {
@@ -1110,6 +1127,7 @@ class Block {
         *        a block is to the server, and if a block matches exactly, or is in a range.
         *        The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
         *        local-squid, ...)
+        * @throws MWException
         * @return Block|null The "best" block from the list
         */
        public static function chooseBlock( array $blocks, array $ipChain ) {
@@ -1143,6 +1161,7 @@ class Block {
                );
                $ipChain = array_reverse( $ipChain );
 
+               /** @var Block $block */
                foreach ( $blocks as $block ) {
                        // Stop searching if we have already have a "better" block. This
                        // is why the order of the blocks matters
diff --git a/includes/CategoryFinder.php b/includes/CategoryFinder.php
new file mode 100644 (file)
index 0000000..cf537e1
--- /dev/null
@@ -0,0 +1,244 @@
+<?php
+/**
+ * Recent changes filtering by category.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * The "CategoryFinder" class takes a list of articles, creates an internal
+ * representation of all their parent categories (as well as parents of
+ * parents etc.). From this representation, it determines which of these
+ * articles are in one or all of a given subset of categories.
+ *
+ * Example use :
+ * <code>
+ *     # Determines whether the article with the page_id 12345 is in both
+ *     # "Category 1" and "Category 2" or their subcategories, respectively
+ *
+ *     $cf = new CategoryFinder;
+ *     $cf->seed(
+ *         array( 12345 ),
+ *         array( 'Category 1', 'Category 2' ),
+ *         'AND'
+ *     );
+ *     $a = $cf->run();
+ *     print implode( ',' , $a );
+ * </code>
+ *
+ */
+class CategoryFinder {
+       /** @var int[] The original article IDs passed to the seed function */
+       protected $articles = array();
+
+       /** @var array Array of DBKEY category names for categories that don't have a page */
+       protected $deadend = array();
+
+       /** @var array Array of [ID => array()] */
+       protected $parents = array();
+
+       /** @var array Array of article/category IDs */
+       protected $next = array();
+
+       /** @var array Array of DBKEY category names */
+       protected $targets = array();
+
+       /** @var array */
+       protected $name2id = array();
+
+       /** @var string "AND" or "OR" */
+       protected $mode;
+
+       /** @var DatabaseBase Read-DB slave */
+       protected $dbr;
+
+       /**
+        * Initializes the instance. Do this prior to calling run().
+        * @param array $articleIds Array of article IDs
+        * @param array $categories FIXME
+        * @param string $mode FIXME, default 'AND'.
+        * @todo FIXME: $categories/$mode
+        */
+       public function seed( $articleIds, $categories, $mode = 'AND' ) {
+               $this->articles = $articleIds;
+               $this->next = $articleIds;
+               $this->mode = $mode;
+
+               # Set the list of target categories; convert them to DBKEY form first
+               $this->targets = array();
+               foreach ( $categories as $c ) {
+                       $ct = Title::makeTitleSafe( NS_CATEGORY, $c );
+                       if ( $ct ) {
+                               $c = $ct->getDBkey();
+                               $this->targets[$c] = $c;
+                       }
+               }
+       }
+
+       /**
+        * Iterates through the parent tree starting with the seed values,
+        * then checks the articles if they match the conditions
+        * @return array Array of page_ids (those given to seed() that match the conditions)
+        */
+       public function run() {
+               $this->dbr = wfGetDB( DB_SLAVE );
+               while ( count( $this->next ) > 0 ) {
+                       $this->scanNextLayer();
+               }
+
+               # Now check if this applies to the individual articles
+               $ret = array();
+
+               foreach ( $this->articles as $article ) {
+                       $conds = $this->targets;
+                       if ( $this->check( $article, $conds ) ) {
+                               # Matches the conditions
+                               $ret[] = $article;
+                       }
+               }
+               return $ret;
+       }
+
+       /**
+        * Get the parents. Only really useful if run() has been called already
+        * @return array
+        */
+       public function getParents() {
+               return $this->parents;
+       }
+
+       /**
+        * This functions recurses through the parent representation, trying to match the conditions
+        * @param int $id The article/category to check
+        * @param array $conds The array of categories to match
+        * @param array $path Used to check for recursion loops
+        * @return bool Does this match the conditions?
+        */
+       private function check( $id, &$conds, $path = array() ) {
+               // Check for loops and stop!
+               if ( in_array( $id, $path ) ) {
+                       return false;
+               }
+
+               $path[] = $id;
+
+               # Shortcut (runtime paranoia): No conditions=all matched
+               if ( count( $conds ) == 0 ) {
+                       return true;
+               }
+
+               if ( !isset( $this->parents[$id] ) ) {
+                       return false;
+               }
+
+               # iterate through the parents
+               foreach ( $this->parents[$id] as $p ) {
+                       $pname = $p->cl_to;
+
+                       # Is this a condition?
+                       if ( isset( $conds[$pname] ) ) {
+                               # This key is in the category list!
+                               if ( $this->mode == 'OR' ) {
+                                       # One found, that's enough!
+                                       $conds = array();
+                                       return true;
+                               } else {
+                                       # Assuming "AND" as default
+                                       unset( $conds[$pname] );
+                                       if ( count( $conds ) == 0 ) {
+                                               # All conditions met, done
+                                               return true;
+                                       }
+                               }
+                       }
+
+                       # Not done yet, try sub-parents
+                       if ( !isset( $this->name2id[$pname] ) ) {
+                               # No sub-parent
+                               continue;
+                       }
+                       $done = $this->check( $this->name2id[$pname], $conds, $path );
+                       if ( $done || count( $conds ) == 0 ) {
+                               # Subparents have done it!
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Scans a "parent layer" of the articles/categories in $this->next
+        */
+       private function scanNextLayer() {
+               $profiler = new ProfileSection( __METHOD__ );
+
+               # Find all parents of the article currently in $this->next
+               $layer = array();
+               $res = $this->dbr->select(
+                       /* FROM   */ 'categorylinks',
+                       /* SELECT */ '*',
+                       /* WHERE  */ array( 'cl_from' => $this->next ),
+                       __METHOD__ . '-1'
+               );
+               foreach ( $res as $o ) {
+                       $k = $o->cl_to;
+
+                       # Update parent tree
+                       if ( !isset( $this->parents[$o->cl_from] ) ) {
+                               $this->parents[$o->cl_from] = array();
+                       }
+                       $this->parents[$o->cl_from][$k] = $o;
+
+                       # Ignore those we already have
+                       if ( in_array( $k, $this->deadend ) ) {
+                               continue;
+                       }
+
+                       if ( isset( $this->name2id[$k] ) ) {
+                               continue;
+                       }
+
+                       # Hey, new category!
+                       $layer[$k] = $k;
+               }
+
+               $this->next = array();
+
+               # Find the IDs of all category pages in $layer, if they exist
+               if ( count( $layer ) > 0 ) {
+                       $res = $this->dbr->select(
+                               /* FROM   */ 'page',
+                               /* SELECT */ array( 'page_id', 'page_title' ),
+                               /* WHERE  */ array( 'page_namespace' => NS_CATEGORY, 'page_title' => $layer ),
+                               __METHOD__ . '-2'
+                       );
+                       foreach ( $res as $o ) {
+                               $id = $o->page_id;
+                               $name = $o->page_title;
+                               $this->name2id[$name] = $id;
+                               $this->next[] = $id;
+                               unset( $layer[$name] );
+                       }
+               }
+
+               # Mark dead ends
+               foreach ( $layer as $v ) {
+                       $this->deadend[$v] = $v;
+               }
+       }
+}
index 22eb3d1..7581ae4 100644 (file)
@@ -25,10 +25,10 @@ class CategoryViewer extends ContextSource {
        public $limit;
 
        /** @var array */
-       protected $from;
+       public $from;
 
        /** @var array */
-       protected $until;
+       public $until;
 
        /** @var string[] */
        public $articles;
@@ -37,37 +37,37 @@ class CategoryViewer extends ContextSource {
        public $articles_start_char;
 
        /** @var array */
-       protected $children;
+       public $children;
 
        /** @var array */
-       protected $children_start_char;
+       public $children_start_char;
 
        /** @var bool */
-       protected $showGallery;
+       public $showGallery;
 
        /** @var array */
-       protected $imgsNoGallery_start_char;
+       public $imgsNoGallery_start_char;
 
        /** @var array */
-       protected $imgsNoGallery;
+       public $imgsNoGallery;
 
        /** @var array */
-       protected $nextPage;
+       public $nextPage;
 
        /** @var array */
        protected $prevPage;
 
        /** @var array */
-       protected $flip;
+       public $flip;
 
        /** @var Title */
-       protected $title;
+       public $title;
 
        /** @var Collation */
-       protected $collation;
+       public $collation;
 
        /** @var ImageGallery */
-       protected $gallery;
+       public $gallery;
 
        /** @var Category Category object for this page. */
        private $cat;
@@ -87,12 +87,11 @@ class CategoryViewer extends ContextSource {
        function __construct( $title, IContextSource $context, $from = array(),
                $until = array(), $query = array()
        ) {
-               global $wgCategoryPagingLimit;
                $this->title = $title;
                $this->setContext( $context );
                $this->from = $from;
                $this->until = $until;
-               $this->limit = $wgCategoryPagingLimit;
+               $this->limit = $context->getConfig()->get( 'CategoryPagingLimit' );
                $this->cat = Category::newFromTitle( $title );
                $this->query = $query;
                $this->collation = Collation::singleton();
@@ -105,10 +104,10 @@ class CategoryViewer extends ContextSource {
         * @return string HTML output
         */
        public function getHTML() {
-               global $wgCategoryMagicGallery;
                wfProfileIn( __METHOD__ );
 
-               $this->showGallery = $wgCategoryMagicGallery && !$this->getOutput()->mNoGallery;
+               $this->showGallery = $this->getConfig()->get( 'CategoryMagicGallery' )
+                       && !$this->getOutput()->mNoGallery;
 
                $this->clearCategoryState();
                $this->doCategoryQuery();
@@ -154,14 +153,13 @@ class CategoryViewer extends ContextSource {
                        // Note that null for mode is taken to mean use default.
                        $mode = $this->getRequest()->getVal( 'gallerymode', null );
                        try {
-                               $this->gallery = ImageGalleryBase::factory( $mode );
+                               $this->gallery = ImageGalleryBase::factory( $mode, $this->getContext() );
                        } catch ( MWException $e ) {
                                // User specified something invalid, fallback to default.
-                               $this->gallery = ImageGalleryBase::factory();
+                               $this->gallery = ImageGalleryBase::factory( false, $this->getContext() );
                        }
 
                        $this->gallery->setHideBadImages();
-                       $this->gallery->setContext( $this->getContext() );
                } else {
                        $this->imgsNoGallery = array();
                        $this->imgsNoGallery_start_char = array();
diff --git a/includes/Categoryfinder.php b/includes/Categoryfinder.php
deleted file mode 100644 (file)
index a5415af..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-<?php
-/**
- * Recent changes filtering by category.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * The "Categoryfinder" class takes a list of articles, creates an internal
- * representation of all their parent categories (as well as parents of
- * parents etc.). From this representation, it determines which of these
- * articles are in one or all of a given subset of categories.
- *
- * Example use :
- * <code>
- *     # Determines whether the article with the page_id 12345 is in both
- *     # "Category 1" and "Category 2" or their subcategories, respectively
- *
- *     $cf = new Categoryfinder;
- *     $cf->seed(
- *         array( 12345 ),
- *         array( 'Category 1', 'Category 2' ),
- *         'AND'
- *     );
- *     $a = $cf->run();
- *     print implode( ',' , $a );
- * </code>
- *
- */
-class Categoryfinder {
-       /** @var int[] The original article IDs passed to the seed function */
-       protected $articles = array();
-
-       /** @var array Array of DBKEY category names for categories that don't have a page */
-       protected $deadend = array();
-
-       /** @var array Array of [ID => array()] */
-       protected $parents = array();
-
-       /** @var array Array of article/category IDs */
-       protected $next = array();
-
-       /** @var array Array of DBKEY category names */
-       protected $targets = array();
-
-       /** @var array */
-       protected $name2id = array();
-
-       /** @var string "AND" or "OR" */
-       protected $mode;
-
-       /** @var DatabaseBase Read-DB slave */
-       protected $dbr;
-
-       function __construct() {
-       }
-
-       /**
-        * Initializes the instance. Do this prior to calling run().
-        * @param array $article_ids Array of article IDs
-        * @param array $categories FIXME
-        * @param string $mode FIXME, default 'AND'.
-        * @todo FIXME: $categories/$mode
-        */
-       function seed( $article_ids, $categories, $mode = 'AND' ) {
-               $this->articles = $article_ids;
-               $this->next = $article_ids;
-               $this->mode = $mode;
-
-               # Set the list of target categories; convert them to DBKEY form first
-               $this->targets = array();
-               foreach ( $categories as $c ) {
-                       $ct = Title::makeTitleSafe( NS_CATEGORY, $c );
-                       if ( $ct ) {
-                               $c = $ct->getDBkey();
-                               $this->targets[$c] = $c;
-                       }
-               }
-       }
-
-       /**
-        * Iterates through the parent tree starting with the seed values,
-        * then checks the articles if they match the conditions
-        * @return array Array of page_ids (those given to seed() that match the conditions)
-        */
-       function run() {
-               $this->dbr = wfGetDB( DB_SLAVE );
-               while ( count( $this->next ) > 0 ) {
-                       $this->scan_next_layer();
-               }
-
-               # Now check if this applies to the individual articles
-               $ret = array();
-
-               foreach ( $this->articles as $article ) {
-                       $conds = $this->targets;
-                       if ( $this->check( $article, $conds ) ) {
-                               # Matches the conditions
-                               $ret[] = $article;
-                       }
-               }
-               return $ret;
-       }
-
-       /**
-        * This functions recurses through the parent representation, trying to match the conditions
-        * @param int $id The article/category to check
-        * @param array $conds The array of categories to match
-        * @param array $path Used to check for recursion loops
-        * @return bool Does this match the conditions?
-        */
-       function check( $id, &$conds, $path = array() ) {
-               // Check for loops and stop!
-               if ( in_array( $id, $path ) ) {
-                       return false;
-               }
-
-               $path[] = $id;
-
-               # Shortcut (runtime paranoia): No conditions=all matched
-               if ( count( $conds ) == 0 ) {
-                       return true;
-               }
-
-               if ( !isset( $this->parents[$id] ) ) {
-                       return false;
-               }
-
-               # iterate through the parents
-               foreach ( $this->parents[$id] as $p ) {
-                       $pname = $p->cl_to;
-
-                       # Is this a condition?
-                       if ( isset( $conds[$pname] ) ) {
-                               # This key is in the category list!
-                               if ( $this->mode == 'OR' ) {
-                                       # One found, that's enough!
-                                       $conds = array();
-                                       return true;
-                               } else {
-                                       # Assuming "AND" as default
-                                       unset( $conds[$pname] );
-                                       if ( count( $conds ) == 0 ) {
-                                               # All conditions met, done
-                                               return true;
-                                       }
-                               }
-                       }
-
-                       # Not done yet, try sub-parents
-                       if ( !isset( $this->name2id[$pname] ) ) {
-                               # No sub-parent
-                               continue;
-                       }
-                       $done = $this->check( $this->name2id[$pname], $conds, $path );
-                       if ( $done || count( $conds ) == 0 ) {
-                               # Subparents have done it!
-                               return true;
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Scans a "parent layer" of the articles/categories in $this->next
-        */
-       function scan_next_layer() {
-               wfProfileIn( __METHOD__ );
-
-               # Find all parents of the article currently in $this->next
-               $layer = array();
-               $res = $this->dbr->select(
-                       /* FROM   */ 'categorylinks',
-                       /* SELECT */ '*',
-                       /* WHERE  */ array( 'cl_from' => $this->next ),
-                       __METHOD__ . '-1'
-               );
-               foreach ( $res as $o ) {
-                       $k = $o->cl_to;
-
-                       # Update parent tree
-                       if ( !isset( $this->parents[$o->cl_from] ) ) {
-                               $this->parents[$o->cl_from] = array();
-                       }
-                       $this->parents[$o->cl_from][$k] = $o;
-
-                       # Ignore those we already have
-                       if ( in_array( $k, $this->deadend ) ) {
-                               continue;
-                       }
-
-                       if ( isset( $this->name2id[$k] ) ) {
-                               continue;
-                       }
-
-                       # Hey, new category!
-                       $layer[$k] = $k;
-               }
-
-               $this->next = array();
-
-               # Find the IDs of all category pages in $layer, if they exist
-               if ( count( $layer ) > 0 ) {
-                       $res = $this->dbr->select(
-                               /* FROM   */ 'page',
-                               /* SELECT */ array( 'page_id', 'page_title' ),
-                               /* WHERE  */ array( 'page_namespace' => NS_CATEGORY, 'page_title' => $layer ),
-                               __METHOD__ . '-2'
-                       );
-                       foreach ( $res as $o ) {
-                               $id = $o->page_id;
-                               $name = $o->page_title;
-                               $this->name2id[$name] = $id;
-                               $this->next[] = $id;
-                               unset( $layer[$name] );
-                       }
-               }
-
-               # Mark dead ends
-               foreach ( $layer as $v ) {
-                       $this->deadend[$v] = $v;
-               }
-
-               wfProfileOut( __METHOD__ );
-       }
-}
index 94b7b7a..a3c2360 100644 (file)
@@ -265,7 +265,7 @@ class ChangeTags {
                                'tagfilter',
                                20,
                                $selected,
-                               array( 'class' => 'mw-tagfilter-input', 'id' => 'tagfilter' )
+                               array( 'class' => 'mw-tagfilter-input mw-ui-input mw-ui-input-inline', 'id' => 'tagfilter' )
                        )
                );
 
index 12e3357..0cfa8c4 100644 (file)
@@ -73,7 +73,7 @@ $wgConfigRegistry = array(
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.24alpha';
+$wgVersion = '1.25alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -253,7 +253,7 @@ $wgFileCacheDirectory = false;
 
 /**
  * The URL path of the wiki logo. The logo size should be 135x135 pixels.
- * Defaults to "{$wgStylePath}/common/images/wiki.png".
+ * Defaults to "$wgResourceBasePath/resources/assets/wiki.png".
  */
 $wgLogo = false;
 
@@ -859,7 +859,7 @@ $wgContentHandlers = array(
        // dumb version, no syntax highlighting
        CONTENT_MODEL_JAVASCRIPT => 'JavaScriptContentHandler',
        // simple implementation, for use by extensions, etc.
-       CONTENT_MODEL_JSON => 'JSONContentHandler',
+       CONTENT_MODEL_JSON => 'JsonContentHandler',
        // dumb version, no syntax highlighting
        CONTENT_MODEL_CSS => 'CssContentHandler',
        // plain text, for use by extensions, etc.
@@ -1156,7 +1156,7 @@ $wgMimeInfoFile = 'includes/mime.info';
  * Sets an external MIME detector program. The command must print only
  * the MIME type to standard output.
  * The name of the file to process will be appended to the command given here.
- * If not set or NULL, mime_content_type will be used if available.
+ * If not set or NULL, PHP's fileinfo extension will be used if available.
  *
  * @par Example:
  * @code
@@ -1242,6 +1242,46 @@ $wgThumbnailBuckets = null;
  */
 $wgThumbnailMinimumBucketDistance = 50;
 
+/**
+ * When defined, is an array of thumbnail widths to be rendered at upload time. The idea is to
+ * prerender common thumbnail sizes, in order to avoid the necessity to render them on demand, which
+ * has a performance impact for the first client to view a certain size.
+ *
+ * This obviously means that more disk space is needed per upload upfront.
+ *
+ * @since 1.25
+ */
+
+$wgUploadThumbnailRenderMap = array();
+
+/**
+ * The method through which the thumbnails will be prerendered for the entries in
+ * $wgUploadThumbnailRenderMap
+ *
+ * The method can be either "http" or "jobqueue". The former uses an http request to hit the
+ * thumbnail's URL.
+ * This method only works if thumbnails are configured to be rendered by a 404 handler. The latter
+ * option uses the job queue to render the thumbnail.
+ *
+ * @since 1.25
+ */
+$wgUploadThumbnailRenderMethod = 'jobqueue';
+
+/**
+ * When using the "http" wgUploadThumbnailRenderMethod, lets one specify a custom Host HTTP header.
+ *
+ * @since 1.25
+ */
+$wgUploadThumbnailRenderHttpCustomHost = false;
+
+/**
+ * When using the "http" wgUploadThumbnailRenderMethod, lets one specify a custom domain to send the
+ * HTTP request to.
+ *
+ * @since 1.25
+ */
+$wgUploadThumbnailRenderHttpCustomDomain = false;
+
 /**
  * Default parameters for the "<gallery>" tag
  */
@@ -1957,15 +1997,6 @@ $wgAllowSlowParserFunctions = false;
  */
 $wgAllowSchemaUpdates = true;
 
-/**
- * Anti-lock flags - bitfield
- *   - ALF_NO_LINK_LOCK:
- *       Don't use locking reads when updating the link table. This is
- *       necessary for wikis with a high edit rate for performance
- *       reasons, but may cause link table inconsistency
- */
-$wgAntiLockFlags = 0;
-
 /**
  * Maximum article size in kilobytes
  */
@@ -2075,6 +2106,28 @@ $wgObjectCaches = array(
        'hash' => array( 'class' => 'HashBagOStuff' ),
 );
 
+/**
+ * Map of bloom filter store names to configuration arrays.
+ *
+ * Example:
+ * $wgBloomFilterStores['main'] = array(
+ *  'cacheId'      => 'main-v1',
+ *  'class'        => 'BloomCacheRedis',
+ *  'redisServers' => array( '127.0.0.1:6379' ),
+ *  'redisConfig'  => array( 'connectTimeout' => 2 )
+ * );
+ *
+ * A primary bloom filter must be created manually.
+ * Example in eval.php:
+ * <code>
+ *     BloomCache::get( 'main' )->init( 'shared', 1000000000, .001 );
+ * </code>
+ * The size should be as large as practical given wiki size and resources.
+ *
+ * @since 1.24
+ */
+$wgBloomFilterStores = array();
+
 /**
  * The expiry time for the parser cache, in seconds.
  * The default is 86400 (one day).
@@ -2699,11 +2752,6 @@ $wgDisableLangConversion = false;
  */
 $wgDisableTitleConversion = false;
 
-/**
- * Whether to enable canonical language links in meta data.
- */
-$wgCanonicalLanguageLinks = true;
-
 /**
  * Default variant code, if false, the default will be the language code
  */
@@ -3085,7 +3133,7 @@ $wgFooterIcons = array(
        ),
        "poweredby" => array(
                "mediawiki" => array(
-                       "src" => null, // Defaults to "$wgStylePath/common/images/poweredby_mediawiki_88x31.png"
+                       "src" => null, // Defaults to "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png"
                        "url" => "//www.mediawiki.org/",
                        "alt" => "Powered by MediaWiki",
                )
@@ -3274,10 +3322,7 @@ $wgResourceModuleSkinStyles = array();
  *
  * @par Example:
  * @code
- *   $wgResourceLoaderSources['foo'] = array(
- *       'loadScript' => 'http://example.org/w/load.php',
- *       'apiScript' => 'http://example.org/w/api.php'
- *   );
+ *   $wgResourceLoaderSources['foo'] = 'http://example.org/w/load.php';
  * @endcode
  */
 $wgResourceLoaderSources = array();
@@ -3446,12 +3491,14 @@ $wgResourceLoaderValidateStaticJS = false;
 $wgResourceLoaderExperimentalAsyncLoading = false;
 
 /**
- * Global LESS variables. An associative array binding variable names to CSS
- * string values.
+ * Global LESS variables. An associative array binding variable names to
+ * LESS code snippets representing their values.
+ *
+ * Adding an item here is equivalent to writing `@variable: value;`
+ * at the beginning of all your .less files, with all the consequences.
+ * In particular, string values must be escaped and quoted.
  *
- * Because the hashed contents of this array are used to construct the cache key
- * that ResourceLoader uses to look up LESS compilation results, updating this
- * array can be used to deliberately invalidate the set of cached results.
+ * Changes to LESS variables do not trigger cache invalidation.
  *
  * @par Example:
  * @code
@@ -3469,17 +3516,13 @@ $wgResourceLoaderLESSVars = array();
  * Custom LESS functions. An associative array mapping function name to PHP
  * callable.
  *
- * Changes to LESS functions do not trigger cache invalidation. If you update
- * the behavior of a LESS function and need to invalidate stale compilation
- * results, you can touch one of values in $wgResourceLoaderLESSVars, as
- * documented above.
+ * Changes to LESS functions do not trigger cache invalidation.
  *
  * @since 1.22
+ * @deprecated since 1.24 Questionable usefulness and problematic to support,
+ *     will be removed in the future.
  */
-$wgResourceLoaderLESSFunctions = array(
-       'embeddable' => 'ResourceLoaderLESSFunctions::embeddable',
-       'embed' => 'ResourceLoaderLESSFunctions::embed',
-);
+$wgResourceLoaderLESSFunctions = array();
 
 /**
  * Default import paths for LESS modules. LESS files referenced in @import
@@ -3861,6 +3904,12 @@ $wgMaxPPExpandDepth = 40;
 
 /**
  * URL schemes that should be recognized as valid by wfParseUrl().
+ *
+ * WARNING: Do not add 'file:' to this or internal file links will be broken.
+ * Instead, if you want to support file links, add 'file://'. The same applies
+ * to any other protocols with the same name as a namespace. See bug #44011 for
+ * more information.
+ *
  * @see wfParseUrl
  */
 $wgUrlProtocols = array(
@@ -4248,7 +4297,7 @@ $wgDefaultUserOptions = array(
        'showtoolbar' => 1,
        'skin' => false,
        'stubthreshold' => 0,
-       'thumbsize' => 2,
+       'thumbsize' => 5,
        'underline' => 2,
        'uselivepreview' => 0,
        'usenewrc' => 0,
@@ -5166,7 +5215,7 @@ $wgDebugDumpSqlLength = 500;
  *
  * @par Advanced example:
  * @code
- * $wgDebugLogGroups['memcached'] = (
+ * $wgDebugLogGroups['memcached'] = array(
  *     'destination' => '/var/log/mediawiki/memcached.log',
  *     'sample' => 1000,  // log 1 message out of every 1,000.
  * );
@@ -5568,11 +5617,6 @@ $wgPreviewOnOpenNamespaces = array(
        NS_CATEGORY => true
 );
 
-/**
- * Go button goes straight to the edit screen if the article doesn't exist.
- */
-$wgGoToEdit = false;
-
 /**
  * Enable the UniversalEditButton for browsers that support it
  * (currently only Firefox with an extension)
@@ -5673,9 +5717,9 @@ $wgGitRepositoryViewers = array(
 /**
  * Recentchanges items are periodically purged; entries older than this many
  * seconds will go.
- * Default: 13 weeks = about three months
+ * Default: 90 days = about three months
  */
-$wgRCMaxAge = 13 * 7 * 24 * 3600;
+$wgRCMaxAge = 90 * 24 * 3600;
 
 /**
  * Filter $wgRCLinkDays by $wgRCMaxAge to avoid showing links for numbers
@@ -5827,11 +5871,6 @@ $wgAdvertisedFeedTypes = array( 'atom' );
  */
 $wgRCShowWatchingUsers = false; # UPO
 
-/**
- * Show watching users in Page views
- */
-$wgPageShowWatchingUsers = false;
-
 /**
  * Show the amount of changed characters in recent changes
  */
@@ -5995,6 +6034,17 @@ $wgShowCreditsIfMax = true;
  * Special:Import (for sysops). 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,
+ * e.g.
+ * @code
+ *     $wgImportSources = array(
+ *         'wikipedia' => array( 'cs', 'en', 'fr', 'zh' ),
+ *         'wikispecies',
+ *         'wikia' => array( 'animanga', 'brickipedia', 'desserts' ),
+ *     );
+ * @endcode
+ *
  * If a user has the 'import' permission but not the 'importupload' permission,
  * they will only be able to run imports through this transwiki interface.
  */
@@ -6117,6 +6167,7 @@ $wgExtensionMessagesFiles = array();
  */
 $wgMessagesDirs = array(
        'core' => "$IP/languages/i18n",
+       'api' => "$IP/includes/api/i18n",
        'oojs-ui' => "$IP/resources/lib/oojs-ui/i18n",
 );
 
@@ -6159,8 +6210,10 @@ $wgEnableParserLimitReporting = true;
 $wgValidSkinNames = array();
 
 /**
- * Special page list.
- * See the top of SpecialPage.php for documentation.
+ * Special page list. This is an associative array mapping the (canonical) names of
+ * special pages to either a class name to be instantiated, or a callback to use for
+ * creating the special page object. In both cases, the result must be an instance of
+ * SpecialPage.
  */
 $wgSpecialPages = array();
 
@@ -6286,6 +6339,7 @@ $wgJobClasses = array(
        'uploadFromUrl' => 'UploadFromUrlJob',
        'AssembleUploadChunks' => 'AssembleUploadChunksJob',
        'PublishStashedFile' => 'PublishStashedFileJob',
+       'ThumbnailRender' => 'ThumbnailRenderJob',
        'null' => 'NullJob'
 );
 
@@ -7021,6 +7075,18 @@ $wgAsyncHTTPTimeout = 25;
  */
 $wgHTTPProxy = false;
 
+/**
+ * Local virtual hosts.
+ *
+ * This lists domains that are configured as virtual hosts on the same machine.
+ * If a request is to be made to a domain listed here, or any subdomain thereof,
+ * then no proxy will be used.
+ * Command-line scripts are not affected by this setting and will always use
+ * proxy if it is configured.
+ * @since 1.25
+ */
+$wgLocalVirtualHosts = array();
+
 /**
  * Timeout for connections done internally (in seconds)
  * Only works for curl
index 017e9ea..d9e3aab 100644 (file)
@@ -152,12 +152,13 @@ define( 'AV_SCAN_FAILED', false );  #scan failed (scanner not found or error in
 
 /**@{
  * Anti-lock flags
- * See DefaultSettings.php for a description
+ * Was used by $wgAntiLockFlags, which was removed with 1.25
+ * Constants kept to not have warnings when used in LocalSettings
  */
 define( 'ALF_PRELOAD_LINKS', 1 ); // unused
 define( 'ALF_PRELOAD_EXISTENCE', 2 ); // unused
-define( 'ALF_NO_LINK_LOCK', 4 );
-define( 'ALF_NO_BLOCK_LOCK', 8 );
+define( 'ALF_NO_LINK_LOCK', 4 ); // unused
+define( 'ALF_NO_BLOCK_LOCK', 8 ); // unused
 /**@}*/
 
 /**@{
index 145eae2..a423f26 100644 (file)
@@ -185,7 +185,7 @@ class EditPage {
        private $mContextTitle = null;
 
        /** @var string */
-       protected $action = 'submit';
+       public $action = 'submit';
 
        /** @var bool */
        public $isConflict = false;
@@ -200,13 +200,13 @@ class EditPage {
        public $isJsSubpage = false;
 
        /** @var bool */
-       protected $isWrongCaseCssJsPage = false;
+       public $isWrongCaseCssJsPage = false;
 
        /** @var bool New page or new section */
-       protected $isNew = false;
+       public $isNew = false;
 
        /** @var bool */
-       protected $deletedSinceEdit;
+       public $deletedSinceEdit;
 
        /** @var string */
        public $formtype;
@@ -215,34 +215,34 @@ class EditPage {
        public $firsttime;
 
        /** @var bool|stdClass */
-       protected $lastDelete;
+       public $lastDelete;
 
        /** @var bool */
-       protected $mTokenOk = false;
+       public $mTokenOk = false;
 
        /** @var bool */
-       protected $mTokenOkExceptSuffix = false;
+       public $mTokenOkExceptSuffix = false;
 
        /** @var bool */
-       protected $mTriedSave = false;
+       public $mTriedSave = false;
 
        /** @var bool */
-       protected $incompleteForm = false;
+       public $incompleteForm = false;
 
        /** @var bool */
-       protected $tooBig = false;
+       public $tooBig = false;
 
        /** @var bool */
-       protected $kblength = false;
+       public $kblength = false;
 
        /** @var bool */
-       protected $missingComment = false;
+       public $missingComment = false;
 
        /** @var bool */
-       protected $missingSummary = false;
+       public $missingSummary = false;
 
        /** @var bool */
-       protected $allowBlankSummary = false;
+       public $allowBlankSummary = false;
 
        /** @var bool */
        protected $blankArticle = false;
@@ -251,19 +251,19 @@ class EditPage {
        protected $allowBlankArticle = false;
 
        /** @var string */
-       protected $autoSumm = '';
+       public $autoSumm = '';
 
        /** @var string */
        public $hookError = '';
 
        /** @var ParserOutput */
-       protected $mParserOutput;
+       public $mParserOutput;
 
        /** @var bool Has a summary been preset using GET parameter &summary= ? */
-       protected $hasPresetSummary = false;
+       public $hasPresetSummary = false;
 
        /** @var bool */
-       protected $mBaseRevision = false;
+       public $mBaseRevision = false;
 
        /** @var bool */
        public $mShowSummaryField = true;
@@ -277,16 +277,16 @@ class EditPage {
        public $preview = false;
 
        /** @var bool */
-       protected $diff = false;
+       public $diff = false;
 
        /** @var bool */
        public $minoredit = false;
 
        /** @var bool */
-       protected $watchthis = false;
+       public $watchthis = false;
 
        /** @var bool */
-       protected $recreate = false;
+       public $recreate = false;
 
        /** @var string */
        public $textbox1 = '';
@@ -298,7 +298,7 @@ class EditPage {
        public $summary = '';
 
        /** @var bool */
-       protected $nosummary = false;
+       public $nosummary = false;
 
        /** @var string */
        public $edittime = '';
@@ -310,13 +310,13 @@ class EditPage {
        public $sectiontitle = '';
 
        /** @var string */
-       protected $starttime = '';
+       public $starttime = '';
 
        /** @var int */
        public $oldid = 0;
 
        /** @var string */
-       protected $editintro = '';
+       public $editintro = '';
 
        /** @var null */
        public $scrolltop = null;
@@ -1892,8 +1892,14 @@ class EditPage {
                        ( ( $this->minoredit && !$this->isNew ) ? EDIT_MINOR : 0 ) |
                        ( $bot ? EDIT_FORCE_BOT : 0 );
 
-               $doEditStatus = $this->mArticle->doEditContent( $content, $this->summary, $flags,
-                                                                                                               false, null, $this->contentFormat );
+               $doEditStatus = $this->mArticle->doEditContent(
+                       $content,
+                       $this->summary,
+                       $flags,
+                       false,
+                       null,
+                       $content->getDefaultFormat()
+               );
 
                if ( !$doEditStatus->isOK() ) {
                        // Failure from doEdit()
@@ -1938,9 +1944,7 @@ class EditPage {
                        // Do this in its own transaction to reduce contention...
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->onTransactionIdle( function () use ( $dbw, $title, $watch, $wgUser, $fname ) {
-                               $dbw->begin( $fname );
                                WatchAction::doWatchOrUnwatch( $watch, $title, $wgUser );
-                               $dbw->commit( $fname );
                        } );
                }
        }
@@ -2226,11 +2230,7 @@ class EditPage {
         *   $this->allowNonTextContent is not true.
         */
        protected function toEditText( $content ) {
-               if ( $content === null || $content === false ) {
-                       return $content;
-               }
-
-               if ( is_string( $content ) ) {
+               if ( $content === null || $content === false || is_string( $content ) ) {
                        return $content;
                }
 
@@ -2425,9 +2425,7 @@ class EditPage {
 
                $wgOut->addHTML( $this->editFormTextBeforeContent );
 
-               if ( $this->contentModel === CONTENT_MODEL_WIKITEXT &&
-                       $showToolbar && $wgUser->getOption( 'showtoolbar' ) )
-               {
+               if ( !$this->isCssJsSubpage && $showToolbar && $wgUser->getOption( 'showtoolbar' ) ) {
                        $wgOut->addHTML( EditPage::getEditToolbar() );
                }
 
@@ -2612,9 +2610,18 @@ class EditPage {
                        );
                } elseif ( $wgUser->isAnon() ) {
                        if ( $this->formtype != 'preview' ) {
-                               $wgOut->wrapWikiMsg( "<div id=\"mw-anon-edit-warning\">\n$1</div>", 'anoneditwarning' );
+                               $wgOut->wrapWikiMsg(
+                                       "<div id='mw-anon-edit-warning'>\n$1\n</div>",
+                                       array( 'anoneditwarning',
+                                               // Log-in link
+                                               '{{fullurl:Special:UserLogin|returnto={{FULLPAGENAMEE}}}}',
+                                               // Sign-up link
+                                               '{{fullurl:Special:UserLogin/signup|returnto={{FULLPAGENAMEE}}}}' )
+                               );
                        } else {
-                               $wgOut->wrapWikiMsg( "<div id=\"mw-anon-preview-warning\">\n$1</div>", 'anonpreviewwarning' );
+                               $wgOut->wrapWikiMsg( "<div id=\"mw-anon-preview-warning\">\n$1</div>",
+                                       'anonpreviewwarning'
+                               );
                        }
                } else {
                        if ( $this->isCssJsSubpage ) {
@@ -2758,7 +2765,6 @@ class EditPage {
         *   up top, or false if this is the comment summary
         *   down below the textarea
         * @param string $summary The text of the summary to display
-        * @return string
         */
        protected function showSummaryInput( $isSubjectPreview, $summary = "" ) {
                global $wgOut, $wgContLang;
@@ -3100,6 +3106,7 @@ HTML
         * Get the copyright warning
         *
         * Renamed to getCopyrightWarning(), old name kept around for backwards compatibility
+        * @return string
         */
        protected function getCopywarn() {
                return self::getCopyrightWarning( $this->mTitle );
@@ -3183,7 +3190,7 @@ HTML
        }
 
        protected function showStandardInputs( &$tabindex = 2 ) {
-               global $wgOut, $wgUseMediaWikiUIEverywhere;
+               global $wgOut;
                $wgOut->addHTML( "<div class='editOptions'>\n" );
 
                if ( $this->section != 'new' ) {
@@ -3215,10 +3222,9 @@ HTML
                        'target' => 'helpwindow',
                        'href' => $edithelpurl,
                );
-               if ( $wgUseMediaWikiUIEverywhere ) {
-                       $attrs['class'] = 'mw-ui-button mw-ui-quiet';
-               }
-               $edithelp = Html::element( 'a', $attrs, wfMessage( 'edithelp' )->text() ) .
+               $edithelp = Html::linkButton( wfMessage( 'edithelp' )->text(),
+                       $attrs, array( 'mw-ui-quiet' ) ) .
+                       wfMessage( 'word-separator' )->escaped() .
                        wfMessage( 'newwindow' )->parse();
 
                $wgOut->addHTML( "      <span class='cancelLink'>{$cancel}</span>\n" );
@@ -3260,20 +3266,16 @@ HTML
         * @return string
         */
        public function getCancelLink() {
-               global $wgUseMediaWikiUIEverywhere;
                $cancelParams = array();
                if ( !$this->isConflict && $this->oldid > 0 ) {
                        $cancelParams['oldid'] = $this->oldid;
                }
                $attrs = array( 'id' => 'mw-editform-cancel' );
-               if ( $wgUseMediaWikiUIEverywhere ) {
-                       $attrs['class'] = 'mw-ui-button mw-ui-quiet';
-               }
 
                return Linker::linkKnown(
                        $this->getContextTitle(),
                        wfMessage( 'cancel' )->parse(),
-                       $attrs,
+                       Html::buttonAttributes( $attrs, array( 'mw-ui-quiet' ) ),
                        $cancelParams
                );
        }
@@ -3541,125 +3543,102 @@ HTML
         * @return string
         */
        static function getEditToolbar() {
-               global $wgStylePath, $wgContLang, $wgLang, $wgOut;
+               global $wgContLang, $wgOut;
                global $wgEnableUploads, $wgForeignFileRepos;
 
                $imagesAvailable = $wgEnableUploads || count( $wgForeignFileRepos );
 
                /**
                 * $toolarray is an array of arrays each of which includes the
-                * filename of the button image (without path), the opening
-                * tag, the closing tag, optionally a sample text that is
+                * opening tag, the closing tag, optionally a sample text that is
                 * inserted between the two when no selection is highlighted
                 * and.  The tip text is shown when the user moves the mouse
                 * over the button.
                 *
-                * Also here: accesskeys (key), which are not used yet until
-                * someone can figure out a way to make them work in
-                * IE. However, we should make sure these keys are not defined
-                * on the edit page.
+                * Images are defined in ResourceLoaderEditToolbarModule.
                 */
                $toolarray = array(
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-bold' ),
                                'id'     => 'mw-editbutton-bold',
                                'open'   => '\'\'\'',
                                'close'  => '\'\'\'',
                                'sample' => wfMessage( 'bold_sample' )->text(),
                                'tip'    => wfMessage( 'bold_tip' )->text(),
-                               'key'    => 'B'
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-italic' ),
                                'id'     => 'mw-editbutton-italic',
                                'open'   => '\'\'',
                                'close'  => '\'\'',
                                'sample' => wfMessage( 'italic_sample' )->text(),
                                'tip'    => wfMessage( 'italic_tip' )->text(),
-                               'key'    => 'I'
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-link' ),
                                'id'     => 'mw-editbutton-link',
                                'open'   => '[[',
                                'close'  => ']]',
                                'sample' => wfMessage( 'link_sample' )->text(),
                                'tip'    => wfMessage( 'link_tip' )->text(),
-                               'key'    => 'L'
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-extlink' ),
                                'id'     => 'mw-editbutton-extlink',
                                'open'   => '[',
                                'close'  => ']',
                                'sample' => wfMessage( 'extlink_sample' )->text(),
                                'tip'    => wfMessage( 'extlink_tip' )->text(),
-                               'key'    => 'X'
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-headline' ),
                                'id'     => 'mw-editbutton-headline',
                                'open'   => "\n== ",
                                'close'  => " ==\n",
                                'sample' => wfMessage( 'headline_sample' )->text(),
                                'tip'    => wfMessage( 'headline_tip' )->text(),
-                               'key'    => 'H'
                        ),
                        $imagesAvailable ? array(
-                               'image'  => $wgLang->getImageFile( 'button-image' ),
                                'id'     => 'mw-editbutton-image',
                                'open'   => '[[' . $wgContLang->getNsText( NS_FILE ) . ':',
                                'close'  => ']]',
                                'sample' => wfMessage( 'image_sample' )->text(),
                                'tip'    => wfMessage( 'image_tip' )->text(),
-                               'key'    => 'D',
                        ) : false,
                        $imagesAvailable ? array(
-                               'image'  => $wgLang->getImageFile( 'button-media' ),
                                'id'     => 'mw-editbutton-media',
                                'open'   => '[[' . $wgContLang->getNsText( NS_MEDIA ) . ':',
                                'close'  => ']]',
                                'sample' => wfMessage( 'media_sample' )->text(),
                                'tip'    => wfMessage( 'media_tip' )->text(),
-                               'key'    => 'M'
                        ) : false,
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-nowiki' ),
                                'id'     => 'mw-editbutton-nowiki',
                                'open'   => "<nowiki>",
                                'close'  => "</nowiki>",
                                'sample' => wfMessage( 'nowiki_sample' )->text(),
                                'tip'    => wfMessage( 'nowiki_tip' )->text(),
-                               'key'    => 'N'
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-sig' ),
                                'id'     => 'mw-editbutton-signature',
                                'open'   => '--~~~~',
                                'close'  => '',
                                'sample' => '',
                                'tip'    => wfMessage( 'sig_tip' )->text(),
-                               'key'    => 'Y'
                        ),
                        array(
-                               'image'  => $wgLang->getImageFile( 'button-hr' ),
                                'id'     => 'mw-editbutton-hr',
                                'open'   => "\n----\n",
                                'close'  => '',
                                'sample' => '',
                                'tip'    => wfMessage( 'hr_tip' )->text(),
-                               'key'    => 'R'
                        )
                );
 
-               $script = 'mw.loader.using("mediawiki.action.edit", function() {';
+               $script = 'mw.loader.using("mediawiki.toolbar", function () {';
                foreach ( $toolarray as $tool ) {
                        if ( !$tool ) {
                                continue;
                        }
 
                        $params = array(
-                               $wgStylePath . '/common/images/' . $tool['image'],
+                               // Images are defined in ResourceLoaderEditToolbarModule
+                               false,
                                // Note that we use the tip both for the ALT tag and the TITLE tag of the image.
                                // Older browsers show a "speedtip" type message only for ALT.
                                // Ideally these should be different, realistically they
@@ -3674,12 +3653,6 @@ HTML
                        $script .= Xml::encodeJsCall( 'mw.toolbar.addButton', $params );
                }
 
-               // This used to be called on DOMReady from mediawiki.action.edit, which
-               // ended up causing race conditions with the setup code above.
-               $script .= "\n" .
-                       "// Create button bar\n" .
-                       "$(function() { mw.toolbar.init(); } );\n";
-
                $script .= '});';
                $wgOut->addScript( Html::inlineScript( ResourceLoader::makeLoaderConditionalScript( $script ) ) );
 
@@ -3765,47 +3738,33 @@ HTML
         * @return array
         */
        public function getEditButtons( &$tabindex ) {
-               global $wgUseMediaWikiUIEverywhere;
-
                $buttons = array();
 
                $attribs = array(
                        'id' => 'wpSave',
                        'name' => 'wpSave',
-                       'type' => 'submit',
                        'tabindex' => ++$tabindex,
-                       'value' => wfMessage( 'savearticle' )->text(),
                ) + Linker::tooltipAndAccesskeyAttribs( 'save' );
-               if ( $wgUseMediaWikiUIEverywhere ) {
-                       $attribs['class'] = 'mw-ui-button mw-ui-constructive';
-               }
-               $buttons['save'] = Xml::element( 'input', $attribs, '' );
+               $buttons['save'] = Html::submitButton( wfMessage( 'savearticle' )->text(),
+                       $attribs, array( 'mw-ui-constructive' ) );
 
                ++$tabindex; // use the same for preview and live preview
                $attribs = array(
                        'id' => 'wpPreview',
                        'name' => 'wpPreview',
-                       'type' => 'submit',
                        'tabindex' => $tabindex,
-                       'value' => wfMessage( 'showpreview' )->text(),
                ) + Linker::tooltipAndAccesskeyAttribs( 'preview' );
-               if ( $wgUseMediaWikiUIEverywhere ) {
-                       $attribs['class'] = 'mw-ui-button mw-ui-progressive';
-               }
-               $buttons['preview'] = Xml::element( 'input', $attribs, '' );
+               $buttons['preview'] = Html::submitButton( wfMessage( 'showpreview' )->text(),
+                       $attribs );
                $buttons['live'] = '';
 
                $attribs = array(
                        'id' => 'wpDiff',
                        'name' => 'wpDiff',
-                       'type' => 'submit',
                        'tabindex' => ++$tabindex,
-                       'value' => wfMessage( 'showdiff' )->text(),
                ) + Linker::tooltipAndAccesskeyAttribs( 'diff' );
-               if ( $wgUseMediaWikiUIEverywhere ) {
-                       $attribs['class'] = 'mw-ui-button mw-ui-progressive';
-               }
-               $buttons['diff'] = Xml::element( 'input', $attribs, '' );
+               $buttons['diff'] = Html::submitButton( wfMessage( 'showdiff' )->text(),
+                       $attribs );
 
                wfRunHooks( 'EditPageBeforeEditButtons', array( &$this, &$buttons, &$tabindex ) );
                return $buttons;
index 43dfd17..dee0a86 100644 (file)
@@ -41,7 +41,7 @@ class WikiExporter {
        public $dumpUploadFileContents = false;
 
        /** @var string */
-       protected $author_list = "";
+       public $author_list = "";
 
        const FULL = 1;
        const CURRENT = 2;
@@ -56,13 +56,13 @@ class WikiExporter {
        const STUB = 1;
 
        /** @var int */
-       protected $buffer;
+       public $buffer;
 
        /** @var int */
-       protected $text;
+       public $text;
 
        /** @var DumpOutput */
-       protected $sink;
+       public $sink;
 
        /**
         * Returns the export schema version.
@@ -267,7 +267,7 @@ class WikiExporter {
                        if ( $this->buffer == WikiExporter::STREAM ) {
                                $prev = $this->db->bufferResults( false );
                        }
-                       $wrapper = null; // Assuring $wrapper is not undefined, if exception occurs early
+                       $result = null; // Assuring $result is not undefined, if exception occurs early
                        try {
                                $result = $this->db->select( array( 'logging', 'user' ),
                                        array( "{$logging}.*", 'user_name' ), // grab the user name
@@ -275,8 +275,7 @@ class WikiExporter {
                                        __METHOD__,
                                        array( 'ORDER BY' => 'log_id', 'USE INDEX' => array( 'logging' => 'PRIMARY' ) )
                                );
-                               $wrapper = $this->db->resultObject( $result );
-                               $this->outputLogStream( $wrapper );
+                               $this->outputLogStream( $result );
                                if ( $this->buffer == WikiExporter::STREAM ) {
                                        $this->db->bufferResults( $prev );
                                }
@@ -286,8 +285,8 @@ class WikiExporter {
 
                                // Freeing result
                                try {
-                                       if ( $wrapper ) {
-                                               $wrapper->free();
+                                       if ( $result ) {
+                                               $result->free();
                                        }
                                } catch ( Exception $e2 ) {
                                        // Already in panic mode -> ignoring $e2 as $e has
@@ -377,16 +376,15 @@ class WikiExporter {
                                $prev = $this->db->bufferResults( false );
                        }
 
-                       $wrapper = null; // Assuring $wrapper is not undefined, if exception occurs early
+                       $result = null; // Assuring $result is not undefined, if exception occurs early
                        try {
                                wfRunHooks( 'ModifyExportQuery',
                                                array( $this->db, &$tables, &$cond, &$opts, &$join ) );
 
                                # Do the query!
                                $result = $this->db->select( $tables, '*', $cond, __METHOD__, $opts, $join );
-                               $wrapper = $this->db->resultObject( $result );
                                # Output dump results
-                               $this->outputPageStream( $wrapper );
+                               $this->outputPageStream( $result );
 
                                if ( $this->buffer == WikiExporter::STREAM ) {
                                        $this->db->bufferResults( $prev );
@@ -397,8 +395,8 @@ class WikiExporter {
 
                                // Freeing result
                                try {
-                                       if ( $wrapper ) {
-                                               $wrapper->free();
+                                       if ( $result ) {
+                                               $result->free();
                                        }
                                } catch ( Exception $e2 ) {
                                        // Already in panic mode -> ignoring $e2 as $e has
@@ -467,7 +465,7 @@ class WikiExporter {
        }
 
        /**
-        * @param array $resultset
+        * @param ResultWrapper $resultset
         */
        protected function outputLogStream( $resultset ) {
                foreach ( $resultset as $row ) {
@@ -481,16 +479,6 @@ class WikiExporter {
  * @ingroup Dump
  */
 class XmlDumpWriter {
-       /**
-        * Returns the export schema version.
-        * @deprecated since 1.20; use WikiExporter::schemaVersion() instead
-        * @return string
-        */
-       function schemaVersion() {
-               wfDeprecated( __METHOD__, '1.20' );
-               return WikiExporter::schemaVersion();
-       }
-
        /**
         * Opens the XML output stream's root "<mediawiki>" element.
         * This does not include an xml directive, so is safe to include
@@ -1370,10 +1358,10 @@ class DumpNotalkFilter extends DumpFilter {
  */
 class DumpNamespaceFilter extends DumpFilter {
        /** @var bool */
-       protected $invert = false;
+       public $invert = false;
 
        /** @var array */
-       protected $namespaces = array();
+       public $namespaces = array();
 
        /**
         * @param DumpOutput $sink
@@ -1437,13 +1425,13 @@ class DumpNamespaceFilter extends DumpFilter {
  * @ingroup Dump
  */
 class DumpLatestFilter extends DumpFilter {
-       protected $page;
+       public $page;
 
-       protected $pageString;
+       public $pageString;
 
-       protected $rev;
+       public $rev;
 
-       protected $revString;
+       public $revString;
 
        /**
         * @param object $page
index 60e623b..2fdfa42 100644 (file)
  */
 class FeedItem {
        /** @var Title */
-       protected $title;
+       public $title;
 
-       protected $description;
+       public $description;
 
-       protected $url;
+       public $url;
 
-       protected $date;
+       public $date;
 
-       protected $author;
+       public $author;
 
-       protected $uniqueId;
+       public $uniqueId;
 
-       protected $comments;
+       public $comments;
 
        public $rssIsPermalink = false;
 
@@ -258,20 +258,11 @@ abstract class ChannelFeed extends FeedItem {
        }
 
        /**
-        * Output the initial XML headers with a stylesheet for legibility
-        * if someone finds it in a browser.
+        * Output the initial XML headers.
         */
        protected function outXmlHeader() {
-               global $wgStylePath, $wgStyleVersion;
-
                $this->httpHeaders();
                echo '<?xml version="1.0"?>' . "\n";
-               echo '<?xml-stylesheet type="text/css" href="' .
-                       htmlspecialchars( wfExpandUrl(
-                               "$wgStylePath/common/feed.css?$wgStyleVersion",
-                               PROTO_CURRENT
-                       ) ) .
-                       '"?' . ">\n";
        }
 }
 
index 4c2b772..2c26fef 100644 (file)
@@ -38,6 +38,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 if ( !function_exists( 'mb_substr' ) ) {
        /**
         * @codeCoverageIgnore
+        * @see Fallback::mb_substr
         * @return string
         */
        function mb_substr( $str, $start, $count = 'end' ) {
@@ -46,6 +47,7 @@ if ( !function_exists( 'mb_substr' ) ) {
 
        /**
         * @codeCoverageIgnore
+        * @see Fallback::mb_substr_split_unicode
         * @return int
         */
        function mb_substr_split_unicode( $str, $splitPos ) {
@@ -56,6 +58,7 @@ if ( !function_exists( 'mb_substr' ) ) {
 if ( !function_exists( 'mb_strlen' ) ) {
        /**
         * @codeCoverageIgnore
+        * @see Fallback::mb_strlen
         * @return int
         */
        function mb_strlen( $str, $enc = '' ) {
@@ -66,6 +69,7 @@ if ( !function_exists( 'mb_strlen' ) ) {
 if ( !function_exists( 'mb_strpos' ) ) {
        /**
         * @codeCoverageIgnore
+        * @see Fallback::mb_strpos
         * @return int
         */
        function mb_strpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
@@ -76,6 +80,7 @@ if ( !function_exists( 'mb_strpos' ) ) {
 if ( !function_exists( 'mb_strrpos' ) ) {
        /**
         * @codeCoverageIgnore
+        * @see Fallback::mb_strrpos
         * @return int
         */
        function mb_strrpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
@@ -88,6 +93,7 @@ if ( !function_exists( 'mb_strrpos' ) ) {
 if ( !function_exists( 'gzdecode' ) ) {
        /**
         * @codeCoverageIgnore
+        * @param string $data
         * @return string
         */
        function gzdecode( $data ) {
@@ -96,19 +102,30 @@ if ( !function_exists( 'gzdecode' ) ) {
 }
 
 // hash_equals function only exists in PHP >= 5.6.0
+// http://php.net/hash_equals
 if ( !function_exists( 'hash_equals' ) ) {
        /**
-        * Check whether a user-provided string is equal to a fixed-length secret without
-        * revealing bytes of the secret through timing differences.
+        * Check whether a user-provided string is equal to a fixed-length secret string
+        * without revealing bytes of the secret string through timing differences.
         *
-        * This timing guarantee -- that a partial match takes the same time as a complete
-        * mismatch -- is why this function is used in some security-sensitive parts of the code.
-        * For example, it shouldn't be possible to guess an HMAC signature one byte at a time.
+        * The usual way to compare strings (PHP's === operator or the underlying memcmp()
+        * function in C) is to compare corresponding bytes and stop at the first difference,
+        * which would take longer for a partial match than for a complete mismatch. This
+        * is not secure when one of the strings (e.g. an HMAC or token) must remain secret
+        * and the other may come from an attacker. Statistical analysis of timing measurements
+        * over many requests may allow the attacker to guess the string's bytes one at a time
+        * (and check his guesses) even if the timing differences are extremely small.
+        *
+        * When making such a security-sensitive comparison, it is essential that the sequence
+        * in which instructions are executed and memory locations are accessed not depend on
+        * the secret string's value. HOWEVER, for simplicity, we do not attempt to minimize
+        * the inevitable leakage of the string's length. That is generally known anyway as
+        * a chararacteristic of the hash function used to compute the secret value.
         *
         * Longer explanation: http://www.emerose.com/timing-attacks-explained
         *
         * @codeCoverageIgnore
-        * @param string $known_string Fixed-length secret to compare against
+        * @param string $known_string Fixed-length secret string to compare against
         * @param string $user_string User-provided string
         * @return bool True if the strings are the same, false otherwise
         */
@@ -128,14 +145,14 @@ if ( !function_exists( 'hash_equals' ) ) {
                        return false;
                }
 
-               // Note that we do one thing PHP doesn't: try to avoid leaking information about
-               // relative lengths of $known_string and $user_string, and of multiple $known_strings.
-               // However, lengths may still inevitably leak through, for example, CPU cache misses.
                $known_string_len = strlen( $known_string );
-               $user_string_len = strlen( $user_string );
-               $result = $known_string_len ^ $user_string_len;
-               for ( $i = 0; $i < $user_string_len; $i++ ) {
-                       $result |= ord( $known_string[$i % $known_string_len] ) ^ ord( $user_string[$i] );
+               if ( $known_string_len !== strlen( $user_string ) ) {
+                       return false;
+               }
+
+               $result = 0;
+               for ( $i = 0; $i < $known_string_len; $i++ ) {
+                       $result |= ord( $known_string[$i] ) ^ ord( $user_string[$i] );
                }
 
                return ( $result === 0 );
@@ -1401,7 +1418,7 @@ function wfGetLangObj( $langcode = false ) {
  *
  * This function replaces all old wfMsg* functions.
  *
- * @param string $key Message key
+ * @param string|string[] $key Message key, or array of keys
  * @param mixed $params,... Normal message parameters
  * @return Message
  *
@@ -2969,7 +2986,9 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
  * function, as all the arguments to wfShellExec can become unwieldy.
  *
  * @note This also includes errors from limit.sh, e.g. if $wgMaxShellFileSize is exceeded.
- * @param string $cmd Command line, properly escaped for shell.
+ * @param string|string[] $cmd If string, a properly shell-escaped command line,
+ *   or an array of unescaped arguments, in which case each value will be escaped
+ *   Example:   [ 'convert', '-font', 'font name' ] would produce "'convert' '-font' 'font name'"
  * @param null|mixed &$retval Optional, will receive the program's exit code.
  *   (non-zero is usually failure)
  * @param array $environ Optional environment variables which should be
@@ -3173,10 +3192,10 @@ function wfDiff( $before, $after, $params = '-u' ) {
 
        // Kill the --- and +++ lines. They're not useful.
        $diff_lines = explode( "\n", $diff );
-       if ( strpos( $diff_lines[0], '---' ) === 0 ) {
+       if ( isset( $diff_lines[0] ) && strpos( $diff_lines[0], '---' ) === 0 ) {
                unset( $diff_lines[0] );
        }
-       if ( strpos( $diff_lines[1], '+++' ) === 0 ) {
+       if ( isset( $diff_lines[1] ) && strpos( $diff_lines[1], '+++' ) === 0 ) {
                unset( $diff_lines[1] );
        }
 
@@ -3360,7 +3379,10 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1,
        );
 
        if ( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
-               $result = gmp_strval( gmp_init( $input, $sourceBase ), $destBase );
+               // Removing leading zeros works around broken base detection code in
+               // some PHP versions (see <https://bugs.php.net/bug.php?id=50175> and
+               // <https://bugs.php.net/bug.php?id=55398>).
+               $result = gmp_strval( gmp_init( ltrim( $input, '0' ), $sourceBase ), $destBase );
        } elseif ( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
                $decimal = '0';
                foreach ( str_split( strtolower( $input ) ) as $char ) {
@@ -3752,11 +3774,18 @@ function wfGetNull() {
  * @param float|null $ifWritesSince Only wait if writes were done since this UNIX timestamp
  * @param string|bool $wiki Wiki identifier accepted by wfGetLB
  * @param string|bool $cluster Cluster name accepted by LBFactory. Default: false.
+ * @param int|null $timeout Max wait time. Default: 1 day (cli), ~10 seconds (web)
  * @return bool Success (able to connect and no timeouts reached)
  */
-function wfWaitForSlaves( $ifWritesSince = false, $wiki = false, $cluster = false ) {
+function wfWaitForSlaves(
+       $ifWritesSince = null, $wiki = false, $cluster = false, $timeout = null
+) {
        // B/C: first argument used to be "max seconds of lag"; ignore such values
-       $ifWritesSince = ( $ifWritesSince > 1e9 ) ? $ifWritesSince : false;
+       $ifWritesSince = ( $ifWritesSince > 1e9 ) ? $ifWritesSince : null;
+
+       if ( $timeout === null ) {
+               $timeout = ( PHP_SAPI === 'cli' ) ? 86400 : 10;
+       }
 
        if ( $cluster !== false ) {
                $lb = wfGetLBFactory()->getExternalLB( $cluster );
@@ -3778,7 +3807,7 @@ function wfWaitForSlaves( $ifWritesSince = false, $wiki = false, $cluster = fals
                // The DBMS may not support getMasterPos() or the whole
                // load balancer might be fake (e.g. $wgAllDBsAreLocalhost).
                if ( $pos !== false ) {
-                       return $lb->waitForAll( $pos, PHP_SAPI === 'cli' ? 86400 : null );
+                       return $lb->waitForAll( $pos, $timeout );
                }
        }
 
index d2be9e9..69f1120 100644 (file)
@@ -351,10 +351,10 @@ class HistoryBlobCurStub {
  */
 class DiffHistoryBlob implements HistoryBlob {
        /** @var array Uncompressed item cache */
-       protected $mItems = array();
+       public $mItems = array();
 
        /** @var int Total uncompressed size */
-       protected $mSize = 0;
+       public $mSize = 0;
 
        /**
         * @var array Array of diffs. If a diff D from A to B is notated D = B - A,
@@ -364,20 +364,20 @@ class DiffHistoryBlob implements HistoryBlob {
         *    diff[i] = {
         *              { item[map[i]] - Z                where i = 0
         */
-       protected $mDiffs;
+       public $mDiffs;
 
        /** @var array The diff map, see above */
-       protected $mDiffMap;
+       public $mDiffMap;
 
        /** @var int The key for getText()
         */
-       protected $mDefaultKey;
+       public $mDefaultKey;
 
        /** @var string Compressed storage */
        public $mCompressed;
 
        /** @var bool True if the object is locked against further writes */
-       protected $mFrozen = false;
+       public $mFrozen = false;
 
        /**
         * @var int The maximum uncompressed size before the object becomes sad
index 2928748..668c3d9 100644 (file)
@@ -179,7 +179,7 @@ class Hooks {
                        // Run autoloader (workaround for call_user_func_array bug)
                        // and throw error if not callable.
                        if ( !is_callable( $callback ) ) {
-                               throw new MWException( 'Invalid callback in hooks for ' . $event . "\n" );
+                               throw new MWException( 'Invalid callback ' . $func . ' in hooks for ' . $event . "\n" );
                        }
 
                        /*
index 9e7f5c4..fa868e3 100644 (file)
@@ -101,6 +101,34 @@ class Html {
                'itemscope',
        );
 
+       /**
+        * Modifies a set of attributes meant for button elements
+        * and apply a set of default attributes when $wgUseMediaWikiUIEverywhere enabled.
+        * @param array $modifiers to add to the button
+        * @see https://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
+        * @return array $attrs A modified attribute array
+        */
+       public static function buttonAttributes( $attrs, $modifiers = array() ) {
+               global $wgUseMediaWikiUIEverywhere;
+               if ( $wgUseMediaWikiUIEverywhere ) {
+                       if ( isset( $attrs['class'] ) ) {
+                               if ( is_array( $attrs['class'] ) ) {
+                                       $attrs['class'][] = 'mw-ui-button';
+                                       $attrs = array_merge( $attrs, $modifiers );
+                                       // ensure compatibility with Xml
+                                       $attrs['class'] = implode( ' ', $attrs['class'] );
+                               } else {
+                                       $attrs['class'] .= ' mw-ui-button ' . implode( ' ', $modifiers );
+                               }
+                       } else {
+                               $attrs['class'] = array( 'mw-ui-button' );
+                               // ensure compatibility with Xml
+                               $attrs['class'] = implode( ' ', array_merge( $attrs['class'], $modifiers ) );
+                       }
+               }
+               return $attrs;
+       }
+
        /**
         * Modifies a set of attributes meant for text input elements
         * and apply a set of default attributes.
@@ -130,6 +158,43 @@ class Html {
                return $attrs;
        }
 
+       /**
+        * Returns an HTML link element in a string styled as a button (when $wgUseMediaWikiUIEverywhere is enabled).
+        *
+        * @param string $contents The raw HTML contents of the element: *not*
+        *   escaped!
+        * @param array $attrs Associative array of attributes, e.g., array(
+        *   'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
+        *   further documentation.
+        * @param array $modifiers to add to the button
+        * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
+        * @return string Raw HTML
+        */
+       public static function linkButton( $contents, $attrs, $modifiers = array() ) {
+               return Html::element( 'a',
+                       self::buttonAttributes( $attrs, $modifiers ),
+                       $contents
+               );
+       }
+
+       /**
+        * Returns an HTML link element in a string styled as a button (when $wgUseMediaWikiUIEverywhere is enabled).
+        *
+        * @param string $contents The raw HTML contents of the element: *not*
+        *   escaped!
+        * @param array $attrs Associative array of attributes, e.g., array(
+        *   'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
+        *   further documentation.
+        * @param array $modifiers to add to the button
+        * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
+        * @return string Raw HTML
+        */
+       public static function submitButton( $contents, $attrs, $modifiers = array() ) {
+               $attrs['type'] = 'submit';
+               $attrs['value'] = $contents;
+               return Html::element( 'input', self::buttonAttributes( $attrs, $modifiers ) );
+       }
+
        /**
         * Returns an HTML element in a string.  The major advantage here over
         * manually typing out the HTML is that it will escape all attribute
@@ -673,6 +738,7 @@ class Html {
         * @param string $name Name attribute
         * @param bool $checked Whether the checkbox is checked or not
         * @param array $attribs Array of additional attributes
+        * @return string
         */
        public static function check( $name, $checked = false, array $attribs = array() ) {
                if ( isset( $attribs['value'] ) ) {
@@ -695,6 +761,7 @@ class Html {
         * @param string $name Name attribute
         * @param bool $checked Whether the checkbox is checked or not
         * @param array $attribs Array of additional attributes
+        * @return string
         */
        public static function radio( $name, $checked = false, array $attribs = array() ) {
                if ( isset( $attribs['value'] ) ) {
@@ -717,6 +784,7 @@ class Html {
         * @param string $label Contents of the label
         * @param string $id ID of the element being labeled
         * @param array $attribs Additional attributes
+        * @return string
         */
        public static function label( $label, $id, array $attribs = array() ) {
                $attribs += array(
@@ -934,20 +1002,13 @@ class Html {
         * Get HTML for an info box with an icon.
         *
         * @param string $text Wikitext, get this with wfMessage()->plain()
-        * @param string $icon Icon name, file in skins/common/images
+        * @param string $icon Path to icon file (used as 'src' attribute)
         * @param string $alt Alternate text for the icon
         * @param string $class Additional class name to add to the wrapper div
-        * @param bool $useStylePath
         *
         * @return string
         */
-       static function infoBox( $text, $icon, $alt, $class = false, $useStylePath = true ) {
-               global $wgStylePath;
-
-               if ( $useStylePath ) {
-                       $icon = $wgStylePath . '/common/images/' . $icon;
-               }
-
+       static function infoBox( $text, $icon, $alt, $class = false ) {
                $s = Html::openElement( 'div', array( 'class' => "mw-infobox $class" ) );
 
                $s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-left' ) ) .
index 1eb8ca5..f9ee14b 100644 (file)
@@ -114,7 +114,7 @@ class Http {
         * @return bool
         */
        public static function isLocalURL( $url ) {
-               global $wgCommandLineMode, $wgConf;
+               global $wgCommandLineMode, $wgLocalVirtualHosts, $wgConf;
 
                if ( $wgCommandLineMode ) {
                        return false;
@@ -126,7 +126,7 @@ class Http {
                        $host = $matches[1];
                        // Split up dotwise
                        $domainParts = explode( '.', $host );
-                       // Check if this domain or any superdomain is listed in $wgConf as a local virtual host
+                       // Check if this domain or any superdomain is listed as a local virtual host
                        $domainParts = array_reverse( $domainParts );
 
                        $domain = '';
@@ -139,7 +139,9 @@ class Http {
                                        $domain = $domainPart . '.' . $domain;
                                }
 
-                               if ( $wgConf->isLocalVHost( $domain ) ) {
+                               if ( in_array( $domain, $wgLocalVirtualHosts )
+                                       || $wgConf->isLocalVHost( $domain )
+                               ) {
                                        return true;
                                }
                        }
@@ -809,7 +811,8 @@ class CurlHttpRequest extends MWHttpRequest {
                        return false;
                }
 
-               if ( !defined( 'CURLOPT_REDIR_PROTOCOLS' ) ) {
+               $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;
                }
index e6b5dc2..5319076 100644 (file)
@@ -429,53 +429,12 @@ class WikiImporter {
                return '';
        }
 
-       # --------------
-
-       /** Left in for debugging */
-       private function dumpElement() {
-               static $lookup = null;
-               if ( !$lookup ) {
-                       $xmlReaderConstants = array(
-                               "NONE",
-                               "ELEMENT",
-                               "ATTRIBUTE",
-                               "TEXT",
-                               "CDATA",
-                               "ENTITY_REF",
-                               "ENTITY",
-                               "PI",
-                               "COMMENT",
-                               "DOC",
-                               "DOC_TYPE",
-                               "DOC_FRAGMENT",
-                               "NOTATION",
-                               "WHITESPACE",
-                               "SIGNIFICANT_WHITESPACE",
-                               "END_ELEMENT",
-                               "END_ENTITY",
-                               "XML_DECLARATION",
-                       );
-                       $lookup = array();
-
-                       foreach ( $xmlReaderConstants as $name ) {
-                               $lookup[constant( "XmlReader::$name" )] = $name;
-                       }
-               }
-
-               print var_dump(
-                       $lookup[$this->reader->nodeType],
-                       $this->reader->name,
-                       $this->reader->value
-               ) . "\n\n";
-       }
-
        /**
         * Primary entry point
         * @throws MWException
         * @return bool
         */
        public function doImport() {
-
                // Calls to reader->read need to be wrapped in calls to
                // libxml_disable_entity_loader() to avoid local file
                // inclusion attacks (bug 46932).
@@ -932,7 +891,7 @@ class WikiImporter {
 /** This is a horrible hack used to keep source compatibility */
 class UploadSourceAdapter {
        /** @var array */
-       private static $sourceRegistrations = array();
+       public static $sourceRegistrations = array();
 
        /** @var string */
        private $mSource;
@@ -1056,13 +1015,13 @@ class UploadSourceAdapter {
  */
 class WikiRevision {
        /** @todo Unused? */
-       private $importer = null;
+       public $importer = null;
 
        /** @var Title */
        public $title = null;
 
        /** @var int */
-       private $id = 0;
+       public $id = 0;
 
        /** @var string */
        public $timestamp = "20010115000000";
@@ -1076,10 +1035,10 @@ class WikiRevision {
        public $user_text = "";
 
        /** @var string */
-       protected $model = null;
+       public $model = null;
 
        /** @var string */
-       protected $format = null;
+       public $format = null;
 
        /** @var string */
        public $text = "";
@@ -1088,7 +1047,7 @@ class WikiRevision {
        protected $size;
 
        /** @var Content */
-       protected $content = null;
+       public $content = null;
 
        /** @var ContentHandler */
        protected $contentHandler = null;
@@ -1097,31 +1056,31 @@ class WikiRevision {
        public $comment = "";
 
        /** @var bool */
-       protected $minor = false;
+       public $minor = false;
 
        /** @var string */
-       protected $type = "";
+       public $type = "";
 
        /** @var string */
-       protected $action = "";
+       public $action = "";
 
        /** @var string */
-       protected $params = "";
+       public $params = "";
 
        /** @var string */
-       protected $fileSrc = '';
+       public $fileSrc = '';
 
        /** @var bool|string */
-       protected $sha1base36 = false;
+       public $sha1base36 = false;
 
        /**
         * @var bool
         * @todo Unused?
         */
-       private $isTemp = false;
+       public $isTemp = false;
 
        /** @var string */
-       protected $archiveName = '';
+       public $archiveName = '';
 
        protected $filename;
 
@@ -1129,7 +1088,7 @@ class WikiRevision {
        protected $src;
 
        /** @todo Unused? */
-       private $fileIsTemp;
+       public $fileIsTemp;
 
        /** @var bool */
        private $mNoUpdates = false;
@@ -1535,9 +1494,6 @@ class WikiRevision {
                return true;
        }
 
-       /**
-        * @return mixed
-        */
        function importLogItem() {
                $dbw = wfGetDB( DB_MASTER );
                # @todo FIXME: This will not record autoblocks
index abc9404..1d327be 100644 (file)
@@ -192,11 +192,11 @@ class Linker {
        public static function link(
                $target, $html = null, $customAttribs = array(), $query = array(), $options = array()
        ) {
-               wfProfileIn( __METHOD__ );
                if ( !$target instanceof Title ) {
-                       wfProfileOut( __METHOD__ );
+                       wfWarn( __METHOD__ . ': Requires $target to be a Title object.', 2 );
                        return "<!-- ERROR -->$html";
                }
+               wfProfileIn( __METHOD__ );
 
                if ( is_string( $query ) ) {
                        // some functions withing core using this still hand over query strings
@@ -259,6 +259,7 @@ class Linker {
 
        /**
         * Identical to link(), except $options defaults to 'known'.
+        * @see Linker::link
         * @return string
         */
        public static function linkKnown(
@@ -379,11 +380,10 @@ class Linker {
         * @return string
         */
        private static function linkText( $target ) {
-               // We might be passed a non-Title by make*LinkObj().  Fail gracefully.
                if ( !$target instanceof Title ) {
+                       wfWarn( __METHOD__ . ': Requires $target to be a Title object.' );
                        return '';
                }
-
                // If the target is just a fragment, with no title, we return the fragment
                // text.  Otherwise, we return the title text itself.
                if ( $target->getPrefixedText() === '' && $target->hasFragment() ) {
@@ -543,7 +543,7 @@ class Linker {
         * @since 1.20
         * @return string HTML for an image, with links, wrappers, etc.
         */
-       public static function makeImageLink( /*Parser*/ $parser, Title $title,
+       public static function makeImageLink( Parser $parser, Title $title,
                $file, $frameParams = array(), $handlerParams = array(), $time = false,
                $query = "", $widthOption = null
        ) {
@@ -636,13 +636,7 @@ class Linker {
                        # If a thumbnail width has not been provided, it is set
                        # to the default user option as specified in Language*.php
                        if ( $fp['align'] == '' ) {
-                               if ( $parser instanceof Parser ) {
-                                       $fp['align'] = $parser->getTargetLanguage()->alignEnd();
-                               } else {
-                                       # backwards compatibility, remove with makeImageLink2()
-                                       global $wgContLang;
-                                       $fp['align'] = $wgContLang->alignEnd();
-                               }
+                               $fp['align'] = $parser->getTargetLanguage()->alignEnd();
                        }
                        return $prefix . self::makeThumbLink2( $title, $file, $fp, $hp, $time, $query ) . $postfix;
                }
@@ -771,7 +765,6 @@ class Linker {
        public static function makeThumbLink2( Title $title, $file, $frameParams = array(),
                $handlerParams = array(), $time = false, $query = ""
        ) {
-               global $wgStylePath, $wgContLang;
                $exists = $file && $file->exists();
 
                # Shortcuts
@@ -880,12 +873,7 @@ class Linker {
                                                'href' => $url,
                                                'class' => 'internal',
                                                'title' => wfMessage( 'thumbnail-more' )->text() ),
-                                               Html::element( 'img', array(
-                                                       'src' => $wgStylePath . '/common/images/magnify-clip'
-                                                               . ( $wgContLang->isRTL() ? '-rtl' : '' ) . '.png',
-                                                       'width' => 15,
-                                                       'height' => 11,
-                                                       'alt' => "" ) ) ) );
+                                               "" ) );
                        }
                }
                $s .= '  <div class="thumbcaption">' . $zoomIcon . $fp['caption'] . "</div></div></div>";
@@ -902,7 +890,7 @@ class Linker {
         */
        public static function processResponsiveImages( $file, $thumb, $hp ) {
                global $wgResponsiveImages;
-               if ( $wgResponsiveImages ) {
+               if ( $wgResponsiveImages && $thumb && !$thumb->isError() ) {
                        $hp15 = $hp;
                        $hp15['width'] = round( $hp['width'] * 1.5 );
                        $hp20 = $hp;
@@ -914,10 +902,10 @@ class Linker {
 
                        $thumb15 = $file->transform( $hp15 );
                        $thumb20 = $file->transform( $hp20 );
-                       if ( $thumb15 && $thumb15->getUrl() !== $thumb->getUrl() ) {
+                       if ( $thumb15 && !$thumb15->isError() && $thumb15->getUrl() !== $thumb->getUrl() ) {
                                $thumb->responsiveUrls['1.5'] = $thumb15->getUrl();
                        }
-                       if ( $thumb20 && $thumb20->getUrl() !== $thumb->getUrl() ) {
+                       if ( $thumb20 && !$thumb20->isError() && $thumb20->getUrl() !== $thumb->getUrl() ) {
                                $thumb->responsiveUrls['2'] = $thumb20->getUrl();
                        }
                }
@@ -937,10 +925,12 @@ class Linker {
        public static function makeBrokenImageLinkObj( $title, $label = '',
                $query = '', $unused1 = '', $unused2 = '', $time = false
        ) {
-               global $wgEnableUploads, $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
                if ( !$title instanceof Title ) {
+                       wfWarn( __METHOD__ . ': Requires $title to be a Title object.' );
                        return "<!-- ERROR -->" . htmlspecialchars( $label );
                }
+
+               global $wgEnableUploads, $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
                wfProfileIn( __METHOD__ );
                if ( $label == '' ) {
                        $label = $title->getPrefixedText();
@@ -2156,7 +2146,7 @@ class Linker {
                return $tooltip;
        }
 
-       private static $accesskeycache;
+       public static $accesskeycache;
 
        /**
         * Given the id of an interface element, constructs the appropriate
@@ -2203,7 +2193,7 @@ class Linker {
         *
         * @param User $user
         * @param Revision $rev
-        * @param Revision $title
+        * @param Title $title
         * @return string HTML fragment
         */
        public static function getRevDeleteLink( User $user, Revision $rev, Title $title ) {
index 7decbee..4d17298 100644 (file)
@@ -754,6 +754,7 @@ class MagicWordArray {
 
        /**
         * Get a 2-d hashtable for this array
+        * @return array
         */
        function getHash() {
                if ( is_null( $this->hash ) ) {
@@ -775,6 +776,7 @@ class MagicWordArray {
 
        /**
         * Get the base regex
+        * @return array
         */
        function getBaseRegex() {
                if ( is_null( $this->baseRegex ) ) {
@@ -799,6 +801,7 @@ class MagicWordArray {
 
        /**
         * Get an unanchored regex that does not match parameters
+        * @return array
         */
        function getRegex() {
                if ( is_null( $this->regex ) ) {
index 281080c..87468bd 100644 (file)
@@ -27,7 +27,6 @@
  */
 class MediaWiki {
        /**
-        * @todo Fold $output, etc, into this
         * @var IContextSource
         */
        private $context;
@@ -37,30 +36,6 @@ class MediaWiki {
         */
        private $config;
 
-       /**
-        * @param null|WebRequest $x
-        * @return WebRequest
-        */
-       public function request( WebRequest $x = null ) {
-               $old = $this->context->getRequest();
-               if ( $x ) {
-                       $this->context->setRequest( $x );
-               }
-               return $old;
-       }
-
-       /**
-        * @param null|OutputPage $x
-        * @return OutputPage
-        */
-       public function output( OutputPage $x = null ) {
-               $old = $this->context->getOutput();
-               if ( $x ) {
-                       $this->context->setOutput( $x );
-               }
-               return $old;
-       }
-
        /**
         * @param IContextSource|null $context
         */
@@ -146,7 +121,7 @@ class MediaWiki {
         * @return Title
         */
        public function getTitle() {
-               if ( $this->context->getTitle() === null ) {
+               if ( !$this->context->hasTitle() ) {
                        $this->context->setTitle( $this->parseTitle() );
                }
                return $this->context->getTitle();
@@ -521,8 +496,8 @@ class MediaWiki {
                        $this->context->setTitle( $title );
                        $wgTitle = $title;
 
-                       $dispatcher = new AjaxDispatcher();
-                       $dispatcher->performAction();
+                       $dispatcher = new AjaxDispatcher( $this->config );
+                       $dispatcher->performAction( $this->context->getUser() );
                        wfProfileOut( __METHOD__ );
                        return;
                }
@@ -585,7 +560,7 @@ class MediaWiki {
                        wfProfileIn( 'main-try-filecache' );
                        if ( HTMLFileCache::useFileCache( $this->context ) ) {
                                // Try low-level file cache hit
-                               $cache = HTMLFileCache::newFromTitle( $title, $action );
+                               $cache = new HTMLFileCache( $title, $action );
                                if ( $cache->isCacheGood( /* Assume up to date */ ) ) {
                                        // Check incoming headers to see if client has this cached
                                        $timestamp = $cache->cacheTimestamp();
@@ -682,7 +657,8 @@ class MediaWiki {
 
                $query = array( 'title' => 'Special:RunJobs',
                        'tasks' => 'jobs', 'maxjobs' => $n, 'sigexpiry' => time() + 5 );
-               $query['signature'] = SpecialRunJobs::getQuerySignature( $query );
+               $query['signature'] = SpecialRunJobs::getQuerySignature(
+                       $query, $this->config->get( 'SecretKey' ) );
 
                $errno = $errstr = null;
                $info = wfParseUrl( $this->config->get( 'Server' ) );
index 4df0d80..93a37cb 100644 (file)
@@ -540,6 +540,30 @@ class Message {
                return $this;
        }
 
+       /**
+        * Add parameters that are plaintext and will be passed through without
+        * the content being evaluated.  Plaintext parameters are not valid as
+        * arguments to parser functions. This differs from self::rawParams in
+        * that the Message class handles escaping to match the output format.
+        *
+        * @since 1.25
+        *
+        * @param string|string[] $param,... plaintext parameters, or a single argument that is
+        * an array of plaintext parameters.
+        *
+        * @return Message $this
+        */
+       public function plaintextParams( /*...*/ ) {
+               $params = func_get_args();
+               if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+                       $params = $params[0];
+               }
+               foreach ( $params as $param ) {
+                       $this->parameters[] = self::plaintextParam( $param );
+               }
+               return $this;
+       }
+
        /**
         * Set the language and the title from a context object
         *
@@ -674,11 +698,10 @@ class Message {
                $string = $this->fetchMessage();
 
                if ( $string === false ) {
-                       $key = htmlspecialchars( $this->key );
-                       if ( $this->format === 'plain' ) {
-                               return '<' . $key . '>';
+                       if ( $this->format === 'plain' || $this->format === 'text' ) {
+                               return '<' . $this->key . '>';
                        }
-                       return '&lt;' . $key . '&gt;';
+                       return '&lt;' . htmlspecialchars( $this->key ) . '&gt;';
                }
 
                # Replace $* with a list of parameters for &uselang=qqx.
@@ -735,10 +758,10 @@ class Message {
                                // Doh! Cause a fatal error after all?
                        }
 
-                       if ( $this->format === 'plain' ) {
+                       if ( $this->format === 'plain' || $this->format === 'text' ) {
                                return '<' . $this->key . '>';
                        }
-                       return '&lt;' . $this->key . '&gt;';
+                       return '&lt;' . htmlspecialchars( $this->key ) . '&gt;';
                }
        }
 
@@ -916,6 +939,17 @@ class Message {
                return array( 'bitrate' => $bitrate );
        }
 
+       /**
+        * @since 1.25
+        *
+        * @param string $plaintext
+        *
+        * @return string[] Array with a single "plaintext" key.
+        */
+       public static function plaintextParam( $plaintext ) {
+               return array( 'plaintext' => $plaintext );
+       }
+
        /**
         * Substitutes any parameters into the message text.
         *
@@ -965,6 +999,8 @@ class Message {
                                return array( 'before', $this->language->formatSize( $param['size'] ) );
                        } elseif ( isset( $param['bitrate'] ) ) {
                                return array( 'before', $this->language->formatBitrate( $param['bitrate'] ) );
+                       } elseif ( isset( $param['plaintext'] ) ) {
+                               return array( 'after', $this->formatPlaintext( $param['plaintext'] ) );
                        } else {
                                $warning = 'Invalid parameter for message "' . $this->getKey() . '": ' .
                                        htmlspecialchars( serialize( $param ) );
@@ -1050,6 +1086,31 @@ class Message {
                return $this->message;
        }
 
+       /**
+        * Formats a message parameter wrapped with 'plaintext'. Ensures that
+        * the entire string is displayed unchanged when displayed in the output
+        * format.
+        *
+        * @since 1.25
+        *
+        * @param string $plaintext String to ensure plaintext output of
+        *
+        * @return string Input plaintext encoded for output to $this->format
+        */
+       protected function formatPlaintext( $plaintext ) {
+               switch ( $this->format ) {
+               case 'text':
+               case 'plain':
+                       return $plaintext;
+
+               case 'parse':
+               case 'block-parse':
+               case 'escaped':
+               default:
+                       return htmlspecialchars( $plaintext, ENT_QUOTES );
+
+               }
+       }
 }
 
 /**
index 5725898..e3b4dbe 100644 (file)
  * constituent messages or the resource itself is changed.
  */
 class MessageBlobStore {
+       /**
+        * Get the singleton instance
+        *
+        * @since 1.24
+        * @return MessageBlobStore
+        */
+       public static function getInstance() {
+               static $instance = null;
+               if ( $instance === null ) {
+                       $instance = new self;
+               }
+
+               return $instance;
+       }
+
        /**
         * Get the message blobs for a set of modules
         *
@@ -40,19 +55,19 @@ class MessageBlobStore {
         * @param string $lang Language code
         * @return array An array mapping module names to message blobs
         */
-       public static function get( ResourceLoader $resourceLoader, $modules, $lang ) {
+       public function get( ResourceLoader $resourceLoader, $modules, $lang ) {
                wfProfileIn( __METHOD__ );
                if ( !count( $modules ) ) {
                        wfProfileOut( __METHOD__ );
                        return array();
                }
                // Try getting from the DB first
-               $blobs = self::getFromDB( $resourceLoader, array_keys( $modules ), $lang );
+               $blobs = $this->getFromDB( $resourceLoader, array_keys( $modules ), $lang );
 
                // Generate blobs for any missing modules and store them in the DB
                $missing = array_diff( array_keys( $modules ), array_keys( $blobs ) );
                foreach ( $missing as $name ) {
-                       $blob = self::insertMessageBlob( $name, $modules[$name], $lang );
+                       $blob = $this->insertMessageBlob( $name, $modules[$name], $lang );
                        if ( $blob ) {
                                $blobs[$name] = $blob;
                        }
@@ -72,8 +87,8 @@ class MessageBlobStore {
         * @param string $lang Language code
         * @return mixed Message blob or false if the module has no messages
         */
-       public static function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) {
-               $blob = self::generateMessageBlob( $module, $lang );
+       public function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) {
+               $blob = $this->generateMessageBlob( $module, $lang );
 
                if ( !$blob ) {
                        return false;
@@ -130,7 +145,7 @@ class MessageBlobStore {
         * @return string Regenerated message blob, or null if there was no blob for
         *   the given module/language pair.
         */
-       public static function updateModule( $name, ResourceLoaderModule $module, $lang ) {
+       public function updateModule( $name, ResourceLoaderModule $module, $lang ) {
                $dbw = wfGetDB( DB_MASTER );
                $row = $dbw->selectRow( 'msg_resource', 'mr_blob',
                        array( 'mr_resource' => $name, 'mr_lang' => $lang ),
@@ -142,7 +157,7 @@ class MessageBlobStore {
 
                // Save the old and new blobs for later
                $oldBlob = $row->mr_blob;
-               $newBlob = self::generateMessageBlob( $module, $lang );
+               $newBlob = $this->generateMessageBlob( $module, $lang );
 
                try {
                        $newRow = array(
@@ -197,7 +212,7 @@ class MessageBlobStore {
         *
         * @param string $key Message key
         */
-       public static function updateMessage( $key ) {
+       public function updateMessage( $key ) {
                try {
                        $dbw = wfGetDB( DB_MASTER );
 
@@ -206,7 +221,7 @@ class MessageBlobStore {
                        // in one iteration.
                        $updates = null;
                        do {
-                               $updates = self::getUpdatesForMessage( $key, $updates );
+                               $updates = $this->getUpdatesForMessage( $key, $updates );
 
                                foreach ( $updates as $k => $update ) {
                                        // Update the row on the condition that it
@@ -240,7 +255,7 @@ class MessageBlobStore {
                }
        }
 
-       public static function clear() {
+       public function clear() {
                // TODO: Give this some more thought
                try {
                        // Not using TRUNCATE, because that needs extra permissions,
@@ -260,7 +275,7 @@ class MessageBlobStore {
         * @param array $prevUpdates Updates queue to refresh or null to build a fresh update queue
         * @return array Updates queue
         */
-       private static function getUpdatesForMessage( $key, $prevUpdates = null ) {
+       private function getUpdatesForMessage( $key, $prevUpdates = null ) {
                $dbw = wfGetDB( DB_MASTER );
 
                if ( is_null( $prevUpdates ) ) {
@@ -297,7 +312,7 @@ class MessageBlobStore {
                                'resource' => $row->mr_resource,
                                'lang' => $row->mr_lang,
                                'timestamp' => $row->mr_timestamp,
-                               'newBlob' => self::reencodeBlob( $row->mr_blob, $key, $row->mr_lang )
+                               'newBlob' => $this->reencodeBlob( $row->mr_blob, $key, $row->mr_lang )
                        );
                }
 
@@ -312,7 +327,7 @@ class MessageBlobStore {
         * @param string $lang Language code
         * @return string Message blob with $key replaced with its new value
         */
-       private static function reencodeBlob( $blob, $key, $lang ) {
+       private function reencodeBlob( $blob, $key, $lang ) {
                $decoded = FormatJson::decode( $blob, true );
                $decoded[$key] = wfMessage( $key )->inLanguage( $lang )->plain();
 
@@ -329,9 +344,8 @@ class MessageBlobStore {
         * @throws MWException
         * @return array Array mapping module names to blobs
         */
-       private static function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
-               global $wgCacheEpoch;
-
+       private function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
+               $config = $resourceLoader->getConfig();
                $retval = array();
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'msg_resource',
@@ -348,13 +362,13 @@ class MessageBlobStore {
                        }
 
                        // Update the module's blobs if the set of messages changed or if the blob is
-                       // older than $wgCacheEpoch
+                       // older than the CacheEpoch setting
                        $keys = array_keys( FormatJson::decode( $row->mr_blob, true ) );
                        $values = array_values( array_unique( $module->getMessages() ) );
                        if ( $keys !== $values
-                               || wfTimestamp( TS_MW, $row->mr_timestamp ) <= $wgCacheEpoch
+                               || wfTimestamp( TS_MW, $row->mr_timestamp ) <= $config->get( 'CacheEpoch' )
                        ) {
-                               $retval[$row->mr_resource] = self::updateModule( $row->mr_resource, $module, $lang );
+                               $retval[$row->mr_resource] = $this->updateModule( $row->mr_resource, $module, $lang );
                        } else {
                                $retval[$row->mr_resource] = $row->mr_blob;
                        }
@@ -370,7 +384,7 @@ class MessageBlobStore {
         * @param string $lang Language code
         * @return string JSON object
         */
-       private static function generateMessageBlob( ResourceLoaderModule $module, $lang ) {
+       private function generateMessageBlob( ResourceLoaderModule $module, $lang ) {
                $messages = array();
 
                foreach ( $module->getMessages() as $key ) {
index 8f0a2af..bfd6011 100644 (file)
@@ -172,6 +172,9 @@ class MimeMagic {
         */
        private $mExtraInfo = '';
 
+       /** @var Config */
+       private $mConfig;
+
        /** @var MimeMagic The singleton instance
         */
        private static $instance = null;
@@ -179,30 +182,40 @@ class MimeMagic {
        /** Initializes the MimeMagic object. This is called by MimeMagic::singleton().
         *
         * This constructor parses the mime.types and mime.info files and build internal mappings.
+        *
+        * @todo Make this constructor private once everything uses the singleton instance
+        * @param Config $config
         */
-       function __construct() {
+       function __construct( Config $config = null ) {
+               if ( !$config ) {
+                       wfDebug( __METHOD__ . ' called with no Config instance passed to it' );
+                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               }
+               $this->mConfig = $config;
+
                /**
                 *   --- load mime.types ---
                 */
 
-               global $wgMimeTypeFile, $IP;
+               global $IP;
 
                # Allow media handling extensions adding MIME-types and MIME-info
                wfRunHooks( 'MimeMagicInit', array( $this ) );
 
                $types = MM_WELL_KNOWN_MIME_TYPES;
 
-               if ( $wgMimeTypeFile == 'includes/mime.types' ) {
-                       $wgMimeTypeFile = "$IP/$wgMimeTypeFile";
+               $mimeTypeFile = $this->mConfig->get( 'MimeTypeFile' );
+               if ( $mimeTypeFile == 'includes/mime.types' ) {
+                       $mimeTypeFile = "$IP/$mimeTypeFile";
                }
 
-               if ( $wgMimeTypeFile ) {
-                       if ( is_file( $wgMimeTypeFile ) and is_readable( $wgMimeTypeFile ) ) {
-                               wfDebug( __METHOD__ . ": loading mime types from $wgMimeTypeFile\n" );
+               if ( $mimeTypeFile ) {
+                       if ( is_file( $mimeTypeFile ) and is_readable( $mimeTypeFile ) ) {
+                               wfDebug( __METHOD__ . ": loading mime types from $mimeTypeFile\n" );
                                $types .= "\n";
-                               $types .= file_get_contents( $wgMimeTypeFile );
+                               $types .= file_get_contents( $mimeTypeFile );
                        } else {
-                               wfDebug( __METHOD__ . ": can't load mime types from $wgMimeTypeFile\n" );
+                               wfDebug( __METHOD__ . ": can't load mime types from $mimeTypeFile\n" );
                        }
                } else {
                        wfDebug( __METHOD__ . ": no mime types file defined, using build-ins only.\n" );
@@ -266,20 +279,20 @@ class MimeMagic {
                 *   --- load mime.info ---
                 */
 
-               global $wgMimeInfoFile;
-               if ( $wgMimeInfoFile == 'includes/mime.info' ) {
-                       $wgMimeInfoFile = "$IP/$wgMimeInfoFile";
+               $mimeInfoFile = $this->mConfig->get( 'MimeInfoFile' );
+               if ( $mimeInfoFile == 'includes/mime.info' ) {
+                       $mimeInfoFile = "$IP/$mimeInfoFile";
                }
 
                $info = MM_WELL_KNOWN_MIME_INFO;
 
-               if ( $wgMimeInfoFile ) {
-                       if ( is_file( $wgMimeInfoFile ) and is_readable( $wgMimeInfoFile ) ) {
-                               wfDebug( __METHOD__ . ": loading mime info from $wgMimeInfoFile\n" );
+               if ( $mimeInfoFile ) {
+                       if ( is_file( $mimeInfoFile ) and is_readable( $mimeInfoFile ) ) {
+                               wfDebug( __METHOD__ . ": loading mime info from $mimeInfoFile\n" );
                                $info .= "\n";
-                               $info .= file_get_contents( $wgMimeInfoFile );
+                               $info .= file_get_contents( $mimeInfoFile );
                        } else {
-                               wfDebug( __METHOD__ . ": can't load mime info from $wgMimeInfoFile\n" );
+                               wfDebug( __METHOD__ . ": can't load mime info from $mimeInfoFile\n" );
                        }
                } else {
                        wfDebug( __METHOD__ . ": no mime info file defined, using build-ins only.\n" );
@@ -352,7 +365,9 @@ class MimeMagic {
         */
        public static function singleton() {
                if ( self::$instance === null ) {
-                       self::$instance = new MimeMagic;
+                       self::$instance = new MimeMagic(
+                               ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       );
                }
                return self::$instance;
        }
@@ -711,9 +726,9 @@ class MimeMagic {
                 */
                $xml = new XmlTypeCheck( $file );
                if ( $xml->wellFormed ) {
-                       global $wgXMLMimeTypes;
-                       if ( isset( $wgXMLMimeTypes[$xml->getRootElement()] ) ) {
-                               return $wgXMLMimeTypes[$xml->getRootElement()];
+                       $xmlMimeTypes = $this->mConfig->get( 'XMLMimeTypes' );
+                       if ( isset( $xmlMimeTypes[$xml->getRootElement()] ) ) {
+                               return $xmlMimeTypes[$xml->getRootElement()];
                        } else {
                                return 'application/xml';
                        }
@@ -898,9 +913,9 @@ class MimeMagic {
        /**
         * Internal MIME type detection. Detection is done using an external
         * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo
-        * extension and mime_content_type are tried (in this order), if they
-        * are available. If the detections fails and $ext is not false, the MIME
-        * type is guessed from the file extension, using guessTypesForExtension.
+        * extension is tried if it is available. If detection fails and $ext
+        * is not false, the MIME type is guessed from the file extension,
+        * using guessTypesForExtension.
         *
         * If the MIME type is still unknown, getimagesize is used to detect the
         * MIME type if the file is an image. If no MIME type can be determined,
@@ -914,31 +929,19 @@ class MimeMagic {
         * @return string The MIME type of $file
         */
        private function detectMimeType( $file, $ext = true ) {
-               global $wgMimeDetectorCommand;
-
                /** @todo Make $ext default to false. Or better, remove it. */
                if ( $ext ) {
                        wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. "
                                . "Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
                }
 
+               $mimeDetectorCommand = $this->mConfig->get( 'MimeDetectorCommand' );
                $m = null;
-               if ( $wgMimeDetectorCommand ) {
+               if ( $mimeDetectorCommand ) {
                        $args = wfEscapeShellArg( $file );
-                       $m = wfShellExec( "$wgMimeDetectorCommand $args" );
+                       $m = wfShellExec( "$mimeDetectorCommand $args" );
                } elseif ( function_exists( "finfo_open" ) && function_exists( "finfo_file" ) ) {
-
-                       # This required the fileinfo extension by PECL,
-                       # see http://pecl.php.net/package/fileinfo
-                       # This must be compiled into PHP
-                       #
-                       # finfo is the official replacement for the deprecated
-                       # mime_content_type function, see below.
-                       #
-                       # If you may need to load the fileinfo extension at runtime, set
-                       # $wgLoadFileinfoExtension in LocalSettings.php
-
-                       $mime_magic_resource = finfo_open( FILEINFO_MIME ); /* return MIME type ala mimetype extension */
+                       $mime_magic_resource = finfo_open( FILEINFO_MIME );
 
                        if ( $mime_magic_resource ) {
                                $m = finfo_file( $mime_magic_resource, $file );
@@ -946,21 +949,6 @@ class MimeMagic {
                        } else {
                                wfDebug( __METHOD__ . ": finfo_open failed on " . FILEINFO_MIME . "!\n" );
                        }
-               } elseif ( function_exists( "mime_content_type" ) ) {
-
-                       # NOTE: this function is available since PHP 4.3.0, but only if
-                       # PHP was compiled with --with-mime-magic or, before 4.3.2, with
-                       # --enable-mime-magic.
-                       #
-                       # On Windows, you must set mime_magic.magicfile in php.ini to point
-                       # to the mime.magic file bundled with PHP; sometimes, this may even
-                       # be needed under *nix.
-                       #
-                       # Also note that this has been DEPRECATED in favor of the fileinfo
-                       # extension by PECL, see above.
-                       # See http://www.php.net/manual/en/ref.mime-magic.php for details.
-
-                       $m = mime_content_type( $file );
                } else {
                        wfDebug( __METHOD__ . ": no magic mime detector found!\n" );
                }
diff --git a/includes/MovePage.php b/includes/MovePage.php
new file mode 100644 (file)
index 0000000..79095e9
--- /dev/null
@@ -0,0 +1,426 @@
+<?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
+ */
+
+/**
+ * Handles the backend logic of moving a page from one title
+ * to another.
+ *
+ * @since 1.24
+ */
+class MovePage {
+
+       /**
+        * @var Title
+        */
+       protected $oldTitle;
+
+       /**
+        * @var Title
+        */
+       protected $newTitle;
+
+       public function __construct( Title $oldTitle, Title $newTitle ) {
+               $this->oldTitle = $oldTitle;
+               $this->newTitle = $newTitle;
+       }
+
+       /**
+        * Does various sanity checks that the move is
+        * valid. Only things based on the two titles
+        * should be checked here.
+        *
+        * @return Status
+        */
+       public function isValidMove() {
+               global $wgContentHandlerUseDB;
+               $status = new Status();
+
+               if ( $this->oldTitle->equals( $this->newTitle ) ) {
+                       $status->fatal( 'selfmove' );
+               }
+               if ( !$this->oldTitle->isMovable() ) {
+                       $status->fatal( 'immobile-source-namespace', $this->oldTitle->getNsText() );
+               }
+               if ( $this->newTitle->isExternal() ) {
+                       $status->fatal( 'immobile-target-namespace-iw' );
+               }
+               if ( !$this->newTitle->isMovable() ) {
+                       $status->fatal( 'immobile-target-namespace', $this->newTitle->getNsText() );
+               }
+
+               $oldid = $this->oldTitle->getArticleID();
+
+               if ( strlen( $this->newTitle->getDBkey() ) < 1 ) {
+                       $status->fatal( 'articleexists' );
+               }
+               if (
+                       ( $this->oldTitle->getDBkey() == '' ) ||
+                       ( !$oldid ) ||
+                       ( $this->newTitle->getDBkey() == '' )
+               ) {
+                       $status->fatal( 'badarticleerror' );
+               }
+
+               // Content model checks
+               if ( !$wgContentHandlerUseDB &&
+                       $this->oldTitle->getContentModel() !== $this->newTitle->getContentModel() ) {
+                       // can't move a page if that would change the page's content model
+                       $status->fatal(
+                               'bad-target-model',
+                               ContentHandler::getLocalizedName( $this->oldTitle->getContentModel() ),
+                               ContentHandler::getLocalizedName( $this->newTitle->getContentModel() )
+                       );
+               }
+
+               // Image-specific checks
+               if ( $this->oldTitle->inNamespace( NS_FILE ) ) {
+                       $status->merge( $this->isValidFileMove() );
+               }
+
+               if ( $this->newTitle->inNamespace( NS_FILE ) && !$this->oldTitle->inNamespace( NS_FILE ) ) {
+                       $status->fatal( 'nonfile-cannot-move-to-file' );
+               }
+
+               return $status;
+       }
+
+       /**
+        * Sanity checks for when a file is being moved
+        *
+        * @return Status
+        */
+       protected function isValidFileMove() {
+               $status = new Status();
+               $file = wfLocalFile( $this->oldTitle );
+               if ( $file->exists() ) {
+                       if ( $this->newTitle->getText() != wfStripIllegalFilenameChars( $this->newTitle->getText() ) ) {
+                               $status->fatal( 'imageinvalidfilename' );
+                       }
+                       if ( !File::checkExtensionCompatibility( $file, $this->newTitle->getDBkey() ) ) {
+                               $status->fatal( 'imagetypemismatch' );
+                       }
+               }
+
+               if ( !$this->newTitle->inNamespace( NS_FILE ) ) {
+                       $status->fatal( 'imagenocrossnamespace' );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @param User $user
+        * @param string $reason
+        * @param bool $createRedirect
+        * @return Status
+        */
+       public function move( User $user, $reason, $createRedirect ) {
+               global $wgCategoryCollation;
+
+               // If it is a file, move it first.
+               // It is done before all other moving stuff is done because it's hard to revert.
+               $dbw = wfGetDB( DB_MASTER );
+               if ( $this->oldTitle->getNamespace() == NS_FILE ) {
+                       $file = wfLocalFile( $this->oldTitle );
+                       if ( $file->exists() ) {
+                               $status = $file->move( $this->newTitle );
+                               if ( !$status->isOk() ) {
+                                       return $status;
+                               }
+                       }
+                       // Clear RepoGroup process cache
+                       RepoGroup::singleton()->clearCache( $this->oldTitle );
+                       RepoGroup::singleton()->clearCache( $this->newTitle ); # clear false negative cache
+               }
+
+               $dbw->begin( __METHOD__ ); # If $file was a LocalFile, its transaction would have closed our own.
+               $pageid = $this->oldTitle->getArticleID( Title::GAID_FOR_UPDATE );
+               $protected = $this->oldTitle->isProtected();
+
+               // Do the actual move
+               $this->moveToInternal( $user, $this->newTitle, $reason, $createRedirect );
+
+               // Refresh the sortkey for this row.  Be careful to avoid resetting
+               // cl_timestamp, which may disturb time-based lists on some sites.
+               // @todo This block should be killed, it's duplicating code
+               // from LinksUpdate::getCategoryInsertions() and friends.
+               $prefixes = $dbw->select(
+                       'categorylinks',
+                       array( 'cl_sortkey_prefix', 'cl_to' ),
+                       array( 'cl_from' => $pageid ),
+                       __METHOD__
+               );
+               if ( $this->newTitle->getNamespace() == NS_CATEGORY ) {
+                       $type = 'subcat';
+               } elseif ( $this->newTitle->getNamespace() == NS_FILE ) {
+                       $type = 'file';
+               } else {
+                       $type = 'page';
+               }
+               foreach ( $prefixes as $prefixRow ) {
+                       $prefix = $prefixRow->cl_sortkey_prefix;
+                       $catTo = $prefixRow->cl_to;
+                       $dbw->update( 'categorylinks',
+                               array(
+                                       'cl_sortkey' => Collation::singleton()->getSortKey(
+                                                       $this->newTitle->getCategorySortkey( $prefix ) ),
+                                       'cl_collation' => $wgCategoryCollation,
+                                       'cl_type' => $type,
+                                       'cl_timestamp=cl_timestamp' ),
+                               array(
+                                       'cl_from' => $pageid,
+                                       'cl_to' => $catTo ),
+                               __METHOD__
+                       );
+               }
+
+               $redirid = $this->oldTitle->getArticleID();
+
+               if ( $protected ) {
+                       # Protect the redirect title as the title used to be...
+                       $dbw->insertSelect( 'page_restrictions', 'page_restrictions',
+                               array(
+                                       'pr_page' => $redirid,
+                                       'pr_type' => 'pr_type',
+                                       'pr_level' => 'pr_level',
+                                       'pr_cascade' => 'pr_cascade',
+                                       'pr_user' => 'pr_user',
+                                       'pr_expiry' => 'pr_expiry'
+                               ),
+                               array( 'pr_page' => $pageid ),
+                               __METHOD__,
+                               array( 'IGNORE' )
+                       );
+                       # Update the protection log
+                       $log = new LogPage( 'protect' );
+                       $comment = wfMessage(
+                               'prot_1movedto2',
+                               $this->oldTitle->getPrefixedText(),
+                               $this->newTitle->getPrefixedText()
+                       )->inContentLanguage()->text();
+                       if ( $reason ) {
+                               $comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
+                       }
+                       // @todo FIXME: $params?
+                       $logId = $log->addEntry(
+                               'move_prot',
+                               $this->newTitle,
+                               $comment,
+                               array( $this->oldTitle->getPrefixedText() ),
+                               $user
+                       );
+
+                       // reread inserted pr_ids for log relation
+                       $insertedPrIds = $dbw->select(
+                               'page_restrictions',
+                               'pr_id',
+                               array( 'pr_page' => $redirid ),
+                               __METHOD__
+                       );
+                       $logRelationsValues = array();
+                       foreach ( $insertedPrIds as $prid ) {
+                               $logRelationsValues[] = $prid->pr_id;
+                       }
+                       $log->addRelations( 'pr_id', $logRelationsValues, $logId );
+               }
+
+               // Update *_from_namespace fields as needed
+               if ( $this->oldTitle->getNamespace() != $this->newTitle->getNamespace() ) {
+                       $dbw->update( 'pagelinks',
+                               array( 'pl_from_namespace' => $this->newTitle->getNamespace() ),
+                               array( 'pl_from' => $pageid ),
+                               __METHOD__
+                       );
+                       $dbw->update( 'templatelinks',
+                               array( 'tl_from_namespace' => $this->newTitle->getNamespace() ),
+                               array( 'tl_from' => $pageid ),
+                               __METHOD__
+                       );
+                       $dbw->update( 'imagelinks',
+                               array( 'il_from_namespace' => $this->newTitle->getNamespace() ),
+                               array( 'il_from' => $pageid ),
+                               __METHOD__
+                       );
+               }
+
+               # Update watchlists
+               $oldtitle = $this->oldTitle->getDBkey();
+               $newtitle = $this->newTitle->getDBkey();
+               $oldsnamespace = MWNamespace::getSubject( $this->oldTitle->getNamespace() );
+               $newsnamespace = MWNamespace::getSubject( $this->newTitle->getNamespace() );
+               if ( $oldsnamespace != $newsnamespace || $oldtitle != $newtitle ) {
+                       WatchedItem::duplicateEntries( $this->oldTitle, $this->newTitle );
+               }
+
+               $dbw->commit( __METHOD__ );
+
+               wfRunHooks( 'TitleMoveComplete', array( &$this->oldTitle, &$this->newTitle, &$user, $pageid, $redirid, $reason ) );
+               return Status::newGood();
+
+       }
+
+       /**
+        * Move page to a title which is either a redirect to the
+        * source page or nonexistent
+        *
+        * @fixme This was basically directly moved from Title, it should be split into smaller functions
+        * @param User $user the User doing the move
+        * @param Title $nt The page to move to, which should be a redirect or nonexistent
+        * @param string $reason The reason for the move
+        * @param bool $createRedirect Whether to leave a redirect at the old title. Does not check
+        *   if the user has the suppressredirect right
+        * @throws MWException
+        */
+       private function moveToInternal( User $user, &$nt, $reason = '', $createRedirect = true ) {
+               global $wgContLang;
+
+               if ( $nt->exists() ) {
+                       $moveOverRedirect = true;
+                       $logType = 'move_redir';
+               } else {
+                       $moveOverRedirect = false;
+                       $logType = 'move';
+               }
+
+               if ( $createRedirect ) {
+                       if ( $this->oldTitle->getNamespace() == NS_CATEGORY
+                               && !wfMessage( 'category-move-redirect-override' )->inContentLanguage()->isDisabled()
+                       ) {
+                               $redirectContent = new WikitextContent(
+                                       wfMessage( 'category-move-redirect-override' )
+                                               ->params( $nt->getPrefixedText() )->inContentLanguage()->plain() );
+                       } else {
+                               $contentHandler = ContentHandler::getForTitle( $this->oldTitle );
+                               $redirectContent = $contentHandler->makeRedirectContent( $nt,
+                                       wfMessage( 'move-redirect-text' )->inContentLanguage()->plain() );
+                       }
+
+                       // NOTE: If this page's content model does not support redirects, $redirectContent will be null.
+               } else {
+                       $redirectContent = null;
+               }
+
+               // bug 57084: log_page should be the ID of the *moved* page
+               $oldid = $this->oldTitle->getArticleID();
+               $logTitle = clone $this->oldTitle;
+
+               $logEntry = new ManualLogEntry( 'move', $logType );
+               $logEntry->setPerformer( $user );
+               $logEntry->setTarget( $logTitle );
+               $logEntry->setComment( $reason );
+               $logEntry->setParameters( array(
+                       '4::target' => $nt->getPrefixedText(),
+                       '5::noredir' => $redirectContent ? '0': '1',
+               ) );
+
+               $formatter = LogFormatter::newFromEntry( $logEntry );
+               $formatter->setContext( RequestContext::newExtraneousContext( $this->oldTitle ) );
+               $comment = $formatter->getPlainActionText();
+               if ( $reason ) {
+                       $comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
+               }
+               # Truncate for whole multibyte characters.
+               $comment = $wgContLang->truncate( $comment, 255 );
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $newpage = WikiPage::factory( $nt );
+
+               if ( $moveOverRedirect ) {
+                       $newid = $nt->getArticleID();
+                       $newcontent = $newpage->getContent();
+
+                       # Delete the old redirect. We don't save it to history since
+                       # by definition if we've got here it's rather uninteresting.
+                       # We have to remove it so that the next step doesn't trigger
+                       # a conflict on the unique namespace+title index...
+                       $dbw->delete( 'page', array( 'page_id' => $newid ), __METHOD__ );
+
+                       $newpage->doDeleteUpdates( $newid, $newcontent );
+               }
+
+               # Save a null revision in the page's history notifying of the move
+               $nullRevision = Revision::newNullRevision( $dbw, $oldid, $comment, true, $user );
+               if ( !is_object( $nullRevision ) ) {
+                       throw new MWException( 'No valid null revision produced in ' . __METHOD__ );
+               }
+
+               $nullRevision->insertOn( $dbw );
+
+               # Change the name of the target page:
+               $dbw->update( 'page',
+                       /* SET */ array(
+                               'page_namespace' => $nt->getNamespace(),
+                               'page_title' => $nt->getDBkey(),
+                       ),
+                       /* WHERE */ array( 'page_id' => $oldid ),
+                       __METHOD__
+               );
+
+               // clean up the old title before reset article id - bug 45348
+               if ( !$redirectContent ) {
+                       WikiPage::onArticleDelete( $this->oldTitle );
+               }
+
+               $this->oldTitle->resetArticleID( 0 ); // 0 == non existing
+               $nt->resetArticleID( $oldid );
+               $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
+
+               $newpage->updateRevisionOn( $dbw, $nullRevision );
+
+               wfRunHooks( 'NewRevisionFromEditComplete',
+                       array( $newpage, $nullRevision, $nullRevision->getParentId(), $user ) );
+
+               $newpage->doEditUpdates( $nullRevision, $user, array( 'changed' => false ) );
+
+               if ( !$moveOverRedirect ) {
+                       WikiPage::onArticleCreate( $nt );
+               }
+
+               # Recreate the redirect, this time in the other direction.
+               if ( $redirectContent ) {
+                       $redirectArticle = WikiPage::factory( $this->oldTitle );
+                       $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
+                       $newid = $redirectArticle->insertOn( $dbw );
+                       if ( $newid ) { // sanity
+                               $this->oldTitle->resetArticleID( $newid );
+                               $redirectRevision = new Revision( array(
+                                       'title' => $this->oldTitle, // for determining the default content model
+                                       'page' => $newid,
+                                       'user_text' => $user->getName(),
+                                       'user' => $user->getId(),
+                                       'comment' => $comment,
+                                       'content' => $redirectContent ) );
+                               $redirectRevision->insertOn( $dbw );
+                               $redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
+
+                               wfRunHooks( 'NewRevisionFromEditComplete',
+                                       array( $redirectArticle, $redirectRevision, false, $user ) );
+
+                               $redirectArticle->doEditUpdates( $redirectRevision, $user, array( 'created' => true ) );
+                       }
+               }
+
+               # Log the move
+               $logid = $logEntry->insert();
+               $logEntry->publish( $logid );
+       }
+}
index 6ea4953..5176c2b 100644 (file)
@@ -179,14 +179,12 @@ class OutputPage extends ContextSource {
 
        protected $mFeedLinksAppendQuery = null;
 
-       /** @var array
-        * What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
+       /**
+        * @var int
+        * The level of 'untrustworthiness' allowed for modules loaded on this page.
         * @see ResourceLoaderModule::$origin
-        * ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
         */
-       protected $mAllowedModules = array(
-               ResourceLoaderModule::TYPE_COMBINED => ResourceLoaderModule::ORIGIN_ALL,
-       );
+       protected $mAllowedModuleOrigin = ResourceLoaderModule::ORIGIN_ALL;
 
        /** @var bool Whether output is disabled.  If this is true, the 'output' method will do nothing. */
        protected $mDoNothing = false;
@@ -449,15 +447,14 @@ class OutputPage extends ContextSource {
         * @param string $version Style version of the file. Defaults to $wgStyleVersion
         */
        public function addScriptFile( $file, $version = null ) {
-               global $wgStylePath, $wgStyleVersion;
                // See if $file parameter is an absolute URL or begins with a slash
                if ( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
                        $path = $file;
                } else {
-                       $path = "{$wgStylePath}/common/{$file}";
+                       $path = $this->getConfig()->get( 'StylePath' ) . "/common/{$file}";
                }
                if ( is_null( $version ) ) {
-                       $version = $wgStyleVersion;
+                       $version = $this->getConfig()->get( 'StyleVersion' );
                }
                $this->addScript( Html::linkedScript( wfAppendQuery( $path, $version ) ) );
        }
@@ -733,13 +730,12 @@ class OutputPage extends ContextSource {
         * @return bool True if cache-ok headers was sent.
         */
        public function checkLastModified( $timestamp ) {
-               global $wgCachePages, $wgCacheEpoch, $wgUseSquid, $wgSquidMaxage;
-
                if ( !$timestamp || $timestamp == '19700101000000' ) {
                        wfDebug( __METHOD__ . ": CACHE DISABLED, NO TIMESTAMP\n" );
                        return false;
                }
-               if ( !$wgCachePages ) {
+               $config = $this->getConfig();
+               if ( !$config->get( 'CachePages' ) ) {
                        wfDebug( __METHOD__ . ": CACHE DISABLED\n" );
                        return false;
                }
@@ -748,11 +744,11 @@ class OutputPage extends ContextSource {
                $modifiedTimes = array(
                        'page' => $timestamp,
                        'user' => $this->getUser()->getTouched(),
-                       'epoch' => $wgCacheEpoch
+                       'epoch' => $config->get( 'CacheEpoch' )
                );
-               if ( $wgUseSquid ) {
+               if ( $config->get( 'UseSquid' ) ) {
                        // bug 44570: the core page itself may not change, but resources might
-                       $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $wgSquidMaxage );
+                       $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $config->get( 'SquidMaxage' ) );
                }
                wfRunHooks( 'OutputPageCheckLastModified', array( &$modifiedTimes ) );
 
@@ -1107,11 +1103,9 @@ class OutputPage extends ContextSource {
         *        default links
         */
        public function setFeedAppendQuery( $val ) {
-               global $wgAdvertisedFeedTypes;
-
                $this->mFeedLinks = array();
 
-               foreach ( $wgAdvertisedFeedTypes as $type ) {
+               foreach ( $this->getConfig()->get( 'AdvertisedFeedTypes' ) as $type ) {
                        $query = "feed=$type";
                        if ( is_string( $val ) ) {
                                $query .= '&' . $val;
@@ -1127,9 +1121,7 @@ class OutputPage extends ContextSource {
         * @param string $href URL
         */
        public function addFeedLink( $format, $href ) {
-               global $wgAdvertisedFeedTypes;
-
-               if ( in_array( $format, $wgAdvertisedFeedTypes ) ) {
+               if ( in_array( $format, $this->getConfig()->get( 'AdvertisedFeedTypes' ) ) ) {
                        $this->mFeedLinks[$format] = $href;
                }
        }
@@ -1253,9 +1245,15 @@ class OutputPage extends ContextSource {
 
                # Fetch existence plus the hiddencat property
                $dbr = wfGetDB( DB_SLAVE );
+               $fields = array( 'page_id', 'page_namespace', 'page_title', 'page_len',
+                       'page_is_redirect', 'page_latest', 'pp_value' );
+
+               if ( $this->getConfig()->get( 'ContentHandlerUseDB' ) ) {
+                       $fields[] = 'page_content_model';
+               }
+
                $res = $dbr->select( array( 'page', 'page_props' ),
-                       array( 'page_id', 'page_namespace', 'page_title', 'page_len',
-                               'page_is_redirect', 'page_latest', 'pp_value' ),
+                       $fields,
                        $lb->constructSet( 'page', $dbr ),
                        __METHOD__,
                        array(),
@@ -1332,48 +1330,65 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Do not allow scripts which can be modified by wiki users to load on this page;
-        * only allow scripts bundled with, or generated by, the software.
+        * Restrict the page to loading modules bundled the software.
+        *
+        * Disallows the queue to contain any modules which can be modified by wiki
+        * users to load on this page.
         */
        public function disallowUserJs() {
-               $this->reduceAllowedModules(
-                       ResourceLoaderModule::TYPE_SCRIPTS,
-                       ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
-               );
+               $this->reduceAllowedModuleOrigin( ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL );
        }
 
        /**
-        * Show what level of JavaScript / CSS untrustworthiness is allowed on this page
+        * Get the level of JavaScript / CSS untrustworthiness allowed on this page.
+        *
         * @see ResourceLoaderModule::$origin
-        * @param string $type ResourceLoaderModule TYPE_ constant
+        * @param string $type Unused: Module origin allowance used to be fragmented by
+        *  ResourceLoaderModule TYPE_ constants.
         * @return int ResourceLoaderModule ORIGIN_ class constant
         */
-       public function getAllowedModules( $type ) {
-               if ( $type == ResourceLoaderModule::TYPE_COMBINED ) {
-                       return min( array_values( $this->mAllowedModules ) );
-               } else {
-                       return isset( $this->mAllowedModules[$type] )
-                               ? $this->mAllowedModules[$type]
-                               : ResourceLoaderModule::ORIGIN_ALL;
-               }
+       public function getAllowedModules( $type = null ) {
+               return $this->mAllowedModuleOrigin;
        }
 
        /**
         * Set the highest level of CSS/JS untrustworthiness allowed
+        *
+        * @deprecated since 1.24 Raising level of allowed untrusted content is no longer supported.
+        *  Use reduceAllowedModuleOrigin() instead.
+        *
         * @param string $type ResourceLoaderModule TYPE_ constant
-        * @param int $level ResourceLoaderModule class constant
+        * @param int $level ResourceLoaderModule ORIGIN_ constant
         */
        public function setAllowedModules( $type, $level ) {
-               $this->mAllowedModules[$type] = $level;
+               wfDeprecated( __METHOD__, '1.24' );
+               $this->reduceAllowedModuleOrigin( $level );
        }
 
        /**
-        * As for setAllowedModules(), but don't inadvertently make the page more accessible
-        * @param string $type
-        * @param int $level ResourceLoaderModule class constant
+        * Limit the highest level of CSS/JS untrustworthiness allowed.
+        *
+        * @deprecated since 1.24 Module allowance is no longer fragmented by content type.
+        *  Use reduceAllowedModuleOrigin() instead.
+        *
+        * @param string $type ResourceLoaderModule TYPE_ constant
+        * @param int $level ResourceLoaderModule ORIGIN_ class constant
         */
        public function reduceAllowedModules( $type, $level ) {
-               $this->mAllowedModules[$type] = min( $this->getAllowedModules( $type ), $level );
+               wfDeprecated( __METHOD__, '1.24' );
+               $this->reduceAllowedModuleOrigin( $level );
+       }
+
+       /**
+        * Limit the highest level of CSS/JS untrustworthiness allowed.
+        *
+        * If passed the same or a higher level than the current level of untrustworthiness set, the
+        * level will remain unchanged.
+        *
+        * @param int $level ResourceLoaderModule class constant
+        */
+       public function reduceAllowedModuleOrigin( $level ) {
+               $this->mAllowedModuleOrigin = min( $this->mAllowedModuleOrigin, $level );
        }
 
        /**
@@ -1611,7 +1626,7 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.24, use addParserOutputMetadata() instead.
         * @param ParserOutput $parserOutput
         */
-       public function addParserOutputNoText( &$parserOutput ) {
+       public function addParserOutputNoText( $parserOutput ) {
                $this->addParserOutputMetadata( $parserOutput );
        }
 
@@ -1623,7 +1638,7 @@ class OutputPage extends ContextSource {
         * @since 1.24
         * @param ParserOutput $parserOutput
         */
-       public function addParserOutputMetadata( &$parserOutput ) {
+       public function addParserOutputMetadata( $parserOutput ) {
                $this->mLanguageLinks += $parserOutput->getLanguageLinks();
                $this->addCategoryLinks( $parserOutput->getCategories() );
                $this->mNewSectionLink = $parserOutput->getNewSection();
@@ -1657,11 +1672,11 @@ class OutputPage extends ContextSource {
                }
 
                // Hooks registered in the object
-               global $wgParserOutputHooks;
+               $parserOutputHooks = $this->getConfig()->get( 'ParserOutputHooks' );
                foreach ( $parserOutput->getOutputHooks() as $hookInfo ) {
                        list( $hookName, $data ) = $hookInfo;
-                       if ( isset( $wgParserOutputHooks[$hookName] ) ) {
-                               call_user_func( $wgParserOutputHooks[$hookName], $this, $parserOutput, $data );
+                       if ( isset( $parserOutputHooks[$hookName] ) ) {
+                               call_user_func( $parserOutputHooks[$hookName], $this, $parserOutput, $data );
                        }
                }
 
@@ -1679,7 +1694,7 @@ class OutputPage extends ContextSource {
         * @since 1.24
         * @param ParserOutput $parserOutput
         */
-       public function addParserOutputContent( &$parserOutput ) {
+       public function addParserOutputContent( $parserOutput ) {
                $this->addParserOutputText( $parserOutput );
 
                $this->addModules( $parserOutput->getModules() );
@@ -1696,7 +1711,7 @@ class OutputPage extends ContextSource {
         * @since 1.24
         * @param ParserOutput $parserOutput
         */
-       public function addParserOutputText( &$parserOutput ) {
+       public function addParserOutputText( $parserOutput ) {
                $text = $parserOutput->getText();
                wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
                $this->addHTML( $text );
@@ -1707,7 +1722,7 @@ class OutputPage extends ContextSource {
         *
         * @param ParserOutput $parserOutput
         */
-       function addParserOutput( &$parserOutput ) {
+       function addParserOutput( $parserOutput ) {
                $this->addParserOutputMetadata( $parserOutput );
                $parserOutput->setTOCEnabled( $this->mEnableTOC );
 
@@ -1811,17 +1826,17 @@ class OutputPage extends ContextSource {
         * @return array
         */
        function getCacheVaryCookies() {
-               global $wgCookiePrefix, $wgCacheVaryCookies;
                static $cookies;
                if ( $cookies === null ) {
+                       $config = $this->getConfig();
                        $cookies = array_merge(
                                array(
-                                       "{$wgCookiePrefix}Token",
-                                       "{$wgCookiePrefix}LoggedOut",
+                                       $config->get( 'CookiePrefix' ) . 'Token',
+                                       $config->get( 'CookiePrefix' ) . 'LoggedOut',
                                        "forceHTTPS",
                                        session_name()
                                ),
-                               $wgCacheVaryCookies
+                               $config->get( 'CacheVaryCookies' )
                        );
                        wfRunHooks( 'GetCacheVaryCookies', array( $this, &$cookies ) );
                }
@@ -1987,11 +2002,11 @@ class OutputPage extends ContextSource {
         * @return string
         */
        public function getFrameOptions() {
-               global $wgBreakFrames, $wgEditPageFrameOptions;
-               if ( $wgBreakFrames ) {
+               $config = $this->getConfig();
+               if ( $config->get( 'BreakFrames' ) ) {
                        return 'DENY';
-               } elseif ( $this->mPreventClickjacking && $wgEditPageFrameOptions ) {
-                       return $wgEditPageFrameOptions;
+               } elseif ( $this->mPreventClickjacking && $config->get( 'EditPageFrameOptions' ) ) {
+                       return $config->get( 'EditPageFrameOptions' );
                }
                return false;
        }
@@ -2000,10 +2015,9 @@ class OutputPage extends ContextSource {
         * Send cache control HTTP headers
         */
        public function sendCacheControl() {
-               global $wgUseSquid, $wgUseESI, $wgUseETag, $wgSquidMaxage, $wgUseXVO;
-
                $response = $this->getRequest()->response();
-               if ( $wgUseETag && $this->mETag ) {
+               $config = $this->getConfig();
+               if ( $config->get( 'UseETag' ) && $this->mETag ) {
                        $response->header( "ETag: $this->mETag" );
                }
 
@@ -2014,24 +2028,24 @@ class OutputPage extends ContextSource {
                # maintain different caches for logged-in users and non-logged in ones
                $response->header( $this->getVaryHeader() );
 
-               if ( $wgUseXVO ) {
+               if ( $config->get( 'UseXVO' ) ) {
                        # Add an X-Vary-Options header for Squid with Wikimedia patches
                        $response->header( $this->getXVO() );
                }
 
                if ( $this->mEnableClientCache ) {
                        if (
-                               $wgUseSquid && session_id() == '' && !$this->isPrintable() &&
+                               $config->get( 'UseSquid' ) && session_id() == '' && !$this->isPrintable() &&
                                $this->mSquidMaxage != 0 && !$this->haveCacheVaryCookies()
                        ) {
-                               if ( $wgUseESI ) {
+                               if ( $config->get( 'UseESI' ) ) {
                                        # We'll purge the proxy cache explicitly, but require end user agents
                                        # to revalidate against the proxy on each visit.
                                        # Surrogate-Control controls our Squid, Cache-Control downstream caches
                                        wfDebug( __METHOD__ . ": proxy caching with ESI; {$this->mLastModified} **\n", 'log' );
                                        # start with a shorter timeout for initial testing
                                        # header( 'Surrogate-Control: max-age=2678400+2678400, content="ESI/1.0"');
-                                       $response->header( 'Surrogate-Control: max-age=' . $wgSquidMaxage
+                                       $response->header( 'Surrogate-Control: max-age=' . $config->get( 'SquidMaxage' )
                                                . '+' . $this->mSquidMaxage . ', content="ESI/1.0"' );
                                        $response->header( 'Cache-Control: s-maxage=0, must-revalidate, max-age=0' );
                                } else {
@@ -2071,9 +2085,6 @@ class OutputPage extends ContextSource {
         * the object, let's actually output it:
         */
        public function output() {
-               global $wgLanguageCode, $wgDebugRedirects, $wgMimeType, $wgVaryOnXFP,
-                       $wgResponsiveImages;
-
                if ( $this->mDoNothing ) {
                        return;
                }
@@ -2081,6 +2092,7 @@ class OutputPage extends ContextSource {
                wfProfileIn( __METHOD__ );
 
                $response = $this->getRequest()->response();
+               $config = $this->getConfig();
 
                if ( $this->mRedirect != '' ) {
                        # Standards require redirect URLs to be absolute
@@ -2091,19 +2103,19 @@ class OutputPage extends ContextSource {
 
                        if ( wfRunHooks( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
                                if ( $code == '301' || $code == '303' ) {
-                                       if ( !$wgDebugRedirects ) {
+                                       if ( !$config->get( 'DebugRedirects' ) ) {
                                                $message = HttpStatus::getMessage( $code );
                                                $response->header( "HTTP/1.1 $code $message" );
                                        }
                                        $this->mLastModified = wfTimestamp( TS_RFC2822 );
                                }
-                               if ( $wgVaryOnXFP ) {
+                               if ( $config->get( 'VaryOnXFP' ) ) {
                                        $this->addVaryHeader( 'X-Forwarded-Proto' );
                                }
                                $this->sendCacheControl();
 
                                $response->header( "Content-Type: text/html; charset=utf-8" );
-                               if ( $wgDebugRedirects ) {
+                               if ( $config->get( 'DebugRedirects' ) ) {
                                        $url = htmlspecialchars( $redirect );
                                        print "<html>\n<head>\n<title>Redirect</title>\n</head>\n<body>\n";
                                        print "<p>Location: <a href=\"$url\">$url</a></p>\n";
@@ -2125,8 +2137,8 @@ class OutputPage extends ContextSource {
                # Buffer output; final headers may depend on later processing
                ob_start();
 
-               $response->header( "Content-type: $wgMimeType; charset=UTF-8" );
-               $response->header( 'Content-language: ' . $wgLanguageCode );
+               $response->header( 'Content-type: ' . $config->get( 'MimeType' ) . '; charset=UTF-8' );
+               $response->header( 'Content-language: ' . $config->get( 'LanguageCode' ) );
 
                // Avoid Internet Explorer "compatibility view" in IE 8-10, so that
                // jQuery etc. can work correctly.
@@ -2154,7 +2166,7 @@ class OutputPage extends ContextSource {
                        );
 
                        // Support for high-density display images if enabled
-                       if ( $wgResponsiveImages ) {
+                       if ( $config->get( 'ResponsiveImages' ) ) {
                                $coreModules[] = 'mediawiki.hidpi';
                        }
 
@@ -2400,90 +2412,32 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Display a page stating that the Wiki is in read-only mode,
-        * and optionally show the source of the page that the user
-        * was trying to edit.  Should only be called (for this
-        * purpose) after wfReadOnly() has returned true.
+        * Display a page stating that the Wiki is in read-only mode.
+        * Should only be called after wfReadOnly() has returned true.
         *
-        * For historical reasons, this function is _also_ used to
-        * show the error message when a user tries to edit a page
-        * they are not allowed to edit.  (Unless it's because they're
-        * blocked, then we show blockedPage() instead.)  In this
-        * case, the second parameter should be set to true and a list
-        * of reasons supplied as the third parameter.
+        * Historically, this function was used to show the source of the page that the user
+        * was trying to edit and _also_ permissions error messages. The relevant code was
+        * moved into EditPage in 1.19 (r102024 / d83c2a431c2a) and removed here in 1.25.
         *
-        * @todo Needs to be split into multiple functions.
-        *
-        * @param string $source Source code to show (or null).
-        * @param bool $protected Is this a permissions error?
-        * @param array $reasons List of reasons for this error, as returned by
-        *   Title::getUserPermissionsErrors().
-        * @param string $action Action that was denied or null if unknown
+        * @deprecated since 1.25; throw the exception directly
         * @throws ReadOnlyError
         */
-       public function readOnlyPage( $source = null, $protected = false,
-               array $reasons = array(), $action = null
-       ) {
-               $this->setRobotPolicy( 'noindex,nofollow' );
-               $this->setArticleRelated( false );
-
-               // If no reason is given, just supply a default "I can't let you do
-               // that, Dave" message.  Should only occur if called by legacy code.
-               if ( $protected && empty( $reasons ) ) {
-                       $reasons[] = array( 'badaccess-group0' );
+       public function readOnlyPage() {
+               if ( func_num_args() > 0 ) {
+                       throw new MWException( __METHOD__ . ' no longer accepts arguments since 1.25.' );
                }
 
-               if ( !empty( $reasons ) ) {
-                       // Permissions error
-                       if ( $source ) {
-                               $this->setPageTitle( $this->msg( 'viewsource-title', $this->getTitle()->getPrefixedText() ) );
-                               $this->addBacklinkSubtitle( $this->getTitle() );
-                       } else {
-                               $this->setPageTitle( $this->msg( 'badaccess' ) );
-                       }
-                       $this->addWikiText( $this->formatPermissionsErrorMessage( $reasons, $action ) );
-               } else {
-                       // Wiki is read only
-                       throw new ReadOnlyError;
-               }
-
-               // Show source, if supplied
-               if ( is_string( $source ) ) {
-                       $this->addWikiMsg( 'viewsourcetext' );
-
-                       $pageLang = $this->getTitle()->getPageLanguage();
-                       $params = array(
-                               'id' => 'wpTextbox1',
-                               'name' => 'wpTextbox1',
-                               'cols' => $this->getUser()->getOption( 'cols' ),
-                               'rows' => $this->getUser()->getOption( 'rows' ),
-                               'readonly' => 'readonly',
-                               'lang' => $pageLang->getHtmlCode(),
-                               'dir' => $pageLang->getDir(),
-                       );
-                       $this->addHTML( Html::element( 'textarea', $params, $source ) );
-
-                       // Show templates used by this article
-                       $templates = Linker::formatTemplates( $this->getTitle()->getTemplateLinksFrom() );
-                       $this->addHTML( "<div class='templatesUsed'>
-$templates
-</div>
-" );
-               }
-
-               # If the title doesn't exist, it's fairly pointless to print a return
-               # link to it.  After all, you just tried editing it and couldn't, so
-               # what's there to do there?
-               if ( $this->getTitle()->exists() ) {
-                       $this->returnToMain( null, $this->getTitle() );
-               }
+               throw new ReadOnlyError;
        }
 
        /**
         * Turn off regular page output and return an error response
         * for when rate limiting has triggered.
+        *
+        * @deprecated since 1.25; throw the exception directly
         */
        public function rateLimited() {
+               wfDeprecated( __METHOD__, '1.25' );
                throw new ThrottledError;
        }
 
@@ -2497,9 +2451,9 @@ $templates
         * @param int $lag Slave lag
         */
        public function showLagWarning( $lag ) {
-               global $wgSlaveLagWarning, $wgSlaveLagCritical;
-               if ( $lag >= $wgSlaveLagWarning ) {
-                       $message = $lag < $wgSlaveLagCritical
+               $config = $this->getConfig();
+               if ( $lag >= $config->get( 'SlaveLagWarning' ) ) {
+                       $message = $lag < $config->get( 'SlaveLagCritical' )
                                ? 'lag-warn-normal'
                                : 'lag-warn-high';
                        $wrap = Html::rawElement( 'div', array( 'class' => "mw-{$message}" ), "\n$1\n" );
@@ -2586,7 +2540,9 @@ $templates
         * @return string The doctype, opening "<html>", and head element.
         */
        public function headElement( Skin $sk, $includeStyle = true ) {
-               global $wgContLang, $wgMimeType;
+               global $wgContLang;
+
+               $section = new ProfileSection( __METHOD__ );
 
                $userdir = $this->getLanguage()->getDir();
                $sitedir = $wgContLang->getDir();
@@ -2603,7 +2559,7 @@ $templates
                        $ret .= "$openHead\n";
                }
 
-               if ( !Html::isXmlMimeType( $wgMimeType ) ) {
+               if ( !Html::isXmlMimeType( $this->getConfig()->get( 'MimeType' ) ) ) {
                        // Add <meta charset="UTF-8">
                        // This should be before <title> since it defines the charset used by
                        // text including the text inside <title>.
@@ -2673,7 +2629,7 @@ $templates
         */
        public function getResourceLoader() {
                if ( is_null( $this->mResourceLoader ) ) {
-                       $this->mResourceLoader = new ResourceLoader();
+                       $this->mResourceLoader = new ResourceLoader( $this->getConfig() );
                }
                return $this->mResourceLoader;
        }
@@ -2692,8 +2648,6 @@ $templates
        protected function makeResourceLoaderLink( $modules, $only, $useESI = false,
                array $extraQuery = array(), $loadCall = false
        ) {
-               global $wgResourceLoaderUseESI;
-
                $modules = (array)$modules;
 
                $links = array(
@@ -2729,6 +2683,7 @@ $templates
                // Create keyed-by-source and then keyed-by-group list of module objects from modules list
                $sortedModules = array();
                $resourceLoader = $this->getResourceLoader();
+               $resourceLoaderUseESI = $this->getConfig()->get( 'ResourceLoaderUseESI' );
                foreach ( $modules as $name ) {
                        $module = $resourceLoader->getModule( $name );
                        # Check that we're allowed to include this module on this page
@@ -2771,7 +2726,9 @@ $templates
                                );
                                $context = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
 
-                               // Extract modules that know they're empty
+                               // Extract modules that know they're empty and see if we have one or more
+                               // raw modules
+                               $isRaw = false;
                                foreach ( $grpModules as $key => $module ) {
                                        // Inline empty modules: since they're empty, just mark them as 'ready' (bug 46857)
                                        // If we're only getting the styles, we don't need to do anything for empty modules.
@@ -2781,6 +2738,8 @@ $templates
                                                        $links['states'][$key] = 'ready';
                                                }
                                        }
+
+                                       $isRaw |= $module->isRaw();
                                }
 
                                // If there are no non-empty modules, skip this group
@@ -2799,7 +2758,9 @@ $templates
                                                );
                                        } else {
                                                $links['html'] .= Html::inlineScript(
-                                                       $resourceLoader->makeModuleResponse( $context, $grpModules )
+                                                       ResourceLoader::makeLoaderConditionalScript(
+                                                               $resourceLoader->makeModuleResponse( $context, $grpModules )
+                                                       )
                                                );
                                        }
                                        $links['html'] .= "\n";
@@ -2826,7 +2787,7 @@ $templates
                                $moduleContext = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
                                $url = $resourceLoader->createLoaderURL( $source, $moduleContext, $extraQuery );
 
-                               if ( $useESI && $wgResourceLoaderUseESI ) {
+                               if ( $useESI && $resourceLoaderUseESI ) {
                                        $esi = Xml::element( 'esi:include', array( 'src' => $url ) );
                                        if ( $only == ResourceLoaderModule::TYPE_STYLES ) {
                                                $link = Html::inlineStyle( $esi );
@@ -2845,6 +2806,17 @@ $templates
                                                );
                                        } else {
                                                $link = Html::linkedScript( $url );
+                                               if ( $context->getOnly() === 'scripts' && !$context->getRaw() && !$isRaw ) {
+                                                       // Wrap only=script requests in a conditional as browsers not supported
+                                                       // by the startup module would unconditionally execute this module.
+                                                       // Otherwise users will get "ReferenceError: mw is undefined" or
+                                                       // "jQuery is undefined" from e.g. a "site" module.
+                                                       $link = Html::inlineScript(
+                                                               ResourceLoader::makeLoaderConditionalScript(
+                                                                       Xml::encodeJsCall( 'document.write', array( $link ) )
+                                                               )
+                                                       );
+                                               }
 
                                                // For modules requested directly in the html via <link> or <script>,
                                                // tell mw.loader they are being loading to prevent duplicate requests.
@@ -2903,8 +2875,6 @@ $templates
         * @return string HTML fragment
         */
        function getHeadScripts() {
-               global $wgResourceLoaderExperimentalAsyncLoading;
-
                // Startup - this will immediately load jquery and mediawiki modules
                $links = array();
                $links[] = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS, true );
@@ -2944,7 +2914,7 @@ $templates
                        );
                }
 
-               if ( $wgResourceLoaderExperimentalAsyncLoading ) {
+               if ( $this->getConfig()->get( 'ResourceLoaderExperimentalAsyncLoading' ) ) {
                        $links[] = $this->getScriptsForBottomQueue( true );
                }
 
@@ -2963,8 +2933,6 @@ $templates
         * @return string
         */
        function getScriptsForBottomQueue( $inHead ) {
-               global $wgAllowUserJs;
-
                // Scripts and messages "only" requests marked for bottom inclusion
                // If we're in the <head>, use load() calls rather than <script src="..."> tags
                // Messages should go first
@@ -2998,7 +2966,7 @@ $templates
                );
 
                // Add user JS if enabled
-               if ( $wgAllowUserJs
+               if ( $this->getConfig()->get( 'AllowUserJs' )
                        && $this->getUser()->isLoggedIn()
                        && $this->getTitle()
                        && $this->getTitle()->isJsSubpage()
@@ -3037,15 +3005,13 @@ $templates
         * @return string
         */
        function getBottomScripts() {
-               global $wgResourceLoaderExperimentalAsyncLoading;
-
                // Optimise jQuery ready event cross-browser.
                // This also enforces $.isReady to be true at </body> which fixes the
                // mw.loader bug in Firefox with using document.write between </body>
                // and the DOMContentReady event (bug 47457).
                $html = Html::inlineScript( 'window.jQuery && jQuery.ready();' );
 
-               if ( !$wgResourceLoaderExperimentalAsyncLoading ) {
+               if ( !$this->getConfig()->get( 'ResourceLoaderExperimentalAsyncLoading' ) ) {
                        $html .= $this->getScriptsForBottomQueue( false );
                }
 
@@ -3232,13 +3198,10 @@ $templates
         * @return array Array in format "link name or number => 'link html'".
         */
        public function getHeadLinksArray() {
-               global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
-                       $wgSitename, $wgVersion,
-                       $wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes,
-                       $wgDisableLangConversion, $wgCanonicalLanguageLinks,
-                       $wgRightsPage, $wgRightsUrl;
+               global $wgVersion;
 
                $tags = array();
+               $config = $this->getConfig();
 
                $canonicalUrl = $this->mCanonicalUrl;
 
@@ -3281,7 +3244,7 @@ $templates
                }
 
                # Universal edit button
-               if ( $wgUniversalEditButton && $this->isArticleRelated() ) {
+               if ( $config->get( 'UniversalEditButton' ) && $this->isArticleRelated() ) {
                        $user = $this->getUser();
                        if ( $this->getTitle()->quickUserCan( 'edit', $user )
                                && ( $this->getTitle()->exists() || $this->getTitle()->quickUserCan( 'create', $user ) ) ) {
@@ -3306,17 +3269,17 @@ $templates
                # should not matter, but Konqueror (3.5.9 at least) incorrectly
                # uses whichever one appears later in the HTML source. Make sure
                # apple-touch-icon is specified first to avoid this.
-               if ( $wgAppleTouchIcon !== false ) {
+               if ( $config->get( 'AppleTouchIcon' ) !== false ) {
                        $tags['apple-touch-icon'] = Html::element( 'link', array(
                                'rel' => 'apple-touch-icon',
-                               'href' => $wgAppleTouchIcon
+                               'href' => $config->get( 'AppleTouchIcon' )
                        ) );
                }
 
-               if ( $wgFavicon !== false ) {
+               if ( $config->get( 'Favicon' ) !== false ) {
                        $tags['favicon'] = Html::element( 'link', array(
                                'rel' => 'shortcut icon',
-                               'href' => $wgFavicon
+                               'href' => $config->get( 'Favicon' )
                        ) );
                }
 
@@ -3328,7 +3291,7 @@ $templates
                        'title' => $this->msg( 'opensearch-desc' )->inContentLanguage()->text(),
                ) );
 
-               if ( $wgEnableAPI ) {
+               if ( $config->get( 'EnableAPI' ) ) {
                        # Real Simple Discovery link, provides auto-discovery information
                        # for the MediaWiki API (and potentially additional custom API
                        # support such as WordPress or Twitter-compatible APIs for a
@@ -3347,39 +3310,37 @@ $templates
                }
 
                # Language variants
-               if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks ) {
+               if ( !$config->get( 'DisableLangConversion' ) ) {
                        $lang = $this->getTitle()->getPageLanguage();
                        if ( $lang->hasVariants() ) {
-
-                               $urlvar = $lang->getURLVariant();
-
-                               if ( !$urlvar ) {
-                                       $variants = $lang->getVariants();
-                                       foreach ( $variants as $_v ) {
-                                               $tags["variant-$_v"] = Html::element( 'link', array(
-                                                       'rel' => 'alternate',
-                                                       'hreflang' => wfBCP47( $_v ),
-                                                       'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
-                                               );
-                                       }
-                               } else {
-                                       $canonicalUrl = $this->getTitle()->getLocalURL();
+                               $variants = $lang->getVariants();
+                               foreach ( $variants as $_v ) {
+                                       $tags["variant-$_v"] = Html::element( 'link', array(
+                                               'rel' => 'alternate',
+                                               'hreflang' => wfBCP47( $_v ),
+                                               'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
+                                       );
                                }
                        }
+                       # x-default link per https://support.google.com/webmasters/answer/189077?hl=en
+                       $tags["variant-x-default"] = Html::element( 'link', array(
+                               'rel' => 'alternate',
+                               'hreflang' => 'x-default',
+                               'href' => $this->getTitle()->getLocalURL() ) );
                }
 
                # Copyright
                $copyright = '';
-               if ( $wgRightsPage ) {
-                       $copy = Title::newFromText( $wgRightsPage );
+               if ( $config->get( 'RightsPage' ) ) {
+                       $copy = Title::newFromText( $config->get( 'RightsPage' ) );
 
                        if ( $copy ) {
                                $copyright = $copy->getLocalURL();
                        }
                }
 
-               if ( !$copyright && $wgRightsUrl ) {
-                       $copyright = $wgRightsUrl;
+               if ( !$copyright && $config->get( 'RightsUrl' ) ) {
+                       $copyright = $config->get( 'RightsUrl' );
                }
 
                if ( $copyright ) {
@@ -3390,7 +3351,7 @@ $templates
                }
 
                # Feeds
-               if ( $wgFeed ) {
+               if ( $config->get( 'Feed' ) ) {
                        foreach ( $this->getSyndicationLinks() as $format => $link ) {
                                # Use the page name for the title.  In principle, this could
                                # lead to issues with having the same name for different feeds
@@ -3412,31 +3373,31 @@ $templates
                        # like to promote instead of the RC feed (maybe like a "Recent New Articles"
                        # or "Breaking news" one). For this, we see if $wgOverrideSiteFeed is defined.
                        # If so, use it instead.
-                       if ( $wgOverrideSiteFeed ) {
-                               foreach ( $wgOverrideSiteFeed as $type => $feedUrl ) {
+                       $sitename = $config->get( 'Sitename' );
+                       if ( $config->get( 'OverrideSiteFeed' ) ) {
+                               foreach ( $config->get( 'OverrideSiteFeed' ) as $type => $feedUrl ) {
                                        // Note, this->feedLink escapes the url.
                                        $tags[] = $this->feedLink(
                                                $type,
                                                $feedUrl,
-                                               $this->msg( "site-{$type}-feed", $wgSitename )->text()
+                                               $this->msg( "site-{$type}-feed", $sitename )->text()
                                        );
                                }
                        } elseif ( !$this->getTitle()->isSpecial( 'Recentchanges' ) ) {
                                $rctitle = SpecialPage::getTitleFor( 'Recentchanges' );
-                               foreach ( $wgAdvertisedFeedTypes as $format ) {
+                               foreach ( $config->get( 'AdvertisedFeedTypes' ) as $format ) {
                                        $tags[] = $this->feedLink(
                                                $format,
                                                $rctitle->getLocalURL( array( 'feed' => $format ) ),
                                                # For grep: 'site-rss-feed', 'site-atom-feed'
-                                               $this->msg( "site-{$format}-feed", $wgSitename )->text()
+                                               $this->msg( "site-{$format}-feed", $sitename )->text()
                                        );
                                }
                        }
                }
 
                # Canonical URL
-               global $wgEnableCanonicalServerLink;
-               if ( $wgEnableCanonicalServerLink ) {
+               if ( $config->get( 'EnableCanonicalServerLink' ) ) {
                        if ( $canonicalUrl !== false ) {
                                $canonicalUrl = wfExpandUrl( $canonicalUrl, PROTO_CANONICAL );
                        } else {
@@ -3526,7 +3487,7 @@ $templates
         * @return string
         */
        public function buildCssLinks() {
-               global $wgAllowUserCss, $wgContLang;
+               global $wgContLang;
 
                $this->getSkin()->setupSkinUserCss( $this );
 
@@ -3551,7 +3512,7 @@ $templates
                $moduleStyles[] = 'user.groups';
 
                // Per-user custom styles
-               if ( $wgAllowUserCss && $this->getTitle()->isCssSubpage() && $this->userCanPreview() ) {
+               if ( $this->getConfig()->get( 'AllowUserCss' ) && $this->getTitle()->isCssSubpage() && $this->userCanPreview() ) {
                        // We're on a preview of a CSS subpage
                        // Exclude this page from the user module in case it's in there (bug 26283)
                        $link = $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_STYLES, false,
@@ -3663,8 +3624,8 @@ $templates
                        substr( $style, 0, 6 ) == 'https:' ) {
                        $url = $style;
                } else {
-                       global $wgStylePath, $wgStyleVersion;
-                       $url = $wgStylePath . '/' . $style . '?' . $wgStyleVersion;
+                       $config = $this->getConfig();
+                       $url = $config->get( 'StylePath' ) . '/' . $style . '?' . $config->get( 'StyleVersion' );
                }
 
                $link = Html::linkedStyle( $url, $media );
index 0f5a6fc..5af818f 100644 (file)
@@ -39,7 +39,7 @@
  * version are hardcoded here
  */
 function wfPHPVersionError( $type ) {
-       $mwVersion = '1.24';
+       $mwVersion = '1.25';
        $minimumVersionPHP = '5.3.2';
 
        $phpVersion = PHP_VERSION;
@@ -60,7 +60,7 @@ function wfPHPVersionError( $type ) {
                }
                $encLogo = htmlspecialchars(
                        str_replace( '//', '/', $dirname . '/' ) .
-                       'skins/common/images/mediawiki.png'
+                       'resources/assets/mediawiki.png'
                );
 
                header( "$protocol 500 MediaWiki configuration Error" );
diff --git a/includes/Pager.php b/includes/Pager.php
deleted file mode 100644 (file)
index c7de8c1..0000000
+++ /dev/null
@@ -1,1331 +0,0 @@
-<?php
-/**
- * Efficient paging for SQL queries.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Pager
- */
-
-/**
- * @defgroup Pager Pager
- */
-
-/**
- * Basic pager interface.
- * @ingroup Pager
- */
-interface Pager {
-       function getNavigationBar();
-       function getBody();
-}
-
-/**
- * IndexPager is an efficient pager which uses a (roughly unique) index in the
- * data set to implement paging, rather than a "LIMIT offset,limit" clause.
- * In MySQL, such a limit/offset clause requires counting through the
- * specified number of offset rows to find the desired data, which can be
- * expensive for large offsets.
- *
- * ReverseChronologicalPager is a child class of the abstract IndexPager, and
- * contains  some formatting and display code which is specific to the use of
- * timestamps as  indexes. Here is a synopsis of its operation:
- *
- *    * The query is specified by the offset, limit and direction (dir)
- *      parameters, in addition to any subclass-specific parameters.
- *    * The offset is the non-inclusive start of the DB query. A row with an
- *      index value equal to the offset will never be shown.
- *    * The query may either be done backwards, where the rows are returned by
- *      the database in the opposite order to which they are displayed to the
- *      user, or forwards. This is specified by the "dir" parameter, dir=prev
- *      means backwards, anything else means forwards. The offset value
- *      specifies the start of the database result set, which may be either
- *      the start or end of the displayed data set. This allows "previous"
- *      links to be implemented without knowledge of the index value at the
- *      start of the previous page.
- *    * An additional row beyond the user-specified limit is always requested.
- *      This allows us to tell whether we should display a "next" link in the
- *      case of forwards mode, or a "previous" link in the case of backwards
- *      mode. Determining whether to display the other link (the one for the
- *      page before the start of the database result set) can be done
- *      heuristically by examining the offset.
- *
- *    * An empty offset indicates that the offset condition should be omitted
- *      from the query. This naturally produces either the first page or the
- *      last page depending on the dir parameter.
- *
- *  Subclassing the pager to implement concrete functionality should be fairly
- *  simple, please see the examples in HistoryAction.php and
- *  SpecialBlockList.php. You just need to override formatRow(),
- *  getQueryInfo() and getIndexField(). Don't forget to call the parent
- *  constructor if you override it.
- *
- * @ingroup Pager
- */
-abstract class IndexPager extends ContextSource implements Pager {
-       public $mRequest;
-       public $mLimitsShown = array( 20, 50, 100, 250, 500 );
-       public $mDefaultLimit = 50;
-       public $mOffset, $mLimit;
-       public $mQueryDone = false;
-       public $mDb;
-       public $mPastTheEndRow;
-
-       /**
-        * The index to actually be used for ordering. This is a single column,
-        * for one ordering, even if multiple orderings are supported.
-        */
-       protected $mIndexField;
-       /**
-        * An array of secondary columns to order by. These fields are not part of the offset.
-        * This is a column list for one ordering, even if multiple orderings are supported.
-        */
-       protected $mExtraSortFields;
-       /** For pages that support multiple types of ordering, which one to use.
-        */
-       protected $mOrderType;
-       /**
-        * $mDefaultDirection gives the direction to use when sorting results:
-        * false for ascending, true for descending.  If $mIsBackwards is set, we
-        * start from the opposite end, but we still sort the page itself according
-        * to $mDefaultDirection.  E.g., if $mDefaultDirection is false but we're
-        * going backwards, we'll display the last page of results, but the last
-        * result will be at the bottom, not the top.
-        *
-        * Like $mIndexField, $mDefaultDirection will be a single value even if the
-        * class supports multiple default directions for different order types.
-        */
-       public $mDefaultDirection;
-       public $mIsBackwards;
-
-       /** True if the current result set is the first one */
-       public $mIsFirst;
-       public $mIsLast;
-
-       protected $mLastShown, $mFirstShown, $mPastTheEndIndex, $mDefaultQuery, $mNavigationBar;
-
-       /**
-        * Whether to include the offset in the query
-        */
-       protected $mIncludeOffset = false;
-
-       /**
-        * Result object for the query. Warning: seek before use.
-        *
-        * @var ResultWrapper
-        */
-       public $mResult;
-
-       public function __construct( IContextSource $context = null ) {
-               if ( $context ) {
-                       $this->setContext( $context );
-               }
-
-               $this->mRequest = $this->getRequest();
-
-               # NB: the offset is quoted, not validated. It is treated as an
-               # arbitrary string to support the widest variety of index types. Be
-               # careful outputting it into HTML!
-               $this->mOffset = $this->mRequest->getText( 'offset' );
-
-               # Use consistent behavior for the limit options
-               $this->mDefaultLimit = $this->getUser()->getIntOption( 'rclimit' );
-               if ( !$this->mLimit ) {
-                       // Don't override if a subclass calls $this->setLimit() in its constructor.
-                       list( $this->mLimit, /* $offset */ ) = $this->mRequest->getLimitOffset();
-               }
-
-               $this->mIsBackwards = ( $this->mRequest->getVal( 'dir' ) == 'prev' );
-               # Let the subclass set the DB here; otherwise use a slave DB for the current wiki
-               $this->mDb = $this->mDb ?: wfGetDB( DB_SLAVE );
-
-               $index = $this->getIndexField(); // column to sort on
-               $extraSort = $this->getExtraSortFields(); // extra columns to sort on for query planning
-               $order = $this->mRequest->getVal( 'order' );
-               if ( is_array( $index ) && isset( $index[$order] ) ) {
-                       $this->mOrderType = $order;
-                       $this->mIndexField = $index[$order];
-                       $this->mExtraSortFields = isset( $extraSort[$order] )
-                               ? (array)$extraSort[$order]
-                               : array();
-               } elseif ( is_array( $index ) ) {
-                       # First element is the default
-                       reset( $index );
-                       list( $this->mOrderType, $this->mIndexField ) = each( $index );
-                       $this->mExtraSortFields = isset( $extraSort[$this->mOrderType] )
-                               ? (array)$extraSort[$this->mOrderType]
-                               : array();
-               } else {
-                       # $index is not an array
-                       $this->mOrderType = null;
-                       $this->mIndexField = $index;
-                       $this->mExtraSortFields = (array)$extraSort;
-               }
-
-               if ( !isset( $this->mDefaultDirection ) ) {
-                       $dir = $this->getDefaultDirections();
-                       $this->mDefaultDirection = is_array( $dir )
-                               ? $dir[$this->mOrderType]
-                               : $dir;
-               }
-       }
-
-       /**
-        * Get the Database object in use
-        *
-        * @return DatabaseBase
-        */
-       public function getDatabase() {
-               return $this->mDb;
-       }
-
-       /**
-        * Do the query, using information from the object context. This function
-        * has been kept minimal to make it overridable if necessary, to allow for
-        * result sets formed from multiple DB queries.
-        */
-       public function doQuery() {
-               # Use the child class name for profiling
-               $fname = __METHOD__ . ' (' . get_class( $this ) . ')';
-               wfProfileIn( $fname );
-
-               $descending = ( $this->mIsBackwards == $this->mDefaultDirection );
-               # Plus an extra row so that we can tell the "next" link should be shown
-               $queryLimit = $this->mLimit + 1;
-
-               if ( $this->mOffset == '' ) {
-                       $isFirst = true;
-               } else {
-                       // If there's an offset, we may or may not be at the first entry.
-                       // The only way to tell is to run the query in the opposite
-                       // direction see if we get a row.
-                       $oldIncludeOffset = $this->mIncludeOffset;
-                       $this->mIncludeOffset = !$this->mIncludeOffset;
-                       $isFirst = !$this->reallyDoQuery( $this->mOffset, 1, !$descending )->numRows();
-                       $this->mIncludeOffset = $oldIncludeOffset;
-               }
-
-               $this->mResult = $this->reallyDoQuery(
-                       $this->mOffset,
-                       $queryLimit,
-                       $descending
-               );
-
-               $this->extractResultInfo( $isFirst, $queryLimit, $this->mResult );
-               $this->mQueryDone = true;
-
-               $this->preprocessResults( $this->mResult );
-               $this->mResult->rewind(); // Paranoia
-
-               wfProfileOut( $fname );
-       }
-
-       /**
-        * @return ResultWrapper The result wrapper.
-        */
-       function getResult() {
-               return $this->mResult;
-       }
-
-       /**
-        * Set the offset from an other source than the request
-        *
-        * @param int|string $offset
-        */
-       function setOffset( $offset ) {
-               $this->mOffset = $offset;
-       }
-
-       /**
-        * Set the limit from an other source than the request
-        *
-        * Verifies limit is between 1 and 5000
-        *
-        * @param int|string $limit
-        */
-       function setLimit( $limit ) {
-               $limit = (int)$limit;
-               // WebRequest::getLimitOffset() puts a cap of 5000, so do same here.
-               if ( $limit > 5000 ) {
-                       $limit = 5000;
-               }
-               if ( $limit > 0 ) {
-                       $this->mLimit = $limit;
-               }
-       }
-
-       /**
-        * Get the current limit
-        *
-        * @return int
-        */
-       function getLimit() {
-               return $this->mLimit;
-       }
-
-       /**
-        * Set whether a row matching exactly the offset should be also included
-        * in the result or not. By default this is not the case, but when the
-        * offset is user-supplied this might be wanted.
-        *
-        * @param bool $include
-        */
-       public function setIncludeOffset( $include ) {
-               $this->mIncludeOffset = $include;
-       }
-
-       /**
-        * Extract some useful data from the result object for use by
-        * the navigation bar, put it into $this
-        *
-        * @param bool $isFirst False if there are rows before those fetched (i.e.
-        *     if a "previous" link would make sense)
-        * @param int $limit Exact query limit
-        * @param ResultWrapper $res
-        */
-       function extractResultInfo( $isFirst, $limit, ResultWrapper $res ) {
-               $numRows = $res->numRows();
-               if ( $numRows ) {
-                       # Remove any table prefix from index field
-                       $parts = explode( '.', $this->mIndexField );
-                       $indexColumn = end( $parts );
-
-                       $row = $res->fetchRow();
-                       $firstIndex = $row[$indexColumn];
-
-                       # Discard the extra result row if there is one
-                       if ( $numRows > $this->mLimit && $numRows > 1 ) {
-                               $res->seek( $numRows - 1 );
-                               $this->mPastTheEndRow = $res->fetchObject();
-                               $this->mPastTheEndIndex = $this->mPastTheEndRow->$indexColumn;
-                               $res->seek( $numRows - 2 );
-                               $row = $res->fetchRow();
-                               $lastIndex = $row[$indexColumn];
-                       } else {
-                               $this->mPastTheEndRow = null;
-                               # Setting indexes to an empty string means that they will be
-                               # omitted if they would otherwise appear in URLs. It just so
-                               # happens that this  is the right thing to do in the standard
-                               # UI, in all the relevant cases.
-                               $this->mPastTheEndIndex = '';
-                               $res->seek( $numRows - 1 );
-                               $row = $res->fetchRow();
-                               $lastIndex = $row[$indexColumn];
-                       }
-               } else {
-                       $firstIndex = '';
-                       $lastIndex = '';
-                       $this->mPastTheEndRow = null;
-                       $this->mPastTheEndIndex = '';
-               }
-
-               if ( $this->mIsBackwards ) {
-                       $this->mIsFirst = ( $numRows < $limit );
-                       $this->mIsLast = $isFirst;
-                       $this->mLastShown = $firstIndex;
-                       $this->mFirstShown = $lastIndex;
-               } else {
-                       $this->mIsFirst = $isFirst;
-                       $this->mIsLast = ( $numRows < $limit );
-                       $this->mLastShown = $lastIndex;
-                       $this->mFirstShown = $firstIndex;
-               }
-       }
-
-       /**
-        * Get some text to go in brackets in the "function name" part of the SQL comment
-        *
-        * @return string
-        */
-       function getSqlComment() {
-               return get_class( $this );
-       }
-
-       /**
-        * Do a query with specified parameters, rather than using the object
-        * context
-        *
-        * @param string $offset Index offset, inclusive
-        * @param int $limit Exact query limit
-        * @param bool $descending Query direction, false for ascending, true for descending
-        * @return ResultWrapper
-        */
-       public function reallyDoQuery( $offset, $limit, $descending ) {
-               list( $tables, $fields, $conds, $fname, $options, $join_conds ) =
-                       $this->buildQueryInfo( $offset, $limit, $descending );
-
-               return $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
-       }
-
-       /**
-        * Build variables to use by the database wrapper.
-        *
-        * @param string $offset Index offset, inclusive
-        * @param int $limit Exact query limit
-        * @param bool $descending Query direction, false for ascending, true for descending
-        * @return array
-        */
-       protected function buildQueryInfo( $offset, $limit, $descending ) {
-               $fname = __METHOD__ . ' (' . $this->getSqlComment() . ')';
-               $info = $this->getQueryInfo();
-               $tables = $info['tables'];
-               $fields = $info['fields'];
-               $conds = isset( $info['conds'] ) ? $info['conds'] : array();
-               $options = isset( $info['options'] ) ? $info['options'] : array();
-               $join_conds = isset( $info['join_conds'] ) ? $info['join_conds'] : array();
-               $sortColumns = array_merge( array( $this->mIndexField ), $this->mExtraSortFields );
-               if ( $descending ) {
-                       $options['ORDER BY'] = $sortColumns;
-                       $operator = $this->mIncludeOffset ? '>=' : '>';
-               } else {
-                       $orderBy = array();
-                       foreach ( $sortColumns as $col ) {
-                               $orderBy[] = $col . ' DESC';
-                       }
-                       $options['ORDER BY'] = $orderBy;
-                       $operator = $this->mIncludeOffset ? '<=' : '<';
-               }
-               if ( $offset != '' ) {
-                       $conds[] = $this->mIndexField . $operator . $this->mDb->addQuotes( $offset );
-               }
-               $options['LIMIT'] = intval( $limit );
-               return array( $tables, $fields, $conds, $fname, $options, $join_conds );
-       }
-
-       /**
-        * Pre-process results; useful for performing batch existence checks, etc.
-        *
-        * @param ResultWrapper $result
-        */
-       protected function preprocessResults( $result ) {
-       }
-
-       /**
-        * Get the formatted result list. Calls getStartBody(), formatRow() and
-        * getEndBody(), concatenates the results and returns them.
-        *
-        * @return string
-        */
-       public function getBody() {
-               if ( !$this->mQueryDone ) {
-                       $this->doQuery();
-               }
-
-               if ( $this->mResult->numRows() ) {
-                       # Do any special query batches before display
-                       $this->doBatchLookups();
-               }
-
-               # Don't use any extra rows returned by the query
-               $numRows = min( $this->mResult->numRows(), $this->mLimit );
-
-               $s = $this->getStartBody();
-               if ( $numRows ) {
-                       if ( $this->mIsBackwards ) {
-                               for ( $i = $numRows - 1; $i >= 0; $i-- ) {
-                                       $this->mResult->seek( $i );
-                                       $row = $this->mResult->fetchObject();
-                                       $s .= $this->formatRow( $row );
-                               }
-                       } else {
-                               $this->mResult->seek( 0 );
-                               for ( $i = 0; $i < $numRows; $i++ ) {
-                                       $row = $this->mResult->fetchObject();
-                                       $s .= $this->formatRow( $row );
-                               }
-                       }
-               } else {
-                       $s .= $this->getEmptyBody();
-               }
-               $s .= $this->getEndBody();
-               return $s;
-       }
-
-       /**
-        * Make a self-link
-        *
-        * @param string $text Text displayed on the link
-        * @param array $query Associative array of parameter to be in the query string
-        * @param string $type Value of the "rel" attribute
-        *
-        * @return string HTML fragment
-        */
-       function makeLink( $text, array $query = null, $type = null ) {
-               if ( $query === null ) {
-                       return $text;
-               }
-
-               $attrs = array();
-               if ( in_array( $type, array( 'first', 'prev', 'next', 'last' ) ) ) {
-                       # HTML5 rel attributes
-                       $attrs['rel'] = $type;
-               }
-
-               if ( $type ) {
-                       $attrs['class'] = "mw-{$type}link";
-               }
-
-               return Linker::linkKnown(
-                       $this->getTitle(),
-                       $text,
-                       $attrs,
-                       $query + $this->getDefaultQuery()
-               );
-       }
-
-       /**
-        * Called from getBody(), before getStartBody() is called and
-        * after doQuery() was called. This will be called only if there
-        * are rows in the result set.
-        *
-        * @return void
-        */
-       protected function doBatchLookups() {
-       }
-
-       /**
-        * Hook into getBody(), allows text to be inserted at the start. This
-        * will be called even if there are no rows in the result set.
-        *
-        * @return string
-        */
-       protected function getStartBody() {
-               return '';
-       }
-
-       /**
-        * Hook into getBody() for the end of the list
-        *
-        * @return string
-        */
-       protected function getEndBody() {
-               return '';
-       }
-
-       /**
-        * Hook into getBody(), for the bit between the start and the
-        * end when there are no rows
-        *
-        * @return string
-        */
-       protected function getEmptyBody() {
-               return '';
-       }
-
-       /**
-        * Get an array of query parameters that should be put into self-links.
-        * By default, all parameters passed in the URL are used, except for a
-        * short blacklist.
-        *
-        * @return array Associative array
-        */
-       function getDefaultQuery() {
-               if ( !isset( $this->mDefaultQuery ) ) {
-                       $this->mDefaultQuery = $this->getRequest()->getQueryValues();
-                       unset( $this->mDefaultQuery['title'] );
-                       unset( $this->mDefaultQuery['dir'] );
-                       unset( $this->mDefaultQuery['offset'] );
-                       unset( $this->mDefaultQuery['limit'] );
-                       unset( $this->mDefaultQuery['order'] );
-                       unset( $this->mDefaultQuery['month'] );
-                       unset( $this->mDefaultQuery['year'] );
-               }
-               return $this->mDefaultQuery;
-       }
-
-       /**
-        * Get the number of rows in the result set
-        *
-        * @return int
-        */
-       function getNumRows() {
-               if ( !$this->mQueryDone ) {
-                       $this->doQuery();
-               }
-               return $this->mResult->numRows();
-       }
-
-       /**
-        * Get a URL query array for the prev, next, first and last links.
-        *
-        * @return array
-        */
-       function getPagingQueries() {
-               if ( !$this->mQueryDone ) {
-                       $this->doQuery();
-               }
-
-               # Don't announce the limit everywhere if it's the default
-               $urlLimit = $this->mLimit == $this->mDefaultLimit ? null : $this->mLimit;
-
-               if ( $this->mIsFirst ) {
-                       $prev = false;
-                       $first = false;
-               } else {
-                       $prev = array(
-                               'dir' => 'prev',
-                               'offset' => $this->mFirstShown,
-                               'limit' => $urlLimit
-                       );
-                       $first = array( 'limit' => $urlLimit );
-               }
-               if ( $this->mIsLast ) {
-                       $next = false;
-                       $last = false;
-               } else {
-                       $next = array( 'offset' => $this->mLastShown, 'limit' => $urlLimit );
-                       $last = array( 'dir' => 'prev', 'limit' => $urlLimit );
-               }
-               return array(
-                       'prev' => $prev,
-                       'next' => $next,
-                       'first' => $first,
-                       'last' => $last
-               );
-       }
-
-       /**
-        * Returns whether to show the "navigation bar"
-        *
-        * @return bool
-        */
-       function isNavigationBarShown() {
-               if ( !$this->mQueryDone ) {
-                       $this->doQuery();
-               }
-               // Hide navigation by default if there is nothing to page
-               return !( $this->mIsFirst && $this->mIsLast );
-       }
-
-       /**
-        * Get paging links. If a link is disabled, the item from $disabledTexts
-        * will be used. If there is no such item, the unlinked text from
-        * $linkTexts will be used. Both $linkTexts and $disabledTexts are arrays
-        * of HTML.
-        *
-        * @param array $linkTexts
-        * @param array $disabledTexts
-        * @return array
-        */
-       function getPagingLinks( $linkTexts, $disabledTexts = array() ) {
-               $queries = $this->getPagingQueries();
-               $links = array();
-
-               foreach ( $queries as $type => $query ) {
-                       if ( $query !== false ) {
-                               $links[$type] = $this->makeLink(
-                                       $linkTexts[$type],
-                                       $queries[$type],
-                                       $type
-                               );
-                       } elseif ( isset( $disabledTexts[$type] ) ) {
-                               $links[$type] = $disabledTexts[$type];
-                       } else {
-                               $links[$type] = $linkTexts[$type];
-                       }
-               }
-
-               return $links;
-       }
-
-       function getLimitLinks() {
-               $links = array();
-               if ( $this->mIsBackwards ) {
-                       $offset = $this->mPastTheEndIndex;
-               } else {
-                       $offset = $this->mOffset;
-               }
-               foreach ( $this->mLimitsShown as $limit ) {
-                       $links[] = $this->makeLink(
-                               $this->getLanguage()->formatNum( $limit ),
-                               array( 'offset' => $offset, 'limit' => $limit ),
-                               'num'
-                       );
-               }
-               return $links;
-       }
-
-       /**
-        * Abstract formatting function. This should return an HTML string
-        * representing the result row $row. Rows will be concatenated and
-        * returned by getBody()
-        *
-        * @param array|stdClass $row Database row
-        * @return string
-        */
-       abstract function formatRow( $row );
-
-       /**
-        * This function should be overridden to provide all parameters
-        * needed for the main paged query. It returns an associative
-        * array with the following elements:
-        *    tables => Table(s) for passing to Database::select()
-        *    fields => Field(s) for passing to Database::select(), may be *
-        *    conds => WHERE conditions
-        *    options => option array
-        *    join_conds => JOIN conditions
-        *
-        * @return array
-        */
-       abstract function getQueryInfo();
-
-       /**
-        * This function should be overridden to return the name of the index fi-
-        * eld.  If the pager supports multiple orders, it may return an array of
-        * 'querykey' => 'indexfield' pairs, so that a request with &count=querykey
-        * will use indexfield to sort.  In this case, the first returned key is
-        * the default.
-        *
-        * Needless to say, it's really not a good idea to use a non-unique index
-        * for this!  That won't page right.
-        *
-        * @return string|array
-        */
-       abstract function getIndexField();
-
-       /**
-        * This function should be overridden to return the names of secondary columns
-        * to order by in addition to the column in getIndexField(). These fields will
-        * not be used in the pager offset or in any links for users.
-        *
-        * If getIndexField() returns an array of 'querykey' => 'indexfield' pairs then
-        * this must return a corresponding array of 'querykey' => array( fields...) pairs
-        * in order for a request with &count=querykey to use array( fields...) to sort.
-        *
-        * This is useful for pagers that GROUP BY a unique column (say page_id)
-        * and ORDER BY another (say page_len). Using GROUP BY and ORDER BY both on
-        * page_len,page_id avoids temp tables (given a page_len index). This would
-        * also work if page_id was non-unique but we had a page_len,page_id index.
-        *
-        * @return array
-        */
-       protected function getExtraSortFields() {
-               return array();
-       }
-
-       /**
-        * Return the default sorting direction: false for ascending, true for
-        * descending.  You can also have an associative array of ordertype => dir,
-        * if multiple order types are supported.  In this case getIndexField()
-        * must return an array, and the keys of that must exactly match the keys
-        * of this.
-        *
-        * For backward compatibility, this method's return value will be ignored
-        * if $this->mDefaultDirection is already set when the constructor is
-        * called, for instance if it's statically initialized.  In that case the
-        * value of that variable (which must be a boolean) will be used.
-        *
-        * Note that despite its name, this does not return the value of the
-        * $this->mDefaultDirection member variable.  That's the default for this
-        * particular instantiation, which is a single value.  This is the set of
-        * all defaults for the class.
-        *
-        * @return bool
-        */
-       protected function getDefaultDirections() {
-               return false;
-       }
-}
-
-/**
- * IndexPager with an alphabetic list and a formatted navigation bar
- * @ingroup Pager
- */
-abstract class AlphabeticPager extends IndexPager {
-
-       /**
-        * Shamelessly stolen bits from ReverseChronologicalPager,
-        * didn't want to do class magic as may be still revamped
-        *
-        * @return string HTML
-        */
-       function getNavigationBar() {
-               if ( !$this->isNavigationBarShown() ) {
-                       return '';
-               }
-
-               if ( isset( $this->mNavigationBar ) ) {
-                       return $this->mNavigationBar;
-               }
-
-               $linkTexts = array(
-                       'prev' => $this->msg( 'prevn' )->numParams( $this->mLimit )->escaped(),
-                       'next' => $this->msg( 'nextn' )->numParams( $this->mLimit )->escaped(),
-                       'first' => $this->msg( 'page_first' )->escaped(),
-                       'last' => $this->msg( 'page_last' )->escaped()
-               );
-
-               $lang = $this->getLanguage();
-
-               $pagingLinks = $this->getPagingLinks( $linkTexts );
-               $limitLinks = $this->getLimitLinks();
-               $limits = $lang->pipeList( $limitLinks );
-
-               $this->mNavigationBar = $this->msg( 'parentheses' )->rawParams(
-                       $lang->pipeList( array( $pagingLinks['first'],
-                       $pagingLinks['last'] ) ) )->escaped() . " " .
-                       $this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'],
-                               $pagingLinks['next'], $limits )->escaped();
-
-               if ( !is_array( $this->getIndexField() ) ) {
-                       # Early return to avoid undue nesting
-                       return $this->mNavigationBar;
-               }
-
-               $extra = '';
-               $first = true;
-               $msgs = $this->getOrderTypeMessages();
-               foreach ( array_keys( $msgs ) as $order ) {
-                       if ( $first ) {
-                               $first = false;
-                       } else {
-                               $extra .= $this->msg( 'pipe-separator' )->escaped();
-                       }
-
-                       if ( $order == $this->mOrderType ) {
-                               $extra .= $this->msg( $msgs[$order] )->escaped();
-                       } else {
-                               $extra .= $this->makeLink(
-                                       $this->msg( $msgs[$order] )->escaped(),
-                                       array( 'order' => $order )
-                               );
-                       }
-               }
-
-               if ( $extra !== '' ) {
-                       $extra = ' ' . $this->msg( 'parentheses' )->rawParams( $extra )->escaped();
-                       $this->mNavigationBar .= $extra;
-               }
-
-               return $this->mNavigationBar;
-       }
-
-       /**
-        * If this supports multiple order type messages, give the message key for
-        * enabling each one in getNavigationBar.  The return type is an associative
-        * array whose keys must exactly match the keys of the array returned
-        * by getIndexField(), and whose values are message keys.
-        *
-        * @return array
-        */
-       protected function getOrderTypeMessages() {
-               return null;
-       }
-}
-
-/**
- * IndexPager with a formatted navigation bar
- * @ingroup Pager
- */
-abstract class ReverseChronologicalPager extends IndexPager {
-       public $mDefaultDirection = true;
-       public $mYear;
-       public $mMonth;
-
-       function getNavigationBar() {
-               if ( !$this->isNavigationBarShown() ) {
-                       return '';
-               }
-
-               if ( isset( $this->mNavigationBar ) ) {
-                       return $this->mNavigationBar;
-               }
-
-               $linkTexts = array(
-                       'prev' => $this->msg( 'pager-newer-n' )->numParams( $this->mLimit )->escaped(),
-                       'next' => $this->msg( 'pager-older-n' )->numParams( $this->mLimit )->escaped(),
-                       'first' => $this->msg( 'histlast' )->escaped(),
-                       'last' => $this->msg( 'histfirst' )->escaped()
-               );
-
-               $pagingLinks = $this->getPagingLinks( $linkTexts );
-               $limitLinks = $this->getLimitLinks();
-               $limits = $this->getLanguage()->pipeList( $limitLinks );
-               $firstLastLinks = $this->msg( 'parentheses' )->rawParams( "{$pagingLinks['first']}" .
-                       $this->msg( 'pipe-separator' )->escaped() .
-                       "{$pagingLinks['last']}" )->escaped();
-
-               $this->mNavigationBar = $firstLastLinks . ' ' .
-                       $this->msg( 'viewprevnext' )->rawParams(
-                               $pagingLinks['prev'], $pagingLinks['next'], $limits )->escaped();
-
-               return $this->mNavigationBar;
-       }
-
-       function getDateCond( $year, $month ) {
-               $year = intval( $year );
-               $month = intval( $month );
-
-               // Basic validity checks
-               $this->mYear = $year > 0 ? $year : false;
-               $this->mMonth = ( $month > 0 && $month < 13 ) ? $month : false;
-
-               // Given an optional year and month, we need to generate a timestamp
-               // to use as "WHERE rev_timestamp <= result"
-               // Examples: year = 2006 equals < 20070101 (+000000)
-               // year=2005, month=1    equals < 20050201
-               // year=2005, month=12   equals < 20060101
-               if ( !$this->mYear && !$this->mMonth ) {
-                       return;
-               }
-
-               if ( $this->mYear ) {
-                       $year = $this->mYear;
-               } else {
-                       // If no year given, assume the current one
-                       $timestamp = MWTimestamp::getInstance();
-                       $year = $timestamp->format( 'Y' );
-                       // If this month hasn't happened yet this year, go back to last year's month
-                       if ( $this->mMonth > $timestamp->format( 'n' ) ) {
-                               $year--;
-                       }
-               }
-
-               if ( $this->mMonth ) {
-                       $month = $this->mMonth + 1;
-                       // For December, we want January 1 of the next year
-                       if ( $month > 12 ) {
-                               $month = 1;
-                               $year++;
-                       }
-               } else {
-                       // No month implies we want up to the end of the year in question
-                       $month = 1;
-                       $year++;
-               }
-
-               // Y2K38 bug
-               if ( $year > 2032 ) {
-                       $year = 2032;
-               }
-
-               $ymd = (int)sprintf( "%04d%02d01", $year, $month );
-
-               if ( $ymd > 20320101 ) {
-                       $ymd = 20320101;
-               }
-
-               $this->mOffset = $this->mDb->timestamp( "${ymd}000000" );
-       }
-}
-
-/**
- * Table-based display with a user-selectable sort order
- * @ingroup Pager
- */
-abstract class TablePager extends IndexPager {
-       protected $mSort;
-
-       protected $mCurrentRow;
-
-       public function __construct( IContextSource $context = null ) {
-               if ( $context ) {
-                       $this->setContext( $context );
-               }
-
-               $this->mSort = $this->getRequest()->getText( 'sort' );
-               if ( !array_key_exists( $this->mSort, $this->getFieldNames() )
-                       || !$this->isFieldSortable( $this->mSort )
-               ) {
-                       $this->mSort = $this->getDefaultSort();
-               }
-               if ( $this->getRequest()->getBool( 'asc' ) ) {
-                       $this->mDefaultDirection = false;
-               } elseif ( $this->getRequest()->getBool( 'desc' ) ) {
-                       $this->mDefaultDirection = true;
-               } /* Else leave it at whatever the class default is */
-
-               parent::__construct();
-       }
-
-       /**
-        * @protected
-        * @return string
-        */
-       function getStartBody() {
-               global $wgStylePath;
-               $sortClass = $this->getSortHeaderClass();
-
-               $s = '';
-               $fields = $this->getFieldNames();
-
-               # Make table header
-               foreach ( $fields as $field => $name ) {
-                       if ( strval( $name ) == '' ) {
-                               $s .= Html::rawElement( 'th', array(), '&#160;' ) . "\n";
-                       } elseif ( $this->isFieldSortable( $field ) ) {
-                               $query = array( 'sort' => $field, 'limit' => $this->mLimit );
-                               if ( $field == $this->mSort ) {
-                                       # This is the sorted column
-                                       # Prepare a link that goes in the other sort order
-                                       if ( $this->mDefaultDirection ) {
-                                               # Descending
-                                               $image = 'Arr_d.png';
-                                               $query['asc'] = '1';
-                                               $query['desc'] = '';
-                                               $alt = $this->msg( 'descending_abbrev' )->escaped();
-                                       } else {
-                                               # Ascending
-                                               $image = 'Arr_u.png';
-                                               $query['asc'] = '';
-                                               $query['desc'] = '1';
-                                               $alt = $this->msg( 'ascending_abbrev' )->escaped();
-                                       }
-                                       $image = "$wgStylePath/common/images/$image";
-                                       $link = $this->makeLink(
-                                               Html::element( 'img', array( 'width' => 12, 'height' => 12,
-                                                       'alt' => $alt, 'src' => $image ) ) . htmlspecialchars( $name ), $query );
-                                       $s .= Html::rawElement( 'th', array( 'class' => $sortClass ), $link ) . "\n";
-                               } else {
-                                       $s .= Html::rawElement( 'th', array(),
-                                               $this->makeLink( htmlspecialchars( $name ), $query ) ) . "\n";
-                               }
-                       } else {
-                               $s .= Html::element( 'th', array(), $name ) . "\n";
-                       }
-               }
-
-               $tableClass = $this->getTableClass();
-               $ret = Html::openElement( 'table', array(
-                       'style' => 'border:1px;',
-                       'class' => "mw-datatable $tableClass" )
-               );
-               $ret .= Html::rawElement( 'thead', array(), Html::rawElement( 'tr', array(), "\n" . $s . "\n" ) );
-               $ret .= Html::openElement( 'tbody' ) . "\n";
-
-               return $ret;
-       }
-
-       /**
-        * @protected
-        * @return string
-        */
-       function getEndBody() {
-               return "</tbody></table>\n";
-       }
-
-       /**
-        * @protected
-        * @return string
-        */
-       function getEmptyBody() {
-               $colspan = count( $this->getFieldNames() );
-               $msgEmpty = $this->msg( 'table_pager_empty' )->text();
-               return Html::rawElement( 'tr', array(),
-                       Html::element( 'td', array( 'colspan' => $colspan ), $msgEmpty ) );
-       }
-
-       /**
-        * @protected
-        * @param stdClass $row
-        * @return string HTML
-        */
-       function formatRow( $row ) {
-               $this->mCurrentRow = $row; // In case formatValue etc need to know
-               $s = Html::openElement( 'tr', $this->getRowAttrs( $row ) ) . "\n";
-               $fieldNames = $this->getFieldNames();
-
-               foreach ( $fieldNames as $field => $name ) {
-                       $value = isset( $row->$field ) ? $row->$field : null;
-                       $formatted = strval( $this->formatValue( $field, $value ) );
-
-                       if ( $formatted == '' ) {
-                               $formatted = '&#160;';
-                       }
-
-                       $s .= Html::rawElement( 'td', $this->getCellAttrs( $field, $value ), $formatted ) . "\n";
-               }
-
-               $s .= Html::closeElement( 'tr' ) . "\n";
-
-               return $s;
-       }
-
-       /**
-        * Get a class name to be applied to the given row.
-        *
-        * @protected
-        *
-        * @param object $row The database result row
-        * @return string
-        */
-       function getRowClass( $row ) {
-               return '';
-       }
-
-       /**
-        * Get attributes to be applied to the given row.
-        *
-        * @protected
-        *
-        * @param object $row The database result row
-        * @return array Array of attribute => value
-        */
-       function getRowAttrs( $row ) {
-               $class = $this->getRowClass( $row );
-               if ( $class === '' ) {
-                       // Return an empty array to avoid clutter in HTML like class=""
-                       return array();
-               } else {
-                       return array( 'class' => $this->getRowClass( $row ) );
-               }
-       }
-
-       /**
-        * Get any extra attributes to be applied to the given cell. Don't
-        * take this as an excuse to hardcode styles; use classes and
-        * CSS instead.  Row context is available in $this->mCurrentRow
-        *
-        * @protected
-        *
-        * @param string $field The column
-        * @param string $value The cell contents
-        * @return array Array of attr => value
-        */
-       function getCellAttrs( $field, $value ) {
-               return array( 'class' => 'TablePager_col_' . $field );
-       }
-
-       /**
-        * @protected
-        * @return string
-        */
-       function getIndexField() {
-               return $this->mSort;
-       }
-
-       /**
-        * @protected
-        * @return string
-        */
-       function getTableClass() {
-               return 'TablePager';
-       }
-
-       /**
-        * @protected
-        * @return string
-        */
-       function getNavClass() {
-               return 'TablePager_nav';
-       }
-
-       /**
-        * @protected
-        * @return string
-        */
-       function getSortHeaderClass() {
-               return 'TablePager_sort';
-       }
-
-       /**
-        * A navigation bar with images
-        * @return string HTML
-        */
-       public function getNavigationBar() {
-               global $wgStylePath;
-
-               if ( !$this->isNavigationBarShown() ) {
-                       return '';
-               }
-
-               $path = "$wgStylePath/common/images";
-               $labels = array(
-                       'first' => 'table_pager_first',
-                       'prev' => 'table_pager_prev',
-                       'next' => 'table_pager_next',
-                       'last' => 'table_pager_last',
-               );
-               $images = array(
-                       'first' => 'arrow_first_25.png',
-                       'prev' => 'arrow_left_25.png',
-                       'next' => 'arrow_right_25.png',
-                       'last' => 'arrow_last_25.png',
-               );
-               $disabledImages = array(
-                       'first' => 'arrow_disabled_first_25.png',
-                       'prev' => 'arrow_disabled_left_25.png',
-                       'next' => 'arrow_disabled_right_25.png',
-                       'last' => 'arrow_disabled_last_25.png',
-               );
-               if ( $this->getLanguage()->isRTL() ) {
-                       $keys = array_keys( $labels );
-                       $images = array_combine( $keys, array_reverse( $images ) );
-                       $disabledImages = array_combine( $keys, array_reverse( $disabledImages ) );
-               }
-
-               $linkTexts = array();
-               $disabledTexts = array();
-               foreach ( $labels as $type => $label ) {
-                       $msgLabel = $this->msg( $label )->escaped();
-                       $linkTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$images[$type]}",
-                               'alt' => $msgLabel ) ) . "<br />$msgLabel";
-                       $disabledTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$disabledImages[$type]}",
-                               'alt' => $msgLabel ) ) . "<br />$msgLabel";
-               }
-               $links = $this->getPagingLinks( $linkTexts, $disabledTexts );
-
-               $s = Html::openElement( 'table', array( 'class' => $this->getNavClass() ) );
-               $s .= Html::openElement( 'tr' ) . "\n";
-               $width = 100 / count( $links ) . '%';
-               foreach ( $labels as $type => $label ) {
-                       $s .= Html::rawElement( 'td', array( 'style' => "width:$width;" ), $links[$type] ) . "\n";
-               }
-               $s .= Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n";
-               return $s;
-       }
-
-       /**
-        * Get a "<select>" element which has options for each of the allowed limits
-        *
-        * @param string $attribs Extra attributes to set
-        * @return string HTML fragment
-        */
-       public function getLimitSelect( $attribs = array() ) {
-               $select = new XmlSelect( 'limit', false, $this->mLimit );
-               $select->addOptions( $this->getLimitSelectList() );
-               foreach ( $attribs as $name => $value ) {
-                       $select->setAttribute( $name, $value );
-               }
-               return $select->getHTML();
-       }
-
-       /**
-        * Get a list of items to show in a "<select>" element of limits.
-        * This can be passed directly to XmlSelect::addOptions().
-        *
-        * @since 1.22
-        * @return array
-        */
-       public function getLimitSelectList() {
-               # Add the current limit from the query string
-               # to avoid that the limit is lost after clicking Go next time
-               if ( !in_array( $this->mLimit, $this->mLimitsShown ) ) {
-                       $this->mLimitsShown[] = $this->mLimit;
-                       sort( $this->mLimitsShown );
-               }
-               $ret = array();
-               foreach ( $this->mLimitsShown as $key => $value ) {
-                       # The pair is either $index => $limit, in which case the $value
-                       # will be numeric, or $limit => $text, in which case the $value
-                       # will be a string.
-                       if ( is_int( $value ) ) {
-                               $limit = $value;
-                               $text = $this->getLanguage()->formatNum( $limit );
-                       } else {
-                               $limit = $key;
-                               $text = $value;
-                       }
-                       $ret[$text] = $limit;
-               }
-               return $ret;
-       }
-
-       /**
-        * Get \<input type="hidden"\> elements for use in a method="get" form.
-        * Resubmits all defined elements of the query string, except for a
-        * blacklist, passed in the $blacklist parameter.
-        *
-        * @param array $blacklist Parameters from the request query which should not be resubmitted
-        * @return string HTML fragment
-        */
-       function getHiddenFields( $blacklist = array() ) {
-               $blacklist = (array)$blacklist;
-               $query = $this->getRequest()->getQueryValues();
-               foreach ( $blacklist as $name ) {
-                       unset( $query[$name] );
-               }
-               $s = '';
-               foreach ( $query as $name => $value ) {
-                       $s .= Html::hidden( $name, $value ) . "\n";
-               }
-               return $s;
-       }
-
-       /**
-        * Get a form containing a limit selection dropdown
-        *
-        * @return string HTML fragment
-        */
-       function getLimitForm() {
-               global $wgScript;
-
-               return Html::rawElement(
-                       'form',
-                       array(
-                               'method' => 'get',
-                               'action' => $wgScript
-                       ),
-                       "\n" . $this->getLimitDropdown()
-               ) . "\n";
-       }
-
-       /**
-        * Gets a limit selection dropdown
-        *
-        * @return string
-        */
-       function getLimitDropdown() {
-               # Make the select with some explanatory text
-               $msgSubmit = $this->msg( 'table_pager_limit_submit' )->escaped();
-
-               return $this->msg( 'table_pager_limit' )
-                       ->rawParams( $this->getLimitSelect() )->escaped() .
-                       "\n<input type=\"submit\" value=\"$msgSubmit\"/>\n" .
-                       $this->getHiddenFields( array( 'limit' ) );
-       }
-
-       /**
-        * Return true if the named field should be sortable by the UI, false
-        * otherwise
-        *
-        * @param string $field
-        */
-       abstract function isFieldSortable( $field );
-
-       /**
-        * Format a table cell. The return value should be HTML, but use an empty
-        * string not &#160; for empty cells. Do not include the <td> and </td>.
-        *
-        * The current result row is available as $this->mCurrentRow, in case you
-        * need more context.
-        *
-        * @protected
-        *
-        * @param string $name The database field name
-        * @param string $value The value retrieved from the database
-        */
-       abstract function formatValue( $name, $value );
-
-       /**
-        * The database field name used as a default sort order.
-        *
-        * @protected
-        *
-        * @return string
-        */
-       abstract function getDefaultSort();
-
-       /**
-        * An array mapping database field names to a textual description of the
-        * field name, for use in the table header. The description should be plain
-        * text, it will be HTML-escaped later.
-        *
-        * @return array
-        */
-       abstract function getFieldNames();
-}
index eb29e41..582a4a5 100644 (file)
@@ -113,8 +113,7 @@ class Preferences {
         */
        static function loadPreferenceValues( $user, $context, &$defaultPreferences ) {
                ## Remove preferences that wikis don't want to use
-               global $wgHiddenPrefs;
-               foreach ( $wgHiddenPrefs as $pref ) {
+               foreach ( $context->getConfig()->get( 'HiddenPrefs' ) as $pref ) {
                        if ( isset( $defaultPreferences[$pref] ) ) {
                                unset( $defaultPreferences[$pref] );
                        }
@@ -207,12 +206,9 @@ class Preferences {
         * @return void
         */
        static function profilePreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               global $wgAuth, $wgContLang, $wgParser, $wgLanguageCode,
-                       $wgDisableLangConversion, $wgMaxSigChars,
-                       $wgEnableEmail, $wgEmailConfirmToEdit, $wgEnableUserEmail, $wgEmailAuthentication,
-                       $wgEnotifWatchlist, $wgEnotifUserTalk, $wgEnotifRevealEditorAddress,
-                       $wgSecureLogin;
+               global $wgAuth, $wgContLang, $wgParser;
 
+               $config = $context->getConfig();
                // retrieving user name for GENDER and misc.
                $userName = $user->getName();
 
@@ -310,7 +306,7 @@ class Preferences {
                        );
                }
                // Only show prefershttps if secure login is turned on
-               if ( $wgSecureLogin && wfCanIPUseHTTPS( $context->getRequest()->getIP() ) ) {
+               if ( $config->get( 'SecureLogin' ) && wfCanIPUseHTTPS( $context->getRequest()->getIP() ) ) {
                        $defaultPreferences['prefershttps'] = array(
                                'type' => 'toggle',
                                'label-message' => 'tog-prefershttps',
@@ -321,8 +317,9 @@ class Preferences {
 
                // Language
                $languages = Language::fetchLanguageNames( null, 'mw' );
-               if ( !array_key_exists( $wgLanguageCode, $languages ) ) {
-                       $languages[$wgLanguageCode] = $wgLanguageCode;
+               $languageCode = $config->get( 'LanguageCode' );
+               if ( !array_key_exists( $languageCode, $languages ) ) {
+                       $languages[$languageCode] = $languageCode;
                }
                ksort( $languages );
 
@@ -353,7 +350,7 @@ class Preferences {
                );
 
                // see if there are multiple language variants to choose from
-               if ( !$wgDisableLangConversion ) {
+               if ( !$config->get( 'DisableLangConversion' ) ) {
                        foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
                                if ( $langCode == $wgContLang->getCode() ) {
                                        $variants = $wgContLang->getVariants();
@@ -418,7 +415,7 @@ class Preferences {
                );
                $defaultPreferences['nickname'] = array(
                        'type' => $wgAuth->allowPropChange( 'nickname' ) ? 'text' : 'info',
-                       'maxlength' => $wgMaxSigChars,
+                       'maxlength' => $config->get( 'MaxSigChars' ),
                        'label-message' => 'yournick',
                        'validation-callback' => array( 'Preferences', 'validateSignature' ),
                        'section' => 'personal/signature',
@@ -434,13 +431,13 @@ class Preferences {
 
                ## Email stuff
 
-               if ( $wgEnableEmail ) {
+               if ( $config->get( 'EnableEmail' ) ) {
                        if ( $canViewPrivateInfo ) {
-                               $helpMessages[] = $wgEmailConfirmToEdit
+                               $helpMessages[] = $config->get( 'EmailConfirmToEdit' )
                                                ? 'prefs-help-email-required'
                                                : 'prefs-help-email';
 
-                               if ( $wgEnableUserEmail ) {
+                               if ( $config->get( 'EnableUserEmail' ) ) {
                                        // additional messages when users can send email to each other
                                        $helpMessages[] = 'prefs-help-email-others';
                                }
@@ -472,7 +469,7 @@ class Preferences {
 
                        $disableEmailPrefs = false;
 
-                       if ( $wgEmailAuthentication ) {
+                       if ( $config->get( 'EmailAuthentication' ) ) {
                                $emailauthenticationclass = 'mw-email-not-authenticated';
                                if ( $user->getEmail() ) {
                                        if ( $user->getEmailAuthenticationTimestamp() ) {
@@ -517,7 +514,7 @@ class Preferences {
                                }
                        }
 
-                       if ( $wgEnableUserEmail && $user->isAllowed( 'sendemail' ) ) {
+                       if ( $config->get( 'EnableUserEmail' ) && $user->isAllowed( 'sendemail' ) ) {
                                $defaultPreferences['disablemail'] = array(
                                        'type' => 'toggle',
                                        'invert' => true,
@@ -533,7 +530,7 @@ class Preferences {
                                );
                        }
 
-                       if ( $wgEnotifWatchlist ) {
+                       if ( $config->get( 'EnotifWatchlist' ) ) {
                                $defaultPreferences['enotifwatchlistpages'] = array(
                                        'type' => 'toggle',
                                        'section' => 'personal/email',
@@ -541,7 +538,7 @@ class Preferences {
                                        'disabled' => $disableEmailPrefs,
                                );
                        }
-                       if ( $wgEnotifUserTalk ) {
+                       if ( $config->get( 'EnotifUserTalk' ) ) {
                                $defaultPreferences['enotifusertalkpages'] = array(
                                        'type' => 'toggle',
                                        'section' => 'personal/email',
@@ -549,7 +546,7 @@ class Preferences {
                                        'disabled' => $disableEmailPrefs,
                                );
                        }
-                       if ( $wgEnotifUserTalk || $wgEnotifWatchlist ) {
+                       if ( $config->get( 'EnotifUserTalk' ) || $config->get( 'EnotifWatchlist' ) ) {
                                $defaultPreferences['enotifminoredits'] = array(
                                        'type' => 'toggle',
                                        'section' => 'personal/email',
@@ -557,7 +554,7 @@ class Preferences {
                                        'disabled' => $disableEmailPrefs,
                                );
 
-                               if ( $wgEnotifRevealEditorAddress ) {
+                               if ( $config->get( 'EnotifRevealEditorAddress' ) ) {
                                        $defaultPreferences['enotifrevealaddr'] = array(
                                                'type' => 'toggle',
                                                'section' => 'personal/email',
@@ -577,7 +574,6 @@ class Preferences {
         */
        static function skinPreferences( $user, IContextSource $context, &$defaultPreferences ) {
                ## Skin #####################################
-               global $wgAllowUserCss, $wgAllowUserJs;
 
                // Skin selector, if there is at least one valid skin
                $skinOptions = self::generateSkinOptions( $user, $context );
@@ -590,19 +586,22 @@ class Preferences {
                        );
                }
 
+               $config = $context->getConfig();
+               $allowUserCss = $config->get( 'AllowUserCss' );
+               $allowUserJs = $config->get( 'AllowUserJs' );
                # Create links to user CSS/JS pages for all skins
                # This code is basically copied from generateSkinOptions().  It'd
                # be nice to somehow merge this back in there to avoid redundancy.
-               if ( $wgAllowUserCss || $wgAllowUserJs ) {
+               if ( $allowUserCss || $allowUserJs ) {
                        $linkTools = array();
                        $userName = $user->getName();
 
-                       if ( $wgAllowUserCss ) {
+                       if ( $allowUserCss ) {
                                $cssPage = Title::makeTitleSafe( NS_USER, $userName . '/common.css' );
                                $linkTools[] = Linker::link( $cssPage, $context->msg( 'prefs-custom-css' )->escaped() );
                        }
 
-                       if ( $wgAllowUserJs ) {
+                       if ( $allowUserJs ) {
                                $jsPage = Title::makeTitleSafe( NS_USER, $userName . '/common.js' );
                                $linkTools[] = Linker::link( $jsPage, $context->msg( 'prefs-custom-js' )->escaped() );
                        }
@@ -707,6 +706,7 @@ class Preferences {
                        'options' => $tzOptions,
                        'default' => $tzSetting,
                        'size' => 20,
+                       'maxlength' => 6,
                        'section' => 'rendering/timeoffset',
                );
        }
@@ -730,8 +730,7 @@ class Preferences {
                );
 
                ## Page Rendering ##############################
-               global $wgAllowUserCssPrefs;
-               if ( $wgAllowUserCssPrefs ) {
+               if ( $context->getConfig()->get( 'AllowUserCssPrefs' ) ) {
                        $defaultPreferences['underline'] = array(
                                'type' => 'select',
                                'options' => array(
@@ -776,8 +775,6 @@ class Preferences {
         * @param array $defaultPreferences
         */
        static function editingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               global $wgAllowUserCssPrefs;
-
                ## Editing #####################################
                $defaultPreferences['editsectiononrightclick'] = array(
                        'type' => 'toggle',
@@ -790,7 +787,7 @@ class Preferences {
                        'label-message' => 'tog-editondblclick',
                );
 
-               if ( $wgAllowUserCssPrefs ) {
+               if ( $context->getConfig()->get( 'AllowUserCssPrefs' ) ) {
                        $defaultPreferences['editfont'] = array(
                                'type' => 'select',
                                'section' => 'editing/editor',
@@ -864,17 +861,17 @@ class Preferences {
         * @param array $defaultPreferences
         */
        static function rcPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               global $wgRCMaxAge, $wgRCShowWatchingUsers;
-
+               $config = $context->getConfig();
+               $rcMaxAge = $config->get( 'RCMaxAge' );
                ## RecentChanges #####################################
                $defaultPreferences['rcdays'] = array(
                        'type' => 'float',
                        'label-message' => 'recentchangesdays',
                        'section' => 'rc/displayrc',
                        'min' => 1,
-                       'max' => ceil( $wgRCMaxAge / ( 3600 * 24 ) ),
+                       'max' => ceil( $rcMaxAge / ( 3600 * 24 ) ),
                        'help' => $context->msg( 'recentchangesdays-max' )->numParams(
-                               ceil( $wgRCMaxAge / ( 3600 * 24 ) ) )->text()
+                               ceil( $rcMaxAge / ( 3600 * 24 ) ) )->text()
                );
                $defaultPreferences['rclimit'] = array(
                        'type' => 'int',
@@ -906,7 +903,7 @@ class Preferences {
                        );
                }
 
-               if ( $wgRCShowWatchingUsers ) {
+               if ( $config->get( 'RCShowWatchingUsers' ) ) {
                        $defaultPreferences['shownumberswatching'] = array(
                                'type' => 'toggle',
                                'section' => 'rc/advancedrc',
@@ -921,9 +918,8 @@ class Preferences {
         * @param array $defaultPreferences
         */
        static function watchlistPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               global $wgUseRCPatrol, $wgEnableAPI, $wgRCMaxAge;
-
-               $watchlistdaysMax = ceil( $wgRCMaxAge / ( 3600 * 24 ) );
+               $config = $context->getConfig();
+               $watchlistdaysMax = ceil( $config->get( 'RCMaxAge' ) / ( 3600 * 24 ) );
 
                ## Watchlist #####################################
                $defaultPreferences['watchlistdays'] = array(
@@ -974,7 +970,7 @@ class Preferences {
                        'label-message' => 'tog-watchlisthideliu',
                );
 
-               if ( $wgUseRCPatrol ) {
+               if ( $context->getConfig()->get( 'UseRCPatrol' ) ) {
                        $defaultPreferences['watchlisthidepatrolled'] = array(
                                'type' => 'toggle',
                                'section' => 'watchlist/advancedwatchlist',
@@ -1010,7 +1006,7 @@ class Preferences {
                        }
                }
 
-               if ( $wgEnableAPI ) {
+               if ( $config->get( 'EnableAPI' ) ) {
                        $defaultPreferences['watchlisttoken'] = array(
                                'type' => 'api',
                        );
@@ -1049,7 +1045,6 @@ class Preferences {
         * @return array Text/links to display as key; $skinkey as value
         */
        static function generateSkinOptions( $user, IContextSource $context ) {
-               global $wgDefaultSkin, $wgAllowUserCss, $wgAllowUserJs;
                $ret = array();
 
                $mptitle = Title::newMainPage();
@@ -1068,12 +1063,17 @@ class Preferences {
                }
                asort( $validSkinNames );
 
+               $config = $context->getConfig();
+               $defaultSkin = $config->get( 'DefaultSkin' );
+               $allowUserCss = $config->get( 'AllowUserCss' );
+               $allowUserJs = $config->get( 'AllowUserJs' );
+
                $foundDefault = false;
                foreach ( $validSkinNames as $skinkey => $sn ) {
                        $linkTools = array();
 
                        # Mark the default skin
-                       if ( $skinkey == $wgDefaultSkin ) {
+                       if ( $skinkey == $defaultSkin ) {
                                $linkTools[] = $context->msg( 'default' )->escaped();
                                $foundDefault = true;
                        }
@@ -1083,12 +1083,12 @@ class Preferences {
                        $linkTools[] = "<a target='_blank' href=\"$mplink\">$previewtext</a>";
 
                        # Create links to user CSS/JS pages
-                       if ( $wgAllowUserCss ) {
+                       if ( $allowUserCss ) {
                                $cssPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/' . $skinkey . '.css' );
                                $linkTools[] = Linker::link( $cssPage, $context->msg( 'prefs-custom-css' )->escaped() );
                        }
 
-                       if ( $wgAllowUserJs ) {
+                       if ( $allowUserJs ) {
                                $jsPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/' . $skinkey . '.js' );
                                $linkTools[] = Linker::link( $jsPage, $context->msg( 'prefs-custom-js' )->escaped() );
                        }
@@ -1125,7 +1125,7 @@ class Preferences {
                                                                                // Bug 19237
                        }
 
-                       // KLUGE: site default might not be valid for user language
+                       // FIXME KLUGE: site default might not be valid for user language
                        global $wgDefaultUserOptions;
                        if ( !in_array( $wgDefaultUserOptions['date'], $dateopts ) ) {
                                $wgDefaultUserOptions['date'] = 'default';
@@ -1149,12 +1149,10 @@ class Preferences {
         * @return array
         */
        static function getImageSizes( IContextSource $context ) {
-               global $wgImageLimits;
-
                $ret = array();
                $pixels = $context->msg( 'unit-pixel' )->text();
 
-               foreach ( $wgImageLimits as $index => $limits ) {
+               foreach ( $context->getConfig()->get( 'ImageLimits' ) as $index => $limits ) {
                        $display = "{$limits[0]}×{$limits[1]}" . $pixels;
                        $ret[$display] = $index;
                }
@@ -1167,12 +1165,10 @@ class Preferences {
         * @return array
         */
        static function getThumbSizes( IContextSource $context ) {
-               global $wgThumbLimits;
-
                $ret = array();
                $pixels = $context->msg( 'unit-pixel' )->text();
 
-               foreach ( $wgThumbLimits as $index => $size ) {
+               foreach ( $context->getConfig()->get( 'ThumbLimits' ) as $index => $size ) {
                        $display = $size . $pixels;
                        $ret[$display] = $index;
                }
@@ -1187,10 +1183,11 @@ class Preferences {
         * @return bool|string
         */
        static function validateSignature( $signature, $alldata, $form ) {
-               global $wgParser, $wgMaxSigChars;
-               if ( mb_strlen( $signature ) > $wgMaxSigChars ) {
+               global $wgParser;
+               $maxSigChars = $form->getConfig()->get( 'MaxSigChars' );
+               if ( mb_strlen( $signature ) > $maxSigChars ) {
                        return Xml::element( 'span', array( 'class' => 'error' ),
-                               $form->msg( 'badsiglength' )->numParams( $wgMaxSigChars )->text() );
+                               $form->msg( 'badsiglength' )->numParams( $maxSigChars )->text() );
                } elseif ( isset( $alldata['fancysig'] ) &&
                                $alldata['fancysig'] &&
                                $wgParser->validateSig( $signature ) === false
@@ -1272,10 +1269,10 @@ class Preferences {
        static function getTimezoneOptions( IContextSource $context ) {
                $opt = array();
 
-               global $wgLocalTZoffset;
+               $localTZoffset = $context->getConfig()->get( 'LocalTZoffset' );
                $timestamp = MWTimestamp::getLocalInstance();
-               // Check that $wgLocalTZoffset is the same as the local time zone offset
-               if ( $wgLocalTZoffset == $timestamp->format( 'Z' ) / 60 ) {
+               // Check that the LocalTZoffset is the same as the local time zone offset
+               if ( $localTZoffset == $timestamp->format( 'Z' ) / 60 ) {
                        $server_tz_msg = $context->msg(
                                'timezoneuseserverdefault',
                                $timestamp->getTimezone()->getName()
@@ -1283,12 +1280,12 @@ class Preferences {
                } else {
                        $tzstring = sprintf(
                                '%+03d:%02d',
-                               floor( $wgLocalTZoffset / 60 ),
-                               abs( $wgLocalTZoffset ) % 60
+                               floor( $localTZoffset / 60 ),
+                               abs( $localTZoffset ) % 60
                        );
                        $server_tz_msg = $context->msg( 'timezoneuseserverdefault', $tzstring )->text();
                }
-               $opt[$server_tz_msg] = "System|$wgLocalTZoffset";
+               $opt[$server_tz_msg] = "System|$localTZoffset";
                $opt[$context->msg( 'timezoneuseoffset' )->text()] = 'other';
                $opt[$context->msg( 'guesstimezone' )->text()] = 'guess';
 
@@ -1388,9 +1385,10 @@ class Preferences {
         * @return bool|Status|string
         */
        static function tryFormSubmit( $formData, $form ) {
-               global $wgHiddenPrefs, $wgAuth;
+               global $wgAuth;
 
                $user = $form->getModifiedUser();
+               $hiddenPrefs = $form->getConfig()->get( 'HiddenPrefs' );
                $result = true;
 
                if ( !$user->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
@@ -1407,7 +1405,7 @@ class Preferences {
 
                // Fortunately, the realname field is MUCH simpler
                // (not really "private", but still shouldn't be edited without permission)
-               if ( !in_array( 'realname', $wgHiddenPrefs )
+               if ( !in_array( 'realname', $hiddenPrefs )
                        && $user->isAllowed( 'editmyprivateinfo' )
                        && array_key_exists( 'realname', $formData )
                ) {
@@ -1423,7 +1421,7 @@ class Preferences {
                        # If users have saved a value for a preference which has subsequently been disabled
                        # via $wgHiddenPrefs, we don't want to destroy that setting in case the preference
                        # is subsequently re-enabled
-                       foreach ( $wgHiddenPrefs as $pref ) {
+                       foreach ( $hiddenPrefs as $pref ) {
                                # If the user has not set a non-default value here, the default will be returned
                                # and subsequently discarded
                                $formData[$pref] = $user->getOption( $pref, null, true );
@@ -1469,28 +1467,6 @@ class Preferences {
 
                return Status::newGood();
        }
-
-       /**
-        * Try to set a user's email address.
-        * This does *not* try to validate the address.
-        * Caller is responsible for checking $wgAuth and 'editmyprivateinfo'
-        * right.
-        *
-        * @deprecated since 1.20; use User::setEmailWithConfirmation() instead.
-        * @param User $user
-        * @param string $newaddr New email address
-        * @return array (true on success or Status on failure, info string)
-        */
-       public static function trySetUserEmail( User $user, $newaddr ) {
-               wfDeprecated( __METHOD__, '1.20' );
-
-               $result = $user->setEmailWithConfirmation( $newaddr );
-               if ( $result->isGood() ) {
-                       return array( true, $result->value );
-               } else {
-                       return array( $result, 'mailerror' );
-               }
-       }
 }
 
 /** Some tweaks to allow js prefs to work */
@@ -1542,6 +1518,9 @@ class PreferencesForm extends HTMLForm {
         * @return string
         */
        function getButtons() {
+
+               $attrs = array( 'id' => 'mw-prefs-restoreprefs' );
+
                if ( !$this->getModifiedUser()->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
                        return '';
                }
@@ -1551,7 +1530,8 @@ class PreferencesForm extends HTMLForm {
                if ( $this->getModifiedUser()->isAllowed( 'editmyoptions' ) ) {
                        $t = SpecialPage::getTitleFor( 'Preferences', 'reset' );
 
-                       $html .= "\n" . Linker::link( $t, $this->msg( 'restoreprefs' )->escaped() );
+                       $html .= "\n" . Linker::link( $t, $this->msg( 'restoreprefs' )->escaped(),
+                               Html::buttonAttributes( $attrs, array( 'mw-ui-quiet' ) ) );
 
                        $html = Xml::tags( 'div', array( 'class' => 'mw-prefs-buttons' ), $html );
                }
index 35be2a9..fe78e23 100644 (file)
@@ -63,8 +63,7 @@ abstract class PrefixSearch {
                        if ( $ns[0] == NS_MAIN ) {
                                $ns = $namespaces; // no explicit prefix, use default namespaces
                        }
-                       return $this->searchBackend(
-                               $ns, $title->getText(), $limit );
+                       return $this->searchBackend( $ns, $title->getText(), $limit );
                }
 
                // Is this a namespace prefix?
@@ -152,7 +151,31 @@ abstract class PrefixSearch {
                $srchres = array();
                if ( wfRunHooks( 'PrefixSearchBackend', array( $namespaces, $search, $limit, &$srchres ) ) ) {
                        return $this->titles( $this->defaultSearchBackend( $namespaces, $search, $limit ) );
+               } else {
+                       // Default search backend does proper prefix searching, but custom backends
+                       // may sort based on other algorythms that may cause the exact title match
+                       // to not be in the results or be lower down the list.
+
+                       // Pick namespace (based on PrefixSearch::defaultSearchBackend)
+                       $ns = in_array( NS_MAIN, $namespaces ) ? NS_MAIN : $namespaces[0];
+                       $t = Title::newFromText( $search, $ns );
+                       $string = $t->getPrefixedText();
+
+                       $key = array_search( $string, $srchres );
+                       if ( $key !== false ) {
+                               // Move it to the front
+                               $cut = array_splice( $srchres, $key, 1 );
+                               array_unshift( $srchres, $cut[0] );
+                       } elseif ( $t->exists() ) {
+                               // Add it in front
+                               array_unshift( $srchres, $string );
+
+                               if ( count( $srchres ) > $limit ) {
+                                       array_pop( $srchres );
+                               }
+                       }
                }
+
                return $this->strings( $srchres );
        }
 
@@ -174,6 +197,9 @@ abstract class PrefixSearch {
                if ( $subpageSearch !== null ) {
                        // Try matching the full search string as a page name
                        $specialTitle = Title::makeTitleSafe( NS_SPECIAL, $searchKey );
+                       if ( !$specialTitle ) {
+                               return array();
+                       }
                        $special = SpecialPageFactory::getPage( $specialTitle->getText() );
                        if ( $special ) {
                                $subpages = $special->prefixSearchSubpages( $subpageSearch, $limit );
@@ -192,12 +218,12 @@ abstract class PrefixSearch {
                // Unlike SpecialPage itself, we want the canonical forms of both
                // canonical and alias title forms...
                $keys = array();
-               foreach ( SpecialPageFactory::getList() as $page => $class ) {
+               foreach ( SpecialPageFactory::getNames() as $page ) {
                        $keys[$wgContLang->caseFold( $page )] = $page;
                }
 
                foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
-                       if ( !array_key_exists( $page, SpecialPageFactory::getList() ) ) {# bug 20885
+                       if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# bug 20885
                                continue;
                        }
 
index 853e2cc..7bad8b5 100644 (file)
@@ -57,16 +57,21 @@ class ProtectionForm {
        /** @var array Map of action to the expiry time of the existing protection */
        protected $mExistingExpiry = array();
 
-       function __construct( Page $article ) {
-               global $wgUser;
+       /** @var IContextSource */
+       private $mContext;
+
+       function __construct( Article $article ) {
                // Set instance variables.
                $this->mArticle = $article;
                $this->mTitle = $article->getTitle();
                $this->mApplicableTypes = $this->mTitle->getRestrictionTypes();
+               $this->mContext = $article->getContext();
 
                // Check if the form should be disabled.
                // If it is, the form will be available in read-only to show levels.
-               $this->mPermErrors = $this->mTitle->getUserPermissionsErrors( 'protect', $wgUser );
+               $this->mPermErrors = $this->mTitle->getUserPermissionsErrors(
+                       'protect', $this->mContext->getUser()
+               );
                if ( wfReadOnly() ) {
                        $this->mPermErrors[] = array( 'readonlytext', wfReadOnlyReason() );
                }
@@ -82,14 +87,15 @@ class ProtectionForm {
         * Loads the current state of protection into the object.
         */
        function loadData() {
-               global $wgRequest, $wgUser;
-
-               $levels = MWNamespace::getRestrictionLevels( $this->mTitle->getNamespace(), $wgUser );
+               $levels = MWNamespace::getRestrictionLevels(
+                       $this->mTitle->getNamespace(), $this->mContext->getUser()
+               );
                $this->mCascade = $this->mTitle->areRestrictionsCascading();
 
-               $this->mReason = $wgRequest->getText( 'mwProtect-reason' );
-               $this->mReasonSelection = $wgRequest->getText( 'wpProtectReasonSelection' );
-               $this->mCascade = $wgRequest->getBool( 'mwProtect-cascade', $this->mCascade );
+               $request = $this->mContext->getRequest();
+               $this->mReason = $request->getText( 'mwProtect-reason' );
+               $this->mReasonSelection = $request->getText( 'wpProtectReasonSelection' );
+               $this->mCascade = $request->getBool( 'mwProtect-cascade', $this->mCascade );
 
                foreach ( $this->mApplicableTypes as $action ) {
                        // @todo FIXME: This form currently requires individual selections,
@@ -106,8 +112,8 @@ class ProtectionForm {
                        }
                        $this->mExistingExpiry[$action] = $existingExpiry;
 
-                       $requestExpiry = $wgRequest->getText( "mwProtect-expiry-$action" );
-                       $requestExpirySelection = $wgRequest->getVal( "wpProtectExpirySelection-$action" );
+                       $requestExpiry = $request->getText( "mwProtect-expiry-$action" );
+                       $requestExpirySelection = $request->getVal( "wpProtectExpirySelection-$action" );
 
                        if ( $requestExpiry ) {
                                // Custom expiry takes precedence
@@ -128,7 +134,7 @@ class ProtectionForm {
                                $this->mExpirySelection[$action] = 'infinite';
                        }
 
-                       $val = $wgRequest->getVal( "mwProtect-level-$action" );
+                       $val = $request->getVal( "mwProtect-level-$action" );
                        if ( isset( $val ) && in_array( $val, $levels ) ) {
                                $this->mRestrictions[$action] = $val;
                        }
@@ -170,16 +176,14 @@ class ProtectionForm {
         * Main entry point for action=protect and action=unprotect
         */
        function execute() {
-               global $wgRequest, $wgOut;
-
                if ( MWNamespace::getRestrictionLevels( $this->mTitle->getNamespace() ) === array( '' ) ) {
                        throw new ErrorPageError( 'protect-badnamespace-title', 'protect-badnamespace-text' );
                }
 
-               if ( $wgRequest->wasPosted() ) {
+               if ( $this->mContext->getRequest()->wasPosted() ) {
                        if ( $this->save() ) {
                                $q = $this->mArticle->isRedirect() ? 'redirect=no' : '';
-                               $wgOut->redirect( $this->mTitle->getFullURL( $q ) );
+                               $this->mContext->getOutput()->redirect( $this->mTitle->getFullURL( $q ) );
                        }
                } else {
                        $this->show();
@@ -192,28 +196,27 @@ class ProtectionForm {
         * @param string $err Error message or null if there's no error
         */
        function show( $err = null ) {
-               global $wgOut;
-
-               $wgOut->setRobotPolicy( 'noindex,nofollow' );
-               $wgOut->addBacklinkSubtitle( $this->mTitle );
+               $out = $this->mContext->getOutput();
+               $out->setRobotPolicy( 'noindex,nofollow' );
+               $out->addBacklinkSubtitle( $this->mTitle );
 
                if ( is_array( $err ) ) {
-                       $wgOut->wrapWikiMsg( "<p class='error'>\n$1\n</p>\n", $err );
+                       $out->wrapWikiMsg( "<p class='error'>\n$1\n</p>\n", $err );
                } elseif ( is_string( $err ) ) {
-                       $wgOut->addHTML( "<p class='error'>{$err}</p>\n" );
+                       $out->addHTML( "<p class='error'>{$err}</p>\n" );
                }
 
                if ( $this->mTitle->getRestrictionTypes() === array() ) {
                        // No restriction types available for the current title
                        // this might happen if an extension alters the available types
-                       $wgOut->setPageTitle( wfMessage(
+                       $out->setPageTitle( wfMessage(
                                'protect-norestrictiontypes-title',
                                $this->mTitle->getPrefixedText()
                        ) );
-                       $wgOut->addWikiText( wfMessage( 'protect-norestrictiontypes-text' )->text() );
+                       $out->addWikiText( wfMessage( 'protect-norestrictiontypes-text' )->text() );
 
                        // Show the log in case protection was possible once
-                       $this->showLogExtract( $wgOut );
+                       $this->showLogExtract( $out );
                        // return as there isn't anything else we can do
                        return;
                }
@@ -227,7 +230,7 @@ class ProtectionForm {
                        }
 
                        /** @todo FIXME: i18n issue, should use formatted number. */
-                       $wgOut->wrapWikiMsg(
+                       $out->wrapWikiMsg(
                                "<div id=\"mw-protect-cascadeon\">\n$1\n" . $titles . "</div>",
                                array( 'protect-cascadeon', count( $cascadeSources ) )
                        );
@@ -236,19 +239,19 @@ class ProtectionForm {
                # Show an appropriate message if the user isn't allowed or able to change
                # the protection settings at this time
                if ( $this->disabled ) {
-                       $wgOut->setPageTitle(
+                       $out->setPageTitle(
                                wfMessage( 'protect-title-notallowed',
                                        $this->mTitle->getPrefixedText() )
                        );
-                       $wgOut->addWikiText( $wgOut->formatPermissionsErrorMessage( $this->mPermErrors, 'protect' ) );
+                       $out->addWikiText( $out->formatPermissionsErrorMessage( $this->mPermErrors, 'protect' ) );
                } else {
-                       $wgOut->setPageTitle( wfMessage( 'protect-title', $this->mTitle->getPrefixedText() ) );
-                       $wgOut->addWikiMsg( 'protect-text',
+                       $out->setPageTitle( wfMessage( 'protect-title', $this->mTitle->getPrefixedText() ) );
+                       $out->addWikiMsg( 'protect-text',
                                wfEscapeWikiText( $this->mTitle->getPrefixedText() ) );
                }
 
-               $wgOut->addHTML( $this->buildForm() );
-               $this->showLogExtract( $wgOut );
+               $out->addHTML( $this->buildForm() );
+               $this->showLogExtract( $out );
        }
 
        /**
@@ -257,16 +260,17 @@ class ProtectionForm {
         * @return bool Success
         */
        function save() {
-               global $wgRequest, $wgUser, $wgOut;
-
                # Permission check!
                if ( $this->disabled ) {
                        $this->show();
                        return false;
                }
 
-               $token = $wgRequest->getVal( 'wpEditToken' );
-               if ( !$wgUser->matchEditToken( $token, array( 'protect', $this->mTitle->getPrefixedDBkey() ) ) ) {
+               $request = $this->mContext->getRequest();
+               $user = $this->mContext->getUser();
+               $out = $this->mContext->getOutput();
+               $token = $request->getVal( 'wpEditToken' );
+               if ( !$user->matchEditToken( $token, array( 'protect', $this->mTitle->getPrefixedDBkey() ) ) ) {
                        $this->show( array( 'sessionfailure' ) );
                        return false;
                }
@@ -295,18 +299,18 @@ class ProtectionForm {
                        }
                }
 
-               $this->mCascade = $wgRequest->getBool( 'mwProtect-cascade' );
+               $this->mCascade = $request->getBool( 'mwProtect-cascade' );
 
                $status = $this->mArticle->doUpdateRestrictions(
                        $this->mRestrictions,
                        $expiry,
                        $this->mCascade,
                        $reasonstr,
-                       $wgUser
+                       $user
                );
 
                if ( !$status->isOK() ) {
-                       $this->show( $wgOut->parseInline( $status->getWikiText() ) );
+                       $this->show( $out->parseInline( $status->getWikiText() ) );
                        return false;
                }
 
@@ -327,7 +331,7 @@ class ProtectionForm {
                        return false;
                }
 
-               WatchAction::doWatchOrUnwatch( $wgRequest->getCheck( 'mwProtectWatch' ), $this->mTitle, $wgUser );
+               WatchAction::doWatchOrUnwatch( $request->getCheck( 'mwProtectWatch' ), $this->mTitle, $user );
 
                return true;
        }
@@ -338,15 +342,17 @@ class ProtectionForm {
         * @return string HTML form
         */
        function buildForm() {
-               global $wgUser, $wgLang, $wgOut, $wgCascadingRestrictionLevels;
-
+               $user = $this->mContext->getUser();
+               $output = $this->mContext->getOutput();
+               $lang = $this->mContext->getLanguage();
+               $cascadingRestrictionLevels = $this->mContext->getConfig()->get( 'CascadingRestrictionLevels' );
                $out = '';
                if ( !$this->disabled ) {
-                       $wgOut->addModules( 'mediawiki.legacy.protect' );
-                       $wgOut->addJsConfigVars( 'wgCascadeableLevels', $wgCascadingRestrictionLevels );
+                       $output->addModules( 'mediawiki.legacy.protect' );
+                       $output->addJsConfigVars( 'wgCascadeableLevels', $cascadingRestrictionLevels );
                        $out .= Xml::openElement( 'form', array( 'method' => 'post',
                                'action' => $this->mTitle->getLocalURL( 'action=protect' ),
-                               'id' => 'mw-Protect-Form', 'onsubmit' => 'ProtectionForm.enableUnchainedInputs(true)' ) );
+                               'id' => 'mw-Protect-Form' ) );
                }
 
                $out .= Xml::openElement( 'fieldset' ) .
@@ -378,13 +384,18 @@ class ProtectionForm {
                        );
 
                        $expiryFormOptions = '';
-                       if ( $this->mExistingExpiry[$action] && $this->mExistingExpiry[$action] != 'infinity' ) {
-                               $timestamp = $wgLang->timeanddate( $this->mExistingExpiry[$action], true );
-                               $d = $wgLang->date( $this->mExistingExpiry[$action], true );
-                               $t = $wgLang->time( $this->mExistingExpiry[$action], true );
+                       if ( $this->mExistingExpiry[$action] ) {
+                               if ( $this->mExistingExpiry[$action] == 'infinity' ) {
+                                       $existingExpiryMessage = wfMessage( 'protect-existing-expiry-infinity' );
+                               } else {
+                                       $timestamp = $lang->timeanddate( $this->mExistingExpiry[$action], true );
+                                       $d = $lang->date( $this->mExistingExpiry[$action], true );
+                                       $t = $lang->time( $this->mExistingExpiry[$action], true );
+                                       $existingExpiryMessage = wfMessage( 'protect-existing-expiry', $timestamp, $d, $t );
+                               }
                                $expiryFormOptions .=
                                        Xml::option(
-                                               wfMessage( 'protect-existing-expiry', $timestamp, $d, $t )->text(),
+                                               $existingExpiryMessage->text(),
                                                'existing',
                                                $this->mExpirySelection[$action] == 'existing'
                                        ) . "\n";
@@ -420,16 +431,13 @@ class ProtectionForm {
                                                                array(
                                                                        'id' => "mwProtectExpirySelection-$action",
                                                                        'name' => "wpProtectExpirySelection-$action",
-                                                                       'onchange' => "ProtectionForm.updateExpiryList(this)",
                                                                        'tabindex' => '2' ) + $this->disabledAttrib,
                                                                $expiryFormOptions ) .
                                                "</td>
                                        </tr></table>";
                        }
                        # Add custom expiry field
-                       $attribs = array( 'id' => "mwProtect-$action-expires",
-                               'onkeyup' => 'ProtectionForm.updateExpiry(this)',
-                               'onchange' => 'ProtectionForm.updateExpiry(this)' ) + $this->disabledAttrib;
+                       $attribs = array( 'id' => "mwProtect-$action-expires" ) + $this->disabledAttrib;
                        $out .= "<table><tr>
                                        <td class='mw-label'>" .
                                                $mProtectother .
@@ -508,14 +516,14 @@ class ProtectionForm {
                                        "</td>
                                </tr>";
                        # Disallow watching is user is not logged in
-                       if ( $wgUser->isLoggedIn() ) {
+                       if ( $user->isLoggedIn() ) {
                                $out .= "
                                <tr>
                                        <td></td>
                                        <td class='mw-input'>" .
                                                Xml::checkLabel( wfMessage( 'watchthis' )->text(),
                                                        'mwProtectWatch', 'mwProtectWatch',
-                                                       $wgUser->isWatched( $this->mTitle ) || $wgUser->getOption( 'watchdefault' ) ) .
+                                                       $user->isWatched( $this->mTitle ) || $user->getOption( 'watchdefault' ) ) .
                                        "</td>
                                </tr>";
                        }
@@ -533,7 +541,7 @@ class ProtectionForm {
                }
                $out .= Xml::closeElement( 'fieldset' );
 
-               if ( $wgUser->isAllowed( 'editinterface' ) ) {
+               if ( $user->isAllowed( 'editinterface' ) ) {
                        $title = Title::makeTitle( NS_MEDIAWIKI, 'Protect-dropdown' );
                        $link = Linker::link(
                                $title,
@@ -547,10 +555,9 @@ class ProtectionForm {
                if ( !$this->disabled ) {
                        $out .= Html::hidden(
                                'wpEditToken',
-                               $wgUser->getEditToken( array( 'protect', $this->mTitle->getPrefixedDBkey() ) )
+                               $user->getEditToken( array( 'protect', $this->mTitle->getPrefixedDBkey() ) )
                        );
                        $out .= Xml::closeElement( 'form' );
-                       $wgOut->addScript( $this->buildCleanupScript() );
                }
 
                return $out;
@@ -564,12 +571,10 @@ class ProtectionForm {
         * @return string HTML fragment
         */
        function buildSelector( $action, $selected ) {
-               global $wgUser;
-
                // If the form is disabled, display all relevant levels. Otherwise,
                // just show the ones this user can use.
                $levels = MWNamespace::getRestrictionLevels( $this->mTitle->getNamespace(),
-                       $this->disabled ? null : $wgUser
+                       $this->disabled ? null : $this->mContext->getUser()
                );
 
                $id = 'mwProtect-level-' . $action;
@@ -577,8 +582,7 @@ class ProtectionForm {
                        'id' => $id,
                        'name' => $id,
                        'size' => count( $levels ),
-                       'onchange' => 'ProtectionForm.updateLevels(this)',
-                       ) + $this->disabledAttrib;
+               ) + $this->disabledAttrib;
 
                $out = Xml::openElement( 'select', $attribs );
                foreach ( $levels as $key ) {
@@ -607,19 +611,6 @@ class ProtectionForm {
                }
        }
 
-       function buildCleanupScript() {
-               $options = array(
-                       'tableId' => 'mwProtectSet',
-                       'labelText' => wfMessage( 'protect-unchain-permissions' )->plain(),
-                       'numTypes' => count( $this->mApplicableTypes ),
-                       'existingMatch' => count( array_unique( $this->mExistingExpiry ) ) === 1,
-               );
-
-               $script = Xml::encodeJsCall( 'ProtectionForm.init', array( $options ) );
-
-               return Html::inlineScript( ResourceLoader::makeLoaderConditionalScript( $script ) );
-       }
-
        /**
         * Show protection long extracts for this page
         *
index a6148c7..5b39a41 100644 (file)
@@ -678,13 +678,8 @@ class Revision implements IDBAccessObject {
                        $this->mCurrent = false;
 
                        // If we still have no length, see it we have the text to figure it out
-                       if ( !$this->mSize ) {
-                               if ( $this->mContent !== null ) {
-                                       $this->mSize = $this->mContent->getSize();
-                               } else {
-                                       #NOTE: this should never happen if we have either text or content object!
-                                       $this->mSize = null;
-                               }
+                       if ( !$this->mSize && $this->mContent !== null ) {
+                               $this->mSize = $this->mContent->getSize();
                        }
 
                        // Same for sha1
@@ -1654,9 +1649,13 @@ class Revision implements IDBAccessObject {
         *                               self::DELETED_COMMENT = File::DELETED_COMMENT,
         *                               self::DELETED_USER = File::DELETED_USER
         * @param User|null $user User object to check, or null to use $wgUser
+        * @param Title|null $title A Title object to check for per-page restrictions on,
+        *                          instead of just plain userrights
         * @return bool
         */
-       public static function userCanBitfield( $bitfield, $field, User $user = null ) {
+       public static function userCanBitfield( $bitfield, $field, User $user = null,
+               Title $title = null
+       ) {
                if ( $bitfield & $field ) { // aspect is deleted
                        if ( $user === null ) {
                                global $wgUser;
@@ -1670,8 +1669,19 @@ class Revision implements IDBAccessObject {
                                $permissions = array( 'deletedhistory' );
                        }
                        $permissionlist = implode( ', ', $permissions );
-                       wfDebug( "Checking for $permissionlist due to $field match on $bitfield\n" );
-                       return call_user_func_array( array( $user, 'isAllowedAny' ), $permissions );
+                       if ( $title === null ) {
+                               wfDebug( "Checking for $permissionlist due to $field match on $bitfield\n" );
+                               return call_user_func_array( array( $user, 'isAllowedAny' ), $permissions );
+                       } else {
+                               $text = $title->getPrefixedText();
+                               wfDebug( "Checking for $permissionlist on $text due to $field match on $bitfield\n" );
+                               foreach ( $permissions as $perm ) {
+                                       if ( $title->userCan( $perm, $user ) ) {
+                                               return true;
+                                       }
+                               }
+                               return false;
+                       }
                } else {
                        return true;
                }
index b173ae9..bca2f67 100644 (file)
@@ -328,6 +328,7 @@ class Sanitizer {
         * Regular expression to match HTML/XML attribute pairs within a tag.
         * Allows some... latitude.
         * Used in Sanitizer::fixTagAttributes and Sanitizer::decodeTagAttributes
+        * @return string
         */
        static function getAttribsRegex() {
                if ( self::$attribsRegex === null ) {
@@ -831,24 +832,16 @@ class Sanitizer {
        }
 
        /**
-        * Pick apart some CSS and check it for forbidden or unsafe structures.
-        * Returns a sanitized string. This sanitized string will have
-        * character references and escape sequences decoded and comments
-        * stripped (unless it is itself one valid comment, in which case the value
-        * will be passed through). If the input is just too evil, only a comment
-        * complaining about evilness will be returned.
-        *
-        * Currently URL references, 'expression', 'tps' are forbidden.
-        *
-        * NOTE: Despite the fact that character references are decoded, the
-        * returned string may contain character references given certain
-        * clever input strings. These character references must
-        * be escaped before the return value is embedded in HTML.
-        *
-        * @param string $value
-        * @return string
+        * Normalize CSS into a format we can easily search for hostile input
+        *  - decode character references
+        *  - decode escape sequences
+        *  - convert characters that IE6 interprets into ascii
+        *  - remove comments, unless the entire value is one single comment
+        * @param string $value the css string
+        * @return string normalized css
         */
-       static function checkCss( $value ) {
+       public static function normalizeCss( $value ) {
+
                // Decode character references like &#123;
                $value = Sanitizer::decodeCharReferences( $value );
 
@@ -934,6 +927,31 @@ class Sanitizer {
                        $value
                );
 
+               return $value;
+       }
+
+
+       /**
+        * Pick apart some CSS and check it for forbidden or unsafe structures.
+        * Returns a sanitized string. This sanitized string will have
+        * character references and escape sequences decoded and comments
+        * stripped (unless it is itself one valid comment, in which case the value
+        * will be passed through). If the input is just too evil, only a comment
+        * complaining about evilness will be returned.
+        *
+        * Currently URL references, 'expression', 'tps' are forbidden.
+        *
+        * NOTE: Despite the fact that character references are decoded, the
+        * returned string may contain character references given certain
+        * clever input strings. These character references must
+        * be escaped before the return value is embedded in HTML.
+        *
+        * @param string $value
+        * @return string
+        */
+       static function checkCss( $value ) {
+               $value = self::normalizeCss( $value );
+
                // Reject problematic keywords and control characters
                if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ) {
                        return '/* invalid control char */';
@@ -1096,8 +1114,9 @@ class Sanitizer {
                global $wgExperimentalHtmlIds;
                $options = (array)$options;
 
+               $id = Sanitizer::decodeCharReferences( $id );
+
                if ( $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) {
-                       $id = Sanitizer::decodeCharReferences( $id );
                        $id = preg_replace( '/[ \t\n\r\f_\'"&#%]+/', '_', $id );
                        $id = trim( $id, '_' );
                        if ( $id === '' ) {
@@ -1114,7 +1133,7 @@ class Sanitizer {
                        '%' => '.'
                );
 
-               $id = urlencode( Sanitizer::decodeCharReferences( strtr( $id, ' ', '_' ) ) );
+               $id = urlencode( strtr( $id, ' ', '_' ) );
                $id = str_replace( array_keys( $replace ), array_values( $replace ), $id );
 
                if ( !preg_match( '/^[a-zA-Z]/', $id )
index 0c5cf92..743936e 100644 (file)
@@ -77,9 +77,12 @@ if ( $wgStyleDirectory === false ) {
 if ( $wgExtensionAssetsPath === false ) {
        $wgExtensionAssetsPath = "$wgScriptPath/extensions";
 }
+if ( $wgResourceBasePath === null ) {
+       $wgResourceBasePath = $wgScriptPath;
+}
 
 if ( $wgLogo === false ) {
-       $wgLogo = "$wgStylePath/common/images/wiki.png";
+       $wgLogo = "$wgResourceBasePath/resources/assets/wiki.png";
 }
 
 if ( $wgUploadPath === false ) {
@@ -102,6 +105,15 @@ if ( $wgGitInfoCacheDirectory === false && $wgCacheDirectory !== false ) {
        $wgGitInfoCacheDirectory = "{$wgCacheDirectory}/gitinfo";
 }
 
+// Fix path to icon images after they were moved in 1.24
+if ( $wgRightsIcon ) {
+       $wgRightsIcon = str_replace(
+               "{$wgStylePath}/common/images/",
+               "{$wgResourceBasePath}/resources/assets/licenses/",
+               $wgRightsIcon
+       );
+}
+
 if ( isset( $wgFooterIcons['copyright'] )
        && isset( $wgFooterIcons['copyright']['copyright'] )
        && $wgFooterIcons['copyright']['copyright'] === array()
@@ -124,7 +136,7 @@ if ( isset( $wgFooterIcons['poweredby'] )
        && $wgFooterIcons['poweredby']['mediawiki']['src'] === null
 ) {
        $wgFooterIcons['poweredby']['mediawiki']['src'] =
-               "$wgStylePath/common/images/poweredby_mediawiki_88x31.png";
+               "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png";
 }
 
 /**
@@ -265,20 +277,25 @@ if ( $wgSkipSkin ) {
 
 // Register skins
 // Use a closure to avoid leaking into global state
-call_user_func( function() use ( $wgValidSkinNames ) {
+call_user_func( function () use ( $wgValidSkinNames ) {
        $factory = SkinFactory::getDefaultInstance();
        foreach ( $wgValidSkinNames as $name => $skin ) {
-               $factory->register( $name, $skin, function() use ( $name, $skin ) {
+               $factory->register( $name, $skin, function () use ( $name, $skin ) {
                        $class = "Skin$skin";
                        return new $class( $name );
                } );
        }
        // Register a hidden "fallback" skin
-       $factory->register( 'fallback', 'Fallback', function() {
+       $factory->register( 'fallback', 'Fallback', function () {
                return new SkinFallback;
        } );
+       // Register a hidden skin for api output
+       $factory->register( 'apioutput', 'ApiOutput', function () {
+               return new SkinApi;
+       } );
 } );
 $wgSkipSkins[] = 'fallback';
+$wgSkipSkins[] = 'apioutput';
 
 if ( $wgLocalInterwiki ) {
        array_unshift( $wgLocalInterwikis, $wgLocalInterwiki );
@@ -302,7 +319,33 @@ if ( !$wgCookiePrefix ) {
 }
 $wgCookiePrefix = strtr( $wgCookiePrefix, '=,; +."\'\\[', '__________' );
 
-$wgUseEnotif = $wgEnotifUserTalk || $wgEnotifWatchlist;
+if ( $wgEnableEmail ) {
+       $wgUseEnotif = $wgEnotifUserTalk || $wgEnotifWatchlist;
+} else {
+       // Disable all other email settings automatically if $wgEnableEmail
+       // is set to false. - bug 63678
+       $wgAllowHTMLEmail = false;
+       $wgEmailAuthentication = false; // do not require auth if you're not sending email anyway
+       $wgEnableUserEmail = false;
+       $wgEnotifFromEditor = false;
+       $wgEnotifImpersonal = false;
+       $wgEnotifMaxRecips = 0;
+       $wgEnotifMinorEdits = false;
+       $wgEnotifRevealEditorAddress = false;
+       $wgEnotifUseJobQ = false;
+       $wgEnotifUseRealName = false;
+       $wgEnotifUserTalk = false;
+       $wgEnotifWatchlist = false;
+       unset( $wgGroupPermissions['user']['sendemail'] );
+       $wgUseEnotif = false;
+       $wgUserEmailUseReplyTo = false;
+       $wgUsersNotifiedOnAllChanges = array();
+}
+
+// Doesn't make sense to have if disabled.
+if ( !$wgEnotifMinorEdits ) {
+       $wgHiddenPrefs[] = 'enotifminoredits';
+}
 
 if ( $wgMetaNamespace === false ) {
        $wgMetaNamespace = str_replace( ' ', '_', $wgSitename );
@@ -355,11 +398,6 @@ if ( $wgUseFileCache || $wgUseSquid ) {
        $wgDebugToolbar = false;
 }
 
-// Doesn't make sense to have if disabled.
-if ( !$wgEnotifMinorEdits ) {
-       $wgHiddenPrefs[] = 'enotifminoredits';
-}
-
 // We always output HTML5 since 1.22, overriding these is no longer supported
 // we set them here for extensions that depend on its value.
 $wgHtml5 = true;
@@ -595,28 +633,12 @@ if ( !is_object( $wgAuth ) ) {
  */
 $wgTitle = null;
 
+/**
+ * @deprecated since 1.24 Use DeferredUpdates::addUpdate instead
+ * @var array
+ */
 $wgDeferredUpdateList = array();
 
-// Disable all other email settings automatically if $wgEnableEmail
-// is set to false. - bug 63678
-if ( !$wgEnableEmail ) {
-       $wgAllowHTMLEmail = false;
-       $wgEmailAuthentication = false; // do not require auth if you're not sending email anyway
-       $wgEnableUserEmail = false;
-       $wgEnotifFromEditor = false;
-       $wgEnotifImpersonal = false;
-       $wgEnotifMaxRecips = 0;
-       $wgEnotifMinorEdits = false;
-       $wgEnotifRevealEditorAddress = false;
-       $wgEnotifUseJobQ = false;
-       $wgEnotifUseRealName = false;
-       $wgEnotifUserTalk = false;
-       $wgEnotifWatchlist = false;
-       unset( $wgGroupPermissions['user']['sendemail'] );
-       $wgUserEmailUseReplyTo = false;
-       $wgUsersNotifiedOnAllChanges = array();
-}
-
 wfProfileOut( $fname . '-globals' );
 wfProfileIn( $fname . '-extensions' );
 
index b877544..c3b1a6a 100644 (file)
@@ -133,6 +133,8 @@ class SiteConfiguration {
 
        /**
         * Array of domains that are local and can be handled by the same server
+        *
+        * @deprecated since 1.25; use $wgLocalVirtualHosts instead.
         */
        public $localVHosts = array();
 
@@ -532,7 +534,7 @@ class SiteConfiguration {
                        if ( isset( $this->cfgCache[$wiki] ) ) {
                                $res = array_intersect_key( $this->cfgCache[$wiki], array_flip( $settings ) );
                                if ( count( $res ) == count( $settings ) ) {
-                                       return $res; // cache hit
+                                       return $multi ? $res : current( $res ); // cache hit
                                }
                        } elseif ( !in_array( $wiki, $this->wikis ) ) {
                                throw new MWException( "No such wiki '$wiki'." );
@@ -565,6 +567,8 @@ class SiteConfiguration {
 
        /**
         * Returns true if the given vhost is handled locally.
+        *
+        * @deprecated since 1.25; check if the host is in $wgLocalVirtualHosts instead.
         * @param string $vhost
         * @return bool
         */
index 102fffd..5fc8f2f 100644 (file)
@@ -39,7 +39,11 @@ class StatCounter {
        /** @var array */
        protected $deltas = array(); // (key => count)
 
-       protected function __construct() {
+       /** @var Config */
+       protected $config;
+
+       protected function __construct( Config $config ) {
+               $this->config = $config;
        }
 
        /**
@@ -48,7 +52,9 @@ class StatCounter {
        public static function singleton() {
                static $instance = null;
                if ( !$instance ) {
-                       $instance = new self();
+                       $instance = new self(
+                               ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       );
                }
                return $instance;
        }
@@ -74,12 +80,11 @@ class StatCounter {
         * @return void
         */
        public function flush() {
-               global $wgStatsMethod;
-
+               $statsMethod = $this->config->get( 'StatsMethod' );
                $deltas = array_filter( $this->deltas ); // remove 0 valued entries
-               if ( $wgStatsMethod === 'udp' ) {
+               if ( $statsMethod === 'udp' ) {
                        $this->sendDeltasUDP( $deltas );
-               } elseif ( $wgStatsMethod === 'cache' ) {
+               } elseif ( $statsMethod === 'cache' ) {
                        $this->sendDeltasMemc( $deltas );
                } else {
                        // disabled
@@ -92,14 +97,12 @@ class StatCounter {
         * @return void
         */
        protected function sendDeltasUDP( array $deltas ) {
-               global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID,
-                       $wgStatsFormatString;
-
-               $id = strlen( $wgAggregateStatsID ) ? $wgAggregateStatsID : wfWikiID();
+               $aggregateStatsID = $this->config->get( 'AggregateStatsID' );
+               $id = strlen( $aggregateStatsID ) ? $aggregateStatsID : wfWikiID();
 
                $lines = array();
                foreach ( $deltas as $key => $count ) {
-                       $lines[] = sprintf( $wgStatsFormatString, $id, $count, $key );
+                       $lines[] = sprintf( $this->config->get( 'StatsFormatString' ), $id, $count, $key );
                }
 
                if ( count( $lines ) ) {
@@ -126,8 +129,8 @@ class StatCounter {
                                        $packet,
                                        strlen( $packet ),
                                        0,
-                                       $wgUDPProfilerHost,
-                                       $wgUDPProfilerPort
+                                       $this->config->get( 'UDPProfilerHost' ),
+                                       $this->config->get( 'UDPProfilerPort' )
                                );
                                wfRestoreWarnings();
                        }
index 1a72968..0a8062c 100644 (file)
@@ -159,6 +159,15 @@ class Status {
                $this->ok = false;
        }
 
+       /**
+        * Don't save the callback when serializing, because Closures can't be
+        * serialized and we're going to clear it in __wakeup anyway.
+        */
+       public function __sleep() {
+               $keys = array_keys( get_object_vars( $this ) );
+               return array_diff( $keys, array( 'cleanCallback' ) );
+       }
+
        /**
         * Sanitize the callback parameter on wakeup, to avoid arbitrary execution.
         */
@@ -184,9 +193,9 @@ class Status {
        /**
         * Get the error list as a wikitext formatted list
         *
-        * @param string $shortContext A short enclosing context message name, to
+        * @param string|bool $shortContext A short enclosing context message name, to
         *        be used when there is a single error
-        * @param string $longContext A long enclosing context message name, for a list
+        * @param string|bool $longContext A long enclosing context message name, for a list
         * @return string
         */
        public function getWikiText( $shortContext = false, $longContext = false ) {
diff --git a/includes/TimestampException.php b/includes/TimestampException.php
deleted file mode 100644 (file)
index b9c0c35..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-/**
- * @since 1.20
- */
-class TimestampException extends MWException {
-}
index 526bc92..e8cda85 100644 (file)
@@ -158,6 +158,9 @@ class Title {
 
        /** @var TitleValue A corresponding TitleValue object */
        private $mTitleValue = null;
+
+       /** @var bool Would deleting this page be a big deletion? */
+       private $mIsBigDeletion = null;
        // @}
 
        /**
@@ -941,10 +944,12 @@ class Title {
         * Get the page's content model id, see the CONTENT_MODEL_XXX constants.
         *
         * @throws MWException
+        * @param int $flags A bit field; may be Title::GAID_FOR_UPDATE to select for update
         * @return string Content model id
         */
-       public function getContentModel() {
-               if ( !$this->mContentModel ) {
+       public function getContentModel( $flags = 0 ) {
+               # Calling getArticleID() loads the field from cache as needed
+               if ( !$this->mContentModel && $this->getArticleID( $flags ) ) {
                        $linkCache = LinkCache::singleton();
                        $this->mContentModel = $linkCache->getGoodLinkFieldObj( $this, 'model' );
                }
@@ -2258,11 +2263,15 @@ class Title {
                                $errors[] = array( 'immobile-target-page' );
                        }
                } elseif ( $action == 'delete' ) {
-                       if ( count( $this->getUserPermissionsErrorsInternal( 'edit',
-                               $user, $doExpensiveQueries, true ) )
-                       ) {
-                               // If they can't edit, they shouldn't delete.
-                               $errors[] = array( 'delete-cantedit' );
+                       $tempErrors = $this->checkPageRestrictions( 'edit',
+                               $user, array(), $doExpensiveQueries, true );
+                       if ( !$tempErrors ) {
+                               $tempErrors = $this->checkCascadingSourcesRestrictions( 'edit',
+                                       $user, $tempErrors, $doExpensiveQueries, true );
+                       }
+                       if ( $tempErrors ) {
+                               // If protection keeps them from editing, they shouldn't be able to delete.
+                               $errors[] = array( 'deleteprotected' );
                        }
                        if ( $doExpensiveQueries && $wgDeleteRevisionsLimit
                                && !$this->userCan( 'bigdelete', $user ) && $this->isBigDeletion()
@@ -3271,6 +3280,7 @@ class Title {
                $this->mEstimateRevisions = null;
                $this->mPageLanguage = false;
                $this->mDbPageLanguage = null;
+               $this->mIsBigDeletion = null;
        }
 
        /**
@@ -3313,8 +3323,8 @@ class Title {
                        // @note: splitTitleString() is a temporary hack to allow MediaWikiTitleCodec to share
                        //        the parsing code with Title, while avoiding massive refactoring.
                        // @todo: get rid of secureAndSplit, refactor parsing code.
-                       $parser = self::getTitleParser();
-                       $parts = $parser->splitTitleString( $dbkey, $this->getDefaultNamespace() );
+                       $titleParser = self::getTitleParser();
+                       $parts = $titleParser->splitTitleString( $dbkey, $this->getDefaultNamespace() );
                } catch ( MalformedTitleException $ex ) {
                        return false;
                }
@@ -3579,6 +3589,7 @@ class Title {
         * Check whether a given move operation would be valid.
         * Returns true if ok, or a getUserPermissionsErrors()-like array otherwise
         *
+        * @todo finish moving this into MovePage
         * @param Title $nt The new title
         * @param bool $auth Indicates whether $wgUser's permissions
         *  should be checked
@@ -3586,60 +3597,18 @@ class Title {
         * @return array|bool True on success, getUserPermissionsErrors()-like array on failure
         */
        public function isValidMoveOperation( &$nt, $auth = true, $reason = '' ) {
-               global $wgUser, $wgContentHandlerUseDB;
+               global $wgUser;
 
-               $errors = array();
-               if ( !$nt ) {
+               if ( !( $nt instanceof Title ) ) {
                        // Normally we'd add this to $errors, but we'll get
                        // lots of syntax errors if $nt is not an object
                        return array( array( 'badtitletext' ) );
                }
-               if ( $this->equals( $nt ) ) {
-                       $errors[] = array( 'selfmove' );
-               }
-               if ( !$this->isMovable() ) {
-                       $errors[] = array( 'immobile-source-namespace', $this->getNsText() );
-               }
-               if ( $nt->isExternal() ) {
-                       $errors[] = array( 'immobile-target-namespace-iw' );
-               }
-               if ( !$nt->isMovable() ) {
-                       $errors[] = array( 'immobile-target-namespace', $nt->getNsText() );
-               }
-
-               $oldid = $this->getArticleID();
-               $newid = $nt->getArticleID();
-
-               if ( strlen( $nt->getDBkey() ) < 1 ) {
-                       $errors[] = array( 'articleexists' );
-               }
-               if (
-                       ( $this->getDBkey() == '' ) ||
-                       ( !$oldid ) ||
-                       ( $nt->getDBkey() == '' )
-               ) {
-                       $errors[] = array( 'badarticleerror' );
-               }
 
-               // Content model checks
-               if ( !$wgContentHandlerUseDB &&
-                               $this->getContentModel() !== $nt->getContentModel() ) {
-                       // can't move a page if that would change the page's content model
-                       $errors[] = array(
-                               'bad-target-model',
-                               ContentHandler::getLocalizedName( $this->getContentModel() ),
-                               ContentHandler::getLocalizedName( $nt->getContentModel() )
-                       );
-               }
-
-               // Image-specific checks
-               if ( $this->getNamespace() == NS_FILE ) {
-                       $errors = array_merge( $errors, $this->validateFileMoveOperation( $nt ) );
-               }
+               $mp = new MovePage( $this, $nt );
+               $errors = $mp->isValidMove()->getErrorsArray();
 
-               if ( $nt->getNamespace() == NS_FILE && $this->getNamespace() != NS_FILE ) {
-                       $errors[] = array( 'nonfile-cannot-move-to-file' );
-               }
+               $newid = $nt->getArticleID();
 
                if ( $auth ) {
                        $errors = wfMergeErrorArrays( $errors,
@@ -3689,6 +3658,7 @@ class Title {
 
        /**
         * Check if the requested move target is a valid file move target
+        * @todo move this to MovePage
         * @param Title $nt Target title
         * @return array List of errors
         */
@@ -3697,27 +3667,6 @@ class Title {
 
                $errors = array();
 
-               // wfFindFile( $nt ) / wfLocalFile( $nt ) is not allowed until below
-
-               $file = wfLocalFile( $this );
-               if ( $file->exists() ) {
-                       if ( $nt->getText() != wfStripIllegalFilenameChars( $nt->getText() ) ) {
-                               $errors[] = array( 'imageinvalidfilename' );
-                       }
-                       if ( !File::checkExtensionCompatibility( $file, $nt->getDBkey() ) ) {
-                               $errors[] = array( 'imagetypemismatch' );
-                       }
-               }
-
-               if ( $nt->getNamespace() != NS_FILE ) {
-                       $errors[] = array( 'imagenocrossnamespace' );
-                       // From here we want to do checks on a file object, so if we can't
-                       // create one, we must return.
-                       return $errors;
-               }
-
-               // wfFindFile( $nt ) / wfLocalFile( $nt ) is allowed below here
-
                $destFile = wfLocalFile( $nt );
                if ( !$wgUser->isAllowed( 'reupload-shared' ) && !$destFile->exists() && wfFindFile( $nt ) ) {
                        $errors[] = array( 'file-exists-sharedrepo' );
@@ -3729,6 +3678,7 @@ class Title {
        /**
         * Move a title to a new location
         *
+        * @todo Deprecate this in favor of MovePage
         * @param Title $nt The new title
         * @param bool $auth Indicates whether $wgUser's permissions
         *  should be checked
@@ -3752,277 +3702,13 @@ class Title {
 
                wfRunHooks( 'TitleMove', array( $this, $nt, $wgUser ) );
 
-               // If it is a file, move it first.
-               // It is done before all other moving stuff is done because it's hard to revert.
-               $dbw = wfGetDB( DB_MASTER );
-               if ( $this->getNamespace() == NS_FILE ) {
-                       $file = wfLocalFile( $this );
-                       if ( $file->exists() ) {
-                               $status = $file->move( $nt );
-                               if ( !$status->isOk() ) {
-                                       return $status->getErrorsArray();
-                               }
-                       }
-                       // Clear RepoGroup process cache
-                       RepoGroup::singleton()->clearCache( $this );
-                       RepoGroup::singleton()->clearCache( $nt ); # clear false negative cache
-               }
-
-               $dbw->begin( __METHOD__ ); # If $file was a LocalFile, its transaction would have closed our own.
-               $pageid = $this->getArticleID( self::GAID_FOR_UPDATE );
-               $protected = $this->isProtected();
-
-               // Do the actual move
-               $this->moveToInternal( $nt, $reason, $createRedirect );
-
-               // Refresh the sortkey for this row.  Be careful to avoid resetting
-               // cl_timestamp, which may disturb time-based lists on some sites.
-               $prefixes = $dbw->select(
-                       'categorylinks',
-                       array( 'cl_sortkey_prefix', 'cl_to' ),
-                       array( 'cl_from' => $pageid ),
-                       __METHOD__
-               );
-               foreach ( $prefixes as $prefixRow ) {
-                       $prefix = $prefixRow->cl_sortkey_prefix;
-                       $catTo = $prefixRow->cl_to;
-                       $dbw->update( 'categorylinks',
-                               array(
-                                       'cl_sortkey' => Collation::singleton()->getSortKey(
-                                               $nt->getCategorySortkey( $prefix ) ),
-                                       'cl_timestamp=cl_timestamp' ),
-                               array(
-                                       'cl_from' => $pageid,
-                                       'cl_to' => $catTo ),
-                               __METHOD__
-                       );
-               }
-
-               $redirid = $this->getArticleID();
-
-               if ( $protected ) {
-                       # Protect the redirect title as the title used to be...
-                       $dbw->insertSelect( 'page_restrictions', 'page_restrictions',
-                               array(
-                                       'pr_page' => $redirid,
-                                       'pr_type' => 'pr_type',
-                                       'pr_level' => 'pr_level',
-                                       'pr_cascade' => 'pr_cascade',
-                                       'pr_user' => 'pr_user',
-                                       'pr_expiry' => 'pr_expiry'
-                               ),
-                               array( 'pr_page' => $pageid ),
-                               __METHOD__,
-                               array( 'IGNORE' )
-                       );
-                       # Update the protection log
-                       $log = new LogPage( 'protect' );
-                       $comment = wfMessage(
-                               'prot_1movedto2',
-                               $this->getPrefixedText(),
-                               $nt->getPrefixedText()
-                       )->inContentLanguage()->text();
-                       if ( $reason ) {
-                               $comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
-                       }
-                       // @todo FIXME: $params?
-                       $logId = $log->addEntry(
-                               'move_prot',
-                               $nt,
-                               $comment,
-                               array( $this->getPrefixedText() ),
-                               $wgUser
-                       );
-
-                       // reread inserted pr_ids for log relation
-                       $insertedPrIds = $dbw->select(
-                               'page_restrictions',
-                               'pr_id',
-                               array( 'pr_page' => $redirid ),
-                               __METHOD__
-                       );
-                       $logRelationsValues = array();
-                       foreach ( $insertedPrIds as $prid ) {
-                               $logRelationsValues[] = $prid->pr_id;
-                       }
-                       $log->addRelations( 'pr_id', $logRelationsValues, $logId );
-               }
-
-               // Update *_from_namespace fields as needed
-               if ( $this->getNamespace() != $nt->getNamespace() ) {
-                       $dbw->update( 'pagelinks',
-                               array( 'pl_from_namespace' => $nt->getNamespace() ),
-                               array( 'pl_from' => $pageid ),
-                               __METHOD__
-                       );
-                       $dbw->update( 'templatelinks',
-                               array( 'tl_from_namespace' => $nt->getNamespace() ),
-                               array( 'tl_from' => $pageid ),
-                               __METHOD__
-                       );
-                       $dbw->update( 'imagelinks',
-                               array( 'il_from_namespace' => $nt->getNamespace() ),
-                               array( 'il_from' => $pageid ),
-                               __METHOD__
-                       );
-               }
-
-               # Update watchlists
-               $oldtitle = $this->getDBkey();
-               $newtitle = $nt->getDBkey();
-               $oldsnamespace = MWNamespace::getSubject( $this->getNamespace() );
-               $newsnamespace = MWNamespace::getSubject( $nt->getNamespace() );
-               if ( $oldsnamespace != $newsnamespace || $oldtitle != $newtitle ) {
-                       WatchedItem::duplicateEntries( $this, $nt );
-               }
-
-               $dbw->commit( __METHOD__ );
-
-               wfRunHooks( 'TitleMoveComplete', array( &$this, &$nt, &$wgUser, $pageid, $redirid, $reason ) );
-               return true;
-       }
-
-       /**
-        * Move page to a title which is either a redirect to the
-        * source page or nonexistent
-        *
-        * @param Title $nt The page to move to, which should be a redirect or nonexistent
-        * @param string $reason The reason for the move
-        * @param bool $createRedirect Whether to leave a redirect at the old title. Does not check
-        *   if the user has the suppressredirect right
-        * @throws MWException
-        */
-       private function moveToInternal( &$nt, $reason = '', $createRedirect = true ) {
-               global $wgUser, $wgContLang;
-
-               if ( $nt->exists() ) {
-                       $moveOverRedirect = true;
-                       $logType = 'move_redir';
-               } else {
-                       $moveOverRedirect = false;
-                       $logType = 'move';
-               }
-
-               if ( $createRedirect ) {
-                       if ( $this->getNamespace() == NS_CATEGORY
-                               && !wfMessage( 'category-move-redirect-override' )->inContentLanguage()->isDisabled()
-                       ) {
-                               $redirectContent = new WikitextContent(
-                                       wfMessage( 'category-move-redirect-override' )
-                                               ->params( $nt->getPrefixedText() )->inContentLanguage()->plain() );
-                       } else {
-                               $contentHandler = ContentHandler::getForTitle( $this );
-                               $redirectContent = $contentHandler->makeRedirectContent( $nt,
-                                       wfMessage( 'move-redirect-text' )->inContentLanguage()->plain() );
-                       }
-
-                       // NOTE: If this page's content model does not support redirects, $redirectContent will be null.
+               $mp = new MovePage( $this, $nt );
+               $status = $mp->move( $wgUser, $reason, $createRedirect );
+               if ( $status->isOK() ) {
+                       return true;
                } else {
-                       $redirectContent = null;
+                       return $status->getErrorsArray();
                }
-
-               $logEntry = new ManualLogEntry( 'move', $logType );
-               $logEntry->setPerformer( $wgUser );
-               $logEntry->setTarget( $this );
-               $logEntry->setComment( $reason );
-               $logEntry->setParameters( array(
-                       '4::target' => $nt->getPrefixedText(),
-                       '5::noredir' => $redirectContent ? '0': '1',
-               ) );
-
-               $formatter = LogFormatter::newFromEntry( $logEntry );
-               $formatter->setContext( RequestContext::newExtraneousContext( $this ) );
-               $comment = $formatter->getPlainActionText();
-               if ( $reason ) {
-                       $comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
-               }
-               # Truncate for whole multibyte characters.
-               $comment = $wgContLang->truncate( $comment, 255 );
-
-               $oldid = $this->getArticleID();
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $newpage = WikiPage::factory( $nt );
-
-               if ( $moveOverRedirect ) {
-                       $newid = $nt->getArticleID();
-                       $newcontent = $newpage->getContent();
-
-                       # Delete the old redirect. We don't save it to history since
-                       # by definition if we've got here it's rather uninteresting.
-                       # We have to remove it so that the next step doesn't trigger
-                       # a conflict on the unique namespace+title index...
-                       $dbw->delete( 'page', array( 'page_id' => $newid ), __METHOD__ );
-
-                       $newpage->doDeleteUpdates( $newid, $newcontent );
-               }
-
-               # Save a null revision in the page's history notifying of the move
-               $nullRevision = Revision::newNullRevision( $dbw, $oldid, $comment, true, $wgUser );
-               if ( !is_object( $nullRevision ) ) {
-                       throw new MWException( 'No valid null revision produced in ' . __METHOD__ );
-               }
-
-               $nullRevision->insertOn( $dbw );
-
-               # Change the name of the target page:
-               $dbw->update( 'page',
-                       /* SET */ array(
-                               'page_namespace' => $nt->getNamespace(),
-                               'page_title' => $nt->getDBkey(),
-                       ),
-                       /* WHERE */ array( 'page_id' => $oldid ),
-                       __METHOD__
-               );
-
-               // clean up the old title before reset article id - bug 45348
-               if ( !$redirectContent ) {
-                       WikiPage::onArticleDelete( $this );
-               }
-
-               $this->resetArticleID( 0 ); // 0 == non existing
-               $nt->resetArticleID( $oldid );
-               $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
-
-               $newpage->updateRevisionOn( $dbw, $nullRevision );
-
-               wfRunHooks( 'NewRevisionFromEditComplete',
-                       array( $newpage, $nullRevision, $nullRevision->getParentId(), $wgUser ) );
-
-               $newpage->doEditUpdates( $nullRevision, $wgUser, array( 'changed' => false ) );
-
-               if ( !$moveOverRedirect ) {
-                       WikiPage::onArticleCreate( $nt );
-               }
-
-               # Recreate the redirect, this time in the other direction.
-               if ( $redirectContent ) {
-                       $redirectArticle = WikiPage::factory( $this );
-                       $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
-                       $newid = $redirectArticle->insertOn( $dbw );
-                       if ( $newid ) { // sanity
-                               $this->resetArticleID( $newid );
-                               $redirectRevision = new Revision( array(
-                                       'title' => $this, // for determining the default content model
-                                       'page' => $newid,
-                                       'user_text' => $wgUser->getName(),
-                                       'user' => $wgUser->getId(),
-                                       'comment' => $comment,
-                                       'content' => $redirectContent ) );
-                               $redirectRevision->insertOn( $dbw );
-                               $redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
-
-                               wfRunHooks( 'NewRevisionFromEditComplete',
-                                       array( $redirectArticle, $redirectRevision, false, $wgUser ) );
-
-                               $redirectArticle->doEditUpdates( $redirectRevision, $wgUser, array( 'created' => true ) );
-                       }
-               }
-
-               # Log the move
-               $logid = $logEntry->insert();
-               $logEntry->publish( $logid );
        }
 
        /**
@@ -4151,6 +3837,7 @@ class Title {
         * Checks if $this can be moved to a given Title
         * - Selects for update, so don't call it unless you mean business
         *
+        * @todo move to MovePage
         * @param Title $nt The new title to check
         * @return bool
         */
@@ -4377,12 +4064,32 @@ class Title {
                        return false;
                }
 
-               $revCount = $this->estimateRevisionCount();
-               return $revCount > $wgDeleteRevisionsLimit;
+               if ( $this->mIsBigDeletion === null ) {
+                       $dbr = wfGetDB( DB_SLAVE );
+
+                       $innerQuery = $dbr->selectSQLText(
+                               'revision',
+                               '1',
+                               array( 'rev_page' => $this->getArticleID() ),
+                               __METHOD__,
+                               array( 'LIMIT' => $wgDeleteRevisionsLimit + 1 )
+                       );
+
+                       $revCount = $dbr->query(
+                               'SELECT COUNT(*) FROM (' . $innerQuery . ') AS innerQuery',
+                               __METHOD__
+                       );
+                       $revCount = $revCount->fetchRow();
+                       $revCount = $revCount['COUNT(*)'];
+
+                       $this->mIsBigDeletion = $revCount > $wgDeleteRevisionsLimit;
+               }
+
+               return $this->mIsBigDeletion;
        }
 
        /**
-        * Get the  approximate revision count of this page.
+        * Get the approximate revision count of this page.
         *
         * @return int
         */
@@ -4565,7 +4272,9 @@ class Title {
         * @return bool
         */
        public function exists() {
-               return $this->getArticleID() != 0;
+               $exists = $this->getArticleID() != 0;
+               wfRunHooks( 'TitleExists', array( $this, &$exists ) );
+               return $exists;
        }
 
        /**
index 7e846ad..e6425f8 100644 (file)
@@ -357,21 +357,14 @@ class User implements IDBAccessObject {
         * @return bool False if the ID does not exist, true otherwise
         */
        public function loadFromId() {
-               global $wgMemc;
                if ( $this->mId == 0 ) {
                        $this->loadDefaults();
                        return false;
                }
 
                // Try cache
-               $key = wfMemcKey( 'user', 'id', $this->mId );
-               $data = $wgMemc->get( $key );
-               if ( !is_array( $data ) || $data['mVersion'] != self::VERSION ) {
-                       // Object is expired, load from DB
-                       $data = false;
-               }
-
-               if ( !$data ) {
+               $cache = $this->loadFromCache();
+               if ( !$cache ) {
                        wfDebug( "User: cache miss for user {$this->mId}\n" );
                        // Load from DB
                        if ( !$this->loadFromDatabase() ) {
@@ -379,12 +372,6 @@ class User implements IDBAccessObject {
                                return false;
                        }
                        $this->saveToCache();
-               } else {
-                       wfDebug( "User: got user {$this->mId} from cache\n" );
-                       // Restore from cache
-                       foreach ( self::$mCacheVars as $name ) {
-                               $this->$name = $data[$name];
-                       }
                }
 
                $this->mLoadedItems = true;
@@ -392,6 +379,37 @@ class User implements IDBAccessObject {
                return true;
        }
 
+       /**
+        * Load user data from shared cache, given mId has already been set.
+        *
+        * @return bool false if the ID does not exist or data is invalid, true otherwise
+        * @since 1.25
+        */
+       public function loadFromCache() {
+               global $wgMemc;
+
+               if ( $this->mId == 0 ) {
+                       $this->loadDefaults();
+                       return false;
+               }
+
+               $key = wfMemcKey( 'user', 'id', $this->mId );
+               $data = $wgMemc->get( $key );
+               if ( !is_array( $data ) || $data['mVersion'] < self::VERSION ) {
+                       // Object is expired
+                       return false;
+               }
+
+               wfDebug( "User: got user {$this->mId} from cache\n" );
+
+               // Restore from cache
+               foreach ( self::$mCacheVars as $name ) {
+                       $this->$name = $data[$name];
+               }
+
+               return true;
+       }
+
        /**
         * Save user data to the shared cache
         */
@@ -829,7 +847,7 @@ class User implements IDBAccessObject {
         * @param int $ts Optional timestamp to convert, default 0 for the current time
         */
        public function expirePassword( $ts = 0 ) {
-               $this->load();
+               $this->loadPasswords();
                $timestamp = wfTimestamp( TS_MW, $ts );
                $this->mPasswordExpires = $timestamp;
                $this->saveSettings();
@@ -1734,7 +1752,9 @@ class User implements IDBAccessObject {
                // If more than one group applies, use the group with the highest limit
                foreach ( $this->getGroups() as $group ) {
                        if ( isset( $limits[$group] ) ) {
-                               if ( $userLimit === false || $limits[$group] > $userLimit ) {
+                               if ( $userLimit === false
+                                       || $limits[$group][0] / $limits[$group][1] > $userLimit[0] / $userLimit[1]
+                               ) {
                                        $userLimit = $limits[$group];
                                }
                        }
@@ -1885,7 +1905,6 @@ class User implements IDBAccessObject {
                        return $this->mLocked;
                }
                global $wgAuth;
-               StubObject::unstub( $wgAuth );
                $authUser = $wgAuth->getUserInstance( $this );
                $this->mLocked = (bool)$authUser->isLocked();
                return $this->mLocked;
@@ -1903,7 +1922,6 @@ class User implements IDBAccessObject {
                $this->getBlockedStatus();
                if ( !$this->mHideName ) {
                        global $wgAuth;
-                       StubObject::unstub( $wgAuth );
                        $authUser = $wgAuth->getUserInstance( $this );
                        $this->mHideName = (bool)$authUser->isHidden();
                }
@@ -2335,11 +2353,7 @@ class User implements IDBAccessObject {
                $this->setToken();
 
                $passwordFactory = self::getPasswordFactory();
-               if ( $str === null ) {
-                       $this->mPassword = $passwordFactory->newFromCiphertext( null );
-               } else {
-                       $this->mPassword = $passwordFactory->newFromPlaintext( $str );
-               }
+               $this->mPassword = $passwordFactory->newFromPlaintext( $str );
 
                $this->mNewpassword = $passwordFactory->newFromCiphertext( null );
                $this->mNewpassTime = null;
@@ -2384,14 +2398,11 @@ class User implements IDBAccessObject {
        public function setNewpassword( $str, $throttle = true ) {
                $this->loadPasswords();
 
+               $this->mNewpassword = self::getPasswordFactory()->newFromPlaintext( $str );
                if ( $str === null ) {
-                       $this->mNewpassword = '';
                        $this->mNewpassTime = null;
-               } else {
-                       $this->mNewpassword = self::getPasswordFactory()->newFromPlaintext( $str );
-                       if ( $throttle ) {
-                               $this->mNewpassTime = wfTimestampNow();
-                       }
+               } elseif ( $throttle ) {
+                       $this->mNewpassTime = wfTimestampNow();
                }
        }
 
@@ -3086,10 +3097,8 @@ class User implements IDBAccessObject {
        /**
         * Check if user is allowed to access a feature / make an action
         *
-        * @internal param \String $varargs permissions to test
+        * @param string $permissions,... Permissions to test
         * @return bool True if user is allowed to perform *any* of the given actions
-        *
-        * @return bool
         */
        public function isAllowedAny( /*...*/ ) {
                $permissions = func_get_args();
@@ -3103,7 +3112,7 @@ class User implements IDBAccessObject {
 
        /**
         *
-        * @internal param $varargs string
+        * @param string $permissions,... Permissions to test
         * @return bool True if the user is allowed to perform *all* of the given actions
         */
        public function isAllowedAll( /*...*/ ) {
@@ -3790,12 +3799,14 @@ class User implements IDBAccessObject {
         */
        public function checkPassword( $password ) {
                global $wgAuth, $wgLegacyEncoding;
+
+               $section = new ProfileSection( __METHOD__ );
+
                $this->loadPasswords();
 
                // Certain authentication plugins do NOT want to save
                // domain passwords in a mysql database, so we should
                // check this (in case $wgAuth->strict() is false).
-
                if ( $wgAuth->authenticate( $this->getName(), $password ) ) {
                        return true;
                } elseif ( $wgAuth->strict() ) {
@@ -3994,10 +4005,10 @@ class User implements IDBAccessObject {
                        $sender = new MailAddress( $wgPasswordSender,
                                wfMessage( 'emailsender' )->inContentLanguage()->text() );
                } else {
-                       $sender = new MailAddress( $from );
+                       $sender = MailAddress::newFromUser( $from );
                }
 
-               $to = new MailAddress( $this );
+               $to = MailAddress::newFromUser( $this );
                return UserMailer::send( $to, $sender, $subject, $body, $replyto );
        }
 
diff --git a/includes/UserMailer.php b/includes/UserMailer.php
deleted file mode 100644 (file)
index 0ce9b5a..0000000
+++ /dev/null
@@ -1,949 +0,0 @@
-<?php
-/**
- * Classes used to send e-mails
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author <brion@pobox.com>
- * @author <mail@tgries.de>
- * @author Tim Starling
- * @author Luke Welling lwelling@wikimedia.org
- */
-
-/**
- * Stores a single person's name and email address.
- * These are passed in via the constructor, and will be returned in SMTP
- * header format when requested.
- */
-class MailAddress {
-       /**
-        * @param string|User $address String with an email address, or a User object
-        * @param string $name Human-readable name if a string address is given
-        * @param string $realName Human-readable real name if a string address is given
-        */
-       function __construct( $address, $name = null, $realName = null ) {
-               if ( is_object( $address ) && $address instanceof User ) {
-                       $this->address = $address->getEmail();
-                       $this->name = $address->getName();
-                       $this->realName = $address->getRealName();
-               } else {
-                       $this->address = strval( $address );
-                       $this->name = strval( $name );
-                       $this->realName = strval( $realName );
-               }
-       }
-
-       /**
-        * Return formatted and quoted address to insert into SMTP headers
-        * @return string
-        */
-       function toString() {
-               # PHP's mail() implementation under Windows is somewhat shite, and
-               # can't handle "Joe Bloggs <joe@bloggs.com>" format email addresses,
-               # so don't bother generating them
-               if ( $this->address ) {
-                       if ( $this->name != '' && !wfIsWindows() ) {
-                               global $wgEnotifUseRealName;
-                               $name = ( $wgEnotifUseRealName && $this->realName !== '' ) ? $this->realName : $this->name;
-                               $quoted = UserMailer::quotedPrintable( $name );
-                               if ( strpos( $quoted, '.' ) !== false || strpos( $quoted, ',' ) !== false ) {
-                                       $quoted = '"' . $quoted . '"';
-                               }
-                               return "$quoted <{$this->address}>";
-                       } else {
-                               return $this->address;
-                       }
-               } else {
-                       return "";
-               }
-       }
-
-       function __toString() {
-               return $this->toString();
-       }
-}
-
-/**
- * Collection of static functions for sending mail
- */
-class UserMailer {
-       private static $mErrorString;
-
-       /**
-        * Send mail using a PEAR mailer
-        *
-        * @param UserMailer $mailer
-        * @param string $dest
-        * @param string $headers
-        * @param string $body
-        *
-        * @return Status
-        */
-       protected static function sendWithPear( $mailer, $dest, $headers, $body ) {
-               $mailResult = $mailer->send( $dest, $headers, $body );
-
-               # Based on the result return an error string,
-               if ( PEAR::isError( $mailResult ) ) {
-                       wfDebug( "PEAR::Mail failed: " . $mailResult->getMessage() . "\n" );
-                       return Status::newFatal( 'pear-mail-error', $mailResult->getMessage() );
-               } else {
-                       return Status::newGood();
-               }
-       }
-
-       /**
-        * Creates a single string from an associative array
-        *
-        * @param array $headers Associative Array: keys are header field names,
-        *                 values are ... values.
-        * @param string $endl The end of line character.  Defaults to "\n"
-        *
-        * Note RFC2822 says newlines must be CRLF (\r\n)
-        * but php mail naively "corrects" it and requires \n for the "correction" to work
-        *
-        * @return string
-        */
-       static function arrayToHeaderString( $headers, $endl = "\n" ) {
-               $strings = array();
-               foreach ( $headers as $name => $value ) {
-                       // Prevent header injection by stripping newlines from value
-                       $value = self::sanitizeHeaderValue( $value );
-                       $strings[] = "$name: $value";
-               }
-               return implode( $endl, $strings );
-       }
-
-       /**
-        * Create a value suitable for the MessageId Header
-        *
-        * @return string
-        */
-       static function makeMsgId() {
-               global $wgSMTP, $wgServer;
-
-               $msgid = uniqid( wfWikiID() . ".", true ); /* true required for cygwin */
-               if ( is_array( $wgSMTP ) && isset( $wgSMTP['IDHost'] ) && $wgSMTP['IDHost'] ) {
-                       $domain = $wgSMTP['IDHost'];
-               } else {
-                       $url = wfParseUrl( $wgServer );
-                       $domain = $url['host'];
-               }
-               return "<$msgid@$domain>";
-       }
-
-       /**
-        * This function will perform a direct (authenticated) login to
-        * a SMTP Server to use for mail relaying if 'wgSMTP' specifies an
-        * array of parameters. It requires PEAR:Mail to do that.
-        * Otherwise it just uses the standard PHP 'mail' function.
-        *
-        * @param MailAddress|MailAddress[] $to Recipient's email (or an array of them)
-        * @param MailAddress $from Sender's email
-        * @param string $subject Email's subject.
-        * @param string $body Email's text or Array of two strings to be the text and html bodies
-        * @param MailAddress $replyto Optional reply-to email (default: null).
-        * @param string $contentType Optional custom Content-Type (default: text/plain; charset=UTF-8)
-        * @throws MWException
-        * @throws Exception
-        * @return Status
-        */
-       public static function send( $to, $from, $subject, $body, $replyto = null,
-               $contentType = 'text/plain; charset=UTF-8'
-       ) {
-               global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams, $wgAllowHTMLEmail;
-               $mime = null;
-               if ( !is_array( $to ) ) {
-                       $to = array( $to );
-               }
-
-               // mail body must have some content
-               $minBodyLen = 10;
-               // arbitrary but longer than Array or Object to detect casting error
-
-               // body must either be a string or an array with text and body
-               if (
-                       !(
-                               !is_array( $body ) &&
-                               strlen( $body ) >= $minBodyLen
-                       )
-                       &&
-                       !(
-                               is_array( $body ) &&
-                               isset( $body['text'] ) &&
-                               isset( $body['html'] ) &&
-                               strlen( $body['text'] ) >= $minBodyLen &&
-                               strlen( $body['html'] ) >= $minBodyLen
-                       )
-               ) {
-                       // if it is neither we have a problem
-                       return Status::newFatal( 'user-mail-no-body' );
-               }
-
-               if ( !$wgAllowHTMLEmail && is_array( $body ) ) {
-                       // HTML not wanted.  Dump it.
-                       $body = $body['text'];
-               }
-
-               wfDebug( __METHOD__ . ': sending mail to ' . implode( ', ', $to ) . "\n" );
-
-               # Make sure we have at least one address
-               $has_address = false;
-               foreach ( $to as $u ) {
-                       if ( $u->address ) {
-                               $has_address = true;
-                               break;
-                       }
-               }
-               if ( !$has_address ) {
-                       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
-
-               $headers['From'] = $from->toString();
-               $returnPath = $from->address;
-               $extraParams = $wgAdditionalMailParams;
-
-               // Hook to generate custom VERP address for 'Return-Path'
-               wfRunHooks( 'UserMailerChangeReturnPath', array( $to, &$returnPath ) );
-               # Add the envelope sender address using the -f command line option when PHP mail() is used.
-               # Will default to the $from->address when the UserMailerChangeReturnPath hook fails and the
-               # generated VERP address when the hook runs effectively.
-               $extraParams .= ' -f ' . $returnPath;
-
-               $headers['Return-Path'] = $returnPath;
-
-               if ( $replyto ) {
-                       $headers['Reply-To'] = $replyto->toString();
-               }
-
-               $headers['Date'] = MWTimestamp::getLocalInstance()->format( 'r' );
-               $headers['Message-ID'] = self::makeMsgId();
-               $headers['X-Mailer'] = 'MediaWiki mailer';
-
-               # Line endings need to be different on Unix and Windows due to
-               # the bug described at http://trac.wordpress.org/ticket/2603
-               if ( wfIsWindows() ) {
-                       $endl = "\r\n";
-               } else {
-                       $endl = "\n";
-               }
-
-               if ( is_array( $body ) ) {
-                       // we are sending a multipart message
-                       wfDebug( "Assembling multipart mime email\n" );
-                       if ( !stream_resolve_include_path( 'Mail/mime.php' ) ) {
-                               wfDebug( "PEAR Mail_Mime package is not installed. Falling back to text email.\n" );
-                               // remove the html body for text email fall back
-                               $body = $body['text'];
-                       } else {
-                               require_once 'Mail/mime.php';
-                               if ( wfIsWindows() ) {
-                                       $body['text'] = str_replace( "\n", "\r\n", $body['text'] );
-                                       $body['html'] = str_replace( "\n", "\r\n", $body['html'] );
-                               }
-                               $mime = new Mail_mime( array(
-                                       'eol' => $endl,
-                                       'text_charset' => 'UTF-8',
-                                       'html_charset' => 'UTF-8'
-                               ) );
-                               $mime->setTXTBody( $body['text'] );
-                               $mime->setHTMLBody( $body['html'] );
-                               $body = $mime->get(); // must call get() before headers()
-                               $headers = $mime->headers( $headers );
-                       }
-               }
-               if ( $mime === null ) {
-                       // sending text only, either deliberately or as a fallback
-                       if ( wfIsWindows() ) {
-                               $body = str_replace( "\n", "\r\n", $body );
-                       }
-                       $headers['MIME-Version'] = '1.0';
-                       $headers['Content-type'] = ( is_null( $contentType ) ?
-                               'text/plain; charset=UTF-8' : $contentType );
-                       $headers['Content-transfer-encoding'] = '8bit';
-               }
-
-               $ret = wfRunHooks( 'AlternateUserMailer', array( $headers, $to, $from, $subject, $body ) );
-               if ( $ret === false ) {
-                       // the hook implementation will return false to skip regular mail sending
-                       return Status::newGood();
-               } elseif ( $ret !== true ) {
-                       // the hook implementation will return a string to pass an error message
-                       return Status::newFatal( 'php-mail-error', $ret );
-               }
-
-               if ( is_array( $wgSMTP ) ) {
-                       #
-                       # PEAR MAILER
-                       #
-
-                       if ( !stream_resolve_include_path( 'Mail.php' ) ) {
-                               throw new MWException( 'PEAR mail package is not installed' );
-                       }
-                       require_once 'Mail.php';
-
-                       wfSuppressWarnings();
-
-                       // Create the mail object using the Mail::factory method
-                       $mail_object =& Mail::factory( 'smtp', $wgSMTP );
-                       if ( PEAR::isError( $mail_object ) ) {
-                               wfDebug( "PEAR::Mail factory failed: " . $mail_object->getMessage() . "\n" );
-                               wfRestoreWarnings();
-                               return Status::newFatal( 'pear-mail-error', $mail_object->getMessage() );
-                       }
-
-                       wfDebug( "Sending mail via PEAR::Mail\n" );
-
-                       $headers['Subject'] = self::quotedPrintable( $subject );
-
-                       # When sending only to one recipient, shows it its email using To:
-                       if ( count( $to ) == 1 ) {
-                               $headers['To'] = $to[0]->toString();
-                       }
-
-                       # Split jobs since SMTP servers tends to limit the maximum
-                       # number of possible recipients.
-                       $chunks = array_chunk( $to, $wgEnotifMaxRecips );
-                       foreach ( $chunks as $chunk ) {
-                               $status = self::sendWithPear( $mail_object, $chunk, $headers, $body );
-                               # FIXME : some chunks might be sent while others are not!
-                               if ( !$status->isOK() ) {
-                                       wfRestoreWarnings();
-                                       return $status;
-                               }
-                       }
-                       wfRestoreWarnings();
-                       return Status::newGood();
-               } else {
-                       #
-                       # PHP mail()
-                       #
-                       if ( count( $to ) > 1 ) {
-                               $headers['To'] = 'undisclosed-recipients:;';
-                       }
-                       $headers = self::arrayToHeaderString( $headers, $endl );
-
-                       wfDebug( "Sending mail via internal mail() function\n" );
-
-                       self::$mErrorString = '';
-                       $html_errors = ini_get( 'html_errors' );
-                       ini_set( 'html_errors', '0' );
-                       set_error_handler( 'UserMailer::errorHandler' );
-
-                       try {
-                               $safeMode = wfIniGetBool( 'safe_mode' );
-
-                               foreach ( $to as $recip ) {
-                                       if ( $safeMode ) {
-                                               $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers );
-                                       } else {
-                                               $sent = mail(
-                                                       $recip,
-                                                       self::quotedPrintable( $subject ),
-                                                       $body,
-                                                       $headers,
-                                                       $extraParams
-                                               );
-                                       }
-                               }
-                       } catch ( Exception $e ) {
-                               restore_error_handler();
-                               throw $e;
-                       }
-
-                       restore_error_handler();
-                       ini_set( 'html_errors', $html_errors );
-
-                       if ( self::$mErrorString ) {
-                               wfDebug( "Error sending mail: " . self::$mErrorString . "\n" );
-                               return Status::newFatal( 'php-mail-error', self::$mErrorString );
-                       } elseif ( !$sent ) {
-                               // mail function only tells if there's an error
-                               wfDebug( "Unknown error sending mail\n" );
-                               return Status::newFatal( 'php-mail-error-unknown' );
-                       } else {
-                               return Status::newGood();
-                       }
-               }
-       }
-
-       /**
-        * Set the mail error message in self::$mErrorString
-        *
-        * @param int $code Error number
-        * @param string $string Error message
-        */
-       static function errorHandler( $code, $string ) {
-               self::$mErrorString = preg_replace( '/^mail\(\)(\s*\[.*?\])?: /', '', $string );
-       }
-
-       /**
-        * Strips bad characters from a header value to prevent PHP mail header injection attacks
-        * @param string $val String to be santizied
-        * @return string
-        */
-       public static function sanitizeHeaderValue( $val ) {
-               return strtr( $val, array( "\r" => '', "\n" => '' ) );
-       }
-
-       /**
-        * Converts a string into a valid RFC 822 "phrase", such as is used for the sender name
-        * @param string $phrase
-        * @return string
-        */
-       public static function rfc822Phrase( $phrase ) {
-               // Remove line breaks
-               $phrase = self::sanitizeHeaderValue( $phrase );
-               // Remove quotes
-               $phrase = str_replace( '"', '', $phrase );
-               return '"' . $phrase . '"';
-       }
-
-       /**
-        * Converts a string into quoted-printable format
-        * @since 1.17
-        *
-        * From PHP5.3 there is a built in function quoted_printable_encode()
-        * This method does not duplicate that.
-        * This method is doing Q encoding inside encoded-words as defined by RFC 2047
-        * This is for email headers.
-        * The built in quoted_printable_encode() is for email bodies
-        * @param string $string
-        * @param string $charset
-        * @return string
-        */
-       public static function quotedPrintable( $string, $charset = '' ) {
-               # Probably incomplete; see RFC 2045
-               if ( empty( $charset ) ) {
-                       $charset = 'UTF-8';
-               }
-               $charset = strtoupper( $charset );
-               $charset = str_replace( 'ISO-8859', 'ISO8859', $charset ); // ?
-
-               $illegal = '\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff=';
-               $replace = $illegal . '\t ?_';
-               if ( !preg_match( "/[$illegal]/", $string ) ) {
-                       return $string;
-               }
-               $out = "=?$charset?Q?";
-               $out .= preg_replace_callback( "/([$replace])/",
-                       array( __CLASS__, 'quotedPrintableCallback' ), $string );
-               $out .= '?=';
-               return $out;
-       }
-
-       protected static function quotedPrintableCallback( $matches ) {
-               return sprintf( "=%02X", ord( $matches[1] ) );
-       }
-}
-
-/**
- * This module processes the email notifications when the current page is
- * changed. It looks up the table watchlist to find out which users are watching
- * that page.
- *
- * The current implementation sends independent emails to each watching user for
- * the following reason:
- *
- * - Each watching user will be notified about the page edit time expressed in
- * his/her local time (UTC is shown additionally). To achieve this, we need to
- * find the individual timeoffset of each watching user from the preferences..
- *
- * Suggested improvement to slack down the number of sent emails: We could think
- * of sending out bulk mails (bcc:user1,user2...) for all these users having the
- * same timeoffset in their preferences.
- *
- * Visit the documentation pages under http://meta.wikipedia.com/Enotif
- *
- *
- */
-class EmailNotification {
-       protected $subject, $body, $replyto, $from;
-       protected $timestamp, $summary, $minorEdit, $oldid, $composed_common, $pageStatus;
-       protected $mailTargets = array();
-
-       /**
-        * @var Title
-        */
-       protected $title;
-
-       /**
-        * @var User
-        */
-       protected $editor;
-
-       /**
-        * Send emails corresponding to the user $editor editing the page $title.
-        * Also updates wl_notificationtimestamp.
-        *
-        * May be deferred via the job queue.
-        *
-        * @param User $editor
-        * @param Title $title
-        * @param string $timestamp
-        * @param string $summary
-        * @param bool $minorEdit
-        * @param bool $oldid (default: false)
-        * @param string $pageStatus (default: 'changed')
-        */
-       public function notifyOnPageChange( $editor, $title, $timestamp, $summary,
-               $minorEdit, $oldid = false, $pageStatus = 'changed'
-       ) {
-               global $wgEnotifUseJobQ, $wgEnotifWatchlist, $wgShowUpdatedMarker, $wgEnotifMinorEdits,
-                       $wgUsersNotifiedOnAllChanges, $wgEnotifUserTalk;
-
-               if ( $title->getNamespace() < 0 ) {
-                       return;
-               }
-
-               // Build a list of users to notify
-               $watchers = array();
-               if ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $res = $dbw->select( array( 'watchlist' ),
-                               array( 'wl_user' ),
-                               array(
-                                       'wl_user != ' . intval( $editor->getID() ),
-                                       'wl_namespace' => $title->getNamespace(),
-                                       'wl_title' => $title->getDBkey(),
-                                       'wl_notificationtimestamp IS NULL',
-                               ), __METHOD__
-                       );
-                       foreach ( $res as $row ) {
-                               $watchers[] = intval( $row->wl_user );
-                       }
-                       if ( $watchers ) {
-                               // Update wl_notificationtimestamp for all watching users except the editor
-                               $fname = __METHOD__;
-                               $dbw->onTransactionIdle(
-                                       function () use ( $dbw, $timestamp, $watchers, $title, $fname ) {
-                                               $dbw->update( 'watchlist',
-                                                       array( /* SET */
-                                                               'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
-                                                       ), array( /* WHERE */
-                                                               'wl_user' => $watchers,
-                                                               'wl_namespace' => $title->getNamespace(),
-                                                               'wl_title' => $title->getDBkey(),
-                                                       ), $fname
-                                               );
-                                       }
-                               );
-                       }
-               }
-
-               $sendEmail = true;
-               // 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
-               // $watchers deals with $wgEnotifWatchlist
-               if ( !count( $watchers ) && !count( $wgUsersNotifiedOnAllChanges ) ) {
-                       $sendEmail = false;
-                       // Only send notification for non minor edits, unless $wgEnotifMinorEdits
-                       if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
-                               $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
-                               if ( $wgEnotifUserTalk
-                                       && $isUserTalkPage
-                                       && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
-                               ) {
-                                       $sendEmail = true;
-                               }
-                       }
-               }
-
-               if ( !$sendEmail ) {
-                       return;
-               }
-
-               if ( $wgEnotifUseJobQ ) {
-                       $params = array(
-                               'editor' => $editor->getName(),
-                               'editorID' => $editor->getID(),
-                               'timestamp' => $timestamp,
-                               'summary' => $summary,
-                               'minorEdit' => $minorEdit,
-                               'oldid' => $oldid,
-                               'watchers' => $watchers,
-                               'pageStatus' => $pageStatus
-                       );
-                       $job = new EnotifNotifyJob( $title, $params );
-                       JobQueueGroup::singleton()->push( $job );
-               } else {
-                       $this->actuallyNotifyOnPageChange(
-                               $editor,
-                               $title,
-                               $timestamp,
-                               $summary,
-                               $minorEdit,
-                               $oldid,
-                               $watchers,
-                               $pageStatus
-                       );
-               }
-       }
-
-       /**
-        * Immediate version of notifyOnPageChange().
-        *
-        * Send emails corresponding to the user $editor editing the page $title.
-        * Also updates wl_notificationtimestamp.
-        *
-        * @param User $editor
-        * @param Title $title
-        * @param string $timestamp Edit timestamp
-        * @param string $summary Edit summary
-        * @param bool $minorEdit
-        * @param int $oldid Revision ID
-        * @param array $watchers Array of user IDs
-        * @param string $pageStatus
-        * @throws MWException
-        */
-       public function actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit,
-               $oldid, $watchers, $pageStatus = 'changed' ) {
-               # we use $wgPasswordSender as sender's address
-               global $wgEnotifWatchlist;
-               global $wgEnotifMinorEdits, $wgEnotifUserTalk;
-
-               wfProfileIn( __METHOD__ );
-
-               # The following code is only run, if several conditions are met:
-               # 1. EmailNotification for pages (other than user_talk pages) must be enabled
-               # 2. minor edits (changes) are only regarded if the global flag indicates so
-
-               $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
-
-               $this->title = $title;
-               $this->timestamp = $timestamp;
-               $this->summary = $summary;
-               $this->minorEdit = $minorEdit;
-               $this->oldid = $oldid;
-               $this->editor = $editor;
-               $this->composed_common = false;
-               $this->pageStatus = $pageStatus;
-
-               $formattedPageStatus = array( 'deleted', 'created', 'moved', 'restored', 'changed' );
-
-               wfRunHooks( 'UpdateUserMailerFormattedPageStatus', array( &$formattedPageStatus ) );
-               if ( !in_array( $this->pageStatus, $formattedPageStatus ) ) {
-                       wfProfileOut( __METHOD__ );
-                       throw new MWException( 'Not a valid page status!' );
-               }
-
-               $userTalkId = false;
-
-               if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
-                       if ( $wgEnotifUserTalk
-                               && $isUserTalkPage
-                               && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
-                       ) {
-                               $targetUser = User::newFromName( $title->getText() );
-                               $this->compose( $targetUser );
-                               $userTalkId = $targetUser->getId();
-                       }
-
-                       if ( $wgEnotifWatchlist ) {
-                               // Send updates to watchers other than the current editor
-                               $userArray = UserArray::newFromIDs( $watchers );
-                               foreach ( $userArray as $watchingUser ) {
-                                       if ( $watchingUser->getOption( 'enotifwatchlistpages' )
-                                               && ( !$minorEdit || $watchingUser->getOption( 'enotifminoredits' ) )
-                                               && $watchingUser->isEmailConfirmed()
-                                               && $watchingUser->getID() != $userTalkId
-                                       ) {
-                                               if ( wfRunHooks( 'SendWatchlistEmailNotification', array( $watchingUser, $title, $this ) ) ) {
-                                                       $this->compose( $watchingUser );
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               global $wgUsersNotifiedOnAllChanges;
-               foreach ( $wgUsersNotifiedOnAllChanges as $name ) {
-                       if ( $editor->getName() == $name ) {
-                               // No point notifying the user that actually made the change!
-                               continue;
-                       }
-                       $user = User::newFromName( $name );
-                       $this->compose( $user );
-               }
-
-               $this->sendMails();
-               wfProfileOut( __METHOD__ );
-       }
-
-       /**
-        * @param User $editor
-        * @param Title $title
-        * @param bool $minorEdit
-        * @return bool
-        */
-       private function canSendUserTalkEmail( $editor, $title, $minorEdit ) {
-               global $wgEnotifUserTalk;
-               $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
-
-               if ( $wgEnotifUserTalk && $isUserTalkPage ) {
-                       $targetUser = User::newFromName( $title->getText() );
-
-                       if ( !$targetUser || $targetUser->isAnon() ) {
-                               wfDebug( __METHOD__ . ": user talk page edited, but user does not exist\n" );
-                       } elseif ( $targetUser->getId() == $editor->getId() ) {
-                               wfDebug( __METHOD__ . ": user edited their own talk page, no notification sent\n" );
-                       } elseif ( $targetUser->getOption( 'enotifusertalkpages' )
-                               && ( !$minorEdit || $targetUser->getOption( 'enotifminoredits' ) )
-                       ) {
-                               if ( !$targetUser->isEmailConfirmed() ) {
-                                       wfDebug( __METHOD__ . ": talk page owner doesn't have validated email\n" );
-                               } elseif ( !wfRunHooks( 'AbortTalkPageEmailNotification', array( $targetUser, $title ) ) ) {
-                                       wfDebug( __METHOD__ . ": talk page update notification is aborted for this user\n" );
-                               } else {
-                                       wfDebug( __METHOD__ . ": sending talk page update notification\n" );
-                                       return true;
-                               }
-                       } else {
-                               wfDebug( __METHOD__ . ": talk page owner doesn't want notifications\n" );
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Generate the generic "this page has been changed" e-mail text.
-        */
-       private function composeCommonMailtext() {
-               global $wgPasswordSender, $wgNoReplyAddress;
-               global $wgEnotifFromEditor, $wgEnotifRevealEditorAddress;
-               global $wgEnotifImpersonal, $wgEnotifUseRealName;
-
-               $this->composed_common = true;
-
-               # You as the WikiAdmin and Sysops can make use of plenty of
-               # named variables when composing your notification emails while
-               # simply editing the Meta pages
-
-               $keys = array();
-               $postTransformKeys = array();
-               $pageTitleUrl = $this->title->getCanonicalURL();
-               $pageTitle = $this->title->getPrefixedText();
-
-               if ( $this->oldid ) {
-                       // Always show a link to the diff which triggered the mail. See bug 32210.
-                       $keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
-                               $this->title->getCanonicalURL( array( 'diff' => 'next', 'oldid' => $this->oldid ) ) )
-                               ->inContentLanguage()->text();
-
-                       if ( !$wgEnotifImpersonal ) {
-                               // For personal mail, also show a link to the diff of all changes
-                               // since last visited.
-                               $keys['$NEWPAGE'] .= "\n\n" . wfMessage( 'enotif_lastvisited',
-                                       $this->title->getCanonicalURL( array( 'diff' => '0', 'oldid' => $this->oldid ) ) )
-                                       ->inContentLanguage()->text();
-                       }
-                       $keys['$OLDID'] = $this->oldid;
-                       // Deprecated since MediaWiki 1.21, not used by default. Kept for backwards-compatibility.
-                       $keys['$CHANGEDORCREATED'] = wfMessage( 'changed' )->inContentLanguage()->text();
-               } else {
-                       # clear $OLDID placeholder in the message template
-                       $keys['$OLDID'] = '';
-                       $keys['$NEWPAGE'] = '';
-                       // Deprecated since MediaWiki 1.21, not used by default. Kept for backwards-compatibility.
-                       $keys['$CHANGEDORCREATED'] = wfMessage( 'created' )->inContentLanguage()->text();
-               }
-
-               $keys['$PAGETITLE'] = $this->title->getPrefixedText();
-               $keys['$PAGETITLE_URL'] = $this->title->getCanonicalURL();
-               $keys['$PAGEMINOREDIT'] = $this->minorEdit ?
-                       wfMessage( 'minoredit' )->inContentLanguage()->text() : '';
-               $keys['$UNWATCHURL'] = $this->title->getCanonicalURL( 'action=unwatch' );
-
-               if ( $this->editor->isAnon() ) {
-                       # real anon (user:xxx.xxx.xxx.xxx)
-                       $keys['$PAGEEDITOR'] = wfMessage( 'enotif_anon_editor', $this->editor->getName() )
-                               ->inContentLanguage()->text();
-                       $keys['$PAGEEDITOR_EMAIL'] = wfMessage( 'noemailtitle' )->inContentLanguage()->text();
-
-               } else {
-                       $keys['$PAGEEDITOR'] = $wgEnotifUseRealName && $this->editor->getRealName() !== ''
-                               ? $this->editor->getRealName() : $this->editor->getName();
-                       $emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $this->editor->getName() );
-                       $keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalURL();
-               }
-
-               $keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalURL();
-               $keys['$HELPPAGE'] = wfExpandUrl(
-                       Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() )
-               );
-
-               # Replace this after transforming the message, bug 35019
-               $postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
-
-               // Now build message's subject and body
-
-               // Messages:
-               // enotif_subject_deleted, enotif_subject_created, enotif_subject_moved,
-               // enotif_subject_restored, enotif_subject_changed
-               $this->subject = wfMessage( 'enotif_subject_' . $this->pageStatus )->inContentLanguage()
-                       ->params( $pageTitle, $keys['$PAGEEDITOR'] )->text();
-
-               // Messages:
-               // enotif_body_intro_deleted, enotif_body_intro_created, enotif_body_intro_moved,
-               // enotif_body_intro_restored, enotif_body_intro_changed
-               $keys['$PAGEINTRO'] = wfMessage( 'enotif_body_intro_' . $this->pageStatus )
-                       ->inContentLanguage()->params( $pageTitle, $keys['$PAGEEDITOR'], $pageTitleUrl )
-                       ->text();
-
-               $body = wfMessage( 'enotif_body' )->inContentLanguage()->plain();
-               $body = strtr( $body, $keys );
-               $body = MessageCache::singleton()->transform( $body, false, null, $this->title );
-               $this->body = wordwrap( strtr( $body, $postTransformKeys ), 72 );
-
-               # Reveal the page editor's address as REPLY-TO address only if
-               # the user has not opted-out and the option is enabled at the
-               # global configuration level.
-               $adminAddress = new MailAddress( $wgPasswordSender,
-                       wfMessage( 'emailsender' )->inContentLanguage()->text() );
-               if ( $wgEnotifRevealEditorAddress
-                       && ( $this->editor->getEmail() != '' )
-                       && $this->editor->getOption( 'enotifrevealaddr' )
-               ) {
-                       $editorAddress = new MailAddress( $this->editor );
-                       if ( $wgEnotifFromEditor ) {
-                               $this->from = $editorAddress;
-                       } else {
-                               $this->from = $adminAddress;
-                               $this->replyto = $editorAddress;
-                       }
-               } else {
-                       $this->from = $adminAddress;
-                       $this->replyto = new MailAddress( $wgNoReplyAddress );
-               }
-       }
-
-       /**
-        * Compose a mail to a given user and either queue it for sending, or send it now,
-        * depending on settings.
-        *
-        * Call sendMails() to send any mails that were queued.
-        * @param User $user
-        */
-       function compose( $user ) {
-               global $wgEnotifImpersonal;
-
-               if ( !$this->composed_common ) {
-                       $this->composeCommonMailtext();
-               }
-
-               if ( $wgEnotifImpersonal ) {
-                       $this->mailTargets[] = new MailAddress( $user );
-               } else {
-                       $this->sendPersonalised( $user );
-               }
-       }
-
-       /**
-        * Send any queued mails
-        */
-       function sendMails() {
-               global $wgEnotifImpersonal;
-               if ( $wgEnotifImpersonal ) {
-                       $this->sendImpersonal( $this->mailTargets );
-               }
-       }
-
-       /**
-        * Does the per-user customizations to a notification e-mail (name,
-        * timestamp in proper timezone, etc) and sends it out.
-        * Returns true if the mail was sent successfully.
-        *
-        * @param User $watchingUser
-        * @return bool
-        * @private
-        */
-       function sendPersonalised( $watchingUser ) {
-               global $wgContLang, $wgEnotifUseRealName;
-               // From the PHP manual:
-               //   Note: The to parameter cannot be an address in the form of
-               //   "Something <someone@example.com>". The mail command will not parse
-               //   this properly while talking with the MTA.
-               $to = new MailAddress( $watchingUser );
-
-               # $PAGEEDITDATE is the time and date of the page change
-               # expressed in terms of individual local time of the notification
-               # recipient, i.e. watching user
-               $body = str_replace(
-                       array( '$WATCHINGUSERNAME',
-                               '$PAGEEDITDATE',
-                               '$PAGEEDITTIME' ),
-                       array( $wgEnotifUseRealName && $watchingUser->getRealName() !== ''
-                                       ? $watchingUser->getRealName() : $watchingUser->getName(),
-                               $wgContLang->userDate( $this->timestamp, $watchingUser ),
-                               $wgContLang->userTime( $this->timestamp, $watchingUser ) ),
-                       $this->body );
-
-               return UserMailer::send( $to, $this->from, $this->subject, $body, $this->replyto );
-       }
-
-       /**
-        * Same as sendPersonalised but does impersonal mail suitable for bulk
-        * mailing.  Takes an array of MailAddress objects.
-        * @param MailAddress[] $addresses
-        * @return Status|null
-        */
-       function sendImpersonal( $addresses ) {
-               global $wgContLang;
-
-               if ( empty( $addresses ) ) {
-                       return null;
-               }
-
-               $body = str_replace(
-                               array( '$WATCHINGUSERNAME',
-                                       '$PAGEEDITDATE',
-                                       '$PAGEEDITTIME' ),
-                               array( wfMessage( 'enotif_impersonal_salutation' )->inContentLanguage()->text(),
-                                       $wgContLang->date( $this->timestamp, false, false ),
-                                       $wgContLang->time( $this->timestamp, false, false ) ),
-                               $this->body );
-
-               return UserMailer::send( $addresses, $this->from, $this->subject, $body, $this->replyto );
-       }
-
-} # end of class EmailNotification
index 93d6c0b..ab136b8 100644 (file)
@@ -164,6 +164,7 @@ class WatchedItem {
        /**
         * Check permissions
         * @param string $what 'viewmywatchlist' or 'editmywatchlist'
+        * @return bool
         */
        private function isAllowed( $what ) {
                return !$this->mCheckRights || $this->mUser->isAllowed( $what );
@@ -273,7 +274,7 @@ class WatchedItem {
         * @param WatchedItem[] $items
         * @return bool
         */
-       static public function batchAddWatch( array $items ) {
+       public static function batchAddWatch( array $items ) {
                $section = new ProfileSection( __METHOD__ );
 
                if ( wfReadOnly() ) {
@@ -308,7 +309,7 @@ class WatchedItem {
                }
 
                $dbw = wfGetDB( DB_MASTER );
-               foreach( array_chunk( $rows, 100 ) as $toInsert ) {
+               foreach ( array_chunk( $rows, 100 ) as $toInsert ) {
                        // Use INSERT IGNORE to avoid overwriting the notification timestamp
                        // if there's already an entry for this page
                        $dbw->insert( 'watchlist', $toInsert, __METHOD__, 'IGNORE' );
index a1fa0eb..bf99e95 100644 (file)
@@ -181,7 +181,12 @@ class WebRequest {
                                continue;
                        }
                        $host = $parts[0];
-                       if ( $parts[1] === false ) {
+                       if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) {
+                               // Bug 70021: Assume that upstream proxy is running on the default
+                               // port based on the protocol. We have no reliable way to determine
+                               // the actual port in use upstream.
+                               $port = $stdPort;
+                       } elseif ( $parts[1] === false ) {
                                if ( isset( $_SERVER['SERVER_PORT'] ) ) {
                                        $port = $_SERVER['SERVER_PORT'];
                                } // else leave it as $stdPort
@@ -700,21 +705,22 @@ class WebRequest {
 
        /**
         * Take an arbitrary query and rewrite the present URL to include it
+        * @deprecated Use appendQueryValue/appendQueryArray instead
         * @param string $query Query string fragment; do not include initial '?'
-        *
         * @return string
         */
        public function appendQuery( $query ) {
+               wfDeprecated( __METHOD__, '1.25' );
                return $this->appendQueryArray( wfCgiToArray( $query ) );
        }
 
        /**
         * @param string $key
         * @param string $value
-        * @param bool $onlyquery
+        * @param bool $onlyquery [deprecated]
         * @return string
         */
-       public function appendQueryValue( $key, $value, $onlyquery = false ) {
+       public function appendQueryValue( $key, $value, $onlyquery = true ) {
                return $this->appendQueryArray( array( $key => $value ), $onlyquery );
        }
 
@@ -722,16 +728,21 @@ 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
+        * @param bool $onlyquery Whether to only return the query string and not the complete URL [deprecated]
         * @return string
         */
-       public function appendQueryArray( $array, $onlyquery = false ) {
+       public function appendQueryArray( $array, $onlyquery = true ) {
                global $wgTitle;
                $newquery = $this->getQueryValues();
                unset( $newquery['title'] );
                $newquery = array_merge( $newquery, $array );
                $query = wfArrayToCgi( $newquery );
-               return $onlyquery ? $query : $wgTitle->getLocalURL( $query );
+               if ( !$onlyquery ) {
+                       wfDeprecated( __METHOD__, '1.25' );
+                       return $wgTitle->getLocalURL( $query );
+               }
+
+               return $query;
        }
 
        /**
@@ -1250,6 +1261,7 @@ class WebRequestUpload {
 class FauxRequest extends WebRequest {
        private $wasPosted = false;
        private $session = array();
+       private $requestUrl;
 
        /**
         * @param array $data Array of *non*-urlencoded key => value pairs, the
@@ -1329,8 +1341,15 @@ class FauxRequest extends WebRequest {
                return false;
        }
 
+       public function setRequestURL( $url ) {
+               $this->requestUrl = $url;
+       }
+
        public function getRequestURL() {
-               $this->notImplemented( __METHOD__ );
+               if ( $this->requestUrl === null ) {
+                       throw new MWException( 'Request URL not set' );
+               }
+               return $this->requestUrl;
        }
 
        public function getProtocol() {
index e137628..cb35ee5 100644 (file)
@@ -6,7 +6,7 @@
  * MW_NO_SETUP is defined.
  *
  * Setup.php (if loaded) then sets up GlobalFunctions, the AutoLoader,
- * and the configuration globals (though not $wgTitle).
+ * and the configuration globals.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -40,8 +40,6 @@ if ( ini_get( 'register_globals' ) ) {
 header( 'X-Content-Type-Options: nosniff' );
 
 $wgRequestTime = microtime( true );
-# getrusage() does not exist on the Microsoft Windows platforms, catching this
-$wgRUstart = function_exists( 'getrusage' ) ? getrusage() : array();
 unset( $IP );
 
 # Valid web server entry point, enable includes.
@@ -60,11 +58,12 @@ if ( $IP === false ) {
        $IP = realpath( '.' ) ?: dirname( __DIR__ );
 }
 
-# Start the autoloader, so that extensions can derive classes from core files
-require_once "$IP/includes/AutoLoader.php";
-
 # Load the profiler
 require_once "$IP/includes/profiler/Profiler.php";
+$wgRUstart = wfGetRusage() ?: array();
+
+# Start the autoloader, so that extensions can derive classes from core files
+require_once "$IP/includes/AutoLoader.php";
 
 # Load up some global defines.
 require_once "$IP/includes/Defines.php";
index 6df6258..159f711 100644 (file)
@@ -134,31 +134,6 @@ class Xml {
                return self::openElement( $element, $attribs ) . $contents . "</$element>";
        }
 
-       /**
-        * Build a drop-down box for selecting a namespace
-        *
-        * @param string $selected Namespace which should be pre-selected
-        * @param string|null $all Value of an item denoting all namespaces, or null to omit
-        * @param string $element_name Value of the "name" attribute of the select tag
-        * @param string $label Optional label to add to the field
-        * @return string
-        * @deprecated since 1.19
-        */
-       public static function namespaceSelector( $selected = '', $all = null,
-               $element_name = 'namespace', $label = null
-       ) {
-               wfDeprecated( __METHOD__, '1.19' );
-               return Html::namespaceSelector( array(
-                       'selected' => $selected,
-                       'all' => $all,
-                       'label' => $label,
-               ), array(
-                       'name' => $element_name,
-                       'id' => 'namespace',
-                       'class' => 'namespaceselector',
-               ) );
-       }
-
        /**
         * Create a date selector
         *
index 7dd4616..8d11d90 100644 (file)
@@ -38,18 +38,21 @@ abstract class Action {
 
        /**
         * Page on which we're performing the action
+        * @since 1.17
         * @var WikiPage|Article|ImagePage|CategoryPage|Page $page
         */
        protected $page;
 
        /**
         * IContextSource if specified; otherwise we'll use the Context from the Page
+        * @since 1.17
         * @var IContextSource $context
         */
        protected $context;
 
        /**
         * The fields used to create the HTMLForm
+        * @since 1.17
         * @var array $fields
         */
        protected $fields;
@@ -82,6 +85,7 @@ abstract class Action {
 
        /**
         * Get an appropriate Action subclass for the given action
+        * @since 1.17
         * @param string $action
         * @param Page $page
         * @param IContextSource $context
@@ -152,6 +156,7 @@ abstract class Action {
 
        /**
         * Check if a given action is recognised, even if it's disabled
+        * @since 1.17
         *
         * @param string $name Name of an action
         * @return bool
@@ -162,6 +167,7 @@ abstract class Action {
 
        /**
         * Get the IContextSource in use here
+        * @since 1.17
         * @return IContextSource
         */
        final public function getContext() {
@@ -179,6 +185,7 @@ abstract class Action {
 
        /**
         * Get the WebRequest being used for this instance
+        * @since 1.17
         *
         * @return WebRequest
         */
@@ -188,6 +195,7 @@ abstract class Action {
 
        /**
         * Get the OutputPage being used for this instance
+        * @since 1.17
         *
         * @return OutputPage
         */
@@ -197,6 +205,7 @@ abstract class Action {
 
        /**
         * Shortcut to get the User being used for this instance
+        * @since 1.17
         *
         * @return User
         */
@@ -206,6 +215,7 @@ abstract class Action {
 
        /**
         * Shortcut to get the Skin being used for this instance
+        * @since 1.17
         *
         * @return Skin
         */
@@ -224,6 +234,8 @@ abstract class Action {
 
        /**
         * Shortcut to get the Title object from the page
+        * @since 1.17
+        *
         * @return Title
         */
        final public function getTitle() {
@@ -262,6 +274,8 @@ abstract class Action {
 
        /**
         * Return the name of the action this object responds to
+        * @since 1.17
+        *
         * @return string Lowercase name
         */
        abstract public function getName();
@@ -269,6 +283,8 @@ abstract class Action {
        /**
         * Get the permission required to perform this action.  Often, but not always,
         * the same as the action name
+        * @since 1.17
+        *
         * @return string|null
         */
        public function getRestriction() {
@@ -279,6 +295,7 @@ abstract class Action {
         * Checks if the given user (identified by an object) can perform this action.  Can be
         * overridden by sub-classes with more complicated permissions schemes.  Failures here
         * must throw subclasses of ErrorPageError
+        * @since 1.17
         *
         * @param User $user The user to check, or null to use the context user
         * @throws UserBlockedError|ReadOnlyError|PermissionsError
@@ -307,6 +324,8 @@ abstract class Action {
 
        /**
         * Whether this action requires the wiki not to be locked
+        * @since 1.17
+        *
         * @return bool
         */
        public function requiresWrite() {
@@ -315,6 +334,8 @@ abstract class Action {
 
        /**
         * Whether this action can still be executed by a blocked user
+        * @since 1.17
+        *
         * @return bool
         */
        public function requiresUnblock() {
@@ -324,12 +345,13 @@ abstract class Action {
        /**
         * Set output headers for noindexing etc.  This function will not be called through
         * the execute() entry point, so only put UI-related stuff in here.
+        * @since 1.17
         */
        protected function setHeaders() {
                $out = $this->getOutput();
                $out->setRobotPolicy( "noindex,nofollow" );
                $out->setPageTitle( $this->getPageTitle() );
-               $this->getOutput()->setSubtitle( $this->getDescription() );
+               $out->setSubtitle( $this->getDescription() );
                $out->setArticleRelated( true );
        }
 
@@ -344,6 +366,7 @@ abstract class Action {
 
        /**
         * Returns the description that goes below the \<h1\> tag
+        * @since 1.17
         *
         * @return string
         */
@@ -355,6 +378,8 @@ abstract class Action {
         * The main action entry point.  Do all output for display and send it to the context
         * output.  Do not use globals $wgOut, $wgRequest, etc, in implementations; use
         * $this->getOutput(), etc.
+        * @since 1.17
+        *
         * @throws ErrorPageError
         */
        abstract public function show();
index 66ea245..3be8aff 100644 (file)
@@ -110,7 +110,7 @@ class HistoryAction extends FormlessAction {
                # Fill in the file cache if not set already
                $useFileCache = $config->get( 'UseFileCache' );
                if ( $useFileCache && HTMLFileCache::useFileCache( $this->getContext() ) ) {
-                       $cache = HTMLFileCache::newFromTitle( $this->getTitle(), 'history' );
+                       $cache = new HTMLFileCache( $this->getTitle(), 'history' );
                        if ( !$cache->isCacheGood( /* Assume up to date */ ) ) {
                                ob_start( array( &$cache, 'saveToFileCache' ) );
                        }
@@ -196,7 +196,11 @@ class HistoryAction extends FormlessAction {
                        ) . '&#160;' .
                        ( $tagSelector ? ( implode( '&#160;', $tagSelector ) . '&#160;' ) : '' ) .
                        $checkDeleted .
-                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n" .
+                       Html::submitButton(
+                               $this->msg( 'allpagessubmit' )->text(),
+                               array(),
+                               array( 'mw-ui-progressive' )
+                       ) . "\n" .
                        '</fieldset></form>'
                );
 
@@ -472,7 +476,6 @@ class HistoryPager extends ReverseChronologicalPager {
         * @return string HTML output
         */
        function getStartBody() {
-               global $wgUseMediaWikiUIEverywhere;
                $this->lastRow = false;
                $this->counter = 1;
                $this->oldIdChecked = 0;
@@ -486,12 +489,10 @@ class HistoryPager extends ReverseChronologicalPager {
                // Button container stored in $this->buttons for re-use in getEndBody()
                $this->buttons = '<div>';
                $className = 'historysubmit mw-history-compareselectedversions-button';
-               if ( $wgUseMediaWikiUIEverywhere ) {
-                       $className .= ' mw-ui-button mw-ui-constructive';
-               }
+               $attrs = array( 'class' => $className )
+                       + Linker::tooltipAndAccesskeyAttribs( 'compareselectedversions' );
                $this->buttons .= $this->submitButton( $this->msg( 'compareselectedversions' )->text(),
-                       array( 'class' => $className )
-                               + Linker::tooltipAndAccesskeyAttribs( 'compareselectedversions' )
+                       $attrs
                ) . "\n";
 
                if ( $this->getUser()->isAllowed( 'deleterevision' ) ) {
@@ -562,7 +563,7 @@ class HistoryPager extends ReverseChronologicalPager {
        function submitButton( $message, $attributes = array() ) {
                # Disable submit button if history has 1 revision only
                if ( $this->getNumRows() > 1 ) {
-                       return Xml::submitButton( $message, $attributes );
+                       return Html::submitButton( $message, $attributes );
                } else {
                        return '';
                }
index cd4e4ba..d0d956e 100644 (file)
  * @ingroup Actions
  */
 class RawAction extends FormlessAction {
-       private $mGen;
+       /**
+        * @var bool Does the request include a gen=css|javascript parameter
+        * @deprecated This used to be a string for "css" or "javascript" but
+        * it is no longer used. Setting this parameter results in empty content
+        * being served
+        */
+       private $gen = false;
 
        public function getName() {
                return 'raw';
@@ -66,12 +72,10 @@ class RawAction extends FormlessAction {
                $smaxage = $request->getIntOrNull( 'smaxage' );
 
                if ( $gen == 'css' || $gen == 'js' ) {
-                       $this->mGen = $gen;
+                       $this->gen = true;
                        if ( $smaxage === null ) {
                                $smaxage = $config->get( 'SquidMaxage' );
                        }
-               } else {
-                       $this->mGen = false;
                }
 
                $contentType = $this->getContentType();
@@ -130,7 +134,7 @@ class RawAction extends FormlessAction {
                global $wgParser;
 
                # No longer used
-               if ( $this->mGen ) {
+               if ( $this->gen ) {
                        return '';
                }
 
index db62be0..a214f2e 100644 (file)
@@ -64,16 +64,16 @@ abstract class ApiBase extends ContextSource {
        // Boolean, if MIN/MAX are set, enforce (die) these?
        // Only applies if TYPE='integer' Use with extreme caution
        const PARAM_RANGE_ENFORCE = 9;
-
-       // Name of property group that is on the root element of the result,
-       // i.e. not part of a list
-       const PROP_ROOT = 'ROOT';
-       // Boolean, is the result multiple items? Defaults to true for query modules,
-       // to false for other modules
-       const PROP_LIST = 'LIST';
-       const PROP_TYPE = 0; // Type of the property, uses same format as PARAM_TYPE
-       // Boolean, can the property be not included in the result? Defaults to false
-       const PROP_NULLABLE = 1;
+       /// @since 1.25
+       // Specify an alternative i18n message for this help parameter.
+       // Value can be a string key, an array giving key and parameters, or a
+       // Message object.
+       const PARAM_HELP_MSG = 10;
+       /// @since 1.25
+       // Specify additional i18n messages to append to the normal message. Value
+       // is an array of any of strings giving the message key, arrays giving key and
+       // parameters, or Message objects.
+       const PARAM_HELP_MSG_APPEND = 11;
 
        const LIMIT_BIG1 = 500; // Fast query, std user limit
        const LIMIT_BIG2 = 5000; // Fast query, bot/sysop limit
@@ -109,9 +109,11 @@ abstract class ApiBase extends ContextSource {
                }
        }
 
-       /*****************************************************************************
-        * ABSTRACT METHODS                                                          *
-        *****************************************************************************/
+
+       /************************************************************************//**
+        * @name   Methods to implement
+        * @{
+        */
 
        /**
         * Evaluates the parameters, performs the requested query, and sets up
@@ -132,56 +134,209 @@ abstract class ApiBase extends ContextSource {
        abstract public function execute();
 
        /**
-        * Returns a string that identifies the version of the extending class.
-        * Typically includes the class name, the svn revision, timestamp, and
-        * last author. Usually done with SVN's Id keyword
-        * @return string
-        * @deprecated since 1.21, version string is no longer supported
+        * Get the module manager, or null if this module has no sub-modules
+        * @since 1.21
+        * @return ApiModuleManager
         */
-       public function getVersion() {
-               wfDeprecated( __METHOD__, '1.21' );
+       public function getModuleManager() {
+               return null;
+       }
 
-               return '';
+       /**
+        * If the module may only be used with a certain format module,
+        * it should override this method to return an instance of that formatter.
+        * A value of null means the default format will be used.
+        * @return mixed Instance of a derived class of ApiFormatBase, or null
+        */
+       public function getCustomPrinter() {
+               return null;
        }
 
        /**
-        * Get the name of the module being executed by this instance
-        * @return string
+        * Returns usage examples for this module.
+        *
+        * Return value has query strings as keys, with values being either strings
+        * (message key), arrays (message key + parameter), or Message objects.
+        *
+        * Do not call this base class implementation when overriding this method.
+        *
+        * @since 1.25
+        * @return array
         */
-       public function getModuleName() {
-               return $this->mModuleName;
+       protected function getExamplesMessages() {
+               // Fall back to old non-localised method
+               $ret = array();
+
+               $examples = $this->getExamples();
+               if ( $examples ) {
+                       if ( !is_array( $examples ) ) {
+                               $examples = array( $examples );
+                       } elseif ( $examples && ( count( $examples ) & 1 ) == 0 &&
+                               array_keys( $examples ) === range( 0, count( $examples ) - 1 ) &&
+                               !preg_match( '/^\s*api\.php\?/', $examples[0] )
+                       ) {
+                               // 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 ) {
+                                       $tmp[$examples[$i + 1]] = $examples[$i];
+                               }
+                               $examples = $tmp;
+                       }
+
+                       foreach ( $examples as $k => $v ) {
+                               if ( is_numeric( $k ) ) {
+                                       $qs = $v;
+                                       $msg = '';
+                               } else {
+                                       $qs = $k;
+                                       $msg = self::escapeWikiText( $v );
+                                       if ( is_array( $msg ) ) {
+                                               $msg = join( " ", $msg );
+                                       }
+                               }
+
+                               $qs = preg_replace( '/^\s*api\.php\?/', '', $qs );
+                               $ret[$qs] = $this->msg( 'api-help-fallback-example', array( $msg ) );
+                       }
+               }
+
+               return $ret;
        }
 
        /**
-        * Get the module manager, or null if this module has no sub-modules
-        * @since 1.21
-        * @return ApiModuleManager
+        * Return links to more detailed help pages about the module.
+        * @since 1.25, returning boolean false is deprecated
+        * @return string|array
         */
-       public function getModuleManager() {
-               return null;
+       public function getHelpUrls() {
+               return array();
        }
 
        /**
-        * Get parameter prefix (usually two letters or an empty string).
-        * @return string
+        * Returns an array of allowed parameters (parameter name) => (default
+        * value) or (parameter name) => (array with PARAM_* constants as keys)
+        * Don't call this function directly: use getFinalParams() to allow
+        * hooks to modify parameters as needed.
+        *
+        * Some derived classes may choose to handle an integer $flags parameter
+        * in the overriding methods. Callers of this method can pass zero or
+        * more OR-ed flags like GET_VALUES_FOR_HELP.
+        *
+        * @return array
         */
-       public function getModulePrefix() {
-               return $this->mModulePrefix;
+       protected function getAllowedParams( /* $flags = 0 */ ) {
+               // int $flags is not declared because it causes "Strict standards"
+               // warning. Most derived classes do not implement it.
+               return array();
        }
 
        /**
-        * Get the name of the module as shown in the profiler log
+        * Indicates if this module needs maxlag to be checked
+        * @return bool
+        */
+       public function shouldCheckMaxlag() {
+               return true;
+       }
+
+       /**
+        * Indicates whether this module requires read rights
+        * @return bool
+        */
+       public function isReadMode() {
+               return true;
+       }
+
+       /**
+        * Indicates whether this module requires write mode
+        * @return bool
+        */
+       public function isWriteMode() {
+               return false;
+       }
+
+       /**
+        * Indicates whether this module must be called with a POST request
+        * @return bool
+        */
+       public function mustBePosted() {
+               return $this->needsToken() !== false;
+       }
+
+       /**
+        * Indicates whether this module is deprecated
+        * @since 1.25
+        * @return bool
+        */
+       public function isDeprecated() {
+               return false;
+       }
+
+       /**
+        * Indicates whether this module is "internal" or unstable
+        * @since 1.25
+        * @return bool
+        */
+       public function isInternal() {
+               return false;
+       }
+
+       /**
+        * Returns the token type this module requires in order to execute.
         *
-        * @param DatabaseBase|bool $db
+        * Modules are strongly encouraged to use the core 'csrf' type unless they
+        * have specialized security needs. If the token type is not one of the
+        * core types, you must use the ApiQueryTokensRegisterTypes hook to
+        * register it.
+        *
+        * Returning a non-falsey value here will force the addition of an
+        * appropriate 'token' parameter in self::getFinalParams(). Also,
+        * self::mustBePosted() must return true when tokens are used.
+        *
+        * In previous versions of MediaWiki, true was a valid return value.
+        * Returning true will generate errors indicating that the API module needs
+        * updating.
+        *
+        * @return string|false
+        */
+       public function needsToken() {
+               return false;
+       }
+
+       /**
+        * Fetch the salt used in the Web UI corresponding to this module.
         *
+        * Only override this if the Web UI uses a token with a non-constant salt.
+        *
+        * @since 1.24
+        * @param array $params All supplied parameters for the module
+        * @return string|array|null
+        */
+       protected function getWebUITokenSalt( array $params ) {
+               return null;
+       }
+
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Data access methods
+        * @{
+        */
+
+       /**
+        * Get the name of the module being executed by this instance
         * @return string
         */
-       public function getModuleProfileName( $db = false ) {
-               if ( $db ) {
-                       return 'API:' . $this->mModuleName . '-DB';
-               }
+       public function getModuleName() {
+               return $this->mModuleName;
+       }
 
-               return 'API:' . $this->mModuleName;
+       /**
+        * Get parameter prefix (usually two letters or an empty string).
+        * @return string
+        */
+       public function getModulePrefix() {
+               return $this->mModulePrefix;
        }
 
        /**
@@ -201,6 +356,73 @@ abstract class ApiBase extends ContextSource {
                return $this === $this->mMainModule;
        }
 
+       /**
+        * Get the parent of this module
+        * @since 1.25
+        * @return ApiBase|null
+        */
+       public function getParent() {
+               return $this->isMain() ? null : $this->getMain();
+       }
+
+       /**
+        * Get the path to this module
+        *
+        * @since 1.25
+        * @return string
+        */
+       public function getModulePath() {
+               if ( $this->isMain() ) {
+                       return 'main';
+               } elseif ( $this->getParent()->isMain() ) {
+                       return $this->getModuleName();
+               } else {
+                       return $this->getParent()->getModulePath() . '+' . $this->getModuleName();
+               }
+       }
+
+       /**
+        * Get a module from its module path
+        *
+        * @since 1.25
+        * @param string $path
+        * @return ApiBase|null
+        * @throws UsageException
+        */
+       public function getModuleFromPath( $path ) {
+               $module = $this->getMain();
+               if ( $path === 'main' ) {
+                       return $module;
+               }
+
+               $parts = explode( '+', $path );
+               if ( count( $parts ) === 1 ) {
+                       // In case the '+' was typed into URL, it resolves as a space
+                       $parts = explode( ' ', $path );
+               }
+
+               $count = count( $parts );
+               for ( $i = 0; $i < $count; $i++ ) {
+                       $parent = $module;
+                       $manager = $parent->getModuleManager();
+                       if ( $manager === null ) {
+                               $errorPath = join( '+', array_slice( $parts, 0, $i ) );
+                               $this->dieUsage( "The module \"$errorPath\" has no submodules", 'badmodule' );
+                       }
+                       $module = $manager->getModule( $parts[$i] );
+
+                       if ( $module === null ) {
+                               $errorPath = $i ? join( '+', array_slice( $parts, 0, $i ) ) : $parent->getModuleName();
+                               $this->dieUsage(
+                                       "The module \"$errorPath\" does not have a submodule \"{$parts[$i]}\"",
+                                       'badmodule'
+                               );
+                       }
+               }
+
+               return $module;
+       }
+
        /**
         * Get the result object
         * @return ApiResult
@@ -224,453 +446,59 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * Set warning section for this module. Users should monitor this
-        * section to notice any changes in API. Multiple calls to this
-        * function will result in the warning messages being separated by
-        * newlines
-        * @param string $warning Warning message
+        * Gets a default slave database connection object
+        * @return DatabaseBase
         */
-       public function setWarning( $warning ) {
-               $result = $this->getResult();
-               $data = $result->getData();
-               $moduleName = $this->getModuleName();
-               if ( isset( $data['warnings'][$moduleName] ) ) {
-                       // Don't add duplicate warnings
-                       $oldWarning = $data['warnings'][$moduleName]['*'];
-                       $warnPos = strpos( $oldWarning, $warning );
-                       // If $warning was found in $oldWarning, check if it starts at 0 or after "\n"
-                       if ( $warnPos !== false && ( $warnPos === 0 || $oldWarning[$warnPos - 1] === "\n" ) ) {
-                               // Check if $warning is followed by "\n" or the end of the $oldWarning
-                               $warnPos += strlen( $warning );
-                               if ( strlen( $oldWarning ) <= $warnPos || $oldWarning[$warnPos] === "\n" ) {
-                                       return;
-                               }
-                       }
-                       // If there is a warning already, append it to the existing one
-                       $warning = "$oldWarning\n$warning";
+       protected function getDB() {
+               if ( !isset( $this->mSlaveDB ) ) {
+                       $this->profileDBIn();
+                       $this->mSlaveDB = wfGetDB( DB_SLAVE, 'api' );
+                       $this->profileDBOut();
                }
-               $msg = array();
-               ApiResult::setContent( $msg, $warning );
-               $result->addValue( 'warnings', $moduleName,
-                       $msg, ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+
+               return $this->mSlaveDB;
        }
 
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Parameter handling
+        * @{
+        */
+
        /**
-        * If the module may only be used with a certain format module,
-        * it should override this method to return an instance of that formatter.
-        * A value of null means the default format will be used.
-        * @return mixed Instance of a derived class of ApiFormatBase, or null
+        * This method mangles parameter name based on the prefix supplied to the constructor.
+        * Override this method to change parameter name during runtime
+        * @param string $paramName Parameter name
+        * @return string Prefixed parameter name
         */
-       public function getCustomPrinter() {
-               return null;
+       public function encodeParamName( $paramName ) {
+               return $this->mModulePrefix . $paramName;
        }
 
        /**
-        * Generates help message for this module, or false if there is no description
-        * @return string|bool
+        * Using getAllowedParams(), this function makes an array of the values
+        * provided by the user, with key being the name of the variable, and
+        * value - validated value from user or default. limits will not be
+        * parsed if $parseLimit is set to false; use this when the max
+        * limit is not definitive yet, e.g. when getting revisions.
+        * @param bool $parseLimit True by default
+        * @return array
         */
-       public function makeHelpMsg() {
-               static $lnPrfx = "\n  ";
-
-               $msg = $this->getFinalDescription();
+       public function extractRequestParams( $parseLimit = true ) {
+               // Cache parameters, for performance and to avoid bug 24564.
+               if ( !isset( $this->mParamCache[$parseLimit] ) ) {
+                       $params = $this->getFinalParams();
+                       $results = array();
 
-               if ( $msg !== false ) {
-
-                       if ( !is_array( $msg ) ) {
-                               $msg = array(
-                                       $msg
-                               );
-                       }
-                       $msg = $lnPrfx . implode( $lnPrfx, $msg ) . "\n";
-
-                       $msg .= $this->makeHelpArrayToString( $lnPrfx, false, $this->getHelpUrls() );
-
-                       if ( $this->isReadMode() ) {
-                               $msg .= "\nThis module requires read rights";
-                       }
-                       if ( $this->isWriteMode() ) {
-                               $msg .= "\nThis module requires write rights";
-                       }
-                       if ( $this->mustBePosted() ) {
-                               $msg .= "\nThis module only accepts POST requests";
-                       }
-                       if ( $this->isReadMode() || $this->isWriteMode() ||
-                               $this->mustBePosted()
-                       ) {
-                               $msg .= "\n";
-                       }
-
-                       // Parameters
-                       $paramsMsg = $this->makeHelpMsgParameters();
-                       if ( $paramsMsg !== false ) {
-                               $msg .= "Parameters:\n$paramsMsg";
-                       }
-
-                       $examples = $this->getExamples();
-                       if ( $examples ) {
-                               if ( !is_array( $examples ) ) {
-                                       $examples = array(
-                                               $examples
-                                       );
-                               }
-                               $msg .= "Example" . ( count( $examples ) > 1 ? 's' : '' ) . ":\n";
-                               foreach ( $examples as $k => $v ) {
-                                       if ( is_numeric( $k ) ) {
-                                               $msg .= "  $v\n";
-                                       } else {
-                                               if ( is_array( $v ) ) {
-                                                       $msgExample = implode( "\n", array_map( array( $this, 'indentExampleText' ), $v ) );
-                                               } else {
-                                                       $msgExample = "  $v";
-                                               }
-                                               $msgExample .= ":";
-                                               $msg .= wordwrap( $msgExample, 100, "\n" ) . "\n    $k\n";
-                                       }
-                               }
-                       }
-               }
-
-               return $msg;
-       }
-
-       /**
-        * @param string $item
-        * @return string
-        */
-       private function indentExampleText( $item ) {
-               return "  " . $item;
-       }
-
-       /**
-        * @param string $prefix Text to split output items
-        * @param string $title What is being output
-        * @param string|array $input
-        * @return string
-        */
-       protected function makeHelpArrayToString( $prefix, $title, $input ) {
-               if ( $input === false ) {
-                       return '';
-               }
-               if ( !is_array( $input ) ) {
-                       $input = array( $input );
-               }
-
-               if ( count( $input ) > 0 ) {
-                       if ( $title ) {
-                               $msg = $title . ( count( $input ) > 1 ? 's' : '' ) . ":\n  ";
-                       } else {
-                               $msg = '  ';
-                       }
-                       $msg .= implode( $prefix, $input ) . "\n";
-
-                       return $msg;
-               }
-
-               return '';
-       }
-
-       /**
-        * Generates the parameter descriptions for this module, to be displayed in the
-        * module's help.
-        * @return string|bool
-        */
-       public function makeHelpMsgParameters() {
-               $params = $this->getFinalParams( ApiBase::GET_VALUES_FOR_HELP );
-               if ( $params ) {
-
-                       $paramsDescription = $this->getFinalParamDescription();
-                       $msg = '';
-                       $paramPrefix = "\n" . str_repeat( ' ', 24 );
-                       $descWordwrap = "\n" . str_repeat( ' ', 28 );
-                       foreach ( $params as $paramName => $paramSettings ) {
-                               $desc = isset( $paramsDescription[$paramName] ) ? $paramsDescription[$paramName] : '';
-                               if ( is_array( $desc ) ) {
-                                       $desc = implode( $paramPrefix, $desc );
-                               }
-
-                               //handle shorthand
-                               if ( !is_array( $paramSettings ) ) {
-                                       $paramSettings = array(
-                                               self::PARAM_DFLT => $paramSettings,
-                                       );
-                               }
-
-                               //handle missing type
-                               if ( !isset( $paramSettings[ApiBase::PARAM_TYPE] ) ) {
-                                       $dflt = isset( $paramSettings[ApiBase::PARAM_DFLT] )
-                                               ? $paramSettings[ApiBase::PARAM_DFLT]
-                                               : null;
-                                       if ( is_bool( $dflt ) ) {
-                                               $paramSettings[ApiBase::PARAM_TYPE] = 'boolean';
-                                       } elseif ( is_string( $dflt ) || is_null( $dflt ) ) {
-                                               $paramSettings[ApiBase::PARAM_TYPE] = 'string';
-                                       } elseif ( is_int( $dflt ) ) {
-                                               $paramSettings[ApiBase::PARAM_TYPE] = 'integer';
-                                       }
-                               }
-
-                               if ( isset( $paramSettings[self::PARAM_DEPRECATED] )
-                                       && $paramSettings[self::PARAM_DEPRECATED]
-                               ) {
-                                       $desc = "DEPRECATED! $desc";
-                               }
-
-                               if ( isset( $paramSettings[self::PARAM_REQUIRED] )
-                                       && $paramSettings[self::PARAM_REQUIRED]
-                               ) {
-                                       $desc .= $paramPrefix . "This parameter is required";
-                               }
-
-                               $type = isset( $paramSettings[self::PARAM_TYPE] )
-                                       ? $paramSettings[self::PARAM_TYPE]
-                                       : null;
-                               if ( isset( $type ) ) {
-                                       $hintPipeSeparated = true;
-                                       $multi = isset( $paramSettings[self::PARAM_ISMULTI] )
-                                               ? $paramSettings[self::PARAM_ISMULTI]
-                                               : false;
-                                       if ( $multi ) {
-                                               $prompt = 'Values (separate with \'|\'): ';
-                                       } else {
-                                               $prompt = 'One value: ';
-                                       }
-
-                                       if ( is_array( $type ) ) {
-                                               $choices = array();
-                                               $nothingPrompt = '';
-                                               foreach ( $type as $t ) {
-                                                       if ( $t === '' ) {
-                                                               $nothingPrompt = 'Can be empty, or ';
-                                                       } else {
-                                                               $choices[] = $t;
-                                                       }
-                                               }
-                                               $desc .= $paramPrefix . $nothingPrompt . $prompt;
-                                               $choicesstring = implode( ', ', $choices );
-                                               $desc .= wordwrap( $choicesstring, 100, $descWordwrap );
-                                               $hintPipeSeparated = false;
-                                       } else {
-                                               switch ( $type ) {
-                                                       case 'namespace':
-                                                               // Special handling because namespaces are
-                                                               // type-limited, yet they are not given
-                                                               $desc .= $paramPrefix . $prompt;
-                                                               $desc .= wordwrap( implode( ', ', MWNamespace::getValidNamespaces() ),
-                                                                       100, $descWordwrap );
-                                                               $hintPipeSeparated = false;
-                                                               break;
-                                                       case 'limit':
-                                                               $desc .= $paramPrefix . "No more than {$paramSettings[self::PARAM_MAX]}";
-                                                               if ( isset( $paramSettings[self::PARAM_MAX2] ) ) {
-                                                                       $desc .= " ({$paramSettings[self::PARAM_MAX2]} for bots)";
-                                                               }
-                                                               $desc .= ' allowed';
-                                                               break;
-                                                       case 'integer':
-                                                               $s = $multi ? 's' : '';
-                                                               $hasMin = isset( $paramSettings[self::PARAM_MIN] );
-                                                               $hasMax = isset( $paramSettings[self::PARAM_MAX] );
-                                                               if ( $hasMin || $hasMax ) {
-                                                                       if ( !$hasMax ) {
-                                                                               $intRangeStr = "The value$s must be no less than " .
-                                                                                       "{$paramSettings[self::PARAM_MIN]}";
-                                                                       } elseif ( !$hasMin ) {
-                                                                               $intRangeStr = "The value$s must be no more than " .
-                                                                                       "{$paramSettings[self::PARAM_MAX]}";
-                                                                       } else {
-                                                                               $intRangeStr = "The value$s must be between " .
-                                                                                       "{$paramSettings[self::PARAM_MIN]} and {$paramSettings[self::PARAM_MAX]}";
-                                                                       }
-
-                                                                       $desc .= $paramPrefix . $intRangeStr;
-                                                               }
-                                                               break;
-                                                       case 'upload':
-                                                               $desc .= $paramPrefix . "Must be posted as a file upload using multipart/form-data";
-                                                               break;
-                                               }
-                                       }
-
-                                       if ( $multi ) {
-                                               if ( $hintPipeSeparated ) {
-                                                       $desc .= $paramPrefix . "Separate values with '|'";
-                                               }
-
-                                               $isArray = is_array( $type );
-                                               if ( !$isArray
-                                                       || $isArray && count( $type ) > self::LIMIT_SML1
-                                               ) {
-                                                       $desc .= $paramPrefix . "Maximum number of values " .
-                                                               self::LIMIT_SML1 . " (" . self::LIMIT_SML2 . " for bots)";
-                                               }
-                                       }
-                               }
-
-                               $default = isset( $paramSettings[self::PARAM_DFLT] ) ? $paramSettings[self::PARAM_DFLT] : null;
-                               if ( !is_null( $default ) && $default !== false ) {
-                                       $desc .= $paramPrefix . "Default: $default";
-                               }
-
-                               $msg .= sprintf( "  %-19s - %s\n", $this->encodeParamName( $paramName ), $desc );
-                       }
-
-                       return $msg;
-               }
-
-               return false;
-       }
-
-       /**
-        * Returns the description string for this module
-        * @return string|array
-        */
-       protected function getDescription() {
-               return false;
-       }
-
-       /**
-        * Returns usage examples for this module. Return false if no examples are available.
-        * @return bool|string|array
-        */
-       protected function getExamples() {
-               return false;
-       }
-
-       /**
-        * Returns an array of allowed parameters (parameter name) => (default
-        * value) or (parameter name) => (array with PARAM_* constants as keys)
-        * Don't call this function directly: use getFinalParams() to allow
-        * hooks to modify parameters as needed.
-        *
-        * Some derived classes may choose to handle an integer $flags parameter
-        * in the overriding methods. Callers of this method can pass zero or
-        * more OR-ed flags like GET_VALUES_FOR_HELP.
-        *
-        * @return array|bool
-        */
-       protected function getAllowedParams( /* $flags = 0 */ ) {
-               // int $flags is not declared because it causes "Strict standards"
-               // warning. Most derived classes do not implement it.
-               return false;
-       }
-
-       /**
-        * Returns an array of parameter descriptions.
-        * Don't call this function directly: use getFinalParamDescription() to
-        * allow hooks to modify descriptions as needed.
-        * @return array|bool False on no parameter descriptions
-        */
-       protected function getParamDescription() {
-               return false;
-       }
-
-       /**
-        * Get final list of parameters, after hooks have had a chance to
-        * tweak it as needed.
-        *
-        * @param int $flags Zero or more flags like GET_VALUES_FOR_HELP
-        * @return array|bool False on no parameters
-        * @since 1.21 $flags param added
-        */
-       public function getFinalParams( $flags = 0 ) {
-               $params = $this->getAllowedParams( $flags );
-               wfRunHooks( 'APIGetAllowedParams', array( &$this, &$params, $flags ) );
-
-               return $params;
-       }
-
-       /**
-        * Get final parameter descriptions, after hooks have had a chance to tweak it as
-        * needed.
-        *
-        * @return array|bool False on no parameter descriptions
-        */
-       public function getFinalParamDescription() {
-               $desc = $this->getParamDescription();
-               wfRunHooks( 'APIGetParamDescription', array( &$this, &$desc ) );
-
-               return $desc;
-       }
-
-       /**
-        * Formerly used to fetch a list of possible properites in the result,
-        * somehow organized with respect to the prop parameter that causes them to
-        * be returned. The specific semantics of the return value was never
-        * specified. Since this was never possible to be accurately updated, it
-        * has been removed.
-        *
-        * @deprecated since 1.24
-        * @return array|bool
-        */
-       protected function getResultProperties() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return false;
-       }
-
-       /**
-        * @see self::getResultProperties()
-        * @deprecated since 1.24
-        * @return array|bool
-        */
-       public function getFinalResultProperties() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return array();
-       }
-
-       /**
-        * @see self::getResultProperties()
-        * @deprecated since 1.24
-        */
-       protected static function addTokenProperties( &$props, $tokenFunctions ) {
-               wfDeprecated( __METHOD__, '1.24' );
-       }
-
-       /**
-        * Get final module description, after hooks have had a chance to tweak it as
-        * needed.
-        *
-        * @return array|bool False on no parameters
-        */
-       public function getFinalDescription() {
-               $desc = $this->getDescription();
-               wfRunHooks( 'APIGetDescription', array( &$this, &$desc ) );
-
-               return $desc;
-       }
-
-       /**
-        * This method mangles parameter name based on the prefix supplied to the constructor.
-        * Override this method to change parameter name during runtime
-        * @param string $paramName Parameter name
-        * @return string Prefixed parameter name
-        */
-       public function encodeParamName( $paramName ) {
-               return $this->mModulePrefix . $paramName;
-       }
-
-       /**
-        * Using getAllowedParams(), this function makes an array of the values
-        * provided by the user, with key being the name of the variable, and
-        * value - validated value from user or default. limits will not be
-        * parsed if $parseLimit is set to false; use this when the max
-        * limit is not definitive yet, e.g. when getting revisions.
-        * @param bool $parseLimit True by default
-        * @return array
-        */
-       public function extractRequestParams( $parseLimit = true ) {
-               // Cache parameters, for performance and to avoid bug 24564.
-               if ( !isset( $this->mParamCache[$parseLimit] ) ) {
-                       $params = $this->getFinalParams();
-                       $results = array();
-
-                       if ( $params ) { // getFinalParams() can return false
-                               foreach ( $params as $paramName => $paramSettings ) {
-                                       $results[$paramName] = $this->getParameterFromSettings(
-                                               $paramName, $paramSettings, $parseLimit );
-                               }
-                       }
-                       $this->mParamCache[$parseLimit] = $results;
-               }
+                       if ( $params ) { // getFinalParams() can return false
+                               foreach ( $params as $paramName => $paramSettings ) {
+                                       $results[$paramName] = $this->getParameterFromSettings(
+                                               $paramName, $paramSettings, $parseLimit );
+                               }
+                       }
+                       $this->mParamCache[$parseLimit] = $results;
+               }
 
                return $this->mParamCache[$parseLimit];
        }
@@ -714,16 +542,6 @@ abstract class ApiBase extends ContextSource {
                }
        }
 
-       /**
-        * @see self::getPossibleErrors()
-        * @deprecated since 1.24
-        * @return array
-        */
-       public function getRequireOnlyOneParameterErrorMessages( $params ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               return array();
-       }
-
        /**
         * Die if more than one of a certain set of parameters is set and not false.
         *
@@ -746,16 +564,6 @@ abstract class ApiBase extends ContextSource {
                }
        }
 
-       /**
-        * @see self::getPossibleErrors()
-        * @deprecated since 1.24
-        * @return array
-        */
-       public function getRequireMaxOneParameterErrorMessages( $params ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               return array();
-       }
-
        /**
         * Die if none of a certain set of parameters is set and not false.
         *
@@ -780,13 +588,13 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * @see self::getPossibleErrors()
-        * @deprecated since 1.24
-        * @return array
+        * Callback function used in requireOnlyOneParameter to check whether required parameters are set
+        *
+        * @param object $x Parameter to check is not null/false
+        * @return bool
         */
-       public function getRequireAtLeastOneParameterErrorMessages( $params ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               return array();
+       private function parameterNotEmpty( $x ) {
+               return !is_null( $x ) && $x !== false;
        }
 
        /**
@@ -829,26 +637,6 @@ abstract class ApiBase extends ContextSource {
                return $pageObj;
        }
 
-       /**
-        * @see self::getPossibleErrors()
-        * @deprecated since 1.24
-        * @return array
-        */
-       public function getTitleOrPageIdErrorMessage() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return array();
-       }
-
-       /**
-        * Callback function used in requireOnlyOneParameter to check whether required parameters are set
-        *
-        * @param object $x Parameter to check is not null/false
-        * @return bool
-        */
-       private function parameterNotEmpty( $x ) {
-               return !is_null( $x ) && $x !== false;
-       }
-
        /**
         * Return true if we're to watch the page, false if not, null if no change.
         * @param string $watchlist Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
@@ -890,21 +678,6 @@ abstract class ApiBase extends ContextSource {
                }
        }
 
-       /**
-        * Set a watch (or unwatch) based the based on a watchlist parameter.
-        * @param string $watch Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
-        * @param Title $titleObj The article's title to change
-        * @param string $userOption The user option to consider when $watch=preferences
-        */
-       protected function setWatch( $watch, $titleObj, $userOption = null ) {
-               $value = $this->getWatchlistValue( $watch, $titleObj, $userOption );
-               if ( $value === null ) {
-                       return;
-               }
-
-               WatchAction::doWatchOrUnwatch( $value, $titleObj, $this->getUser() );
-       }
-
        /**
         * Using the settings determine the value for the given parameter
         *
@@ -998,6 +771,9 @@ abstract class ApiBase extends ContextSource {
                        if ( isset( $value ) && $type == 'namespace' ) {
                                $type = MWNamespace::getValidNamespaces();
                        }
+                       if ( isset( $value ) && $type == 'submodule' ) {
+                               $type = $this->getModuleManager()->getNames( $paramName );
+                       }
                }
 
                if ( isset( $value ) && ( $multi || is_array( $type ) ) ) {
@@ -1197,7 +973,7 @@ 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
         */
-       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)";
@@ -1235,7 +1011,7 @@ abstract class ApiBase extends ContextSource {
         * @param string $encParamName Parameter name
         * @return string Validated and normalized parameter
         */
-       function validateTimestamp( $value, $encParamName ) {
+       protected function validateTimestamp( $value, $encParamName ) {
                $unixTimestamp = wfTimestamp( TS_UNIX, $value );
                if ( $unixTimestamp === false ) {
                        $this->dieUsage(
@@ -1247,6 +1023,44 @@ abstract class ApiBase extends ContextSource {
                return wfTimestamp( TS_MW, $unixTimestamp );
        }
 
+       /**
+        * Validate the supplied token.
+        *
+        * @since 1.24
+        * @param string $token Supplied token
+        * @param array $params All supplied parameters for the module
+        * @return bool
+        */
+       public final function validateToken( $token, array $params ) {
+               $tokenType = $this->needsToken();
+               $salts = ApiQueryTokens::getTokenTypeSalts();
+               if ( !isset( $salts[$tokenType] ) ) {
+                       throw new MWException(
+                               "Module '{$this->getModuleName()}' tried to use token type '$tokenType' " .
+                                       'without registering it'
+                       );
+               }
+
+               if ( $this->getUser()->matchEditToken(
+                       $token,
+                       $salts[$tokenType],
+                       $this->getRequest()
+               ) ) {
+                       return true;
+               }
+
+               $webUiSalt = $this->getWebUITokenSalt( $params );
+               if ( $webUiSalt !== null && $this->getUser()->matchEditToken(
+                       $token,
+                       $webUiSalt,
+                       $this->getRequest()
+               ) ) {
+                       return true;
+               }
+
+               return false;
+       }
+
        /**
         * Validate and normalize of parameters of type 'user'
         * @param string $value Parameter value
@@ -1265,6 +1079,164 @@ abstract class ApiBase extends ContextSource {
                return $title->getText();
        }
 
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Utility methods
+        * @{
+        */
+
+       /**
+        * Set a watch (or unwatch) based the based on a watchlist parameter.
+        * @param string $watch Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
+        * @param Title $titleObj The article's title to change
+        * @param string $userOption The user option to consider when $watch=preferences
+        */
+       protected function setWatch( $watch, $titleObj, $userOption = null ) {
+               $value = $this->getWatchlistValue( $watch, $titleObj, $userOption );
+               if ( $value === null ) {
+                       return;
+               }
+
+               WatchAction::doWatchOrUnwatch( $value, $titleObj, $this->getUser() );
+       }
+
+       /**
+        * Truncate an array to a certain length.
+        * @param array $arr Array to truncate
+        * @param int $limit Maximum length
+        * @return bool True if the array was truncated, false otherwise
+        */
+       public static function truncateArray( &$arr, $limit ) {
+               $modified = false;
+               while ( count( $arr ) > $limit ) {
+                       array_pop( $arr );
+                       $modified = true;
+               }
+
+               return $modified;
+       }
+
+       /**
+        * Gets the user for whom to get the watchlist
+        *
+        * @param array $params
+        * @return User
+        */
+       public function getWatchlistUser( $params ) {
+               if ( !is_null( $params['owner'] ) && !is_null( $params['token'] ) ) {
+                       $user = User::newFromName( $params['owner'], false );
+                       if ( !( $user && $user->getId() ) ) {
+                               $this->dieUsage( 'Specified user does not exist', 'bad_wlowner' );
+                       }
+                       $token = $user->getOption( 'watchlisttoken' );
+                       if ( $token == '' || $token != $params['token'] ) {
+                               $this->dieUsage(
+                                       'Incorrect watchlist token provided -- please set a correct token in Special:Preferences',
+                                       'bad_wltoken'
+                               );
+                       }
+               } else {
+                       if ( !$this->getUser()->isLoggedIn() ) {
+                               $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
+                       }
+                       if ( !$this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+                               $this->dieUsage( 'You don\'t have permission to view your watchlist', 'permissiondenied' );
+                       }
+                       $user = $this->getUser();
+               }
+
+               return $user;
+       }
+
+       /**
+        * A subset of wfEscapeWikiText for BC texts
+        *
+        * @since 1.25
+        * @param string|array $v
+        * @return string|array
+        */
+       private static function escapeWikiText( $v ) {
+               if ( is_array( $v ) ) {
+                       return array_map( 'self::escapeWikiText', $v );
+               } else {
+                       return strtr( $v, array(
+                               '__' => '_&#95;', '{' => '&#123;', '}' => '&#125;',
+                               '[[Category:' => '[[:Category:',
+                               '[[File:' => '[[:File:', '[[Image:' => '[[:Image:',
+                       ) );
+               }
+       }
+
+       /**
+        * Create a Message from a string or array
+        *
+        * A string is used as a message key. An array has the message key as the
+        * first value and message parameters as subsequent values.
+        *
+        * @since 1.25
+        * @param string|array|Message $msg
+        * @param IContextSource $context
+        * @param array $params
+        * @return Message|null
+        */
+       public static function makeMessage( $msg, IContextSource $context, array $params = null ) {
+               if ( is_string( $msg ) ) {
+                       $msg = wfMessage( $msg );
+               } elseif ( is_array( $msg ) ) {
+                       $msg = call_user_func_array( 'wfMessage', $msg );
+               }
+               if ( !$msg instanceof Message ) {
+                       return null;
+               }
+
+               $msg->setContext( $context );
+               if ( $params ) {
+                       $msg->params( $params );
+               }
+
+               return $msg;
+       }
+
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Warning and error reporting
+        * @{
+        */
+
+       /**
+        * Set warning section for this module. Users should monitor this
+        * section to notice any changes in API. Multiple calls to this
+        * function will result in the warning messages being separated by
+        * newlines
+        * @param string $warning Warning message
+        */
+       public function setWarning( $warning ) {
+               $result = $this->getResult();
+               $data = $result->getData();
+               $moduleName = $this->getModuleName();
+               if ( isset( $data['warnings'][$moduleName] ) ) {
+                       // Don't add duplicate warnings
+                       $oldWarning = $data['warnings'][$moduleName]['*'];
+                       $warnPos = strpos( $oldWarning, $warning );
+                       // If $warning was found in $oldWarning, check if it starts at 0 or after "\n"
+                       if ( $warnPos !== false && ( $warnPos === 0 || $oldWarning[$warnPos - 1] === "\n" ) ) {
+                               // Check if $warning is followed by "\n" or the end of the $oldWarning
+                               $warnPos += strlen( $warning );
+                               if ( strlen( $oldWarning ) <= $warnPos || $oldWarning[$warnPos] === "\n" ) {
+                                       return;
+                               }
+                       }
+                       // If there is a warning already, append it to the existing one
+                       $warning = "$oldWarning\n$warning";
+               }
+               $msg = array();
+               ApiResult::setContent( $msg, $warning );
+               $result->addValue( 'warnings', $moduleName,
+                       $msg, ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+       }
+
        /**
         * Adds a warning to the output, else dies
         *
@@ -1279,22 +1251,6 @@ abstract class ApiBase extends ContextSource {
                $this->setWarning( $msg );
        }
 
-       /**
-        * Truncate an array to a certain length.
-        * @param array $arr Array to truncate
-        * @param int $limit Maximum length
-        * @return bool True if the array was truncated, false otherwise
-        */
-       public static function truncateArray( &$arr, $limit ) {
-               $modified = false;
-               while ( count( $arr ) > $limit ) {
-                       array_pop( $arr );
-                       $modified = true;
-               }
-
-               return $modified;
-       }
-
        /**
         * Throw a UsageException, which will (if uncaught) call the main module's
         * error handler and die with an error message.
@@ -1411,9 +1367,9 @@ abstract class ApiBase extends ContextSource {
                        'code' => 'cantedit',
                        'info' => "You can't protect this page because you can't edit it"
                ),
-               'delete-cantedit' => array(
+               'deleteprotected' => array(
                        'code' => 'cantedit',
-                       'info' => "You can't delete this page because you can't edit it"
+                       'info' => "You can't delete this page because it has been protected"
                ),
                'badaccess-group0' => array(
                        'code' => 'permissiondenied',
@@ -1810,6 +1766,10 @@ abstract class ApiBase extends ContextSource {
                        'code' => 'undofailure',
                        'info' => 'Undo failed due to conflicting intermediate edits'
                ),
+               'content-not-allowed-here' => array(
+                       'code' => 'contentnotallowedhere',
+                       'info' => 'Content model "$1" is not allowed at title "$2"'
+               ),
 
                // Messages from WikiPage::doEit()
                'edit-hook-aborted' => array(
@@ -1920,134 +1880,487 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * Return the error message related to a certain array
-        * @param array $error Element of a getUserPermissionsErrors()-style array
-        * @return array('code' => code, 'info' => info)
+        * Return the error message related to a certain array
+        * @param array $error Element of a getUserPermissionsErrors()-style array
+        * @return array('code' => code, 'info' => info)
+        */
+       public function parseMsg( $error ) {
+               $error = (array)$error; // It seems strings sometimes make their way in here
+               $key = array_shift( $error );
+
+               // Check whether the error array was nested
+               // array( array( <code>, <params> ), array( <another_code>, <params> ) )
+               if ( is_array( $key ) ) {
+                       $error = $key;
+                       $key = array_shift( $error );
+               }
+
+               if ( isset( self::$messageMap[$key] ) ) {
+                       return array(
+                               'code' => wfMsgReplaceArgs( self::$messageMap[$key]['code'], $error ),
+                               'info' => wfMsgReplaceArgs( self::$messageMap[$key]['info'], $error )
+                       );
+               }
+
+               // If the key isn't present, throw an "unknown error"
+               return $this->parseMsg( array( 'unknownerror', $key ) );
+       }
+
+       /**
+        * Internal code errors should be reported with this method
+        * @param string $method Method or function name
+        * @param string $message Error message
+        * @throws MWException
+        */
+       protected static function dieDebug( $method, $message ) {
+               throw new MWException( "Internal error in $method: $message" );
+       }
+
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Help message generation
+        * @{
+        */
+
+       /**
+        * Get final module description, after hooks have had a chance to tweak it as
+        * needed.
+        *
+        * @since 1.25, returns Message[] rather than string[]
+        * @return Message[]
+        */
+       public function getFinalDescription() {
+               $desc = $this->getDescription();
+               wfRunHooks( 'APIGetDescription', array( &$this, &$desc ) );
+               $desc = self::escapeWikiText( $desc );
+               if ( is_array( $desc ) ) {
+                       $desc = join( "\n", $desc );
+               } else {
+                       $desc = (string)$desc;
+               }
+
+               $msg = $this->msg( "apihelp-{$this->getModulePath()}-description", array(
+                       $this->getModulePrefix(),
+                       $this->getModuleName(),
+                       $this->getModulePath(),
+               ) );
+               if ( !$msg->exists() ) {
+                       $msg = $this->msg( 'api-help-fallback-description', $desc );
+               }
+               $msgs = array( $msg );
+
+               wfRunHooks( 'APIGetDescriptionMessages', array( $this, &$msgs ) );
+
+               return $msgs;
+       }
+
+       /**
+        * Get final list of parameters, after hooks have had a chance to
+        * tweak it as needed.
+        *
+        * @param int $flags Zero or more flags like GET_VALUES_FOR_HELP
+        * @return array|bool False on no parameters
+        * @since 1.21 $flags param added
+        */
+       public function getFinalParams( $flags = 0 ) {
+               $params = $this->getAllowedParams( $flags );
+               if ( !$params ) {
+                       $params = array();
+               }
+
+               if ( $this->needsToken() ) {
+                       $params['token'] = array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true,
+                               ApiBase::PARAM_HELP_MSG => array(
+                                       'api-help-param-token',
+                                       $this->needsToken(),
+                               ),
+                       ) + ( isset( $params['token'] ) ? $params['token'] : array() );
+               }
+
+               wfRunHooks( 'APIGetAllowedParams', array( &$this, &$params, $flags ) );
+
+               return $params;
+       }
+
+       /**
+        * Get final parameter descriptions, after hooks have had a chance to tweak it as
+        * needed.
+        *
+        * @since 1.25, returns array of Message[] rather than array of string[]
+        * @return array Keys are parameter names, values are arrays of Message objects
+        */
+       public function getFinalParamDescription() {
+               $desc = $this->getParamDescription();
+               wfRunHooks( 'APIGetParamDescription', array( &$this, &$desc ) );
+
+               if ( !$desc ) {
+                       $desc = array();
+               }
+               $desc = self::escapeWikiText( $desc );
+
+               $params = $this->getFinalParams( ApiBase::GET_VALUES_FOR_HELP );
+               $msgs = array();
+               foreach ( $params as $param => $settings ) {
+                       if ( !is_array( $settings ) ) {
+                               $settings = array();
+                       }
+
+                       $d = isset( $desc[$param] ) ? $desc[$param] : '';
+                       if ( is_array( $d ) ) {
+                               // Special handling for prop parameters
+                               $d = array_map( function ( $line ) {
+                                       if ( preg_match( '/^\s+(\S+)\s+-\s+(.+)$/', $line, $m ) ) {
+                                               $line = "\n;{$m[1]}:{$m[2]}";
+                                       }
+                                       return $line;
+                               }, $d );
+                               $d = join( ' ', $d );
+                       }
+
+                       if ( isset( $settings[ApiBase::PARAM_HELP_MSG] ) ) {
+                               $msg = $settings[ApiBase::PARAM_HELP_MSG];
+                       } else {
+                               $msg = $this->msg( "apihelp-{$this->getModulePath()}-param-{$param}" );
+                               if ( !$msg->exists() ) {
+                                       $msg = $this->msg( 'api-help-fallback-parameter', $d );
+                               }
+                       }
+                       $msg = ApiBase::makeMessage( $msg, $this->getContext(), array(
+                               $this->getModulePrefix(),
+                               $param,
+                               $this->getModuleName(),
+                               $this->getModulePath(),
+                       ) );
+                       if ( !$msg ) {
+                               $this->dieDebug( __METHOD__,
+                                       'Value in ApiBase::PARAM_HELP_MSG is not valid' );
+                       }
+                       $msgs[$param] = array( $msg );
+
+                       if ( isset( $settings[ApiBase::PARAM_HELP_MSG_APPEND] ) ) {
+                               if ( !is_array( $settings[ApiBase::PARAM_HELP_MSG_APPEND] ) ) {
+                                       $this->dieDebug( __METHOD__,
+                                               'Value for ApiBase::PARAM_HELP_MSG_APPEND is not an array' );
+                               }
+                               foreach ( $settings[ApiBase::PARAM_HELP_MSG_APPEND] as $m ) {
+                                       $m = ApiBase::makeMessage( $m, $this->getContext(), array(
+                                               $this->getModulePrefix(),
+                                               $param,
+                                               $this->getModuleName(),
+                                               $this->getModulePath(),
+                                       ) );
+                                       if ( $m ) {
+                                               $msgs[$param][] = $m;
+                                       } else {
+                                               $this->dieDebug( __METHOD__,
+                                                       'Value in ApiBase::PARAM_HELP_MSG_APPEND is not valid' );
+                                       }
+                               }
+                       }
+               }
+
+               wfRunHooks( 'APIGetParamDescriptionMessages', array( $this, &$msgs ) );
+
+               return $msgs;
+       }
+
+       /**
+        * Generates the list of flags for the help screen and for action=paraminfo
+        *
+        * Corresponding messages: api-help-flag-deprecated,
+        * api-help-flag-internal, api-help-flag-readrights,
+        * api-help-flag-writerights, api-help-flag-mustbeposted
+        *
+        * @return string[]
+        */
+       protected function getHelpFlags() {
+               $flags = array();
+
+               if ( $this->isDeprecated() ) {
+                       $flags[] = 'deprecated';
+               }
+               if ( $this->isInternal() ) {
+                       $flags[] = 'internal';
+               }
+               if ( $this->isReadMode() ) {
+                       $flags[] = 'readrights';
+               }
+               if ( $this->isWriteMode() ) {
+                       $flags[] = 'writerights';
+               }
+               if ( $this->mustBePosted() ) {
+                       $flags[] = 'mustbeposted';
+               }
+
+               return $flags;
+       }
+
+       /**
+        * Called from ApiHelp before the pieces are joined together and returned.
+        *
+        * This exists mainly for ApiMain to add the Permissions and Credits
+        * sections. Other modules probably don't need it.
+        *
+        * @param string[] &$help Array of help data
+        * @param array $options Options passed to ApiHelp::getHelp
+        */
+       public function modifyHelp( array &$help, array $options ) {
+       }
+
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Profiling
+        * @{
+        */
+
+       /**
+        * Profiling: total module execution time
+        */
+       private $mTimeIn = 0, $mModuleTime = 0;
+
+       /**
+        * Get the name of the module as shown in the profiler log
+        *
+        * @param DatabaseBase|bool $db
+        *
+        * @return string
+        */
+       public function getModuleProfileName( $db = false ) {
+               if ( $db ) {
+                       return 'API:' . $this->mModuleName . '-DB';
+               }
+
+               return 'API:' . $this->mModuleName;
+       }
+
+       /**
+        * Start module profiling
+        */
+       public function profileIn() {
+               if ( $this->mTimeIn !== 0 ) {
+                       ApiBase::dieDebug( __METHOD__, 'Called twice without calling profileOut()' );
+               }
+               $this->mTimeIn = microtime( true );
+               wfProfileIn( $this->getModuleProfileName() );
+       }
+
+       /**
+        * End module profiling
+        */
+       public function profileOut() {
+               if ( $this->mTimeIn === 0 ) {
+                       ApiBase::dieDebug( __METHOD__, 'Called without calling profileIn() first' );
+               }
+               if ( $this->mDBTimeIn !== 0 ) {
+                       ApiBase::dieDebug(
+                               __METHOD__,
+                               'Must be called after database profiling is done with profileDBOut()'
+                       );
+               }
+
+               $this->mModuleTime += microtime( true ) - $this->mTimeIn;
+               $this->mTimeIn = 0;
+               wfProfileOut( $this->getModuleProfileName() );
+       }
+
+       /**
+        * When modules crash, sometimes it is needed to do a profileOut() regardless
+        * of the profiling state the module was in. This method does such cleanup.
+        */
+       public function safeProfileOut() {
+               if ( $this->mTimeIn !== 0 ) {
+                       if ( $this->mDBTimeIn !== 0 ) {
+                               $this->profileDBOut();
+                       }
+                       $this->profileOut();
+               }
+       }
+
+       /**
+        * Total time the module was executed
+        * @return float
+        */
+       public function getProfileTime() {
+               if ( $this->mTimeIn !== 0 ) {
+                       ApiBase::dieDebug( __METHOD__, 'Called without calling profileOut() first' );
+               }
+
+               return $this->mModuleTime;
+       }
+
+       /**
+        * Profiling: database execution time
+        */
+       private $mDBTimeIn = 0, $mDBTime = 0;
+
+       /**
+        * Start module profiling
+        */
+       public function profileDBIn() {
+               if ( $this->mTimeIn === 0 ) {
+                       ApiBase::dieDebug(
+                               __METHOD__,
+                               'Must be called while profiling the entire module with profileIn()'
+                       );
+               }
+               if ( $this->mDBTimeIn !== 0 ) {
+                       ApiBase::dieDebug( __METHOD__, 'Called twice without calling profileDBOut()' );
+               }
+               $this->mDBTimeIn = microtime( true );
+               wfProfileIn( $this->getModuleProfileName( true ) );
+       }
+
+       /**
+        * End database profiling
+        */
+       public function profileDBOut() {
+               if ( $this->mTimeIn === 0 ) {
+                       ApiBase::dieDebug( __METHOD__, 'Must be called while profiling ' .
+                               'the entire module with profileIn()' );
+               }
+               if ( $this->mDBTimeIn === 0 ) {
+                       ApiBase::dieDebug( __METHOD__, 'Called without calling profileDBIn() first' );
+               }
+
+               $time = microtime( true ) - $this->mDBTimeIn;
+               $this->mDBTimeIn = 0;
+
+               $this->mDBTime += $time;
+               $this->getMain()->mDBTime += $time;
+               wfProfileOut( $this->getModuleProfileName( true ) );
+       }
+
+       /**
+        * Total time the module used the database
+        * @return float
         */
-       public function parseMsg( $error ) {
-               $error = (array)$error; // It seems strings sometimes make their way in here
-               $key = array_shift( $error );
-
-               // Check whether the error array was nested
-               // array( array( <code>, <params> ), array( <another_code>, <params> ) )
-               if ( is_array( $key ) ) {
-                       $error = $key;
-                       $key = array_shift( $error );
-               }
-
-               if ( isset( self::$messageMap[$key] ) ) {
-                       return array(
-                               'code' => wfMsgReplaceArgs( self::$messageMap[$key]['code'], $error ),
-                               'info' => wfMsgReplaceArgs( self::$messageMap[$key]['info'], $error )
-                       );
+       public function getProfileDBTime() {
+               if ( $this->mDBTimeIn !== 0 ) {
+                       ApiBase::dieDebug( __METHOD__, 'Called without calling profileDBOut() first' );
                }
 
-               // If the key isn't present, throw an "unknown error"
-               return $this->parseMsg( array( 'unknownerror', $key ) );
+               return $this->mDBTime;
        }
 
        /**
-        * Internal code errors should be reported with this method
-        * @param string $method Method or function name
-        * @param string $message Error message
-        * @throws MWException
+        * Write logging information for API features to a debug log, for usage
+        * analysis.
+        * @param string $feature Feature being used.
         */
-       protected static function dieDebug( $method, $message ) {
-               throw new MWException( "Internal error in $method: $message" );
+       protected function logFeatureUsage( $feature ) {
+               $request = $this->getRequest();
+               $s = '"' . addslashes( $feature ) . '"' .
+                       ' "' . wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) . '"' .
+                       ' "' . $request->getIP() . '"' .
+                       ' "' . addslashes( $request->getHeader( 'Referer' ) ) . '"' .
+                       ' "' . addslashes( $request->getHeader( 'User-agent' ) ) . '"';
+               wfDebugLog( 'api-feature-usage', $s, 'private' );
        }
 
-       /**
-        * Indicates if this module needs maxlag to be checked
-        * @return bool
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Deprecated
+        * @{
         */
-       public function shouldCheckMaxlag() {
-               return true;
-       }
+
+       /// @deprecated since 1.24
+       const PROP_ROOT = 'ROOT';
+       /// @deprecated since 1.24
+       const PROP_LIST = 'LIST';
+       /// @deprecated since 1.24
+       const PROP_TYPE = 0;
+       /// @deprecated since 1.24
+       const PROP_NULLABLE = 1;
 
        /**
-        * Indicates whether this module requires read rights
-        * @return bool
+        * Formerly returned a string that identifies the version of the extending
+        * class. Typically included the class name, the svn revision, timestamp,
+        * and last author. Usually done with SVN's Id keyword
+        *
+        * @deprecated since 1.21, version string is no longer supported
+        * @return string
         */
-       public function isReadMode() {
-               return true;
+       public function getVersion() {
+               wfDeprecated( __METHOD__, '1.21' );
+               return '';
        }
 
        /**
-        * Indicates whether this module requires write mode
-        * @return bool
+        * Formerly used to fetch a list of possible properites in the result,
+        * somehow organized with respect to the prop parameter that causes them to
+        * be returned. The specific semantics of the return value was never
+        * specified. Since this was never possible to be accurately updated, it
+        * has been removed.
+        *
+        * @deprecated since 1.24
+        * @return array|bool
         */
-       public function isWriteMode() {
+       protected function getResultProperties() {
+               wfDeprecated( __METHOD__, '1.24' );
                return false;
        }
 
        /**
-        * Indicates whether this module must be called with a POST request
-        * @return bool
+        * @see self::getResultProperties()
+        * @deprecated since 1.24
+        * @return array|bool
         */
-       public function mustBePosted() {
-               return false;
+       public function getFinalResultProperties() {
+               wfDeprecated( __METHOD__, '1.24' );
+               return array();
        }
 
        /**
-        * Returns whether this module requires a token to execute
-        * It is used to show possible errors in action=paraminfo
-        * see bug 25248
-        * @return bool
+        * @see self::getResultProperties()
+        * @deprecated since 1.24
         */
-       public function needsToken() {
-               return false;
+       protected static function addTokenProperties( &$props, $tokenFunctions ) {
+               wfDeprecated( __METHOD__, '1.24' );
        }
 
        /**
-        * Returns the token salt if there is one,
-        * '' if the module doesn't require a salt,
-        * else false if the module doesn't need a token
-        * You have also to override needsToken()
-        * Value is passed to User::getEditToken
-        * @return bool|string|array
+        * @see self::getPossibleErrors()
+        * @deprecated since 1.24
+        * @return array
         */
-       public function getTokenSalt() {
-               return false;
+       public function getRequireOnlyOneParameterErrorMessages( $params ) {
+               wfDeprecated( __METHOD__, '1.24' );
+               return array();
        }
 
        /**
-        * Gets the user for whom to get the watchlist
-        *
-        * @param array $params
-        * @return User
+        * @see self::getPossibleErrors()
+        * @deprecated since 1.24
+        * @return array
         */
-       public function getWatchlistUser( $params ) {
-               if ( !is_null( $params['owner'] ) && !is_null( $params['token'] ) ) {
-                       $user = User::newFromName( $params['owner'], false );
-                       if ( !( $user && $user->getId() ) ) {
-                               $this->dieUsage( 'Specified user does not exist', 'bad_wlowner' );
-                       }
-                       $token = $user->getOption( 'watchlisttoken' );
-                       if ( $token == '' || $token != $params['token'] ) {
-                               $this->dieUsage(
-                                       'Incorrect watchlist token provided -- please set a correct token in Special:Preferences',
-                                       'bad_wltoken'
-                               );
-                       }
-               } else {
-                       if ( !$this->getUser()->isLoggedIn() ) {
-                               $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
-                       }
-                       if ( !$this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
-                               $this->dieUsage( 'You don\'t have permission to view your watchlist', 'permissiondenied' );
-                       }
-                       $user = $this->getUser();
-               }
+       public function getRequireMaxOneParameterErrorMessages( $params ) {
+               wfDeprecated( __METHOD__, '1.24' );
+               return array();
+       }
 
-               return $user;
+       /**
+        * @see self::getPossibleErrors()
+        * @deprecated since 1.24
+        * @return array
+        */
+       public function getRequireAtLeastOneParameterErrorMessages( $params ) {
+               wfDeprecated( __METHOD__, '1.24' );
+               return array();
        }
 
        /**
-        * @return bool|string|array Returns a false if the module has no help URL,
-        *   else returns a (array of) string
+        * @see self::getPossibleErrors()
+        * @deprecated since 1.24
+        * @return array
         */
-       public function getHelpUrls() {
-               return false;
+       public function getTitleOrPageIdErrorMessage() {
+               wfDeprecated( __METHOD__, '1.24' );
+               return array();
        }
 
        /**
@@ -2086,160 +2399,324 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * Profiling: total module execution time
+        * Returns the description string for this module
+        *
+        * Ignored if an i18n message exists for
+        * "apihelp-{$this->getModulePathString()}-description".
+        *
+        * @deprecated since 1.25
+        * @return Message|string|array
         */
-       private $mTimeIn = 0, $mModuleTime = 0;
+       protected function getDescription() {
+               return false;
+       }
 
        /**
-        * Start module profiling
+        * Returns an array of parameter descriptions.
+        *
+        * For each parameter, ignored if an i18n message exists for the parameter.
+        * By default that message is
+        * "apihelp-{$this->getModulePathString()}-param-{$param}", but it may be
+        * overridden using ApiBase::PARAM_HELP_MSG in the data returned by
+        * self::getFinalParams().
+        *
+        * @deprecated since 1.25
+        * @return array|bool False on no parameter descriptions
         */
-       public function profileIn() {
-               if ( $this->mTimeIn !== 0 ) {
-                       ApiBase::dieDebug( __METHOD__, 'Called twice without calling profileOut()' );
-               }
-               $this->mTimeIn = microtime( true );
-               wfProfileIn( $this->getModuleProfileName() );
+       protected function getParamDescription() {
+               return false;
        }
 
        /**
-        * End module profiling
+        * Returns usage examples for this module.
+        *
+        * Return value as an array is either:
+        *  - numeric keys with partial URLs ("api.php?" plus a query string) as
+        *    values
+        *  - sequential numeric keys with even-numbered keys being display-text
+        *    and odd-numbered keys being partial urls
+        *  - partial URLs as keys with display-text (string or array-to-be-joined)
+        *    as values
+        * Return value as a string is the same as an array with a numeric key and
+        * that value, and boolean false means "no examples".
+        *
+        * @deprecated since 1.25, use getExamplesMessages() instead
+        * @return bool|string|array
         */
-       public function profileOut() {
-               if ( $this->mTimeIn === 0 ) {
-                       ApiBase::dieDebug( __METHOD__, 'Called without calling profileIn() first' );
-               }
-               if ( $this->mDBTimeIn !== 0 ) {
-                       ApiBase::dieDebug(
-                               __METHOD__,
-                               'Must be called after database profiling is done with profileDBOut()'
-                       );
+       protected function getExamples() {
+               return false;
+       }
+
+       /**
+        * Generates help message for this module, or false if there is no description
+        * @deprecated since 1.25
+        * @return string|bool
+        */
+       public function makeHelpMsg() {
+               wfDeprecated( __METHOD__, '1.25' );
+               static $lnPrfx = "\n  ";
+
+               $msg = $this->getFinalDescription();
+
+               if ( $msg !== false ) {
+
+                       if ( !is_array( $msg ) ) {
+                               $msg = array(
+                                       $msg
+                               );
+                       }
+                       $msg = $lnPrfx . implode( $lnPrfx, $msg ) . "\n";
+
+                       $msg .= $this->makeHelpArrayToString( $lnPrfx, false, $this->getHelpUrls() );
+
+                       if ( $this->isReadMode() ) {
+                               $msg .= "\nThis module requires read rights";
+                       }
+                       if ( $this->isWriteMode() ) {
+                               $msg .= "\nThis module requires write rights";
+                       }
+                       if ( $this->mustBePosted() ) {
+                               $msg .= "\nThis module only accepts POST requests";
+                       }
+                       if ( $this->isReadMode() || $this->isWriteMode() ||
+                               $this->mustBePosted()
+                       ) {
+                               $msg .= "\n";
+                       }
+
+                       // Parameters
+                       $paramsMsg = $this->makeHelpMsgParameters();
+                       if ( $paramsMsg !== false ) {
+                               $msg .= "Parameters:\n$paramsMsg";
+                       }
+
+                       $examples = $this->getExamples();
+                       if ( $examples ) {
+                               if ( !is_array( $examples ) ) {
+                                       $examples = array(
+                                               $examples
+                                       );
+                               }
+                               $msg .= "Example" . ( count( $examples ) > 1 ? 's' : '' ) . ":\n";
+                               foreach ( $examples as $k => $v ) {
+                                       if ( is_numeric( $k ) ) {
+                                               $msg .= "  $v\n";
+                                       } else {
+                                               if ( is_array( $v ) ) {
+                                                       $msgExample = implode( "\n", array_map( array( $this, 'indentExampleText' ), $v ) );
+                                               } else {
+                                                       $msgExample = "  $v";
+                                               }
+                                               $msgExample .= ":";
+                                               $msg .= wordwrap( $msgExample, 100, "\n" ) . "\n    $k\n";
+                                       }
+                               }
+                       }
                }
 
-               $this->mModuleTime += microtime( true ) - $this->mTimeIn;
-               $this->mTimeIn = 0;
-               wfProfileOut( $this->getModuleProfileName() );
+               return $msg;
        }
 
        /**
-        * When modules crash, sometimes it is needed to do a profileOut() regardless
-        * of the profiling state the module was in. This method does such cleanup.
+        * @deprecated since 1.25
+        * @param string $item
+        * @return string
         */
-       public function safeProfileOut() {
-               if ( $this->mTimeIn !== 0 ) {
-                       if ( $this->mDBTimeIn !== 0 ) {
-                               $this->profileDBOut();
-                       }
-                       $this->profileOut();
-               }
+       private function indentExampleText( $item ) {
+               return "  " . $item;
        }
 
        /**
-        * Total time the module was executed
-        * @return float
+        * @deprecated since 1.25
+        * @param string $prefix Text to split output items
+        * @param string $title What is being output
+        * @param string|array $input
+        * @return string
         */
-       public function getProfileTime() {
-               if ( $this->mTimeIn !== 0 ) {
-                       ApiBase::dieDebug( __METHOD__, 'Called without calling profileOut() first' );
+       protected function makeHelpArrayToString( $prefix, $title, $input ) {
+               wfDeprecated( __METHOD__, '1.25' );
+               if ( $input === false ) {
+                       return '';
+               }
+               if ( !is_array( $input ) ) {
+                       $input = array( $input );
                }
 
-               return $this->mModuleTime;
-       }
-
-       /**
-        * Profiling: database execution time
-        */
-       private $mDBTimeIn = 0, $mDBTime = 0;
+               if ( count( $input ) > 0 ) {
+                       if ( $title ) {
+                               $msg = $title . ( count( $input ) > 1 ? 's' : '' ) . ":\n  ";
+                       } else {
+                               $msg = '  ';
+                       }
+                       $msg .= implode( $prefix, $input ) . "\n";
 
-       /**
-        * Start module profiling
-        */
-       public function profileDBIn() {
-               if ( $this->mTimeIn === 0 ) {
-                       ApiBase::dieDebug(
-                               __METHOD__,
-                               'Must be called while profiling the entire module with profileIn()'
-                       );
-               }
-               if ( $this->mDBTimeIn !== 0 ) {
-                       ApiBase::dieDebug( __METHOD__, 'Called twice without calling profileDBOut()' );
+                       return $msg;
                }
-               $this->mDBTimeIn = microtime( true );
-               wfProfileIn( $this->getModuleProfileName( true ) );
+
+               return '';
        }
 
        /**
-        * End database profiling
+        * Generates the parameter descriptions for this module, to be displayed in the
+        * module's help.
+        * @deprecated since 1.25
+        * @return string|bool
         */
-       public function profileDBOut() {
-               if ( $this->mTimeIn === 0 ) {
-                       ApiBase::dieDebug( __METHOD__, 'Must be called while profiling ' .
-                               'the entire module with profileIn()' );
-               }
-               if ( $this->mDBTimeIn === 0 ) {
-                       ApiBase::dieDebug( __METHOD__, 'Called without calling profileDBIn() first' );
-               }
+       public function makeHelpMsgParameters() {
+               wfDeprecated( __METHOD__, '1.25' );
+               $params = $this->getFinalParams( ApiBase::GET_VALUES_FOR_HELP );
+               if ( $params ) {
 
-               $time = microtime( true ) - $this->mDBTimeIn;
-               $this->mDBTimeIn = 0;
+                       $paramsDescription = $this->getFinalParamDescription();
+                       $msg = '';
+                       $paramPrefix = "\n" . str_repeat( ' ', 24 );
+                       $descWordwrap = "\n" . str_repeat( ' ', 28 );
+                       foreach ( $params as $paramName => $paramSettings ) {
+                               $desc = isset( $paramsDescription[$paramName] ) ? $paramsDescription[$paramName] : '';
+                               if ( is_array( $desc ) ) {
+                                       $desc = implode( $paramPrefix, $desc );
+                               }
 
-               $this->mDBTime += $time;
-               $this->getMain()->mDBTime += $time;
-               wfProfileOut( $this->getModuleProfileName( true ) );
-       }
+                               //handle shorthand
+                               if ( !is_array( $paramSettings ) ) {
+                                       $paramSettings = array(
+                                               self::PARAM_DFLT => $paramSettings,
+                                       );
+                               }
 
-       /**
-        * Total time the module used the database
-        * @return float
-        */
-       public function getProfileDBTime() {
-               if ( $this->mDBTimeIn !== 0 ) {
-                       ApiBase::dieDebug( __METHOD__, 'Called without calling profileDBOut() first' );
-               }
+                               //handle missing type
+                               if ( !isset( $paramSettings[ApiBase::PARAM_TYPE] ) ) {
+                                       $dflt = isset( $paramSettings[ApiBase::PARAM_DFLT] )
+                                               ? $paramSettings[ApiBase::PARAM_DFLT]
+                                               : null;
+                                       if ( is_bool( $dflt ) ) {
+                                               $paramSettings[ApiBase::PARAM_TYPE] = 'boolean';
+                                       } elseif ( is_string( $dflt ) || is_null( $dflt ) ) {
+                                               $paramSettings[ApiBase::PARAM_TYPE] = 'string';
+                                       } elseif ( is_int( $dflt ) ) {
+                                               $paramSettings[ApiBase::PARAM_TYPE] = 'integer';
+                                       }
+                               }
 
-               return $this->mDBTime;
-       }
+                               if ( isset( $paramSettings[self::PARAM_DEPRECATED] )
+                                       && $paramSettings[self::PARAM_DEPRECATED]
+                               ) {
+                                       $desc = "DEPRECATED! $desc";
+                               }
 
-       /**
-        * Gets a default slave database connection object
-        * @return DatabaseBase
-        */
-       protected function getDB() {
-               if ( !isset( $this->mSlaveDB ) ) {
-                       $this->profileDBIn();
-                       $this->mSlaveDB = wfGetDB( DB_SLAVE, 'api' );
-                       $this->profileDBOut();
-               }
+                               if ( isset( $paramSettings[self::PARAM_REQUIRED] )
+                                       && $paramSettings[self::PARAM_REQUIRED]
+                               ) {
+                                       $desc .= $paramPrefix . "This parameter is required";
+                               }
 
-               return $this->mSlaveDB;
-       }
+                               $type = isset( $paramSettings[self::PARAM_TYPE] )
+                                       ? $paramSettings[self::PARAM_TYPE]
+                                       : null;
+                               if ( isset( $type ) ) {
+                                       $hintPipeSeparated = true;
+                                       $multi = isset( $paramSettings[self::PARAM_ISMULTI] )
+                                               ? $paramSettings[self::PARAM_ISMULTI]
+                                               : false;
+                                       if ( $multi ) {
+                                               $prompt = 'Values (separate with \'|\'): ';
+                                       } else {
+                                               $prompt = 'One value: ';
+                                       }
 
-       /**
-        * Debugging function that prints a value and an optional backtrace
-        * @param mixed $value Value to print
-        * @param string $name Description of the printed value
-        * @param bool $backtrace If true, print a backtrace
-        */
-       public static function debugPrint( $value, $name = 'unknown', $backtrace = false ) {
-               print "\n\n<pre><b>Debugging value '$name':</b>\n\n";
-               var_export( $value );
-               if ( $backtrace ) {
-                       print "\n" . wfBacktrace();
+                                       if ( $type === 'submodule' ) {
+                                               $type = $this->getModuleManager()->getNames( $paramName );
+                                               sort( $type );
+                                       }
+                                       if ( is_array( $type ) ) {
+                                               $choices = array();
+                                               $nothingPrompt = '';
+                                               foreach ( $type as $t ) {
+                                                       if ( $t === '' ) {
+                                                               $nothingPrompt = 'Can be empty, or ';
+                                                       } else {
+                                                               $choices[] = $t;
+                                                       }
+                                               }
+                                               $desc .= $paramPrefix . $nothingPrompt . $prompt;
+                                               $choicesstring = implode( ', ', $choices );
+                                               $desc .= wordwrap( $choicesstring, 100, $descWordwrap );
+                                               $hintPipeSeparated = false;
+                                       } else {
+                                               switch ( $type ) {
+                                                       case 'namespace':
+                                                               // Special handling because namespaces are
+                                                               // type-limited, yet they are not given
+                                                               $desc .= $paramPrefix . $prompt;
+                                                               $desc .= wordwrap( implode( ', ', MWNamespace::getValidNamespaces() ),
+                                                                       100, $descWordwrap );
+                                                               $hintPipeSeparated = false;
+                                                               break;
+                                                       case 'limit':
+                                                               $desc .= $paramPrefix . "No more than {$paramSettings[self::PARAM_MAX]}";
+                                                               if ( isset( $paramSettings[self::PARAM_MAX2] ) ) {
+                                                                       $desc .= " ({$paramSettings[self::PARAM_MAX2]} for bots)";
+                                                               }
+                                                               $desc .= ' allowed';
+                                                               break;
+                                                       case 'integer':
+                                                               $s = $multi ? 's' : '';
+                                                               $hasMin = isset( $paramSettings[self::PARAM_MIN] );
+                                                               $hasMax = isset( $paramSettings[self::PARAM_MAX] );
+                                                               if ( $hasMin || $hasMax ) {
+                                                                       if ( !$hasMax ) {
+                                                                               $intRangeStr = "The value$s must be no less than " .
+                                                                                       "{$paramSettings[self::PARAM_MIN]}";
+                                                                       } elseif ( !$hasMin ) {
+                                                                               $intRangeStr = "The value$s must be no more than " .
+                                                                                       "{$paramSettings[self::PARAM_MAX]}";
+                                                                       } else {
+                                                                               $intRangeStr = "The value$s must be between " .
+                                                                                       "{$paramSettings[self::PARAM_MIN]} and {$paramSettings[self::PARAM_MAX]}";
+                                                                       }
+
+                                                                       $desc .= $paramPrefix . $intRangeStr;
+                                                               }
+                                                               break;
+                                                       case 'upload':
+                                                               $desc .= $paramPrefix . "Must be posted as a file upload using multipart/form-data";
+                                                               break;
+                                               }
+                                       }
+
+                                       if ( $multi ) {
+                                               if ( $hintPipeSeparated ) {
+                                                       $desc .= $paramPrefix . "Separate values with '|'";
+                                               }
+
+                                               $isArray = is_array( $type );
+                                               if ( !$isArray
+                                                       || $isArray && count( $type ) > self::LIMIT_SML1
+                                               ) {
+                                                       $desc .= $paramPrefix . "Maximum number of values " .
+                                                               self::LIMIT_SML1 . " (" . self::LIMIT_SML2 . " for bots)";
+                                               }
+                                       }
+                               }
+
+                               $default = isset( $paramSettings[self::PARAM_DFLT] ) ? $paramSettings[self::PARAM_DFLT] : null;
+                               if ( !is_null( $default ) && $default !== false ) {
+                                       $desc .= $paramPrefix . "Default: $default";
+                               }
+
+                               $msg .= sprintf( "  %-19s - %s\n", $this->encodeParamName( $paramName ), $desc );
+                       }
+
+                       return $msg;
                }
-               print "\n</pre>\n";
-       }
 
-       /**
-        * Write logging information for API features to a debug log, for usage
-        * analysis.
-        * @param string $feature Feature being used.
-        */
-       protected function logFeatureUsage( $feature ) {
-               $request = $this->getRequest();
-               $s = $feature .
-                       ' ' . wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) .
-                       ' ' . $request->getIP() .
-                       ' "' . $request->getHeader( 'Referer' ) . '"' .
-                       ' "' . $request->getHeader( 'User-agent' ) . '"';
-               wfDebugLog( 'api-feature-usage', $s, 'private' );
+               return false;
        }
+
+       /**@}*/
 }
+
+/**
+ * For really cool vim folding this needs to be at the end:
+ * vim: foldmarker=@{,@} foldmethod=marker
+ */
index 4fa50a4..07f62c6 100644 (file)
@@ -152,7 +152,6 @@ class ApiBlock extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
                        ),
-                       'token' => null,
                        'expiry' => 'never',
                        'reason' => '',
                        'anononly' => false,
@@ -169,7 +168,6 @@ class ApiBlock extends ApiBase {
        public function getParamDescription() {
                return array(
                        'user' => 'Username, IP address or IP range you want to block',
-                       'token' => 'A block token previously obtained through prop=info',
                        'expiry' => 'Relative expiry time, e.g. \'5 months\' or \'2 weeks\'. ' .
                                'If set to \'infinite\', \'indefinite\' or \'never\', the block will never expire.',
                        'reason' => 'Reason for block',
@@ -192,17 +190,13 @@ class ApiBlock extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
                return array(
-                       'api.php?action=block&user=123.5.5.12&expiry=3%20days&reason=First%20strike',
-                       'api.php?action=block&user=Vandal&expiry=never&reason=Vandalism&nocreate=&autoblock=&noemail='
+                       'api.php?action=block&user=123.5.5.12&expiry=3%20days&reason=First%20strike&token=123ABC',
+                       'api.php?action=block&user=Vandal&expiry=never&reason=Vandalism&nocreate=&autoblock=&noemail=&token=123ABC'
                );
        }
 
diff --git a/includes/api/ApiClearHasMsg.php b/includes/api/ApiClearHasMsg.php
new file mode 100644 (file)
index 0000000..32e20e8
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Created on August 26, 2014
+ *
+ * Copyright © 2014 Petr Bena (benapetr@gmail.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * API module that clears the hasmsg flag for current user
+ * @ingroup API
+ */
+class ApiClearHasMsg extends ApiBase {
+       public function execute() {
+               $user = $this->getUser();
+               $user->setNewtalk( false );
+               $this->getResult()->addValue( null, $this->getModuleName(), 'success' );
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function mustBePosted() {
+               return false;
+       }
+
+       public function getDescription() {
+               return array( 'Clears the hasmsg flag for current user.' );
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=clearhasmsg' => 'Clears the hasmsg flag for current user',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:ClearHasMsg';
+       }
+}
index aab0303..abca824 100644 (file)
@@ -188,10 +188,6 @@ class ApiDelete extends ApiBase {
                        'pageid' => array(
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'reason' => null,
                        'watch' => array(
                                ApiBase::PARAM_DFLT => false,
@@ -220,7 +216,6 @@ class ApiDelete extends ApiBase {
                return array(
                        'title' => "Title of the page you want to delete. Cannot be used together with {$p}pageid",
                        'pageid' => "Page ID of the page you want to delete. Cannot be used together with {$p}title",
-                       'token' => 'A delete token previously retrieved through prop=info',
                        'reason'
                                => 'Reason for the deletion. If not set, an automatically generated reason will be used',
                        'watch' => 'Add the page to your watchlist',
@@ -236,11 +231,7 @@ class ApiDelete extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
index 9126ad3..8a76271 100644 (file)
@@ -513,10 +513,6 @@ class ApiEditPage extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                        ),
                        'text' => null,
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'summary' => null,
                        'minor' => false,
                        'notminor' => false,
@@ -575,8 +571,8 @@ class ApiEditPage extends ApiBase {
                        'sectiontitle' => 'The title for a new section',
                        'text' => 'Page content',
                        'token' => array(
-                               'Edit token. You can get one of these through prop=info.',
-                               "The token should always be sent as the last parameter, or at " .
+                               /* Standard description is automatically prepended */
+                               'The token should always be sent as the last parameter, or at ' .
                                        "least, after the {$p}text parameter"
                        ),
                        'summary'
@@ -589,7 +585,8 @@ class ApiEditPage extends ApiBase {
                                'Used to detect edit conflicts; leave unset to ignore conflicts'
                        ),
                        'starttimestamp' => array(
-                               'Timestamp when you obtained the edit token.',
+                               'Timestamp when you began the editing process, e.g. when the current page content ' .
+                                       'was loaded for editing.',
                                'Used to detect edit conflicts; leave unset to ignore conflicts'
                        ),
                        'recreate' => 'Override any errors about the article having been deleted in the meantime',
@@ -616,11 +613,7 @@ class ApiEditPage extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
index 1a4d67d..9870b2d 100644 (file)
@@ -40,7 +40,11 @@ class ApiEmailUser extends ApiBase {
                }
 
                // Check permissions and errors
-               $error = SpecialEmailUser::getPermissionsError( $this->getUser(), $params['token'] );
+               $error = SpecialEmailUser::getPermissionsError(
+                       $this->getUser(),
+                       $params['token'],
+                       $this->getConfig()
+               );
                if ( $error ) {
                        $this->dieUsageMsg( array( $error ) );
                }
@@ -94,10 +98,6 @@ class ApiEmailUser extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
                        ),
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'ccme' => false,
                );
        }
@@ -107,7 +107,6 @@ class ApiEmailUser extends ApiBase {
                        'target' => 'User to send email to',
                        'subject' => 'Subject header',
                        'text' => 'Mail body',
-                       'token' => 'A token previously acquired via prop=info',
                        'ccme' => 'Send a copy of this mail to me',
                );
        }
@@ -117,16 +116,12 @@ class ApiEmailUser extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
                return array(
-                       'api.php?action=emailuser&target=WikiSysop&text=Content'
+                       'api.php?action=emailuser&target=WikiSysop&text=Content&token=123ABC'
                                => 'Send an email to the User "WikiSysop" with the text "Content"',
                );
        }
index 58e4ff9..f518e17 100644 (file)
@@ -132,17 +132,12 @@ class ApiFileRevert extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true,
                        ),
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                );
        }
 
        public function getParamDescription() {
                return array(
                        'filename' => 'Target filename without the File: prefix',
-                       'token' => 'Edit token. You can get one of these through prop=info',
                        'comment' => 'Upload comment',
                        'archivename' => 'Archive name of the revision to revert to',
                );
@@ -155,11 +150,7 @@ class ApiFileRevert extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
index 2e3fc11..7a08ed7 100644 (file)
@@ -30,8 +30,8 @@
  * @ingroup API
  */
 abstract class ApiFormatBase extends ApiBase {
-       private $mIsHtml, $mFormat, $mUnescapeAmps, $mHelp, $mCleared;
-       private $mBufferResult = false, $mBuffer, $mDisabled = false;
+       private $mIsHtml, $mFormat, $mUnescapeAmps, $mHelp;
+       private $mBuffer, $mDisabled = false;
 
        /**
         * If $format ends with 'fm', pretty-print the output in HTML.
@@ -48,12 +48,14 @@ abstract class ApiFormatBase extends ApiBase {
                        $this->mFormat = $format;
                }
                $this->mFormat = strtoupper( $this->mFormat );
-               $this->mCleared = false;
        }
 
        /**
         * Overriding class returns the MIME type that should be sent to the client.
-        * This method is not called if getIsHtml() returns true.
+        *
+        * When getIsHtml() returns true, the return value here is used for syntax
+        * highlighting but the client sees text/html.
+        *
         * @return string
         */
        abstract public function getMimeType();
@@ -74,19 +76,6 @@ abstract class ApiFormatBase extends ApiBase {
                return $this->mFormat;
        }
 
-       /**
-        * Specify whether or not sequences like &amp;quot; should be unescaped
-        * to &quot; . This should only be set to true for the help message
-        * when rendered in the default (xmlfm) format. This is a temporary
-        * special-case fix that should be removed once the help has been
-        * reworked to use a fully HTML interface.
-        *
-        * @param bool $b Whether or not ampersands should be escaped.
-        */
-       public function setUnescapeAmps( $b ) {
-               $this->mUnescapeAmps = $b;
-       }
-
        /**
         * Returns true when the HTML pretty-printer should be used.
         * The default implementation assumes that formats ending with 'fm'
@@ -98,30 +87,27 @@ abstract class ApiFormatBase extends ApiBase {
        }
 
        /**
-        * Whether this formatter can format the help message in a nice way.
-        * By default, this returns the same as getIsHtml().
-        * When action=help is set explicitly, the help will always be shown
-        * @return bool
-        */
-       public function getWantsHelp() {
-               return $this->getIsHtml();
-       }
-
-       /**
-        * Disable the formatter completely. This causes calls to initPrinter(),
-        * printText() and closePrinter() to be ignored.
+        * Disable the formatter.
+        *
+        * This causes calls to initPrinter() and closePrinter() to be ignored.
         */
        public function disable() {
                $this->mDisabled = true;
        }
 
+       /**
+        * Whether the printer is disabled
+        * @return bool
+        */
        public function isDisabled() {
                return $this->mDisabled;
        }
 
        /**
-        * Whether this formatter can handle printing API errors. If this returns
-        * false, then on API errors the default printer will be instantiated.
+        * Whether this formatter can handle printing API errors.
+        *
+        * If this returns false, then on API errors the default printer will be
+        * instantiated.
         * @since 1.23
         * @return bool
         */
@@ -130,24 +116,19 @@ abstract class ApiFormatBase extends ApiBase {
        }
 
        /**
-        * Initialize the printer function and prepare the output headers, etc.
-        * This method must be the first outputting method during execution.
-        * A human-targeted notice about available formats is printed for the HTML-based output,
-        * except for help screens (caused by either an error in the API parameters,
-        * the calling of action=help, or requesting the root script api.php).
-        * @param bool $isHelpScreen Whether a help screen is going to be shown
+        * Initialize the printer function and prepare the output headers.
+        * @param bool $unused Always false since 1.25
         */
-       function initPrinter( $isHelpScreen ) {
+       function initPrinter( $unused = false ) {
                if ( $this->mDisabled ) {
                        return;
                }
-               $isHtml = $this->getIsHtml();
-               $mime = $isHtml ? 'text/html' : $this->getMimeType();
-               $script = wfScript( 'api' );
+
+               $mime = $this->getIsHtml() ? 'text/html' : $this->getMimeType();
 
                // Some printers (ex. Feed) do their own header settings,
                // in which case $mime will be set to null
-               if ( is_null( $mime ) ) {
+               if ( $mime === null ) {
                        return; // skip any initialization
                }
 
@@ -158,128 +139,153 @@ abstract class ApiFormatBase extends ApiBase {
                if ( $apiFrameOptions ) {
                        $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $apiFrameOptions" );
                }
-
-               if ( $isHtml ) {
-?>
-<!DOCTYPE HTML>
-<html>
-<head>
-<?php
-                       if ( $this->mUnescapeAmps ) {
-?>     <title>MediaWiki API</title>
-<?php
-                       } else {
-?>     <title>MediaWiki API Result</title>
-<?php
-                       }
-?>
-</head>
-<body>
-<?php
-                       if ( !$isHelpScreen ) {
-// @codingStandardsIgnoreStart Exclude long line from CodeSniffer checks
-?>
-<br />
-<small>
-You are looking at the HTML representation of the <?php echo $this->mFormat; ?> format.<br />
-HTML is good for debugging, but is unsuitable for application use.<br />
-Specify the format parameter to change the output format.<br />
-To see the non HTML representation of the <?php echo $this->mFormat; ?> format, set format=<?php echo strtolower( $this->mFormat ); ?>.<br />
-See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
-<a href='<?php echo $script; ?>'>API help</a> for more information.
-</small>
-<pre style='white-space: pre-wrap;'>
-<?php
-// @codingStandardsIgnoreEnd
-                       // don't wrap the contents of the <pre> for help screens
-                       // because these are actually formatted to rely on
-                       // the monospaced font for layout purposes
-                       } else {
-?>
-<pre>
-<?php
-                       }
-               }
        }
 
        /**
-        * Finish printing. Closes HTML tags.
+        * Finish printing and output buffered data.
         */
        public function closePrinter() {
                if ( $this->mDisabled ) {
                        return;
                }
-               if ( $this->getIsHtml() ) {
-?>
 
-</pre>
-</body>
-</html>
-<?php
+               $mime = $this->getMimeType();
+               if ( $this->getIsHtml() && $mime !== null ) {
+                       $format = $this->getFormat();
+                       $result = $this->getBuffer();
+
+                       $context = new DerivativeContext( $this->getMain() );
+                       $context->setUser( new User ); // anon to avoid caching issues
+                       $context->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'apioutput' ) );
+                       $out = new OutputPage( $context );
+                       $out->addModules( 'mediawiki.apipretty' );
+                       $out->setPageTitle( $context->msg( 'api-format-title' ) );
+                       $context->setOutput( $out );
+
+                       $header = $context->msg( 'api-format-prettyprint-header' )
+                          ->params( $format, strtolower( $format ) )
+                          ->parseAsBlock();
+                       $out->addHTML(
+                               Html::rawElement( 'div', array( 'class' => 'api-pretty-header' ),
+                                       ApiHelp::fixHelpLinks( $header )
+                               )
+                       );
+
+                       if ( wfRunHooks( 'ApiFormatHighlight', array( $context, $result, $mime, $format ) ) ) {
+                               $out->addHTML(
+                                       Html::element( 'pre', array( 'class' => 'api-pretty-content' ), $result )
+                               );
+                       }
+
+                       $out->output();
+               } else {
+                       // For non-HTML output, clear all errors that might have been
+                       // displayed if display_errors=On
+                       ob_clean();
+
+                       echo $this->getBuffer();
                }
        }
 
        /**
-        * The main format printing function. Call it to output the result
-        * string to the user. This function will automatically output HTML
-        * when format name ends in 'fm'.
+        * Append text to the output buffer.
         * @param string $text
         */
        public function printText( $text ) {
-               if ( $this->mDisabled ) {
-                       return;
-               }
-               if ( $this->mBufferResult ) {
-                       $this->mBuffer = $text;
-               } elseif ( $this->getIsHtml() ) {
-                       echo $this->formatHTML( $text );
-               } else {
-                       // For non-HTML output, clear all errors that might have been
-                       // displayed if display_errors=On
-                       // Do this only once, of course
-                       if ( !$this->mCleared ) {
-                               ob_clean();
-                               $this->mCleared = true;
-                       }
-                       echo $text;
-               }
+               $this->mBuffer .= $text;
        }
 
        /**
         * Get the contents of the buffer.
+        * @return string
         */
        public function getBuffer() {
                return $this->mBuffer;
        }
 
+       public function getExamplesMessages() {
+               return array(
+                       'action=query&meta=siteinfo&siprop=namespaces&format=' . $this->getModuleName()
+                               => array( 'apihelp-format-example-generic', $this->getFormat() )
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Data_formats';
+       }
+
        /**
-        * Set the flag to buffer the result instead of printing it.
-        * @param bool $value
+        * To avoid code duplication with the deprecation of dbg, dump, txt, wddx,
+        * and yaml, this method is added to do the necessary work. It should be
+        * removed when those deprecated formats are removed.
         */
-       public function setBufferResult( $value ) {
-               $this->mBufferResult = $value;
+       protected function markDeprecated() {
+               $fm = $this->getIsHtml() ? 'fm' : '';
+               $name = $this->getModuleName();
+               $this->logFeatureUsage( "format=$name" );
+               $this->setWarning( "format=$name has been deprecated. Please use format=json$fm instead." );
+       }
+
+       /************************************************************************//**
+        * @name   Deprecated
+        * @{
+        */
+
+       /**
+        * Specify whether or not sequences like &amp;quot; should be unescaped
+        * to &quot; . This should only be set to true for the help message
+        * when rendered in the default (xmlfm) format. This is a temporary
+        * special-case fix that should be removed once the help has been
+        * reworked to use a fully HTML interface.
+        *
+        * @deprecated since 1.25
+        * @param bool $b Whether or not ampersands should be escaped.
+        */
+       public function setUnescapeAmps( $b ) {
+               wfDeprecated( __METHOD__, '1.25' );
+               $this->mUnescapeAmps = $b;
+       }
+
+       /**
+        * Whether this formatter can format the help message in a nice way.
+        * By default, this returns the same as getIsHtml().
+        * When action=help is set explicitly, the help will always be shown
+        * @deprecated since 1.25
+        * @return bool
+        */
+       public function getWantsHelp() {
+               wfDeprecated( __METHOD__, '1.25' );
+               return $this->getIsHtml();
        }
 
        /**
         * Sets whether the pretty-printer should format *bold*
+        * @deprecated since 1.25
         * @param bool $help
         */
        public function setHelp( $help = true ) {
+               wfDeprecated( __METHOD__, '1.25' );
                $this->mHelp = $help;
        }
 
        /**
         * Pretty-print various elements in HTML format, such as xml tags and
         * URLs. This method also escapes characters like <
+        * @deprecated since 1.25
         * @param string $text
         * @return string
         */
        protected function formatHTML( $text ) {
+               wfDeprecated( __METHOD__, '1.25' );
+
                // Escape everything first for full coverage
                $text = htmlspecialchars( $text );
-               // encode all comments or tags as safe blue strings
-               $text = str_replace( '&lt;', '<span style="color:blue;">&lt;', $text );
-               $text = str_replace( '&gt;', '&gt;</span>', $text );
+
+               if ( $this->mFormat === 'XML' || $this->mFormat === 'WDDX' ) {
+                       // encode all comments or tags as safe blue strings
+                       $text = str_replace( '&lt;', '<span style="color:blue;">&lt;', $text );
+                       $text = str_replace( '&gt;', '&gt;</span>', $text );
+               }
 
                // identify requests to api.php
                $text = preg_replace( '#^(\s*)(api\.php\?[^ <\n\t]+)$#m', '\1<a href="\2">\2</a>', $text );
@@ -324,106 +330,26 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
                return $text;
        }
 
-       public function getExamples() {
-               return array(
-                       'api.php?action=query&meta=siteinfo&siprop=namespaces&format=' . $this->getModuleName()
-                               => "Format the query result in the {$this->getModuleName()} format",
-               );
-       }
-
-       public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Data_formats';
-       }
-
+       /**
+        * @see ApiBase::getDescription
+        * @deprecated since 1.25
+        */
        public function getDescription() {
                return $this->getIsHtml() ? ' (pretty-print in HTML)' : '';
        }
 
        /**
-        * To avoid code duplication with the deprecation of dbg, dump, txt, wddx,
-        * and yaml, this method is added to do the necessary work. It should be
-        * removed when those deprecated formats are removed.
+        * Set the flag to buffer the result instead of printing it.
+        * @deprecated since 1.25, output is always buffered
+        * @param bool $value
         */
-       protected function markDeprecated() {
-               $fm = $this->getIsHtml() ? 'fm' : '';
-               $name = $this->getModuleName();
-               $this->logFeatureUsage( "format=$name" );
-               $this->setWarning( "format=$name has been deprecated. Please use format=json$fm instead." );
+       public function setBufferResult( $value ) {
        }
+
+       /**@}*/
 }
 
 /**
- * This printer is used to wrap an instance of the Feed class
- * @ingroup API
+ * For really cool vim folding this needs to be at the end:
+ * vim: foldmarker=@{,@} foldmethod=marker
  */
-class ApiFormatFeedWrapper extends ApiFormatBase {
-
-       public function __construct( ApiMain $main ) {
-               parent::__construct( $main, 'feed' );
-       }
-
-       /**
-        * Call this method to initialize output data. See execute()
-        * @param ApiResult $result
-        * @param object $feed An instance of one of the $wgFeedClasses classes
-        * @param array $feedItems Array of FeedItem objects
-        */
-       public static function setResult( $result, $feed, $feedItems ) {
-               // Store output in the Result data.
-               // This way we can check during execution if any error has occurred
-               // Disable size checking for this because we can't continue
-               // cleanly; size checking would cause more problems than it'd
-               // solve
-               $result->addValue( null, '_feed', $feed, ApiResult::NO_SIZE_CHECK );
-               $result->addValue( null, '_feeditems', $feedItems, ApiResult::NO_SIZE_CHECK );
-       }
-
-       /**
-        * Feed does its own headers
-        *
-        * @return null
-        */
-       public function getMimeType() {
-               return null;
-       }
-
-       /**
-        * Optimization - no need to sanitize data that will not be needed
-        *
-        * @return bool
-        */
-       public function getNeedsRawData() {
-               return true;
-       }
-
-       /**
-        * ChannelFeed doesn't give us a method to print errors in a friendly
-        * manner, so just punt errors to the default printer.
-        * @return bool
-        */
-       public function canPrintErrors() {
-               return false;
-       }
-
-       /**
-        * This class expects the result data to be in a custom format set by self::setResult()
-        * $result['_feed'] - an instance of one of the $wgFeedClasses classes
-        * $result['_feeditems'] - an array of FeedItem instances
-        */
-       public function execute() {
-               $data = $this->getResultData();
-               if ( isset( $data['_feed'] ) && isset( $data['_feeditems'] ) ) {
-                       $feed = $data['_feed'];
-                       $items = $data['_feeditems'];
-
-                       $feed->outHeader();
-                       foreach ( $items as & $item ) {
-                               $feed->outItem( $item );
-                       }
-                       $feed->outFooter();
-               } else {
-                       // Error has occurred, print something useful
-                       ApiBase::dieDebug( __METHOD__, 'Invalid feed class/item' );
-               }
-       }
-}
index 61ed18f..273e205 100644 (file)
@@ -26,6 +26,7 @@
 
 /**
  * API PHP's var_export() output formatter
+ * @deprecated since 1.24
  * @ingroup API
  */
 class ApiFormatDbg extends ApiFormatBase {
@@ -42,7 +43,7 @@ class ApiFormatDbg extends ApiFormatBase {
                $this->printText( var_export( $this->getResultData(), true ) );
        }
 
-       public function getDescription() {
-               return 'DEPRECATED! Output data in PHP\'s var_export() format' . parent::getDescription();
+       public function isDeprecated() {
+               return true;
        }
 }
index 7d32246..7ef8960 100644 (file)
@@ -26,6 +26,7 @@
 
 /**
  * API PHP's var_dump() output formatter
+ * @deprecated since 1.24
  * @ingroup API
  */
 class ApiFormatDump extends ApiFormatBase {
@@ -46,7 +47,7 @@ class ApiFormatDump extends ApiFormatBase {
                $this->printText( $result );
        }
 
-       public function getDescription() {
-               return 'DEPRECATED! Output data in PHP\'s var_dump() format' . parent::getDescription();
+       public function isDeprecated() {
+               return true;
        }
 }
diff --git a/includes/api/ApiFormatFeedWrapper.php b/includes/api/ApiFormatFeedWrapper.php
new file mode 100644 (file)
index 0000000..9260006
--- /dev/null
@@ -0,0 +1,101 @@
+<?php
+/**
+ *
+ *
+ * Created on Sep 19, 2006
+ *
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * This printer is used to wrap an instance of the Feed class
+ * @ingroup API
+ */
+class ApiFormatFeedWrapper extends ApiFormatBase {
+
+       public function __construct( ApiMain $main ) {
+               parent::__construct( $main, 'feed' );
+       }
+
+       /**
+        * Call this method to initialize output data. See execute()
+        * @param ApiResult $result
+        * @param object $feed An instance of one of the $wgFeedClasses classes
+        * @param array $feedItems Array of FeedItem objects
+        */
+       public static function setResult( $result, $feed, $feedItems ) {
+               // Store output in the Result data.
+               // This way we can check during execution if any error has occurred
+               // Disable size checking for this because we can't continue
+               // cleanly; size checking would cause more problems than it'd
+               // solve
+               $result->addValue( null, '_feed', $feed, ApiResult::NO_SIZE_CHECK );
+               $result->addValue( null, '_feeditems', $feedItems, ApiResult::NO_SIZE_CHECK );
+       }
+
+       /**
+        * Feed does its own headers
+        *
+        * @return null
+        */
+       public function getMimeType() {
+               return null;
+       }
+
+       /**
+        * Optimization - no need to sanitize data that will not be needed
+        *
+        * @return bool
+        */
+       public function getNeedsRawData() {
+               return true;
+       }
+
+       /**
+        * ChannelFeed doesn't give us a method to print errors in a friendly
+        * manner, so just punt errors to the default printer.
+        * @return bool
+        */
+       public function canPrintErrors() {
+               return false;
+       }
+
+       /**
+        * This class expects the result data to be in a custom format set by self::setResult()
+        * $result['_feed'] - an instance of one of the $wgFeedClasses classes
+        * $result['_feeditems'] - an array of FeedItem instances
+        */
+       public function execute() {
+               $data = $this->getResultData();
+               if ( isset( $data['_feed'] ) && isset( $data['_feeditems'] ) ) {
+                       $feed = $data['_feed'];
+                       $items = $data['_feeditems'];
+
+                       $feed->outHeader();
+                       foreach ( $items as & $item ) {
+                               $feed->outItem( $item );
+                       }
+                       $feed->outFooter();
+               } else {
+                       // Error has occurred, print something useful
+                       ApiBase::dieDebug( __METHOD__, 'Invalid feed class/item' );
+               }
+       }
+}
index 6c5ad38..ce8656e 100644 (file)
@@ -51,7 +51,11 @@ class ApiFormatJson extends ApiFormatBase {
                return $this->mIsRaw;
        }
 
+       /**
+        * @deprecated since 1.25
+        */
        public function getWantsHelp() {
+               wfDeprecated( __METHOD__, '1.25' );
                // Help is always ugly in JSON
                return false;
        }
@@ -76,25 +80,13 @@ class ApiFormatJson extends ApiFormatBase {
 
        public function getAllowedParams() {
                return array(
-                       'callback' => null,
-                       'utf8' => false,
+                       'callback' => array(
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-callback',
+                       ),
+                       'utf8' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-utf8',
+                       ),
                );
        }
-
-       public function getParamDescription() {
-               return array(
-                       'callback' => 'If specified, wraps the output into a given function ' .
-                               'call. For safety, all user-specific data will be restricted.',
-                       'utf8' => 'If specified, encodes most (but not all) non-ASCII ' .
-                               'characters as UTF-8 instead of replacing them with hexadecimal escape sequences.',
-               );
-       }
-
-       public function getDescription() {
-               if ( $this->mIsRaw ) {
-                       return 'Output data with the debugging elements in JSON format' . parent::getDescription();
-               }
-
-               return 'Output data in JSON format' . parent::getDescription();
-       }
 }
index 78023af..dc623ac 100644 (file)
@@ -36,8 +36,4 @@ class ApiFormatNone extends ApiFormatBase {
 
        public function execute() {
        }
-
-       public function getDescription() {
-               return 'Output nothing' . parent::getDescription();
-       }
 }
index b2d1f04..ae93812 100644 (file)
@@ -37,8 +37,4 @@ class ApiFormatPhp extends ApiFormatBase {
        public function execute() {
                $this->printText( serialize( $this->getResultData() ) );
        }
-
-       public function getDescription() {
-               return 'Output data in serialized PHP format' . parent::getDescription();
-       }
 }
index 3f5c8b7..235fca1 100644 (file)
  */
 class ApiFormatRaw extends ApiFormatBase {
 
+       private $errorFallback;
+
        /**
         * @param ApiMain $main
         * @param ApiFormatBase $errorFallback Object to fall back on for errors
         */
        public function __construct( ApiMain $main, ApiFormatBase $errorFallback ) {
                parent::__construct( $main, 'raw' );
-               $this->mErrorFallback = $errorFallback;
+               $this->errorFallback = $errorFallback;
        }
 
        public function getMimeType() {
                $data = $this->getResultData();
 
                if ( isset( $data['error'] ) ) {
-                       return $this->mErrorFallback->getMimeType();
+                       return $this->errorFallback->getMimeType();
                }
 
                if ( !isset( $data['mime'] ) ) {
@@ -53,11 +55,28 @@ class ApiFormatRaw extends ApiFormatBase {
                return $data['mime'];
        }
 
-       public function execute() {
+       public function initPrinter( $unused ) {
+               $data = $this->getResultData();
+               if ( isset( $data['error'] ) ) {
+                       $this->errorFallback->initPrinter( $unused );
+               } else {
+                       parent::initPrinter( $unused );
+               }
+       }
+
+       public function closePrinter() {
                $data = $this->getResultData();
                if ( isset( $data['error'] ) ) {
-                       $this->mErrorFallback->execute();
+                       $this->errorFallback->closePrinter();
+               } else {
+                       parent::closePrinter();
+               }
+       }
 
+       public function execute() {
+               $data = $this->getResultData();
+               if ( isset( $data['error'] ) ) {
+                       $this->errorFallback->execute();
                        return;
                }
 
index 3de2943..505b259 100644 (file)
@@ -26,6 +26,7 @@
 
 /**
  * API Text output formatter
+ * @deprecated since 1.24
  * @ingroup API
  */
 class ApiFormatTxt extends ApiFormatBase {
@@ -42,7 +43,7 @@ class ApiFormatTxt extends ApiFormatBase {
                $this->printText( print_r( $this->getResultData(), true ) );
        }
 
-       public function getDescription() {
-               return 'DEPRECATED! Output data in PHP\'s print_r() format' . parent::getDescription();
+       public function isDeprecated() {
+               return true;
        }
 }
index a08c3ab..e2d4d61 100644 (file)
@@ -26,6 +26,7 @@
 
 /**
  * API WDDX output formatter
+ * @deprecated since 1.24
  * @ingroup API
  */
 class ApiFormatWddx extends ApiFormatBase {
@@ -108,7 +109,7 @@ class ApiFormatWddx extends ApiFormatBase {
                }
        }
 
-       public function getDescription() {
-               return 'DEPRECATED! Output data in WDDX format' . parent::getDescription();
+       public function isDeprecated() {
+               return true;
        }
 }
index b3d5937..4ed4944 100644 (file)
@@ -237,20 +237,13 @@ class ApiFormatXml extends ApiFormatBase {
 
        public function getAllowedParams() {
                return array(
-                       'xslt' => null,
-                       'includexmlnamespace' => false,
+                       'xslt' => array(
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-callback',
+                       ),
+                       'includexmlnamespace' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-callback',
+                       ),
                );
        }
-
-       public function getParamDescription() {
-               return array(
-                       'xslt' => 'If specified, adds <xslt> as stylesheet. This should be a wiki page '
-                               . 'in the MediaWiki namespace whose page name ends with ".xsl"',
-                       'includexmlnamespace' => 'If specified, adds an XML namespace'
-               );
-       }
-
-       public function getDescription() {
-               return 'Output data in XML format' . parent::getDescription();
-       }
 }
index 9f9b057..c9089a7 100644 (file)
@@ -26,6 +26,7 @@
 
 /**
  * API YAML output formatter
+ * @deprecated since 1.24
  * @ingroup API
  */
 class ApiFormatYaml extends ApiFormatJson {
@@ -39,7 +40,7 @@ class ApiFormatYaml extends ApiFormatJson {
                parent::execute();
        }
 
-       public function getDescription() {
-               return 'DEPRECATED! Output data in YAML format' . ApiFormatBase::getDescription();
+       public function isDeprecated() {
+               return true;
        }
 }
index bcd6c12..0c962d0 100644 (file)
@@ -2,9 +2,9 @@
 /**
  *
  *
- * Created on Sep 6, 2006
+ * Created on Aug 29, 2014
  *
- * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ * Copyright © 2014 Brad Jorsch <bjorsch@wikimedia.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  */
 
 /**
- * This is a simple class to handle action=help
+ * Class to output help for an API module
  *
+ * @since 1.25 completely rewritten
  * @ingroup API
  */
 class ApiHelp extends ApiBase {
-       /**
-        * Module for displaying help
-        */
        public function execute() {
-               // Get parameters
+               global $wgContLang;
+
                $params = $this->extractRequestParams();
+               $modules = array();
 
-               if ( !isset( $params['modules'] ) && !isset( $params['querymodules'] ) ) {
-                       $this->dieUsage( '', 'help' );
+               foreach ( $params['modules'] as $path ) {
+                       $modules[] = $this->getModuleFromPath( $path );
                }
 
-               $this->getMain()->setHelp();
-               $result = $this->getResult();
+               // Get the help
+               $context = new DerivativeContext( $this->getMain()->getContext() );
+               $context->setUser( new User ); // anon to avoid caching issues
+               $context->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'apioutput' ) );
+               $context->setLanguage( $this->getMain()->getLanguage() );
+               $out = new OutputPage( $context );
+               $context->setOutput( $out );
 
-               if ( is_array( $params['modules'] ) ) {
-                       $modules = $params['modules'];
+               self::getHelp( $context, $modules, $params );
+
+               // Grab the output from the skin
+               ob_start();
+               $context->getOutput()->output();
+               $html = ob_get_clean();
+
+               $result = $this->getResult();
+               if ( $params['wrap'] ) {
+                       $data = array(
+                               'mime' => 'text/html',
+                               'help' => $help,
+                       );
+                       $result->setSubelements( $data, 'help' );
+                       $result->addValue( null, $this->getModuleName(), $data );
                } else {
-                       $modules = array();
+                       $result->reset();
+                       $result->addValue( null, 'text', $html, ApiResult::NO_SIZE_CHECK );
+                       $result->addValue( null, 'mime', 'text/html', ApiResult::NO_SIZE_CHECK );
                }
+       }
+
+       /**
+        * Generate help for the specified modules
+        *
+        * Help is placed into the OutputPage object returned by
+        * $context->getOutput().
+        *
+        * Recognized options include:
+        *  - headerlevel: (int) Header tag level
+        *  - nolead: (bool) Skip the inclusion of api-help-lead
+        *  - noheader: (bool) Skip the inclusion of the top-level section headers
+        *  - submodules: (bool) Include help for submodules of the current module
+        *  - recursivesubmodules: (bool) Include help for submodules recursively
+        *  - helptitle: (string) Title to link for additional modules' help. Should contain $1.
+        *
+        * @param IContextSource $context
+        * @param ApiBase[]|ApiBase $modules
+        * @param array $options Formatting options (described above)
+        * @return string
+        */
+       public static function getHelp( IContextSource $context, $modules, array $options ) {
+               global $wgMemc, $wgContLang;
+
+               if ( !is_array( $modules ) ) {
+                       $modules = array( $modules );
+               }
+
+               $out = $context->getOutput();
+               $out->addModules( 'mediawiki.apihelp' );
+               $out->setPageTitle( $context->msg( 'api-help-title' ) );
 
-               if ( is_array( $params['querymodules'] ) ) {
-                       $this->logFeatureUsage( 'action=help&querymodules' );
-                       $queryModules = $params['querymodules'];
-                       foreach ( $queryModules as $m ) {
-                               $modules[] = 'query+' . $m;
+               $cacheKey = null;
+               if ( count( $modules ) == 1 && $modules[0] instanceof ApiMain &&
+                       $options['recursivesubmodules'] && $context->getLanguage() === $wgContLang
+               ) {
+                       $cacheHelpTimeout = $context->getConfig()->get( 'APICacheHelpTimeout' );
+                       if ( $cacheHelpTimeout > 0 ) {
+                               // Get help text from cache if present
+                               $cacheKey = wfMemcKey( 'apihelp', $modules[0]->getModulePath(),
+                                       str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) );
+                               $cached = $wgMemc->get( $cacheKey );
+                               if ( $cached ) {
+                                       $out->addHTML( $cached );
+                                       return;
+                               }
                        }
-               } else {
-                       $queryModules = array();
                }
+               if ( $out->getHTML() !== '' ) {
+                       // Don't save to cache, there's someone else's content in the page
+                       // already
+                       $cacheKey = null;
+               }
+
+               $options['recursivesubmodules'] = !empty( $options['recursivesubmodules'] );
+               $options['submodules'] = $options['recursivesubmodules'] || !empty( $options['submodules'] );
 
-               $r = array();
-               foreach ( $modules as $m ) {
-                       // sub-modules could be given in the form of "name[+name[+name...]]"
-                       $subNames = explode( '+', $m );
-                       if ( count( $subNames ) === 1 ) {
-                               // In case the '+' was typed into URL, it resolves as a space
-                               $subNames = explode( ' ', $m );
+               // Prepend lead
+               if ( empty( $options['nolead'] ) ) {
+                       $msg = $context->msg( 'api-help-lead' );
+                       if ( !$msg->isDisabled() ) {
+                               $out->addHTML( $msg->parseAsBlock() );
                        }
+               }
 
-                       $module = $this->getMain();
-                       $subNamesCount = count( $subNames );
-                       for ( $i = 0; $i < $subNamesCount; $i++ ) {
-                               $subs = $module->getModuleManager();
-                               if ( $subs === null ) {
-                                       $module = null;
-                               } else {
-                                       $module = $subs->getModule( $subNames[$i] );
-                               }
+               $haveModules = array();
+               $out->addHTML( self::getHelpInternal( $context, $modules, $options, $haveModules ) );
 
-                               if ( $module === null ) {
-                                       if ( count( $subNames ) === 2
-                                               && $i === 1
-                                               && $subNames[0] === 'query'
-                                               && in_array( $subNames[1], $queryModules )
-                                       ) {
-                                               // Legacy: This is one of the renamed 'querymodule=...' parameters,
-                                               // do not use '+' notation in the output, use submodule's name instead.
-                                               $name = $subNames[1];
-                                       } else {
-                                               $name = implode( '+', array_slice( $subNames, 0, $i + 1 ) );
-                                       }
-                                       $r[] = array( 'name' => $name, 'missing' => '' );
-                                       break;
+               $helptitle = isset( $options['helptitle'] ) ? $options['helptitle'] : null;
+               $html = self::fixHelpLinks( $out->getHTML(), $helptitle, $haveModules );
+               $out->clearHTML();
+               $out->addHTML( $html );
+
+               if ( $cacheKey !== null ) {
+                       $wgMemc->set( $cacheKey, $out->getHTML(), $cacheHelpTimeout );
+               }
+       }
+
+       /**
+        * Replace Special:ApiHelp links with links to api.php
+        *
+        * @param string $html
+        * @param string|null $helptitle Title to link to rather than api.php, must contain '$1'
+        * @param array $localModules Modules to link within the current page
+        * @return string
+        */
+       public static function fixHelpLinks( $html, $helptitle = null, $localModules = array() ) {
+               $formatter = new HtmlFormatter( $html );
+               $doc = $formatter->getDoc();
+               $xpath = new DOMXPath( $doc );
+               $nodes = $xpath->query( '//a[@href][not(contains(@class,\'apihelp-linktrail\'))]' );
+               foreach ( $nodes as $node ) {
+                       $href = $node->getAttribute( 'href' );
+                       do {
+                               $old = $href;
+                               $href = rawurldecode( $href );
+                       } while ( $old !== $href );
+                       if ( preg_match( '!Special:ApiHelp/([^&/|]+)!', $href, $m ) ) {
+                               if ( isset( $localModules[$m[1]] ) ) {
+                                       $href = '#' . $m[1];
+                               } elseif ( $helptitle !== null ) {
+                                       $href = Title::newFromText( str_replace( '$1', $m[1], $helptitle ) )
+                                               ->getFullUrl();
                                } else {
-                                       $type = $subs->getModuleGroup( $subNames[$i] );
+                                       $href = wfAppendQuery( wfScript( 'api' ), array(
+                                               'action' => 'help',
+                                               'modules' => $m[1],
+                                       ) );
                                }
-                       }
-
-                       if ( $module !== null ) {
-                               $r[] = $this->buildModuleHelp( $module, $type );
+                               $node->setAttribute( 'href', $href );
+                               $node->removeAttribute( 'title' );
                        }
                }
 
-               $result->setIndexedTagName( $r, 'module' );
-               $result->addValue( null, $this->getModuleName(), $r );
+               return $formatter->getText();
+       }
+
+       /**
+        * Wrap a message in HTML with a class.
+        *
+        * @param Message $msg
+        * @param string $class
+        * @param string $tag
+        * @return string
+        */
+       private static function wrap( Message $msg, $class, $tag = 'span' ) {
+               return Html::rawElement( $tag, array( 'class' => $class ),
+                       $msg->parse()
+               );
        }
 
        /**
-        * @param ApiBase $module
-        * @param string $type What type of request is this? e.g. action, query, list, prop, meta, format
+        * Recursively-called function to actually construct the help
+        *
+        * @param IContextSource $context
+        * @param ApiBase[] $modules
+        * @param array $options
+        * @param array &$haveModules
         * @return string
         */
-       private function buildModuleHelp( $module, $type ) {
-               $msg = ApiMain::makeHelpMsgHeader( $module, $type );
+       private static function getHelpInternal( IContextSource $context, array $modules,
+               array $options, &$haveModules
+       ) {
+               $out = '';
+
+               $level = min( 6, empty( $options['headerlevel'] ) ? 2 : $options['headerlevel'] );
+               $options['headerlevel'] = $level;
+
+               foreach ( $modules as $module ) {
+                       $haveModules[$module->getModulePath()] = true;
+                       $module->setContext( $context );
+                       $help = array(
+                               'header' => '',
+                               'flags' => '',
+                               'description' => '',
+                               'help-urls' => '',
+                               'parameters' => '',
+                               'examples' => '',
+                               'submodules' => '',
+                       );
+
+                       if ( empty( $options['noheader'] ) ) {
+                               $path = $module->getModulePath();
+                               if ( $module->isMain() ) {
+                                       $header = $context->msg( 'api-help-main-header' )->parse();
+                               } else {
+                                       $name = $module->getModuleName();
+                                       $header = $module->getParent()->getModuleManager()->getModuleGroup( $name ) .
+                                               "=$name";
+                                       if ( $module->getModulePrefix() !== '' ) {
+                                               $header .= ' ' .
+                                                       $context->msg( 'parentheses', $module->getModulePrefix() )->parse();
+                                       }
+                               }
+                               $help['header'] .= Html::element( "h$level",
+                                       array( 'id' => $path, 'class' => 'apihelp-header' ),
+                                       $header
+                               );
+                       }
+
+                       $links = array();
+                       $any = false;
+                       for ( $m = $module; $m !== null; $m = $m->getParent() ) {
+                               $name = $m->getModuleName();
+                               if ( $name === 'main_int' ) {
+                                       $name = 'main';
+                               }
+
+                               if ( count( $modules ) === 1 && $m === $modules[0] &&
+                                       !( !empty( $options['submodules'] ) && $m->getModuleManager() )
+                               ) {
+                                       $link = Html::element( 'b', null, $name );
+                               } else {
+                                       $link = SpecialPage::getTitleFor( 'ApiHelp', $m->getModulePath() )->getLocalURL();
+                                       $link = Html::element( 'a',
+                                               array( 'href' => $link, 'class' => 'apihelp-linktrail' ),
+                                               $name
+                                       );
+                                       $any = true;
+                               }
+                               array_unshift( $links, $link );
+                       }
+                       if ( $any ) {
+                               $help['header'] .= self::wrap(
+                                       $context->msg( 'parentheses' )
+                                               ->rawParams( $context->getLanguage()->pipeList( $links ) ),
+                                       'apihelp-linktrail', 'div'
+                               );
+                       }
+
+                       $flags = $module->getHelpFlags();
+                       if ( $flags ) {
+                               $help['flags'] .= Html::openElement( 'div',
+                                       array( 'class' => 'apihelp-block apihelp-flags' ) );
+                               $msg = $context->msg( 'api-help-flags' );
+                               if ( !$msg->isDisabled() ) {
+                                       $help['flags'] .= self::wrap(
+                                               $msg->numParams( count( $flags ) ), 'apihelp-block-head', 'div'
+                                       );
+                               }
+                               $help['flags'] .= Html::openElement( 'ul' );
+                               foreach ( $flags as $flag ) {
+                                       $help['flags'] .= Html::rawElement( 'li', null,
+                                               self::wrap( $context->msg( "api-help-flag-$flag" ), "apihelp-flag-$flag" )
+                                       );
+                               }
+                               $help['flags'] .= Html::closeElement( 'ul' );
+                               $help['flags'] .= Html::closeElement( 'div' );
+                       }
+
+                       foreach ( $module->getFinalDescription() as $msg ) {
+                               $msg->setContext( $context );
+                               $help['description'] .= $msg->parseAsBlock();
+                       }
+
+                       $urls = $module->getHelpUrls();
+                       if ( $urls ) {
+                               $help['help-urls'] .= Html::openElement( 'div',
+                                       array( 'class' => 'apihelp-block apihelp-help-urls' )
+                               );
+                               $msg = $context->msg( 'api-help-help-urls' );
+                               if ( !$msg->isDisabled() ) {
+                                       $help['help-urls'] .= self::wrap(
+                                               $msg->numParams( count( $urls ) ), 'apihelp-block-head', 'div'
+                                       );
+                               }
+                               if ( !is_array( $urls ) ) {
+                                       $urls = array( $urls );
+                               }
+                               $help['help-urls'] .= Html::openElement( 'ul' );
+                               foreach ( $urls as $url ) {
+                                       $help['help-urls'] .= Html::rawElement( 'li', null,
+                                               Html::element( 'a', array( 'href' => $url ), $url )
+                                       );
+                               }
+                               $help['help-urls'] .= Html::closeElement( 'ul' );
+                               $help['help-urls'] .= Html::closeElement( 'div' );
+                       }
+
+                       $params = $module->getFinalParams( ApiBase::GET_VALUES_FOR_HELP );
+                       $groups = array();
+                       if ( $params ) {
+                               $help['parameters'] .= Html::openElement( 'div',
+                                       array( 'class' => 'apihelp-block apihelp-parameters' )
+                               );
+                               $msg = $context->msg( 'api-help-parameters' );
+                               if ( !$msg->isDisabled() ) {
+                                       $help['parameters'] .= self::wrap(
+                                               $msg->numParams( count( $params ) ), 'apihelp-block-head', 'div'
+                                       );
+                               }
+                               $help['parameters'] .= Html::openElement( 'dl' );
+
+                               $descriptions = $module->getFinalParamDescription();
+
+                               foreach ( $params as $name => $settings ) {
+                                       if ( !is_array( $settings ) ) {
+                                               $settings = array( ApiBase::PARAM_DFLT => $settings );
+                                       }
+
+                                       $help['parameters'] .= Html::element( 'dt', null,
+                                               $module->encodeParamName( $name ) );
+
+                                       // Add description
+                                       $description = array();
+                                       if ( isset( $descriptions[$name] ) ) {
+                                               foreach ( $descriptions[$name] as $msg ) {
+                                                       $msg->setContext( $context );
+                                                       $description[] = $msg->parseAsBlock();
+                                               }
+                                       }
+
+                                       // Add usage info
+                                       $info = array();
+
+                                       // Required?
+                                       if ( !empty( $settings[ApiBase::PARAM_REQUIRED] ) ) {
+                                               $info[] = $context->msg( 'api-help-param-required' )->parse();
+                                       }
+
+                                       // Type documentation
+                                       if ( !isset( $settings[ApiBase::PARAM_TYPE] ) ) {
+                                               $dflt = isset( $settings[ApiBase::PARAM_DFLT] )
+                                                       ? $settings[ApiBase::PARAM_DFLT]
+                                                       : null;
+                                               if ( is_bool( $dflt ) ) {
+                                                       $settings[ApiBase::PARAM_TYPE] = 'boolean';
+                                               } elseif ( is_string( $dflt ) || is_null( $dflt ) ) {
+                                                       $settings[ApiBase::PARAM_TYPE] = 'string';
+                                               } elseif ( is_int( $dflt ) ) {
+                                                       $settings[ApiBase::PARAM_TYPE] = 'integer';
+                                               }
+                                       }
+                                       if ( isset( $settings[ApiBase::PARAM_TYPE] ) ) {
+                                               $type = $settings[ApiBase::PARAM_TYPE];
+                                               $multi = !empty( $settings[ApiBase::PARAM_ISMULTI] );
+                                               $hintPipeSeparated = true;
+                                               $count = ApiBase::LIMIT_SML2 + 1;
+
+                                               if ( is_array( $type ) ) {
+                                                       $count = count( $type );
+                                                       $type = array_map( 'wfEscapeWikiText', $type );
+                                                       $i = array_search( '', $type, true );
+                                                       if ( $i === false ) {
+                                                               $type = $context->getLanguage()->commaList( $type );
+                                                       } else {
+                                                               unset( $type[$i] );
+                                                               $type = $context->msg( 'api-help-param-list-can-be-empty' )
+                                                                       ->numParams( count( $type ) )
+                                                                       ->params( $context->getLanguage()->commaList( $type ) )
+                                                                       ->parse();
+                                                       }
+                                                       $info[] = $context->msg( 'api-help-param-list' )
+                                                               ->params( $multi ? 2 : 1 )
+                                                               ->params( $type )
+                                                               ->parse();
+                                                       $hintPipeSeparated = false;
+                                               } else {
+                                                       switch ( $type ) {
+                                                               case 'submodule':
+                                                                       $groups[] = $name;
+                                                                       $submodules = $module->getModuleManager()->getNames( $name );
+                                                                       $count = count( $submodules );
+                                                                       sort( $submodules );
+                                                                       $prefix = $module->isMain()
+                                                                               ? '' : ( $module->getModulePath() . '+' );
+                                                                       $submodules = array_map( function ( $name ) use ( $prefix ) {
+                                                                               return "[[Special:ApiHelp/{$prefix}{$name}|{$name}]]";
+                                                                       }, $submodules );
+                                                                       $info[] = $context->msg( 'api-help-param-list' )
+                                                                               ->params( $multi ? 2 : 1 )
+                                                                               ->params( $context->getLanguage()->commaList( $submodules ) )
+                                                                               ->parse();
+                                                                       $hintPipeSeparated = false;
+                                                                       break;
+
+                                                               case 'namespace':
+                                                                       $namespaces = MWNamespace::getValidNamespaces();
+                                                                       $count = count( $namespaces );
+                                                                       $info[] = $context->msg( 'api-help-param-list' )
+                                                                               ->params( $multi ? 2 : 1 )
+                                                                               ->params( $context->getLanguage()->commaList( $namespaces ) )
+                                                                               ->parse();
+                                                                       $hintPipeSeparated = false;
+                                                                       break;
+
+                                                               case 'limit':
+                                                                       if ( isset( $settings[ApiBase::PARAM_MAX2] ) ) {
+                                                                               $info[] = $context->msg( 'api-help-param-limit2' )
+                                                                                       ->numParams( $settings[ApiBase::PARAM_MAX] )
+                                                                                       ->numParams( $settings[ApiBase::PARAM_MAX2] )
+                                                                                       ->parse();
+                                                                       } else {
+                                                                               $info[] = $context->msg( 'api-help-param-limit' )
+                                                                                       ->numParams( $settings[ApiBase::PARAM_MAX] )
+                                                                                       ->parse();
+                                                                       }
+                                                                       break;
+
+                                                               case 'integer':
+                                                                       // Possible messages:
+                                                                       // api-help-param-integer-min,
+                                                                       // api-help-param-integer-max,
+                                                                       // api-help-param-integer-minmax
+                                                                       $suffix = '';
+                                                                       $min = $max = 0;
+                                                                       if ( isset( $settings[ApiBase::PARAM_MIN] ) ) {
+                                                                               $suffix .= 'min';
+                                                                               $min = $settings[ApiBase::PARAM_MIN];
+                                                                       }
+                                                                       if ( isset( $settings[ApiBase::PARAM_MAX] ) ) {
+                                                                               $suffix .= 'max';
+                                                                               $max = $settings[ApiBase::PARAM_MAX];
+                                                                       }
+                                                                       if ( $suffix !== '' ) {
+                                                                               $info[] =
+                                                                                       $context->msg( "api-help-param-integer-$suffix" )
+                                                                                               ->params( $multi ? 2 : 1 )
+                                                                                               ->numParams( $min, $max )
+                                                                                               ->parse();
+                                                                       }
+                                                                       break;
+
+                                                               case 'upload':
+                                                                       $info[] = $context->msg( 'api-help-param-upload' )
+                                                                               ->parse();
+                                                                       break;
+                                                       }
+                                               }
+
+                                               if ( $multi ) {
+                                                       $extra = array();
+                                                       if ( $hintPipeSeparated ) {
+                                                               $extra[] = $context->msg( 'api-help-param-multi-separate' )->parse();
+                                                       }
+                                                       if ( $count > ApiBase::LIMIT_SML1 ) {
+                                                               $extra[] = $context->msg( 'api-help-param-multi-max' )
+                                                                       ->numParams( ApiBase::LIMIT_SML1, ApiBase::LIMIT_SML2 )
+                                                                       ->parse();
+                                                       }
+                                                       if ( $extra ) {
+                                                               $info[] = join( ' ', $extra );
+                                                       }
+                                               }
+                                       }
+
+                                       // Add default
+                                       $default = isset( $settings[ApiBase::PARAM_DFLT] )
+                                               ? $settings[ApiBase::PARAM_DFLT]
+                                               : null;
+                                       if ( $default === '' ) {
+                                               $info[] = $context->msg( 'api-help-param-default-empty' )
+                                                       ->parse();
+                                       } elseif ( $default !== null && $default !== false ) {
+                                               $info[] = $context->msg( 'api-help-param-default' )
+                                                       ->params( wfEscapeWikiText( $default ) )
+                                                       ->parse();
+                                       }
+
+                                       if ( !$description && !$info ) {
+                                               $description[] = self::wrap(
+                                                       $context->msg( 'api-help-param-no-description' ),
+                                                       'apihelp-empty'
+                                               );
+                                       }
+
+                                       // Add "deprecated" flag
+                                       if ( !empty( $settings[ApiBase::PARAM_DEPRECATED] ) ) {
+                                               $help['parameters'] .= Html::openElement( 'dd',
+                                                       array( 'class' => 'info' ) );
+                                               $help['parameters'] .= self::wrap(
+                                                       $context->msg( 'api-help-param-deprecated' ),
+                                                       'apihelp-deprecated', 'strong'
+                                               );
+                                               $help['parameters'] .= Html::closeElement( 'dd' );
+                                       }
+
+                                       if ( $description ) {
+                                               $help['parameters'] .= Html::openElement( 'dd',
+                                                       array( 'class' => 'description' ) );
+                                               $help['parameters'] .= join( '', $description );
+                                               $help['parameters'] .= Html::closeElement( 'dd' );
+                                       }
+
+                                       foreach ( $info as $i ) {
+                                               $help['parameters'] .= Html::rawElement( 'dd', array( 'class' => 'info' ), $i );
+                                       }
+                               }
+
+                               $help['parameters'] .= Html::closeElement( 'dl' );
+                               $help['parameters'] .= Html::closeElement( 'div' );
+                       }
+
+                       $examples = $module->getExamplesMessages();
+                       if ( $examples ) {
+                               $help['examples'] .= Html::openElement( 'div',
+                                       array( 'class' => 'apihelp-block apihelp-examples' ) );
+                               $msg = $context->msg( 'api-help-examples' );
+                               if ( !$msg->isDisabled() ) {
+                                       $help['examples'] .= self::wrap(
+                                               $msg->numParams( count( $examples ) ), 'apihelp-block-head', 'div'
+                                       );
+                               }
+
+                               $help['examples'] .= Html::openElement( 'dl' );
+                               foreach ( $examples as $qs => $msg ) {
+                                       $msg = ApiBase::makeMessage( $msg, $context, array(
+                                               $module->getModulePrefix(),
+                                               $module->getModuleName(),
+                                               $module->getModulePath()
+                                       ) );
+
+                                       $link = wfAppendQuery( wfScript( 'api' ), $qs );
+                                       $help['examples'] .= Html::rawElement( 'dt', null, $msg->parse() );
+                                       $help['examples'] .= Html::rawElement( 'dd', null,
+                                               Html::element( 'a', array( 'href' => $link ), "api.php?$qs" )
+                                       );
+                               }
+                               $help['examples'] .= Html::closeElement( 'dl' );
+                               $help['examples'] .= Html::closeElement( 'div' );
+                       }
+
+                       if ( $options['submodules'] && $module->getModuleManager() ) {
+                               $manager = $module->getModuleManager();
+                               $submodules = array();
+                               foreach ( $groups as $group ) {
+                                       $names = $manager->getNames( $group );
+                                       sort( $names );
+                                       foreach ( $names as $name ) {
+                                               $submodules[] = $manager->getModule( $name );
+                                       }
+                               }
+                               $help['submodules'] .= self::getHelpInternal( $context, $submodules, array(
+                                       'submodules' => $options['recursivesubmodules'],
+                                       'headerlevel' => $level + 1,
+                                       'noheader' => false,
+                               ) + $options, $haveModules );
+                       }
+
+                       $module->modifyHelp( $help, $options );
 
-               $msg2 = $module->makeHelpMsg();
-               if ( $msg2 !== false ) {
-                       $msg .= $msg2;
+                       wfRunHooks( 'APIHelpModifyOutput', array( $module, &$help, $options ) );
+
+                       $out .= join( "\n", $help );
                }
 
-               return $msg;
+               return $out;
        }
 
        public function shouldCheckMaxlag() {
@@ -131,39 +606,36 @@ class ApiHelp extends ApiBase {
                return false;
        }
 
+       public function getCustomPrinter() {
+               $params = $this->extractRequestParams();
+               if ( $params['wrap'] ) {
+                       return null;
+               }
+
+               $main = $this->getMain();
+               $errorPrinter = $main->createPrinterByName( $main->getParameter( 'format' ) );
+               return new ApiFormatRaw( $main, $errorPrinter );
+       }
+
        public function getAllowedParams() {
                return array(
                        'modules' => array(
-                               ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'querymodules' => array(
+                               ApiBase::PARAM_DFLT => 'main',
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_DEPRECATED => true
                        ),
+                       'submodules' => false,
+                       'recursivesubmodules' => false,
+                       'wrap' => false,
+                       'toc' => false,
                );
        }
 
-       public function getParamDescription() {
-               return array(
-                       'modules' => 'List of module names (value of the action= parameter). ' .
-                               'Can specify submodules with a \'+\'',
-                       'querymodules' => 'Use modules=query+value instead. List of query ' .
-                               'module names (value of prop=, meta= or list= parameter)',
-               );
-       }
-
-       public function getDescription() {
-               return 'Display this help screen. Or the help screen for the specified module.';
-       }
-
-       public function getExamples() {
+       public function getExamplesMessages() {
                return array(
-                       'api.php?action=help' => 'Whole help page',
-                       'api.php?action=help&modules=protect' => 'Module (action) help page',
-                       'api.php?action=help&modules=query+categorymembers'
-                               => 'Help for the query/categorymembers module',
-                       'api.php?action=help&modules=login|query+info'
-                               => 'Help for the login and query/info modules',
+                       'action=help' => 'apihelp-help-example-main',
+                       'action=help&recursivesubmodules=1' => 'apihelp-help-example-recursive',
+                       'action=help&modules=help' => 'apihelp-help-example-help',
+                       'action=help&modules=query+info|query+categorymembers' => 'apihelp-help-example-query',
                );
        }
 
index 26def44..20396dd 100644 (file)
@@ -184,10 +184,6 @@ class ApiImageRotate extends ApiBase {
                                ApiBase::PARAM_TYPE => array( '90', '180', '270' ),
                                ApiBase::PARAM_REQUIRED => true
                        ),
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'continue' => '',
                );
                if ( $flags ) {
@@ -202,7 +198,6 @@ class ApiImageRotate extends ApiBase {
 
                return $pageSet->getFinalParamDescription() + array(
                        'rotation' => 'Degrees to rotate image clockwise',
-                       'token' => 'Edit token. You can get one of these through action=tokens',
                        'continue' => 'When more results are available, use this to continue',
                );
        }
@@ -212,11 +207,7 @@ class ApiImageRotate extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
index 25ce89b..b11348e 100644 (file)
@@ -99,10 +99,6 @@ class ApiImport extends ApiBase {
 
        public function getAllowedParams() {
                return array(
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'summary' => null,
                        'xml' => array(
                                ApiBase::PARAM_TYPE => 'upload',
@@ -122,7 +118,6 @@ class ApiImport extends ApiBase {
 
        public function getParamDescription() {
                return array(
-                       'token' => 'Import token obtained through prop=info',
                        'summary' => 'Import summary',
                        'xml' => 'Uploaded XML file',
                        'interwikisource' => 'For interwiki imports: wiki to import from',
@@ -143,11 +138,7 @@ class ApiImport extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
index 115c7b0..a759c11 100644 (file)
@@ -42,7 +42,7 @@ class ApiMain extends ApiBase {
        /**
         * When no format parameter is given, this format will be used
         */
-       const API_DEFAULT_FORMAT = 'xmlfm';
+       const API_DEFAULT_FORMAT = 'jsonfm';
 
        /**
         * List of available modules: action name => module class
@@ -81,6 +81,7 @@ class ApiMain extends ApiBase {
                'watch' => 'ApiWatch',
                'patrol' => 'ApiPatrol',
                'import' => 'ApiImport',
+               'clearhasmsg' => 'ApiClearHasMsg',
                'userrights' => 'ApiUserrights',
                'options' => 'ApiOptions',
                'imagerotate' => 'ApiImageRotate',
@@ -120,11 +121,11 @@ class ApiMain extends ApiBase {
         */
        private static $mRights = array(
                'writeapi' => array(
-                       'msg' => 'Use of the write API',
+                       'msg' => 'right-writeapi',
                        'params' => array()
                ),
                'apihighlimits' => array(
-                       'msg' => 'Use higher limits in API queries (Slow queries: $1 results; Fast queries: $2 results). The limits for slow queries also apply to multivalue parameters.',
+                       'msg' => 'api-help-right-apihighlimits',
                        'params' => array( ApiBase::LIMIT_SML2, ApiBase::LIMIT_BIG2 )
                )
        );
@@ -186,6 +187,19 @@ class ApiMain extends ApiBase {
                        }
                }
 
+               $uselang = $this->getParameter( 'uselang' );
+               if ( $uselang === 'user' ) {
+                       $uselang = $this->getUser()->getOption( 'language' );
+                       $uselang = RequestContext::sanitizeLangCode( $uselang );
+                       wfRunHooks( 'UserGetLanguageObject', array( $this->getUser(), &$uselang, $this ) );
+               }
+               $code = RequestContext::sanitizeLangCode( $uselang );
+               $this->getContext()->setLanguage( $code );
+               if ( !$this->mInternalMode ) {
+                       global $wgLang;
+                       $wgLang = RequestContext::getMain()->getLanguage();
+               }
+
                $config = $this->getConfig();
                $this->mModuleMgr = new ApiModuleManager( $this );
                $this->mModuleMgr->addModules( self::$Modules, 'action' );
@@ -289,6 +303,16 @@ class ApiMain extends ApiBase {
                        }
                }
 
+               if ( $mode === 'public' && $this->getParameter( 'uselang' ) === 'user' ) {
+                       // User language is used for i18n, so we don't want to publicly
+                       // cache. Anons are ok, because if they have non-default language
+                       // then there's an appropriate Vary header set by whatever set
+                       // their non-default language.
+                       wfDebug( __METHOD__ . ": downgrading cache mode 'public' to " .
+                          "'anon-public-user-private' due to uselang=user\n" );
+                       $mode = 'anon-public-user-private';
+               }
+
                wfDebug( __METHOD__ . ": setting cache mode $mode\n" );
                $this->mCacheMode = $mode;
        }
@@ -372,10 +396,6 @@ class ApiMain extends ApiBase {
                // avoid sending public cache headers for errors.
                $this->sendCacheHeaders();
 
-               if ( $this->mPrinter->getIsHtml() && !$this->mPrinter->isDisabled() ) {
-                       echo wfReportTime();
-               }
-
                ob_end_flush();
        }
 
@@ -669,13 +689,10 @@ class ApiMain extends ApiBase {
                $config = $this->getConfig();
 
                if ( $e instanceof UsageException ) {
-                       // User entered incorrect parameters - print usage screen
+                       // User entered incorrect parameters - generate error response
                        $errMessage = $e->getMessageArray();
-
-                       // Only print the help message when this is for the developer, not runtime
-                       if ( $this->mPrinter->getWantsHelp() || $this->mAction == 'help' ) {
-                               ApiResult::setContent( $errMessage, $this->makeHelpMsg() );
-                       }
+                       $link = wfExpandUrl( wfScript( 'api' ) );
+                       ApiResult::setContent( $errMessage, "See $link for API usage" );
                } else {
                        // Something is seriously wrong
                        if ( ( $e instanceof DBQueryError ) && !$config->get( 'ShowSQLErrors' ) ) {
@@ -736,6 +753,11 @@ class ApiMain extends ApiBase {
                        }
                }
 
+               if ( $this->getParameter( 'curtimestamp' ) ) {
+                       $result->addValue( null, 'curtimestamp', wfTimestamp( TS_ISO_8601, time() ),
+                               ApiResult::NO_SIZE_CHECK );
+               }
+
                $params = $this->extractRequestParams();
 
                $this->mAction = $params['action'];
@@ -759,18 +781,37 @@ class ApiMain extends ApiBase {
                }
                $moduleParams = $module->extractRequestParams();
 
-               // Die if token required, but not provided
-               $salt = $module->getTokenSalt();
-               if ( $salt !== false ) {
+               // Check token, if necessary
+               if ( $module->needsToken() === true ) {
+                       throw new MWException(
+                               "Module '{$module->getModuleName()}' must be updated for the new token handling. " .
+                               "See documentation for ApiBase::needsToken for details."
+                       );
+               }
+               if ( $module->needsToken() ) {
+                       if ( !$module->mustBePosted() ) {
+                               throw new MWException(
+                                       "Module '{$module->getModuleName()}' must require POST to use tokens."
+                               );
+                       }
+
                        if ( !isset( $moduleParams['token'] ) ) {
                                $this->dieUsageMsg( array( 'missingparam', 'token' ) );
                        }
 
-                       if ( !$this->getUser()->matchEditToken(
-                               $moduleParams['token'],
-                               $salt,
-                               $this->getContext()->getRequest() )
+                       if ( !$this->getConfig()->get( 'DebugAPI' ) &&
+                               array_key_exists(
+                                       $module->encodeParamName( 'token' ),
+                                       $this->getRequest()->getQueryValues()
+                               )
                        ) {
+                               $this->dieUsage(
+                                       "The '{$module->encodeParamName( 'token' )}' parameter was found in the query string, but must be in the POST body",
+                                       'mustposttoken'
+                               );
+                       }
+
+                       if ( !$module->validateToken( $moduleParams['token'], $moduleParams ) ) {
                                $this->dieUsageMsg( 'sessionfailure' );
                        }
                }
@@ -1059,15 +1100,7 @@ class ApiMain extends ApiBase {
                $printer = $this->mPrinter;
                $printer->profileIn();
 
-               /**
-                * If the help message is requested in the default (xmlfm) format,
-                * tell the printer not to escape ampersands so that our links do
-                * not break.
-                */
-               $isHelp = $isError || $this->mAction == 'help';
-               $printer->setUnescapeAmps( $isHelp && $printer->getFormat() == 'XML' && $printer->getIsHtml() );
-
-               $printer->initPrinter( $isHelp );
+               $printer->initPrinter( false );
 
                $printer->execute();
                $printer->closePrinter();
@@ -1087,14 +1120,16 @@ class ApiMain extends ApiBase {
         * @return array
         */
        public function getAllowedParams() {
+               global $wgContLang;
+
                return array(
-                       'format' => array(
-                               ApiBase::PARAM_DFLT => ApiMain::API_DEFAULT_FORMAT,
-                               ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'format' )
-                       ),
                        'action' => array(
                                ApiBase::PARAM_DFLT => 'help',
-                               ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'action' )
+                               ApiBase::PARAM_TYPE => 'submodule',
+                       ),
+                       'format' => array(
+                               ApiBase::PARAM_DFLT => ApiMain::API_DEFAULT_FORMAT,
+                               ApiBase::PARAM_TYPE => 'submodule',
                        ),
                        'maxlag' => array(
                                ApiBase::PARAM_TYPE => 'integer'
@@ -1112,13 +1147,104 @@ class ApiMain extends ApiBase {
                        ),
                        'requestid' => null,
                        'servedby' => false,
+                       'curtimestamp' => false,
                        'origin' => null,
+                       'uselang' => array(
+                               ApiBase::PARAM_DFLT => $wgContLang->getCode(),
+                       ),
                );
        }
 
+       /** @see ApiBase::getExamplesMessages() */
+       public function getExamplesMessages() {
+               return array(
+                       'action=help' => 'apihelp-help-example-main',
+                       'action=help&recursivesubmodules=1' => 'apihelp-help-example-recursive',
+               );
+       }
+
+       public function modifyHelp( array &$help, array $options ) {
+               // Wish PHP had an "array_insert_before". Instead, we have to manually
+               // reindex the array to get 'permissions' in the right place.
+               $oldHelp = $help;
+               $help = array();
+               foreach ( $oldHelp as $k => $v ) {
+                       if ( $k === 'submodules' ) {
+                               $help['permissions'] = '';
+                       }
+                       $help[$k] = $v;
+               }
+               $help['credits'] = '';
+
+               // Fill 'permissions'
+               $help['permissions'] .= Html::openElement( 'div',
+                       array( 'class' => 'apihelp-block apihelp-permissions' ) );
+               $m = $this->msg( 'api-help-permissions' );
+               if ( !$m->isDisabled() ) {
+                       $help['permissions'] .= Html::rawElement( 'div', array( 'class' => 'apihelp-block-head' ),
+                               $m->numParams( count( self::$mRights ) )->parse()
+                       );
+               }
+               $help['permissions'] .= Html::openElement( 'dl' );
+               foreach ( self::$mRights as $right => $rightMsg ) {
+                       $help['permissions'] .= Html::element( 'dt', null, $right );
+
+                       $rightMsg = $this->msg( $rightMsg['msg'], $rightMsg['params'] )->parse();
+                       $help['permissions'] .= Html::rawElement( 'dd', null, $rightMsg );
+
+                       $groups = array_map( function ( $group ) {
+                               return $group == '*' ? 'all' : $group;
+                       }, User::getGroupsWithPermission( $right ) );
+
+                       $help['permissions'] .= Html::rawElement( 'dd', null,
+                               $this->msg( 'api-help-permissions-granted-to' )
+                                       ->numParams( count( $groups ) )
+                                       ->params( $this->getLanguage()->commaList( $groups ) )
+                                       ->parse()
+                       );
+               }
+               $help['permissions'] .= Html::closeElement( 'dl' );
+               $help['permissions'] .= Html::closeElement( 'div' );
+
+               // Fill 'credits', if applicable
+               if ( empty( $options['nolead'] ) ) {
+                       $help['credits'] .= Html::element( 'h' . min( 6, $options['headerlevel'] + 1 ),
+                               array( 'id' => '+credits', 'class' => 'apihelp-header' ),
+                               $this->msg( 'api-credits-header' )->parse()
+                       );
+                       $help['credits'] .= $this->msg( 'api-credits' )->useDatabase( false )->parseAsBlock();
+               }
+       }
+
+       private $mCanApiHighLimits = null;
+
        /**
-        * See ApiBase for description.
-        *
+        * Check whether the current user is allowed to use high limits
+        * @return bool
+        */
+       public function canApiHighLimits() {
+               if ( !isset( $this->mCanApiHighLimits ) ) {
+                       $this->mCanApiHighLimits = $this->getUser()->isAllowed( 'apihighlimits' );
+               }
+
+               return $this->mCanApiHighLimits;
+       }
+
+       /**
+        * Overrides to return this instance's module manager.
+        * @return ApiModuleManager
+        */
+       public function getModuleManager() {
+               return $this->mModuleMgr;
+       }
+
+       /************************************************************************//**
+        * @name   Deprecated
+        * @{
+        */
+
+       /**
+        * @deprecated since 1.25
         * @return array
         */
        public function getParamDescription() {
@@ -1139,6 +1265,7 @@ class ApiMain extends ApiBase {
                        'requestid' => 'Request ID to distinguish requests. This will just be output back to you',
                        'servedby' => 'Include the hostname that served the request in the ' .
                                'results. Unconditionally shown on error',
+                       'curtimestamp' => 'Include the current timestamp in the result.',
                        'origin' => array(
                                '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',
@@ -1153,8 +1280,7 @@ class ApiMain extends ApiBase {
        }
 
        /**
-        * See ApiBase for description.
-        *
+        * @deprecated since 1.25
         * @return array
         */
        public function getDescription() {
@@ -1198,40 +1324,25 @@ class ApiMain extends ApiBase {
                );
        }
 
-       /**
-        * Returns an array of strings with credits for the API
-        * @return array
-        */
-       protected function getCredits() {
-               return array(
-                       'API developers:',
-                       '    Roan Kattouw (lead developer Sep 2007-2009)',
-                       '    Victor Vasiliev',
-                       '    Bryan Tong Minh',
-                       '    Sam Reed',
-                       '    Yuri Astrakhan (creator, lead developer Sep 2006-Sep 2007, 2012-2013)',
-                       '    Brad Jorsch (lead developer 2013-now)',
-                       '',
-                       'Please send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org',
-                       'or file a bug report at https://bugzilla.wikimedia.org/'
-               );
-       }
-
        /**
         * Sets whether the pretty-printer should format *bold* and $italics$
         *
+        * @deprecated since 1.25
         * @param bool $help
         */
        public function setHelp( $help = true ) {
+               wfDeprecated( __METHOD__, '1.25' );
                $this->mPrinter->setHelp( $help );
        }
 
        /**
         * Override the parent to generate help messages for all available modules.
         *
+        * @deprecated since 1.25
         * @return string
         */
        public function makeHelpMsg() {
+               wfDeprecated( __METHOD__, '1.25' );
                global $wgMemc;
                $this->setHelp();
                // Get help text from cache if present
@@ -1254,9 +1365,11 @@ class ApiMain extends ApiBase {
        }
 
        /**
+        * @deprecated since 1.25
         * @return mixed|string
         */
        public function reallyMakeHelpMsg() {
+               wfDeprecated( __METHOD__, '1.25' );
                $this->setHelp();
 
                // Use parent to make default message for the main module
@@ -1278,8 +1391,12 @@ class ApiMain extends ApiBase {
 
                $msg .= "\n$astriks Permissions $astriks\n\n";
                foreach ( self::$mRights as $right => $rightMsg ) {
+                       $rightsMsg = $this->msg( $rightMsg['msg'], $rightMsg['params'] )
+                               ->useDatabase( false )
+                               ->inLanguage( 'en' )
+                               ->text();
                        $groups = User::getGroupsWithPermission( $right );
-                       $msg .= "* " . $right . " *\n  " . wfMsgReplaceArgs( $rightMsg['msg'], $rightMsg['params'] ) .
+                       $msg .= "* " . $right . " *\n  $rightsMsg" .
                                "\nGranted to:\n  " . str_replace( '*', 'all', implode( ', ', $groups ) ) . "\n\n";
                }
 
@@ -1294,18 +1411,22 @@ class ApiMain extends ApiBase {
                        $msg .= "\n";
                }
 
-               $msg .= "\n*** Credits: ***\n   " . implode( "\n   ", $this->getCredits() ) . "\n";
+               $credits = $this->msg( 'api-credits' )->useDatabase( 'false' )->inLanguage( 'en' )->text();
+               $credits = str_replace( "\n", "\n   ", $credits );
+               $msg .= "\n*** Credits: ***\n   $credits\n";
 
                return $msg;
        }
 
        /**
+        * @deprecated since 1.25
         * @param ApiBase $module
         * @param string $paramName What type of request is this? e.g. action,
         *    query, list, prop, meta, format
         * @return string
         */
        public static function makeHelpMsgHeader( $module, $paramName ) {
+               wfDeprecated( __METHOD__, '1.25' );
                $modulePrefix = $module->getModulePrefix();
                if ( strval( $modulePrefix ) !== '' ) {
                        $modulePrefix = "($modulePrefix) ";
@@ -1314,20 +1435,6 @@ class ApiMain extends ApiBase {
                return "* $paramName={$module->getModuleName()} $modulePrefix*";
        }
 
-       private $mCanApiHighLimits = null;
-
-       /**
-        * Check whether the current user is allowed to use high limits
-        * @return bool
-        */
-       public function canApiHighLimits() {
-               if ( !isset( $this->mCanApiHighLimits ) ) {
-                       $this->mCanApiHighLimits = $this->getUser()->isAllowed( 'apihighlimits' );
-               }
-
-               return $this->mCanApiHighLimits;
-       }
-
        /**
         * Check whether the user wants us to show version information in the API help
         * @return bool
@@ -1339,14 +1446,6 @@ class ApiMain extends ApiBase {
                return false;
        }
 
-       /**
-        * Overrides to return this instance's module manager.
-        * @return ApiModuleManager
-        */
-       public function getModuleManager() {
-               return $this->mModuleMgr;
-       }
-
        /**
         * Add or overwrite a module in this ApiMain instance. Intended for use by extending
         * classes who wish to add their own modules to their lexicon or override the
@@ -1391,11 +1490,13 @@ class ApiMain extends ApiBase {
        public function getFormats() {
                return $this->getModuleManager()->getNamesWithClasses( 'format' );
        }
+
+       /**@}*/
+
 }
 
 /**
  * This exception will be thrown when dieUsage is called to stop module execution.
- * The exception handling code will print a help screen explaining how this API may be used.
  *
  * @ingroup API
  */
@@ -1449,3 +1550,8 @@ class UsageException extends MWException {
                return "{$this->getCodeString()}: {$this->getMessage()}";
        }
 }
+
+/**
+ * For really cool vim folding this needs to be at the end:
+ * vim: foldmarker=@{,@} foldmethod=marker
+ */
index f7d0ccf..a0300ab 100644 (file)
@@ -241,6 +241,21 @@ class ApiModuleManager extends ContextSource {
                return $result;
        }
 
+       /**
+        * Returns the class name of the given module
+        *
+        * @param string $module Module name
+        * @return string|bool class name or false if the module does not exist
+        * @since 1.24
+        */
+       public function getClassName( $module ) {
+               if ( isset( $this->mModules[$module] ) ) {
+                       return $this->mModules[$module][1];
+               }
+
+               return false;
+       }
+
        /**
         * Returns true if the specific module is defined at all or in a specific group.
         * @param string $moduleName Module name
index 602a905..04e931d 100644 (file)
@@ -195,10 +195,6 @@ class ApiMove extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
                        ),
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'reason' => '',
                        'movetalk' => false,
                        'movesubpages' => false,
@@ -231,7 +227,6 @@ class ApiMove extends ApiBase {
                        'from' => "Title of the page you want to move. Cannot be used together with {$p}fromid",
                        'fromid' => "Page ID of the page you want to move. Cannot be used together with {$p}from",
                        'to' => 'Title you want to rename the page to',
-                       'token' => 'A move token previously retrieved through prop=info',
                        'reason' => 'Reason for the move',
                        'movetalk' => 'Move the talk page, if it exists',
                        'movesubpages' => 'Move subpages, if applicable',
@@ -249,11 +244,7 @@ class ApiMove extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
index 8ac9b9a..b01dc3e 100644 (file)
@@ -135,10 +135,6 @@ class ApiOptions extends ApiBase {
                $optionKinds[] = 'all';
 
                return array(
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'reset' => false,
                        'resetkinds' => array(
                                ApiBase::PARAM_TYPE => $optionKinds,
@@ -159,7 +155,6 @@ class ApiOptions extends ApiBase {
 
        public function getParamDescription() {
                return array(
-                       'token' => 'An options token previously obtained through the action=tokens',
                        'reset' => 'Resets preferences to the site defaults',
                        'resetkinds' => 'List of types of options to reset when the "reset" option is set',
                        'change' => array( 'List of changes, formatted name=value (e.g. skin=vector), ' .
@@ -183,11 +178,7 @@ class ApiOptions extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getHelpUrls() {
index 0f26467..3bdecaa 100644 (file)
@@ -53,7 +53,10 @@ class ApiPageSet extends ApiBase {
 
        private $mAllPages = array(); // [ns][dbkey] => page_id or negative when missing
        private $mTitles = array();
+       private $mGoodAndMissingPages = array(); // [ns][dbkey] => page_id or negative when missing
+       private $mGoodPages = array(); // [ns][dbkey] => page_id
        private $mGoodTitles = array();
+       private $mMissingPages = array(); // [ns][dbkey] => fake page_id
        private $mMissingTitles = array();
        private $mInvalidTitles = array();
        private $mMissingPageIDs = array();
@@ -343,6 +346,14 @@ class ApiPageSet extends ApiBase {
                return count( $this->mTitles );
        }
 
+       /**
+        * Returns an array [ns][dbkey] => page_id for all good titles.
+        * @return array
+        */
+       public function getGoodTitlesByNamespace() {
+               return $this->mGoodPages;
+       }
+
        /**
         * Title objects that were found in the database.
         * @return Title[] Array page_id (int) => Title (obj)
@@ -359,6 +370,15 @@ class ApiPageSet extends ApiBase {
                return count( $this->mGoodTitles );
        }
 
+       /**
+        * Returns an array [ns][dbkey] => fake_page_id for all missing titles.
+        * fake_page_id is a unique negative number.
+        * @return array
+        */
+       public function getMissingTitlesByNamespace() {
+               return $this->mMissingPages;
+       }
+
        /**
         * Title objects that were NOT found in the database.
         * The array's index will be negative for each item
@@ -368,6 +388,22 @@ class ApiPageSet extends ApiBase {
                return $this->mMissingTitles;
        }
 
+       /**
+        * Returns an array [ns][dbkey] => page_id for all good and missing titles.
+        * @return array
+        */
+       public function getGoodAndMissingTitlesByNamespace() {
+               return $this->mGoodAndMissingPages;
+       }
+
+       /**
+        * Title objects for good and missing titles.
+        * @return array
+        */
+       public function getGoodAndMissingTitles() {
+               return $this->mGoodTitles + $this->mMissingTitles;
+       }
+
        /**
         * Titles that were deemed invalid by Title::newFromText()
         * The array's index will be unique and negative for each item
@@ -667,6 +703,8 @@ class ApiPageSet extends ApiBase {
                if ( $this->mResolveRedirects && $row->page_is_redirect == '1' ) {
                        $this->mPendingRedirectIDs[$pageId] = $title;
                } else {
+                       $this->mGoodPages[$row->page_namespace][$row->page_title] = $pageId;
+                       $this->mGoodAndMissingPages[$row->page_namespace][$row->page_title] = $pageId;
                        $this->mGoodTitles[$pageId] = $title;
                }
 
@@ -803,6 +841,8 @@ class ApiPageSet extends ApiBase {
                                        foreach ( array_keys( $dbkeys ) as $dbkey ) {
                                                $title = Title::makeTitle( $ns, $dbkey );
                                                $this->mAllPages[$ns][$dbkey] = $this->mFakePageId;
+                                               $this->mMissingPages[$ns][$dbkey] = $this->mFakePageId;
+                                               $this->mGoodAndMissingPages[$ns][$dbkey] = $this->mFakePageId;
                                                $this->mMissingTitles[$this->mFakePageId] = $title;
                                                $this->mFakePageId--;
                                                $this->mTitles[] = $title;
index 935d5ae..5965a46 100644 (file)
  */
 class ApiParamInfo extends ApiBase {
 
-       /**
-        * @var ApiQuery
-        */
-       protected $queryObj;
+       private $helpFormat;
+       private $context;
 
        public function __construct( ApiMain $main, $action ) {
                parent::__construct( $main, $action );
-               $this->queryObj = new ApiQuery( $this->getMain(), 'query' );
        }
 
        public function execute() {
+               global $wgContLang;
+
                // Get parameters
                $params = $this->extractRequestParams();
-               $resultObj = $this->getResult();
+
+               $this->helpFormat = $params['helpformat'];
+               $this->context = new RequestContext;
+               $this->context->setUser( new User ); // anon to avoid caching issues
+               $this->context->setLanguage( $this->getMain()->getLanguage() );
+
+               if ( is_array( $params['modules'] ) ) {
+                       $modules = $params['modules'];
+               } else {
+                       $modules = array();
+               }
+
+               if ( is_array( $params['querymodules'] ) ) {
+                       $this->logFeatureUsage( 'action=paraminfo&querymodules' );
+                       $queryModules = $params['querymodules'];
+                       foreach ( $queryModules as $m ) {
+                               $modules[] = 'query+' . $m;
+                       }
+               } else {
+                       $queryModules = array();
+               }
+
+               if ( is_array( $params['formatmodules'] ) ) {
+                       $this->logFeatureUsage( 'action=paraminfo&formatmodules' );
+                       $formatModules = $params['formatmodules'];
+                       foreach ( $formatModules as $m ) {
+                               $modules[] = $m;
+                       }
+               } else {
+                       $formatModules = array();
+               }
 
                $res = array();
 
-               $this->addModulesInfo( $params, 'modules', $res, $resultObj );
+               foreach ( $modules as $m ) {
+                       try {
+                               $module = $this->getModuleFromPath( $m );
+                       } catch ( UsageException $ex ) {
+                               $this->setWarning( $ex->getMessage() );
+                               continue;
+                       }
+                       $key = 'modules';
+
+                       // Back compat
+                       $isBCQuery = false;
+                       if ( $module->getParent() && $module->getParent()->getModuleName() == 'query' &&
+                               in_array( $module->getModuleName(), $queryModules )
+                       ) {
+                               $isBCQuery = true;
+                               $key = 'querymodules';
+                       }
+                       if ( in_array( $module->getModuleName(), $formatModules ) ) {
+                               $key = 'formatmodules';
+                       }
+
+                       $item = $this->getModuleInfo( $module );
+                       if ( $isBCQuery ) {
+                               $item['querytype'] = $item['group'];
+                       }
+                       $res[$key][] = $item;
+               }
 
-               $this->addModulesInfo( $params, 'querymodules', $res, $resultObj );
+               $result = $this->getResult();
+               $result->addValue( array( $this->getModuleName() ), 'helpformat', $this->helpFormat );
+
+               foreach ( $res as $key => $stuff ) {
+                       $result->setIndexedTagName( $res[$key], 'module' );
+               }
 
                if ( $params['mainmodule'] ) {
-                       $res['mainmodule'] = $this->getClassInfo( $this->getMain() );
+                       $this->logFeatureUsage( 'action=paraminfo&mainmodule' );
+                       $res['mainmodule'] = $this->getModuleInfo( $this->getMain() );
                }
 
                if ( $params['pagesetmodule'] ) {
-                       $pageSet = new ApiPageSet( $this->queryObj );
-                       $res['pagesetmodule'] = $this->getClassInfo( $pageSet );
+                       $this->logFeatureUsage( 'action=paraminfo&pagesetmodule' );
+                       $pageSet = new ApiPageSet( $this->getMain()->getModuleManager()->getModule( 'query' ) );
+                       $res['pagesetmodule'] = $this->getModuleInfo( $pageSet );
+                       unset( $res['pagesetmodule']['name'] );
+                       unset( $res['pagesetmodule']['path'] );
+                       unset( $res['pagesetmodule']['group'] );
                }
 
-               $this->addModulesInfo( $params, 'formatmodules', $res, $resultObj );
-
-               $resultObj->addValue( null, $this->getModuleName(), $res );
+               $result->addValue( null, $this->getModuleName(), $res );
        }
 
        /**
-        * If the type is requested in parameters, adds a section to res with module info.
-        * @param array $params User parameters array
-        * @param string $type Parameter name
-        * @param array $res Store results in this array
-        * @param ApiResult $resultObj Results object to set indexed tag.
+        * @param array $res Result array
+        * @param string $key Result key
+        * @param Message[] $msgs
         */
-       private function addModulesInfo( $params, $type, &$res, $resultObj ) {
-               if ( !is_array( $params[$type] ) ) {
-                       return;
-               }
-               $isQuery = ( $type === 'querymodules' );
-               if ( $isQuery ) {
-                       $mgr = $this->queryObj->getModuleManager();
-               } else {
-                       $mgr = $this->getMain()->getModuleManager();
-               }
-               $res[$type] = array();
-               foreach ( $params[$type] as $mod ) {
-                       if ( !$mgr->isDefined( $mod ) ) {
-                               $res[$type][] = array( 'name' => $mod, 'missing' => '' );
-                               continue;
-                       }
-                       $obj = $mgr->getModule( $mod );
-                       $item = $this->getClassInfo( $obj );
-                       $item['name'] = $mod;
-                       if ( $isQuery ) {
-                               $item['querytype'] = $mgr->getModuleGroup( $mod );
-                       }
-                       $res[$type][] = $item;
+       protected function formatHelpMessages( array &$res, $key, array $msgs ) {
+               switch ( $this->helpFormat ) {
+                       case 'none':
+                               break;
+
+                       case 'wikitext':
+                               $ret = array();
+                               foreach ( $msgs as $m ) {
+                                       $ret[] = $m->setContext( $this->context )->text();
+                               }
+                               $res[$key] = join( "\n\n", $ret );
+                               break;
+
+                       case 'html':
+                               $ret = array();
+                               foreach ( $msgs as $m ) {
+                                       $ret[] = $m->setContext( $this->context )->parseAsBlock();
+                               }
+                               $res[$key] = join( "\n", $ret );
+                               break;
+
+                       case 'raw':
+                               $res[$key] = array();
+                               foreach ( $msgs as $m ) {
+                                       $res[$key][] = array(
+                                               'key' => $m->getKey(),
+                                               'params' => $m->getParams(),
+                                       );
+                               }
+                               $this->getResult()->setIndexedTagName( $res[$key], 'msg' );
+                               break;
                }
-               $resultObj->setIndexedTagName( $res[$type], 'module' );
        }
 
        /**
-        * @param ApiBase $obj
+        * @param ApiBase $module
         * @return ApiResult
         */
-       private function getClassInfo( $obj ) {
+       private function getModuleInfo( $module ) {
                $result = $this->getResult();
-               $retval['classname'] = get_class( $obj );
-               $retval['description'] = implode( "\n", (array)$obj->getFinalDescription() );
-               $retval['examples'] = '';
-
-               // version is deprecated since 1.21, but needs to be returned for v1
-               $retval['version'] = '';
-               $retval['prefix'] = $obj->getModulePrefix();
-
-               if ( $obj->isReadMode() ) {
-                       $retval['readrights'] = '';
-               }
-               if ( $obj->isWriteMode() ) {
-                       $retval['writerights'] = '';
-               }
-               if ( $obj->mustBePosted() ) {
-                       $retval['mustbeposted'] = '';
-               }
-               if ( $obj instanceof ApiQueryGeneratorBase ) {
-                       $retval['generator'] = '';
+               $ret = array();
+
+               $ret['name'] = $module->getModuleName();
+               $ret['classname'] = get_class( $module );
+               $ret['path'] = $module->getModulePath();
+               if ( !$module->isMain() ) {
+                       $ret['group'] = $module->getParent()->getModuleManager()->getModuleGroup(
+                               $module->getModuleName()
+                       );
                }
+               $ret['prefix'] = $module->getModulePrefix();
 
-               $allowedParams = $obj->getFinalParams( ApiBase::GET_VALUES_FOR_HELP );
-               if ( !is_array( $allowedParams ) ) {
-                       return $retval;
-               }
+               $this->formatHelpMessages( $ret, 'description', $module->getFinalDescription() );
 
-               $retval['helpurls'] = (array)$obj->getHelpUrls();
-               if ( isset( $retval['helpurls'][0] ) && $retval['helpurls'][0] === false ) {
-                       $retval['helpurls'] = array();
+               foreach ( $module->getHelpFlags() as $flag ) {
+                       $ret[$flag] = '';
                }
-               $result->setIndexedTagName( $retval['helpurls'], 'helpurl' );
 
-               $examples = $obj->getExamples();
-               $retval['allexamples'] = array();
-               if ( $examples !== false ) {
-                       if ( is_string( $examples ) ) {
-                               $examples = array( $examples );
-                       }
-                       foreach ( $examples as $k => $v ) {
-                               if ( strlen( $retval['examples'] ) ) {
-                                       $retval['examples'] .= ' ';
-                               }
-                               $item = array();
-                               if ( is_numeric( $k ) ) {
-                                       $retval['examples'] .= $v;
-                                       ApiResult::setContent( $item, $v );
-                               } else {
-                                       if ( !is_array( $v ) ) {
-                                               $item['description'] = $v;
+               $ret['helpurls'] = (array)$module->getHelpUrls();
+               if ( isset( $ret['helpurls'][0] ) && $ret['helpurls'][0] === false ) {
+                       $ret['helpurls'] = array();
+               }
+               $result->setIndexedTagName( $ret['helpurls'], 'helpurl' );
+
+               if ( $this->helpFormat !== 'none' ) {
+                       $ret['examples'] = array();
+                       $examples = $module->getExamplesMessages();
+                       foreach ( $examples as $qs => $msg ) {
+                               $item = array(
+                                       'query' => $qs
+                               );
+                               $msg = ApiBase::makeMessage( $msg, $this->context, array(
+                                       $module->getModulePrefix(),
+                                       $module->getModuleName(),
+                                       $module->getModulePath()
+                               ) );
+                               $this->formatHelpMessages( $item, 'description', array( $msg ) );
+                               if ( isset( $item['description'] ) ) {
+                                       if ( is_array( $item['description'] ) ) {
+                                               $item['description'] = $item['description'][0];
                                        } else {
-                                               $item['description'] = implode( $v, "\n" );
+                                               $result->setSubelements( $item, 'description' );
                                        }
-                                       $retval['examples'] .= $item['description'] . ' ' . $k;
-                                       ApiResult::setContent( $item, $k );
                                }
-                               $retval['allexamples'][] = $item;
+                               $ret['examples'][] = $item;
                        }
+                       $result->setIndexedTagName( $ret['examples'], 'example' );
                }
-               $result->setIndexedTagName( $retval['allexamples'], 'example' );
-
-               $retval['parameters'] = array();
-               $paramDesc = $obj->getFinalParamDescription();
-               foreach ( $allowedParams as $n => $p ) {
-                       $a = array( 'name' => $n );
-                       if ( isset( $paramDesc[$n] ) ) {
-                               $a['description'] = implode( "\n", (array)$paramDesc[$n] );
+
+               $ret['parameters'] = array();
+               $params = $module->getFinalParams( ApiBase::GET_VALUES_FOR_HELP );
+               $paramDesc = $module->getFinalParamDescription();
+               foreach ( $params as $name => $settings ) {
+                       if ( !is_array( $settings ) ) {
+                               $settings = array( ApiBase::PARAM_DFLT => $settings );
                        }
 
-                       //handle shorthand
-                       if ( !is_array( $p ) ) {
-                               $p = array(
-                                       ApiBase::PARAM_DFLT => $p,
-                               );
+                       $item = array(
+                               'name' => $name
+                       );
+                       if ( isset( $paramDesc[$name] ) ) {
+                               $this->formatHelpMessages( $item, 'description', $paramDesc[$name] );
+                       }
+
+                       if ( !empty( $settings[ApiBase::PARAM_REQUIRED] ) ) {
+                               $item['required'] = '';
                        }
 
-                       //handle missing type
-                       if ( !isset( $p[ApiBase::PARAM_TYPE] ) ) {
-                               $dflt = isset( $p[ApiBase::PARAM_DFLT] ) ? $p[ApiBase::PARAM_DFLT] : null;
+                       if ( !empty( $settings[ApiBase::PARAM_DEPRECATED] ) ) {
+                               $item['deprecated'] = '';
+                       }
+
+                       if ( $name === 'token' && $module->needsToken() ) {
+                               $item['tokentype'] = $module->needsToken();
+                       }
+
+                       if ( !isset( $settings[ApiBase::PARAM_TYPE] ) ) {
+                               $dflt = isset( $settings[ApiBase::PARAM_DFLT] )
+                                       ? $settings[ApiBase::PARAM_DFLT]
+                                       : null;
                                if ( is_bool( $dflt ) ) {
-                                       $p[ApiBase::PARAM_TYPE] = 'boolean';
+                                       $settings[ApiBase::PARAM_TYPE] = 'boolean';
                                } elseif ( is_string( $dflt ) || is_null( $dflt ) ) {
-                                       $p[ApiBase::PARAM_TYPE] = 'string';
+                                       $settings[ApiBase::PARAM_TYPE] = 'string';
                                } elseif ( is_int( $dflt ) ) {
-                                       $p[ApiBase::PARAM_TYPE] = 'integer';
+                                       $settings[ApiBase::PARAM_TYPE] = 'integer';
                                }
                        }
 
-                       if ( isset( $p[ApiBase::PARAM_DEPRECATED] ) && $p[ApiBase::PARAM_DEPRECATED] ) {
-                               $a['deprecated'] = '';
-                       }
-                       if ( isset( $p[ApiBase::PARAM_REQUIRED] ) && $p[ApiBase::PARAM_REQUIRED] ) {
-                               $a['required'] = '';
-                       }
-
-                       if ( isset( $p[ApiBase::PARAM_DFLT] ) ) {
-                               $type = $p[ApiBase::PARAM_TYPE];
-                               if ( $type === 'boolean' ) {
-                                       $a['default'] = ( $p[ApiBase::PARAM_DFLT] ? 'true' : 'false' );
-                               } elseif ( $type === 'string' ) {
-                                       $a['default'] = strval( $p[ApiBase::PARAM_DFLT] );
-                               } elseif ( $type === 'integer' ) {
-                                       $a['default'] = intval( $p[ApiBase::PARAM_DFLT] );
-                               } else {
-                                       $a['default'] = $p[ApiBase::PARAM_DFLT];
+                       if ( isset( $settings[ApiBase::PARAM_DFLT] ) ) {
+                               switch ( $settings[ApiBase::PARAM_TYPE] ) {
+                                       case 'boolean':
+                                               $item['default'] = ( $settings[ApiBase::PARAM_DFLT] ? 'true' : 'false' );
+                                               break;
+                                       case 'string':
+                                               $item['default'] = strval( $settings[ApiBase::PARAM_DFLT] );
+                                               break;
+                                       case 'integer':
+                                               $item['default'] = intval( $settings[ApiBase::PARAM_DFLT] );
+                                               break;
+                                       default:
+                                               $item['default'] = $settings[ApiBase::PARAM_DFLT];
+                                               break;
                                }
                        }
-                       if ( isset( $p[ApiBase::PARAM_ISMULTI] ) && $p[ApiBase::PARAM_ISMULTI] ) {
-                               $a['multi'] = '';
-                               $a['limit'] = $this->getMain()->canApiHighLimits() ?
+
+                       if ( !empty( $settings[ApiBase::PARAM_ISMULTI] ) ) {
+                               $item['multi'] = '';
+                               $item['limit'] = $this->getMain()->canApiHighLimits() ?
                                        ApiBase::LIMIT_SML2 :
                                        ApiBase::LIMIT_SML1;
-                               $a['lowlimit'] = ApiBase::LIMIT_SML1;
-                               $a['highlimit'] = ApiBase::LIMIT_SML2;
+                               $item['lowlimit'] = ApiBase::LIMIT_SML1;
+                               $item['highlimit'] = ApiBase::LIMIT_SML2;
                        }
 
-                       if ( isset( $p[ApiBase::PARAM_ALLOW_DUPLICATES] ) && $p[ApiBase::PARAM_ALLOW_DUPLICATES] ) {
-                               $a['allowsduplicates'] = '';
+                       if ( !empty( $settings[ApiBase::PARAM_ALLOW_DUPLICATES] ) ) {
+                               $item['allowsduplicates'] = '';
                        }
 
-                       if ( isset( $p[ApiBase::PARAM_TYPE] ) ) {
-                               $a['type'] = $p[ApiBase::PARAM_TYPE];
-                               if ( is_array( $a['type'] ) ) {
+                       if ( isset( $settings[ApiBase::PARAM_TYPE] ) ) {
+                               if ( $settings[ApiBase::PARAM_TYPE] === 'submodule' ) {
+                                       $item['type'] = $module->getModuleManager()->getNames( $name );
+                                       sort( $item['type'] );
+                                       $item['submodules'] = '';
+                               } else {
+                                       $item['type'] = $settings[ApiBase::PARAM_TYPE];
+                               }
+                               if ( is_array( $item['type'] ) ) {
                                        // To prevent sparse arrays from being serialized to JSON as objects
-                                       $a['type'] = array_values( $a['type'] );
-                                       $result->setIndexedTagName( $a['type'], 't' );
+                                       $item['type'] = array_values( $item['type'] );
+                                       $result->setIndexedTagName( $item['type'], 't' );
                                }
                        }
-                       if ( isset( $p[ApiBase::PARAM_MAX] ) ) {
-                               $a['max'] = $p[ApiBase::PARAM_MAX];
+                       if ( isset( $settings[ApiBase::PARAM_MAX] ) ) {
+                               $item['max'] = $settings[ApiBase::PARAM_MAX];
                        }
-                       if ( isset( $p[ApiBase::PARAM_MAX2] ) ) {
-                               $a['highmax'] = $p[ApiBase::PARAM_MAX2];
+                       if ( isset( $settings[ApiBase::PARAM_MAX2] ) ) {
+                               $item['highmax'] = $settings[ApiBase::PARAM_MAX2];
                        }
-                       if ( isset( $p[ApiBase::PARAM_MIN] ) ) {
-                               $a['min'] = $p[ApiBase::PARAM_MIN];
+                       if ( isset( $settings[ApiBase::PARAM_MIN] ) ) {
+                               $item['min'] = $settings[ApiBase::PARAM_MIN];
                        }
-                       $retval['parameters'][] = $a;
+                       $ret['parameters'][] = $item;
                }
-               $result->setIndexedTagName( $retval['parameters'], 'param' );
+               $result->setIndexedTagName( $ret['parameters'], 'param' );
 
-               return $retval;
+               return $ret;
        }
 
        public function isReadMode() {
@@ -252,9 +326,9 @@ class ApiParamInfo extends ApiBase {
        }
 
        public function getAllowedParams() {
-               $modules = $this->getMain()->getModuleManager()->getNames( 'action' );
-               sort( $modules );
-               $querymodules = $this->queryObj->getModuleManager()->getNames();
+               // back compat
+               $querymodules = $this->getMain()->getModuleManager()
+                       ->getModule( 'query' )->getModuleManager()->getNames();
                sort( $querymodules );
                $formatmodules = $this->getMain()->getModuleManager()->getNames( 'format' );
                sort( $formatmodules );
@@ -262,15 +336,25 @@ class ApiParamInfo extends ApiBase {
                return array(
                        'modules' => array(
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => $modules,
                        ),
+                       'helpformat' => array(
+                               ApiBase::PARAM_DFLT => 'none',
+                               ApiBase::PARAM_TYPE => array( 'html', 'wikitext', 'raw', 'none' ),
+                       ),
+
                        'querymodules' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => $querymodules,
                        ),
-                       'mainmodule' => false,
-                       'pagesetmodule' => false,
+                       'mainmodule' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
+                       'pagesetmodule' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
                        'formatmodules' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => $formatmodules,
                        )
@@ -279,7 +363,9 @@ class ApiParamInfo extends ApiBase {
 
        public function getParamDescription() {
                return array(
-                       'modules' => 'List of module names (value of the action= parameter)',
+                       'modules' => 'List of module names (values of the action= and format= parameters, or "main"). Can specify submodules with a \'+\'',
+                       'helpformat' => 'Format of help strings',
+
                        'querymodules' => 'List of query module names (value of prop=, meta= or list= parameter)',
                        'mainmodule' => 'Get information about the main (top-level) module as well',
                        'pagesetmodule' => 'Get information about the pageset module ' .
@@ -294,7 +380,7 @@ class ApiParamInfo extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=paraminfo&modules=parse&querymodules=allpages|siteinfo'
+                       'api.php?action=paraminfo&modules=parse|phpfm|query+allpages|query+siteinfo'
                );
        }
 
index d09470b..0b1f4db 100644 (file)
@@ -79,16 +79,6 @@ class ApiParse extends ApiBase {
                // TODO: Does this still need $wgTitle?
                global $wgParser, $wgTitle;
 
-               // Currently unnecessary, code to act as a safeguard against any change
-               // in current behavior of uselang
-               $oldLang = null;
-               if ( isset( $params['uselang'] )
-                       && $params['uselang'] != $this->getContext()->getLanguage()->getCode()
-               ) {
-                       $oldLang = $this->getContext()->getLanguage(); // Backup language
-                       $this->getContext()->setLanguage( Language::factory( $params['uselang'] ) );
-               }
-
                $redirValues = null;
 
                // Return result
@@ -409,10 +399,6 @@ class ApiParse extends ApiBase {
                );
                $this->setIndexedTagNames( $result_array, $result_mapping );
                $result->addValue( null, $this->getModuleName(), $result_array );
-
-               if ( !is_null( $oldLang ) ) {
-                       $this->getContext()->setLanguage( $oldLang ); // Reset language to $oldLang
-               }
        }
 
        /**
@@ -473,6 +459,7 @@ class ApiParse extends ApiBase {
        /**
         * @param Content $content
         * @param string $what Identifies the content in error messages, e.g. page title.
+        * @return Content|bool
         */
        private function getSectionContent( Content $content, $what ) {
                // Not cached (save or load)
@@ -498,7 +485,7 @@ class ApiParse extends ApiBase {
                        $entry['lang'] = $bits[0];
                        if ( $title ) {
                                $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
-                               // localised language name in user language (maybe set by uselang=)
+                               // localised language name in 'uselang' language
                                $entry['langname'] = Language::fetchLanguageName(
                                        $title->getInterwiki(),
                                        $this->getLanguage()->getCode()
@@ -703,7 +690,6 @@ class ApiParse extends ApiBase {
                        'pst' => false,
                        'onlypst' => false,
                        'effectivelanglinks' => false,
-                       'uselang' => null,
                        'section' => null,
                        'disablepp' => false,
                        'disableeditsection' => false,
@@ -770,7 +756,6 @@ class ApiParse extends ApiBase {
                                'Returns the same wikitext, after a PST has been applied.',
                                "Only valid when used with {$p}text",
                        ),
-                       'uselang' => 'Which language to parse the request in',
                        'section' => 'Only retrieve the content of this section number',
                        'disablepp' => 'Disable the PP Report from the parser output',
                        'disableeditsection' => 'Disable edit section links from the parser output',
index 9690952..8b66781 100644 (file)
@@ -77,10 +77,6 @@ class ApiPatrol extends ApiBase {
 
        public function getAllowedParams() {
                return array(
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'rcid' => array(
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
@@ -92,7 +88,6 @@ class ApiPatrol extends ApiBase {
 
        public function getParamDescription() {
                return array(
-                       'token' => 'Patrol token obtained from list=recentchanges',
                        'rcid' => 'Recentchanges ID to patrol',
                        'revid' => 'Revision ID to patrol',
                );
@@ -103,17 +98,13 @@ class ApiPatrol extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
                return 'patrol';
        }
 
        public function getExamples() {
                return array(
-                       'api.php?action=patrol&token=123abc&rcid=230672766',
-                       'api.php?action=patrol&token=123abc&revid=230672766'
+                       'api.php?action=patrol&token=123ABC&rcid=230672766',
+                       'api.php?action=patrol&token=123ABC&revid=230672766'
                );
        }
 
index 844d1cc..a3d12b7 100644 (file)
@@ -148,10 +148,6 @@ class ApiProtect extends ApiBase {
                        'pageid' => array(
                                ApiBase::PARAM_TYPE => 'integer',
                        ),
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'protections' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_REQUIRED => true,
@@ -185,7 +181,6 @@ class ApiProtect extends ApiBase {
                return array(
                        'title' => "Title of the page you want to (un)protect. Cannot be used together with {$p}pageid",
                        'pageid' => "ID of the page you want to (un)protect. Cannot be used together with {$p}title",
-                       'token' => 'A protect token previously retrieved through prop=info',
                        'protections' => 'List of protection levels, formatted action=group (e.g. edit=sysop)',
                        'expiry' => array(
                                'Expiry timestamps. If only one timestamp is ' .
@@ -208,11 +203,7 @@ class ApiProtect extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
index 4359201..a8e20dc 100644 (file)
@@ -47,17 +47,20 @@ class ApiQuery extends ApiBase {
                'contributors' => 'ApiQueryContributors',
                'duplicatefiles' => 'ApiQueryDuplicateFiles',
                'extlinks' => 'ApiQueryExternalLinks',
+               'fileusage' => 'ApiQueryBacklinksprop',
                'images' => 'ApiQueryImages',
                'imageinfo' => 'ApiQueryImageInfo',
                'info' => 'ApiQueryInfo',
                'links' => 'ApiQueryLinks',
+               'linkshere' => 'ApiQueryBacklinksprop',
                'iwlinks' => 'ApiQueryIWLinks',
                'langlinks' => 'ApiQueryLangLinks',
                'pageprops' => 'ApiQueryPageProps',
-               'redirects' => 'ApiQueryRedirects',
+               'redirects' => 'ApiQueryBacklinksprop',
                'revisions' => 'ApiQueryRevisions',
                'stashimageinfo' => 'ApiQueryStashImageInfo',
                'templates' => 'ApiQueryLinks',
+               'transcludedin' => 'ApiQueryBacklinksprop',
        );
 
        /**
@@ -108,6 +111,7 @@ class ApiQuery extends ApiBase {
                'siteinfo' => 'ApiQuerySiteinfo',
                'userinfo' => 'ApiQueryUserInfo',
                'filerepoinfo' => 'ApiQueryFileRepoInfo',
+               'tokens' => 'ApiQueryTokens',
        );
 
        /**
@@ -510,21 +514,22 @@ class ApiQuery extends ApiBase {
                $result = array(
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'prop' )
+                               ApiBase::PARAM_TYPE => 'submodule',
                        ),
                        'list' => array(
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'list' )
+                               ApiBase::PARAM_TYPE => 'submodule',
                        ),
                        'meta' => array(
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'meta' )
+                               ApiBase::PARAM_TYPE => 'submodule',
                        ),
                        'indexpageids' => false,
                        'export' => false,
                        'exportnowrap' => false,
                        'iwurl' => false,
                        'continue' => null,
+                       'rawcontinue' => false,
                );
                if ( $flags ) {
                        $result += $this->getPageSet()->getFinalParams( $flags );
@@ -535,9 +540,11 @@ class ApiQuery extends ApiBase {
 
        /**
         * Override the parent to generate help messages for all available query modules.
+        * @deprecated since 1.25
         * @return string
         */
        public function makeHelpMsg() {
+               wfDeprecated( __METHOD__, '1.25' );
 
                // Use parent to make default message for the query module
                $msg = parent::makeHelpMsg();
@@ -557,6 +564,7 @@ class ApiQuery extends ApiBase {
 
        /**
         * For all modules of a given group, generate help messages and join them together
+        * @deprecated since 1.25
         * @param string $group Module group
         * @return string
         */
@@ -607,6 +615,8 @@ class ApiQuery extends ApiBase {
                                'This parameter is recommended for all new development, and ' .
                                        'will be made default in the next API version.'
                        ),
+                       'rawcontinue' => 'Currently ignored. In the future, \'continue=\' will become the ' .
+                               'default and this will be needed to receive the raw query-continue data.',
                );
        }
 
index dfef286..e1cc75a 100644 (file)
@@ -50,7 +50,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
                if ( $params['activeusers'] ) {
                        // Update active user cache
-                       SpecialActiveUsers::mergeActiveUsers( 600, $activeUserDays );
+                       SpecialActiveUsers::mergeActiveUsers( 300, $activeUserDays );
                }
 
                $db = $this->getDB();
@@ -72,7 +72,6 @@ class ApiQueryAllUsers extends ApiQueryBase {
                $limit = $params['limit'];
 
                $this->addTables( 'user' );
-               $useIndex = true;
 
                $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
                $from = is_null( $params['from'] ) ? null : $this->getCanonicalUserName( $params['from'] );
@@ -82,6 +81,10 @@ class ApiQueryAllUsers extends ApiQueryBase {
                # despite the JOIN condition, so manually sort on the correct one.
                $userFieldToSort = $params['activeusers'] ? 'qcc_title' : 'user_name';
 
+               # Some of these subtable joins are going to give us duplicate rows, so
+               # calculate the maximum number of duplicates we might see.
+               $maxDuplicateRows = 1;
+
                $this->addWhereRange( $userFieldToSort, $dir, $from, $to );
 
                if ( !is_null( $params['prefix'] ) ) {
@@ -116,16 +119,17 @@ class ApiQueryAllUsers extends ApiQueryBase {
                }
 
                if ( !is_null( $params['group'] ) && count( $params['group'] ) ) {
-                       $useIndex = false;
-                       // Filter only users that belong to a given group
+                       // Filter only users that belong to a given group. This might
+                       // produce as many rows-per-user as there are groups being checked.
                        $this->addTables( 'user_groups', 'ug1' );
                        $this->addJoinConds( array( 'ug1' => array( 'INNER JOIN', array( 'ug1.ug_user=user_id',
                                'ug1.ug_group' => $params['group'] ) ) ) );
+                       $maxDuplicateRows *= count( $params['group'] );
                }
 
                if ( !is_null( $params['excludegroup'] ) && count( $params['excludegroup'] ) ) {
-                       $useIndex = false;
-                       // Filter only users don't belong to a given group
+                       // Filter only users don't belong to a given group. This can only
+                       // produce one row-per-user, because we only keep on "no match".
                        $this->addTables( 'user_groups', 'ug1' );
 
                        if ( count( $params['excludegroup'] ) == 1 ) {
@@ -149,22 +153,16 @@ class ApiQueryAllUsers extends ApiQueryBase {
                $this->showHiddenUsersAddBlockInfo( $fld_blockinfo );
 
                if ( $fld_groups || $fld_rights ) {
-                       // Show the groups the given users belong to
-                       // request more than needed to avoid not getting all rows that belong to one user
-                       $groupCount = count( User::getAllGroups() );
-                       $sqlLimit = $limit + $groupCount + 1;
-
-                       $this->addTables( 'user_groups', 'ug2' );
-                       $this->addJoinConds( array( 'ug2' => array( 'LEFT JOIN', 'ug2.ug_user=user_id' ) ) );
-                       $this->addFields( 'ug2.ug_group ug_group2' );
-               } else {
-                       $sqlLimit = $limit + 1;
+                       $this->addFields( array( 'groups' =>
+                               $db->buildGroupConcatField( '|', 'user_groups', 'ug_group', 'ug_user=user_id' )
+                       ) );
                }
 
                if ( $params['activeusers'] ) {
                        $activeUserSeconds = $activeUserDays * 86400;
 
-                       // Filter query to only include users in the active users cache
+                       // Filter query to only include users in the active users cache.
+                       // There shouldn't be any duplicate rows in querycachetwo here.
                        $this->addTables( 'querycachetwo' );
                        $this->addJoinConds( array( 'querycachetwo' => array(
                                'INNER JOIN', array(
@@ -190,6 +188,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        ) );
                }
 
+               $sqlLimit = $limit + $maxDuplicateRows;
                $this->addOption( 'LIMIT', $sqlLimit );
 
                $this->addFields( array(
@@ -199,143 +198,105 @@ class ApiQueryAllUsers extends ApiQueryBase {
                $this->addFieldsIf( 'user_editcount', $fld_editcount );
                $this->addFieldsIf( 'user_registration', $fld_registration );
 
-               if ( $useIndex ) {
-                       $this->addOption( 'USE INDEX', array( 'user' => 'user_name' ) );
-               }
-
                $res = $this->select( __METHOD__ );
-
                $count = 0;
-               $lastUserData = false;
+               $countDuplicates = 0;
                $lastUser = false;
                $result = $this->getResult();
-
-               // This loop keeps track of the last entry. For each new row, if the
-               // new row is for different user then the last, the last entry is added
-               // to results. Otherwise, the group of the new row is appended to the
-               // last entry. The setContinue... is more complex because of this, and
-               // takes into account the higher sql limit to make sure all rows that
-               // belong to the same user are received.
-
                foreach ( $res as $row ) {
                        $count++;
 
-                       if ( $lastUser !== $row->user_name ) {
-                               // Save the last pass's user data
-                               if ( is_array( $lastUserData ) ) {
-                                       if ( $params['activeusers'] && $lastUserData['recentactions'] === 0 ) {
-                                               // activeusers cache was out of date
-                                               $fit = true;
-                                       } else {
-                                               $fit = $result->addValue( array( 'query', $this->getModuleName() ),
-                                                       null, $lastUserData );
-                                       }
-
-                                       $lastUserData = null;
-
-                                       if ( !$fit ) {
-                                               $this->setContinueEnumParameter( 'from', $lastUserData['name'] );
-                                               break;
-                                       }
+                       if ( $lastUser === $row->user_name ) {
+                               // Duplicate row due to one of the needed subtable joins.
+                               // Ignore it, but count the number of them to sanely handle
+                               // miscalculation of $maxDuplicateRows.
+                               $countDuplicates++;
+                               if ( $countDuplicates == $maxDuplicateRows ) {
+                                       ApiBase::dieDebug( __METHOD__, 'Saw more duplicate rows than expected' );
                                }
+                               continue;
+                       }
 
-                               if ( $count > $limit ) {
-                                       // We've reached the one extra which shows that there are
-                                       // additional pages to be had. Stop here...
-                                       $this->setContinueEnumParameter( 'from', $row->user_name );
-                                       break;
-                               }
+                       $countDuplicates = 0;
+                       $lastUser = $row->user_name;
 
-                               // Record new user's data
-                               $lastUser = $row->user_name;
-                               $lastUserData = array(
-                                       'userid' => $row->user_id,
-                                       'name' => $lastUser,
-                               );
-                               if ( $fld_blockinfo && !is_null( $row->ipb_by_text ) ) {
-                                       $lastUserData['blockid'] = $row->ipb_id;
-                                       $lastUserData['blockedby'] = $row->ipb_by_text;
-                                       $lastUserData['blockedbyid'] = $row->ipb_by;
-                                       $lastUserData['blockreason'] = $row->ipb_reason;
-                                       $lastUserData['blockexpiry'] = $row->ipb_expiry;
-                               }
-                               if ( $row->ipb_deleted ) {
-                                       $lastUserData['hidden'] = '';
-                               }
-                               if ( $fld_editcount ) {
-                                       $lastUserData['editcount'] = intval( $row->user_editcount );
-                               }
-                               if ( $params['activeusers'] ) {
-                                       $lastUserData['recentactions'] = intval( $row->recentactions );
-                                       // @todo 'recenteditcount' is set for BC, remove in 1.25
-                                       $lastUserData['recenteditcount'] = $lastUserData['recentactions'];
-                               }
-                               if ( $fld_registration ) {
-                                       $lastUserData['registration'] = $row->user_registration ?
-                                               wfTimestamp( TS_ISO_8601, $row->user_registration ) : '';
-                               }
+                       if ( $count > $limit ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
+                               $this->setContinueEnumParameter( 'from', $row->user_name );
+                               break;
                        }
 
-                       if ( $sqlLimit == $count ) {
-                               // @todo BUG!  database contains group name that User::getAllGroups() does not return
-                               // Should handle this more gracefully
-                               ApiBase::dieDebug(
-                                       __METHOD__,
-                                       'MediaWiki configuration error: The database contains more ' .
-                                               'user groups than known to User::getAllGroups() function'
-                               );
+                       if ( $count == $sqlLimit ) {
+                               // Should never hit this (either the $countDuplicates check or
+                               // the $count > $limit check should hit first), but check it
+                               // anyway just in case.
+                               ApiBase::dieDebug( __METHOD__, 'Saw more duplicate rows than expected' );
                        }
 
-                       $lastUserObj = User::newFromId( $row->user_id );
-
-                       // Add user's group info
-                       if ( $fld_groups ) {
-                               if ( !isset( $lastUserData['groups'] ) ) {
-                                       if ( $lastUserObj ) {
-                                               $lastUserData['groups'] = $lastUserObj->getAutomaticGroups();
-                                       } else {
-                                               // This should not normally happen
-                                               $lastUserData['groups'] = array();
-                                       }
-                               }
-
-                               if ( !is_null( $row->ug_group2 ) ) {
-                                       $lastUserData['groups'][] = $row->ug_group2;
-                               }
-
-                               $result->setIndexedTagName( $lastUserData['groups'], 'g' );
+                       if ( $params['activeusers'] && $row->recentactions === 0 ) {
+                               // activeusers cache was out of date
+                               continue;
                        }
 
-                       if ( $fld_implicitgroups && !isset( $lastUserData['implicitgroups'] ) && $lastUserObj ) {
-                               $lastUserData['implicitgroups'] = $lastUserObj->getAutomaticGroups();
-                               $result->setIndexedTagName( $lastUserData['implicitgroups'], 'g' );
+                       $data = array(
+                               'userid' => $row->user_id,
+                               'name' => $row->user_name,
+                       );
+
+                       if ( $fld_blockinfo && !is_null( $row->ipb_by_text ) ) {
+                               $data['blockid'] = $row->ipb_id;
+                               $data['blockedby'] = $row->ipb_by_text;
+                               $data['blockedbyid'] = $row->ipb_by;
+                               $data['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $row->ipb_timestamp );
+                               $data['blockreason'] = $row->ipb_reason;
+                               $data['blockexpiry'] = $row->ipb_expiry;
+                       }
+                       if ( $row->ipb_deleted ) {
+                               $data['hidden'] = '';
+                       }
+                       if ( $fld_editcount ) {
+                               $data['editcount'] = intval( $row->user_editcount );
                        }
-                       if ( $fld_rights ) {
-                               if ( !isset( $lastUserData['rights'] ) ) {
-                                       if ( $lastUserObj ) {
-                                               $lastUserData['rights'] = User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
-                                       } else {
-                                               // This should not normally happen
-                                               $lastUserData['rights'] = array();
-                                       }
+                       if ( $params['activeusers'] ) {
+                               $data['recentactions'] = intval( $row->recentactions );
+                               // @todo 'recenteditcount' is set for BC, remove in 1.25
+                               $data['recenteditcount'] = $data['recentactions'];
+                       }
+                       if ( $fld_registration ) {
+                               $data['registration'] = $row->user_registration ?
+                                       wfTimestamp( TS_ISO_8601, $row->user_registration ) : '';
+                       }
+
+                       if ( $fld_implicitgroups || $fld_groups || $fld_rights ) {
+                               $user = User::newFromId( $row->user_id );
+                               $implicitGroups = User::newFromId( $row->user_id )->getAutomaticGroups();
+                               if ( isset( $row->groups ) && $row->groups !== '' ) {
+                                       $groups = array_merge( $implicitGroups, explode( '|', $row->groups ) );
+                               } else {
+                                       $groups = $implicitGroups;
                                }
 
-                               if ( !is_null( $row->ug_group2 ) ) {
-                                       $lastUserData['rights'] = array_unique( array_merge( $lastUserData['rights'],
-                                               User::getGroupPermissions( array( $row->ug_group2 ) ) ) );
+                               if ( $fld_groups ) {
+                                       $data['groups'] = $groups;
+                                       $result->setIndexedTagName( $data['groups'], 'g' );
                                }
 
-                               $result->setIndexedTagName( $lastUserData['rights'], 'r' );
+                               if ( $fld_implicitgroups ) {
+                                       $data['implicitgroups'] = $implicitGroups;
+                                       $result->setIndexedTagName( $data['implicitgroups'], 'g' );
+                               }
+
+                               if ( $fld_rights ) {
+                                       $data['rights'] = User::getGroupPermissions( $groups );
+                                       $result->setIndexedTagName( $data['rights'], 'r' );
+                               }
                        }
-               }
 
-               if ( is_array( $lastUserData ) &&
-                       !( $params['activeusers'] && $lastUserData['recentactions'] === 0 )
-               ) {
-                       $fit = $result->addValue( array( 'query', $this->getModuleName() ),
-                               null, $lastUserData );
+                       $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $data );
                        if ( !$fit ) {
-                               $this->setContinueEnumParameter( 'from', $lastUserData['name'] );
+                               $this->setContinueEnumParameter( 'from', $data['name'] );
+                               break;
                        }
                }
 
index c141246..f00a6e7 100644 (file)
@@ -39,8 +39,8 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
         */
        private $rootTitle;
 
-       private $params, $contID, $redirID, $redirect;
-       private $bl_ns, $bl_from, $bl_table, $bl_code, $bl_title, $bl_fields, $hasNS;
+       private $params, $cont, $redirect;
+       private $bl_ns, $bl_from, $bl_from_ns, $bl_table, $bl_code, $bl_title, $bl_fields, $hasNS;
 
        /**
         * Maps ns and title to pageid
@@ -84,6 +84,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                parent::__construct( $query, $moduleName, $code );
                $this->bl_ns = $prefix . '_namespace';
                $this->bl_from = $prefix . '_from';
+               $this->bl_from_ns = $prefix . '_from_namespace';
                $this->bl_table = $settings['linktbl'];
                $this->bl_code = $code;
                $this->helpUrl = $settings['helpurl'];
@@ -119,12 +120,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
         * @param ApiPageSet $resultPageSet
         * @return void
         */
-       private function prepareFirstQuery( $resultPageSet = null ) {
-               /* SELECT page_id, page_title, page_namespace, page_is_redirect
-                * FROM pagelinks, page WHERE pl_from=page_id
-                * AND pl_title='Foo' AND pl_namespace=0
-                * LIMIT 11 ORDER BY pl_from
-                */
+       private function runFirstQuery( $resultPageSet = null ) {
                $this->addTables( array( $this->bl_table, 'page' ) );
                $this->addWhere( "{$this->bl_from}=page_id" );
                if ( is_null( $resultPageSet ) ) {
@@ -132,18 +128,25 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                } else {
                        $this->addFields( $resultPageSet->getPageTableFields() );
                }
+               $this->addFields( array( 'page_is_redirect', 'from_ns' => 'page_namespace' ) );
 
-               $this->addFields( 'page_is_redirect' );
                $this->addWhereFld( $this->bl_title, $this->rootTitle->getDBkey() );
-
                if ( $this->hasNS ) {
                        $this->addWhereFld( $this->bl_ns, $this->rootTitle->getNamespace() );
                }
-               $this->addWhereFld( 'page_namespace', $this->params['namespace'] );
+               $this->addWhereFld( $this->bl_from_ns, $this->params['namespace'] );
 
-               if ( !is_null( $this->contID ) ) {
+               if ( count( $this->cont ) >= 2 ) {
                        $op = $this->params['dir'] == 'descending' ? '<' : '>';
-                       $this->addWhere( "{$this->bl_from}$op={$this->contID}" );
+                       if ( count( $this->params['namespace'] ) > 1 ) {
+                               $this->addWhere(
+                                       "{$this->bl_from_ns} $op {$this->cont[0]} OR " .
+                                       "({$this->bl_from_ns} = {$this->cont[0]} AND " .
+                                       "{$this->bl_from} $op= {$this->cont[1]})"
+                               );
+                       } else {
+                               $this->addWhere( "{$this->bl_from} $op= {$this->cont[1]}" );
+                       }
                }
 
                if ( $this->params['filterredir'] == 'redirects' ) {
@@ -156,20 +159,56 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
 
                $this->addOption( 'LIMIT', $this->params['limit'] + 1 );
                $sort = ( $this->params['dir'] == 'descending' ? ' DESC' : '' );
-               $this->addOption( 'ORDER BY', $this->bl_from . $sort );
+               $orderBy = array();
+               if ( count( $this->params['namespace'] ) > 1 ) {
+                       $orderBy[] = $this->bl_from_ns . $sort;
+               }
+               $orderBy[] = $this->bl_from . $sort;
+               $this->addOption( 'ORDER BY', $orderBy );
                $this->addOption( 'STRAIGHT_JOIN' );
+
+               $res = $this->select( __METHOD__ );
+               $count = 0;
+               foreach ( $res as $row ) {
+                       if ( ++$count > $this->params['limit'] ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
+                               // Continue string may be overridden at a later step
+                               $this->continueStr = "{$row->from_ns}|{$row->page_id}";
+                               break;
+                       }
+
+                       // Fill in continuation fields for later steps
+                       if ( count( $this->cont ) < 2 ) {
+                               $this->cont[] = $row->from_ns;
+                               $this->cont[] = $row->page_id;
+                       }
+
+                       $this->pageMap[$row->page_namespace][$row->page_title] = $row->page_id;
+                       $t = Title::makeTitle( $row->page_namespace, $row->page_title );
+                       if ( $row->page_is_redirect ) {
+                               $this->redirTitles[] = $t;
+                       }
+
+                       if ( is_null( $resultPageSet ) ) {
+                               $a = array( 'pageid' => intval( $row->page_id ) );
+                               ApiQueryBase::addTitleInfo( $a, $t );
+                               if ( $row->page_is_redirect ) {
+                                       $a['redirect'] = '';
+                               }
+                               // Put all the results in an array first
+                               $this->resultArr[$a['pageid']] = $a;
+                       } else {
+                               $resultPageSet->processDbRow( $row );
+                       }
+               }
        }
 
        /**
         * @param ApiPageSet $resultPageSet
         * @return void
         */
-       private function prepareSecondQuery( $resultPageSet = null ) {
-               /* SELECT page_id, page_title, page_namespace, page_is_redirect, pl_title, pl_namespace
-                  FROM pagelinks, page WHERE pl_from=page_id
-                  AND (pl_title='Foo' AND pl_namespace=0) OR (pl_title='Bar' AND pl_namespace=1)
-                  ORDER BY pl_namespace, pl_title, pl_from LIMIT 11
-                */
+       private function runSecondQuery( $resultPageSet = null ) {
                $db = $this->getDB();
                $this->addTables( array( 'page', $this->bl_table ) );
                $this->addWhere( "{$this->bl_from}=page_id" );
@@ -180,7 +219,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        $this->addFields( $resultPageSet->getPageTableFields() );
                }
 
-               $this->addFields( $this->bl_title );
+               $this->addFields( array( $this->bl_title, 'from_ns' => 'page_namespace' ) );
                if ( $this->hasNS ) {
                        $this->addFields( $this->bl_ns );
                }
@@ -195,30 +234,33 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        $redirDBkey = $t->getDBkey();
                        $titleWhere[] = "{$this->bl_title} = " . $db->addQuotes( $redirDBkey ) .
                                ( $this->hasNS ? " AND {$this->bl_ns} = {$redirNs}" : '' );
-                       $allRedirNs[] = $redirNs;
-                       $allRedirDBkey[] = $redirDBkey;
+                       $allRedirNs[$redirNs] = true;
+                       $allRedirDBkey[$redirDBkey] = true;
                }
                $this->addWhere( $db->makeList( $titleWhere, LIST_OR ) );
                $this->addWhereFld( 'page_namespace', $this->params['namespace'] );
 
-               if ( !is_null( $this->redirID ) ) {
+               if ( count( $this->cont ) >= 6 ) {
                        $op = $this->params['dir'] == 'descending' ? '<' : '>';
-                       /** @var $first Title */
-                       $first = $this->redirTitles[0];
-                       $title = $db->addQuotes( $first->getDBkey() );
-                       $ns = $first->getNamespace();
-                       $from = $this->redirID;
-                       if ( $this->hasNS ) {
-                               $this->addWhere( "{$this->bl_ns} $op $ns OR " .
-                                       "({$this->bl_ns} = $ns AND " .
-                                       "({$this->bl_title} $op $title OR " .
-                                       "({$this->bl_title} = $title AND " .
-                                       "{$this->bl_from} $op= $from)))" );
-                       } else {
-                               $this->addWhere( "{$this->bl_title} $op $title OR " .
-                                       "({$this->bl_title} = $title AND " .
-                                       "{$this->bl_from} $op= $from)" );
+
+                       $where = "{$this->bl_from} $op= {$this->cont[5]}";
+                       // Don't bother with namespace, title, or from_namespace if it's
+                       // otherwise constant in the where clause.
+                       if ( count( $this->params['namespace'] ) > 1 ) {
+                               $where = "{$this->bl_from_ns} $op {$this->cont[4]} OR " .
+                                       "({$this->bl_from_ns} = {$this->cont[4]} AND ($where))";
                        }
+                       if ( count( $allRedirDBkey ) > 1 ) {
+                               $title = $db->addQuotes( $this->cont[3] );
+                               $where = "{$this->bl_title} $op $title OR " .
+                                       "({$this->bl_title} = $title AND ($where))";
+                       }
+                       if ( $this->hasNS && count( $allRedirNs ) > 1 ) {
+                               $where = "{$this->bl_ns} $op {$this->cont[2]} OR " .
+                                       "({$this->bl_ns} = {$this->cont[2]} AND ($where))";
+                       }
+
+                       $this->addWhere( $where );
                }
                if ( $this->params['filterredir'] == 'redirects' ) {
                        $this->addWhereFld( 'page_is_redirect', 1 );
@@ -229,16 +271,57 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                $this->addOption( 'LIMIT', $this->params['limit'] + 1 );
                $orderBy = array();
                $sort = ( $this->params['dir'] == 'descending' ? ' DESC' : '' );
-               // Don't order by namespace/title if it's constant in the WHERE clause
-               if ( $this->hasNS && count( array_unique( $allRedirNs ) ) != 1 ) {
+               // Don't order by namespace/title/from_namespace if it's constant in the WHERE clause
+               if ( $this->hasNS && count( $allRedirNs ) > 1 ) {
                        $orderBy[] = $this->bl_ns . $sort;
                }
-               if ( count( array_unique( $allRedirDBkey ) ) != 1 ) {
+               if ( count( $allRedirDBkey ) > 1 ) {
                        $orderBy[] = $this->bl_title . $sort;
                }
+               if ( count( $this->params['namespace'] ) > 1 ) {
+                       $orderBy[] = $this->bl_from_ns . $sort;
+               }
                $orderBy[] = $this->bl_from . $sort;
                $this->addOption( 'ORDER BY', $orderBy );
                $this->addOption( 'USE INDEX', array( 'page' => 'PRIMARY' ) );
+
+               $res = $this->select( __METHOD__ );
+               $count = 0;
+               foreach ( $res as $row ) {
+                       $ns = $this->hasNS ? $row->{$this->bl_ns} : NS_FILE;
+
+                       if ( ++$count > $this->params['limit'] ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
+                               // Note we must keep the parameters for the first query constant
+                               // This may be overridden at a later step
+                               $title = $row->{$this->bl_title};
+                               $this->continueStr = join( '|', array_slice( $this->cont, 0, 2 ) ) .
+                                       "|$ns|$title|{$row->from_ns}|{$row->page_id}";
+                               break;
+                       }
+
+                       // Fill in continuation fields for later steps
+                       if ( count( $this->cont ) < 6 ) {
+                               $this->cont[] = $ns;
+                               $this->cont[] = $row->{$this->bl_title};
+                               $this->cont[] = $row->from_ns;
+                               $this->cont[] = $row->page_id;
+                       }
+
+                       if ( is_null( $resultPageSet ) ) {
+                               $a['pageid'] = intval( $row->page_id );
+                               ApiQueryBase::addTitleInfo( $a, Title::makeTitle( $row->page_namespace, $row->page_title ) );
+                               if ( $row->page_is_redirect ) {
+                                       $a['redirect'] = '';
+                               }
+                               $parentID = $this->pageMap[$ns][$row->{$this->bl_title}];
+                               // Put all the results in an array first
+                               $this->resultArr[$parentID]['redirlinks'][$row->page_id] = $a;
+                       } else {
+                               $resultPageSet->processDbRow( $row );
+                       }
+               }
        }
 
        /**
@@ -261,96 +344,153 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        $this->validateLimit( 'limit', $this->params['limit'], 1, $userMax, $botMax );
                }
 
-               $this->processContinue();
-               $this->prepareFirstQuery( $resultPageSet );
+               $this->rootTitle = $this->getTitleOrPageId( $this->params )->getTitle();
 
-               $res = $this->select( __METHOD__ . '::firstQuery' );
+               // only image titles are allowed for the root in imageinfo mode
+               if ( !$this->hasNS && $this->rootTitle->getNamespace() !== NS_FILE ) {
+                       $this->dieUsage(
+                               "The title for {$this->getModuleName()} query must be a file",
+                               'bad_image_title'
+                       );
+               }
 
-               $count = 0;
+               // Parse and validate continuation parameter
+               $this->cont = array();
+               if ( $this->params['continue'] !== null ) {
+                       $db = $this->getDB();
+                       $cont = explode( '|', $this->params['continue'] );
 
-               foreach ( $res as $row ) {
-                       if ( ++$count > $this->params['limit'] ) {
-                               // We've reached the one extra which shows that there are
-                               // additional pages to be had. Stop here...
-                               // Continue string preserved in case the redirect query doesn't pass the limit
-                               $this->continueStr = $this->getContinueStr( $row->page_id );
-                               break;
-                       }
+                       switch ( count( $cont ) ) {
+                               case 8:
+                                       // redirect page ID for result adding
+                                       $this->cont[7] = (int)$cont[7];
+                                       $this->dieContinueUsageIf( $cont[7] !== (string)$this->cont[7] );
 
-                       if ( is_null( $resultPageSet ) ) {
-                               $this->extractRowInfo( $row );
-                       } else {
-                               $this->pageMap[$row->page_namespace][$row->page_title] = $row->page_id;
-                               if ( $row->page_is_redirect ) {
-                                       $this->redirTitles[] = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               }
+                                       /* Fall through */
 
-                               $resultPageSet->processDbRow( $row );
+                               case 7:
+                                       // top-level page ID for result adding
+                                       $this->cont[6] = (int)$cont[6];
+                                       $this->dieContinueUsageIf( $cont[6] !== (string)$this->cont[6] );
+
+                                       /* Fall through */
+
+                               case 6:
+                                       // ns for 2nd query (even for imageusage)
+                                       $this->cont[2] = (int)$cont[2];
+                                       $this->dieContinueUsageIf( $cont[2] !== (string)$this->cont[2] );
+
+                                       // title for 2nd query
+                                       $this->cont[3] = $cont[3];
+
+                                       // from_ns for 2nd query
+                                       $this->cont[4] = (int)$cont[4];
+                                       $this->dieContinueUsageIf( $cont[4] !== (string)$this->cont[4] );
+
+                                       // from_id for 1st query
+                                       $this->cont[5] = (int)$cont[5];
+                                       $this->dieContinueUsageIf( $cont[5] !== (string)$this->cont[5] );
+
+                                       /* Fall through */
+
+                               case 2:
+                                       // from_ns for 1st query
+                                       $this->cont[0] = (int)$cont[0];
+                                       $this->dieContinueUsageIf( $cont[0] !== (string)$this->cont[0] );
+
+                                       // from_id for 1st query
+                                       $this->cont[1] = (int)$cont[1];
+                                       $this->dieContinueUsageIf( $cont[1] !== (string)$this->cont[1] );
+
+                                       break;
+
+                               default:
+                                       $this->dieContinueUsageIf( true );
                        }
+
+                       ksort( $this->cont );
                }
 
+               $this->runFirstQuery( $resultPageSet );
                if ( $this->redirect && count( $this->redirTitles ) ) {
                        $this->resetQueryParams();
-                       $this->prepareSecondQuery( $resultPageSet );
-                       $res = $this->select( __METHOD__ . '::secondQuery' );
-                       $count = 0;
-                       foreach ( $res as $row ) {
-                               if ( ++$count > $this->params['limit'] ) {
-                                       // We've reached the one extra which shows that there are
-                                       // additional pages to be had. Stop here...
-                                       // We need to keep the parent page of this redir in
-                                       if ( $this->hasNS ) {
-                                               $parentID = $this->pageMap[$row->{$this->bl_ns}][$row->{$this->bl_title}];
-                                       } else {
-                                               $parentID = $this->pageMap[NS_FILE][$row->{$this->bl_title}];
-                                       }
-                                       $this->continueStr = $this->getContinueRedirStr( $parentID, $row->page_id );
-                                       break;
-                               }
-
-                               if ( is_null( $resultPageSet ) ) {
-                                       $this->extractRedirRowInfo( $row );
-                               } else {
-                                       $resultPageSet->processDbRow( $row );
-                               }
-                       }
+                       $this->runSecondQuery( $resultPageSet );
                }
+
+               // Fill in any missing fields in case it's needed below
+               $this->cont += array( 0, 0, 0, '', 0, 0, 0 );
+
                if ( is_null( $resultPageSet ) ) {
                        // Try to add the result data in one go and pray that it fits
-                       $fit = $result->addValue( 'query', $this->getModuleName(), array_values( $this->resultArr ) );
+                       $code = $this->bl_code;
+                       $data = array_map( function ( $arr ) use ( $result, $code ) {
+                               if ( isset( $arr['redirlinks'] ) ) {
+                                       $arr['redirlinks'] = array_values( $arr['redirlinks'] );
+                                       $result->setIndexedTagName( $arr['redirlinks'], $code );
+                               }
+                               return $arr;
+                       }, array_values( $this->resultArr ) );
+                       $fit = $result->addValue( 'query', $this->getModuleName(), $data );
                        if ( !$fit ) {
                                // It didn't fit. Add elements one by one until the
                                // result is full.
+                               ksort( $this->resultArr );
+                               if ( count( $this->cont ) >= 7 ) {
+                                       $startAt = $this->cont[6];
+                               } else {
+                                       reset( $this->resultArr );
+                                       $startAt = key( $this->resultArr );
+                               }
+                               $idx = 0;
                                foreach ( $this->resultArr as $pageID => $arr ) {
+                                       if ( $pageID < $startAt ) {
+                                               continue;
+                                       }
+
                                        // Add the basic entry without redirlinks first
                                        $fit = $result->addValue(
                                                array( 'query', $this->getModuleName() ),
-                                               null, array_diff_key( $arr, array( 'redirlinks' => '' ) ) );
+                                               $idx, array_diff_key( $arr, array( 'redirlinks' => '' ) ) );
                                        if ( !$fit ) {
-                                               $this->continueStr = $this->getContinueStr( $pageID );
+                                               $this->continueStr = join( '|', array_slice( $this->cont, 0, 6 ) ) .
+                                                       "|$pageID";
                                                break;
                                        }
 
                                        $hasRedirs = false;
-                                       $redirLinks = isset( $arr['redirlinks'] ) ? $arr['redirlinks'] : array();
-                                       foreach ( (array)$redirLinks as $key => $redir ) {
+                                       $redirLinks = isset( $arr['redirlinks'] ) ? (array)$arr['redirlinks'] : array();
+                                       ksort( $redirLinks );
+                                       if ( count( $this->cont ) >= 8 && $pageID == $startAt ) {
+                                               $redirStartAt = $this->cont[7];
+                                       } else {
+                                               reset( $redirLinks );
+                                               $redirStartAt = key( $redirLinks );
+                                       }
+                                       foreach ( $redirLinks as $key => $redir ) {
+                                               if ( $key < $redirStartAt ) {
+                                                       continue;
+                                               }
+
                                                $fit = $result->addValue(
-                                                       array( 'query', $this->getModuleName(), $pageID, 'redirlinks' ),
-                                                       $key, $redir );
+                                                       array( 'query', $this->getModuleName(), $idx, 'redirlinks' ),
+                                                       null, $redir );
                                                if ( !$fit ) {
-                                                       $this->continueStr = $this->getContinueRedirStr( $pageID, $redir['pageid'] );
+                                                       $this->continueStr = join( '|', array_slice( $this->cont, 0, 6 ) ) .
+                                                               "|$pageID|$key";
                                                        break;
                                                }
                                                $hasRedirs = true;
                                        }
                                        if ( $hasRedirs ) {
                                                $result->setIndexedTagName_internal(
-                                                       array( 'query', $this->getModuleName(), $pageID, 'redirlinks' ),
+                                                       array( 'query', $this->getModuleName(), $idx, 'redirlinks' ),
                                                        $this->bl_code );
                                        }
                                        if ( !$fit ) {
                                                break;
                                        }
+
+                                       $idx++;
                                }
                        }
 
@@ -364,91 +504,6 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                }
        }
 
-       private function extractRowInfo( $row ) {
-               $this->pageMap[$row->page_namespace][$row->page_title] = $row->page_id;
-               $t = Title::makeTitle( $row->page_namespace, $row->page_title );
-               $a = array( 'pageid' => intval( $row->page_id ) );
-               ApiQueryBase::addTitleInfo( $a, $t );
-               if ( $row->page_is_redirect ) {
-                       $a['redirect'] = '';
-                       $this->redirTitles[] = $t;
-               }
-               // Put all the results in an array first
-               $this->resultArr[$a['pageid']] = $a;
-       }
-
-       private function extractRedirRowInfo( $row ) {
-               $a['pageid'] = intval( $row->page_id );
-               ApiQueryBase::addTitleInfo( $a, Title::makeTitle( $row->page_namespace, $row->page_title ) );
-               if ( $row->page_is_redirect ) {
-                       $a['redirect'] = '';
-               }
-               $ns = $this->hasNS ? $row->{$this->bl_ns} : NS_FILE;
-               $parentID = $this->pageMap[$ns][$row->{$this->bl_title}];
-               // Put all the results in an array first
-               $this->resultArr[$parentID]['redirlinks'][] = $a;
-               $this->getResult()->setIndexedTagName(
-                       $this->resultArr[$parentID]['redirlinks'],
-                       $this->bl_code
-               );
-       }
-
-       protected function processContinue() {
-               if ( !is_null( $this->params['continue'] ) ) {
-                       $this->parseContinueParam();
-               } else {
-                       $this->rootTitle = $this->getTitleOrPageId( $this->params )->getTitle();
-               }
-
-               // only image titles are allowed for the root in imageinfo mode
-               if ( !$this->hasNS && $this->rootTitle->getNamespace() !== NS_FILE ) {
-                       $this->dieUsage(
-                               "The title for {$this->getModuleName()} query must be an image",
-                               'bad_image_title'
-                       );
-               }
-       }
-
-       protected function parseContinueParam() {
-               $continueList = explode( '|', $this->params['continue'] );
-               // expected format:
-               // ns | key | id1 [| id2]
-               // ns+key: root title
-               // id1: first-level page ID to continue from
-               // id2: second-level page ID to continue from
-
-               // null stuff out now so we know what's set and what isn't
-               $this->rootTitle = $this->contID = $this->redirID = null;
-               $rootNs = intval( $continueList[0] );
-               $this->dieContinueUsageIf( $rootNs === 0 && $continueList[0] !== '0' );
-
-               $this->rootTitle = Title::makeTitleSafe( $rootNs, $continueList[1] );
-               $this->dieContinueUsageIf( !$this->rootTitle );
-
-               $contID = intval( $continueList[2] );
-               $this->dieContinueUsageIf( $contID === 0 && $continueList[2] !== '0' );
-
-               $this->contID = $contID;
-               $id2 = isset( $continueList[3] ) ? $continueList[3] : null;
-               $redirID = intval( $id2 );
-
-               if ( $redirID === 0 && $id2 !== '0' ) {
-                       // This one isn't required
-                       return;
-               }
-               $this->redirID = $redirID;
-       }
-
-       protected function getContinueStr( $lastPageID ) {
-               return $this->rootTitle->getNamespace() .
-               '|' . $this->rootTitle->getDBkey() .
-               '|' . $lastPageID;
-       }
-
-       protected function getContinueRedirStr( $lastPageID, $lastRedirID ) {
-               return $this->getContinueStr( $lastPageID ) . '|' . $lastRedirID;
-       }
-
        public function getAllowedParams() {
                $retval = array(
                        'title' => array(
diff --git a/includes/api/ApiQueryBacklinksprop.php b/includes/api/ApiQueryBacklinksprop.php
new file mode 100644 (file)
index 0000000..2458a26
--- /dev/null
@@ -0,0 +1,472 @@
+<?php
+/**
+ * API module to handle links table back-queries
+ *
+ * Created on Aug 19, 2014
+ *
+ * Copyright © 2014 Brad Jorsch <bjorsch@wikimedia.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.24
+ */
+
+/**
+ * This implements prop=redirects, prop=linkshere, prop=catmembers,
+ * prop=transcludedin, and prop=fileusage
+ *
+ * @ingroup API
+ * @since 1.24
+ */
+class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
+
+       // Data for the various modules implemented by this class
+       private static $settings = array(
+               'redirects' => array(
+                       'code' => 'rd',
+                       'prefix' => 'rd',
+                       'linktable' => 'redirect',
+                       'what' => 'redirects to',
+                       'description' => 'Returns all redirects to the given pages.',
+                       'props' => array(
+                               'fragment' => 'Fragment of each redirect, if any',
+                       ),
+                       'showredirects' => false,
+                       'show' => array(
+                               'fragment' => 'Only show redirects with a fragment',
+                               '!fragment' => 'Only show redirects without a fragment',
+                       ),
+               ),
+               'linkshere' => array(
+                       'code' => 'lh',
+                       'prefix' => 'pl',
+                       'linktable' => 'pagelinks',
+                       'from_namespace' => true,
+                       'what' => 'pages linking to',
+                       'description' => 'Find all pages that link to the given pages.',
+                       'showredirects' => true,
+               ),
+               'transcludedin' => array(
+                       'code' => 'ti',
+                       'prefix' => 'tl',
+                       'linktable' => 'templatelinks',
+                       'from_namespace' => true,
+                       'what' => 'pages transcluding',
+                       'description' => 'Find all pages that transclude the given pages.',
+                       'showredirects' => true,
+               ),
+               'fileusage' => array(
+                       'code' => 'fu',
+                       'prefix' => 'il',
+                       'linktable' => 'imagelinks',
+                       'from_namespace' => true,
+                       'to_namespace' => NS_FILE,
+                       'what' => 'pages using',
+                       'exampletitle' => 'File:Example.jpg',
+                       'description' => 'Find all pages that use the given files.',
+                       'showredirects' => true,
+               ),
+       );
+
+       public function __construct( ApiQuery $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, self::$settings[$moduleName]['code'] );
+       }
+
+       public function execute() {
+               $this->run();
+       }
+
+       public function executeGenerator( $resultPageSet ) {
+               $this->run( $resultPageSet );
+       }
+
+       /**
+        * @param ApiPageSet $resultPageSet
+        */
+       private function run( ApiPageSet $resultPageSet = null ) {
+               $settings = self::$settings[$this->getModuleName()];
+
+               $db = $this->getDB();
+               $params = $this->extractRequestParams();
+               $prop = array_flip( $params['prop'] );
+               $emptyString = $db->addQuotes( '' );
+
+               $pageSet = $this->getPageSet();
+               $titles = $pageSet->getGoodAndMissingTitles();
+               $map = $pageSet->getGoodAndMissingTitlesByNamespace();
+
+               // Determine our fields to query on
+               $p = $settings['prefix'];
+               $hasNS = !isset( $settings['to_namespace'] );
+               if ( $hasNS ) {
+                       $bl_namespace = "{$p}_namespace";
+                       $bl_title = "{$p}_title";
+               } else {
+                       $bl_namespace = $settings['to_namespace'];
+                       $bl_title = "{$p}_to";
+
+                       $titles = array_filter( $titles, function ( $t ) use ( $bl_namespace ) {
+                               return $t->getNamespace() === $bl_namespace;
+                       } );
+                       $map = array_intersect_key( $map, array( $bl_namespace => true ) );
+               }
+               $bl_from = "{$p}_from";
+
+               if ( !$titles ) {
+                       return; // nothing to do
+               }
+
+               // Figure out what we're sorting by, and add associated WHERE clauses.
+               // MySQL's query planner screws up if we include a field in ORDER BY
+               // when it's constant in WHERE, so we have to test that for each field.
+               $sortby = array();
+               if ( $hasNS && count( $map ) > 1 ) {
+                       $sortby[$bl_namespace] = 'ns';
+               }
+               $theTitle = null;
+               foreach ( $map as $nsTitles ) {
+                       reset( $nsTitles );
+                       $key = key( $nsTitles );
+                       if ( $theTitle === null ) {
+                               $theTitle = $key;
+                       }
+                       if ( count( $nsTitles ) > 1 || $key !== $theTitle ) {
+                               $sortby[$bl_title] = 'title';
+                               break;
+                       }
+               }
+               $miser_ns = null;
+               if ( $params['namespace'] !== null ) {
+                       if ( empty( $settings['from_namespace'] ) && $this->getConfig()->get( 'MiserMode' ) ) {
+                               $miser_ns = $params['namespace'];
+                       } else {
+                               $this->addWhereFld( "{$p}_from_namespace", $params['namespace'] );
+                               if ( !empty( $settings['from_namespace'] ) && count( $params['namespace'] ) > 1 ) {
+                                       $sortby["{$p}_from_namespace"] = 'int';
+                               }
+                       }
+               }
+               $sortby[$bl_from] = 'int';
+
+               // Now use the $sortby to figure out the continuation
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != count( $sortby ) );
+                       $where = '';
+                       $i = count( $sortby ) - 1;
+                       $cont_ns = 0;
+                       $cont_title = '';
+                       foreach ( array_reverse( $sortby, true ) as $field => $type ) {
+                               $v = $cont[$i];
+                               switch ( $type ) {
+                                       case 'ns':
+                                               $cont_ns = (int)$v;
+                                               /* fall through */
+                                       case 'int':
+                                               $v = (int)$v;
+                                               $this->dieContinueUsageIf( $v != $cont[$i] );
+                                               break;
+
+                                       case 'title':
+                                               $cont_title = $v;
+                                               /* fall through */
+                                       default:
+                                               $v = $db->addQuotes( $v );
+                                               break;
+                               }
+
+                               if ( $where === '' ) {
+                                       $where = "$field >= $v";
+                               } else {
+                                       $where = "$field > $v OR ($field = $v AND ($where))";
+                               }
+
+                               $i--;
+                       }
+                       $this->addWhere( $where );
+               }
+
+               // Populate the rest of the query
+               $this->addTables( array( $settings['linktable'], 'page' ) );
+               $this->addWhere( "$bl_from = page_id" );
+
+               if ( $this->getModuleName() === 'redirects' ) {
+                       $this->addWhere( "rd_interwiki = $emptyString OR rd_interwiki IS NULL" );
+               }
+
+               $this->addFields( array_keys( $sortby ) );
+               $this->addFields( array( 'bl_namespace' => $bl_namespace, 'bl_title' => $bl_title ) );
+               if ( is_null( $resultPageSet ) ) {
+                       $fld_pageid = isset( $prop['pageid'] );
+                       $fld_title = isset( $prop['title'] );
+                       $fld_redirect = isset( $prop['redirect'] );
+
+                       $this->addFieldsIf( 'page_id', $fld_pageid );
+                       $this->addFieldsIf( array( 'page_title', 'page_namespace' ), $fld_title );
+                       $this->addFieldsIf( 'page_is_redirect', $fld_redirect );
+
+                       // prop=redirects
+                       $fld_fragment = isset( $prop['fragment'] );
+                       $this->addFieldsIf( 'rd_fragment', $fld_fragment );
+               } else {
+                       $this->addFields( $resultPageSet->getPageTableFields() );
+               }
+
+               $this->addFieldsIf( 'page_namespace', $miser_ns !== null );
+
+               if ( $hasNS ) {
+                       $lb = new LinkBatch( $titles );
+                       $this->addWhere( $lb->constructSet( $p, $db ) );
+               } else {
+                       $where = array();
+                       foreach ( $titles as $t ) {
+                               if ( $t->getNamespace() == $bl_namespace ) {
+                                       $where[] = "$bl_title = " . $db->addQuotes( $t->getDBkey() );
+                               }
+                       }
+                       $this->addWhere( $db->makeList( $where, LIST_OR ) );
+               }
+
+               if ( $params['show'] !== null ) {
+                       // prop=redirects only
+                       $show = array_flip( $params['show'] );
+                       if ( isset( $show['fragment'] ) && isset( $show['!fragment'] ) ||
+                               isset( $show['redirect'] ) && isset( $show['!redirect'] )
+                       ) {
+                               $this->dieUsageMsg( 'show' );
+                       }
+                       $this->addWhereIf( "rd_fragment != $emptyString", isset( $show['fragment'] ) );
+                       $this->addWhereIf(
+                               "rd_fragment = $emptyString OR rd_fragment IS NULL",
+                               isset( $show['!fragment'] )
+                       );
+                       $this->addWhereIf( array( 'page_is_redirect' => 1 ), isset( $show['redirect'] ) );
+                       $this->addWhereIf( array( 'page_is_redirect' => 0 ), isset( $show['!redirect'] ) );
+               }
+
+               // Override any ORDER BY from above with what we calculated earlier.
+               $this->addOption( 'ORDER BY', array_keys( $sortby ) );
+
+               $this->addOption( 'LIMIT', $params['limit'] + 1 );
+
+               $res = $this->select( __METHOD__ );
+
+               if ( is_null( $resultPageSet ) ) {
+                       $count = 0;
+                       foreach ( $res as $row ) {
+                               if ( ++$count > $params['limit'] ) {
+                                       // We've reached the one extra which shows that
+                                       // there are additional pages to be had. Stop here...
+                                       $this->setContinue( $row, $sortby );
+                                       break;
+                               }
+
+                               if ( $miser_ns !== null && !in_array( $row->page_namespace, $miser_ns ) ) {
+                                       // Miser mode namespace check
+                                       continue;
+                               }
+
+                               // Get the ID of the current page
+                               $id = $map[$row->bl_namespace][$row->bl_title];
+
+                               $vals = array();
+                               if ( $fld_pageid ) {
+                                       $vals['pageid'] = $row->page_id;
+                               }
+                               if ( $fld_title ) {
+                                       ApiQueryBase::addTitleInfo( $vals,
+                                               Title::makeTitle( $row->page_namespace, $row->page_title )
+                                       );
+                               }
+                               if ( $fld_fragment && $row->rd_fragment !== null && $row->rd_fragment !== '' ) {
+                                       $vals['fragment'] = $row->rd_fragment;
+                               }
+                               if ( $fld_redirect && $row->page_is_redirect ) {
+                                       $vals['redirect'] = '';
+                               }
+                               $fit = $this->addPageSubItem( $id, $vals );
+                               if ( !$fit ) {
+                                       $this->setContinue( $row, $sortby );
+                                       break;
+                               }
+                       }
+               } else {
+                       $titles = array();
+                       $count = 0;
+                       foreach ( $res as $row ) {
+                               if ( ++$count > $params['limit'] ) {
+                                       // We've reached the one extra which shows that
+                                       // there are additional pages to be had. Stop here...
+                                       $this->setContinue( $row, $sortby );
+                                       break;
+                               }
+                               $titles[] = Title::makeTitle( $row->page_namespace, $row->page_title );
+                       }
+                       $resultPageSet->populateFromTitles( $titles );
+               }
+       }
+
+       private function setContinue( $row, $sortby ) {
+               $cont = array();
+               foreach ( $sortby as $field => $v ) {
+                       $cont[] = $row->$field;
+               }
+               $this->setContinueEnumParameter( 'continue', join( '|', $cont ) );
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       public function getAllowedParams() {
+               $settings = self::$settings[$this->getModuleName()];
+
+               $ret = array(
+                       'prop' => array(
+                               ApiBase::PARAM_TYPE => array(
+                                       'pageid',
+                                       'title',
+                               ),
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_DFLT => 'pageid|title',
+                       ),
+                       'namespace' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => 'namespace',
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'continue' => null,
+               );
+
+               if ( !empty( $settings['showredirects'] ) ) {
+                       $ret['prop'][ApiBase::PARAM_TYPE][] = 'redirect';
+                       $ret['prop'][ApiBase::PARAM_DFLT] .= '|redirect';
+               }
+               if ( isset( $settings['props'] ) ) {
+                       $ret['prop'][ApiBase::PARAM_TYPE] = array_merge(
+                               $ret['prop'][ApiBase::PARAM_TYPE], array_keys( $settings['props'] )
+                       );
+               }
+
+               $show = array();
+               if ( !empty( $settings['showredirects'] ) ) {
+                       $show[] = 'redirect';
+                       $show[] = '!redirect';
+               }
+               if ( isset( $settings['show'] ) ) {
+                       $show = array_merge( $show, array_keys( $settings['show'] ) );
+               }
+               if ( $show ) {
+                       $ret['show'] = array(
+                               ApiBase::PARAM_TYPE => $show,
+                               ApiBase::PARAM_ISMULTI => true,
+                       );
+               }
+
+               return $ret;
+       }
+
+       public function getParamDescription() {
+               $settings = self::$settings[$this->getModuleName()];
+               $p = $this->getModulePrefix();
+
+               $ret = array(
+                       'prop' => array(
+                               'Which properties to get:',
+                       ),
+                       'show' => array(
+                               'Show only items that meet this criteria.',
+                       ),
+                       'namespace' => 'Only include pages in these namespaces',
+                       'limit' => 'How many to return',
+                       'continue' => 'When more results are available, use this to continue',
+               );
+
+               if ( empty( $settings['from_namespace'] ) && $this->getConfig()->get( 'MiserMode' ) ) {
+                       $ret['namespace'] = array(
+                               $ret['namespace'],
+                               "NOTE: Due to \$wgMiserMode, using this may result in fewer than \"{$p}limit\" results",
+                               'returned before continuing; in extreme cases, zero results may be returned.',
+                       );
+                       if ( isset( $ret['type'] ) ) {
+                               $ret['namespace'][] = "Note that you can use {$p}type=subcat or {$p}type=file " .
+                                       "instead of {$p}namespace=14 or 6.";
+                       }
+               }
+
+               $props = array(
+                       'pageid' => 'Adds the ID of page',
+                       'title' => 'Adds the title and namespace ID of the page',
+               );
+               if ( !empty( $settings['showredirects'] ) ) {
+                       $props['redirect'] = 'Indicate if the page is a redirect';
+               }
+               if ( isset( $settings['props'] ) ) {
+                       $props += $settings['props'];
+               }
+               foreach ( $props as $k => $v ) {
+                       $ret['props'][] = sprintf( "%-9s - %s", $k, $v );
+               }
+
+               $show = array();
+               if ( !empty( $settings['showredirects'] ) ) {
+                       $show += array(
+                               'redirect' => 'Only show redirects',
+                               '!redirect' => 'Only show non-redirects',
+                       );
+               }
+               if ( isset( $settings['show'] ) ) {
+                       $show += $settings['show'];
+               }
+               foreach ( $show as $k => $v ) {
+                       $ret['show'][] = sprintf( "%-9s - %s", $k, $v );
+               }
+
+               return $ret;
+       }
+
+       public function getDescription() {
+               return self::$settings[$this->getModuleName()]['description'];
+       }
+
+       public function getExamples() {
+               $settings = self::$settings[$this->getModuleName()];
+               $name = $this->getModuleName();
+               $what = $settings['what'];
+               $title = isset( $settings['exampletitle'] ) ? $settings['exampletitle'] : 'Main Page';
+               $etitle = rawurlencode( $title );
+
+               return array(
+                       "api.php?action=query&prop={$name}&titles={$etitle}"
+                               => "Get a list of $what [[$title]]",
+                       "api.php?action=query&generator={$name}&titles={$etitle}&prop=info"
+                               => "Get information about $what [[$title]]",
+               );
+       }
+
+       public function getHelpUrls() {
+               $name = $this->getModuleName();
+               $prefix = $this->getModulePrefix();
+               return "https://www.mediawiki.org/wiki/API:Properties#{$name}_.2F_{$prefix}";
+       }
+}
index 6680316..b1581f3 100644 (file)
@@ -47,6 +47,11 @@ abstract class ApiQueryBase extends ApiBase {
                $this->resetQueryParams();
        }
 
+       /************************************************************************//**
+        * @name   Methods to implement
+        * @{
+        */
+
        /**
         * Get the cache mode for the data generated by this module. Override
         * this in the module subclass. For possible return values and other
@@ -62,6 +67,75 @@ abstract class ApiQueryBase extends ApiBase {
                return 'private';
        }
 
+       /**
+        * Override this method to request extra fields from the pageSet
+        * using $pageSet->requestField('fieldName')
+        * @param ApiPageSet $pageSet
+        */
+       public function requestExtraData( $pageSet ) {
+       }
+
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Data access
+        * @{
+        */
+
+       /**
+        * Get the main Query module
+        * @return ApiQuery
+        */
+       public function getQuery() {
+               return $this->mQueryModule;
+       }
+
+       /**
+        * @see ApiBase::getParent()
+        */
+       public function getParent() {
+               return $this->getQuery();
+       }
+
+       /**
+        * Get the Query database connection (read-only)
+        * @return DatabaseBase
+        */
+       protected function getDB() {
+               if ( is_null( $this->mDb ) ) {
+                       $this->mDb = $this->getQuery()->getDB();
+               }
+
+               return $this->mDb;
+       }
+
+       /**
+        * Selects the query database connection with the given name.
+        * See ApiQuery::getNamedDB() for more information
+        * @param string $name Name to assign to the database connection
+        * @param int $db One of the DB_* constants
+        * @param array $groups Query groups
+        * @return DatabaseBase
+        */
+       public function selectNamedDB( $name, $db, $groups ) {
+               $this->mDb = $this->getQuery()->getNamedDB( $name, $db, $groups );
+       }
+
+       /**
+        * Get the PageSet object to work on
+        * @return ApiPageSet
+        */
+       protected function getPageSet() {
+               return $this->getQuery()->getPageSet();
+       }
+
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Querying
+        * @{
+        */
+
        /**
         * Blank the internal arrays with query parameters
         */
@@ -305,29 +379,64 @@ abstract class ApiQueryBase extends ApiBase {
        }
 
        /**
-        * Estimate the row count for the SELECT query that would be run if we
-        * called select() right now, and check if it's acceptable.
-        * @return bool True if acceptable, false otherwise
+        * @param string $query
+        * @param string $protocol
+        * @return null|string
         */
-       protected function checkRowCount() {
-               $db = $this->getDB();
-               $this->profileDBIn();
-               $rowcount = $db->estimateRowCount(
-                       $this->tables,
-                       $this->fields,
-                       $this->where,
-                       __METHOD__,
-                       $this->options
-               );
-               $this->profileDBOut();
+       public function prepareUrlQuerySearchString( $query = null, $protocol = null ) {
+               $db = $this->getDb();
+               if ( !is_null( $query ) || $query != '' ) {
+                       if ( is_null( $protocol ) ) {
+                               $protocol = 'http://';
+                       }
 
-               if ( $rowcount > $this->getConfig()->get( 'APIMaxDBRows' ) ) {
-                       return false;
+                       $likeQuery = LinkFilter::makeLikeArray( $query, $protocol );
+                       if ( !$likeQuery ) {
+                               $this->dieUsage( 'Invalid query', 'bad_query' );
+                       }
+
+                       $likeQuery = LinkFilter::keepOneWildcard( $likeQuery );
+
+                       return 'el_index ' . $db->buildLike( $likeQuery );
+               } elseif ( !is_null( $protocol ) ) {
+                       return 'el_index ' . $db->buildLike( "$protocol", $db->anyString() );
                }
 
-               return true;
+               return null;
        }
 
+       /**
+        * Filters hidden users (where the user doesn't have the right to view them)
+        * Also adds relevant block information
+        *
+        * @param bool $showBlockInfo
+        * @return void
+        */
+       public function showHiddenUsersAddBlockInfo( $showBlockInfo ) {
+               $this->addTables( 'ipblocks' );
+               $this->addJoinConds( array(
+                       'ipblocks' => array( 'LEFT JOIN', 'ipb_user=user_id' ),
+               ) );
+
+               $this->addFields( 'ipb_deleted' );
+
+               if ( $showBlockInfo ) {
+                       $this->addFields( array( 'ipb_id', 'ipb_by', 'ipb_by_text', 'ipb_reason', 'ipb_expiry', 'ipb_timestamp' ) );
+               }
+
+               // Don't show hidden names
+               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+                       $this->addWhere( 'ipb_deleted = 0 OR ipb_deleted IS NULL' );
+               }
+       }
+
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Utility methods
+        * @{
+        */
+
        /**
         * Add information (title and namespace) about a Title object to a
         * result array
@@ -340,22 +449,6 @@ abstract class ApiQueryBase extends ApiBase {
                $arr[$prefix . 'title'] = $title->getPrefixedText();
        }
 
-       /**
-        * Override this method to request extra fields from the pageSet
-        * using $pageSet->requestField('fieldName')
-        * @param ApiPageSet $pageSet
-        */
-       public function requestExtraData( $pageSet ) {
-       }
-
-       /**
-        * Get the main Query module
-        * @return ApiQuery
-        */
-       public function getQuery() {
-               return $this->mQueryModule;
-       }
-
        /**
         * Add a sub-element under the page element with the given page ID
         * @param int $pageId Page ID
@@ -405,89 +498,21 @@ abstract class ApiQueryBase extends ApiBase {
        }
 
        /**
-        * Get the Query database connection (read-only)
-        * @return DatabaseBase
-        */
-       protected function getDB() {
-               if ( is_null( $this->mDb ) ) {
-                       $this->mDb = $this->getQuery()->getDB();
-               }
-
-               return $this->mDb;
-       }
-
-       /**
-        * Selects the query database connection with the given name.
-        * See ApiQuery::getNamedDB() for more information
-        * @param string $name Name to assign to the database connection
-        * @param int $db One of the DB_* constants
-        * @param array $groups Query groups
-        * @return DatabaseBase
-        */
-       public function selectNamedDB( $name, $db, $groups ) {
-               $this->mDb = $this->getQuery()->getNamedDB( $name, $db, $groups );
-       }
-
-       /**
-        * Get the PageSet object to work on
-        * @return ApiPageSet
-        */
-       protected function getPageSet() {
-               return $this->getQuery()->getPageSet();
-       }
-
-       /**
-        * Convert a title to a DB key
-        * @param string $title Page title with spaces
-        * @return string Page title with underscores
-        */
-       public function titleToKey( $title ) {
-               // Don't throw an error if we got an empty string
-               if ( trim( $title ) == '' ) {
-                       return '';
-               }
-               $t = Title::newFromText( $title );
-               if ( !$t ) {
-                       $this->dieUsageMsg( array( 'invalidtitle', $title ) );
-               }
-
-               return $t->getPrefixedDBkey();
-       }
-
-       /**
-        * The inverse of titleToKey()
-        * @param string $key Page title with underscores
-        * @return string Page title with spaces
-        */
-       public function keyToTitle( $key ) {
-               // Don't throw an error if we got an empty string
-               if ( trim( $key ) == '' ) {
-                       return '';
-               }
-               $t = Title::newFromDBkey( $key );
-               // This really shouldn't happen but we gotta check anyway
-               if ( !$t ) {
-                       $this->dieUsageMsg( array( 'invalidtitle', $key ) );
-               }
-
-               return $t->getPrefixedText();
-       }
-
-       /**
-        * An alternative to titleToKey() that doesn't trim trailing spaces, and
-        * does not mangle the input if starts with something that looks like a
-        * namespace. It is advisable to pass the namespace parameter in order to
-        * handle per-namespace capitalization settings.
-        * @param string $titlePart Title part with spaces
-        * @param int $defaultNamespace Namespace to assume
-        * @return string Title part with underscores
+        * Convert an input title or title prefix into a dbkey.
+        *
+        * $namespace should always be specified in order to handle per-namespace
+        * capitalization settings.
+        *
+        * @param string $titlePart Title part
+        * @param int $defaultNamespace Namespace of the title
+        * @return string DBkey (no namespace prefix)
         */
-       public function titlePartToKey( $titlePart, $defaultNamespace = NS_MAIN ) {
-               $t = Title::makeTitleSafe( $defaultNamespace, $titlePart . 'x' );
+       public function titlePartToKey( $titlePart, $namespace = NS_MAIN ) {
+               $t = Title::makeTitleSafe( $namespace, $titlePart . 'x' );
                if ( !$t ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $titlePart ) );
                }
-               if ( $defaultNamespace != $t->getNamespace() || $t->isExternal() ) {
+               if ( $namespace != $t->getNamespace() || $t->isExternal() ) {
                        // This can happen in two cases. First, if you call titlePartToKey with a title part
                        // that looks like a namespace, but with $defaultNamespace = NS_MAIN. It would be very
                        // difficult to handle such a case. Such cases cannot exist and are therefore treated
@@ -499,15 +524,6 @@ abstract class ApiQueryBase extends ApiBase {
                return substr( $t->getDbKey(), 0, -1 );
        }
 
-       /**
-        * An alternative to keyToTitle() that doesn't trim trailing spaces
-        * @param string $keyPart Key part with spaces
-        * @return string Key part with underscores
-        */
-       public function keyPartToTitle( $keyPart ) {
-               return substr( $this->keyToTitle( $keyPart . 'x' ), 0, -1 );
-       }
-
        /**
         * Gets the personalised direction parameter description
         *
@@ -523,58 +539,6 @@ abstract class ApiQueryBase extends ApiBase {
                );
        }
 
-       /**
-        * @param string $query
-        * @param string $protocol
-        * @return null|string
-        */
-       public function prepareUrlQuerySearchString( $query = null, $protocol = null ) {
-               $db = $this->getDb();
-               if ( !is_null( $query ) || $query != '' ) {
-                       if ( is_null( $protocol ) ) {
-                               $protocol = 'http://';
-                       }
-
-                       $likeQuery = LinkFilter::makeLikeArray( $query, $protocol );
-                       if ( !$likeQuery ) {
-                               $this->dieUsage( 'Invalid query', 'bad_query' );
-                       }
-
-                       $likeQuery = LinkFilter::keepOneWildcard( $likeQuery );
-
-                       return 'el_index ' . $db->buildLike( $likeQuery );
-               } elseif ( !is_null( $protocol ) ) {
-                       return 'el_index ' . $db->buildLike( "$protocol", $db->anyString() );
-               }
-
-               return null;
-       }
-
-       /**
-        * Filters hidden users (where the user doesn't have the right to view them)
-        * Also adds relevant block information
-        *
-        * @param bool $showBlockInfo
-        * @return void
-        */
-       public function showHiddenUsersAddBlockInfo( $showBlockInfo ) {
-               $this->addTables( 'ipblocks' );
-               $this->addJoinConds( array(
-                       'ipblocks' => array( 'LEFT JOIN', 'ipb_user=user_id' ),
-               ) );
-
-               $this->addFields( 'ipb_deleted' );
-
-               if ( $showBlockInfo ) {
-                       $this->addFields( array( 'ipb_id', 'ipb_by', 'ipb_by_text', 'ipb_reason', 'ipb_expiry' ) );
-               }
-
-               // Don't show hidden names
-               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
-                       $this->addWhere( 'ipb_deleted = 0 OR ipb_deleted IS NULL' );
-               }
-       }
-
        /**
         * @param string $hash
         * @return bool
@@ -604,6 +568,94 @@ abstract class ApiQueryBase extends ApiBase {
                        'viewsuppressed'
                );
        }
+
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Deprecated
+        * @{
+        */
+
+       /**
+        * Estimate the row count for the SELECT query that would be run if we
+        * called select() right now, and check if it's acceptable.
+        * @deprecated since 1.24
+        * @return bool True if acceptable, false otherwise
+        */
+       protected function checkRowCount() {
+               wfDeprecated( __METHOD__, '1.24' );
+               $db = $this->getDB();
+               $this->profileDBIn();
+               $rowcount = $db->estimateRowCount(
+                       $this->tables,
+                       $this->fields,
+                       $this->where,
+                       __METHOD__,
+                       $this->options
+               );
+               $this->profileDBOut();
+
+               if ( $rowcount > $this->getConfig()->get( 'APIMaxDBRows' ) ) {
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * Convert a title to a DB key
+        * @deprecated since 1.24, past uses of this were always incorrect and should
+        *   have used self::titlePartToKey() instead
+        * @param string $title Page title with spaces
+        * @return string Page title with underscores
+        */
+       public function titleToKey( $title ) {
+               wfDeprecated( __METHOD__, '1.24' );
+               // Don't throw an error if we got an empty string
+               if ( trim( $title ) == '' ) {
+                       return '';
+               }
+               $t = Title::newFromText( $title );
+               if ( !$t ) {
+                       $this->dieUsageMsg( array( 'invalidtitle', $title ) );
+               }
+
+               return $t->getPrefixedDBkey();
+       }
+
+       /**
+        * The inverse of titleToKey()
+        * @deprecated since 1.24, unused and probably never needed
+        * @param string $key Page title with underscores
+        * @return string Page title with spaces
+        */
+       public function keyToTitle( $key ) {
+               wfDeprecated( __METHOD__, '1.24' );
+               // Don't throw an error if we got an empty string
+               if ( trim( $key ) == '' ) {
+                       return '';
+               }
+               $t = Title::newFromDBkey( $key );
+               // This really shouldn't happen but we gotta check anyway
+               if ( !$t ) {
+                       $this->dieUsageMsg( array( 'invalidtitle', $key ) );
+               }
+
+               return $t->getPrefixedText();
+       }
+
+       /**
+        * Inverse of titlePartToKey()
+        * @deprecated since 1.24, unused and probably never needed
+        * @param string $keyPart DBkey, with prefix
+        * @return string Key part with underscores
+        */
+       public function keyPartToTitle( $keyPart ) {
+               wfDeprecated( __METHOD__, '1.24' );
+               return substr( $this->keyToTitle( $keyPart . 'x' ), 0, -1 );
+       }
+
+       /**@}*/
 }
 
 /**
@@ -641,7 +693,7 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
        }
 
        /**
-        * Overrides base class to prepend 'g' to every generator parameter
+        * Overrides ApiBase to prepend 'g' to every generator parameter
         * @param string $paramName Parameter name
         * @return string Prefixed parameter name
         */
@@ -666,6 +718,17 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
                }
        }
 
+       /**
+        * @see ApiBase::getHelpFlags()
+        *
+        * Corresponding messages: api-help-flag-generator
+        */
+       protected function getHelpFlags() {
+               $flags = parent::getHelpFlags();
+               $flags[] = 'generator';
+               return $flags;
+       }
+
        /**
         * Execute this module as a generator
         * @param ApiPageSet $resultPageSet All output should be appended to this object
index 6e9f33c..3dd4c65 100644 (file)
@@ -38,14 +38,13 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
 
        public function execute() {
                $params = $this->extractRequestParams();
-               $alltitles = $this->getPageSet()->getAllTitlesByNamespace();
+               $alltitles = $this->getPageSet()->getGoodAndMissingTitlesByNamespace();
                if ( empty( $alltitles[NS_CATEGORY] ) ) {
                        return;
                }
                $categories = $alltitles[NS_CATEGORY];
 
-               $titles = $this->getPageSet()->getGoodTitles() +
-                       $this->getPageSet()->getMissingTitles();
+               $titles = $this->getPageSet()->getGoodAndMissingTitles();
                $cattitles = array();
                foreach ( $categories as $c ) {
                        /** @var $t Title */
index 17badb1..a88a9cb 100644 (file)
@@ -140,12 +140,22 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                $this->addWhereRange( 'cl_sortkey', $dir, null, null );
                                $this->addWhereRange( 'cl_from', $dir, null, null );
                        } else {
-                               $startsortkey = $params['startsortkeyprefix'] !== null ?
-                                       Collation::singleton()->getSortkey( $params['startsortkeyprefix'] ) :
-                                       $params['startsortkey'];
-                               $endsortkey = $params['endsortkeyprefix'] !== null ?
-                                       Collation::singleton()->getSortkey( $params['endsortkeyprefix'] ) :
-                                       $params['endsortkey'];
+                               if ( $params['startsortkeyprefix'] !== null ) {
+                                       $startsortkey = Collation::singleton()->getSortkey( $params['startsortkeyprefix'] );
+                               } elseif ( $params['starthexsortkey'] !== null ) {
+                                       $startsortkey = pack( 'H*', $params['starthexsortkey'] );
+                               } else {
+                                       $this->logFeatureUsage( 'list=categorymembers&cmstartsortkey' );
+                                       $startsortkey = $params['startsortkey'];
+                               }
+                               if ( $params['endsortkeyprefix'] !== null ) {
+                                       $endsortkey = Collation::singleton()->getSortkey( $params['endsortkeyprefix'] );
+                               } elseif ( $params['endhexsortkey'] !== null ) {
+                                       $endsortkey = pack( 'H*', $params['endhexsortkey'] );
+                               } else {
+                                       $this->logFeatureUsage( 'list=categorymembers&cmendsortkey' );
+                                       $endsortkey = $params['endsortkey'];
+                               }
 
                                // The below produces ORDER BY cl_sortkey, cl_from, possibly with DESC added to each of them
                                $this->addWhereRange( 'cl_sortkey',
@@ -330,10 +340,16 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                        'end' => array(
                                ApiBase::PARAM_TYPE => 'timestamp'
                        ),
-                       'startsortkey' => null,
-                       'endsortkey' => null,
+                       'starthexsortkey' => null,
+                       'endhexsortkey' => null,
                        'startsortkeyprefix' => null,
                        'endsortkeyprefix' => null,
+                       'startsortkey' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
+                       'endsortkey' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
                );
        }
 
@@ -359,15 +375,17 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                        'dir' => 'In which direction to sort',
                        'start' => "Timestamp to start listing from. Can only be used with {$p}sort=timestamp",
                        'end' => "Timestamp to end listing at. Can only be used with {$p}sort=timestamp",
-                       'startsortkey' => "Sortkey to start listing from. Must be given in " .
-                               "binary format. Can only be used with {$p}sort=sortkey",
-                       'endsortkey' => "Sortkey to end listing at. Must be given in binary " .
-                               "format. Can only be used with {$p}sort=sortkey",
+                       'starthexsortkey' => "Sortkey to start listing from, as returned by prop=sortkey. " .
+                               "Can only be used with {$p}sort=sortkey",
+                       'endhexsortkey' => "Sortkey to end listing from, as returned by prop=sortkey. " .
+                               "Can only be used with {$p}sort=sortkey",
                        'startsortkeyprefix' => "Sortkey prefix to start listing from. Can " .
-                               "only be used with {$p}sort=sortkey. Overrides {$p}startsortkey",
+                               "only be used with {$p}sort=sortkey. Overrides {$p}starthexsortkey",
                        'endsortkeyprefix' => "Sortkey prefix to end listing BEFORE (not at, " .
                                "if this value occurs it will not be included!). Can only be used with " .
-                               "{$p}sort=sortkey. Overrides {$p}endsortkey",
+                               "{$p}sort=sortkey. Overrides {$p}endhexsortkey",
+                       'startsortkey' => "Use starthexsortkey instead",
+                       'endsortkey' => "Use endhexsortkey instead",
                        'continue' => 'For large categories, give the value returned from previous query',
                        'limit' => 'The maximum number of pages to return.',
                );
index 6b1185b..9042696 100644 (file)
@@ -61,6 +61,13 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                $fld_token = isset( $prop['token'] );
                $fld_tags = isset( $prop['tags'] );
 
+               if ( isset( $prop['token'] ) ) {
+                       $p = $this->getModulePrefix();
+                       $this->setWarning(
+                               "{$p}prop=token has been deprecated. Please use action=query&meta=tokens instead."
+                       );
+               }
+
                // If we're in JSON callback mode, no tokens can be obtained
                if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) ) {
                        $fld_token = false;
@@ -493,7 +500,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                ' len            - Adds the length (bytes) of the revision',
                                ' sha1           - Adds the SHA-1 (base 16) of the revision',
                                ' content        - Adds the content of the revision',
-                               ' token          - Gives the edit token',
+                               ' token          - DEPRECATED! Gives the edit token',
                                ' tags           - Tags for the revision',
                        ),
                        'namespace' => 'Only list pages in this namespace (3)',
index 6d836cd..2212957 100644 (file)
@@ -52,7 +52,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
         */
        private function run( $resultPageSet = null ) {
                $params = $this->extractRequestParams();
-               $namespaces = $this->getPageSet()->getAllTitlesByNamespace();
+               $namespaces = $this->getPageSet()->getGoodAndMissingTitlesByNamespace();
                if ( empty( $namespaces[NS_FILE] ) ) {
                        return;
                }
index bb388cd..a185ee2 100644 (file)
@@ -42,11 +42,19 @@ class ApiQueryIWLinks extends ApiQueryBase {
                }
 
                $params = $this->extractRequestParams();
+               $prop = array_flip( (array)$params['prop'] );
 
                if ( isset( $params['title'] ) && !isset( $params['prefix'] ) ) {
                        $this->dieUsageMsg( array( 'missingparam', 'prefix' ) );
                }
 
+               // Handle deprecated param
+               $this->requireMaxOneParameter( $params, 'url', 'prop' );
+               if ( $params['url'] ) {
+                       $this->logFeatureUsage( 'prop=iwlinks&iwurl' );
+                       $prop = array( 'url' => 1 );
+               }
+
                $this->addFields( array(
                        'iwl_from',
                        'iwl_prefix',
@@ -114,7 +122,7 @@ class ApiQueryIWLinks extends ApiQueryBase {
                        }
                        $entry = array( 'prefix' => $row->iwl_prefix );
 
-                       if ( $params['url'] ) {
+                       if ( isset( $prop['url'] ) ) {
                                $title = Title::newFromText( "{$row->iwl_prefix}:{$row->iwl_title}" );
                                if ( $title ) {
                                        $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
@@ -139,7 +147,16 @@ class ApiQueryIWLinks extends ApiQueryBase {
 
        public function getAllowedParams() {
                return array(
-                       'url' => false,
+                       'url' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
+                       'prop' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => array(
+                                       'url',
+                               )
+                       ),
                        'limit' => array(
                                ApiBase::PARAM_DFLT => 10,
                                ApiBase::PARAM_TYPE => 'limit',
@@ -162,7 +179,11 @@ class ApiQueryIWLinks extends ApiQueryBase {
 
        public function getParamDescription() {
                return array(
-                       'url' => 'Whether to get the full URL',
+                       'prop' => array(
+                               'Which additional properties to get for each interlanguage link',
+                               ' url      - Adds the full URL',
+                       ),
+                       'url' => "Whether to get the full URL (Cannot be used with {$this->getModulePrefix()}prop)",
                        'limit' => 'How many interwiki links to return',
                        'continue' => 'When more results are available, use this to continue',
                        'prefix' => 'Prefix for the interwiki',
index 5cc1454..ad5cdbd 100644 (file)
@@ -58,7 +58,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        'revdelUser' => $this->getUser(),
                );
 
-               $pageIds = $this->getPageSet()->getAllTitlesByNamespace();
+               $pageIds = $this->getPageSet()->getGoodAndMissingTitlesByNamespace();
                if ( !empty( $pageIds[NS_FILE] ) ) {
                        $titles = array_keys( $pageIds[NS_FILE] );
                        asort( $titles ); // Ensure the order is always the same
@@ -237,9 +237,11 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        $scale = array();
                        $scale['height'] = $params['urlheight'];
                } else {
-                       $scale = null;
                        if ( $params['urlparam'] ) {
-                               $this->dieUsage( "{$p}urlparam requires {$p}urlwidth", "urlparam_no_width" );
+                               // Audio files might not have a width/height.
+                               $scale = array();
+                       } else {
+                               $scale = null;
                        }
                }
 
@@ -256,6 +258,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @return array Array of parameters for transform.
         */
        protected function mergeThumbParams( $image, $thumbParams, $otherParams ) {
+               if ( $thumbParams === null ) {
+                       // No scaling requested
+                       return null;
+               }
                if ( !isset( $thumbParams['width'] ) && isset( $thumbParams['height'] ) ) {
                        // We want to limit only by height in this situation, so pass the
                        // image's full width as the limiting width. But some file types
@@ -269,6 +275,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                }
 
                if ( !$otherParams ) {
+                       $this->checkParameterNormalise( $image, $thumbParams );
                        return $thumbParams;
                }
                $p = $this->getModulePrefix();
@@ -289,11 +296,11 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        // handlers.
                        $this->setWarning( "Could not parse {$p}urlparam for " . $image->getName()
                                . '. Using only width and height' );
-
+                       $this->checkParameterNormalise( $image, $thumbParams );
                        return $thumbParams;
                }
 
-               if ( isset( $paramList['width'] ) ) {
+               if ( isset( $paramList['width'] ) && isset( $thumbParams['width'] ) ) {
                        if ( intval( $paramList['width'] ) != intval( $thumbParams['width'] ) ) {
                                $this->setWarning( "Ignoring width value set in {$p}urlparam ({$paramList['width']}) "
                                        . "in favor of width value derived from {$p}urlwidth/{$p}urlheight "
@@ -307,7 +314,33 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        }
                }
 
-               return $thumbParams + $paramList;
+               $finalParams = $thumbParams + $paramList;
+               $this->checkParameterNormalise( $image, $finalParams );
+               return $finalParams;
+       }
+
+       /**
+        * Verify that the final image parameters can be normalised.
+        *
+        * This doesn't use the normalised parameters, since $file->transform
+        * expects the pre-normalised parameters, but doing the normalisation
+        * allows us to catch certain error conditions early (such as missing
+        * required parameter).
+        *
+        * @param $image File
+        * @param $finalParams array List of parameters to transform image with
+        */
+       protected function checkParameterNormalise( $image, $finalParams ) {
+               $h = $image->getHandler();
+               if ( !$h ) {
+                       return;
+               }
+               // Note: normaliseParams modifies the array in place, but we aren't interested
+               // 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" );
+               }
        }
 
        /**
@@ -391,6 +424,13 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        if ( $pageCount !== false ) {
                                $vals['pagecount'] = $pageCount;
                        }
+
+                       // length as in how many seconds long a video is.
+                       $length = $file->getLength();
+                       if ( $length ) {
+                               // Call it duration, because "length" can be ambiguous.
+                               $vals['duration'] = (float)$length;
+                       }
                }
 
                $pcomment = isset( $prop['parsedcomment'] );
@@ -666,8 +706,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        'parsedcomment' =>  ' parsedcomment - Parse the comment on the version',
                        'canonicaltitle' => ' canonicaltitle - Adds the canonical title of the image file',
                        'url' =>            ' url           - Gives URL to the image and the description page',
-                       'size' =>           ' size          - Adds the size of the image in bytes ' .
-                               'and the height, width and page count (if applicable)',
+                       'size' =>           ' size          - Adds the size of the image in bytes, ' .
+                               'its height and its width. Page count and duration are added if applicable',
                        'dimensions' =>     ' dimensions    - Alias for size', // B/C with Allimages
                        'sha1' =>           ' sha1          - Adds SHA-1 hash for the image',
                        'mime' =>           ' mime          - Adds MIME type of the image',
@@ -716,8 +756,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                        'no more than ' . self::TRANSFORM_LIMIT . ' scaled images will be returned.'
                        ),
                        'urlheight' => "Similar to {$p}urlwidth.",
-                       'urlparam' => array( "A handler specific parameter string. For example, pdf's ",
-                               "might use 'page15-100px'. {$p}urlwidth must be used and be consistent with {$p}urlparam" ),
+                       'urlparam' => array(
+                               "A handler specific parameter string. For example, pdf's ",
+                               "might use 'page15-100px'."
+                       ),
                        'limit' => 'How many image revisions to return per image',
                        'start' => 'Timestamp to start listing from',
                        'end' => 'Timestamp to stop listing at',
index be1de93..d7037e3 100644 (file)
@@ -79,6 +79,7 @@ class ApiQueryInfo extends ApiQueryBase {
         * Get an array mapping token names to their handler functions.
         * The prototype for a token function is func($pageid, $title)
         * it should return a token or false (permission denied)
+        * @deprecated since 1.24
         * @return array Array(tokenname => function)
         */
        protected function getTokenFunctions() {
@@ -110,10 +111,16 @@ class ApiQueryInfo extends ApiQueryBase {
 
        static protected $cachedTokens = array();
 
+       /**
+        * @deprecated since 1.24
+        */
        public static function resetTokenCache() {
                ApiQueryInfo::$cachedTokens = array();
        }
 
+       /**
+        * @deprecated since 1.24
+        */
        public static function getEditToken( $pageid, $title ) {
                // We could check for $title->userCan('edit') here,
                // but that's too expensive for this purpose
@@ -131,6 +138,9 @@ class ApiQueryInfo extends ApiQueryBase {
                return ApiQueryInfo::$cachedTokens['edit'];
        }
 
+       /**
+        * @deprecated since 1.24
+        */
        public static function getDeleteToken( $pageid, $title ) {
                global $wgUser;
                if ( !$wgUser->isAllowed( 'delete' ) ) {
@@ -145,6 +155,9 @@ class ApiQueryInfo extends ApiQueryBase {
                return ApiQueryInfo::$cachedTokens['delete'];
        }
 
+       /**
+        * @deprecated since 1.24
+        */
        public static function getProtectToken( $pageid, $title ) {
                global $wgUser;
                if ( !$wgUser->isAllowed( 'protect' ) ) {
@@ -159,6 +172,9 @@ class ApiQueryInfo extends ApiQueryBase {
                return ApiQueryInfo::$cachedTokens['protect'];
        }
 
+       /**
+        * @deprecated since 1.24
+        */
        public static function getMoveToken( $pageid, $title ) {
                global $wgUser;
                if ( !$wgUser->isAllowed( 'move' ) ) {
@@ -173,6 +189,9 @@ class ApiQueryInfo extends ApiQueryBase {
                return ApiQueryInfo::$cachedTokens['move'];
        }
 
+       /**
+        * @deprecated since 1.24
+        */
        public static function getBlockToken( $pageid, $title ) {
                global $wgUser;
                if ( !$wgUser->isAllowed( 'block' ) ) {
@@ -187,11 +206,17 @@ class ApiQueryInfo extends ApiQueryBase {
                return ApiQueryInfo::$cachedTokens['block'];
        }
 
+       /**
+        * @deprecated since 1.24
+        */
        public static function getUnblockToken( $pageid, $title ) {
                // Currently, this is exactly the same as the block token
                return self::getBlockToken( $pageid, $title );
        }
 
+       /**
+        * @deprecated since 1.24
+        */
        public static function getEmailToken( $pageid, $title ) {
                global $wgUser;
                if ( !$wgUser->canSendEmail() || $wgUser->isBlockedFromEmailUser() ) {
@@ -206,6 +231,9 @@ class ApiQueryInfo extends ApiQueryBase {
                return ApiQueryInfo::$cachedTokens['email'];
        }
 
+       /**
+        * @deprecated since 1.24
+        */
        public static function getImportToken( $pageid, $title ) {
                global $wgUser;
                if ( !$wgUser->isAllowedAny( 'import', 'importupload' ) ) {
@@ -220,6 +248,9 @@ class ApiQueryInfo extends ApiQueryBase {
                return ApiQueryInfo::$cachedTokens['import'];
        }
 
+       /**
+        * @deprecated since 1.24
+        */
        public static function getWatchToken( $pageid, $title ) {
                global $wgUser;
                if ( !$wgUser->isLoggedIn() ) {
@@ -234,6 +265,9 @@ class ApiQueryInfo extends ApiQueryBase {
                return ApiQueryInfo::$cachedTokens['watch'];
        }
 
+       /**
+        * @deprecated since 1.24
+        */
        public static function getOptionsToken( $pageid, $title ) {
                global $wgUser;
                if ( !$wgUser->isLoggedIn() ) {
@@ -424,6 +458,7 @@ class ApiQueryInfo extends ApiQueryBase {
                if ( $this->fld_url ) {
                        $pageInfo['fullurl'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
                        $pageInfo['editurl'] = wfExpandUrl( $title->getFullURL( 'action=edit' ), PROTO_CURRENT );
+                       $pageInfo['canonicalurl'] = wfExpandUrl( $title->getFullURL(), PROTO_CANONICAL );
                }
                if ( $this->fld_readable && $title->userCan( 'read', $this->getUser() ) ) {
                        $pageInfo['readable'] = '';
@@ -784,6 +819,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                        // need to be added to getCacheMode()
                                ) ),
                        'token' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() )
@@ -802,7 +838,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                ' watchers              - The number of watchers, if allowed',
                                ' notificationtimestamp - The watchlist notification timestamp of each page',
                                ' subjectid             - The page ID of the parent page for each talk page',
-                               ' url                   - Gives a full URL to the page, and also an edit URL',
+                               ' url                   - Gives a full URL, an edit URL, and the canonical URL for each page',
                                ' readable              - Whether the user can read this page',
                                ' preload               - Gives the text returned by EditFormPreloadText',
                                ' displaytitle          - Gives the way the page title is actually displayed',
index 8ce6b55..6f0c5d3 100644 (file)
@@ -47,6 +47,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
         * Get an array mapping token names to their handler functions.
         * The prototype for a token function is func($pageid, $title, $rc)
         * it should return a token or false (permission denied)
+        * @deprecated since 1.24
         * @return array Array(tokenname => function)
         */
        protected function getTokenFunctions() {
@@ -69,6 +70,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        }
 
        /**
+        * @deprecated since 1.24
         * @param int $pageid
         * @param Title $title
         * @param RecentChange|null $rc
@@ -657,6 +659,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                )
                        ),
                        'token' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
                                ApiBase::PARAM_ISMULTI => true
                        ),
diff --git a/includes/api/ApiQueryRedirects.php b/includes/api/ApiQueryRedirects.php
deleted file mode 100644 (file)
index afb2c56..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-<?php
-/**
- * API module to return redirects to a page
- *
- * Created on Dec 30, 2013
- *
- * Copyright © 2013 Brad Jorsch <bjorsch@wikimedia.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.23
- */
-
-/**
- * This query lists redirects to the given pages.
- *
- * @ingroup API
- */
-class ApiQueryRedirects extends ApiQueryGeneratorBase {
-
-       public function __construct( ApiQuery $query, $moduleName ) {
-               parent::__construct( $query, $moduleName, 'rd' );
-       }
-
-       public function execute() {
-               $this->run();
-       }
-
-       public function executeGenerator( $resultPageSet ) {
-               $this->run( $resultPageSet );
-       }
-
-       /**
-        * @param ApiPageSet $resultPageSet
-        */
-       private function run( ApiPageSet $resultPageSet = null ) {
-               $db = $this->getDB();
-               $params = $this->extractRequestParams();
-               $emptyString = $db->addQuotes( '' );
-
-               $pageSet = $this->getPageSet();
-               $titles = $pageSet->getGoodTitles() + $pageSet->getMissingTitles();
-
-               if ( !is_null( $params['continue'] ) ) {
-                       $cont = explode( '|', $params['continue'] );
-                       $this->dieContinueUsageIf( count( $cont ) != 3 );
-                       $rd_namespace = (int)$cont[0];
-                       $this->dieContinueUsageIf( $rd_namespace != $cont[0] );
-                       $rd_title = $db->addQuotes( $cont[1] );
-                       $rd_from = (int)$cont[2];
-                       $this->dieContinueUsageIf( $rd_from != $cont[2] );
-                       $this->addWhere(
-                               "rd_namespace > $rd_namespace OR " .
-                               "(rd_namespace = $rd_namespace AND " .
-                               "(rd_title > $rd_title OR " .
-                               "(rd_title = $rd_title AND " .
-                               "rd_from >= $rd_from)))"
-                       );
-
-                       // Remove titles that we're past already
-                       $titles = array_filter( $titles, function ( $t ) use ( $rd_namespace, $rd_title ) {
-                               $ns = $t->getNamespace();
-                               return ( $ns > $rd_namespace ||
-                                       $ns == $rd_namespace && $t->getDBKey() >= $rd_title
-                               );
-                       } );
-               }
-
-               if ( !$titles ) {
-                       return; // nothing to do
-               }
-
-               $this->addTables( array( 'redirect', 'page' ) );
-               $this->addFields( array(
-                       'rd_from',
-                       'rd_namespace',
-                       'rd_title',
-               ) );
-
-               if ( is_null( $resultPageSet ) ) {
-                       $prop = array_flip( $params['prop'] );
-                       $fld_pageid = isset( $prop['pageid'] );
-                       $fld_title = isset( $prop['title'] );
-                       $fld_fragment = isset( $prop['fragment'] );
-
-                       $this->addFieldsIf( 'rd_fragment', $fld_fragment );
-                       $this->addFieldsIf( array( 'page_namespace', 'page_title' ), $fld_title );
-               } else {
-                       $this->addFields( array( 'page_namespace', 'page_title' ) );
-               }
-
-               $lb = new LinkBatch( $titles );
-               $this->addWhere( array(
-                       'rd_from = page_id',
-                       "rd_interwiki = $emptyString OR rd_interwiki IS NULL",
-                       $lb->constructSet( 'rd', $db ),
-               ) );
-
-               if ( $params['show'] !== null ) {
-                       $show = array_flip( $params['show'] );
-                       if ( isset( $show['fragment'] ) && isset( $show['!fragment'] ) ) {
-                               $this->dieUsageMsg( 'show' );
-                       }
-                       $this->addWhereIf( "rd_fragment != $emptyString", isset( $show['fragment'] ) );
-                       $this->addWhereIf(
-                               "rd_fragment = $emptyString OR rd_fragment IS NULL",
-                               isset( $show['!fragment'] )
-                       );
-               }
-
-               $map = $pageSet->getAllTitlesByNamespace();
-
-               // Why, MySQL? Why do you do this to us?
-               $sortby = array();
-               if ( count( $map ) > 1 ) {
-                       $sortby[] = 'rd_namespace';
-               }
-               $theTitle = null;
-               foreach ( $map as $nsTitles ) {
-                       reset( $nsTitles );
-                       $key = key( $nsTitles );
-                       if ( $theTitle === null ) {
-                               $theTitle = $key;
-                       }
-                       if ( count( $nsTitles ) > 1 || $key !== $theTitle ) {
-                               $sortby[] = 'rd_title';
-                               break;
-                       }
-               }
-               $sortby[] = 'rd_from';
-               $this->addOption( 'ORDER BY', $sortby );
-
-               $this->addOption( 'LIMIT', $params['limit'] + 1 );
-
-               $res = $this->select( __METHOD__ );
-
-               if ( is_null( $resultPageSet ) ) {
-                       $count = 0;
-                       foreach ( $res as $row ) {
-                               if ( ++$count > $params['limit'] ) {
-                                       // We've reached the one extra which shows that
-                                       // there are additional pages to be had. Stop here...
-                                       $this->setContinueEnumParameter( 'continue',
-                                               "$row->rd_namespace|$row->rd_title|$row->rd_from"
-                                       );
-                                       break;
-                               }
-
-                               # Get the ID of the current page
-                               $id = $map[$row->rd_namespace][$row->rd_title];
-
-                               $vals = array();
-                               if ( $fld_pageid ) {
-                                       $vals['pageid'] = $row->rd_from;
-                               }
-                               if ( $fld_title ) {
-                                       ApiQueryBase::addTitleInfo( $vals,
-                                               Title::makeTitle( $row->page_namespace, $row->page_title )
-                                       );
-                               }
-                               if ( $fld_fragment && $row->rd_fragment !== null && $row->rd_fragment !== '' ) {
-                                       $vals['fragment'] = $row->rd_fragment;
-                               }
-                               $fit = $this->addPageSubItem( $id, $vals );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'continue',
-                                               "$row->rd_namespace|$row->rd_title|$row->rd_from"
-                                       );
-                                       break;
-                               }
-                       }
-               } else {
-                       $titles = array();
-                       $count = 0;
-                       foreach ( $res as $row ) {
-                               if ( ++$count > $params['limit'] ) {
-                                       // We've reached the one extra which shows that
-                                       // there are additional pages to be had. Stop here...
-                                       $this->setContinueEnumParameter( 'continue',
-                                               "$row->rd_namespace|$row->rd_title|$row->rd_from"
-                                       );
-                                       break;
-                               }
-                               $titles[] = Title::makeTitle( $row->page_namespace, $row->page_title );
-                       }
-                       $resultPageSet->populateFromTitles( $titles );
-               }
-       }
-
-       public function getCacheMode( $params ) {
-               return 'public';
-       }
-
-       public function getAllowedParams() {
-               return array(
-                       'prop' => array(
-                               ApiBase::PARAM_TYPE => array(
-                                       'pageid',
-                                       'title',
-                                       'fragment',
-                               ),
-                               ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_DFLT => 'pageid|title',
-                       ),
-                       'show' => array(
-                               ApiBase::PARAM_TYPE => array(
-                                       'fragment', '!fragment',
-                               ),
-                               ApiBase::PARAM_ISMULTI => true,
-                       ),
-                       'limit' => array(
-                               ApiBase::PARAM_DFLT => 10,
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
-                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
-                       ),
-                       'continue' => null,
-               );
-       }
-
-       public function getParamDescription() {
-               return array(
-                       'prop' => array(
-                               'Which properties to get:',
-                               ' pageid   - Page id of each redirect',
-                               ' title    - Title of each redirect',
-                               ' fragment - Fragment of each redirect, if any',
-                       ),
-                       'show' => array(
-                               'Show only items that meet this criteria.',
-                               ' fragment  - Only show redirects with a fragment',
-                               ' !fragment - Only show redirects without a fragment',
-                       ),
-                       'limit' => 'How many redirects to return',
-                       'continue' => 'When more results are available, use this to continue',
-               );
-       }
-
-       public function getDescription() {
-               return 'Returns all redirects to the given page(s).';
-       }
-
-       public function getExamples() {
-               return array(
-                       'api.php?action=query&prop=redirects&titles=Main%20Page'
-                               => 'Get a list of redirects to the [[Main Page]]',
-                       'api.php?action=query&generator=redirects&titles=Main%20Page&prop=info'
-                               => 'Get information about all redirects to the [[Main Page]]',
-               );
-       }
-
-       public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Properties#redirects_.2F_rd';
-       }
-}
index 627de55..da4ec19 100644 (file)
@@ -48,6 +48,7 @@ class ApiQueryRevisions extends ApiQueryBase {
 
        private $tokenFunctions;
 
+       /** @deprecated since 1.24 */
        protected function getTokenFunctions() {
                // tokenname => function
                // function prototype is func($pageid, $title, $rev)
@@ -72,6 +73,7 @@ class ApiQueryRevisions extends ApiQueryBase {
        }
 
        /**
+        * @deprecated since 1.24
         * @param int $pageid
         * @param Title $title
         * @param Revision $rev
@@ -748,6 +750,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                        'parse' => false,
                        'section' => null,
                        'token' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
                                ApiBase::PARAM_ISMULTI => true
                        ),
index be6bc68..bcf5d91 100644 (file)
@@ -67,6 +67,16 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                $searchInfo = array_flip( $params['info'] );
                $prop = array_flip( $params['prop'] );
 
+               // Deprecated parameters
+               if ( isset( $prop['hasrelated'] ) ) {
+                       $this->logFeatureUsage( 'action=search&srprop=hasrelated' );
+                       $this->setWarning( 'srprop=hasrelated has been deprecated' );
+               }
+               if ( isset( $prop['score'] ) ) {
+                       $this->logFeatureUsage( 'action=search&srprop=score' );
+                       $this->setWarning( 'srprop=score has been deprecated' );
+               }
+
                // Create search engine instance and set options
                $search = isset( $params['backend'] ) && $params['backend'] != self::BACKEND_NULL_PARAM ?
                        SearchEngine::create( $params['backend'] ) : SearchEngine::create();
@@ -158,14 +168,14 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                        $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $result->getTimestamp() );
                                }
                                if ( isset( $prop['titlesnippet'] ) ) {
-                                       $vals['titlesnippet'] = $result->getTitleSnippet( $terms );
+                                       $vals['titlesnippet'] = $result->getTitleSnippet();
                                }
                                if ( !is_null( $result->getRedirectTitle() ) ) {
                                        if ( isset( $prop['redirecttitle'] ) ) {
                                                $vals['redirecttitle'] = $result->getRedirectTitle();
                                        }
                                        if ( isset( $prop['redirectsnippet'] ) ) {
-                                               $vals['redirectsnippet'] = $result->getRedirectSnippet( $terms );
+                                               $vals['redirectsnippet'] = $result->getRedirectSnippet();
                                        }
                                }
                                if ( !is_null( $result->getSectionTitle() ) ) {
@@ -176,9 +186,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                                $vals['sectionsnippet'] = $result->getSectionSnippet();
                                        }
                                }
-                               if ( isset( $prop['hasrelated'] ) && $result->hasRelated() ) {
-                                       $vals['hasrelated'] = '';
-                               }
 
                                // Add item to results and see whether it fits
                                $fit = $apiResult->addValue( array( 'query', $this->getModuleName() ),
@@ -332,14 +339,14 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                ' size             - Adds the size of the page in bytes',
                                ' wordcount        - Adds the word count of the page',
                                ' timestamp        - Adds the timestamp of when the page was last edited',
-                               ' score            - Adds the score (if any) from the search engine',
+                               ' score            - DEPRECATED and IGNORED',
                                ' snippet          - Adds a parsed snippet of the page',
                                ' titlesnippet     - Adds a parsed snippet of the page title',
                                ' redirectsnippet  - Adds a parsed snippet of the redirect title',
                                ' redirecttitle    - Adds the title of the matching redirect',
                                ' sectionsnippet   - Adds a parsed snippet of the matching section title',
                                ' sectiontitle     - Adds the title of the matching section',
-                               ' hasrelated       - Indicates whether a related search is available',
+                               ' hasrelated       - DEPRECATED and IGNORED',
                        ),
                        'offset' => 'Use this value to continue paging (return by query)',
                        'limit' => 'How many total pages to return',
index 90683a9..311438f 100644 (file)
@@ -138,6 +138,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                $data['phpversion'] = PHP_VERSION;
                $data['phpsapi'] = PHP_SAPI;
+               if ( defined( 'HHVM_VERSION' ) ) {
+                       $data['hhvmversion'] = HHVM_VERSION;
+               }
                $data['dbtype'] = $config->get( 'DBtype' );
                $data['dbversion'] = $this->getDB()->getServerVersion();
 
@@ -341,7 +344,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                global $wgContLang;
                $data = array();
                $aliases = $wgContLang->getSpecialPageAliases();
-               foreach ( SpecialPageFactory::getList() as $specialpage => $stuff ) {
+               foreach ( SpecialPageFactory::getNames() as $specialpage ) {
                        if ( isset( $aliases[$specialpage] ) ) {
                                $arr = array( 'realname' => $specialpage, 'aliases' => $aliases[$specialpage] );
                                $this->getResult()->setIndexedTagName( $arr['aliases'], 'alias' );
@@ -393,10 +396,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $prefix = $row['iw_prefix'];
                        $val = array();
                        $val['prefix'] = $prefix;
-                       if ( $row['iw_local'] == '1' ) {
+                       if ( isset( $row['iw_local'] ) && $row['iw_local'] == '1' ) {
                                $val['local'] = '';
                        }
-                       if ( $row['iw_trans'] == '1' ) {
+                       if ( isset( $row['iw_trans'] ) && $row['iw_trans'] == '1' ) {
                                $val['trans'] = '';
                        }
 
@@ -498,6 +501,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                $data = array();
                $result = $this->getResult();
+               $allGroups = User::getAllGroups();
                foreach ( $config->get( 'GroupPermissions' ) as $group => $permissions ) {
                        $arr = array(
                                'name' => $group,
@@ -524,8 +528,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                        foreach ( $groupArr as $type => $rights ) {
                                if ( isset( $rights[$group] ) ) {
-                                       $arr[$type] = $rights[$group];
-                                       $result->setIndexedTagName( $arr[$type], 'group' );
+                                       $groups = array_intersect( $rights[$group], $allGroups );
+                                       if ( $groups ) {
+                                               $arr[$type] = $groups;
+                                               $result->setIndexedTagName( $arr[$type], 'group' );
+                                       }
                                }
                        }
 
@@ -689,6 +696,16 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $allowed = Skin::getAllowedSkins();
                $default = Skin::normalizeKey( 'default' );
                foreach ( Skin::getSkinNames() as $name => $displayName ) {
+                       $msg = $this->msg( "skinname-{$name}" );
+                       $code = $this->getParameter( 'inlanguagecode' );
+                       if ( $code && Language::isValidCode( $code ) ) {
+                               $msg->inLanguage( $code );
+                       } else {
+                               $msg->inContentLanguage();
+                       }
+                       if ( $msg->exists() ) {
+                               $displayName = $msg->text();
+                       }
                        $skin = array( 'code' => $name );
                        ApiResult::setContent( $skin, $displayName );
                        if ( !isset( $allowed[$name] ) ) {
@@ -840,9 +857,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                ' fileextensions        - Returns list of file extensions allowed to be uploaded',
                                ' rightsinfo            - Returns wiki rights (license) information if available',
                                ' restrictions          - Returns information on available restriction (protection) types',
-                               ' languages             - Returns a list of languages MediaWiki supports' .
+                               ' languages             - Returns a list of languages MediaWiki supports ' .
                                        "(optionally localised by using {$p}inlanguagecode)",
-                               ' skins                 - Returns a list of all enabled skins',
+                               ' skins                 - Returns a list of all enabled skins ' .
+                                       "(optionally localised by using {$p}inlanguagecode, otherwise in content language)",
                                ' extensiontags         - Returns a list of parser extension tags',
                                ' functionhooks         - Returns a list of parser function hooks',
                                ' showhooks             - Returns a list of all subscribed hooks (contents of $wgHooks)',
@@ -854,7 +872,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        'showalldb' => 'List all database servers, not just the one lagging the most',
                        'numberingroup' => 'Lists the number of users in user groups',
                        'inlanguagecode' => 'Language code for localised language names ' .
-                               '(best effort, use CLDR extension)',
+                               '(best effort, use CLDR extension) and skin names',
                );
        }
 
diff --git a/includes/api/ApiQueryTokens.php b/includes/api/ApiQueryTokens.php
new file mode 100644 (file)
index 0000000..ba9c937
--- /dev/null
@@ -0,0 +1,104 @@
+<?php
+/**
+ * Module to fetch tokens via action=query&meta=tokens
+ *
+ * Created on August 8, 2014
+ *
+ * Copyright © 2014 Brad Jorsch bjorsch@wikimedia.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.24
+ */
+
+/**
+ * Module to fetch tokens via action=query&meta=tokens
+ *
+ * @ingroup API
+ * @since 1.24
+ */
+class ApiQueryTokens extends ApiQueryBase {
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+               $res = array();
+
+               if ( $this->getMain()->getRequest()->getVal( 'callback' ) !== null ) {
+                       $this->setWarning( 'Tokens may not be obtained when using a callback' );
+                       return;
+               }
+
+               $salts = self::getTokenTypeSalts();
+               foreach ( $params['type'] as $type ) {
+                       $salt = $salts[$type];
+                       $val = $this->getUser()->getEditToken( $salt, $this->getRequest() );
+                       $res[$type . 'token'] = $val;
+               }
+
+               $this->getResult()->addValue( 'query', $this->getModuleName(), $res );
+       }
+
+       public static function getTokenTypeSalts() {
+               static $salts = null;
+               if ( !$salts ) {
+                       wfProfileIn( __METHOD__ );
+                       $salts = array(
+                               'csrf' => '',
+                               'watch' => 'watch',
+                               'patrol' => 'patrol',
+                               'rollback' => 'rollback',
+                               'userrights' => 'userrights',
+                       );
+                       wfRunHooks( 'ApiQueryTokensRegisterTypes', array( &$salts ) );
+                       ksort( $salts );
+                       wfProfileOut( __METHOD__ );
+               }
+
+               return $salts;
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'type' => array(
+                               ApiBase::PARAM_DFLT => 'csrf',
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => array_keys( self::getTokenTypeSalts() ),
+                       ),
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'type' => 'Type of token(s) to request'
+               );
+       }
+
+       public function getDescription() {
+               return 'Gets tokens for data-modifying actions.';
+       }
+
+       protected function getExamples() {
+               return array(
+                       'api.php?action=query&meta=tokens' => 'Retrieve a csrf token (the default)',
+                       'api.php?action=query&meta=tokens&type=watch|patrol' => 'Retrieve a watch token and a patrol token'
+               );
+       }
+
+       public function getCacheMode( $params ) {
+               return 'private';
+       }
+}
index 6d70241..fd5f47b 100644 (file)
@@ -69,6 +69,10 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                $vals['blockedby'] = $block->getByName();
                                $vals['blockedbyid'] = $block->getBy();
                                $vals['blockreason'] = $user->blockedFor();
+                               $vals['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $block->mTimestamp );
+                               $vals['blockexpiry'] = $block->getExpiry() === 'infinity'
+                                       ? 'infinite'
+                                       : wfTimestamp( TS_ISO_8601, $block->getExpiry() );
                        }
                }
 
@@ -104,6 +108,12 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        $vals['options'] = $user->getOptions();
                }
 
+               if ( isset( $this->prop['preferencestoken'] ) ) {
+                       $p = $this->getModulePrefix();
+                       $this->setWarning(
+                               "{$p}prop=preferencestoken has been deprecated. Please use action=query&meta=tokens instead."
+                       );
+               }
                if ( isset( $this->prop['preferencestoken'] ) &&
                        is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) &&
                        $user->isAllowed( 'editmyoptions' )
@@ -252,7 +262,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                '  rights           - Lists all the rights the current user has',
                                '  changeablegroups - Lists the groups the current user can add to and remove from',
                                '  options          - Lists all preferences the current user has set',
-                               '  preferencestoken - Get a token to change current user\'s preferences',
+                               '  preferencestoken - DEPRECATED! Get a token to change current user\'s preferences',
                                '  editcount        - Adds the current user\'s edit count',
                                '  ratelimits       - Lists all rate limits applying to the current user',
                                '  realname         - Adds the user\'s real name',
index 84326a2..c147279 100644 (file)
@@ -58,6 +58,7 @@ class ApiQueryUsers extends ApiQueryBase {
         * Get an array mapping token names to their handler functions.
         * The prototype for a token function is func($user)
         * it should return a token or false (permission denied)
+        * @deprecated since 1.24
         * @return array Array of tokenname => function
         */
        protected function getTokenFunctions() {
@@ -80,6 +81,7 @@ class ApiQueryUsers extends ApiQueryBase {
        }
 
        /**
+        * @deprecated since 1.24
         * @param User $user
         * @return string
         */
@@ -193,6 +195,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                        $data[$name]['blockid'] = $row->ipb_id;
                                        $data[$name]['blockedby'] = $row->ipb_by_text;
                                        $data[$name]['blockedbyid'] = $row->ipb_by;
+                                       $data[$name]['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $row->ipb_timestamp );
                                        $data[$name]['blockreason'] = $row->ipb_reason;
                                        $data[$name]['blockexpiry'] = $row->ipb_expiry;
                                }
@@ -274,19 +277,6 @@ class ApiQueryUsers extends ApiQueryBase {
                $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'user' );
        }
 
-       /**
-        * Gets all the groups that a user is automatically a member of (implicit groups)
-        *
-        * @deprecated since 1.20; call User::getAutomaticGroups() directly.
-        * @param User $user
-        * @return array
-        */
-       public static function getAutoGroups( $user ) {
-               wfDeprecated( __METHOD__, '1.20' );
-
-               return $user->getAutomaticGroups();
-       }
-
        public function getCacheMode( $params ) {
                if ( isset( $params['token'] ) ) {
                        return 'private';
@@ -317,6 +307,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                ApiBase::PARAM_ISMULTI => true
                        ),
                        'token' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
                                ApiBase::PARAM_ISMULTI => true
                        ),
index 2e80447..946977d 100644 (file)
@@ -569,6 +569,7 @@ class ApiResult extends ApiBase {
                } else {
                        $key = 'continue';
                        $data = array();
+                       $batchcomplete = false;
 
                        $finishedModules = array_diff(
                                array_keys( $this->continueAllModules ),
@@ -611,9 +612,11 @@ class ApiResult extends ApiBase {
                                $finishedModules = array_diff(
                                        $finishedModules, $this->continueGeneratedModules
                                );
+                               $batchcomplete = true;
                        } else {
                                // Generator and prop modules are all done. Mark it so.
                                $this->generatorDone = true;
+                               $batchcomplete = true;
                        }
 
                        // Set 'continue' if any continuation data is set or if the generator
@@ -623,6 +626,10 @@ class ApiResult extends ApiBase {
                                        ( $this->generatorDone ? '-' : join( '|', $this->generatorParams ) ) .
                                        '||' . join( '|', $finishedModules );
                        }
+
+                       if ( $batchcomplete ) {
+                               $this->addValue( null, 'batchcomplete', '', ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+                       }
                }
                if ( $data ) {
                        $this->addValue( null, $key, $data, ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
index 07a1a45..cbc3070 100644 (file)
@@ -195,10 +195,6 @@ class ApiRevisionDelete extends ApiBase {
                                ApiBase::PARAM_TYPE => array( 'yes', 'no', 'nochange' ),
                                ApiBase::PARAM_DFLT => 'nochange',
                        ),
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'reason' => null,
                );
        }
@@ -211,7 +207,6 @@ class ApiRevisionDelete extends ApiBase {
                        'hide' => 'What to hide for each revision',
                        'show' => 'What to unhide for each revision',
                        'suppress' => 'Whether to suppress data from administrators as well as others',
-                       'token' => 'A delete token previously retrieved through action=tokens',
                        'reason' => 'Reason for the deletion/undeletion',
                );
        }
@@ -221,11 +216,7 @@ class ApiRevisionDelete extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
index af6f9ff..f4d3c54 100644 (file)
@@ -40,9 +40,19 @@ class ApiRollback extends ApiBase {
        private $mUser = null;
 
        public function execute() {
+               $user = $this->getUser();
                $params = $this->extractRequestParams();
 
-               // User and title already validated in call to getTokenSalt from Main
+               // WikiPage::doRollback needs a Web UI token, so get one of those if we
+               // validated based on an API rollback token.
+               $token = $params['token'];
+               if ( $user->matchEditToken( $token, 'rollback', $this->getRequest() ) ) {
+                       $token = $this->getUser()->getEditToken(
+                               $this->getWebUITokenSalt( $params ),
+                               $this->getRequest()
+                       );
+               }
+
                $titleObj = $this->getRbTitle( $params );
                $pageObj = WikiPage::factory( $titleObj );
                $summary = $params['summary'];
@@ -50,10 +60,10 @@ class ApiRollback extends ApiBase {
                $retval = $pageObj->doRollback(
                        $this->getRbUser( $params ),
                        $summary,
-                       $params['token'],
+                       $token,
                        $params['markbot'],
                        $details,
-                       $this->getUser()
+                       $user
                );
 
                if ( $retval ) {
@@ -99,10 +109,6 @@ class ApiRollback extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
                        ),
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'summary' => '',
                        'markbot' => false,
                        'watchlist' => array(
@@ -123,10 +129,11 @@ class ApiRollback extends ApiBase {
                return array(
                        'title' => "Title of the page you want to roll back. Cannot be used together with {$p}pageid",
                        'pageid' => "Page ID of the page you want to roll back. Cannot be used together with {$p}title",
-                       'user' => 'Name of the user whose edits are to be rolled back. If ' .
-                               'set incorrectly, you\'ll get a badtoken error.',
-                       'token' => 'A rollback token previously retrieved through ' .
-                               "{$this->getModulePrefix()}prop=revisions",
+                       'user' => 'Name of the user whose edits are to be rolled back.',
+                       'token' => array(
+                               /* Standard description automatically prepended */
+                               'For compatibility, the token used in the web UI is also accepted.'
+                       ),
                        'summary' => 'Custom edit summary. If empty, default summary will be used',
                        'markbot' => 'Mark the reverted edits and the revert as bot edits',
                        'watchlist' => 'Unconditionally add or remove the page from your watchlist, ' .
@@ -142,12 +149,10 @@ class ApiRollback extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
+               return 'rollback';
        }
 
-       public function getTokenSalt() {
-               $params = $this->extractRequestParams();
-
+       protected function getWebUITokenSalt( array $params ) {
                return array(
                        $this->getRbTitle( $params )->getPrefixedText(),
                        $this->getRbUser( $params )
index 0433bc9..5d527fc 100644 (file)
@@ -202,11 +202,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getAllowedParams( $flags = 0 ) {
@@ -214,7 +210,6 @@ class ApiSetNotificationTimestamp extends ApiBase {
                        'entirewatchlist' => array(
                                ApiBase::PARAM_TYPE => 'boolean'
                        ),
-                       'token' => null,
                        'timestamp' => array(
                                ApiBase::PARAM_TYPE => 'timestamp'
                        ),
@@ -239,7 +234,6 @@ class ApiSetNotificationTimestamp extends ApiBase {
                        'timestamp' => 'Timestamp to which to set the notification timestamp',
                        'torevid' => 'Revision to set the notification timestamp to (one page only)',
                        'newerthanrevid' => 'Revision to set the notification timestamp newer than (one page only)',
-                       'token' => 'A token previously acquired via prop=info',
                        'continue' => 'When more results are available, use this to continue',
                );
        }
index 8e2ecfb..e5e9d5d 100644 (file)
  */
 
 /**
+ * @deprecated since 1.24
  * @ingroup API
  */
 class ApiTokens extends ApiBase {
 
        public function execute() {
+               $this->setWarning(
+                       "action=tokens has been deprecated. Please use action=query&meta=tokens instead."
+               );
+               $this->logFeatureUsage( "action=tokens" );
+
                $params = $this->extractRequestParams();
                $res = array();
 
@@ -71,6 +77,10 @@ class ApiTokens extends ApiBase {
                return $types;
        }
 
+       public function isDeprecated() {
+               return true;
+       }
+
        public function getAllowedParams() {
                return array(
                        'type' => array(
@@ -88,7 +98,10 @@ class ApiTokens extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Gets tokens for data-modifying actions.';
+               return array(
+                       'This module is deprecated in favor of action=query&meta=tokens.',
+                       'Gets tokens for data-modifying actions.'
+               );
        }
 
        protected function getExamples() {
index acb7ed2..2854a82 100644 (file)
@@ -89,7 +89,6 @@ class ApiUnblock extends ApiBase {
                                ApiBase::PARAM_TYPE => 'integer',
                        ),
                        'user' => null,
-                       'token' => null,
                        'reason' => '',
                );
        }
@@ -102,7 +101,6 @@ class ApiUnblock extends ApiBase {
                                "Cannot be used together with {$p}user",
                        'user' => "Username, IP address or IP range you want to unblock. " .
                                "Cannot be used together with {$p}id",
-                       'token' => "An unblock token previously obtained through prop=info",
                        'reason' => 'Reason for unblock',
                );
        }
@@ -112,11 +110,7 @@ class ApiUnblock extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
index df245cd..07aad9f 100644 (file)
@@ -96,10 +96,6 @@ class ApiUndelete extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
                        ),
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'reason' => '',
                        'timestamps' => array(
                                ApiBase::PARAM_TYPE => 'timestamp',
@@ -124,10 +120,6 @@ class ApiUndelete extends ApiBase {
        public function getParamDescription() {
                return array(
                        'title' => 'Title of the page you want to restore',
-                       'token' => array(
-                               'An undelete token previously retrieved through list=deletedrevs, or ',
-                               'a delete token retrieved through action=tokens.'
-                       ),
                        'reason' => 'Reason for restoring',
                        'timestamps' => array(
                                'Timestamps of the revisions to restore.',
@@ -151,11 +143,7 @@ class ApiUndelete extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
index 368e7ce..2770bdc 100644 (file)
@@ -223,11 +223,12 @@ class ApiUpload extends ApiBase {
                // Check we added the last chunk:
                if ( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
                        if ( $this->mParams['async'] ) {
-                               $progress = UploadBase::getSessionStatus( $filekey );
+                               $progress = UploadBase::getSessionStatus( $this->getUser(), $filekey );
                                if ( $progress && $progress['result'] === 'Poll' ) {
                                        $this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
                                }
                                UploadBase::setSessionStatus(
+                                       $this->getUser(),
                                        $filekey,
                                        array( 'result' => 'Poll',
                                                'stage' => 'queued', 'status' => Status::newGood() )
@@ -241,6 +242,7 @@ class ApiUpload extends ApiBase {
                                        )
                                ) );
                                $result['result'] = 'Poll';
+                               $result['stage'] = 'queued';
                        } else {
                                $status = $this->mUpload->concatenateChunks();
                                if ( !$status->isGood() ) {
@@ -326,7 +328,7 @@ class ApiUpload extends ApiBase {
 
                // Status report for "upload to stash"/"upload from stash"
                if ( $this->mParams['filekey'] && $this->mParams['checkstatus'] ) {
-                       $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+                       $progress = UploadBase::getSessionStatus( $this->getUser(), $this->mParams['filekey'] );
                        if ( !$progress ) {
                                $this->dieUsage( 'No result in status data', 'missingresult' );
                        } elseif ( !$progress['status']->isGood() ) {
@@ -611,11 +613,12 @@ class ApiUpload extends ApiBase {
 
                // No errors, no warnings: do the upload
                if ( $this->mParams['async'] ) {
-                       $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+                       $progress = UploadBase::getSessionStatus( $this->getUser(), $this->mParams['filekey'] );
                        if ( $progress && $progress['result'] === 'Poll' ) {
                                $this->dieUsage( "Upload from stash already in progress.", 'publishfailed' );
                        }
                        UploadBase::setSessionStatus(
+                               $this->getUser(),
                                $this->mParams['filekey'],
                                array( 'result' => 'Poll', 'stage' => 'queued', 'status' => Status::newGood() )
                        );
@@ -631,6 +634,7 @@ class ApiUpload extends ApiBase {
                                )
                        ) );
                        $result['result'] = 'Poll';
+                       $result['stage'] = 'queued';
                } else {
                        /** @var $status Status */
                        $status = $this->mUpload->performUpload( $this->mParams['comment'],
@@ -688,10 +692,6 @@ class ApiUpload extends ApiBase {
                                ApiBase::PARAM_DFLT => ''
                        ),
                        'text' => null,
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'watch' => array(
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_DEPRECATED => true,
@@ -735,7 +735,6 @@ class ApiUpload extends ApiBase {
        public function getParamDescription() {
                $params = array(
                        'filename' => 'Target filename',
-                       'token' => 'Edit token. You can get one of these through prop=info',
                        'comment' => 'Upload comment. Also used as the initial page text for new ' .
                                'files if "text" is not specified',
                        'text' => 'Initial page text for new files',
@@ -771,24 +770,20 @@ class ApiUpload extends ApiBase {
                        ' * Have the MediaWiki server fetch a file from a URL, using the "url" parameter',
                        ' * Complete an earlier upload that failed due to warnings, using the "filekey" parameter',
                        'Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when',
-                       'sending the "file". Also you must get and send an edit token before doing any upload stuff.'
+                       'sending the "file".',
                );
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return 'csrf';
        }
 
        public function getExamples() {
                return array(
                        'api.php?action=upload&filename=Wiki.png' .
-                       '&url=http%3A//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png'
+                       '&url=http%3A//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png&token=123ABC'
                                => 'Upload from a URL',
-                       'api.php?action=upload&filename=Wiki.png&filekey=filekey&ignorewarnings=1'
+                       'api.php?action=upload&filename=Wiki.png&filekey=filekey&ignorewarnings=1&token=123ABC'
                                => 'Complete an upload that failed due to warnings',
                );
        }
index 0bed859..66af4c5 100644 (file)
@@ -32,12 +32,28 @@ class ApiUserrights extends ApiBase {
 
        private $mUser = null;
 
+       /**
+        * Get a UserrightsPage object, or subclass.
+        * @return UserrightsPage
+        */
+       protected function getUserRightsPage() {
+               return new UserrightsPage;
+       }
+
+       /**
+        * Get all available groups.
+        * @return array
+        */
+       protected function getAllGroups() {
+               return User::getAllGroups();
+       }
+
        public function execute() {
                $params = $this->extractRequestParams();
 
-               $user = $this->getUrUser();
+               $user = $this->getUrUser( $params );
 
-               $form = new UserrightsPage;
+               $form = $this->getUserRightsPage();
                $form->setContext( $this->getContext() );
                $r['user'] = $user->getName();
                $r['userid'] = $user->getId();
@@ -53,19 +69,19 @@ class ApiUserrights extends ApiBase {
        }
 
        /**
+        * @param array $params
         * @return User
         */
-       private function getUrUser() {
+       private function getUrUser( array $params ) {
                if ( $this->mUser !== null ) {
                        return $this->mUser;
                }
 
-               $params = $this->extractRequestParams();
                $this->requireOnlyOneParameter( $params, 'user', 'userid' );
 
                $user = isset( $params['user'] ) ? $params['user'] : '#' . $params['userid'];
 
-               $form = new UserrightsPage;
+               $form = $this->getUserRightsPage();
                $form->setContext( $this->getContext() );
                $status = $form->fetchUser( $user );
                if ( !$status->isOK() ) {
@@ -94,17 +110,13 @@ class ApiUserrights extends ApiBase {
                                ApiBase::PARAM_TYPE => 'integer',
                        ),
                        'add' => array(
-                               ApiBase::PARAM_TYPE => User::getAllGroups(),
+                               ApiBase::PARAM_TYPE => $this->getAllGroups(),
                                ApiBase::PARAM_ISMULTI => true
                        ),
                        'remove' => array(
-                               ApiBase::PARAM_TYPE => User::getAllGroups(),
+                               ApiBase::PARAM_TYPE => $this->getAllGroups(),
                                ApiBase::PARAM_ISMULTI => true
                        ),
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'reason' => array(
                                ApiBase::PARAM_DFLT => ''
                        )
@@ -117,7 +129,10 @@ class ApiUserrights extends ApiBase {
                        'userid' => 'User id',
                        'add' => 'Add the user to these groups',
                        'remove' => 'Remove the user from these groups',
-                       'token' => 'A userrights token previously retrieved through list=users',
+                       'token' => array(
+                               /* Standard description automatically prepended */
+                               'For compatibility, the token used in the web UI is also accepted.'
+                       ),
                        'reason' => 'Reason for the change',
                );
        }
@@ -127,11 +142,11 @@ class ApiUserrights extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
+               return 'userrights';
        }
 
-       public function getTokenSalt() {
-               return $this->getUrUser()->getName();
+       protected function getWebUITokenSalt( array $params ) {
+               return $this->getUrUser( $params )->getName();
        }
 
        public function getExamples() {
index 8060260..8cd0f05 100644 (file)
@@ -104,17 +104,6 @@ class ApiWatch extends ApiBase {
 
                $res = array( 'title' => $title->getPrefixedText() );
 
-               // Currently unnecessary, code to act as a safeguard against any change
-               // in current behavior of uselang.
-               // Copy from ApiParse
-               $oldLang = null;
-               if ( isset( $params['uselang'] ) &&
-                       $params['uselang'] != $this->getContext()->getLanguage()->getCode()
-               ) {
-                       $oldLang = $this->getContext()->getLanguage(); // Backup language
-                       $this->getContext()->setLanguage( Language::factory( $params['uselang'] ) );
-               }
-
                if ( $params['unwatch'] ) {
                        $status = UnwatchAction::doUnwatch( $title, $user );
                        if ( $status->isOK() ) {
@@ -131,10 +120,6 @@ class ApiWatch extends ApiBase {
                        }
                }
 
-               if ( !is_null( $oldLang ) ) {
-                       $this->getContext()->setLanguage( $oldLang ); // Reset language to $oldLang
-               }
-
                if ( !$status->isOK() ) {
                        if ( $compatibilityMode ) {
                                $this->dieStatus( $status );
@@ -166,10 +151,6 @@ class ApiWatch extends ApiBase {
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
                return 'watch';
        }
 
@@ -180,11 +161,6 @@ class ApiWatch extends ApiBase {
                                ApiBase::PARAM_DEPRECATED => true
                        ),
                        'unwatch' => false,
-                       'uselang' => null,
-                       'token' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ),
                        'continue' => '',
                );
                if ( $flags ) {
@@ -200,8 +176,6 @@ class ApiWatch extends ApiBase {
                return $psModule->getParamDescription() + array(
                        'title' => 'The page to (un)watch. use titles instead',
                        'unwatch' => 'If set the page will be unwatched rather than watched',
-                       'uselang' => 'Language to show the message in',
-                       'token' => 'A token previously acquired via prop=info',
                        'continue' => 'When more results are available, use this to continue',
                );
        }
diff --git a/includes/api/i18n/en.json b/includes/api/i18n/en.json
new file mode 100644 (file)
index 0000000..6c45425
--- /dev/null
@@ -0,0 +1,98 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Anomie"
+               ]
+       },
+
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/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://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts 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, a 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 https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-param-action": "Which action to perform.",
+       "apihelp-main-param-format": "The format of the output.",
+       "apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code \"maxlag\" is returned with a message like \"Waiting for $host: $lag seconds lagged\".<br />See https://www.mediawiki.org/wiki/Manual:Maxlag_parameter for more information.",
+       "apihelp-main-param-smaxage": "Set the s-maxage header to this many seconds. Errors are never cached.",
+       "apihelp-main-param-maxage": "Set the max-age header to this many seconds. Errors are never cached.",
+       "apihelp-main-param-assert": "Verify the user is logged in if set to \"user\", or has the bot userright if \"bot\".",
+       "apihelp-main-param-requestid": "Any value given here will be included in the response. May be used to distinguish requests.",
+       "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 Origin: header exactly, so it has to be set to something like http://en.wikipedia.org or https://meta.wikimedia.org. If this parameter does not match the Origin: header, a 403 response will be returned. If this parameter matches the Origin: header and the origin is whitelisted, an Access-Control-Allow-Origin header will be set.",
+       "apihelp-main-param-uselang": "Language to use for message translations. A list of codes may be fetched from [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo&siprop=languages]], or specify \"user\" to use the current user's language preference.",
+
+       "apihelp-format-example-generic": "Format the query result in the $1 format",
+       "apihelp-dbg-description": "Output data in PHP's var_export() format.",
+       "apihelp-dbgfm-description": "Output data in PHP's var_export() format (pretty-print in HTML).",
+       "apihelp-dump-description": "Output data in PHP's var_dump() format.",
+       "apihelp-dumpfm-description": "Output data in PHP's var_dump() format (pretty-print in HTML).",
+       "apihelp-json-description": "Output data in JSON format.",
+       "apihelp-json-param-callback": "If specified, wraps the output into a given function call. For safety, all user-specific data will be restricted.",
+       "apihelp-json-param-utf8": "If specified, encodes most (but not all) non-ASCII characters as UTF-8 instead of replacing them with hexadecimal escape sequences.",
+       "apihelp-jsonfm-description": "Output data in JSON format (pretty-print in HTML).",
+       "apihelp-none-description": "Output nothing.",
+       "apihelp-php-description": "Output data in serialized PHP format.",
+       "apihelp-phpfm-description": "Output data in serialized PHP format (pretty-print in HTML).",
+       "apihelp-rawfm-description": "Output data with the debugging elements in JSON format (pretty-print in HTML).",
+       "apihelp-txt-description": "Output data in PHP's print_r() format.",
+       "apihelp-txtfm-description": "Output data in PHP's print_r() format (pretty-print in HTML).",
+       "apihelp-wddx-description": "Output data in WDDX format.",
+       "apihelp-wddxfm-description": "Output data in WDDX format (pretty-print in HTML).",
+       "apihelp-xml-description": "Output data in XML format.",
+       "apihelp-xml-param-xslt": "If specified, adds &lt;xslt&gt; as stylesheet. This should be a wiki page in the MediaWiki namespace whose page name ends with \".xsl\".",
+       "apihelp-xml-param-includexmlnamespac": "If specified, adds an XML namespace.",
+       "apihelp-xmlfm-description": "Output data in XML format (pretty-print in HTML).",
+       "apihelp-yaml-description": "Output data in YAML format.",
+       "apihelp-yamlfm-description": "Output data in YAML format (pretty-print in HTML).",
+
+       "apihelp-help-description": "Display help for the specified modules.",
+       "apihelp-help-param-modules": "Modules to display help for (values of the action= and format= parameters, or \"main\"). Can specify submodules with a \"+\".",
+       "apihelp-help-param-submodules": "Include help for submodules of the named module.",
+       "apihelp-help-param-recursivesubmodules": "Include help for submodules recursively.",
+       "apihelp-help-param-helpformat": "Format of the help output.",
+       "apihelp-help-param-wrap": "Wrap the output in a standard API response structure.",
+       "apihelp-help-param-toc": "Include a table of contents in the HTML output.",
+       "apihelp-help-example-main": "Help for the main module",
+       "apihelp-help-example-recursive": "All help in one page",
+       "apihelp-help-example-help": "Help for the help module itself",
+       "apihelp-help-example-query": "Help for two query submodules",
+
+       "api-format-title": "MediaWiki API result",
+       "api-format-prettyprint-header": "You are looking at the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the format parameter to change the output format. To see the non-HTML representation of the $1 format, set format=$2.\n\nSee the [https://www.mediawiki.org/wiki/API complete documentation], or [[Special:ApiHelp/main|API help]] for more information.",
+
+       "api-help-title": "MediaWiki API help",
+       "api-help-lead": "This is an auto-generated MediaWiki API documentation page.\n\nDocumentation and examples: https://www.mediawiki.org/wiki/API",
+       "api-help-main-header": "Main module",
+       "api-help-fallback-description": "$1",
+       "api-help-fallback-parameter": "$1",
+       "api-help-fallback-example": "$1",
+       "api-help-flags": "",
+       "api-help-flag-deprecated": "This module is deprecated.",
+       "api-help-flag-internal": "<strong>This module is internal or unstable.</strong> Its operation may change without notice.",
+       "api-help-flag-readrights": "This module requires read rights.",
+       "api-help-flag-writerights": "This module requires write rights.",
+       "api-help-flag-mustbeposted": "This module only accepts POST requests.",
+       "api-help-flag-generator": "This module can be used as a generator.",
+       "api-help-help-urls": "",
+       "api-help-parameters": "{{PLURAL:$1|Parameter|Parameters}}:",
+       "api-help-param-deprecated": "Deprecated.",
+       "api-help-param-required": "This parameter is required.",
+       "api-help-param-list": "{{PLURAL:$1|1=One value|2=Values (separate with \"{{!}}\")}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Must be empty|Can be empty, or $2}}",
+       "api-help-param-limit": "No more than $1 allowed.",
+       "api-help-param-limit2": "No more than $1 ($2 for bots) allowed.",
+       "api-help-param-integer-min": "The {{PLURAL:$1|1=value|2=values}} must be no less than $2.",
+       "api-help-param-integer-max": "The {{PLURAL:$1|1=value|2=values}} must be no greater than $3.",
+       "api-help-param-integer-minmax": "The {{PLURAL:$1|1=value|2=values}} must be between $2 and $3.",
+       "api-help-param-upload": "Must be posted as a file upload using multipart/form-data.",
+       "api-help-param-multi-separate": "Separate values with \"|\".",
+       "api-help-param-multi-max": "Maximum number of values is {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} for bots).",
+       "api-help-param-default": "Default: $1",
+       "api-help-param-default-empty": "Default: <span class=\"apihelp-empty\">(empty)</span>",
+       "api-help-param-token": "A \"$1\" token retrieved from [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(no description)</span>",
+       "api-help-examples": "{{PLURAL:$1|Example|Examples}}:",
+       "api-help-permissions": "{{PLURAL:$1|Permission|Permissions}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Granted to}}: $2",
+       "api-help-right-apihighlimits": "Use higher limits in API queries (slow queries: $1; fast queries: $2). The limits for slow queries also apply to multivalue parameters.",
+
+       "api-credits-header": "Credits",
+       "api-credits": "API developers:\n* Roan Kattouw (lead developer Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creator, lead developer Sep 2006–Sep 2007)\n* Brad Jorsch (lead developer 2013–present)\n\nPlease send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org\nor file a bug report at https://bugzilla.wikimedia.org/."
+}
diff --git a/includes/api/i18n/qqq.json b/includes/api/i18n/qqq.json
new file mode 100644 (file)
index 0000000..a4dfd7c
--- /dev/null
@@ -0,0 +1,96 @@
+{
+       "@metadata": {
+               "authors": []
+       },
+
+       "apihelp-main-description": "{{doc-apihelp-description|main}}",
+       "apihelp-main-param-action": "{{doc-apihelp-param|main|action}}",
+       "apihelp-main-param-format": "{{doc-apihelp-param|main|format}}",
+       "apihelp-main-param-maxlag": "{{doc-apihelp-param|main|maxlag}}",
+       "apihelp-main-param-smaxage": "{{doc-apihelp-param|main|smaxage}}",
+       "apihelp-main-param-maxage": "{{doc-apihelp-param|main|maxage}}",
+       "apihelp-main-param-assert": "{{doc-apihelp-param|main|assert}}",
+       "apihelp-main-param-requestid": "{{doc-apihelp-param|main|requestid}}",
+       "apihelp-main-param-servedby": "{{doc-apihelp-param|main|servedby}}",
+       "apihelp-main-param-curtimestamp": "{{doc-apihelp-param|main|curtimestamp}}",
+       "apihelp-main-param-origin": "{{doc-apihelp-param|main|origin}}",
+       "apihelp-main-param-uselang": "{{doc-apihelp-param|main|uselang}}",
+
+       "apihelp-format-example-generic": "{{doc-apihelp-example|format|params=* $1 - Format name|paramstart=2|noseealso=1}}",
+       "apihelp-dbg-description": "{{doc-apihelp-description|dbg|seealso=* {{msg-mw|apihelp-dbgfm-description}}}}",
+       "apihelp-dbgfm-description": "{{doc-apihelp-description|dbgfm|seealso=* {{msg-mw|apihelp-dbg-description}}}}",
+       "apihelp-dump-description": "{{doc-apihelp-description|dump|seealso=* {{msg-mw|apihelp-dumpfm-description}}}}",
+       "apihelp-dumpfm-description": "{{doc-apihelp-description|dumpfm|seealso=* {{msg-mw|apihelp-dump-description}}}}",
+       "apihelp-json-description": "{{doc-apihelp-description|json|seealso=* {{msg-mw|apihelp-jsonfm-description}}}}",
+       "apihelp-json-param-callback": "{{doc-apihelp-param|json|callback}}",
+       "apihelp-json-param-utf8": "{{doc-apihelp-param|json|utf8}}",
+       "apihelp-jsonfm-description": "{{doc-apihelp-description|jsonfm|seealso=* {{msg-mw|apihelp-json-description}}}}",
+       "apihelp-none-description": "{{doc-apihelp-description|none}}",
+       "apihelp-php-description": "{{doc-apihelp-description|php|seealso=* {{msg-mw|apihelp-phpfm-description}}}}",
+       "apihelp-phpfm-description": "{{doc-apihelp-description|phpfm|seealso=* {{msg-mw|apihelp-php-description}}}}",
+       "apihelp-rawfm-description": "{{doc-apihelp-description|rawfm|seealso=* {{msg-mw|apihelp-raw-description}}}}",
+       "apihelp-txt-description": "{{doc-apihelp-description|txt|seealso=* {{msg-mw|apihelp-txtfm-description}}}}",
+       "apihelp-txtfm-description": "{{doc-apihelp-description|txtfm|seealso=* {{msg-mw|apihelp-txt-description}}}}",
+       "apihelp-wddx-description": "{{doc-apihelp-description|wddx|seealso=* {{msg-mw|apihelp-wddxfm-description}}}}",
+       "apihelp-wddxfm-description": "{{doc-apihelp-description|wddxfm|seealso=* {{msg-mw|apihelp-wddx-description}}}}",
+       "apihelp-xml-description": "{{doc-apihelp-description|xml|seealso=* {{msg-mw|apihelp-xmlfm-description}}}}",
+       "apihelp-xml-param-xslt": "{{doc-apihelp-param|xml|xslt}}",
+       "apihelp-xml-param-includexmlnamespac": "{{doc-apihelp-param|xml|includexmlnamespac}}",
+       "apihelp-xmlfm-description": "{{doc-apihelp-description|xmlfm|seealso=* {{msg-mw|apihelp-xml-description}}}}",
+       "apihelp-yaml-description": "{{doc-apihelp-description|yaml|seealso=* {{msg-mw|apihelp-yamlfm-description}}}}",
+       "apihelp-yamlfm-description": "{{doc-apihelp-description|yamlfm|seealso=* {{msg-mw|apihelp-yaml-description}}}}",
+
+       "apihelp-help-description": "{{doc-apihelp-description|help}}",
+       "apihelp-help-param-modules": "{{doc-apihelp-param|help|modules}}",
+       "apihelp-help-param-submodules": "{{doc-apihelp-param|help|submodules}}",
+       "apihelp-help-param-recursivesubmodules": "{{doc-apihelp-param|help|recursivesubmodules}}",
+       "apihelp-help-param-helpformat": "{{doc-apihelp-param|help|helpformat}}",
+       "apihelp-help-param-wrap": "{{doc-apihelp-param|help|wrap}}",
+       "apihelp-help-param-toc": "{{doc-apihelp-param|help|toc}}",
+       "apihelp-help-example-main": "{{doc-apihelp-example|help}}",
+       "apihelp-help-example-recursive": "{{doc-apihelp-example|help}}",
+       "apihelp-help-example-help": "{{doc-apihelp-example|help}}",
+       "apihelp-help-example-query": "{{doc-apihelp-example|help}}",
+
+       "api-format-title": "Page title when API output is pretty-printed in HTML.",
+       "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name",
+
+       "api-help-title": "Page title for the auto-generated help output",
+       "api-help-lead": "Text displayed at the top of the API help page",
+       "api-help-main-header": "Text for the header of the main module",
+       "api-help-fallback-description": "{{notranslate}}",
+       "api-help-fallback-parameter": "{{notranslate}}",
+       "api-help-fallback-example": "{{notranslate}}",
+       "api-help-flags": "{{optional}} Label for the API help flags box\n\nParameters:\n* $1 - Number of flags to be displayed",
+       "api-help-flag-deprecated": "Flag displayed for an API module that is deprecated",
+       "api-help-flag-internal": "Flag displayed for an API module that is considered internal or unstable",
+       "api-help-flag-readrights": "Flag displayed for an API module that requires read rights",
+       "api-help-flag-writerights": "Flag displayed for an API module that requires write rights",
+       "api-help-flag-mustbeposted": "Flag displayed for an API module that only accepts POST requests",
+       "api-help-flag-generator": "Flag displayed for an API module that can be used as a generator",
+       "api-help-help-urls": "{{optional}} Label for the API help urls section\n\nParameters:\n* $1 - Number of urls to be displayed",
+       "api-help-parameters": "Label for the API help parameters section\n\nParameters:\n* $1 - Number of parameters to be displayed",
+       "api-help-param-deprecated": "Displayed in the API help for any deprecated parameter",
+       "api-help-param-required": "Displayed in the API help for any required parameter",
+       "api-help-param-list": "Used to display the possible values for a parameter taking a list of values\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Comma-separated list of values, possibly formatted using {{msg-mw|api-help-param-list-can-be-empty}}",
+       "api-help-param-list-can-be-empty": "Used to indicate that one of the possible values in the list is the empty string.\n\nParameters:\n* $1 - Number of items in the rest of the list; may be 0\n* $2 - Remainder of the list as a comma-separated string",
+       "api-help-param-limit": "Used to display the maximum value of a limit parameter\n\nParameters:\n* $1 - Maximum value",
+       "api-help-param-limit2": "Used to display the maximum values of a limit parameter\n\nParameters:\n* $1 - Maximum value without the apihighlimits right\n* $2 - Maximum value with the apihighlimits right",
+       "api-help-param-integer-min": "Used to display an integer parameter with a minimum but no maximum value\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Minimum value\n* $3 - unused\n\nSee also:\n* {{msg-mw|api-help-param-integer-max}}\n* {{msg-mw|api-help-param-integer-minmax}}",
+       "api-help-param-integer-max": "Used to display an integer parameter with a maximum but no minimum value\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - unused\n* $3 - Maximum value\n\nSee also:\n* {{msg-mw|api-help-param-integer-min}}\n* {{msg-mw|api-help-param-integer-minmax}}",
+       "api-help-param-integer-minmax": "Used to display an integer parameter with a maximum and minimum values\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Minimum value\n* $3 - Maximum value\n\nSee also:\n* {{msg-mw|api-help-param-integer-min}}\n* {{msg-mw|api-help-param-integer-max}}",
+       "api-help-param-upload": "{{technical}} Used to indicate that an 'upload'-type parameter must be posted as a file upload using multipart/form-data",
+       "api-help-param-multi-separate": "Used to indicate how to separate multiple values. Not used with {{msg-mw|api-help-param-list}}.",
+       "api-help-param-multi-max": "Used to indicate the maximum number of values accepted for a multi-valued parameter.\n\nParameters:\n* $1 - Maximum value without the apihighlimits right\n* $2 - Maximum value with the apihighlimits right",
+       "api-help-param-default": "Used to display the default value for an API parameter\n\nParameters:\n* $1 - Default value\n\nSee also:\n* {{msg-mw|api-help-param-default-empty}}",
+       "api-help-param-default-empty": "Used to display the default value for an API parameter when that default is an empty value\n\nSee also:\n* {{msg-mw|api-help-param-default}}",
+       "api-help-param-token": "{{doc-apihelp-param|description=any 'token' parameter|paramstart=3|params=\n* $1 - Token type|noseealso=1}}",
+       "api-help-param-no-description": "Displayed on API parameters that lack any description",
+       "api-help-examples": "Label for the API help examples section\n\nParameters:\n* $1 - Number of examples to be displayed",
+       "api-help-permissions": "Label for the \"permissions\" section in the main module's help output.\n\nParameters:\n* $1 - Number of permissions displayed",
+       "api-help-permissions-granted-to": "Used to introduce the list of groups each permission is assigned to.\n\nParameters:\n* $1 - Number of groups\n* $2 - List of group names, comma-separated",
+       "api-help-right-apihighlimits": "{{technical}}{{doc-right|apihighlimits|prefix=api-help}}\nThis message is used instead of {{msg-mw|right-apihighlimits}} in the API help to display the actual limits.\n\nParameters:\n* $1 - Limit for slow queries\n* $2 - Limit for fast queries",
+
+       "api-credits-header": "Header for the API credits section in the API help output",
+       "api-credits": "API credits text, displayed in the API help output"
+}
index 91580f9..58ca2dc 100644 (file)
@@ -35,21 +35,28 @@ class HTMLFileCache extends FileCacheBase {
         * @param string $action
         * @throws MWException
         * @return HTMLFileCache
+        *
+        * @deprecated Since 1.24, instantiate this class directly
         */
        public static function newFromTitle( $title, $action ) {
-               $cache = new self();
+               return new self( $title, $action );
+       }
 
+       /**
+        * @param Title|string $title Title object or prefixed DB key string
+        * @param string $action
+        * @throws MWException
+        */
+       public function __construct( $title, $action ) {
                $allowedTypes = self::cacheablePageActions();
                if ( !in_array( $action, $allowedTypes ) ) {
-                       throw new MWException( "Invalid filecache type given." );
+                       throw new MWException( 'Invalid file cache type given.' );
                }
-               $cache->mKey = ( $title instanceof Title )
+               $this->mKey = ( $title instanceof Title )
                        ? $title->getPrefixedDBkey()
                        : (string)$title;
-               $cache->mType = (string)$action;
-               $cache->mExt = 'html';
-
-               return $cache;
+               $this->mType = (string)$action;
+               $this->mExt = 'html';
        }
 
        /**
@@ -120,7 +127,11 @@ class HTMLFileCache extends FileCacheBase {
                $clang = $wgContLang->getCode();
 
                // Check that there are no other sources of variation
-               return !$user->getId() && !$user->getNewtalk() && $ulang == $clang;
+               if ( $user->getId() || $user->getNewtalk() || $ulang != $clang ) {
+                       return false;
+               }
+               // Allow extensions to disable caching
+               return wfRunHooks( 'HTMLFileCache::useFileCache', array( $context ) );
        }
 
        /**
@@ -211,7 +222,7 @@ class HTMLFileCache extends FileCacheBase {
                }
 
                foreach ( self::cacheablePageActions() as $type ) {
-                       $fc = self::newFromTitle( $title, $type );
+                       $fc = new self( $title, $type );
                        $fc->clearCache();
                }
 
index 76cc583..48c063f 100644 (file)
@@ -180,6 +180,8 @@ class LinkBatch {
         * @return bool|ResultWrapper
         */
        public function doQuery() {
+               global $wgContentHandlerUseDB;
+
                if ( $this->isEmpty() ) {
                        return false;
                }
@@ -190,6 +192,11 @@ class LinkBatch {
                $table = 'page';
                $fields = array( 'page_id', 'page_namespace', 'page_title', 'page_len',
                        'page_is_redirect', 'page_latest' );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'page_content_model';
+               }
+
                $conds = $this->constructSet( 'page', $dbr );
 
                // Do query
index e80dfb3..82fb12d 100644 (file)
@@ -129,10 +129,10 @@ class LinkCache {
         * @param int $len Text's length
         * @param int $redir Whether the page is a redirect
         * @param int $revision Latest revision's ID
-        * @param int $model Latest revision's content model ID
+        * @param string|null $model Latest revision's content model ID
         */
        public function addGoodLinkObj( $id, $title, $len = -1, $redir = null,
-               $revision = 0, $model = 0
+               $revision = 0, $model = null
        ) {
                $dbkey = $title->getPrefixedDBkey();
                $this->mGoodLinks[$dbkey] = (int)$id;
@@ -140,7 +140,7 @@ class LinkCache {
                        'length' => (int)$len,
                        'redirect' => (int)$redir,
                        'revision' => (int)$revision,
-                       'model' => (int)$model
+                       'model' => $model ? (string)$model : null,
                );
        }
 
@@ -216,7 +216,7 @@ class LinkCache {
         * @return int
         */
        public function addLinkObj( $nt ) {
-               global $wgAntiLockFlags, $wgContentHandlerUseDB;
+               global $wgContentHandlerUseDB;
 
                wfProfileIn( __METHOD__ );
 
@@ -242,14 +242,8 @@ class LinkCache {
                # Some fields heavily used for linking...
                if ( $this->mForUpdate ) {
                        $db = wfGetDB( DB_MASTER );
-                       if ( !( $wgAntiLockFlags & ALF_NO_LINK_LOCK ) ) {
-                               $options = array( 'FOR UPDATE' );
-                       } else {
-                               $options = array();
-                       }
                } else {
                        $db = wfGetDB( DB_SLAVE );
-                       $options = array();
                }
 
                $f = array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
@@ -259,7 +253,7 @@ class LinkCache {
 
                $s = $db->selectRow( 'page', $f,
                        array( 'page_namespace' => $nt->getNamespace(), 'page_title' => $nt->getDBkey() ),
-                       __METHOD__, $options );
+                       __METHOD__ );
                # Set fields...
                if ( $s !== false ) {
                        $this->addGoodLinkObjFromRow( $nt, $s );
index e2e304a..ae27fba 100644 (file)
@@ -200,9 +200,6 @@ class LocalisationCache {
                                case 'db':
                                        $storeClass = 'LCStoreDB';
                                        break;
-                               case 'accel':
-                                       $storeClass = 'LCStoreAccel';
-                                       break;
                                case 'detect':
                                        $storeClass = $wgCacheDirectory ? 'LCStoreCDB' : 'LCStoreDB';
                                        break;
@@ -404,7 +401,7 @@ class LocalisationCache {
                $deps = $this->store->get( $code, 'deps' );
                $keys = $this->store->get( $code, 'list' );
                $preload = $this->store->get( $code, 'preload' );
-               // Different keys may expire separately, at least in LCStoreAccel
+               // Different keys may expire separately for some stores
                if ( $deps === null || $keys === null || $preload === null ) {
                        wfDebug( __METHOD__ . "($code): cache missing, need to make one\n" );
 
@@ -686,6 +683,7 @@ class LocalisationCache {
         *
         * @param string $code
         * @param array $deps
+        * @return array
         */
        protected function readSourceFilesAndRegisterDeps( $code, &$deps ) {
                global $IP;
@@ -842,73 +840,109 @@ class LocalisationCache {
                        if ( $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
                                $coreData['fallbackSequence'][] = 'en';
                        }
+               }
 
-                       # Load the fallback localisation item by item and merge it
-                       foreach ( $coreData['fallbackSequence'] as $fbCode ) {
-                               # Load the secondary localisation from the source file to
-                               # avoid infinite cycles on cyclic fallbacks
-                               $fbData = $this->readSourceFilesAndRegisterDeps( $fbCode, $deps );
-                               if ( $fbData === false ) {
-                                       continue;
-                               }
+               $codeSequence = array_merge( array( $code ), $coreData['fallbackSequence'] );
 
-                               foreach ( self::$allKeys as $key ) {
-                                       if ( !isset( $fbData[$key] ) ) {
-                                               continue;
-                                       }
+               wfProfileIn( __METHOD__ . '-fallbacks' );
+
+               # Load non-JSON localisation data for extensions
+               $extensionData = array_combine(
+                       $codeSequence,
+                       array_fill( 0, count( $codeSequence ), $initialData ) );
+               foreach ( $wgExtensionMessagesFiles as $extension => $fileName ) {
+                       if ( isset( $wgMessagesDirs[$extension] ) ) {
+                               # This extension has JSON message data; skip the PHP shim
+                               continue;
+                       }
 
-                                       if ( is_null( $coreData[$key] ) || $this->isMergeableKey( $key ) ) {
-                                               $this->mergeItem( $key, $coreData[$key], $fbData[$key] );
+                       $data = $this->readPHPFile( $fileName, 'extension' );
+                       $used = false;
+
+                       foreach ( $data as $key => $item ) {
+                               foreach ( $codeSequence as $csCode ) {
+                                       if ( isset( $item[$csCode] ) ) {
+                                               $this->mergeItem( $key, $extensionData[$csCode][$key], $item[$csCode] );
+                                               $used = true;
                                        }
                                }
                        }
-               }
 
-               $codeSequence = array_merge( array( $code ), $coreData['fallbackSequence'] );
+                       if ( $used ) {
+                               $deps[] = new FileDependency( $fileName );
+                       }
+               }
 
-               # Load core messages and the extension localisations.
-               wfProfileIn( __METHOD__ . '-extensions' );
+               # Load the localisation data for each fallback, then merge it into the full array
                $allData = $initialData;
-               foreach ( $wgMessagesDirs as $dirs ) {
-                       foreach ( (array)$dirs as $dir ) {
-                               foreach ( $codeSequence as $csCode ) {
+               foreach ( $codeSequence as $csCode ) {
+                       $csData = $initialData;
+
+                       # Load core messages and the extension localisations.
+                       foreach ( $wgMessagesDirs as $dirs ) {
+                               foreach ( (array)$dirs as $dir ) {
                                        $fileName = "$dir/$csCode.json";
                                        $data = $this->readJSONFile( $fileName );
 
                                        foreach ( $data as $key => $item ) {
-                                               $this->mergeItem( $key, $allData[$key], $item );
+                                               $this->mergeItem( $key, $csData[$key], $item );
                                        }
 
                                        $deps[] = new FileDependency( $fileName );
                                }
                        }
-               }
 
-               foreach ( $wgExtensionMessagesFiles as $extension => $fileName ) {
-                       if ( isset( $wgMessagesDirs[$extension] ) ) {
-                               # Already loaded the JSON files for this extension; skip the PHP shim
-                               continue;
+                       # Merge non-JSON extension data
+                       if ( isset( $extensionData[$csCode] ) ) {
+                               foreach ( $extensionData[$csCode] as $key => $item ) {
+                                       $this->mergeItem( $key, $csData[$key], $item );
+                               }
                        }
 
-                       $data = $this->readPHPFile( $fileName, 'extension' );
-                       $used = false;
-
-                       foreach ( $data as $key => $item ) {
-                               if ( $this->mergeExtensionItem( $codeSequence, $key, $allData[$key], $item ) ) {
-                                       $used = true;
+                       if ( $csCode === $code ) {
+                               # Merge core data into extension data
+                               foreach ( $coreData as $key => $item ) {
+                                       $this->mergeItem( $key, $csData[$key], $item );
+                               }
+                       } else {
+                               # Load the secondary localisation from the source file to
+                               # avoid infinite cycles on cyclic fallbacks
+                               $fbData = $this->readSourceFilesAndRegisterDeps( $csCode, $deps );
+                               if ( $fbData !== false ) {
+                                       # Only merge the keys that make sense to merge
+                                       foreach ( self::$allKeys as $key ) {
+                                               if ( !isset( $fbData[$key] ) ) {
+                                                       continue;
+                                               }
+
+                                               if ( is_null( $coreData[$key] ) || $this->isMergeableKey( $key ) ) {
+                                                       $this->mergeItem( $key, $csData[$key], $fbData[$key] );
+                                               }
+                                       }
                                }
                        }
 
-                       if ( $used ) {
-                               $deps[] = new FileDependency( $fileName );
+                       # Allow extensions an opportunity to adjust the data for this
+                       # fallback
+                       wfRunHooks( 'LocalisationCacheRecacheFallback', array( $this, $csCode, &$csData ) );
+
+                       # Merge the data for this fallback into the final array
+                       if ( $csCode === $code ) {
+                               $allData = $csData;
+                       } else {
+                               foreach ( self::$allKeys as $key ) {
+                                       if ( !isset( $csData[$key] ) ) {
+                                               continue;
+                                       }
+
+                                       if ( is_null( $allData[$key] ) || $this->isMergeableKey( $key ) ) {
+                                               $this->mergeItem( $key, $allData[$key], $csData[$key] );
+                                       }
+                               }
                        }
                }
 
-               # Merge core data into extension data
-               foreach ( $coreData as $key => $item ) {
-                       $this->mergeItem( $key, $allData[$key], $item );
-               }
-               wfProfileOut( __METHOD__ . '-extensions' );
+               wfProfileOut( __METHOD__ . '-fallbacks' );
 
                # Add cache dependencies for any referenced globals
                $deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' );
@@ -983,7 +1017,7 @@ class LocalisationCache {
                # HACK: If using a null (i.e. disabled) storage backend, we
                # can't write to the MessageBlobStore either
                if ( $purgeBlobs && !$this->store instanceof LCStoreNull ) {
-                       MessageBlobStore::clear();
+                       MessageBlobStore::getInstance()->clear();
                }
 
                wfProfileOut( __METHOD__ );
@@ -1097,56 +1131,6 @@ interface LCStore {
        function set( $key, $value );
 }
 
-/**
- * LCStore implementation which uses PHP accelerator to store data.
- * This will work if one of XCache, WinCache or APC cacher is configured.
- * (See ObjectCache.php)
- */
-class LCStoreAccel implements LCStore {
-       private $currentLang;
-       private $keys;
-
-       public function __construct() {
-               $this->cache = wfGetCache( CACHE_ACCEL );
-       }
-
-       public function get( $code, $key ) {
-               $k = wfMemcKey( 'l10n', $code, 'k', $key );
-               $r = $this->cache->get( $k );
-
-               return $r === false ? null : $r;
-       }
-
-       public function startWrite( $code ) {
-               $k = wfMemcKey( 'l10n', $code, 'l' );
-               $keys = $this->cache->get( $k );
-               if ( $keys ) {
-                       foreach ( $keys as $k ) {
-                               $this->cache->delete( $k );
-                       }
-               }
-               $this->currentLang = $code;
-               $this->keys = array();
-       }
-
-       public function finishWrite() {
-               if ( $this->currentLang ) {
-                       $k = wfMemcKey( 'l10n', $this->currentLang, 'l' );
-                       $this->cache->set( $k, array_keys( $this->keys ) );
-               }
-               $this->currentLang = null;
-               $this->keys = array();
-       }
-
-       public function set( $key, $value ) {
-               if ( $this->currentLang ) {
-                       $k = wfMemcKey( 'l10n', $this->currentLang, 'k', $key );
-                       $this->keys[$k] = true;
-                       $this->cache->set( $k, $value );
-               }
-       }
-}
-
 /**
  * LCStore implementation which uses the standard DB functions to store data.
  * This will work on any MediaWiki installation.
index a22d802..95e3af7 100644 (file)
@@ -57,7 +57,7 @@ class MapCacheLRU {
         * @return void
         */
        public function set( $key, $value ) {
-               if ( isset( $this->cache[$key] ) ) {
+               if ( array_key_exists( $key, $this->cache ) ) {
                        $this->ping( $key ); // push to top
                } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
                        reset( $this->cache );
@@ -74,7 +74,7 @@ class MapCacheLRU {
         * @return bool
         */
        public function has( $key ) {
-               return isset( $this->cache[$key] );
+               return array_key_exists( $key, $this->cache );
        }
 
        /**
@@ -86,7 +86,7 @@ class MapCacheLRU {
         * @return mixed
         */
        public function get( $key ) {
-               if ( isset( $this->cache[$key] ) ) {
+               if ( array_key_exists( $key, $this->cache ) ) {
                        $this->ping( $key ); // push to top
                        return $this->cache[$key];
                } else {
index e34961c..99dafa6 100644 (file)
@@ -422,7 +422,7 @@ class MessageCache {
                        $this->mLoadedLanguages[$code] = true;
                }
                $info = implode( ', ', $where );
-               wfDebug( __METHOD__ . ": Loading $code... $info\n" );
+               wfDebugLog( 'MessageCache', __METHOD__ . ": Loading $code... $info\n" );
                wfProfileOut( __METHOD__ );
 
                return $success;
@@ -573,7 +573,7 @@ class MessageCache {
 
                // Update the message in the message blob store
                global $wgContLang;
-               MessageBlobStore::updateMessage( $wgContLang->lcfirst( $msg ) );
+               MessageBlobStore::getInstance()->updateMessage( $wgContLang->lcfirst( $msg ) );
 
                wfRunHooks( 'MessageCacheReplace', array( $title, $text ) );
 
diff --git a/includes/cache/bloom/BloomCache.php b/includes/cache/bloom/BloomCache.php
new file mode 100644 (file)
index 0000000..a15b461
--- /dev/null
@@ -0,0 +1,323 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Persistent bloom filter used to avoid expensive lookups
+ *
+ * @since 1.24
+ */
+abstract class BloomCache {
+       /** @var string Unique ID for key namespacing */
+       protected $cacheID;
+
+       /** @var array Map of (id => BloomCache) */
+       protected static $instances = array();
+
+       /**
+        * @param string $id
+        * @return BloomCache
+        */
+       final public static function get( $id ) {
+               global $wgBloomFilterStores;
+
+               if ( !isset( self::$instances[$id] ) ) {
+                       if ( isset( $wgBloomFilterStores[$id] ) ) {
+                               $class = $wgBloomFilterStores[$id]['class'];
+                               self::$instances[$id] = new $class( $wgBloomFilterStores[$id] );
+                       } else {
+                               wfDebug( "No bloom filter store '$id'; using EmptyBloomCache." );
+                               return new EmptyBloomCache( array() );
+                       }
+               }
+
+               return self::$instances[$id];
+       }
+
+       /**
+        * Create a new bloom cache instance from configuration.
+        * This should only be called from within BloomCache.
+        *
+        * @param array $config Parameters include:
+        *   - cacheID : Prefix to all bloom filter names that is unique to this cache.
+        *               It should only consist of alphanumberic, '-', and '_' characters.
+        *               This ID is what avoids collisions if multiple logical caches
+        *               use the same storage system, so this should be set carefully.
+        */
+       public function __construct( array $config ) {
+               $this->cacheID = $config['cacheId'];
+               if ( !preg_match( '!^[a-zA-Z0-9-_]{1,32}$!', $this->cacheID ) ) {
+                       throw new MWException( "Cache ID '{$this->cacheID}' is invalid." );
+               }
+       }
+
+       /**
+        * Check if a member is set in the bloom filter
+        *
+        * A member being set means that it *might* have been added.
+        * A member not being set means it *could not* have been added.
+        *
+        * This abstracts over isHit() to deal with filter updates and readiness.
+        * A class must exist with the name BloomFilter<type> and a static public
+        * mergeAndCheck() method. The later takes the following arguments:
+        *              (BloomCache $bcache, $domain, $virtualKey, array $status)
+        * The method should return a bool indicating whether to use the filter.
+        *
+        * The 'shared' bloom key must be used for any updates and will be used
+        * for the membership check if the method returns true. Since the key is shared,
+        * the method should never use delete(). The filter cannot be used in cases where
+        * membership in the filter needs to be taken away. In such cases, code *cannot*
+        * use this method - instead, it can directly use the other BloomCache methods
+        * to manage custom filters with their own keys (e.g. not 'shared').
+        *
+        * @param string $domain
+        * @param string $type
+        * @param string $member
+        * @return bool True if set, false if not (also returns true on error)
+        */
+       final public function check( $domain, $type, $member ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               if ( method_exists( "BloomFilter{$type}", 'mergeAndCheck' ) ) {
+                       try {
+                               $virtualKey = "$domain:$type";
+
+                               $status = $this->getStatus( $virtualKey );
+                               if ( $status == false ) {
+                                       wfDebug( "Could not query virtual bloom filter '$virtualKey'." );
+                                       return null;
+                               }
+
+                               $useFilter = call_user_func_array(
+                                       array( "BloomFilter{$type}", 'mergeAndCheck' ),
+                                       array( $this, $domain, $virtualKey, $status )
+                               );
+
+                               if ( $useFilter ) {
+                                       return ( $this->isHit( 'shared', "$virtualKey:$member" ) !== false );
+                               }
+                       } catch ( MWException $e ) {
+                               MWExceptionHandler::logException( $e );
+                               return true;
+                       }
+               }
+
+               return true;
+       }
+
+       /**
+        * Inform the bloom filter of a new member in order to keep it up to date
+        *
+        * @param string $domain
+        * @param string $type
+        * @param string|array $members
+        * @return bool Success
+        */
+       final public function insert( $domain, $type, $members ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               if ( method_exists( "BloomFilter{$type}", 'mergeAndCheck' ) ) {
+                       try {
+                               $virtualKey = "$domain:$type";
+                               $prefixedMembers = array();
+                               foreach ( (array)$members as $member ) {
+                                       $prefixedMembers[] = "$virtualKey:$member";
+                               }
+
+                               return $this->add( 'shared', $prefixedMembers );
+                       } catch ( MWException $e ) {
+                               MWExceptionHandler::logException( $e );
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
+       /**
+        * Create a new bloom filter at $key (if one does not exist yet)
+        *
+        * @param string $key
+        * @param integer $size Bit length [default: 1000000]
+        * @param float $precision [default: .001]
+        * @return bool Success
+        */
+       final public function init( $key, $size = 1000000, $precision = .001 ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doInit( "{$this->cacheID}:$key", $size, min( .1, $precision ) );
+       }
+
+       /**
+        * Add a member to the bloom filter at $key
+        *
+        * @param string $key
+        * @param string|array $members
+        * @return bool Success
+        */
+       final public function add( $key, $members ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doAdd( "{$this->cacheID}:$key", (array)$members );
+       }
+
+       /**
+        * Check if a member is set in the bloom filter.
+        *
+        * A member being set means that it *might* have been added.
+        * A member not being set means it *could not* have been added.
+        *
+        * If this returns true, then the caller usually should do the
+        * expensive check (whatever that may be). It can be avoided otherwise.
+        *
+        * @param string $key
+        * @param string $member
+        * @return bool|null True if set, false if not, null on error
+        */
+       final public function isHit( $key, $member ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doIsHit( "{$this->cacheID}:$key", $member );
+       }
+
+       /**
+        * Destroy a bloom filter at $key
+        *
+        * @param string $key
+        * @return bool Success
+        */
+       final public function delete( $key ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doDelete( "{$this->cacheID}:$key" );
+       }
+
+       /**
+        * Set the status map of the virtual bloom filter at $key
+        *
+        * @param string $virtualKey
+        * @param array $values Map including some of (lastID, asOfTime, epoch)
+        * @return bool Success
+        */
+       final public function setStatus( $virtualKey, array $values ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doSetStatus( "{$this->cacheID}:$virtualKey", $values );
+       }
+
+       /**
+        * Get the status map of the virtual bloom filter at $key
+        *
+        * The map includes:
+        *   - lastID    : the highest ID of the items merged in
+        *   - asOfTime  : UNIX timestamp that the filter is up-to-date as of
+        *   - epoch     : UNIX timestamp that filter started being populated
+        * Unset fields will have a null value.
+        *
+        * @param string $virtualKey
+        * @return array|bool False on failure
+        */
+       final public function getStatus( $virtualKey ) {
+               $section = new ProfileSection( get_class( $this ) . '::' . __FUNCTION__ );
+
+               return $this->doGetStatus( "{$this->cacheID}:$virtualKey" );
+       }
+
+       /**
+        * Get an exclusive lock on a filter for updates
+        *
+        * @param string $virtualKey
+        * @return ScopedCallback|ScopedLock|null Returns null if acquisition failed
+        */
+       public function getScopedLock( $virtualKey ) {
+               return null;
+       }
+
+       /**
+        * @param string $key
+        * @param integer $size Bit length
+        * @param float $precision
+        * @return bool Success
+        */
+       abstract protected function doInit( $key, $size, $precision );
+
+       /**
+        * @param string $key
+        * @param array $members
+        * @return bool Success
+        */
+       abstract protected function doAdd( $key, array $members );
+
+       /**
+        * @param string $key
+        * @param string $member
+        * @return bool|null
+        */
+       abstract protected function doIsHit( $key, $member );
+
+       /**
+        * @param string $key
+        * @return bool Success
+        */
+       abstract protected function doDelete( $key );
+
+       /**
+        * @param string $virtualKey
+        * @param array $values
+        * @return bool Success
+        */
+       abstract protected function doSetStatus( $virtualKey, array $values );
+
+       /**
+        * @param string $key
+        * @return array|bool
+        */
+       abstract protected function doGetStatus( $key );
+}
+
+class EmptyBloomCache extends BloomCache {
+       public function __construct( array $config ) {
+               parent::__construct( array( 'cacheId' => 'none' ) );
+       }
+
+       protected function doInit( $key, $size, $precision ) {
+               return true;
+       }
+
+       protected function doAdd( $key, array $members ) {
+               return true;
+       }
+
+       protected function doIsHit( $key, $member ) {
+               return true;
+       }
+
+       protected function doDelete( $key ) {
+               return true;
+       }
+
+       protected function doSetStatus( $virtualKey, array $values ) {
+               return true;
+       }
+
+       protected function doGetStatus( $virtualKey ) {
+               return array( 'lastID' => null, 'asOfTime' => null, 'epoch' => null );
+       }
+}
diff --git a/includes/cache/bloom/BloomCacheRedis.php b/includes/cache/bloom/BloomCacheRedis.php
new file mode 100644 (file)
index 0000000..583556f
--- /dev/null
@@ -0,0 +1,371 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Bloom filter implemented using Redis
+ *
+ * The Redis server must be >= 2.6 and should have volatile-lru or volatile-ttl
+ * if there is any eviction policy. It should not be allkeys-* in any case. Also,
+ * this can be used in a simple master/slave setup or with Redis Sentinel preferably.
+ *
+ * Some bits are based on https://github.com/ErikDubbelboer/redis-lua-scaling-bloom-filter
+ * but are simplified to use a single filter instead of up to 32 filters.
+ *
+ * @since 1.24
+ */
+class BloomCacheRedis extends BloomCache {
+       /** @var RedisConnectionPool */
+       protected $redisPool;
+       /** @var RedisLockManager */
+       protected $lockMgr;
+       /** @var array */
+       protected $servers;
+       /** @var integer Federate each filter into this many redis bitfield objects */
+       protected $segments = 128;
+
+       /**
+        * @params include:
+        *   - redisServers : list of servers (address:<port>) (the first is the master)
+        *   - redisConf    : additional redis configuration
+        *
+        * @param array $config
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+
+               $redisConf = $config['redisConfig'];
+               $redisConf['serializer'] = 'none'; // manage that in this class
+               $this->redisPool = RedisConnectionPool::singleton( $redisConf );
+               $this->servers = $config['redisServers'];
+               $this->lockMgr = new RedisLockManager( array(
+                       'lockServers'  => array( 'srv1' => $this->servers[0] ),
+                       'srvsByBucket' => array( 0 => array( 'srv1' ) ),
+                       'redisConfig'  => $config['redisConfig']
+               ) );
+       }
+
+       protected function doInit( $key, $size, $precision ) {
+               $conn = $this->getConnection( 'master' );
+               if ( !$conn ) {
+                       return false;
+               }
+
+               // 80000000 items at p = .001 take up 500MB and fit into one value.
+               // Do not hit the 512MB redis value limit by reducing the demands.
+               $size = min( $size, 80000000 * $this->segments );
+               $precision = max( round( $precision, 3 ), .001 );
+               $epoch = microtime( true );
+
+               static $script =
+<<<LUA
+               local kMetadata, kData = unpack(KEYS)
+               local aEntries, aPrec, aEpoch = unpack(ARGV)
+               if redis.call('EXISTS',kMetadata) == 0 or redis.call('EXISTS',kData) == 0 then
+                       redis.call('DEL',kMetadata)
+                       redis.call('HSET',kMetadata,'entries',aEntries)
+                       redis.call('HSET',kMetadata,'precision',aPrec)
+                       redis.call('HSET',kMetadata,'epoch',aEpoch)
+                       redis.call('SET',kData,'')
+                       return 1
+               end
+               return 0
+LUA;
+
+               $res = false;
+               try {
+                       $conn->script( 'load', $script );
+                       $conn->multi( Redis::MULTI );
+                       for ( $i = 0; $i < $this->segments; ++$i ) {
+                               $res = $conn->luaEval( $script,
+                                       array(
+                                               "$key:$i:bloom-metadata", # KEYS[1]
+                                               "$key:$i:bloom-data", # KEYS[2]
+                                               ceil( $size / $this->segments ), # ARGV[1]
+                                               $precision, # ARGV[2]
+                                               $epoch # ARGV[3]
+                                       ),
+                                       2 # number of first argument(s) that are keys
+                               );
+                       }
+                       $results = $conn->exec();
+                       $res = $results && !in_array( false, $results, true );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               return ( $res !== false );
+       }
+
+       protected function doAdd( $key, array $members ) {
+               $conn = $this->getConnection( 'master' );
+               if ( !$conn ) {
+                       return false;
+               }
+
+               static $script =
+<<<LUA
+               local kMetadata, kData = unpack(KEYS)
+               local aMember = unpack(ARGV)
+
+               -- Check if the filter was initialized
+               if redis.call('EXISTS',kMetadata) == 0 or redis.call('EXISTS',kData) == 0 then
+                       return false
+               end
+
+               -- Initial expected entries and desired precision
+               local entries = 1*redis.call('HGET',kMetadata,'entries')
+               local precision = 1*redis.call('HGET',kMetadata,'precision')
+               local hash = redis.sha1hex(aMember)
+
+               -- Based on the math from: http://en.wikipedia.org/wiki/Bloom_filter#Probability_of_false_positives
+               -- 0.480453013 = ln(2)^2
+               local bits = math.ceil((entries * math.log(precision)) / -0.480453013)
+
+               -- 0.693147180 = ln(2)
+               local k = math.floor(0.693147180 * bits / entries)
+
+               -- This uses a variation on:
+               -- 'Less Hashing, Same Performance: Building a Better Bloom Filter'
+               -- http://www.eecs.harvard.edu/~kirsch/pubs/bbbf/esa06.pdf
+               local h = { }
+               h[0] = tonumber(string.sub(hash, 1, 8 ), 16)
+               h[1] = tonumber(string.sub(hash, 9, 16), 16)
+               h[2] = tonumber(string.sub(hash, 17, 24), 16)
+               h[3] = tonumber(string.sub(hash, 25, 32), 16)
+
+               for i=1, k do
+                       local pos = (h[i % 2] + i * h[2 + (((i + (i % 2)) % 4) / 2)]) % bits
+                       redis.call('SETBIT', kData, pos, 1)
+               end
+
+               return 1
+LUA;
+
+               $res = false;
+               try {
+                       $conn->script( 'load', $script );
+                       $conn->multi( Redis::PIPELINE );
+                       foreach ( $members as $member ) {
+                               $i = $this->getSegment( $member );
+                               $conn->luaEval( $script,
+                                       array(
+                                               "$key:$i:bloom-metadata", # KEYS[1],
+                                               "$key:$i:bloom-data", # KEYS[2]
+                                               $member # ARGV[1]
+                                       ),
+                                       2 # number of first argument(s) that are keys
+                               );
+                       }
+                       $results = $conn->exec();
+                       $res = $results && !in_array( false, $results, true );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               if ( $res === false ) {
+                       wfDebug( "Could not add to the '$key' bloom filter; it may be missing." );
+               }
+
+               return ( $res !== false );
+       }
+
+       protected function doSetStatus( $virtualKey, array $values ) {
+               $conn = $this->getConnection( 'master' );
+               if ( !$conn ) {
+                       return null;
+               }
+
+               $res = false;
+               try {
+                       $res = $conn->hMSet( "$virtualKey:filter-metadata", $values );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               return ( $res !== false );
+       }
+
+       protected function doGetStatus( $virtualKey ) {
+               $conn = $this->getConnection( 'slave' );
+               if ( !$conn ) {
+                       return false;
+               }
+
+               $res = false;
+               try {
+                       $res = $conn->hGetAll( "$virtualKey:filter-metadata" );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               if ( is_array( $res ) ) {
+                       $res['lastID'] = isset( $res['lastID'] ) ? $res['lastID'] : null;
+                       $res['asOfTime'] = isset( $res['asOfTime'] ) ? $res['asOfTime'] : null;
+                       $res['epoch'] = isset( $res['epoch'] ) ? $res['epoch'] : null;
+               }
+
+               return $res;
+       }
+
+       protected function doIsHit( $key, $member ) {
+               $conn = $this->getConnection( 'slave' );
+               if ( !$conn ) {
+                       return null;
+               }
+
+               static $script =
+<<<LUA
+               local kMetadata, kData = unpack(KEYS)
+               local aMember = unpack(ARGV)
+
+               -- Check if the filter was initialized
+               if redis.call('EXISTS',kMetadata) == 0 or redis.call('EXISTS',kData) == 0 then
+                       return false
+               end
+
+               -- Initial expected entries and desired precision.
+               -- This determines the size of the first and subsequent filters.
+               local entries = redis.call('HGET',kMetadata,'entries')
+               local precision = redis.call('HGET',kMetadata,'precision')
+               local hash = redis.sha1hex(aMember)
+
+               -- This uses a variation on:
+               -- 'Less Hashing, Same Performance: Building a Better Bloom Filter'
+               -- http://www.eecs.harvard.edu/~kirsch/pubs/bbbf/esa06.pdf
+               local h = { }
+               h[0] = tonumber(string.sub(hash, 1, 8 ), 16)
+               h[1] = tonumber(string.sub(hash, 9, 16), 16)
+               h[2] = tonumber(string.sub(hash, 17, 24), 16)
+               h[3] = tonumber(string.sub(hash, 25, 32), 16)
+
+               -- 0.480453013 = ln(2)^2
+               local bits = math.ceil((entries * math.log(precision)) / -0.480453013)
+
+               -- 0.693147180 = ln(2)
+               local k = math.floor(0.693147180 * bits / entries)
+
+               local found = 1
+               for i=1, k do
+                       local pos = (h[i % 2] + i * h[2 + (((i + (i % 2)) % 4) / 2)]) % bits
+                       if redis.call('GETBIT', kData, pos) == 0 then
+                               found = 0
+                               break
+                       end
+               end
+
+               return found
+LUA;
+
+               $res = null;
+               try {
+                       $i = $this->getSegment( $member );
+                       $res = $conn->luaEval( $script,
+                               array(
+                                       "$key:$i:bloom-metadata", # KEYS[1],
+                                       "$key:$i:bloom-data", # KEYS[2]
+                                       $member # ARGV[1]
+                               ),
+                               2 # number of first argument(s) that are keys
+                       );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               return is_int( $res ) ? (bool)$res : null;
+       }
+
+       protected function doDelete( $key ) {
+               $conn = $this->getConnection( 'master' );
+               if ( !$conn ) {
+                       return false;
+               }
+
+               $res = false;
+               try {
+                       $keys = array();
+                       for ( $i = 0; $i < $this->segments; ++$i ) {
+                               $keys[] = "$key:$i:bloom-metadata";
+                               $keys[] = "$key:$i:bloom-data";
+                       }
+                       $res = $conn->delete( $keys );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+               }
+
+               return ( $res !== false );
+       }
+
+       public function getScopedLock( $virtualKey ) {
+               $status = Status::newGood();
+               return ScopedLock::factory( $this->lockMgr,
+                       array( $virtualKey ), LockManager::LOCK_EX, $status );
+       }
+
+       /**
+        * @param string $member
+        * @return integer
+        */
+       protected function getSegment( $member ) {
+               return hexdec( substr( md5( $member ), 0, 2 ) ) % $this->segments;
+       }
+
+       /**
+        * @param string $to (master/slave)
+        * @return RedisConnRef|bool Returns false on failure
+        */
+       protected function getConnection( $to ) {
+               if ( $to === 'master' ) {
+                       $conn = $this->redisPool->getConnection( $this->servers[0] );
+               } else {
+                       static $lastServer = null;
+
+                       $conn = false;
+                       if ( $lastServer ) {
+                               $conn = $this->redisPool->getConnection( $lastServer );
+                               if ( $conn ) {
+                                       return $conn; // reuse connection
+                               }
+                       }
+                       $servers = $this->servers;
+                       $attempts = min( 3, count( $servers ) );
+                       for ( $i = 1; $i <= $attempts; ++$i ) {
+                               $index = mt_rand( 0, count( $servers ) - 1 );
+                               $conn = $this->redisPool->getConnection( $servers[$index] );
+                               if ( $conn ) {
+                                       $lastServer = $servers[$index];
+                                       return $conn;
+                               }
+                               unset( $servers[$index] ); // skip next time
+                               $servers = array_values( $servers ); // reindex
+                       }
+               }
+
+               return $conn;
+       }
+
+       /**
+        * @param RedisConnRef $conn
+        * @param Exception $e
+        */
+       protected function handleException( RedisConnRef $conn, $e ) {
+               $this->redisPool->handleError( $conn, $e );
+       }
+}
diff --git a/includes/cache/bloom/BloomFilters.php b/includes/cache/bloom/BloomFilters.php
new file mode 100644 (file)
index 0000000..9b710d7
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * @since 1.24
+ */
+class BloomFilterTitleHasLogs {
+       public static function mergeAndCheck(
+               BloomCache $bcache, $domain, $virtualKey, array $status
+       ) {
+               $age = microtime( true ) - $status['asOfTime']; // seconds
+               $scopedLock = ( mt_rand( 1, (int)pow( 3, max( 0, 5 - $age ) ) ) == 1 )
+                       ? $bcache->getScopedLock( $virtualKey )
+                       : false;
+
+               if ( $scopedLock ) {
+                       $updates = self::merge( $bcache, $domain, $virtualKey, $status );
+                       if ( isset( $updates['asOfTime'] ) ) {
+                               $age = ( microtime( true ) - $updates['asOfTime'] );
+                       }
+               }
+
+               return ( $age < 30 );
+       }
+
+       public static function merge(
+               BloomCache $bcache, $domain, $virtualKey, array $status
+       ) {
+               $limit = 1000;
+               $dbr = wfGetDB( DB_SLAVE, array(), $domain );
+               $res = $dbr->select( 'logging',
+                       array( 'log_namespace', 'log_title', 'log_id', 'log_timestamp' ),
+                       array( 'log_id > ' . $dbr->addQuotes( (int)$status['lastID'] ) ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'log_id', 'LIMIT' => $limit )
+               );
+
+               $updates = array();
+               if ( $res->numRows() > 0 ) {
+                       $members = array();
+                       foreach ( $res as $row ) {
+                               $members[] = "$virtualKey:{$row->log_namespace}:{$row->log_title}";
+                       }
+                       $lastID = $row->log_id;
+                       $lastTime = $row->log_timestamp;
+                       if ( !$bcache->add( 'shared', $members ) ) {
+                               return false;
+                       }
+                       $updates['lastID'] = $lastID;
+                       $updates['asOfTime'] = wfTimestamp( TS_UNIX, $lastTime );
+               } else {
+                       $updates['asOfTime'] = microtime( true );
+               }
+
+               $updates['epoch'] = $status['epoch'] ?: microtime( true );
+
+               $bcache->setStatus( $virtualKey, $updates );
+
+               return $updates;
+       }
+}
index fb491e5..2d3b919 100644 (file)
@@ -180,6 +180,7 @@ class ChangesFeed {
        /**
         * Generate the feed items given a row from the database.
         * @param object $rows DatabaseBase resource with recentchanges rows
+        * @return array
         */
        public static function buildItems( $rows ) {
                wfProfileIn( __METHOD__ );
index 9b9c102..03d1289 100644 (file)
@@ -36,6 +36,9 @@ class ChangesList extends ContextSource {
        protected $rclistOpen;
        protected $rcMoveIndex;
 
+       /** @var MapCacheLRU */
+       protected $watchingCache;
+
        /**
         * Changeslist constructor
         *
@@ -50,6 +53,7 @@ class ChangesList extends ContextSource {
                        $this->skin = $obj;
                }
                $this->preCacheMessages();
+               $this->watchingCache = new MapCacheLRU( 50 );
        }
 
        /**
@@ -110,9 +114,8 @@ class ChangesList extends ContextSource {
         * @return string
         */
        public function recentChangesFlags( $flags, $nothing = '&#160;' ) {
-               global $wgRecentChangesFlags;
                $f = '';
-               foreach ( array_keys( $wgRecentChangesFlags ) as $flag ) {
+               foreach ( array_keys( $this->getConfig()->get( 'RecentChangesFlags' ) ) as $flag ) {
                        $f .= isset( $flags[$flag] ) && $flags[$flag]
                                ? self::flag( $flag )
                                : $nothing;
@@ -188,8 +191,6 @@ class ChangesList extends ContextSource {
         * @return string
         */
        public static function showCharacterDifference( $old, $new, IContextSource $context = null ) {
-               global $wgRCChangedSizeThreshold, $wgMiserMode;
-
                if ( !$context ) {
                        $context = RequestContext::getMain();
                }
@@ -199,10 +200,11 @@ class ChangesList extends ContextSource {
                $szdiff = $new - $old;
 
                $lang = $context->getLanguage();
+               $config = $context->getConfig();
                $code = $lang->getCode();
                static $fastCharDiff = array();
                if ( !isset( $fastCharDiff[$code] ) ) {
-                       $fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1';
+                       $fastCharDiff[$code] = $config->get( 'MiserMode' ) || $context->msg( 'rc-change-size' )->plain() === '$1';
                }
 
                $formattedSize = $lang->formatNum( $szdiff );
@@ -211,7 +213,7 @@ class ChangesList extends ContextSource {
                        $formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text();
                }
 
-               if ( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
+               if ( abs( $szdiff ) > abs( $config->get( 'RCChangedSizeThreshold' ) ) ) {
                        $tag = 'strong';
                } else {
                        $tag = 'span';
@@ -460,14 +462,14 @@ class ChangesList extends ContextSource {
         * @return string
         */
        protected function numberofWatchingusers( $count ) {
-               static $cache = array();
+               $cache = $this->watchingCache;
                if ( $count > 0 ) {
-                       if ( !isset( $cache[$count] ) ) {
-                               $cache[$count] = $this->msg( 'number_of_watching_users_RCview' )
-                                       ->numParams( $count )->escaped();
+                       if ( !$cache->has( $count ) ) {
+                               $cache->set( $count, $this->msg( 'number_of_watching_users_RCview' )
+                                       ->numParams( $count )->escaped() );
                        }
 
-                       return $cache[$count];
+                       return $cache->get( $count );
                } else {
                        return '';
                }
index 82e36d9..4ab7729 100644 (file)
@@ -160,8 +160,6 @@ class EnhancedChangesList extends ChangesList {
         * @return string
         */
        protected function recentChangesBlockGroup( $block ) {
-               global $wgRCShowChangedSize;
-
                wfProfileIn( __METHOD__ );
 
                # Add the namespace and title of the block as part of the class
@@ -191,6 +189,7 @@ class EnhancedChangesList extends ChangesList {
                $namehidden = true;
                $allLogs = true;
                $oldid = '';
+               $RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' );
                foreach ( $block as $rcObj ) {
                        $oldid = $rcObj->mAttribs['rc_last_oldid'];
                        if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
@@ -364,7 +363,7 @@ class EnhancedChangesList extends ChangesList {
                $r .= ' <span class="mw-changeslist-separator">. .</span> ';
 
                # Character difference (does not apply if only log items)
-               if ( $wgRCShowChangedSize && !$allLogs ) {
+               if ( $RCShowChangedSize && !$allLogs ) {
                        $last = 0;
                        $first = count( $block ) - 1;
                        # Some events (like logs) have an "empty" size, so we need to skip those...
@@ -442,7 +441,7 @@ class EnhancedChangesList extends ChangesList {
                        $r .= ' <span class="mw-changeslist-separator">. .</span> ';
 
                        # Character diff
-                       if ( $wgRCShowChangedSize ) {
+                       if ( $RCShowChangedSize ) {
                                $cd = $this->formatCharacterDifference( $rcObj );
                                if ( $cd !== '' ) {
                                        $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
@@ -481,8 +480,6 @@ class EnhancedChangesList extends ChangesList {
         * @return string A HTML formatted line (generated using $r)
         */
        protected function recentChangesBlockLine( $rcObj ) {
-               global $wgRCShowChangedSize;
-
                wfProfileIn( __METHOD__ );
                $query['curid'] = $rcObj->mAttribs['rc_cur_id'];
 
@@ -533,7 +530,7 @@ class EnhancedChangesList extends ChangesList {
                }
                $r .= ' <span class="mw-changeslist-separator">. .</span> ';
                # Character diff
-               if ( $wgRCShowChangedSize ) {
+               if ( $this->getConfig()->get( 'RCShowChangedSize' ) ) {
                        $cd = $this->formatCharacterDifference( $rcObj );
                        if ( $cd !== '' ) {
                                $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
index d590ff6..4eed926 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 class OldChangesList extends ChangesList {
+
        /**
         * Format a line using the old system (aka without any javascript).
         *
@@ -31,13 +32,8 @@ class OldChangesList extends ChangesList {
         * @return string|bool
         */
        public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
-               global $wgRCShowChangedSize;
                wfProfileIn( __METHOD__ );
 
-               # Should patrol-related stuff be shown?
-               $unpatrolled = $this->showAsUnpatrolled( $rc );
-
-               $s = '';
                $classes = array();
                // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
                if ( $linenumber ) {
@@ -53,20 +49,53 @@ class OldChangesList extends ChangesList {
                $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched
                        ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
 
+               $html = $this->formatChangeLine( $rc, $classes, $watched );
+
+               if ( $this->watchlist ) {
+                       $classes[] = Sanitizer::escapeClass( 'watchlist-' .
+                               $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
+               }
+
+               if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$html, $rc, &$classes ) ) ) {
+                       wfProfileOut( __METHOD__ );
+
+                       return false;
+               }
+
+               wfProfileOut( __METHOD__ );
+
+               $dateheader = ''; // $html now contains only <li>...</li>, for hooks' convenience.
+               $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
+
+               return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $html . "</li>\n";
+       }
+
+       /**
+        * @param RecentChange $rc
+        * @param string[] &$classes
+        * @param boolean $watched
+        *
+        * @return string
+        */
+       private function formatChangeLine( RecentChange $rc, array &$classes, $watched ) {
+               $html = '';
+
                if ( $rc->mAttribs['rc_log_type'] ) {
                        $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
-                       $this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] );
+                       $this->insertLog( $html, $logtitle, $rc->mAttribs['rc_log_type'] );
                // Log entries (old format) or log targets, and special pages
                } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
-                       list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
+                       list( $name, $htmlubpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
                        if ( $name == 'Log' ) {
-                               $this->insertLog( $s, $rc->getTitle(), $subpage );
+                               $this->insertLog( $html, $rc->getTitle(), $htmlubpage );
                        }
                // Regular entries
                } else {
-                       $this->insertDiffHist( $s, $rc, $unpatrolled );
+                       $unpatrolled = $this->showAsUnpatrolled( $rc );
+
+                       $this->insertDiffHist( $html, $rc, $unpatrolled );
                        # M, N, b and ! (minor, new, bot and unpatrolled)
-                       $s .= $this->recentChangesFlags(
+                       $html .= $this->recentChangesFlags(
                                array(
                                        'newpage' => $rc->mAttribs['rc_type'] == RC_NEW,
                                        'minor' => $rc->mAttribs['rc_minor'],
@@ -75,56 +104,40 @@ class OldChangesList extends ChangesList {
                                ),
                                ''
                        );
-                       $this->insertArticleLink( $s, $rc, $unpatrolled, $watched );
+                       $this->insertArticleLink( $html, $rc, $unpatrolled, $watched );
                }
                # Edit/log timestamp
-               $this->insertTimestamp( $s, $rc );
+               $this->insertTimestamp( $html, $rc );
                # Bytes added or removed
-               if ( $wgRCShowChangedSize ) {
+               if ( $this->getConfig()->get( 'RCShowChangedSize' ) ) {
                        $cd = $this->formatCharacterDifference( $rc );
                        if ( $cd !== '' ) {
-                               $s .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
+                               $html .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
                        }
                }
 
                if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
-                       $s .= $this->insertLogEntry( $rc );
+                       $html .= $this->insertLogEntry( $rc );
                } else {
                        # User tool links
-                       $this->insertUserRelatedLinks( $s, $rc );
+                       $this->insertUserRelatedLinks( $html, $rc );
                        # LTR/RTL direction mark
-                       $s .= $this->getLanguage()->getDirMark();
-                       $s .= $this->insertComment( $rc );
+                       $html .= $this->getLanguage()->getDirMark();
+                       $html .= $this->insertComment( $rc );
                }
 
                # Tags
-               $this->insertTags( $s, $rc, $classes );
+               $this->insertTags( $html, $rc, $classes );
                # Rollback
-               $this->insertRollback( $s, $rc );
+               $this->insertRollback( $html, $rc );
                # For subclasses
-               $this->insertExtra( $s, $rc, $classes );
+               $this->insertExtra( $html, $rc, $classes );
 
                # How many users watch this page
                if ( $rc->numberofWatchingusers > 0 ) {
-                       $s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
-               }
-
-               if ( $this->watchlist ) {
-                       $classes[] = Sanitizer::escapeClass( 'watchlist-' .
-                               $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
+                       $html .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
                }
 
-               if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$s, $rc, &$classes ) ) ) {
-                       wfProfileOut( __METHOD__ );
-
-                       return false;
-               }
-
-               wfProfileOut( __METHOD__ );
-
-               $dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
-               $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
-
-               return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $s . "</li>\n";
+               return $html;
        }
 }
index 68e90b4..38f589d 100644 (file)
@@ -37,11 +37,11 @@ interface Config {
        public function get( $name );
 
        /**
-        * Set a configuration variable such a "Sitename" to something like "My Wiki"
+        * Check whether a configuration option is set for the given name
         *
         * @param string $name Name of configuration option
-        * @param mixed $value Value to set
-        * @throws ConfigException
+        * @return bool
+        * @since 1.24
         */
-       public function set( $name, $value );
+       public function has( $name );
 }
index 312d461..12b0c39 100644 (file)
@@ -61,6 +61,7 @@ class ConfigFactory {
         * Destroy the default instance
         * Should only be called inside unit tests
         * @throws MWException
+        * @codeCoverageIgnore
         */
        public static function destroyDefaultInstance() {
                if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
index 0841a00..39d6e8e 100644 (file)
@@ -49,13 +49,25 @@ class GlobalVarConfig implements Config {
         * @see Config::get
         */
        public function get( $name ) {
+               if ( !$this->has( $name ) ) {
+                       throw new ConfigException( __METHOD__ . ": undefined option: '$name'" );
+               }
                return $this->getWithPrefix( $this->prefix, $name );
        }
 
        /**
-        * @see Config::set
+        * @see Config::has
+        */
+       public function has( $name ) {
+               return $this->hasWithPrefix( $this->prefix, $name );
+       }
+
+       /**
+        * @see MutableConfig::set
+        * @deprecated since 1.24
         */
        public function set( $name, $value ) {
+               wfDeprecated( __METHOD__, '1.24' );
                $this->setWithPrefix( $this->prefix, $name, $value );
        }
 
@@ -64,15 +76,22 @@ class GlobalVarConfig implements Config {
         *
         * @param string $prefix Prefix to use on the variable, if one.
         * @param string $name Variable name without prefix
-        * @throws ConfigException
         * @return mixed
         */
        protected function getWithPrefix( $prefix, $name ) {
+               return $GLOBALS[$prefix . $name];
+       }
+
+       /**
+        * Check if a variable with a given prefix is set
+        *
+        * @param string $prefix Prefix to use on the variable
+        * @param string $name Variable name without prefix
+        * @return bool
+        */
+       protected function hasWithPrefix( $prefix, $name ) {
                $var = $prefix . $name;
-               if ( !array_key_exists( $var, $GLOBALS ) ) {
-                       throw new ConfigException( __METHOD__ . ": undefined variable: '$var'" );
-               }
-               return $GLOBALS[$var];
+               return array_key_exists( $var, $GLOBALS );
        }
 
        /**
@@ -81,6 +100,7 @@ class GlobalVarConfig implements Config {
         * @param string $prefix Prefix to use on the variable
         * @param string $name Variable name without prefix
         * @param mixed $value Value to set
+        * @deprecated since 1.24
         */
        protected function setWithPrefix( $prefix, $name, $value ) {
                $GLOBALS[$prefix . $name] = $value;
diff --git a/includes/config/HashConfig.php b/includes/config/HashConfig.php
new file mode 100644 (file)
index 0000000..a09a0a4
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Copyright 2014
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * A Config instance which stores all settings as a member variable
+ *
+ * @since 1.24
+ */
+class HashConfig implements Config, MutableConfig {
+
+       /**
+        * Array of config settings
+        *
+        * @var array
+        */
+       private $settings;
+
+       /**
+        * @return HashConfig
+        */
+       public static function newInstance() {
+               return new HashConfig;
+       }
+
+       /**
+        * @param array $settings Any current settings to pre-load
+        */
+       public function __construct( array $settings = array() ) {
+               $this->settings = $settings;
+       }
+
+       /**
+        * @see Config::get
+        */
+       public function get( $name ) {
+               if ( !$this->has( $name ) ) {
+                       throw new ConfigException( __METHOD__ . ": undefined option: '$name'" );
+               }
+
+               return $this->settings[$name];
+       }
+
+       /**
+        * @see Config::has
+        */
+       public function has( $name ) {
+               return array_key_exists( $name, $this->settings );
+       }
+
+       /**
+        * @see Config::set
+        */
+       public function set( $name, $value ) {
+               $this->settings[$name] = $value;
+       }
+}
diff --git a/includes/config/MultiConfig.php b/includes/config/MultiConfig.php
new file mode 100644 (file)
index 0000000..cbb65aa
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Copyright 2014
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Provides a fallback sequence for Config objects
+ *
+ * @since 1.24
+ */
+class MultiConfig implements Config {
+
+       /**
+        * Array of Config objects to use
+        * Order matters, the Config objects
+        * will be checked in order to see
+        * whether they have the requested setting
+        *
+        * @var Config[]
+        */
+       private $configs;
+
+       /**
+        * @param Config[] $configs
+        */
+       public function __construct( array $configs ) {
+               $this->configs = $configs;
+       }
+
+       /**
+        * @see Config::get
+        */
+       public function get( $name ) {
+               foreach ( $this->configs as $config ) {
+                       if ( $config->has( $name ) ) {
+                               return $config->get( $name );
+                       }
+               }
+
+               throw new ConfigException( __METHOD__ . ": undefined option: '$name'" );
+       }
+
+       /**
+        * @see Config::has
+        */
+       public function has( $name ) {
+               foreach ( $this->configs as $config ) {
+                       if ( $config->has( $name ) ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+}
diff --git a/includes/config/MutableConfig.php b/includes/config/MutableConfig.php
new file mode 100644 (file)
index 0000000..e765e3b
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Copyright 2014
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Interface for mutable configuration instances
+ *
+ * @since 1.24
+ */
+interface MutableConfig {
+
+       /**
+        * Set a configuration variable such a "Sitename" to something like "My Wiki"
+        *
+        * @param string $name Name of configuration option
+        * @param mixed $value Value to set
+        * @throws ConfigException
+        */
+       public function set( $name, $value );
+}
index e09be56..cb39fac 100644 (file)
@@ -483,9 +483,16 @@ abstract class AbstractContent implements Content {
                if ( wfRunHooks( 'ContentGetParserOutput',
                        array( $this, $title, $revId, $options, $generateHtml, &$po ) ) ) {
 
+                       // Save and restore the old value, just in case something is reusing
+                       // the ParserOptions object in some weird way.
+                       $oldRedir = $options->getRedirectTarget();
+                       $options->setRedirectTarget( $this->getRedirectTarget() );
                        $this->fillParserOutput( $title, $revId, $options, $generateHtml, $po );
+                       $options->setRedirectTarget( $oldRedir );
                }
 
+               wfRunHooks( 'ContentAlterParserOutput', array( $this, $title, $po ) );
+
                return $po;
        }
 
@@ -503,7 +510,7 @@ abstract class AbstractContent implements Content {
         *
         * @param Title $title Context title for parsing
         * @param int|null $revId Revision ID (for {{REVISIONID}})
-        * @param ParserOptions|null $options Parser options
+        * @param ParserOptions $options Parser options
         * @param bool $generateHtml Whether or not to generate HTML
         * @param ParserOutput &$output The output object to fill (reference).
         *
diff --git a/includes/content/CodeContentHandler.php b/includes/content/CodeContentHandler.php
new file mode 100644 (file)
index 0000000..447a2a7
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Content handler for the pages with code, such as CSS, JavaScript, JSON.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Content
+ */
+
+/**
+ * Content handler for code content such as CSS, JavaScript, JSON, etc
+ * @since 1.24
+ * @ingroup Content
+ */
+abstract class CodeContentHandler extends TextContentHandler {
+
+       /**
+        * Returns the english language, because code is english, and should be handled as such.
+        *
+        * @param Title $title
+        * @param Content $content
+        *
+        * @return Language Return of wfGetLangObj( 'en' )
+        *
+        * @see ContentHandler::getPageLanguage()
+        */
+       public function getPageLanguage( Title $title, Content $content = null ) {
+               return wfGetLangObj( 'en' );
+       }
+
+       /**
+        * Returns the english language, because code is english, and should be handled as such.
+        *
+        * @param Title $title
+        * @param Content $content
+        *
+        * @return Language Return of wfGetLangObj( 'en' )
+        *
+        * @see ContentHandler::getPageViewLanguage()
+        */
+       public function getPageViewLanguage( Title $title, Content $content = null ) {
+               return wfGetLangObj( 'en' );
+       }
+
+       /**
+        * @return string
+        */
+       protected function getContentClass() {
+               throw new MWException( 'Subclass must override' );
+       }
+}
index c8a9f1e..ac41722 100644 (file)
@@ -743,9 +743,9 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param Content|string $oldContent The page's previous content.
-        * @param Content|string $myContent One of the page's conflicting contents.
-        * @param Content|string $yourContent One of the page's conflicting contents.
+        * @param Content $oldContent The page's previous content.
+        * @param Content $myContent One of the page's conflicting contents.
+        * @param Content $yourContent One of the page's conflicting contents.
         *
         * @return Content|bool Always false.
         */
index 2673084..8290603 100644 (file)
@@ -34,9 +34,10 @@ class CssContent extends TextContent {
 
        /**
         * @param string $text CSS code.
+        * @param string $modelId the content content model
         */
-       public function __construct( $text ) {
-               parent::__construct( $text, CONTENT_MODEL_CSS );
+       public function __construct( $text, $modelId = CONTENT_MODEL_CSS ) {
+               parent::__construct( $text, $modelId );
        }
 
        /**
@@ -58,7 +59,7 @@ class CssContent extends TextContent {
                $text = $this->getNativeData();
                $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
 
-               return new CssContent( $pst );
+               return new static( $pst );
        }
 
        /**
index fd326f0..b2a8676 100644 (file)
@@ -27,7 +27,7 @@
  * @since 1.21
  * @ingroup Content
  */
-class CssContentHandler extends TextContentHandler {
+class CssContentHandler extends CodeContentHandler {
 
        /**
         * @param string $modelId
@@ -36,55 +36,7 @@ class CssContentHandler extends TextContentHandler {
                parent::__construct( $modelId, array( CONTENT_FORMAT_CSS ) );
        }
 
-       /**
-        * @param string $text
-        * @param string $format
-        *
-        * @return CssContent
-        *
-        * @see ContentHandler::unserializeContent()
-        */
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-
-               return new CssContent( $text );
-       }
-
-       /**
-        * @return CssContent A new CssContent object with empty text.
-        *
-        * @see ContentHandler::makeEmptyContent()
-        */
-       public function makeEmptyContent() {
-               return new CssContent( '' );
-       }
-
-       /**
-        * Returns the english language, because CSS is english, and should be handled as such.
-        *
-        * @param Title $title
-        * @param Content $content
-        *
-        * @return Language Return of wfGetLangObj( 'en' )
-        *
-        * @see ContentHandler::getPageLanguage()
-        */
-       public function getPageLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
-       }
-
-       /**
-        * Returns the english language, because CSS is english, and should be handled as such.
-        *
-        * @param Title $title
-        * @param Content $content
-        *
-        * @return Language Return of wfGetLangObj( 'en' )
-        *
-        * @see ContentHandler::getPageViewLanguage()
-        */
-       public function getPageViewLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
+       protected function getContentClass() {
+               return 'CssContent';
        }
-
 }
diff --git a/includes/content/JSONContent.php b/includes/content/JSONContent.php
deleted file mode 100644 (file)
index e563780..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-/**
- * JSON Content Model
- *
- * @file
- *
- * @author Ori Livneh <ori@wikimedia.org>
- * @author Kunal Mehta <legoktm@gmail.com>
- */
-
-/**
- * Represents the content of a JSON content.
- * @since 1.24
- */
-class JSONContent extends TextContent {
-
-       public function __construct( $text, $modelId = CONTENT_MODEL_JSON ) {
-               parent::__construct( $text, $modelId );
-       }
-
-       /**
-        * Decodes the JSON into a PHP associative array.
-        * @return array
-        */
-       public function getJsonData() {
-               return FormatJson::decode( $this->getNativeData(), true );
-       }
-
-       /**
-        * @return bool Whether content is valid JSON.
-        */
-       public function isValid() {
-               return $this->getJsonData() !== null;
-       }
-
-       /**
-        * Pretty-print JSON
-        *
-        * @return bool|null|string
-        */
-       public function beautifyJSON() {
-               $decoded = FormatJson::decode( $this->getNativeData(), true );
-               if ( !is_array( $decoded ) ) {
-                       return null;
-               }
-               return FormatJson::encode( $decoded, true );
-
-       }
-
-       /**
-        * Beautifies JSON prior to save.
-        * @param Title $title Title
-        * @param User $user User
-        * @param ParserOptions $popts
-        * @return JSONContent
-        */
-       public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
-               return new static( $this->beautifyJSON() );
-       }
-
-       /**
-        * Set the HTML and add the appropriate styles
-        *
-        *
-        * @param Title $title
-        * @param int $revId
-        * @param ParserOptions $options
-        * @param bool $generateHtml
-        * @param ParserOutput $output
-        */
-       protected function fillParserOutput( Title $title, $revId,
-               ParserOptions $options, $generateHtml, ParserOutput &$output
-       ) {
-               if ( $generateHtml ) {
-                       $output->setText( $this->objectTable( $this->getJsonData() ) );
-                       $output->addModuleStyles( 'mediawiki.content.json' );
-               } else {
-                       $output->setText( '' );
-               }
-       }
-       /**
-        * Constructs an HTML representation of a JSON object.
-        * @param array $mapping
-        * @return string HTML
-        */
-       protected function objectTable( $mapping ) {
-               $rows = array();
-
-               foreach ( $mapping as $key => $val ) {
-                       $rows[] = $this->objectRow( $key, $val );
-               }
-               return Xml::tags( 'table', array( 'class' => 'mw-json' ),
-                       Xml::tags( 'tbody', array(), join( "\n", $rows ) )
-               );
-       }
-
-       /**
-        * Constructs HTML representation of a single key-value pair.
-        * @param string $key
-        * @param mixed $val
-        * @return string HTML.
-        */
-       protected function objectRow( $key, $val ) {
-               $th = Xml::elementClean( 'th', array(), $key );
-               if ( is_array( $val ) ) {
-                       $td = Xml::tags( 'td', array(), self::objectTable( $val ) );
-               } else {
-                       if ( is_string( $val ) ) {
-                               $val = '"' . $val . '"';
-                       } else {
-                               $val = FormatJson::encode( $val );
-                       }
-
-                       $td = Xml::elementClean( 'td', array( 'class' => 'value' ), $val );
-               }
-
-               return Xml::tags( 'tr', array(), $th . $td );
-       }
-
-}
diff --git a/includes/content/JSONContentHandler.php b/includes/content/JSONContentHandler.php
deleted file mode 100644 (file)
index 6b77527..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-/**
- * JSON Schema Content Handler
- *
- * @file
- *
- * @author Ori Livneh <ori@wikimedia.org>
- * @author Kunal Mehta <legoktm@gmail.com>
- */
-
-/**
- * @since 1.24
- */
-class JSONContentHandler extends TextContentHandler {
-
-       /**
-        * The class name of objects that should be created
-        *
-        * @var string
-        */
-       protected $contentClass = 'JSONContent';
-
-       public function __construct( $modelId = CONTENT_MODEL_JSON ) {
-               parent::__construct( $modelId, array( CONTENT_FORMAT_JSON ) );
-       }
-
-       /**
-        * Unserializes a JSONContent object.
-        *
-        * @param string $text Serialized form of the content
-        * @param null|string $format The format used for serialization
-        *
-        * @return JSONContent
-        */
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-               return new $this->contentClass( $text );
-       }
-
-       /**
-        * Creates an empty JSONContent object.
-        *
-        * @return JSONContent
-        */
-       public function makeEmptyContent() {
-               return new $this->contentClass( '' );
-       }
-
-       /**
-        * Returns the english language, because JSON is english, and should be handled as such.
-        *
-        * @param Title $title
-        * @param Content|null $content
-        *
-        * @return Language Return of wfGetLangObj( 'en' )
-        *
-        * @see ContentHandler::getPageLanguage()
-        */
-       public function getPageLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
-       }
-
-       /**
-        * Returns the english language, because JSON is english, and should be handled as such.
-        *
-        * @param Title $title
-        * @param Content|null $content
-        *
-        * @return Language Return of wfGetLangObj( 'en' )
-        *
-        * @see ContentHandler::getPageLanguage()
-        */
-       public function getPageViewLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
-       }
-}
index 442b705..c0194c2 100644 (file)
@@ -34,9 +34,10 @@ class JavaScriptContent extends TextContent {
 
        /**
         * @param string $text JavaScript code.
+        * @param string $modelId the content model name
         */
-       public function __construct( $text ) {
-               parent::__construct( $text, CONTENT_MODEL_JAVASCRIPT );
+       public function __construct( $text, $modelId = CONTENT_MODEL_JAVASCRIPT ) {
+               parent::__construct( $text, $modelId );
        }
 
        /**
@@ -57,7 +58,7 @@ class JavaScriptContent extends TextContent {
                $text = $this->getNativeData();
                $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
 
-               return new JavaScriptContent( $pst );
+               return new static( $pst );
        }
 
        /**
index 122003f..457b83d 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup Content
  * @todo make ScriptContentHandler base class, do highlighting stuff there?
  */
-class JavaScriptContentHandler extends TextContentHandler {
+class JavaScriptContentHandler extends CodeContentHandler {
 
        /**
         * @param string $modelId
@@ -36,55 +36,7 @@ class JavaScriptContentHandler extends TextContentHandler {
                parent::__construct( $modelId, array( CONTENT_FORMAT_JAVASCRIPT ) );
        }
 
-       /**
-        * @param string $text
-        * @param string $format
-        *
-        * @return JavaScriptContent
-        *
-        * @see ContentHandler::unserializeContent()
-        */
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-
-               return new JavaScriptContent( $text );
-       }
-
-       /**
-        * @return JavaScriptContent A new JavaScriptContent object with empty text.
-        *
-        * @see ContentHandler::makeEmptyContent()
-        */
-       public function makeEmptyContent() {
-               return new JavaScriptContent( '' );
-       }
-
-       /**
-        * Returns the english language, because JS is english, and should be handled as such.
-        *
-        * @param Title $title
-        * @param Content $content
-        *
-        * @return Language Return of wfGetLangObj( 'en' )
-        *
-        * @see ContentHandler::getPageLanguage()
-        */
-       public function getPageLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
-       }
-
-       /**
-        * Returns the english language, because JS is english, and should be handled as such.
-        *
-        * @param Title $title
-        * @param Content $content
-        *
-        * @return Language Return of wfGetLangObj( 'en' )
-        *
-        * @see ContentHandler::getPageViewLanguage()
-        */
-       public function getPageViewLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
+       protected function getContentClass() {
+               return 'JavaScriptContent';
        }
-
 }
diff --git a/includes/content/JsonContent.php b/includes/content/JsonContent.php
new file mode 100644 (file)
index 0000000..b36827c
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+/**
+ * JSON Content Model
+ *
+ * @file
+ *
+ * @author Ori Livneh <ori@wikimedia.org>
+ * @author Kunal Mehta <legoktm@gmail.com>
+ */
+
+/**
+ * Represents the content of a JSON content.
+ * @since 1.24
+ */
+class JsonContent extends TextContent {
+
+       public function __construct( $text, $modelId = CONTENT_MODEL_JSON ) {
+               parent::__construct( $text, $modelId );
+       }
+
+       /**
+        * Decodes the JSON into a PHP associative array.
+        * @return array
+        */
+       public function getJsonData() {
+               return FormatJson::decode( $this->getNativeData(), true );
+       }
+
+       /**
+        * @return bool Whether content is valid JSON.
+        */
+       public function isValid() {
+               return $this->getJsonData() !== null;
+       }
+
+       /**
+        * Pretty-print JSON
+        *
+        * @return bool|null|string
+        */
+       public function beautifyJSON() {
+               $decoded = FormatJson::decode( $this->getNativeData(), true );
+               if ( !is_array( $decoded ) ) {
+                       return null;
+               }
+               return FormatJson::encode( $decoded, true );
+
+       }
+
+       /**
+        * Beautifies JSON prior to save.
+        * @param Title $title Title
+        * @param User $user User
+        * @param ParserOptions $popts
+        * @return JsonContent
+        */
+       public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+               return new static( $this->beautifyJSON() );
+       }
+
+       /**
+        * Set the HTML and add the appropriate styles
+        *
+        *
+        * @param Title $title
+        * @param int $revId
+        * @param ParserOptions $options
+        * @param bool $generateHtml
+        * @param ParserOutput $output
+        */
+       protected function fillParserOutput( Title $title, $revId,
+               ParserOptions $options, $generateHtml, ParserOutput &$output
+       ) {
+               if ( $generateHtml ) {
+                       $output->setText( $this->objectTable( $this->getJsonData() ) );
+                       $output->addModuleStyles( 'mediawiki.content.json' );
+               } else {
+                       $output->setText( '' );
+               }
+       }
+       /**
+        * Constructs an HTML representation of a JSON object.
+        * @param array $mapping
+        * @return string HTML
+        */
+       protected function objectTable( $mapping ) {
+               $rows = array();
+
+               foreach ( $mapping as $key => $val ) {
+                       $rows[] = $this->objectRow( $key, $val );
+               }
+               return Xml::tags( 'table', array( 'class' => 'mw-json' ),
+                       Xml::tags( 'tbody', array(), join( "\n", $rows ) )
+               );
+       }
+
+       /**
+        * Constructs HTML representation of a single key-value pair.
+        * @param string $key
+        * @param mixed $val
+        * @return string HTML.
+        */
+       protected function objectRow( $key, $val ) {
+               $th = Xml::elementClean( 'th', array(), $key );
+               if ( is_array( $val ) ) {
+                       $td = Xml::tags( 'td', array(), self::objectTable( $val ) );
+               } else {
+                       if ( is_string( $val ) ) {
+                               $val = '"' . $val . '"';
+                       } else {
+                               $val = FormatJson::encode( $val );
+                       }
+
+                       $td = Xml::elementClean( 'td', array( 'class' => 'value' ), $val );
+               }
+
+               return Xml::tags( 'tr', array(), $th . $td );
+       }
+
+}
diff --git a/includes/content/JsonContentHandler.php b/includes/content/JsonContentHandler.php
new file mode 100644 (file)
index 0000000..392ce37
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+/**
+ * JSON Schema Content Handler
+ *
+ * @file
+ *
+ * @author Ori Livneh <ori@wikimedia.org>
+ * @author Kunal Mehta <legoktm@gmail.com>
+ */
+
+/**
+ * @since 1.24
+ */
+class JsonContentHandler extends CodeContentHandler {
+
+       public function __construct( $modelId = CONTENT_MODEL_JSON ) {
+               parent::__construct( $modelId, array( CONTENT_FORMAT_JSON ) );
+       }
+
+       /**
+        * @return string
+        */
+       protected function getContentClass() {
+               return 'JsonContent';
+       }
+}
index abaac53..5b84657 100644 (file)
@@ -29,7 +29,7 @@
  * Wrapper allowing us to handle a system message as a Content object.
  * Note that this is generally *not* used to represent content from the
  * MediaWiki namespace, and that there is no MessageContentHandler.
- * MessageContent is just intended as glue for wrapping a message programatically.
+ * MessageContent is just intended as glue for wrapping a message programmatically.
  *
  * @ingroup Content
  */
@@ -106,7 +106,7 @@ class MessageContent extends AbstractContent {
        }
 
        /**
-        * @param int $maxLength Maximum length of the summary text, defaults to 250.
+        * @param int $maxlength Maximum length of the summary text, defaults to 250.
         *
         * @return string The summary text.
         *
@@ -165,6 +165,8 @@ class MessageContent extends AbstractContent {
                }
 
                $po = new ParserOutput( $html );
+               // Message objects are in the user language.
+               $po->recordOption( 'userlang' );
 
                return $po;
        }
index d292880..c479f20 100644 (file)
@@ -160,7 +160,7 @@ class TextContent extends AbstractContent {
                $text = $this->getNativeData();
                $pst = rtrim( $text );
 
-               return ( $text === $pst ) ? $this : new static( $pst );
+               return ( $text === $pst ) ? $this : new static( $pst, $this->getModel() );
        }
 
        /**
index b728d31..ffe1acb 100644 (file)
@@ -60,9 +60,9 @@ class TextContentHandler extends ContentHandler {
         *
         * This text-based implementation uses wfMerge().
         *
-        * @param Content|string $oldContent The page's previous content.
-        * @param Content|string $myContent One of the page's conflicting contents.
-        * @param Content|string $yourContent One of the page's conflicting contents.
+        * @param Content $oldContent The page's previous content.
+        * @param Content $myContent One of the page's conflicting contents.
+        * @param Content $yourContent One of the page's conflicting contents.
         *
         * @return Content|bool
         */
@@ -92,6 +92,19 @@ class TextContentHandler extends ContentHandler {
                return $mergedContent;
        }
 
+       /**
+        * Returns the name of the associated Content class, to
+        * be used when creating new objects. Override expected
+        * by subclasses.
+        *
+        * @since 1.24
+        *
+        * @return string
+        */
+       protected function getContentClass() {
+               return 'TextContent';
+       }
+
        /**
         * Unserializes a Content object of the type supported by this ContentHandler.
         *
@@ -105,7 +118,8 @@ class TextContentHandler extends ContentHandler {
        public function unserializeContent( $text, $format = null ) {
                $this->checkFormat( $format );
 
-               return new TextContent( $text );
+               $class = $this->getContentClass();
+               return new $class( $text );
        }
 
        /**
@@ -116,7 +130,8 @@ class TextContentHandler extends ContentHandler {
         * @return Content A new TextContent object with empty text.
         */
        public function makeEmptyContent() {
-               return new TextContent( '' );
+               $class = $this->getContentClass();
+               return new $class( '' );
        }
 
 }
index 237029b..9a8ab3a 100644 (file)
@@ -31,6 +31,7 @@
  * @ingroup Content
  */
 class WikitextContent extends TextContent {
+       private $redirectTargetAndText = null;
 
        public function __construct( $text ) {
                parent::__construct( $text, CONTENT_MODEL_WIKITEXT );
@@ -52,7 +53,7 @@ class WikitextContent extends TextContent {
                if ( $sect === false ) {
                        return false;
                } else {
-                       return new WikitextContent( $sect );
+                       return new static( $sect );
                }
        }
 
@@ -104,7 +105,7 @@ class WikitextContent extends TextContent {
                        $text = $wgParser->replaceSection( $oldtext, $sectionId, $text );
                }
 
-               $newContent = new WikitextContent( $text );
+               $newContent = new static( $text );
 
                wfProfileOut( __METHOD__ );
 
@@ -125,7 +126,7 @@ class WikitextContent extends TextContent {
                $text .= "\n\n";
                $text .= $this->getNativeData();
 
-               return new WikitextContent( $text );
+               return new static( $text );
        }
 
        /**
@@ -145,7 +146,7 @@ class WikitextContent extends TextContent {
                $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
                rtrim( $pst );
 
-               return ( $text === $pst ) ? $this : new WikitextContent( $pst );
+               return ( $text === $pst ) ? $this : new static( $pst );
        }
 
        /**
@@ -164,7 +165,7 @@ class WikitextContent extends TextContent {
                $text = $this->getNativeData();
                $plt = $wgParser->getPreloadText( $text, $title, $popts, $params );
 
-               return new WikitextContent( $plt );
+               return new static( $plt );
        }
 
        /**
@@ -178,10 +179,17 @@ class WikitextContent extends TextContent {
         */
        protected function getRedirectTargetAndText() {
                global $wgMaxRedirects;
+
+               if ( $this->redirectTargetAndText !== null ) {
+                       return $this->redirectTargetAndText;
+               }
+
                if ( $wgMaxRedirects < 1 ) {
                        // redirects are disabled, so quit early
-                       return array( null, $this->getNativeData() );
+                       $this->redirectTargetAndText = array( null, $this->getNativeData() );
+                       return $this->redirectTargetAndText;
                }
+
                $redir = MagicWord::get( 'redirect' );
                $text = ltrim( $this->getNativeData() );
                if ( $redir->matchStartAndRemove( $text ) ) {
@@ -199,14 +207,17 @@ class WikitextContent extends TextContent {
                                $title = Title::newFromText( $m[1] );
                                // If the title is a redirect to bad special pages or is invalid, return null
                                if ( !$title instanceof Title || !$title->isValidRedirectTarget() ) {
-                                       return array( null, $this->getNativeData() );
+                                       $this->redirectTargetAndText = array( null, $this->getNativeData() );
+                                       return $this->redirectTargetAndText;
                                }
 
-                               return array( $title, substr( $text, strlen( $m[0] ) ) );
+                               $this->redirectTargetAndText = array( $title, substr( $text, strlen( $m[0] ) ) );
+                               return $this->redirectTargetAndText;
                        }
                }
 
-               return array( null, $this->getNativeData() );
+               $this->redirectTargetAndText = array( null, $this->getNativeData() );
+               return $this->redirectTargetAndText;
        }
 
        /**
@@ -246,7 +257,7 @@ class WikitextContent extends TextContent {
                        '[[' . $target->getFullText() . ']]',
                        $this->getNativeData(), 1 );
 
-               return new WikitextContent( $newText );
+               return new static( $newText );
        }
 
        /**
@@ -336,6 +347,7 @@ class WikitextContent extends TextContent {
                                        Article::getRedirectHeaderHtml( $title->getPageLanguage(), $chain, false ) .
                                        $output->getText()
                                );
+                               $output->addModuleStyles( 'mediawiki.action.view.redirectPage' );
                        }
                }
        }
index 5ae3e25..c1db1de 100644 (file)
@@ -34,19 +34,8 @@ class WikitextContentHandler extends TextContentHandler {
                parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT ) );
        }
 
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-
-               return new WikitextContent( $text );
-       }
-
-       /**
-        * @return Content A new WikitextContent object with empty text.
-        *
-        * @see ContentHandler::makeEmptyContent
-        */
-       public function makeEmptyContent() {
-               return new WikitextContent( '' );
+       protected function getContentClass() {
+               return 'WikitextContent';
        }
 
        /**
@@ -79,7 +68,8 @@ class WikitextContentHandler extends TextContentHandler {
                        $redirectText .= "\n" . $text;
                }
 
-               return new WikitextContent( $redirectText );
+               $class = $this->getContentClass();
+               return new $class( $redirectText );
        }
 
        /**
index 00733d8..059f18c 100644 (file)
@@ -123,10 +123,10 @@ class RequestContext implements IContextSource {
        /**
         * Set the Title object
         *
-        * @param Title $t
+        * @param Title $title
         */
-       public function setTitle( Title $t ) {
-               $this->title = $t;
+       public function setTitle( Title $title ) {
+               $this->title = $title;
                // Erase the WikiPage so a new one with the new title gets created.
                $this->wikipage = null;
        }
@@ -140,11 +140,22 @@ class RequestContext implements IContextSource {
                if ( $this->title === null ) {
                        global $wgTitle; # fallback to $wg till we can improve this
                        $this->title = $wgTitle;
+                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetCaller() . ' with no title set.' );
                }
 
                return $this->title;
        }
 
+       /**
+        * Check, if a Title object is set
+        *
+        * @since 1.25
+        * @return bool
+        */
+       public function hasTitle() {
+               return $this->title !== null;
+       }
+
        /**
         * Check whether a WikiPage object can be get with getWikiPage().
         * Callers should expect that an exception is thrown from getWikiPage()
@@ -297,7 +308,7 @@ class RequestContext implements IContextSource {
                        $e = new Exception;
                        wfDebugLog( 'recursion-guard', "Recursion detected:\n" . $e->getTraceAsString() );
 
-                       $code = $this->getConfig()->get( 'LanguageCode' ) ? : 'en';
+                       $code = $this->getConfig()->get( 'LanguageCode' ) ?: 'en';
                        $this->lang = Language::factory( $code );
                } elseif ( $this->lang === null ) {
                        $this->recursion = true;
@@ -421,6 +432,21 @@ class RequestContext implements IContextSource {
                return self::$instance;
        }
 
+       /**
+        * Get the RequestContext object associated with the main request
+        * and gives a warning to the log, to find places, where a context maybe is missing.
+        *
+        * @param string $func
+        * @return RequestContext
+        * @since 1.24
+        */
+       public static function getMainAndWarn( $func = __METHOD__ ) {
+               wfDebug( $func . ' called without context. ' .
+                       "Using RequestContext::getMain() for sanity\n" );
+
+               return self::getMain();
+       }
+
        /**
         * Resets singleton returned by getMain(). Should be called only from unit tests.
         */
@@ -448,10 +474,14 @@ class RequestContext implements IContextSource {
        }
 
        /**
-        * Import the resolved user IP, HTTP headers, user ID, and session ID.
+        * Import an client IP address, HTTP headers, user ID, and session ID
+        *
         * This sets the current session and sets $wgUser and $wgRequest.
         * Once the return value falls out of scope, the old context is restored.
-        * This function can only be called within CLI mode scripts.
+        * This method should only be called in contexts (CLI or HTTP job runners)
+        * where there is no session ID or end user receiving the response. This
+        * is partly enforced, and is done so to avoid leaking cookies if certain
+        * error conditions arise.
         *
         * This will setup the session from the given ID. This is useful when
         * background scripts inherit context when acting on behalf of a user.
@@ -464,11 +494,12 @@ class RequestContext implements IContextSource {
         * @since 1.21
         */
        public static function importScopedSession( array $params ) {
-               if ( PHP_SAPI !== 'cli' ) {
-                       // Don't send random private cookies or turn $wgRequest into FauxRequest
-                       throw new MWException( "Sessions can only be imported in cli mode." );
-               } elseif ( !strlen( $params['sessionId'] ) ) {
-                       throw new MWException( "No session ID was specified." );
+               if ( session_id() != '' && strlen( $params['sessionId'] ) ) {
+                       // Sanity check to avoid sending random cookies for the wrong users.
+                       // This method should only called by CLI scripts or by HTTP job runners.
+                       throw new MWException( "Sessions can only be imported when none is active." );
+               } elseif ( !IP::isValid( $params['ip'] ) ) {
+                       throw new MWException( "Invalid client IP address '{$params['ip']}'." );
                }
 
                if ( $params['userId'] ) { // logged-in user
@@ -477,13 +508,11 @@ class RequestContext implements IContextSource {
                        if ( !$user->getId() ) {
                                throw new MWException( "No user with ID '{$params['userId']}'." );
                        }
-               } elseif ( !IP::isValid( $params['ip'] ) ) {
-                       throw new MWException( "Could not load user '{$params['ip']}'." );
                } else { // anon user
                        $user = User::newFromName( $params['ip'], false );
                }
 
-               $importSessionFunction = function ( User $user, array $params ) {
+               $importSessionFunc = function ( User $user, array $params ) {
                        global $wgRequest, $wgUser;
 
                        $context = RequestContext::getMain();
@@ -516,12 +545,19 @@ class RequestContext implements IContextSource {
                // Stash the old session and load in the new one
                $oUser = self::getMain()->getUser();
                $oParams = self::getMain()->exportSession();
-               $importSessionFunction( $user, $params );
+               $oRequest = self::getMain()->getRequest();
+               $importSessionFunc( $user, $params );
 
                // Set callback to save and close the new session and reload the old one
-               return new ScopedCallback( function () use ( $importSessionFunction, $oUser, $oParams ) {
-                       $importSessionFunction( $oUser, $oParams );
-               } );
+               return new ScopedCallback(
+                       function () use ( $importSessionFunc, $oUser, $oParams, $oRequest ) {
+                               global $wgRequest;
+                               $importSessionFunc( $oUser, $oParams );
+                               // Restore the exact previous Request object (instead of leaving FauxRequest)
+                               RequestContext::getMain()->setRequest( $oRequest );
+                               $wgRequest = RequestContext::getMain()->getRequest(); // b/c
+                       }
+               );
        }
 
        /**
index 62d64eb..29642d0 100644 (file)
@@ -272,9 +272,20 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Either a short hexidecimal string if a transaction is active or ""
         *
         * @var string
+        * @see DatabaseBase::mTrxLevel
         */
        protected $mTrxShortId = '';
 
+       /**
+        * The UNIX time that the transaction started. Callers can assume that if
+        * snapshot isolation is used, then the data is *at least* up to date to that
+        * point (possibly more up-to-date since the first SELECT defines the snapshot).
+        *
+        * @var float|null
+        * @see DatabaseBase::mTrxLevel
+        */
+       private $mTrxTimestamp = null;
+
        /**
         * Remembers the function name given for starting the most recent transaction via begin().
         * Used to provide additional context for error reporting.
@@ -419,6 +430,19 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                return $this->mTrxLevel;
        }
 
+       /**
+        * Get the UNIX timestamp of the time that the transaction was established
+        *
+        * This can be used to reason about the staleness of SELECT data
+        * in REPEATABLE-READ transaction isolation level.
+        *
+        * @return float|null Returns null if there is not active transaction
+        * @since 1.25
+        */
+       public function trxTimestamp() {
+               return $this->mTrxLevel ? $this->mTrxTimestamp : null;
+       }
+
        /**
         * Get/set the number of errors logged. Only useful when errors are ignored
         * @param int $count The count to set, or omitted to leave it unchanged.
@@ -679,8 +703,6 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *   - DBO_DEBUG: output some debug info (same as debug())
         *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
         *   - DBO_TRX: automatically start transactions
-        *   - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
-        *       and removes it in command line mode
         *   - DBO_PERSISTENT: use persistant database connection
         * @return bool
         */
@@ -710,19 +732,42 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * Return a path to the DBMS-specific schema file, otherwise default to tables.sql
+        * Return a path to the DBMS-specific SQL file if it exists,
+        * otherwise default SQL file
         *
+        * @param string $filename
         * @return string
         */
-       public function getSchemaPath() {
+       private function getSqlFilePath( $filename ) {
                global $IP;
-               if ( file_exists( "$IP/maintenance/" . $this->getType() . "/tables.sql" ) ) {
-                       return "$IP/maintenance/" . $this->getType() . "/tables.sql";
+               $dbmsSpecificFilePath = "$IP/maintenance/" . $this->getType() . "/$filename";
+               if ( file_exists( $dbmsSpecificFilePath ) ) {
+                       return $dbmsSpecificFilePath;
                } else {
-                       return "$IP/maintenance/tables.sql";
+                       return "$IP/maintenance/$filename";
                }
        }
 
+       /**
+        * Return a path to the DBMS-specific schema file,
+        * otherwise default to tables.sql
+        *
+        * @return string
+        */
+       public function getSchemaPath() {
+               return $this->getSqlFilePath( 'tables.sql' );
+       }
+
+       /**
+        * Return a path to the DBMS-specific update key file,
+        * otherwise default to update-keys.sql
+        *
+        * @return string
+        */
+       public function getUpdateKeysPath() {
+               return $this->getSqlFilePath( 'update-keys.sql' );
+       }
+
 # ------------------------------------------------------------------------------
 # Other functions
 # ------------------------------------------------------------------------------
@@ -1130,7 +1175,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $this->mTrxIdleCallbacks = array(); // bug 65263
                        $this->mTrxPreCommitCallbacks = array(); // bug 65263
                        wfDebug( "Connection lost, reconnecting...\n" );
-
+                       # Stash the last error values since ping() might clear them
+                       $lastError = $this->lastError();
+                       $lastErrno = $this->lastErrno();
                        if ( $this->ping() ) {
                                global $wgRequestTime;
                                wfDebug( "Reconnected\n" );
@@ -1145,6 +1192,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                                if ( $hadTrx ) {
                                        # Leave $ret as false and let an error be reported.
                                        # Callers may catch the exception and continue to use the DB.
+                                       $this->reportQueryError( $lastError, $lastErrno, $sql, $fname, $tempIgnore );
                                } else {
                                        # Should be safe to silently retry (no trx and thus no callbacks)
                                        $ret = $this->doQuery( $commentedSql );
@@ -1728,7 +1776,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * Estimate rows in dataset.
+        * Estimate the number of rows in dataset
         *
         * MySQL allows you to estimate the number of rows that would be returned
         * by a SELECT query, using EXPLAIN SELECT. The estimate is provided using
@@ -1747,8 +1795,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param array $options Options for select
         * @return int Row count
         */
-       public function estimateRowCount( $table, $vars = '*', $conds = '',
-               $fname = __METHOD__, $options = array()
+       public function estimateRowCount(
+               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
        ) {
                $rows = 0;
                $res = $this->select( $table, array( 'rowcount' => 'COUNT(*)' ), $conds, $fname, $options );
@@ -1761,6 +1809,36 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                return $rows;
        }
 
+       /**
+        * Get the number of rows in dataset
+        *
+        * This is useful when trying to do COUNT(*) but with a LIMIT for performance.
+        *
+        * Takes the same arguments as DatabaseBase::select().
+        *
+        * @param string $table Table name
+        * @param string $vars Unused
+        * @param array|string $conds Filters on the table
+        * @param string $fname Function name for profiling
+        * @param array $options Options for select
+        * @return int Row count
+        * @since 1.24
+        */
+       public function selectRowCount(
+               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
+       ) {
+               $rows = 0;
+               $sql = $this->selectSQLText( $table, '1', $conds, $fname, $options );
+               $res = $this->query( "SELECT COUNT(*) AS rowcount FROM ($sql) tmp_count" );
+
+               if ( $res ) {
+                       $row = $this->fetchRow( $res );
+                       $rows = ( isset( $row['rowcount'] ) ) ? $row['rowcount'] : 0;
+               }
+
+               return $rows;
+       }
+
        /**
         * Removes most variables from an SQL query and replaces them with X or N for numbers.
         * It's only slightly flawed. Don't use for anything important.
@@ -3458,6 +3536,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                }
 
                $this->doBegin( $fname );
+               $this->mTrxTimestamp = microtime( true );
                $this->mTrxFname = $fname;
                $this->mTrxDoneWrites = false;
                $this->mTrxAutomatic = false;
@@ -4198,6 +4277,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * @since 1.19
+        * @return string
         */
        public function __toString() {
                return (string)$this->mConn;
index 8229c99..2dfec41 100644 (file)
@@ -306,7 +306,7 @@ EOT;
                        }
                }
 
-               $cache = HTMLFileCache::newFromTitle( $t, 'view' );
+               $cache = new HTMLFileCache( $t, 'view' );
                if ( $cache->isCached() ) {
                        return $cache->fetchText();
                } else {
index 3a4bb27..ab8d366 100644 (file)
@@ -228,7 +228,7 @@ class DatabaseMssql extends DatabaseBase {
 
                                if ( $success ) {
                                        $this->mAffectedRows = 0;
-                                       return true;
+                                       return $stmt;
                                }
                        }
                }
@@ -415,10 +415,8 @@ class DatabaseMssql extends DatabaseBase {
                        }
                        $this->mScrollableCursor = true;
                        $this->mPrepareStatements = true;
-
                        return $ret;
                }
-
                return $this->query( $sql, $fname );
        }
 
@@ -614,6 +612,13 @@ class DatabaseMssql extends DatabaseBase {
                // Determine binary/varbinary fields so we can encode data as a hex string like 0xABCDEF
                $binaryColumns = $this->getBinaryColumns( $table );
 
+               // INSERT IGNORE is not supported by SQL Server
+               // remove IGNORE from options list and set ignore flag to true
+               if ( in_array( 'IGNORE', $options ) ) {
+                       $options = array_diff( $options, array( 'IGNORE' ) );
+                       $this->mIgnoreDupKeyErrors = true;
+               }
+
                foreach ( $arrToInsert as $a ) {
                        // start out with empty identity column, this is so we can return
                        // it as a result of the insert logic
@@ -645,14 +650,6 @@ class DatabaseMssql extends DatabaseBase {
 
                        $keys = array_keys( $a );
 
-                       // INSERT IGNORE is not supported by SQL Server
-                       // remove IGNORE from options list and set ignore flag to true
-                       $ignoreClause = false;
-                       if ( in_array( 'IGNORE', $options ) ) {
-                               $options = array_diff( $options, array( 'IGNORE' ) );
-                               $this->mIgnoreDupKeyErrors = true;
-                       }
-
                        // Build the actual query
                        $sql = $sqlPre . 'INSERT ' . implode( ' ', $options ) .
                                " INTO $table (" . implode( ',', $keys ) . ") $identityClause VALUES (";
@@ -691,15 +688,16 @@ class DatabaseMssql extends DatabaseBase {
                                throw $e;
                        }
                        $this->mScrollableCursor = true;
-                       $this->mIgnoreDupKeyErrors = false;
 
                        if ( !is_null( $identity ) ) {
                                // then we want to get the identity column value we were assigned and save it off
                                $row = $ret->fetchObject();
-                               $this->mInsertId = $row->$identity;
+                               if ( is_object( $row ) ) {
+                                       $this->mInsertId = $row->$identity;
+                               }
                        }
                }
-
+               $this->mIgnoreDupKeyErrors = false;
                return $ret;
        }
 
@@ -921,7 +919,7 @@ class DatabaseMssql extends DatabaseBase {
                        }
                        if ( !$s2 ) {
                                // no ORDER BY
-                               $overOrder = 'ORDER BY 1';
+                               $overOrder = 'ORDER BY (SELECT 1)';
                        } else {
                                if ( !isset( $orderby[2] ) || !$orderby[2] ) {
                                        // don't need to strip it out if we're using a FOR XML clause
index dc4a67d..823d9b6 100644 (file)
@@ -142,13 +142,6 @@ class DatabaseMysql extends DatabaseMysqlBase {
                return mysql_select_db( $db, $this->mConn );
        }
 
-       /**
-        * @return string
-        */
-       function getServerVersion() {
-               return mysql_get_server_info( $this->mConn );
-       }
-
        protected function mysqlFreeResult( $res ) {
                return mysql_free_result( $res );
        }
index 5ad7c78..2008f4d 100644 (file)
@@ -38,6 +38,9 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
        protected $mFakeMaster = false;
 
+       /** @var string|null */
+       private $serverVersion = null;
+
        /**
         * @return string
         */
@@ -763,9 +766,9 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @return string
         */
        public function getSoftwareLink() {
-               // MariaDB includes its name in its version string (sent when the connection is opened),
-               // and this is how MariaDB's version of the mysql command-line client identifies MariaDB
-               // servers (see the mariadb_connection() function in libmysql/libmysql.c).
+               // MariaDB includes its name in its version string; this is how MariaDB's version of
+               // the mysql command-line client identifies MariaDB servers (see mariadb_connection()
+               // in libmysql/libmysql.c).
                $version = $this->getServerVersion();
                if ( strpos( $version, 'MariaDB' ) !== false || strpos( $version, '-maria-' ) !== false ) {
                        return '[{{int:version-db-mariadb-url}} MariaDB]';
@@ -777,6 +780,19 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                return '[{{int:version-db-mysql-url}} MySQL]';
        }
 
+       /**
+        * @return string
+        */
+       public function getServerVersion() {
+               // Not using mysql_get_server_info() or similar for consistency: in the handshake,
+               // MariaDB 10 adds the prefix "5.5.5-", and only some newer client libraries strip
+               // it off (see RPL_VERSION_HACK in include/mysql_com.h).
+               if ( $this->serverVersion === null ) {
+                       $this->serverVersion = $this->selectField( '', 'VERSION()', '', __METHOD__ );
+               }
+               return $this->serverVersion;
+       }
+
        /**
         * @param array $options
         */
@@ -901,7 +917,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
        /**
         * @param bool $value
-        * @return null|bool|ResultWrapper
         */
        public function setBigSelects( $value = true ) {
                if ( $value === 'default' ) {
index b8d5d79..e9c4b39 100644 (file)
@@ -58,14 +58,22 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                }
 
                // Other than mysql_connect, mysqli_real_connect expects an explicit port
-               // parameter. So we need to parse the port out of $realServer
+               // and socket parameters. So we need to parse the port and socket out of
+               // $realServer
                $port = null;
+               $socket = null;
                $hostAndPort = IP::splitHostAndPort( $realServer );
                if ( $hostAndPort ) {
                        $realServer = $hostAndPort[0];
                        if ( $hostAndPort[1] ) {
                                $port = $hostAndPort[1];
                        }
+               } elseif ( substr_count( $realServer, ':' ) == 1 ) {
+                       // If we have a colon and something that's not a port number
+                       // inside the hostname, assume it's the socket location
+                       $hostAndSocket = explode( ':', $realServer );
+                       $realServer = $hostAndSocket[0];
+                       $socket = $hostAndSocket[1];
                }
 
                $connFlags = 0;
@@ -90,7 +98,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                $mysqli->options( MYSQLI_OPT_CONNECT_TIMEOUT, 3 );
 
                if ( $mysqli->real_connect( $realServer, $this->mUser,
-                       $this->mPassword, $this->mDBname, $port, null, $connFlags )
+                       $this->mPassword, $this->mDBname, $port, $socket, $connFlags )
                ) {
                        return $mysqli;
                }
@@ -157,13 +165,6 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $this->mConn->select_db( $db );
        }
 
-       /**
-        * @return string
-        */
-       function getServerVersion() {
-               return $this->mConn->server_info;
-       }
-
        /**
         * @param mysqli $res
         * @return bool
@@ -292,6 +293,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * Give an id for the connection
         *
         * mysql driver used resource id, but mysqli objects cannot be cast to string.
+        * @return string
         */
        public function __toString() {
                if ( $this->mConn instanceof Mysqli ) {
index 45fb3f6..ce14d7a 100644 (file)
@@ -117,6 +117,7 @@ SQL;
 
        /**
         * @since 1.19
+        * @return bool|mixed
         */
        function defaultValue() {
                if ( $this->has_default ) {
@@ -829,6 +830,7 @@ __INDEXATTR__;
         * so causes a DB error. This wrapper checks which tables can be locked and adjusts it accordingly.
         *
         * MySQL uses "ORDER BY NULL" as an optimization hint, but that syntax is illegal in PostgreSQL.
+        * @see DatabaseBase::selectSQLText
         */
        function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
                $options = array(), $join_conds = array()
index 9a03a33..dd2e813 100644 (file)
@@ -873,6 +873,9 @@ class DatabaseSqlite extends DatabaseBase {
                } elseif ( preg_match( '/^\s*DROP INDEX/i', $s ) ) {
                        // DROP INDEX is database-wide, not table-specific, so no ON <table> clause.
                        $s = preg_replace( '/\sON\s+[^\s]*/i', '', $s );
+               } elseif ( preg_match( '/^\s*INSERT IGNORE\b/i', $s ) ) {
+                       // INSERT IGNORE --> INSERT OR IGNORE
+                       $s = preg_replace( '/^\s*INSERT IGNORE\b/i', 'INSERT OR IGNORE', $s );
                }
 
                return $s;
index 7ec3b4a..c1e80d3 100644 (file)
@@ -192,7 +192,7 @@ class ResultWrapper implements Iterator {
        }
 
        /**
-        * @return stdClass|array|false
+        * @return stdClass|array|bool
         */
        function current() {
                if ( is_null( $this->currentRow ) ) {
@@ -281,7 +281,7 @@ class FakeResultWrapper extends ResultWrapper {
 
        /**
         * Callers want to be able to access fields with $this->fieldName
-        * @return false|stdClass
+        * @return bool|stdClass
         */
        function fetchObject() {
                $this->fetchRow();
@@ -298,7 +298,7 @@ class FakeResultWrapper extends ResultWrapper {
        }
 
        /**
-        * @return false|stdClass
+        * @return bool|stdClass
         */
        function next() {
                return $this->fetchObject();
index bf49bbb..4dc693a 100644 (file)
@@ -421,7 +421,7 @@ interface IORMTable {
         *
         * @since 1.20
         *
-        * @param array|string $fields
+        * @param array $fields
         *
         * @return array
         */
index db4ed60..186915c 100644 (file)
  * @ingroup Database
  */
 class LoadBalancer {
-       private $mServers, $mConns, $mLoads, $mGroupLoads;
+       /** @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;
-       private $mReadIndex, $mAllowLagged;
-
+       /** @var integer The generic (not query grouped) slave index (of $mServers) */
+       private $mReadIndex;
        /** @var bool|DBMasterPos False if not set */
        private $mWaitForPos;
-
-       private $mWaitTimeout;
-       private $mLaggedSlaveMode, $mLastError = 'Unknown error';
-       private $mParentInfo, $mLagTimes;
-       private $mLoadMonitorClass, $mLoadMonitor;
+       /** @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 ProcessCacheLRU */
+       private $mProcCache;
 
        /**
         * @param array $params Array with keys:
@@ -89,6 +108,8 @@ class LoadBalancer {
                                }
                        }
                }
+
+               $this->mProcCache = new ProcessCacheLRU( 30 );
        }
 
        /**
@@ -294,20 +315,6 @@ class LoadBalancer {
                return $i;
        }
 
-       /**
-        * Wait for a specified number of microseconds, and return the period waited
-        * @param int $t
-        * @return int
-        */
-       function sleep( $t ) {
-               wfProfileIn( __METHOD__ );
-               wfDebug( __METHOD__ . ": waiting $t us\n" );
-               usleep( $t );
-               wfProfileOut( __METHOD__ );
-
-               return $t;
-       }
-
        /**
         * Set the master wait position
         * If a DB_SLAVE connection has been opened already, waits
@@ -375,7 +382,9 @@ class LoadBalancer {
         * @return bool
         */
        protected function doWait( $index, $open = false, $timeout = null ) {
-               # Find a connection to wait on
+               $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 ) {
@@ -389,6 +398,9 @@ class LoadBalancer {
 
                                        return false;
                                }
+                               // Avoid connection spam in waitForAll() when connections
+                               // are made just for the sake of doing this lag check.
+                               $close = true;
                        }
                }
 
@@ -399,13 +411,17 @@ class LoadBalancer {
                if ( $result == -1 || is_null( $result ) ) {
                        # Timed out waiting for slave, use master instead
                        wfDebug( __METHOD__ . ": Timed out waiting for slave #$index pos {$this->mWaitForPos}\n" );
-
-                       return false;
+                       $ok = false;
                } else {
                        wfDebug( __METHOD__ . ": Done\n" );
+                       $ok = true;
+               }
 
-                       return true;
+               if ( $close ) {
+                       $this->closeConnection( $conn );
                }
+
+               return $ok;
        }
 
        /**
@@ -1052,7 +1068,8 @@ class LoadBalancer {
        }
 
        /**
-        * Get the hostname and lag time of the most-lagged slave.
+        * 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.
@@ -1065,67 +1082,45 @@ class LoadBalancer {
                $host = '';
                $maxIndex = 0;
 
-               if ( $this->getServerCount() <= 1 ) { // no replication = no lag
-                       return array( $host, $maxLag, $maxIndex );
+               if ( $this->getServerCount() <= 1 ) {
+                       return array( $host, $maxLag, $maxIndex ); // no replication = no lag
                }
 
-               // Try to get the max lag info from the server cache
-               $key = 'loadbalancer:maxlag:cluster:' . $this->mServers[0]['host'];
-               $cache = ObjectCache::newAccelerator( array(), 'hash' );
-               $maxLagInfo = $cache->get( $key ); // (host, lag, index)
-
-               // Fallback to connecting to each slave and getting the lag
-               if ( !$maxLagInfo ) {
-                       foreach ( $this->mServers as $i => $conn ) {
-                               if ( $i == $this->getWriterIndex() ) {
-                                       continue; // nothing to check
-                               }
-                               $conn = false;
-                               if ( $wiki === false ) {
-                                       $conn = $this->getAnyOpenConnection( $i );
-                               }
-                               if ( !$conn ) {
-                                       $conn = $this->openConnection( $i, $wiki );
-                               }
-                               if ( !$conn ) {
-                                       continue;
-                               }
-                               $lag = $conn->getLag();
-                               if ( $lag > $maxLag ) {
-                                       $maxLag = $lag;
-                                       $host = $this->mServers[$i]['host'];
-                                       $maxIndex = $i;
-                               }
+               $lagTimes = $this->getLagTimes( $wiki );
+               foreach ( $lagTimes as $i => $lag ) {
+                       if ( $lag > $maxLag ) {
+                               $maxLag = $lag;
+                               $host = $this->mServers[$i]['host'];
+                               $maxIndex = $i;
                        }
-                       $maxLagInfo = array( $host, $maxLag, $maxIndex );
-                       $cache->set( $key, $maxLagInfo, 5 );
                }
 
-               return $maxLagInfo;
+               return array( $host, $maxLag, $maxIndex );
        }
 
        /**
         * Get lag time for each server
-        * Results are cached for a short time in memcached, and indefinitely in the process cache
+        *
+        * Results are cached for a short time in memcached/process cache
         *
         * @param string|bool $wiki
-        * @return array
+        * @return array Map of (server index => seconds)
         */
        function getLagTimes( $wiki = false ) {
-               # Try process cache
-               if ( isset( $this->mLagTimes ) ) {
-                       return $this->mLagTimes;
+               if ( $this->getServerCount() <= 1 ) {
+                       return array( 0 => 0 ); // no replication = no lag
                }
-               if ( $this->getServerCount() == 1 ) {
-                       # No replication
-                       $this->mLagTimes = array( 0 => 0 );
-               } else {
-                       # Send the request to the load monitor
-                       $this->mLagTimes = $this->getLoadMonitor()->getLagTimes(
-                               array_keys( $this->mServers ), $wiki );
+
+               if ( $this->mProcCache->has( 'slave_lag', 'times', 1 ) ) {
+                       return $this->mProcCache->get( 'slave_lag', 'times' );
                }
 
-               return $this->mLagTimes;
+               # Send the request to the load monitor
+               $times = $this->getLoadMonitor()->getLagTimes( array_keys( $this->mServers ), $wiki );
+
+               $this->mProcCache->set( 'slave_lag', 'times', $times );
+
+               return $times;
        }
 
        /**
@@ -1151,15 +1146,15 @@ class LoadBalancer {
        }
 
        /**
-        * Clear the cache for getLagTimes
+        * Clear the cache for slag lag delay times
         */
        function clearLagTimeCache() {
-               $this->mLagTimes = null;
+               $this->mProcCache->clear( 'slave_lag' );
        }
 }
 
 /**
- * Helper class to handle automatically marking connectons as reusable (via RAII pattern)
+ * Helper class to handle automatically marking connections as reusable (via RAII pattern)
  * as well handling deferring the actual network connection until the handle is used
  *
  * @ingroup Database
index fa2dd99..b694a6f 100644 (file)
@@ -48,7 +48,7 @@ interface LoadMonitor {
         * @param array $serverIndexes
         * @param string $wiki
         *
-        * @return array
+        * @return array Map of (server index => seconds)
         */
        public function getLagTimes( $serverIndexes, $wiki );
 }
@@ -74,9 +74,14 @@ class LoadMonitorNull implements LoadMonitor {
 class LoadMonitorMySQL implements LoadMonitor {
        /** @var LoadBalancer */
        public $parent;
+       /** @var BagOStuff */
+       protected $cache;
 
        public function __construct( $parent ) {
+               global $wgMemc;
+
                $this->parent = $parent;
+               $this->cache = $wgMemc ?: wfGetMainCache();
        }
 
        public function scaleLoads( &$loads, $group = false, $wiki = false ) {
@@ -93,14 +98,10 @@ class LoadMonitorMySQL implements LoadMonitor {
                $expiry = 5;
                $requestRate = 10;
 
-               global $wgMemc;
-               if ( empty( $wgMemc ) ) {
-                       $wgMemc = wfGetMainCache();
-               }
-
+               $cache = $this->cache;
                $masterName = $this->parent->getServerName( 0 );
                $memcKey = wfMemcKey( 'lag_times', $masterName );
-               $times = $wgMemc->get( $memcKey );
+               $times = $cache->get( $memcKey );
                if ( is_array( $times ) ) {
                        # Randomly recache with probability rising over $expiry
                        $elapsed = time() - $times['timestamp'];
@@ -116,10 +117,10 @@ class LoadMonitorMySQL implements LoadMonitor {
                }
 
                # Cache key missing or expired
-               if ( $wgMemc->add( "$memcKey:lock", 1, 10 ) ) {
+               if ( $cache->add( "$memcKey:lock", 1, 10 ) ) {
                        # Let this process alone update the cache value
-                       $unlocker = new ScopedCallback( function () use ( $wgMemc, $memcKey ) {
-                               $wgMemc->delete( $memcKey );
+                       $unlocker = new ScopedCallback( function () use ( $cache, $memcKey ) {
+                               $cache->delete( $memcKey );
                        } );
                } elseif ( is_array( $times ) ) {
                        # Could not acquire lock but an old cache exists, so use it
@@ -136,12 +137,17 @@ class LoadMonitorMySQL implements LoadMonitor {
                                $times[$i] = $conn->getLag();
                        } elseif ( false !== ( $conn = $this->parent->openConnection( $i, $wiki ) ) ) {
                                $times[$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
                $times['timestamp'] = time();
-               $wgMemc->set( $memcKey, $times, $expiry + 10 );
+               $cache->set( $memcKey, $times, $expiry + 10 );
                unset( $times['timestamp'] ); // hide from caller
 
                return $times;
index 9f3f8d2..755a851 100644 (file)
@@ -749,7 +749,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @since 1.20
         *
-        * @param array|string $fields
+        * @param array $fields
         *
         * @return array
         */
index 0cea658..c2f2223 100644 (file)
@@ -182,7 +182,6 @@ class MWDebug {
         * @param int $callerOffset How far up the callstack is the original
         *    caller. 2 = function that called the function that called
         *    MWDebug::deprecated() (Added in 1.20).
-        * @return mixed
         */
        public static function deprecated( $function, $version = false,
                $component = false, $callerOffset = 2
@@ -336,6 +335,28 @@ class MWDebug {
                        return -1;
                }
 
+               // Replace invalid UTF-8 chars with a square UTF-8 character
+               // This prevents json_encode from erroring out due to binary SQL data
+               $sql = preg_replace(
+                       '/(
+                               [\xC0-\xC1] # Invalid UTF-8 Bytes
+                               | [\xF5-\xFF] # Invalid UTF-8 Bytes
+                               | \xE0[\x80-\x9F] # Overlong encoding of prior code point
+                               | \xF0[\x80-\x8F] # Overlong encoding of prior code point
+                               | [\xC2-\xDF](?![\x80-\xBF]) # Invalid UTF-8 Sequence Start
+                               | [\xE0-\xEF](?![\x80-\xBF]{2}) # Invalid UTF-8 Sequence Start
+                               | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start
+                               | (?<=[\x0-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle
+                               | (?<![\xC2-\xDF]|[\xE0-\xEF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4]
+                                  |[\xF0-\xF4][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF]{2})[\x80-\xBF] # Overlong Sequence
+                               | (?<=[\xE0-\xEF])[\x80-\xBF](?![\x80-\xBF]) # Short 3 byte sequence
+                               | (?<=[\xF0-\xF4])[\x80-\xBF](?![\x80-\xBF]{2}) # Short 4 byte sequence
+                               | (?<=[\xF0-\xF4][\x80-\xBF])[\x80-\xBF](?![\x80-\xBF]) # Short 4 byte sequence (2)
+                       )/x',
+                       '■',
+                       $sql
+               );
+
                self::$query[] = array(
                        'sql' => $sql,
                        'function' => $function,
@@ -539,7 +560,8 @@ class MWDebug {
 
                return array(
                        'mwVersion' => $wgVersion,
-                       'phpVersion' => PHP_VERSION,
+                       'phpEngine' => wfIsHHVM() ? 'HHVM' : 'PHP',
+                       'phpVersion' => wfIsHHVM() ? HHVM_VERSION : PHP_VERSION,
                        'gitRevision' => GitInfo::headSHA1(),
                        'gitBranch' => GitInfo::currentBranch(),
                        'gitViewUrl' => GitInfo::headViewUrl(),
index 2178281..b0c1899 100644 (file)
@@ -99,25 +99,29 @@ class DeferredUpdates {
                        $dbw = wfGetDB( DB_MASTER );
                }
 
-               /** @var DeferrableUpdate $update */
-               foreach ( $updates as $update ) {
-                       try {
-                               $update->doUpdate();
+               while ( $updates ) {
+                       self::clearPendingUpdates();
 
-                               if ( $doCommit && $dbw->trxLevel() ) {
-                                       $dbw->commit( __METHOD__, 'flush' );
-                               }
-                       } catch ( MWException $e ) {
-                               // We don't want exceptions thrown during deferred updates to
-                               // be reported to the user since the output is already sent.
-                               // Instead we just log them.
-                               if ( !$e instanceof ErrorPageError ) {
-                                       MWExceptionHandler::logException( $e );
+                       /** @var DeferrableUpdate $update */
+                       foreach ( $updates as $update ) {
+                               try {
+                                       $update->doUpdate();
+
+                                       if ( $doCommit && $dbw->trxLevel() ) {
+                                               $dbw->commit( __METHOD__, 'flush' );
+                                       }
+                               } catch ( MWException $e ) {
+                                       // We don't want exceptions thrown during deferred updates to
+                                       // be reported to the user since the output is already sent.
+                                       // Instead we just log them.
+                                       if ( !$e instanceof ErrorPageError ) {
+                                               MWExceptionHandler::logException( $e );
+                                       }
                                }
                        }
+                       $updates = array_merge( $wgDeferredUpdateList, self::$updates );
                }
 
-               self::clearPendingUpdates();
                wfProfileOut( __METHOD__ );
        }
 
index 1466605..5d084af 100644 (file)
@@ -116,6 +116,7 @@ class SearchUpdate implements DeferrableUpdate {
         * If you're using a real search engine, you'll probably want to override
         * this behavior and do something nicer with the original wikitext.
         * @param string $text
+        * @return string
         */
        public static function updateText( $text ) {
                global $wgContLang;
index 9c58503..7ec61ea 100644 (file)
@@ -35,7 +35,7 @@ abstract class SqlDataUpdate extends DataUpdate {
        protected $mDb;
 
        /** @var array SELECT options to be used (array) */
-       protected $mOptions;
+       protected $mOptions = array();
 
        /** @var bool Whether a transaction is open on this object (internal use only!) */
        private $mHasTransaction;
@@ -51,16 +51,8 @@ abstract class SqlDataUpdate extends DataUpdate {
         *   transaction is already in progress, see beginTransaction() for details.
         */
        public function __construct( $withTransaction = true ) {
-               global $wgAntiLockFlags;
-
                parent::__construct();
 
-               if ( $wgAntiLockFlags & ALF_NO_LINK_LOCK ) {
-                       $this->mOptions = array();
-               } else {
-                       $this->mOptions = array( 'FOR UPDATE' );
-               }
-
                // @todo Get connection only when it's needed? Make sure that doesn't
                // break anything, especially transactions!
                $this->mDb = wfGetDB( DB_MASTER );
index 0dcff44..d4fc7a0 100644 (file)
@@ -51,41 +51,6 @@ class SquidUpdate {
                $this->urlArr = $urlArr;
        }
 
-       /**
-        * Create a SquidUpdate from the given Title object.
-        *
-        * The resulting SquidUpdate will purge the given Title's URLs as well as
-        * the pages that link to it. Capped at $wgMaxSquidPurgeTitles total URLs.
-        *
-        * @param Title $title
-        * @return SquidUpdate
-        */
-       public static function newFromLinksTo( Title $title ) {
-               global $wgMaxSquidPurgeTitles;
-               wfProfileIn( __METHOD__ );
-
-               # Get a list of URLs linking to this page
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( array( 'links', 'page' ),
-                       array( 'page_namespace', 'page_title' ),
-                       array(
-                               'pl_namespace' => $title->getNamespace(),
-                               'pl_title' => $title->getDBkey(),
-                               'pl_from=page_id' ),
-                       __METHOD__ );
-               $blurlArr = $title->getSquidURLs();
-               if ( $res->numRows() <= $wgMaxSquidPurgeTitles ) {
-                       foreach ( $res as $BL ) {
-                               $tobj = Title::makeTitle( $BL->page_namespace, $BL->page_title );
-                               $blurlArr[] = $tobj->getInternalURL();
-                       }
-               }
-
-               wfProfileOut( __METHOD__ );
-
-               return new SquidUpdate( $blurlArr );
-       }
-
        /**
         * Create a SquidUpdate from an array of Title objects, or a TitleArray object
         *
index ee918f3..dd5f3c7 100644 (file)
@@ -224,8 +224,11 @@ class DifferenceEngine extends ContextSource {
                }
 
                $out->setPageTitle( $this->msg( 'errorpagetitle' ) );
-               $out->addWikiMsg( 'difference-missing-revision',
-                       $this->getLanguage()->listToText( $missing ), count( $missing ) );
+               $msg = $this->msg( 'difference-missing-revision' )
+                       ->params( $this->getLanguage()->listToText( $missing ) )
+                       ->numParams( count( $missing ) )
+                       ->parseAsBlock();
+               $out->addHtml( $msg );
        }
 
        public function showDiffPage( $diffOnly = false ) {
@@ -310,11 +313,11 @@ class DifferenceEngine extends ContextSource {
                                                                'undoafter' => $this->mOldid,
                                                                'undo' => $this->mNewid
                                                        ) ),
-                                                       'title' => Linker::titleAttrib( 'undo' )
+                                                       'title' => Linker::titleAttrib( 'undo' ),
                                                ),
                                                $this->msg( 'editundo' )->text()
                                        );
-                                       $revisionTools[] = $undoLink;
+                                       $revisionTools['mw-diff-undo'] = $undoLink;
                                }
                        }
 
@@ -387,8 +390,14 @@ class DifferenceEngine extends ContextSource {
                wfRunHooks( 'DiffRevisionTools', array( $this->mNewRev, &$revisionTools, $this->mOldRev ) );
                $formattedRevisionTools = array();
                // Put each one in parentheses (poor man's button)
-               foreach ( $revisionTools as $tool ) {
-                       $formattedRevisionTools[] = $this->msg( 'parentheses' )->rawParams( $tool )->escaped();
+               foreach ( $revisionTools as $key => $tool ) {
+                       $toolClass = is_string( $key ) ? $key : 'mw-diff-tool';
+                       $element = Html::rawElement(
+                               'span',
+                               array( 'class' => $toolClass ),
+                               $this->msg( 'parentheses' )->rawParams( $tool )->escaped()
+                       );
+                       $formattedRevisionTools[] = $element;
                }
                $newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) .
                        ' ' . implode( ' ', $formattedRevisionTools );
@@ -1052,8 +1061,13 @@ class DifferenceEngine extends ContextSource {
 
                        $key = $title->quickUserCan( 'edit', $user ) ? 'editold' : 'viewsourceold';
                        $msg = $this->msg( $key )->escaped();
-                       $header .= ' ' . $this->msg( 'parentheses' )->rawParams(
-                               Linker::linkKnown( $title, $msg, array(), $editQuery ) )->plain();
+                       $editLink = $this->msg( 'parentheses' )->rawParams(
+                               Linker::linkKnown( $title, $msg, array( ), $editQuery ) )->plain();
+                       $header .= ' ' . Html::rawElement(
+                               'span',
+                               array( 'class' => 'mw-diff-edit' ),
+                               $editLink
+                       );
                        if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
                                $header = Html::rawElement(
                                        'span',
index 71917e1..1f1ba9c 100644 (file)
@@ -82,6 +82,8 @@ class MWExceptionHandler {
                        } else {
                                echo nl2br( htmlspecialchars( $message ) ) . "\n";
                        }
+
+                       self::logException( $e );
                }
        }
 
diff --git a/includes/exception/TimestampException.php b/includes/exception/TimestampException.php
new file mode 100644 (file)
index 0000000..b9c0c35
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+/**
+ * @since 1.20
+ */
+class TimestampException extends MWException {
+}
index 5774a24..952bf63 100644 (file)
@@ -96,9 +96,6 @@ class ExternalStoreDB extends ExternalStoreMedium {
                if ( !$id ) {
                        throw new MWException( __METHOD__ . ': no insert ID' );
                }
-               if ( $dbw->getFlag( DBO_TRX ) ) {
-                       $dbw->commit( __METHOD__ );
-               }
 
                return "DB://$cluster/$id";
        }
@@ -134,7 +131,10 @@ class ExternalStoreDB extends ExternalStoreMedium {
                        wfDebug( "writable external store\n" );
                }
 
-               return $lb->getConnection( DB_SLAVE, array(), $wiki );
+               $db = $lb->getConnection( DB_SLAVE, array(), $wiki );
+               $db->clearFlag( DBO_TRX ); // sanity
+
+               return $db;
        }
 
        /**
@@ -147,7 +147,10 @@ class ExternalStoreDB extends ExternalStoreMedium {
                $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
                $lb = $this->getLoadBalancer( $cluster );
 
-               return $lb->getConnection( DB_MASTER, array(), $wiki );
+               $db = $lb->getConnection( DB_MASTER, array(), $wiki );
+               $db->clearFlag( DBO_TRX ); // sanity
+
+               return $db;
        }
 
        /**
@@ -282,6 +285,10 @@ class ExternalStoreDB extends ExternalStoreMedium {
                }
        }
 
+       /**
+        * @param string $url
+        * @return array
+        */
        protected function parseURL( $url ) {
                $path = explode( '/', $url );
 
index 78810eb..8c0a61a 100644 (file)
@@ -135,19 +135,12 @@ abstract class FileBackend {
         */
        public function __construct( array $config ) {
                $this->name = $config['name'];
+               $this->wikiId = $config['wikiId']; // e.g. "my_wiki-en_"
                if ( !preg_match( '!^[a-zA-Z0-9-_]{1,255}$!', $this->name ) ) {
-                       throw new FileBackendException( "Backend name `{$this->name}` is invalid." );
-               }
-               if ( !isset( $config['wikiId'] ) ) {
-                       $config['wikiId'] = wfWikiID();
-                       wfDeprecated( __METHOD__ . ' called without "wikiID".', '1.23' );
+                       throw new FileBackendException( "Backend name '{$this->name}' is invalid." );
+               } elseif ( !is_string( $this->wikiId ) ) {
+                       throw new FileBackendException( "Backend wiki ID not provided for '{$this->name}'." );
                }
-               if ( isset( $config['lockManager'] ) && !is_object( $config['lockManager'] ) ) {
-                       $config['lockManager'] =
-                               LockManagerGroup::singleton( $config['wikiId'] )->get( $config['lockManager'] );
-                       wfDeprecated( __METHOD__ . ' called with non-object "lockManager".', '1.23' );
-               }
-               $this->wikiId = $config['wikiId']; // e.g. "my_wiki-en_"
                $this->lockManager = isset( $config['lockManager'] )
                        ? $config['lockManager']
                        : new NullLockManager( array() );
index f40ec46..625b9b4 100644 (file)
@@ -112,7 +112,7 @@ class SwiftFileBackend extends FileBackendStore {
                // Optional settings
                $this->authTTL = isset( $config['swiftAuthTTL'] )
                        ? $config['swiftAuthTTL']
-                       : 5 * 60; // some sane number
+                       : 15 * 60; // some sane number
                $this->swiftTempUrlKey = isset( $config['swiftTempUrlKey'] )
                        ? $config['swiftTempUrlKey']
                        : '';
index 25a06d2..5929525 100644 (file)
@@ -1346,13 +1346,16 @@ class FileRepo {
         * Checks existence of an array of files.
         *
         * @param array $files Virtual URLs (or storage paths) of files to check
-        * @return array|bool Either array of files and existence flags, or false
+        * @return array Map of files and existence flags, or false
         */
        public function fileExistsBatch( array $files ) {
+               $paths = array_map( array( $this, 'resolveToStoragePath' ), $files );
+               $this->backend->preloadFileStat( array( 'srcs' => $paths ) );
+
                $result = array();
                foreach ( $files as $key => $file ) {
-                       $file = $this->resolveToStoragePath( $file );
-                       $result[$key] = $this->backend->fileExists( array( 'src' => $file ) );
+                       $path = $this->resolveToStoragePath( $file );
+                       $result[$key] = $this->backend->fileExists( array( 'src' => $path ) );
                }
 
                return $result;
index 8c0c781..fab4216 100644 (file)
@@ -406,6 +406,7 @@ class RepoGroup {
        /**
         * Create a repo class based on an info structure
         * @param array $info
+        * @return FileRepo
         */
        protected function newRepo( $info ) {
                $class = $info['class'];
index a71acde..5b0d8e2 100644 (file)
@@ -264,6 +264,9 @@ class ArchivedFile {
                        // old row, populate from key
                        $this->sha1 = LocalRepo::getHashFromKey( $this->key );
                }
+               if ( !$this->title ) {
+                       $this->title = Title::makeTitleSafe( NS_FILE, $row->fa_name );
+               }
        }
 
        /**
@@ -272,6 +275,9 @@ class ArchivedFile {
         * @return Title
         */
        public function getTitle() {
+               if ( !$this->title ) {
+                       $this->load();
+               }
                return $this->title;
        }
 
@@ -407,6 +413,7 @@ class ArchivedFile {
        /**
         * Returns the number of pages of a multipage document, or false for
         * documents which aren't multipage documents
+        * @return bool|int
         */
        function pageCount() {
                if ( !isset( $this->pageCount ) ) {
@@ -571,6 +578,7 @@ class ArchivedFile {
        public function userCan( $field, User $user = null ) {
                $this->load();
 
-               return Revision::userCanBitfield( $this->deleted, $field, $user );
+               $title = $this->getTitle();
+               return Revision::userCanBitfield( $this->deleted, $field, $user, $title ? : null );
        }
 }
index f612aa3..7563d64 100644 (file)
@@ -714,7 +714,7 @@ abstract class File {
         */
        function canRender() {
                if ( !isset( $this->canRender ) ) {
-                       $this->canRender = $this->getHandler() && $this->handler->canRender( $this );
+                       $this->canRender = $this->getHandler() && $this->handler->canRender( $this ) && $this->exists();
                }
 
                return $this->canRender;
@@ -1231,9 +1231,25 @@ abstract class File {
                        }
                }
 
+               // Thumbnailing a very large file could result in network saturation if
+               // everyone does it at once.
+               if ( $this->getSize() >= 1e7 ) { // 10MB
+                       $that = $this;
+                       $work = new PoolCounterWorkViaCallback( 'GetLocalFileCopy', sha1( $this->getName() ),
+                               array(
+                                       'doWork' => function () use ( $that ) {
+                                               return $that->getLocalRefPath();
+                                       }
+                               )
+                       );
+                       $srcPath = $work->execute();
+               } else {
+                       $srcPath = $this->getLocalRefPath();
+               }
+
                // Original file
                return array(
-                       'path' => $this->getLocalRefPath(),
+                       'path' => $srcPath,
                        'width' => $this->getWidth(),
                        'height' => $this->getHeight()
                );
@@ -1312,16 +1328,16 @@ abstract class File {
         * @return ThumbnailImage
         */
        function iconThumb() {
-               global $wgStylePath, $wgStyleDirectory;
+               global $wgResourceBasePath, $IP;
+               $assetsPath = "$wgResourceBasePath/resources/assets/file-type-icons/";
+               $assetsDirectory = "$IP/resources/assets/file-type-icons/";
 
                $try = array( 'fileicon-' . $this->getExtension() . '.png', 'fileicon.png' );
                foreach ( $try as $icon ) {
-                       $path = '/common/images/icons/' . $icon;
-                       $filepath = $wgStyleDirectory . $path;
-                       if ( file_exists( $filepath ) ) { // always FS
+                       if ( file_exists( $assetsDirectory . $icon ) ) { // always FS
                                $params = array( 'width' => 120, 'height' => 120 );
 
-                               return new ThumbnailImage( $this, $wgStylePath . $path, false, $params );
+                               return new ThumbnailImage( $this, $assetsPath . $icon, false, $params );
                        }
                }
 
@@ -1331,6 +1347,7 @@ abstract class File {
        /**
         * Get last thumbnailing error.
         * Largely obsolete.
+        * @return string
         */
        function getLastError() {
                return $this->lastError;
index 07f1f09..6ca19fe 100644 (file)
@@ -2284,7 +2284,12 @@ class LocalFileDeleteBatch {
                $this->doDBInserts();
 
                // Removes non-existent file from the batch, so we don't get errors.
-               $this->deletionBatch = $this->removeNonexistentFiles( $this->deletionBatch );
+               $checkStatus = $this->removeNonexistentFiles( $this->deletionBatch );
+               if ( !$checkStatus->isGood() ) {
+                       $this->status->merge( $checkStatus );
+                       return $this->status;
+               }
+               $this->deletionBatch = $checkStatus->value;
 
                // Execute the file deletion batch
                $status = $this->file->repo->deleteBatch( $this->deletionBatch );
@@ -2316,7 +2321,7 @@ class LocalFileDeleteBatch {
        /**
         * Removes non-existent files from a deletion batch.
         * @param array $batch
-        * @return array
+        * @return Status
         */
        function removeNonexistentFiles( $batch ) {
                $files = $newBatch = array();
@@ -2327,6 +2332,10 @@ class LocalFileDeleteBatch {
                }
 
                $result = $this->file->repo->fileExistsBatch( $files );
+               if ( in_array( null, $result, true ) ) {
+                       return Status::newFatal( 'backend-fail-internal',
+                               $this->file->repo->getBackend()->getName() );
+               }
 
                foreach ( $batch as $batchItem ) {
                        if ( $result[$batchItem[0]] ) {
@@ -2334,7 +2343,7 @@ class LocalFileDeleteBatch {
                        }
                }
 
-               return $newBatch;
+               return Status::newGood( $newBatch );
        }
 }
 
@@ -2575,7 +2584,12 @@ class LocalFileRestoreBatch {
                }
 
                // Remove missing files from batch, so we don't get errors when undeleting them
-               $storeBatch = $this->removeNonexistentFiles( $storeBatch );
+               $checkStatus = $this->removeNonexistentFiles( $storeBatch );
+               if ( !$checkStatus->isGood() ) {
+                       $status->merge( $checkStatus );
+                       return $status;
+               }
+               $storeBatch = $checkStatus->value;
 
                // Run the store batch
                // Use the OVERWRITE_SAME flag to smooth over a common error
@@ -2635,7 +2649,7 @@ class LocalFileRestoreBatch {
        /**
         * Removes non-existent files from a store batch.
         * @param array $triplets
-        * @return array
+        * @return Status
         */
        function removeNonexistentFiles( $triplets ) {
                $files = $filteredTriplets = array();
@@ -2644,6 +2658,10 @@ class LocalFileRestoreBatch {
                }
 
                $result = $this->file->repo->fileExistsBatch( $files );
+               if ( in_array( null, $result, true ) ) {
+                       return Status::newFatal( 'backend-fail-internal',
+                               $this->file->repo->getBackend()->getName() );
+               }
 
                foreach ( $triplets as $file ) {
                        if ( $result[$file[0]] ) {
@@ -2651,7 +2669,7 @@ class LocalFileRestoreBatch {
                        }
                }
 
-               return $filteredTriplets;
+               return Status::newGood( $filteredTriplets );
        }
 
        /**
@@ -2779,7 +2797,7 @@ class LocalFileMoveBatch {
                        array( 'oi_archive_name', 'oi_deleted' ),
                        array( 'oi_name' => $this->oldName ),
                        __METHOD__,
-                       array( 'FOR UPDATE' ) // ignore snapshot
+                       array( 'LOCK IN SHARE MODE' ) // ignore snapshot
                );
 
                foreach ( $result as $row ) {
@@ -2824,7 +2842,12 @@ class LocalFileMoveBatch {
                $status = $repo->newGood();
 
                $triplets = $this->getMoveTriplets();
-               $triplets = $this->removeNonexistentFiles( $triplets );
+               $checkStatus = $this->removeNonexistentFiles( $triplets );
+               if ( !$checkStatus->isGood() ) {
+                       $status->merge( $checkStatus );
+                       return $status;
+               }
+               $triplets = $checkStatus->value;
                $destFile = wfLocalFile( $this->target );
 
                $this->file->lock(); // begin
@@ -2951,7 +2974,7 @@ class LocalFileMoveBatch {
        /**
         * Removes non-existent files from move batch.
         * @param array $triplets
-        * @return array
+        * @return Status
         */
        function removeNonexistentFiles( $triplets ) {
                $files = array();
@@ -2961,8 +2984,12 @@ class LocalFileMoveBatch {
                }
 
                $result = $this->file->repo->fileExistsBatch( $files );
-               $filteredTriplets = array();
+               if ( in_array( null, $result, true ) ) {
+                       return Status::newFatal( 'backend-fail-internal',
+                               $this->file->repo->getBackend()->getName() );
+               }
 
+               $filteredTriplets = array();
                foreach ( $triplets as $file ) {
                        if ( $result[$file[0]] ) {
                                $filteredTriplets[] = $file;
@@ -2971,7 +2998,7 @@ class LocalFileMoveBatch {
                        }
                }
 
-               return $filteredTriplets;
+               return Status::newGood( $filteredTriplets );
        }
 
        /**
index 0adcc73..710058f 100644 (file)
@@ -404,4 +404,18 @@ class OldLocalFile extends LocalFile {
 
                return true;
        }
+
+       /**
+        * If archive name is an empty string, then file does not "exist"
+        *
+        * This is the case for a couple files on Wikimedia servers where
+        * the old version is "lost".
+        */
+       public function exists() {
+               $archiveName = $this->getArchiveName();
+               if ( $archiveName === '' || !is_string( $archiveName ) ) {
+                       return false;
+               }
+               return parent::exists();
+       }
 }
index 2d3ea5a..b0a593d 100644 (file)
@@ -86,19 +86,25 @@ abstract class ImageGalleryBase extends ContextSource {
         * should use to get a gallery.
         *
         * @param string|bool $mode Mode to use. False to use the default
+        * @param IContextSource|null $context
+        * @return ImageGalleryBase
         * @throws MWException
         */
-       static function factory( $mode = false ) {
-               global $wgGalleryOptions, $wgContLang;
+       static function factory( $mode = false, IContextSource $context = null ) {
+               global $wgContLang;
                self::loadModes();
+               if ( !$context ) {
+                       $context = RequestContext::getMainAndWarn( __METHOD__ );
+               }
                if ( !$mode ) {
-                       $mode = $wgGalleryOptions['mode'];
+                       $galleryOpions = $context->getConfig()->get( 'GalleryOptions' );
+                       $mode = $galleryOpions['mode'];
                }
 
                $mode = $wgContLang->lc( $mode );
 
                if ( isset( self::$modeMapping[$mode] ) ) {
-                       return new self::$modeMapping[$mode]( $mode );
+                       return new self::$modeMapping[$mode]( $mode, $context );
                } else {
                        throw new MWException( "No gallery class registered for mode $mode" );
                }
@@ -124,18 +130,23 @@ abstract class ImageGalleryBase extends ContextSource {
         * You should not call this directly, but instead use
         * ImageGalleryBase::factory().
         * @param string $mode
+        * @param IContextSource|null $context
         */
-       function __construct( $mode = 'traditional' ) {
-               global $wgGalleryOptions;
+       function __construct( $mode = 'traditional', IContextSource $context = null ) {
+               if ( $context ) {
+                       $this->setContext( $context );
+               }
+
+               $galleryOptions = $this->getConfig()->get( 'GalleryOptions' );
                $this->mImages = array();
-               $this->mShowBytes = $wgGalleryOptions['showBytes'];
+               $this->mShowBytes = $galleryOptions['showBytes'];
                $this->mShowFilename = true;
                $this->mParser = false;
                $this->mHideBadImages = false;
-               $this->mPerRow = $wgGalleryOptions['imagesPerRow'];
-               $this->mWidths = $wgGalleryOptions['imageWidth'];
-               $this->mHeights = $wgGalleryOptions['imageHeight'];
-               $this->mCaptionLength = $wgGalleryOptions['captionLength'];
+               $this->mPerRow = $galleryOptions['imagesPerRow'];
+               $this->mWidths = $galleryOptions['imageWidth'];
+               $this->mHeights = $galleryOptions['imageHeight'];
+               $this->mCaptionLength = $galleryOptions['captionLength'];
                $this->mMode = $mode;
        }
 
index 207efa8..52a49dd 100644 (file)
@@ -95,6 +95,7 @@ class PackedImageGallery extends TraditionalImageGallery {
        /**
         * Add javascript which auto-justifies the rows by manipulating the image sizes.
         * Also ensures that the hover version of this degrades gracefully.
+        * @return array
         */
        protected function getModules() {
                return array( 'mediawiki.page.gallery' );
index f9c131f..01360d0 100644 (file)
@@ -50,7 +50,7 @@ class PackedOverlayImageGallery extends PackedImageGallery {
 
                return "\n\t\t\t" . $outerWrapper . '<div class="gallerytext">' . "\n"
                        . $galleryText
-                       . "\n\t\t\t</div>";
+                       . "\n\t\t\t</div></div>";
        }
 }
 
diff --git a/includes/htmlform/HTMLAutoCompleteSelectField.php b/includes/htmlform/HTMLAutoCompleteSelectField.php
new file mode 100644 (file)
index 0000000..4905362
--- /dev/null
@@ -0,0 +1,165 @@
+<?php
+
+/**
+ * Text field for selecting a value from a large list of possible values, with
+ * auto-completion and optionally with a select dropdown for selecting common
+ * options.
+ *
+ * If one of 'options-messages', 'options', or 'options-message' is provided
+ * and non-empty, the select dropdown will be shown. An 'other' key will be
+ * appended using message 'htmlform-selectorother-other' if not already
+ * present.
+ *
+ * Besides the parameters recognized by HTMLTextField, the following are
+ * recognized:
+ *   options-messages - As for HTMLSelectField
+ *   options - As for HTMLSelectField
+ *   options-message - As for HTMLSelectField
+ *   autocomplete - Associative array mapping display text to values.
+ *   autocomplete-messages - Like autocomplete, but keys are message names.
+ *   require-match - Boolean, if true the value must be in the options or the
+ *     autocomplete.
+ *   other-message - Message to use instead of htmlform-selectorother-other for
+ *      the 'other' message.
+ *   other - Raw text to use for the 'other' message
+ *
+ */
+class HTMLAutoCompleteSelectField extends HTMLTextField {
+       protected $autocomplete = array();
+
+       function __construct( $params ) {
+               $params += array(
+                       'require-match' => false,
+               );
+
+               parent::__construct( $params );
+
+               if ( array_key_exists( 'autocomplete-messages', $this->mParams ) ) {
+                       foreach ( $this->mParams['autocomplete-messages'] as $key => $value ) {
+                               $key = $this->msg( $key )->plain();
+                               $this->autocomplete[$key] = strval( $value );
+                       }
+               } elseif ( array_key_exists( 'autocomplete', $this->mParams ) ) {
+                       foreach ( $this->mParams['autocomplete'] as $key => $value ) {
+                               $this->autocomplete[$key] = strval( $value );
+                       }
+               }
+               if ( !is_array( $this->autocomplete ) || !$this->autocomplete ) {
+                       throw new MWException( 'HTMLAutoCompleteSelectField called without any autocompletions' );
+               }
+
+               $this->getOptions();
+               if ( $this->mOptions && !in_array( 'other', $this->mOptions, true ) ) {
+                       if ( isset( $params['other-message'] ) ) {
+                               $msg = wfMessage( $params['other-message'] )->text();
+                       } elseif ( isset( $params['other'] ) ) {
+                               $msg = $params['other'];
+                       } else {
+                               $msg = wfMessage( 'htmlform-selectorother-other' )->text();
+                       }
+                       $this->mOptions[$msg] = 'other';
+               }
+       }
+
+       function loadDataFromRequest( $request ) {
+               if ( $request->getCheck( $this->mName ) ) {
+                       $val = $request->getText( $this->mName . '-select', 'other' );
+
+                       if ( $val === 'other' ) {
+                               $val = $request->getText( $this->mName );
+                               if ( isset( $this->autocomplete[$val] ) ) {
+                                       $val = $this->autocomplete[$val];
+                               }
+                       }
+
+                       return $val;
+               } else {
+                       return $this->getDefault();
+               }
+       }
+
+       function validate( $value, $alldata ) {
+               $p = parent::validate( $value, $alldata );
+
+               if ( $p !== true ) {
+                       return $p;
+               }
+
+               $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
+
+               if ( in_array( strval( $value ), $validOptions, true ) ) {
+                       return true;
+               } elseif ( in_array( strval( $value ), $this->autocomplete, true ) ) {
+                       return true;
+               } elseif ( $this->mParams['require-match'] ) {
+                       return $this->msg( 'htmlform-select-badoption' )->parse();
+               }
+
+               return true;
+       }
+
+       function getAttributes( array $list ) {
+               $attribs = array(
+                       'type' => 'text',
+                       'data-autocomplete' => FormatJson::encode( array_keys( $this->autocomplete ) ),
+               ) + parent::getAttributes( $list );
+
+               if ( $this->getOptions() ) {
+                       $attribs['data-hide-if'] = FormatJson::encode(
+                               array( '!==', $this->mName . '-select', 'other' )
+                       );
+               }
+
+               return $attribs;
+       }
+
+       function getInputHTML( $value ) {
+               $oldClass = $this->mClass;
+               $this->mClass = (array)$this->mClass;
+
+               $valInSelect = false;
+               $ret = '';
+
+               if ( $this->getOptions() ) {
+                       if ( $value !== false ) {
+                               $value = strval( $value );
+                               $valInSelect = in_array(
+                                       $value, HTMLFormField::flattenOptions( $this->getOptions() ), true
+                               );
+                       }
+
+                       $selected = $valInSelect ? $value : 'other';
+                       $select = new XmlSelect( $this->mName . '-select', $this->mID . '-select', $selected );
+                       $select->addOptions( $this->getOptions() );
+                       $select->setAttribute( 'class', 'mw-htmlform-select-or-other' );
+
+                       if ( !empty( $this->mParams['disabled'] ) ) {
+                               $select->setAttribute( 'disabled', 'disabled' );
+                       }
+
+                       if ( isset( $this->mParams['tabindex'] ) ) {
+                               $select->setAttribute( 'tabindex', $this->mParams['tabindex'] );
+                       }
+
+                       $ret = $select->getHTML() . "<br />\n";
+
+                       $this->mClass[] = 'mw-htmlform-hide-if';
+               }
+
+               if ( $valInSelect ) {
+                       $value = '';
+               } else {
+                       $key = array_search( strval( $value ), $this->autocomplete, true );
+                       if ( $key !== false ) {
+                               $value = $key;
+                       }
+               }
+
+               $this->mClass[] = 'mw-htmlform-autocomplete';
+               $ret .= parent::getInputHTML( $valInSelect ? '' : $value );
+               $this->mClass = $oldClass;
+
+               return $ret;
+       }
+
+}
index 4eb7e6e..5f70362 100644 (file)
@@ -5,6 +5,8 @@
  */
 class HTMLCheckField extends HTMLFormField {
        function getInputHTML( $value ) {
+               global $wgUseMediaWikiUIEverywhere;
+
                if ( !empty( $this->mParams['invert'] ) ) {
                        $value = !$value;
                }
@@ -26,7 +28,19 @@ class HTMLCheckField extends HTMLFormField {
                                ),
                                Xml::check( $this->mName, $value, $attr ) . $this->mLabel );
                } else {
-                       return Xml::checkLabel( $this->mLabel, $this->mName, $this->mID, $value, $attr );
+                       $chkLabel = Xml::check( $this->mName, $value, $attr )
+                       . '&#160;'
+                       . Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
+
+                       if ( $wgUseMediaWikiUIEverywhere ) {
+                               $chkLabel = Html::rawElement(
+                                       'div',
+                                       array( 'class' => 'mw-ui-checkbox' ),
+                                       $chkLabel
+                               );
+                       }
+
+                       return $chkLabel;
                }
        }
 
index 8255526..6c538fd 100644 (file)
@@ -80,8 +80,6 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
         * @return string
         */
        function getInputHTML( $value ) {
-               global $wgUseMediaWikiUIEverywhere;
-
                $html = '';
                $tableContents = '';
                $rows = $this->mParams['rows'];
@@ -129,7 +127,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                                        $thisAttribs['disabled'] = 1;
                                }
                                $chkBox = Xml::check( "{$this->mName}[]", $checked, $attribs + $thisAttribs );
-                               if ( $wgUseMediaWikiUIEverywhere ) {
+                               if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
                                        $chkBox = Html::openElement( 'div', array( 'class' => 'mw-ui-checkbox' ) ) .
                                                $chkBox .
                                                Html::element( 'label', array( 'for' => $thisId ) ) .
index 6501890..4511046 100644 (file)
@@ -120,6 +120,7 @@ class HTMLForm extends ContextSource {
                'edittools' => 'HTMLEditTools',
                'checkmatrix' => 'HTMLCheckMatrix',
                'cloner' => 'HTMLFormFieldCloner',
+               'autocompleteselect' => 'HTMLAutoCompleteSelectField',
                // HTMLTextField will output the correct type="" attribute automagically.
                // There are about four zillion other HTML5 input types, like range, but
                // we don't use those at the moment, so no point in adding all of them.
@@ -138,6 +139,7 @@ class HTMLForm extends ContextSource {
        protected $mFieldTree;
        protected $mShowReset = false;
        protected $mShowSubmit = true;
+       protected $mSubmitModifierClass = 'mw-ui-constructive';
 
        protected $mSubmitCallback;
        protected $mValidationErrorMessage;
@@ -300,9 +302,8 @@ class HTMLForm extends ContextSource {
         * @return string
         */
        public function getDisplayFormat() {
-               global $wgHTMLFormAllowTableFormat;
                $format = $this->displayFormat;
-               if ( !$wgHTMLFormAllowTableFormat && $format === 'table' ) {
+               if ( !$this->getConfig()->get( 'HTMLFormAllowTableFormat' ) && $format === 'table' ) {
                        $format = 'div';
                }
                return $format;
@@ -473,6 +474,9 @@ class HTMLForm extends ContextSource {
                        if ( !empty( $field->mParams['nodata'] ) ) {
                                continue;
                        }
+                       if ( $field->isHidden( $this->mFieldData ) ) {
+                               continue;
+                       }
                        if ( $field->validate(
                                        $this->mFieldData[$fieldname],
                                        $this->mFieldData )
@@ -784,9 +788,14 @@ class HTMLForm extends ContextSource {
                $this->getOutput()->preventClickjacking();
                $this->getOutput()->addModules( 'mediawiki.htmlform' );
                if ( $this->isVForm() ) {
+                       // This is required for VForm HTMLForms that use that style regardless
+                       // of wgUseMediaWikiUIEverywhere (since they pre-date it).
+                       // When wgUseMediaWikiUIEverywhere is removed, this should be consolidated
+                       // with the addModuleStyles in SpecialPage->setHeaders.
                        $this->getOutput()->addModuleStyles( array(
                                'mediawiki.ui',
                                'mediawiki.ui.button',
+                               'mediawiki.ui.input',
                        ) );
                        // @todo Should vertical form set setWrapperLegend( false )
                        // to hide ugly fieldsets?
@@ -845,8 +854,6 @@ class HTMLForm extends ContextSource {
         * @return string HTML.
         */
        function getHiddenFields() {
-               global $wgArticlePath;
-
                $html = '';
                if ( $this->getMethod() == 'post' ) {
                        $html .= Html::hidden(
@@ -857,7 +864,8 @@ class HTMLForm extends ContextSource {
                        $html .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . "\n";
                }
 
-               if ( strpos( $wgArticlePath, '?' ) !== false && $this->getMethod() == 'get' ) {
+               $articlePath = $this->getConfig()->get( 'ArticlePath' );
+               if ( strpos( $articlePath, '?' ) !== false && $this->getMethod() == 'get' ) {
                        $html .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . "\n";
                }
 
@@ -874,8 +882,8 @@ class HTMLForm extends ContextSource {
         * @return string HTML.
         */
        function getButtons() {
-               global $wgUseMediaWikiUIEverywhere;
                $buttons = '';
+               $useMediaWikiUIEverywhere = $this->getConfig()->get( 'UseMediaWikiUIEverywhere' );
 
                if ( $this->mShowSubmit ) {
                        $attribs = array();
@@ -894,8 +902,8 @@ class HTMLForm extends ContextSource {
 
                        $attribs['class'] = array( 'mw-htmlform-submit' );
 
-                       if ( $this->isVForm() || $wgUseMediaWikiUIEverywhere ) {
-                               array_push( $attribs['class'], 'mw-ui-button', 'mw-ui-constructive' );
+                       if ( $this->isVForm() || $useMediaWikiUIEverywhere ) {
+                               array_push( $attribs['class'], 'mw-ui-button', $this->mSubmitModifierClass );
                        }
 
                        if ( $this->isVForm() ) {
@@ -937,12 +945,15 @@ class HTMLForm extends ContextSource {
                                $attrs['id'] = $button['id'];
                        }
 
-                       if ( $wgUseMediaWikiUIEverywhere ) {
-                               if ( isset( $attrs['class' ] ) ) {
+                       if ( $this->isVForm() || $useMediaWikiUIEverywhere ) {
+                               if ( isset( $attrs['class'] ) ) {
                                        $attrs['class'] .= ' mw-ui-button';
                                } else {
                                        $attrs['class'] = 'mw-ui-button';
                                }
+                               if ( $this->isVForm() ) {
+                                       $attrs['class'] .= ' mw-ui-big mw-ui-block';
+                               }
                        }
 
                        $buttons .= Html::element( 'input', $attrs ) . "\n";
@@ -1037,6 +1048,22 @@ class HTMLForm extends ContextSource {
                return $this;
        }
 
+       /**
+        * Identify that the submit button in the form has a destructive action
+        * @since 1.24
+        */
+       public function setSubmitDestructive() {
+               $this->mSubmitModifierClass = 'mw-ui-destructive';
+       }
+
+       /**
+        * Identify that the submit button in the form has a progressive action
+        * @since 1.25
+        */
+       public function setSubmitProgressive() {
+               $this->mSubmitModifierClass = 'mw-ui-progressive';
+       }
+
        /**
         * Set the text for the submit button to a message
         * @since 1.19
@@ -1438,20 +1465,19 @@ class HTMLForm extends ContextSource {
         * @return string
         */
        public function getAction() {
-               global $wgScript, $wgArticlePath;
-
                // If an action is alredy provided, return it
                if ( $this->mAction !== false ) {
                        return $this->mAction;
                }
 
-               // Check whether we are in GET mode and $wgArticlePath contains a "?"
+               $articlePath = $this->getConfig()->get( 'ArticlePath' );
+               // Check whether we are in GET mode and the ArticlePath contains a "?"
                // meaning that getLocalURL() would return something like "index.php?title=...".
                // As browser remove the query string before submitting GET forms,
-               // it means that the title would be lost. In such case use $wgScript instead
+               // it means that the title would be lost. In such case use wfScript() instead
                // and put title in an hidden field (see getHiddenFields()).
-               if ( strpos( $wgArticlePath, '?' ) !== false && $this->getMethod() === 'get' ) {
-                       return $wgScript;
+               if ( strpos( $articlePath, '?' ) !== false && $this->getMethod() === 'get' ) {
+                       return wfScript();
                }
 
                return $this->getTitle()->getLocalURL();
index 7e4b15b..4cf2394 100644 (file)
@@ -113,7 +113,7 @@ abstract class HTMLFormField {
                                }
                                $data = $data[$key];
                        }
-                       $testValue = $data;
+                       $testValue = (string)$data;
                        break;
                }
 
@@ -593,6 +593,9 @@ abstract class HTMLFormField {
                $wrapperAttributes = array(
                        'class' => 'htmlform-tip',
                );
+               if ( $this->mHelpClass !== false ) {
+                       $wrapperAttributes['class'] .= " {$this->mHelpClass}";
+               }
                if ( $this->mHideIf ) {
                        $wrapperAttributes['data-hide-if'] = FormatJson::encode( $this->mHideIf );
                        $wrapperAttributes['class'] .= ' mw-htmlform-hide-if';
index 597a03f..5dadaf8 100644 (file)
@@ -80,7 +80,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
         * specified key.
         *
         * @param string $key Array key under which these fields should be named
-        * @return HTMLFormFields[]
+        * @return HTMLFormField[]
         */
        protected function createFieldsForKey( $key ) {
                $fields = array();
@@ -276,6 +276,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                }
 
                $html = '';
+               $hidden = '';
                $hasLabel = false;
 
                $fields = $this->createFieldsForKey( $key );
@@ -283,11 +284,18 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        $v = ( empty( $field->mParams['nodata'] ) && $values !== null )
                                ? $values[$fieldname]
                                : $field->getDefault();
-                       $html .= $field->$getFieldHtmlMethod( $v );
 
-                       $labelValue = trim( $field->getLabel() );
-                       if ( $labelValue != '&#160;' && $labelValue !== '' ) {
-                               $hasLabel = true;
+                       if ( $field instanceof HTMLHiddenField ) {
+                               // HTMLHiddenField doesn't generate its own HTML
+                               list( $name, $value, $params ) = $field->getHiddenFieldData( $v );
+                               $hidden .= Html::hidden( $name, $value, $params ) . "\n";
+                       } else {
+                               $html .= $field->$getFieldHtmlMethod( $v );
+
+                               $labelValue = trim( $field->getLabel() );
+                               if ( $labelValue != '&#160;' && $labelValue !== '' ) {
+                                       $hasLabel = true;
+                               }
                        }
                }
 
@@ -303,6 +311,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                                'cssclass' => 'mw-htmlform-cloner-delete-button',
                                'default' => $this->msg( $label )->text(),
                        ) );
+                       $field->mParent = $this->mParent;
                        $v = $field->getDefault();
 
                        if ( $displayFormat === 'table' ) {
@@ -334,6 +343,8 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        }
                }
 
+               $html .= $hidden;
+
                if ( !empty( $this->mParams['row-legend'] ) ) {
                        $legend = $this->msg( $this->mParams['row-legend'] )->text();
                        $html = Xml::fieldset( $legend, $html );
@@ -373,6 +384,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        'cssclass' => 'mw-htmlform-cloner-create-button',
                        'default' => $this->msg( $label )->text(),
                ) );
+               $field->mParent = $this->mParent;
                $html .= $field->getInputHTML( $field->getDefault() );
 
                return $html;
index e32c0bb..ffde915 100644 (file)
@@ -1,22 +1,36 @@
 <?php
 
 class HTMLHiddenField extends HTMLFormField {
+       protected $outputAsDefault = true;
+
        public function __construct( $params ) {
                parent::__construct( $params );
 
+               if ( isset( $this->mParams['output-as-default'] ) ) {
+                       $this->outputAsDefault = (bool)$this->mParams['output-as-default'];
+               }
+
                # Per HTML5 spec, hidden fields cannot be 'required'
                # http://www.w3.org/TR/html5/forms.html#hidden-state-%28type=hidden%29
                unset( $this->mParams['required'] );
        }
 
-       public function getTableRow( $value ) {
+       public function getHiddenFieldData( $value ) {
                $params = array();
                if ( $this->mID ) {
                        $params['id'] = $this->mID;
                }
 
-               $this->mParent->addHiddenField( $this->mName, $this->mDefault, $params );
+               if ( $this->outputAsDefault ) {
+                       $value = $this->mDefault;
+               }
+
+               return array( $this->mName, $value, $params );
+       }
 
+       public function getTableRow( $value ) {
+               list( $name, $value, $params ) = $this->getHiddenFieldData( $value );
+               $this->mParent->addHiddenField( $name, $value, $params );
                return '';
        }
 
index 1b71ab9..8d28b59 100644 (file)
@@ -59,6 +59,14 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                                        $label
                                );
 
+                               if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
+                                       $checkbox = Html::rawElement(
+                                               'div',
+                                               array( 'class' => 'mw-ui-checkbox' ),
+                                               $checkbox
+                                       );
+                               }
+
                                $html .= ' ' . Html::rawElement(
                                        'div',
                                        array( 'class' => 'mw-htmlform-flatlist-item' ),
index 10bc67f..88df49d 100644 (file)
@@ -20,6 +20,7 @@ class HTMLTextField extends HTMLFormField {
                # @todo Enforce pattern, step, required, readonly on the server side as
                # well
                $allowedParams = array(
+                       'type',
                        'min',
                        'max',
                        'pattern',
@@ -38,10 +39,13 @@ class HTMLTextField extends HTMLFormField {
 
                $attribs += $this->getAttributes( $allowedParams );
 
+               # Extract 'type'
+               $type = isset( $attribs['type'] ) ? $attribs['type'] : 'text';
+               unset( $attribs['type'] );
+
                # Implement tiny differences between some field variants
                # here, rather than creating a new class for each one which
                # is essentially just a clone of this one.
-               $type = 'text';
                if ( isset( $this->mParams['type'] ) ) {
                        switch ( $this->mParams['type'] ) {
                                case 'int':
@@ -60,6 +64,7 @@ class HTMLTextField extends HTMLFormField {
                                        break;
                        }
                }
+
                return Html::input( $this->mName, $value, $type, $attribs );
        }
 }
index 1c7762b..7290740 100644 (file)
@@ -107,6 +107,15 @@ class CliInstaller extends Installer {
                if ( isset( $option['pass'] ) ) {
                        $this->setVar( '_AdminPassword', $option['pass'] );
                }
+
+               // Set up the default skins
+               $skins = $this->findExtensions( 'skins' );
+               $this->setVar( '_Skins', $skins );
+
+               if ( $skins ) {
+                       $skinNames = array_map( 'strtolower', $skins );
+                       $this->setVar( 'wgDefaultSkin', $this->getDefaultSkin( $skinNames ) );
+               }
        }
 
        /**
index 8a01b32..31b93c8 100644 (file)
@@ -163,19 +163,26 @@ abstract class DatabaseInstaller {
        }
 
        /**
-        * Create database tables from scratch.
+        * Apply a SQL source file to the database as part of running an installation step.
         *
+        * @param string $sourceFileMethod
+        * @param string $stepName
+        * @param string $archiveTableMustNotExist
         * @return Status
         */
-       public function createTables() {
+       private function stepApplySourceFile(
+               $sourceFileMethod,
+               $stepName,
+               $archiveTableMustNotExist = false
+       ) {
                $status = $this->getConnection();
                if ( !$status->isOK() ) {
                        return $status;
                }
                $this->db->selectDB( $this->getVar( 'wgDBname' ) );
 
-               if ( $this->db->tableExists( 'archive', __METHOD__ ) ) {
-                       $status->warning( 'config-install-tables-exist' );
+               if ( $archiveTableMustNotExist && $this->db->tableExists( 'archive', __METHOD__ ) ) {
+                       $status->warning( "config-$stepName-tables-exist" );
                        $this->enableLB();
 
                        return $status;
@@ -184,11 +191,13 @@ abstract class DatabaseInstaller {
                $this->db->setFlag( DBO_DDLMODE ); // For Oracle's handling of schema files
                $this->db->begin( __METHOD__ );
 
-               $error = $this->db->sourceFile( $this->db->getSchemaPath() );
+               $error = $this->db->sourceFile(
+                       call_user_func( array( $this->db, $sourceFileMethod ) )
+               );
                if ( $error !== true ) {
                        $this->db->reportQueryError( $error, 0, '', __METHOD__ );
                        $this->db->rollback( __METHOD__ );
-                       $status->fatal( 'config-install-tables-failed', $error );
+                       $status->fatal( "config-$stepName-tables-failed", $error );
                } else {
                        $this->db->commit( __METHOD__ );
                }
@@ -200,6 +209,24 @@ abstract class DatabaseInstaller {
                return $status;
        }
 
+       /**
+        * Create database tables from scratch.
+        *
+        * @return Status
+        */
+       public function createTables() {
+               return $this->stepApplySourceFile( 'getSchemaPath', 'install', true );
+       }
+
+       /**
+        * Insert update keys into table to prevent running unneded updates.
+        *
+        * @return Status
+        */
+       public function insertUpdateKeys() {
+               return $this->stepApplySourceFile( 'getUpdateKeysPath', 'updates', false );
+       }
+
        /**
         * Create the tables for each extension the user enabled
         * @return Status
index 427ded4..6e0c37f 100644 (file)
@@ -31,6 +31,7 @@ require_once __DIR__ . '/../../maintenance/Maintenance.php';
  * @since 1.17
  */
 abstract class DatabaseUpdater {
+       protected static $updateCounter = 0;
 
        /**
         * Array of updates to perform on the database
@@ -460,7 +461,8 @@ abstract class DatabaseUpdater {
                if ( !$this->canUseNewUpdatelog() ) {
                        return;
                }
-               $key = "updatelist-$version-" . time();
+               $key = "updatelist-$version-" . time() . self::$updateCounter;
+               self::$updateCounter++;
                $this->db->insert( 'updatelog',
                        array( 'ul_key' => $key, 'ul_value' => serialize( $updates ) ),
                        __METHOD__ );
@@ -907,7 +909,7 @@ abstract class DatabaseUpdater {
                if ( $wgLocalisationCacheConf['manualRecache'] ) {
                        $this->rebuildLocalisationCache();
                }
-               MessageBlobStore::clear();
+               MessageBlobStore::getInstance()->clear();
                $this->output( "done.\n" );
        }
 
@@ -984,6 +986,7 @@ abstract class DatabaseUpdater {
 
        /**
         * Updates the timestamps in the transcache table
+        * @return bool
         */
        protected function doUpdateTranscacheField() {
                if ( $this->updateRowExists( 'convert transcache field' ) ) {
index 57fdab3..760254d 100644 (file)
@@ -225,7 +225,7 @@ abstract class Installer {
 
                // $wgLogo is probably wrong (bug 48084); set something that will work.
                // Single quotes work fine here, as LocalSettingsGenerator outputs this unescaped.
-               'wgLogo' => '$wgStylePath/common/images/wiki.png',
+               'wgLogo' => '$wgScriptPath/resources/assets/wiki.png',
        );
 
        /**
@@ -286,27 +286,27 @@ abstract class Installer {
        public $licenses = array(
                'cc-by' => array(
                        'url' => 'http://creativecommons.org/licenses/by/3.0/',
-                       'icon' => '{$wgStylePath}/common/images/cc-by.png',
+                       'icon' => '{$wgResourceBasePath}/resources/assets/licenses/cc-by.png',
                ),
                'cc-by-sa' => array(
                        'url' => 'http://creativecommons.org/licenses/by-sa/3.0/',
-                       'icon' => '{$wgStylePath}/common/images/cc-by-sa.png',
+                       'icon' => '{$wgResourceBasePath}/resources/assets/licenses/cc-by-sa.png',
                ),
                'cc-by-nc-sa' => array(
                        'url' => 'http://creativecommons.org/licenses/by-nc-sa/3.0/',
-                       'icon' => '{$wgStylePath}/common/images/cc-by-nc-sa.png',
+                       'icon' => '{$wgResourceBasePath}/resources/assets/licenses/cc-by-nc-sa.png',
                ),
                'cc-0' => array(
                        'url' => 'https://creativecommons.org/publicdomain/zero/1.0/',
-                       'icon' => '{$wgStylePath}/common/images/cc-0.png',
+                       'icon' => '{$wgResourceBasePath}/resources/assets/licenses/cc-0.png',
                ),
                'pd' => array(
                        'url' => '',
-                       'icon' => '{$wgStylePath}/common/images/public-domain.png',
+                       'icon' => '{$wgResourceBasePath}/resources/assets/licenses/public-domain.png',
                ),
                'gfdl' => array(
                        'url' => 'http://www.gnu.org/copyleft/fdl.html',
-                       'icon' => '{$wgStylePath}/common/images/gnu-fdl.png',
+                       'icon' => '{$wgResourceBasePath}/resources/assets/licenses/gnu-fdl.png',
                ),
                'none' => array(
                        'url' => '',
@@ -434,7 +434,11 @@ abstract class Installer {
        public function doEnvironmentChecks() {
                // Php version has already been checked by entry scripts
                // Show message here for information purposes
-               $this->showMessage( 'config-env-php', PHP_VERSION );
+               if ( wfIsHHVM() ) {
+                       $this->showMessage( 'config-env-hhvm', HHVM_VERSION );
+               } else {
+                       $this->showMessage( 'config-env-php', PHP_VERSION );
+               }
 
                $good = true;
                // Must go here because an old version of PCRE can prevent other checks from completing
@@ -736,6 +740,7 @@ abstract class Installer {
        /**
         * Environment check for register_globals.
         * Prevent installation if enabled
+        * @return bool
         */
        protected function envCheckRegisterGlobals() {
                if ( wfIniGetBool( 'register_globals' ) ) {
@@ -893,11 +898,12 @@ abstract class Installer {
        }
 
        /**
-        * Scare user to death if they have mod_security
+        * Scare user to death if they have mod_security or mod_security2
         * @return bool
         */
        protected function envCheckModSecurity() {
-               if ( self::apacheModulePresent( 'mod_security' ) ) {
+               if ( self::apacheModulePresent( 'mod_security' )
+                       || self::apacheModulePresent( 'mod_security2' ) ) {
                        $this->showMessage( 'config-mod-security' );
                }
 
@@ -1463,6 +1469,22 @@ abstract class Installer {
                return $exts;
        }
 
+       /**
+        * Returns a default value to be used for $wgDefaultSkin: the preferred skin, if available among
+        * the installed skins, or any other one otherwise.
+        *
+        * @param string[] $skinNames Names of installed skins.
+        * @return string
+        */
+       public function getDefaultSkin( array $skinNames ) {
+               $defaultSkin = $GLOBALS['wgDefaultSkin'];
+               if ( in_array( $defaultSkin, $skinNames ) ) {
+                       return $defaultSkin;
+               } else {
+                       return $skinNames[0];
+               }
+       }
+
        /**
         * Installs the auto-detected extensions.
         *
@@ -1519,6 +1541,7 @@ abstract class Installer {
                        array( 'name' => 'interwiki', 'callback' => array( $installer, 'populateInterwikiTable' ) ),
                        array( 'name' => 'stats', 'callback' => array( $this, 'populateSiteStats' ) ),
                        array( 'name' => 'keys', 'callback' => array( $this, 'generateKeys' ) ),
+                       array( 'name' => 'updates', 'callback' => array( $installer, 'insertUpdateKeys' ) ),
                        array( 'name' => 'sysop', 'callback' => array( $this, 'createSysop' ) ),
                        array( 'name' => 'mainpage', 'callback' => array( $this, 'createMainpage' ) ),
                );
@@ -1766,11 +1789,6 @@ abstract class Installer {
 
                // Some of the environment checks make shell requests, remove limits
                $GLOBALS['wgMaxShellMemory'] = 0;
-
-               // Don't bother embedding images into generated CSS, which is not cached
-               $GLOBALS['wgResourceLoaderLESSFunctions']['embeddable'] = function ( $frame, $less ) {
-                       return $less->toBool( false );
-               };
        }
 
        /**
index 4d86d11..ed11f8b 100644 (file)
@@ -52,6 +52,13 @@ class MssqlUpdater extends DatabaseUpdater {
                        array( 'updateConstraints', 'media_type', 'image', 'img_media_type' ),
                        array( 'updateConstraints', 'media_type', 'uploadstash', 'us_media_type' ),
                        // END: Constraint updates
+
+                       array( 'modifyField', 'image', 'img_major_mime',
+                               'patch-img_major_mime-chemical.sql' ),
+                       array( 'modifyField', 'oldimage', 'oi_major_mime',
+                               'patch-oi_major_mime-chemical.sql' ),
+                       array( 'modifyField', 'filearchive', 'fa_major_mime',
+                               'patch-fa_major_mime-chemical.sql' ),
                );
        }
 
index dcf37b6..990b5b0 100644 (file)
@@ -254,11 +254,18 @@ class MysqlUpdater 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_lang.sql' ),
                        array( 'addField', 'pagelinks', 'pl_from_namespace', 'patch-pl_from_namespace.sql' ),
                        array( 'addField', 'templatelinks', 'tl_from_namespace', 'patch-tl_from_namespace.sql' ),
                        array( 'addField', 'imagelinks', 'il_from_namespace', 'patch-il_from_namespace.sql' ),
+                       array( 'modifyField', 'image', 'img_major_mime',
+                               'patch-img_major_mime-chemical.sql' ),
+                       array( 'modifyField', 'oldimage', 'oi_major_mime',
+                               'patch-oi_major_mime-chemical.sql' ),
+                       array( 'modifyField', 'filearchive', 'fa_major_mime',
+                               'patch-fa_major_mime-chemical.sql' ),
                );
        }
 
index 3a3e809..f3dba3a 100644 (file)
@@ -679,7 +679,7 @@ class WebInstaller extends Installer {
                        'images/' . $icon;
                $alt = wfMessage( 'config-information' )->text();
 
-               return Html::infoBox( $text, $icon, $alt, $class, false );
+               return Html::infoBox( $text, $icon, $alt, $class );
        }
 
        /**
index f797ef9..3094d55 100644 (file)
@@ -124,53 +124,55 @@ class WebInstallerOutput {
         * @return string
         */
        public function getCSS() {
-               // Horrible, horrible hack: the installer is currently hardcoded to use the Vector skin, so load
-               // it here. Include instead of require, as this will work without it, it will just look bad.
-               // We need the 'global' statement for $wgResourceModules because the Vector skin adds the
-               // definitions for its RL modules there that we use implicitly below.
-               // @codingStandardsIgnoreStart
-               global $wgResourceModules; // This is NOT UNUSED!
-               // @codingStandardsIgnoreEnd
                global $wgStyleDirectory;
-               include_once "$wgStyleDirectory/Vector/Vector.php";
 
                $moduleNames = array(
                        // See SkinTemplate::setupSkinUserCss
                        'mediawiki.legacy.shared',
                        // See Vector::setupSkinUserCss
                        'mediawiki.skinning.interface',
-                       'skins.vector.styles',
-
-                       'mediawiki.legacy.config',
                );
 
-               $css = '';
+               if ( file_exists( "$wgStyleDirectory/Vector/Vector.php" ) ) {
+                       // Force loading Vector skin if available as a fallback skin
+                       // for whatever ResourceLoader wants to have as the default.
+
+                       // Include instead of require, as this will work without it, it will just look bad.
+                       // We need the 'global' statement for $wgResourceModules because the Vector skin adds the
+                       // definitions for its RL modules there that we use implicitly below.
+
+                       // @codingStandardsIgnoreStart
+                       global $wgResourceModules; // This is NOT UNUSED!
+                       // @codingStandardsIgnoreEnd
+
+                       include_once "$wgStyleDirectory/Vector/Vector.php";
+
+                       $moduleNames[] = 'skins.vector.styles';
+               }
+
+               $moduleNames[] = 'mediawiki.legacy.config';
 
                $resourceLoader = new ResourceLoader();
                $rlContext = new ResourceLoaderContext( $resourceLoader, new FauxRequest( array(
                                'debug' => 'true',
                                'lang' => $this->getLanguageCode(),
                                'only' => 'styles',
-                               'skin' => 'vector',
                ) ) );
+
+               $styles = array();
                foreach ( $moduleNames as $moduleName ) {
                        /** @var ResourceLoaderFileModule $module */
                        $module = $resourceLoader->getModule( $moduleName );
-                       // One of the modules will be missing if Vector is unavailable
-                       if ( !$module ) {
-                               continue;
-                       }
 
                        // Based on: ResourceLoaderFileModule::getStyles (without the DB query)
-                       $styles = ResourceLoader::makeCombinedStyles( $module->readStyleFiles(
-                               $module->getStyleFiles( $rlContext ),
-                               $module->getFlip( $rlContext )
-                       ) );
-
-                       $css .= implode( "\n", $styles );
+                       $styles = array_merge( $styles, ResourceLoader::makeCombinedStyles(
+                               $module->readStyleFiles(
+                                       $module->getStyleFiles( $rlContext ),
+                                       $module->getFlip( $rlContext )
+                       ) ) );
                }
 
-               return $css;
+               return implode( "\n", $styles );
        }
 
        /**
@@ -271,8 +273,8 @@ class WebInstallerOutput {
 <?php echo Html::openElement( 'body', array( 'class' => $this->getDir() ) ) . "\n"; ?>
 <div id="mw-page-base"></div>
 <div id="mw-head-base"></div>
-<div id="content">
-<div id="bodyContent">
+<div id="content" class="mw-body">
+<div id="bodyContent" class="mw-body-content">
 
 <h1><?php $this->outputTitle(); ?></h1>
 <?php
index 2a9c54c..2e31e41 100644 (file)
@@ -1037,7 +1037,7 @@ class WebInstallerOptions extends WebInstallerPage {
                                'var' => 'wgDefaultSkin',
                                'itemLabels' => array_fill_keys( $skinNames, 'config-skins-use-as-default' ),
                                'values' => $skinNames,
-                               'value' => $this->getVar( 'wgDefaultSkin', $this->getDefaultSkin( $skinNames ) ),
+                               'value' => $this->getVar( 'wgDefaultSkin', $this->parent->getDefaultSkin( $skinNames ) ),
                        ) );
 
                        foreach ( $skins as $skin ) {
@@ -1254,22 +1254,6 @@ class WebInstallerOptions extends WebInstallerPage {
                $this->addHTML( $this->getCCDoneBox() );
        }
 
-       /**
-        * Returns a default value to be used for $wgDefaultSkin: the preferred skin, if available among
-        * the installed skins, or any other one otherwise.
-        *
-        * @param string[] $skinNames Names of installed skins.
-        * @return string
-        */
-       public function getDefaultSkin( array $skinNames ) {
-               $defaultSkin = $GLOBALS['wgDefaultSkin'];
-               if ( in_array( $defaultSkin, $skinNames ) ) {
-                       return $defaultSkin;
-               } else {
-                       return $skinNames[0];
-               }
-       }
-
        /**
         * If the user skips this installer page, we still need to set up the default skins, but ignore
         * everything else.
@@ -1282,7 +1266,7 @@ class WebInstallerOptions extends WebInstallerPage {
 
                if ( $skins ) {
                        $skinNames = array_map( 'strtolower', $skins );
-                       $this->parent->setVar( 'wgDefaultSkin', $this->getDefaultSkin( $skinNames ) );
+                       $this->parent->setVar( 'wgDefaultSkin', $this->parent->getDefaultSkin( $skinNames ) );
                }
 
                return true;
index d7dbd2c..0aeae7f 100644 (file)
@@ -51,6 +51,7 @@
        "config-env-good": "Асяродзьдзе было праверанае.\nВы можаце ўсталёўваць MediaWiki.",
        "config-env-bad": "Асяродзьдзе было праверанае.\nУсталяваньне MediaWiki немагчымае.",
        "config-env-php": "Усталяваны PHP $1.",
+       "config-env-hhvm": "HHVM $1 усталяваная.",
        "config-unicode-using-utf8": "Выкарыстоўваецца бібліятэка Unicode-нармалізацыі Браяна Вібэра",
        "config-unicode-using-intl": "Выкарыстоўваецца [http://pecl.php.net/intl intl пашырэньне з PECL] для Unicode-нармалізацыі",
        "config-unicode-pure-php-warning": "'''Папярэджаньне''': [http://pecl.php.net/intl Пашырэньне intl з PECL] — ня слушнае для Unicode-нармалізацыі, цяпер выкарыстоўваецца марудная PHP-рэалізацыя.\nКалі ў Вас сайт з высокай наведваемасьцю, раім пачытаць пра [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-нармалізацыю].",
        "config-skins": "Тэмы афармленьня",
        "config-skins-help": "Пералічаныя вышэй тэмы афармленьня знойдзеныя ў вашай тэчцы <code>./skins</code>. Вы мусіце ўключыць як мінімум адну, а таксама абраць тэму па змоўчаньні.",
        "config-skins-use-as-default": "Выкарыстоўваць па змоўчаньні гэтую тэму афармленьня",
+       "config-skins-missing": "Тэмы афармленьня ня знойдзеныя; MediaWiki будзе ўжываць рэзэрвовую тэму афармленьня, пакуль вы не ўсталюеце нешта адпаведнае.",
+       "config-skins-must-enable-some": "Вы павінны ўключыць як мінімум адну тэму афармленьня.",
+       "config-skins-must-enable-default": "Тэма афармленьня, абраная па змоўчаньні, мусіць быць уключаная.",
        "config-install-alreadydone": "'''Папярэджаньне:''' здаецца, што Вы ўжо ўсталёўвалі MediaWiki і спрабуеце зрабіць гэтай зноў.\nКалі ласка, перайдзіце на наступную старонку.",
        "config-install-begin": "Пасьля націску кнопкі «{{int:config-continue}}» пачнецца ўсталяваньне MediaWiki.\nКалі Вы жадаеце што-небудзь зьмяніць, націсьніце кнопку «{{int:config-back}}».",
        "config-install-step-done": "зроблена",
        "config-install-stats": "Ініцыялізацыі статыстыкі",
        "config-install-keys": "Стварэньне сакрэтных ключоў",
        "config-insecure-keys": "<strong>Папярэджаньне:</strong> {{PLURAL:$2|1=Ключ бясьпекі $1 створаны|Ключы бясьпекі $1 створаныя}} падчас усталяваньня, {{PLURAL:$2|1=не зьяўляецца паўнасьцю бясьпечным|не зьяўляюцца поўнасьцю бясьпечнымі}}. Рэкамэндуецца зьмяніць {{PLURAL:$2|1=яго ўручную|іх уручную}}.",
+       "config-install-updates": "Прадухіленьне запуску непатрэбных абнаўленьняў",
+       "config-install-updates-failed": "<strong>Памылка</strong>: устаўка ключоў абнаўленьня ў табліцы завершылася наступнай памылкай: $1",
        "config-install-sysop": "Стварэньне рахунку адміністратара",
        "config-install-subscribe-fail": "Немагчыма падпісацца на «mediawiki-announce»: $1",
        "config-install-subscribe-notpossible": "cURL не ўсталяваны, <code>allow_url_fopen</code> недаступны.",
index 7f353ec..028ef62 100644 (file)
@@ -1,5 +1,20 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Чаховіч Уладзіслаў"
+               ]
+       },
+       "config-desc": "Інсталятар MediaWiki",
+       "config-information": "Інфармацыя",
+       "config-localsettings-key": "Ключ абнаўлення:",
+       "config-your-language": "Ваша мова:",
+       "config-wiki-language": "Мова Вікі:",
+       "config-back": "← Назад",
+       "config-page-language": "Мова",
+       "config-page-welcome": "Сардэчна запрашаем у MediaWiki!",
+       "config-page-name": "Назва",
+       "config-page-options": "Настройкі",
+       "config-upload-settings": "Загрузка выяў і файлаў",
        "mainpagetext": "'''MediaWiki паспяхова ўсталяваная.'''",
        "mainpagedocfooter": "Гл. [//meta.wikimedia.org/wiki/Help:Contents Дапаможнік карыстальніка (англ.)] па далейшыя звесткі аб карыстанні вікі-праграмамі.\n\n== З чаго пачаць ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Пералік параметраў канфігурацыі (англ.)]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧАПЫ MediaWiki (англ.)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]"
 }
index b59a628..32e4c39 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "DCLXVI",
-                       "아라"
+                       "아라",
+                       "StanProg"
                ]
        },
        "config-desc": "Инсталатор на МедияУики",
@@ -47,7 +48,6 @@
        "config-env-good": "Средата беше проверена.\nИнсталирането на МедияУики е възможно.",
        "config-env-bad": "Средата беше проверена.\nНе е възможна инсталация на МедияУики.",
        "config-env-php": "Инсталирана е версия на PHP $1.",
-       "config-env-php-toolow": "Инсталирана е версия на PHP $1.\nМедияУики изисква версия PHP $2 или по-нова.",
        "config-unicode-using-utf8": "Използване на utf8_normalize.so от Brion Vibber за нормализация на Уникод.",
        "config-unicode-using-intl": "Използване на разширението [http://pecl.php.net/intl intl PECL] за нормализация на Уникод.",
        "config-unicode-pure-php-warning": "'''Предупреждение''': [http://pecl.php.net/intl Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е запознаването с [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализацията на Уникод].",
@@ -55,7 +55,6 @@
        "config-no-db": "Не може да бъде открит подходящ драйвер за база от данни! Необходимо е да се инсталира драйвер за база от данни за PHP.\nПоддържат се следните типове базни от данни: $1.\n\nАко използвате споделен хостинг, помолете доставчика на услугата да инсталира подходящ драйвер за база от данни.\nАко сами сте компилирали PHP, преконфигурирайте го с включен клиент за база от данни, например чрез използване на <code>./configure --with-mysql</code>.\nАко сте инсталирали PHP от пакет за Debian или Убунту, необходимо е, също така, да инсталирате и модула php5-mysql.",
        "config-outdated-sqlite": "<strong>Предупреждение:</strong> имате инсталиран SQLite  $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.",
        "config-no-fts3": "'''Предупреждение''': SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.",
-       "config-register-globals": "'''Предупреждение: Настройката на PHP <code>[http://php.net/register_globals register_globals]</code> е включена.'''\n'''При възможност е препоръчително тя да бъде изключена.'''\nМедияУики ще работи, но сървърът е изложен на евентуални пропуски в сигурността.",
        "config-magic-quotes-runtime": "'''Фатално: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] е активирана!'''\nТова може да повреди непредвидимо въвеждането на данните.\nИнсталацията на МедияУики е невъзможна докато тази настройка не бъде изключена.",
        "config-magic-quotes-sybase": "'''Фатално: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] е активирана!'''\nТова може да повреди непредвидимо въвеждането на данните.\nИнсталацията на МедияУики е невъзможна докато тази настройка не бъде изключена.",
        "config-mbstring": "'''Фатално: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активирана!'''\nТова може да повреди непредвидимо въвеждането на данните.\nИнсталацията на МедияУики е невъзможна докато тази настройка не бъде изключена.",
        "config-memcache-badport": "Портовете за Memcached трябва да бъдат между $1 и $2.",
        "config-extensions": "Разширения",
        "config-extensions-help": "Разширенията от списъка по-горе бяха открити в директорията <code>./extensions</code>.\n\nВъзможно е те да изискват допълнително конфигуриране, но сега могат да бъдат включени.",
+       "config-skins": "Облици",
        "config-install-alreadydone": "'''Предупреждение:''' Изглежда вече сте инсталирали МедияУики и се опитвате да го инсталирате отново.\nПродължете към следващата страница.",
        "config-install-begin": "Инсталацията на МедияУики ще започне след натискане на бутона „{{int:config-continue}}“.\nВ случай, че е необходимо да се направят промени, използва се бутона „{{int:config-back}}“.",
        "config-install-step-done": "готово",
index 880e974..212c599 100644 (file)
        "config-help-restart": "আপনি কী সকল সংরক্ষিত উপাত্ত পরিষ্কার করতে যা আপনি প্রবেস করিয়েছিলেন এবং ইন্সটালেসন ব্যবস্থা পুনরায় আরম্ভ করতে চান?",
        "config-restart": "হ্যাঁ, পুনরায় চালু করুন",
        "config-env-php": "পিএইচপি $1 ইন্সটল করা হয়েছে।",
+       "config-env-hhvm": "HHVM $1 ইনস্টল করা হয়েছে।",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] ইনস্টল করা হয়েছে",
        "config-apc": "[http://www.php.net/apc এপিসি] ইনস্টল হয়েছে",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ইনস্টল করা হয়েছে",
        "config-db-type": "ডেটাবেজের ধরন:",
        "config-db-host": "ডেটাবেজের হোস্ট:",
        "config-db-wiki-settings": "এই উইকি সনাক্ত করুন",
@@ -44,6 +47,9 @@
        "config-db-install-account": "ইন্সটলের জন্য ব্যবহারকারী অ্যাকাউন্ট",
        "config-db-username": "ডেটাবেজের ব্যবহারকারী নাম:",
        "config-db-password": "ডেটাবেজের শব্দচাবি:",
+       "config-db-username-empty": "আপনাকে অবশ্যই \"{{int:config-db-username}}\"-এর জন্য একটি মান প্রবেশ করাতে হবে।",
+       "config-db-wiki-account": "সাধারণ অভিযানের জন্য ব্যবহারকারী একাউন্ট",
+       "config-db-prefix": "উপাত্তশালা ছক প্রিফিক্স:",
        "config-db-charset": "ডেটাবেজের অক্ষর সেট",
        "config-db-port": "ডেটাবেজ পোর্ট:",
        "config-db-schema": "মিডিয়াউইকির স্কিমা",
@@ -51,6 +57,7 @@
        "config-sqlite-dir": "এসকিউলাইট ডেটা ডিরেক্টরি:",
        "config-oracle-def-ts": "পূর্বনির্ধারিত টেবিলস্পেস",
        "config-oracle-temp-ts": "সাময়কি টেবিলস্পেস:",
+       "config-type-mssql": "মাইক্রোসফট এসকিউএল সার্ভার",
        "config-header-mysql": "মাইএসকিউএল সেটিংস",
        "config-header-postgres": "পোস্টগ্রেএসকিউএল সেটিংস",
        "config-header-sqlite": "এসকিউলাইট সেটিংস",
@@ -92,6 +99,7 @@
        "config-license": "কপিরাইট ও লাইসেন্স:",
        "config-license-none": "কোনো লাইসেন্স ফুটার নেই",
        "config-license-cc-by-sa": "ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন শেয়ার অ্যালাইক",
+       "config-license-cc-by": "ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন",
        "config-license-cc-by-nc-sa": "ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন নন-কমার্শিয়াল শেয়ার অ্যালাইক",
        "config-license-cc-0": "ক্রিয়েটিভ কমন্স জিরো (পাবলিক ডোমেইন)",
        "config-license-pd": "পাবলিক ডোমেইন",
index c2aaf64..78381be 100644 (file)
@@ -50,6 +50,7 @@
        "config-env-good": "Gwiriet eo bet an endro.\nGallout a rit staliañ MediaWiki.",
        "config-env-bad": "Gwiriet eo bet an endro.\nNe c'hallit ket staliañ MediaWiki.",
        "config-env-php": "Staliet eo PHP $1.",
+       "config-env-hhvm": "HHVM $1 zo staliet.",
        "config-unicode-using-utf8": "Oc'h implijout utf8_normalize.so gant Brion Vibber evit ar reolata Unicode.",
        "config-unicode-using-intl": "Oc'h implijout [http://pecl.php.net/intl an astenn PECL intl] evit ar reolata Unicode.",
        "config-unicode-pure-php-warning": "'''Diwallit''' : N'haller ket kaout an [http://pecl.php.net/intl intl PECL astenn] evit merañ reoladur Unicode, a zistro d'ar stumm gorrek emplementet e-PHP.\nMa lakait da dreiñ ul lec'hienn darempredet-stank e vo mat deoc'h lenn un tammig bihan diwar-benn se war [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization]. (e saozneg)",
        "config-header-oracle": "Arventennoù Oracle",
        "config-header-mssql": "Arventennoù Microsoft SQL Server",
        "config-invalid-db-type": "Direizh eo ar seurt diaz roadennoù",
-       "config-missing-db-name": "Ret eo deoc'h merkañ un dalvoudenn evit \"Anv an diaz titouroù\"",
-       "config-missing-db-host": "Ret eo deoc'h merkañ un dalvoudenn evit \"Ostiz an diaz titouroù\"",
-       "config-missing-db-server-oracle": "Ret eo deoc'h merkañ un dalvoudenn evit \"Anv TNS an diaz titouroù\"",
+       "config-missing-db-name": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-host}}\"",
+       "config-missing-db-server-oracle": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-host-oracle}}\".",
        "config-invalid-db-server-oracle": "Direizh eo anv TNS an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha pikoù (.).",
        "config-invalid-db-name": "Direizh eo anv an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).",
        "config-invalid-db-prefix": "Direizh eo rakger an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).",
        "config-db-web-help": "Diuzañ an anv implijer hag ar ger-tremen a vo implijet gant ar servijer web evit kevreañ ouzh ar servijer diaz roadennoù pa vez ar wiki o vont en-dro war ar pemdez.",
        "config-db-web-account-same": "Ober gant an hevelep kont hag an hini implijet evit ar staliañ",
        "config-db-web-create": "Krouiñ ar gont ma n'eus ket anezhi c'hoazh",
+       "config-db-web-no-create-privs": "Ar gont ho peus diferet evit ar staliañ n'he deus ket gwirioù a-walc'h evit krouiñ ur gont.\nRet eo d'ar gont diferet amañ bezañ anezhi dija.",
        "config-mysql-engine": "Lusker stokañ :",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-install-interwiki-list": "Ne c'haller ket kavout ar restr <code>interwiki.list</code>.",
        "config-install-stats": "O sevel ar stadegoù",
        "config-install-keys": "Genel an alc'hwezioù kuzh",
+       "config-install-updates": "Mirout da lakaat hizivadennoù diezhomm da vont en-dro",
        "config-install-sysop": "Krouidigezh kont ar merour",
        "config-install-subscribe-fail": "N'haller ket koumanantiñ da mediawiki-announce : $1",
        "config-install-subscribe-notpossible": "cURL n'eo ket staliet ha ne c'haller ket ober gant <code>allow_url_fopen</code>.",
index 3f1fcfc..e0c985b 100644 (file)
@@ -5,7 +5,8 @@
                        "පසිඳු කාවින්ද",
                        "Kippelboy",
                        "Toniher",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Jmarchn"
                ]
        },
        "config-desc": "L'instal·lador del MediaWiki",
@@ -19,6 +20,8 @@
        "config-localsettings-incomplete": "El <code>LocalSettings.php</code> que hi ha sembla incomplet.\nLa variable $1 no està definida.\nCanvieu <code>LocalSettings.php</code> perquè la variable estigui definida i feu clic a «{{int:Config-continue}}».",
        "config-localsettings-connection-error": "S'ha trobat un error en connectar-se amb la base de dades fent servir els paràmetres especificats a <code>LocalSettings.php</code>. Corregiu aquests paràmetres i torneu-ho a provar.\n\n$1",
        "config-session-error": "Error en iniciar la sessió: $1",
+       "config-session-expired": "Les dades de la vostra sessió sembla que han caducat.\nLes sessions estan configurades per a un temps de $1.\nPodeu augmentar-lo posant <code>session.gc_maxlifetime</code> en php.ini.\nReprengueu el procés d'instal·lació.",
+       "config-no-session": "Les dades de la vostra sessió s'han perdut!\nComprovar el vostre php.ini i assegureu-vos que <code>session.save_path</code> està assignat a un directori apropiat.",
        "config-your-language": "La vostra llengua:",
        "config-your-language-help": "Seleccioneu la llengua que s'utilitzarà durant el procés d'instal·lació.",
        "config-wiki-language": "Llengua del wiki:",
        "config-help-restart": "Voleu esborrar totes les dades que heu introduït i tornar a començar el procés d'instal·lació?",
        "config-restart": "Sí, torna a començar",
        "config-welcome": "=== Comprovacions de l'entorn ===\nS'efectuaran comprovacions bàsiques per veure si l'entorn és adequat per a la instal·lació del MediaWiki.\nRecordeu d'incloure aquesta informació si heu de demanar ajuda sobre com completar la instal·lació.",
+       "config-copyright": "=== Drets d'autor i condicions ===\n\n$1\n\nAquest programa és de programari lliure; podeu redistribuir-lo i/o modificar-lo sota les condicions de la Llicència Pública General GNU com es publicada per la Free Software Foundation; qualsevol versió 2 de la llicència, o (opcionalment) qualsevol versió posterior.\n\nAquest programa és distribueix amb l'esperança que serà útil, però <strong>sense cap garantia</strong>; sense ni tan sols la garantia implícita de <strong>\ncomerciabilitat</strong> o <strong>idoneïtat per a un propòsit particular</strong>.\nConsulteu la Llicència Pública General GNU, per a més detalls.\n\nHauríeu d'haver rebut <doclink href=\"Copying\">una còpia de la Llicència Pública General GNU</doclink> amb aquest programa; si no, escriviu a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA o [http://www.gnu.org/copyleft/gpl.html per llegir-lo en línia].",
+       "config-sidebar": "* [//www.mediawiki.org la Pàgina d'inici]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guia de l'Usuari]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guia de l'Administrador]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Llegeix-me</doclink>\n* <doclink href=ReleaseNotes>Notes de la versió</doclink>\n* <doclink href=Còpia>Còpia</doclink>\n* <doclink href=UpgradeDoc>Actualització</doclink>",
        "config-env-good": "S'ha comprovat l'entorn.\nPodeu instal·lar el MediaWiki.",
        "config-env-bad": "S'ha comprovat l'entorn.\nNo podeu instal·lar el MediaWiki.",
        "config-env-php": "El PHP $1 està instal·lat.",
+       "config-env-hhvm": "L’HHVM $1 és instal·lat.",
        "config-memory-raised": "El <code>memory_limit</code> del PHP és $1 i s'ha aixecat a $2.",
        "config-memory-bad": "<strong>Avís:</strong> El <code>memory_limit</code> del PHP és $1.\nAixò és probablement massa baix.\nLa instal·lació pot fallar!",
        "config-apc": "L’[http://www.php.net/apc APC] està instal·lat",
        "config-profile-private": "Wiki privat",
        "config-license": "Copyright i llicència:",
        "config-license-none": "Sense llicència al peu de pàgina",
+       "config-license-cc-by-sa": "Creative Commons Reconeixement-CompartirIgual",
+       "config-license-cc-by": "Creative Commons Reconeixement",
+       "config-license-cc-by-nc-sa": "Creative Commons Reconeixement-NoComercial-CompartirIgual",
+       "config-license-cc-0": "Creative Commons Zero (Domini Públic)",
+       "config-license-gfdl": "GNU Free Documentation License 1.3 o posterior",
        "config-license-pd": "Domini públic",
+       "config-license-cc-choose": "Selecció d'una llicència personalitzada de Creative Commons",
        "config-email-settings": "Paràmetres del correu electrònic",
        "config-email-user": "Habilita el correu electrònic usuari-a-usuari",
        "config-email-user-help": "Permet que tots els usuaris puguin enviar-se correu si ho han habilitat a les preferències.",
index 0510bfc..a783cfe 100644 (file)
@@ -52,6 +52,7 @@
        "config-env-good": "Prostředí bylo zkontrolováno.\nMůžete nainstalovat MediaWiki.",
        "config-env-bad": "Prostředí bylo zkontrolováno.\nMediaWiki nelze nainstalovat.",
        "config-env-php": "Je nainstalováno PHP $1.",
+       "config-env-hhvm": "Je nainstalováno HHVM $1.",
        "config-unicode-using-utf8": "Pro normalizaci Unicode se používá utf8_normalize.so Briona Vibbera.",
        "config-unicode-using-intl": "Pro normalizaci Unicode se používá [http://pecl.php.net/intl PECL rozšíření intl].",
        "config-unicode-pure-php-warning": "'''Upozornění''': Není dostupné [http://pecl.php.net/intl PECL rozšíření intl] pro normalizaci Unicode, bude se využívat pomalá implementace v čistém PHP.\nPokud provozujete wiki s velkou návštěvností, měli byste si přečíst něco o [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizaci Unicode].",
        "config-install-stats": "Inicializují se statistiky",
        "config-install-keys": "Vytvářejí se tajné klíče",
        "config-insecure-keys": "'''Upozornění:''' {{PLURAL:$2|Tajný klíč|Tajné klíče}} ($1) vytvořené v průběhu instalace {{PLURAL:$2|není|nejsou}} zcela {{PLURAL:$2|bezpečný|bezpečné}}. Zvažte {{PLURAL:$2|jeho|jejich}} ruční změnu.",
+       "config-install-updates": "Ruší se spuštění nepotřebných aktualizací",
+       "config-install-updates-failed": "<strong>Chyba:</strong> Vložení aktualizačních klíčů do tabulek selhalo s následující chybou: $1",
        "config-install-sysop": "Zakládá se uživatelský účet správce",
        "config-install-subscribe-fail": "Nelze se přihlásit k odběru mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "Není nainstalován cURL a není dostupné <code>allow_url_fopen</code>.",
index 532d7c1..f329db9 100644 (file)
@@ -58,6 +58,7 @@
        "config-env-good": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann installiert werden.",
        "config-env-bad": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann nicht installiert werden.",
        "config-env-php": "Die Skriptsprache „PHP“ ($1) ist installiert.",
+       "config-env-hhvm": "HHVM $1 ist installiert.",
        "config-unicode-using-utf8": "Zur Unicode-Normalisierung wird Brion Vibbers <code>utf8_normalize.so</code> eingesetzt.",
        "config-unicode-using-intl": "Zur  Unicode-Normalisierung wird die [http://pecl.php.net/intl PECL-Erweiterung intl] eingesetzt.",
        "config-unicode-pure-php-warning": "'''Warnung:''' Die [http://pecl.php.net/intl PECL-Erweiterung intl] ist für die Unicode-Normalisierung nicht verfügbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt wird.\nSofern eine Website mit großer Benutzeranzahl betrieben wird, sollten weitere Informationen auf der Webseite [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-Normalisierung (en)] gelesen werden.",
        "config-advanced-settings": "Erweiterte Konfiguration",
        "config-cache-options": "Einstellungen für die Zwischenspeicherung von Objekten:",
        "config-cache-help": "Das Objektcaching wird dazu genutzt, die Geschwindigkeit von MediaWiki zu verbessern, indem häufig genutzte Daten zwischengespeichert werden.\nEs wird sehr empfohlen, es für mittelgroße bis große Wikis zu nutzen, aber auch für kleine Wikis ergeben sich erkennbare Geschwindigkeitsverbesserungen.",
-       "config-cache-none": "Kein Objektcaching (es wird keine Funktion entfernt, allerdings kann dies die Geschwindigkeit größerer Wikis negativ beeinflussen)",
+       "config-cache-none": "Kein Objektcaching (es wird keine Funktion entfernt, allerdings kann dies die Leistungsfähigkeit größerer Wikis negativ beeinflussen)",
        "config-cache-accel": "Objektcaching von PHP (APC, XCache oder WinCache)",
-       "config-cache-memcached": "Memcached Cacheserver nutzen (erfordert einen zusätzlichen Installationsvorgang mitsamt Konfiguration)",
+       "config-cache-memcached": "Memcached Cacheserver (erfordert einen zusätzlichen Installationsvorgang mitsamt Konfiguration)",
        "config-memcached-servers": "Memcached Cacheserver",
        "config-memcached-help": "Liste der für Memcached nutzbaren IP-Adressen.\nEs sollte eine je Zeile mitsamt des vorgesehenen Ports angegeben werden. Beispiele:\n127.0.0.1:11211 oder\n192.168.1.25:1234 usw.",
        "config-memcache-needservers": "Memcached wurde als Cacheserver ausgewählt. Dabei wurde allerdings kein Server angegeben.",
        "config-install-stats": "Statistiken werden initialisiert",
        "config-install-keys": "Geheimschlüssel werden erstellt",
        "config-insecure-keys": "'''Warnung:''' {{PLURAL:$2|Der Geheimschlüssel|Die Geheimschlüssel}} $1, {{PLURAL:$2|der|die}} während des Installationsvorgangs generiert {{PLURAL:$2|wurde, ist|wurden, sind}} nicht sehr sicher. {{PLURAL:$2|Er sollte|Sie sollten}} manuell geändert werden.",
+       "config-install-updates": "Unnötige Aktualisierungen nicht ausführen",
+       "config-install-updates-failed": "<strong>Fehler:</strong> Das Einfügen von Aktualisierungsschlüssel in die Tabellen ist mit dem folgenden Fehler fehlgeschlagen: $1",
        "config-install-sysop": "Administratorkonto wird erstellt",
        "config-install-subscribe-fail": "Abonnieren von „mediawiki-announce“ ist gescheitert: $1",
        "config-install-subscribe-notpossible": "cURL ist nicht installiert und <code>allow_url_fopen</code> ist nicht verfügbar.",
index 7d782d5..6b9f590 100644 (file)
@@ -15,7 +15,7 @@
        "config-license-none": "No licence footer",
        "config-license-gfdl": "GNU Free Documentation Licence 1.3 or later",
        "config-license-cc-choose": "Select a custom Creative Commons licence",
-       "config-license-help": "Many public wikis put all contributions under a [http://freedomdefined.org/Definition free licence].\nThis helps to create a sense of community ownership and encourages long-term contribution.\nIt is not generally necessary for a private or corporate wiki.\n\nIf you want to be able to use text from Wikipedia, and you want Wikipedia to be able to accept text copied from your wiki, you should choose '''Creative Commons Attribution Share Alike'''.\n\nWikipedia previously used the GNU Free Documentation Licence.\nThe GFDL is a valid licence, but it is difficult to understand.\nIt is also difficult to reuse content licenced under the GFDL.",
+       "config-license-help": "Many public wikis put all contributions under a [http://freedomdefined.org/Definition free licence].\nThis helps to create a sense of community ownership and encourages long-term contribution.\nIt is not generally necessary for a private or corporate wiki.\n\nIf you want to be able to use text from Wikipedia, and you want Wikipedia to be able to accept text copied from your wiki, you should choose <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nWikipedia previously used the GNU Free Documentation Licence.\nThe GFDL is a valid licence, but it is difficult to understand.\nIt is also difficult to reuse content licenced under the GFDL.",
        "config-cc-error": "The Creative Commons licence chooser gave no result.\nEnter the licence name manually.",
        "config-cc-not-chosen": "Choose which Creative Commons licence you want and click \"proceed\".",
        "config-install-stats": "Initialising statistics"
index bd76ada..4857495 100644 (file)
@@ -44,6 +44,7 @@
        "config-env-good": "The environment has been checked.\nYou can install MediaWiki.",
        "config-env-bad": "The environment has been checked.\nYou cannot install MediaWiki.",
        "config-env-php": "PHP $1 is installed.",
+       "config-env-hhvm": "HHVM $1 is installed.",
        "config-unicode-using-utf8": "Using Brion Vibber's utf8_normalize.so for Unicode normalization.",
        "config-unicode-using-intl": "Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalization.",
        "config-unicode-pure-php-warning": "<strong>Warning:</strong> The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.\nIf you run a high-traffic site, you should read a little on [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
@@ -69,7 +70,7 @@
        "config-apc": "[http://www.php.net/apc APC] is installed",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is installed",
        "config-no-cache": "<strong>Warning:</strong> Could not find [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].\nObject caching is not enabled.",
-       "config-mod-security": "<strong>Warning:</strong> Your web server has [http://modsecurity.org/ mod_security] enabled. If misconfigured, it can cause problems for MediaWiki or other software that allows users to post arbitrary content.\nRefer to [http://modsecurity.org/documentation/ mod_security documentation] or contact your host's support if you encounter random errors.",
+       "config-mod-security": "<strong>Warning:</strong> Your web server has [http://modsecurity.org/ mod_security]/mod_security2 enabled. Many common configurations of this will cause problems for MediaWiki and other software that allows users to post arbitrary content.\nIf possible, this should be disabled. Otherwise, refer to [http://modsecurity.org/documentation/ mod_security documentation] or contact your host's support if you encounter random errors.",
        "config-diff3-bad": "GNU diff3 not found.",
        "config-git": "Found the Git version control software: <code>$1</code>.",
        "config-git-bad": "Git version control software not found.",
        "config-install-stats": "Initializing statistics",
        "config-install-keys": "Generating secret keys",
        "config-insecure-keys": "<strong>Warning:</strong> {{PLURAL:$2|A secure key|Secure keys}} ($1) generated during installation {{PLURAL:$2|is|are}} not completely safe. Consider changing {{PLURAL:$2|it|them}} manually.",
+       "config-install-updates": "Prevent running unneeded updates",
+       "config-install-updates-failed": "<strong>Error:</strong> Inserting update keys into tables failed with the following error: $1",
        "config-install-sysop": "Creating administrator user account",
        "config-install-subscribe-fail": "Unable to subscribe to mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL is not installed and <code>allow_url_fopen</code> is not available.",
index 135a32b..ee1a2f4 100644 (file)
@@ -24,7 +24,8 @@
                        "McDutchie",
                        "Miguel2706",
                        "Macofe",
-                       "AVIADOR"
+                       "AVIADOR",
+                       "FuzzyDice"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
@@ -41,9 +42,9 @@
        "config-session-expired": "Tus datos de sesión parecen haber expirado.\nLas sesiones están configuradas por una duración de $1.\nPuedes incrementar esto configurando <code>session.gc_maxlifetime</code> en php.ini.\nReiniciar el proceso de instalación.",
        "config-no-session": "Se han perdido los datos de sesión.\nVerifica tu php.ini y comprueba que <code>session.save_path</code> está establecido en un directorio apropiado.",
        "config-your-language": "Tu idioma:",
-       "config-your-language-help": "Seleccionar un idioma a usar durante el proceso de instalación.",
+       "config-your-language-help": "Selecciona un idioma para usar durante el proceso de instalación.",
        "config-wiki-language": "Idioma del wiki:",
-       "config-wiki-language-help": "Seleccionar el idioma en el que el wiki será escrito predominantemente.",
+       "config-wiki-language-help": "Selecciona el idioma en el que se escribirá predominantemente el wiki.",
        "config-back": "← Atrás",
        "config-continue": "Continuar →",
        "config-page-language": "Idioma",
@@ -69,6 +70,7 @@
        "config-env-good": "El entorno ha sido comprobado.\nPuedes instalar MediaWiki.",
        "config-env-bad": "El entorno ha sido comprobado.\nNo puedes instalar MediaWiki.",
        "config-env-php": "PHP $1 está instalado.",
+       "config-env-hhvm": "HHVM $1 está instalado.",
        "config-unicode-using-utf8": "Usando utf8_normalize.so de Brion Vibber para la normalización Unicode.",
        "config-unicode-using-intl": "Usando la [http://pecl.php.net/intl extensión intl PECL] para la normalización Unicode.",
        "config-unicode-pure-php-warning": "'''Advertencia''': La [http://pecl.php.net/intl extensión intl] no está disponible para efectuar la normalización Unicode. Utilizando la implementación más lenta en PHP.\nSi tu web tiene mucho tráfico, te recomendamos leer acerca de la [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalización Unicode].",
        "config-no-cache": "'''Advertencia:''' No pudo encontrarse [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nEl caché de objetos no está habilitado.",
        "config-mod-security": "''' Advertencia ''': Su servidor web tiene [http://modsecurity.org/ mod_security] habilitado. Si la configuración es incorrecta, puede causar problemas a MediaWiki u otro software que permita a los usuarios publicar contenido arbitrarios.\nConsulte la [http://modsecurity.org/documentation/ documentación de mod_security] o contacte con el soporte de su servidor (''host'') si encuentra errores aleatorios.",
        "config-diff3-bad": "GNU diff3 no se encuentra.",
-       "config-git": "Se encontró el ''software'' de control de versiones Git: <code>$1</code>.",
+       "config-git": "Se encontró el software de control de versiones Git: <code>$1</code>.",
        "config-git-bad": "No se encontró el software de control de versiones Git.",
        "config-imagemagick": "ImageMagick encontrado: <code>$1</code>.\nLa miniaturización de imágenes se habilitará si habilitas las cargas.",
        "config-gd": "Se ha encontrado una biblioteca de gráficos GD integrada.\nLa miniaturización de imágenes se habilitará si habilitas las subidas.",
        "config-no-scaling": "No se ha encontrado ninguma biblioteca GD o ImageMagik.\nSe inhabilitará la miniaturización de imágenes.",
-       "config-no-uri": "'''Error:''' No se pudo determinar el URI actual.\nSe interrumpió la instalación.",
+       "config-no-uri": "<strong>Error:</strong> no se pudo determinar el URI actual.\nSe interrumpió la instalación.",
        "config-no-cli-uri": "<strong>Aviso:</strong> No se especificó <code>--scriptpath</code>; se usa el valor predeterminado: <code>$1</code>.",
        "config-using-server": "Utilizando el nombre de servidor \"<nowiki>$1</nowiki>\".",
-       "config-using-uri": "Utilizando la dirección URL del servidor \"<nowiki>$1$2</nowiki>\".",
+       "config-using-uri": "Utilizando la URL del servidor \"<nowiki>$1$2</nowiki>\".",
        "config-uploads-not-safe": "'''Atención:''' Su directorio por defecto para las cargas, <code>$1</code>, es vulnerable a la ejecución de scripts arbitrarios.\nAunque MediaWiki comprueba todos los archivos cargados por si hubiese amenazas de seguridad, es altamente recomendable [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security cerrar esta vulnerabilidad de seguridad] antes de activar las cargas.",
        "config-no-cli-uploads-check": "'''Atención:''' Su directorio predeterminado para cargas (<code>$1</code>) no está comprobado para la vulnerabilidad\n de ejecución arbitraria de comandos script durante la instalación de CLI.",
        "config-brokenlibxml": "El sistema tiene una combinación de versiones de PHP y de libxml2 que es poco confiable y puede provocar corrupción oculta en los datos de MediaWiki y otras aplicaciones web.\nActualizar a PHP 5.2.9 o posterior y a libxml2 2.7.3 o posterior ([//bugs.php.net/bug.php?id=45996 bug reportado con PHP]).\nInstalación abortada.",
        "config-suhosin-max-value-length": "Suhosin está instalado y limita el parámetro <code>length</code> GET a $1 bytes.\nEl componente ResourceLoader (gestor de recursos) de MediaWiki trabajará en este límite, pero eso perjudicará el rendimiento.\nSi es posible, deberías establecer <code>suhosin.get.max_value_length</code> en el valor 1024 o superior en <code>php.ini</code> y establecer <code>$wgResourceLoaderMaxQueryLength</code> en el mismo valor en <code>php.ini</code>.",
-       "config-db-type": "Tipo de base de datos",
+       "config-db-type": "Tipo de base de datos:",
        "config-db-host": "Servidor de la base de datos:",
        "config-db-host-help": "Si su servidor de base de datos está en otro servidor, escriba el nombre del host o su dirección IP aquí.\nSi está utilizando alojamiento web compartido, su proveedor de alojamiento debería darle el nombre correcto del servidor de alojamiento (host) en su documentación.\nSi va a instalarlo en un servidor Windows y utiliza MySQL, el uso de \"localhost\" como nombre del servidor puede no funcionar. Si no es así, intente poner \"127.0.0.1\" como dirección IP local.\nSi utiliza PostgreSQL, deje este campo en blanco para conectarse a través de un socket de Unix.",
        "config-db-host-oracle": "TNS de la base de datos:",
        "config-db-host-oracle-help": "Introduzca un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nombre de conexión local] válido; un archivo tnsnames.ora debe ser visible para esta instalación.<br />Si está utilizando bibliotecas de cliente 10g o más recientes también puede utilizar el método de asignación de nombres [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
-       "config-db-wiki-settings": "Identifique este wiki",
-       "config-db-name": "Nombre de base de datos:",
+       "config-db-wiki-settings": "Identifica este wiki",
+       "config-db-name": "Nombre de la base de datos:",
        "config-db-name-help": "Elija un nombre que identifique su wiki.\nNo debe contener espacios.\n\nSi está utilizando alojamiento web compartido, su proveedor de alojamiento le dará un nombre específico de base de datos para que lo utilice, o bien le permitirá crear bases de datos a través de un panel de control.",
-       "config-db-name-oracle": "Esquema de base de datos:",
+       "config-db-name-oracle": "Esquema de la base de datos:",
        "config-db-account-oracle-warn": "Hay tres escenarios compatibles para la instalación de Oracle como base de datos back-end:\n\nSi desea crear una cuenta de base de datos como parte del proceso de instalación, por favor suministre una cuenta con función SYSDBA como cuenta de base de datos para la instalación y especifique las credenciales deseadas de la cuenta de acceso al web, de lo contrario puede crear manualmente la cuenta de acceso al web y suministrar sólo esa cuenta (si tiene los permisos necesarios para crear los objetos de esquema) o suministrar dos cuentas diferentes, una con privilegios de creación y otra con acceso restringido a la web\n\nLa secuencia de comandos (script) para crear una cuenta con los privilegios necesarios puede encontrarse en el directorio \"maintenance/oracle/\" de esta instalación. Tenga en cuenta que utilizando una cuenta restringida desactivará todas las capacidades de mantenimiento con la cuenta predeterminada.",
        "config-db-install-account": "Cuenta de usuario para instalación",
-       "config-db-username": "Nombre de usuario de base de datos:",
-       "config-db-password": "contraseña de base de datos:",
+       "config-db-username": "Nombre de usuario de la base de datos:",
+       "config-db-password": "Contraseña de la base de datos:",
        "config-db-password-empty": "Introduzca una contraseña para el nuevo usuario de base de datos:  $1.\nAunque es posible crear usuarios sin contraseña, esto no es seguro.",
        "config-db-username-empty": "Debe introducir un valor para \"{{int:config-db-username}}\"",
        "config-db-install-username": "Introduzca el nombre de usuario que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nEste no es el nombre de usuario de la cuenta de MediaWiki; Este es el nombre de usuario para la base de datos.",
        "config-db-install-password": "Introduzca la contraseña que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nEsta no es la contraseña para la cuenta de MediaWiki; esta es la contraseña para la base de datos.",
        "config-db-install-help": "Ingresar el nombre de usuario y la contraseña que será usada para conectar a la base de datos durante el proceso de instalación.",
        "config-db-account-lock": "Usar el mismo nombre de usuario y contraseña durante operación normal",
-       "config-db-wiki-account": "Usar cuenta para operación normal",
+       "config-db-wiki-account": "Cuenta de usuario para operación normal",
        "config-db-wiki-help": "Introduce el nombre de usuario y la contraseña que serán usados para acceder a la base de datos durante la operación normal del wiki.\nSi esta cuenta no existe y la cuenta de instalación tiene suficientes privilegios, se creará esta cuenta de usuario con los privilegios mínimos necesarios para la operación normal del wiki.",
-       "config-db-prefix": "Prefijo de tablas de base de datos:",
+       "config-db-prefix": "Prefijo de tablas de la base de datos:",
        "config-db-prefix-help": "Si necesita compartir una base de datos entre múltiples wikis, o entre MediaWiki y otra aplicación web, puede optar por agregar un prefijo a todos los nombres de tabla para evitar conflictos.\nNo utilice espacios.\n\nNormalmente se deja este campo vacío.",
        "config-db-charset": "Conjunto de caracteres de la base de datos",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binario",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-charset-mysql4": "MySQL 4.0 retrocompatible UTF-8",
        "config-charset-help": "'''Atención:''' Si emplea '''backwards-compatible UTF-8''' en MySQL 4.1+ y posteriormente hace copia de seguridad de la base de datos con <code>mysqldump</code> , puede destruir todos los caracteres no-ASCII, ¡dañando irreversiblemente sus copias de seguridad!\n\nEn '''modo binario''', MediaWiki almacena texto UTF-8 en la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL, y le permite utilizar la gama completa de caracteres Unicode.\nEn ''' modo UTF-8'' ', MySQL sabrá el juego de caracteres de sus datos y puede presentarlos y convertirlos apropiadamente,\npero no le permitirá almacenar caracteres por encima del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
-       "config-mysql-old": "Se necesita MySQL $1 o una versión más reciente. Tienes la versión $2.",
+       "config-mysql-old": "Se necesita MySQL $1 o posterior. Tienes $2.",
        "config-db-port": "Puerto de la base de datos:",
        "config-db-schema": "Esquema para MediaWiki",
        "config-db-schema-help": "Estos esquemas usualmente estarán bien.\nAltéralos sólo si tienes la seguridad de que necesitas hacerlo.",
        "config-upgrade-done": "Actualización completa.\n\nUsted puede ahora [ $1  empezar a usar su wiki].\n\nSi desea regenerar su archivo <code>LocalSettings.php</code> de archivo, haga clic en el botón de abajo.\nEsto '''no se recomienda''' a menos que esté teniendo problemas con su wiki.",
        "config-upgrade-done-no-regenerate": "Actualización completa.\n\nUsted puede ahora [$1  empezar a usar su wiki].",
        "config-regenerate": "Regenerar LocalSettings.php →",
-       "config-show-table-status": "<code>SHOW TABLE STATUS</code> ha fallado!",
+       "config-show-table-status": "¡Falló la consulta <code>SHOW TABLE STATUS</code>!",
        "config-unknown-collation": "'''Advertencia:''' La base de datos está utilizando una intercalación no reconocida.",
-       "config-db-web-account": "Cuenta de base de datos para acceso Web",
+       "config-db-web-account": "Cuenta de la base de datos para acceso web",
        "config-db-web-help": "Elige el usuario y contraseña que el servidor Web usará para conectarse al servidor de la base de datos durante el fincionamiento normal del wiki.",
        "config-db-web-account-same": "Utilizar la misma cuenta que en la instalación",
        "config-db-web-create": "Crear la cuenta si no existe",
        "config-mysql-binary": "Binario",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "En '''modo binario''', MediaWiki almacena texto UTF-8 para la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.\n\nEn '''modo UTF-8''', MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no le permitirá almacenar caracteres por encima del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
-       "config-mssql-auth": "Tipo de autentificación:",
+       "config-mssql-auth": "Tipo de autenticación:",
        "config-mssql-install-auth": "Seleccione el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales de cualquier usuario de el servidor web que se está ejecutando van a ser utilizadas.",
        "config-mssql-web-auth": "Seleccione el tipo de autenticación que utilizará el servidor web para conectarse al servidor de base de datos, durante el funcionamiento normal de la wiki.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales del usuario que sea cual sea el servidor Web se ejecuta como será utilizado.",
        "config-mssql-sqlauth": "Autenticación de SQL Server",
        "config-site-name-blank": "Ingresar un nombre de sitio.",
        "config-project-namespace": "Espacio de nombre de proyecto:",
        "config-ns-generic": "Proyecto",
-       "config-ns-site-name": "Igual como el nombre del wiki: $1",
+       "config-ns-site-name": "Igual al nombre del wiki: $1",
        "config-ns-other": "Otro (especificar)",
        "config-ns-other-default": "MiWiki",
        "config-project-namespace-help": "Siguiendo el ejemplo de  Wikipedia, muchos wikis mantienen sus páginas de políticas separadas de sus páginas de contenido, en un \"'''espacio de nombres del proyecto'''\".\n\nTodos los títulos de página en este espacio de nombres comienzan con un determinado prefijo, que usted puede especificar aquí.\nTradicionalmente, este prefijo se deriva del nombre del wiki, pero no puede contener caracteres de puntuación como \"#\" o \":\".",
        "config-admin-box": "Cuenta de administrador",
        "config-admin-name": "Tu nombre de usuario:",
        "config-admin-password": "Contraseña:",
-       "config-admin-password-confirm": "Repita la contraseña:",
+       "config-admin-password-confirm": "Repite la contraseña:",
        "config-admin-help": "Escribe aquí el nombre de usuario que desees, como por ejemplo \"Pedro Bloggs\".\nEste es el nombre que usarás para entrar al wiki.",
        "config-admin-name-blank": "Introduce un nombre de usuario de administrador.",
        "config-admin-name-invalid": "El nombre de usuario especificado \"<nowiki>$1</nowiki>\" no es válido.\nEspecifique un nombre de usuario diferente.",
        "config-profile-fishbowl": "Sólo editores autorizados",
        "config-profile-private": "Wiki privado",
        "config-profile-help": "Los wikis funcionan mejor cuando dejas que los edite tanta gente como sea posible.\nEn MediaWiki, es fácil revisar los cambios recientes y revertir los daños realizados por usuarios malintencionados o novatos.\nSin embargo, muchos han encontrado que MediaWiki es útil para una amplia variedad de funciones, y a veces no es fácil convencer a todos de los beneficios de la forma wiki.\nPor lo tanto tienes la elección.\n\nEl modelo '''{{int:config-profile-wiki}}''' permite que cualquiera pueda editar, sin siquiera iniciar sesión.\nUn wiki con '''{{int:config-profile-no-anon}}''' ofrece rendición de cuentas adicional, pero puede disuadir a colaboradores.\n\nEl modelo '''{{int:config-profile-fishbowl}}''' permite editar a los usuarios autorizados, pero el público puede ver las páginas, incluyendo el historial.\nUn '''{{int:config-profile-private}}''' sólo permite ver páginas a los usuarios autorizados, el mismo grupo al que le está permitido editar.\n\nConfiguraciones más complejas de derechos de usuario están disponibles después de la instalación, consulte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights esta entrada en el manual].",
-       "config-license": "Copyright and licencia:",
+       "config-license": "Derechos de autor y licencia:",
        "config-license-none": "Pie sin licencia",
-       "config-license-cc-by-sa": "Creative Commons Reconocimiento Compartir Igual",
-       "config-license-cc-by": "Creative Commons Reconocimiento",
-       "config-license-cc-by-nc-sa": "Creative Commons Reconocimiento Compartir Igual no comercial",
+       "config-license-cc-by-sa": "Creative Commons Atribución-CompartirIgual",
+       "config-license-cc-by": "Creative Commons Atribución",
+       "config-license-cc-by-nc-sa": "Creative Commons Atribución-NoComercial-CompartirIgual",
        "config-license-cc-0": "Creative Commons Zero (dominio público)",
        "config-license-gfdl": "Licencia de documentación libre de GNU 1.3 o posterior",
-       "config-license-pd": "Dominio Público",
+       "config-license-pd": "Dominio público",
        "config-license-cc-choose": "Selecciona una licencia personalizada de Creative Commons",
        "config-license-help": "Muchos wikis públicos ponen todas las contribuciones bajo una [http://freedomdefined.org/Definition licencia libre].\nEsto ayuda a crear un sentido de propiedad comunitaria y alienta la contribución a largo plazo.\nEsto no es generalmente necesario para un wiki privado o corporativo.\n\nSi deseas poder utilizar texto de Wikipedia, y deseas que Wikipedia pueda aceptar el texto copiado de tu wiki, debes elegir <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nWikipedia utilizaba anteriormente la licencia de documentación libre de GNU (GFDL).\nLa GFDL es una licencia válida, pero es difícil de entender.\nTambién es difícil reutilizar el contenido licenciado bajo la GFDL.",
        "config-email-settings": "Configuración de correo electrónico",
        "config-enable-email": "Activar el envío de correos electrónicos",
        "config-enable-email-help": "Si quieres que el correo electrónico funcione, la [http://www.php.net/manual/en/mail.configuration.php configuración PHP de correo electrónico] debe ser la correcta.\nSi no quieres la funcionalidad de correo electrónico, puedes desactivarla aquí.",
-       "config-email-user": "Habilitar correo electrónico de usuario a usuario",
+       "config-email-user": "Habilitar correo electrónico entre usuarios",
        "config-email-user-help": "Permitir que todos los usuarios intercambien correos electrónicos si lo han activado en sus preferencias.",
        "config-email-usertalk": "Activar notificaciones de páginas de discusión de usuarios",
        "config-email-usertalk-help": "Permitir a los usuarios recibir notificaciones de cambios en la página de discusión de usuario, si lo han activado en sus preferencias.",
        "config-install-user": "Creando el usuario de la base de datos",
        "config-install-user-alreadyexists": "El usuario \"$1\" ya existe",
        "config-install-user-create-failed": "La creación del usuario \"$1\" falló:  $2",
-       "config-install-user-grant-failed": "La concesión de permisos para el usuario \"$1\" ha fallado: $2",
+       "config-install-user-grant-failed": "La concesión de permisos al usuario \"$1\" falló: $2",
        "config-install-user-missing": "El usuario especificado \"$1\" no existe.",
        "config-install-user-missing-create": "El usuario especificado \"$1\" no existe.\nPor favor, haga clic en la casilla \"Crear cuenta\" que aparece a continuación si desea crearlo.",
        "config-install-tables": "Creando tablas",
        "config-install-interwiki-list": "No se pudo encontrar el archivo <code>interwiki.list</code>.",
        "config-install-interwiki-exists": "'''Advertencia''': La tabla de interwikis parece ya contener entradas.\nSe omitirá la lista predeterminada.",
        "config-install-stats": "Iniciando las estadísticas",
-       "config-install-keys": "Generación de claves secretas",
+       "config-install-keys": "Generando claves secretas",
        "config-insecure-keys": "''' Atención:'' '  {{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}}. Considere {{PLURAL:$2| cambiarla|cambiarlas}} manualmente.",
-       "config-install-sysop": "Creando cuenta de usuario del administrador",
+       "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",
        "config-install-subscribe-fail": "No se ha podido suscribir a mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL no está instalado y <code>allow_url_fopen</code> no está disponible.",
        "config-install-mainpage": "Creando página principal con contenido predeterminado",
        "config-install-mainpage-failed": "No se pudo insertar la página principal: $1",
        "config-install-done": "<strong>¡Felicidades!</strong>\nHas instalado MediaWiki correctamente.\n\nEl instalador ha generado un  archivo <code>LocalSettings.php</code>.\nEste contiene toda su configuración.\n\nDeberás descargarlo y ponerlo en la base de la instalación de wiki (el mismo directorio que index.php). La descarga debería haber comenzado automáticamente.\n\nSi no comenzó la descarga, o si se ha cancelado, puedes reiniciar la descarga haciendo clic en el siguiente enlace:\n\n$3\n\n<strong>Nota</strong>: Si no haces esto ahora, este archivo de configuración generado no estará disponible más tarde si sales de la instalación sin descargarlo.\n\nCuando lo hayas hecho, podrás <strong>[$2  entrar en tu wiki]</strong>.",
        "config-download-localsettings": "Descargar archivo <code>LocalSettings.php</code>",
-       "config-help": "Ayuda",
-       "config-help-tooltip": "Haz clic para ampliar",
+       "config-help": "ayuda",
+       "config-help-tooltip": "haz clic para ampliar",
        "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
        "config-extension-link": "¿Sabías que tu wiki admite [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar el [//www.mediawiki.org/wiki/Extension_Matrix centro de extensiones] para ver una lista completa.",
-       "mainpagetext": "'''MediaWiki ha sido instalado con éxito.'''",
+       "mainpagetext": "<strong>MediaWiki se ha instalado con éxito.<strong>",
        "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents/es guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki en tu idioma]"
 }
index 13b61ed..8fae026 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Avjoska",
-                       "Pikne"
+                       "Pikne",
+                       "Boxmein"
                ]
        },
        "config-information": "Teave",
@@ -26,6 +27,7 @@
        "config-page-upgradedoc": "Uuendamine",
        "config-page-existingwiki": "Olemasolev viki",
        "config-restart": "Jah, tee taaskäivitus",
+       "config-env-hhvm": "HHVM $1 on installitud.",
        "config-db-name": "Andmebaasi nimi:",
        "config-db-username": "Andmebaasi kasutajanimi:",
        "config-db-password": "Andmebaasi parool:",
index d619cff..7e06c60 100644 (file)
@@ -6,7 +6,8 @@
                        "Ebraminio",
                        "Omidh",
                        "Pouyana",
-                       "Reza1615"
+                       "Reza1615",
+                       "Alirezaaa"
                ]
        },
        "config-desc": "نصب کنندهٔ ویکی‌مدیا",
@@ -19,7 +20,7 @@
        "config-upgrade-key-missing": "نصب موجود مدیاویکی شناسایی شده‌است.\nبرای بروزرسانی این نصب، لطفاً خط زیر را در آخر کد \nقرار دادن به نصب ارتقاء داده شده، به خط زیر لطفاً در پایین خود را <code>LocalSettings.php</code> قرار دهید:\n\n$1",
        "config-localsettings-incomplete": "وجود <code>LocalSettings.php</code> به نظر ناقص می‌رسد.\nمتغیر $1 تنظیم نشده‌است.\nبرای اینکه این متغیر تنظیم شود لطفاً <code>LocalSettings.php</code> را تغییر دهید، و \"{{int:Config-continue}}\" را کلیک کنید.",
        "config-localsettings-connection-error": "هنگام اتصال به پایگاه اطلاعاتی که ازتنظیمات مشخص شده در<code>LocalSettings.php</code> استفاده می‌کند، خطایی رخ داد. لطفاً این تنظیمات را نصب کنید و دوباره تلاش کنید.\n$1",
-       "config-session-error": "خطا در شروع جلسه $1",
+       "config-session-error": "خطا در شروع جلسه: $1",
        "config-session-expired": "به نظر می‌رسد اطلاعات جلسهٔ شما منقضی شده‌است.\nجلسات برای مادام العمر $1 پیکربندی شده‌اند.\nشما می‌توانید این پیکربندی را با تنظیم <code>session.gc_maxlifetime</code> در php.ini افزایش دهید.\nروند نصب را دوباره شروع کنید.",
        "config-no-session": "اطلاعات دورهٔ شما از دست رفته‌ است!\nphp.ini خود را بررسی کنید و مطمئن شوید <code>session.save_path</code> برای یک فهرست مناسب تنظیم شده‌است.",
        "config-your-language": "زبان شما:",
        "config-page-language": "زبان",
        "config-page-welcome": "به مدیاویکی خوش آمدید!",
        "config-page-dbconnect": "اتصال به پایگاه داده",
-       "config-page-upgrade": "نصب موجود را ارتقاء دهید.",
-       "config-page-dbsettings": "تÙ\86ظÛ\8cÙ\85ات Ù¾Ø§Û\8cگاÙ\87 Ø§Ø·Ù\84اعاتÛ\8c",
+       "config-page-upgrade": "ارتقای نصب موجود",
+       "config-page-dbsettings": "تÙ\86ظÛ\8cÙ\85ات Ù¾Ø§Û\8cگاÙ\87 Ø¯Ø§Ø¯Ù\87",
        "config-page-name": "نام",
        "config-page-options": "گزینه‌ها",
        "config-page-install": "نصب",
        "config-page-complete": "کامل!",
-       "config-page-restart": "نصب را دوباره شروع کنید",
+       "config-page-restart": "راه‌اندازی دوباره نصب",
        "config-page-readme": "مرا بخوان",
        "config-page-releasenotes": "یادداشت‌های انتشار",
        "config-page-copying": "تکثیر",
-       "config-page-upgradedoc": "ارتقا",
+       "config-page-upgradedoc": "ارتقاء",
        "config-page-existingwiki": "ویکی موجود",
        "config-help-restart": "آیا می‌خواهید همهٔ اطلاعات ذخیره شده‌ای که وارد کرده‌اید را پاک کنید و دوباره روند نصب را شروع کنید؟",
-       "config-restart": "بله ، آن دوباره راه اندازی کن",
+       "config-restart": "بله، دوباره راه‌اندازی کن",
        "config-welcome": "===بررسی‌های محیطی===\nبرای فهمیدن اینکه این محیط برای نصب مدیاویکی مناسب است، اکنون بررسی‌های اساسی انجام خواهد‌شد.\nاگر به دنبال پشتیبانی در چگونگی تکمیل نصب هستید،به یاد داشته باشید این اطلاعات را بگنجانید.",
        "config-copyright": "===حق چاپ و شرایط===\n$1\nاین برنامه،نرم‌افزاری آزاد است;شما می‌توانید این برنامه را دوباره توزیع کنید و/یا تحت شرایط مجوز عمومی کلی جی‌ان‌یو که توسط بنیاد نرم‌افزار آزاد منتشر شده،اصلاح کنید;یا نسخهٔ 2 مجوز، یا (به انتخاب خود) هر نسخهٔ پس از این.\nاین برنامه به امید اینکه مفید واقع‌ شود توزیع شده‌است،اما '''بدون هیچ ضمانتی'''; حتی بدون اشارهٔ ضمانتی از '''قابلیت عرضه''' یا ''' صلاحیت برای یک هدف خاص'''.\nبرای جزئیات بیشتر مجوز عمومی کلی جی‌ان‌یو را مشاهده کنید.\nشما باید <doclink href=Copying> یک چاپ ازمجوز عمومی کلی </doclink> همراه این برنامه دریافت کنید; اگر دریافت نکردید،به بنیاد نرم‌افزار آزاد بنویسید،Inc.،خیابان فرانکلین۵۱،طبقه پنجم،بوستون، MA۰۲۱۱۰-۱۳۰،آمریکا،یا [http://www.gnu.org/copyleft/gpl.html read it online].",
        "config-sidebar": "* [//www.mediawiki.org صفحهٔ اصلی مدیاویکی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربر]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents راهنمای مدیر]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های رایج]\n----\n* <doclink href=Readme>مرا بخوان</doclink>\n* <doclink href=ReleaseNotes>یادداشت‌های انتشار</doclink>\n* <doclink href=Copying>نسخه برداری</doclink>\n* <doclink href=UpgradeDoc>ارتقا</doclink>",
        "config-env-good": "محیط بررسی شده‌است.\nشما می‌توانید مدیاویکی را نصب کنید.",
        "config-env-bad": "محیط بررسی شده‌است.\nشما نمی‌توانید مدیاویکی را نصب کنید.",
        "config-env-php": "پی‌اچ‌پی $1 نصب شده‌است.",
+       "config-env-hhvm": "HHVM $1 نصب شده‌است.",
        "config-unicode-using-utf8": "برای یونیکد عادی از Brion Vibber's utf8_normalize.so استفاده کنید.",
        "config-unicode-using-intl": "برای یونیکد عادی از [http://pecl.php.net/intl intl PECL extension] استفاده کنید.",
        "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization] را بخوانید.",
@@ -78,8 +80,8 @@
        "config-no-cache": "'''هشدار:''' [http://www.php.net/apc APC],[http://xcache.lighttpd.net/ XCache] یا [http://www.iis.net/download/WinCacheForPhp WinCache] را نتوانست پیدا کند.\nذخیره شی فعال نیست.",
        "config-mod-security": "'''هشدار:''' وب سرور شما [http://modsecurity.org/ mod_security] فعال است.اگر اشتباه پیکربندی شده‌‌ باشد،می تواند باعث ایجاد مشکلاتی برای مدیاویکی یا دیگر نرم‌افزاری شود که به کاربران اجازه می‌دهد پیام دلخواه ارسال کنند.\nبه [http://modsecurity.org/documentation/ mod_security documentation] مراجعه کنید یا اگر با خطاهای اتفاقی مواجه شدید با پشتیبانی میزبان خود در تماس باشید.",
        "config-diff3-bad": "جی‌ان‌یو دیف۳ پیدا نشد.",
-       "config-git": "نسخهٔ کنترل نرم‌افزار جیت پیدا شد:<code>$1</code>.",
-       "config-git-bad": "نسخه نرم‌افزار کنترل جیت پیدا نشد.",
+       "config-git": "کنترل نسخهٔ نرم‌افزار گیت پیدا شد: <code>$1</code>.",
+       "config-git-bad": "کنترل نسخهٔ نرم‌افزار گیت پیدا نشد.",
        "config-imagemagick": "ایمیج‌مجیک پیدا شد: <code>$1</code>.\nاگر ارسال‌ها را فعال کنید،تصویر کوچک فعال خواهد‌شد.",
        "config-gd": "گرافیک‌های جی‌دی ساخته‌‌ شده در کتابخانه پیدا شد.\nاگر ارسال‌ها را فعال کنید تصویر کوچک فعال خواهد‌شد.",
        "config-no-scaling": "کتابخانهٔ جی‌دی یا ایمیج‌مجیک نتوانست پیدا شود.\nتصویر کوچک غیر‌فعال خواهد‌شد.",
        "config-db-install-account": "حساب کاربری برای نصب",
        "config-db-username": "نام کاربری پایگاه اطلاعات:",
        "config-db-password": "گذرواژه پایگاه داده‌ها:",
-       "config-db-password-empty": "Ù\84Ø·Ù\81اÙ\8b Û\8cÚ© Ø±Ù\85ز Ø¹Ø¨Ù\88ر Ø¨Ø±Ø§Û\8c Ú©Ø§Ø±Ø¨Ø± Ø¬Ø¯Û\8cد پایگاه اطلا‌عاتی وارد کنید: $1\nدر صورتی که ممکن است کاربران بدون رمز عبور به وجود آیند،امن نیست.",
+       "config-db-password-empty": "Ù\84Ø·Ù\81اÙ\8b Û\8cÚ© Ø±Ù\85ز Ø¹Ø¨Ù\88ر Ø¨Ø±Ø§Û\8c Ú©Ø§Ø±Ø¨Ø± ØªØ§Ø²Ù\87 پایگاه اطلا‌عاتی وارد کنید: $1\nدر صورتی که ممکن است کاربران بدون رمز عبور به وجود آیند،امن نیست.",
        "config-db-username-empty": "شما باید یک مقدار برای \"نام کاربری {{int:config-db-username}}\" وارد کنید",
        "config-db-install-username": "نام کاربری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین نام کاربری حساب مدیاویکی نیست; نام کاربری برای پایگاه اطلاعاتی شما است.",
        "config-db-install-password": "رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین رمز عبور برای حساب مدیاویکی نیست;رمز عبور برای پایگاه اطلاعاتی شما است.",
        "config-profile": "شرح‌حال حقوق کاربر:",
        "config-profile-wiki": "بازکردن ویکی",
        "config-profile-no-anon": "ساخت کاربری مورد نیاز است",
-       "config-profile-fishbowl": "فقط کاربر تأیید شده",
+       "config-profile-fishbowl": "فقط کاربر مجاز",
        "config-profile-private": "ویکی خصوصی",
        "config-profile-help": "زمانی ویکی درست کار می کند که شما اجازه دهید تعداد زیادی از مردم آن را ویرایش کنند.\nدر مدیاویکی امکان مشاهدهٔ تغییرات اخیر و واگردانی ویرایش‌های خرابکاری به آسانی وجود دارد.\n\nبا وجودی که مدیا ویکی منافع بسیاری برای مردم دارد ولی متقاعد کردن خیلی از مردم درباره روش کار ویکی‌ها کار آسانی نیست.\n\nدر نتیجه شما دو انتخاب دارید.\n\n'''{{int:config-profile-wiki}}''' به همه کاربرها اجازهٔ ویرایش می دهد حتی بدون ثبت‌نام.\n\nیک ویکی که دارای '''{{int:config-profile-no-anon}}''' باشد امکانات کاربری بیشتری ارائه می‌دهد ولی امکان دارد ویرایشگران عادی را نگران کند.\n\nسناریوی '''{{int:config-profile-fishbowl}}''' به کاربرها اجازهٔ ویرایش می دهد ولی همه می توانند متن و تاریخچه را ببیند.\n\n'''{{int:config-profile-private}}''' فقط به کاربران اجازهٔ مشاهدهٔ مطالب را می‌دهد و فقط آنها می توانند ویرایش کنند.\n\nدسترسی‌های بیشتر کاربری بعد از نصب در [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights راهنماهای مرتبط] موجود است.",
        "config-license": "حق تکثیر و مجوز:",
        "config-install-stats": "شروع آمار",
        "config-install-keys": "تولید کلیدهای مخفی",
        "config-insecure-keys": "'''هشدار:''' {{PLURAL:$2|کلید امن|کلیدهای امن}} ($1) در طی نصب  کاملاً ایمن {{PLURAL:$2|نیست|نیستند}}. تغییر دستی {{PLURAL:$2|آن|آنها}} را در نظر بگیرید.",
+       "config-install-updates": "جلوگیری از به روز رسانی‌های غیر ضروری در حال اجرا",
+       "config-install-updates-failed": "<strong>خطا:</strong> قراردادن کلیدهای به روز رسانی به داخل جداول با خطای روبرو مواجه شد: $1",
        "config-install-sysop": "ایجاد حساب کاربری مدیر",
        "config-install-subscribe-fail": "قادر تصدیق اعلام مدیاویکی نیست:$1",
        "config-install-subscribe-notpossible": "سی‌یوآر‌ال نصب نشده‌است و <code>allow_url_fopen</code> در دسترس نیست.",
index 0835f41..c40544d 100644 (file)
@@ -12,7 +12,8 @@
                        "아라",
                        "Elseweyr",
                        "Lliehu",
-                       "Syreeni"
+                       "Syreeni",
+                       "Stryn"
                ]
        },
        "config-desc": "MediaWiki-asennin",
@@ -56,6 +57,7 @@
        "config-env-good": "Asennusympäristö on tarkastettu.\nVoit asentaa MediaWikin.",
        "config-env-bad": "Asennusympäristö on tarkastettu.\nEt voi asentaa MediaWikiä.",
        "config-env-php": "PHP $1 on asennettu.",
+       "config-env-hhvm": "HHVM $1 on asennettu.",
        "config-no-db": "Sopivaa tietokanta-ajuria ei löytynyt! Sinun täytyy asentaa tietokanta-ajurit PHP:lle.\nSeuraavat tietokantatyypit ovat tuettuja: $1.",
        "config-outdated-sqlite": "<strong>Varoitus:</strong> sinulla on käytössä SQLite $1, joke on vanhempi kuin vähintään vaadittava versio $2. SQLite ei ole saatavilla.",
        "config-safe-mode": "'''Varoitus:''' PHP:n [http://www.php.net/features.safe-mode safe mode] -tila on aktiivinen.\nSe voi aiheuttaa ongelmia erityisesti tiedostojen tallentamisen ja matemaattisten kaavojen kanssa.",
index 57d7444..9fd6726 100644 (file)
@@ -66,6 +66,7 @@
        "config-env-good": "L’environnement a été vérifié.\nVous pouvez installer MediaWiki.",
        "config-env-bad": "L’environnement a été vérifié.\nVous ne pouvez pas installer MediaWiki.",
        "config-env-php": "PHP $1 est installé.",
+       "config-env-hhvm": "HHVM $1 est installé.",
        "config-unicode-using-utf8": "Utilisation de utf8_normalize.so par Brion Vibber pour la normalisation Unicode.",
        "config-unicode-using-intl": "Utilisation de [http://pecl.php.net/intl l'extension PECL intl] pour la normalisation Unicode.",
        "config-unicode-pure-php-warning": "<strong>Attention</strong> : L'[http://pecl.php.net/intl extension PECL intl] n'est pas disponible pour la normalisation d’Unicode, retour à la version lente implémentée en PHP.\nSi votre site web sera très fréquenté, vous devriez lire ceci : [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).",
        "config-install-stats": "Initialisation des statistiques",
        "config-install-keys": "Génération de la clé secrète",
        "config-insecure-keys": "'''Avertissement''' : {{PLURAL:$2|Une clé de sécurité générée ($1) pendant l'installation n'est pas complètement sécuritaire. Envisagez de la modifier manuellement.|Des clés de sécurité générées ($1) pendant l'installation ne sont pas complètement sécuritaires. Envisagez de les modifier manuellement.}}",
+       "config-install-updates": "Empêcher l’exécution des mises à jour inutiles",
+       "config-install-updates-failed": "<strong>Erreur :</strong> L’insertion de clés modifiées dans les tables a échoué avec l’erreur suivante : $1",
        "config-install-sysop": "Création du compte administrateur",
        "config-install-subscribe-fail": "Impossible de s'abonner à mediawiki-announce : $1",
        "config-install-subscribe-notpossible": "cURL n’est pas installé et <code>allow_url_fopen</code> n’est pas disponible.",
index b809a4c..a42cb17 100644 (file)
        "config-help-restart": "Quere eliminar todos os datos gardados e reiniciar o proceso de instalación?",
        "config-restart": "Si, reiniciala",
        "config-welcome": "=== Comprobación da contorna ===\nCómpre realizar agora unhas comprobacións básicas para ver se a contorna é axeitada para a instalación de MediaWiki.\nLembre incluír esta información se necesita axuda para completar a instalación.",
-       "config-copyright": "=== Dereitos de autor e termos de uso ===\n\n$1\n\nEste programa é software libre; pode redistribuílo e/ou modificalo segundo os termos da licenza pública xeral GNU publicada pola Free Software Foundation; versión 2 ou (na súa escolla) calquera outra posterior.\n\nEste programa distribúese coa esperanza de que poida ser útil, pero '''sen garantía ningunha'''; nin sequera a garantía implícita de '''comercialización''' ou '''adecuación a unha finalidade específica'''.\nOlle a licenza pública xeral GNU para obter máis detalles.\n\nDebería recibir <doclink href=Copying>unha copia da licenza pública xeral GNU</doclink> xunto ao programa; se non é así, escriba á Free Software Foundation, Inc., rúa Franklin, número 51, quinto andar, Boston, Massachusetts, 02110-1301, Estados Unidos de América ou [http://www.gnu.org/copyleft/gpl.html lea a licenza en liña].",
+       "config-copyright": "=== Dereitos de autor e termos de uso ===\n\n$1\n\nEste programa é software libre; pode redistribuílo e/ou modificalo segundo os termos da licenza pública xeral GNU publicada pola Free Software Foundation; versión 2 ou (na súa escolla) calquera outra posterior.\n\nEste programa distribúese coa esperanza de que poida ser útil, pero <strong>sen garantía ningunha</strong>; nin sequera a garantía implícita de <strong>comercialización</strong> ou <strong>adecuación a unha finalidade específica</strong>.\nOlle a licenza pública xeral GNU para obter máis detalles.\n\nDebería recibir <doclink href=Copying>unha copia da licenza pública xeral GNU</doclink> xunto ao programa; se non é así, escriba á Free Software Foundation, Inc., rúa Franklin, número 51, quinto andar, Boston, Massachusetts, 02110-1301, Estados Unidos de América ou [http://www.gnu.org/copyleft/gpl.html lea a licenza en liña].",
        "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/gl Páxina principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guía de usuario]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guía de administrador]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes]\n----\n* <doclink href=Readme>Léame</doclink>\n* <doclink href=ReleaseNotes>Notas de lanzamento</doclink>\n* <doclink href=Copying>Copia</doclink>\n* <doclink href=UpgradeDoc>Actualizacións</doclink>",
        "config-env-good": "Rematou a comprobación da contorna.\nPode instalar MediaWiki.",
        "config-env-bad": "Rematou a comprobación da contorna.\nNon pode instalar MediaWiki.",
        "config-env-php": "Está instalado o PHP $1.",
+       "config-env-hhvm": "Está instalado o HHVM $1.",
        "config-unicode-using-utf8": "Usando utf8_normalize.so de Brion Vibber para a normalización Unicode.",
        "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensión intl PECL] para a normalización Unicode.",
-       "config-unicode-pure-php-warning": "'''Atención:''' A [http://pecl.php.net/intl extensión intl PECL] non está dispoñible para manexar a normalización Unicode; volvendo á implementación lenta de PHP puro.\nSe o seu sitio posúe un alto tráfico de visitantes, debería ler un chisco sobre a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalización Unicode].",
-       "config-unicode-update-warning": "'''Atención:''' A versión instalada da envoltura de normalización Unicode emprega unha versión vella da biblioteca [http://site.icu-project.org/ do proxecto ICU].\nDebería [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations actualizar] se o uso de Unicode é importante para vostede.",
+       "config-unicode-pure-php-warning": "<strong>Atención:</strong> A [http://pecl.php.net/intl extensión intl PECL] non está dispoñible para manexar a normalización Unicode; volvendo á implementación lenta de PHP puro.\nSe o seu sitio posúe un alto tráfico de visitantes, debería ler un chisco sobre a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalización Unicode].",
+       "config-unicode-update-warning": "<strong>Atención:</strong> A versión instalada da envoltura de normalización Unicode emprega unha versión vella da biblioteca [http://site.icu-project.org/ do proxecto ICU].\nDebería [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations actualizar] se o uso de Unicode é importante para vostede.",
        "config-no-db": "Non se puido atopar un controlador axeitado para a base de datos! Necesita instalar un controlador de base de datos para PHP.\nOs tipos de base de datos admitidos son os seguintes: $1.\n\nSe compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar, por exemplo, o módulo <code>php5-mysql</code>.",
-       "config-outdated-sqlite": "'''Atención:''' Ten o SQLite $1, que é inferior á versión mínima necesaria: $2. O SQLite non estará dispoñible.",
-       "config-no-fts3": "'''Atención:''' O SQLite está compilado sen o [//sqlite.org/fts3.html módulo FTS3]; as características de procura non estarán dispoñibles nesta instalación.",
+       "config-outdated-sqlite": "<strong>Atención:</strong> Ten o SQLite $1, que é inferior á versión mínima necesaria: $2. O SQLite non estará dispoñible.",
+       "config-no-fts3": "<strong>Atención:</strong> O SQLite está compilado sen o [//sqlite.org/fts3.html módulo FTS3]; as características de procura non estarán dispoñibles nesta instalación.",
        "config-register-globals-error": "<strong>Erro: A opción <code>[http://php.net/register_globals register_globals]</code> do PHP está activada.\nCómpre desactivala para continuar a instalación.</strong>\nConsulte o enderezo [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] para obter axuda sobre como facelo.",
-       "config-magic-quotes-runtime": "'''Erro fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activado!'''\nEsta opción corrompe os datos de entrada de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
-       "config-magic-quotes-sybase": "'''Erro fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activado!'''\nEsta opción corrompe os datos de entrada de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
-       "config-mbstring": "'''Erro fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activado!'''\nEsta opción causa erros e pode corromper os datos de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
-       "config-safe-mode": "'''Atención:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está activado.\nIsto pode causar problemas, particularmente se emprega cargas de ficheiros e soporte de <code>math</code>.",
+       "config-magic-quotes-gpc": "<strong>Erro fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] está activado!</strong>\nEsta opción corrompe os datos de entrada de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
+       "config-magic-quotes-runtime": "<strong>Erro fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activado!</strong>\nEsta opción corrompe os datos de entrada de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
+       "config-magic-quotes-sybase": "<strong>Erro fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activado!</strong>\nEsta opción corrompe os datos de entrada de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
+       "config-mbstring": "<strong>Erro fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activado!</strong>\nEsta opción causa erros e pode corromper os datos de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
+       "config-safe-mode": "<strong>Atención:</strong> O [http://www.php.net/features.safe-mode safe mode] do PHP está activado.\nIsto pode causar problemas, particularmente se emprega cargas de ficheiros e soporte de <code>math</code>.",
        "config-xml-bad": "Falta o módulo XML do PHP.\nMediaWiki necesita funcións neste módulo e non funcionará con esta configuración.\nSe está executando o Mandrake, instale o paquete php-xml.",
        "config-pcre-old": "<strong>Erro fatal:</strong> Necesítase PCRE $1 ou posterior.\nO seu PHP binario está ligado con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Máis información].",
-       "config-pcre-no-utf8": "'''Erro fatal:''' Semella que o módulo PCRE do PHP foi compilado sen o soporte PCRE_UTF8.\nMediaWiki necesita soporte UTF-8 para funcionar correctamente.",
+       "config-pcre-no-utf8": "<strong>Erro fatal:</strong> Semella que o módulo PCRE do PHP foi compilado sen o soporte PCRE_UTF8.\nMediaWiki necesita soporte UTF-8 para funcionar correctamente.",
        "config-memory-raised": "O parámetro <code>memory_limit</code> do PHP é $1. Aumentado a $2.",
-       "config-memory-bad": "'''Atención:''' O parámetro <code>memory_limit</code> do PHP é $1.\nProbablemente é un valor baixo de máis.\nA instalación pode fallar!",
-       "config-ctype": "'''Erro fatal:''' O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
-       "config-json": "'''Erro fatal:''' O PHP compilouse sen o soporte de JSON.\nDebe instalar ben a extensión JSON do PHP ou a extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.\n* A extensión do PHP está incluída en Red Hat Enterprise Linux (CentOS) 5 e 6, mais debe activarse <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algunhas distribucións do Linux lanzadas despois de maio de 2013 omiten a extensión do PHP, pero inclúen a extensión PECL como <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
+       "config-memory-bad": "<strong>Atención:<strong> O parámetro <code>memory_limit</code> do PHP é $1.\nProbablemente é un valor baixo de máis.\nA instalación pode fallar!",
+       "config-ctype": "<strong>Erro fatal:</strong> O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+       "config-iconv": "<strong>Erro fatal:</strong> O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/iconv.installation.php extensión iconv].",
+       "config-json": "<strong>Erro fatal:</strong> O PHP compilouse sen o soporte de JSON.\nDebe instalar ben a extensión JSON do PHP ou a extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.\n* A extensión do PHP está incluída en Red Hat Enterprise Linux (CentOS) 5 e 6, mais debe activarse <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algunhas distribucións do Linux lanzadas despois de maio de 2013 omiten a extensión do PHP, pero inclúen a extensión PECL como <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado",
        "config-apc": "[http://www.php.net/apc APC] está instalado",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado",
-       "config-no-cache": "'''Atención:''' Non se puido atopar [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nA caché de obxectos está desactivada.",
-       "config-mod-security": "'''Atención:''' O seu servidor web ten o [http://modsecurity.org/ mod_security] activado. Se estivese mal configurado, pode causar problemas a MediaWiki ou calquera outro software que permita aos usuarios publicar contidos arbitrarios.\nOlle a [http://modsecurity.org/documentation/ documentación do mod_security] ou póñase en contacto co soporte do seu servidor se atopa erros aleatorios.",
+       "config-no-cache": "<strong>Atención:</strong> Non se puido atopar [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nA caché de obxectos está desactivada.",
+       "config-mod-security": "<strong>Atención:</strong> O seu servidor web ten o [http://modsecurity.org/ mod_security] activado. Se estivese mal configurado, pode causar problemas a MediaWiki ou calquera outro software que permita aos usuarios publicar contidos arbitrarios.\nOlle a [http://modsecurity.org/documentation/ documentación do mod_security] ou póñase en contacto co soporte do seu servidor se atopa erros aleatorios.",
        "config-diff3-bad": "GNU diff3 non se atopou.",
        "config-git": "Atopouse o software de control da versión de Git: <code>$1</code>.",
        "config-git-bad": "Non se atopou o software de control da versión de Git.",
        "config-imagemagick": "ImageMagick atopado: <code>$1</code>.\nAs miniaturas de imaxes estarán dispoñibles se activa as cargas.",
        "config-gd": "Atopouse a biblioteca gráfica GD integrada.\nAs miniaturas de imaxes estarán dispoñibles se activa as cargas.",
        "config-no-scaling": "Non se puido atopar a biblioteca GD ou ImageMagick.\nAs miniaturas de imaxes estarán desactivadas.",
-       "config-no-uri": "'''Erro:''' Non se puido determinar o URI actual.\nInstalación abortada.",
-       "config-no-cli-uri": "'''Aviso:''' Non se especificou ningún <code>--scriptpath</code>; por defecto, usarase: <code>$1</code>.",
+       "config-no-uri": "<strong>Erro:</strong> Non se puido determinar o URI actual.\nInstalación abortada.",
+       "config-no-cli-uri": "<strong>Atención:</strong> Non se especificou ningún <code>--scriptpath</code>; por defecto, usarase: <code>$1</code>.",
        "config-using-server": "Usando o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Usando o URL do servidor \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Atención:''' O seu directorio por defecto para as cargas, <code>$1</code>, é vulnerable a execucións arbitrarias de escrituras.\nAínda que MediaWiki comproba todos os ficheiros cargados por se houbese ameazas de seguridade, é amplamente recomendable [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security pechar esta vulnerabilidade de seguridade] antes de activar as cargas.",
-       "config-no-cli-uploads-check": "'''Atención:''' Durante a instalación CLI, o seu directorio por defecto para as cargas, <code>$1</code>, non se comproba fronte a posibles vulnerabilidades de execucións arbitrarias de escrituras.",
+       "config-uploads-not-safe": "<strong>Atención:</strong> O seu directorio por defecto para as cargas, <code>$1</code>, é vulnerable a execucións arbitrarias de escrituras.\nAínda que MediaWiki comproba todos os ficheiros cargados por se houbese ameazas de seguridade, é amplamente recomendable [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security pechar esta vulnerabilidade de seguridade] antes de activar as cargas.",
+       "config-no-cli-uploads-check": "<strong>Atención:</strong> Durante a instalación CLI, o seu directorio por defecto para as cargas, <code>$1</code>, non se comproba fronte a posibles vulnerabilidades de execucións arbitrarias de escrituras.",
        "config-brokenlibxml": "O seu sistema ten unha combinación de versións de PHP e libxml2 que pode ser problemático e causar corrupción de datos en MediaWiki e outras aplicacións web.\nActualice o sistema á versión 2.7.3 ou posterior de libxml2 ([https://bugs.php.net/bug.php?id=45996 erro presentado co PHP]).\nInstalación abortada.",
        "config-suhosin-max-value-length": "Suhosin está instalado e limita o parámetro GET <code>length</code> a $1 bytes.\nO compoñente ResourceLoader (xestor de recursos) de MediaWiki traballa neste límite, pero este prexudica o rendemento.\nSe é posible, debería establecer <code>suhosin.get.max_value_length</code> no valor 1024 ou superior en <code>php.ini</code> e establecer <code>$wgResourceLoaderMaxQueryLength</code> no mesmo valor en <code>LocalSettings.php</code>.",
        "config-db-type": "Tipo de base de datos:",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binario",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-charset-mysql4": "MySQL 4.0 retrocompatible UTF-8",
-       "config-charset-help": "'''Atención:''' Se emprega '''backwards-compatible UTF-8''' no MySQL 4.1+ e posteriormente realiza unha copia de seguridade da base de datos con <code>mysqldump</code>, pode destruír todos os caracteres que non sexan ASCII, corrompendo de xeito irreversible as súas copias!\n\nNo '''modo binario''', MediaWiki almacena texto UTF-8 na base de datos en campos binarios.\nIsto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango completo de caracteres Unicode.\nNo '''modo UTF-8''', MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,\npero non lle deixará gardar caracteres por riba do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
+       "config-charset-help": "<strong>Atención:</strong> Se emprega <strong>backwards-compatible UTF-8</strong> no MySQL 4.1+ e posteriormente realiza unha copia de seguridade da base de datos con <code>mysqldump</code>, pode destruír todos os caracteres que non sexan ASCII, corrompendo de xeito irreversible as súas copias!\n\nNo <strong>modo binario</strong>, MediaWiki almacena texto UTF-8 na base de datos en campos binarios.\nIsto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango completo de caracteres Unicode.\nNo <strong>modo UTF-8</strong>, MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,\npero non lle deixará gardar caracteres por riba do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
        "config-mysql-old": "Necesítase MySQL $1 ou posterior. Vostede ten a versión $2.",
        "config-db-port": "Porto da base de datos:",
        "config-db-schema": "Esquema para MediaWiki",
        "config-db-schema-help": "O normal é que este esquema sexa correcto.\nCámbieo soamente se sabe que é necesario.",
-       "config-pg-test-error": "Non se pode conectar coa base de datos '''$1''': $2",
+       "config-pg-test-error": "Non se pode conectar coa base de datos <strong>$1</strong>: $2",
        "config-sqlite-dir": "Directorio de datos SQLite:",
-       "config-sqlite-dir-help": "SQLite recolle todos os datos nun ficheiro único.\n\nO servidor web debe ter permisos sobre o directorio para que poida escribir nel durante a instalación.\n\nAdemais, o servidor '''non''' debe ser accesible a través da web, motivo polo que non está no mesmo lugar ca os ficheiros PHP.\n\nAsemade, o programa de instalación escribirá un ficheiro <code>.htaccess</code>, pero se erra alguén pode obter acceso á súa base de datos.\nIsto inclúe datos de usuario (enderezos de correo electrónico, contrasinais codificados), así como revisións borradas e outros datos restrinxidos no wiki.\n\nConsidere poñer a base de datos nun só lugar, por exemplo en <code>/var/lib/mediawiki/oseuwiki</code>.",
+       "config-sqlite-dir-help": "SQLite recolle todos os datos nun ficheiro único.\n\nO servidor web debe ter permisos sobre o directorio para que poida escribir nel durante a instalación.\n\nAdemais, o servidor <strong>non</strong> debe ser accesible a través da web, motivo polo que non está no mesmo lugar ca os ficheiros PHP.\n\nAsemade, o programa de instalación escribirá un ficheiro <code>.htaccess</code>, pero se erra alguén pode obter acceso á súa base de datos.\nIsto inclúe datos de usuario (enderezos de correo electrónico, contrasinais codificados), así como revisións borradas e outros datos restrinxidos no wiki.\n\nConsidere poñer a base de datos nun só lugar, por exemplo en <code>/var/lib/mediawiki/oseuwiki</code>.",
        "config-oracle-def-ts": "Espazo de táboas por defecto:",
        "config-oracle-temp-ts": "Espazo de táboas temporal:",
        "config-type-mysql": "MySQL (ou compatible)",
        "config-sqlite-readonly": "Non se pode escribir no ficheiro <code>$1</code>.",
        "config-sqlite-cant-create-db": "Non se puido crear o ficheiro da base de datos <code>$1</code>.",
        "config-sqlite-fts3-downgrade": "Falta o soporte FTS3 para o PHP; diminuíndo as táboas",
-       "config-can-upgrade": "Existen táboas MediaWiki nesta base de datos.\nPara actualizalas a MediaWiki $1, prema sobre \"'''Continuar'''\".",
-       "config-upgrade-done": "Actualización completada.\n\nAgora pode [$1 comezar a utilizar o seu wiki].\n\nSe quere rexenerar o seu ficheiro <code>LocalSettings.php</code>, prema no botón que aparece a continuación.\nIsto '''non é recomendable''' a menos que estea a ter problemas co seu wiki.",
+       "config-can-upgrade": "Existen táboas MediaWiki nesta base de datos.\nPara actualizalas a MediaWiki $1, prema sobre \"<strong>Continuar</strong>\".",
+       "config-upgrade-done": "Actualización completada.\n\nAgora pode [$1 comezar a utilizar o seu wiki].\n\nSe quere rexenerar o seu ficheiro <code>LocalSettings.php</code>, prema no botón que aparece a continuación.\nIsto <strong>non é recomendable</strong> a menos que estea a ter problemas co seu wiki.",
        "config-upgrade-done-no-regenerate": "Actualización completada.\n\nXa pode [$1 comezar a usar o seu wiki].",
        "config-regenerate": "Rexenerar LocalSettings.php →",
        "config-show-table-status": "A pescuda <code>SHOW TABLE STATUS</code> fallou!",
-       "config-unknown-collation": "'''Atención:''' A base de datos está a empregar unha clasificación alfabética irrecoñecible.",
+       "config-unknown-collation": "<strong>Atención:</strong> A base de datos está a empregar unha clasificación alfabética irrecoñecible.",
        "config-db-web-account": "Conta na base de datos para o acceso á internet",
        "config-db-web-help": "Seleccione o nome de usuario e contrasinal que o servidor web empregará para se conectar ao servidor da base de datos durante o funcionamento normal do wiki.",
        "config-db-web-account-same": "Empregar a mesma conta que para a instalación",
        "config-mysql-engine": "Motor de almacenamento:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Atención:''' Seleccionou MyISAM como o motor de almacenamento para MySQL, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nSe a súa instalación MySQL soporta InnoDB, recoméndase elixilo no canto de MyISAM.\nSe a súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
-       "config-mysql-only-myisam-dep": "'''Atención:''' MyISAM é o único motor de almacenamento para MySQL nesta máquina, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nA súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
-       "config-mysql-engine-help": "'''InnoDB''' é case sempre a mellor opción, dado que soporta ben os accesos simultáneos.\n\n'''MyISAM''' é máis rápido en instalacións de usuario único e de só lectura.\nAs bases de datos MyISAM tenden a se corromper máis a miúdo ca as bases de datos InnoDB.",
+       "config-mysql-myisam-dep": "<strong>Atención:</strong> Seleccionou MyISAM como o motor de almacenamento para MySQL, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nSe a súa instalación MySQL soporta InnoDB, recoméndase elixilo no canto de MyISAM.\nSe a súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
+       "config-mysql-only-myisam-dep": "<strong>Atención:</strong> MyISAM é o único motor de almacenamento para MySQL nesta máquina, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nA súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
+       "config-mysql-engine-help": "<strong>InnoDB</strong> é case sempre a mellor opción, dado que soporta ben os accesos simultáneos.\n\n<strong>MyISAM</strong> é máis rápido en instalacións de usuario único e de só lectura.\nAs bases de datos MyISAM tenden a se corromper máis a miúdo ca as bases de datos InnoDB.",
        "config-mysql-charset": "Conxunto de caracteres da base de datos:",
        "config-mysql-binary": "Binario",
        "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "No '''modo binario''', MediaWiki almacena texto UTF-8 na base de datos en campos binarios.\nIsto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango completo de caracteres Unicode.\n\nNo '''modo UTF-8''', MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,\npero non lle deixará gardar caracteres por riba do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
+       "config-mysql-charset-help": "No <strong>modo binario</strong>, MediaWiki almacena texto UTF-8 na base de datos en campos binarios.\nIsto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango completo de caracteres Unicode.\n\nNo <strong>modo UTF-8</strong>, MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,\npero non lle deixará gardar caracteres por riba do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
        "config-mssql-auth": "Tipo de autenticación:",
        "config-mssql-install-auth": "Seleccione o tipo de autenticación que se utilizará para conectarse á base de datos durante o proceso de instalación.\nSe selecciona \"{{int:config-mssql-windowsauth}}\", usaranse as credenciais do usuario co que se está a executar o servidor web.",
        "config-mssql-web-auth": "Seleccione o tipo de autenticación que utilizará o servidor web para conectarse ao servidor da base de datos durante o funcionamiento normal do wiki.\nSe selecciona \"{{int:config-mssql-windowsauth}}\", usaranse as credenciais do usuario co que se está a executar o servidor web.",
        "config-ns-site-name": "O mesmo nome que o wiki: $1",
        "config-ns-other": "Outro (especificar)",
        "config-ns-other-default": "OMeuWiki",
-       "config-project-namespace-help": "Seguindo o exemplo da Wikipedia, moitos wikis manteñen as súas páxinas de políticas separadas das súas páxinas de contido, nun \"'''espazo de nomes do proxecto'''\".\nTodos os títulos presentes neste espazo de nomes comezan cun prefixo determinado, que pode especificar aquí.\nTradicionalmente, este prefixo deriva do nome do wiki, pero non pode conter caracteres de puntuación como \"#\" ou \":\".",
+       "config-project-namespace-help": "Seguindo o exemplo da Wikipedia, moitos wikis manteñen as súas páxinas de políticas separadas das súas páxinas de contido, nun \"'''espazo de nomes do proxecto'''\".\nTodos os títulos presentes neste espazo de nomes comezan cun prefixo determinado, que pode especificar aquí.\nNormalmente, este prefixo deriva do nome do wiki, pero non pode conter caracteres de puntuación como \"#\" ou \":\".",
        "config-ns-invalid": "O espazo de nomes especificado, \"<nowiki>$1</nowiki>\", é incorrecto.\nEspecifique un espazo de nomes do proxecto diferente.",
        "config-ns-conflict": "O espazo de nomes especificado, \"<nowiki>$1</nowiki>\", entra en conflito co espazo de nomes MediaWiki por defecto.\nEspecifique un espazo de nomes do proxecto diferente.",
        "config-admin-box": "Conta de administrador",
        "config-profile-no-anon": "Necesítase a creación dunha conta",
        "config-profile-fishbowl": "Só os editores autorizados",
        "config-profile-private": "Wiki privado",
-       "config-profile-help": "Os wikis funcionan mellor canta máis xente os edite.\nEn MediaWiki, é doado revisar os cambios recentes e reverter calquera dano feito por usuarios novatos ou con malas intencións.\nPorén, moita xente atopa MediaWiki útil nunha ampla variedade de papeis, e ás veces non é fácil convencer a todos dos beneficios que leva consigo o estilo wiki.\nVostede decide.\n\nO modelo '''{{int:config-profile-wiki}}''' permite a edición por parte de calquera, mesmo sen rexistro.\nA opción '''{{int:config-profile-no-anon}}''' proporciona un control maior, pero pode desalentar os colaboradores casuais.\n\nO escenario '''{{int:config-profile-fishbowl}}''' restrinxe a edición aos usuarios aprobados, pero o público pode ollar as páxinas, incluíndo os historiais.\nO tipo '''{{int:config-profile-private}}''' só deixa que os usuarios aprobados vexan e editen as páxinas.\n\nHai dispoñibles configuracións de dereitos de usuario máis complexas despois da instalación; bótelle un ollo a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights esta entrada no manual].",
+       "config-profile-help": "Os wikis funcionan mellor canta máis xente os edite.\nEn MediaWiki, é doado revisar os cambios recentes e reverter calquera dano feito por usuarios novatos ou con malas intencións.\nPorén, moita xente atopa MediaWiki útil nunha ampla variedade de papeis, e ás veces non é fácil convencer a todos dos beneficios que leva consigo o estilo wiki.\nVostede decide.\n\nO modelo <strong>{{int:config-profile-wiki}}</strong> permite a edición por parte de calquera, mesmo sen rexistro.\nA opción <strong>{{int:config-profile-no-anon}}</strong> proporciona un control maior, pero pode desalentar os colaboradores casuais.\n\nO escenario <strong>{{int:config-profile-fishbowl}}</strong> restrinxe a edición aos usuarios aprobados, pero o público pode ollar as páxinas, incluíndo os historiais.\nO tipo <strong>{{int:config-profile-private}}</strong> só deixa que os usuarios aprobados vexan e editen as páxinas.\n\nHai dispoñibles configuracións de dereitos de usuario máis complexas despois da instalación; bótelle un ollo a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights esta entrada no manual].",
        "config-license": "Dereitos de autoría e licenza:",
        "config-license-none": "Sen licenza ao pé",
        "config-license-cc-by-sa": "Creative Commons recoñecemento compartir igual",
        "config-license-gfdl": "Licenza de documentación libre de GNU 1.3 ou posterior",
        "config-license-pd": "Dominio público",
        "config-license-cc-choose": "Seleccione unha licenza Creative Commons personalizada",
-       "config-license-help": "Moitos wikis públicos liberan todas as súas contribucións baixo unha [http://freedomdefined.org/Definition/Gl licenza libre].\nIsto axuda a crear un sentido de propiedade comunitaria e anima a seguir contribuíndo durante moito tempo.\nXeralmente, non é necesario nos wikis privados ou de empresas.\n\nSe quere poder empregar textos da Wikipedia, así como que a Wikipedia poida aceptar textos copiados do seu wiki, escolla a licenza '''Creative Commons recoñecemento compartir igual'''.\n\nA licenza de documentación libre de GNU era a licenza anterior da Wikipedia.\nMalia aínda ser unha licenza válida, é difícil de entender.\nTamén é difícil reusar contidos baixo esta licenza.",
+       "config-license-help": "Moitos wikis públicos liberan todas as súas contribucións baixo unha [http://freedomdefined.org/Definition/Gl licenza libre].\nIsto axuda a crear un sentido de propiedade comunitaria e anima a seguir contribuíndo durante moito tempo.\nXeralmente, non é necesario nos wikis privados ou de empresas.\n\nSe quere poder empregar textos da Wikipedia, así como que a Wikipedia poida aceptar textos copiados do seu wiki, escolla a licenza <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nA licenza de documentación libre de GNU era a licenza anterior da Wikipedia.\nMalia aínda ser unha licenza válida, é difícil de entender.\nTamén é difícil reusar contidos baixo esta licenza.",
        "config-email-settings": "Configuración do correo electrónico",
        "config-enable-email": "Activar os correos electrónicos de saída",
        "config-enable-email-help": "Se quere que o correo electrónico funcione, cómpre configurar os [http://www.php.net/manual/en/mail.configuration.php parámetros PHP] correctamente.\nSe non quere ningunha característica no correo, pode desactivalas aquí.",
        "config-email-watchlist": "Activar a notificación da lista de vixilancia",
        "config-email-watchlist-help": "Permitir que os usuarios reciban notificacións sobre modificacións nas páxinas que vixían, se o teñen activado nas súas preferencias.",
        "config-email-auth": "Activar a autenticación do correo electrónico",
-       "config-email-auth-help": "Se esta opción está activada, os usuarios teñen que confirmar o seu correo electrónico mediante unha ligazón enviada ao enderezo cando o definan ou o cambien.\nSó os enderezos autenticados poden recibir correos doutros usuarios ou de notificación.\nÉ '''recomendable''' establecer esta opción nos wikis públicos para evitar abusos potenciais das características do correo.",
+       "config-email-auth-help": "Se esta opción está activada, os usuarios teñen que confirmar o seu correo electrónico mediante unha ligazón enviada ao enderezo cando o definan ou o cambien.\nSó os enderezos autenticados poden recibir correos doutros usuarios ou de notificación.\nÉ <strong>recomendable</strong> establecer esta opción nos wikis públicos para evitar abusos potenciais das características do correo.",
        "config-email-sender": "Enderezo de correo electrónico de retorno:",
        "config-email-sender-help": "Introduza o enderezo de correo electrónico a usar como enderezo de retorno dos correos de saída.\nAquí é onde irán parar os correos rexeitados.\nMoitos servidores de correo electrónico esixen que polo menos a parte do nome de dominio sexa válido.",
        "config-upload-settings": "Imaxes e carga de ficheiros",
        "config-memcache-badport": "Os números de porto Memcached deben estar entre $1 e $2.",
        "config-extensions": "Extensións",
        "config-extensions-help": "As extensións anteriores detectáronse no seu directorio <code>./extensions</code>.\n\nQuizais necesite algunha configuración adicional, pero pode activalas agora",
-       "config-install-alreadydone": "'''Atención:''' Semella que xa instalou MediaWiki e que o está a instalar de novo.\nVaia ata a seguinte páxina.",
+       "config-skins": "Aparencias",
+       "config-skins-help": "As aparencias listadas enriba detectáronse no seu directorio <code>./skins</code>. Debe activar, polo menos, unha e elixir a predeterminada.",
+       "config-skins-use-as-default": "Utilizar esta aparencia por defecto",
+       "config-skins-missing": "Non se atopou aparencia ningunha. MediaWiki ha utilizar unha aparencia de respaldo ata que vostede instale algunha aparencia axeitada.",
+       "config-skins-must-enable-some": "Debe elixir, polo menos, unha aparencia para activala.",
+       "config-skins-must-enable-default": "A aparencia elixida como predeterminada debe estar activada.",
+       "config-install-alreadydone": "<strong>Atención:</strong> Semella que xa instalou MediaWiki e que o está a instalar de novo.\nVaia ata a seguinte páxina.",
        "config-install-begin": "Ao premer en \"{{int:config-continue}}\", comezará a instalación de MediaWiki.\nSe aínda quere facer algún cambio, prema en \"{{int:config-back}}\".",
        "config-install-step-done": "feito",
        "config-install-step-failed": "erro",
        "config-install-user-missing": "O usuario especificado, \"$1\", non existe.",
        "config-install-user-missing-create": "O usuario especificado, \"$1\", non existe.\nPrema na caixa de verificación \"crear unha conta\" que hai a continuación se quere crear unha.",
        "config-install-tables": "Creando as táboas",
-       "config-install-tables-exist": "'''Atención:''' Semella que as táboas de MediaWiki xa existen.\nSaltando a creación.",
-       "config-install-tables-failed": "'''Erro:''' Fallou a creación da táboa. Descrición do erro: $1",
+       "config-install-tables-exist": "<strong>Atención:</strong> Semella que as táboas de MediaWiki xa existen.\nSaltando a creación.",
+       "config-install-tables-failed": "<strong>Erro:</strong> Fallou a creación da táboa. Descrición do erro: $1",
        "config-install-interwiki": "Enchendo a táboa de interwiki por defecto",
        "config-install-interwiki-list": "Non se puido atopar o ficheiro <code>interwiki.list</code>.",
-       "config-install-interwiki-exists": "'''Atención:''' Semella que a táboa de interwiki xa contén entradas.\nSaltando a lista por defecto.",
+       "config-install-interwiki-exists": "<strong>Atención:</strong> Semella que a táboa de interwiki xa contén entradas.\nSaltando a lista por defecto.",
        "config-install-stats": "Iniciando as estatísticas",
        "config-install-keys": "Xerando as claves secretas",
-       "config-insecure-keys": "'''Atención:''' {{PLURAL:$2|A clave de seguridade|As claves de seguridade}} ($1) {{PLURAL:$2|xerada|xeradas}} durante a instalación non {{PLURAL:$2|é|son}} completamente {{PLURAL:$2|segura|seguras}}. Considere a posibilidade de {{PLURAL:$2|cambiala|cambialas}} manualmente.",
+       "config-insecure-keys": "<strong>Atención:</strong> {{PLURAL:$2|A clave de seguridade|As claves de seguridade}} ($1) {{PLURAL:$2|xerada|xeradas}} durante a instalación non {{PLURAL:$2|é|son}} completamente {{PLURAL:$2|segura|seguras}}. Considere a posibilidade de {{PLURAL:$2|cambiala|cambialas}} manualmente.",
+       "config-install-updates": "Evitar executar actualizacións innecesarias",
+       "config-install-updates-failed": "<strong>Error:</strong> a inserción de claves de actualización nas táboas fallou co seguinte erro: $1",
        "config-install-sysop": "Creando a conta de usuario de administrador",
        "config-install-subscribe-fail": "Non se puido subscribir á lista mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL non está instalado e <code>allow_url_fopen</code> non está dispoñible.",
        "config-install-mainpage": "Creando a páxina principal co contido por defecto",
        "config-install-extension-tables": "Creando as táboas para as extensións activadas",
        "config-install-mainpage-failed": "Non se puido inserir a páxina principal: $1",
-       "config-install-done": "'''Parabéns!'''\nInstalou correctamente MediaWiki.\n\nO programa de instalación xerou un ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contén toda a súa configuración.\n\nTerá que descargalo e poñelo na base da instalación do seu wiki (no mesmo directorio ca index.php). A descarga debería comezar automaticamente.\n\nSe non comezou a descarga ou se a cancelou, pode facer que comece de novo premendo na ligazón que aparece a continuación:\n\n$3\n\n'''Nota:''' Se non fai iso agora, este ficheiro de configuración xerado non estará dispoñible máis adiante se sae da instalación sen descargalo.\n\nCando faga todo isto, xa poderá '''[$2 entrar no seu wiki]'''.",
+       "config-install-done": "<strong>Parabéns!</strong>\nInstalou correctamente MediaWiki.\n\nO programa de instalación xerou un ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contén toda a súa configuración.\n\nTerá que descargalo e poñelo na base da instalación do seu wiki (no mesmo directorio ca index.php). A descarga debería comezar automaticamente.\n\nSe non comezou a descarga ou se a cancelou, pode facer que comece de novo premendo na ligazón que aparece a continuación:\n\n$3\n\n<strong>Nota:</strong> Se non fai iso agora, este ficheiro de configuración xerado non estará dispoñible máis adiante se sae da instalación sen descargalo.\n\nCando faga todo isto, xa poderá <strong>[$2 entrar no seu wiki]</strong>.",
        "config-download-localsettings": "Descargar o <code>LocalSettings.php</code>",
        "config-help": "axuda",
        "config-help-tooltip": "prema para expandir",
        "config-nofile": "Non se puido atopar o ficheiro \"$1\". Se cadra, foi borrado.",
        "config-extension-link": "Sabía que o seu wiki soporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensións]?\n\nPode explorar as [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensións por categoría] ou a [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.",
-       "mainpagetext": "'''MediaWiki instalouse correctamente.'''",
+       "mainpagetext": "<strong>MediaWiki instalouse correctamente.</strong>",
        "mainpagedocfooter": "Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]"
 }
index 57e3c94..dd14e63 100644 (file)
@@ -51,6 +51,7 @@
        "config-env-good": "הסביבה שלכם נבדקה.\nאפשר להתקין מדיה־ויקי.",
        "config-env-bad": "הסביבה שלכם נבדקה.\nאי־אפשר להתקין מדיה־ויקי.",
        "config-env-php": "מותקנת <span dir=\"ltr\">PHP $1</span>.",
+       "config-env-hhvm": "מותקנת <span dir=\"ltr\">HHVM $1</span>.",
        "config-unicode-using-utf8": "משתמש ב־utf8_normalize.so של בריון ויבר לנרמול יוניקוד.",
        "config-unicode-using-intl": "משתמש ב[http://pecl.php.net/intl הרחבת intl PECL] לנרמול יוניקוד.",
        "config-unicode-pure-php-warning": "'''אזהרה''': [http://pecl.php.net/intl הרחבת intl PECL] אינה זמינה לטיפול בנרמול יוניקוד. משתמש ביישום PHP טהור ואטי יותר.\nאם זהו אתר בעל תעבורה גבוהה, כדאי לקרוא את המסמך הבא: [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
        "config-install-stats": "אתחול סטטיסטיקות",
        "config-install-keys": "יצירת מפתחות סודיים",
        "config-insecure-keys": "'''אזהרה''': {{PLURAL:$2|מפתח|מפתחות}} אבטחה ($1) {{PLURAL:$2|שנוצר|שנוצרו}} במהלך ההתקנה {{PLURAL:$2|אינו בטוח|אינם בטוחים}} מספיק. מומלץ לשקול לשנות {{PLURAL:$2|אותו|אותם}} ידנית.",
+       "config-install-updates": "למנוע הרצת עדכונים מיותרים",
+       "config-install-updates-failed": "<strong>שגיאה:</strong> הוספת מפתחות עדכון לטבלאות נכשל עם השגיאה הבאה: $1",
        "config-install-sysop": "יצירת חשבון מפעיל",
        "config-install-subscribe-fail": "הרישום ל־mediawiki-announce לא הצליח: $1",
        "config-install-subscribe-notpossible": "cURL אינה מותקנת ו־<code>allow_url_fopen</code> אינה זמינה.",
index 62afb44..0e8f597 100644 (file)
@@ -47,6 +47,7 @@
        "config-env-good": "Le ambiente ha essite verificate.\nTu pote installar MediaWiki.",
        "config-env-bad": "Le ambiente ha essite verificate.\nTu non pote installar MediaWiki.",
        "config-env-php": "PHP $1 es installate.",
+       "config-env-hhvm": "HHVM $1 es installate.",
        "config-unicode-using-utf8": "utf8_normalize.so per Brion Vibber es usate pro le normalisation Unicode.",
        "config-unicode-using-intl": "Le [http://pecl.php.net/intl extension PECL intl] es usate pro le normalisation Unicode.",
        "config-unicode-pure-php-warning": "'''Aviso''': Le [http://pecl.php.net/intl extension PECL intl] non es disponibile pro exequer le normalisation Unicode; le systema recurre al implementation lente in PHP pur.\nSi tu sito ha un alte volumine de traffico, tu deberea informar te un poco super le [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisation Unicode].",
@@ -55,6 +56,7 @@
        "config-outdated-sqlite": "'''Attention''': tu ha SQLite $1, que es inferior al version minimal requirite, $2. SQLite essera indisponibile.",
        "config-no-fts3": "'''Attention''': SQLite es compilate sin [//sqlite.org/fts3.html modulo FTS3]; functionalitate de recerca non essera disponibile in iste back-end.",
        "config-register-globals-error": "<strong>Error: Le option <code>[http://php.net/register_globals register_globals]</code> de PHP es active.\nIllo debe esser disactivate pro continuar le installation.</strong>\nVide [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] pro obtener adjuta sur como facer lo.",
+       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] es active!</strong>\nIste option corrumpe le datos entrate de maniera imprevisibile.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
        "config-magic-quotes-runtime": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] es active!'''\nIste option corrumpe le entrata de datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
        "config-magic-quotes-sybase": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] es active!'''\nIste option corrumpe le entrata de datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
        "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] es active!'''\nIste option causa errores e pote corrumper datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
@@ -65,6 +67,7 @@
        "config-memory-raised": "Le <code>memory_limit</code> de PHP es $1, elevate a $2.",
        "config-memory-bad": "'''Aviso:''' Le <code>memory_limit</code> de PHP es $1.\nIsto es probabilemente troppo basse.\nLe installation pote faller!",
        "config-ctype": "'''Fatal''': PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
+       "config-iconv": "<strong>Fatal:</strong> PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/iconv.installation.php extension iconv].",
        "config-json": "'''Fatal:''' PHP ha essite compilate sin supporto de JSON.\nTu debe installar le extension JSON de PHP o le extension [http://pecl.php.net/package/jsonc PECL jsonc] extension ante de installar MediaWiki.\n* Le extension de PHP es includite in Red Hat Enterprise Linux (CentOS) 5 e 6, ma debe esser activate in <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Alcun distributiones de Linux liberate post maio 2013 omitte iste extension de PHP, forniente in su loco le extension PECL como <code>php5-json</code> o <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] es installate",
        "config-apc": "[http://www.php.net/apc APC] es installate",
        "config-license-gfdl": "Licentia GNU pro Documentation Libere 1.3 o plus recente",
        "config-license-pd": "Dominio public",
        "config-license-cc-choose": "Seliger un licentia Creative Commons personalisate",
-       "config-license-help": "Multe wikis public pone tote le contributiones sub un [http://freedomdefined.org/Definition/Ia?uselang=ia licentia libere].\nIsto adjuta a crear un senso de proprietate communitari e incoragia le contribution in longe termino.\nIsto non es generalmente necessari pro un wiki private o de interprisa.\n\nSi tu vole poter usar texto de Wikipedia, e si tu vole que Wikipedia pote acceptar texto copiate de tu wiki, tu debe seliger '''Creative Commons Attribution Share Alike'''.\n\nWikipedia usava anteriormente le Licentia GNU pro Documentation Libere (GFDL).\nIste es un licentia valide, ma es difficile a comprender.\nIl es anque difficile reusar le contento licentiate sub GFDL.",
+       "config-license-help": "Multe wikis public pone tote le contributiones sub un [http://freedomdefined.org/Definition/Ia?uselang=ia licentia libere].\nIsto adjuta a crear un senso de proprietate communitari e incoragia le contribution in longe termino.\nIsto non es generalmente necessari pro un wiki private o de interprisa.\n\nSi tu vole poter usar texto de Wikipedia, e si tu vole que Wikipedia pote acceptar texto copiate de tu wiki, tu debe seliger <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nWikipedia usava anteriormente le Licentia GNU pro Documentation Libere (GFDL).\nIste es un licentia valide, ma es difficile a comprender.\nIl es anque difficile reusar le contento licentiate sub GFDL.",
        "config-email-settings": "Configuration de e-mail",
        "config-enable-email": "Activar le e-mail sortiente",
        "config-enable-email-help": "Si tu vole que e-mail functiona, [http://www.php.net/manual/en/mail.configuration.php le optiones de e-mail de PHP] debe esser configurate correctemente.\nSi tu non vole functiones de e-mail, tu pote disactivar los hic.",
        "config-memcache-badport": "Le numeros de porto de Memcached debe esser inter $1 e $2",
        "config-extensions": "Extensiones",
        "config-extensions-help": "Le extensiones listate hic supra esseva detegite in tu directorio <code>./extensions</code>.\n\nIstes pote requirer additional configuration, ma tu pote activar los ora.",
+       "config-skins": "Apparentias",
+       "config-skins-help": "Hic supra es le lista de apparentias detegite in tu directorio <code>./skins</code>. Tu debe activar al minus un de illos e seliger le predefinite.",
+       "config-skins-use-as-default": "Usar iste apparentia como predefinite",
+       "config-skins-missing": "Nulle apparentia ha essite trovate; MediaWiki usara un apparentia de reserva usque tu installa alcun apparentia complete.",
+       "config-skins-must-enable-some": "Tu debe seliger al minus un apparentia a activar.",
+       "config-skins-must-enable-default": "Le apparentia seligite como predefinite debe esser activate.",
        "config-install-alreadydone": "'''Aviso:''' Il pare que tu ha jam installate MediaWiki e tenta installar lo de novo.\nPer favor continua al proxime pagina.",
        "config-install-begin": "Un clic sur \"{{int:config-continue}}\" comencia le installation de MediaWiki.\nPro facer alterationes, clicca sur \"{{int:config-back}}\".",
        "config-install-step-done": "finite",
        "config-install-stats": "Initialisation del statisticas",
        "config-install-keys": "Generation de claves secrete",
        "config-insecure-keys": "'''Attention:''' {{PLURAL:$2|Un clave|Alcun claves}} secur ($1) generate durante le installation non es completemente secur. Considera cambiar {{PLURAL:$2|lo|los}} manualmente.",
+       "config-install-updates": "Impedir le execution de actualisationes innecessari",
+       "config-install-updates-failed": "<strong>Error:</strong> Le insertion de claves de actualisation in le tabellas ha fallite con le error sequente: $1",
        "config-install-sysop": "Crea conto de usator pro administrator",
        "config-install-subscribe-fail": "Impossibile subscriber a mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL non es installate e <code>allow_url_fopen</code> non es disponibile.",
index 908d282..a61fff2 100644 (file)
@@ -55,6 +55,7 @@
        "config-env-good": "L'ambiente è stato controllato.\nÈ possibile installare MediaWiki.",
        "config-env-bad": "L'ambiente è stato controllato.\nNon è possibile installare MediaWiki.",
        "config-env-php": "PHP $1 è installato.",
+       "config-env-hhvm": "HHVM $1 è installato.",
        "config-unicode-using-utf8": "Usa Brion Vibber's utf8_normalize.so per la normalizzazione Unicode.",
        "config-unicode-using-intl": "Usa [http://pecl.php.net/intl l'estensione PECL intl] per la normalizzazione Unicode.",
        "config-unicode-pure-php-warning": "'''Attenzione:''' [http://pecl.php.net/intl l'estensione PECL intl] non è disponibile per gestire la normalizzazione Unicode, così si usa la lenta implementazione in puro PHP.\nSe esegui un sito ad alto traffico, dovresti leggere alcune considerazioni sulla [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzazione Unicode].",
@@ -62,6 +63,8 @@
        "config-no-db": "Impossibile trovare un driver adatto per il database! È necessario installare un driver per PHP.\nI seguenti formati di database sono supportati: $1.\n\nSe compili PHP autonomamente, riconfiguralo attivando un client database, per esempio utilizzando <code>./configure --with-mysqli</code>.\nQualora avessi installato PHP per mezzo di un pacchetto Debian o Ubuntu, allora devi installare anche il pacchetto <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attenzione''': è presente SQLite $1 mentre è richiesta la versione $2, SQLite non sarà disponibile.",
        "config-no-fts3": "'''Attenzione''': SQLite è compilato senza il [//sqlite.org/fts3.html modulo FTS3], le funzionalità di ricerca non saranno disponibili su questo backend.",
+       "config-register-globals-error": "<strong>Errore: l'opzione PHP <code>[http://php.net/register_globals register_globals]</code> è abilitata.\nDeve essere disabilitata per continuare con l'installazione.</strong>\nVedi [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] per un aiuto su come farlo.",
+       "config-magic-quotes-gpc": "<strong>Fatale: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] è attivo!</strong>\nQuesta opzione danneggia i dati di input in modo imprevedibile.\nNon puoi installare o utilizzare MediaWiki, a meno che questa opzione sia disabilitata.",
        "config-magic-quotes-runtime": "'''Errore: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] è attivato!''' Questa opzione interferisce in modo imprevedibile con l'inserimento dei dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
        "config-magic-quotes-sybase": "'''Errore: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] è attivato!''' Questa opzione interferisce in modo imprevedibile con l'inserimento dei dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
        "config-mbstring": "'''Errore: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] è attivato!''' Questa opzione causa errori e può interferire in modo imprevedibile coi dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
@@ -72,6 +75,7 @@
        "config-memory-raised": "Il valore <code>memory_limit</code> di PHP è $1, aumentato a $2.",
        "config-memory-bad": "''Attenzione:''' Il valore di <code>memory_limit</code> di PHP è $1.\nProbabilmente è troppo basso.\nL'installazione potrebbe non riuscire!",
        "config-ctype": "'''Errore''': PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/it/ctype.installation.php estensione Ctype].",
+       "config-iconv": "<strong>Fatale:</strong> PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/en/iconv.installation.php estensione iconv].",
        "config-json": "'''Errore:''' PHP è stato compilato senza il supporto per JSON. E' necessario installare l'estensione PHP per JSON o l'estensione [http://pecl.php.net/package/jsonc PECL jsonc] prima di installare MediaWiki.\n* L'estensione PHP è inclusa in Red Hat Enterprise Linux (CentOS) 5 e 6, ma deve essere abilitata in <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Alcune distribuzioni di Linux pubblicate dopo il maggio 2013 omettono l'estensione PHP, e al posto utilizzano l'estensione PECL come <code>php5-json</code> o <code>php-pecl-jsonc</code>",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] è installato",
        "config-apc": "[http://www.php.net/apc APC] è installato",
        "config-uploads-not-safe": "<strong>Attenzione:</strong> la directory predefinita per i caricamenti <code>$1</code> è vulnerabile all'esecuzione arbitraria di script.\nAnche se MediaWiki controlla tutti i file caricati per rischi alla sicurezza, è fortemente raccomandato di [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security chiudere questa vulnerabilità di sicurezza] prima di abilitare i caricamenti.",
        "config-no-cli-uploads-check": "<strong>Attenzione:</strong> la directory predefinita per i caricamenti (<code>$1</code>) non è stata verificata per la vulnerabilità sull'esecuzione arbitraria di script durante l'installazione da linea di comando.",
        "config-brokenlibxml": "Il tuo sistema ha una combinazione di versioni di PHP e libxml2 che è difettosa e che può provocare un danneggiamento non visibile di dati in MediaWiki ed in altre applicazioni per il web.\nAggiorna a libxml2 2.7.3 o successivo ([https://bugs.php.net/bug.php?id=45996 il bug è studiato dal lato PHP]).\nInstallazione interrotta.",
+       "config-suhosin-max-value-length": "Suhosin è installato e limita il parametro GET <code>length</code> a $1 byte.\nIl componente MediaWiki ResourceLoader funzionerà aggirando questo limite, ma riducendo le prestazioni.\nSe possibile, dovresti impostare <code>suhosin.get.max_value_length</code> a 1024 o superiore in <code>php.ini</code>, ed impostare <code>$wgResourceLoaderMaxQueryLength</code> allo stesso valore in <code>LocalSettings.php</code>.",
        "config-db-type": "Tipo di database:",
        "config-db-host": "Host del database:",
        "config-db-host-help": "Se il server del tuo database è su un server diverso, immetti qui il nome dell'host o il suo indirizzo IP.\n\nSe stai utilizzando un web hosting condiviso, il tuo hosting provider dovrebbe fornirti il nome host corretto nella sua documentazione.\n\nSe stai installando su un server Windows con uso di MySQL, l'uso di \"localhost\" potrebbe non funzionare correttamente come nome del server. In caso di problemi, prova a impostare \"127.0.0.1\" come indirizzo IP locale.\n\nSe usi PostgreSQL, lascia questo campo vuoto per consentire di connettersi tramite un socket Unix.",
        "config-db-host-oracle": "TNS del database:",
+       "config-db-host-oracle-help": "Inserisci un valido [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; un file tnsnames.ora deve essere visibile a questa installazione.<br />Se stai usando la libreria cliente 10g o più recente puoi anche usare il metodo di denominazione [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifica questo wiki",
        "config-db-name": "Nome del database:",
        "config-db-name-help": "Scegli un nome che identifica il tuo wiki.\nNon deve contenere spazi.\n\nSe utilizzi un web hosting condiviso, il tuo hosting provider o ti fornisce uno specifico nome di database da utilizzare, oppure ti consentirà di creare il database tramite un pannello di controllo.",
        "config-db-name-oracle": "Schema del database:",
+       "config-db-account-oracle-warn": "Ci sono tre scenari supportati per l'installazione di Oracle come database di backend:\n\nSe vuoi creare un'utenza di database come parte del processo di installazione, fornisci un account con ruolo SYSDBA come utenza di database per l'installazione e specifica le credenziali volute per l'utenza di accesso web, altrimenti è possibile creare manualmente l'utenza di accesso web e fornire solo quell'account (se dispone delle autorizzazioni necessario per creare gli oggetti dello schema) o fornire due diverse utenze, una con i permessi di creazione e una per l'accesso web.\n\nScript per la creazione di un'utenza con le autorizzazioni necessarie può essere trovato nella directory \"maintenance/oracle/\" di questa installazione. Tieni presente che l'uso di un'utenza con restrizioni disabiliterà tutte le funzionalità di manutenzione con l'account predefinito.",
        "config-db-install-account": "Account utente per l'installazione",
        "config-db-username": "Nome utente del database:",
        "config-db-password": "Password del database:",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binario",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-charset-mysql4": "MySQL 4.0 con compatibilità UTF-8",
+       "config-charset-help": "<strong>Attenzione:</strong> se si utilizza <strong>backwards-compatible UTF-8</strong> su MySQL 4.1+, e successivamente si esegue il backup del database con <code>mysqldump</code>, si può distriggere tutti i caratteri non ASCII, danneggiando irreversibilmente i backup!\n\nIn <strong>modalità binaria</strong>, MediaWiki archivia il testo UTF-8 nel database in cambi binari.\nQuesto è più efficiente rispetto alla modalità UTF-8 di MySQL, e consente di utilizzare la gamma completa di caratteri Unicode.\nIn <strong>modalità UTF-8</strong>, MySQL conoscerà in quale set di caratteri sono i tuoi dati, e può presentarli e convertirli in modo appropriato,\nma non ti permetterà di memorizzare i caratteri al di sopra del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mysql-old": "MySQL $1 o una versione successiva è necessaria, rilevata la $2.",
        "config-db-port": "Porta del database:",
        "config-db-schema": "Schema per MediaWiki:",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki supporta i seguenti sistemi di database:\n\n$1\n\nSe fra quelli elencati qui sotto non vedi il sistema di database che vorresti utilizzare, seguire le istruzioni linkate sopra per abilitare il supporto.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] è la configurazione preferibile per MediaWiki ed è quella meglio supportata. MediaWiki funziona anche con [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], che sono compatibili con MySQL.([http://www.php.net/manual/en/mysqli.installation.php Come compilare PHP con supporto MySQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] è un popolare sistema di database open source come alternativa a MySQL. Ci possono essere alcuni bug minori in sospeso, e non è raccomandato per l'uso in un ambiente di produzione. ([http://www.php.net/manual/en/pgsql.installation.php Come compilare PHP con supporto PostgreSQL])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]  è un sistema di database leggero, che è supportato molto bene. ([http://www.php.net/manual/en/pdo.installation.php Come compilare PHP con supporto SQLite], utilizza PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] è un database di un'impresa commerciale. ([http://www.php.net/manual/en/oci8.installation.php Come compilare PHP con supporto OCI8])",
+       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] è un database di un'impresa commerciale per Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Come compilare PHP con supporto SQLSRV])",
        "config-header-mysql": "Impostazioni MySQL",
        "config-header-postgres": "Impostazioni PostgreSQL",
        "config-header-sqlite": "Impostazioni SQLite",
        "config-postgres-old": "PostgreSQL $1 o una versione successiva è necessaria, rilevata la $2.",
        "config-mssql-old": "Si richiede Microsoft SQL Server $1 o successivo. Tu hai la versione $2.",
        "config-sqlite-name-help": "Scegli un nome che identifichi il tuo wiki.\nNon utilizzare spazi o trattini.\nQuesto servirà per il nome del file di dati SQLite.",
+       "config-sqlite-parent-unwritable-group": "Non è possibile creare la directory dati <code><nowiki>$1</nowiki></code>, perché la directory superiore <code><nowiki>$2</nowiki></code> non è scrivibile dal webserver.\n\nIl programma di installazione ha determinato l'utente con cui il server web è in esecuzione.\nForniscigli la possibilità di scrivere nella directory <code><nowiki>$3</nowiki></code> per continuare.\nSu un sistema Unix/Linux:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "Non è possibile creare la directory dati <code><nowiki>$1</nowiki></code>, perché la directory superiore <code><nowiki>$2</nowiki></code> non è scrivibile dal webserver.\n\nIl programma di installazione non ha potuto determinare l'utente con cui il server web è in esecuzione.\nFornisci ad esso (ed altri!) la possibilità di scrivere globalmente nella directory <code><nowiki>$3</nowiki></code> per continuare.\nSu un sistema Unix/Linux:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-sqlite-mkdir-error": "Errore durante la creazione della directory dati \"$1\".\nControlla la posizione e riprova.",
        "config-sqlite-dir-unwritable": "Impossibile scrivere nella directory \"$1\".\nModifica le autorizzazioni in modo che il webserver possa scrivere in essa e riprova.",
        "config-sqlite-connection-error": "$1.\n\nControlla la directory dati e il nome del database qui sotto, poi riprova.",
        "config-mysql-engine": "Storage engine:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-myisam-dep": "<strong>Attenzione:</strong> hai selezionato MyISAM come motore di archiviazione per MySQL, che non è raccomandato per l'uso con  MediaWiki, perché:\n* supporta debolmente la concorrenza per il blocco della tabella\n* è più incline alla corruzione di altri motori\n* il codice di base MediaWiki non gestisce sempre MyISAM come dovrebbe\n\nSe la tua installazione MySQL supporta InnoDB, è altamente raccomandato che lo si scelga al suo posto.\nSe la tua installazione MySQL non supporta InnoDB, forse è il momento per un aggiornamento.",
+       "config-mysql-only-myisam-dep": "<strong>Attenzione:</strong> MyISAM è l'unico motore di archiviazione disponibile per MySQL su questa macchina, e questo non è consigliato per l'uso con MediaWiki, perché:\n* supporta debolmente la concorrenza per il blocco della tabella\n* è più incline alla corruzione di altri motori\n* il codice di base MediaWiki non gestisce sempre MyISAM come dovrebbe\n\nSe la tua installazione MySQL non supporta InnoDB, forse è il momento per un aggiornamento.",
+       "config-mysql-engine-help": "<strong>InnoDB</strong> è quasi sempre l'opzione migliore, in quanto ha un buon supporto della concorrenza.\n\n<strong>MyISAM</strong> potrebbe essere più veloce nelle installazioni monoutente o in sola lettura.\nI database MyISAM tendono a danneggiarsi più spesso dei database InnoDB.",
        "config-mysql-charset": "Set di caratteri del database:",
        "config-mysql-binary": "Binario",
        "config-mysql-utf8": "UTF-8",
+       "config-mysql-charset-help": "In <strong>modalità binaria</strong>, MediaWiki archivia il testo UTF-8 nel database in cambi binari.\nQuesto è più efficiente rispetto alla modalità UTF-8 di MySQL, e consente di utilizzare la gamma completa di caratteri Unicode.\n\nIn <strong>modalità UTF-8</strong>, MySQL conoscerà in quale set di caratteri sono i tuoi dati, e può presentarli e convertirli in modo appropriato, ma non ti permetterà di memorizzare i caratteri al di sopra del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Tipo di autenticazione:",
+       "config-mssql-install-auth": "Seleziona il tipo di autenticazione che verrà utilizzato per connettersi al database durante il processo di installazione.\nSe si seleziona \"{{int:config-mssql-windowsauth}}\", saranno utilizzate le credenziali dell'utente con cui viene eseguito il server web, qualunque esso sia.",
+       "config-mssql-web-auth": "Seleziona il tipo di autenticazione che il server web utilizzerà per connettersi al database, durante il normale funzionamento del wiki.\nSe si seleziona \"{{int:config-mssql-windowsauth}}\", saranno utilizzate le credenziali dell'utente con cui viene eseguito il server web, qualunque esso sia.",
        "config-mssql-sqlauth": "Autenticazione di SQL Server",
        "config-mssql-windowsauth": "Autenticazione di Windows",
        "config-site-name": "Nome del wiki:",
        "config-ns-site-name": "Stesso nome del wiki: $1",
        "config-ns-other": "Altro (specificare)",
        "config-ns-other-default": "MyWiki",
+       "config-project-namespace-help": "Seguendo l'esempio di Wikipedia, molti wiki tengono le loro pagine con le regole separate dalle pagine di contenuto, in un \"'''namespace di progetto'''\".\nTutti i titoli delle pagine in questo namespace iniziano con un certo prefisso, che puoi indicare qui.\nSolitamente, questo prefisso deriva dal nome del wiki, ma non può contenere caratteri di punteggiatura come \"#\" o \":\".",
+       "config-ns-invalid": "Il namespace indicato \"<nowiki>$1</nowiki>\" non è valido.\nSpecificare un diverso namespace di progetto.",
+       "config-ns-conflict": "Il namespace indicato \"<nowiki>$1</nowiki>\" è in conflitto con un namespace predefinito MediaWiki.\nSpecificare un diverso namespace di progetto.",
        "config-admin-box": "Account amministratore",
        "config-admin-name": "Il tuo nome utente:",
        "config-admin-password": "Password:",
        "config-admin-name-invalid": "Il nome utente specificato \"<nowiki>$1</nowiki>\" non è valido.\nSpecificare un nome utente diverso.",
        "config-admin-password-blank": "Inserisci una password per l'account di amministratore.",
        "config-admin-password-mismatch": "Le password inserite non coincidono tra loro.",
-       "config-admin-email": "Indirizzo e-mail:",
+       "config-admin-email": "Indirizzo email:",
        "config-admin-email-help": "Inserisci qui un indirizzo email per poter ricevere email dagli altri utenti del wiki, reimpostare la tua password, ed essere informato delle modifiche apportate alle pagine tuoi osservati speciali. Se non ti interessa, puoi lasciare vuoto questo campo.",
        "config-admin-error-user": "Errore interno durante la creazione di un amministratore con il nome \"<nowiki>$1</nowiki>\".",
        "config-admin-error-password": "Errore interno durante l'impostazione di una password per amministratore \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-profile-wiki": "Wiki aperto",
        "config-profile-no-anon": "Creazione utenza obbligatoria",
        "config-profile-fishbowl": "Solo editori autorizzati",
-       "config-profile-private": "Wiki privata",
+       "config-profile-private": "Wiki privato",
+       "config-profile-help": "I wiki funzionano meglio se si lascia che molte persone li possano modificare.\nIn MediaWiki, è semplice rivedere le ultime modifiche, e ripristinare i danni causati da utenti ingenui o malintenzionati.\n\nTuttavia, molti hanno trovato MediaWiki essere utile in un'ampia varietà di ruoli, e a volte non è facile convincere tutti i vantaggi della modalità wiki.\nPerciò, fai la tua scelta.\n\nIl modello <strong>{{int:config-profile-wiki}}</strong> consente a chiunque di modificare, anche senza effettuare l'accesso.\nUn wiki con <strong>{{int:config-profile-no-anon}}</strong> offre una maggiore responsabilità, ma potrebbe scoraggiare i contributori occasionali.\n\nLo scenario <strong>{{int:config-profile-fishbowl}}</strong> consente agli utenti autorizzati di modificare, ma il pubblico può visualizzare le pagine, compresa la cronologia.\nUn <strong>{{int:config-profile-private}}</strong> consente solo agli utenti autorizzati di visualizzare le pagine, lo stesso gruppo può modificarle.\n\nConfigurazioni di diritti utente più complesse sono disponibili dopo l'installazione, vedi la  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights parte relativa del manuale].",
        "config-license": "Copyright e licenza:",
        "config-license-none": "Nessun piè di pagina per la licenza",
        "config-license-cc-by-sa": "Creative Commons Attribuzione-Condividi allo stesso modo",
        "config-license-help": "Molti wiki pubblici rilasciano i loro contributi con una [http://freedomdefined.org/Definition licenza libera]. Questo aiuta a creare un senso di proprietà condivisa nella comunità e incoraggia a contribuire a lungo termine. Non è generalmente necessario per un wiki privato o aziendale.\n\nSe vuoi usare testi da Wikipedia, o desideri che Wikipedia possa essere in grado di accettare testi copiati dal tuo wiki, dovresti scegliere <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nIn precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL è una licenza valida, ma è di difficile comprensione e complica il riutilizzo dei contenuti.",
        "config-email-settings": "Impostazioni email",
        "config-enable-email": "Abilita la posta elettronica in uscita",
+       "config-enable-email-help": "Se vuoi che funzionino le email, le [http://www.php.net/manual/en/mail.configuration.php PHP's impostazioni della posta] devono essere configurate correttamente.\nSe non si desidera alcuna funzionalità di posta elettronica, puoi disabilitarla qui.",
        "config-email-user": "Abilita invio email fra utenti",
        "config-email-user-help": "Consente a tutti gli utenti di inviarsi a vicenda email, se lo hanno abilitato nelle loro preferenze.",
        "config-email-usertalk": "Abilita le notifiche per le pagine di discussione utente",
        "config-email-watchlist": "Abilita le notifiche per gli osservati speciali",
        "config-email-watchlist-help": "Consente agli utenti di ricevere notifiche per pagine tra gli osservati speciali, se lo hanno abilitato nelle loro preferenze.",
        "config-email-auth": "Abilita autenticazione via email",
+       "config-email-auth-help": "Se questa opzione è attivata, gli utenti dovranno confermare il loro indirizzo email utilizzando un collegamento che viene inviato ogni volta che lo impostano o lo modificano.\nSolo gli indirizzi di posta elettronica autenticati possono ricevere email da altri utenti o modificare le email di notifica.\nImpostare questa opzione è <strong>raccomandato</strong> per wiki pubblici a causa del potenziale abuso delle funzioni di posta elettronica.",
        "config-email-sender": "Indirizzo email di ritorno:",
+       "config-email-sender-help": "Inserisci l'indirizzo email da utilizzare come indirizzo di ritorno per la posta in uscita.\nQuesto è dove verranno inviati gli eventuali errori.\nMolti server di posta richiedono che almeno la parte del nome di dominio sia valido.",
        "config-upload-settings": "Caricamenti di immagini e file",
        "config-upload-enable": "Consentire il caricamento di file",
+       "config-upload-help": "Il caricamento di file può potenzialmente esporre il tuo server a rischi di sicurezza.\nPer ulteriori informazioni, leggi la  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sezione sulla sicurezza] nel manuale.\n\nPer consentire il caricamento di file, modificare la modalità nella sottodirectory <code>images</code> della directory principale di MediaWiki affinché il server web possa scriverci.\nPoi attivare questa opzione.",
        "config-upload-deleted": "Directory per i file cancellati:",
        "config-upload-deleted-help": "Scegli una directory in cui archiviare i file cancellati.\nIdealmente, questa non dovrebbe essere accessibile dal web.",
        "config-logo": "URL del logo:",
        "config-logo-help": "La skin predefinita di MediaWiki include lo spazio per un logo di 135 x 160 pixel sopra il menu laterale.\nCarica un'immagine di dimensioni appropriate e inserisci l'URL qui.\n\nÈ possibile utilizzare <code>$wgStylePath</code> o <code>$wgScriptPath</code> se il logo è relativo a tali percorsi.\n\nSe non si desidera un logo, lascia vuota questa casella.",
        "config-instantcommons": "Abilita Instant Commons",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] è una funzionalità che consente ai wiki di usare immagini, suoni e altri file multimediali che trovate sul sito [//commons.wikimedia.org/ Wikimedia Commons].\nPer fare questo, MediaWiki richiede l'accesso a Internet.\n\nPer ulteriori informazioni su questa funzionalità, incluse le istruzioni su come configurarlo per wiki diversi da Wikimedia Commons, consultare [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos il manuale].",
        "config-cc-error": "Il selettore di licenze Creative Commons non ha dato alcun risultato.\nInserisci manualmente il nome della licenza.",
        "config-cc-again": "Seleziona di nuovo...",
        "config-cc-not-chosen": "Scegliere quale licenza Creative Commons si desidera e cliccare su \"procedi\".",
        "config-memcache-badport": "I numeri di porta per memcached dovrebbero essere tra $1 e $2.",
        "config-extensions": "Estensioni",
        "config-extensions-help": "Le estensioni elencate sopra sono state rilevate nella tua directory <code>./extensions</code>.\n\nQueste potrebbero richiedere ulteriore configurazione, ma è possibile attivarle ora",
+       "config-skins": "Skin",
+       "config-skins-help": "Le skin elencate sopra sono state rilevate nella tua directory <code>./skins</code>. Devi attivarne almeno una e scegliere quella predefinita.",
+       "config-skins-use-as-default": "Usa questa skin come predefinita",
+       "config-skins-missing": "Non è stata trovata alcuna skin, MediaWiki userà una soluzione di ripiego finché non ne installerai una appropriata.",
+       "config-skins-must-enable-some": "Devi scegliere almeno una skin da attivare.",
+       "config-skins-must-enable-default": "La skin scelta come predefinita deve essere attivata.",
        "config-install-alreadydone": "'''Attenzione:''' sembra che hai già installato MediaWiki e stai tentando di installarlo nuovamente.\nProcedi alla pagina successiva.",
        "config-install-begin": "Premendo \"{{int:config-continue}}\", si avvierà l'installazione di MediaWiki.\nSe prima desideri apportare altre modifiche, premi \"{{int:config-back}}\".",
        "config-install-step-done": "fatto",
        "config-install-pg-plpgsql": "Controllo il linguaggio PL/pgSQL",
        "config-pg-no-plpgsql": "È necessario installare il linguaggio PL/pgSQL nel database $1",
        "config-pg-no-create-privs": "L'account indicato per l'installazione non dispone dei permessi necessari per creare un'utenza.",
+       "config-pg-not-in-role": "L'account indicato per l'utente web esiste già.\nL'account indicato per l'installazione non è un utente avanzato e non è un membro del ruolo degli utente web, quindi non è in grado di creare oggetti di proprietà dell'utente web.\n\nMediaWiki attualmente richiede che le tabelle siano di proprietà dell'utente web. Indica un altro account web, o fai click su  \"indietro\" e specifica un utente per l'installazione opportunamente privilegiato.",
        "config-install-user": "Creazione di utente del database",
        "config-install-user-alreadyexists": "L'utente \"$1\" è già presente",
        "config-install-user-create-failed": "Creazione dell'utente \"$1\" non riuscita: $2",
        "config-install-stats": "Inizializzazione delle statistiche",
        "config-install-keys": "Generazione delle chiavi segrete",
        "config-insecure-keys": "'''Attenzione:''' {{PLURAL:$2|Una chiave sicura|Delle chiavi sicure}} ($1) {{PLURAL:$2|generata|generate}} durante l'installazione non {{PLURAL:$2|è|sono}} completamente {{PLURAL:$2|sicura|sicure}}. Considera di {{PLURAL:$2|cambiarla|cambiarle}} manualmente.",
+       "config-install-updates": "Impedire l'esecuzione di aggiornamenti non necessari",
+       "config-install-updates-failed": "<strong>Errore:</strong> l'inserimento delle chiavi di aggiornamento nelle tabelle non è riuscito con il seguente errore: $1",
        "config-install-sysop": "Creazione dell'account utente per l'amministratore",
        "config-install-subscribe-fail": "Impossibile sottoscrivere mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL non è installato e <code>allow_url_fopen</code> non è disponibile.",
index 39ebf87..dedc3c2 100644 (file)
@@ -58,6 +58,7 @@
        "config-env-good": "環境を確認しました。\nMediaWiki をインストールできます。",
        "config-env-bad": "環境を確認しました。\nMediaWiki のインストールはできません。",
        "config-env-php": "PHP $1がインストールされています。",
+       "config-env-hhvm": "HHVM $1 がインストールされています。",
        "config-unicode-using-utf8": "Unicode正規化に、Brion Vibberのutf8_normalize.soを使用。",
        "config-unicode-using-intl": "Unicode正規化に[http://pecl.php.net/intl intl PECL 拡張機能]を使用。",
        "config-unicode-pure-php-warning": "<strong>警告:</strong> Unicode 正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。\n高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode 正規化]をお読みください。",
        "config-install-stats": "統計情報の初期化",
        "config-install-keys": "秘密鍵の生成",
        "config-insecure-keys": "<strong>警告:</strong> インストール中に生成されたセキュアキー ($1) は完璧に安全ではありません。手動で変更することを検討してください。",
+       "config-install-updates": "不要な更新を実行するのを防ぐ",
        "config-install-sysop": "管理者のアカウントの作成",
        "config-install-subscribe-fail": "mediawiki-announce を購読できませんでした: $1",
        "config-install-subscribe-notpossible": "cURL がインストールされていないため、<code>allow_url_fopen</code> を利用できません。",
index b2221a5..081f50f 100644 (file)
@@ -5,17 +5,18 @@
                        "아라",
                        "Hym411",
                        "Priviet",
-                       "Namoroka"
+                       "Namoroka",
+                       "Revi"
                ]
        },
        "config-desc": "미디어위키 설치 프로그램",
        "config-title": "미디어위키 $1 설치",
        "config-information": "정보",
-       "config-localsettings-upgrade": "<code>LocalSettings.php</code> 파일을 감지했습니다.\n이 설치를 업그레이드하려면 아래 상자에 <code>$wgUpgradeKey</code>의 값을 입력하세요.\n<code>LocalSettings.php</code>에서 찾을 수 있습니다.",
+       "config-localsettings-upgrade": "<code>LocalSettings.php</code> 파일을 감지했습니다.\n이 설치를 업그레이드하려면, 아래 상자에 <code>$wgUpgradeKey</code>의 값을 입력하세요.\n<code>LocalSettings.php</code>에서 찾을 수 있습니다.",
        "config-localsettings-cli-upgrade": "<code>LocalSettings.php</code> 파일을 감지했습니다.\n이 설치를 업그레이드하려면 <code>update.php</code>를 대신 실행하세요",
        "config-localsettings-key": "업그레이드 키:",
-       "config-localsettings-badkey": "ì\9e\85ë ¥한 키가 잘못되었습니다.",
-       "config-upgrade-key-missing": "기존에 설치 했던 미디어위키를 감지했습니다.\n이 설치를 업그레이드하려면 <code>LocalSettings.php</code>의 아래에 다음 줄을 넣으세요:\n\n$1",
+       "config-localsettings-badkey": "ì \9cê³µ한 키가 잘못되었습니다.",
+       "config-upgrade-key-missing": "미디어위키의 기존 설치를 감지했습니다.\n이 설치를 업그레이드하려면, <code>LocalSettings.php</code>의 아래에 다음 줄을 넣으세요:\n\n$1",
        "config-localsettings-incomplete": "기존 <code>LocalSettings.php</code>가 완전하지 않은 것 같습니다.\n$1 변수가 설정되어 있지 않습니다.\n이 변수가 설정되도록 <code>LocalSettings.php</code>를 바꾸고 \"{{int:Config-continue}}\"을 클릭하세요.",
        "config-localsettings-connection-error": "<code>LocalSettings.php</code>에 지정한 설정을 사용하여 데이터베이스에 연결할 때 오류가 발생했습니다. 이러한 설정을 고치고 다시 시도하세요.\n\n$1",
        "config-session-error": "세션 시작 오류: $1",
        "config-help-restart": "입력한 모든 저장된 데이터를 지우고 설치 과정을 다시 시작하겠습니까?",
        "config-restart": "예, 다시 시작합니다",
        "config-welcome": "=== 사용 환경 검사 ===\n기본 검사는 지금 이 환경이 미디어위키 설치에 적합한지 수행합니다.\n설치를 완료하는 방법에 대한 지원을 찾는다면 이 정보를 포함해야 하는 것을 기억하세요.",
-       "config-copyright": "=== ì \80ì\9e\91ê¶\8c ë°\8f ì\9d´ì\9a© ì\95½ê´\80 ===\n\n$1\n\nì\9d´ í\94\84ë¡\9cê·¸ë\9e¨ì\9d\80 ì\9e\90ì\9c  ì\86\8cí\94\84í\8a¸ì\9b¨ì\96´ì\9e\85ë\8b\88ë\8b¤. ë\8b¹ì\8b ì\9d\80 ì\9e\90ì\9c  ì\86\8cí\94\84í\8a¸ì\9b¨ì\96´ ì\9e¬ë\8b¨ì\9d´ ë°\9cí\91\9cí\95\9c GNU ì\9d¼ë°\98 ê³µì¤\91 ì\82¬ì\9a© í\97\88ê°\80ì\84\9c ë²\84ì \84 2ë\82\98 ê·¸ ì\9d´í\9b\84 ë²\84ì \84ì\97\90 ë\94°ë\9d¼ ì\9d´ í\94\84ë¡\9cê·¸ë\9e¨ì\9d\84 ì\9e¬ë°°í\8f¬í\95\98ê±°ë\82\98 ì\88\98ì \95í\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\n\nì\9d´ í\94\84ë¡\9cê·¸ë\9e¨ì\9d´ ì\9c ì\9a©í\95\98ê²\8c ì\82¬ì\9a©ë\90  ì\88\98 ì\9e\88기를 ë°\94ë\9d¼ì§\80ë§\8c '''ì\83\81ì\9a©ì\9c¼ë¡\9c ì\82¬ì\9a©'''ë\90\98ê±°ë\82\98 '''í\8a¹ì \95 ëª©ì \81ì\97\90 ë§\9eì\9d\84 ê²\83'''ì\9d´ë\9d¼ë\8a\94 ê²\83ì\9d\84 '''ë³´ì¦\9dí\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤'''.\nì\9e\90ì\84¸í\95\9c ë\82´ì\9a©ì\9d\80 GNU ì\9d¼ë°\98 ê³µì¤\91 ì\82¬ì\9a© í\97\88ê°\80ì\84\9c를 ì°¸ê³ í\95\98ì\8b­ì\8b\9cì\98¤.\n\në\8b¹ì\8b ì\9d\80 ì\9d´ í\94\84ë¡\9cê·¸ë\9e¨ì\9d\84 í\86µí\95´ <doclink href=Copying>GNU ì\9d¼ë°\98 ê³µì¤\91 ì\82¬ì\9a© í\97\88ê°\80ì\84\9c ì \84문</doclink>ì\9d\84 ë°\9bì\95\98ì\8aµë\8b\88ë\8b¤. ê·¸ë \87ì§\80 ì\95\8aë\8b¤ë©´, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USAë¡\9c í\8e¸ì§\80를 ë³´ë\82´ì£¼ì\8b\9cê±°ë\82\98 [http://www.gnu.org/copyleft/gpl.html ì\98¨ë\9d¼ì\9d¸ì\9c¼ë¡\9c ì\9d½ì\96´ë³´ì\8b\9c기] ë°\94ë\9e\8dë\8b\88ë\8b¤.",
+       "config-copyright": "=== 저작권 및 약관 ===\n\n$1\n\n이 프로그램은 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 프로그램을 재배포하거나 수정할 수 있습니다.\n\n이 프로그램이 유용하게 사용될 수 있기를 바라지만 '''상용으로 사용'''되거나 '''특정 목적에 맞을 것'''이라는 것을 '''보증하지 않습니다'''.\n자세한 내용은 GNU 일반 공중 사용 허가서를 참고하십시오.\n\n당신은 이 프로그램을 통해 <doclink href=Copying>GNU 일반 공중 사용 허가서 전문</doclink>을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [http://www.gnu.org/copyleft/gpl.html 온라인으로 읽어보시기] 바랍니다.",
        "config-sidebar": "* [//www.mediawiki.org 미디어위키 홈]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 사용자 가이드]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents 관리자 가이드]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>읽어보기</doclink>\n* <doclink href=ReleaseNotes>릴리스 노트</doclink>\n* <doclink href=Copying>전문</doclink>\n* <doclink href=UpgradeDoc>업그레이드하기</doclink>",
        "config-env-good": "환경이 확인되었습니다.\n미디어위키를 설치할 수 있습니다.",
        "config-env-bad": "환경이 확인되었습니다.\n미디어위키를 설치할 수 없습니다.",
-       "config-env-php": "PHP $1(이)가 설치되었습니다.",
+       "config-env-php": "PHP $1이(가) 설치되어 있습니다.",
+       "config-env-hhvm": "HHMV $1이(가) 설치되어 있습니다.",
        "config-unicode-using-utf8": "유니코드 정규화에 Brion Vibber의 utf8_normalize.so를 사용합니다.",
        "config-unicode-using-intl": "유니코드 정규화에 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용합니다.",
-       "config-unicode-pure-php-warning": "'''경고''': 유니코드 정규화를 처리할 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용할 수 없기 때문에 느린 pure-PHP 구현을 대신 사용합니다.\n트래픽이 높은 사이트에서 실행하시려면 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 유니코드 정규화]를 읽어보시기 바랍니다.",
-       "config-unicode-update-warning": "'''경고''': 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.\n만약 유니코드를 사용하는 것에 대해 우려가 된다면 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 업그레이드]해야합니다.",
+       "config-unicode-pure-php-warning": "<strong>경고</strong>: 유니코드 정규화를 처리할 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용할 수 없기 때문에 느린 pure-PHP 구현을 대신 사용합니다.\n트래픽이 높은 사이트에서 실행하시려면 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 유니코드 정규화]를 읽어보셔야 합니다.",
+       "config-unicode-update-warning": "<strong>경고</strong>: 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.\n만약 유니코드를 사용하는 것에 대해 우려가 된다면 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 업그레이드]해야합니다.",
        "config-no-db": "적절한 데이터베이스 드라이버를 찾을 수 없습니다! PHP용 데이터베이스 드라이버를 설치해야 합니다.\n다음 데이터베이스 유형을 지원합니다: $1.\n\nPHP를 직접 컴파일했다면, 예를 들어 <code>./configure --with-mysql</code>을 사용하여, 데이터베이스 클라이언트를 활성화하도록 다시 설정하세요.\n데비안이나 우분투 패키지에서 PHP를 설치했다면 <code>php5-mysql</code> 모듈도 설치해야 합니다.",
-       "config-outdated-sqlite": "'''경고''': 최소인 $2 버전보다 낮은 SQLite $1(이)가 있습니다. SQLite를 사용할 수 없습니다.",
-       "config-no-fts3": "'''경고''': SQLite를 [//sqlite.org/fts3.html FTS3 모듈] 없이 컴파일하며, 검색 기능은 백엔드에 사용할 수 없습니다.",
+       "config-outdated-sqlite": "<strong>경고</strong>: 최소인 $2 버전보다 낮은 SQLite $1(이)가 있습니다. SQLite를 사용할 수 없습니다.",
+       "config-no-fts3": "<strong>경고</strong>: SQLite를 [//sqlite.org/fts3.html FTS3 모듈] 없이 컴파일하며, 검색 기능은 백엔드에 사용할 수 없습니다.",
        "config-register-globals-error": "<strong>오류: PHP의 <code>[http://php.net/register_globals register_globals]</code> 옵션이 활성화되어 있습니다.\n설치를 계속하려면 비활성화해야 합니다.</strong>\n어떻게 하는지에 대한 도움말에 대해서는 [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals]를 보세요.",
-       "config-magic-quotes-runtime": "'''치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]이 활성화됩니다!'''\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상이 일으킵니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
-       "config-magic-quotes-sybase": "'''치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]이 활성화됩니다!'''\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상을 일으킵니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
-       "config-mbstring": "'''치명: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]이 활성화됩니다!'''\n이 옵션은 오류가 발생하고 데이터를 입력하는 데 예기치 않는 손상을 일으킬 수 있습니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
-       "config-safe-mode": "'''경고:''' [http://www.php.net/features.safe-mode 안전 모드]가 활성화됩니다!\n특히 파일을 올리거나 <code>math</code>를 지원하는 데 문제가 발생할 수 있습니다.",
+       "config-magic-quotes-gpc": "<strong>치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc]이 활성화되어 있습니다!</strong>\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상을 일으킵니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
+       "config-magic-quotes-runtime": "<strong>치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]이 활성화되어 있습니다!</strong>\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상이 일으킵니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
+       "config-magic-quotes-sybase": "<strong>치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]이 활성화되어 있습니다!</strong>\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상을 일으킵니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
+       "config-mbstring": "<strong>치명: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]이 활성화되어 있습니다!</strong>\n이 옵션은 오류가 발생하고 데이터를 입력하는 데 예기치 않는 손상을 일으킬 수 있습니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
+       "config-safe-mode": "<strong>경고:</strong> PHP의 [http://www.php.net/features.safe-mode 안전 모드]가 활성화되어 있습니다!\n특히 파일을 올리거나 <code>math</code>를 지원하는 데 문제가 발생할 수 있습니다.",
        "config-xml-bad": "PHP의 XML 모듈이 없습니다.\n미디어위키는 이 모듈의 기능이 필요하며 이 설정에서는 작동하지 않습니다.\nMandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.",
-       "config-pcre-old": "'''치명적인 오류:''' PCRE $1 또는 이후의 것들이 필요합니다. 당신의 PHP 바이너리는 PCRE $2와 연결되어 있습니다. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 더 많은 정보].",
-       "config-pcre-no-utf8": "'''치명''': PHP의 PCRE 모듈은 RCRE_UTF8 지원 없이 컴파일된 것 같습니다.\n미디어위키가 제대로 작동하려면 UTF-8을 지원해야 합니다.",
+       "config-pcre-old": "<strong>치명:</strong> PCRE $1 또는 그 이상이 필요합니다.\nPHP 바이너리는 PCRE $2에 연결되어 있습니다. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 자세한 정보].",
+       "config-pcre-no-utf8": "<strong>치명:</strong> PHP의 PCRE 모듈은 RCRE_UTF8 지원 없이 컴파일된 것 같습니다.\n미디어위키가 올바르게 작동하려면 UTF-8을 지원해야 합니다.",
        "config-memory-raised": "PHP의 <code>memory_limit</code>는 $1이며 $2(으)로 늘렸습니다.",
        "config-memory-bad": "'''경고:''' PHP의 <code>memory_limit</code>는 $1입니다.\n아마도 너무 낮은 것 같습니다.\n설치가 실패할 수 있습니다!",
        "config-ctype": "'''치명''': PHP는 [http://www.php.net/manual/en/ctype.installation.php Ctype 확장 기능]을 지원하도록 하여 컴파일해야 합니다.",
+       "config-iconv": "<strong>치명</strong>: PHP는 [http://www.php.net/manual/en/iconv.installation.php iconv 확장 기능]을 지원하도록 하여 컴파일해야 합니다.",
        "config-json": "'''치명:''' PHP가 JSON 지원이 없이 컴파일되었습니다.\n미디어위키를 설치하기 전에 PHP JSON 확장 기능이나 [http://pecl.php.net/package/jsonc PECL jsonc] 확장 기능 중 하나를 설치해야 합니다.\n* PHP 확장 기능은 Red Hat Enterprise Linux (CentOS) 5와 6에 포함되어 있지만, <code>/etc/php.ini</code>나 <code>/etc/php.d/json.ini</code>에서 활성화해야 합니다.\n* 2013년 5월 이후에 출시된 일부 리눅스 배포판은 PHP 확장 기능이 생략된 대신, <code>php5-json</code>이나 <code>php-pecl-jsonc</code>로 PECL 확장 기능이 포장되어 있습니다.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache]가 설치되었습니다",
        "config-apc": "[http://www.php.net/apc APC]가 설치되었습니다",
        "config-suhosin-max-value-length": "수호신(Suhosin)이 설치되고 $1 바이트로 GET 매개 변수 <code>length</code>를 제한하고 있습니다.\n미디어위키의 ResourceLoader 구성 요소는 이 제한을 회피하지만 성능이 저하됩니다.\n가능하면 <code>php.ini</code>의 <code>suhosin.get.max_value_length</code>를 1024 이상으로 설정하고 <code>LocalSettings.php</code>의 <code>$wgResourceLoaderMaxQueryLength</code>를 같은 값으로 설정해야 합니다.",
        "config-db-type": "데이터베이스 종류:",
        "config-db-host": "데이터베이스 호스트:",
-       "config-db-host-help": "ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ì\84\9cë²\84ê°\80 ë\8b¤ë¥¸ ì\84\9cë²\84ì\97\90 ì\9e\88ì\9c¼ë©´ ì\97¬ê¸°ì\97\90 í\98¸ì\8a¤í\8a¸ ì\9d´ë¦\84ì\9d´ë\82\98 IP ì£¼ì\86\8c를 ì\9e\85ë ¥í\95\98ì\84¸ì\9a\94.\n\nê³µì\9c í\95\98ë\8a\94 ì\9b¹ í\98¸ì\8a¤í\8c\85ì\9d\84 ì\82¬ì\9a©í\95\98ê³  ì\9e\88ì\9c¼ë©´ í\98¸ì\8a¤í\8c\85 ì \9cê³µ ì\97\85ì²´ë\8a\94 ì \95í\99\95í\95\9c í\98¸ì\8a¤í\8a¸ ì\9d´ë¦\84ì\9d\84 ì\84¤ëª\85í\95\98ê³  ì\9e\88ì\9d\84 ê²\83ì\9e\85ë\8b\88ë\8b¤.\n\nì\9c\88ë\8f\84 ì\84\9cë²\84ì\97\90 ì\84¤ì¹\98í\95\98ê³  MySQLì\9d\84 ì\82¬ì\9a©í\95\98ë©´ \"localhost\"ê°\80 í\95´ë\8b¹ 서버 이름으로는 작동하지 않을 수 있습니다. 그렇게 된다면 로컬 IP 주소로 \"127.0.0.1\"을 시도하세요.\n\nPostgreSQL을 사용하면 유닉스 소켓을 통해 연결되도록 입력란을 비워두세요.",
+       "config-db-host-help": "ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ì\84\9cë²\84ê°\80 ë\8b¤ë¥¸ ì\84\9cë²\84ì\97\90 ì\9e\88ì\9c¼ë©´ ì\97¬ê¸°ì\97\90 í\98¸ì\8a¤í\8a¸ ì\9d´ë¦\84ì\9d´ë\82\98 IP ì£¼ì\86\8c를 ì\9e\85ë ¥í\95\98ì\84¸ì\9a\94.\n\nê³µì\9c í\95\98ë\8a\94 ì\9b¹ í\98¸ì\8a¤í\8c\85ì\9d\84 ì\82¬ì\9a©í\95\98ê³  ì\9e\88ì\9c¼ë©´ í\98¸ì\8a¤í\8c\85 ì \9cê³µ ì\97\85ì²´ë\8a\94 ì\98¬ë°\94른 í\98¸ì\8a¤í\8a¸ ì\9d´ë¦\84ì\9d\84 ì\84¤ëª\85í\95\98ê³  ì\9e\88ì\9d\84 ê²\83ì\9e\85ë\8b\88ë\8b¤.\n\nWindows ì\84\9cë²\84ì\97\90 ì\84¤ì¹\98í\95\98ê³  MySQLì\9d\84 ì\82¬ì\9a©í\95\98ë©´ \"localhost\"ê°\80 서버 이름으로는 작동하지 않을 수 있습니다. 그렇게 된다면 로컬 IP 주소로 \"127.0.0.1\"을 시도하세요.\n\nPostgreSQL을 사용하면 유닉스 소켓을 통해 연결되도록 입력란을 비워두세요.",
        "config-db-host-oracle": "데이터베이스 TNS:",
        "config-db-host-oracle-help": "올바른 [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 로컬 연결 이름]을 입력하세요. tnsnames.ora 파일이 이 설치 위치에서 참조할 수 있는 곳에 있어야 합니다.<br />10g 이후의 클라이언트 라이브러리를 사용하는 경우 [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 쉬운 연결] 네이밍 메서드도 사용할 수 있습니다.",
        "config-db-wiki-settings": "이 위키 식별",
        "config-db-name": "데이터베이스 이름:",
        "config-db-name-help": "위키를 식별하기 위한 이름을 선택하세요.\n공백이 없어야 합니다.\n\n공유하는 웹 호스팅 사용하면 호스팅 제공 업체가 특정 데이터베이스 이름을 제공하거나 제어판에서 데이터베이스를 만들 수 있습니다.",
        "config-db-name-oracle": "데이터베이스 스키마:",
-       "config-db-account-oracle-warn": "데이터베이스 백엔드로 오라클을 설치하기 위해 지원하는 세 가지 시나리오가 있습니다:\n\n설치 과정의 일부로 데이터베이스 계정을 만들려면 설치를 위해 데이터베이스 계정으로 SYSDBA 역할을 가진 계정을 제공하고 웹 접근 계정에 대해 원하는 자격 증명을 지정하세요, 그렇지 않으면 수동으로 웹 접근 계정을 만들 수 있으며 (스키마 개체를 만들 권한이 필요한 경우) 또는 생성 권한으 가진 계정과 웹 접근이 제한된 계정의 두 가지 다른 계정을 제공할 수도 있습니다\n\n필요한 권한을 가진 계정을 만드는 스크립트는 이 설치 위치의 \"maintenance/oracle/\" 디렉터리에서 찾을 수 있습니다. 제한된 계정을 사용하면 기본 계정의 모든 유지 관리 기능이 비활성화된다는 점에 유의하십시오.",
+       "config-db-account-oracle-warn": "데이터베이스 백엔드로 Oracle을 설치하기 위해 지원하는 세 가지 시나리오가 있습니다:\n\n설치 과정의 일부로 데이터베이스 계정을 만들려면 설치를 위해 데이터베이스 계정으로 SYSDBA 역할을 가진 계정을 제공하고 웹 접근 계정에 대해 원하는 자격 증명을 지정하세요, 그렇지 않으면 수동으로 웹 접근 계정을 만들 수 있으며 (스키마 개체를 만들 권한이 필요한 경우) 또는 생성 권한을 가진 계정과 웹 접근이 제한된 계정의 두 가지 다른 계정을 제공할 수도 있습니다\n\n필요한 권한을 가진 계정을 만드는 스크립트는 이 설치 위치의 \"maintenance/oracle/\" 디렉터리에서 찾을 수 있습니다. 제한된 계정을 사용하면 기본 계정의 모든 유지 관리 기능이 비활성화된다는 점에 유의하십시오.",
        "config-db-install-account": "설치를 위한 사용자 계정",
        "config-db-username": "데이터베이스 사용자 이름:",
        "config-db-password": "데이터베이스 비밀번호:",
        "config-oracle-temp-ts": "임시 테이블공간:",
        "config-type-mysql": "MySQL (또는 호환되는 데이터베이스 시스템)",
        "config-type-oracle": "Oracle",
-       "config-type-mssql": "마이크로소프트 SQL 서버",
+       "config-type-mssql": "Microsoft SQL 서버",
        "config-support-info": "미디어위키는 다음의 데이터베이스 시스템을 지원합니다:\n\n$1\n\n데이터베이스 시스템이 표시되지 않을 때 아래에 나열된 다음 지원을 활성화하려면 위의 링크된 지시에 따라 설치해볼 수 있습니다.",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]은 미디어위키의 기본 대상이며 가장 잘 지원됩니다. 미디어위키는 또한 MySQL와 호환되는 [{{int:version-db-mariadb-url}} MariaDB]와 [{{int:version-db-percona-url}} Percona 서버]에서도 작동합니다. \n\n([http://www.php.net/manual/en/mysql.installation.php MySQL을 지원하여 PHP를 컴파일하는 방법])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL]은 MySQL의 대안으로서 인기 있는 오픈 소스 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQL을 지원하여 PHP를 컴파일하는 방법]) 몇 가지 해결하지 못한 사소한 버그가 있을 수 있으며, 이를 제작 환경에서 사용하지 않는 것이 좋습니다.",
-       "config-dbsupport-sqlite": "*  [{{int:version-db-sqlite-url}} SQLite]는 매우 잘 지원되고 가벼운 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pdo.installation.php SQLite를 지원하여 PHP를 컴파일하는 방법], PDO 사용)",
-       "config-dbsupport-oracle": "*  [{{int:version-db-oracle-url}} 오라클]은 상용 엔터프라이스 데이터베이스입니다. ([http://www.php.net/manual/en/oci8.installation.php OCI8을 지원하여 PHP를 컴파일하는 방법])",
-       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} 마이크로소프트 SQL 서버]는 윈도용 상용 기업 데이터베이스입니다.([http://www.php.net/manual/en/sqlsrv.installation.php SQLSRV 지원으로 PHP를 컴파일하는 방법])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]은 미디어위키의 기본 대상이며 가장 잘 지원됩니다. 미디어위키는 또한 MySQL와 호환되는 [{{int:version-db-mariadb-url}} MariaDB]와 [{{int:version-db-percona-url}} Percona 서버]에서도 작동합니다. ([http://www.php.net/manual/en/mysql.installation.php MySQL 지원으로 PHP를 컴파일하는 방법])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL]은 MySQL의 대안으로서 인기 있는 오픈 소스 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQL 지원으로 PHP를 컴파일하는 방법]) 몇 가지 해결하지 못한 사소한 버그가 있을 수 있으며, 이를 제작 환경에서 사용하지 않는 것이 좋습니다.",
+       "config-dbsupport-sqlite": "*  [{{int:version-db-sqlite-url}} SQLite]는 매우 잘 지원되고 가벼운 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pdo.installation.php SQLite 지원으로 PHP를 컴파일하는 방법], PDO 사용)",
+       "config-dbsupport-oracle": "*  [{{int:version-db-oracle-url}} Oracle]은 상용 기업 데이터베이스입니다. ([http://www.php.net/manual/en/oci8.installation.php OCI8 지원으로 PHP를 컴파일하는 방법])",
+       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL 서버]는 Windows용 상용 기업 데이터베이스입니다. ([http://www.php.net/manual/en/sqlsrv.installation.php SQLSRV 지원으로 PHP를 컴파일하는 방법])",
        "config-header-mysql": "MySQL 설정",
        "config-header-postgres": "PostgreSQL 설정",
        "config-header-sqlite": "SQLite 설정",
        "config-header-oracle": "Oracle 설정",
-       "config-header-mssql": "마이크로소프트 SQL 서버 설정",
+       "config-header-mssql": "Microsoft SQL 서버 설정",
        "config-invalid-db-type": "잘못된 데이터베이스 종류",
        "config-missing-db-name": "\"{{int:config-db-name}}\"에 대한 값을 입력해야 합니다.",
        "config-missing-db-host": "\"{{int:config-db-host}}\"에 대한 값을 입력해야 합니다.",
        "config-missing-db-server-oracle": "\"{{int:config-db-host-oracle}}\"에 대한 값을 입력해야 합니다.",
-       "config-invalid-db-server-oracle": "\"$1\" 데이터베이스 TNS가 잘못됐습니다.\n\"TNS Name\"이나 \"Easy Connect\" 문자열 중 하나를 사용하세요 ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm 오라클 네이밍 메서드])",
+       "config-invalid-db-server-oracle": "\"$1\" 데이터베이스 TNS가 잘못됐습니다.\n\"TNS Name\"이나 \"Easy Connect\" 문자열 중 하나를 사용하세요 ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle 네이밍 메서드]).",
        "config-invalid-db-name": "\"$1\" 데이터베이스 이름이 잘못되었습니다.\nASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.",
        "config-invalid-db-prefix": "\"$1\" 데이터베이스 접두어가 잘못됐습니다.\nASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.",
        "config-connection-error": "$1.\n\n호스트, 계정 이름과 비밀번호를 확인하고 다시 시도하세요.",
        "config-db-sys-create-oracle": "설치 프로그램은 새 계정을 만들기 위한 SYSDBA 계정만을 지원합니다.",
        "config-db-sys-user-exists-oracle": "\"$1\" 사용자 계정이 이미 존재합니다. SYSDBA는 새 계정을 만드는 데에만 사용할 수 있습니다!",
        "config-postgres-old": "PostgreSQL $1 이상이 필요하나 $2(이)가 있습니다.",
-       "config-mssql-old": "마이크로소프트 SQL 서버 $1 이상의 버전이 필요합니다. 현재 버전은 $2입니다.",
+       "config-mssql-old": "Microsoft SQL 서버 $1 이상의 버전이 필요합니다. 현재 버전은 $2입니다.",
        "config-sqlite-name-help": "위키를 식별하기 위한 이름을 선택하세요.\n공백이나 하이픈을 사용하지 마십시오.\nSQLite 데이터 파일 이름에 사용됩니다.",
        "config-sqlite-parent-unwritable-group": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버는 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 프로그램은 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버가 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
        "config-sqlite-parent-unwritable-nogroup": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버가 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 프로그램은 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버(와 그 외 서버!)가 전역으로 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-extensions": "확장 기능",
        "config-extensions-help": "위에 나열된 확장 기능이 <code>./extensions</code>에서 발견되었습니다.\n\n추가적인 설정이 필요할 수 있습니다만 지금 활성화시킬 수 있습니다.",
        "config-skins": "스킨",
+       "config-skins-help": "위에 나열된 스킨이 <code>./skins</code> 디렉터리에서 감지되었습니다. 적어도 하나를 활성화하고 나서, 기본값을 선택해야 합니다.",
        "config-skins-use-as-default": "이 스킨을 기본값으로 사용",
+       "config-skins-missing": "스킨을 찾을 수 없습니다; 미디어위키는 당신이 적절한 스킨을 설치할 때까지 대체 스킨을 사용합니다.",
+       "config-skins-must-enable-some": "적어도 활성화활 스킨 하나를 선택해야 합니다.",
+       "config-skins-must-enable-default": "기본값으로 설정한 스킨은 반드시 활성화해야 합니다.",
        "config-install-alreadydone": "'''경고:''' 이미 미디어위키를 설치했고 다시 설치하려고 합니다.\n다음 페이지로 진행하세요.",
        "config-install-begin": "\"{{int:config-continue}}\"을 누르면 미디어위키의 설치를 시작합니다.\n그래도 바꾸는 것을 원한다면 \"{{int:config-back}}\"를 누르세요.",
        "config-install-step-done": "완료",
        "config-install-stats": "통계를 초기화하는 중",
        "config-install-keys": "보안 키를 만드는 중",
        "config-insecure-keys": "'''경고:''' 설치 중에 생성한 {{PLURAL:$2|보안 키}} ($1)는 완전히 안전하지 {{PLURAL:$2|않습니다}}. 직접 바꾸는 것을 고려하세요.",
+       "config-install-updates": "불필요한 업데이트 실행 방지",
+       "config-install-updates-failed": "<strong>오류:</strong> 다음 오류로 테이블 안에 업데이트 키를 넣기에 실패했습니다: $1",
        "config-install-sysop": "관리자 사용자 계정을 만드는 중",
        "config-install-subscribe-fail": "미디어위키 알림을 구독할 수 없습니다: $1",
        "config-install-subscribe-notpossible": "cURL이 설치되어 있지 않고 <code>allow_url_fopen</code>을 사용할 수 없습니다.",
index 785b2b5..f87389d 100644 (file)
@@ -21,7 +21,7 @@
        "config-no-session": "De Daate för Ding Setzung sinn verschött jejange.\nDonn en dä Dattei <code>php.ini</code> nohloore, ov dä <code lang=\"en\">session.save_path</code> op e zopaß Verzeijschneß zeisch.",
        "config-your-language": "Ding Schprooch:",
        "config-your-language-help": "Donn heh di Shprooch ußsöhke, di dat Enshtallzjuhnsprojramm kalle sull.",
-       "config-wiki-language": "Dem Wiki sing Shprooch:",
+       "config-wiki-language": "Dem Wiki sing Schprohch:",
        "config-wiki-language-help": "Donn heh di Shprooch ußsöhke, di et Wiki shtandattmääßesch kalle sull.",
        "config-back": "← Retuur",
        "config-continue": "Wigger →",
@@ -48,7 +48,7 @@
        "config-env-good": "De Ömjävung es jeprööf.\nDo kanns MediaWiki opsäze.",
        "config-env-bad": "De Ömjävung es jeprööf.\nDo kanns MediaWiki nit opsäze.",
        "config-env-php": "PHP $1 es doh.",
-       "config-env-php-toolow": "PHP $1 es enshtalleert.\nÄvver MediaWiki bruch PHP $2 udder hühter.",
+       "config-env-hhvm": "HHVM $1 es enschtalleerd.",
        "config-unicode-using-utf8": "För et <i lang=\"en\">Unicode</i>-Nommaliseere dom_mer däm <i lang=\"en\">Brion Vibber</i> sing Projramm <code lang=\"en\">utf8_normalize.so</code> nämme.",
        "config-unicode-using-intl": "För et <i lang=\"en\">Unicode</i>-Nommaliseere dom_mer dä [http://pecl.php.net/intl Zohsaz <code lang=\"en\">intl</code> uss em <code lang=\"en\">PECL</code>] nämme.",
        "config-unicode-pure-php-warning": "'''Opjepaß:''' Mer kunnte dä [http://pecl.php.net/intl Zohsaz <code lang=\"en\">intl</code> uss em <code lang=\"en\">PECL</code>] för et <i lang=\"en\">Unicode</i>-Nommaliseere nit fenge. Dröm nämme mer dat eijfache, ävver ärsh lahme, <i lang=\"en\">PHP</i>-Projrammshtöck doför.\nFör jruuße Wikis met vill Metmaachere doht Üsch die Sigg övver et [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations <i lang=\"en\">Unicode</i>-Nommaliseere] (es op Änglesch) aanloore.",
@@ -56,7 +56,8 @@
        "config-no-db": "Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.\nMer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.\nMer künne met heh dä Daatebangke ömjonn: $1.\n\nWann De nit om eijene Rääshner bes, moß De Dinge <i lang=\"en\">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.\nWann de PHP sellver övversaz häs, donn e Zohjangsprojramm för en Daatebangk enbenge, för e Beishpell met: <code  lang=\"en\">./configure --with-mysql</code>.\nWann De PHP uss enem <i lang=\"en\">Debian</i> udder <i lang=\"en\">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang=\"en\">php5-mysql</code> op Dinge Räschner bränge.",
        "config-outdated-sqlite": "'''Opjepaß:''' <i lang=\"en\">SQLite</i> $1 es enschtaleert. Avver MediaWiki bruch <i lang=\"en\">SQLite</i> $2 udder hühter. <i lang=\"en\">SQLite</i> kann dröm nit enjesaz wääde.",
        "config-no-fts3": "'''Opjepaß:''' De Projramme vum <i lang=\"en\">SQLite</i> sin der ohne et [//sqlite.org/fts3.html FTS3-Modul] övversaz, dröm wääde de Funxjohne för et Söhke fähle.",
-       "config-register-globals": "'''Opjepaß:''' dem PHP singe Schallder <code lang=\"en\">[http://php.net/register_globals register_globals]</code> es enjeschalldt.\n'''Donn dä ußmaache, wann De kann.'''\nMediaWiki löp och esu, dä künnt ävver Sesherheitslöcke opmaache, di mer noch nit jefonge un eruß jemaat hät.",
+       "config-register-globals-error": "<strong>Fähler: dem PHP sing Enschtällong <code>[http://php.net/register_globals register_globals]</code> es aanjeschalldt.\nSe moß ußjeschalldt sin, domet mer heh wigger maache kann.</strong>\nLoor op dä Sigg [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] wi mer se ußschallde kann.",
+       "config-magic-quotes-gpc": "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc]</code> es enjeschalldt.\nDä määt enjejovve Daate kapott, un doh draan kam_mer dann nix mieh repareere.\nDomet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.\nDat heiß, mer moß en affschallde, söns jeiht nix.",
        "config-magic-quotes-runtime": "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]</code> es enjeschalldt.\nDä määt enjejovve Daate kapott, un doh draan kam_mer dann nix mieh repareere.\nDomet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.\nDat heiß, mer moß en affschallde, söns jeiht nix.",
        "config-magic-quotes-sybase": "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> es enjeschalldt.\nDä määt enjejovve Daate kapott, un doh draan kam_mer dann nix mieh repareere.\nDomet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.\nDat heiß, mer moß en affschallde, söns jeiht nix.",
        "config-mbstring": "'''Dä!''' Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> es enjeschalldt.\nDat sorresch för Fähler un kann enjejovve Daate esu kapott maach, dat doh draan nix mieh ze repareere es.\nDomet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.\nDat heiß, mer moß en affschallde, söns jeiht nix.",
@@ -67,6 +68,7 @@
        "config-memory-raised": "Der jrühzte zohjelasse Shpeisherbedarf vum PHP, et <code lang=\"en\">memory_limit</code>, shtund op $1 un es op $2 erop jesaz woode.",
        "config-memory-bad": "'''Opjepaß:''' Dem PHP singe Parameeter <code lang=\"en\">memory_limit</code> es $1.\nDat es wall ze winnisch.\nEt Enreeschte kunnt doh draan kappott jon!",
        "config-ctype": "'''Fähler:''' <i lang=\"en\">PHP</i> moß met dä Ongerschtözong för der [http://www.php.net/manual/en/ctype.installation.php <code lang=\"en\">Ctype</code> Zohsaz] övversaz woode sin.",
+       "config-iconv": "'''Fähler:''' <i lang=\"en\">PHP</i> moß met dä Ongerschtözong för der [http://www.php.net/manual/en/iconv.installation.php <code lang=\"en\">iconv</code> Zohsaz] övversaz woode sin.",
        "config-json": "'''Dä!:''' PHP wood der ohne <i lang=\"en\" xml:lang=\"en\">JSON</i> övversaz.\nJäz moß de äntweeder dä PHP-<i lang=\"en\" xml:lang=\"en\">JSON</i>-Zohsaz enschtallere udder der <i lang=\"en\" xml:lang=\"en\">[http://pecl.php.net/package/jsonc PECL jsonc]</i>-Zohsaz, ih dat de MedijaWikki enschtallere kanns.\n* Dä PHP-Zohsaz es em <i lang=\"en\" xml:lang=\"en\">Red Hat Enterprise Linux (CentOS)</i> 5 un 6 änthallde, moß ävver en de <code lang=\"en\" xml:lang=\"en\">/etc/php.ini</code> udder <code lang=\"en\" xml:lang=\"en\">/etc/php.d/json.ini</code> enjeschalldt wääde.\n* E paa Linux Destrebuzjohne lohß zigg_em Mai 2013 dä PHP-Zohsaz fott un packe doför der PECL-Zohsaz als <code lang=\"en\" xml:lang=\"en\">php5-json</code> udder <code lang=\"en\" xml:lang=\"en\">php-pecl-jsonc</code> med ein.",
        "config-xcache": "Dä <code lang=\"en\">[http://xcache.lighttpd.net/ XCache]</code> es ennjeresht.",
        "config-apc": "Dä <code lang=\"en\">[http://www.php.net/apc APC]</code> es ennjeresht.",
        "config-license-gfdl": "De <i lang=\"en\">GNU</i>-Lizänz för frei Dokemäntazjuhne, Version 1.3 udder en späädere",
        "config-license-pd": "Allmende (jemeinfrei, <i lang=\"en\">public domain</i>)",
        "config-license-cc-choose": "En <i lang=\"en\">Creative Commons</i> Lizänz, sellver ußjesöhk:",
-       "config-license-help": "Ättlijje öffentleje Wikis donn iehr Beidrääsh onger en [http://freedomdefined.org/Definition frei Lizänz] shtelle.\nDat hellef, e Jeföhl vun Jemeinsamkeid opzeboue, un op lange Seesh emmer wider Beidrääsch ze krijje.\nDat es nit onbedengk nüüdesh för e Jeschäffs- udder Privaat_Wiki.\n\nWä Stöcke uß de Wikipedia bruche well, un han well, dat de Wikipedia uss_em eije Wiki jät övvernämme kann, sullt „'''<i lang=\"en\">Creative Commons</i>, dem Schriever singe Name moß jenannt wääde, un Wiggerjävve zoh dersellve Bedengunge es zohjelohße'''“ ußwähle.\n\nDe su jenannte '''<i lang=\"en\">GNU Free Documentation License</i>''' (de freije Lizänz för Dokemäntazjuhne vun dä GNU) sen de ahle Lizänzbedenonge vun de Wikipedia. Se es emmer noch in Odenong un jöltesch, ävver se es schwer ze vershtonn un et Wiggerjävve un widder Verwände es manshmool schwieeresch domet.",
+       "config-license-help": "Ättlijje öffentleje Wikis donn iehr Beidrääsch onger en [http://freedomdefined.org/Definition freije Lizänz] schtelle.\nDat hellef, e Jeföhl vun Jemeinsamkeid opzeboue, un op lange Seesch emmer wider Beidrääsch ze krijje.\nDat es nit onbedengk nüüdesh för e Jeschäffs- udder Privaat_Wiki.\n\nWä Stöcke uß de Wikipedia bruche well, un dröm han well, dat mer för Wikipedia uss_em eije Wiki jät övvernämme kann, sullt „'''<i lang=\"en\">Creative Commons</i>, dem Schriever singe Name moß jenannt wääde, un Wiggerjävve zoh dersellve Bedengunge es zohjelohße'''“ ußwähle.\n\nDe su jenannte '''<i lang=\"en\">GNU Free Documentation License</i>''' (de freije Lizänz för Dokemäntazjuhne vun dä GNU) sen de ahle Lizänzbedenonge vun de Wikipedia. Se es emmer noch in Odenong un jöltesch, ävver se es schwer ze verschtonn un et Wiggerjävve un widder Bruche es ens schwieerejer domet.",
        "config-email-settings": "Enschtellunge för de <i lang=\"en\">e-mail</i>",
        "config-enable-email": "De <i lang=\"en\">e-mail</i> noh druße zohlohße",
        "config-enable-email-help": "Sulle <i lang=\"en\">e-mails</i> zohjelohße sin, moß mer, domet et noher flupp, de [http://www.php.net/manual/en/mail.configuration.php Enschtellunge em PHP för de <i lang=\"en\">e-mails</i>] zopaß jemaat han.\nWann kein <i lang=\"en\">e-mails</i> nüüdesch sin, kam_mer se heh afschallde.",
        "config-memcache-badport": "Dem <code lang=\"en\">memcached</code> ẞööver singe Pooz (<code lang=\"en\">port</code>) Nommere sullte zwesche $1 un $2 sin.",
        "config-extensions": "Projramm-Zohsäz (<i lang=\"en\">Extensions</i>)",
        "config-extensions-help": "Di bovve opjeleß Zohsazprojramme för et MediaWiki sin em Verzeischneß <code lang=\"en\">./extensions</code> ald ze fenge.\n\nDo kann se heh un jez aanschallde, ävver se künnte noch zohsäzlesch Enshtellunge bruche.",
+       "config-skins": "Bedeenbovverfläsche",
+       "config-skins-help": "De opjeleß Beddenbovverfläsche sin en Dingem Verzeischnesß <code>./skins</code> dre. Do moß winneschßdens eine enschallde, un eine för der Schtandatt ußsöhke.",
+       "config-skins-use-as-default": "Donn heh di Bovverfläsch als der Schtandatt nämme.",
+       "config-skins-missing": "Mer han kein bedeebovverfläsche jevonge un nämme dröm der Schtandatt, bes De wälsche enjeresch häß.",
+       "config-skins-must-enable-some": "Do moß winneschßtens ein Beddenbovverfläsch ußsöhke zum aanschallde.",
+       "config-skins-must-enable-default": "De Schtadatt-Beddenbovverfläsch moß och enjeschalldt sin.",
        "config-install-alreadydone": "'''Opjepaß:'''\nEt sühd esu uß, wi wann De MediaWiki ald enshtalleet hätß, un wöhrs aam Versöhke, dat norr_ens ze donn.\nJang wigger op de näähßte Sigg.",
        "config-install-begin": "Wann De op „{{int:config-continue}}“ klecks, jeiht de Enshtallazjuhn vum MediaWiki loßß.\nWann De noch Änderonge maache wells, dann kleck op „{{int:config-back}}“.",
        "config-install-step-done": "jedonn",
        "config-install-stats": "De Shtatestek-Zahle wääde op Aanfang jeshtallt.",
        "config-install-keys": "Jeheime Schlößel wääde opjebout.",
        "config-insecure-keys": "'''Opjepaß:''' {{PLURAL:$2|Ene jeheime Schlößel|Jeheim Schlößele|Keine jeheime Schlößel}} ($1) {{PLURAL:$2|es|sin|es}} automattesch aanjelaat woode. {{PLURAL:$2|Dä es|Di sin|Hä es}} ävver nit onbedengk janz sescher. Övverlääsch Der, {{PLURAL:$2|dä|di|en}} norr_ens vun Hand ze ändere.",
+       "config-install-updates": "Donn kein onnühdeje Änderonge maache.",
+       "config-install-updates-failed": "<strong>Dä:</strong> Schlößßelle för et Ändere en Tabälle  bränge es donävve jajange. Jemäldt wood: $1",
        "config-install-sysop": "Dä Zohjang för der Wiki-Köbes weed aanjelaat.",
        "config-install-subscribe-fail": "Mer künne de <i lang=\"en\">e-mail</i>-Leß <code lang=\"en\">mediawiki-announce</code> nit abonneere: $1",
        "config-install-subscribe-notpossible": "<code lang=\"en\">cURL</code> es nit enstalleed un <code lang=\"en\">allow_url_fopen</code>es nit doh.",
        "config-install-done": "'''Jlöckwonsch!'''\nMediaWiki es jetz enstalleet.\n\nEt Projramm zom Enreeschte hät en Dattei <code lang=\"en\">LocalSettings.php</code> aanjelaat.\nDoh sin de Enstellunge vum Wiki dren.\n\nDo weeß se eronge laade möße un dann en dem Wiki sing Aanfangsverzeishnes donn möße, et sellve Verzeisneß, woh di Dattei <code lang=\"en\">index.php</code> dren litt. Dat Erongerlaade sullt automattesch aanjefange han.\n\nWann domet jet nit jeflupp hät, udder De di Dattei norr_ens han wells, donn op dä Lengk heh dronger klecke:\n\n$3\n\n'''Opjepaß''': Wann De dat jez nit deihß, es alles verschött, wat De bes jöz enjejovve häs, weil di Dattei fott es en däm Momang, woh heh dat Projamm aam Engk es.\n\nWann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De '''[$2 en Ding Wiki jonn]'''.",
        "config-download-localsettings": "Donn di Dattei <code lang=\"en\">LocalSettings.php</code> eronger laade",
        "config-help": "Hölp",
+       "config-help-tooltip": "Donn Hölp heh aan däm Plaaz enblände.",
        "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": "'''MediaWiki es jäz enschtalleht.'''",
index 9941442..bb1c829 100644 (file)
@@ -44,6 +44,7 @@
        "config-env-good": "Den Environement gouf nogekuckt.\nDir kënnt MediaWiki installéieren.",
        "config-env-bad": "Den Environnement gouf iwwerpréift.\nDir kënnt MediWiki net installéieren.",
        "config-env-php": "PHP $1 ass installéiert.",
+       "config-env-hhvm": "HHVM $1 ass installéiert.",
        "config-unicode-using-utf8": "Fir d'Unicode-Normalisatioun gëtt dem Brion Vibber säin <code>utf8_normalize.so</code> benotzt.",
        "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\nDës Datebank-Type ginn ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.",
        "config-missing-db-name": "Dir musst e Wäert fir \"{{int:config-db-name}}\" aginn",
        "config-missing-db-host": "Dir musst e Wäert fir \"{{int:config-db-host}}\" aginn.",
        "config-missing-db-server-oracle": "Dir musst e Wäert fir \"{{int:config-db-host-oracle}}\" aginn",
+       "config-connection-error": "$1.\n\nKuckt den Numm vum Server, de Benotzernumm an d'Passwuert no a probéiert et nach eng Kéier.",
        "config-db-sys-user-exists-oracle": "De Benotzerkont \"$1\" gëtt et schonn. SYSDBA kann nëmme benotzt gi fir en neie Benotzerkont opzemaachen.",
        "config-postgres-old": "PostgreSQL $1 oder eng méi nei Versioun gëtt gebraucht, Dir hutt $2.",
        "config-mssql-old": "Microsoft SQL Server $1 oder eng méi rezent Versioun gëtt gebraucht. Dir hutt d'Versioun $2.",
        "config-install-interwiki-list": "De Fichier <code>interwiki.list</code> gouf net fonnt.",
        "config-install-stats": "Initialisatioun vun de Statistiken",
        "config-install-keys": "Generéiere vum Geheimschlëssel",
+       "config-install-updates": "Net néideg Aktualiséierungen net maachen",
        "config-install-sysop": "Administrateur Benotzerkont gëtt ugeluecht",
        "config-install-mainpage": "Haaptsäit mat Standard-Inhalt gëtt ugeluecht",
        "config-install-extension-tables": "D'Tabelle fir déi aktivéiert Erweiderunge ginn ugeluecht",
index b52cef7..d061824 100644 (file)
@@ -1,9 +1,29 @@
 {
        "@metadata": {
                "authors": [
-                       "Umeshberma"
+                       "Umeshberma",
+                       "बिप्लब आनन्द"
                ]
        },
+       "config-information": "जानकारी",
+       "config-your-language": "अहाँक भाषा:",
+       "config-your-language-help": "इन्स्टल होएतकाल भाषाके चयन करू",
+       "config-wiki-language": "विकी भाषा:",
+       "config-back": "← पाछा",
+       "config-continue": "आगु चलु →",
+       "config-page-language": "भाषा",
+       "config-page-welcome": "मीडियाविकीमे अहाँक स्वागत अछि!",
+       "config-page-dbconnect": "डेटाबेसस जुडु",
+       "config-page-upgrade": "भेल इन्स्टलेसन क नविनीकरण करु",
+       "config-page-dbsettings": "डाटाबेस",
+       "config-page-name": "नाम",
+       "config-page-options": "विकल्प",
+       "config-page-install": "स्थापित करु",
+       "config-page-complete": "पूर्ण!",
+       "config-page-restart": "स्थापनाके पुनारम्भ करु",
+       "config-page-readme": "पढू",
+       "config-page-existingwiki": "रहल विकी",
+       "config-restart": "हँ, एकरा पुन: सुरु कएल जाए",
        "mainpagetext": "'''मीडियाविकी नीक जकाँ प्रस्थापित भेल।'''",
        "mainpagedocfooter": "सम्पर्क करू [//meta.wikimedia.org/wiki/Help:Contents User's Guide] विकी तंत्रांशक प्रयोगक जानकारी लेल।\n\n==प्रारम्भ कोना करी==\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]"
 }
index 74359b2..3576585 100644 (file)
@@ -25,7 +25,7 @@
        "config-back": "← Назад",
        "config-continue": "Продолжи →",
        "config-page-language": "Јазик",
-       "config-page-welcome": "Добредојдовте на МедијаВики!",
+       "config-page-welcome": "Добре дојдовте на МедијаВики!",
        "config-page-dbconnect": "Поврзување со базата",
        "config-page-upgrade": "Надградба на постоечката воспоставка",
        "config-page-dbsettings": "Нагодувања на базата",
@@ -47,6 +47,7 @@
        "config-env-good": "Околината е проверена.\nМожете да го воспоставите МедијаВики.",
        "config-env-bad": "Околината е проверена.\nНе можете да го воспоставите МедијаВики.",
        "config-env-php": "PHP $1 е воспоставен.",
+       "config-env-hhvm": "HHVM $1 е воспоставен.",
        "config-unicode-using-utf8": "Со utf8_normalize.so за уникодна нормализација од Брајон Вибер (Brion Vibber).",
        "config-unicode-using-intl": "Со додатокот [http://pecl.php.net/intl intl PECL] за уникодна нормализација.",
        "config-unicode-pure-php-warning": "'''Предупредување''': Додатокот [http://pecl.php.net/intl intl PECL] не е достапен за врши уникодна нормализација, враќајќи се на бавна примена на чист PHP.\n\nАко имате високопрометно мрежно место, тогаш ќе треба да прочитате повеќе за [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations уникодната нормализација].",
        "config-install-stats": "Ги подготвувам статистиките",
        "config-install-keys": "Создавање на тајни клучеви",
        "config-insecure-keys": "'''Предупредување:''' {{PLURAL:$2|Безбедносниот клуч $1 создаден во текот на воспоставката не е сосем безбеден|Безбедносните клучеви $1 создадени во текот на воспоставката не се сосем безбедни}}. Ви препорачуваме да {{PLURAL:$2|го|ги}} смените рачно.",
+       "config-install-updates": "Спречи вршење на непотребни поднови",
+       "config-install-updates-failed": "<strong>Грешка:</strong> Вметнувањето на подновни клучеви во табелите не успеа, со следнава грешка: $1",
        "config-install-sysop": "Создавање на администраторска корисничка сметка",
        "config-install-subscribe-fail": "Не можам да ве претплатам на известувањето mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL не е воспоставен, а <code>allow_url_fopen</code> не е достапно.",
index 8bdfe0c..4aeba75 100644 (file)
@@ -4,11 +4,12 @@
                        "Anakmalaysia",
                        "Pizza1016",
                        "SNN95",
-                       "MaxSem"
+                       "MaxSem",
+                       "Aviator"
                ]
        },
        "config-desc": "Pemasang MediaWiki",
-       "config-title": "Pasangan MediaWiki $1",
+       "config-title": "Pemasangan MediaWiki $1",
        "config-information": "Maklumat",
        "config-localsettings-upgrade": "Fail <code>LocalSettings.php</code> telah dikesan.\nUntuk menaik taraf pemasangan, sila masukkan nilai <code>$wgUpgradeKey</code> dalam kotak di bawah.\nAnda akan menjumpainya di <code>LocalSettings.php</code> .",
        "config-localsettings-cli-upgrade": "Fail <code>LocalSettings.php</code> telah dikesan.\nUntuk menaik taraf pemasangan, sila jalankan <code>update.php</code> sebaliknya",
@@ -52,6 +53,7 @@
        "config-unicode-using-utf8": "utf8_normalize.so oleh Brion Vibber digunakan untuk penormalan Unicode.",
        "config-unicode-using-intl": "[http://pecl.php.net/intl Sambungan intl PECL] digunakan untuk penormalan Unicode.",
        "config-unicode-update-warning": "<strong>Amaran:</strong> Versi pembalut penormalan Unicode yang terpasang menggunakan perpustakaan [http://site.icu-project.org/ projek ICU] dalam versi yang lampau.\nAnda harus [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations menaik taraf] jika Unicode penting bagi anda.",
+       "config-outdated-sqlite": "<strong>Amaran:</strong> anda mempunyai SQLite $1 yang lebih rendah daripada versi keperluan minimum $1. SQLite tidak akan disediakan.",
        "config-no-fts3": "<strong>Amaran:</strong> SQLite disusun tanpa [//sqlite.org/fts3.html modil FTS3], maka ciri-ciri pencarian tidak akan disediakan pada backend ini.",
        "config-mbstring": "<strong>Amaran keras: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] sedang aktif!</strong>\nOpsyen ini menyebabkan ralat dan mungkin mencemari data secara tanpa diduga.\nAnda tidak boleh memasang atau menggunakan MediaWiki melainkan opsyen ini dinyahdayakan.",
        "config-pcre-old": "<strong>Amaran keras:</strong> PCRE $1 ke atas diperlukan.\nBinari PHP anda berpaut dengan PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Keterangan lanjut].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] dipasang",
        "config-apc": "[http://www.php.net/apc APC] dipasang",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] dipasang",
+       "config-mod-security": "<strong>Amaran:</strong> Pelayan web anda dihidupkan [http://modsecurity.org/ mod_security]/mod_security2. Kebanyakan konfigurasinya yang umum boleh menimbulkan kesulitan untuk MediaWiki dan perisian-perisian lain yang membolehkan pengguna untuk mengeposkan kandungan yang sewenang-wenang.\nJika boleh, ciri-ciri ini harus dimatikan. Jika tidak, rujuki [http://modsecurity.org/documentation/ dokumentasi mod_security] atau hubungi bantuan hos anda jika anda menghadapi ralat sembarangan.",
+       "config-diff3-bad": "GNU diff3 tidak dijumpai.",
+       "config-git": "Perisian kawalan versi Git dijumpai: <code>$1</code>.",
+       "config-git-bad": "Perisian kawalan versi Git tidak dijumpai.",
        "config-no-cli-uri": "<strong>Amaran:</strong> Tiada <code>--scriptpath</code> dinyatakan, maka digunakannya yang asali: <code>$1</code>.",
        "config-using-server": "Sedang menggunakan nama pelayan \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Sedang menggunakan URL pelayan \"<nowiki>$1$2</nowiki>\".",
        "config-no-cli-uploads-check": "<strong>Amaran:</strong> Direktori asali anda untuk muat naikan (<code>$1</code>) belum diperiksa untuk kerentanan\nkepada pelaksanaan skrip yang menyeleweng sewaktu pemasangan CLI.",
+       "config-db-type": "Jenis pangkalan data:",
+       "config-db-host": "Hos pangkalan data:",
+       "config-db-host-oracle": "TNS pangkalan data:",
+       "config-db-name": "Nama pangkalan data:",
+       "config-db-name-oracle": "Skema pangkalan data:",
+       "config-db-username": "Nama pengguna pangkalan data:",
+       "config-db-password": "Kata laluan pangkalan data:",
+       "config-db-prefix": "Awalan jadual pangkalan data:",
        "config-db-charset": "Peranggu aksara pangkalan data",
+       "config-charset-mysql5-binary": "MySQL 4.1/5.0 dedua",
+       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-db-port": "Port pangkalan data:",
+       "config-db-schema": "Skema untuk MediaWiki:",
        "config-pg-test-error": "Tidak boleh bersambung dengan pangkalan data <strong>$1</strong>: $2",
+       "config-sqlite-dir": "Direktori data SQLite:",
+       "config-oracle-def-ts": "Ruang jadual lalai:",
+       "config-oracle-temp-ts": "Ruang jadual sementara:",
+       "config-type-mysql": "MySQL (atau yang serasi)",
        "config-header-mysql": "Keutamaan MySQL",
        "config-header-postgres": "Keutamaan PostgreSQL",
        "config-header-sqlite": "Keutamaan SQLite",
        "config-header-oracle": "Keutamaan Oracle",
+       "config-header-mssql": "Tetapan Microsoft SQL Server",
        "config-invalid-db-type": "Jenis pangkalan data tidak sah",
        "config-can-upgrade": "Terdapat jadual MediaWiki dalam pangkalan data ini. Untuk menaik tarafnya kepada MediaWiki $1, klik <strong>Teruskan</strong>.",
        "config-unknown-collation": "<strong>Amaran:</strong> Pangkalan data sedang menggunakan kolasi yang tidak dikenali.",
        "config-mysql-charset": "Peranggu aksara pangkalan data:",
        "config-mysql-binary": "Perduaan",
        "config-mysql-utf8": "UTF-8",
+       "config-mssql-auth": "Jenis pengesahan:",
        "config-site-name": "Nama wiki:",
        "config-site-name-help": "Ini akan dipaparkan pada bar tajuk perisian pelayar dan tempat-tempat lain yang berkenaan.",
        "config-site-name-blank": "Isikan nama tapak.",
        "config-ns-other": "Lain-lain (nyatakan)",
        "config-ns-other-default": "MyWiki",
        "config-admin-box": "Akaun penyelia",
-       "config-admin-name": "Nama kamu:",
+       "config-admin-name": "Nama pengguna anda:",
        "config-admin-password": "Kata laluan:",
        "config-admin-password-confirm": "Kata laluan lagi:",
+       "config-admin-name-blank": "Masukkan nama pengguna pentadbir.",
+       "config-admin-password-blank": "Berikan kata laluan untuk akaun pentadbir.",
        "config-admin-password-mismatch": "Kata-kata laluan yang kamu berikan tidak sepadan.",
        "config-admin-email": "Alamat e-mel:",
        "config-admin-error-bademail": "Kamu telah memberikan alamat e-mel yang tidak betul.",
        "config-optional-skip": "Saya sudah bosan, pasangkanlah wiki sahaja.",
+       "config-profile-wiki": "Wiki terbuka",
+       "config-profile-no-anon": "Pembukaan akaun diwajibkan",
+       "config-profile-private": "Wiki tertutup",
        "config-license": "Hak cipta dan lesen:",
        "config-license-none": "Tiada pengaki lesen",
        "config-license-cc-by-sa": "Creative Commons Attribution Share Alike",
        "config-license-gfdl": "Lesen Pendokumenan Bebas GNU 1.3 atau ke atas",
        "config-license-pd": "Domain Awam",
        "config-email-settings": "Tetapan e-mel",
+       "config-skins": "Rupa",
+       "config-skins-use-as-default": "Gunakan rupa ini sebagai asal",
        "config-install-step-done": "siap",
        "config-install-step-failed": "gagal",
        "config-install-user-alreadyexists": "Pengguna \"$1\" sudah wujud",
+       "config-install-tables": "Mencipta jadual",
        "config-install-tables-exist": "<strong>Amaran:</strong> Nampaknya sudah terdapat jadual MediaWiki. Penciptaan dilangkau.",
+       "config-install-interwiki": "Mengisi jadual antara wiki lalai",
+       "config-install-interwiki-list": "Fail <code>interwiki.list</code> tidak dapat dibaca.",
        "config-install-interwiki-exists": "<strong>Amaran:</strong> Jadual antara wiki nampaknya sudah ada entri. Senarai asali dilangkau.",
+       "config-install-keys": "Menjana kunci-kunci rahsia",
        "config-insecure-keys": "<strong>Amaran:</strong> {{PLURAL:$2|Kunci keselamatan|Kunci-kunci keselamatan}} ($1) yang dihasilkan sewaktu pemasangan itu {{PLURAL:$2|adalah}} tidak selamat sepenuhnya. Oleh itu, {{PLURAL:$2|ia}} wajar ditukar secara manual.",
+       "config-install-sysop": "Membuka akaun pengguna pentadbir",
+       "config-install-mainpage": "Mewujudkan laman utama dengan kandungan lalai",
        "config-help": "bantuan",
        "mainpagetext": "'''MediaWiki telah berjaya dipasang.'''",
        "mainpagedocfooter": "Sila rujuk [//meta.wikimedia.org/wiki/Help:Contents Panduan Penggunaan] untuk maklumat mengenai penggunaan perisian wiki ini.\n\n== Permulaan ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Senarai tetapan konfigurasi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Soalan Lazim MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Senarai surat keluaran MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Terjemahkan MediaWiki ke dalam bahasa anda]"
index 0a84d87..262a837 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Chrisportelli"
+                       "Chrisportelli",
+                       "Leli Forte"
                ]
        },
        "config-title": "Installazzjoni ta' MediaWiki $1",
@@ -30,6 +31,7 @@
        "config-page-existingwiki": "Wiki eżistenti",
        "config-restart": "Iva, erġa' ibda",
        "config-env-php": "PHP $1 huwa installat.",
+       "config-env-hhvm": "HHVM $1 hu installat.",
        "config-db-wiki-settings": "Identifika din il-wiki",
        "config-db-name": "Isem tad-databażi:",
        "config-db-install-account": "Kont tal-utent għall-installazzjoni",
        "config-site-name": "Isem tal-wiki:",
        "config-site-name-help": "Dan se jidher fil-barra tat-titlu tal-browżer u f'diversi postijiet oħra.",
        "config-site-name-blank": "Daħħal isem tas-sit.",
-       "config-project-namespace": "Spazju tal-isem tal-proġett:",
+       "config-project-namespace": "Spazju tal-ismijiet tal-proġett:",
        "config-ns-generic": "Proġett",
        "config-ns-site-name": "L-istess bħall-isem tal-wiki: $1",
        "config-ns-other": "Oħrajn (speċifika)",
        "config-ns-other-default": "MyWiki",
-       "config-ns-invalid": "L-ispazju speċifikat \"<nowiki>$1</nowiki>\" huwa ħażin.\nSpeċifika spazju tal-isem tal-proġett differenti.",
-       "config-ns-conflict": "L-ispazju speċifikat \"<nowiki>$1</nowiki>\" joħloq kunflitt ma' spazju tal-isem ieħor tal-MediaWiki.\nSpeċifika spazju tal-isem tal-proġett differenti.",
+       "config-ns-invalid": "L-ispazju speċifikat \"<nowiki>$1</nowiki>\" huwa ħażin.\nSpeċifika spazju tal-ismijiet ta' proġett differenti.",
+       "config-ns-conflict": "L-ispazju speċifikat \"<nowiki>$1</nowiki>\" joħloq kunflitt ma' spazju tal-ismijiet tal-MediaWiki predeterminat.\nSpeċifika spazju tal-ismijiet ta' proġett differenti.",
        "config-admin-box": "Kont tal-amministratur",
        "config-admin-name": "Ismek:",
        "config-admin-password": "Password:",
index 0bfcbe8..1cbe7d5 100644 (file)
@@ -4,6 +4,13 @@
                        "C.R."
                ]
        },
+       "config-desc": "'O prugramma d'istallazione 'e MediaWiki",
+       "config-title": "Installazione 'e MediaWiki $1",
+       "config-information": "Nfurmaziune",
+       "config-localsettings-upgrade": "È stato rilevato nu file <code>LocalSettings.php</code>.\nP'agghiurnà sta installazione, pe' piacere nzertàte 'o valore 'e <code>$wgUpgradeKey</code> dint' 'a cascia ccà abbascio.\n'O putite truvà dint'a <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "È stato scummigliato nu file <code>LocalSettings.php</code>.\nPe l'agghiurnà sta installazione, secutate <code>update.php</code>",
+       "config-localsettings-key": "Chiave d'agghiurnamiento:",
+       "config-localsettings-badkey": "'A chiave c'avete dato nun è curretta.",
        "config-mssql-install-auth": "Sceglie 'o tipo d'autenticazziona ca s'ausarrà pe cunnettà â database, durante ll'operazziona d'istallazziona. Si piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate.",
        "config-mssql-web-auth": "Sceglie 'o tipo d'autenticazziona ca 'o web server pigliarrà pe se cunnettà a 'o server 'e bbase 'e dati, durante ll'operazziona nurmale d&#39;'a wiki.\nSi piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate."
 }
index 93ddfa4..c1bc294 100644 (file)
@@ -50,6 +50,7 @@
        "config-env-good": "Miljøet har blitt sjekket.\nDu kan installere MediaWiki.",
        "config-env-bad": "Miljøet har blitt sjekket.\nDu kan installere MediaWiki.",
        "config-env-php": "PHP $1 er innstallert.",
+       "config-env-hhvm": "HHVM $1 er installert.",
        "config-unicode-using-utf8": "Bruker Brion Vibbers utf8_normalize.so for Unicode-normalisering.",
        "config-unicode-using-intl": "Bruker [http://pecl.php.net/intl intl PECL-utvidelsen] for Unicode-normalisering.",
        "config-unicode-pure-php-warning": "'''Advarsel''': [http://pecl.php.net/intl intl PECL-utvidelsen] er ikke tilgjengelig for å håndtere Unicode-normaliseringen, faller tilbake til en langsommere ren-PHP-implementasjon.\nOm du kjører et nettsted med høy trafikk bør du lese litt om [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
@@ -58,6 +59,7 @@
        "config-outdated-sqlite": "'''Advarsel''': Du har SQLite $1, som er en eldre versjon enn minimumskravet SQLite $2. SQLite vil ikke være tilgjengelig.",
        "config-no-fts3": "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
        "config-register-globals-error": "<strong>Feil: PHPs <code>[http://php.net/register_globals register_globals]</code>-valg er aktivt.\nDet må deaktiveres for å kunne fortsette med installeringen.</strong>\nSe [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] for å få hjelp til å gjøre dette.",
+       "config-magic-quotes-gpc": "<strong>Fatalt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] er aktiv!</strong>\nDette valget kan ødelegge inndata på en uforutsigelig måte.\nDu kan ikke installere eller bruke MediaWiki uten at denne valgmuligheten er slått av.",
        "config-magic-quotes-runtime": "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] er aktiv!'''\nDette alternativet ødelegger inndata på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
        "config-magic-quotes-sybase": "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] er aktiv!'''\nDette alternativet ødelegger inndata på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
        "config-mbstring": "'''Kritisk: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] er aktiv!'''\nDette alternativet fører til feil og kan ødelegge data på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
@@ -68,6 +70,7 @@
        "config-memory-raised": "PHPs <code>memory_limit</code> er $1, økt til $2.",
        "config-memory-bad": "'''Advarsel:''' PHPs <code>memory_limit</code> er $1.\nDette er sannsynligvis for lavt.\nInstallasjonen kan mislykkes!",
        "config-ctype": "'''Fatal feil''': PHP må kompileres med støtte for [http://www.php.net/manual/en/ctype.installation.php Ctype-utvidelsen].",
+       "config-iconv": "<strong>Kritisk:</strong> PHP må kompileres med støtte for [http://www.php.net/manual/en/iconv.installation.php iconv-utvidelsen].",
        "config-json": "'''Alvorlig:''' PHP ble kompilert uten JSON-støtte.\nDu må installere enten PHP JSON-utvidelsen eller [http://pecl.php.net/package/jsonc PECL jsonc]-utvidelsen før du installere MediaWiki.\n* PHP-utvidelsen inngår i Red Hat Enterprise Linux (CentOS) 5 and 6, men må aktiveres i <code>/etc/php.ini</code> eller <code>/etc/php.d/json.ini</code>.\n* Noen Linux-distribusjoner sluppet etter mai 2013 har ikke med PHP-utvidelsen, men har i stedet med PECL-utvidelsen <code>php5-json</code> eller <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] er innstallert",
        "config-apc": "[http://www.php.net/apc APC] er innstallert",
        "config-subscribe": "Abonner på [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-postlisten for utgivelsesannonseringer].",
        "config-subscribe-help": "Dette er en lav-volums e-postliste brukt til utgivelsesannonseringer, herunder viktige sikkerhetsannonseringer.\nDu bør abonnere på den og oppdatere MediaWikiinstallasjonen din når nye versjoner kommer ut.",
        "config-subscribe-noemail": "Du prøvde å abonnere på epost-meldinger om nye versjoner uten å oppgi en epost-adresse. Vær vennlig å oppgi en epost-adresse om du ønsker dette abonnementet.",
-       "config-almost-done": "Du er nesten ferdig!\nDu kan hoppe over de resterende konfigurasjonene og installere wikien nå.",
-       "config-optional-continue": "Spør meg flere spørsmål.",
+       "config-almost-done": "Du er nesten ferdig!\nDu kan velge å hoppe over de siste konfigurasjonstrinnene og installere wikien med en gang.",
+       "config-optional-continue": "Still meg flere spørsmål.",
        "config-optional-skip": "Jeg er lei, bare installer wikien.",
        "config-profile": "Brukerrettighetsprofil:",
        "config-profile-wiki": "Åpen wiki",
        "config-profile-help": "Wikier fungerer best om du lar så mange mennesker som mulig redigere den.\nI MediaWiki er det enkelt å se på de siste endringene og tilbakestille eventuell skade som er gjort av naive eller ondsinnede brukere.\n\nImidlertid har mange funnet at MediaWiki er nyttig for mange formål, og av og til er det ikke lett å overbevise alle om fordelene med wiki-funksjonaliteten.\nSå du har valget.\n\nEn '''{{int:config-profile-wiki}}''' tillater enhver å redigere, selv uten å logge inn.\nEn wiki med '''{{int:config-profile-no-anon}}''' tilbyr ekstra ansvarlighet, men kan avskrekke tilfeldige bidragsytere.\n\n'''{{int:config-profile-fishbowl}}'''-scenariet tillater godkjente brukere å redigere, mens publikum kan se sider, og også historikken.\nEn '''{{int:config-profile-private}}''' tillater kun godkjente brukere å se sider, der den samme gruppen også får lov til å redigere dem.\n\nMer komplekse konfigurasjoner av brukerrettigheter er tilgjengelige etter installasjonen, se [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights relevant avsnitt i brukerbeskrivelsen].",
        "config-license": "Opphavsrett og lisens:",
        "config-license-none": "Ingen lisensbunntekst",
-       "config-license-cc-by-sa": "Creative Commons Navngivelse Del på samme vilkår",
-       "config-license-cc-by": "Creative Commons Attribution",
-       "config-license-cc-by-nc-sa": "Creative Commons Navngivelse Ikke-kommersiell Del på samme vilkår",
-       "config-license-cc-0": "Creative Commons Zero (tilgjengelig for alle)",
+       "config-license-cc-by-sa": "Creative Commons Navngivelse-DelPåSammeVilkår",
+       "config-license-cc-by": "Creative Commons Navngivelse",
+       "config-license-cc-by-nc-sa": "Creative Commons Navngivelse-IkkeKommersiell-DelPåSammeVilkår",
+       "config-license-cc-0": "Creative Commons Zero (Fristatus-erklæring)",
        "config-license-gfdl": "GNU Free Documentation License 1.3 eller senere",
-       "config-license-pd": "Offentlig rom",
+       "config-license-pd": "Offentlig eiendom",
        "config-license-cc-choose": "Velg en egendefinert Creative Commons-lisens",
        "config-license-help": "Mange åpne wikier legger alle bidrag under en [http://freedomdefined.org/Definition gratislisens].\nDette gir en følelse av felleseie og stimulerer til langvarige bidrag.\nDette er normalt unødvendig for en privat eller virksomhetsbegrenset wiki.\n\nHvis du ønsker å kunne bruke tekst fra Wikipedia, og at Wikipedia skal kunne ta i mot tekst kopiert fra din wiki, bør du velge '''Creative Commons Attribution Share Alike'''.\n\nWikipedia brukte tidligere GNU Free Documentation License.\nGFDL er en grei lisens, med vanskelig å forstå.\nDet er også vanskelig å gjenbruke innhold lisensiert under GFDL.",
        "config-email-settings": "E-postinnstillinger",
index b2d4a04..836e0fc 100644 (file)
@@ -4,9 +4,15 @@
                        "Bhawani Gautam",
                        "RajeshPandey",
                        "सरोज कुमार ढकाल",
-                       "Ganesh Paudel"
+                       "Ganesh Paudel",
+                       "बिप्लब आनन्द"
                ]
        },
+       "config-information": "जानकारी",
+       "config-localsettings-badkey": "तपाइले दिनु भएको कुन्जी गलत छ ।",
+       "config-your-language": "तपाईंको भाषा:",
+       "config-your-language-help": "इन्स्टल गर्दा उपयोग गर्ने भाषा छान्नुहोस् ।",
+       "config-wiki-language": "विकि भाषाहरू",
        "config-page-name": "नाम",
        "config-page-options": "विकल्पहरु",
        "config-page-install": "स्थापना गर्ने",
index 14321ff..b9ed0ea 100644 (file)
@@ -12,7 +12,8 @@
                        "JurgenNL",
                        "Southparkfan",
                        "Seb35",
-                       "Mar(c)"
+                       "Mar(c)",
+                       "Sjoerddebruin"
                ]
        },
        "config-desc": "Het installatieprogramma voor MediaWiki",
@@ -57,7 +58,6 @@
        "config-env-good": "De omgeving is gecontroleerd.\nU kunt MediaWiki installeren.",
        "config-env-bad": "De omgeving is gecontroleerd.\nU kunt MediaWiki niet installeren.",
        "config-env-php": "PHP $1 is op dit moment geïnstalleerd.",
-       "config-env-php-toolow": "PHP $1 is geïnstalleerd.\nMediaWiki heeft PHP $2 of hoger nodig om correct te kunnen werken.",
        "config-unicode-using-utf8": "Voor Unicode-normalisatie wordt utf8_normalize.so van Brion Vibber gebruikt.",
        "config-unicode-using-intl": "Voor Unicode-normalisatie wordt de [http://pecl.php.net/intl PECL-extensie intl] gebruikt.",
        "config-unicode-pure-php-warning": "'''Waarschuwing''': de [http://pecl.php.net/intl PECL-extensie intl] is niet beschikbaar om de Unicodenormalisatie af te handelen en daarom wordt de langzame PHP-implementatie gebruikt.\nAls u MediaWiki voor een website met veel verkeer installeert, lees u dan in over [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicodenormalisatie].",
@@ -65,7 +65,6 @@
        "config-no-db": "Het was niet mogelijk een geschikte databasedriver te vinden voor PHP. U moet een databasedriver installeren voor PHP.\nDe volgende databases worden ondersteund: $1.\n\nAls u een gedeelde omgeving gebruikt, vraag dan aan uw hostingprovider een geschikte databasedriver te installeren.\nAls u PHP zelf hebt gecompileerd, wijzig dan uw instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via <code>./configure --with-mysql</code>.\nAls u PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook de module php5-mysql.",
        "config-outdated-sqlite": "''' Waarschuwing:''' u gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.",
        "config-no-fts3": "'''Waarschuwing''': SQLite is gecompileerd zonder de module [//sqlite.org/fts3.html FTS3]; zoekfuncties zijn niet beschikbaar.",
-       "config-register-globals": "'''Waarschuwing: de PHP-optie <code>[http://php.net/register_globals register_globals]</code> is ingeschakeld.'''\n'''Schakel deze uit als dat mogelijk is.'''\nMediaWiki kan ermee werken, maar uw server is dan  kwetsbaarder voor eventuele beveiligingslekken.",
        "config-magic-quotes-runtime": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
        "config-magic-quotes-sybase": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
        "config-mbstring": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
        "config-memcache-badport": "Poortnummers voor Memcached moeten tussen $1 en $2 liggen.",
        "config-extensions": "Uitbreidingen",
        "config-extensions-help": "De bovenstaande uitbreidingen zijn aangetroffen in de map <code>./extensions</code>.\n\nMogelijk moet u aanvullende instellingen maken, maar u kunt deze uitbreidingen nu inschakelen.",
+       "config-skins": "Vormgevingen",
+       "config-skins-use-as-default": "Als standaard vormgeving instellen",
+       "config-skins-must-enable-some": "U moet minstens één vormgeving kiezen om in te schakelen.",
+       "config-skins-must-enable-default": "De vormgeving gekozen als standaard moet ingeschakeld zijn.",
        "config-install-alreadydone": "'''Waarschuwing:''' het lijkt alsof u MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.\nGa door naar de volgende pagina.",
        "config-install-begin": "Als u nu op \"{{int:config-continue}}\" klikt, begint de installatie van MediaWiki.\nAls u nog wijzigingen wilt maken, klik dan op \"{{int:config-back}}\".",
        "config-install-step-done": "afgerond",
index e4bcb6e..98d54ac 100644 (file)
@@ -37,7 +37,7 @@
        "config-env-good": "L’environament es estat verificat.\nPodètz installar MediaWiki.",
        "config-env-bad": "L’environament es estat verificat.\nPodètz pas installar MediaWiki.",
        "config-env-php": "PHP $1 es installat.",
-       "config-env-php-toolow": "PHP $1 es installat.\nPasmens, MediaWiki requerís PHP $2 o superior.",
+       "config-env-hhvm": "HHVM $1 es installat.",
        "config-unicode-using-utf8": "Utilizacion de utf8_normalize.so per Brion Vibber per la normalizacion Unicode.",
        "config-unicode-using-intl": "Utilizacion de [http://pecl.php.net/intl l'extension PECL intl] per la normalizacion Unicode.",
        "config-memory-raised": "Lo paramètre <code>memory_limit</code> de PHP èra a $1, portat a $2.",
        "config-cache-options": "Paramètres per la mesa en escondedor dels objèctes :",
        "config-memcached-servers": "servidors per Memcached :",
        "config-extensions": "Extensions",
+       "config-skins": "Abilhatges",
+       "config-skins-use-as-default": "Utilizar aqueste abilhatge per defaut",
        "config-install-step-done": "fach",
        "config-install-step-failed": "fracàs",
        "config-install-extensions": "Inclusion de las extensions",
        "config-install-database": "Creacion de la banca de donadas",
        "config-install-schema": "Creacion d'esquèma",
+       "config-install-pg-schema-not-exist": "L'esquèma PostgreSQL existís pas",
        "config-install-pg-commit": "Validacion de las modificacions",
        "config-install-pg-plpgsql": "Verificacion del lengatge PL/pgSQL",
        "config-install-user": "Creacion d'un utilizaire de la banca de donadas",
+       "config-install-user-alreadyexists": "L'utilizaire « $1 » existís ja.",
+       "config-install-user-create-failed": "Fracàs al moment de la creacion de l'utilizaire « $1 » : $2",
+       "config-install-user-grant-failed": "Fracàs al moment de l'apondon de permissions a l'utilizaire « $1 » : $2",
+       "config-install-user-missing": "L'utilizaire «$1» existís pas.",
        "config-install-tables": "Creacion de las taulas",
        "config-install-stats": "Inicializacion de las estatisticas",
+       "config-install-keys": "Generacion de la clau secreta",
+       "config-install-updates": "Empachar l’execucion de las mesas a jorn inutilas",
        "config-install-sysop": "Creacion del compte administrator",
+       "config-install-mainpage": "Creacion de la pagina principala amb un contengut per defaut",
+       "config-install-extension-tables": "Creacion de taulas per las extensions activadas",
        "config-install-mainpage-failed": "Impossible d’inserir la pagina principala : $1",
        "config-download-localsettings": "Telecargar <code>LocalSettings.php</code>",
        "config-help": "ajuda",
+       "config-help-tooltip": "clicar per agrandir",
        "mainpagetext": "'''MediaWiki es estat installat amb succès.'''",
        "mainpagedocfooter": "Consultatz lo [//meta.wikimedia.org/wiki/Help:Contents/fr Guida de l'utilizaire] per mai d'entresenhas sus l'utilizacion d'aqueste logicial de wiki.\n\n== Per començar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista dels paramètres de configuracion]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/oc FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las distribucions de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptatz MediaWiki dins vòstra lenga]"
 }
index c129ab9..75f73d3 100644 (file)
@@ -1,13 +1,35 @@
 {
        "@metadata": {
                "authors": [
-                       "Aalam"
+                       "Aalam",
+                       "Babanwalia"
                ]
        },
        "config-information": "ਜਾਣਕਾਰੀ",
        "config-your-language": "ਤੁਹਾਡੀ ਭਾਸ਼ਾ:",
+       "config-your-language-help": "ਜੜਾਈ ਦੀ ਕਾਰਵਾਈ ਵੇਲੇ ਵਰਤਣ ਵਾਸਤੇ ਕੋਈ ਭਾਸ਼ਾ ਚੁਣੋ।",
+       "config-wiki-language": "ਵਿਕੀ ਦੀ ਭਾਸ਼ਾ:",
+       "config-wiki-language-help": "ਉਹ ਭਾਸ਼ਾ ਚੁਣੋ ਜਿਸ ਵਿੱਚ ਵਿਕੀ ਮੁੱਖ ਤੌਰ 'ਤੇ ਲਿਖਿਆ ਜਾਵੇਗਾ।",
        "config-back": "← ਪਿੱਛੇ",
        "config-continue": "ਜਾਰੀ ਰੱਖੋ →",
        "config-page-language": "ਭਾਸ਼ਾ",
+       "config-page-welcome": "ਮੀਡੀਆਵਿਕੀ 'ਤੇ ਜੀ ਆਇਆਂ ਨੂੰ!",
+       "config-page-dbconnect": "ਤੱਥ-ਅਧਾਰ ਨਾਲ਼ ਜੁੜੋ",
+       "config-page-upgrade": "ਮੌਜੂਦਾ ਜੜਾਈ ਦਾ ਮਿਆਰ ਚੁੱਕੋ",
+       "config-page-dbsettings": "ਤੱਥ-ਅਧਾਰ ਦੀਆਂ ਸੈਟਿੰਗਾਂ",
+       "config-page-name": "ਨਾਂ",
+       "config-page-options": "ਚੋਣਾਂ",
+       "config-page-install": "ਜੜੋ",
+       "config-page-complete": "ਮੁਕੰਮਲ!",
+       "config-page-restart": "ਜੜਾਈ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ",
+       "config-page-readme": "ਮੈਨੂੰ ਪੜ੍ਹੋ",
+       "config-page-copying": "ਨਕਲ",
+       "config-page-upgradedoc": "ਮਿਆਰ-ਉਚਾਈ",
+       "config-page-existingwiki": "ਮੌਜੂਦਾ ਵਿਕੀ",
+       "config-restart": "ਹਾਂਜੀ, ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ",
+       "config-env-php": "PHP $1 ਜੜਿਆ ਗਿਆ।",
+       "config-env-hhvm": "HHVM $1 ਜੜਿਆ ਗਿਆ।",
+       "config-db-wiki-settings": "ਇਸ ਵਿਕੀ ਦੀ ਪਛਾਣ ਕਰਾਉ",
+       "config-db-name": "ਤੱਥ-ਅਧਾਰ ਦਾ ਨਾਂ:",
        "mainpagetext": "'''ਮੀਡਿਆਵਿਕਿ ਠੀਕ ਤਰ੍ਹਾਂ ਇੰਸਟਾਲ ਹੋ ਗਿਆ ਹੈ।'''"
 }
index 0c48ffa..bc8caed 100644 (file)
@@ -17,7 +17,8 @@
                        "WTM",
                        "Alan ffm",
                        "Matik7",
-                       "Pio387"
+                       "Pio387",
+                       "Darellur"
                ]
        },
        "config-desc": "Instalator MediaWiki",
@@ -62,6 +63,7 @@
        "config-env-good": "Środowisko oprogramowania zostało sprawdzone.\nMożesz teraz zainstalować MediaWiki.",
        "config-env-bad": "Środowisko oprogramowania zostało sprawdzone.\nNie możesz zainstalować MediaWiki.",
        "config-env-php": "Zainstalowane jest PHP w wersji $1.",
+       "config-env-hhvm": "Zainstalowany jest HHVM $1.",
        "config-unicode-using-utf8": "Korzystanie z normalizacji Unicode utf8_normalize.so napisanej przez Brion Vibbera.",
        "config-unicode-using-intl": "Korzystanie z [http://pecl.php.net/intl rozszerzenia intl PECL] do normalizacji Unicode.",
        "config-unicode-pure-php-warning": "'''Uwaga!''' [http://pecl.php.net/intl Rozszerzenie intl PECL] do obsługi normalizacji Unicode nie jest dostępne. Użyta zostanie mało wydajna zwykła implementacja w PHP.\nJeśli prowadzisz stronę o dużym natężeniu ruchu, powinieneś zapoznać się z informacjami o [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizacji Unicode].",
@@ -87,7 +89,7 @@
        "config-apc": "[Http://www.php.net/apc APC] jest zainstalowany",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] jest zainstalowany",
        "config-no-cache": "'''Uwaga:''' Pamięć podręczna dla kodu MediaWiki nie będzie uruchomiona., gdyż nie ma żadnego z następujących narzędzi: [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] lub [http://www.iis.net/download/WinCacheForPhp WinCache].",
-       "config-mod-security": "''' Ostrzeżenie ''': Serwer sieci web ma włączone [http://modsecurity.org/ mod_security]. Jeśli niepoprawnie skonfigurowane, może być przyczyną problemów MediaWiki lub innego oprogramowania, które pozwala użytkownikom na wysyłanie dowolnej zawartości.\nSprawdź w [http://modsecurity.org/documentation/ dokumentacji mod_security] lub skontaktuj się z obsługa hosta, jeśli wystąpią losowe błędy.",
+       "config-mod-security": "''' Ostrzeżenie ''': Serwer sieci web ma włączone [http://modsecurity.org/ mod_security]. Jeśli jest niepoprawnie skonfigurowane, może być przyczyną problemów MediaWiki lub innego oprogramowania, które pozwala użytkownikom na wysyłanie dowolnej zawartości.\nSprawdź w [http://modsecurity.org/documentation/ dokumentacji mod_security] lub skontaktuj się z obsługa hosta, jeśli wystąpią losowe błędy.",
        "config-diff3-bad": "Nie znaleziono GNU diff3.",
        "config-git": "Znaleziono oprogramowanie kontroli wersji Git: <code>$1</code>.",
        "config-git-bad": "Oprogramowanie systemu kontroli wersji Git nie zostało znalezione.",
        "config-install-stats": "Inicjowanie statystyki",
        "config-install-keys": "Generowanie tajnych kluczy",
        "config-insecure-keys": "'''Ostrzeżenie:''' {{PLURAL:$2|Klucz bezpieczeństwa|Klucze bezpieczeństwa|Klucze bezpieczeństwa}} ($1) utworzone podczas instalacji {{PLURAL:$2|utworzony podczas instalacji nie jest|utworzone podczas instalacji nie są|utworzone podczas instalacji nie są}} w pełni bezpieczne. Być może warto wygenerować {{PLURAL:$2|własny klucz|własne klucze|własne klucze}}.",
+       "config-install-updates": "Zapobieganie uruchamianiu niepotrzebnych aktualizacji",
        "config-install-sysop": "Tworzenie konta administratora",
        "config-install-subscribe-fail": "Nie można zapisać na listę „mediawiki-announce“ – $1",
        "config-install-subscribe-notpossible": "cURL nie jest zainstalowany, więc <code>allow_url_fopen</code> nie jest dostępne.",
index 68a94e8..a28f610 100644 (file)
@@ -12,7 +12,8 @@
                        "Cybermandrake",
                        "Fabsouza1",
                        "Rodrigo codignoli",
-                       "Tuliouel"
+                       "Tuliouel",
+                       "Marcos dias de oliveira"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
@@ -57,6 +58,7 @@
        "config-env-good": "O ambiente foi verificado.\nVocê pode instalar o MediaWiki.",
        "config-env-bad": "O ambiente foi verificado.\nVocê não pode instalar o MediaWiki.",
        "config-env-php": "O PHP $1 está instalado.",
+       "config-env-hhvm": "HHVM $1 está instalado.",
        "config-unicode-using-utf8": "Usando o utf8_normalize.so, de Brion Vibber, para a normalização Unicode.",
        "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-instantcommons": "Ativar o Instant Commons",
        "config-cc-again": "Escolha novamente...",
        "config-advanced-settings": "Configuração avançada",
+       "config-cache-options": "Configuração da cache de objetos:",
+       "config-cache-help": "A cache de objetos é usada para melhorar o desempenho do MediaWiki. Armazena dados usados com frequência.\nSites de tamanho médio ou grande são altamente encorajados a ativar esta funcionalidade e os sites pequenos também terão alguns benefícios em fazê-lo.",
        "config-extensions": "Extensões",
        "config-install-step-done": "feito",
        "config-install-extensions": "Incluindo extensões",
index a827fac..835cf9b 100644 (file)
@@ -59,6 +59,7 @@
        "config-env-good": "O ambiente foi verificado.\nPode instalar o MediaWiki.",
        "config-env-bad": "O ambiente foi verificado.\nNão pode instalar o MediaWiki.",
        "config-env-php": "O PHP $1 está instalado.",
+       "config-env-hhvm": "HHVM $1 está instalado.",
        "config-unicode-using-utf8": "A usar o utf8_normalize.so, por Brion Vibber, para a normalização Unicode.",
        "config-unicode-using-intl": "A usar a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
        "config-unicode-pure-php-warning": "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.\nSe o seu site tem alto volume de tráfego, devia informar-se um pouco sobre a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/pt normalização Unicode].",
index 8d9aac2..772ce96 100644 (file)
@@ -62,6 +62,7 @@
        "config-env-good": "See also:\n* {{msg-mw|Config-env-bad}}",
        "config-env-bad": "See also:\n* {{msg-mw|Config-env-good}}",
        "config-env-php": "Parameters:\n* $1 - the version of PHP that has been installed\nSee also:\n* {{msg-mw|config-env-php-toolow}}",
+       "config-env-hhvm": "Parameters:\n* $1 - the version of HHVM that has been installed",
        "config-unicode-using-utf8": "Status message in the MediaWiki installer environment checks.",
        "config-unicode-using-intl": "Status message in the MediaWiki installer environment checks.",
        "config-unicode-pure-php-warning": "PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.",
        "config-upload-deleted": "Prompt for the server directory into which deleted files should be moved.",
        "config-upload-deleted-help": "Explanation for {{msg|config-upload-deleted}}.",
        "config-logo": "Prompt for a link to the logo to use for the wiki.",
-       "config-logo-help": "",
+       "config-logo-help": "Help string shown to the user explaining the requirements for the wiki's logo.",
        "config-instantcommons": "Used as label for the checkbox.\n\nThe help message for this checkbox is:\n* {{msg-mw|Config-instantcommons-help}}",
        "config-instantcommons-help": "Used as help message for the checkbox which is labeled {{msg-mw|config-instantcommons}}.",
        "config-cc-error": "Prompt to manually enter a license when the tool fails to match.",
        "config-cache-help": "Explanation for what object caching is, next to {{msg|config-cache-options}}.",
        "config-cache-none": "Label for the object caching disabled option.",
        "config-cache-accel": "Label for the object caching via PHP option.",
-       "config-cache-memcached": "Label for the object caching via memcached option.",
+       "config-cache-memcached": "{{doc-important|Do not translate \"memcached\".}}\nLabel for the object caching via memcached option.",
        "config-memcached-servers": "{{doc-important|Do not translate \"memcached\".}}\n{{Identical|Memcached server}}",
        "config-memcached-help": "Prompt for the object caching via Memcached option for the user to define server(s) to be used.",
-       "config-memcache-needservers": "Error message for the object caching via Memcached option when the user has failed to define servers at the above prompt.",
+       "config-memcache-needservers": "Error message for the object caching via Memcached option when the user has failed to define servers at the above prompt.\n{{doc-important|Do not translate \"memcached\".}}",
        "config-memcache-badip": "Used as error message. Parameters:\n* $1 - IP address for Memcached\nSee also:\n* {{msg-mw|Config-memcache-noport}}\n* {{msg-mw|Config-memcache-badport}}",
-       "config-memcache-noport": "Used as error message. Parameters:\n* $1 - Memcached server name\nSee also:\n* {{msg-mw|Config-memcache-badip}}\n* {{msg-mw|Config-memcache-badport}}",
-       "config-memcache-badport": "Used as error message. Parameters:\n* $1 - 1 (hard-coded)\n* $2 - 65535 (hard-coded)\nSee also:\n* {{msg-mw|Config-memcache-badip}}\n* {{msg-mw|Config-memcache-noport}}",
+       "config-memcache-noport": "Used as error message. Parameters:\n* $1 - Memcached server name\nSee also:\n* {{msg-mw|Config-memcache-badip}}\n* {{msg-mw|Config-memcache-badport}}\n{{doc-important|Do not translate \"memcached\".}}",
+       "config-memcache-badport": "Used as error message. Parameters:\n* $1 - 1 (hard-coded)\n* $2 - 65535 (hard-coded)\nSee also:\n* {{msg-mw|Config-memcache-badip}}\n* {{msg-mw|Config-memcache-noport}}\n{{doc-important|Do not translate \"memcached\".}}",
        "config-extensions": "{{Identical|Extension}}",
        "config-extensions-help": "{{doc-important|Do not translate <code>./extensions</code>.}}\nUsed in help box.",
        "config-skins": "{{Identical|Skin}}",
        "config-install-step-done": "{{Identical|Done}}",
        "config-install-step-failed": "{{Identical|Failed}}",
        "config-install-extensions": "Notice shown to the user during the install about progress when extensions are being installed.",
-       "config-install-database": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
+       "config-install-database": "Message indicates the database is being set up\n\nSee also:\n*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-updates}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
        "config-install-schema": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
        "config-install-pg-schema-not-exist": "Error message shown to users picking PostgreSQL.",
        "config-install-pg-schema-failed": "Parameters:\n* $1 = database user name (usernames in the database are unrelated to wiki user names)\n* $2 =",
        "config-install-user-grant-failed": "Parameters:\n* $1 is the database username for which granting rights failed\n* $2 is the error message",
        "config-install-user-missing": "Used as PostgreSQL error message. Parameters:\n* $1 - database username\nSee also:\n* {{msg-mw|Config-install-user-missing-create}}",
        "config-install-user-missing-create": "Used as PostgreSQL error message. Parameters:\n* $1 - database username\nSee also:\n* {{msg-mw|Config-install-user-missing}}",
-       "config-install-tables": "Message indicates that the tables are being created\n\nSee also:\n*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
+       "config-install-tables": "Message indicates that the tables are being created\n\nSee also:\n*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-updates}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
        "config-install-tables-exist": "Error notice during the installation saying that the database already seems set up for MediaWiki, so it's continuing without taking that step.",
        "config-install-tables-failed": "Used as PostgreSQL error message. Parameters:\n* $1 - detailed error message",
        "config-install-interwiki": "Message indicates that the interwikitables are being populated\n\nSee also:\n*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
        "config-install-stats": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
        "config-install-keys": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
        "config-insecure-keys": "Parameters:\n* $1 - A list of names of the secret keys that were generated.\n* $2 - the number of items in the list $1, to be used with PLURAL.",
+       "config-install-updates": "Message indicating that the updatelog table is filled with keys of updates that won't be run when running database updates.\n\nSee also:\n*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-updates}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
+       "config-install-updates-failed": "Used as error message. Parameters:\n* $1 - detailed error message",
        "config-install-sysop": "Message indicates that the administrator user account is being created\n\nSee also:\n*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
        "config-install-subscribe-fail": "{{doc-important|\"[[m:mail:mediawiki-announce|mediawiki-announce]]\" is the name of a mailing list and should not be translated.}}\nA message displayed if the MediaWiki installer encounters an error making a request to lists.wikimedia.org which hosts the mailing list.\n* $1 - the HTTP error encountered, reproduced as is (English string)",
        "config-install-subscribe-notpossible": "Error shown when automatically subscribing to the MediaWiki announcements mailing list fails.",
index 7725734..333aa7d 100644 (file)
        "config-page-existingwiki": "Wiki existent",
        "config-restart": "Da, repornește.",
        "config-env-php": "PHP $1 este instalat.",
-       "config-env-php-toolow": "PHP $1 este instalat.\nTotuși, MediaWiki necesită PHP $2 sau mai nou.",
+       "config-env-hhvm": "HHVM $1 este instalat.",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] este instalat",
+       "config-apc": "[http://www.php.net/apc APC] este instalat",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] este instalat",
        "config-db-type": "Tipul bazei de date:",
        "config-db-host": "Gazdă bază de date:",
        "config-db-host-oracle": "Baza de date TNS:",
@@ -65,7 +68,9 @@
        "config-header-oracle": "Setări Oracle",
        "config-header-mssql": "Setări Microsoft SQL Server",
        "config-invalid-db-type": "Tip de bază de date incorect",
-       "config-missing-db-name": "Trebuie să introduci o valoare pentru „Numele bazei de date”",
+       "config-missing-db-name": "Trebuie să introduceți o valoare pentru „{{int:config-db-name}}”.",
+       "config-missing-db-host": "Trebuie să introduceți o valoare pentru „{{int:config-db-host}}”.",
+       "config-missing-db-server-oracle": "Trebuie să introduceți o valoare pentru „{{int:config-db-host-oracle}}”.",
        "config-connection-error": "$1.\n\nVerificați gazda, numele de utilizator și parola și reîncercați.",
        "config-upgrade-done-no-regenerate": "Actualizare completă.\n\nAcum puteți [$1 începe să vă folosiți wikiul].",
        "config-regenerate": "Regenerare LocalSettings.php →",
@@ -78,6 +83,7 @@
        "config-mysql-charset": "Setul de caractere al bazei de date:",
        "config-mysql-binary": "Binar",
        "config-mysql-utf8": "UTF-8",
+       "config-mssql-auth": "Tip de autentificare:",
        "config-site-name": "Numele wikiului:",
        "config-site-name-blank": "Introduceți un nume pentru sit.",
        "config-project-namespace": "Spațiul de nume al proiectului:",
@@ -86,7 +92,7 @@
        "config-ns-other": "Altul (specificați)",
        "config-ns-other-default": "MyWiki",
        "config-admin-box": "Cont de administrator",
-       "config-admin-name": "Numele dumneavoastră:",
+       "config-admin-name": "Numele dumneavoastră de utilizator:",
        "config-admin-password": "Parolă:",
        "config-admin-password-confirm": "Parola, din nou:",
        "config-admin-password-blank": "Introduceți o parolă pentru contul de administrator.",
        "config-optional-continue": "Adresează-mi mai multe întrebări.",
        "config-optional-skip": "Sunt deja plictisit, doar instalează wikiul.",
        "config-profile": "Profilul drepturilor de utilizator:",
-       "config-profile-wiki": "Wiki tradițional",
+       "config-profile-wiki": "Wiki deschis",
        "config-profile-no-anon": "Crearea de cont este necesară",
        "config-profile-fishbowl": "Doar editorii autorizați",
        "config-profile-private": "Wiki privat",
        "config-license-cc-choose": "Alegeți o licență Creative Commons personalizată",
        "config-email-settings": "Setări pentru e-mail",
        "config-email-usertalk": "Activați notificările pentru pagina de discuții a utilizatorului",
+       "config-upload-settings": "Încărcare de imagini și fișiere",
        "config-upload-deleted": "Director pentru fișierele șterse:",
        "config-logo": "Adresa URL a siglei:",
        "config-cc-again": "Alegeți din nou...",
        "config-install-user": "Se creează utilizatorul pentru baza de date",
        "config-install-user-alreadyexists": "Utilizatorul „$1” există deja",
        "config-install-user-create-failed": "Crearea utilizatorului „$1” a eșuat: $2",
+       "config-install-user-missing": "Utilizatorul „$1” specificat nu există.",
        "config-install-tables": "Se creează tabelele",
        "config-install-stats": "Se inițializează statisticile",
        "config-install-keys": "Se generează cheile secrete",
        "config-install-mainpage-failed": "Nu s-a putut insera pagina principală: $1",
        "config-download-localsettings": "Descarcă <code>LocalSettings.php</code>",
        "config-help": "ajutor",
+       "config-help-tooltip": "clic pentru a extinde",
        "mainpagetext": "'''Programul Wiki a fost instalat cu succes.'''",
        "mainpagedocfooter": "Consultați [//meta.wikimedia.org/wiki/Help:Contents Ghidul utilizatorului (en)] pentru informații despre utilizarea software-ului wiki.\n\n== Primii pași ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista parametrilor configurabili (en)]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Întrebări frecvente despre MediaWiki (en)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discuții a MediaWiki (en)]"
 }
index b5441c1..eef6cac 100644 (file)
@@ -17,7 +17,8 @@
                        "아라",
                        "Meshkov.a",
                        "Eroha",
-                       "Seb35"
+                       "Seb35",
+                       "Striking Blue"
                ]
        },
        "config-desc": "Инсталлятор MediaWiki",
@@ -62,6 +63,7 @@
        "config-env-good": "Проверка внешней среды была успешно проведена.\nВы можете установить MediaWiki.",
        "config-env-bad": "Была проведена проверка внешней среды.\nВы не можете установить MediaWiki.",
        "config-env-php": "Установленная версия PHP: $1.",
+       "config-env-hhvm": "HHVM $1 установлена.",
        "config-unicode-using-utf8": "Использовать Brion Vibber utf8_normalize.so для нормализации Юникода.",
        "config-unicode-using-intl": "Будет использовано [http://pecl.php.net/intl расширение «intl» для PECL] для нормализации Юникода.",
        "config-unicode-pure-php-warning": "'''Внимание!''': [http://pecl.php.net/intl расширение intl из PECL] недоступно для нормализации Юникода, будет использоваться медленная реализация на чистом PHP.\nЕсли ваш сайт работает под высокой нагрузкой, вам следует больше узнать о [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализации Юникода].",
@@ -87,7 +89,7 @@
        "config-apc": "[http://www.php.net/apc APC] установлен",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] установлен",
        "config-no-cache": "'''Внимание:''' Не найдены [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].\nКэширование объектов будет отключено.",
-       "config-mod-security": "'''Внимание''': на вашем веб-сервере включен [http://modsecurity.org/ mod_security]. При неправильной настройке он может вызывать проблемы для MediaWiki или другого ПО, позволяющего пользователям отправлять на сервер произвольный текст.\nОбратитесь к [http://modsecurity.org/documentation/ документации mod_security] или в поддержку вашего хостера, если при работе возникают непонятные ошибки.",
+       "config-mod-security": "<strong>Внимание</strong>: На вашем веб-сервере включен [http://modsecurity.org/ mod_security]/mod_security2. Многие его стандартные настройки могут вызывать проблемы для MediaWiki или другого ПО, позволяющего пользователям отправлять на сервер произвольный контент.\nОбратитесь к [http://modsecurity.org/documentation/ документации mod_security] или в службу поддержки вашего хостинг-провайдера, если вы сталкиваетесь со случайными ошибками.",
        "config-diff3-bad": "GNU diff3 не найден.",
        "config-git": "Найдена система контроля версий Git: <code>$1</code>.",
        "config-git-bad": "Программное обеспечение по управлению версиями Git не найдено.",
        "config-install-stats": "Статистика инициализации",
        "config-install-keys": "Создание секретных ключей",
        "config-insecure-keys": "'''Предупреждение.''' {{PLURAL:$2|1=Ключ безопасности $1, созданный во время установки, недостаточно надёжен|Ключи безопасности $1, созданные во время установки, недостаточно надёжны}}. Рассмотрите возможность {{PLURAL:$2|1=его|их}} изменения вручную.",
+       "config-install-updates": "Предотвращение запуска ненужных обновлений",
+       "config-install-updates-failed": "<strong>Ошибка:</strong> Вставка ключей обновления в таблицы завершилась со следующей ошибкой: $1",
        "config-install-sysop": "Создание учётной записи администратора",
        "config-install-subscribe-fail": "Не удаётся подписаться на mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL не установлен и не доступна опция <code>allow_url_fopen</code>.",
index 40f0902..100f316 100644 (file)
@@ -3,11 +3,12 @@
                "authors": [
                        "Andria",
                        "L2212",
-                       "Uharteko"
+                       "Uharteko",
+                       "Taxandru"
                ]
        },
        "config-page-language": "Limba",
        "config-page-name": "Nùmene",
        "config-page-options": "Preferèntzias",
-       "mainpagetext": "'''MediaWiki est istadu installadu bene.'''"
+       "mainpagetext": "'''MediaWiki est stadu installadu in modu currèggidu.'''"
 }
index 4d44735..4181893 100644 (file)
@@ -48,6 +48,7 @@
        "config-env-good": "The environment haes been checked.\nYe can install MediaWiki.",
        "config-env-bad": "The environment haes been checked.\nYe canna install MediaWiki.",
        "config-env-php": "PHP $1 is instâlled.",
+       "config-env-hhvm": "HHVM $1 is instawed.",
        "config-unicode-using-utf8": "Uising Brion Vibber's utf8_normalize.so fer Unicode normalization.",
        "config-unicode-using-intl": "Uising the [http://pecl.php.net/intl intl PECL extension] fer Unicode normalization.",
        "config-unicode-pure-php-warning": "<strong>Warnishment:</strong> The [http://pecl.php.net/intl intl PECL extension] is no available tae haunle Unicode normalisation, fawin back tae slaw pure-PHP implementation.\nGif ye rin ae hei-traffic steid, ye shid read ae wee bit oan [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
@@ -55,6 +56,7 @@
        "config-no-db": "Coudna fynd ae suitable database driver! Ye need tae instaw ae database driver fer PHP.\nThe follaein database types ar supported: $1.\n\nGif ye compiled PHP yersel, reconfeegure it wi ae database client enabled, fer example, uising <code>./confeegure --wi-mysqli</code>.\nGif ye installed PHP fae ae Debian or Ubuntu package, than ye need tae instaw forby, fer example, the <code>php5-mysql</code> package.",
        "config-outdated-sqlite": "<strong>Warnishment:</strong> ye have SQLite $1, this is lower than minimum required version $2. SQLite will be onavailable.",
        "config-no-fts3": "<strong>Warnishment:</strong> SQLite is compiled wioot the [//sqlite.org/fts3.html FTS3 module], rake features will be onavailable oan this backend.",
+       "config-register-globals-error": "<strong>Mistak: PHP's <code>[http://php.net/register_globals register_globals]</code> optie is enablit.\nIt maun be disablit tae keep gaun wi the instawation.</strong>\nSee [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] fer help oan hou tae dae sae.",
        "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] is active!</strong>\nThis option corrupts data input unpredictably.\nYe cannae install or uise MediaWiki unless this option is disabled.",
        "config-magic-quotes-runtime": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is active!'</strong>\nThis optie rots data input onpredictably.\nYe canna install or uise MediaWiki onless this optie is disabled.",
        "config-magic-quotes-sybase": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] is active!</strong>\nThis optie rots data input onpredictably.\nYe canna install or uise MediaWiki onless this optie is disabled.",
@@ -66,6 +68,7 @@
        "config-memory-raised": "PHP's <code>memerie_limit</code> is $1, raised til $2.",
        "config-memory-bad": "<strong>Warnishment:</strong> PHP's <code>memerie_limit</code> is $1.\nThis is proably ower low.\nThe installation micht fail!",
        "config-ctype": "<strong>Fatal:</strong> PHP maun be compiled wi support fer the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
+       "config-iconv": "<strong>Fatal:</strong> PHP maun be compiled wi support fer the [http://www.php.net/manual/en/iconv.installation.php iconv extension].",
        "config-json": "<strong>Fatal:</strong> PHP wis compiled wioot JSON support.\nYe maun instaw either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension afore instawin MediaWiki.\n* The PHP extension is incluided in Red Hat Enterprise Linux (CentOS) 5 n 6, thoogh it maun be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Some Linux distributions released efter Mey 2013 omit the PHP extension, instead packagin the PECL extension aes <code>php5-json</code> or <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] is installed.",
        "config-apc": "[http://www.php.net/apc APC] is installed.",
        "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-memcache-badport": "Memcached port nummers shid be atween $1 n $2.",
        "config-extensions": "Extensions",
        "config-extensions-help": "The extensions leetit abuin were detected in yer <code>./extensions</code> directerie.\n\nThey micht need addeetional confeeguration, but ye can enable thaim nou.",
+       "config-skins": "Skins",
+       "config-skins-help": "The skins leetit abuin were detectit in yer <code>./skins</code> directerie. Ye maun enable at least yin, n chuise the defaut.",
+       "config-skins-use-as-default": "Uise this skin aes the defaut",
+       "config-skins-missing": "Nae skins were foond; MediaWiki will uise ae fawback skin ontil ye instaw some proper skins.",
+       "config-skins-must-enable-some": "Ye need tae chuisse at least yin skin tae enable.",
+       "config-skins-must-enable-default": "The skin chosen aes the defaut maun be enablit.",
        "config-install-alreadydone": "<strong>Warnishment:</strong> Ye seem tae'v awreadie instawed MediaWiki n ar tryin tae instaw it again.\nPlease proceed til the nex page.",
        "config-install-begin": "Bi pressin \"{{int:config-continue}}\", ye will begin the installation o MediaWiki.\nGif ye still wish tae mak chynges, press \"{{int:config-back}}\".",
        "config-install-step-done": "dun",
        "config-install-stats": "Ineetializin stateestics",
        "config-install-keys": "Generatin hidlins keys",
        "config-insecure-keys": "<strong>Warnishment:</strong> {{PLURAL:$2|Ae secure key|Secure keys}} ($1) generated durin instawation {{PLURAL:$2|is|ar}} naw compleatelie safe. Consider chyngin {{PLURAL:$2|it|theim}} manuallie.",
+       "config-install-updates": "Hinder the runnin o onneedit updates.",
+       "config-install-updates-failed": "<strong>Mistak:</strong> Insertin update keys intae the buirds failed wi the folleain mistak: $1",
        "config-install-sysop": "Makin admeenistrâter uiser accoont",
        "config-install-subscribe-fail": "Onable tae subscribe til mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL isna instawed n <code>allow_url_fopen</code> is na available.",
        "config-install-done": "<strong>Congratulations!</strong>\nYe'v successfulie instawed MediaWiki.\n\nThe instawer haes generated ae <code>LocalSettings.php</code> file.\nIt contains aw yer confeeguration.\n\nYe'll need tae doonlaid it n pit it in the base o yer wiki instawation (the same directerie aes index.php). The doonlaid shid hae stairted autæmateeclie.\n\nGif the doonlaid wisna affered, or gif ye cancelled it, ye can restairt the doonlaid bi clapin oan the airtin ablo:\n\n$3\n\n<strong>Mynd:</strong> Gif ye dinna dae this the nou, this generated confeeguration file willna be available til ye laiter gif ye exit the instawation wioot doonlaidin it.\n\nWhan that haes been dun, ye can <strong>[$2 enter yer wiki]</strong>.",
        "config-download-localsettings": "Dounlaid <code>LocalSettings.php</code>",
        "config-help": "heelp",
+       "config-help-tooltip": "clap tae mak muckler",
        "config-nofile": "File \"$1\" coudna be foond. Haes it been delytit?",
        "config-extension-link": "Did ye ken that yer wiki supports [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYe can brouse [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions bi categorie] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] tae see the full leet o extensions.",
        "mainpagetext": "<strong>MediaWiki haes been installit wi speed.</strong>",
index 961264d..d7f435e 100644 (file)
@@ -2,16 +2,20 @@
        "@metadata": {
                "authors": [
                        "Dbc334",
-                       "Eleassar"
+                       "Eleassar",
+                       "Yerpo"
                ]
        },
        "config-desc": "Namestitveni program za MediaWiki",
        "config-title": "Namestitev MediaWiki $1",
        "config-information": "Informacije",
+       "config-localsettings-upgrade": "Zaznana je bila datoteka <code>LocalSettings.php</code>.\nZa nadgradnjo te inštalacije prosim vnesite vrednost <code>$wgUpgradeKey</code> v polje za vnos spodaj.\nNašli jo boste v <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Zaznana je bila datoteka <code>LocalSettings.php</code>.\nZa nadgradnjo te namestitve zaženite <code>update.php</code>",
        "config-localsettings-key": "Nadgraditveni ključ:",
        "config-localsettings-badkey": "Naveden ključ je napačen.",
        "config-upgrade-key-missing": "Zaznana je bila obstoječa namestitev MediaWiki.\nZa nadgradnjo te namestitve vstavite naslednjo vrstico na dno vaše <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "Kaže, da je obstoječa datoteka <code>LocalSettings.php</code> nepopolna. Vrednost $1 ni nastavljena. Prosimo, nastavite to vrednost v <code>LocalSettings.php</code> in kliknite \"{{int:Config-continue}}\".",
+       "config-localsettings-connection-error": "Prišlo je do napake pri povezovanju s podatkovno zbirko z nastavitvami, določenimi v <code>LocalSettings.php</code>. Prosimo popravite te nastavitve in poskusite znova.\n\n$1",
        "config-session-error": "Napaka pri začenjanju seje: $1",
        "config-session-expired": "Kot kaže, so vaši podatki seje potekli.\nSeje so konfigurirane za dobo $1.\nTo lahko povečate tako, da nastavite <code>session.gc_maxlifetime</code> v php.ini.\nPonovno zaženite postopek namestitve.",
        "config-no-session": "Vaši podatki seje so bili izgubljeni!\nPreverite vaš php.ini in se prepričajte, da je <code>session.save_path</code> nastavljena na ustrezno mapo.",
@@ -43,7 +47,7 @@
        "config-env-good": "Okolje je pregledano.\nLahko namestite MediaWiki.",
        "config-env-bad": "Okolje je pregledano.\nNe morete namestiti MediaWiki.",
        "config-env-php": "Nameščen je PHP $1.",
-       "config-env-php-toolow": "Nameščen je PHP $1.\nVendar pa MediaWiki zahteva PHP $2 ali višji.",
+       "config-env-hhvm": "HHVM $1 je nameščen.",
        "config-unicode-using-utf8": "Uporaba utf8_normalize.so Briona Vibberja za normalizacijo unikoda.",
        "config-unicode-using-intl": "Uporaba [http://pecl.php.net/intl razširitve PECL intl] za normalizacijo unikoda.",
        "config-memory-raised": "PHP-jev <code>memory_limit</code> je $1, dvignjen na $2.",
        "config-apc": "[http://www.php.net/apc APC] je nameščen",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] je nameščen",
        "config-diff3-bad": "GNU diff3 ni bilo mogoče najti.",
+       "config-using-server": "Uporabljam ime strežnika \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Uporabljam URL strežnika \"<nowiki>$1$2</nowiki>\".",
        "config-db-type": "Vrsta zbirke podatkov:",
        "config-db-host": "Gostitelj zbirke podatkov:",
        "config-db-host-oracle": "TNS zbirke podatkov:",
        "config-db-wiki-settings": "Prepoznaj ta wiki:",
        "config-db-name": "Ime zbirke podatkov:",
        "config-db-name-oracle": "Shema zbirke podatkov:",
+       "config-db-install-account": "Uporabniški račun za namestitev",
        "config-db-username": "Uporabniško ime zbirke podatkov:",
        "config-db-password": "Geslo zbirke podatkov:",
+       "config-db-password-empty": "Prosimo, vnesite geslo za novega uporabnika podatkovne zbirke: $1. Morda je mogoče ustvarjati uporabnike brez gesel, ni pa varno.",
+       "config-db-username-empty": "Vnesti morate vrednost za \"{{int:config-db-username}}\".",
+       "config-db-install-username": "Vnesite uporabniško ime za povezavo s podatkovno zbirko med postopkom nameščanja.\nTo ni uporabniško ime računa MediaWiki, pač pa uporabniško ime za vašo podatkovno zbirko.",
+       "config-db-install-password": "Vnesite geslo za povezavo s podatkovno zbirko med postopkom nameščanja.\nTo ni geslo računa MediaWiki, pač pa geslo za vašo podatkovno zbirko.",
+       "config-db-install-help": "Vnesite uporabniško ime in geslo za povezavo s podatkovno zbirko med postopkom nameščanja.",
+       "config-db-account-lock": "Uporabite isto uporabniško ime in geslo tudi po namestitvi.",
        "config-db-prefix": "Predpona tabel zbirke podatkov:",
        "config-db-charset": "Nabor znakov zbirke podatkov",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 dvojiško",
        "config-db-port": "Vrata zbirke podatkov:",
        "config-db-schema": "Shema MediaWiki",
        "config-db-schema-help": "Ta shema je po navadi v redu.\nSpremenite jo samo, če veste, da jo morate.",
+       "config-pg-test-error": "Ne morem se povezati z zbirko podatkov <strong>$1</strong>: $2",
        "config-sqlite-dir": "Mapa podatkov SQLite:",
+       "config-type-mysql": "MySQL (ali združljiv)",
        "config-support-info": "MediaWiki podpira naslednje sisteme zbirk podatkov:\n\n$1\n\nČe zgoraj ne vidite navedenega sistema zbirk podatkov, ki ga poskušate uporabiti, sledite navodilom na spodnji povezavi, da omogočite podporo.",
        "config-header-mysql": "Nastavitve MySQL",
        "config-header-postgres": "Nastavitve PostgreSQL",
        "config-header-sqlite": "Nastavitve SQLite",
        "config-header-oracle": "Nastavitve Oracle",
+       "config-header-mssql": "nastavitve Microsoft SQL Server",
        "config-invalid-db-type": "Neveljavna vrsta zbirke podatkov",
        "config-missing-db-name": "Vnesti morate vrednost za »{{int:config-db-name}}«",
        "config-missing-db-host": "Vnesti morate vrednost za »{{int:config-db-host}}«.",
        "config-mysql-charset": "Nabor znakov zbirke podatkov:",
        "config-mysql-binary": "Dvojiško",
        "config-mysql-utf8": "UTF-8",
+       "config-mssql-auth": "Tip avtentikacije:",
        "config-site-name": "Ime wikija:",
        "config-site-name-help": "To bo prikazano v naslovni vrstici brskalnika in na drugih različnih mestih.",
        "config-site-name-blank": "Vnesite ime strani.",
        "config-profile-no-anon": "Zahtevano je ustvarjanje računa",
        "config-profile-fishbowl": "Samo pooblaščeni urejevalci",
        "config-profile-private": "Zasebni wiki",
+       "config-profile-help": "Wikiji delujejo najbolje, kadar jih lahko ureja največje možno število ljudi.\nPregled nad zadnjimi spremembami in razveljavljanje škode, ki jo povzročijo neuki ali zlonamerni uporabniki, je v MediaWiki preprosto.\n\nVendar pa je MediaWiki uporaben v celi vrsti različnih vlog, pri čemer včasih ni lahko prepričati vseh o prednostih wiki načina. Zato imate izbiro.\n\nModel <strong>{{int:config-profile-wiki}}</strong> dovoljuje urejanje vsem, tudi brez prijavljanja.\nWiki, nastavljen na <strong>{{int:config-profile-no-anon}}</strong> nudi dodatno sledljivost, vendar lahko odvrne priložnostne urejevalce.\n\nScenarij <strong>{{int:config-profile-fishbowl}}</strong> dovoljuje urejanje odobrenim uporabnikom, pri čemer sta vsebina in zgodovina strani javni.\nV načinu <strong>{{int:config-profile-private}}</strong> lahko urejajo in pregledujejo strani le odobreni uporabniki.\n\nPodrobnejše konfiguriranje uporabniških pravic je možno po namestitvi, glejte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights vnos v uporabniškem priročniku].",
        "config-license": "Avtorske pravice in licenca:",
        "config-license-none": "Brez noge dovoljenja",
        "config-license-cc-by-sa": "Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji",
        "config-license-cc-by": "Creative Commons Priznanje avtorstva",
        "config-license-cc-by-nc-sa": "Creative Commons Priznanje avtorstva-Nekomercialno-Deljenje pod enakimi pogoji",
        "config-license-cc-0": "Creative Commons Zero (javna last)",
+       "config-license-gfdl": "Dovoljenje GNU za rabo proste dokumentacije 1.3 ali kasnejše",
        "config-license-pd": "Javna last",
        "config-license-cc-choose": "Izberite dovoljenje Creative Commons po meri",
        "config-email-settings": "Nastavitve e-pošte",
index 7a0976b..b8f131e 100644 (file)
@@ -1,5 +1,9 @@
 {
-       "@metadata": [],
-       "mainpagetext": "'''''Software'' MediaWiki geus diinstal.'''",
+       "@metadata": {
+               "authors": [
+                       "Kandar"
+               ]
+       },
+       "mainpagetext": "<strong>MediaWiki geus réngsé diinstal.</strong>",
        "mainpagedocfooter": "Mangga tingal ''[//meta.wikimedia.org/wiki/MediaWiki_localisation documentation on customizing the interface]'' jeung [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi."
 }
index b46902c..2bdfb10 100644 (file)
@@ -51,6 +51,7 @@
        "config-env-good": "Miljön har kontrollerats.\nDu kan installera MediaWiki.",
        "config-env-bad": "Miljön har kontrollerats.\nDu kan inte installera MediaWiki.",
        "config-env-php": "PHP $1 är installerat.",
+       "config-env-hhvm": "HHVM $1 är installerat.",
        "config-unicode-using-utf8": "Använder Brion Vibbers utf8_normalize.so för Unicode-normalisering.",
        "config-unicode-using-intl": "Använder [http://pecl.php.net/intl intl PECL-tillägget] för Unicode-normalisering.",
        "config-unicode-pure-php-warning": "'''Varning:''' [http://pecl.php.net/intl intl PECL-tillägget] är inte tillgängligt för att hantera Unicode-normalisering, faller tillbaka till en långsamt implementering i ren PHP.\nOm du driver en högtrafikerad webbplats bör du läsa lite om [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
        "config-install-stats": "Initierar statistik",
        "config-install-keys": "Genererar hemliga nycklar",
        "config-insecure-keys": "'''Varning:''' {{PLURAL:$2|En säkerhetsnyckel|Säkerhetsnycklar}} ($1) som generades under installationen är inte helt {{PLURAL:$2|säker|säkra}} . Överväg att ändra {{PLURAL:$2|den|dem}} manuellt.",
+       "config-install-updates": "Förhindra att onödiga uppdateringar körs",
+       "config-install-updates-failed": "<strong>Fel:</strong> Infogning av uppdateringsnycklar i tabeller misslyckades med följande fel:$1",
        "config-install-sysop": "Skapar administratörskonto",
        "config-install-subscribe-fail": "Det gick inte att prenumerera på mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL är inte installerad och <code>allow_url_fopen</code> är inte tillgänglig.",
index 001a0f8..e030443 100644 (file)
@@ -55,6 +55,7 @@
        "config-env-good": "Перевірку середовища успішно завершено.\nВи можете встановити MediaWiki.",
        "config-env-bad": "Було проведено перевірку середовища. Ви не можете встановити MediaWiki.",
        "config-env-php": "Встановлено версію PHP: $1.",
+       "config-env-hhvm": "HHVM $1  встановлено.",
        "config-unicode-using-utf8": "Використовувати utf8_normalize.so Брайона Віббера для нормалізації Юнікоду.",
        "config-unicode-using-intl": "Використовувати [http://pecl.php.net/intl міжнародне розширення PECL] для нормалізації Юнікоду.",
        "config-unicode-pure-php-warning": "'''Увага''': [http://pecl.php.net/intl міжнародне розширення PECL] не може провести нормалізацію Юнікоду.\nЯкщо ваш сайт має високий трафік, вам варто почитати про [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормалізацію Юнікоду].",
        "config-install-stats": "Ініціалізація статистики",
        "config-install-keys": "Генерація секретних ключів",
        "config-insecure-keys": "'''Увага:''' {{PLURAL:$2|1=Секретний ключ|Секретні ключі}} ($1), {{PLURAL:$2|1=згенерований в процесі встановлення, недостатньо надійний|згенеровані в процесі встановлення, недостатньо надійні}}. Розгляньте можливість {{PLURAL:$2|1=його|їх}} заміни вручну.",
+       "config-install-updates": "Запобігти запуску непотрібних оновлень",
+       "config-install-updates-failed": "<strong>Помилка:</strong> Вставка оновленних ключів в таблиці не вдалося через таку помилку:$1",
        "config-install-sysop": "Створення облікового запису адміністратора",
        "config-install-subscribe-fail": "Не можливо підписатись на mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL не встановлено і опція <code>allow_url_fopen</code> не доступна.",
index 1f3f89e..35a99b7 100644 (file)
@@ -37,7 +37,7 @@
        "config-env-good": "Đã kiểm tra môi trường.\nBạn có thể cài đặt MediaWiki.",
        "config-env-bad": "Đã kiểm tra môi trường.\nBạn không thể cài đặt MediaWiki.",
        "config-env-php": "PHP $1 đã được cài đặt.",
-       "config-env-php-toolow": "PHP $1 đã được cài đặt.\nTuy nhiên, MediaWiki cần PHP $2 trở lên.",
+       "config-env-hhvm": "HHVM $1 được cài đặt.",
        "config-unicode-using-utf8": "Đang sử dụng utf8_normalize.so của Brion Vibber để chuẩn hóa văn bản Unicode.",
        "config-unicode-using-intl": "Sẽ sử dụng [http://pecl.php.net/intl phần mở rộng PECL intl] để chuẩn hóa Unicode.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] đã được cài đặt",
        "config-memcache-badip": "Bạn đã nhập một địa chỉ IP không hợp lệ cho Memcached: $1.",
        "config-memcache-badport": "Số cổng Memcached phải từ $1 đến $2.",
        "config-extensions": "Phần mở rộng",
+       "config-skins": "Giao diện",
+       "config-skins-use-as-default": "Dùng giao diện này làm mặc định",
        "config-install-step-done": "hoàn tất",
        "config-install-step-failed": "thất bại",
        "config-install-extensions": "Đang bao gồm phần mở rộng",
        "config-install-schema": "Đang tạo giản đồ",
        "config-install-pg-schema-not-exist": "Lược đồ PostgreSQL không tồn tại.",
        "config-install-pg-schema-failed": "Thất bại khi tạo các bảng.\nHãy chắc chắn rằng người dùng “$1” có thể ghi vào giản đồ “$2”.",
+       "config-install-pg-commit": "Đang gửi các thay đổi",
        "config-install-pg-plpgsql": "Tìm ngôn ngữ PL/pgSQL",
        "config-pg-no-plpgsql": "Bạn cần phải cài đặt ngôn ngữ PL/pgSQL vào cơ sở dữ liệu $1",
        "config-install-user": "Đang tạo người dùng trên cơ sở dữ liệu",
        "config-install-mainpage-failed": "Không thể chèn trang đầu: $1",
        "config-download-localsettings": "Tải về <code>LocalSettings.php</code>",
        "config-help": "Trợ giúp",
+       "config-help-tooltip": "nhấn chuột để mở rộng",
        "config-nofile": "Không tìm thấy tập tin “$1”. Nó có phải bị xóa không?",
        "mainpagetext": "'''MediaWiki đã được cài đặt thành công.'''",
        "mainpagedocfooter": "Xin đọc [//meta.wikimedia.org/wiki/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]"
index b297a19..f4c3316 100644 (file)
@@ -21,7 +21,8 @@
                        "Zjzengdongyang",
                        "Mywood",
                        "Impersonator 1",
-                       "Fengchao"
+                       "Fengchao",
+                       "Duolaimi"
                ]
        },
        "config-desc": "MediaWiki安装程序",
        "config-env-good": "环境检查已经完成。您可以安装MediaWiki。",
        "config-env-bad": "环境检查已经完成。您不能安装MediaWiki。",
        "config-env-php": "PHP $1已安装。",
+       "config-env-hhvm": "HHVM $1已安装。",
        "config-unicode-using-utf8": "使用Brion Vibber的utf8_normalize.so实现Unicode正常化。",
        "config-unicode-using-intl": "使用[http://pecl.php.net/intl intl PECL扩展程序]标准化Unicode。",
-       "config-unicode-pure-php-warning": "<strong>è­¦å\91\8aï¼\9a</strong>å\9b ä¸ºå°\9aæ\9cªå®\89è£\85 [http://pecl.php.net/intl intl PECL æ\89©å±\95]以å¤\84ç\90\86 Unicode æ­£å¸¸å\8c\96ï¼\8cæ\95\85å\8fªè\83½é\80\80è\80\8cé\87\87ç\94¨è¿\90è¡\8cè¾\83æ\85¢ç\9a\84纯 PHP å®\9eç\8e°ç\9a\84æ\96¹æ³\95ã\80\82\nå¦\82æ\9e\9cæ\82¨è¿\90è¡\8cç\9d\80ä¸\80个é«\98æµ\81é\87\8fç\9a\84ç«\99ç\82¹ï¼\8c请å\8f\82é\98\85 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode æ­£å¸¸化]一文。",
+       "config-unicode-pure-php-warning": "<strong>è­¦å\91\8aï¼\9a</strong>å\9b ä¸ºå°\9aæ\9cªå®\89è£\85 [http://pecl.php.net/intl intl PECL æ\89©å±\95]以å¤\84ç\90\86 Unicode æ­£å¸¸å\8c\96ï¼\8cæ\95\85å\8fªè\83½é\80\80è\80\8cé\87\87ç\94¨è¿\90è¡\8cè¾\83æ\85¢ç\9a\84纯 PHP å®\9eç\8e°ç\9a\84æ\96¹æ³\95ã\80\82\nå¦\82æ\9e\9cæ\82¨è¿\90è¡\8cç\9d\80ä¸\80个é«\98æµ\81é\87\8fç\9a\84ç½\91ç«\99ï¼\8c请å\8f\82é\98\85 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicodeæ \87å\87\86化]一文。",
        "config-unicode-update-warning": "'''警告''':Unicode正常化封装器的已安装版本使用了旧版本的[http://site.icu-project.org/ ICU项目]库。如果您需要使用Unicode,请将其[//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升级]。",
        "config-no-db": "找不到合适的数据库驱动!您需要为PHP安装数据库驱动。目前支持以下数据库:$1。如果您是自己编译的PHP,请重新配置他与数据库客户端将其启用,诸如,使用<code>./configure --with-mysqli</code>。如果您从Debian或Ubuntu包安装了PHP,之后您仍需要安装诸如<code>php5-mysql</code>包。",
        "config-outdated-sqlite": "'''警告''':您已安装SQLite $1,但是它的版本低于最低要求版本$2。因此您无法选择SQLite。",
        "config-type-mysql": "MySQL(或兼容程序)",
        "config-type-mssql": "微软SQL服务器",
        "config-support-info": "MediaWiki支持以下数据库系统:\n\n$1\n\n如果您在下面列出的数据库系统中没有找到您希望使用的系统,请根据上方链向的指引启用支持。",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]是MediaWiki的首选数据库,对它的支持最为完备([http://www.php.net/manual/en/mysql.installation.php 如何将对MySQL的支持编译进PHP中])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]是MediaWiki的首选数据库,对它的支持最为完备。MediaWiki也可以在[{{int:version-db-mariadb-url}} MariaDB]和[{{int:version-db-percona-url}} Percona Server]下工作,它们与MySQL兼容。([http://www.php.net/manual/en/mysql.installation.php 如何将对MySQL的支持编译进PHP中])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL]是一种流行的开源数据库系统,可作为MySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何将对PostgreSQL的支持编译进PHP中])。本程序中可能依然存在一些小而明显的错误,因此并不建议在生产环境中使用该数据库系统。",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]是一种轻量级的数据库系统,能被良好地支持。([http://www.php.net/manual/en/pdo.installation.php 如何将对SQLite的支持编译进PHP中],须使用PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle]是一种商用企业级的数据库。([http://www.php.net/manual/en/oci8.installation.php 如何将对OCI8的支持编译进PHP中])",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "'''警告''':您选择了MyISAM作为MySQL的存储引擎,MediaWiki并不推荐您这么做,因为:\n* 它仅能通过表锁定来勉强支持并发\n* 与其他引擎相比,它更容易被损坏\n* MediaWiki代码库并不总会去处理MyISAM\n\n如果您的MySQL程序支持InnoDB,我们高度推荐您使用该引擎替代MyISAM。\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'''在单用户或只读环境下可能会有更快的性能表现。但MyISAM数据库出错的概率一般要大于InnoDB数据库。",
        "config-mysql-charset": "数据库字符集:",
        "config-mysql-binary": "二进制",
        "config-profile-help": "如果您允许尽量多的人编写wiki,网站上的内容会更加丰富。在MediaWiki中,您可以轻松地审查最近更改,并轻易回退掉新手或破坏者造成的损害。\n\n然而,许多人觉得让MediaWiki存在多种角色将更加好用;同时,要说服所有人都愿以wiki的方式作贡献并非一件易事。因此,您可以有以下选择:\n\n'''{{int:config-profile-wiki}}'''允许包括未登录用户在内的所有人编辑。'''{{int:config-profile-no-anon}}'''的wiki需要额外的注册流程,这有可能会阻碍随意贡献者。\n\n'''{{int:config-profile-fishbowl}}'''模式只允许获批准的用户编辑,但对公众开放页面浏览(包括历史记录)。'''{{int:config-profile-private}}'''则只允许获批准的用户浏览、编辑页面。\n\n安装完成后,您还可以对用户权限进行更多、更复杂的配置,参见[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 相关的使用手册]。",
        "config-license": "版权和许可证:",
        "config-license-none": "页脚无许可证",
-       "config-license-cc-by-sa": "知识共享署名-相同方式共享",
+       "config-license-cc-by-sa": "知识共享“署名-相同方式共享”",
        "config-license-cc-by": "知识共享署名",
        "config-license-cc-by-nc-sa": "知识共享署名-非商业性使用-相同方式共享",
        "config-license-cc-0": "知识共享Zero(公有领域)",
        "config-install-stats": "初始化统计",
        "config-install-keys": "生成密钥中",
        "config-insecure-keys": "'''警告''':在安装过程中生成的{{PLURAL:$2|安全密钥|安全密钥}}($1){{PLURAL:$2|并|并}}不一定安全。请考虑手动更改{{PLURAL:$2|它|它们}}。",
+       "config-install-updates": "防止运行不需要的更新",
+       "config-install-updates-failed": "<strong>错误:</strong>表格中插入更新关键字失败并出现如下错误:$1",
        "config-install-sysop": "正在创建管理员用户帐号",
        "config-install-subscribe-fail": "无法订阅mediawiki-announce:$1",
        "config-install-subscribe-notpossible": "没有安装cURL,<code>allow_url_fopen</code>也不可用。",
index cb6cefb..ce1b260 100644 (file)
        "config-restart": "是的,重新開始",
        "config-welcome": "=== 環境檢查 ===\n現在會做基本的檢查,檢查環境是否符合 MediaWiki 安裝所需。\n若您要尋求如何完成安裝的協助,請記得提供以下訊息。",
        "config-copyright": "=== 版權聲明與授權條款 ===\n\n$1\n\n本程式為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但 <strong>不負任何擔保責任</strong>;亦無隱含對 <strong>適售性</strong> 或 <strong>特定用途的適用性</strong> 的情形擔保。詳情請參照 GNU 通用公共授權。\n\n您應已隨本程式收到 <doclink href=\"Copying\">GNU 通用公共授權條款的副本</doclink>;如果沒有,請信件通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [http://www.gnu.org/copyleft/gpl.html 線上閱讀]。",
-       "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 首頁]\n* [www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh 使用者指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/zh 管理者指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hant 常見問題集]\n----\n* <doclink href=Readme>讀我說明</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>版權聲明</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 首頁]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh 使用者指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/zh 管理員指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh 常見問題集]\n----\n* <doclink href=Readme>讀我說明</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>版權聲明</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
        "config-env-good": "環境檢查已完成。\n您可以安裝 MediaWiki。",
        "config-env-bad": "環境檢查已完成。\n您無法安裝 MediaWiki。",
        "config-env-php": "PHP $1 已安裝。",
+       "config-env-hhvm": "HHVM $1 已安裝。",
        "config-unicode-using-utf8": "使用 Brion Vibber 的 utf8_normalize.so 做 Unicode 正規化。",
        "config-unicode-using-intl": "使用 [http://pecl.php.net/intl intl PECL 擴充套件] 做 Unicode 正規化。",
        "config-unicode-pure-php-warning": "<strong>警告:</strong> 無法使用 [http://pecl.php.net/intl intl PECL 擴充套件] 處理 Unicode 正規化,故回退使用純 PHP 實作的正規化程式,此方式處理速度較緩慢。\n\n如果您的網站瀏覽人次很高,您應先閱讀 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。",
        "config-sqlite-cant-create-db": "無法建立資料庫檔案 <code>$1</code>。",
        "config-sqlite-fts3-downgrade": "PHP 不支援 FTS3,正在降級資料表。",
        "config-can-upgrade": "在資料庫中找到 MediaWiki 的資料表。\n要升級至 MediaWiki $1,請點選 <strong>繼續</strong>。",
-       "config-upgrade-done": "升級完成。\n\n現在您可以 [$1 開始使用您的 Wiki] 了。\n\n如果您需要重新產生 <code>LocalSettings.php</code> 檔案,請點下方按鈕。\n除非您的 Wiki 出現了問題,否則我們 <strong>不建議</strong> 您執行此操作。",
+       "config-upgrade-done": "升級完成。\n\n現在您可以 [$1 開始使用您的 Wiki] 了。\n\n如果您需要重新產生 <code>LocalSettings.php</code> 檔案,請點下方按鈕。\n除非您的 Wiki 出現了問題,否則我們 <strong>不建議</strong> 您執行此操作。",
        "config-upgrade-done-no-regenerate": "升級完成。\n\n現在您可以 [$1 開始使用您的 Wiki] 了。",
        "config-regenerate": "重新產生 LocalSettings.php →",
        "config-show-table-status": "<code>SHOW TABLE STATUS</code> 查詢失敗!",
        "config-email-usertalk": "開啟使用者討論頁面通知",
        "config-email-usertalk-help": "若使用者在個人偏好開啟了此功能,則可收到使用者討論頁面被修改的通知。",
        "config-email-watchlist": "開啟監視清單通知",
-       "config-email-watchlist-help": "若使用者在個人偏好開啟了此功能,允許使用者收到與其監視列表有關的通知。",
+       "config-email-watchlist-help": "若使用者在個人偏好開啟了此功能,允許使用者收到與其監視清單有關的通知。",
        "config-email-auth": "開啟電子郵件身份認證",
        "config-email-auth-help": "若開啟此選項,使用者不論設定或者更改電子郵件地址,都必須透過收信的方式確認沒有問題。\n只有驗證過的電子郵件地址可以收到來自其他使用者或修改通知的信件。\n公開的 Wiki 會 <strong>建議</strong> 設定此選項,以防使用者濫用電子郵件功能。",
        "config-email-sender": "電子郵件回覆位址:",
        "config-install-stats": "初始化統計資訊",
        "config-install-keys": "產生秘密金鑰中",
        "config-insecure-keys": "<strong>警告:</strong>在安裝過程中所產生的 $2 組安全金鑰($1)並不完全安全。請考慮手動更改。",
+       "config-install-updates": "略過執行不需要的更新",
+       "config-install-updates-failed": "<strong>錯誤:</strong> 插入更新鍵值至資料表失敗,並出現以下錯誤:$1",
        "config-install-sysop": "正在建立管理員使用者帳號",
        "config-install-subscribe-fail": "無法訂閱 mediawiki-announce:$1",
        "config-install-subscribe-notpossible": "未安裝 cURL,因此無法使用 <code>allow_url_fopen</code> 設定項目。",
index ee3f2c2..d89c5d2 100644 (file)
@@ -87,7 +87,7 @@ abstract class Job implements IJobSpecification {
         * This may add duplicate at insert time, but they will be
         * removed later on, when the first one is popped.
         *
-        * @param array $jobs Array of Job objects
+        * @param Job[] $jobs Array of Job objects
         * @return bool
         * @deprecated since 1.21
         */
@@ -103,7 +103,7 @@ abstract class Job implements IJobSpecification {
         * be rolled-back as part of a larger transaction. However,
         * large batches of jobs can cause slave lag.
         *
-        * @param array $jobs Array of Job objects
+        * @param Job[] $jobs Array of Job objects
         * @return bool
         * @deprecated since 1.21
         */
@@ -143,7 +143,7 @@ abstract class Job implements IJobSpecification {
        /**
         * @param string $command
         * @param Title $title
-        * @param array|bool $params
+        * @param array|bool $params Can not be === true
         */
        public function __construct( $command, $title, $params = false ) {
                $this->command = $command;
index 08873cc..056e5a8 100644 (file)
@@ -556,7 +556,7 @@ class JobQueueDB extends JobQueue {
         * @return void
         */
        protected function doWaitForBackups() {
-               wfWaitForSlaves();
+               wfWaitForSlaves( false, $this->wiki, $this->cluster ?: false );
        }
 
        /**
index 98a78c5..b0b35e9 100644 (file)
@@ -104,7 +104,7 @@ class JobQueueGroup {
         * This inserts the jobs into the queue specified by $wgJobTypeConf
         * and updates the aggregate job queue information cache as needed.
         *
-        * @param Job|array $jobs A single Job or a list of Jobs
+        * @param Job|Job[] $jobs A single Job or a list of Jobs
         * @throws MWException
         * @return void
         */
index c5e7f2e..4d2c618 100644 (file)
@@ -76,23 +76,34 @@ class JobRunner {
                        $this->runJobsLog( "Executed $count periodic queue task(s)." );
                }
 
+               // Bail out if there is too much DB lag
+               list( , $maxLag ) = wfGetLBFactory()->getMainLB( wfWikiID() )->getMaxLag();
+               if ( $maxLag >= 5 ) {
+                       $response['reached'] = 'slave-lag-limit';
+                       return $response;
+               }
+
                // Flush any pending DB writes for sanity
                wfGetLBFactory()->commitMasterChanges();
 
-               $backoffs = $this->loadBackoffs(); // map of (type => UNIX expiry)
-               $startingBackoffs = $backoffs; // avoid unnecessary writes
-               $backoffExpireFunc = function ( $t ) {
-                       return $t > time();
-               };
+               // Some jobs types should not run until a certain timestamp
+               $backoffs = array(); // map of (type => UNIX expiry)
+               $backoffDeltas = array(); // map of (type => seconds)
+               $wait = 'wait'; // block to read backoffs the first time
 
-               $jobsRun = 0; // counter
+               $jobsRun = 0;
                $timeMsTotal = 0;
                $flags = JobQueueGroup::USE_CACHE;
+               $checkPeriod = 5.0; // seconds
+               $checkPhase = mt_rand( 0, 1000 * $checkPeriod ) / 1000; // avoid stampedes
                $startTime = microtime( true ); // time since jobs started running
-               $lastTime = microtime( true ); // time since last slave check
+               $lastTime = microtime( true ) - $checkPhase; // time since last slave check
                do {
-                       $backoffs = array_filter( $backoffs, $backoffExpireFunc );
+                       // Sync the persistent backoffs with concurrent runners
+                       $backoffs = $this->syncBackoffDeltas( $backoffs, $backoffDeltas, $wait );
                        $blacklist = $noThrottle ? array() : array_keys( $backoffs );
+                       $wait = 'nowait'; // less important now
+
                        if ( $type === false ) {
                                $job = $group->pop( JobQueueGroup::TYPE_DEFAULT, $flags, $blacklist );
                        } elseif ( in_array( $type, $blacklist ) ) {
@@ -100,14 +111,26 @@ class JobRunner {
                        } else {
                                $job = $group->pop( $type ); // job from a single queue
                        }
+
                        if ( $job ) { // found a job
                                $jType = $job->getType();
 
+                               // Back off of certain jobs for a while (for throttling and for errors)
+                               $ttw = $this->getBackoffTimeToWait( $job );
+                               if ( $ttw > 0 ) {
+                                       // Always add the delta for other runners in case the time running the
+                                       // job negated the backoff for each individually but not collectively.
+                                       $backoffDeltas[$jType] = isset( $backoffDeltas[$jType] )
+                                               ? $backoffDeltas[$jType] + $ttw
+                                               : $ttw;
+                                       $backoffs = $this->syncBackoffDeltas( $backoffs, $backoffDeltas, $wait );
+                               }
+
                                $this->runJobsLog( $job->toString() . " STARTING" );
 
                                // Run the job...
                                wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
-                               $t = microtime( true );
+                               $jobStartTime = microtime( true );
                                try {
                                        ++$jobsRun;
                                        $status = $job->run();
@@ -119,7 +142,7 @@ class JobRunner {
                                        $error = get_class( $e ) . ': ' . $e->getMessage();
                                        MWExceptionHandler::logException( $e );
                                }
-                               $timeMs = intval( ( microtime( true ) - $t ) * 1000 );
+                               $timeMs = intval( ( microtime( true ) - $jobStartTime ) * 1000 );
                                wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
                                $timeMsTotal += $timeMs;
 
@@ -128,6 +151,14 @@ class JobRunner {
                                        $group->ack( $job ); // done
                                }
 
+                               // Back off of certain jobs for a while (for throttling and for errors)
+                               if ( $status === false && mt_rand( 0, 49 ) == 0 ) {
+                                       $ttw = max( $ttw, 30 ); // too many errors
+                                       $backoffDeltas[$jType] = isset( $backoffDeltas[$jType] )
+                                               ? $backoffDeltas[$jType] + $ttw
+                                               : $ttw;
+                               }
+
                                if ( $status === false ) {
                                        $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
                                } else {
@@ -141,16 +172,6 @@ class JobRunner {
                                        'time'   => $timeMs
                                );
 
-                               // Back off of certain jobs for a while (for throttling and for errors)
-                               $ttw = $this->getBackoffTimeToWait( $job );
-                               if ( $status === false && mt_rand( 0, 49 ) == 0 ) {
-                                       $ttw = max( $ttw, 30 );
-                               }
-                               if ( $ttw > 0 ) {
-                                       $backoffs[$jType] = isset( $backoffs[$jType] ) ? $backoffs[$jType] : 0;
-                                       $backoffs[$jType] = max( $backoffs[$jType], time() + $ttw );
-                               }
-
                                // Break out if we hit the job count or wall time limits...
                                if ( $maxJobs && $jobsRun >= $maxJobs ) {
                                        $response['reached'] = 'job-limit';
@@ -160,10 +181,15 @@ class JobRunner {
                                        break;
                                }
 
-                               // Don't let any of the main DB slaves get backed up
+                               // Don't let any of the main DB slaves get backed up.
+                               // This only waits for so long before exiting and letting
+                               // other wikis in the farm (on different masters) get a chance.
                                $timePassed = microtime( true ) - $lastTime;
                                if ( $timePassed >= 5 || $timePassed < 0 ) {
-                                       wfWaitForSlaves( $lastTime );
+                                       if ( !wfWaitForSlaves( $lastTime, wfWikiID(), false, 5 ) ) {
+                                               $response['reached'] = 'slave-lag-limit';
+                                               break;
+                                       }
                                        $lastTime = microtime( true );
                                }
                                // Don't let any queue slaves/backups fall behind
@@ -177,9 +203,8 @@ class JobRunner {
                } while ( $job ); // stop when there are no jobs
 
                // Sync the persistent backoffs for the next runJobs.php pass
-               $backoffs = array_filter( $backoffs, $backoffExpireFunc );
-               if ( $backoffs !== $startingBackoffs ) {
-                       $this->syncBackoffs( $backoffs );
+               if ( $backoffDeltas ) {
+                       $this->syncBackoffDeltas( $backoffs, $backoffDeltas, 'wait' );
                }
 
                $response['backoffs'] = $backoffs;
@@ -221,47 +246,86 @@ class JobRunner {
 
        /**
         * Get the previous backoff expiries from persistent storage
+        * On I/O or lock acquisition failure this returns the original $backoffs.
         *
+        * @param array $backoffs Map of (job type => UNIX timestamp)
+        * @param string $mode Lock wait mode - "wait" or "nowait"
         * @return array Map of (job type => backoff expiry timestamp)
         */
-       private function loadBackoffs() {
+       private function loadBackoffs( array $backoffs, $mode = 'wait' ) {
                $section = new ProfileSection( __METHOD__ );
 
-               $backoffs = array();
                $file = wfTempDir() . '/mw-runJobs-backoffs.json';
                if ( is_file( $file ) ) {
+                       $noblock = ( $mode === 'nowait' ) ? LOCK_NB : 0;
                        $handle = fopen( $file, 'rb' );
-                       flock( $handle, LOCK_SH );
+                       if ( !flock( $handle, LOCK_SH | $noblock ) ) {
+                               fclose( $handle );
+                               return $backoffs; // don't wait on lock
+                       }
                        $content = stream_get_contents( $handle );
                        flock( $handle, LOCK_UN );
                        fclose( $handle );
-                       $backoffs = json_decode( $content, true ) ? : array();
+                       $ctime = microtime( true );
+                       $cBackoffs = json_decode( $content, true ) ?: array();
+                       foreach ( $cBackoffs as $type => $timestamp ) {
+                               if ( $timestamp < $ctime ) {
+                                       unset( $cBackoffs[$type] );
+                               }
+                       }
+               } else {
+                       $cBackoffs = array();
                }
 
-               return $backoffs;
+               return $cBackoffs;
        }
 
        /**
         * Merge the current backoff expiries from persistent storage
         *
-        * @param array $backoffs Map of (job type => backoff expiry timestamp)
+        * The $deltas map is set to an empty array on success.
+        * On I/O or lock acquisition failure this returns the original $backoffs.
+        *
+        * @param array $backoffs Map of (job type => UNIX timestamp)
+        * @param array $deltas Map of (job type => seconds)
+        * @param string $mode Lock wait mode - "wait" or "nowait"
+        * @return array The new backoffs account for $backoffs and the latest file data
         */
-       private function syncBackoffs( array $backoffs ) {
+       private function syncBackoffDeltas( array $backoffs, array &$deltas, $mode = 'wait' ) {
                $section = new ProfileSection( __METHOD__ );
 
+               if ( !$deltas ) {
+                       return $this->loadBackoffs( $backoffs, $mode );
+               }
+
+               $noblock = ( $mode === 'nowait' ) ? LOCK_NB : 0;
                $file = wfTempDir() . '/mw-runJobs-backoffs.json';
                $handle = fopen( $file, 'wb+' );
-               flock( $handle, LOCK_EX );
+               if ( !flock( $handle, LOCK_EX | $noblock ) ) {
+                       fclose( $handle );
+                       return $backoffs; // don't wait on lock
+               }
+               $ctime = microtime( true );
                $content = stream_get_contents( $handle );
-               $cBackoffs = json_decode( $content, true ) ? : array();
-               foreach ( $backoffs as $type => $timestamp ) {
-                       $cBackoffs[$type] = isset( $cBackoffs[$type] ) ? $cBackoffs[$type] : 0;
-                       $cBackoffs[$type] = max( $cBackoffs[$type], $backoffs[$type] );
+               $cBackoffs = json_decode( $content, true ) ?: array();
+               foreach ( $deltas as $type => $seconds ) {
+                       $cBackoffs[$type] = isset( $cBackoffs[$type] ) && $cBackoffs[$type] >= $ctime
+                               ? $cBackoffs[$type] + $seconds
+                               : $ctime + $seconds;
+               }
+               foreach ( $cBackoffs as $type => $timestamp ) {
+                       if ( $timestamp < $ctime ) {
+                               unset( $cBackoffs[$type] );
+                       }
                }
                ftruncate( $handle, 0 );
-               fwrite( $handle, json_encode( $backoffs ) );
+               fwrite( $handle, json_encode( $cBackoffs ) );
                flock( $handle, LOCK_UN );
                fclose( $handle );
+
+               $deltas = array();
+
+               return $cBackoffs;
        }
 
        /**
index 9e9bda6..cc28a01 100644 (file)
@@ -35,26 +35,16 @@ class AssembleUploadChunksJob extends Job {
        public function run() {
                $scope = RequestContext::importScopedSession( $this->params['session'] );
                $context = RequestContext::getMain();
+               $user = $context->getUser();
                try {
-                       $user = $context->getUser();
                        if ( !$user->isLoggedIn() ) {
                                $this->setLastError( "Could not load the author user from session." );
 
                                return false;
                        }
 
-                       if ( count( $_SESSION ) === 0 ) {
-                               // Empty session probably indicates that we didn't associate
-                               // with the session correctly. Note that being able to load
-                               // the user does not necessarily mean the session was loaded.
-                               // Most likely cause by suhosin.session.encrypt = On.
-                               $this->setLastError( "Error associating with user session. " .
-                                       "Try setting suhosin.session.encrypt = Off" );
-
-                               return false;
-                       }
-
                        UploadBase::setSessionStatus(
+                               $user,
                                $this->params['filekey'],
                                array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() )
                        );
@@ -70,6 +60,7 @@ class AssembleUploadChunksJob extends Job {
                        $status = $upload->concatenateChunks();
                        if ( !$status->isGood() ) {
                                UploadBase::setSessionStatus(
+                                       $user,
                                        $this->params['filekey'],
                                        array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status )
                                );
@@ -93,6 +84,7 @@ class AssembleUploadChunksJob extends Job {
 
                        // Cache the info so the user doesn't have to wait forever to get the final info
                        UploadBase::setSessionStatus(
+                               $user,
                                $this->params['filekey'],
                                array(
                                        'result' => 'Success',
@@ -104,6 +96,7 @@ class AssembleUploadChunksJob extends Job {
                        );
                } catch ( MWException $e ) {
                        UploadBase::setSessionStatus(
+                               $user,
                                $this->params['filekey'],
                                array(
                                        'result' => 'Failure',
index 918a392..55215b3 100644 (file)
@@ -35,26 +35,16 @@ class PublishStashedFileJob extends Job {
        public function run() {
                $scope = RequestContext::importScopedSession( $this->params['session'] );
                $context = RequestContext::getMain();
+               $user = $context->getUser();
                try {
-                       $user = $context->getUser();
                        if ( !$user->isLoggedIn() ) {
                                $this->setLastError( "Could not load the author user from session." );
 
                                return false;
                        }
 
-                       if ( count( $_SESSION ) === 0 ) {
-                               // Empty session probably indicates that we didn't associate
-                               // with the session correctly. Note that being able to load
-                               // the user does not necessarily mean the session was loaded.
-                               // Most likely cause by suhosin.session.encrypt = On.
-                               $this->setLastError( "Error associating with user session. " .
-                                       "Try setting suhosin.session.encrypt = Off" );
-
-                               return false;
-                       }
-
                        UploadBase::setSessionStatus(
+                               $user,
                                $this->params['filekey'],
                                array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() )
                        );
@@ -72,6 +62,7 @@ class PublishStashedFileJob extends Job {
                                $status = Status::newFatal( 'verification-error' );
                                $status->value = array( 'verification' => $verification );
                                UploadBase::setSessionStatus(
+                                       $user,
                                        $this->params['filekey'],
                                        array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
                                );
@@ -89,6 +80,7 @@ class PublishStashedFileJob extends Job {
                        );
                        if ( !$status->isGood() ) {
                                UploadBase::setSessionStatus(
+                                       $user,
                                        $this->params['filekey'],
                                        array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
                                );
@@ -106,6 +98,7 @@ class PublishStashedFileJob extends Job {
 
                        // Cache the info so the user doesn't have to wait forever to get the final info
                        UploadBase::setSessionStatus(
+                               $user,
                                $this->params['filekey'],
                                array(
                                        'result' => 'Success',
@@ -117,6 +110,7 @@ class PublishStashedFileJob extends Job {
                        );
                } catch ( MWException $e ) {
                        UploadBase::setSessionStatus(
+                               $user,
                                $this->params['filekey'],
                                array(
                                        'result' => 'Failure',
diff --git a/includes/jobqueue/jobs/ThumbnailRenderJob.php b/includes/jobqueue/jobs/ThumbnailRenderJob.php
new file mode 100644 (file)
index 0000000..dbc4f23
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+/**
+ * Job for asynchronous rendering of thumbnails.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to 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 for asynchronous rendering of thumbnails.
+ *
+ * @ingroup JobQueue
+ */
+class ThumbnailRenderJob extends Job {
+       public function __construct( $title, $params ) {
+               parent::__construct( 'ThumbnailRender', $title, $params );
+       }
+
+       public function run() {
+               global $wgUploadThumbnailRenderMethod;
+
+               $transformParams = $this->params['transformParams'];
+
+               $file = wfLocalFile( $this->title );
+
+               if ( $file && $file->exists() ) {
+                       if ( $wgUploadThumbnailRenderMethod === 'jobqueue' ) {
+                               $thumb = $file->transform( $transformParams, File::RENDER_NOW );
+
+                               if ( $thumb && !$thumb->isError() ) {
+                                       return true;
+                               } else {
+                                       $this->setLastError( __METHOD__ . ': thumbnail couln\'t be generated' );
+                                       return false;
+                               }
+                       } elseif ( $wgUploadThumbnailRenderMethod === 'http' ) {
+                               $status = $this->hitThumbUrl( $file, $transformParams );
+
+                               wfDebug( __METHOD__ . ": received status {$status}\n" );
+
+                               if ( $status === 200 || $status === 301 || $status === 302 ) {
+                                       return true;
+                               } elseif ( $status ) {
+                                       // Note that this currently happens (500) when requesting sizes larger then or
+                                       // equal to the original, which is harmless.
+                                       $this->setLastError( __METHOD__ . ': incorrect HTTP status ' . $status );
+                                       return false;
+                               } else {
+                                       $this->setLastError( __METHOD__ . ': HTTP request failure' );
+                                       return false;
+                               }
+                       } else {
+                               $this->setLastError( __METHOD__ . ': unknown thumbnail render method ' . $wgUploadThumbnailRenderMethod );
+                               return false;
+                       }
+               } else {
+                       $this->setLastError( __METHOD__ . ': file doesn\'t exist' );
+                       return false;
+               }
+       }
+
+       protected function hitThumbUrl( $file, $transformParams ) {
+               global $wgUploadThumbnailRenderHttpCustomHost, $wgUploadThumbnailRenderHttpCustomDomain;
+
+               $thumbName = $file->thumbName( $transformParams );
+               $thumbUrl = $file->getThumbUrl( $thumbName );
+
+               if ( $wgUploadThumbnailRenderHttpCustomDomain ) {
+                       $parsedUrl = wfParseUrl( $thumbUrl );
+
+                       if ( !$parsedUrl || !isset( $parsedUrl['path'] ) || !strlen( $parsedUrl['path'] ) ) {
+                               return false;
+                       }
+
+                       $thumbUrl = '//' . $wgUploadThumbnailRenderHttpCustomDomain . $parsedUrl['path'];
+               }
+
+               wfDebug( __METHOD__ . ": hitting url {$thumbUrl}\n" );
+
+               $request = MWHttpRequest::factory( $thumbUrl, array(
+                       'method' => 'HEAD',
+                       'followRedirects' => true ) );
+
+               if ( $wgUploadThumbnailRenderHttpCustomHost ) {
+                       $request->setHeader( 'Host', $wgUploadThumbnailRenderHttpCustomHost );
+               }
+
+               $status = $request->execute();
+
+               return $request->getStatus();
+       }
+}
index e45dd3a..f3e5c76 100644 (file)
@@ -54,6 +54,22 @@ class FormatJson {
         */
        const ALL_OK = 3;
 
+       /**
+        * If set, treat json objects '{...}' as associative arrays. Without this option,
+        * json objects will be converted to stdClass.
+        * The value is set to 1 to be backward compatible with 'true' that was used before.
+        *
+        * @since 1.24
+        */
+       const FORCE_ASSOC = 0x100;
+
+       /**
+        * If set, attempts to fix invalid json.
+        *
+        * @since 1.24
+        */
+       const TRY_FIXING = 0x200;
+
        /**
         * Regex that matches whitespace inside empty arrays and objects.
         *
@@ -114,19 +130,89 @@ class FormatJson {
        }
 
        /**
-        * Decodes a JSON string.
+        * Decodes a JSON string. It is recommended to use FormatJson::parse(), which returns more comprehensive
+        * result in case of an error, and has more parsing options.
         *
         * @param string $value The JSON string being decoded
         * @param bool $assoc When true, returned objects will be converted into associative arrays.
         *
         * @return mixed The value encoded in JSON in appropriate PHP type.
-        * `null` is returned if the JSON cannot be decoded or if the encoded data is deeper than
-        * the recursion limit.
+        * `null` is returned if $value represented `null`, if $value could not be decoded,
+        * or if the encoded data was deeper than the recursion limit.
+        * Use FormatJson::parse() to distinguish between types of `null` and to get proper error code.
         */
        public static function decode( $value, $assoc = false ) {
                return json_decode( $value, $assoc );
        }
 
+       /**
+        * Decodes a JSON string.
+        * Unlike FormatJson::decode(), if $value represents null value, it will be properly decoded as valid.
+        *
+        * @param string $value The JSON string being decoded
+        * @param int $options A bit field that allows FORCE_ASSOC, TRY_FIXING
+        * @return Status If valid JSON, the value is available in $result->getValue()
+        */
+       public static function parse( $value, $options = 0 ) {
+               $assoc = ( $options & self::FORCE_ASSOC ) !== 0;
+               $result = json_decode( $value, $assoc );
+               $code = json_last_error();
+
+               if ( $code === JSON_ERROR_SYNTAX && ( $options & self::TRY_FIXING ) !== 0 ) {
+                       // The most common error is the trailing comma in a list or an object.
+                       // We cannot simply replace /,\s*[}\]]/ because it could be inside a string value.
+                       // But we could use the fact that JSON does not allow multi-line string values,
+                       // And remove trailing commas if they are et the end of a line.
+                       // JSON only allows 4 control characters: [ \t\r\n].  So we must not use '\s' for matching.
+                       // Regex match   ,]<any non-quote chars>\n   or   ,\n]   with optional spaces/tabs.
+                       $count = 0;
+                       $value =
+                               preg_replace( '/,([ \t]*[}\]][^"\r\n]*([\r\n]|$)|[ \t]*[\r\n][ \t\r\n]*[}\]])/', '$1',
+                                       $value, - 1, $count );
+                       if ( $count > 0 ) {
+                               $result = json_decode( $value, $assoc );
+                               if ( JSON_ERROR_NONE === json_last_error() ) {
+                                       // Report warning
+                                       $st = Status::newGood( $result );
+                                       $st->warning( wfMessage( 'json-warn-trailing-comma' )->numParams( $count ) );
+                                       return $st;
+                               }
+                       }
+               }
+
+               switch ( $code ) {
+                       case JSON_ERROR_NONE:
+                               return Status::newGood( $result );
+                       default:
+                               return Status::newFatal( wfMessage( 'json-error-unknown' )->numParams( $code ) );
+                       case JSON_ERROR_DEPTH:
+                               $msg = 'json-error-depth';
+                               break;
+                       case JSON_ERROR_STATE_MISMATCH:
+                               $msg = 'json-error-state-mismatch';
+                               break;
+                       case JSON_ERROR_CTRL_CHAR:
+                               $msg = 'json-error-ctrl-char';
+                               break;
+                       case JSON_ERROR_SYNTAX:
+                               $msg = 'json-error-syntax';
+                               break;
+                       case JSON_ERROR_UTF8:
+                               $msg = 'json-error-utf8';
+                               break;
+                       case JSON_ERROR_RECURSION:
+                               $msg = 'json-error-recursion';
+                               break;
+                       case JSON_ERROR_INF_OR_NAN:
+                               $msg = 'json-error-inf-or-nan';
+                               break;
+                       case JSON_ERROR_UNSUPPORTED_TYPE:
+                               $msg = 'json-error-unsupported-type';
+                               break;
+               }
+               return Status::newFatal( $msg );
+       }
+
        /**
         * JSON encoder wrapper for PHP >= 5.4, which supports useful encoding options.
         *
diff --git a/includes/libs/APACHE-LICENSE-2.0.txt b/includes/libs/APACHE-LICENSE-2.0.txt
new file mode 100644 (file)
index 0000000..d645695
--- /dev/null
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
index 30b92c7..e96baec 100644 (file)
@@ -2,20 +2,20 @@
 /**
  * PHP port of CSSJanus.
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright 2008 Google Inc.
+ * Copyright 2010 Roan Kattouw
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
  *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  *
  * @file
  */
  * This is a PHP port of CSSJanus, a utility that transforms CSS style sheets
  * written for LTR to RTL.
  *
- * The original Python version of CSSJanus is Copyright 2008 by Google Inc. and
- * is distributed under the Apache license. This PHP port is Copyright 2010 by
- * Roan Kattouw and is dual-licensed under the GPL (as in the comment above) and
- * the Apache (as in the original code) licenses.
- *
  * Original code: http://code.google.com/p/cssjanus/source/browse/trunk/cssjanus.py
- * License of original code: http://code.google.com/p/cssjanus/source/browse/trunk/LICENSE
- * @author Roan Kattouw
  *
+ * @author Lindsey Simon <elsigh@google.com>
+ * @author Roan Kattouw
  */
 class CSSJanus {
        // Patterns defined as null are built dynamically by buildPatterns()
@@ -60,7 +55,7 @@ class CSSJanus {
                'lookahead_not_letter' => '(?![a-zA-Z])',
                'lookbehind_not_letter' => '(?<![a-zA-Z])',
                'chars_within_selector' => '[^\}]*?',
-               'noflip_annotation' => '\/\*\s*@noflip\s*\*\/',
+               'noflip_annotation' => '\/\*\!?\s*@noflip\s*\*\/',
                'noflip_single' => null,
                'noflip_class' => null,
                'comment' => '/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//',
@@ -88,7 +83,7 @@ class CSSJanus {
         * Build patterns we can't define above because they depend on other patterns.
         */
        private static function buildPatterns() {
-               if ( !is_null( self::$patterns['escape'] ) ) {
+               if (!is_null(self::$patterns['escape'])) {
                        // Patterns have already been built
                        return;
                }
@@ -118,17 +113,17 @@ class CSSJanus {
                $patterns['rtl_in_url'] = "/{$patterns['lookbehind_not_letter']}(rtl){$patterns['lookahead_for_closing_paren']}/i";
                $patterns['cursor_east'] = "/{$patterns['lookbehind_not_letter']}([ns]?)e-resize/";
                $patterns['cursor_west'] = "/{$patterns['lookbehind_not_letter']}([ns]?)w-resize/";
-               $patterns['four_notation_quantity'] = "/(:\s*){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s*[;}])/i";
-               $patterns['four_notation_color'] = "/(-color\s*:\s*){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s*[;}])/i";
-               $patterns['border_radius'] = "/(border-radius\s*:\s*){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s*[;}])/i";
+               $patterns['four_notation_quantity_props'] = "((?:margin|padding|border-width)\s*:\s*)";
+               $patterns['four_notation_quantity'] = "/{$patterns['four_notation_quantity_props']}{$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s*[;}])/i";
+               $patterns['four_notation_color'] = "/((?:-color|border-style)\s*:\s*){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s*[;}])/i";
+               $patterns['border_radius'] = "/(border-radius\s*:\s*)([^;}]*)/";
                $patterns['box_shadow'] = "/(box-shadow\s*:\s*(?:inset\s*)?){$patterns['possibly_negative_quantity']}/i";
                $patterns['text_shadow1'] = "/(text-shadow\s*:\s*){$patterns['color']}(\s*){$patterns['possibly_negative_quantity']}/i";
                $patterns['text_shadow2'] = "/(text-shadow\s*:\s*){$patterns['possibly_negative_quantity']}/i";
-               // The two regexes below are parenthesized differently then in the original implementation to make the
-               // callback's job more straightforward
-               $patterns['bg_horizontal_percentage'] = "/(background(?:-position)?\s*:\s*[^%]*?)(-?{$patterns['num']})(%\s*(?:{$patterns['quantity']}|{$patterns['ident']}))/";
-               $patterns['bg_horizontal_percentage_x'] = "/(background-position-x\s*:\s*)(-?{$patterns['num']})(%)/";
+               $patterns['bg_horizontal_percentage'] = "/(background(?:-position)?\s*:\s*(?:[^:;}\s]+\s+)*?)({$patterns['quantity']})/i";
+               $patterns['bg_horizontal_percentage_x'] = "/(background-position-x\s*:\s*)(-?{$patterns['num']}%)/i";
                // @codingStandardsIgnoreEnd
+
        }
 
        /**
@@ -138,46 +133,46 @@ class CSSJanus {
         * @param $swapLeftRightInURL Boolean: If true, swap 'left' and 'right' in URLs
         * @return string Transformed stylesheet
         */
-       public static function transform( $css, $swapLtrRtlInURL = false, $swapLeftRightInURL = false ) {
+       public static function transform($css, $swapLtrRtlInURL = false, $swapLeftRightInURL = false) {
                // We wrap tokens in ` , not ~ like the original implementation does.
                // This was done because ` is not a legal character in CSS and can only
                // occur in URLs, where we escape it to %60 before inserting our tokens.
-               $css = str_replace( '`', '%60', $css );
+               $css = str_replace('`', '%60', $css);
 
                self::buildPatterns();
 
                // Tokenize single line rules with /* @noflip */
-               $noFlipSingle = new CSSJanusTokenizer( self::$patterns['noflip_single'], '`NOFLIP_SINGLE`' );
-               $css = $noFlipSingle->tokenize( $css );
+               $noFlipSingle = new CSSJanusTokenizer(self::$patterns['noflip_single'], '`NOFLIP_SINGLE`');
+               $css = $noFlipSingle->tokenize($css);
 
                // Tokenize class rules with /* @noflip */
-               $noFlipClass = new CSSJanusTokenizer( self::$patterns['noflip_class'], '`NOFLIP_CLASS`' );
-               $css = $noFlipClass->tokenize( $css );
+               $noFlipClass = new CSSJanusTokenizer(self::$patterns['noflip_class'], '`NOFLIP_CLASS`');
+               $css = $noFlipClass->tokenize($css);
 
                // Tokenize comments
-               $comments = new CSSJanusTokenizer( self::$patterns['comment'], '`C`' );
-               $css = $comments->tokenize( $css );
+               $comments = new CSSJanusTokenizer(self::$patterns['comment'], '`C`');
+               $css = $comments->tokenize($css);
 
                // LTR->RTL fixes start here
-               $css = self::fixDirection( $css );
-               if ( $swapLtrRtlInURL ) {
-                       $css = self::fixLtrRtlInURL( $css );
+               $css = self::fixDirection($css);
+               if ($swapLtrRtlInURL) {
+                       $css = self::fixLtrRtlInURL($css);
                }
 
-               if ( $swapLeftRightInURL ) {
-                       $css = self::fixLeftRightInURL( $css );
+               if ($swapLeftRightInURL) {
+                       $css = self::fixLeftRightInURL($css);
                }
-               $css = self::fixLeftAndRight( $css );
-               $css = self::fixCursorProperties( $css );
-               $css = self::fixFourPartNotation( $css );
-               $css = self::fixBorderRadius( $css );
-               $css = self::fixBackgroundPosition( $css );
-               $css = self::fixShadows( $css );
+               $css = self::fixLeftAndRight($css);
+               $css = self::fixCursorProperties($css);
+               $css = self::fixFourPartNotation($css);
+               $css = self::fixBorderRadius($css);
+               $css = self::fixBackgroundPosition($css);
+               $css = self::fixShadows($css);
 
                // Detokenize stuff we tokenized before
-               $css = $comments->detokenize( $css );
-               $css = $noFlipClass->detokenize( $css );
-               $css = $noFlipSingle->detokenize( $css );
+               $css = $comments->detokenize($css);
+               $css = $noFlipClass->detokenize($css);
+               $css = $noFlipSingle->detokenize($css);
 
                return $css;
        }
@@ -189,16 +184,19 @@ class CSSJanus {
         * and misses "body\n{\ndirection:ltr;\n}". This function does not have
         * these problems.
         *
-        * See http://code.google.com/p/cssjanus/issues/detail?id=15 and
-        * TODO: URL
+        * See https://code.google.com/p/cssjanus/issues/detail?id=15
+        *
         * @param $css string
         * @return string
         */
-       private static function fixDirection( $css ) {
-               $css = preg_replace( self::$patterns['direction_ltr'],
-                       '$1' . self::$patterns['tmpToken'], $css );
-               $css = preg_replace( self::$patterns['direction_rtl'], '$1ltr', $css );
-               $css = str_replace( self::$patterns['tmpToken'], 'rtl', $css );
+       private static function fixDirection($css) {
+               $css = preg_replace(
+                       self::$patterns['direction_ltr'],
+                       '$1' . self::$patterns['tmpToken'],
+                       $css
+               );
+               $css = preg_replace(self::$patterns['direction_rtl'], '$1ltr', $css);
+               $css = str_replace(self::$patterns['tmpToken'], 'rtl', $css);
 
                return $css;
        }
@@ -208,10 +206,10 @@ class CSSJanus {
         * @param $css string
         * @return string
         */
-       private static function fixLtrRtlInURL( $css ) {
-               $css = preg_replace( self::$patterns['ltr_in_url'], self::$patterns['tmpToken'], $css );
-               $css = preg_replace( self::$patterns['rtl_in_url'], 'ltr', $css );
-               $css = str_replace( self::$patterns['tmpToken'], 'rtl', $css );
+       private static function fixLtrRtlInURL($css) {
+               $css = preg_replace(self::$patterns['ltr_in_url'], self::$patterns['tmpToken'], $css);
+               $css = preg_replace(self::$patterns['rtl_in_url'], 'ltr', $css);
+               $css = str_replace(self::$patterns['tmpToken'], 'rtl', $css);
 
                return $css;
        }
@@ -221,10 +219,10 @@ class CSSJanus {
         * @param $css string
         * @return string
         */
-       private static function fixLeftRightInURL( $css ) {
-               $css = preg_replace( self::$patterns['left_in_url'], self::$patterns['tmpToken'], $css );
-               $css = preg_replace( self::$patterns['right_in_url'], 'left', $css );
-               $css = str_replace( self::$patterns['tmpToken'], 'right', $css );
+       private static function fixLeftRightInURL($css) {
+               $css = preg_replace(self::$patterns['left_in_url'], self::$patterns['tmpToken'], $css);
+               $css = preg_replace(self::$patterns['right_in_url'], 'left', $css);
+               $css = str_replace(self::$patterns['tmpToken'], 'right', $css);
 
                return $css;
        }
@@ -234,10 +232,10 @@ class CSSJanus {
         * @param $css string
         * @return string
         */
-       private static function fixLeftAndRight( $css ) {
-               $css = preg_replace( self::$patterns['left'], self::$patterns['tmpToken'], $css );
-               $css = preg_replace( self::$patterns['right'], 'left', $css );
-               $css = str_replace( self::$patterns['tmpToken'], 'right', $css );
+       private static function fixLeftAndRight($css) {
+               $css = preg_replace(self::$patterns['left'], self::$patterns['tmpToken'], $css);
+               $css = preg_replace(self::$patterns['right'], 'left', $css);
+               $css = str_replace(self::$patterns['tmpToken'], 'right', $css);
 
                return $css;
        }
@@ -247,11 +245,14 @@ class CSSJanus {
         * @param $css string
         * @return string
         */
-       private static function fixCursorProperties( $css ) {
-               $css = preg_replace( self::$patterns['cursor_east'],
-                       '$1' . self::$patterns['tmpToken'], $css );
-               $css = preg_replace( self::$patterns['cursor_west'], '$1e-resize', $css );
-               $css = str_replace( self::$patterns['tmpToken'], 'w-resize', $css );
+       private static function fixCursorProperties($css) {
+               $css = preg_replace(
+                       self::$patterns['cursor_east'],
+                       '$1' . self::$patterns['tmpToken'],
+                       $css
+               );
+               $css = preg_replace(self::$patterns['cursor_west'], '$1e-resize', $css);
+               $css = str_replace(self::$patterns['tmpToken'], 'w-resize', $css);
 
                return $css;
        }
@@ -264,28 +265,38 @@ class CSSJanus {
         * the bug where whitespace is not preserved when flipping four-part rules
         * and four-part color rules with multiple whitespace characters between
         * colors are not recognized.
-        * See http://code.google.com/p/cssjanus/issues/detail?id=16
+        * See https://code.google.com/p/cssjanus/issues/detail?id=16
         * @param $css string
         * @return string
         */
-       private static function fixFourPartNotation( $css ) {
-               $css = preg_replace( self::$patterns['four_notation_quantity'], '$1$2$3$8$5$6$7$4$9', $css );
-               $css = preg_replace( self::$patterns['four_notation_color'], '$1$2$3$8$5$6$7$4$9', $css );
+       private static function fixFourPartNotation($css) {
+               $css = preg_replace(self::$patterns['four_notation_quantity'], '$1$2$3$8$5$6$7$4$9', $css);
+               $css = preg_replace(self::$patterns['four_notation_color'], '$1$2$3$8$5$6$7$4$9', $css);
                return $css;
        }
 
        /**
-        * Swaps appropriate corners in four-part border-radius rules.
-        * Needs to undo the effect of fixFourPartNotation() on those rules, too.
+        * Swaps appropriate corners in border-radius values.
         *
         * @param $css string
         * @return string
         */
-       private static function fixBorderRadius( $css ) {
-               // Undo four_notation_quantity
-               $css = preg_replace( self::$patterns['border_radius'], '$1$2$3$8$5$6$7$4$9', $css );
-               // Do the real thing
-               $css = preg_replace( self::$patterns['border_radius'], '$1$4$3$2$5$8$7$6$9', $css );
+       private static function fixBorderRadius($css) {
+               $css = preg_replace_callback(self::$patterns['border_radius'], function ($matches) {
+                       $pre = $matches[1];
+                       $values = $matches[2];
+                       $numValues = count(preg_split('/\s+/', trim($values)));
+                       switch ($numValues) {
+                               case 4:
+                                       $values = preg_replace('/^(\S+)(\s*)(\S+)(\s*)(\S+)(\s*)(\S+)/', '$3$2$1$4$7$6$5', $values);
+                                       break;
+                               case 3:
+                               case 2:
+                                       $values = preg_replace('/^(\S+)(\s*)(\S+)/', '$3$2$1', $values);
+                                       break;
+                       }
+                       return $pre . $values;
+               }, $css);
 
                return $css;
        }
@@ -296,42 +307,31 @@ class CSSJanus {
         * @param $css string
         * @return string
         */
-       private static function fixShadows( $css ) {
+       private static function fixShadows($css) {
                // Flips the sign of a CSS value, possibly with a unit.
                // (We can't just negate the value with unary minus due to the units.)
-               $flipSign = function ( $cssValue ) {
+               $flipSign = function ($cssValue) {
                        // Don't mangle zeroes
-                       if ( floatval( $cssValue ) === 0.0 ) {
+                       if (floatval($cssValue) === 0.0) {
                                return $cssValue;
-                       } elseif ( $cssValue[0] === '-' ) {
-                               return substr( $cssValue, 1 );
+                       } elseif ($cssValue[0] === '-') {
+                               return substr($cssValue, 1);
                        } else {
                                return "-" . $cssValue;
                        }
                };
 
-               $css = preg_replace_callback(
-                       self::$patterns['box_shadow'], function ( $matches ) use ( $flipSign ) {
-                               return $matches[1] . $flipSign( $matches[2] );
-                       },
-                       $css
-               );
+               $css = preg_replace_callback(self::$patterns['box_shadow'], function ($matches) use ($flipSign) {
+                       return $matches[1] . $flipSign($matches[2]);
+               }, $css);
 
-               $css = preg_replace_callback(
-                       self::$patterns['text_shadow1'],
-                       function ( $matches ) use ( $flipSign ) {
-                               return $matches[1] . $matches[2] . $matches[3] . $flipSign( $matches[4] );
-                       },
-                       $css
-               );
+               $css = preg_replace_callback(self::$patterns['text_shadow1'], function ($matches) use ($flipSign) {
+                       return $matches[1] . $matches[2] . $matches[3] . $flipSign($matches[4]);
+               }, $css);
 
-               $css = preg_replace_callback(
-                       self::$patterns['text_shadow2'],
-                       function ( $matches ) use ( $flipSign ) {
-                               return $matches[1] . $flipSign( $matches[2] );
-                       },
-                       $css
-               );
+               $css = preg_replace_callback(self::$patterns['text_shadow2'], function ($matches) use ($flipSign) {
+                       return $matches[1] . $flipSign($matches[2]);
+               }, $css);
 
                return $css;
        }
@@ -341,16 +341,22 @@ class CSSJanus {
         * @param $css string
         * @return string
         */
-       private static function fixBackgroundPosition( $css ) {
-               $replaced = preg_replace_callback( self::$patterns['bg_horizontal_percentage'],
-                       array( 'self', 'calculateNewBackgroundPosition' ), $css );
-               if ( $replaced !== null ) {
-                       // Check for null; sometimes preg_replace_callback() returns null here for some weird reason
+       private static function fixBackgroundPosition($css) {
+               $replaced = preg_replace_callback(
+                       self::$patterns['bg_horizontal_percentage'],
+                       array('self', 'calculateNewBackgroundPosition'),
+                       $css
+               );
+               if ($replaced !== null) {
+                       // preg_replace_callback() sometimes returns null
                        $css = $replaced;
                }
-               $replaced = preg_replace_callback( self::$patterns['bg_horizontal_percentage_x'],
-                       array( 'self', 'calculateNewBackgroundPosition' ), $css );
-               if ( $replaced !== null ) {
+               $replaced = preg_replace_callback(
+                       self::$patterns['bg_horizontal_percentage_x'],
+                       array('self', 'calculateNewBackgroundPosition'),
+                       $css
+               );
+               if ($replaced !== null) {
                        $css = $replaced;
                }
 
@@ -358,12 +364,22 @@ class CSSJanus {
        }
 
        /**
-        * Callback for calculateNewBackgroundPosition()
+        * Callback for fixBackgroundPosition()
         * @param $matches array
         * @return string
         */
-       private static function calculateNewBackgroundPosition( $matches ) {
-               return $matches[1] . ( 100 - $matches[2] ) . $matches[3];
+       private static function calculateNewBackgroundPosition($matches) {
+               $value = $matches[2];
+               if (substr($value, -1) === '%') {
+                       $idx = strpos($value, '.');
+                       if ($idx !== false) {
+                               $len = strlen($value) - $idx - 2;
+                               $value = number_format(100 - $value, $len) . '%';
+                       } else {
+                               $value = (100 - $value) . '%';
+                       }
+               }
+               return $matches[1] . $value;
        }
 }
 
@@ -373,7 +389,8 @@ class CSSJanus {
  * @author Roan Kattouw
  */
 class CSSJanusTokenizer {
-       private $regex, $token;
+       private $regex;
+       private $token;
        private $originals;
 
        /**
@@ -381,7 +398,7 @@ class CSSJanusTokenizer {
         * @param string $regex Regular expression whose matches to replace by a token.
         * @param string $token Token
         */
-       public function __construct( $regex, $token ) {
+       public function __construct($regex, $token) {
                $this->regex = $regex;
                $this->token = $token;
                $this->originals = array();
@@ -393,15 +410,15 @@ class CSSJanusTokenizer {
         * @param string $str to tokenize
         * @return string Tokenized string
         */
-       public function tokenize( $str ) {
-               return preg_replace_callback( $this->regex, array( $this, 'tokenizeCallback' ), $str );
+       public function tokenize($str) {
+               return preg_replace_callback($this->regex, array($this, 'tokenizeCallback'), $str);
        }
 
        /**
         * @param $matches array
         * @return string
         */
-       private function tokenizeCallback( $matches ) {
+       private function tokenizeCallback($matches) {
                $this->originals[] = $matches[0];
                return $this->token;
        }
@@ -412,21 +429,24 @@ class CSSJanusTokenizer {
         * @param string $str previously run through tokenize()
         * @return string Original string
         */
-       public function detokenize( $str ) {
+       public function detokenize($str) {
                // PHP has no function to replace only the first occurrence or to
                // replace occurrences of the same string with different values,
                // so we use preg_replace_callback() even though we don't really need a regex
-               return preg_replace_callback( '/' . preg_quote( $this->token, '/' ) . '/',
-                       array( $this, 'detokenizeCallback' ), $str );
+               return preg_replace_callback(
+                       '/' . preg_quote($this->token, '/') . '/',
+                       array($this, 'detokenizeCallback'),
+                       $str
+               );
        }
 
        /**
         * @param $matches
         * @return mixed
         */
-       private function detokenizeCallback( $matches ) {
-               $retval = current( $this->originals );
-               next( $this->originals );
+       private function detokenizeCallback($matches) {
+               $retval = current($this->originals);
+               next($this->originals);
 
                return $retval;
        }
index 4e2ca83..6eb5258 100644 (file)
@@ -38,6 +38,7 @@ class CSSMin {
         * which when base64 encoded will result in a 1/3 increase in size.
         */
        const EMBED_SIZE_LIMIT = 24576;
+       const DATA_URI_SIZE_LIMIT = 32768;
        const URL_REGEX = 'url\(\s*[\'"]?(?P<file>[^\?\)\'"]*?)(?P<query>\?[^\)\'"]*?|)[\'"]?\s*\)';
        const EMBED_REGEX = '\/\*\s*\@embed\s*\*\/';
        const COMMENT_REGEX = '\/\*.*?\*\/';
@@ -100,10 +101,11 @@ class CSSMin {
        }
 
        /**
-        * Encode an image file as a base64 data URI.
-        * If the image file has a suitable MIME type and size, encode it as a
-        * base64 data URI. Return false if the image type is unfamiliar or exceeds
-        * the size limit.
+        * Encode an image file as a data URI.
+        *
+        * If the image file has a suitable MIME type and size, encode it as a data URI, base64-encoded
+        * for binary files or just percent-encoded otherwise. Return false if the image type is
+        * unfamiliar or file exceeds the size limit.
         *
         * @param string $file Image file to encode.
         * @param string|null $type File's MIME type or null. If null, CSSMin will
@@ -111,7 +113,7 @@ class CSSMin {
         * @param int|bool $sizeLimit If the size of the target file is greater than
         *     this value, decline to encode the image file and return false
         *     instead. If $sizeLimit is false, no limit is enforced.
-        * @return string|bool: Image contents encoded as a data URI or false.
+        * @return string|bool Image contents encoded as a data URI or false.
         */
        public static function encodeImageAsDataURI( $file, $type = null,
                $sizeLimit = self::EMBED_SIZE_LIMIT
@@ -125,8 +127,23 @@ class CSSMin {
                if ( !$type ) {
                        return false;
                }
-               $data = base64_encode( file_get_contents( $file ) );
-               return 'data:' . $type . ';base64,' . $data;
+
+               $contents = file_get_contents( $file );
+               // Only whitespace and printable ASCII characters
+               $isText = (bool)preg_match( '/^[\r\n\t\x20-\x7e]+$/', $contents );
+
+               if ( $isText ) {
+                       // Do not base64-encode non-binary files (sane SVGs), unless that'd exceed URI length limit.
+                       // (This often produces longer URLs, but they compress better, yielding a net smaller size.)
+                       $uri = 'data:' . $type . ',' . rawurlencode( $contents );
+                       if ( strlen( $uri ) >= self::DATA_URI_SIZE_LIMIT ) {
+                               $uri = 'data:' . $type . ';base64,' . base64_encode( $contents );
+                       }
+               } else {
+                       $uri = 'data:' . $type . ';base64,' . base64_encode( $contents );
+               }
+
+               return $uri;
        }
 
        /**
@@ -135,27 +152,21 @@ class CSSMin {
         */
        public static function getMimeType( $file ) {
                $realpath = realpath( $file );
-               // Try a couple of different ways to get the MIME-type of a file, in order of
-               // preference
                if (
                        $realpath
                        && function_exists( 'finfo_file' )
                        && function_exists( 'finfo_open' )
                        && defined( 'FILEINFO_MIME_TYPE' )
                ) {
-                       // As of PHP 5.3, this is how you get the MIME-type of a file; it uses the Fileinfo
-                       // PECL extension
                        return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath );
-               } elseif ( function_exists( 'mime_content_type' ) ) {
-                       // Before this was deprecated in PHP 5.3, this was how you got the MIME-type of a file
-                       return mime_content_type( $file );
-               } else {
-                       // Worst-case scenario has happened, use the file extension to infer the MIME-type
-                       $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) );
-                       if ( isset( self::$mimeTypes[$ext] ) ) {
-                               return self::$mimeTypes[$ext];
-                       }
                }
+
+               // Infer the MIME-type from the file extension
+               $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) );
+               if ( isset( self::$mimeTypes[$ext] ) ) {
+                       return self::$mimeTypes[$ext];
+               }
+
                return false;
        }
 
@@ -206,10 +217,9 @@ class CSSMin {
                        $remote = substr( $remote, 0, -1 );
                }
 
-               // Replace all comments by a placeholder so they will not interfere
-               // with the remapping
-               // Warning: This will also catch on anything looking like the start of
-               // a comment between quotation marks (e.g. "foo /* bar").
+               // Replace all comments by a placeholder so they will not interfere with the remapping.
+               // Warning: This will also catch on anything looking like the start of a comment between
+               // quotation marks (e.g. "foo /* bar").
                $comments = array();
                $placeholder = uniqid( '', true );
 
@@ -232,12 +242,13 @@ class CSSMin {
 
                $source = preg_replace_callback(
                        $pattern,
-                       function ( $matchOuter ) use ( $local, $remote, $embedData ) {
+                       function ( $matchOuter ) use ( $local, $remote, $embedData, $placeholder ) {
                                $rule = $matchOuter[0];
 
-                               // Check for global @embed comment and remove it
+                               // 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::EMBED_REGEX . '\s*/', '$1', $rule, 1, $embedAll );
+                               $rule = preg_replace( '/^((?:\s+|' . $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).
@@ -254,9 +265,12 @@ class CSSMin {
                                );
 
                                if ( $embedData ) {
+                                       // Remember the occurring MIME types to avoid fallbacks when embedding some files.
+                                       $mimeTypes = array();
+
                                        $ruleWithEmbedded = preg_replace_callback(
                                                $pattern,
-                                               function ( $match ) use ( $embedAll, $local, $remote ) {
+                                               function ( $match ) use ( $embedAll, $local, $remote, &$mimeTypes ) {
                                                        $embed = $embedAll || $match['embed'];
                                                        $embedded = CSSMin::remapOne(
                                                                $match['file'],
@@ -266,21 +280,35 @@ class CSSMin {
                                                                $embed
                                                        );
 
+                                                       $url = $match['file'] . $match['query'];
+                                                       $file = $local . $match['file'];
+                                                       if (
+                                                               !CSSMin::isRemoteUrl( $url ) && !CSSMin::isLocalUrl( $url )
+                                                               && file_exists( $file )
+                                                       ) {
+                                                               $mimeTypes[ CSSMin::getMimeType( $file ) ] = true;
+                                                       }
+
                                                        return CSSMin::buildUrlValue( $embedded );
                                                },
                                                $rule
                                        );
+
+                                       // Are all referenced images SVGs?
+                                       $needsEmbedFallback = $mimeTypes !== array( 'image/svg+xml' => true );
                                }
 
-                               if ( $embedData && $ruleWithEmbedded !== $ruleWithRemapped ) {
-                                       // Build 2 CSS properties; one which uses a base64 encoded data URI in place
-                                       // of the @embed comment to try and retain line-number integrity, and the
-                                       // other with a remapped an versioned URL and an Internet Explorer hack
+                               if ( !$embedData || $ruleWithEmbedded === $ruleWithRemapped ) {
+                                       // We're not embedding anything, or we tried to but the file is not embeddable
+                                       return $ruleWithRemapped;
+                               } elseif ( $embedData && $needsEmbedFallback ) {
+                                       // Build 2 CSS properties; one which uses a data URI in place of the @embed comment, and
+                                       // the other with a remapped and versioned URL with an Internet Explorer 6 and 7 hack
                                        // making it ignored in all browsers that support data URIs
                                        return "$ruleWithEmbedded;$ruleWithRemapped!ie";
                                } else {
-                                       // No reason to repeat twice
-                                       return $ruleWithRemapped;
+                                       // Look ma, no fallbacks! This is for files which IE 6 and 7 don't support anyway: SVG.
+                                       return $ruleWithEmbedded;
                                }
                        }, $source );
 
@@ -294,6 +322,34 @@ class CSSMin {
 
        }
 
+       /**
+        * Is this CSS rule referencing a remote URL?
+        *
+        * @private Until we require PHP 5.5 and we can access self:: from closures.
+        * @param string $maybeUrl
+        * @return bool
+        */
+       public static function isRemoteUrl( $maybeUrl ) {
+               if ( substr( $maybeUrl, 0, 2 ) === '//' || parse_url( $maybeUrl, PHP_URL_SCHEME ) ) {
+                       return true;
+               }
+               return false;
+       }
+
+       /**
+        * Is this CSS rule referencing a local URL?
+        *
+        * @private Until we require PHP 5.5 and we can access self:: from closures.
+        * @param string $maybeUrl
+        * @return bool
+        */
+       public static function isLocalUrl( $maybeUrl ) {
+               if ( !self::isRemoteUrl( $maybeUrl ) && $maybeUrl !== '' && $maybeUrl[0] === '/' ) {
+                       return true;
+               }
+               return false;
+       }
+
        /**
         * Remap or embed a CSS URL path.
         *
@@ -308,22 +364,16 @@ class CSSMin {
                // The full URL possibly with query, as passed to the 'url()' value in CSS
                $url = $file . $query;
 
-               // Skip fully-qualified and protocol-relative URLs and data URIs
-               if ( substr( $url, 0, 2 ) === '//' || parse_url( $url, PHP_URL_SCHEME ) ) {
-                       return $url;
+               // Expand local URLs with absolute paths like /w/index.php to possibly protocol-relative URL, if
+               // wfExpandUrl() is available. (This will not be the case if we're running outside of MW.)
+               if ( self::isLocalUrl( $url ) && function_exists( 'wfExpandUrl' ) ) {
+                       return wfExpandUrl( $url, PROTO_RELATIVE );
                }
 
-               // URLs with absolute paths like /w/index.php need to be expanded
-               // to absolute URLs but otherwise left alone
-               if ( $url !== '' && $url[0] === '/' ) {
-                       // Replace the file path with an expanded (possibly protocol-relative) URL
-                       // ...but only if wfExpandUrl() is even available.
-                       // This will not be the case if we're running outside of MW
-                       if ( function_exists( 'wfExpandUrl' ) ) {
-                               return wfExpandUrl( $url, PROTO_RELATIVE );
-                       } else {
-                               return $url;
-                       }
+               // Pass thru fully-qualified and protocol-relative URLs and data URIs, as well as local URLs if
+               // we can't expand them.
+               if ( self::isRemoteUrl( $url ) || self::isLocalUrl( $url ) ) {
+                       return $url;
                }
 
                if ( $local === false ) {
index f988207..ce97142 100644 (file)
@@ -61,7 +61,7 @@ class ProcessCacheLRU {
                        unset( $this->cacheTimes[$evictKey] );
                }
                $this->cache[$key][$prop] = $value;
-               $this->cacheTimes[$key][$prop] = time();
+               $this->cacheTimes[$key][$prop] = microtime( true );
        }
 
        /**
@@ -69,12 +69,13 @@ class ProcessCacheLRU {
         *
         * @param $key string
         * @param $prop string
-        * @param $maxAge integer Ignore items older than this many seconds (since 1.21)
+        * @param $maxAge float Ignore items older than this many seconds (since 1.21)
         * @return bool
         */
-       public function has( $key, $prop, $maxAge = 0 ) {
+       public function has( $key, $prop, $maxAge = 0.0 ) {
                if ( isset( $this->cache[$key][$prop] ) ) {
-                       return ( $maxAge <= 0 || ( time() - $this->cacheTimes[$key][$prop] ) <= $maxAge );
+                       return ( $maxAge <= 0 ||
+                               ( microtime( true ) - $this->cacheTimes[$key][$prop] ) <= $maxAge );
                }
 
                return false;
@@ -121,6 +122,7 @@ class ProcessCacheLRU {
         *
         * @param $maxKeys integer
         * @return void
+        * @throws UnexpectedValueException
         */
        public function resize( $maxKeys ) {
                if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
index eb98a4a..aca857e 100644 (file)
@@ -39,6 +39,23 @@ class XmlTypeCheck {
         */
        public $rootElement = '';
 
+       /**
+        * A stack of strings containing the data of each xml element as it's processed. Append
+        * data to the top string of the stack, then pop off the string and process it when the
+        * element is closed.
+        */
+       protected $elementData = array();
+
+       /**
+        * A stack of element names and attributes, as we process them.
+        */
+       protected $elementDataContext = array();
+
+       /**
+        * Current depth of the data stack.
+        */
+       protected $stackDepth = 0;
+
        /**
         * Additional parsing options
         */
@@ -51,7 +68,7 @@ class XmlTypeCheck {
         * @param callable $filterCallback (optional)
         *        Function to call to do additional custom validity checks from the
         *        SAX element handler event. This gives you access to the element
-        *        namespace, name, and attributes, but not to text contents.
+        *        namespace, name, attributes, and text contents.
         *        Filter should return 'true' to toggle on $this->filterMatch
         * @param boolean $isFile (optional) indicates if the first parameter is a
         *        filename (default, true) or if it is a string (false)
@@ -179,7 +196,12 @@ class XmlTypeCheck {
                $this->rootElement = $name;
 
                if ( is_callable( $this->filterCallback ) ) {
-                       xml_set_element_handler( $parser, array( $this, 'elementOpen' ), false );
+                       xml_set_element_handler(
+                               $parser,
+                               array( $this, 'elementOpen' ),
+                               array( $this, 'elementClose' )
+                       );
+                       xml_set_character_data_handler( $parser, array( $this, 'elementData' ) );
                        $this->elementOpen( $parser, $name, $attribs );
                } else {
                        // We only need the first open element
@@ -193,12 +215,41 @@ class XmlTypeCheck {
         * @param $attribs
         */
        private function elementOpen( $parser, $name, $attribs ) {
-               if ( call_user_func( $this->filterCallback, $name, $attribs ) ) {
+               $this->elementDataContext[] = array( $name, $attribs );
+               $this->elementData[] = '';
+               $this->stackDepth++;
+       }
+
+       /**
+        * @param $parser
+        * @param $name
+        */
+       private function elementClose( $parser, $name ) {
+               list( $name, $attribs ) = array_pop( $this->elementDataContext );
+               $data = array_pop( $this->elementData );
+               $this->stackDepth--;
+
+               if ( call_user_func(
+                       $this->filterCallback,
+                       $name,
+                       $attribs,
+                       $data
+               ) ) {
                        // Filter hit!
                        $this->filterMatch = true;
                }
        }
 
+       /**
+        * @param $parser
+        * @param $data
+        */
+       private function elementData( $parser, $data ) {
+               // xml_set_character_data_handler breaks the data on & characters, so
+               // we collect any data here, and we'll run the callback in elementClose
+               $this->elementData[ $this->stackDepth - 1 ] .= trim( $data );
+       }
+
        /**
         * @param $parser
         * @param $target
index bebe3a9..46c5515 100644 (file)
@@ -533,6 +533,10 @@ class ManualLogEntry extends LogEntryBase {
                        $dbw->insert( 'log_search', $rows, __METHOD__, 'IGNORE' );
                }
 
+               // Update any bloom filter cache
+               $member = $this->getTarget()->getNamespace() . ':' . $this->getTarget()->getDBkey();
+               BloomCache::get( 'main' )->insert( wfWikiId(), 'TitleHasLogs', $member );
+
                return $this->id;
        }
 
index 4dc25ef..70f1f1a 100644 (file)
@@ -57,17 +57,6 @@ class LogEventsList extends ContextSource {
                $this->flags = $flags;
        }
 
-       /**
-        * Deprecated alias for getTitle(); do not use.
-        *
-        * @deprecated since 1.20; use getTitle() instead.
-        * @return Title
-        */
-       public function getDisplayTitle() {
-               wfDeprecated( __METHOD__, '1.20' );
-               return $this->getTitle();
-       }
-
        /**
         * Show options for the log list
         *
@@ -234,7 +223,8 @@ class LogEventsList extends ContextSource {
                        'user',
                        'mw-log-user',
                        15,
-                       $user
+                       $user,
+                       array( 'class' => 'mw-autocomplete-user' )
                );
 
                return '<span style="white-space: nowrap">' . $label . '</span>';
index 92985f3..48a565f 100644 (file)
@@ -805,7 +805,8 @@ class LegacyLogFormatter extends LogFormatter {
                                array(
                                        'target' => $params[3],
                                        'dest' => $title->getPrefixedDBkey(),
-                                       'mergepoint' => $params[4]
+                                       'mergepoint' => $params[4],
+                                       'submitted' => 1 // show the revisions immediately
                                )
                        );
 
index be7931d..b0b23ba 100644 (file)
@@ -184,6 +184,7 @@ class LogPage {
 
        /**
         * Get the comment from the last addEntry() call
+        * @return string
         */
        public function getComment() {
                return $this->comment;
@@ -370,26 +371,6 @@ class LogPage {
                }
 
                switch ( $type ) {
-                       case 'move':
-                               $titleLink = Linker::link(
-                                       $title,
-                                       htmlspecialchars( $title->getPrefixedText() ),
-                                       array(),
-                                       array( 'redirect' => 'no' )
-                               );
-
-                               $targetTitle = Title::newFromText( $params[0] );
-
-                               if ( !$targetTitle ) {
-                                       # Workaround for broken database
-                                       $params[0] = htmlspecialchars( $params[0] );
-                               } else {
-                                       $params[0] = Linker::link(
-                                               $targetTitle,
-                                               htmlspecialchars( $params[0] )
-                                       );
-                               }
-                               break;
                        case 'block':
                                if ( substr( $title->getText(), 0, 1 ) == '#' ) {
                                        $titleLink = $title->getText();
index 3913016..35da113 100644 (file)
@@ -37,8 +37,9 @@ class MoveLogFormatter extends LogFormatter {
 
        protected function getMessageKey() {
                $key = parent::getMessageKey();
-               $params = $this->getMessageParameters();
+               $params = $this->extractParameters();
                if ( isset( $params[4] ) && $params[4] === '1' ) {
+                       // Messages: logentry-move-move-noredirect, logentry-move-move_redir-noredirect
                        $key .= '-noredirect';
                }
 
@@ -51,6 +52,7 @@ class MoveLogFormatter extends LogFormatter {
                $newname = $this->makePageLink( Title::newFromText( $params[3] ) );
                $params[2] = Message::rawParam( $oldname );
                $params[3] = Message::rawParam( $newname );
+               unset( $params[4] ); // handled in getMessageKey
 
                return $params;
        }
diff --git a/includes/mail/EmailNotification.php b/includes/mail/EmailNotification.php
new file mode 100644 (file)
index 0000000..8215403
--- /dev/null
@@ -0,0 +1,512 @@
+<?php
+/**
+ * Classes used to send e-mails
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author <brion@pobox.com>
+ * @author <mail@tgries.de>
+ * @author Tim Starling
+ * @author Luke Welling lwelling@wikimedia.org
+ */
+
+/**
+ * This module processes the email notifications when the current page is
+ * changed. It looks up the table watchlist to find out which users are watching
+ * that page.
+ *
+ * The current implementation sends independent emails to each watching user for
+ * the following reason:
+ *
+ * - Each watching user will be notified about the page edit time expressed in
+ * his/her local time (UTC is shown additionally). To achieve this, we need to
+ * find the individual timeoffset of each watching user from the preferences..
+ *
+ * Suggested improvement to slack down the number of sent emails: We could think
+ * of sending out bulk mails (bcc:user1,user2...) for all these users having the
+ * same timeoffset in their preferences.
+ *
+ * Visit the documentation pages under http://meta.wikipedia.com/Enotif
+ */
+class EmailNotification {
+       protected $subject, $body, $replyto, $from;
+       protected $timestamp, $summary, $minorEdit, $oldid, $composed_common, $pageStatus;
+       protected $mailTargets = array();
+
+       /**
+        * @var Title
+        */
+       protected $title;
+
+       /**
+        * @var User
+        */
+       protected $editor;
+
+       /**
+        * @param User $editor The editor that triggered the update.  Their notification
+        *  timestamp will not be updated(they have already seen it)
+        * @param Title $title The title to update timestamps for
+        * @param string $timestamp Set the upate timestamp to this value
+        * @return int[]
+        */
+       public static function updateWatchlistTimestamp( User $editor, Title $title, $timestamp ) {
+               global $wgEnotifWatchlist, $wgShowUpdatedMarker;
+
+               if ( !$wgEnotifWatchlist && !$wgShowUpdatedMarker ) {
+                       return array();
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $res = $dbw->select( array( 'watchlist' ),
+                       array( 'wl_user' ),
+                       array(
+                               'wl_user != ' . intval( $editor->getID() ),
+                               'wl_namespace' => $title->getNamespace(),
+                               'wl_title' => $title->getDBkey(),
+                               'wl_notificationtimestamp IS NULL',
+                       ), __METHOD__
+               );
+
+               $watchers = array();
+               foreach ( $res as $row ) {
+                       $watchers[] = intval( $row->wl_user );
+               }
+
+               if ( $watchers ) {
+                       // Update wl_notificationtimestamp for all watching users except the editor
+                       $fname = __METHOD__;
+                       $dbw->onTransactionIdle(
+                               function () use ( $dbw, $timestamp, $watchers, $title, $fname ) {
+                                       $dbw->update( 'watchlist',
+                                               array( /* SET */
+                                                       'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
+                                               ), array( /* WHERE */
+                                                       'wl_user' => $watchers,
+                                                       'wl_namespace' => $title->getNamespace(),
+                                                       'wl_title' => $title->getDBkey(),
+                                               ), $fname
+                                       );
+                               }
+                       );
+               }
+
+               return $watchers;
+       }
+
+       /**
+        * Send emails corresponding to the user $editor editing the page $title.
+        * Also updates wl_notificationtimestamp.
+        *
+        * May be deferred via the job queue.
+        *
+        * @param User $editor
+        * @param Title $title
+        * @param string $timestamp
+        * @param string $summary
+        * @param bool $minorEdit
+        * @param bool $oldid (default: false)
+        * @param string $pageStatus (default: 'changed')
+        */
+       public function notifyOnPageChange( $editor, $title, $timestamp, $summary,
+               $minorEdit, $oldid = false, $pageStatus = 'changed'
+       ) {
+               global $wgEnotifUseJobQ, $wgEnotifMinorEdits, $wgUsersNotifiedOnAllChanges, $wgEnotifUserTalk;
+
+               if ( $title->getNamespace() < 0 ) {
+                       return;
+               }
+
+               // update wl_notificationtimestamp for watchers
+               $watchers = self::updateWatchlistTimestamp( $editor, $title, $timestamp );
+
+               $sendEmail = true;
+               // 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
+               // $watchers deals with $wgEnotifWatchlist
+               if ( !count( $watchers ) && !count( $wgUsersNotifiedOnAllChanges ) ) {
+                       $sendEmail = false;
+                       // Only send notification for non minor edits, unless $wgEnotifMinorEdits
+                       if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
+                               $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
+                               if ( $wgEnotifUserTalk
+                                       && $isUserTalkPage
+                                       && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
+                               ) {
+                                       $sendEmail = true;
+                               }
+                       }
+               }
+
+               if ( !$sendEmail ) {
+                       return;
+               }
+
+               if ( $wgEnotifUseJobQ ) {
+                       $params = array(
+                               'editor' => $editor->getName(),
+                               'editorID' => $editor->getID(),
+                               'timestamp' => $timestamp,
+                               'summary' => $summary,
+                               'minorEdit' => $minorEdit,
+                               'oldid' => $oldid,
+                               'watchers' => $watchers,
+                               'pageStatus' => $pageStatus
+                       );
+                       $job = new EnotifNotifyJob( $title, $params );
+                       JobQueueGroup::singleton()->push( $job );
+               } else {
+                       $this->actuallyNotifyOnPageChange(
+                               $editor,
+                               $title,
+                               $timestamp,
+                               $summary,
+                               $minorEdit,
+                               $oldid,
+                               $watchers,
+                               $pageStatus
+                       );
+               }
+       }
+
+       /**
+        * Immediate version of notifyOnPageChange().
+        *
+        * Send emails corresponding to the user $editor editing the page $title.
+        * Also updates wl_notificationtimestamp.
+        *
+        * @param User $editor
+        * @param Title $title
+        * @param string $timestamp Edit timestamp
+        * @param string $summary Edit summary
+        * @param bool $minorEdit
+        * @param int $oldid Revision ID
+        * @param array $watchers Array of user IDs
+        * @param string $pageStatus
+        * @throws MWException
+        */
+       public function actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit,
+               $oldid, $watchers, $pageStatus = 'changed' ) {
+               # we use $wgPasswordSender as sender's address
+               global $wgEnotifWatchlist;
+               global $wgEnotifMinorEdits, $wgEnotifUserTalk;
+
+               wfProfileIn( __METHOD__ );
+
+               # The following code is only run, if several conditions are met:
+               # 1. EmailNotification for pages (other than user_talk pages) must be enabled
+               # 2. minor edits (changes) are only regarded if the global flag indicates so
+
+               $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
+
+               $this->title = $title;
+               $this->timestamp = $timestamp;
+               $this->summary = $summary;
+               $this->minorEdit = $minorEdit;
+               $this->oldid = $oldid;
+               $this->editor = $editor;
+               $this->composed_common = false;
+               $this->pageStatus = $pageStatus;
+
+               $formattedPageStatus = array( 'deleted', 'created', 'moved', 'restored', 'changed' );
+
+               wfRunHooks( 'UpdateUserMailerFormattedPageStatus', array( &$formattedPageStatus ) );
+               if ( !in_array( $this->pageStatus, $formattedPageStatus ) ) {
+                       wfProfileOut( __METHOD__ );
+                       throw new MWException( 'Not a valid page status!' );
+               }
+
+               $userTalkId = false;
+
+               if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
+                       if ( $wgEnotifUserTalk
+                               && $isUserTalkPage
+                               && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
+                       ) {
+                               $targetUser = User::newFromName( $title->getText() );
+                               $this->compose( $targetUser );
+                               $userTalkId = $targetUser->getId();
+                       }
+
+                       if ( $wgEnotifWatchlist ) {
+                               // Send updates to watchers other than the current editor
+                               $userArray = UserArray::newFromIDs( $watchers );
+                               foreach ( $userArray as $watchingUser ) {
+                                       if ( $watchingUser->getOption( 'enotifwatchlistpages' )
+                                               && ( !$minorEdit || $watchingUser->getOption( 'enotifminoredits' ) )
+                                               && $watchingUser->isEmailConfirmed()
+                                               && $watchingUser->getID() != $userTalkId
+                                       ) {
+                                               if ( wfRunHooks( 'SendWatchlistEmailNotification', array( $watchingUser, $title, $this ) ) ) {
+                                                       $this->compose( $watchingUser );
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               global $wgUsersNotifiedOnAllChanges;
+               foreach ( $wgUsersNotifiedOnAllChanges as $name ) {
+                       if ( $editor->getName() == $name ) {
+                               // No point notifying the user that actually made the change!
+                               continue;
+                       }
+                       $user = User::newFromName( $name );
+                       $this->compose( $user );
+               }
+
+               $this->sendMails();
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * @param User $editor
+        * @param Title $title
+        * @param bool $minorEdit
+        * @return bool
+        */
+       private function canSendUserTalkEmail( $editor, $title, $minorEdit ) {
+               global $wgEnotifUserTalk;
+               $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
+
+               if ( $wgEnotifUserTalk && $isUserTalkPage ) {
+                       $targetUser = User::newFromName( $title->getText() );
+
+                       if ( !$targetUser || $targetUser->isAnon() ) {
+                               wfDebug( __METHOD__ . ": user talk page edited, but user does not exist\n" );
+                       } elseif ( $targetUser->getId() == $editor->getId() ) {
+                               wfDebug( __METHOD__ . ": user edited their own talk page, no notification sent\n" );
+                       } elseif ( $targetUser->getOption( 'enotifusertalkpages' )
+                               && ( !$minorEdit || $targetUser->getOption( 'enotifminoredits' ) )
+                       ) {
+                               if ( !$targetUser->isEmailConfirmed() ) {
+                                       wfDebug( __METHOD__ . ": talk page owner doesn't have validated email\n" );
+                               } elseif ( !wfRunHooks( 'AbortTalkPageEmailNotification', array( $targetUser, $title ) ) ) {
+                                       wfDebug( __METHOD__ . ": talk page update notification is aborted for this user\n" );
+                               } else {
+                                       wfDebug( __METHOD__ . ": sending talk page update notification\n" );
+                                       return true;
+                               }
+                       } else {
+                               wfDebug( __METHOD__ . ": talk page owner doesn't want notifications\n" );
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Generate the generic "this page has been changed" e-mail text.
+        */
+       private function composeCommonMailtext() {
+               global $wgPasswordSender, $wgNoReplyAddress;
+               global $wgEnotifFromEditor, $wgEnotifRevealEditorAddress;
+               global $wgEnotifImpersonal, $wgEnotifUseRealName;
+
+               $this->composed_common = true;
+
+               # You as the WikiAdmin and Sysops can make use of plenty of
+               # named variables when composing your notification emails while
+               # simply editing the Meta pages
+
+               $keys = array();
+               $postTransformKeys = array();
+               $pageTitleUrl = $this->title->getCanonicalURL();
+               $pageTitle = $this->title->getPrefixedText();
+
+               if ( $this->oldid ) {
+                       // Always show a link to the diff which triggered the mail. See bug 32210.
+                       $keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
+                                       $this->title->getCanonicalURL( array( 'diff' => 'next', 'oldid' => $this->oldid ) ) )
+                                       ->inContentLanguage()->text();
+
+                       if ( !$wgEnotifImpersonal ) {
+                               // For personal mail, also show a link to the diff of all changes
+                               // since last visited.
+                               $keys['$NEWPAGE'] .= "\n\n" . wfMessage( 'enotif_lastvisited',
+                                               $this->title->getCanonicalURL( array( 'diff' => '0', 'oldid' => $this->oldid ) ) )
+                                               ->inContentLanguage()->text();
+                       }
+                       $keys['$OLDID'] = $this->oldid;
+                       // Deprecated since MediaWiki 1.21, not used by default. Kept for backwards-compatibility.
+                       $keys['$CHANGEDORCREATED'] = wfMessage( 'changed' )->inContentLanguage()->text();
+               } else {
+                       # clear $OLDID placeholder in the message template
+                       $keys['$OLDID'] = '';
+                       $keys['$NEWPAGE'] = '';
+                       // Deprecated since MediaWiki 1.21, not used by default. Kept for backwards-compatibility.
+                       $keys['$CHANGEDORCREATED'] = wfMessage( 'created' )->inContentLanguage()->text();
+               }
+
+               $keys['$PAGETITLE'] = $this->title->getPrefixedText();
+               $keys['$PAGETITLE_URL'] = $this->title->getCanonicalURL();
+               $keys['$PAGEMINOREDIT'] = $this->minorEdit ?
+                       wfMessage( 'minoredit' )->inContentLanguage()->text() : '';
+               $keys['$UNWATCHURL'] = $this->title->getCanonicalURL( 'action=unwatch' );
+
+               if ( $this->editor->isAnon() ) {
+                       # real anon (user:xxx.xxx.xxx.xxx)
+                       $keys['$PAGEEDITOR'] = wfMessage( 'enotif_anon_editor', $this->editor->getName() )
+                               ->inContentLanguage()->text();
+                       $keys['$PAGEEDITOR_EMAIL'] = wfMessage( 'noemailtitle' )->inContentLanguage()->text();
+
+               } else {
+                       $keys['$PAGEEDITOR'] = $wgEnotifUseRealName && $this->editor->getRealName() !== ''
+                               ? $this->editor->getRealName() : $this->editor->getName();
+                       $emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $this->editor->getName() );
+                       $keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalURL();
+               }
+
+               $keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalURL();
+               $keys['$HELPPAGE'] = wfExpandUrl(
+                       Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() )
+               );
+
+               # Replace this after transforming the message, bug 35019
+               $postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
+
+               // Now build message's subject and body
+
+               // Messages:
+               // enotif_subject_deleted, enotif_subject_created, enotif_subject_moved,
+               // enotif_subject_restored, enotif_subject_changed
+               $this->subject = wfMessage( 'enotif_subject_' . $this->pageStatus )->inContentLanguage()
+                       ->params( $pageTitle, $keys['$PAGEEDITOR'] )->text();
+
+               // Messages:
+               // enotif_body_intro_deleted, enotif_body_intro_created, enotif_body_intro_moved,
+               // enotif_body_intro_restored, enotif_body_intro_changed
+               $keys['$PAGEINTRO'] = wfMessage( 'enotif_body_intro_' . $this->pageStatus )
+                       ->inContentLanguage()->params( $pageTitle, $keys['$PAGEEDITOR'], $pageTitleUrl )
+                       ->text();
+
+               $body = wfMessage( 'enotif_body' )->inContentLanguage()->plain();
+               $body = strtr( $body, $keys );
+               $body = MessageCache::singleton()->transform( $body, false, null, $this->title );
+               $this->body = wordwrap( strtr( $body, $postTransformKeys ), 72 );
+
+               # Reveal the page editor's address as REPLY-TO address only if
+               # the user has not opted-out and the option is enabled at the
+               # global configuration level.
+               $adminAddress = new MailAddress( $wgPasswordSender,
+                       wfMessage( 'emailsender' )->inContentLanguage()->text() );
+               if ( $wgEnotifRevealEditorAddress
+                       && ( $this->editor->getEmail() != '' )
+                       && $this->editor->getOption( 'enotifrevealaddr' )
+               ) {
+                       $editorAddress = MailAddress::newFromUser( $this->editor );
+                       if ( $wgEnotifFromEditor ) {
+                               $this->from = $editorAddress;
+                       } else {
+                               $this->from = $adminAddress;
+                               $this->replyto = $editorAddress;
+                       }
+               } else {
+                       $this->from = $adminAddress;
+                       $this->replyto = new MailAddress( $wgNoReplyAddress );
+               }
+       }
+
+       /**
+        * Compose a mail to a given user and either queue it for sending, or send it now,
+        * depending on settings.
+        *
+        * Call sendMails() to send any mails that were queued.
+        * @param User $user
+        */
+       function compose( $user ) {
+               global $wgEnotifImpersonal;
+
+               if ( !$this->composed_common ) {
+                       $this->composeCommonMailtext();
+               }
+
+               if ( $wgEnotifImpersonal ) {
+                       $this->mailTargets[] = MailAddress::newFromUser( $user );
+               } else {
+                       $this->sendPersonalised( $user );
+               }
+       }
+
+       /**
+        * Send any queued mails
+        */
+       function sendMails() {
+               global $wgEnotifImpersonal;
+               if ( $wgEnotifImpersonal ) {
+                       $this->sendImpersonal( $this->mailTargets );
+               }
+       }
+
+       /**
+        * Does the per-user customizations to a notification e-mail (name,
+        * timestamp in proper timezone, etc) and sends it out.
+        * Returns true if the mail was sent successfully.
+        *
+        * @param User $watchingUser
+        * @return bool
+        * @private
+        */
+       function sendPersonalised( $watchingUser ) {
+               global $wgContLang, $wgEnotifUseRealName;
+               // From the PHP manual:
+               //   Note: The to parameter cannot be an address in the form of
+               //   "Something <someone@example.com>". The mail command will not parse
+               //   this properly while talking with the MTA.
+               $to = MailAddress::newFromUser( $watchingUser );
+
+               # $PAGEEDITDATE is the time and date of the page change
+               # expressed in terms of individual local time of the notification
+               # recipient, i.e. watching user
+               $body = str_replace(
+                       array( '$WATCHINGUSERNAME',
+                               '$PAGEEDITDATE',
+                               '$PAGEEDITTIME' ),
+                       array( $wgEnotifUseRealName && $watchingUser->getRealName() !== ''
+                               ? $watchingUser->getRealName() : $watchingUser->getName(),
+                               $wgContLang->userDate( $this->timestamp, $watchingUser ),
+                               $wgContLang->userTime( $this->timestamp, $watchingUser ) ),
+                       $this->body );
+
+               return UserMailer::send( $to, $this->from, $this->subject, $body, $this->replyto );
+       }
+
+       /**
+        * Same as sendPersonalised but does impersonal mail suitable for bulk
+        * mailing.  Takes an array of MailAddress objects.
+        * @param MailAddress[] $addresses
+        * @return Status|null
+        */
+       function sendImpersonal( $addresses ) {
+               global $wgContLang;
+
+               if ( empty( $addresses ) ) {
+                       return null;
+               }
+
+               $body = str_replace(
+                       array( '$WATCHINGUSERNAME',
+                               '$PAGEEDITDATE',
+                               '$PAGEEDITTIME' ),
+                       array( wfMessage( 'enotif_impersonal_salutation' )->inContentLanguage()->text(),
+                               $wgContLang->date( $this->timestamp, false, false ),
+                               $wgContLang->time( $this->timestamp, false, false ) ),
+                       $this->body );
+
+               return UserMailer::send( $addresses, $this->from, $this->subject, $body, $this->replyto );
+       }
+
+}
diff --git a/includes/mail/MailAddress.php b/includes/mail/MailAddress.php
new file mode 100644 (file)
index 0000000..7a228bd
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Classes used to send e-mails
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author <brion@pobox.com>
+ * @author <mail@tgries.de>
+ * @author Tim Starling
+ * @author Luke Welling lwelling@wikimedia.org
+ */
+
+/**
+ * Stores a single person's name and email address.
+ * These are passed in via the constructor, and will be returned in SMTP
+ * header format when requested.
+ */
+class MailAddress {
+       /**
+        * @param string $address String with an email address, or a User object
+        * @param string $name Human-readable name if a string address is given
+        * @param string $realName Human-readable real name if a string address is given
+        */
+       function __construct( $address, $name = null, $realName = null ) {
+               if ( is_object( $address ) && $address instanceof User ) {
+                       // Old calling format, now deprecated
+                       wfDeprecated( __METHOD__ . ' with a User object', '1.24' );
+                       $this->address = $address->getEmail();
+                       $this->name = $address->getName();
+                       $this->realName = $address->getRealName();
+               } else {
+                       $this->address = strval( $address );
+                       $this->name = strval( $name );
+                       $this->realName = strval( $realName );
+               }
+       }
+
+       /**
+        * Create a new MailAddress object for the given user
+        *
+        * @since 1.24
+        * @param User $user
+        * @return MailAddress
+        */
+       public static function newFromUser( User $user ) {
+               return new MailAddress( $user->getEmail(), $user->getName(), $user->getRealName() );
+       }
+
+       /**
+        * Return formatted and quoted address to insert into SMTP headers
+        * @return string
+        */
+       function toString() {
+               # PHP's mail() implementation under Windows is somewhat shite, and
+               # can't handle "Joe Bloggs <joe@bloggs.com>" format email addresses,
+               # so don't bother generating them
+               if ( $this->address ) {
+                       if ( $this->name != '' && !wfIsWindows() ) {
+                               global $wgEnotifUseRealName;
+                               $name = ( $wgEnotifUseRealName && $this->realName !== '' ) ? $this->realName : $this->name;
+                               $quoted = UserMailer::quotedPrintable( $name );
+                               if ( strpos( $quoted, '.' ) !== false || strpos( $quoted, ',' ) !== false ) {
+                                       $quoted = '"' . $quoted . '"';
+                               }
+                               return "$quoted <{$this->address}>";
+                       } else {
+                               return $this->address;
+                       }
+               } else {
+                       return "";
+               }
+       }
+
+       function __toString() {
+               return $this->toString();
+       }
+}
diff --git a/includes/mail/UserMailer.php b/includes/mail/UserMailer.php
new file mode 100644 (file)
index 0000000..b5a57a8
--- /dev/null
@@ -0,0 +1,425 @@
+<?php
+/**
+ * Classes used to send e-mails
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author <brion@pobox.com>
+ * @author <mail@tgries.de>
+ * @author Tim Starling
+ * @author Luke Welling lwelling@wikimedia.org
+ */
+
+/**
+ * Collection of static functions for sending mail
+ */
+class UserMailer {
+       private static $mErrorString;
+
+       /**
+        * Send mail using a PEAR mailer
+        *
+        * @param UserMailer $mailer
+        * @param string $dest
+        * @param string $headers
+        * @param string $body
+        *
+        * @return Status
+        */
+       protected static function sendWithPear( $mailer, $dest, $headers, $body ) {
+               $mailResult = $mailer->send( $dest, $headers, $body );
+
+               # Based on the result return an error string,
+               if ( PEAR::isError( $mailResult ) ) {
+                       wfDebug( "PEAR::Mail failed: " . $mailResult->getMessage() . "\n" );
+                       return Status::newFatal( 'pear-mail-error', $mailResult->getMessage() );
+               } else {
+                       return Status::newGood();
+               }
+       }
+
+       /**
+        * Creates a single string from an associative array
+        *
+        * @param array $headers Associative Array: keys are header field names,
+        *                 values are ... values.
+        * @param string $endl The end of line character.  Defaults to "\n"
+        *
+        * Note RFC2822 says newlines must be CRLF (\r\n)
+        * but php mail naively "corrects" it and requires \n for the "correction" to work
+        *
+        * @return string
+        */
+       static function arrayToHeaderString( $headers, $endl = "\n" ) {
+               $strings = array();
+               foreach ( $headers as $name => $value ) {
+                       // Prevent header injection by stripping newlines from value
+                       $value = self::sanitizeHeaderValue( $value );
+                       $strings[] = "$name: $value";
+               }
+               return implode( $endl, $strings );
+       }
+
+       /**
+        * Create a value suitable for the MessageId Header
+        *
+        * @return string
+        */
+       static function makeMsgId() {
+               global $wgSMTP, $wgServer;
+
+               $msgid = uniqid( wfWikiID() . ".", true ); /* true required for cygwin */
+               if ( is_array( $wgSMTP ) && isset( $wgSMTP['IDHost'] ) && $wgSMTP['IDHost'] ) {
+                       $domain = $wgSMTP['IDHost'];
+               } else {
+                       $url = wfParseUrl( $wgServer );
+                       $domain = $url['host'];
+               }
+               return "<$msgid@$domain>";
+       }
+
+       /**
+        * This function will perform a direct (authenticated) login to
+        * a SMTP Server to use for mail relaying if 'wgSMTP' specifies an
+        * array of parameters. It requires PEAR:Mail to do that.
+        * Otherwise it just uses the standard PHP 'mail' function.
+        *
+        * @param MailAddress|MailAddress[] $to Recipient's email (or an array of them)
+        * @param MailAddress $from Sender's email
+        * @param string $subject Email's subject.
+        * @param string $body Email's text or Array of two strings to be the text and html bodies
+        * @param MailAddress $replyto Optional reply-to email (default: null).
+        * @param string $contentType Optional custom Content-Type (default: text/plain; charset=UTF-8)
+        * @throws MWException
+        * @throws Exception
+        * @return Status
+        */
+       public static function send( $to, $from, $subject, $body, $replyto = null,
+               $contentType = 'text/plain; charset=UTF-8'
+       ) {
+               global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams, $wgAllowHTMLEmail;
+               $mime = null;
+               if ( !is_array( $to ) ) {
+                       $to = array( $to );
+               }
+
+               // mail body must have some content
+               $minBodyLen = 10;
+               // arbitrary but longer than Array or Object to detect casting error
+
+               // body must either be a string or an array with text and body
+               if (
+                       !(
+                               !is_array( $body ) &&
+                               strlen( $body ) >= $minBodyLen
+                       )
+                       &&
+                       !(
+                               is_array( $body ) &&
+                               isset( $body['text'] ) &&
+                               isset( $body['html'] ) &&
+                               strlen( $body['text'] ) >= $minBodyLen &&
+                               strlen( $body['html'] ) >= $minBodyLen
+                       )
+               ) {
+                       // if it is neither we have a problem
+                       return Status::newFatal( 'user-mail-no-body' );
+               }
+
+               if ( !$wgAllowHTMLEmail && is_array( $body ) ) {
+                       // HTML not wanted.  Dump it.
+                       $body = $body['text'];
+               }
+
+               wfDebug( __METHOD__ . ': sending mail to ' . implode( ', ', $to ) . "\n" );
+
+               # Make sure we have at least one address
+               $has_address = false;
+               foreach ( $to as $u ) {
+                       if ( $u->address ) {
+                               $has_address = true;
+                               break;
+                       }
+               }
+               if ( !$has_address ) {
+                       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
+
+               $headers['From'] = $from->toString();
+               $returnPath = $from->address;
+               $extraParams = $wgAdditionalMailParams;
+
+               // Hook to generate custom VERP address for 'Return-Path'
+               wfRunHooks( 'UserMailerChangeReturnPath', array( $to, &$returnPath ) );
+               # Add the envelope sender address using the -f command line option when PHP mail() is used.
+               # Will default to the $from->address when the UserMailerChangeReturnPath hook fails and the
+               # generated VERP address when the hook runs effectively.
+               $extraParams .= ' -f ' . $returnPath;
+
+               $headers['Return-Path'] = $returnPath;
+
+               if ( $replyto ) {
+                       $headers['Reply-To'] = $replyto->toString();
+               }
+
+               $headers['Date'] = MWTimestamp::getLocalInstance()->format( 'r' );
+               $headers['Message-ID'] = self::makeMsgId();
+               $headers['X-Mailer'] = 'MediaWiki mailer';
+
+               # Line endings need to be different on Unix and Windows due to
+               # the bug described at http://trac.wordpress.org/ticket/2603
+               if ( wfIsWindows() ) {
+                       $endl = "\r\n";
+               } else {
+                       $endl = "\n";
+               }
+
+               if ( is_array( $body ) ) {
+                       // we are sending a multipart message
+                       wfDebug( "Assembling multipart mime email\n" );
+                       if ( !stream_resolve_include_path( 'Mail/mime.php' ) ) {
+                               wfDebug( "PEAR Mail_Mime package is not installed. Falling back to text email.\n" );
+                               // remove the html body for text email fall back
+                               $body = $body['text'];
+                       } else {
+                               require_once 'Mail/mime.php';
+                               if ( wfIsWindows() ) {
+                                       $body['text'] = str_replace( "\n", "\r\n", $body['text'] );
+                                       $body['html'] = str_replace( "\n", "\r\n", $body['html'] );
+                               }
+                               $mime = new Mail_mime( array(
+                                       'eol' => $endl,
+                                       'text_charset' => 'UTF-8',
+                                       'html_charset' => 'UTF-8'
+                               ) );
+                               $mime->setTXTBody( $body['text'] );
+                               $mime->setHTMLBody( $body['html'] );
+                               $body = $mime->get(); // must call get() before headers()
+                               $headers = $mime->headers( $headers );
+                       }
+               }
+               if ( $mime === null ) {
+                       // sending text only, either deliberately or as a fallback
+                       if ( wfIsWindows() ) {
+                               $body = str_replace( "\n", "\r\n", $body );
+                       }
+                       $headers['MIME-Version'] = '1.0';
+                       $headers['Content-type'] = ( is_null( $contentType ) ?
+                               'text/plain; charset=UTF-8' : $contentType );
+                       $headers['Content-transfer-encoding'] = '8bit';
+               }
+
+               $ret = wfRunHooks( 'AlternateUserMailer', array( $headers, $to, $from, $subject, $body ) );
+               if ( $ret === false ) {
+                       // the hook implementation will return false to skip regular mail sending
+                       return Status::newGood();
+               } elseif ( $ret !== true ) {
+                       // the hook implementation will return a string to pass an error message
+                       return Status::newFatal( 'php-mail-error', $ret );
+               }
+
+               if ( is_array( $wgSMTP ) ) {
+                       #
+                       # PEAR MAILER
+                       #
+
+                       if ( !stream_resolve_include_path( 'Mail.php' ) ) {
+                               throw new MWException( 'PEAR mail package is not installed' );
+                       }
+                       require_once 'Mail.php';
+
+                       wfSuppressWarnings();
+
+                       // Create the mail object using the Mail::factory method
+                       $mail_object =& Mail::factory( 'smtp', $wgSMTP );
+                       if ( PEAR::isError( $mail_object ) ) {
+                               wfDebug( "PEAR::Mail factory failed: " . $mail_object->getMessage() . "\n" );
+                               wfRestoreWarnings();
+                               return Status::newFatal( 'pear-mail-error', $mail_object->getMessage() );
+                       }
+
+                       wfDebug( "Sending mail via PEAR::Mail\n" );
+
+                       $headers['Subject'] = self::quotedPrintable( $subject );
+
+                       # When sending only to one recipient, shows it its email using To:
+                       if ( count( $to ) == 1 ) {
+                               $headers['To'] = $to[0]->toString();
+                       }
+
+                       # Split jobs since SMTP servers tends to limit the maximum
+                       # number of possible recipients.
+                       $chunks = array_chunk( $to, $wgEnotifMaxRecips );
+                       foreach ( $chunks as $chunk ) {
+                               $status = self::sendWithPear( $mail_object, $chunk, $headers, $body );
+                               # FIXME : some chunks might be sent while others are not!
+                               if ( !$status->isOK() ) {
+                                       wfRestoreWarnings();
+                                       return $status;
+                               }
+                       }
+                       wfRestoreWarnings();
+                       return Status::newGood();
+               } else {
+                       #
+                       # PHP mail()
+                       #
+                       if ( count( $to ) > 1 ) {
+                               $headers['To'] = 'undisclosed-recipients:;';
+                       }
+                       $headers = self::arrayToHeaderString( $headers, $endl );
+
+                       wfDebug( "Sending mail via internal mail() function\n" );
+
+                       self::$mErrorString = '';
+                       $html_errors = ini_get( 'html_errors' );
+                       ini_set( 'html_errors', '0' );
+                       set_error_handler( 'UserMailer::errorHandler' );
+
+                       try {
+                               $safeMode = wfIniGetBool( 'safe_mode' );
+
+                               foreach ( $to as $recip ) {
+                                       if ( $safeMode ) {
+                                               $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers );
+                                       } else {
+                                               $sent = mail(
+                                                       $recip,
+                                                       self::quotedPrintable( $subject ),
+                                                       $body,
+                                                       $headers,
+                                                       $extraParams
+                                               );
+                                       }
+                               }
+                       } catch ( Exception $e ) {
+                               restore_error_handler();
+                               throw $e;
+                       }
+
+                       restore_error_handler();
+                       ini_set( 'html_errors', $html_errors );
+
+                       if ( self::$mErrorString ) {
+                               wfDebug( "Error sending mail: " . self::$mErrorString . "\n" );
+                               return Status::newFatal( 'php-mail-error', self::$mErrorString );
+                       } elseif ( !$sent ) {
+                               // mail function only tells if there's an error
+                               wfDebug( "Unknown error sending mail\n" );
+                               return Status::newFatal( 'php-mail-error-unknown' );
+                       } else {
+                               return Status::newGood();
+                       }
+               }
+       }
+
+       /**
+        * Set the mail error message in self::$mErrorString
+        *
+        * @param int $code Error number
+        * @param string $string Error message
+        */
+       static function errorHandler( $code, $string ) {
+               self::$mErrorString = preg_replace( '/^mail\(\)(\s*\[.*?\])?: /', '', $string );
+       }
+
+       /**
+        * Strips bad characters from a header value to prevent PHP mail header injection attacks
+        * @param string $val String to be santizied
+        * @return string
+        */
+       public static function sanitizeHeaderValue( $val ) {
+               return strtr( $val, array( "\r" => '', "\n" => '' ) );
+       }
+
+       /**
+        * Converts a string into a valid RFC 822 "phrase", such as is used for the sender name
+        * @param string $phrase
+        * @return string
+        */
+       public static function rfc822Phrase( $phrase ) {
+               // Remove line breaks
+               $phrase = self::sanitizeHeaderValue( $phrase );
+               // Remove quotes
+               $phrase = str_replace( '"', '', $phrase );
+               return '"' . $phrase . '"';
+       }
+
+       /**
+        * Converts a string into quoted-printable format
+        * @since 1.17
+        *
+        * From PHP5.3 there is a built in function quoted_printable_encode()
+        * This method does not duplicate that.
+        * This method is doing Q encoding inside encoded-words as defined by RFC 2047
+        * This is for email headers.
+        * The built in quoted_printable_encode() is for email bodies
+        * @param string $string
+        * @param string $charset
+        * @return string
+        */
+       public static function quotedPrintable( $string, $charset = '' ) {
+               # Probably incomplete; see RFC 2045
+               if ( empty( $charset ) ) {
+                       $charset = 'UTF-8';
+               }
+               $charset = strtoupper( $charset );
+               $charset = str_replace( 'ISO-8859', 'ISO8859', $charset ); // ?
+
+               $illegal = '\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff=';
+               $replace = $illegal . '\t ?_';
+               if ( !preg_match( "/[$illegal]/", $string ) ) {
+                       return $string;
+               }
+               $out = "=?$charset?Q?";
+               $out .= preg_replace_callback( "/([$replace])/",
+                       array( __CLASS__, 'quotedPrintableCallback' ), $string );
+               $out .= '?=';
+               return $out;
+       }
+
+       protected static function quotedPrintableCallback( $matches ) {
+               return sprintf( "=%02X", ord( $matches[1] ) );
+       }
+}
index b2802dd..e81b37d 100644 (file)
  *
  * @ingroup Media
  */
-class BitmapHandler extends ImageHandler {
-       /**
-        * @param File $image
-        * @param array $params Transform parameters. Entries with the keys 'width'
-        * and 'height' are the respective screen width and height, while the keys
-        * 'physicalWidth' and 'physicalHeight' indicate the thumbnail dimensions.
-        * @return bool
-        */
-       function normaliseParams( $image, &$params ) {
-               if ( !parent::normaliseParams( $image, $params ) ) {
-                       return false;
-               }
-
-               # Obtain the source, pre-rotation dimensions
-               $srcWidth = $image->getWidth( $params['page'] );
-               $srcHeight = $image->getHeight( $params['page'] );
-
-               # Don't make an image bigger than the source
-               if ( $params['physicalWidth'] >= $srcWidth ) {
-                       $params['physicalWidth'] = $srcWidth;
-                       $params['physicalHeight'] = $srcHeight;
-
-                       # Skip scaling limit checks if no scaling is required
-                       # due to requested size being bigger than source.
-                       if ( !$image->mustRender() ) {
-                               return true;
-                       }
-               }
-
-               # Check if the file is smaller than the maximum image area for thumbnailing
-               $checkImageAreaHookResult = null;
-               wfRunHooks(
-                       'BitmapHandlerCheckImageArea',
-                       array( $image, &$params, &$checkImageAreaHookResult )
-               );
-
-               if ( is_null( $checkImageAreaHookResult ) ) {
-                       global $wgMaxImageArea;
-
-                       if ( $srcWidth * $srcHeight > $wgMaxImageArea
-                               && !( $image->getMimeType() == 'image/jpeg'
-                                       && self::getScalerType( false, false ) == 'im' )
-                       ) {
-                               # Only ImageMagick can efficiently downsize jpg images without loading
-                               # the entire file in memory
-                               return false;
-                       }
-               } else {
-                       return $checkImageAreaHookResult;
-               }
-
-               return true;
-       }
-
-       /**
-        * Extracts the width/height if the image will be scaled before rotating
-        *
-        * This will match the physical size/aspect ratio of the original image
-        * prior to application of the rotation -- so for a portrait image that's
-        * stored as raw landscape with 90-degress rotation, the resulting size
-        * will be wider than it is tall.
-        *
-        * @param array $params Parameters as returned by normaliseParams
-        * @param int $rotation The rotation angle that will be applied
-        * @return array ($width, $height) array
-        */
-       public function extractPreRotationDimensions( $params, $rotation ) {
-               if ( $rotation == 90 || $rotation == 270 ) {
-                       # We'll resize before rotation, so swap the dimensions again
-                       $width = $params['physicalHeight'];
-                       $height = $params['physicalWidth'];
-               } else {
-                       $width = $params['physicalWidth'];
-                       $height = $params['physicalHeight'];
-               }
-
-               return array( $width, $height );
-       }
-
-       /**
-        * @param File $image
-        * @param string $dstPath
-        * @param string $dstUrl
-        * @param array $params
-        * @param int $flags
-        * @return MediaTransformError|ThumbnailImage|TransformParameterError
-        */
-       function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
-               if ( !$this->normaliseParams( $image, $params ) ) {
-                       return new TransformParameterError( $params );
-               }
-
-               # Create a parameter array to pass to the scaler
-               $scalerParams = array(
-                       # The size to which the image will be resized
-                       'physicalWidth' => $params['physicalWidth'],
-                       'physicalHeight' => $params['physicalHeight'],
-                       'physicalDimensions' => "{$params['physicalWidth']}x{$params['physicalHeight']}",
-                       # The size of the image on the page
-                       'clientWidth' => $params['width'],
-                       'clientHeight' => $params['height'],
-                       # Comment as will be added to the Exif of the thumbnail
-                       'comment' => isset( $params['descriptionUrl'] )
-                               ? "File source: {$params['descriptionUrl']}"
-                               : '',
-                       # Properties of the original image
-                       'srcWidth' => $image->getWidth(),
-                       'srcHeight' => $image->getHeight(),
-                       'mimeType' => $image->getMimeType(),
-                       'dstPath' => $dstPath,
-                       'dstUrl' => $dstUrl,
-               );
-
-               if ( isset( $params['quality'] ) && $params['quality'] === 'low' ) {
-                       $scalerParams['quality'] = 30;
-               }
-
-               # Determine scaler type
-               $scaler = self::getScalerType( $dstPath );
-
-               wfDebug( __METHOD__ . ": creating {$scalerParams['physicalDimensions']} " .
-                       "thumbnail at $dstPath using scaler $scaler\n" );
-
-               if ( !$image->mustRender() &&
-                       $scalerParams['physicalWidth'] == $scalerParams['srcWidth']
-                       && $scalerParams['physicalHeight'] == $scalerParams['srcHeight']
-                       && !isset( $scalerParams['quality'] )
-               ) {
-
-                       # normaliseParams (or the user) wants us to return the unscaled image
-                       wfDebug( __METHOD__ . ": returning unscaled image\n" );
-
-                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
-               }
-
-               if ( $scaler == 'client' ) {
-                       # Client-side image scaling, use the source URL
-                       # Using the destination URL in a TRANSFORM_LATER request would be incorrect
-                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
-               }
-
-               if ( $flags & self::TRANSFORM_LATER ) {
-                       wfDebug( __METHOD__ . ": Transforming later per flags.\n" );
-                       $newParams = array(
-                               'width' => $scalerParams['clientWidth'],
-                               'height' => $scalerParams['clientHeight']
-                       );
-                       if ( isset( $params['quality'] ) ) {
-                               $newParams['quality'] = $params['quality'];
-                       }
-                       return new ThumbnailImage( $image, $dstUrl, false, $newParams );
-               }
-
-               # Try to make a target path for the thumbnail
-               if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
-                       wfDebug( __METHOD__ . ": Unable to create thumbnail destination " .
-                               "directory, falling back to client scaling\n" );
-
-                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
-               }
-
-               # Transform functions and binaries need a FS source file
-               $thumbnailSource = $image->getThumbnailSource( $params );
-
-               $scalerParams['srcPath'] = $thumbnailSource['path'];
-               $scalerParams['srcWidth'] = $thumbnailSource['width'];
-               $scalerParams['srcHeight'] = $thumbnailSource['height'];
-
-               if ( $scalerParams['srcPath'] === false ) { // Failed to get local copy
-                       wfDebugLog( 'thumbnail',
-                               sprintf( 'Thumbnail failed on %s: could not get local copy of "%s"',
-                                       wfHostname(), $image->getName() ) );
-
-                       return new MediaTransformError( 'thumbnail_error',
-                               $scalerParams['clientWidth'], $scalerParams['clientHeight'],
-                               wfMessage( 'filemissing' )->text()
-                       );
-               }
-
-               # Try a hook
-               $mto = null;
-               wfRunHooks( 'BitmapHandlerTransform', array( $this, $image, &$scalerParams, &$mto ) );
-               if ( !is_null( $mto ) ) {
-                       wfDebug( __METHOD__ . ": Hook to BitmapHandlerTransform created an mto\n" );
-                       $scaler = 'hookaborted';
-               }
-
-               switch ( $scaler ) {
-                       case 'hookaborted':
-                               # Handled by the hook above
-                               /** @var MediaTransformOutput $mto */
-                               $err = $mto->isError() ? $mto : false;
-                               break;
-                       case 'im':
-                               $err = $this->transformImageMagick( $image, $scalerParams );
-                               break;
-                       case 'custom':
-                               $err = $this->transformCustom( $image, $scalerParams );
-                               break;
-                       case 'imext':
-                               $err = $this->transformImageMagickExt( $image, $scalerParams );
-                               break;
-                       case 'gd':
-                       default:
-                               $err = $this->transformGd( $image, $scalerParams );
-                               break;
-               }
-
-               # Remove the file if a zero-byte thumbnail was created, or if there was an error
-               $removed = $this->removeBadFile( $dstPath, (bool)$err );
-               if ( $err ) {
-                       # transform returned MediaTransforError
-                       return $err;
-               } elseif ( $removed ) {
-                       # Thumbnail was zero-byte and had to be removed
-                       return new MediaTransformError( 'thumbnail_error',
-                               $scalerParams['clientWidth'], $scalerParams['clientHeight'],
-                               wfMessage( 'unknown-error' )->text()
-                       );
-               } elseif ( $mto ) {
-                       return $mto;
-               } else {
-                       $newParams = array(
-                               'width' => $scalerParams['clientWidth'],
-                               'height' => $scalerParams['clientHeight']
-                       );
-                       if ( isset( $params['quality'] ) ) {
-                               $newParams['quality'] = $params['quality'];
-                       }
-                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $newParams );
-               }
-       }
+class BitmapHandler extends TransformationalImageHandler {
 
        /**
         * Returns which scaler type should be used. Creates parent directories
@@ -265,9 +34,9 @@ class BitmapHandler extends ImageHandler {
         *
         * @param string $dstPath
         * @param bool $checkDstPath
-        * @return string One of client, im, custom, gd, imext
+        * @return string|Callable One of client, im, custom, gd, imext or an array( object, method )
         */
-       protected static function getScalerType( $dstPath, $checkDstPath = true ) {
+       protected function getScalerType( $dstPath, $checkDstPath = true ) {
                global $wgUseImageResize, $wgUseImageMagick, $wgCustomConvertCommand;
 
                if ( !$dstPath && $checkDstPath ) {
@@ -290,25 +59,6 @@ class BitmapHandler extends ImageHandler {
                return $scaler;
        }
 
-       /**
-        * Get a ThumbnailImage that respresents an image that will be scaled
-        * client side
-        *
-        * @param File $image File associated with this thumbnail
-        * @param array $scalerParams Array with scaler params
-        * @return ThumbnailImage
-        *
-        * @todo FIXME: No rotation support
-        */
-       protected function getClientScalingThumbnailImage( $image, $scalerParams ) {
-               $params = array(
-                       'width' => $scalerParams['clientWidth'],
-                       'height' => $scalerParams['clientHeight']
-               );
-
-               return new ThumbnailImage( $image, $image->getURL(), null, $params );
-       }
-
        /**
         * Transform an image using ImageMagick
         *
@@ -544,18 +294,6 @@ class BitmapHandler extends ImageHandler {
                return false; # No error
        }
 
-       /**
-        * Get a MediaTransformError with error 'thumbnail_error'
-        *
-        * @param array $params Parameter array as passed to the transform* functions
-        * @param string $errMsg Error message
-        * @return MediaTransformError
-        */
-       public function getMediaTransformError( $params, $errMsg ) {
-               return new MediaTransformError( 'thumbnail_error', $params['clientWidth'],
-                       $params['clientHeight'], $errMsg );
-       }
-
        /**
         * Transform an image using the built in GD library
         *
@@ -651,131 +389,8 @@ class BitmapHandler extends ImageHandler {
        }
 
        /**
-        * Escape a string for ImageMagick's property input (e.g. -set -comment)
-        * See InterpretImageProperties() in magick/property.c
-        * @param string $s
-        * @return string
-        */
-       function escapeMagickProperty( $s ) {
-               // Double the backslashes
-               $s = str_replace( '\\', '\\\\', $s );
-               // Double the percents
-               $s = str_replace( '%', '%%', $s );
-               // Escape initial - or @
-               if ( strlen( $s ) > 0 && ( $s[0] === '-' || $s[0] === '@' ) ) {
-                       $s = '\\' . $s;
-               }
-
-               return $s;
-       }
-
-       /**
-        * Escape a string for ImageMagick's input filenames. See ExpandFilenames()
-        * and GetPathComponent() in magick/utility.c.
-        *
-        * This won't work with an initial ~ or @, so input files should be prefixed
-        * with the directory name.
-        *
-        * Glob character unescaping is broken in ImageMagick before 6.6.1-5, but
-        * it's broken in a way that doesn't involve trying to convert every file
-        * in a directory, so we're better off escaping and waiting for the bugfix
-        * to filter down to users.
-        *
-        * @param string $path The file path
-        * @param bool|string $scene The scene specification, or false if there is none
-        * @throws MWException
-        * @return string
-        */
-       function escapeMagickInput( $path, $scene = false ) {
-               # Die on initial metacharacters (caller should prepend path)
-               $firstChar = substr( $path, 0, 1 );
-               if ( $firstChar === '~' || $firstChar === '@' ) {
-                       throw new MWException( __METHOD__ . ': cannot escape this path name' );
-               }
-
-               # Escape glob chars
-               $path = preg_replace( '/[*?\[\]{}]/', '\\\\\0', $path );
-
-               return $this->escapeMagickPath( $path, $scene );
-       }
-
-       /**
-        * Escape a string for ImageMagick's output filename. See
-        * InterpretImageFilename() in magick/image.c.
-        * @param string $path The file path
-        * @param bool|string $scene The scene specification, or false if there is none
-        * @return string
-        */
-       function escapeMagickOutput( $path, $scene = false ) {
-               $path = str_replace( '%', '%%', $path );
-
-               return $this->escapeMagickPath( $path, $scene );
-       }
-
-       /**
-        * Armour a string against ImageMagick's GetPathComponent(). This is a
-        * helper function for escapeMagickInput() and escapeMagickOutput().
-        *
-        * @param string $path The file path
-        * @param bool|string $scene The scene specification, or false if there is none
-        * @throws MWException
-        * @return string
-        */
-       protected function escapeMagickPath( $path, $scene = false ) {
-               # Die on format specifiers (other than drive letters). The regex is
-               # meant to match all the formats you get from "convert -list format"
-               if ( preg_match( '/^([a-zA-Z0-9-]+):/', $path, $m ) ) {
-                       if ( wfIsWindows() && is_dir( $m[0] ) ) {
-                               // OK, it's a drive letter
-                               // ImageMagick has a similar exception, see IsMagickConflict()
-                       } else {
-                               throw new MWException( __METHOD__ . ': unexpected colon character in path name' );
-                       }
-               }
-
-               # If there are square brackets, add a do-nothing scene specification
-               # to force a literal interpretation
-               if ( $scene === false ) {
-                       if ( strpos( $path, '[' ) !== false ) {
-                               $path .= '[0--1]';
-                       }
-               } else {
-                       $path .= "[$scene]";
-               }
-
-               return $path;
-       }
-
-       /**
-        * Retrieve the version of the installed ImageMagick
-        * You can use PHPs version_compare() to use this value
-        * Value is cached for one hour.
-        * @return string Representing the IM version.
+        * Callback for transformGd when transforming jpeg images.
         */
-       protected function getMagickVersion() {
-               global $wgMemc;
-
-               $cache = $wgMemc->get( "imagemagick-version" );
-               if ( !$cache ) {
-                       global $wgImageMagickConvertCommand;
-                       $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
-                       wfDebug( __METHOD__ . ": Running convert -version\n" );
-                       $retval = '';
-                       $return = wfShellExec( $cmd, $retval );
-                       $x = preg_match( '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches );
-                       if ( $x != 1 ) {
-                               wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
-
-                               return null;
-                       }
-                       $wgMemc->set( "imagemagick-version", $matches[1], 3600 );
-
-                       return $matches[1];
-               }
-
-               return $cache;
-       }
-
        // FIXME: transformImageMagick() & transformImageMagickExt() uses JPEG quality 80, here it's 95?
        static function imageJpegWrapper( $dst_image, $thumbPath, $quality = 95 ) {
                imageinterlace( $dst_image );
@@ -787,8 +402,8 @@ class BitmapHandler extends ImageHandler {
         *
         * @return bool
         */
-       public static function canRotate() {
-               $scaler = self::getScalerType( null, false );
+       public function canRotate() {
+               $scaler = $this->getScalerType( null, false );
                switch ( $scaler ) {
                        case 'im':
                                # ImageMagick supports autorotation
@@ -810,12 +425,12 @@ class BitmapHandler extends ImageHandler {
         * @see $wgEnableAutoRotation
         * @return bool Whether auto rotation is enabled
         */
-       public static function autoRotateEnabled() {
+       public function autoRotateEnabled() {
                global $wgEnableAutoRotation;
 
                if ( $wgEnableAutoRotation === null ) {
-                       // Only enable auto-rotation when the bitmap handler can rotate
-                       $wgEnableAutoRotation = BitmapHandler::canRotate();
+                       // Only enable auto-rotation when we actually can
+                       return $this->canRotate();
                }
 
                return $wgEnableAutoRotation;
@@ -834,7 +449,7 @@ class BitmapHandler extends ImageHandler {
                $rotation = ( $params['rotation'] + $this->getRotation( $file ) ) % 360;
                $scene = false;
 
-               $scaler = self::getScalerType( null, false );
+               $scaler = $this->getScalerType( null, false );
                switch ( $scaler ) {
                        case 'im':
                                $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " .
@@ -872,15 +487,4 @@ class BitmapHandler extends ImageHandler {
                                        "$scaler rotation not implemented" );
                }
        }
-
-       /**
-        * Returns whether the file needs to be rendered. Returns true if the
-        * file requires rotation and we are able to rotate it.
-        *
-        * @param File $file
-        * @return bool
-        */
-       public function mustRender( $file ) {
-               return self::canRotate() && $this->getRotation( $file ) != 0;
-       }
 }
index 6ff19c9..596d3e8 100644 (file)
@@ -265,12 +265,16 @@ class DjVuImage {
 
        /**
         * Return an XML string describing the DjVu image
-        * @return string
+        * @return string|bool
         */
        function retrieveMetaData() {
                global $wgDjvuToXML, $wgDjvuDump, $wgDjvuTxt;
                wfProfileIn( __METHOD__ );
 
+               if ( !$this->isValid() ) {
+                       return false;
+               }
+
                if ( isset( $wgDjvuDump ) ) {
                        # djvudump is faster as of version 3.5
                        # http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
index 818bb25..018b58c 100644 (file)
@@ -563,6 +563,7 @@ class Exif {
 
        /**
         * Get $this->mFilteredExifData
+        * @return array
         */
        function getFilteredData() {
                return $this->mFilteredExifData;
index ae1ff9d..b7657cb 100644 (file)
@@ -173,7 +173,7 @@ class ExifBitmapHandler extends BitmapHandler {
 
                // Don't just call $image->getMetadata(); FSFile::getPropsFromPath() calls us with a bogus object.
                // This may mean we read EXIF data twice on initial upload.
-               if ( BitmapHandler::autoRotateEnabled() ) {
+               if ( $this->autoRotateEnabled() ) {
                        $meta = $this->getMetadata( $image, $path );
                        $rotation = $this->getRotationForExif( $meta );
                } else {
@@ -202,7 +202,7 @@ class ExifBitmapHandler extends BitmapHandler {
         * @return int 0, 90, 180 or 270
         */
        public function getRotation( $file ) {
-               if ( !BitmapHandler::autoRotateEnabled() ) {
+               if ( !$this->autoRotateEnabled() ) {
                        return 0;
                }
 
index 13c2a91..64ca011 100644 (file)
@@ -745,10 +745,10 @@ abstract class MediaHandler {
 
        /**
         * True if the handler can rotate the media
-        * @since 1.21
+        * @since 1.24 non-static. From 1.21-1.23 was static
         * @return bool
         */
-       public static function canRotate() {
+       public function canRotate() {
                return false;
        }
 
index 7b3ddb5..3cf8488 100644 (file)
@@ -174,7 +174,10 @@ class PNGHandler extends BitmapHandler {
                return $wgLang->commaList( $info );
        }
 
+       // 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 true;
+               return false;
        }
 }
diff --git a/includes/media/TransformationalImageHandler.php b/includes/media/TransformationalImageHandler.php
new file mode 100644 (file)
index 0000000..3e3be3d
--- /dev/null
@@ -0,0 +1,593 @@
+<?php
+/**
+ * Base class for handlers which require transforming images in a
+ * similar way as BitmapHandler does.
+ *
+ * This was split from BitmapHandler on the basis that some extensions
+ * might want to work in a similar way to BitmapHandler, but for
+ * different formats.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Handler for images that need to be transformed
+ *
+ * @since 1.24
+ * @ingroup Media
+ */
+abstract class TransformationalImageHandler extends ImageHandler {
+       /**
+        * @param File $image
+        * @param array $params Transform parameters. Entries with the keys 'width'
+        * and 'height' are the respective screen width and height, while the keys
+        * 'physicalWidth' and 'physicalHeight' indicate the thumbnail dimensions.
+        * @return bool
+        */
+       function normaliseParams( $image, &$params ) {
+               if ( !parent::normaliseParams( $image, $params ) ) {
+                       return false;
+               }
+
+               # Obtain the source, pre-rotation dimensions
+               $srcWidth = $image->getWidth( $params['page'] );
+               $srcHeight = $image->getHeight( $params['page'] );
+
+               # Don't make an image bigger than the source
+               if ( $params['physicalWidth'] >= $srcWidth ) {
+                       $params['physicalWidth'] = $srcWidth;
+                       $params['physicalHeight'] = $srcHeight;
+
+                       # Skip scaling limit checks if no scaling is required
+                       # due to requested size being bigger than source.
+                       if ( !$image->mustRender() ) {
+                               return true;
+                       }
+               }
+
+               # Check if the file is smaller than the maximum image area for thumbnailing
+               # For historical reasons, hook starts with BitmapHandler
+               $checkImageAreaHookResult = null;
+               wfRunHooks(
+                       'BitmapHandlerCheckImageArea',
+                       array( $image, &$params, &$checkImageAreaHookResult )
+               );
+
+               if ( is_null( $checkImageAreaHookResult ) ) {
+                       global $wgMaxImageArea;
+
+                       if ( $srcWidth * $srcHeight > $wgMaxImageArea
+                               && !( $image->getMimeType() == 'image/jpeg'
+                                       && $this->getScalerType( false, false ) == 'im' )
+                       ) {
+                               # Only ImageMagick can efficiently downsize jpg images without loading
+                               # the entire file in memory
+                               return false;
+                       }
+               } else {
+                       return $checkImageAreaHookResult;
+               }
+
+               return true;
+       }
+
+       /**
+        * Extracts the width/height if the image will be scaled before rotating
+        *
+        * This will match the physical size/aspect ratio of the original image
+        * prior to application of the rotation -- so for a portrait image that's
+        * stored as raw landscape with 90-degress rotation, the resulting size
+        * will be wider than it is tall.
+        *
+        * @param array $params Parameters as returned by normaliseParams
+        * @param int $rotation The rotation angle that will be applied
+        * @return array ($width, $height) array
+        */
+       public function extractPreRotationDimensions( $params, $rotation ) {
+               if ( $rotation == 90 || $rotation == 270 ) {
+                       # We'll resize before rotation, so swap the dimensions again
+                       $width = $params['physicalHeight'];
+                       $height = $params['physicalWidth'];
+               } else {
+                       $width = $params['physicalWidth'];
+                       $height = $params['physicalHeight'];
+               }
+
+               return array( $width, $height );
+       }
+
+       /**
+        * Create a thumbnail.
+        *
+        * This sets up various parameters, and then calls a helper method
+        * based on $this->getScalerType in order to scale the image.
+        *
+        * @param File $image
+        * @param string $dstPath
+        * @param string $dstUrl
+        * @param array $params
+        * @param int $flags
+        * @return MediaTransformError|ThumbnailImage|TransformParameterError
+        */
+       function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+               if ( !$this->normaliseParams( $image, $params ) ) {
+                       return new TransformParameterError( $params );
+               }
+
+               # Create a parameter array to pass to the scaler
+               $scalerParams = array(
+                       # The size to which the image will be resized
+                       'physicalWidth' => $params['physicalWidth'],
+                       'physicalHeight' => $params['physicalHeight'],
+                       'physicalDimensions' => "{$params['physicalWidth']}x{$params['physicalHeight']}",
+                       # The size of the image on the page
+                       'clientWidth' => $params['width'],
+                       'clientHeight' => $params['height'],
+                       # Comment as will be added to the Exif of the thumbnail
+                       'comment' => isset( $params['descriptionUrl'] )
+                               ? "File source: {$params['descriptionUrl']}"
+                               : '',
+                       # Properties of the original image
+                       'srcWidth' => $image->getWidth(),
+                       'srcHeight' => $image->getHeight(),
+                       'mimeType' => $image->getMimeType(),
+                       'dstPath' => $dstPath,
+                       'dstUrl' => $dstUrl,
+               );
+
+               if ( isset( $params['quality'] ) && $params['quality'] === 'low' ) {
+                       $scalerParams['quality'] = 30;
+               }
+
+               // For subclasses that might be paged.
+               if ( $image->isMultipage() && isset( $params['page'] ) ) {
+                       $scalerParams['page'] = intval( $params['page'] );
+               }
+
+               # Determine scaler type
+               $scaler = $this->getScalerType( $dstPath );
+
+               if ( is_array( $scaler ) ) {
+                       $scalerName = get_class( $scaler[0] );
+               } else {
+                       $scalerName = $scaler;
+               }
+
+               wfDebug( __METHOD__ . ": creating {$scalerParams['physicalDimensions']} " .
+                       "thumbnail at $dstPath using scaler $scalerName\n" );
+
+               if ( !$image->mustRender() &&
+                       $scalerParams['physicalWidth'] == $scalerParams['srcWidth']
+                       && $scalerParams['physicalHeight'] == $scalerParams['srcHeight']
+                       && !isset( $scalerParams['quality'] )
+               ) {
+
+                       # normaliseParams (or the user) wants us to return the unscaled image
+                       wfDebug( __METHOD__ . ": returning unscaled image\n" );
+
+                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
+               }
+
+               if ( $scaler == 'client' ) {
+                       # Client-side image scaling, use the source URL
+                       # Using the destination URL in a TRANSFORM_LATER request would be incorrect
+                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
+               }
+
+               if ( $flags & self::TRANSFORM_LATER ) {
+                       wfDebug( __METHOD__ . ": Transforming later per flags.\n" );
+                       $newParams = array(
+                               'width' => $scalerParams['clientWidth'],
+                               'height' => $scalerParams['clientHeight']
+                       );
+                       if ( isset( $params['quality'] ) ) {
+                               $newParams['quality'] = $params['quality'];
+                       }
+                       if ( isset( $params['page'] ) && $params['page'] ) {
+                               $newParams['page'] = $params['page'];
+                       }
+                       return new ThumbnailImage( $image, $dstUrl, false, $newParams );
+               }
+
+               # Try to make a target path for the thumbnail
+               if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
+                       wfDebug( __METHOD__ . ": Unable to create thumbnail destination " .
+                               "directory, falling back to client scaling\n" );
+
+                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
+               }
+
+               # Transform functions and binaries need a FS source file
+               $thumbnailSource = $this->getThumbnailSource( $image, $params );
+
+               $scalerParams['srcPath'] = $thumbnailSource['path'];
+               $scalerParams['srcWidth'] = $thumbnailSource['width'];
+               $scalerParams['srcHeight'] = $thumbnailSource['height'];
+
+               if ( $scalerParams['srcPath'] === false ) { // Failed to get local copy
+                       wfDebugLog( 'thumbnail',
+                               sprintf( 'Thumbnail failed on %s: could not get local copy of "%s"',
+                                       wfHostname(), $image->getName() ) );
+
+                       return new MediaTransformError( 'thumbnail_error',
+                               $scalerParams['clientWidth'], $scalerParams['clientHeight'],
+                               wfMessage( 'filemissing' )->text()
+                       );
+               }
+
+               # Try a hook. Called "Bitmap" for historical reasons.
+               /** @var $mto MediaTransformOutput */
+               $mto = null;
+               wfRunHooks( 'BitmapHandlerTransform', array( $this, $image, &$scalerParams, &$mto ) );
+               if ( !is_null( $mto ) ) {
+                       wfDebug( __METHOD__ . ": Hook to BitmapHandlerTransform created an mto\n" );
+                       $scaler = 'hookaborted';
+               }
+
+               // $scaler will return a MediaTransformError on failure, or false on success.
+               // If the scaler is succesful, it will have created a thumbnail at the destination
+               // path.
+               if ( is_array( $scaler ) && is_callable( $scaler ) ) {
+                       // Allow subclasses to specify their own rendering methods.
+                       $err = call_user_func( $scaler, $image, $scalerParams );
+               } else {
+                       switch ( $scaler ) {
+                               case 'hookaborted':
+                                       # Handled by the hook above
+                                       $err = $mto->isError() ? $mto : false;
+                                       break;
+                               case 'im':
+                                       $err = $this->transformImageMagick( $image, $scalerParams );
+                                       break;
+                               case 'custom':
+                                       $err = $this->transformCustom( $image, $scalerParams );
+                                       break;
+                               case 'imext':
+                                       $err = $this->transformImageMagickExt( $image, $scalerParams );
+                                       break;
+                               case 'gd':
+                               default:
+                                       $err = $this->transformGd( $image, $scalerParams );
+                                       break;
+                       }
+               }
+
+               # Remove the file if a zero-byte thumbnail was created, or if there was an error
+               $removed = $this->removeBadFile( $dstPath, (bool)$err );
+               if ( $err ) {
+                       # transform returned MediaTransforError
+                       return $err;
+               } elseif ( $removed ) {
+                       # Thumbnail was zero-byte and had to be removed
+                       return new MediaTransformError( 'thumbnail_error',
+                               $scalerParams['clientWidth'], $scalerParams['clientHeight'],
+                               wfMessage( 'unknown-error' )->text()
+                       );
+               } elseif ( $mto ) {
+                       return $mto;
+               } else {
+                       $newParams = array(
+                               'width' => $scalerParams['clientWidth'],
+                               'height' => $scalerParams['clientHeight']
+                       );
+                       if ( isset( $params['quality'] ) ) {
+                               $newParams['quality'] = $params['quality'];
+                       }
+                       if ( isset( $params['page'] ) && $params['page'] ) {
+                               $newParams['page'] = $params['page'];
+                       }
+                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $newParams );
+               }
+       }
+
+       /**
+        * Get the source file for the transform
+        *
+        * @param $file File
+        * @param $params Array
+        * @return Array Array with keys  width, height and path.
+        */
+       protected function getThumbnailSource( $file, $params ) {
+               return $file->getThumbnailSource( $params );
+       }
+
+       /**
+        * Returns what sort of scaler type should be used.
+        *
+        * Values can be one of client, im, custom, gd, imext, or an array
+        * of object, method-name to call that specific method.
+        *
+        * If specifying a custom scaler command with array( Obj, method ),
+        * the method in question should take 2 parameters, a File object,
+        * and a $scalerParams array with various options (See doTransform
+        * for what is in $scalerParams). On error it should return a
+        * MediaTransformError object. On success it should return false,
+        * and simply make sure the thumbnail file is located at
+        * $scalerParams['dstPath'].
+        *
+        * If there is a problem with the output path, it returns "client"
+        * to do client side scaling.
+        *
+        * @param string $dstPath
+        * @param bool $checkDstPath Check that $dstPath is valid
+        * @return string|Callable One of client, im, custom, gd, imext, or a Callable array.
+        */
+       abstract protected function getScalerType( $dstPath, $checkDstPath = true );
+
+       /**
+        * Get a ThumbnailImage that respresents an image that will be scaled
+        * client side
+        *
+        * @param File $image File associated with this thumbnail
+        * @param array $scalerParams Array with scaler params
+        * @return ThumbnailImage
+        *
+        * @todo FIXME: No rotation support
+        */
+       protected function getClientScalingThumbnailImage( $image, $scalerParams ) {
+               $params = array(
+                       'width' => $scalerParams['clientWidth'],
+                       'height' => $scalerParams['clientHeight']
+               );
+
+               return new ThumbnailImage( $image, $image->getURL(), null, $params );
+       }
+
+       /**
+        * Transform an image using ImageMagick
+        *
+        * This is a stub method. The real method is in BitmapHander.
+        *
+        * @param File $image File associated with this thumbnail
+        * @param array $params Array with scaler params
+        *
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
+        */
+       protected function transformImageMagick( $image, $params ) {
+               return $this->getMediaTransformError( $params, "Unimplemented" );
+       }
+
+       /**
+        * Transform an image using the Imagick PHP extension
+        *
+        * This is a stub method. The real method is in BitmapHander.
+        *
+        * @param File $image File associated with this thumbnail
+        * @param array $params Array with scaler params
+        *
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
+        */
+       protected function transformImageMagickExt( $image, $params ) {
+               return $this->getMediaTransformError( $params, "Unimplemented" );
+       }
+
+       /**
+        * Transform an image using a custom command
+        *
+        * This is a stub method. The real method is in BitmapHander.
+        *
+        * @param File $image File associated with this thumbnail
+        * @param array $params Array with scaler params
+        *
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
+        */
+       protected function transformCustom( $image, $params ) {
+               return $this->getMediaTransformError( $params, "Unimplemented" );
+       }
+
+       /**
+        * Get a MediaTransformError with error 'thumbnail_error'
+        *
+        * @param array $params Parameter array as passed to the transform* functions
+        * @param string $errMsg Error message
+        * @return MediaTransformError
+        */
+       public function getMediaTransformError( $params, $errMsg ) {
+               return new MediaTransformError( 'thumbnail_error', $params['clientWidth'],
+                       $params['clientHeight'], $errMsg );
+       }
+
+       /**
+        * Transform an image using the built in GD library
+        *
+        * This is a stub method. The real method is in BitmapHander.
+        *
+        * @param File $image File associated with this thumbnail
+        * @param array $params Array with scaler params
+        *
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
+        */
+       protected function transformGd( $image, $params ) {
+               return $this->getMediaTransformError( $params, "Unimplemented" );
+       }
+
+       /**
+        * Escape a string for ImageMagick's property input (e.g. -set -comment)
+        * See InterpretImageProperties() in magick/property.c
+        * @param string $s
+        * @return string
+        */
+       function escapeMagickProperty( $s ) {
+               // Double the backslashes
+               $s = str_replace( '\\', '\\\\', $s );
+               // Double the percents
+               $s = str_replace( '%', '%%', $s );
+               // Escape initial - or @
+               if ( strlen( $s ) > 0 && ( $s[0] === '-' || $s[0] === '@' ) ) {
+                       $s = '\\' . $s;
+               }
+
+               return $s;
+       }
+
+       /**
+        * Escape a string for ImageMagick's input filenames. See ExpandFilenames()
+        * and GetPathComponent() in magick/utility.c.
+        *
+        * This won't work with an initial ~ or @, so input files should be prefixed
+        * with the directory name.
+        *
+        * Glob character unescaping is broken in ImageMagick before 6.6.1-5, but
+        * it's broken in a way that doesn't involve trying to convert every file
+        * in a directory, so we're better off escaping and waiting for the bugfix
+        * to filter down to users.
+        *
+        * @param string $path The file path
+        * @param bool|string $scene The scene specification, or false if there is none
+        * @throws MWException
+        * @return string
+        */
+       function escapeMagickInput( $path, $scene = false ) {
+               # Die on initial metacharacters (caller should prepend path)
+               $firstChar = substr( $path, 0, 1 );
+               if ( $firstChar === '~' || $firstChar === '@' ) {
+                       throw new MWException( __METHOD__ . ': cannot escape this path name' );
+               }
+
+               # Escape glob chars
+               $path = preg_replace( '/[*?\[\]{}]/', '\\\\\0', $path );
+
+               return $this->escapeMagickPath( $path, $scene );
+       }
+
+       /**
+        * Escape a string for ImageMagick's output filename. See
+        * InterpretImageFilename() in magick/image.c.
+        * @param string $path The file path
+        * @param bool|string $scene The scene specification, or false if there is none
+        * @return string
+        */
+       function escapeMagickOutput( $path, $scene = false ) {
+               $path = str_replace( '%', '%%', $path );
+
+               return $this->escapeMagickPath( $path, $scene );
+       }
+
+       /**
+        * Armour a string against ImageMagick's GetPathComponent(). This is a
+        * helper function for escapeMagickInput() and escapeMagickOutput().
+        *
+        * @param string $path The file path
+        * @param bool|string $scene The scene specification, or false if there is none
+        * @throws MWException
+        * @return string
+        */
+       protected function escapeMagickPath( $path, $scene = false ) {
+               # Die on format specifiers (other than drive letters). The regex is
+               # meant to match all the formats you get from "convert -list format"
+               if ( preg_match( '/^([a-zA-Z0-9-]+):/', $path, $m ) ) {
+                       if ( wfIsWindows() && is_dir( $m[0] ) ) {
+                               // OK, it's a drive letter
+                               // ImageMagick has a similar exception, see IsMagickConflict()
+                       } else {
+                               throw new MWException( __METHOD__ . ': unexpected colon character in path name' );
+                       }
+               }
+
+               # If there are square brackets, add a do-nothing scene specification
+               # to force a literal interpretation
+               if ( $scene === false ) {
+                       if ( strpos( $path, '[' ) !== false ) {
+                               $path .= '[0--1]';
+                       }
+               } else {
+                       $path .= "[$scene]";
+               }
+
+               return $path;
+       }
+
+       /**
+        * Retrieve the version of the installed ImageMagick
+        * You can use PHPs version_compare() to use this value
+        * Value is cached for one hour.
+        * @return string Representing the IM version.
+        */
+       protected function getMagickVersion() {
+               global $wgMemc;
+
+               $cache = $wgMemc->get( "imagemagick-version" );
+               if ( !$cache ) {
+                       global $wgImageMagickConvertCommand;
+                       $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
+                       wfDebug( __METHOD__ . ": Running convert -version\n" );
+                       $retval = '';
+                       $return = wfShellExec( $cmd, $retval );
+                       $x = preg_match( '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches );
+                       if ( $x != 1 ) {
+                               wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
+
+                               return null;
+                       }
+                       $wgMemc->set( "imagemagick-version", $matches[1], 3600 );
+
+                       return $matches[1];
+               }
+
+               return $cache;
+       }
+
+       /**
+        * Returns whether the current scaler supports rotation.
+        *
+        * @since 1.24 No longer static
+        * @return bool
+        */
+       public function canRotate() {
+               return false;
+       }
+
+       /**
+        * Should we automatically rotate an image based on exif
+        *
+        * @since 1.24 No longer static
+        * @see $wgEnableAutoRotation
+        * @return bool Whether auto rotation is enabled
+        */
+       public function autoRotateEnabled() {
+               return false;
+       }
+
+       /**
+        * Rotate a thumbnail.
+        *
+        * This is a stub. See BitmapHandler::rotate.
+        *
+        * @param File $file
+        * @param array $params Rotate parameters.
+        *   'rotation' clockwise rotation in degrees, allowed are multiples of 90
+        * @since 1.24 Is non-static. From 1.21 it was static
+        * @return bool
+        */
+       public function rotate( $file, $params ) {
+               return new MediaTransformError( 'thumbnail_error', 0, 0,
+                       get_class( $this ) . ' rotation not implemented' );
+       }
+
+       /**
+        * Returns whether the file needs to be rendered. Returns true if the
+        * file requires rotation and we are able to rotate it.
+        *
+        * @param File $file
+        * @return bool
+        */
+       public function mustRender( $file ) {
+               return $this->canRotate() && $this->getRotation( $file ) != 0;
+       }
+}
index aa77fa8..48b7a47 100644 (file)
@@ -209,7 +209,7 @@ class XCFHandler extends BitmapHandler {
         * @param bool $checkDstPath
         * @return string
         */
-       protected static function getScalerType( $dstPath, $checkDstPath = true ) {
+       protected function getScalerType( $dstPath, $checkDstPath = true ) {
                return "im";
        }
 
index 154c85d..cdbd5ab 100644 (file)
@@ -1122,7 +1122,6 @@ class XMPReader {
                }
        }
 
-       // @codingStandardsIgnoreStart Long line that cannot be broken
        /**
         * Process attributes.
         * Simple values can be stored as either a tag or attribute
@@ -1130,15 +1129,16 @@ class XMPReader {
         * 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 MWException
         */
-       // @codingStandardsIgnoreEnd
        private function doAttribs( $attribs ) {
                // first check for rdf:parseType attribute, as that can change
                // how the attributes are interperted.
index b86d7d7..07b2495 100644 (file)
@@ -13,7 +13,7 @@ image/jpeg    [BITMAP]
 image/jp2      [BITMAP]
 image/xbm      [BITMAP]
 image/tiff     [BITMAP]
-image/x-icon image/x-ico       [BITMAP]
+image/x-icon image/x-ico image/vnd.microsoft.icon      [BITMAP]
 image/x-rgb    [BITMAP]
 image/x-portable-pixmap                [BITMAP]
 image/x-portable-graymap image/x-portable-greymap      [BITMAP]
index ae6ca4d..75017db 100644 (file)
@@ -91,6 +91,7 @@ image/png png apng
 image/svg+xml svg
 image/tiff tiff tif
 image/vnd.djvu djvu djv
+image/vnd.microsoft.icon ico
 image/vnd.wap.wbmp wbmp
 image/webp webp
 image/x-cmu-raster ras
index 6f8f9af..1978c3e 100644 (file)
@@ -277,21 +277,6 @@ abstract class BagOStuff {
                return false; // key already set
        }
 
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool Success
-        * @deprecated since 1.23
-        */
-       public function replace( $key, $value, $exptime = 0 ) {
-               wfDeprecated( __METHOD__, '1.23' );
-               if ( $this->get( $key ) !== false ) {
-                       return $this->set( $key, $value, $exptime );
-               }
-               return false; // key not already set
-       }
-
        /**
         * Increase stored value of $key by $value while preserving its TTL
         * @param string $key Key to increase
index 6e50a8c..06a0865 100644 (file)
@@ -65,7 +65,7 @@ class HashBagOStuff extends BagOStuff {
                        return false;
                }
 
-               $casToken = serialize( $this->bag[$key][0] );
+               $casToken = $this->bag[$key][0];
 
                return $this->bag[$key][0];
        }
@@ -89,7 +89,7 @@ class HashBagOStuff extends BagOStuff {
         * @return bool
         */
        function cas( $casToken, $key, $value, $exptime = 0 ) {
-               if ( serialize( $this->get( $key ) ) === $casToken ) {
+               if ( $this->get( $key ) === $casToken ) {
                        return $this->set( $key, $value, $exptime );
                }
 
index 59191d7..0e133a8 100644 (file)
@@ -145,7 +145,7 @@ class MemcachedBagOStuff extends BagOStuff {
         * TTLs higher than 30 days will be detected as absolute TTLs
         * (UNIX timestamps), and will result in the cache entry being
         * discarded immediately because the expiry is in the past.
-        * Clamp expiries >30d at 30d, unless they're >=1e9 in which
+        * Clamp expires >30d at 30d, unless they're >=1e9 in which
         * case they are likely to really be absolute (1e9 = 2011-09-09)
         * @param int $expiry
         * @return int
@@ -154,7 +154,7 @@ class MemcachedBagOStuff extends BagOStuff {
                if ( $expiry > 2592000 && $expiry < 1000000000 ) {
                        $expiry = 2592000;
                }
-               return $expiry;
+               return (int)$expiry;
        }
 
        /**
index 8700c8c..c853bcf 100644 (file)
@@ -247,6 +247,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                $callback = array( $this, 'encodeKey' );
                $result = $this->client->getMulti( array_map( $callback, $keys ) );
                wfProfileOut( __METHOD__ );
+               $result = $result ?: array(); // must be an array
                return $this->checkResult( false, $result );
        }
 
index 497f75d..6a69137 100644 (file)
@@ -115,16 +115,6 @@ class MultiWriteBagOStuff extends BagOStuff {
                return $this->doWrite( 'add', $key, $value, $exptime );
        }
 
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       public function replace( $key, $value, $exptime = 0 ) {
-               return $this->doWrite( 'replace', $key, $value, $exptime );
-       }
-
        /**
         * @param string $key
         * @param int $value
index c54c692..96e315f 100644 (file)
@@ -53,25 +53,25 @@ class Article implements Page {
         * @var Content Content of the revision we are working on
         * @since 1.21
         */
-       protected $mContentObject;
+       public $mContentObject;
 
        /** @var bool Is the content ($mContent) already loaded? */
-       protected $mContentLoaded = false;
+       public $mContentLoaded = false;
 
        /** @var int|null The oldid of the article that is to be shown, 0 for the current revision */
-       protected $mOldId;
+       public $mOldId;
 
        /** @var Title Title from which we were redirected here */
-       protected $mRedirectedFrom = null;
+       public $mRedirectedFrom = null;
 
        /** @var string|bool URL to redirect to or false if none */
-       protected $mRedirectUrl = false;
+       public $mRedirectUrl = false;
 
        /** @var int Revision ID of revision we are working on */
-       protected $mRevIdFetched = 0;
+       public $mRevIdFetched = 0;
 
        /** @var Revision Revision we are working on */
-       protected $mRevision = null;
+       public $mRevision = null;
 
        /** @var ParserOutput */
        public $mParserOutput;
@@ -790,7 +790,11 @@ class Article implements Page {
 
                if ( !$rev ) {
                        $this->getContext()->getOutput()->setPageTitle( wfMessage( 'errorpagetitle' ) );
-                       $this->getContext()->getOutput()->addWikiMsg( 'difference-missing-revision', $oldid, 1 );
+                       $msg = $this->getContext()->msg( 'difference-missing-revision' )
+                               ->params( $oldid )
+                               ->numParams( 1 )
+                               ->parseAsBlock();
+                       $this->getContext()->getOutput()->addHtml( $msg );
                        return;
                }
 
@@ -975,7 +979,18 @@ class Article implements Page {
                global $wgRedirectSources;
                $outputPage = $this->getContext()->getOutput();
 
-               $rdfrom = $this->getContext()->getRequest()->getVal( 'rdfrom' );
+               $request = $this->getContext()->getRequest();
+               $rdfrom = $request->getVal( 'rdfrom' );
+
+               // Construct a URL for the current page view, but with the target title
+               $query = $request->getValues();
+               unset( $query['rdfrom'] );
+               unset( $query['title'] );
+               if ( $this->getTitle()->isRedirect() ) {
+                       // Prevent double redirects
+                       $query['redirect'] = 'no';
+               }
+               $redirectTargetUrl = $this->getTitle()->getLinkURL( $query );
 
                if ( isset( $this->mRedirectedFrom ) ) {
                        // This is an internally redirected page view.
@@ -990,11 +1005,12 @@ class Article implements Page {
 
                                $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
 
-                               // Set the fragment if one was specified in the redirect
-                               if ( $this->getTitle()->hasFragment() ) {
-                                       $outputPage->addJsConfigVars( 'wgRedirectToFragment', $this->getTitle()->getFragmentForURL() );
-                                       $outputPage->addModules( 'mediawiki.action.view.redirectToFragment' );
-                               }
+                               // Add the script to update the displayed URL and
+                               // set the fragment if one was specified in the redirect
+                               $outputPage->addJsConfigVars( array(
+                                       'wgInternalRedirectTargetUrl' => $redirectTargetUrl,
+                               ) );
+                               $outputPage->addModules( 'mediawiki.action.view.redirect' );
 
                                // Add a <link rel="canonical"> tag
                                $outputPage->setCanonicalUrl( $this->getTitle()->getLocalURL() );
@@ -1011,6 +1027,12 @@ class Article implements Page {
                                $redir = Linker::makeExternalLink( $rdfrom, $rdfrom );
                                $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
 
+                               // Add the script to update the displayed URL
+                               $outputPage->addJsConfigVars( array(
+                                       'wgInternalRedirectTargetUrl' => $redirectTargetUrl,
+                               ) );
+                               $outputPage->addModules( 'mediawiki.action.view.redirect' );
+
                                return true;
                        }
                }
@@ -1176,15 +1198,18 @@ class Article implements Page {
         */
        public function showMissingArticle() {
                global $wgSend404Code;
+
                $outputPage = $this->getContext()->getOutput();
                // Whether the page is a root user page of an existing user (but not a subpage)
                $validUserPage = false;
 
+               $title = $this->getTitle();
+
                # Show info in user (talk) namespace. Does the user exist? Is he blocked?
-               if ( $this->getTitle()->getNamespace() == NS_USER
-                       || $this->getTitle()->getNamespace() == NS_USER_TALK
+               if ( $title->getNamespace() == NS_USER
+                       || $title->getNamespace() == NS_USER_TALK
                ) {
-                       $parts = explode( '/', $this->getTitle()->getText() );
+                       $parts = explode( '/', $title->getText() );
                        $rootPart = $parts[0];
                        $user = User::newFromName( $rootPart, false /* allow IP users*/ );
                        $ip = User::isIP( $rootPart );
@@ -1208,9 +1233,9 @@ class Article implements Page {
                                                )
                                        )
                                );
-                               $validUserPage = !$this->getTitle()->isSubpage();
+                               $validUserPage = !$title->isSubpage();
                        } else {
-                               $validUserPage = !$this->getTitle()->isSubpage();
+                               $validUserPage = !$title->isSubpage();
                        }
                }
 
@@ -1222,12 +1247,16 @@ class Article implements Page {
                wfRunHooks( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
 
                # Show delete and move logs
-               LogEventsList::showLogExtract( $outputPage, $logTypes, $this->getTitle(), '',
-                       array( 'lim' => 10,
-                               'conds' => $conds,
-                               'showIfEmpty' => false,
-                               'msgKey' => array( 'moveddeleted-notice' ) )
-               );
+               $member = $title->getNamespace() . ':' . $title->getDBkey();
+               // @todo: move optimization to showLogExtract()?
+               if ( BloomCache::get( 'main' )->check( wfWikiId(), 'TitleHasLogs', $member ) ) {
+                       LogEventsList::showLogExtract( $outputPage, $logTypes, $title, '',
+                               array( 'lim' => 10,
+                                       'conds' => $conds,
+                                       'showIfEmpty' => false,
+                                       'msgKey' => array( 'moveddeleted-notice' ) )
+                       );
+               }
 
                if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
                        // If there's no backing content, send a 404 Not Found
@@ -1250,11 +1279,11 @@ class Article implements Page {
                $oldid = $this->getOldID();
                if ( $oldid ) {
                        $text = wfMessage( 'missing-revision', $oldid )->plain();
-               } elseif ( $this->getTitle()->getNamespace() === NS_MEDIAWIKI ) {
+               } elseif ( $title->getNamespace() === NS_MEDIAWIKI ) {
                        // Use the default message text
-                       $text = $this->getTitle()->getDefaultMessageText();
-               } elseif ( $this->getTitle()->quickUserCan( 'create', $this->getContext()->getUser() )
-                       && $this->getTitle()->quickUserCan( 'edit', $this->getContext()->getUser() )
+                       $text = $title->getDefaultMessageText();
+               } elseif ( $title->quickUserCan( 'create', $this->getContext()->getUser() )
+                       && $title->quickUserCan( 'edit', $this->getContext()->getUser() )
                ) {
                        $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
                        $text = wfMessage( $message )->plain();
@@ -1441,14 +1470,15 @@ class Article implements Page {
         * @param Title|array $target Destination(s) to redirect
         * @param bool $appendSubtitle [optional]
         * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
-        * @return string Containing HMTL with redirect link
+        * @return string Containing HTML with redirect link
         */
        public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
                $lang = $this->getTitle()->getPageLanguage();
+               $out = $this->getContext()->getOutput();
                if ( $appendSubtitle ) {
-                       $out = $this->getContext()->getOutput();
                        $out->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
                }
+               $out->addModuleStyles( 'mediawiki.action.view.redirectPage' );
                return static::getRedirectHeaderHtml( $lang, $target, $forceKnown );
        }
 
@@ -1462,58 +1492,33 @@ class Article implements Page {
         * @param Language $lang
         * @param Title|array $target Destination(s) to redirect
         * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
-        * @return string Containing HMTL with redirect link
+        * @return string Containing HTML with redirect link
         */
        public static function getRedirectHeaderHtml( Language $lang, $target, $forceKnown = false ) {
-               global $wgStylePath;
-
                if ( !is_array( $target ) ) {
                        $target = array( $target );
                }
 
-               $imageDir = $lang->getDir();
-
-               // the loop prepends the arrow image before the link, so the first case needs to be outside
-
-               /** @var $title Title */
-               $title = array_shift( $target );
-
-               if ( $forceKnown ) {
-                       $link = Linker::linkKnown( $title, htmlspecialchars( $title->getFullText() ) );
-               } else {
-                       $link = Linker::link( $title, htmlspecialchars( $title->getFullText() ) );
+               $html = '<ul class="redirectText">';
+               /** @var Title $title */
+               foreach ( $target as $title ) {
+                       $html .= '<li>' . Linker::link(
+                               $title,
+                               htmlspecialchars( $title->getFullText() ),
+                               array(),
+                               // Automatically append redirect=no to each link, since most of them are
+                               // redirect pages themselves.
+                               array( 'redirect' => 'no' ),
+                               ( $forceKnown ? array( 'known', 'noclasses' ) : array() )
+                       ) . '</li>';
                }
 
-               $nextRedirect = $wgStylePath . '/common/images/nextredirect' . $imageDir . '.png';
-               $alt = $lang->isRTL() ? '←' : '→';
+               $redirectToText = wfMessage( 'redirectto' )->inLanguage( $lang )->text();
 
-               // Automatically append redirect=no to each link, since most of them are
-               // redirect pages themselves.
-               /** @var Title $rt */
-               foreach ( $target as $rt ) {
-                       $link .= Html::element( 'img', array( 'src' => $nextRedirect, 'alt' => $alt ) );
-                       if ( $forceKnown ) {
-                               $link .= Linker::linkKnown(
-                                       $rt,
-                                       htmlspecialchars( $rt->getFullText(),
-                                       array(),
-                                       array( 'redirect' => 'no' )
-                               )
-                               );
-                       } else {
-                               $link .= Linker::link(
-                                       $rt,
-                                       htmlspecialchars( $rt->getFullText() ),
-                                       array(),
-                                       array( 'redirect' => 'no' )
-                               );
-                       }
-               }
-
-               $imageUrl = $wgStylePath . '/common/images/redirect' . $imageDir . '.png';
                return '<div class="redirectMsg">' .
-                       Html::element( 'img', array( 'src' => $imageUrl, 'alt' => '#REDIRECT' ) ) .
-                       '<span class="redirectText">' . $link . '</span></div>';
+                       '<p>' . $redirectToText . '</p>' .
+                       $html .
+                       '</div>';
        }
 
        /**
@@ -1624,7 +1629,20 @@ class Article implements Page {
 
                // If the page has a history, insert a warning
                if ( $hasHistory ) {
-                       $revisions = $this->mTitle->estimateRevisionCount();
+                       $title = $this->getTitle();
+
+                       // The following can use the real revision count as this is only being shown for users that can delete
+                       // this page.
+                       // This, as a side-effect, also makes sure that the following query isn't being run for pages with a
+                       // larger history, unless the user has the 'bigdelete' right (and is about to delete this page).
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $revisions = $edits = (int)$dbr->selectField(
+                               'revision',
+                               'COUNT(rev_page)',
+                               array( 'rev_page' => $title->getArticleID() ),
+                               __METHOD__
+                       );
+
                        // @todo FIXME: i18n issue/patchwork message
                        $this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
                                wfMessage( 'historywarning' )->numParams( $revisions )->parse() .
@@ -1635,7 +1653,7 @@ class Article implements Page {
                                '</strong>'
                        );
 
-                       if ( $this->mTitle->isBigDeletion() ) {
+                       if ( $title->isBigDeletion() ) {
                                global $wgDeleteRevisionsLimit;
                                $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
                                        array(
@@ -1658,7 +1676,9 @@ class Article implements Page {
                wfDebug( "Article::confirmDelete\n" );
 
                $title = $this->getTitle();
-               $outputPage = $this->getContext()->getOutput();
+               $ctx = $this->getContext();
+               $outputPage = $ctx->getOutput();
+               $useMediaWikiUIEverywhere = $ctx->getConfig()->get( 'UseMediaWikiUIEverywhere' );
                $outputPage->setPageTitle( wfMessage( 'delete-confirm', $title->getPrefixedText() ) );
                $outputPage->addBacklinkSubtitle( $title );
                $outputPage->setRobotPolicy( 'noindex,nofollow' );
@@ -1674,75 +1694,67 @@ class Article implements Page {
                $user = $this->getContext()->getUser();
 
                if ( $user->isAllowed( 'suppressrevision' ) ) {
-                       $suppress = "<tr id=\"wpDeleteSuppressRow\">
-                                       <td></td>
-                                       <td class='mw-input'><strong>" .
+                       $suppress = Html::openElement( 'div', array( 'id' => 'wpDeleteSuppressRow' ) ) .
+                               "<strong>" .
                                                Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
                                                        'wpSuppress', 'wpSuppress', false, array( 'tabindex' => '4' ) ) .
-                                       "</strong></td>
-                               </tr>";
+                                       "</strong>" .
+                               Html::closeElement( 'div' );
                } else {
                        $suppress = '';
                }
                $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $title );
 
-               $form = Xml::openElement( 'form', array( 'method' => 'post',
+               $form = Html::openElement( 'form', array( 'method' => 'post',
                        'action' => $title->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ) ) .
-                       Xml::openElement( 'fieldset', array( 'id' => 'mw-delete-table' ) ) .
-                       Xml::tags( 'legend', null, wfMessage( 'delete-legend' )->escaped() ) .
-                       Xml::openElement( 'table', array( 'id' => 'mw-deleteconfirm-table' ) ) .
-                       "<tr id=\"wpDeleteReasonListRow\">
-                               <td class='mw-label'>" .
-                                       Xml::label( wfMessage( 'deletecomment' )->text(), 'wpDeleteReasonList' ) .
-                               "</td>
-                               <td class='mw-input'>" .
-                                       Xml::listDropDown(
-                                               'wpDeleteReasonList',
-                                               wfMessage( 'deletereason-dropdown' )->inContentLanguage()->text(),
-                                               wfMessage( 'deletereasonotherlist' )->inContentLanguage()->text(),
-                                               '',
-                                               'wpReasonDropDown',
-                                               1
-                                       ) .
-                               "</td>
-                       </tr>
-                       <tr id=\"wpDeleteReasonRow\">
-                               <td class='mw-label'>" .
-                                       Xml::label( wfMessage( 'deleteotherreason' )->text(), 'wpReason' ) .
-                               "</td>
-                               <td class='mw-input'>" .
-                               Html::input( 'wpReason', $reason, 'text', array(
-                                       'size' => '60',
-                                       'maxlength' => '255',
-                                       'tabindex' => '2',
-                                       'id' => 'wpReason',
-                                       'autofocus'
-                               ) ) .
-                               "</td>
-                       </tr>";
+                       Html::openElement( 'fieldset', array( 'id' => 'mw-delete-table' ) ) .
+                       Html::element( 'legend', null, wfMessage( 'delete-legend' )->text() ) .
+                       Html::openElement( 'div', array( 'id' => 'mw-deleteconfirm-table' ) ) .
+                       Html::openElement( 'div', array( 'id' => 'wpDeleteReasonListRow' ) ) .
+                       Html::label( wfMessage( 'deletecomment' )->text(), 'wpDeleteReasonList' ) .
+                       '&nbsp;' .
+                       Xml::listDropDown(
+                               'wpDeleteReasonList',
+                               wfMessage( 'deletereason-dropdown' )->inContentLanguage()->text(),
+                               wfMessage( 'deletereasonotherlist' )->inContentLanguage()->text(),
+                               '',
+                               'wpReasonDropDown',
+                               1
+                       ) .
+                       Html::closeElement( 'div' ) .
+                       Html::openElement( 'div', array( 'id' => 'wpDeleteReasonRow' ) ) .
+                       Html::label( wfMessage( 'deleteotherreason' )->text(), 'wpReason' ) .
+                       '&nbsp;' .
+                       Html::input( 'wpReason', $reason, 'text', array(
+                               'size' => '60',
+                               'maxlength' => '255',
+                               'tabindex' => '2',
+                               'id' => 'wpReason',
+                               'class' => 'mw-ui-input-inline',
+                               'autofocus'
+                       ) ) .
+                       Html::closeElement( 'div' );
 
                # Disallow watching if user is not logged in
                if ( $user->isLoggedIn() ) {
-                       $form .= "
-                       <tr>
-                               <td></td>
-                               <td class='mw-input'>" .
+                       $form .=
                                        Xml::checkLabel( wfMessage( 'watchthis' )->text(),
-                                               'wpWatch', 'wpWatch', $checkWatch, array( 'tabindex' => '3' ) ) .
-                               "</td>
-                       </tr>";
+                                               'wpWatch', 'wpWatch', $checkWatch, array( 'tabindex' => '3' ) );
                }
 
-               $form .= "
-                       $suppress
-                       <tr>
-                               <td></td>
-                               <td class='mw-submit'>" .
+               $form .=
+                               Html::openElement( 'div' ) .
+                               $suppress .
                                        Xml::submitButton( wfMessage( 'deletepage' )->text(),
-                                               array( 'name' => 'wpConfirmB', 'id' => 'wpConfirmB', 'tabindex' => '5' ) ) .
-                               "</td>
-                       </tr>" .
-                       Xml::closeElement( 'table' ) .
+                                               array(
+                                                       'name' => 'wpConfirmB',
+                                                       'id' => 'wpConfirmB',
+                                                       'tabindex' => '5',
+                                                       'class' => $useMediaWikiUIEverywhere ? 'mw-ui-button mw-ui-destructive' : '',
+                                               )
+                                       ) .
+                               Html::closeElement( 'div' ) .
+                       Html::closeElement( 'div' ) .
                        Xml::closeElement( 'fieldset' ) .
                        Html::hidden(
                                'wpEditToken',
@@ -1831,7 +1843,7 @@ class Article implements Page {
 
                $called = true;
                if ( $this->isFileCacheable() ) {
-                       $cache = HTMLFileCache::newFromTitle( $this->getTitle(), 'view' );
+                       $cache = new HTMLFileCache( $this->getTitle(), 'view' );
                        if ( $cache->isCacheGood( $this->mPage->getTouched() ) ) {
                                wfDebug( "Article::tryFileCache(): about to load file\n" );
                                $cache->loadFromFileCache( $this->getContext() );
@@ -1949,6 +1961,7 @@ class Article implements Page {
         * raw WikiPage fields for backwards compatibility.
         *
         * @param string $fname Field name
+        * @return mixed
         */
        public function __get( $fname ) {
                if ( property_exists( $this->mPage, $fname ) ) {
index 380252f..348eff1 100644 (file)
@@ -267,8 +267,7 @@ class ImagePage extends Article {
                                # @todo FIXME: Why is this using escapeId for a class?!
                                $class = Sanitizer::escapeId( $v['id'] );
                                if ( $type == 'collapsed' ) {
-                                       // Handled by mediawiki.action.view.metadata module
-                                       // and skins/common/shared.css.
+                                       // Handled by mediawiki.action.view.metadata module.
                                        $class .= ' collapsable';
                                }
                                $r .= "<tr class=\"$class\">\n";
@@ -1200,9 +1199,9 @@ class ImageHistoryList extends ContextSource {
                        . $this->msg( 'filehist-help' )->parseAsBlock()
                        . $navLinks . "\n"
                        . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
-                       . '<tr><td></td>'
+                       . '<tr><th></th>'
                        . ( $this->current->isLocal()
-                               && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
+                               && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<th></th>' : '' )
                        . '<th>' . $this->msg( 'filehist-datetime' )->escaped() . '</th>'
                        . ( $this->showThumb ? '<th>' . $this->msg( 'filehist-thumb' )->escaped() . '</th>' : '' )
                        . '<th>' . $this->msg( 'filehist-dimensions' )->escaped() . '</th>'
@@ -1329,6 +1328,9 @@ class ImageHistoryList extends ContextSource {
                                $url = $lang->userTimeAndDate( $timestamp, $user );
                        }
                        $row .= '<span class="history-deleted">' . $url . '</span>';
+               } elseif ( !$file->exists() ) {
+                       $row .= '<span class="mw-file-missing">'
+                               . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
                } else {
                        $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
                        $row .= Xml::element(
index 47f64a2..9ade16e 100644 (file)
@@ -2876,8 +2876,6 @@ class WikiPage implements Page, IDBAccessObject {
                // Clone the title, so we have the information we need when we log
                $logTitle = clone $this->mTitle;
 
-               $this->doDeleteUpdates( $id, $content );
-
                // Log the deletion, if the page was suppressed, log it at Oversight instead
                $logtype = $suppress ? 'suppress' : 'delete';
 
@@ -2896,6 +2894,8 @@ class WikiPage implements Page, IDBAccessObject {
                        $dbw->commit( __METHOD__ );
                }
 
+               $this->doDeleteUpdates( $id, $content );
+
                wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id, $content, $logEntry ) );
                $status->value = $logid;
                return $status;
@@ -3505,17 +3505,6 @@ class WikiPage implements Page, IDBAccessObject {
                return $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
        }
 
-       /**
-        * Get the  approximate revision count of this page.
-        *
-        * @deprecated since 1.19; use Title::estimateRevisionCount() instead.
-        * @return int
-        */
-       public function estimateRevisionCount() {
-               wfDeprecated( __METHOD__, '1.19' );
-               return $this->mTitle->estimateRevisionCount();
-       }
-
        /**
         * Update the article's restriction field, and leave a log entry.
         *
diff --git a/includes/pager/AlphabeticPager.php b/includes/pager/AlphabeticPager.php
new file mode 100644 (file)
index 0000000..34c7897
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Efficient paging for SQL queries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Pager
+ */
+
+/**
+ * IndexPager with an alphabetic list and a formatted navigation bar
+ * @ingroup Pager
+ */
+abstract class AlphabeticPager extends IndexPager {
+
+       /**
+        * Shamelessly stolen bits from ReverseChronologicalPager,
+        * didn't want to do class magic as may be still revamped
+        *
+        * @return string HTML
+        */
+       function getNavigationBar() {
+               if ( !$this->isNavigationBarShown() ) {
+                       return '';
+               }
+
+               if ( isset( $this->mNavigationBar ) ) {
+                       return $this->mNavigationBar;
+               }
+
+               $linkTexts = array(
+                       'prev' => $this->msg( 'prevn' )->numParams( $this->mLimit )->escaped(),
+                       'next' => $this->msg( 'nextn' )->numParams( $this->mLimit )->escaped(),
+                       'first' => $this->msg( 'page_first' )->escaped(),
+                       'last' => $this->msg( 'page_last' )->escaped()
+               );
+
+               $lang = $this->getLanguage();
+
+               $pagingLinks = $this->getPagingLinks( $linkTexts );
+               $limitLinks = $this->getLimitLinks();
+               $limits = $lang->pipeList( $limitLinks );
+
+               $this->mNavigationBar = $this->msg( 'parentheses' )->rawParams(
+                       $lang->pipeList( array( $pagingLinks['first'],
+                       $pagingLinks['last'] ) ) )->escaped() . " " .
+                       $this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'],
+                               $pagingLinks['next'], $limits )->escaped();
+
+               if ( !is_array( $this->getIndexField() ) ) {
+                       # Early return to avoid undue nesting
+                       return $this->mNavigationBar;
+               }
+
+               $extra = '';
+               $first = true;
+               $msgs = $this->getOrderTypeMessages();
+               foreach ( array_keys( $msgs ) as $order ) {
+                       if ( $first ) {
+                               $first = false;
+                       } else {
+                               $extra .= $this->msg( 'pipe-separator' )->escaped();
+                       }
+
+                       if ( $order == $this->mOrderType ) {
+                               $extra .= $this->msg( $msgs[$order] )->escaped();
+                       } else {
+                               $extra .= $this->makeLink(
+                                       $this->msg( $msgs[$order] )->escaped(),
+                                       array( 'order' => $order )
+                               );
+                       }
+               }
+
+               if ( $extra !== '' ) {
+                       $extra = ' ' . $this->msg( 'parentheses' )->rawParams( $extra )->escaped();
+                       $this->mNavigationBar .= $extra;
+               }
+
+               return $this->mNavigationBar;
+       }
+
+       /**
+        * If this supports multiple order type messages, give the message key for
+        * enabling each one in getNavigationBar.  The return type is an associative
+        * array whose keys must exactly match the keys of the array returned
+        * by getIndexField(), and whose values are message keys.
+        *
+        * @return array
+        */
+       protected function getOrderTypeMessages() {
+               return null;
+       }
+}
diff --git a/includes/pager/IndexPager.php b/includes/pager/IndexPager.php
new file mode 100644 (file)
index 0000000..9398e30
--- /dev/null
@@ -0,0 +1,741 @@
+<?php
+/**
+ * Efficient paging for SQL queries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Pager
+ */
+
+/**
+ * IndexPager is an efficient pager which uses a (roughly unique) index in the
+ * data set to implement paging, rather than a "LIMIT offset,limit" clause.
+ * In MySQL, such a limit/offset clause requires counting through the
+ * specified number of offset rows to find the desired data, which can be
+ * expensive for large offsets.
+ *
+ * ReverseChronologicalPager is a child class of the abstract IndexPager, and
+ * contains  some formatting and display code which is specific to the use of
+ * timestamps as  indexes. Here is a synopsis of its operation:
+ *
+ *    * The query is specified by the offset, limit and direction (dir)
+ *      parameters, in addition to any subclass-specific parameters.
+ *    * The offset is the non-inclusive start of the DB query. A row with an
+ *      index value equal to the offset will never be shown.
+ *    * The query may either be done backwards, where the rows are returned by
+ *      the database in the opposite order to which they are displayed to the
+ *      user, or forwards. This is specified by the "dir" parameter, dir=prev
+ *      means backwards, anything else means forwards. The offset value
+ *      specifies the start of the database result set, which may be either
+ *      the start or end of the displayed data set. This allows "previous"
+ *      links to be implemented without knowledge of the index value at the
+ *      start of the previous page.
+ *    * An additional row beyond the user-specified limit is always requested.
+ *      This allows us to tell whether we should display a "next" link in the
+ *      case of forwards mode, or a "previous" link in the case of backwards
+ *      mode. Determining whether to display the other link (the one for the
+ *      page before the start of the database result set) can be done
+ *      heuristically by examining the offset.
+ *
+ *    * An empty offset indicates that the offset condition should be omitted
+ *      from the query. This naturally produces either the first page or the
+ *      last page depending on the dir parameter.
+ *
+ *  Subclassing the pager to implement concrete functionality should be fairly
+ *  simple, please see the examples in HistoryAction.php and
+ *  SpecialBlockList.php. You just need to override formatRow(),
+ *  getQueryInfo() and getIndexField(). Don't forget to call the parent
+ *  constructor if you override it.
+ *
+ * @ingroup Pager
+ */
+abstract class IndexPager extends ContextSource implements Pager {
+       /**
+        * Constants for the $mDefaultDirection field.
+        *
+        * These are boolean for historical reasons and should stay boolean for backwards-compatibility.
+        */
+       const DIR_ASCENDING = false;
+       const DIR_DESCENDING = true;
+
+       public $mRequest;
+       public $mLimitsShown = array( 20, 50, 100, 250, 500 );
+       public $mDefaultLimit = 50;
+       public $mOffset, $mLimit;
+       public $mQueryDone = false;
+       public $mDb;
+       public $mPastTheEndRow;
+
+       /**
+        * The index to actually be used for ordering. This is a single column,
+        * for one ordering, even if multiple orderings are supported.
+        */
+       protected $mIndexField;
+       /**
+        * An array of secondary columns to order by. These fields are not part of the offset.
+        * This is a column list for one ordering, even if multiple orderings are supported.
+        */
+       protected $mExtraSortFields;
+       /** For pages that support multiple types of ordering, which one to use.
+        */
+       protected $mOrderType;
+       /**
+        * $mDefaultDirection gives the direction to use when sorting results:
+        * DIR_ASCENDING or DIR_DESCENDING.  If $mIsBackwards is set, we
+        * start from the opposite end, but we still sort the page itself according
+        * to $mDefaultDirection.  E.g., if $mDefaultDirection is false but we're
+        * going backwards, we'll display the last page of results, but the last
+        * result will be at the bottom, not the top.
+        *
+        * Like $mIndexField, $mDefaultDirection will be a single value even if the
+        * class supports multiple default directions for different order types.
+        */
+       public $mDefaultDirection;
+       public $mIsBackwards;
+
+       /** True if the current result set is the first one */
+       public $mIsFirst;
+       public $mIsLast;
+
+       protected $mLastShown, $mFirstShown, $mPastTheEndIndex, $mDefaultQuery, $mNavigationBar;
+
+       /**
+        * Whether to include the offset in the query
+        */
+       protected $mIncludeOffset = false;
+
+       /**
+        * Result object for the query. Warning: seek before use.
+        *
+        * @var ResultWrapper
+        */
+       public $mResult;
+
+       public function __construct( IContextSource $context = null ) {
+               if ( $context ) {
+                       $this->setContext( $context );
+               }
+
+               $this->mRequest = $this->getRequest();
+
+               # NB: the offset is quoted, not validated. It is treated as an
+               # arbitrary string to support the widest variety of index types. Be
+               # careful outputting it into HTML!
+               $this->mOffset = $this->mRequest->getText( 'offset' );
+
+               # Use consistent behavior for the limit options
+               $this->mDefaultLimit = $this->getUser()->getIntOption( 'rclimit' );
+               if ( !$this->mLimit ) {
+                       // Don't override if a subclass calls $this->setLimit() in its constructor.
+                       list( $this->mLimit, /* $offset */ ) = $this->mRequest->getLimitOffset();
+               }
+
+               $this->mIsBackwards = ( $this->mRequest->getVal( 'dir' ) == 'prev' );
+               # Let the subclass set the DB here; otherwise use a slave DB for the current wiki
+               $this->mDb = $this->mDb ?: wfGetDB( DB_SLAVE );
+
+               $index = $this->getIndexField(); // column to sort on
+               $extraSort = $this->getExtraSortFields(); // extra columns to sort on for query planning
+               $order = $this->mRequest->getVal( 'order' );
+               if ( is_array( $index ) && isset( $index[$order] ) ) {
+                       $this->mOrderType = $order;
+                       $this->mIndexField = $index[$order];
+                       $this->mExtraSortFields = isset( $extraSort[$order] )
+                               ? (array)$extraSort[$order]
+                               : array();
+               } elseif ( is_array( $index ) ) {
+                       # First element is the default
+                       reset( $index );
+                       list( $this->mOrderType, $this->mIndexField ) = each( $index );
+                       $this->mExtraSortFields = isset( $extraSort[$this->mOrderType] )
+                               ? (array)$extraSort[$this->mOrderType]
+                               : array();
+               } else {
+                       # $index is not an array
+                       $this->mOrderType = null;
+                       $this->mIndexField = $index;
+                       $this->mExtraSortFields = (array)$extraSort;
+               }
+
+               if ( !isset( $this->mDefaultDirection ) ) {
+                       $dir = $this->getDefaultDirections();
+                       $this->mDefaultDirection = is_array( $dir )
+                               ? $dir[$this->mOrderType]
+                               : $dir;
+               }
+       }
+
+       /**
+        * Get the Database object in use
+        *
+        * @return DatabaseBase
+        */
+       public function getDatabase() {
+               return $this->mDb;
+       }
+
+       /**
+        * Do the query, using information from the object context. This function
+        * has been kept minimal to make it overridable if necessary, to allow for
+        * result sets formed from multiple DB queries.
+        */
+       public function doQuery() {
+               # Use the child class name for profiling
+               $fname = __METHOD__ . ' (' . get_class( $this ) . ')';
+               wfProfileIn( $fname );
+
+               // @todo This should probably compare to DIR_DESCENDING and DIR_ASCENDING constants
+               $descending = ( $this->mIsBackwards == $this->mDefaultDirection );
+               # Plus an extra row so that we can tell the "next" link should be shown
+               $queryLimit = $this->mLimit + 1;
+
+               if ( $this->mOffset == '' ) {
+                       $isFirst = true;
+               } else {
+                       // If there's an offset, we may or may not be at the first entry.
+                       // The only way to tell is to run the query in the opposite
+                       // direction see if we get a row.
+                       $oldIncludeOffset = $this->mIncludeOffset;
+                       $this->mIncludeOffset = !$this->mIncludeOffset;
+                       $isFirst = !$this->reallyDoQuery( $this->mOffset, 1, !$descending )->numRows();
+                       $this->mIncludeOffset = $oldIncludeOffset;
+               }
+
+               $this->mResult = $this->reallyDoQuery(
+                       $this->mOffset,
+                       $queryLimit,
+                       $descending
+               );
+
+               $this->extractResultInfo( $isFirst, $queryLimit, $this->mResult );
+               $this->mQueryDone = true;
+
+               $this->preprocessResults( $this->mResult );
+               $this->mResult->rewind(); // Paranoia
+
+               wfProfileOut( $fname );
+       }
+
+       /**
+        * @return ResultWrapper The result wrapper.
+        */
+       function getResult() {
+               return $this->mResult;
+       }
+
+       /**
+        * Set the offset from an other source than the request
+        *
+        * @param int|string $offset
+        */
+       function setOffset( $offset ) {
+               $this->mOffset = $offset;
+       }
+
+       /**
+        * Set the limit from an other source than the request
+        *
+        * Verifies limit is between 1 and 5000
+        *
+        * @param int|string $limit
+        */
+       function setLimit( $limit ) {
+               $limit = (int)$limit;
+               // WebRequest::getLimitOffset() puts a cap of 5000, so do same here.
+               if ( $limit > 5000 ) {
+                       $limit = 5000;
+               }
+               if ( $limit > 0 ) {
+                       $this->mLimit = $limit;
+               }
+       }
+
+       /**
+        * Get the current limit
+        *
+        * @return int
+        */
+       function getLimit() {
+               return $this->mLimit;
+       }
+
+       /**
+        * Set whether a row matching exactly the offset should be also included
+        * in the result or not. By default this is not the case, but when the
+        * offset is user-supplied this might be wanted.
+        *
+        * @param bool $include
+        */
+       public function setIncludeOffset( $include ) {
+               $this->mIncludeOffset = $include;
+       }
+
+       /**
+        * Extract some useful data from the result object for use by
+        * the navigation bar, put it into $this
+        *
+        * @param bool $isFirst False if there are rows before those fetched (i.e.
+        *     if a "previous" link would make sense)
+        * @param int $limit Exact query limit
+        * @param ResultWrapper $res
+        */
+       function extractResultInfo( $isFirst, $limit, ResultWrapper $res ) {
+               $numRows = $res->numRows();
+               if ( $numRows ) {
+                       # Remove any table prefix from index field
+                       $parts = explode( '.', $this->mIndexField );
+                       $indexColumn = end( $parts );
+
+                       $row = $res->fetchRow();
+                       $firstIndex = $row[$indexColumn];
+
+                       # Discard the extra result row if there is one
+                       if ( $numRows > $this->mLimit && $numRows > 1 ) {
+                               $res->seek( $numRows - 1 );
+                               $this->mPastTheEndRow = $res->fetchObject();
+                               $this->mPastTheEndIndex = $this->mPastTheEndRow->$indexColumn;
+                               $res->seek( $numRows - 2 );
+                               $row = $res->fetchRow();
+                               $lastIndex = $row[$indexColumn];
+                       } else {
+                               $this->mPastTheEndRow = null;
+                               # Setting indexes to an empty string means that they will be
+                               # omitted if they would otherwise appear in URLs. It just so
+                               # happens that this  is the right thing to do in the standard
+                               # UI, in all the relevant cases.
+                               $this->mPastTheEndIndex = '';
+                               $res->seek( $numRows - 1 );
+                               $row = $res->fetchRow();
+                               $lastIndex = $row[$indexColumn];
+                       }
+               } else {
+                       $firstIndex = '';
+                       $lastIndex = '';
+                       $this->mPastTheEndRow = null;
+                       $this->mPastTheEndIndex = '';
+               }
+
+               if ( $this->mIsBackwards ) {
+                       $this->mIsFirst = ( $numRows < $limit );
+                       $this->mIsLast = $isFirst;
+                       $this->mLastShown = $firstIndex;
+                       $this->mFirstShown = $lastIndex;
+               } else {
+                       $this->mIsFirst = $isFirst;
+                       $this->mIsLast = ( $numRows < $limit );
+                       $this->mLastShown = $lastIndex;
+                       $this->mFirstShown = $firstIndex;
+               }
+       }
+
+       /**
+        * Get some text to go in brackets in the "function name" part of the SQL comment
+        *
+        * @return string
+        */
+       function getSqlComment() {
+               return get_class( $this );
+       }
+
+       /**
+        * Do a query with specified parameters, rather than using the object
+        * context
+        *
+        * @param string $offset Index offset, inclusive
+        * @param int $limit Exact query limit
+        * @param bool $descending Query direction, false for ascending, true for descending
+        * @return ResultWrapper
+        */
+       public function reallyDoQuery( $offset, $limit, $descending ) {
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) =
+                       $this->buildQueryInfo( $offset, $limit, $descending );
+
+               return $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
+       }
+
+       /**
+        * Build variables to use by the database wrapper.
+        *
+        * @param string $offset Index offset, inclusive
+        * @param int $limit Exact query limit
+        * @param bool $descending Query direction, false for ascending, true for descending
+        * @return array
+        */
+       protected function buildQueryInfo( $offset, $limit, $descending ) {
+               $fname = __METHOD__ . ' (' . $this->getSqlComment() . ')';
+               $info = $this->getQueryInfo();
+               $tables = $info['tables'];
+               $fields = $info['fields'];
+               $conds = isset( $info['conds'] ) ? $info['conds'] : array();
+               $options = isset( $info['options'] ) ? $info['options'] : array();
+               $join_conds = isset( $info['join_conds'] ) ? $info['join_conds'] : array();
+               $sortColumns = array_merge( array( $this->mIndexField ), $this->mExtraSortFields );
+               if ( $descending ) {
+                       $options['ORDER BY'] = $sortColumns;
+                       $operator = $this->mIncludeOffset ? '>=' : '>';
+               } else {
+                       $orderBy = array();
+                       foreach ( $sortColumns as $col ) {
+                               $orderBy[] = $col . ' DESC';
+                       }
+                       $options['ORDER BY'] = $orderBy;
+                       $operator = $this->mIncludeOffset ? '<=' : '<';
+               }
+               if ( $offset != '' ) {
+                       $conds[] = $this->mIndexField . $operator . $this->mDb->addQuotes( $offset );
+               }
+               $options['LIMIT'] = intval( $limit );
+               return array( $tables, $fields, $conds, $fname, $options, $join_conds );
+       }
+
+       /**
+        * Pre-process results; useful for performing batch existence checks, etc.
+        *
+        * @param ResultWrapper $result
+        */
+       protected function preprocessResults( $result ) {
+       }
+
+       /**
+        * Get the formatted result list. Calls getStartBody(), formatRow() and
+        * getEndBody(), concatenates the results and returns them.
+        *
+        * @return string
+        */
+       public function getBody() {
+               if ( !$this->mQueryDone ) {
+                       $this->doQuery();
+               }
+
+               if ( $this->mResult->numRows() ) {
+                       # Do any special query batches before display
+                       $this->doBatchLookups();
+               }
+
+               # Don't use any extra rows returned by the query
+               $numRows = min( $this->mResult->numRows(), $this->mLimit );
+
+               $s = $this->getStartBody();
+               if ( $numRows ) {
+                       if ( $this->mIsBackwards ) {
+                               for ( $i = $numRows - 1; $i >= 0; $i-- ) {
+                                       $this->mResult->seek( $i );
+                                       $row = $this->mResult->fetchObject();
+                                       $s .= $this->formatRow( $row );
+                               }
+                       } else {
+                               $this->mResult->seek( 0 );
+                               for ( $i = 0; $i < $numRows; $i++ ) {
+                                       $row = $this->mResult->fetchObject();
+                                       $s .= $this->formatRow( $row );
+                               }
+                       }
+               } else {
+                       $s .= $this->getEmptyBody();
+               }
+               $s .= $this->getEndBody();
+               return $s;
+       }
+
+       /**
+        * Make a self-link
+        *
+        * @param string $text Text displayed on the link
+        * @param array $query Associative array of parameter to be in the query string
+        * @param string $type Link type used to create additional attributes, like "rel", "class" or
+        *  "title". Valid values (non-exhaustive list): 'first', 'last', 'prev', 'next', 'asc', 'desc'.
+        * @return string HTML fragment
+        */
+       function makeLink( $text, array $query = null, $type = null ) {
+               if ( $query === null ) {
+                       return $text;
+               }
+
+               $attrs = array();
+               if ( in_array( $type, array( 'prev', 'next' ) ) ) {
+                       $attrs['rel'] = $type;
+               }
+
+               if ( in_array( $type, array( 'asc', 'desc' ) ) ) {
+                       $attrs['title'] = wfMessage( $type == 'asc' ? 'sort-ascending' : 'sort-descending' )->text();
+               }
+
+               if ( $type ) {
+                       $attrs['class'] = "mw-{$type}link";
+               }
+
+               return Linker::linkKnown(
+                       $this->getTitle(),
+                       $text,
+                       $attrs,
+                       $query + $this->getDefaultQuery()
+               );
+       }
+
+       /**
+        * Called from getBody(), before getStartBody() is called and
+        * after doQuery() was called. This will be called only if there
+        * are rows in the result set.
+        *
+        * @return void
+        */
+       protected function doBatchLookups() {
+       }
+
+       /**
+        * Hook into getBody(), allows text to be inserted at the start. This
+        * will be called even if there are no rows in the result set.
+        *
+        * @return string
+        */
+       protected function getStartBody() {
+               return '';
+       }
+
+       /**
+        * Hook into getBody() for the end of the list
+        *
+        * @return string
+        */
+       protected function getEndBody() {
+               return '';
+       }
+
+       /**
+        * Hook into getBody(), for the bit between the start and the
+        * end when there are no rows
+        *
+        * @return string
+        */
+       protected function getEmptyBody() {
+               return '';
+       }
+
+       /**
+        * Get an array of query parameters that should be put into self-links.
+        * By default, all parameters passed in the URL are used, except for a
+        * short blacklist.
+        *
+        * @return array Associative array
+        */
+       function getDefaultQuery() {
+               if ( !isset( $this->mDefaultQuery ) ) {
+                       $this->mDefaultQuery = $this->getRequest()->getQueryValues();
+                       unset( $this->mDefaultQuery['title'] );
+                       unset( $this->mDefaultQuery['dir'] );
+                       unset( $this->mDefaultQuery['offset'] );
+                       unset( $this->mDefaultQuery['limit'] );
+                       unset( $this->mDefaultQuery['order'] );
+                       unset( $this->mDefaultQuery['month'] );
+                       unset( $this->mDefaultQuery['year'] );
+               }
+               return $this->mDefaultQuery;
+       }
+
+       /**
+        * Get the number of rows in the result set
+        *
+        * @return int
+        */
+       function getNumRows() {
+               if ( !$this->mQueryDone ) {
+                       $this->doQuery();
+               }
+               return $this->mResult->numRows();
+       }
+
+       /**
+        * Get a URL query array for the prev, next, first and last links.
+        *
+        * @return array
+        */
+       function getPagingQueries() {
+               if ( !$this->mQueryDone ) {
+                       $this->doQuery();
+               }
+
+               # Don't announce the limit everywhere if it's the default
+               $urlLimit = $this->mLimit == $this->mDefaultLimit ? null : $this->mLimit;
+
+               if ( $this->mIsFirst ) {
+                       $prev = false;
+                       $first = false;
+               } else {
+                       $prev = array(
+                               'dir' => 'prev',
+                               'offset' => $this->mFirstShown,
+                               'limit' => $urlLimit
+                       );
+                       $first = array( 'limit' => $urlLimit );
+               }
+               if ( $this->mIsLast ) {
+                       $next = false;
+                       $last = false;
+               } else {
+                       $next = array( 'offset' => $this->mLastShown, 'limit' => $urlLimit );
+                       $last = array( 'dir' => 'prev', 'limit' => $urlLimit );
+               }
+               return array(
+                       'prev' => $prev,
+                       'next' => $next,
+                       'first' => $first,
+                       'last' => $last
+               );
+       }
+
+       /**
+        * Returns whether to show the "navigation bar"
+        *
+        * @return bool
+        */
+       function isNavigationBarShown() {
+               if ( !$this->mQueryDone ) {
+                       $this->doQuery();
+               }
+               // Hide navigation by default if there is nothing to page
+               return !( $this->mIsFirst && $this->mIsLast );
+       }
+
+       /**
+        * Get paging links. If a link is disabled, the item from $disabledTexts
+        * will be used. If there is no such item, the unlinked text from
+        * $linkTexts will be used. Both $linkTexts and $disabledTexts are arrays
+        * of HTML.
+        *
+        * @param array $linkTexts
+        * @param array $disabledTexts
+        * @return array
+        */
+       function getPagingLinks( $linkTexts, $disabledTexts = array() ) {
+               $queries = $this->getPagingQueries();
+               $links = array();
+
+               foreach ( $queries as $type => $query ) {
+                       if ( $query !== false ) {
+                               $links[$type] = $this->makeLink(
+                                       $linkTexts[$type],
+                                       $queries[$type],
+                                       $type
+                               );
+                       } elseif ( isset( $disabledTexts[$type] ) ) {
+                               $links[$type] = $disabledTexts[$type];
+                       } else {
+                               $links[$type] = $linkTexts[$type];
+                       }
+               }
+
+               return $links;
+       }
+
+       function getLimitLinks() {
+               $links = array();
+               if ( $this->mIsBackwards ) {
+                       $offset = $this->mPastTheEndIndex;
+               } else {
+                       $offset = $this->mOffset;
+               }
+               foreach ( $this->mLimitsShown as $limit ) {
+                       $links[] = $this->makeLink(
+                               $this->getLanguage()->formatNum( $limit ),
+                               array( 'offset' => $offset, 'limit' => $limit ),
+                               'num'
+                       );
+               }
+               return $links;
+       }
+
+       /**
+        * Abstract formatting function. This should return an HTML string
+        * representing the result row $row. Rows will be concatenated and
+        * returned by getBody()
+        *
+        * @param array|stdClass $row Database row
+        * @return string
+        */
+       abstract function formatRow( $row );
+
+       /**
+        * This function should be overridden to provide all parameters
+        * needed for the main paged query. It returns an associative
+        * array with the following elements:
+        *    tables => Table(s) for passing to Database::select()
+        *    fields => Field(s) for passing to Database::select(), may be *
+        *    conds => WHERE conditions
+        *    options => option array
+        *    join_conds => JOIN conditions
+        *
+        * @return array
+        */
+       abstract function getQueryInfo();
+
+       /**
+        * This function should be overridden to return the name of the index fi-
+        * eld.  If the pager supports multiple orders, it may return an array of
+        * 'querykey' => 'indexfield' pairs, so that a request with &count=querykey
+        * will use indexfield to sort.  In this case, the first returned key is
+        * the default.
+        *
+        * Needless to say, it's really not a good idea to use a non-unique index
+        * for this!  That won't page right.
+        *
+        * @return string|array
+        */
+       abstract function getIndexField();
+
+       /**
+        * This function should be overridden to return the names of secondary columns
+        * to order by in addition to the column in getIndexField(). These fields will
+        * not be used in the pager offset or in any links for users.
+        *
+        * If getIndexField() returns an array of 'querykey' => 'indexfield' pairs then
+        * this must return a corresponding array of 'querykey' => array( fields...) pairs
+        * in order for a request with &count=querykey to use array( fields...) to sort.
+        *
+        * This is useful for pagers that GROUP BY a unique column (say page_id)
+        * and ORDER BY another (say page_len). Using GROUP BY and ORDER BY both on
+        * page_len,page_id avoids temp tables (given a page_len index). This would
+        * also work if page_id was non-unique but we had a page_len,page_id index.
+        *
+        * @return array
+        */
+       protected function getExtraSortFields() {
+               return array();
+       }
+
+       /**
+        * Return the default sorting direction: DIR_ASCENDING or DIR_DESCENDING.
+        * You can also have an associative array of ordertype => dir,
+        * if multiple order types are supported.  In this case getIndexField()
+        * must return an array, and the keys of that must exactly match the keys
+        * of this.
+        *
+        * For backward compatibility, this method's return value will be ignored
+        * if $this->mDefaultDirection is already set when the constructor is
+        * called, for instance if it's statically initialized.  In that case the
+        * value of that variable (which must be a boolean) will be used.
+        *
+        * Note that despite its name, this does not return the value of the
+        * $this->mDefaultDirection member variable.  That's the default for this
+        * particular instantiation, which is a single value.  This is the set of
+        * all defaults for the class.
+        *
+        * @return bool
+        */
+       protected function getDefaultDirections() {
+               return IndexPager::DIR_ASCENDING;
+       }
+}
diff --git a/includes/pager/Pager.php b/includes/pager/Pager.php
new file mode 100644 (file)
index 0000000..edec490
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Efficient paging for SQL queries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Pager
+ */
+
+/**
+ * @defgroup Pager Pager
+ */
+
+/**
+ * Basic pager interface.
+ * @ingroup Pager
+ */
+interface Pager {
+       function getNavigationBar();
+       function getBody();
+}
diff --git a/includes/pager/ReverseChronologicalPager.php b/includes/pager/ReverseChronologicalPager.php
new file mode 100644 (file)
index 0000000..4f8c438
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Efficient paging for SQL queries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Pager
+ */
+
+/**
+ * IndexPager with a formatted navigation bar
+ * @ingroup Pager
+ */
+abstract class ReverseChronologicalPager extends IndexPager {
+       public $mDefaultDirection = IndexPager::DIR_DESCENDING;
+       public $mYear;
+       public $mMonth;
+
+       function getNavigationBar() {
+               if ( !$this->isNavigationBarShown() ) {
+                       return '';
+               }
+
+               if ( isset( $this->mNavigationBar ) ) {
+                       return $this->mNavigationBar;
+               }
+
+               $linkTexts = array(
+                       'prev' => $this->msg( 'pager-newer-n' )->numParams( $this->mLimit )->escaped(),
+                       'next' => $this->msg( 'pager-older-n' )->numParams( $this->mLimit )->escaped(),
+                       'first' => $this->msg( 'histlast' )->escaped(),
+                       'last' => $this->msg( 'histfirst' )->escaped()
+               );
+
+               $pagingLinks = $this->getPagingLinks( $linkTexts );
+               $limitLinks = $this->getLimitLinks();
+               $limits = $this->getLanguage()->pipeList( $limitLinks );
+               $firstLastLinks = $this->msg( 'parentheses' )->rawParams( "{$pagingLinks['first']}" .
+                       $this->msg( 'pipe-separator' )->escaped() .
+                       "{$pagingLinks['last']}" )->escaped();
+
+               $this->mNavigationBar = $firstLastLinks . ' ' .
+                       $this->msg( 'viewprevnext' )->rawParams(
+                               $pagingLinks['prev'], $pagingLinks['next'], $limits )->escaped();
+
+               return $this->mNavigationBar;
+       }
+
+       function getDateCond( $year, $month ) {
+               $year = intval( $year );
+               $month = intval( $month );
+
+               // Basic validity checks
+               $this->mYear = $year > 0 ? $year : false;
+               $this->mMonth = ( $month > 0 && $month < 13 ) ? $month : false;
+
+               // Given an optional year and month, we need to generate a timestamp
+               // to use as "WHERE rev_timestamp <= result"
+               // Examples: year = 2006 equals < 20070101 (+000000)
+               // year=2005, month=1    equals < 20050201
+               // year=2005, month=12   equals < 20060101
+               if ( !$this->mYear && !$this->mMonth ) {
+                       return;
+               }
+
+               if ( $this->mYear ) {
+                       $year = $this->mYear;
+               } else {
+                       // If no year given, assume the current one
+                       $timestamp = MWTimestamp::getInstance();
+                       $year = $timestamp->format( 'Y' );
+                       // If this month hasn't happened yet this year, go back to last year's month
+                       if ( $this->mMonth > $timestamp->format( 'n' ) ) {
+                               $year--;
+                       }
+               }
+
+               if ( $this->mMonth ) {
+                       $month = $this->mMonth + 1;
+                       // For December, we want January 1 of the next year
+                       if ( $month > 12 ) {
+                               $month = 1;
+                               $year++;
+                       }
+               } else {
+                       // No month implies we want up to the end of the year in question
+                       $month = 1;
+                       $year++;
+               }
+
+               // Y2K38 bug
+               if ( $year > 2032 ) {
+                       $year = 2032;
+               }
+
+               $ymd = (int)sprintf( "%04d%02d01", $year, $month );
+
+               if ( $ymd > 20320101 ) {
+                       $ymd = 20320101;
+               }
+
+               $this->mOffset = $this->mDb->timestamp( "${ymd}000000" );
+       }
+}
diff --git a/includes/pager/TablePager.php b/includes/pager/TablePager.php
new file mode 100644 (file)
index 0000000..8095539
--- /dev/null
@@ -0,0 +1,469 @@
+<?php
+/**
+ * Efficient paging for SQL queries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Pager
+ */
+
+/**
+ * Table-based display with a user-selectable sort order
+ * @ingroup Pager
+ */
+abstract class TablePager extends IndexPager {
+       protected $mSort;
+
+       protected $mCurrentRow;
+
+       public function __construct( IContextSource $context = null ) {
+               if ( $context ) {
+                       $this->setContext( $context );
+               }
+
+               $this->mSort = $this->getRequest()->getText( 'sort' );
+               if ( !array_key_exists( $this->mSort, $this->getFieldNames() )
+                       || !$this->isFieldSortable( $this->mSort )
+               ) {
+                       $this->mSort = $this->getDefaultSort();
+               }
+               if ( $this->getRequest()->getBool( 'asc' ) ) {
+                       $this->mDefaultDirection = IndexPager::DIR_ASCENDING;
+               } elseif ( $this->getRequest()->getBool( 'desc' ) ) {
+                       $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
+               } /* Else leave it at whatever the class default is */
+
+               parent::__construct();
+       }
+
+       /**
+        * Get the formatted result list. Calls getStartBody(), formatRow() and getEndBody(), concatenates
+        * the results and returns them.
+        *
+        * Also adds the required styles to our OutputPage object (this means that if context wasn't
+        * passed to constructor or otherwise set up, you will get a pager with missing styles).
+        *
+        * This method has been made 'final' in 1.24. There's no reason to override it, and if there exist
+        * any subclasses that do, the style loading hack is probably broken in them. Let's fail fast
+        * rather than mysteriously render things wrong.
+        *
+        * @deprecated since 1.24, use getBodyOutput() or getFullOutput() instead
+        * @return string
+        */
+       final public function getBody() {
+               $this->getOutput()->addModuleStyles( $this->getModuleStyles() );
+               return parent::getBody();
+       }
+
+       /**
+        * Get the formatted result list.
+        *
+        * Calls getBody() and getModuleStyles() and builds a ParserOutput object. (This is a bit hacky
+        * but works well.)
+        *
+        * @since 1.24
+        * @return ParserOutput
+        */
+       public function getBodyOutput() {
+               $body = parent::getBody();
+
+               $pout = new ParserOutput;
+               $pout->setText( $body );
+               $pout->addModuleStyles( $this->getModuleStyles() );
+               return $pout;
+       }
+
+       /**
+        * Get the formatted result list, with navigation bars.
+        *
+        * Calls getBody(), getNavigationBar() and getModuleStyles() and
+        * builds a ParserOutput object. (This is a bit hacky but works well.)
+        *
+        * @since 1.24
+        * @return ParserOutput
+        */
+       public function getFullOutput() {
+               $navigation = $this->getNavigationBar();
+               $body = parent::getBody();
+
+               $pout = new ParserOutput;
+               $pout->setText( $navigation . $body . $navigation );
+               $pout->addModuleStyles( $this->getModuleStyles() );
+               return $pout;
+       }
+
+       /**
+        * @protected
+        * @return string
+        */
+       function getStartBody() {
+               $sortClass = $this->getSortHeaderClass();
+
+               $s = '';
+               $fields = $this->getFieldNames();
+
+               // Make table header
+               foreach ( $fields as $field => $name ) {
+                       if ( strval( $name ) == '' ) {
+                               $s .= Html::rawElement( 'th', array(), '&#160;' ) . "\n";
+                       } elseif ( $this->isFieldSortable( $field ) ) {
+                               $query = array( 'sort' => $field, 'limit' => $this->mLimit );
+                               $linkType = null;
+                               $class = null;
+
+                               if ( $this->mSort == $field ) {
+                                       // The table is sorted by this field already, make a link to sort in the other direction
+                                       // We don't actually know in which direction other fields will be sorted by default…
+                                       if ( $this->mDefaultDirection == IndexPager::DIR_DESCENDING ) {
+                                               $linkType = 'asc';
+                                               $class = "$sortClass TablePager_sort-descending";
+                                               $query['asc'] = '1';
+                                               $query['desc'] = '';
+                                       } else {
+                                               $linkType = 'desc';
+                                               $class = "$sortClass TablePager_sort-ascending";
+                                               $query['asc'] = '';
+                                               $query['desc'] = '1';
+                                       }
+                               }
+
+                               $link = $this->makeLink( htmlspecialchars( $name ), $query, $linkType );
+                               $s .= Html::rawElement( 'th', array( 'class' => $class ), $link ) . "\n";
+                       } else {
+                               $s .= Html::element( 'th', array(), $name ) . "\n";
+                       }
+               }
+
+               $tableClass = $this->getTableClass();
+               $ret = Html::openElement( 'table', array(
+                       'class' => "mw-datatable $tableClass" )
+               );
+               $ret .= Html::rawElement( 'thead', array(), Html::rawElement( 'tr', array(), "\n" . $s . "\n" ) );
+               $ret .= Html::openElement( 'tbody' ) . "\n";
+
+               return $ret;
+       }
+
+       /**
+        * @protected
+        * @return string
+        */
+       function getEndBody() {
+               return "</tbody></table>\n";
+       }
+
+       /**
+        * @protected
+        * @return string
+        */
+       function getEmptyBody() {
+               $colspan = count( $this->getFieldNames() );
+               $msgEmpty = $this->msg( 'table_pager_empty' )->text();
+               return Html::rawElement( 'tr', array(),
+                       Html::element( 'td', array( 'colspan' => $colspan ), $msgEmpty ) );
+       }
+
+       /**
+        * @protected
+        * @param stdClass $row
+        * @return string HTML
+        */
+       function formatRow( $row ) {
+               $this->mCurrentRow = $row; // In case formatValue etc need to know
+               $s = Html::openElement( 'tr', $this->getRowAttrs( $row ) ) . "\n";
+               $fieldNames = $this->getFieldNames();
+
+               foreach ( $fieldNames as $field => $name ) {
+                       $value = isset( $row->$field ) ? $row->$field : null;
+                       $formatted = strval( $this->formatValue( $field, $value ) );
+
+                       if ( $formatted == '' ) {
+                               $formatted = '&#160;';
+                       }
+
+                       $s .= Html::rawElement( 'td', $this->getCellAttrs( $field, $value ), $formatted ) . "\n";
+               }
+
+               $s .= Html::closeElement( 'tr' ) . "\n";
+
+               return $s;
+       }
+
+       /**
+        * Get a class name to be applied to the given row.
+        *
+        * @protected
+        *
+        * @param object $row The database result row
+        * @return string
+        */
+       function getRowClass( $row ) {
+               return '';
+       }
+
+       /**
+        * Get attributes to be applied to the given row.
+        *
+        * @protected
+        *
+        * @param object $row The database result row
+        * @return array Array of attribute => value
+        */
+       function getRowAttrs( $row ) {
+               $class = $this->getRowClass( $row );
+               if ( $class === '' ) {
+                       // Return an empty array to avoid clutter in HTML like class=""
+                       return array();
+               } else {
+                       return array( 'class' => $this->getRowClass( $row ) );
+               }
+       }
+
+       /**
+        * Get any extra attributes to be applied to the given cell. Don't
+        * take this as an excuse to hardcode styles; use classes and
+        * CSS instead.  Row context is available in $this->mCurrentRow
+        *
+        * @protected
+        *
+        * @param string $field The column
+        * @param string $value The cell contents
+        * @return array Array of attr => value
+        */
+       function getCellAttrs( $field, $value ) {
+               return array( 'class' => 'TablePager_col_' . $field );
+       }
+
+       /**
+        * @protected
+        * @return string
+        */
+       function getIndexField() {
+               return $this->mSort;
+       }
+
+       /**
+        * @protected
+        * @return string
+        */
+       function getTableClass() {
+               return 'TablePager';
+       }
+
+       /**
+        * @protected
+        * @return string
+        */
+       function getNavClass() {
+               return 'TablePager_nav';
+       }
+
+       /**
+        * @protected
+        * @return string
+        */
+       function getSortHeaderClass() {
+               return 'TablePager_sort';
+       }
+
+       /**
+        * A navigation bar with images
+        * @return string HTML
+        */
+       public function getNavigationBar() {
+               if ( !$this->isNavigationBarShown() ) {
+                       return '';
+               }
+
+               $labels = array(
+                       'first' => 'table_pager_first',
+                       'prev' => 'table_pager_prev',
+                       'next' => 'table_pager_next',
+                       'last' => 'table_pager_last',
+               );
+
+               $linkTexts = array();
+               $disabledTexts = array();
+               foreach ( $labels as $type => $label ) {
+                       $msgLabel = $this->msg( $label )->escaped();
+                       $linkTexts[$type] = "<div class='TablePager_nav-enabled'>$msgLabel</div>";
+                       $disabledTexts[$type] = "<div class='TablePager_nav-disabled'>$msgLabel</div>";
+               }
+               $links = $this->getPagingLinks( $linkTexts, $disabledTexts );
+
+               $s = Html::openElement( 'table', array( 'class' => $this->getNavClass() ) );
+               $s .= Html::openElement( 'tr' ) . "\n";
+               $width = 100 / count( $links ) . '%';
+               foreach ( $labels as $type => $label ) {
+                       // We want every cell to have the same width. We could use table-layout: fixed; in CSS,
+                       // but it only works if we specify the width of a cell or the table and we don't want to.
+                       // There is no better way. <http://www.w3.org/TR/CSS2/tables.html#fixed-table-layout>
+                       $s .= Html::rawElement( 'td',
+                               array( 'style' => "width: $width;", 'class' => "TablePager_nav-$type" ),
+                               $links[$type] ) . "\n";
+               }
+               $s .= Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n";
+               return $s;
+       }
+
+       /**
+        * ResourceLoader modules that must be loaded to provide correct styling for this pager
+        * @since 1.24
+        * @return string[]
+        */
+       public function getModuleStyles() {
+               return array( 'mediawiki.pager.tablePager' );
+       }
+
+       /**
+        * Get a "<select>" element which has options for each of the allowed limits
+        *
+        * @param string $attribs Extra attributes to set
+        * @return string HTML fragment
+        */
+       public function getLimitSelect( $attribs = array() ) {
+               $select = new XmlSelect( 'limit', false, $this->mLimit );
+               $select->addOptions( $this->getLimitSelectList() );
+               foreach ( $attribs as $name => $value ) {
+                       $select->setAttribute( $name, $value );
+               }
+               return $select->getHTML();
+       }
+
+       /**
+        * Get a list of items to show in a "<select>" element of limits.
+        * This can be passed directly to XmlSelect::addOptions().
+        *
+        * @since 1.22
+        * @return array
+        */
+       public function getLimitSelectList() {
+               # Add the current limit from the query string
+               # to avoid that the limit is lost after clicking Go next time
+               if ( !in_array( $this->mLimit, $this->mLimitsShown ) ) {
+                       $this->mLimitsShown[] = $this->mLimit;
+                       sort( $this->mLimitsShown );
+               }
+               $ret = array();
+               foreach ( $this->mLimitsShown as $key => $value ) {
+                       # The pair is either $index => $limit, in which case the $value
+                       # will be numeric, or $limit => $text, in which case the $value
+                       # will be a string.
+                       if ( is_int( $value ) ) {
+                               $limit = $value;
+                               $text = $this->getLanguage()->formatNum( $limit );
+                       } else {
+                               $limit = $key;
+                               $text = $value;
+                       }
+                       $ret[$text] = $limit;
+               }
+               return $ret;
+       }
+
+       /**
+        * Get \<input type="hidden"\> elements for use in a method="get" form.
+        * Resubmits all defined elements of the query string, except for a
+        * blacklist, passed in the $blacklist parameter.
+        *
+        * @param array $blacklist Parameters from the request query which should not be resubmitted
+        * @return string HTML fragment
+        */
+       function getHiddenFields( $blacklist = array() ) {
+               $blacklist = (array)$blacklist;
+               $query = $this->getRequest()->getQueryValues();
+               foreach ( $blacklist as $name ) {
+                       unset( $query[$name] );
+               }
+               $s = '';
+               foreach ( $query as $name => $value ) {
+                       $s .= Html::hidden( $name, $value ) . "\n";
+               }
+               return $s;
+       }
+
+       /**
+        * Get a form containing a limit selection dropdown
+        *
+        * @return string HTML fragment
+        */
+       function getLimitForm() {
+               return Html::rawElement(
+                       'form',
+                       array(
+                               'method' => 'get',
+                               'action' => wfScript(),
+                       ),
+                       "\n" . $this->getLimitDropdown()
+               ) . "\n";
+       }
+
+       /**
+        * Gets a limit selection dropdown
+        *
+        * @return string
+        */
+       function getLimitDropdown() {
+               # Make the select with some explanatory text
+               $msgSubmit = $this->msg( 'table_pager_limit_submit' )->escaped();
+
+               return $this->msg( 'table_pager_limit' )
+                       ->rawParams( $this->getLimitSelect() )->escaped() .
+                       "\n<input type=\"submit\" value=\"$msgSubmit\"/>\n" .
+                       $this->getHiddenFields( array( 'limit' ) );
+       }
+
+       /**
+        * Return true if the named field should be sortable by the UI, false
+        * otherwise
+        *
+        * @param string $field
+        */
+       abstract function isFieldSortable( $field );
+
+       /**
+        * Format a table cell. The return value should be HTML, but use an empty
+        * string not &#160; for empty cells. Do not include the <td> and </td>.
+        *
+        * The current result row is available as $this->mCurrentRow, in case you
+        * need more context.
+        *
+        * @protected
+        *
+        * @param string $name The database field name
+        * @param string $value The value retrieved from the database
+        */
+       abstract function formatValue( $name, $value );
+
+       /**
+        * The database field name used as a default sort order.
+        *
+        * @protected
+        *
+        * @return string
+        */
+       abstract function getDefaultSort();
+
+       /**
+        * An array mapping database field names to a textual description of the
+        * field name, for use in the table header. The description should be plain
+        * text, it will be HTML-escaped later.
+        *
+        * @return array
+        */
+       abstract function getFieldNames();
+}
index cd1f32d..355a3c1 100644 (file)
@@ -1000,8 +1000,6 @@ class CoreParserFunctions {
         * @since 1.23
         */
        private static function getCachedRevisionObject( $parser, $title = null ) {
-               static $cache = array();
-
                if ( is_null( $title ) ) {
                        return null;
                }
@@ -1021,22 +1019,18 @@ class CoreParserFunctions {
                // Normalize name for cache
                $page = $title->getPrefixedDBkey();
 
-               if ( array_key_exists( $page, $cache ) ) { // cache contains null values
-                       return $cache[$page];
+               if ( !( $parser->currentRevisionCache && $parser->currentRevisionCache->has( $page ) )
+                       && !$parser->incrementExpensiveFunctionCount() ) {
+                       return null;
                }
-               if ( $parser->incrementExpensiveFunctionCount() ) {
-                       $rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
-                       $pageID = $rev ? $rev->getPage() : 0;
-                       $revID = $rev ? $rev->getId() : 0;
-                       $cache[$page] = $rev; // maybe null
+               $rev = $parser->fetchCurrentRevisionOfTitle( $title );
+               $pageID = $rev ? $rev->getPage() : 0;
+               $revID = $rev ? $rev->getId() : 0;
 
-                       // Register dependency in templatelinks
-                       $parser->getOutput()->addTemplate( $title, $pageID, $revID );
+               // Register dependency in templatelinks
+               $parser->getOutput()->addTemplate( $title, $pageID, $revID );
 
-                       return $rev;
-               }
-               $cache[$page] = null;
-               return null;
+               return $rev;
        }
 
        /**
index c3925b3..7794fae 100644 (file)
@@ -290,7 +290,7 @@ class LinkHolderArray {
                }
 
                wfProfileIn( __METHOD__ );
-               global $wgContLang;
+               global $wgContLang, $wgContentHandlerUseDB;
 
                $colours = array();
                $linkCache = LinkCache::singleton();
@@ -348,10 +348,16 @@ class LinkHolderArray {
                                );
                        }
 
+                       $fields = array( 'page_id', 'page_namespace', 'page_title',
+                               'page_is_redirect', 'page_len', 'page_latest' );
+
+                       if ( $wgContentHandlerUseDB ) {
+                               $fields[] = 'page_content_model';
+                       }
+
                        $res = $dbr->select(
                                'page',
-                               array( 'page_id', 'page_namespace', 'page_title',
-                                       'page_is_redirect', 'page_len', 'page_latest' ),
+                               $fields,
                                $dbr->makeList( $where, LIST_OR ),
                                __METHOD__
                        );
@@ -465,7 +471,7 @@ class LinkHolderArray {
         * @param array $colours
         */
        protected function doVariants( &$colours ) {
-               global $wgContLang;
+               global $wgContLang, $wgContentHandlerUseDB;
                $linkBatch = new LinkBatch();
                $variantMap = array(); // maps $pdbkey_Variant => $keys (of link holders)
                $output = $this->parent->getOutput();
@@ -554,9 +560,15 @@ class LinkHolderArray {
                if ( !$linkBatch->isEmpty() ) {
                        // construct query
                        $dbr = wfGetDB( DB_SLAVE );
+                       $fields = array( 'page_id', 'page_namespace', 'page_title',
+                               'page_is_redirect', 'page_len', 'page_latest' );
+
+                       if ( $wgContentHandlerUseDB ) {
+                               $fields[] = 'page_content_model';
+                       }
+
                        $varRes = $dbr->select( 'page',
-                               array( 'page_id', 'page_namespace', 'page_title',
-                                       'page_is_redirect', 'page_len', 'page_latest' ),
+                               $fields,
                                $linkBatch->constructSet( 'page', $dbr ),
                                __METHOD__
                        );
index a108d2b..b310862 100644 (file)
@@ -65,7 +65,9 @@ class MWTidyWrapper {
                // ...and <mw:toc> markers
                $wrappedtext = preg_replace_callback( '/\<\\/?mw:toc\>/',
                        array( &$this, 'replaceCallback' ), $wrappedtext );
-
+               // ... and <math> tags
+               $wrappedtext = preg_replace_callback( '/\<math(.*?)\<\\/math\>/s',
+                       array( &$this, 'replaceCallback' ), $wrappedtext );
                // Modify inline Microdata <link> and <meta> elements so they say <html-link> and <html-meta> so
                // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
                $wrappedtext = preg_replace( '!<(link|meta)([^>]*?)(/{0,1}>)!', '<html-$1$2$3', $wrappedtext );
index 61fffc5..ddd1f9a 100644 (file)
@@ -210,6 +210,14 @@ class Parser {
         */
        public $mLangLinkLanguages;
 
+       /**
+        * @var MapCacheLRU|null
+        * @since 1.24
+        *
+        * A cache of the current revisions of titles. Keys are $title->getPrefixedDbKey()
+        */
+       public $currentRevisionCache;
+
        /**
         * @var bool Recursive call protection.
         * This variable should be treated as if it were private.
@@ -258,6 +266,21 @@ class Parser {
         */
        public function __clone() {
                $this->mInParse = false;
+
+               // Bug 56226: When you create a reference "to" an object field, that
+               // makes the object field itself be a reference too (until the other
+               // reference goes out of scope). When cloning, any field that's a
+               // reference is copied as a reference in the new object. Both of these
+               // are defined PHP5 behaviors, as inconvenient as it is for us when old
+               // hooks from PHP4 days are passing fields by reference.
+               foreach ( array( 'mStripState', 'mVarCache' ) as $k ) {
+                       // Make a non-reference copy of the field, then rebind the field to
+                       // reference the new copy.
+                       $tmp = $this->$k;
+                       $this->$k =& $tmp;
+                       unset( $tmp );
+               }
+
                wfRunHooks( 'ParserCloned', array( $this ) );
        }
 
@@ -305,6 +328,7 @@ class Parser {
                $this->mVarCache = array();
                $this->mUser = null;
                $this->mLangLinkLanguages = array();
+               $this->currentRevisionCache = null;
 
                /**
                 * Prefix for temporary replacement strings for the multipass parser.
@@ -376,6 +400,7 @@ class Parser {
 
                $this->startParse( $title, $options, self::OT_HTML, $clearState );
 
+               $this->currentRevisionCache = null;
                $this->mInputSize = strlen( $text );
                if ( $this->mOptions->getEnableLimitReport() ) {
                        $this->mOutput->resetParseStartTime();
@@ -588,6 +613,7 @@ class Parser {
                $this->mRevisionUser = $oldRevisionUser;
                $this->mRevisionSize = $oldRevisionSize;
                $this->mInputSize = false;
+               $this->currentRevisionCache = null;
                wfProfileOut( $fname );
                wfProfileOut( __METHOD__ );
 
@@ -1402,7 +1428,7 @@ class Parser {
                                $this->getExternalLinkAttribs( $url ) );
                        # Register it in the output object...
                        # Replace unnecessary URL escape codes with their equivalent characters
-                       $pasteurized = self::replaceUnusualEscapes( $url );
+                       $pasteurized = self::normalizeLinkUrl( $url );
                        $this->mOutput->addExternalLink( $pasteurized );
                }
                wfProfileOut( __METHOD__ );
@@ -1710,7 +1736,7 @@ class Parser {
                        # Register link in the output object.
                        # Replace unnecessary URL escape codes with the referenced character
                        # This prevents spammers from hiding links from the filters
-                       $pasteurized = self::replaceUnusualEscapes( $url );
+                       $pasteurized = self::normalizeLinkUrl( $url );
                        $this->mOutput->addExternalLink( $pasteurized );
                }
 
@@ -1759,40 +1785,75 @@ class Parser {
        }
 
        /**
-        * Replace unusual URL escape codes with their equivalent characters
+        * Replace unusual escape codes in a URL with their equivalent characters
         *
+        * @deprecated since 1.24, use normalizeLinkUrl
         * @param string $url
         * @return string
-        *
-        * @todo This can merge genuinely required bits in the path or query string,
-        *       breaking legit URLs. A proper fix would treat the various parts of
-        *       the URL differently; as a workaround, just use the output for
-        *       statistical records, not for actual linking/output.
         */
        public static function replaceUnusualEscapes( $url ) {
-               return preg_replace_callback( '/%[0-9A-Fa-f]{2}/',
-                       array( __CLASS__, 'replaceUnusualEscapesCallback' ), $url );
+               wfDeprecated( __METHOD__, '1.24' );
+               return self::normalizeLinkUrl( $url );
        }
 
        /**
-        * Callback function used in replaceUnusualEscapes().
-        * Replaces unusual URL escape codes with their equivalent character
+        * Replace unusual escape codes in a URL with their equivalent characters
         *
-        * @param array $matches
+        * This generally follows the syntax defined in RFC 3986, with special
+        * consideration for HTTP query strings.
         *
+        * @param string $url
         * @return string
         */
-       private static function replaceUnusualEscapesCallback( $matches ) {
-               $char = urldecode( $matches[0] );
-               $ord = ord( $char );
-               # Is it an unsafe or HTTP reserved character according to RFC 1738?
-               if ( $ord > 32 && $ord < 127 && strpos( '<>"#{}|\^~[]`;/?', $char ) === false ) {
-                       # No, shouldn't be escaped
-                       return $char;
-               } else {
-                       # Yes, leave it escaped
-                       return $matches[0];
+       public static function normalizeLinkUrl( $url ) {
+               # First, make sure unsafe characters are encoded
+               $url = preg_replace_callback( '/[\x00-\x20"<>\[\\\\\]^`{|}\x7F-\xFF]/',
+                       function ( $m ) {
+                               return rawurlencode( $m[0] );
+                       },
+                       $url
+               );
+
+               $ret = '';
+               $end = strlen( $url );
+
+               # Fragment part - 'fragment'
+               $start = strpos( $url, '#' );
+               if ( $start !== false && $start < $end ) {
+                       $ret = self::normalizeUrlComponent(
+                               substr( $url, $start, $end - $start ), '"#%<>[\]^`{|}' ) . $ret;
+                       $end = $start;
                }
+
+               # Query part - 'query' minus &=+;
+               $start = strpos( $url, '?' );
+               if ( $start !== false && $start < $end ) {
+                       $ret = self::normalizeUrlComponent(
+                               substr( $url, $start, $end - $start ), '"#%<>[\]^`{|}&=+;' ) . $ret;
+                       $end = $start;
+               }
+
+               # Scheme and path part - 'pchar'
+               # (we assume no userinfo or encoded colons in the host)
+               $ret = self::normalizeUrlComponent(
+                       substr( $url, 0, $end ), '"#%<>[\]^`{|}/?' ) . $ret;
+
+               return $ret;
+       }
+
+       private static function normalizeUrlComponent( $component, $unsafe ) {
+               $callback = function ( $matches ) use ( $unsafe ) {
+                       $char = urldecode( $matches[0] );
+                       $ord = ord( $char );
+                       if ( $ord > 32 && $ord < 127 && strpos( $unsafe, $char ) === false ) {
+                               # Unescape it
+                               return $char;
+                       } else {
+                               # Leave it escaped, but use uppercase for a-f
+                               return strtoupper( $matches[0] );
+                       }
+               };
+               return preg_replace_callback( '/%[0-9A-Fa-f]{2}/', $callback, $component );
        }
 
        /**
@@ -3794,6 +3855,44 @@ class Parser {
                return array( $dom, $title );
        }
 
+       /**
+        * Fetch the current revision of a given title. Note that the revision
+        * (and even the title) may not exist in the database, so everything
+        * contributing to the output of the parser should use this method
+        * where possible, rather than getting the revisions themselves. This
+        * method also caches its results, so using it benefits performance.
+        *
+        * @since 1.24
+        * @param Title $title
+        * @return Revision
+        */
+       public function fetchCurrentRevisionOfTitle( $title ) {
+               $cacheKey = $title->getPrefixedDBkey();
+               if ( !$this->currentRevisionCache ) {
+                       $this->currentRevisionCache = new MapCacheLRU( 100 );
+               }
+               if ( !$this->currentRevisionCache->has( $cacheKey ) ) {
+                       $this->currentRevisionCache->set( $cacheKey,
+                               // Defaults to Parser::statelessFetchRevision()
+                               call_user_func( $this->mOptions->getCurrentRevisionCallback(), $title, $this )
+                       );
+               }
+               return $this->currentRevisionCache->get( $cacheKey );
+       }
+
+       /**
+        * Wrapper around Revision::newFromTitle to allow passing additional parameters
+        * without passing them on to it.
+        *
+        * @since 1.24
+        * @param Title $title
+        * @param Parser|bool $parser
+        * @return Revision
+        */
+       public static function statelessFetchRevision( $title, $parser = false ) {
+               return Revision::newFromTitle( $title );
+       }
+
        /**
         * Fetch the unparsed text of a template and register a reference to it.
         * @param Title $title
@@ -3859,9 +3958,13 @@ class Parser {
                                break;
                        }
                        # Get the revision
-                       $rev = $id
-                               ? Revision::newFromId( $id )
-                               : Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
+                       if ( $id ) {
+                               $rev = Revision::newFromId( $id );
+                       } elseif ( $parser ) {
+                               $rev = $parser->fetchCurrentRevisionOfTitle( $title );
+                       } else {
+                               $rev = Revision::newFromTitle( $title );
+                       }
                        $rev_id = $rev ? $rev->getId() : 0;
                        # If there is no current revision, there is no page
                        if ( $id === false && !$rev ) {
@@ -4256,40 +4359,12 @@ class Parser {
        }
 
        /**
-        * Add a tracking category, getting the title from a system message,
-        * or print a debug message if the title is invalid.
-        *
-        * Please add any message that you use with this function to
-        * $wgTrackingCategories. That way they will be listed on
-        * Special:TrackingCategories.
-        *
+        * @see ParserOutput::addTrackingCategory()
         * @param string $msg Message key
         * @return bool Whether the addition was successful
         */
        public function addTrackingCategory( $msg ) {
-               if ( $this->mTitle->getNamespace() === NS_SPECIAL ) {
-                       wfDebug( __METHOD__ . ": Not adding tracking category $msg to special page!\n" );
-                       return false;
-               }
-               // Important to parse with correct title (bug 31469)
-               $cat = wfMessage( $msg )
-                       ->title( $this->getTitle() )
-                       ->inContentLanguage()
-                       ->text();
-
-               # Allow tracking categories to be disabled by setting them to "-"
-               if ( $cat === '-' ) {
-                       return false;
-               }
-
-               $containerCategory = Title::makeTitleSafe( NS_CATEGORY, $cat );
-               if ( $containerCategory ) {
-                       $this->mOutput->addCategory( $containerCategory->getDBkey(), $this->getDefaultSort() );
-                       return true;
-               } else {
-                       wfDebug( __METHOD__ . ": [[MediaWiki:$msg]] is not a valid title!\n" );
-                       return false;
-               }
+               return $this->mOutput->addTrackingCategory( $msg, $this->mTitle );
        }
 
        /**
@@ -4597,13 +4672,13 @@ class Parser {
                                if ( $isTemplate ) {
                                        # Put a T flag in the section identifier, to indicate to extractSections()
                                        # that sections inside <includeonly> should be counted.
-                                       $editlinkArgs = array( $titleText, "T-$sectionIndex"/*, null */ );
+                                       $editsectionPage = $titleText;
+                                       $editsectionSection = "T-$sectionIndex";
+                                       $editsectionContent = null;
                                } else {
-                                       $editlinkArgs = array(
-                                               $this->mTitle->getPrefixedText(),
-                                               $sectionIndex,
-                                               $headlineHint
-                                       );
+                                       $editsectionPage = $this->mTitle->getPrefixedText();
+                                       $editsectionSection = $sectionIndex;
+                                       $editsectionContent = $headlineHint;
                                }
                                // We use a bit of pesudo-xml for editsection markers. The
                                // language converter is run later on. Using a UNIQ style marker
@@ -4616,10 +4691,11 @@ class Parser {
                                // important bits of data, but put the headline hint inside a
                                // content block because the language converter is supposed to
                                // be able to convert that piece of data.
-                               $editlink = '<mw:editsection page="' . htmlspecialchars( $editlinkArgs[0] );
-                               $editlink .= '" section="' . htmlspecialchars( $editlinkArgs[1] ) . '"';
-                               if ( isset( $editlinkArgs[2] ) ) {
-                                       $editlink .= '>' . $editlinkArgs[2] . '</mw:editsection>';
+                               // Gets replaced with html in ParserOutput::getText
+                               $editlink = '<mw:editsection page="' . htmlspecialchars( $editsectionPage );
+                               $editlink .= '" section="' . htmlspecialchars( $editsectionSection ) . '"';
+                               if ( $editsectionContent !== null ) {
+                                       $editlink .= '>' . $editsectionContent . '</mw:editsection>';
                                } else {
                                        $editlink .= '/>';
                                }
index 2ca9d50..b570fa5 100644 (file)
@@ -116,6 +116,12 @@ class ParserOptions {
         */
        public $mRemoveComments = true;
 
+       /**
+        * Callback for current revision fetching. Used as first argument to call_user_func().
+        */
+       public $mCurrentRevisionCallback =
+               array( 'Parser', 'statelessFetchRevision' );
+
        /**
         * Callback for template fetching. Used as first argument to call_user_func().
         */
@@ -211,6 +217,13 @@ class ParserOptions {
         */
        protected $onAccessCallback = null;
 
+       /**
+        * If the page being parsed is a redirect, this should hold the redirect
+        * target.
+        * @var Title|null
+        */
+       private $redirectTarget = null;
+
        public function getInterwikiMagic() {
                return $this->mInterwikiMagic;
        }
@@ -282,6 +295,11 @@ class ParserOptions {
                return $this->mRemoveComments;
        }
 
+       /* @since 1.24 */
+       public function getCurrentRevisionCallback() {
+               return $this->mCurrentRevisionCallback;
+       }
+
        public function getTemplateCallback() {
                return $this->mTemplateCallback;
        }
@@ -455,6 +473,11 @@ class ParserOptions {
                return wfSetVar( $this->mRemoveComments, $x );
        }
 
+       /* @since 1.24 */
+       public function setCurrentRevisionCallback( $x ) {
+               return wfSetVar( $this->mCurrentRevisionCallback, $x );
+       }
+
        public function setTemplateCallback( $x ) {
                return wfSetVar( $this->mTemplateCallback, $x );
        }
@@ -515,6 +538,30 @@ class ParserOptions {
                return wfSetVar( $this->mIsPrintable, $x );
        }
 
+       /**
+        * Set the redirect target.
+        *
+        * Note that setting or changing this does not *make* the page a redirect
+        * or change its target, it merely records the information for reference
+        * during the parse.
+        *
+        * @since 1.24
+        * @param Title|null $title
+        */
+       function setRedirectTarget( $title ) {
+               $this->redirectTarget = $title;
+       }
+
+       /**
+        * Get the previously-set redirect target.
+        *
+        * @since 1.24
+        * @return Title|null
+        */
+       function getRedirectTarget() {
+               return $this->redirectTarget;
+       }
+
        /**
         * Extra key that should be present in the parser cache key.
         * @param string $key
index 75fc01f..43e8d0b 100644 (file)
@@ -50,13 +50,13 @@ class ParserOutput extends CacheTime {
                $mTOCHTML = '',               # HTML of the TOC
                $mTimestamp,                  # Timestamp of the revision
                $mTOCEnabled = true;          # Whether TOC should be shown, can't override __NOTOC__
-               private $mIndexPolicy = '';       # 'index' or 'noindex'?  Any other value will result in no change.
-               private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
-               private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else.
-               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 $mIndexPolicy = '';       # 'index' or 'noindex'?  Any other value will result in no change.
+       private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
+       private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else.
+       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
 
        const EDITSECTION_REGEX =
                '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
@@ -75,8 +75,27 @@ class ParserOutput extends CacheTime {
                wfProfileIn( __METHOD__ );
                $text = $this->mText;
                if ( $this->mEditSectionTokens ) {
-                       $text = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
-                               array( &$this, 'replaceEditSectionLinksCallback' ), $text );
+                       $text = preg_replace_callback(
+                               ParserOutput::EDITSECTION_REGEX,
+                               function ( $m ) {
+                                       global $wgOut, $wgLang;
+                                       $editsectionPage = Title::newFromText( htmlspecialchars_decode( $m[1] ) );
+                                       $editsectionSection = htmlspecialchars_decode( $m[2] );
+                                       $editsectionContent = isset( $m[4] ) ? $m[3] : null;
+
+                                       if ( !is_object( $editsectionPage ) ) {
+                                               throw new MWException( "Bad parser output text." );
+                                       }
+
+                                       $skin = $wgOut->getSkin();
+                                       return call_user_func_array(
+                                               array( $skin, 'doEditSectionLink' ),
+                                               array( $editsectionPage, $editsectionSection,
+                                                       $editsectionContent, $wgLang->getCode() )
+                                       );
+                               },
+                               $text
+                       );
                } else {
                        $text = preg_replace( ParserOutput::EDITSECTION_REGEX, '', $text );
                }
@@ -95,29 +114,6 @@ class ParserOutput extends CacheTime {
                return $text;
        }
 
-       /**
-        * callback used by getText to replace editsection tokens
-        * @private
-        * @param array $m
-        * @throws MWException
-        * @return mixed
-        */
-       public function replaceEditSectionLinksCallback( $m ) {
-               global $wgOut, $wgLang;
-               $args = array(
-                       htmlspecialchars_decode( $m[1] ),
-                       htmlspecialchars_decode( $m[2] ),
-                       isset( $m[4] ) ? $m[3] : null,
-               );
-               $args[0] = Title::newFromText( $args[0] );
-               if ( !is_object( $args[0] ) ) {
-                       throw new MWException( "Bad parser output text." );
-               }
-               $args[] = $wgLang->getCode();
-               $skin = $wgOut->getSkin();
-               return call_user_func_array( array( $skin, 'doEditSectionLink' ), $args );
-       }
-
        public function &getLanguageLinks() {
                return $this->mLanguageLinks;
        }
@@ -475,6 +471,46 @@ class ParserOutput extends CacheTime {
                $this->mPreventClickjacking = $this->mPreventClickjacking || $out->getPreventClickjacking();
        }
 
+       /**
+        * Add a tracking category, getting the title from a system message,
+        * or print a debug message if the title is invalid.
+        *
+        * Please add any message that you use with this function to
+        * $wgTrackingCategories. That way they will be listed on
+        * Special:TrackingCategories.
+        *
+        * @param string $msg Message key
+        * @param Title $title title of the page which is being tracked
+        * @return bool Whether the addition was successful
+        * @since 1.25
+        */
+       public function addTrackingCategory( $msg, $title ) {
+               if ( $title->getNamespace() === NS_SPECIAL ) {
+                       wfDebug( __METHOD__ . ": Not adding tracking category $msg to special page!\n" );
+                       return false;
+               }
+
+               // Important to parse with correct title (bug 31469)
+               $cat = wfMessage( $msg )
+                       ->title( $title )
+                       ->inContentLanguage()
+                       ->text();
+
+               # Allow tracking categories to be disabled by setting them to "-"
+               if ( $cat === '-' ) {
+                       return false;
+               }
+
+               $containerCategory = Title::makeTitleSafe( NS_CATEGORY, $cat );
+               if ( $containerCategory ) {
+                       $this->addCategory( $containerCategory->getDBkey(), $this->getProperty( 'defaultsort' ) ?: '' );
+                       return true;
+               } else {
+                       wfDebug( __METHOD__ . ": [[MediaWiki:$msg]] is not a valid title!\n" );
+                       return false;
+               }
+       }
+
        /**
         * Override the title to be used for display
         * -- this is assumed to have been validated
@@ -737,10 +773,12 @@ class ParserOutput extends CacheTime {
                if ( !$clock || $clock === 'wall' ) {
                        $ret['wall'] = microtime( true );
                }
-               if ( ( !$clock || $clock === 'cpu' ) && function_exists( 'getrusage' ) ) {
-                       $ru = getrusage();
-                       $ret['cpu'] = $ru['ru_utime.tv_sec'] + $ru['ru_utime.tv_usec'] / 1e6;
-                       $ret['cpu'] += $ru['ru_stime.tv_sec'] + $ru['ru_stime.tv_usec'] / 1e6;
+               if ( !$clock || $clock === 'cpu' ) {
+                       $ru = wfGetRusage();
+                       if ( $ru ) {
+                               $ret['cpu'] = $ru['ru_utime.tv_sec'] + $ru['ru_utime.tv_usec'] / 1e6;
+                               $ret['cpu'] += $ru['ru_stime.tv_sec'] + $ru['ru_stime.tv_usec'] / 1e6;
+                       }
                }
                return $ret;
        }
@@ -809,6 +847,7 @@ class ParserOutput extends CacheTime {
 
        /**
         * Save space for for serialization by removing useless values
+        * @return array
         */
        public function __sleep() {
                return array_diff(
index 77ffe9d..b32593c 100644 (file)
@@ -97,32 +97,54 @@ interface PPFrame {
 
        /**
         * Expand a document tree node, caching the result on its parent with the given key
+        * @param string|int $key
+        * @param string|PPNode $root
+        * @param int $flags
+        * @return string
         */
        public function cachedExpand( $key, $root, $flags = 0 );
 
        /**
         * Expand a document tree node
+        * @param string|PPNode $root
+        * @param int $flags
+        * @return string
         */
        public function expand( $root, $flags = 0 );
 
        /**
         * Implode with flags for expand()
+        * @param string $sep
+        * @param int $flags
+        * @param string|PPNode $args,...
+        * @return string
         */
        public function implodeWithFlags( $sep, $flags /*, ... */ );
 
        /**
         * Implode with no flags specified
+        * @param string $sep
+        * @param string|PPNode $args,...
+        * @return string
         */
        public function implode( $sep /*, ... */ );
 
        /**
         * Makes an object that, when expand()ed, will be the same as one obtained
         * with implode()
+        * @param string $sep
+        * @param string|PPNode $args,...
+        * @return PPNode
         */
        public function virtualImplode( $sep /*, ... */ );
 
        /**
         * Virtual implode with brackets
+        * @param string $start
+        * @param string $sep
+        * @param string $end
+        * @param string|PPNode $args,...
+        * @return PPNode
         */
        public function virtualBracketedImplode( $start, $sep, $end /*, ... */ );
 
@@ -135,21 +157,26 @@ interface PPFrame {
 
        /**
         * Returns all arguments of this frame
+        * @return array
         */
        public function getArguments();
 
        /**
         * Returns all numbered arguments of this frame
+        * @return array
         */
        public function getNumberedArguments();
 
        /**
         * Returns all named arguments of this frame
+        * @return array
         */
        public function getNamedArguments();
 
        /**
         * Get an argument to this frame by name
+        * @param string $name
+        * @return bool
         */
        public function getArgument( $name );
 
@@ -163,6 +190,7 @@ interface PPFrame {
 
        /**
         * Return true if the frame is a template frame
+        * @return bool
         */
        public function isTemplate();
 
@@ -240,6 +268,7 @@ interface PPNode {
        /**
         * Get an array-type node containing the children of this node.
         * Returns false if this is not a tree node.
+        * @return PPNode
         */
        public function getChildren();
 
@@ -252,12 +281,15 @@ interface PPNode {
 
        /**
         * Get the next sibling of any node. False if there isn't one
+        * @return PPNode
         */
        public function getNextSibling();
 
        /**
         * Get all children of this tree node which have a given name.
         * Returns an array-type node, or false if this is not a tree node.
+        * @param string $type
+        * @return bool|PPNode
         */
        public function getChildrenOfType( $type );
 
@@ -268,6 +300,8 @@ interface PPNode {
 
        /**
         * Returns an item of an array-type node
+        * @param int $i
+        * @return bool|PPNode
         */
        public function item( $i );
 
@@ -282,6 +316,7 @@ interface PPNode {
         *    #nodelist     An array-type node
         *
         * The subclass may define various other names for tree and leaf nodes.
+        * @return string
         */
        public function getName();
 
@@ -290,17 +325,20 @@ interface PPNode {
         *    name          PPNode name
         *    index         String index
         *    value         PPNode value
+        * @return array
         */
        public function splitArg();
 
        /**
         * Split an "<ext>" node into an associative array containing name, attr, inner and close
         * All values in the resulting array are PPNodes. Inner and close are optional.
+        * @return array
         */
        public function splitExt();
 
        /**
         * Split an "<h>" node
+        * @return array
         */
        public function splitHeading();
 }
index 6136555..2edb79a 100644 (file)
@@ -1033,7 +1033,7 @@ class PPFrame_DOM implements PPFrame {
                                if ( $arg instanceof PPNode ) {
                                        $arg = $arg->node;
                                }
-                               if ( !$xpath ) {
+                               if ( !$xpath || $xpath->document !== $arg->ownerDocument ) {
                                        $xpath = new DOMXPath( $arg->ownerDocument );
                                }
 
@@ -1315,6 +1315,7 @@ class PPFrame_DOM implements PPFrame {
        /**
         * @param string $sep
         * @param int $flags
+        * @param string|PPNode_DOM|DOMDocument $args,...
         * @return string
         */
        public function implodeWithFlags( $sep, $flags /*, ... */ ) {
@@ -1346,6 +1347,7 @@ class PPFrame_DOM implements PPFrame {
         * This previously called implodeWithFlags but has now been inlined to reduce stack depth
         *
         * @param string $sep
+        * @param string|PPNode_DOM|DOMDocument $args,...
         * @return string
         */
        public function implode( $sep /*, ... */ ) {
@@ -1377,6 +1379,7 @@ class PPFrame_DOM implements PPFrame {
         * with implode()
         *
         * @param string $sep
+        * @param string|PPNode_DOM|DOMDocument $args,...
         * @return array
         */
        public function virtualImplode( $sep /*, ... */ ) {
@@ -1408,6 +1411,7 @@ class PPFrame_DOM implements PPFrame {
         * @param string $start
         * @param string $sep
         * @param string $end
+        * @param string|PPNode_DOM|DOMDocument $args,...
         * @return array
         */
        public function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) {
index f751832..6376396 100644 (file)
@@ -1001,7 +1001,7 @@ class PPFrame_Hash implements PPFrame {
        /**
         * @throws MWException
         * @param string|int $key
-        * @param string|PPNode_Hash|DOMDocument $root
+        * @param string|PPNode $root
         * @param int $flags
         * @return string
         */
@@ -1224,6 +1224,7 @@ class PPFrame_Hash implements PPFrame {
        /**
         * @param string $sep
         * @param int $flags
+        * @param string|PPNode $args,...
         * @return string
         */
        public function implodeWithFlags( $sep, $flags /*, ... */ ) {
@@ -1254,6 +1255,7 @@ class PPFrame_Hash implements PPFrame {
         * Implode with no flags specified
         * This previously called implodeWithFlags but has now been inlined to reduce stack depth
         * @param string $sep
+        * @param string|PPNode $args,...
         * @return string
         */
        public function implode( $sep /*, ... */ ) {
@@ -1285,6 +1287,7 @@ class PPFrame_Hash implements PPFrame {
         * with implode()
         *
         * @param string $sep
+        * @param string|PPNode $args,...
         * @return PPNode_Hash_Array
         */
        public function virtualImplode( $sep /*, ... */ ) {
@@ -1317,6 +1320,7 @@ class PPFrame_Hash implements PPFrame {
         * @param string $start
         * @param string $sep
         * @param string $end
+        * @param string|PPNode $args,...
         * @return PPNode_Hash_Array
         */
        public function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) {
@@ -1524,7 +1528,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
        /**
         * @throws MWException
         * @param string|int $key
-        * @param string|PPNode_Hash|DOMDocument $root
+        * @param string|PPNode $root
         * @param int $flags
         * @return string
         */
index 3b4ebb1..48d6866 100644 (file)
@@ -141,11 +141,15 @@ final class PasswordFactory {
         * If no existing object is given, make a new default object. If one is given, clone that
         * object. Then pass the plaintext to Password::crypt().
         *
-        * @param string $password Plaintext password
+        * @param string|null $password Plaintext password, or null for an invalid password
         * @param Password|null $existing Optional existing hash to get options from
         * @return Password
         */
        public function newFromPlaintext( $password, Password $existing = null ) {
+               if ( $password === null ) {
+                       return new InvalidPassword( $this, array( 'type' => '' ), null );
+               }
+
                if ( $existing === null ) {
                        $config = $this->types[$this->default];
                        $obj = new $config['class']( $this, $config );
index 7b8f340..418b5d4 100644 (file)
  * @file
  * @ingroup Profiler
  * @defgroup Profiler Profiler
- * This file is only included if profiling is enabled
  */
 
+/**
+ * Get system resource usage of current request context.
+ * Invokes the getrusage(2) system call, requesting RUSAGE_SELF if on PHP5
+ * or RUSAGE_THREAD if on HHVM. Returns false if getrusage is not available.
+ *
+ * @since 1.24
+ * @return array|bool Resource usage data or false if no data available.
+ */
+function wfGetRusage() {
+       if ( !function_exists( 'getrusage' ) ) {
+               return false;
+       } elseif ( defined ( 'HHVM_VERSION' ) ) {
+               return getrusage( 2 /* RUSAGE_THREAD */ );
+       } else {
+               return getrusage( 0 /* RUSAGE_SELF */ );
+       }
+}
+
 /**
  * Begin profiling of a function
  * @param string $functionname Name of the function we will profile
@@ -272,10 +289,10 @@ abstract class Profiler {
         */
        protected function getTime( $metric = 'wall' ) {
                if ( $metric === 'cpu' || $metric === 'user' ) {
-                       if ( !function_exists( 'getrusage' ) ) {
+                       $ru = wfGetRusage();
+                       if ( !$ru ) {
                                return 0;
                        }
-                       $ru = getrusage();
                        $time = $ru['ru_utime.tv_sec'] + $ru['ru_utime.tv_usec'] / 1e6;
                        if ( $metric === 'cpu' ) {
                                # This is the time of system calls, added to the user time
index 38a6436..7ef0ad0 100644 (file)
@@ -58,7 +58,7 @@ class ProfilerSimpleDB extends ProfilerStandard {
                        $dbw = wfGetDB( DB_MASTER );
                        $useTrx = ( $dbw->getType() === 'sqlite' ); // much faster
                        if ( $useTrx ) {
-                               $dbw->begin();
+                               $dbw->startAtomic( __METHOD__ );
                        }
                        foreach ( $this->mCollated as $name => $data ) {
                                $eventCount = $data['count'];
@@ -103,7 +103,7 @@ class ProfilerSimpleDB extends ProfilerStandard {
                                //     "pf_time=pf_time + VALUES(pf_time)";
                        }
                        if ( $useTrx ) {
-                               $dbw->commit();
+                               $dbw->endAtomic( __METHOD__ );
                        }
                } catch ( DBError $e ) {
                }
index 18e6003..519606c 100644 (file)
@@ -39,64 +39,63 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
         */
        public function getLine( array $feed, RecentChange $rc, $actionComment ) {
                global $wgCanonicalServer, $wgServerName, $wgScriptPath;
-               $attrib = $rc->getAttributes();
 
                $packet = array(
                        // Usually, RC ID is exposed only for patrolling purposes,
                        // but there is no real reason not to expose it in other cases,
                        // and I can see how this may be potentially useful for clients.
-                       'id' => $attrib['rc_id'],
-                       'type' => RecentChange::parseFromRCType( $attrib['rc_type'] ),
+                       'id' => $rc->getAttribute( 'rc_id' ),
+                       'type' => RecentChange::parseFromRCType( $rc->getAttribute( 'rc_type' ) ),
                        'namespace' => $rc->getTitle()->getNamespace(),
                        'title' => $rc->getTitle()->getPrefixedText(),
-                       'comment' => $attrib['rc_comment'],
-                       'timestamp' => (int)wfTimestamp( TS_UNIX, $attrib['rc_timestamp'] ),
-                       'user' => $attrib['rc_user_text'],
-                       'bot' => (bool)$attrib['rc_bot'],
+                       'comment' => $rc->getAttribute( 'rc_comment' ),
+                       'timestamp' => (int)wfTimestamp( TS_UNIX, $rc->getAttribute( 'rc_timestamp' ) ),
+                       'user' => $rc->getAttribute( 'rc_user_text' ),
+                       'bot' => (bool)$rc->getAttribute( 'rc_bot' ),
                );
 
                if ( isset( $feed['channel'] ) ) {
                        $packet['channel'] = $feed['channel'];
                }
 
-               $type = $attrib['rc_type'];
+               $type = $rc->getAttribute( 'rc_type' );
                if ( $type == RC_EDIT || $type == RC_NEW ) {
                        global $wgUseRCPatrol, $wgUseNPPatrol;
 
-                       $packet['minor'] = (bool)$attrib['rc_minor'];
+                       $packet['minor'] = (bool)$rc->getAttribute( 'rc_minor' );
                        if ( $wgUseRCPatrol || ( $type == RC_NEW && $wgUseNPPatrol ) ) {
-                               $packet['patrolled'] = (bool)$attrib['rc_patrolled'];
+                               $packet['patrolled'] = (bool)$rc->getAttribute( 'rc_patrolled' );
                        }
                }
 
                switch ( $type ) {
                        case RC_EDIT:
                                $packet['length'] = array(
-                                       'old' => $attrib['rc_old_len'],
-                                       'new' => $attrib['rc_new_len']
+                                       'old' => $rc->getAttribute( 'rc_old_len' ),
+                                       'new' => $rc->getAttribute( 'rc_new_len' )
                                );
                                $packet['revision'] = array(
-                                       'old' => $attrib['rc_last_oldid'],
-                                       'new' => $attrib['rc_this_oldid']
+                                       'old' => $rc->getAttribute( 'rc_last_oldid' ),
+                                       'new' => $rc->getAttribute( 'rc_this_oldid' )
                                );
                                break;
 
                        case RC_NEW:
-                               $packet['length'] = array( 'old' => null, 'new' => $attrib['rc_new_len'] );
-                               $packet['revision'] = array( 'old' => null, 'new' => $attrib['rc_this_oldid'] );
+                               $packet['length'] = array( 'old' => null, 'new' => $rc->getAttribute( 'rc_new_len' ) );
+                               $packet['revision'] = array( 'old' => null, 'new' => $rc->getAttribute( 'rc_this_oldid' ) );
                                break;
 
                        case RC_LOG:
-                               $packet['log_id'] = $attrib['rc_logid'];
-                               $packet['log_type'] = $attrib['rc_log_type'];
-                               $packet['log_action'] = $attrib['rc_log_action'];
-                               if ( $attrib['rc_params'] ) {
+                               $packet['log_id'] = $rc->getAttribute( 'rc_logid' );
+                               $packet['log_type'] = $rc->getAttribute( 'rc_log_type' );
+                               $packet['log_action'] = $rc->getAttribute( 'rc_log_action' );
+                               if ( $rc->getAttribute( 'rc_params' ) ) {
                                        wfSuppressWarnings();
-                                       $params = unserialize( $attrib['rc_params'] );
+                                       $params = unserialize( $rc->getAttribute( 'rc_params' ) );
                                        wfRestoreWarnings();
                                        if (
                                                // If it's an actual serialised false...
-                                               $attrib['rc_params'] == serialize( false ) ||
+                                               $rc->getAttribute( 'rc_params' ) == serialize( false ) ||
                                                // Or if we did not get false back when trying to unserialise
                                                $params !== false
                                        ) {
@@ -113,7 +112,7 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
                                                }
                                                $packet['log_params'] = $logParams;
                                        } else {
-                                               $packet['log_params'] = explode( "\n", $attrib['rc_params'] );
+                                               $packet['log_params'] = explode( "\n", $rc->getAttribute( 'rc_params' ) );
                                        }
                                }
                                $packet['log_action_comment'] = $actionComment;
index 198420c..57deb00 100644 (file)
@@ -32,28 +32,35 @@ class ResourceLoader {
        /** @var int */
        protected static $filterCacheVersion = 7;
 
-       /** @var array */
-       protected static $requiredSourceProperties = array( 'loadScript' );
-
        /** @var bool */
        protected static $debugMode = null;
 
-       /** @var array Module name/ResourceLoaderModule object pairs */
+       /**
+        * Module name/ResourceLoaderModule object pairs
+        * @var array
+        */
        protected $modules = array();
 
-       /** @var array Associative array mapping module name to info associative array */
+       /**
+        * Associative array mapping module name to info associative array
+        * @var array
+        */
        protected $moduleInfos = array();
 
        /** @var Config $config */
        private $config;
 
        /**
-        * @var array Associative array mapping framework ids to a list of names of test suite modules
-        *      like array( 'qunit' => array( 'mediawiki.tests.qunit.suites', 'ext.foo.tests', .. ), .. )
+        * Associative array mapping framework ids to a list of names of test suite modules
+        * like array( 'qunit' => array( 'mediawiki.tests.qunit.suites', 'ext.foo.tests', .. ), .. )
+        * @var array
         */
        protected $testModuleNames = array();
 
-       /** @var array E.g. array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) ) */
+       /**
+        * E.g. array( 'source-id' => 'http://.../load.php' )
+        * @var array
+        */
        protected $sources = array();
 
        /** @var bool */
@@ -231,10 +238,7 @@ class ResourceLoader {
                $this->config = $config;
 
                // Add 'local' source first
-               $this->addSource(
-                       'local',
-                       array( 'loadScript' => wfScript( 'load' ), 'apiScript' => wfScript( 'api' ) )
-               );
+               $this->addSource( 'local', wfScript( 'load' ) );
 
                // Add other sources
                $this->addSource( $config->get( 'ResourceLoaderSources' ) );
@@ -401,14 +405,12 @@ class ResourceLoader {
        /**
         * Add a foreign source of modules.
         *
-        * Source properties:
-        * 'loadScript': URL (either fully-qualified or protocol-relative) of load.php for this source
-        *
-        * @param mixed $id Source ID (string), or array( id1 => props1, id2 => props2, ... )
-        * @param array $properties Source properties
+        * @param array|string $id Source ID (string), or array( id1 => loadUrl, id2 => loadUrl, ... )
+        * @param string|array $loadUrl load.php url (string), or array with loadUrl key for
+        *  backwards-compatibility.
         * @throws MWException
         */
-       public function addSource( $id, $properties = null ) {
+       public function addSource( $id, $loadUrl = null ) {
                // Allow multiple sources to be registered in one call
                if ( is_array( $id ) ) {
                        foreach ( $id as $key => $value ) {
@@ -425,14 +427,18 @@ class ResourceLoader {
                        );
                }
 
-               // Validate properties
-               foreach ( self::$requiredSourceProperties as $prop ) {
-                       if ( !isset( $properties[$prop] ) ) {
-                               throw new MWException( "Required property $prop missing from source ID $id" );
+               // Pre 1.24 backwards-compatibility
+               if ( is_array( $loadUrl ) ) {
+                       if ( !isset( $loadUrl['loadScript'] ) ) {
+                               throw new MWException(
+                                       __METHOD__ . ' was passed an array with no "loadScript" key.'
+                               );
                        }
+
+                       $loadUrl = $loadUrl['loadScript'];
                }
 
-               $this->sources[$id] = $properties;
+               $this->sources[$id] = $loadUrl;
        }
 
        /**
@@ -527,7 +533,7 @@ class ResourceLoader {
        /**
         * Get the list of sources.
         *
-        * @return array Like array( id => array of properties, .. )
+        * @return array Like array( id => load.php url, .. )
         */
        public function getSources() {
                return $this->sources;
@@ -546,7 +552,7 @@ class ResourceLoader {
                if ( !isset( $this->sources[$source] ) ) {
                        throw new MWException( "The $source source was never registered in ResourceLoader." );
                }
-               return $this->sources[$source]['loadScript'];
+               return $this->sources[$source];
        }
 
        /**
@@ -855,7 +861,7 @@ class ResourceLoader {
                // Pre-fetch blobs
                if ( $context->shouldIncludeMessages() ) {
                        try {
-                               $blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
+                               $blobs = MessageBlobStore::getInstance()->get( $this, $modules, $context->getLanguage() );
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
                                wfDebugLog(
@@ -1006,13 +1012,6 @@ class ResourceLoader {
                        if ( count( $states ) ) {
                                $out .= self::makeLoaderStateScript( $states );
                        }
-
-                       // In only=script requests for modules that are not raw (e.g. not the startup module)
-                       // ensure the execution is conditional to avoid situations where browsers with an
-                       // unsupported environment do unconditionally execute a module's scripts. Otherwise users
-                       // will get things like "ReferenceError: mw is undefined" or "jQuery is undefined" from
-                       // legacy scripts loaded with only=scripts (such as the 'site' module).
-                       $out = self::makeLoaderConditionalScript( $out );
                } else {
                        if ( count( $states ) ) {
                                $exceptions .= self::makeComment(
@@ -1179,11 +1178,13 @@ class ResourceLoader {
         * Returns JS code which calls mw.loader.register with the given
         * parameters. Has three calling conventions:
         *
-        *   - ResourceLoader::makeLoaderRegisterScript( $name, $version, $dependencies, $group, $source, $skip ):
-        *       Register a single module.
+        *   - ResourceLoader::makeLoaderRegisterScript( $name, $version,
+        *        $dependencies, $group, $source, $skip
+        *     ):
+        *        Register a single module.
         *
         *   - ResourceLoader::makeLoaderRegisterScript( array( $name1, $name2 ) ):
-        *       Register modules with the given names.
+        *        Register modules with the given names.
         *
         *   - ResourceLoader::makeLoaderRegisterScript( array(
         *        array( $name1, $version1, $dependencies1, $group1, $source1, $skip1 ),
@@ -1226,7 +1227,7 @@ class ResourceLoader {
         *   - ResourceLoader::makeLoaderSourcesScript( $id, $properties ):
         *       Register a single source
         *
-        *   - ResourceLoader::makeLoaderSourcesScript( array( $id1 => $props1, $id2 => $props2, ... ) );
+        *   - ResourceLoader::makeLoaderSourcesScript( array( $id1 => $loadUrl, $id2 => $loadUrl, ... ) );
         *       Register sources with the given IDs and properties.
         *
         * @param string $id Source ID
@@ -1481,7 +1482,7 @@ class ResourceLoader {
 
                $less = new lessc();
                $less->setPreserveComments( true );
-               $less->setVariables( self::getLESSVars( $config ) );
+               $less->setVariables( self::getLessVars( $config ) );
                $less->setImportDir( $config->get( 'ResourceLoaderLESSImportPaths' ) );
                foreach ( $config->get( 'ResourceLoaderLESSFunctions' ) as $name => $func ) {
                        $less->registerFunction( $name, $func );
@@ -1496,7 +1497,7 @@ class ResourceLoader {
         * @since 1.22
         * @return array Map of variable names to string CSS values.
         */
-       public static function getLESSVars( Config $config ) {
+       public static function getLessVars( Config $config ) {
                $lessVars = $config->get( 'ResourceLoaderLESSVars' );
                // Sort by key to ensure consistent hashing for cache lookups.
                ksort( $lessVars );
index e79aadc..7af7b89 100644 (file)
@@ -113,7 +113,9 @@ class ResourceLoaderContext {
         * @return ResourceLoaderContext
         */
        public static function newDummyContext() {
-               return new self( new ResourceLoader, new FauxRequest( array() ) );
+               return new self( new ResourceLoader(
+                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+               ), new FauxRequest( array() ) );
        }
 
        /**
diff --git a/includes/resourceloader/ResourceLoaderEditToolbarModule.php b/includes/resourceloader/ResourceLoaderEditToolbarModule.php
new file mode 100644 (file)
index 0000000..2e07911
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Resource loader module for the edit toolbar.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * ResourceLoader module for the edit toolbar.
+ *
+ * @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
+        */
+       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.
+        *
+        * @return array
+        */
+       private function getLessVars( ResourceLoaderContext $context ) {
+               $language = Language::factory( $context->getLanguage() );
+
+               // This is very conveniently formatted and we can pass it right through
+               $vars = $language->getImageFiles();
+
+               // lessc tries to be helpful and parse our variables as LESS source code
+               foreach ( $vars as $key => &$value ) {
+                       $value = self::cssSerializeString( $value );
+               }
+
+               return $vars;
+       }
+
+       /**
+        * @param ResourceLoaderContext $context
+        * @return int UNIX timestamp
+        */
+       public function getModifiedTime( ResourceLoaderContext $context ) {
+               return max(
+                       parent::getModifiedTime( $context ),
+                       $this->getHashMtime( $context )
+               );
+       }
+
+       /**
+        * @param ResourceLoaderContext $context
+        * @return string Hash
+        */
+       public function getModifiedHash( ResourceLoaderContext $context ) {
+               return md5(
+                       parent::getModifiedHash( $context ) .
+                       serialize( $this->getLessVars( $context ) )
+               );
+       }
+
+       /**
+        * Get a LESS compiler instance for this module.
+        *
+        * Set our variables in it.
+        *
+        * @throws MWException
+        * @param ResourceLoaderContext $context
+        * @return lessc
+        */
+       protected function getLessCompiler( ResourceLoaderContext $context = null ) {
+               $compiler = parent::getLessCompiler();
+               $compiler->setVariables( $this->getLessVars( $context ) );
+               return $compiler;
+       }
+}
index 8a223b0..7bbc9bb 100644 (file)
@@ -168,7 +168,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @param string $localBasePath Base path to prepend to all local paths in $options. Defaults
         *     to $IP
         * @param string $remoteBasePath Base path to prepend to all remote paths in $options. Defaults
-        *     to $wgScriptPath
+        *     to $wgResourceBasePath
         *
         * Below is a description for the $options array:
         * @throws MWException
@@ -177,7 +177,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *     array(
         *         // Base path to prepend to all local paths in $options. Defaults to $IP
         *         'localBasePath' => [base path],
-        *         // Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath
+        *         // Base path to prepend to all remote paths in $options. Defaults to $wgResourceBasePath
         *         'remoteBasePath' => [base path],
         *         // Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath
         *         'remoteExtPath' => [base path],
@@ -291,7 +291,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @param string $localBasePath Path to use if not provided in module definition. Defaults
         *     to $IP
         * @param string $remoteBasePath Path to use if not provided in module definition. Defaults
-        *     to $wgScriptPath
+        *     to $wgResourceBasePath
         * @return array Array( localBasePath, remoteBasePath )
         */
        public static function extractBasePaths(
@@ -299,14 +299,16 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                $localBasePath = null,
                $remoteBasePath = null
        ) {
-               global $IP, $wgScriptPath, $wgResourceBasePath;
+               global $IP, $wgResourceBasePath;
 
                // The different ways these checks are done, and their ordering, look very silly,
                // but were preserved for backwards-compatibility just in case. Tread lightly.
 
-               $localBasePath = $localBasePath === null ? $IP : $localBasePath;
+               if ( $localBasePath === null ) {
+                       $localBasePath = $IP;
+               }
                if ( $remoteBasePath === null ) {
-                       $remoteBasePath = $wgResourceBasePath === null ? $wgScriptPath : $wgResourceBasePath;
+                       $remoteBasePath = $wgResourceBasePath;
                }
 
                if ( isset( $options['remoteExtPath'] ) ) {
@@ -385,7 +387,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        public function getStyles( ResourceLoaderContext $context ) {
                $styles = $this->readStyleFiles(
                        $this->getStyleFiles( $context ),
-                       $this->getFlip( $context )
+                       $this->getFlip( $context ),
+                       $context
                );
                // Collect referenced files
                $this->localFileRefs = array_unique( $this->localFileRefs );
@@ -533,7 +536,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $files,
                        $this->scripts,
                        $context->getDebug() ? $this->debugScripts : array(),
-                       self::tryForKey( $this->languageScripts, $context->getLanguage() ),
+                       $this->getLanguageScripts( $context->getLanguage() ),
                        self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' ),
                        $this->loaderScripts
                );
@@ -697,7 +700,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        protected function getScriptFiles( ResourceLoaderContext $context ) {
                $files = array_merge(
                        $this->scripts,
-                       self::tryForKey( $this->languageScripts, $context->getLanguage() ),
+                       $this->getLanguageScripts( $context->getLanguage() ),
                        self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' )
                );
                if ( $context->getDebug() ) {
@@ -707,6 +710,29 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                return array_unique( $files, SORT_REGULAR );
        }
 
+       /**
+        * Get the set of language scripts for the given language,
+        * possibly using a fallback language.
+        *
+        * @param string $lang
+        * @return array
+        */
+       private function getLanguageScripts( $lang ) {
+               $scripts = self::tryForKey( $this->languageScripts, $lang );
+               if ( $scripts ) {
+                       return $scripts;
+               }
+               $fallbacks = Language::getFallbacksFor( $lang );
+               foreach ( $fallbacks as $lang ) {
+                       $scripts = self::tryForKey( $this->languageScripts, $lang );
+                       if ( $scripts ) {
+                               return $scripts;
+                       }
+               }
+
+               return array();
+       }
+
        /**
         * Get a list of file paths for all styles in this module, in order of proper inclusion.
         *
@@ -816,14 +842,14 @@ 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)
         *
         * @throws MWException
         * @return array List of concatenated and remapped CSS data from $styles,
         *     keyed by media type
         */
-       public function readStyleFiles( array $styles, $flip ) {
+       public function readStyleFiles( array $styles, $flip, $context = null ) {
                if ( empty( $styles ) ) {
                        return array();
                }
@@ -831,7 +857,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $uniqueFiles = array_unique( $files, SORT_REGULAR );
                        $styleFiles = array();
                        foreach ( $uniqueFiles as $file ) {
-                               $styleFiles[] = $this->readStyleFile( $file, $flip );
+                               $styleFiles[] = $this->readStyleFile( $file, $flip, $context );
                        }
                        $styles[$media] = implode( "\n", $styleFiles );
                }
@@ -845,11 +871,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @param string $path File path of style file to read
         * @param bool $flip
+        * @param ResourceLoaderContext $context (optional)
         *
         * @return string CSS data in script file
         * @throws MWException If the file doesn't exist
         */
-       protected function readStyleFile( $path, $flip ) {
+       protected function readStyleFile( $path, $flip, $context = null ) {
                $localPath = $this->getLocalPath( $path );
                $remotePath = $this->getRemotePath( $path );
                if ( !file_exists( $localPath ) ) {
@@ -859,7 +886,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                }
 
                if ( $this->getStyleSheetLang( $localPath ) === 'less' ) {
-                       $style = $this->compileLESSFile( $localPath );
+                       $compiler = $this->getLessCompiler( $context );
+                       $style = $this->compileLessFile( $localPath, $compiler );
                        $this->hasGeneratedStyles = true;
                } else {
                        $style = file_get_contents( $localPath );
@@ -899,60 +927,36 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Generate a cache key for a LESS file.
+        * Compile a LESS file into CSS.
         *
-        * The cache key varies on the file name and the names and values of global
-        * LESS variables.
+        * Keeps track of all used files and adds them to localFileRefs.
         *
         * @since 1.22
-        * @param string $fileName File name of root LESS file.
-        * @return string Cache key
+        * @throws Exception If lessc encounters a parse error
+        * @param string $fileName File path of LESS source
+        * @param lessc $compiler Compiler to use, if not default
+        * @return string CSS source
         */
-       protected function getLESSCacheKey( $fileName ) {
-               $vars = json_encode( ResourceLoader::getLESSVars( $this->getConfig() ) );
-               $hash = md5( $fileName . $vars );
-               return wfMemcKey( 'resourceloader', 'less', $hash );
+       protected function compileLessFile( $fileName, $compiler = null ) {
+               if ( !$compiler ) {
+                       $compiler = $this->getLessCompiler();
+               }
+               $result = $compiler->compileFile( $fileName );
+               $this->localFileRefs += array_keys( $compiler->allParsedFiles() );
+               return $result;
        }
 
        /**
-        * Compile a LESS file into CSS.
+        * Get a LESS compiler instance for this module in given context.
         *
-        * If invalid, returns replacement CSS source consisting of the compilation
-        * error message encoded as a comment. To save work, we cache a result object
-        * which comprises the compiled CSS and the names & mtimes of the files
-        * that were processed. lessphp compares the cached & current mtimes and
-        * recompiles as necessary.
+        * Just calls ResourceLoader::getLessCompiler() by default to get a global compiler.
         *
-        * @since 1.22
-        * @throws Exception If Less encounters a parse error
-        * @throws MWException If Less compilation returns unexpection result
-        * @param string $fileName File path of LESS source
-        * @return string CSS source
+        * @param ResourceLoaderContext $context
+        * @throws MWException
+        * @since 1.24
+        * @return lessc
         */
-       protected function compileLESSFile( $fileName ) {
-               $key = $this->getLESSCacheKey( $fileName );
-               $cache = wfGetCache( CACHE_ANYTHING );
-
-               // The input to lessc. Either an associative array representing the
-               // cached results of a previous compilation, or the string file name if
-               // no cache result exists.
-               $source = $cache->get( $key );
-               if ( !is_array( $source ) || !isset( $source['root'] ) ) {
-                       $source = $fileName;
-               }
-
-               $compiler = ResourceLoader::getLessCompiler( $this->getConfig() );
-               $result = null;
-
-               $result = $compiler->cachedCompile( $source );
-
-               if ( !is_array( $result ) ) {
-                       throw new MWException( 'LESS compiler result has type '
-                               . gettype( $result ) . '; array expected.' );
-               }
-
-               $this->localFileRefs += array_keys( $result['files'] );
-               $cache->set( $key, $result );
-               return $result['compiled'];
+       protected function getLessCompiler( ResourceLoaderContext $context = null ) {
+               return ResourceLoader::getLessCompiler( $this->getConfig() );
        }
 }
diff --git a/includes/resourceloader/ResourceLoaderLESSFunctions.php b/includes/resourceloader/ResourceLoaderLESSFunctions.php
deleted file mode 100644 (file)
index eb1461f..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * PHP-provided functions for LESS; see docs for $wgResourceLoaderLESSFunctions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write 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 ResourceLoaderLESSFunctions {
-       /**
-        * Check if an image file reference is suitable for embedding.
-        * An image is embeddable if it (a) exists, (b) has a suitable MIME-type,
-        * (c) does not exceed IE<9 size limit of 32kb. This is a LESS predicate
-        * function; it returns a LESS boolean value and can thus be used as a
-        * mixin guard.
-        *
-        * @par Example:
-        * @code
-        *   .background-image(@url) when(embeddable(@url)) {
-        *       background-image: url(@url) !ie;
-        *   }
-        * @endcode
-        */
-       public static function embeddable( $frame, $less ) {
-               $base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
-               $url = trim( $less->compileValue( $frame ), '"\'' );
-               $file = realpath( $base . '/' . $url );
-               return $less->toBool( $file
-                       && strpos( $url, '//' ) === false
-                       && filesize( $file ) < CSSMin::EMBED_SIZE_LIMIT
-                       && CSSMin::getMimeType( $file ) !== false );
-       }
-
-       /**
-        * Convert an image URI to a base64-encoded data URI.
-        *
-        * @par Example:
-        * @code
-        *   .fancy-button {
-        *       background-image: embed('../images/button-bg.png');
-        *   }
-        * @endcode
-        */
-       public static function embed( $frame, $less ) {
-               $base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
-               $url = trim( $less->compileValue( $frame ), '"\'' );
-               $file = realpath( $base . '/' . $url );
-
-               $data = CSSMin::encodeImageAsDataURI( $file );
-               $less->addParsedFile( $file );
-               return CSSMin::buildUrlValue( $data );
-       }
-}
index a1c8ac9..09d90d6 100644 (file)
@@ -43,6 +43,7 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
                        'grammarForms' => $language->getGrammarForms(),
                        'pluralRules' => $language->getPluralRules(),
                        'digitGroupingPattern' => $language->digitGroupingPattern(),
+                       'fallbackLanguages' => $language->getFallbackLanguages(),
                );
        }
 
diff --git a/includes/resourceloader/ResourceLoaderSkinModule.php b/includes/resourceloader/ResourceLoaderSkinModule.php
new file mode 100644 (file)
index 0000000..6de1be0
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Resource loader module for skin stylesheets.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 Timo Tijhof
+ */
+
+class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
+
+       /* Methods */
+
+       /**
+        * @param $context ResourceLoaderContext
+        * @return array
+        */
+       public function getStyles( ResourceLoaderContext $context ) {
+               $logo = $this->getConfig()->get( 'Logo' );
+               $styles = parent::getStyles( $context );
+               $styles['all'][] = '.mw-wiki-logo { background-image: ' .
+                       CSSMin::buildUrlValue( $logo ) .
+                       '; }';
+
+               return $styles;
+       }
+
+       /**
+        * @param $context ResourceLoaderContext
+        * @return boolean
+        */
+       public function isKnownEmpty( ResourceLoaderContext $context ) {
+               // Regardless of whether the files are specified, we always
+               // provide mw-wiki-logo styles.
+               return false;
+       }
+
+       /**
+        * @param $context ResourceLoaderContext
+        * @return int|mixed
+        */
+       public function getModifiedTime( ResourceLoaderContext $context ) {
+               $parentMTime = parent::getModifiedTime( $context );
+               return max( $parentMTime, $this->getHashMtime( $context ) );
+       }
+
+       /**
+        * @param $context ResourceLoaderContext
+        * @return string: Hash
+        */
+       public function getModifiedHash( ResourceLoaderContext $context ) {
+               $logo = $this->getConfig()->get( 'Logo' );
+               return md5( parent::getModifiedHash( $context ) . $logo );
+       }
+}
index 78fe45c..ee66288 100644 (file)
@@ -92,9 +92,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgSiteName' => $conf->get( 'Sitename' ),
                        'wgFileExtensions' => array_values( array_unique( $conf->get( 'FileExtensions' ) ) ),
                        'wgDBname' => $conf->get( 'DBname' ),
-                       // This sucks, it is only needed on Special:Upload, but I could
-                       // not find a way to add vars only for a certain module
-                       'wgFileCanRotate' => BitmapHandler::canRotate(),
                        'wgAvailableSkins' => Skin::getSkinNames(),
                        'wgExtensionAssetsPath' => $conf->get( 'ExtensionAssetsPath' ),
                        // MediaWiki sets cookies to have this prefix by default
@@ -207,6 +204,13 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                continue;
                        }
 
+                       if ( $module->isRaw() ) {
+                               // Don't register "raw" modules (like 'jquery' and 'mediawiki') client-side because
+                               // depending on them is illegal anyway and would only lead to them being reloaded
+                               // causing any state to be lost (like jQuery plugins, mw.config etc.)
+                               continue;
+                       }
+
                        // getModifiedTime() is supposed to return a UNIX timestamp, but it doesn't always
                        // seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
                        $moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
@@ -383,11 +387,20 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        $registrations = $this->getModuleRegistrations( $context );
                        // Fix indentation
                        $registrations = str_replace( "\n", "\n\t", trim( $registrations ) );
+                       $mwMapJsCall = Xml::encodeJsCall(
+                               'mw.Map',
+                               array( $this->getConfig()->get( 'LegacyJavaScriptGlobals' ) )
+                       );
+                       $mwConfigSetJsCall = Xml::encodeJsCall(
+                               'mw.config.set',
+                               array( $configuration )
+                       );
+
                        $out .= "var startUp = function () {\n" .
                                "\tmw.config = new " .
-                               Xml::encodeJsCall( 'mw.Map', array( $this->getConfig()->get( 'LegacyJavaScriptGlobals' ) ) ) . "\n" .
+                               $mwMapJsCall . "\n" .
                                "\t$registrations\n" .
-                               "\t" . Xml::encodeJsCall( 'mw.config.set', array( $configuration ) ) .
+                               "\t" . $mwConfigSetJsCall .
                                "};\n";
 
                        // Conditional script injection
index e652422..668467c 100644 (file)
@@ -44,8 +44,8 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
 
                return array(
                        'editToken' => $wgUser->getEditToken(),
-                       'patrolToken' => ApiQueryRecentChanges::getPatrolToken( null, null ),
-                       'watchToken' => ApiQueryInfo::getWatchToken( null, null ),
+                       'patrolToken' => $wgUser->getEditToken( 'patrol' ),
+                       'watchToken' => $wgUser->getEditToken( 'watch' ),
                );
        }
 
index 0472f1a..2a1736d 100644 (file)
@@ -36,8 +36,8 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
        # Origin is user-supplied code
        protected $origin = self::ORIGIN_USER_SITEWIDE;
 
-       // In-object cache for title mtimes
-       protected $titleMtimes = array();
+       // In-object cache for title info
+       protected $titleInfo = array();
 
        /* Abstract Protected Methods */
 
@@ -81,9 +81,15 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
         * @return null|string
         */
        protected function getContent( $title ) {
-               if ( !$title->isCssJsSubpage() && !$title->isCssOrJsPage() ) {
+               $handler = ContentHandler::getForTitle( $title );
+               if ( $handler->isSupportedFormat( CONTENT_FORMAT_CSS ) ) {
+                       $format = CONTENT_FORMAT_CSS;
+               } elseif ( $handler->isSupportedFormat( CONTENT_FORMAT_JAVASCRIPT ) ) {
+                       $format = CONTENT_FORMAT_JAVASCRIPT;
+               } else {
                        return null;
                }
+
                $revision = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
                if ( !$revision ) {
                        return null;
@@ -96,14 +102,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        return null;
                }
 
-               $model = $content->getModel();
-
-               if ( $model !== CONTENT_MODEL_CSS && $model !== CONTENT_MODEL_JAVASCRIPT ) {
-                       wfDebugLog( 'resourceloader', __METHOD__ . ': bad content model $model for JS/CSS page!' );
-                       return null;
-               }
-
-               return $content->getNativeData(); //NOTE: this is safe, we know it's JS or CSS
+               return $content->serialize( $format );
        }
 
        /* Methods */
@@ -169,8 +168,11 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
                $modifiedTime = 1; // wfTimestamp() interprets 0 as "now"
-               $mtimes = $this->getTitleMtimes( $context );
-               if ( count( $mtimes ) ) {
+               $titleInfo = $this->getTitleInfo( $context );
+               if ( count( $titleInfo ) ) {
+                       $mtimes = array_map( function ( $value ) {
+                               return $value['timestamp'];
+                       }, $titleInfo );
                        $modifiedTime = max( $modifiedTime, max( $mtimes ) );
                }
                $modifiedTime = max(
@@ -199,16 +201,35 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
         * @return bool
         */
        public function isKnownEmpty( ResourceLoaderContext $context ) {
-               return count( $this->getTitleMtimes( $context ) ) == 0;
+               $titleInfo = $this->getTitleInfo( $context );
+               // Bug 68488: For modules in the "user" group, we should actually
+               // check that the pages are empty (page_len == 0), but for other
+               // groups, just check the pages exist so that we don't end up
+               // caching temporarily-blank pages without the appropriate
+               // <script> or <link> tag.
+               if ( $this->getGroup() !== 'user' ) {
+                       return count( $titleInfo ) === 0;
+               }
+
+               foreach ( $titleInfo as $info ) {
+                       if ( $info['length'] !== 0 ) {
+                               // At least one non-0-lenth page, not empty
+                               return false;
+                       }
+               }
+
+               // All pages are 0-length, so it's empty
+               return true;
        }
 
        /**
         * Get the modification times of all titles that would be loaded for
         * a given context.
         * @param ResourceLoaderContext $context Context object
-        * @return array( prefixed DB key => UNIX timestamp ), nonexistent titles are dropped
+        * @return array keyed by page dbkey, with value is an array with 'length' and 'timestamp'
+        *               keys, where the timestamp is a unix one
         */
-       protected function getTitleMtimes( ResourceLoaderContext $context ) {
+       protected function getTitleInfo( ResourceLoaderContext $context ) {
                $dbr = $this->getDB();
                if ( !$dbr ) {
                        // We're dealing with a subclass that doesn't have a DB
@@ -216,11 +237,11 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                }
 
                $hash = $context->getHash();
-               if ( isset( $this->titleMtimes[$hash] ) ) {
-                       return $this->titleMtimes[$hash];
+               if ( isset( $this->titleInfo[$hash] ) ) {
+                       return $this->titleInfo[$hash];
                }
 
-               $this->titleMtimes[$hash] = array();
+               $this->titleInfo[$hash] = array();
                $batch = new LinkBatch;
                foreach ( $this->getPages( $context ) as $titleText => $options ) {
                        $batch->addObj( Title::newFromText( $titleText ) );
@@ -228,16 +249,18 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
 
                if ( !$batch->isEmpty() ) {
                        $res = $dbr->select( 'page',
-                               array( 'page_namespace', 'page_title', 'page_touched' ),
+                               array( 'page_namespace', 'page_title', 'page_touched', 'page_len' ),
                                $batch->constructSet( 'page', $dbr ),
                                __METHOD__
                        );
                        foreach ( $res as $row ) {
                                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $this->titleMtimes[$hash][$title->getPrefixedDBkey()] =
-                                       wfTimestamp( TS_UNIX, $row->page_touched );
+                               $this->titleInfo[$hash][$title->getPrefixedDBkey()] = array(
+                                       'timestamp' => wfTimestamp( TS_UNIX, $row->page_touched ),
+                                       'length' => $row->page_len,
+                               );
                        }
                }
-               return $this->titleMtimes[$hash];
+               return $this->titleInfo[$hash];
        }
 }
diff --git a/includes/revisiondelete/RevDelItem.php b/includes/revisiondelete/RevDelItem.php
new file mode 100644 (file)
index 0000000..ebdbf3a
--- /dev/null
@@ -0,0 +1,62 @@
+<?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 RevisionDelete
+ */
+
+/**
+ * Abstract base class for deletable items
+ */
+abstract class RevDelItem extends RevisionItemBase {
+       /**
+        * Returns true if the item is "current", and the operation to set the given
+        * bits can't be executed for that reason
+        * STUB
+        * @param int $newBits
+        * @return bool
+        */
+       public function isHideCurrentOp( $newBits ) {
+               return false;
+       }
+
+       /**
+        * Get the current deletion bitfield value
+        */
+       abstract public function getBits();
+
+       /**
+        * Set the visibility of the item. This should do any necessary DB queries.
+        *
+        * The DB update query should have a condition which forces it to only update
+        * if the value in the DB matches the value fetched earlier with the SELECT.
+        * If the update fails because it did not match, the function should return
+        * false. This prevents concurrency problems.
+        *
+        * @param int $newBits
+        * @return bool Success
+        */
+       abstract public function setBits( $newBits );
+
+       /**
+        * Get the return information about the revision for the API
+        * @since 1.23
+        * @param ApiResult $result API result object
+        * @return array Data for the API result
+        */
+       abstract public function getApiData( ApiResult $result );
+}
diff --git a/includes/revisiondelete/RevDelList.php b/includes/revisiondelete/RevDelList.php
new file mode 100644 (file)
index 0000000..a0ff667
--- /dev/null
@@ -0,0 +1,313 @@
+<?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 RevisionDelete
+ */
+
+/**
+ * Abstract base class for a list of deletable items. The list class
+ * needs to be able to make a query from a set of identifiers to pull
+ * relevant rows, to return RevDelItem subclasses wrapping them, and
+ * to wrap bulk update operations.
+ */
+abstract class RevDelList extends RevisionListBase {
+       function __construct( IContextSource $context, Title $title, array $ids ) {
+               parent::__construct( $context, $title );
+               $this->ids = $ids;
+       }
+
+       /**
+        * Get the DB field name associated with the ID list.
+        * This used to populate the log_search table for finding log entries.
+        * Override this function.
+        * @return string|null
+        */
+       public static function getRelationType() {
+               return null;
+       }
+
+       /**
+        * Get the user right required for this list type
+        * Override this function.
+        * @since 1.22
+        * @return string|null
+        */
+       public static function getRestriction() {
+               return null;
+       }
+
+       /**
+        * Get the revision deletion constant for this list type
+        * Override this function.
+        * @since 1.22
+        * @return int|null
+        */
+       public static function getRevdelConstant() {
+               return null;
+       }
+
+       /**
+        * Suggest a target for the revision deletion
+        * Optionally override this function.
+        * @since 1.22
+        * @param Title|null $target User-supplied target
+        * @param array $ids
+        * @return Title|null
+        */
+       public static function suggestTarget( $target, array $ids ) {
+               return $target;
+       }
+
+       /**
+        * Set the visibility for the revisions in this list. Logging and
+        * transactions are done here.
+        *
+        * @param array $params Associative array of parameters. Members are:
+        *     value:         The integer value to set the visibility to
+        *     comment:       The log comment.
+        *     perItemStatus: Set if you want per-item status reports
+        * @return Status
+        * @since 1.23 Added 'perItemStatus' param
+        */
+       public function setVisibility( $params ) {
+               $bitPars = $params['value'];
+               $comment = $params['comment'];
+               $perItemStatus = isset( $params['perItemStatus'] ) ? $params['perItemStatus'] : false;
+
+               $this->res = false;
+               $dbw = wfGetDB( DB_MASTER );
+               $this->doQuery( $dbw );
+               $dbw->begin( __METHOD__ );
+               $status = Status::newGood();
+               $missing = array_flip( $this->ids );
+               $this->clearFileOps();
+               $idsForLog = array();
+               $authorIds = $authorIPs = array();
+
+               if ( $perItemStatus ) {
+                       $status->itemStatuses = array();
+               }
+
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
+               for ( $this->reset(); $this->current(); $this->next() ) {
+                       // @codingStandardsIgnoreEnd
+                       $item = $this->current();
+                       unset( $missing[$item->getId()] );
+
+                       if ( $perItemStatus ) {
+                               $itemStatus = Status::newGood();
+                               $status->itemStatuses[$item->getId()] = $itemStatus;
+                       } else {
+                               $itemStatus = $status;
+                       }
+
+                       $oldBits = $item->getBits();
+                       // Build the actual new rev_deleted bitfield
+                       $newBits = RevisionDeleter::extractBitfield( $bitPars, $oldBits );
+
+                       if ( $oldBits == $newBits ) {
+                               $itemStatus->warning( 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
+                               $status->failCount++;
+                               continue;
+                       } elseif ( $oldBits == 0 && $newBits != 0 ) {
+                               $opType = 'hide';
+                       } elseif ( $oldBits != 0 && $newBits == 0 ) {
+                               $opType = 'show';
+                       } else {
+                               $opType = 'modify';
+                       }
+
+                       if ( $item->isHideCurrentOp( $newBits ) ) {
+                               // Cannot hide current version text
+                               $itemStatus->error( 'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
+                               $status->failCount++;
+                               continue;
+                       }
+                       if ( !$item->canView() ) {
+                               // Cannot access this revision
+                               $msg = ( $opType == 'show' ) ?
+                                       'revdelete-show-no-access' : 'revdelete-modify-no-access';
+                               $itemStatus->error( $msg, $item->formatDate(), $item->formatTime() );
+                               $status->failCount++;
+                               continue;
+                       }
+                       // Cannot just "hide from Sysops" without hiding any fields
+                       if ( $newBits == Revision::DELETED_RESTRICTED ) {
+                               $itemStatus->warning( 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
+                               $status->failCount++;
+                               continue;
+                       }
+
+                       // Update the revision
+                       $ok = $item->setBits( $newBits );
+
+                       if ( $ok ) {
+                               $idsForLog[] = $item->getId();
+                               $status->successCount++;
+                               if ( $item->getAuthorId() > 0 ) {
+                                       $authorIds[] = $item->getAuthorId();
+                               } elseif ( IP::isIPAddress( $item->getAuthorName() ) ) {
+                                       $authorIPs[] = $item->getAuthorName();
+                               }
+                       } else {
+                               $itemStatus->error( 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
+                               $status->failCount++;
+                       }
+               }
+
+               // Handle missing revisions
+               foreach ( $missing as $id => $unused ) {
+                       if ( $perItemStatus ) {
+                               $status->itemStatuses[$id] = Status::newFatal( 'revdelete-modify-missing', $id );
+                       } else {
+                               $status->error( 'revdelete-modify-missing', $id );
+                       }
+                       $status->failCount++;
+               }
+
+               if ( $status->successCount == 0 ) {
+                       $dbw->rollback( __METHOD__ );
+                       return $status;
+               }
+
+               // Save success count
+               $successCount = $status->successCount;
+
+               // Move files, if there are any
+               $status->merge( $this->doPreCommitUpdates() );
+               if ( !$status->isOK() ) {
+                       // Fatal error, such as no configured archive directory
+                       $dbw->rollback( __METHOD__ );
+                       return $status;
+               }
+
+               // Log it
+               $this->updateLog( array(
+                       'title' => $this->title,
+                       'count' => $successCount,
+                       'newBits' => $newBits,
+                       'oldBits' => $oldBits,
+                       'comment' => $comment,
+                       'ids' => $idsForLog,
+                       'authorIds' => $authorIds,
+                       'authorIPs' => $authorIPs
+               ) );
+               $dbw->commit( __METHOD__ );
+
+               // Clear caches
+               $status->merge( $this->doPostCommitUpdates() );
+               return $status;
+       }
+
+       /**
+        * Reload the list data from the master DB. This can be done after setVisibility()
+        * to allow $item->getHTML() to show the new data.
+        */
+       function reloadFromMaster() {
+               $dbw = wfGetDB( DB_MASTER );
+               $this->res = $this->doQuery( $dbw );
+       }
+
+       /**
+        * Record a log entry on the action
+        * @param array $params Associative array of parameters:
+        *     newBits:         The new value of the *_deleted bitfield
+        *     oldBits:         The old value of the *_deleted bitfield.
+        *     title:           The target title
+        *     ids:             The ID list
+        *     comment:         The log comment
+        *     authorsIds:      The array of the user IDs of the offenders
+        *     authorsIPs:      The array of the IP/anon user offenders
+        * @throws MWException
+        */
+       protected function updateLog( $params ) {
+               // Get the URL param's corresponding DB field
+               $field = RevisionDeleter::getRelationType( $this->getType() );
+               if ( !$field ) {
+                       throw new MWException( "Bad log URL param type!" );
+               }
+               // Put things hidden from sysops in the oversight log
+               if ( ( $params['newBits'] | $params['oldBits'] ) & $this->getSuppressBit() ) {
+                       $logType = 'suppress';
+               } else {
+                       $logType = 'delete';
+               }
+               // Add params for effected page and ids
+               $logParams = $this->getLogParams( $params );
+               // Actually add the deletion log entry
+               $log = new LogPage( $logType );
+               $logid = $log->addEntry( $this->getLogAction(), $params['title'],
+                       $params['comment'], $logParams, $this->getUser() );
+               // Allow for easy searching of deletion log items for revision/log items
+               $log->addRelations( $field, $params['ids'], $logid );
+               $log->addRelations( 'target_author_id', $params['authorIds'], $logid );
+               $log->addRelations( 'target_author_ip', $params['authorIPs'], $logid );
+       }
+
+       /**
+        * Get the log action for this list type
+        * @return string
+        */
+       public function getLogAction() {
+               return 'revision';
+       }
+
+       /**
+        * Get log parameter array.
+        * @param array $params Associative array of log parameters, same as updateLog()
+        * @return array
+        */
+       public function getLogParams( $params ) {
+               return array(
+                       $this->getType(),
+                       implode( ',', $params['ids'] ),
+                       "ofield={$params['oldBits']}",
+                       "nfield={$params['newBits']}"
+               );
+       }
+
+       /**
+        * Clear any data structures needed for doPreCommitUpdates() and doPostCommitUpdates()
+        * STUB
+        */
+       public function clearFileOps() {
+       }
+
+       /**
+        * A hook for setVisibility(): do batch updates pre-commit.
+        * STUB
+        * @return Status
+        */
+       public function doPreCommitUpdates() {
+               return Status::newGood();
+       }
+
+       /**
+        * A hook for setVisibility(): do any necessary updates post-commit.
+        * STUB
+        * @return Status
+        */
+       public function doPostCommitUpdates() {
+               return Status::newGood();
+       }
+
+       /**
+        * Get the integer value of the flag used for suppression
+        */
+       abstract public function getSuppressBit();
+}
diff --git a/includes/revisiondelete/RevisionDeleteAbstracts.php b/includes/revisiondelete/RevisionDeleteAbstracts.php
deleted file mode 100644 (file)
index e92a533..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-<?php
-/**
- * Interface definition for deletable items.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup RevisionDelete
- */
-
-/**
- * Abstract base class for a list of deletable items. The list class
- * needs to be able to make a query from a set of identifiers to pull
- * relevant rows, to return RevDelItem subclasses wrapping them, and
- * to wrap bulk update operations.
- */
-abstract class RevDelList extends RevisionListBase {
-       function __construct( IContextSource $context, Title $title, array $ids ) {
-               parent::__construct( $context, $title );
-               $this->ids = $ids;
-       }
-
-       /**
-        * Get the DB field name associated with the ID list.
-        * This used to populate the log_search table for finding log entries.
-        * Override this function.
-        * @return string|null
-        */
-       public static function getRelationType() {
-               return null;
-       }
-
-       /**
-        * Get the user right required for this list type
-        * Override this function.
-        * @since 1.22
-        * @return string|null
-        */
-       public static function getRestriction() {
-               return null;
-       }
-
-       /**
-        * Get the revision deletion constant for this list type
-        * Override this function.
-        * @since 1.22
-        * @return int|null
-        */
-       public static function getRevdelConstant() {
-               return null;
-       }
-
-       /**
-        * Suggest a target for the revision deletion
-        * Optionally override this function.
-        * @since 1.22
-        * @param Title|null $target User-supplied target
-        * @param array $ids
-        * @return Title|null
-        */
-       public static function suggestTarget( $target, array $ids ) {
-               return $target;
-       }
-
-       /**
-        * Set the visibility for the revisions in this list. Logging and
-        * transactions are done here.
-        *
-        * @param array $params Associative array of parameters. Members are:
-        *     value:         The integer value to set the visibility to
-        *     comment:       The log comment.
-        *     perItemStatus: Set if you want per-item status reports
-        * @return Status
-        * @since 1.23 Added 'perItemStatus' param
-        */
-       public function setVisibility( $params ) {
-               $bitPars = $params['value'];
-               $comment = $params['comment'];
-               $perItemStatus = isset( $params['perItemStatus'] ) ? $params['perItemStatus'] : false;
-
-               $this->res = false;
-               $dbw = wfGetDB( DB_MASTER );
-               $this->doQuery( $dbw );
-               $dbw->begin( __METHOD__ );
-               $status = Status::newGood();
-               $missing = array_flip( $this->ids );
-               $this->clearFileOps();
-               $idsForLog = array();
-               $authorIds = $authorIPs = array();
-
-               if ( $perItemStatus ) {
-                       $status->itemStatuses = array();
-               }
-
-               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
-               for ( $this->reset(); $this->current(); $this->next() ) {
-                       // @codingStandardsIgnoreEnd
-                       $item = $this->current();
-                       unset( $missing[$item->getId()] );
-
-                       if ( $perItemStatus ) {
-                               $itemStatus = Status::newGood();
-                               $status->itemStatuses[$item->getId()] = $itemStatus;
-                       } else {
-                               $itemStatus = $status;
-                       }
-
-                       $oldBits = $item->getBits();
-                       // Build the actual new rev_deleted bitfield
-                       $newBits = RevisionDeleter::extractBitfield( $bitPars, $oldBits );
-
-                       if ( $oldBits == $newBits ) {
-                               $itemStatus->warning( 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
-                               $status->failCount++;
-                               continue;
-                       } elseif ( $oldBits == 0 && $newBits != 0 ) {
-                               $opType = 'hide';
-                       } elseif ( $oldBits != 0 && $newBits == 0 ) {
-                               $opType = 'show';
-                       } else {
-                               $opType = 'modify';
-                       }
-
-                       if ( $item->isHideCurrentOp( $newBits ) ) {
-                               // Cannot hide current version text
-                               $itemStatus->error( 'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
-                               $status->failCount++;
-                               continue;
-                       }
-                       if ( !$item->canView() ) {
-                               // Cannot access this revision
-                               $msg = ( $opType == 'show' ) ?
-                                       'revdelete-show-no-access' : 'revdelete-modify-no-access';
-                               $itemStatus->error( $msg, $item->formatDate(), $item->formatTime() );
-                               $status->failCount++;
-                               continue;
-                       }
-                       // Cannot just "hide from Sysops" without hiding any fields
-                       if ( $newBits == Revision::DELETED_RESTRICTED ) {
-                               $itemStatus->warning( 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
-                               $status->failCount++;
-                               continue;
-                       }
-
-                       // Update the revision
-                       $ok = $item->setBits( $newBits );
-
-                       if ( $ok ) {
-                               $idsForLog[] = $item->getId();
-                               $status->successCount++;
-                               if ( $item->getAuthorId() > 0 ) {
-                                       $authorIds[] = $item->getAuthorId();
-                               } elseif ( IP::isIPAddress( $item->getAuthorName() ) ) {
-                                       $authorIPs[] = $item->getAuthorName();
-                               }
-                       } else {
-                               $itemStatus->error( 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
-                               $status->failCount++;
-                       }
-               }
-
-               // Handle missing revisions
-               foreach ( $missing as $id => $unused ) {
-                       if ( $perItemStatus ) {
-                               $status->itemStatuses[$id] = Status::newFatal( 'revdelete-modify-missing', $id );
-                       } else {
-                               $status->error( 'revdelete-modify-missing', $id );
-                       }
-                       $status->failCount++;
-               }
-
-               if ( $status->successCount == 0 ) {
-                       $dbw->rollback( __METHOD__ );
-                       return $status;
-               }
-
-               // Save success count
-               $successCount = $status->successCount;
-
-               // Move files, if there are any
-               $status->merge( $this->doPreCommitUpdates() );
-               if ( !$status->isOK() ) {
-                       // Fatal error, such as no configured archive directory
-                       $dbw->rollback( __METHOD__ );
-                       return $status;
-               }
-
-               // Log it
-               $this->updateLog( array(
-                       'title' => $this->title,
-                       'count' => $successCount,
-                       'newBits' => $newBits,
-                       'oldBits' => $oldBits,
-                       'comment' => $comment,
-                       'ids' => $idsForLog,
-                       'authorIds' => $authorIds,
-                       'authorIPs' => $authorIPs
-               ) );
-               $dbw->commit( __METHOD__ );
-
-               // Clear caches
-               $status->merge( $this->doPostCommitUpdates() );
-               return $status;
-       }
-
-       /**
-        * Reload the list data from the master DB. This can be done after setVisibility()
-        * to allow $item->getHTML() to show the new data.
-        */
-       function reloadFromMaster() {
-               $dbw = wfGetDB( DB_MASTER );
-               $this->res = $this->doQuery( $dbw );
-       }
-
-       /**
-        * Record a log entry on the action
-        * @param array $params Associative array of parameters:
-        *     newBits:         The new value of the *_deleted bitfield
-        *     oldBits:         The old value of the *_deleted bitfield.
-        *     title:           The target title
-        *     ids:             The ID list
-        *     comment:         The log comment
-        *     authorsIds:      The array of the user IDs of the offenders
-        *     authorsIPs:      The array of the IP/anon user offenders
-        * @throws MWException
-        */
-       protected function updateLog( $params ) {
-               // Get the URL param's corresponding DB field
-               $field = RevisionDeleter::getRelationType( $this->getType() );
-               if ( !$field ) {
-                       throw new MWException( "Bad log URL param type!" );
-               }
-               // Put things hidden from sysops in the oversight log
-               if ( ( $params['newBits'] | $params['oldBits'] ) & $this->getSuppressBit() ) {
-                       $logType = 'suppress';
-               } else {
-                       $logType = 'delete';
-               }
-               // Add params for effected page and ids
-               $logParams = $this->getLogParams( $params );
-               // Actually add the deletion log entry
-               $log = new LogPage( $logType );
-               $logid = $log->addEntry( $this->getLogAction(), $params['title'],
-                       $params['comment'], $logParams, $this->getUser() );
-               // Allow for easy searching of deletion log items for revision/log items
-               $log->addRelations( $field, $params['ids'], $logid );
-               $log->addRelations( 'target_author_id', $params['authorIds'], $logid );
-               $log->addRelations( 'target_author_ip', $params['authorIPs'], $logid );
-       }
-
-       /**
-        * Get the log action for this list type
-        * @return string
-        */
-       public function getLogAction() {
-               return 'revision';
-       }
-
-       /**
-        * Get log parameter array.
-        * @param array $params Associative array of log parameters, same as updateLog()
-        * @return array
-        */
-       public function getLogParams( $params ) {
-               return array(
-                       $this->getType(),
-                       implode( ',', $params['ids'] ),
-                       "ofield={$params['oldBits']}",
-                       "nfield={$params['newBits']}"
-               );
-       }
-
-       /**
-        * Clear any data structures needed for doPreCommitUpdates() and doPostCommitUpdates()
-        * STUB
-        */
-       public function clearFileOps() {
-       }
-
-       /**
-        * A hook for setVisibility(): do batch updates pre-commit.
-        * STUB
-        * @return Status
-        */
-       public function doPreCommitUpdates() {
-               return Status::newGood();
-       }
-
-       /**
-        * A hook for setVisibility(): do any necessary updates post-commit.
-        * STUB
-        * @return Status
-        */
-       public function doPostCommitUpdates() {
-               return Status::newGood();
-       }
-
-       /**
-        * Get the integer value of the flag used for suppression
-        */
-       abstract public function getSuppressBit();
-}
-
-/**
- * Abstract base class for deletable items
- */
-abstract class RevDelItem extends RevisionItemBase {
-       /**
-        * Returns true if the item is "current", and the operation to set the given
-        * bits can't be executed for that reason
-        * STUB
-        * @param int $newBits
-        * @return bool
-        */
-       public function isHideCurrentOp( $newBits ) {
-               return false;
-       }
-
-       /**
-        * Get the current deletion bitfield value
-        */
-       abstract public function getBits();
-
-       /**
-        * Set the visibility of the item. This should do any necessary DB queries.
-        *
-        * The DB update query should have a condition which forces it to only update
-        * if the value in the DB matches the value fetched earlier with the SELECT.
-        * If the update fails because it did not match, the function should return
-        * false. This prevents concurrency problems.
-        *
-        * @param int $newBits
-        * @return bool Success
-        */
-       abstract public function setBits( $newBits );
-
-       /**
-        * Get the return information about the revision for the API
-        * @since 1.23
-        * @param ApiResult $result API result object
-        * @return array Data for the API result
-        */
-       abstract public function getApiData( ApiResult $result );
-}
index 7e5f685..c3c3a8f 100644 (file)
@@ -483,6 +483,7 @@ class SearchHighlighter {
         * the target is category or image, leave it
         *
         * @param array $matches
+        * @return string
         */
        function linkReplace( $matches ) {
                $colon = strpos( $matches[1], ':' );
@@ -559,15 +560,15 @@ class SearchHighlighter {
         * Returns the first few lines of the text
         *
         * @param string $text
-        * @param int $contextlines max number of returned lines
-        * @param int $contextchars average number of characters per line
+        * @param int $contextlines Max number of returned lines
+        * @param int $contextchars Average number of characters per line
         * @return string
         */
-       public function highlightNone( $text, $contextlines, $contextchars) {
+       public function highlightNone( $text, $contextlines, $contextchars ) {
                $match = array();
                $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 = 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
                return str_replace( "\n", '<br>', $text );
        }
index de701f7..0d7970d 100644 (file)
@@ -34,10 +34,7 @@ class SearchMssql extends SearchDatabase {
         * @access public
         */
        function searchText( $term ) {
-               $resultSet = $this->db->resultObject(
-                       $this->db->query( $this->getQuery( $this->filter( $term ), true ) )
-               );
-
+               $resultSet = $this->db->query( $this->getQuery( $this->filter( $term ), true ) );
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
@@ -49,10 +46,7 @@ class SearchMssql extends SearchDatabase {
         * @access public
         */
        function searchTitle( $term ) {
-               $resultSet = $this->db->resultObject(
-                       $this->db->query( $this->getQuery( $this->filter( $term ), false ) )
-               );
-
+               $resultSet = $this->db->query( $this->getQuery( $this->filter( $term ), false ) );
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
index 348da79..5821148 100644 (file)
@@ -69,10 +69,7 @@ class SearchOracle extends SearchDatabase {
                        return new SqlSearchResultSet( false, '' );
                }
 
-               $resultSet = $this->db->resultObject(
-                       $this->db->query( $this->getQuery( $this->filter( $term ), true ) )
-               );
-
+               $resultSet = $this->db->query( $this->getQuery( $this->filter( $term ), true ) );
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
@@ -87,10 +84,7 @@ class SearchOracle extends SearchDatabase {
                        return new SqlSearchResultSet( false, '' );
                }
 
-               $resultSet = $this->db->resultObject(
-                       $this->db->query( $this->getQuery( $this->filter( $term ), false ) )
-               );
-
+               $resultSet = $this->db->query( $this->getQuery( $this->filter( $term ), false ) );
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
index 914bc1c..59b0c31 100644 (file)
@@ -40,7 +40,7 @@ class SearchPostgres extends SearchDatabase {
        function searchTitle( $term ) {
                $q = $this->searchQuery( $term, 'titlevector', 'page_title' );
                $olderror = error_reporting( E_ERROR );
-               $resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
+               $resultSet = $this->db->query( $q, 'SearchPostgres', true );
                error_reporting( $olderror );
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
@@ -48,7 +48,7 @@ class SearchPostgres extends SearchDatabase {
        function searchText( $term ) {
                $q = $this->searchQuery( $term, 'textvector', 'old_text' );
                $olderror = error_reporting( E_ERROR );
-               $resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
+               $resultSet = $this->db->query( $q, 'SearchPostgres', true );
                error_reporting( $olderror );
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
@@ -142,6 +142,7 @@ class SearchPostgres extends SearchDatabase {
                $top = $res->fetchRow();
                $top = $top[0];
 
+               $this->searchTerms = array();
                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 " .
index 1d28691..aeaba8d 100644 (file)
@@ -61,35 +61,6 @@ class SearchResult {
                return $result;
        }
 
-       /**
-        * Return a new SearchResult and initializes it with a row.
-        *
-        * @param object $row
-        * @return SearchResult
-        */
-       public static function newFromRow( $row ) {
-               $result = new self();
-               $result->initFromRow( $row );
-               return $result;
-       }
-
-       public function __construct( $row = null ) {
-               if ( !is_null( $row ) ) {
-                       // Backwards compatibility with pre-1.17 callers
-                       $this->initFromRow( $row );
-               }
-       }
-
-       /**
-        * Initialize from a database row. Makes a Title and passes that to
-        * initFromTitle.
-        *
-        * @param object $row
-        */
-       protected function initFromRow( $row ) {
-               $this->initFromTitle( Title::makeTitle( $row->page_namespace, $row->page_title ) );
-       }
-
        /**
         * Initialize from a Title and if possible initializes a corresponding
         * Revision and File.
@@ -242,13 +213,6 @@ class SearchResult {
                return strlen( $this->mText );
        }
 
-       /**
-        * @return bool If hit has related articles
-        */
-       function hasRelated() {
-               return false;
-       }
-
        /**
         * @return string Interwiki prefix of the title (return iw even if title is broken)
         */
index 698f93c..406d322 100644 (file)
@@ -161,7 +161,9 @@ class SqlSearchResultSet extends SearchResultSet {
                        return false;
                }
 
-               return SearchResult::newFromRow( $row );
+               return SearchResult::newFromTitle(
+                       Title::makeTitle( $row->page_namespace, $row->page_title )
+               );
        }
 
        function free() {
index 6659407..e5d05be 100644 (file)
@@ -314,11 +314,7 @@ class SiteSQLStore implements SiteStore {
 
                $dbw = $this->sitesTable->getWriteDbConnection();
 
-               $trx = $dbw->trxLevel();
-
-               if ( $trx == 0 ) {
-                       $dbw->begin( __METHOD__ );
-               }
+               $dbw->startAtomic( __METHOD__ );
 
                $success = true;
 
@@ -360,9 +356,7 @@ class SiteSQLStore implements SiteStore {
                        );
                }
 
-               if ( $trx == 0 ) {
-                       $dbw->commit( __METHOD__ );
-               }
+               $dbw->endAtomic( __METHOD__ );
 
                // purge cache
                $this->reset();
@@ -398,18 +392,10 @@ class SiteSQLStore implements SiteStore {
                wfProfileIn( __METHOD__ );
                $dbw = $this->sitesTable->getWriteDbConnection();
 
-               $trx = $dbw->trxLevel();
-
-               if ( $trx == 0 ) {
-                       $dbw->begin( __METHOD__ );
-               }
-
+               $dbw->startAtomic( __METHOD__ );
                $ok = $dbw->delete( 'sites', '*', __METHOD__ );
                $ok = $dbw->delete( 'site_identifiers', '*', __METHOD__ ) && $ok;
-
-               if ( $trx == 0 ) {
-                       $dbw->commit( __METHOD__ );
-               }
+               $dbw->endAtomic( __METHOD__ );
 
                $this->reset();
 
diff --git a/includes/skins/BaseTemplate.php b/includes/skins/BaseTemplate.php
new file mode 100644 (file)
index 0000000..6dc33ac
--- /dev/null
@@ -0,0 +1,614 @@
+<?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
+ */
+
+/**
+ * New base template for a skin's template extended from QuickTemplate
+ * this class features helper methods that provide common ways of interacting
+ * with the data stored in the QuickTemplate
+ */
+abstract class BaseTemplate extends QuickTemplate {
+
+       /**
+        * Get a Message object with its context set
+        *
+        * @param string $name Message name
+        * @return Message
+        */
+       public function getMsg( $name ) {
+               return $this->getSkin()->msg( $name );
+       }
+
+       function msg( $str ) {
+               echo $this->getMsg( $str )->escaped();
+       }
+
+       function msgHtml( $str ) {
+               echo $this->getMsg( $str )->text();
+       }
+
+       function msgWiki( $str ) {
+               echo $this->getMsg( $str )->parseAsBlock();
+       }
+
+       /**
+        * Create an array of common toolbox items from the data in the quicktemplate
+        * stored by SkinTemplate.
+        * The resulting array is built according to a format intended to be passed
+        * through makeListItem to generate the html.
+        * @return array
+        */
+       function getToolbox() {
+               wfProfileIn( __METHOD__ );
+
+               $toolbox = array();
+               if ( isset( $this->data['nav_urls']['whatlinkshere'] )
+                       && $this->data['nav_urls']['whatlinkshere']
+               ) {
+                       $toolbox['whatlinkshere'] = $this->data['nav_urls']['whatlinkshere'];
+                       $toolbox['whatlinkshere']['id'] = 't-whatlinkshere';
+               }
+               if ( isset( $this->data['nav_urls']['recentchangeslinked'] )
+                       && $this->data['nav_urls']['recentchangeslinked']
+               ) {
+                       $toolbox['recentchangeslinked'] = $this->data['nav_urls']['recentchangeslinked'];
+                       $toolbox['recentchangeslinked']['msg'] = 'recentchangeslinked-toolbox';
+                       $toolbox['recentchangeslinked']['id'] = 't-recentchangeslinked';
+               }
+               if ( isset( $this->data['feeds'] ) && $this->data['feeds'] ) {
+                       $toolbox['feeds']['id'] = 'feedlinks';
+                       $toolbox['feeds']['links'] = array();
+                       foreach ( $this->data['feeds'] as $key => $feed ) {
+                               $toolbox['feeds']['links'][$key] = $feed;
+                               $toolbox['feeds']['links'][$key]['id'] = "feed-$key";
+                               $toolbox['feeds']['links'][$key]['rel'] = 'alternate';
+                               $toolbox['feeds']['links'][$key]['type'] = "application/{$key}+xml";
+                               $toolbox['feeds']['links'][$key]['class'] = 'feedlink';
+                       }
+               }
+               foreach ( array( 'contributions', 'log', 'blockip', 'emailuser',
+                       'userrights', 'upload', 'specialpages' ) as $special
+               ) {
+                       if ( isset( $this->data['nav_urls'][$special] ) && $this->data['nav_urls'][$special] ) {
+                               $toolbox[$special] = $this->data['nav_urls'][$special];
+                               $toolbox[$special]['id'] = "t-$special";
+                       }
+               }
+               if ( isset( $this->data['nav_urls']['print'] ) && $this->data['nav_urls']['print'] ) {
+                       $toolbox['print'] = $this->data['nav_urls']['print'];
+                       $toolbox['print']['id'] = 't-print';
+                       $toolbox['print']['rel'] = 'alternate';
+                       $toolbox['print']['msg'] = 'printableversion';
+               }
+               if ( isset( $this->data['nav_urls']['permalink'] ) && $this->data['nav_urls']['permalink'] ) {
+                       $toolbox['permalink'] = $this->data['nav_urls']['permalink'];
+                       if ( $toolbox['permalink']['href'] === '' ) {
+                               unset( $toolbox['permalink']['href'] );
+                               $toolbox['ispermalink']['tooltiponly'] = true;
+                               $toolbox['ispermalink']['id'] = 't-ispermalink';
+                               $toolbox['ispermalink']['msg'] = 'permalink';
+                       } else {
+                               $toolbox['permalink']['id'] = 't-permalink';
+                       }
+               }
+               if ( isset( $this->data['nav_urls']['info'] ) && $this->data['nav_urls']['info'] ) {
+                       $toolbox['info'] = $this->data['nav_urls']['info'];
+                       $toolbox['info']['id'] = 't-info';
+               }
+
+               wfRunHooks( 'BaseTemplateToolbox', array( &$this, &$toolbox ) );
+               wfProfileOut( __METHOD__ );
+               return $toolbox;
+       }
+
+       /**
+        * Create an array of personal tools items from the data in the quicktemplate
+        * stored by SkinTemplate.
+        * The resulting array is built according to a format intended to be passed
+        * through makeListItem to generate the html.
+        * This is in reality the same list as already stored in personal_urls
+        * however it is reformatted so that you can just pass the individual items
+        * to makeListItem instead of hardcoding the element creation boilerplate.
+        * @return array
+        */
+       function getPersonalTools() {
+               $personal_tools = array();
+               foreach ( $this->get( 'personal_urls' ) as $key => $plink ) {
+                       # The class on a personal_urls item is meant to go on the <a> instead
+                       # of the <li> so we have to use a single item "links" array instead
+                       # of using most of the personal_url's keys directly.
+                       $ptool = array(
+                               'links' => array(
+                                       array( 'single-id' => "pt-$key" ),
+                               ),
+                               'id' => "pt-$key",
+                       );
+                       if ( isset( $plink['active'] ) ) {
+                               $ptool['active'] = $plink['active'];
+                       }
+                       foreach ( array( 'href', 'class', 'text', 'dir' ) as $k ) {
+                               if ( isset( $plink[$k] ) ) {
+                                       $ptool['links'][0][$k] = $plink[$k];
+                               }
+                       }
+                       $personal_tools[$key] = $ptool;
+               }
+               return $personal_tools;
+       }
+
+       function getSidebar( $options = array() ) {
+               // Force the rendering of the following portals
+               $sidebar = $this->data['sidebar'];
+               if ( !isset( $sidebar['SEARCH'] ) ) {
+                       $sidebar['SEARCH'] = true;
+               }
+               if ( !isset( $sidebar['TOOLBOX'] ) ) {
+                       $sidebar['TOOLBOX'] = true;
+               }
+               if ( !isset( $sidebar['LANGUAGES'] ) ) {
+                       $sidebar['LANGUAGES'] = true;
+               }
+
+               if ( !isset( $options['search'] ) || $options['search'] !== true ) {
+                       unset( $sidebar['SEARCH'] );
+               }
+               if ( isset( $options['toolbox'] ) && $options['toolbox'] === false ) {
+                       unset( $sidebar['TOOLBOX'] );
+               }
+               if ( isset( $options['languages'] ) && $options['languages'] === false ) {
+                       unset( $sidebar['LANGUAGES'] );
+               }
+
+               $boxes = array();
+               foreach ( $sidebar as $boxName => $content ) {
+                       if ( $content === false ) {
+                               continue;
+                       }
+                       switch ( $boxName ) {
+                       case 'SEARCH':
+                               // Search is a special case, skins should custom implement this
+                               $boxes[$boxName] = array(
+                                       'id' => 'p-search',
+                                       'header' => $this->getMsg( 'search' )->text(),
+                                       'generated' => false,
+                                       'content' => true,
+                               );
+                               break;
+                       case 'TOOLBOX':
+                               $msgObj = $this->getMsg( 'toolbox' );
+                               $boxes[$boxName] = array(
+                                       'id' => 'p-tb',
+                                       'header' => $msgObj->exists() ? $msgObj->text() : 'toolbox',
+                                       'generated' => false,
+                                       'content' => $this->getToolbox(),
+                               );
+                               break;
+                       case 'LANGUAGES':
+                               if ( $this->data['language_urls'] ) {
+                                       $msgObj = $this->getMsg( 'otherlanguages' );
+                                       $boxes[$boxName] = array(
+                                               'id' => 'p-lang',
+                                               'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
+                                               'generated' => false,
+                                               'content' => $this->data['language_urls'],
+                                       );
+                               }
+                               break;
+                       default:
+                               $msgObj = $this->getMsg( $boxName );
+                               $boxes[$boxName] = array(
+                                       'id' => "p-$boxName",
+                                       'header' => $msgObj->exists() ? $msgObj->text() : $boxName,
+                                       'generated' => true,
+                                       'content' => $content,
+                               );
+                               break;
+                       }
+               }
+
+               // HACK: Compatibility with extensions still using SkinTemplateToolboxEnd
+               $hookContents = null;
+               if ( isset( $boxes['TOOLBOX'] ) ) {
+                       ob_start();
+                       // We pass an extra 'true' at the end so extensions using BaseTemplateToolbox
+                       // can abort and avoid outputting double toolbox links
+                       wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
+                       $hookContents = ob_get_contents();
+                       ob_end_clean();
+                       if ( !trim( $hookContents ) ) {
+                               $hookContents = null;
+                       }
+               }
+               // END hack
+
+               if ( isset( $options['htmlOnly'] ) && $options['htmlOnly'] === true ) {
+                       foreach ( $boxes as $boxName => $box ) {
+                               if ( is_array( $box['content'] ) ) {
+                                       $content = '<ul>';
+                                       foreach ( $box['content'] as $key => $val ) {
+                                               $content .= "\n " . $this->makeListItem( $key, $val );
+                                       }
+                                       // HACK, shove the toolbox end onto the toolbox if we're rendering itself
+                                       if ( $hookContents ) {
+                                               $content .= "\n $hookContents";
+                                       }
+                                       // END hack
+                                       $content .= "\n</ul>\n";
+                                       $boxes[$boxName]['content'] = $content;
+                               }
+                       }
+               } else {
+                       if ( $hookContents ) {
+                               $boxes['TOOLBOXEND'] = array(
+                                       'id' => 'p-toolboxend',
+                                       'header' => $boxes['TOOLBOX']['header'],
+                                       'generated' => false,
+                                       'content' => "<ul>{$hookContents}</ul>",
+                               );
+                               // HACK: Make sure that TOOLBOXEND is sorted next to TOOLBOX
+                               $boxes2 = array();
+                               foreach ( $boxes as $key => $box ) {
+                                       if ( $key === 'TOOLBOXEND' ) {
+                                               continue;
+                                       }
+                                       $boxes2[$key] = $box;
+                                       if ( $key === 'TOOLBOX' ) {
+                                               $boxes2['TOOLBOXEND'] = $boxes['TOOLBOXEND'];
+                                       }
+                               }
+                               $boxes = $boxes2;
+                               // END hack
+                       }
+               }
+
+               return $boxes;
+       }
+
+       /**
+        * @param string $name
+        */
+       protected function renderAfterPortlet( $name ) {
+               $content = '';
+               wfRunHooks( 'BaseTemplateAfterPortlet', array( $this, $name, &$content ) );
+
+               if ( $content !== '' ) {
+                       echo "<div class='after-portlet after-portlet-$name'>$content</div>";
+               }
+
+       }
+
+       /**
+        * Makes a link, usually used by makeListItem to generate a link for an item
+        * in a list used in navigation lists, portlets, portals, sidebars, etc...
+        *
+        * @param string $key Usually a key from the list you are generating this
+        * link from.
+        * @param array $item Contains some of a specific set of keys.
+        *
+        * The text of the link will be generated either from the contents of the
+        * "text" key in the $item array, if a "msg" key is present a message by
+        * that name will be used, and if neither of those are set the $key will be
+        * used as a message name.
+        *
+        * If a "href" key is not present makeLink will just output htmlescaped text.
+        * The "href", "id", "class", "rel", and "type" keys are used as attributes
+        * for the link if present.
+        *
+        * If an "id" or "single-id" (if you don't want the actual id to be output
+        * on the link) is present it will be used to generate a tooltip and
+        * accesskey for the link.
+        *
+        * The keys "context" and "primary" are ignored; these keys are used
+        * internally by skins and are not supposed to be included in the HTML
+        * output.
+        *
+        * If you don't want an accesskey, set $item['tooltiponly'] = true;
+        *
+        * @param array $options Can be used to affect the output of a link.
+        * Possible options are:
+        *   - 'text-wrapper' key to specify a list of elements to wrap the text of
+        *   a link in. This should be an array of arrays containing a 'tag' and
+        *   optionally an 'attributes' key. If you only have one element you don't
+        *   need to wrap it in another array. eg: To use <a><span>...</span></a>
+        *   in all links use array( 'text-wrapper' => array( 'tag' => 'span' ) )
+        *   for your options.
+        *   - 'link-class' key can be used to specify additional classes to apply
+        *   to all links.
+        *   - 'link-fallback' can be used to specify a tag to use instead of "<a>"
+        *   if there is no link. eg: If you specify 'link-fallback' => 'span' than
+        *   any non-link will output a "<span>" instead of just text.
+        *
+        * @return string
+        */
+       function makeLink( $key, $item, $options = array() ) {
+               if ( isset( $item['text'] ) ) {
+                       $text = $item['text'];
+               } else {
+                       $text = $this->translator->translate( isset( $item['msg'] ) ? $item['msg'] : $key );
+               }
+
+               $html = htmlspecialchars( $text );
+
+               if ( isset( $options['text-wrapper'] ) ) {
+                       $wrapper = $options['text-wrapper'];
+                       if ( isset( $wrapper['tag'] ) ) {
+                               $wrapper = array( $wrapper );
+                       }
+                       while ( count( $wrapper ) > 0 ) {
+                               $element = array_pop( $wrapper );
+                               $html = Html::rawElement( $element['tag'], isset( $element['attributes'] )
+                                       ? $element['attributes']
+                                       : null, $html );
+                       }
+               }
+
+               if ( isset( $item['href'] ) || isset( $options['link-fallback'] ) ) {
+                       $attrs = $item;
+                       foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly', 'context', 'primary' ) as $k ) {
+                               unset( $attrs[$k] );
+                       }
+
+                       if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
+                               $item['single-id'] = $item['id'];
+                       }
+                       if ( isset( $item['single-id'] ) ) {
+                               if ( isset( $item['tooltiponly'] ) && $item['tooltiponly'] ) {
+                                       $title = Linker::titleAttrib( $item['single-id'] );
+                                       if ( $title !== false ) {
+                                               $attrs['title'] = $title;
+                                       }
+                               } else {
+                                       $tip = Linker::tooltipAndAccesskeyAttribs( $item['single-id'] );
+                                       if ( isset( $tip['title'] ) && $tip['title'] !== false ) {
+                                               $attrs['title'] = $tip['title'];
+                                       }
+                                       if ( isset( $tip['accesskey'] ) && $tip['accesskey'] !== false ) {
+                                               $attrs['accesskey'] = $tip['accesskey'];
+                                       }
+                               }
+                       }
+                       if ( isset( $options['link-class'] ) ) {
+                               if ( isset( $attrs['class'] ) ) {
+                                       $attrs['class'] .= " {$options['link-class']}";
+                               } else {
+                                       $attrs['class'] = $options['link-class'];
+                               }
+                       }
+                       $html = Html::rawElement( isset( $attrs['href'] )
+                               ? 'a'
+                               : $options['link-fallback'], $attrs, $html );
+               }
+
+               return $html;
+       }
+
+       /**
+        * Generates a list item for a navigation, portlet, portal, sidebar... list
+        *
+        * @param string $key Usually a key from the list you are generating this link from.
+        * @param array $item Array of list item data containing some of a specific set of keys.
+        * The "id", "class" and "itemtitle" keys will be used as attributes for the list item,
+        * if "active" contains a value of true a "active" class will also be appended to class.
+        *
+        * @param array $options
+        *
+        * If you want something other than a "<li>" you can pass a tag name such as
+        * "tag" => "span" in the $options array to change the tag used.
+        * link/content data for the list item may come in one of two forms
+        * A "links" key may be used, in which case it should contain an array with
+        * a list of links to include inside the list item, see makeLink for the
+        * format of individual links array items.
+        *
+        * Otherwise the relevant keys from the list item $item array will be passed
+        * to makeLink instead. Note however that "id" and "class" are used by the
+        * list item directly so they will not be passed to makeLink
+        * (however the link will still support a tooltip and accesskey from it)
+        * If you need an id or class on a single link you should include a "links"
+        * array with just one link item inside of it. If you want to add a title
+        * to the list item itself, you can set "itemtitle" to the value.
+        * $options is also passed on to makeLink calls
+        *
+        * @return string
+        */
+       function makeListItem( $key, $item, $options = array() ) {
+               if ( isset( $item['links'] ) ) {
+                       $links = array();
+                       foreach ( $item['links'] as $linkKey => $link ) {
+                               $links[] = $this->makeLink( $linkKey, $link, $options );
+                       }
+                       $html = implode( ' ', $links );
+               } else {
+                       $link = $item;
+                       // These keys are used by makeListItem and shouldn't be passed on to the link
+                       foreach ( array( 'id', 'class', 'active', 'tag', 'itemtitle' ) as $k ) {
+                               unset( $link[$k] );
+                       }
+                       if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
+                               // The id goes on the <li> not on the <a> for single links
+                               // but makeSidebarLink still needs to know what id to use when
+                               // generating tooltips and accesskeys.
+                               $link['single-id'] = $item['id'];
+                       }
+                       $html = $this->makeLink( $key, $link, $options );
+               }
+
+               $attrs = array();
+               foreach ( array( 'id', 'class' ) as $attr ) {
+                       if ( isset( $item[$attr] ) ) {
+                               $attrs[$attr] = $item[$attr];
+                       }
+               }
+               if ( isset( $item['active'] ) && $item['active'] ) {
+                       if ( !isset( $attrs['class'] ) ) {
+                               $attrs['class'] = '';
+                       }
+                       $attrs['class'] .= ' active';
+                       $attrs['class'] = trim( $attrs['class'] );
+               }
+               if ( isset( $item['itemtitle'] ) ) {
+                       $attrs['title'] = $item['itemtitle'];
+               }
+               return Html::rawElement( isset( $options['tag'] ) ? $options['tag'] : 'li', $attrs, $html );
+       }
+
+       function makeSearchInput( $attrs = array() ) {
+               $realAttrs = array(
+                       'type' => 'search',
+                       'name' => 'search',
+                       'placeholder' => wfMessage( 'searchsuggest-search' )->text(),
+                       'value' => $this->get( 'search', '' ),
+               );
+               $realAttrs = array_merge( $realAttrs, Linker::tooltipAndAccesskeyAttribs( 'search' ), $attrs );
+               return Html::element( 'input', $realAttrs );
+       }
+
+       function makeSearchButton( $mode, $attrs = array() ) {
+               switch ( $mode ) {
+                       case 'go':
+                       case 'fulltext':
+                               $realAttrs = array(
+                                       'type' => 'submit',
+                                       'name' => $mode,
+                                       'value' => $this->translator->translate(
+                                               $mode == 'go' ? 'searcharticle' : 'searchbutton' ),
+                               );
+                               $realAttrs = array_merge(
+                                       $realAttrs,
+                                       Linker::tooltipAndAccesskeyAttribs( "search-$mode" ),
+                                       $attrs
+                               );
+                               return Html::element( 'input', $realAttrs );
+                       case 'image':
+                               $buttonAttrs = array(
+                                       'type' => 'submit',
+                                       'name' => 'button',
+                               );
+                               $buttonAttrs = array_merge(
+                                       $buttonAttrs,
+                                       Linker::tooltipAndAccesskeyAttribs( 'search-fulltext' ),
+                                       $attrs
+                               );
+                               unset( $buttonAttrs['src'] );
+                               unset( $buttonAttrs['alt'] );
+                               unset( $buttonAttrs['width'] );
+                               unset( $buttonAttrs['height'] );
+                               $imgAttrs = array(
+                                       'src' => $attrs['src'],
+                                       'alt' => isset( $attrs['alt'] )
+                                               ? $attrs['alt']
+                                               : $this->translator->translate( 'searchbutton' ),
+                                       'width' => isset( $attrs['width'] ) ? $attrs['width'] : null,
+                                       'height' => isset( $attrs['height'] ) ? $attrs['height'] : null,
+                               );
+                               return Html::rawElement( 'button', $buttonAttrs, Html::element( 'img', $imgAttrs ) );
+                       default:
+                               throw new MWException( 'Unknown mode passed to BaseTemplate::makeSearchButton' );
+               }
+       }
+
+       /**
+        * Returns an array of footerlinks trimmed down to only those footer links that
+        * are valid.
+        * If you pass "flat" as an option then the returned array will be a flat array
+        * of footer icons instead of a key/value array of footerlinks arrays broken
+        * up into categories.
+        * @param string $option
+        * @return array|mixed
+        */
+       function getFooterLinks( $option = null ) {
+               $footerlinks = $this->get( 'footerlinks' );
+
+               // Reduce footer links down to only those which are being used
+               $validFooterLinks = array();
+               foreach ( $footerlinks as $category => $links ) {
+                       $validFooterLinks[$category] = array();
+                       foreach ( $links as $link ) {
+                               if ( isset( $this->data[$link] ) && $this->data[$link] ) {
+                                       $validFooterLinks[$category][] = $link;
+                               }
+                       }
+                       if ( count( $validFooterLinks[$category] ) <= 0 ) {
+                               unset( $validFooterLinks[$category] );
+                       }
+               }
+
+               if ( $option == 'flat' ) {
+                       // fold footerlinks into a single array using a bit of trickery
+                       $validFooterLinks = call_user_func_array(
+                               'array_merge',
+                               array_values( $validFooterLinks )
+                       );
+               }
+
+               return $validFooterLinks;
+       }
+
+       /**
+        * Returns an array of footer icons filtered down by options relevant to how
+        * the skin wishes to display them.
+        * If you pass "icononly" as the option all footer icons which do not have an
+        * image icon set will be filtered out.
+        * If you pass "nocopyright" then MediaWiki's copyright icon will not be included
+        * in the list of footer icons. This is mostly useful for skins which only
+        * display the text from footericons instead of the images and don't want a
+        * duplicate copyright statement because footerlinks already rendered one.
+        * @param string $option
+        * @return string
+        */
+       function getFooterIcons( $option = null ) {
+               // Generate additional footer icons
+               $footericons = $this->get( 'footericons' );
+
+               if ( $option == 'icononly' ) {
+                       // Unset any icons which don't have an image
+                       foreach ( $footericons as &$footerIconsBlock ) {
+                               foreach ( $footerIconsBlock as $footerIconKey => $footerIcon ) {
+                                       if ( !is_string( $footerIcon ) && !isset( $footerIcon['src'] ) ) {
+                                               unset( $footerIconsBlock[$footerIconKey] );
+                                       }
+                               }
+                       }
+                       // Redo removal of any empty blocks
+                       foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
+                               if ( count( $footerIconsBlock ) <= 0 ) {
+                                       unset( $footericons[$footerIconsKey] );
+                               }
+                       }
+               } elseif ( $option == 'nocopyright' ) {
+                       unset( $footericons['copyright']['copyright'] );
+                       if ( count( $footericons['copyright'] ) <= 0 ) {
+                               unset( $footericons['copyright'] );
+                       }
+               }
+
+               return $footericons;
+       }
+
+       /**
+        * Output the basic end-page trail including bottomscripts, reporttime, and
+        * debug stuff. This should be called right before outputting the closing
+        * body and html tags.
+        */
+       function printTrail() { ?>
+<?php echo MWDebug::getDebugHTML( $this->getSkin()->getContext() ); ?>
+<?php $this->html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?>
+<?php $this->html( 'reporttime' ) ?>
+<?php
+       }
+}
diff --git a/includes/skins/MediaWikiI18N.php b/includes/skins/MediaWikiI18N.php
new file mode 100644 (file)
index 0000000..8bd77cc
--- /dev/null
@@ -0,0 +1,54 @@
+<?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
+ */
+
+/**
+ * Wrapper object for MediaWiki's localization functions,
+ * to be passed to the template engine.
+ *
+ * @private
+ * @ingroup Skins
+ */
+class MediaWikiI18N {
+       private $context = array();
+
+       function set( $varName, $value ) {
+               $this->context[$varName] = $value;
+       }
+
+       function translate( $value ) {
+               wfProfileIn( __METHOD__ );
+
+               // Hack for i18n:attributes in PHPTAL 1.0.0 dev version as of 2004-10-23
+               $value = preg_replace( '/^string:/', '', $value );
+
+               $value = wfMessage( $value )->text();
+               // interpolate variables
+               $m = array();
+               while ( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
+                       list( $src, $var ) = $m;
+                       wfSuppressWarnings();
+                       $varValue = $this->context[$var];
+                       wfRestoreWarnings();
+                       $value = str_replace( $src, $varValue, $value );
+               }
+               wfProfileOut( __METHOD__ );
+               return $value;
+       }
+}
diff --git a/includes/skins/QuickTemplate.php b/includes/skins/QuickTemplate.php
new file mode 100644 (file)
index 0000000..b28dc51
--- /dev/null
@@ -0,0 +1,180 @@
+<?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
+ */
+
+/**
+ * Generic wrapper for template functions, with interface
+ * compatible with what we use of PHPTAL 0.7.
+ * @ingroup Skins
+ */
+abstract class QuickTemplate {
+
+       /** @var Config $config */
+       protected $config;
+
+       /**
+        * @param Config $config
+        */
+       function __construct( Config $config = null ) {
+               $this->data = array();
+               $this->translator = new MediaWikiI18N();
+               if ( $config === null ) {
+                       wfDebug( __METHOD__ . ' was called with no Config instance passed to it' );
+                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               }
+               $this->config = $config;
+       }
+
+       /**
+        * Sets the value $value to $name
+        * @param string $name
+        * @param mixed $value
+        */
+       public function set( $name, $value ) {
+               $this->data[$name] = $value;
+       }
+
+       /**
+        * Gets the template data requested
+        * @since 1.22
+        * @param string $name Key for the data
+        * @param mixed $default Optional default (or null)
+        * @return mixed The value of the data requested or the deafult
+        */
+       public function get( $name, $default = null ) {
+               if ( isset( $this->data[$name] ) ) {
+                       return $this->data[$name];
+               } else {
+                       return $default;
+               }
+       }
+
+       /**
+        * @param string $name
+        * @param mixed $value
+        */
+       public function setRef( $name, &$value ) {
+               $this->data[$name] =& $value;
+       }
+
+       /**
+        * @param MediaWikiI18N $t
+        */
+       public function setTranslator( &$t ) {
+               $this->translator = &$t;
+       }
+
+       /**
+        * Main function, used by classes that subclass QuickTemplate
+        * to show the actual HTML output
+        */
+       abstract public function execute();
+
+       /**
+        * @private
+        * @param string $str
+        * @return string
+        */
+       function text( $str ) {
+               echo htmlspecialchars( $this->data[$str] );
+       }
+
+       /**
+        * @private
+        * @param string $str
+        * @return string
+        */
+       function html( $str ) {
+               echo $this->data[$str];
+       }
+
+       /**
+        * @private
+        * @param string $str
+        * @return string
+        */
+       function msg( $str ) {
+               echo htmlspecialchars( $this->translator->translate( $str ) );
+       }
+
+       /**
+        * @private
+        * @param string $str
+        * @return string
+        */
+       function msgHtml( $str ) {
+               echo $this->translator->translate( $str );
+       }
+
+       /**
+        * An ugly, ugly hack.
+        * @private
+        * @param string $str
+        * @return string
+        */
+       function msgWiki( $str ) {
+               global $wgOut;
+
+               $text = $this->translator->translate( $str );
+               echo $wgOut->parse( $text );
+       }
+
+       /**
+        * @private
+        * @param string $str
+        * @return bool
+        */
+       function haveData( $str ) {
+               return isset( $this->data[$str] );
+       }
+
+       /**
+        * @private
+        *
+        * @param string $str
+        * @return bool
+        */
+       function haveMsg( $str ) {
+               $msg = $this->translator->translate( $str );
+               return ( $msg != '-' ) && ( $msg != '' ); # ????
+       }
+
+       /**
+        * Get the Skin object related to this object
+        *
+        * @return Skin
+        */
+       public function getSkin() {
+               return $this->data['skin'];
+       }
+
+       /**
+        * Fetch the output of a QuickTemplate and return it
+        *
+        * @since 1.23
+        * @return string
+        */
+       public function getHTML() {
+               ob_start();
+               $this->execute();
+               $html = ob_get_contents();
+               ob_end_clean();
+               return $html;
+       }
+}
index 3750bad..c8c4ba4 100644 (file)
@@ -239,23 +239,33 @@ abstract class Skin extends ContextSource {
         * Preload the existence of three commonly-requested pages in a single query
         */
        function preloadExistence() {
+               $titles = array();
+
                $user = $this->getUser();
+               $title = $this->getRelevantTitle();
 
                // User/talk link
-               $titles = array( $user->getUserPage(), $user->getTalkPage() );
+               if ( $user->isLoggedIn() || $this->showIPinHeader() ) {
+                       $titles[] = $user->getUserPage();
+                       $titles[] = $user->getTalkPage();
+               }
 
                // Other tab link
-               if ( $this->getTitle()->isSpecialPage() ) {
+               if ( $title->isSpecialPage() ) {
                        // nothing
-               } elseif ( $this->getTitle()->isTalkPage() ) {
-                       $titles[] = $this->getTitle()->getSubjectPage();
+               } elseif ( $title->isTalkPage() ) {
+                       $titles[] = $title->getSubjectPage();
                } else {
-                       $titles[] = $this->getTitle()->getTalkPage();
+                       $titles[] = $title->getTalkPage();
                }
 
-               $lb = new LinkBatch( $titles );
-               $lb->setCaller( __METHOD__ );
-               $lb->execute();
+               wfRunHooks( 'SkinPreloadExistence', array( &$titles, $this ) );
+
+               if ( count( $titles ) ) {
+                       $lb = new LinkBatch( $titles );
+                       $lb->setCaller( __METHOD__ );
+                       $lb->execute();
+               }
        }
 
        /**
@@ -417,7 +427,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * Return values for <html> element
-        * @return array of associative name-to-value elements for <html> element
+        * @return array Array of associative name-to-value elements for <html> element
         */
        public function getHtmlElementAttributes() {
                $lang = $this->getLanguage();
@@ -825,9 +835,9 @@ abstract class Skin extends ContextSource {
         * @return string
         */
        function getPoweredBy() {
-               global $wgStylePath;
+               global $wgResourceBasePath;
 
-               $url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" );
+               $url = htmlspecialchars( "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png" );
                $text = '<a href="//www.mediawiki.org/"><img src="' . $url
                        . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
                wfRunHooks( 'SkinGetPoweredBy', array( &$text, $this ) );
@@ -930,6 +940,7 @@ abstract class Skin extends ContextSource {
         * @return string HTML anchor
         */
        public function footerLink( $desc, $page ) {
+               $section = new ProfileSection( __METHOD__ );
                // if the link description has been set to "-" in the default language,
                if ( $this->msg( $desc )->inContentLanguage()->isDisabled() ) {
                        // then it is disabled, for all languages.
@@ -1006,15 +1017,18 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Return a fully resolved style path url to images or styles stored in the common folder.
-        * This method returns a url resolved using the configured skin style path
-        * and includes the style version inside of the url.
+        * This function previously returned a fully resolved style path URL to images or styles stored in
+        * the legacy skins/common/ directory.
+        *
+        * That directory has been removed in 1.24 and the function always returns an empty string.
+        *
+        * @deprecated since 1.24
         * @param string $name The name or path of a skin resource file
-        * @return string The fully resolved style path url including styleversion
+        * @return string Empty string
         */
        function getCommonStylePath( $name ) {
-               global $wgStylePath, $wgStyleVersion;
-               return "$wgStylePath/common/$name?$wgStyleVersion";
+               wfDeprecated( __METHOD__, '1.24' );
+               return '';
        }
 
        /**
diff --git a/includes/skins/SkinApi.php b/includes/skins/SkinApi.php
new file mode 100644 (file)
index 0000000..064c076
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Extremely basic "skin" for API output, which needs to output a page without
+ * the usual skin elements but still using CSS, JS, and such via OutputPage and
+ * ResourceLoader.
+ *
+ * Created on Sep 08, 2014
+ *
+ * Copyright © 2014 Brad Jorsch <bjorsch@wikimedia.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * SkinTemplate class for API output
+ * @since 1.25
+ */
+class SkinApi extends SkinTemplate {
+       public $skinname = 'apioutput';
+       public $template = 'SkinApiTemplate';
+
+       public function setupSkinUserCss( OutputPage $out ) {
+               parent::setupSkinUserCss( $out );
+               $out->addModuleStyles( 'mediawiki.skinning.interface' );
+       }
+}
diff --git a/includes/skins/SkinApiTemplate.php b/includes/skins/SkinApiTemplate.php
new file mode 100644 (file)
index 0000000..be77c61
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Extremely basic "skin" for API output, which needs to output a page without
+ * the usual skin elements but still using CSS, JS, and such via OutputPage and
+ * ResourceLoader.
+ *
+ * Created on Sep 08, 2014
+ *
+ * Copyright © 2014 Brad Jorsch <bjorsch@wikimedia.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * BaseTemplate class for the 'apioutput' skin
+ * @since 1.25
+ */
+class SkinApiTemplate extends BaseTemplate {
+
+       public function execute() {
+               $this->html( 'headelement' ) ?>
+
+               <div class="mw-body" role="main">
+                       <h1 class="firstHeading">
+                               <span dir="auto"><?php $this->html( 'title' ) ?></span>
+                       </h1>
+                       <div class="mw-body-content">
+                               <?php $this->html( 'bodytext' ) ?>
+                       </div>
+               </div>
+
+               <?php $this->printTrail() ?>
+               </body></html>
+
+       <?php
+       }
+}
index 0935e33..ffbe629 100644 (file)
@@ -40,13 +40,6 @@ class SkinFactory {
         * @var array
         */
        private $displayNames = array();
-       /**
-        * Map of name => class name without "Skin" prefix, for legacy skins using the autodiscovery
-        * mechanism
-        *
-        * @var array
-        */
-       private $legacySkins = array();
 
        /**
         * @var SkinFactory
@@ -70,7 +63,7 @@ class SkinFactory {
         *     to be, but doing so would change the case of i18n message keys).
         * @param string $displayName For backwards-compatibility with old skin loading system. This is
         *     the text used as skin's human-readable name when the 'skinname-<skin>' message is not
-   *     available. It should be the same as the skin name provided in $wgExtensionCredits.
+        *     available. It should be the same as the skin name provided in $wgExtensionCredits.
         * @param callable $callback Callback that takes the skin name as an argument
         * @throws InvalidArgumentException If an invalid callback is provided
         */
@@ -82,66 +75,6 @@ class SkinFactory {
                $this->displayNames[$name] = $displayName;
        }
 
-       /**
-        * @return array
-        */
-       private function getLegacySkinNames() {
-               static $skinsInitialised = false;
-
-               if ( !$skinsInitialised || !count( $this->legacySkins ) ) {
-                       # Get a list of available skins
-                       # Build using the regular expression '^(.*).php$'
-                       # Array keys are all lower case, array value keep the case used by filename
-                       #
-                       wfProfileIn( __METHOD__ . '-init' );
-
-                       global $wgStyleDirectory;
-
-                       $skinDir = dir( $wgStyleDirectory );
-
-                       if ( $skinDir !== false && $skinDir !== null ) {
-                               # while code from www.php.net
-                               while ( false !== ( $file = $skinDir->read() ) ) {
-                                       // Skip non-PHP files, hidden files, and '.dep' includes
-                                       $matches = array();
-
-                                       if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
-                                               $aSkin = $matches[1];
-
-                                               // Explicitly disallow loading core skins via the autodiscovery mechanism.
-                                               //
-                                               // They should be loaded already (in a non-autodicovery way), but old files might still
-                                               // exist on the server because our MW version upgrade process is widely documented as
-                                               // requiring just copying over all files, without removing old ones.
-                                               //
-                                               // This is one of the reasons we should have never used autodiscovery in the first
-                                               // place. This hack can be safely removed when autodiscovery is gone.
-                                               if ( in_array( $aSkin, array( 'CologneBlue', 'Modern', 'MonoBook', 'Vector' ) ) ) {
-                                                       wfLogWarning(
-                                                               "An old copy of the $aSkin skin was found in your skins/ directory. " .
-                                                               "You should remove it to avoid problems in the future." .
-                                                               "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for details."
-                                                       );
-                                                       continue;
-                                               }
-
-                                               wfLogWarning(
-                                                       "A skin using autodiscovery mechanism, $aSkin, was found in your skins/ directory. " .
-                                                       "The mechanism will be removed in MediaWiki 1.25 and the skin will no longer be recognized. " .
-                                                       "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for information how to fix this."
-                                               );
-                                               $this->legacySkins[strtolower( $aSkin )] = $aSkin;
-                                       }
-                               }
-                               $skinDir->close();
-                       }
-                       $skinsInitialised = true;
-                       wfProfileOut( __METHOD__ . '-init' );
-               }
-               return $this->legacySkins;
-
-       }
-
        /**
         * Returns an associative array of:
         *  skin name => human readable name
@@ -149,43 +82,7 @@ class SkinFactory {
         * @return array
         */
        public function getSkinNames() {
-               return array_merge(
-                       $this->getLegacySkinNames(),
-                       $this->displayNames
-               );
-       }
-
-       /**
-        * Get a legacy skin which uses the autodiscovery mechanism.
-        *
-        * @param string $name
-        * @return Skin|bool false if the skin couldn't be constructed
-        */
-       private function getLegacySkin( $name ) {
-               $skinNames = $this->getLegacySkinNames();
-               if ( !isset( $skinNames[$name] ) ) {
-                       return false;
-               }
-               $skinName = $skinNames[$name];
-               $className = "Skin{$skinName}";
-
-               # Grab the skin class and initialise it.
-               if ( !class_exists( $className ) ) {
-                       global $wgStyleDirectory;
-                       require_once "{$wgStyleDirectory}/{$skinName}.php";
-
-                       # Check if we got it
-                       if ( !class_exists( $className ) ) {
-                               # DO NOT die if the class isn't found. This breaks maintenance
-                               # scripts and can cause a user account to be unrecoverable
-                               # except by SQL manipulation if a previously valid skin name
-                               # is no longer valid.
-                               return false;
-                       }
-               }
-               $skin = new $className( $name );
-               return $skin;
-
+               return $this->displayNames;
        }
 
        /**
@@ -197,11 +94,6 @@ class SkinFactory {
         */
        public function makeSkin( $name ) {
                if ( !isset( $this->factoryFunctions[$name] ) ) {
-                       // Check the legacy autodiscovery method of skin loading
-                       $legacy = $this->getLegacySkin( $name );
-                       if ( $legacy ) {
-                               return $legacy;
-                       }
                        throw new SkinException( "No registered builder available for $name." );
                }
                $skin = call_user_func( $this->factoryFunctions[$name], $name );
index b63f7a1..96ff228 100644 (file)
@@ -25,4 +25,12 @@ class SkinFallback extends SkinTemplate {
                parent::setupSkinUserCss( $out );
                $out->addModuleStyles( 'mediawiki.skinning.interface' );
        }
+
+       /**
+        * @param OutputPage $out
+        */
+       public function initPage( OutputPage $out ) {
+               parent::initPage( $out );
+               $out->enableClientCache( false );
+       }
 }
index 603ee5c..ea94fad 100644 (file)
@@ -91,9 +91,7 @@ class SkinFallbackTemplate extends BaseTemplate {
                </form>
 
                <div class="mw-body" role="main">
-                       <h1 class="firstHeading">
-                               <span dir="auto"><?php $this->html( 'title' ) ?></span>
-                       </h1>
+                       <h1 class="firstHeading"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
 
                        <div class="mw-body-content">
                                <?php $this->html( 'bodytext' ) ?>
index b6077b3..c1db302 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Base class for template-based skins.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
- * Wrapper object for MediaWiki's localization functions,
- * to be passed to the template engine.
+ * Base class for template-based skins.
  *
- * @private
- * @ingroup Skins
- */
-class MediaWikiI18N {
-       private $context = array();
-
-       function set( $varName, $value ) {
-               $this->context[$varName] = $value;
-       }
-
-       function translate( $value ) {
-               wfProfileIn( __METHOD__ );
-
-               // Hack for i18n:attributes in PHPTAL 1.0.0 dev version as of 2004-10-23
-               $value = preg_replace( '/^string:/', '', $value );
-
-               $value = wfMessage( $value )->text();
-               // interpolate variables
-               $m = array();
-               while ( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
-                       list( $src, $var ) = $m;
-                       wfSuppressWarnings();
-                       $varValue = $this->context[$var];
-                       wfRestoreWarnings();
-                       $value = str_replace( $src, $varValue, $value );
-               }
-               wfProfileOut( __METHOD__ );
-               return $value;
-       }
-}
-
-/**
  * Template-filler skin base class
  * Formerly generic PHPTal (http://phptal.sourceforge.net/) skin
  * Based on Brion's smarty skin
@@ -200,7 +165,7 @@ class SkinTemplate extends Skin {
                                );
                                wfRunHooks(
                                        'SkinTemplateGetLanguageLink',
-                                       array( &$languageLink, $languageLinkTitle, $this->getTitle() )
+                                       array( &$languageLink, $languageLinkTitle, $this->getTitle(), $this->getOutput() )
                                );
                                $languageLinks[] = $languageLink;
                        }
@@ -271,7 +236,7 @@ class SkinTemplate extends Skin {
                wfProfileIn( __METHOD__ . '-init' );
                $this->initPage( $out );
                wfProfileOut( __METHOD__ . '-init' );
-               $tpl = $this->prepareQuickTemplate();
+               $tpl = $this->prepareQuickTemplate( $out );
                // execute template
                wfProfileIn( __METHOD__ . '-execute' );
                $res = $tpl->execute();
@@ -296,7 +261,7 @@ class SkinTemplate extends Skin {
        protected function prepareQuickTemplate() {
                global $wgContLang, $wgScript, $wgStylePath, $wgMimeType, $wgJsMimeType,
                        $wgDisableCounters, $wgSitename, $wgLogo, $wgMaxCredits,
-                       $wgShowCreditsIfMax, $wgPageShowWatchingUsers, $wgArticlePath,
+                       $wgShowCreditsIfMax, $wgArticlePath,
                        $wgScriptPath, $wgServer;
 
                wfProfileIn( __METHOD__ );
@@ -421,19 +386,6 @@ class SkinTemplate extends Skin {
                                        }
                                }
 
-                               if ( $wgPageShowWatchingUsers ) {
-                                       $dbr = wfGetDB( DB_SLAVE );
-                                       $num = $dbr->selectField( 'watchlist', 'COUNT(*)',
-                                               array( 'wl_title' => $title->getDBkey(), 'wl_namespace' => $title->getNamespace() ),
-                                               __METHOD__
-                                       );
-                                       if ( $num > 0 ) {
-                                               $tpl->set( 'numberofwatchingusers',
-                                                       $this->msg( 'number_of_watching_users_pageview' )->numParams( $num )->parse()
-                                               );
-                                       }
-                               }
-
                                if ( $wgMaxCredits != 0 ) {
                                        $tpl->set( 'credits', Action::factory( 'credits', $this->getWikiPage(),
                                                $this->getContext() )->getCredits( $wgMaxCredits, $wgShowCreditsIfMax ) );
@@ -1365,759 +1317,3 @@ class SkinTemplate extends Skin {
                return $this->getTitle()->getNamespaceKey();
        }
 }
-
-/**
- * Generic wrapper for template functions, with interface
- * compatible with what we use of PHPTAL 0.7.
- * @ingroup Skins
- */
-abstract class QuickTemplate {
-
-       /** @var Config $config */
-       protected $config;
-
-       /**
-        * @param Config $config
-        */
-       function __construct( Config $config = null ) {
-               $this->data = array();
-               $this->translator = new MediaWikiI18N();
-               if ( $config === null ) {
-                       wfDebug( __METHOD__ . ' was called with no Config instance passed to it' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
-               }
-               $this->config = $config;
-       }
-
-       /**
-        * Sets the value $value to $name
-        * @param string $name
-        * @param mixed $value
-        */
-       public function set( $name, $value ) {
-               $this->data[$name] = $value;
-       }
-
-       /**
-        * Gets the template data requested
-        * @since 1.22
-        * @param string $name Key for the data
-        * @param mixed $default Optional default (or null)
-        * @return mixed The value of the data requested or the deafult
-        */
-       public function get( $name, $default = null ) {
-               if ( isset( $this->data[$name] ) ) {
-                       return $this->data[$name];
-               } else {
-                       return $default;
-               }
-       }
-
-       /**
-        * @param string $name
-        * @param mixed $value
-        */
-       public function setRef( $name, &$value ) {
-               $this->data[$name] =& $value;
-       }
-
-       /**
-        * @param MediaWikiI18N $t
-        */
-       public function setTranslator( &$t ) {
-               $this->translator = &$t;
-       }
-
-       /**
-        * Main function, used by classes that subclass QuickTemplate
-        * to show the actual HTML output
-        */
-       abstract public function execute();
-
-       /**
-        * @private
-        * @param string $str
-        * @return string
-        */
-       function text( $str ) {
-               echo htmlspecialchars( $this->data[$str] );
-       }
-
-       /**
-        * @private
-        * @param string $str
-        * @return string
-        */
-       function html( $str ) {
-               echo $this->data[$str];
-       }
-
-       /**
-        * @private
-        * @param string $str
-        * @return string
-        */
-       function msg( $str ) {
-               echo htmlspecialchars( $this->translator->translate( $str ) );
-       }
-
-       /**
-        * @private
-        * @param string $str
-        * @return string
-        */
-       function msgHtml( $str ) {
-               echo $this->translator->translate( $str );
-       }
-
-       /**
-        * An ugly, ugly hack.
-        * @private
-        * @param string $str
-        * @return string
-        */
-       function msgWiki( $str ) {
-               global $wgOut;
-
-               $text = $this->translator->translate( $str );
-               echo $wgOut->parse( $text );
-       }
-
-       /**
-        * @private
-        * @param string $str
-        * @return bool
-        */
-       function haveData( $str ) {
-               return isset( $this->data[$str] );
-       }
-
-       /**
-        * @private
-        *
-        * @param string $str
-        * @return bool
-        */
-       function haveMsg( $str ) {
-               $msg = $this->translator->translate( $str );
-               return ( $msg != '-' ) && ( $msg != '' ); # ????
-       }
-
-       /**
-        * Get the Skin object related to this object
-        *
-        * @return Skin
-        */
-       public function getSkin() {
-               return $this->data['skin'];
-       }
-
-       /**
-        * Fetch the output of a QuickTemplate and return it
-        *
-        * @since 1.23
-        * @return string
-        */
-       public function getHTML() {
-               ob_start();
-               $this->execute();
-               $html = ob_get_contents();
-               ob_end_clean();
-               return $html;
-       }
-}
-
-/**
- * New base template for a skin's template extended from QuickTemplate
- * this class features helper methods that provide common ways of interacting
- * with the data stored in the QuickTemplate
- */
-abstract class BaseTemplate extends QuickTemplate {
-
-       /**
-        * Get a Message object with its context set
-        *
-        * @param string $name Message name
-        * @return Message
-        */
-       public function getMsg( $name ) {
-               return $this->getSkin()->msg( $name );
-       }
-
-       function msg( $str ) {
-               echo $this->getMsg( $str )->escaped();
-       }
-
-       function msgHtml( $str ) {
-               echo $this->getMsg( $str )->text();
-       }
-
-       function msgWiki( $str ) {
-               echo $this->getMsg( $str )->parseAsBlock();
-       }
-
-       /**
-        * Create an array of common toolbox items from the data in the quicktemplate
-        * stored by SkinTemplate.
-        * The resulting array is built according to a format intended to be passed
-        * through makeListItem to generate the html.
-        * @return array
-        */
-       function getToolbox() {
-               wfProfileIn( __METHOD__ );
-
-               $toolbox = array();
-               if ( isset( $this->data['nav_urls']['whatlinkshere'] )
-                       && $this->data['nav_urls']['whatlinkshere']
-               ) {
-                       $toolbox['whatlinkshere'] = $this->data['nav_urls']['whatlinkshere'];
-                       $toolbox['whatlinkshere']['id'] = 't-whatlinkshere';
-               }
-               if ( isset( $this->data['nav_urls']['recentchangeslinked'] )
-                       && $this->data['nav_urls']['recentchangeslinked']
-               ) {
-                       $toolbox['recentchangeslinked'] = $this->data['nav_urls']['recentchangeslinked'];
-                       $toolbox['recentchangeslinked']['msg'] = 'recentchangeslinked-toolbox';
-                       $toolbox['recentchangeslinked']['id'] = 't-recentchangeslinked';
-               }
-               if ( isset( $this->data['feeds'] ) && $this->data['feeds'] ) {
-                       $toolbox['feeds']['id'] = 'feedlinks';
-                       $toolbox['feeds']['links'] = array();
-                       foreach ( $this->data['feeds'] as $key => $feed ) {
-                               $toolbox['feeds']['links'][$key] = $feed;
-                               $toolbox['feeds']['links'][$key]['id'] = "feed-$key";
-                               $toolbox['feeds']['links'][$key]['rel'] = 'alternate';
-                               $toolbox['feeds']['links'][$key]['type'] = "application/{$key}+xml";
-                               $toolbox['feeds']['links'][$key]['class'] = 'feedlink';
-                       }
-               }
-               foreach ( array( 'contributions', 'log', 'blockip', 'emailuser',
-                       'userrights', 'upload', 'specialpages' ) as $special
-               ) {
-                       if ( isset( $this->data['nav_urls'][$special] ) && $this->data['nav_urls'][$special] ) {
-                               $toolbox[$special] = $this->data['nav_urls'][$special];
-                               $toolbox[$special]['id'] = "t-$special";
-                       }
-               }
-               if ( isset( $this->data['nav_urls']['print'] ) && $this->data['nav_urls']['print'] ) {
-                       $toolbox['print'] = $this->data['nav_urls']['print'];
-                       $toolbox['print']['id'] = 't-print';
-                       $toolbox['print']['rel'] = 'alternate';
-                       $toolbox['print']['msg'] = 'printableversion';
-               }
-               if ( isset( $this->data['nav_urls']['permalink'] ) && $this->data['nav_urls']['permalink'] ) {
-                       $toolbox['permalink'] = $this->data['nav_urls']['permalink'];
-                       if ( $toolbox['permalink']['href'] === '' ) {
-                               unset( $toolbox['permalink']['href'] );
-                               $toolbox['ispermalink']['tooltiponly'] = true;
-                               $toolbox['ispermalink']['id'] = 't-ispermalink';
-                               $toolbox['ispermalink']['msg'] = 'permalink';
-                       } else {
-                               $toolbox['permalink']['id'] = 't-permalink';
-                       }
-               }
-               if ( isset( $this->data['nav_urls']['info'] ) && $this->data['nav_urls']['info'] ) {
-                       $toolbox['info'] = $this->data['nav_urls']['info'];
-                       $toolbox['info']['id'] = 't-info';
-               }
-
-               wfRunHooks( 'BaseTemplateToolbox', array( &$this, &$toolbox ) );
-               wfProfileOut( __METHOD__ );
-               return $toolbox;
-       }
-
-       /**
-        * Create an array of personal tools items from the data in the quicktemplate
-        * stored by SkinTemplate.
-        * The resulting array is built according to a format intended to be passed
-        * through makeListItem to generate the html.
-        * This is in reality the same list as already stored in personal_urls
-        * however it is reformatted so that you can just pass the individual items
-        * to makeListItem instead of hardcoding the element creation boilerplate.
-        * @return array
-        */
-       function getPersonalTools() {
-               $personal_tools = array();
-               foreach ( $this->get( 'personal_urls' ) as $key => $plink ) {
-                       # The class on a personal_urls item is meant to go on the <a> instead
-                       # of the <li> so we have to use a single item "links" array instead
-                       # of using most of the personal_url's keys directly.
-                       $ptool = array(
-                               'links' => array(
-                                       array( 'single-id' => "pt-$key" ),
-                               ),
-                               'id' => "pt-$key",
-                       );
-                       if ( isset( $plink['active'] ) ) {
-                               $ptool['active'] = $plink['active'];
-                       }
-                       foreach ( array( 'href', 'class', 'text', 'dir' ) as $k ) {
-                               if ( isset( $plink[$k] ) ) {
-                                       $ptool['links'][0][$k] = $plink[$k];
-                               }
-                       }
-                       $personal_tools[$key] = $ptool;
-               }
-               return $personal_tools;
-       }
-
-       function getSidebar( $options = array() ) {
-               // Force the rendering of the following portals
-               $sidebar = $this->data['sidebar'];
-               if ( !isset( $sidebar['SEARCH'] ) ) {
-                       $sidebar['SEARCH'] = true;
-               }
-               if ( !isset( $sidebar['TOOLBOX'] ) ) {
-                       $sidebar['TOOLBOX'] = true;
-               }
-               if ( !isset( $sidebar['LANGUAGES'] ) ) {
-                       $sidebar['LANGUAGES'] = true;
-               }
-
-               if ( !isset( $options['search'] ) || $options['search'] !== true ) {
-                       unset( $sidebar['SEARCH'] );
-               }
-               if ( isset( $options['toolbox'] ) && $options['toolbox'] === false ) {
-                       unset( $sidebar['TOOLBOX'] );
-               }
-               if ( isset( $options['languages'] ) && $options['languages'] === false ) {
-                       unset( $sidebar['LANGUAGES'] );
-               }
-
-               $boxes = array();
-               foreach ( $sidebar as $boxName => $content ) {
-                       if ( $content === false ) {
-                               continue;
-                       }
-                       switch ( $boxName ) {
-                       case 'SEARCH':
-                               // Search is a special case, skins should custom implement this
-                               $boxes[$boxName] = array(
-                                       'id' => 'p-search',
-                                       'header' => $this->getMsg( 'search' )->text(),
-                                       'generated' => false,
-                                       'content' => true,
-                               );
-                               break;
-                       case 'TOOLBOX':
-                               $msgObj = $this->getMsg( 'toolbox' );
-                               $boxes[$boxName] = array(
-                                       'id' => 'p-tb',
-                                       'header' => $msgObj->exists() ? $msgObj->text() : 'toolbox',
-                                       'generated' => false,
-                                       'content' => $this->getToolbox(),
-                               );
-                               break;
-                       case 'LANGUAGES':
-                               if ( $this->data['language_urls'] ) {
-                                       $msgObj = $this->getMsg( 'otherlanguages' );
-                                       $boxes[$boxName] = array(
-                                               'id' => 'p-lang',
-                                               'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
-                                               'generated' => false,
-                                               'content' => $this->data['language_urls'],
-                                       );
-                               }
-                               break;
-                       default:
-                               $msgObj = $this->getMsg( $boxName );
-                               $boxes[$boxName] = array(
-                                       'id' => "p-$boxName",
-                                       'header' => $msgObj->exists() ? $msgObj->text() : $boxName,
-                                       'generated' => true,
-                                       'content' => $content,
-                               );
-                               break;
-                       }
-               }
-
-               // HACK: Compatibility with extensions still using SkinTemplateToolboxEnd
-               $hookContents = null;
-               if ( isset( $boxes['TOOLBOX'] ) ) {
-                       ob_start();
-                       // We pass an extra 'true' at the end so extensions using BaseTemplateToolbox
-                       // can abort and avoid outputting double toolbox links
-                       wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
-                       $hookContents = ob_get_contents();
-                       ob_end_clean();
-                       if ( !trim( $hookContents ) ) {
-                               $hookContents = null;
-                       }
-               }
-               // END hack
-
-               if ( isset( $options['htmlOnly'] ) && $options['htmlOnly'] === true ) {
-                       foreach ( $boxes as $boxName => $box ) {
-                               if ( is_array( $box['content'] ) ) {
-                                       $content = '<ul>';
-                                       foreach ( $box['content'] as $key => $val ) {
-                                               $content .= "\n " . $this->makeListItem( $key, $val );
-                                       }
-                                       // HACK, shove the toolbox end onto the toolbox if we're rendering itself
-                                       if ( $hookContents ) {
-                                               $content .= "\n $hookContents";
-                                       }
-                                       // END hack
-                                       $content .= "\n</ul>\n";
-                                       $boxes[$boxName]['content'] = $content;
-                               }
-                       }
-               } else {
-                       if ( $hookContents ) {
-                               $boxes['TOOLBOXEND'] = array(
-                                       'id' => 'p-toolboxend',
-                                       'header' => $boxes['TOOLBOX']['header'],
-                                       'generated' => false,
-                                       'content' => "<ul>{$hookContents}</ul>",
-                               );
-                               // HACK: Make sure that TOOLBOXEND is sorted next to TOOLBOX
-                               $boxes2 = array();
-                               foreach ( $boxes as $key => $box ) {
-                                       if ( $key === 'TOOLBOXEND' ) {
-                                               continue;
-                                       }
-                                       $boxes2[$key] = $box;
-                                       if ( $key === 'TOOLBOX' ) {
-                                               $boxes2['TOOLBOXEND'] = $boxes['TOOLBOXEND'];
-                                       }
-                               }
-                               $boxes = $boxes2;
-                               // END hack
-                       }
-               }
-
-               return $boxes;
-       }
-
-       /**
-        * @param string $name
-        */
-       protected function renderAfterPortlet( $name ) {
-               $content = '';
-               wfRunHooks( 'BaseTemplateAfterPortlet', array( $this, $name, &$content ) );
-
-               if ( $content !== '' ) {
-                       echo "<div class='after-portlet after-portlet-$name'>$content</div>";
-               }
-
-       }
-
-       /**
-        * Makes a link, usually used by makeListItem to generate a link for an item
-        * in a list used in navigation lists, portlets, portals, sidebars, etc...
-        *
-        * @param string $key Usually a key from the list you are generating this
-        * link from.
-        * @param array $item Contains some of a specific set of keys.
-        *
-        * The text of the link will be generated either from the contents of the
-        * "text" key in the $item array, if a "msg" key is present a message by
-        * that name will be used, and if neither of those are set the $key will be
-        * used as a message name.
-        *
-        * If a "href" key is not present makeLink will just output htmlescaped text.
-        * The "href", "id", "class", "rel", and "type" keys are used as attributes
-        * for the link if present.
-        *
-        * If an "id" or "single-id" (if you don't want the actual id to be output
-        * on the link) is present it will be used to generate a tooltip and
-        * accesskey for the link.
-        *
-        * The keys "context" and "primary" are ignored; these keys are used
-        * internally by skins and are not supposed to be included in the HTML
-        * output.
-        *
-        * If you don't want an accesskey, set $item['tooltiponly'] = true;
-        *
-        * @param array $options Can be used to affect the output of a link.
-        * Possible options are:
-        *   - 'text-wrapper' key to specify a list of elements to wrap the text of
-        *   a link in. This should be an array of arrays containing a 'tag' and
-        *   optionally an 'attributes' key. If you only have one element you don't
-        *   need to wrap it in another array. eg: To use <a><span>...</span></a>
-        *   in all links use array( 'text-wrapper' => array( 'tag' => 'span' ) )
-        *   for your options.
-        *   - 'link-class' key can be used to specify additional classes to apply
-        *   to all links.
-        *   - 'link-fallback' can be used to specify a tag to use instead of "<a>"
-        *   if there is no link. eg: If you specify 'link-fallback' => 'span' than
-        *   any non-link will output a "<span>" instead of just text.
-        *
-        * @return string
-        */
-       function makeLink( $key, $item, $options = array() ) {
-               if ( isset( $item['text'] ) ) {
-                       $text = $item['text'];
-               } else {
-                       $text = $this->translator->translate( isset( $item['msg'] ) ? $item['msg'] : $key );
-               }
-
-               $html = htmlspecialchars( $text );
-
-               if ( isset( $options['text-wrapper'] ) ) {
-                       $wrapper = $options['text-wrapper'];
-                       if ( isset( $wrapper['tag'] ) ) {
-                               $wrapper = array( $wrapper );
-                       }
-                       while ( count( $wrapper ) > 0 ) {
-                               $element = array_pop( $wrapper );
-                               $html = Html::rawElement( $element['tag'], isset( $element['attributes'] )
-                                       ? $element['attributes']
-                                       : null, $html );
-                       }
-               }
-
-               if ( isset( $item['href'] ) || isset( $options['link-fallback'] ) ) {
-                       $attrs = $item;
-                       foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly', 'context', 'primary' ) as $k ) {
-                               unset( $attrs[$k] );
-                       }
-
-                       if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
-                               $item['single-id'] = $item['id'];
-                       }
-                       if ( isset( $item['single-id'] ) ) {
-                               if ( isset( $item['tooltiponly'] ) && $item['tooltiponly'] ) {
-                                       $title = Linker::titleAttrib( $item['single-id'] );
-                                       if ( $title !== false ) {
-                                               $attrs['title'] = $title;
-                                       }
-                               } else {
-                                       $tip = Linker::tooltipAndAccesskeyAttribs( $item['single-id'] );
-                                       if ( isset( $tip['title'] ) && $tip['title'] !== false ) {
-                                               $attrs['title'] = $tip['title'];
-                                       }
-                                       if ( isset( $tip['accesskey'] ) && $tip['accesskey'] !== false ) {
-                                               $attrs['accesskey'] = $tip['accesskey'];
-                                       }
-                               }
-                       }
-                       if ( isset( $options['link-class'] ) ) {
-                               if ( isset( $attrs['class'] ) ) {
-                                       $attrs['class'] .= " {$options['link-class']}";
-                               } else {
-                                       $attrs['class'] = $options['link-class'];
-                               }
-                       }
-                       $html = Html::rawElement( isset( $attrs['href'] )
-                               ? 'a'
-                               : $options['link-fallback'], $attrs, $html );
-               }
-
-               return $html;
-       }
-
-       /**
-        * Generates a list item for a navigation, portlet, portal, sidebar... list
-        *
-        * @param string $key Usually a key from the list you are generating this link from.
-        * @param array $item Array of list item data containing some of a specific set of keys.
-        * The "id", "class" and "itemtitle" keys will be used as attributes for the list item,
-        * if "active" contains a value of true a "active" class will also be appended to class.
-        *
-        * @param array $options
-        *
-        * If you want something other than a "<li>" you can pass a tag name such as
-        * "tag" => "span" in the $options array to change the tag used.
-        * link/content data for the list item may come in one of two forms
-        * A "links" key may be used, in which case it should contain an array with
-        * a list of links to include inside the list item, see makeLink for the
-        * format of individual links array items.
-        *
-        * Otherwise the relevant keys from the list item $item array will be passed
-        * to makeLink instead. Note however that "id" and "class" are used by the
-        * list item directly so they will not be passed to makeLink
-        * (however the link will still support a tooltip and accesskey from it)
-        * If you need an id or class on a single link you should include a "links"
-        * array with just one link item inside of it. If you want to add a title
-        * to the list item itself, you can set "itemtitle" to the value.
-        * $options is also passed on to makeLink calls
-        *
-        * @return string
-        */
-       function makeListItem( $key, $item, $options = array() ) {
-               if ( isset( $item['links'] ) ) {
-                       $links = array();
-                       foreach ( $item['links'] as $linkKey => $link ) {
-                               $links[] = $this->makeLink( $linkKey, $link, $options );
-                       }
-                       $html = implode( ' ', $links );
-               } else {
-                       $link = $item;
-                       // These keys are used by makeListItem and shouldn't be passed on to the link
-                       foreach ( array( 'id', 'class', 'active', 'tag', 'itemtitle' ) as $k ) {
-                               unset( $link[$k] );
-                       }
-                       if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
-                               // The id goes on the <li> not on the <a> for single links
-                               // but makeSidebarLink still needs to know what id to use when
-                               // generating tooltips and accesskeys.
-                               $link['single-id'] = $item['id'];
-                       }
-                       $html = $this->makeLink( $key, $link, $options );
-               }
-
-               $attrs = array();
-               foreach ( array( 'id', 'class' ) as $attr ) {
-                       if ( isset( $item[$attr] ) ) {
-                               $attrs[$attr] = $item[$attr];
-                       }
-               }
-               if ( isset( $item['active'] ) && $item['active'] ) {
-                       if ( !isset( $attrs['class'] ) ) {
-                               $attrs['class'] = '';
-                       }
-                       $attrs['class'] .= ' active';
-                       $attrs['class'] = trim( $attrs['class'] );
-               }
-               if ( isset( $item['itemtitle'] ) ) {
-                       $attrs['title'] = $item['itemtitle'];
-               }
-               return Html::rawElement( isset( $options['tag'] ) ? $options['tag'] : 'li', $attrs, $html );
-       }
-
-       function makeSearchInput( $attrs = array() ) {
-               $realAttrs = array(
-                       'type' => 'search',
-                       'name' => 'search',
-                       'placeholder' => wfMessage( 'searchsuggest-search' )->text(),
-                       'value' => $this->get( 'search', '' ),
-               );
-               $realAttrs = array_merge( $realAttrs, Linker::tooltipAndAccesskeyAttribs( 'search' ), $attrs );
-               return Html::element( 'input', $realAttrs );
-       }
-
-       function makeSearchButton( $mode, $attrs = array() ) {
-               switch ( $mode ) {
-                       case 'go':
-                       case 'fulltext':
-                               $realAttrs = array(
-                                       'type' => 'submit',
-                                       'name' => $mode,
-                                       'value' => $this->translator->translate(
-                                               $mode == 'go' ? 'searcharticle' : 'searchbutton' ),
-                               );
-                               $realAttrs = array_merge(
-                                       $realAttrs,
-                                       Linker::tooltipAndAccesskeyAttribs( "search-$mode" ),
-                                       $attrs
-                               );
-                               return Html::element( 'input', $realAttrs );
-                       case 'image':
-                               $buttonAttrs = array(
-                                       'type' => 'submit',
-                                       'name' => 'button',
-                               );
-                               $buttonAttrs = array_merge(
-                                       $buttonAttrs,
-                                       Linker::tooltipAndAccesskeyAttribs( 'search-fulltext' ),
-                                       $attrs
-                               );
-                               unset( $buttonAttrs['src'] );
-                               unset( $buttonAttrs['alt'] );
-                               unset( $buttonAttrs['width'] );
-                               unset( $buttonAttrs['height'] );
-                               $imgAttrs = array(
-                                       'src' => $attrs['src'],
-                                       'alt' => isset( $attrs['alt'] )
-                                               ? $attrs['alt']
-                                               : $this->translator->translate( 'searchbutton' ),
-                                       'width' => isset( $attrs['width'] ) ? $attrs['width'] : null,
-                                       'height' => isset( $attrs['height'] ) ? $attrs['height'] : null,
-                               );
-                               return Html::rawElement( 'button', $buttonAttrs, Html::element( 'img', $imgAttrs ) );
-                       default:
-                               throw new MWException( 'Unknown mode passed to BaseTemplate::makeSearchButton' );
-               }
-       }
-
-       /**
-        * Returns an array of footerlinks trimmed down to only those footer links that
-        * are valid.
-        * If you pass "flat" as an option then the returned array will be a flat array
-        * of footer icons instead of a key/value array of footerlinks arrays broken
-        * up into categories.
-        * @param string $option
-        * @return array|mixed
-        */
-       function getFooterLinks( $option = null ) {
-               $footerlinks = $this->get( 'footerlinks' );
-
-               // Reduce footer links down to only those which are being used
-               $validFooterLinks = array();
-               foreach ( $footerlinks as $category => $links ) {
-                       $validFooterLinks[$category] = array();
-                       foreach ( $links as $link ) {
-                               if ( isset( $this->data[$link] ) && $this->data[$link] ) {
-                                       $validFooterLinks[$category][] = $link;
-                               }
-                       }
-                       if ( count( $validFooterLinks[$category] ) <= 0 ) {
-                               unset( $validFooterLinks[$category] );
-                       }
-               }
-
-               if ( $option == 'flat' ) {
-                       // fold footerlinks into a single array using a bit of trickery
-                       $validFooterLinks = call_user_func_array(
-                               'array_merge',
-                               array_values( $validFooterLinks )
-                       );
-               }
-
-               return $validFooterLinks;
-       }
-
-       /**
-        * Returns an array of footer icons filtered down by options relevant to how
-        * the skin wishes to display them.
-        * If you pass "icononly" as the option all footer icons which do not have an
-        * image icon set will be filtered out.
-        * If you pass "nocopyright" then MediaWiki's copyright icon will not be included
-        * in the list of footer icons. This is mostly useful for skins which only
-        * display the text from footericons instead of the images and don't want a
-        * duplicate copyright statement because footerlinks already rendered one.
-        * @param string $option
-        * @return string
-        */
-       function getFooterIcons( $option = null ) {
-               // Generate additional footer icons
-               $footericons = $this->get( 'footericons' );
-
-               if ( $option == 'icononly' ) {
-                       // Unset any icons which don't have an image
-                       foreach ( $footericons as &$footerIconsBlock ) {
-                               foreach ( $footerIconsBlock as $footerIconKey => $footerIcon ) {
-                                       if ( !is_string( $footerIcon ) && !isset( $footerIcon['src'] ) ) {
-                                               unset( $footerIconsBlock[$footerIconKey] );
-                                       }
-                               }
-                       }
-                       // Redo removal of any empty blocks
-                       foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) {
-                               if ( count( $footerIconsBlock ) <= 0 ) {
-                                       unset( $footericons[$footerIconsKey] );
-                               }
-                       }
-               } elseif ( $option == 'nocopyright' ) {
-                       unset( $footericons['copyright']['copyright'] );
-                       if ( count( $footericons['copyright'] ) <= 0 ) {
-                               unset( $footericons['copyright'] );
-                       }
-               }
-
-               return $footericons;
-       }
-
-       /**
-        * Output the basic end-page trail including bottomscripts, reporttime, and
-        * debug stuff. This should be called right before outputting the closing
-        * body and html tags.
-        */
-       function printTrail() { ?>
-<?php echo MWDebug::getDebugHTML( $this->getSkin()->getContext() ); ?>
-<?php $this->html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?>
-<?php $this->html( 'reporttime' ) ?>
-<?php
-       }
-}
index 3ff281f..272d533 100644 (file)
@@ -42,8 +42,7 @@ abstract class ImageQueryPage extends QueryPage {
         */
        protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
                if ( $num > 0 ) {
-                       $gallery = ImageGalleryBase::factory();
-                       $gallery->setContext( $this->getContext() );
+                       $gallery = ImageGalleryBase::factory( false, $this->getContext() );
 
                        # $res might contain the whole 1,000 rows, so we read up to
                        # $num [should update this to use a Pager]
index ae0003d..b229e06 100644 (file)
@@ -76,6 +76,7 @@ abstract class QueryPage extends SpecialPage {
                                array( 'ListredirectsPage', 'Listredirects' ),
                                array( 'LonelyPagesPage', 'Lonelypages' ),
                                array( 'LongPagesPage', 'Longpages' ),
+                               array( 'MediaStatisticsPage', 'MediaStatistics' ),
                                array( 'MIMEsearchPage', 'MIMEsearch' ),
                                array( 'MostcategoriesPage', 'Mostcategories' ),
                                array( 'MostimagesPage', 'Mostimages' ),
@@ -324,7 +325,7 @@ abstract class QueryPage extends SpecialPage {
                                                        'qc_value' => $value );
                                }
 
-                               $dbw->begin( __METHOD__ );
+                               $dbw->startAtomic( __METHOD__ );
                                # Clear out any old cached data
                                $dbw->delete( 'querycache', array( 'qc_type' => $this->getName() ), $fname );
                                # Save results into the querycache table on the master
@@ -336,7 +337,7 @@ abstract class QueryPage extends SpecialPage {
                                $dbw->insert( 'querycache_info',
                                        array( 'qci_type' => $this->getName(), 'qci_timestamp' => $dbw->timestamp() ),
                                        $fname );
-                               $dbw->commit( __METHOD__ );
+                               $dbw->endAtomic( __METHOD__ );
                        }
                } catch ( DBError $e ) {
                        if ( !$ignoreErrors ) {
@@ -405,7 +406,7 @@ abstract class QueryPage extends SpecialPage {
                        $res = $dbr->query( $sql, $fname );
                }
 
-               return $dbr->resultObject( $res );
+               return $res;
        }
 
        /**
index cd41a1c..4226ee0 100644 (file)
@@ -71,10 +71,13 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
         */
        public function getRedirectQuery() {
                $params = array();
+               $request = $this->getRequest();
 
                foreach ( $this->mAllowedRedirectParams as $arg ) {
-                       if ( $this->getRequest()->getVal( $arg, null ) !== null ) {
-                               $params[$arg] = $this->getRequest()->getVal( $arg );
+                       if ( $request->getVal( $arg, null ) !== null ) {
+                               $params[$arg] = $request->getVal( $arg );
+                       } elseif ( $request->getArray( $arg, null ) !== null ) {
+                               $params[$arg] = $request->getArray( $arg );
                        }
                }
 
@@ -188,7 +191,7 @@ abstract class RedirectSpecialArticle extends RedirectSpecialPage {
                        'action',
                        'redirect', 'rdfrom',
                        # Options for preloaded edits
-                       'preload', 'editintro', 'preloadtitle', 'summary', 'nosummary',
+                       'preload', 'preloadparams', 'editintro', 'preloadtitle', 'summary', 'nosummary',
                        # Options for overriding user settings
                        'preview', 'minor', 'watchthis',
                        # Options for history/diffs
index 8fc28f8..c0a94af 100644 (file)
@@ -39,7 +39,7 @@ class SpecialPage {
 
        // Minimum user level required to access this page, or "" for anyone.
        // Also used to categorise the pages in Special:Specialpages
-       private $mRestriction;
+       protected $mRestriction;
 
        // Listed in Special:Specialpages?
        private $mListed;
index 07b6b4e..febd119 100644 (file)
@@ -47,7 +47,7 @@ class SpecialPageFactory {
        /**
         * List of special page names to the subclass of SpecialPage which handles them.
         */
-       private static $list = array(
+       private static $coreList = array(
                // Maintenance Reports
                'BrokenRedirects' => 'BrokenRedirectsPage',
                'Deadendpages' => 'DeadendPagesPage',
@@ -59,7 +59,7 @@ class SpecialPageFactory {
                'Withoutinterwiki' => 'WithoutInterwikiPage',
                'Protectedpages' => 'SpecialProtectedpages',
                'Protectedtitles' => 'SpecialProtectedtitles',
-               'Shortpages' => 'ShortpagesPage',
+               'Shortpages' => 'ShortPagesPage',
                'Uncategorizedcategories' => 'UncategorizedCategoriesPage',
                'Uncategorizedimages' => 'UncategorizedImagesPage',
                'Uncategorizedpages' => 'UncategorizedPagesPage',
@@ -74,7 +74,7 @@ class SpecialPageFactory {
                'Wantedtemplates' => 'WantedTemplatesPage',
 
                // List of pages
-               'Allpages' => 'SpecialAllpages',
+               'Allpages' => 'SpecialAllPages',
                'Prefixindex' => 'SpecialPrefixindex',
                'Categories' => 'SpecialCategories',
                'Listredirects' => 'ListredirectsPage',
@@ -114,6 +114,7 @@ class SpecialPageFactory {
                // Media reports and uploads
                'Listfiles' => 'SpecialListFiles',
                'Filepath' => 'SpecialFilepath',
+               'MediaStatistics' => 'MediaStatisticsPage',
                'MIMEsearch' => 'MIMEsearchPage',
                'FileDuplicateSearch' => 'FileDuplicateSearchPage',
                'Upload' => 'SpecialUpload',
@@ -122,7 +123,7 @@ class SpecialPageFactory {
 
                // Data and tools
                'Statistics' => 'SpecialStatistics',
-               'Allmessages' => 'SpecialAllmessages',
+               'Allmessages' => 'SpecialAllMessages',
                'Version' => 'SpecialVersion',
                'Lockdb' => 'SpecialLockdb',
                'Unlockdb' => 'SpecialUnlockdb',
@@ -155,6 +156,7 @@ class SpecialPageFactory {
                'Booksources' => 'SpecialBookSources',
 
                // Unlisted / redirects
+               'ApiHelp' => 'SpecialApiHelp',
                'Blankpage' => 'SpecialBlankpage',
                'Diff' => 'SpecialDiff',
                'Emailuser' => 'SpecialEmailUser',
@@ -173,22 +175,55 @@ class SpecialPageFactory {
                'Userlogout' => 'SpecialUserlogout',
        );
 
+       private static $list;
        private static $aliases;
 
        /**
-        * Get the special page list
+        * Reset the internal list of special pages. Useful when changing $wgSpecialPages after
+        * the internal list has already been initialized, e.g. during testing.
+        */
+       public static function resetList() {
+               self::$list = null;
+               self::$aliases = null;
+       }
+
+       /**
+        * Returns a list of canonical special page names.
+        * May be used to iterate over all registered special pages.
+        *
+        * @return string[]
+        */
+       public static function getNames() {
+               return array_keys( self::getPageList() );
+       }
+
+       /**
+        * Get the special page list as an array
+        *
+        * @deprecated since 1.24, use getNames() instead.
+        * @return array
+        */
+       public static function getList() {
+               wfDeprecated( __FUNCTION__, '1.24' );
+               return self::getPageList();
+       }
+
+       /**
+        * Get the special page list as an array
         *
         * @return array
         */
-       static function getList() {
+       private static function getPageList() {
                global $wgSpecialPages;
                global $wgDisableCounters, $wgDisableInternalSearch, $wgEmailAuthentication;
                global $wgEnableEmail, $wgEnableJavaScriptTest;
                global $wgPageLanguageUseDB;
 
-               if ( !is_object( self::$list ) ) {
+               if ( !is_array( self::$list ) ) {
                        wfProfileIn( __METHOD__ );
 
+                       self::$list = self::$coreList;
+
                        if ( !$wgDisableCounters ) {
                                self::$list['Popularpages'] = 'PopularPagesPage';
                        }
@@ -223,9 +258,6 @@ class SpecialPageFactory {
                        // This hook can be used to remove undesired built-in special pages
                        wfRunHooks( 'SpecialPage_initList', array( &self::$list ) );
 
-                       // Cast to object: func()[$key] doesn't work, but func()->$key does
-                       settype( self::$list, 'object' );
-
                        wfProfileOut( __METHOD__ );
                }
 
@@ -234,33 +266,55 @@ class SpecialPageFactory {
 
        /**
         * Initialise and return the list of special page aliases.  Returns an object with
-        * properties which can be accessed $obj->pagename - each property is an array of
-        * aliases; the first in the array is the canonical alias.  All registered special
-        * pages are guaranteed to have a property entry, and for that property array to
-        * contain at least one entry (English fallbacks will be added if necessary).
+        * properties which can be accessed $obj->pagename - each property name is an
+        * alias, with the value being the canonical name of the special page. All
+        * registered special pages are guaranteed to map to themselves.
         * @return object
         */
-       static function getAliasList() {
+       private static function getAliasListObject() {
                if ( !is_object( self::$aliases ) ) {
                        global $wgContLang;
                        $aliases = $wgContLang->getSpecialPageAliases();
-
-                       // Objects are passed by reference by default, need to create a copy
-                       $missingPages = clone self::getList();
+                       $pageList = self::getPageList();
 
                        self::$aliases = array();
+                       $keepAlias = array();
+
+                       // Force every canonical name to be an alias for itself.
+                       foreach ( $pageList as $name => $stuff ) {
+                               $caseFoldedAlias = $wgContLang->caseFold( $name );
+                               self::$aliases[$caseFoldedAlias] = $name;
+                               $keepAlias[$caseFoldedAlias] = 'canonical';
+                       }
+
                        // Check for $aliases being an array since Language::getSpecialPageAliases can return null
                        if ( is_array( $aliases ) ) {
                                foreach ( $aliases as $realName => $aliasList ) {
-                                       foreach ( $aliasList as $alias ) {
-                                               self::$aliases[$wgContLang->caseFold( $alias )] = $realName;
+                                       $aliasList = array_values( $aliasList );
+                                       foreach ( $aliasList as $i => $alias ) {
+                                               $caseFoldedAlias = $wgContLang->caseFold( $alias );
+
+                                               if ( isset( self::$aliases[$caseFoldedAlias] ) &&
+                                                       $realName === self::$aliases[$caseFoldedAlias]
+                                               ) {
+                                                       // Ignore same-realName conflicts
+                                                       continue;
+                                               }
+
+                                               if ( !isset( $keepAlias[$caseFoldedAlias] ) ) {
+                                                       self::$aliases[$caseFoldedAlias] = $realName;
+                                                       if ( !$i ) {
+                                                               $keepAlias[$caseFoldedAlias] = 'first';
+                                                       }
+                                               } elseif ( !$i ) {
+                                                       wfWarn( "First alias '$alias' for $realName conflicts with " .
+                                                               "{$keepAlias[$caseFoldedAlias]} alias for " .
+                                                               self::$aliases[$caseFoldedAlias]
+                                                       );
+                                               }
                                        }
-                                       unset( $missingPages->$realName );
                                }
                        }
-                       foreach ( $missingPages as $name => $stuff ) {
-                               self::$aliases[$wgContLang->caseFold( $name )] = $name;
-                       }
 
                        // Cast to object: func()[$key] doesn't work, but func()->$key does
                        self::$aliases = (object)self::$aliases;
@@ -283,8 +337,8 @@ class SpecialPageFactory {
 
                $caseFoldedAlias = $wgContLang->caseFold( $bits[0] );
                $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
-               if ( isset( self::getAliasList()->$caseFoldedAlias ) ) {
-                       $name = self::getAliasList()->$caseFoldedAlias;
+               if ( isset( self::getAliasListObject()->$caseFoldedAlias ) ) {
+                       $name = self::getAliasListObject()->$caseFoldedAlias;
                } else {
                        return array( null, null );
                }
@@ -335,7 +389,8 @@ class SpecialPageFactory {
        public static function exists( $name ) {
                list( $title, /*...*/ ) = self::resolveAlias( $name );
 
-               return property_exists( self::getList(), $title );
+               $specialPageList = self::getPageList();
+               return isset( $specialPageList[$title] );
        }
 
        /**
@@ -346,21 +401,39 @@ class SpecialPageFactory {
         */
        public static function getPage( $name ) {
                list( $realName, /*...*/ ) = self::resolveAlias( $name );
-               if ( property_exists( self::getList(), $realName ) ) {
-                       $rec = self::getList()->$realName;
-                       if ( is_string( $rec ) ) {
-                               $className = $rec;
 
-                               return new $className;
+               $specialPageList = self::getPageList();
+
+               if ( isset( $specialPageList[$realName] ) ) {
+                       $rec = $specialPageList[$realName];
+
+                       if ( is_callable( $rec ) ) {
+                               // Use callback to instantiate the special page
+                               $page = call_user_func( $rec );
+                       } elseif ( is_string( $rec ) ) {
+                               $className = $rec;
+                               $page = new $className;
                        } elseif ( is_array( $rec ) ) {
                                $className = array_shift( $rec );
                                // @deprecated, officially since 1.18, unofficially since forever
                                wfDeprecated( "Array syntax for \$wgSpecialPages is deprecated ($className), " .
                                        "define a subclass of SpecialPage instead.", '1.18' );
-                               self::getList()->$realName = MWFunction::newObj( $className, $rec );
+                               $page = MWFunction::newObj( $className, $rec );
+                       } elseif ( $rec instanceof SpecialPage ) {
+                               $page = $rec; //XXX: we should deep clone here
+                       } else {
+                               $page = null;
+                       }
+
+                       if ( $page instanceof SpecialPage ) {
+                               return $page;
+                       } else {
+                               // It's not a classname, nor a callback, nor a legacy constructor array,
+                               // nor a special page object. Give up.
+                               wfLogWarning( "Cannot instantiate special page $realName: bad spec!" );
+                               return null;
                        }
 
-                       return self::getList()->$realName;
                } else {
                        return null;
                }
@@ -380,7 +453,7 @@ class SpecialPageFactory {
                        global $wgUser;
                        $user = $wgUser;
                }
-               foreach ( self::getList() as $name => $rec ) {
+               foreach ( self::getPageList() as $name => $rec ) {
                        $page = self::getPage( $name );
                        if ( $page ) { // not null
                                $page->setContext( RequestContext::getMain() );
@@ -402,7 +475,7 @@ class SpecialPageFactory {
         */
        public static function getRegularPages() {
                $pages = array();
-               foreach ( self::getList() as $name => $rec ) {
+               foreach ( self::getPageList() as $name => $rec ) {
                        $page = self::getPage( $name );
                        if ( $page->isListed() && !$page->isRestricted() ) {
                                $pages[$name] = $page;
@@ -425,7 +498,7 @@ class SpecialPageFactory {
                        global $wgUser;
                        $user = $wgUser;
                }
-               foreach ( self::getList() as $name => $rec ) {
+               foreach ( self::getPageList() as $name => $rec ) {
                        $page = self::getPage( $name );
                        if (
                                $page->isListed()
@@ -534,7 +607,7 @@ class SpecialPageFactory {
         * @param IContextSource $context
         * @return string HTML fragment
         */
-       static function capturePath( Title $title, IContextSource $context ) {
+       public static function capturePath( Title $title, IContextSource $context ) {
                global $wgOut, $wgTitle, $wgRequest, $wgUser, $wgLang;
 
                // Save current globals
@@ -571,32 +644,45 @@ class SpecialPageFactory {
         * @param string|bool $subpage
         * @return string
         */
-       static function getLocalNameFor( $name, $subpage = false ) {
+       public static function getLocalNameFor( $name, $subpage = false ) {
                global $wgContLang;
                $aliases = $wgContLang->getSpecialPageAliases();
+               $aliasList = self::getAliasListObject();
 
-               if ( isset( $aliases[$name][0] ) ) {
-                       $name = $aliases[$name][0];
-               } else {
-                       // Try harder in case someone misspelled the correct casing
+               // Find the first alias that maps back to $name
+               if ( isset( $aliases[$name] ) ) {
                        $found = false;
-                       // Check for $aliases being an array since Language::getSpecialPageAliases can return null
+                       foreach ( $aliases[$name] as $alias ) {
+                               $caseFoldedAlias = $wgContLang->caseFold( $alias );
+                               $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
+                               if ( isset( $aliasList->$caseFoldedAlias ) &&
+                                       $aliasList->$caseFoldedAlias === $name
+                               ) {
+                                       $name = $alias;
+                                       $found = true;
+                                       break;
+                               }
+                       }
+                       if ( !$found ) {
+                               wfWarn( "Did not find a usable alias for special page '$name'. " .
+                                       "It seems all defined aliases conflict?" );
+                       }
+               } else {
+                       // Check if someone misspelled the correct casing
                        if ( is_array( $aliases ) ) {
                                foreach ( $aliases as $n => $values ) {
                                        if ( strcasecmp( $name, $n ) === 0 ) {
                                                wfWarn( "Found alias defined for $n when searching for " .
                                                        "special page aliases for $name. Case mismatch?" );
-                                               $name = $values[0];
-                                               $found = true;
-                                               break;
+                                               return self::getLocalNameFor( $n, $subpage );
                                        }
                                }
                        }
-                       if ( !$found ) {
-                               wfWarn( "Did not find alias for special page '$name'. " .
-                                       "Perhaps no aliases are defined for it?" );
-                       }
+
+                       wfWarn( "Did not find alias for special page '$name'. " .
+                               "Perhaps no aliases are defined for it?" );
                }
+
                if ( $subpage !== false && !is_null( $subpage ) ) {
                        $name = "$name/$subpage";
                }
@@ -610,10 +696,10 @@ class SpecialPageFactory {
         * @param string $alias
         * @return Title|null Title or null if there is no such alias
         */
-       static function getTitleForAlias( $alias ) {
-               $name = self::resolveAlias( $alias );
-               if ( $name ) {
-                       return SpecialPage::getTitleFor( $name );
+       public static function getTitleForAlias( $alias ) {
+               list( $name, $subpage ) = self::resolveAlias( $alias );
+               if ( $name != null ) {
+                       return SpecialPage::getTitleFor( $name, $subpage );
                } else {
                        return null;
                }
index 678c803..be2f1e8 100644 (file)
@@ -78,15 +78,9 @@ abstract class WantedQueryPage extends QueryPage {
                $title = Title::makeTitleSafe( $result->namespace, $result->title );
                if ( $title instanceof Title ) {
                        if ( $this->isCached() || $this->forceExistenceCheck() ) {
-                               $pageLink = $title->isKnown()
+                               $pageLink = $this->existenceCheck( $title )
                                        ? '<del>' . Linker::link( $title ) . '</del>'
-                                       : Linker::link(
-                                               $title,
-                                               null,
-                                               array(),
-                                               array(),
-                                               array( 'broken' )
-                                       );
+                                       : Linker::link( $title );
                        } else {
                                $pageLink = Linker::link(
                                        $title,
@@ -102,6 +96,25 @@ abstract class WantedQueryPage extends QueryPage {
                }
        }
 
+       /**
+        * Does the Title currently exists
+        *
+        * This method allows a subclass to override this check
+        * (For example, wantedfiles, would want to check if the file exists
+        * not just that a page in the file namespace exists).
+        *
+        * This will only control if the link is crossed out. Whether or not the link
+        * is blue vs red is controlled by if the title exists.
+        *
+        * @note This will only be run if the page is cached (ie $wgMiserMode = true)
+        *   unless forceExistenceCheck() is true.
+        * @since 1.24
+        * @return boolean
+        */
+       protected function existenceCheck( Title $title ) {
+               return $title->isKnown();
+       }
+
        /**
         * Make a "what links here" link for a given title
         *
index ce43652..6219fc4 100644 (file)
@@ -205,7 +205,8 @@ class ActiveUsersPager extends UsersPager {
 
                # Username field
                $out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(),
-                       'username', 'offset', 20, $this->requestedUser, array( 'tabindex' => 1 ) ) . '<br />';
+                       'username', 'offset', 20, $this->requestedUser,
+                       array( 'class' => 'mw-ui-input-inline', 'tabindex' => 1 ) ) . '<br />';
 
                $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
                        'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), array( 'tabindex' => 2 ) );
@@ -258,7 +259,7 @@ class SpecialActiveUsers extends SpecialPage {
                        array( 'activeusers-intro', $this->getLanguage()->formatNum( $days ) ) );
 
                // Occasionally merge in new updates
-               $seconds = min( self::mergeActiveUsers( 600, $days ), $days * 86400 );
+               $seconds = min( self::mergeActiveUsers( 300, $days ), $days * 86400 );
                // Mention the level of staleness
                $out->addWikiMsg( 'cachedspecial-viewing-cached-ttl',
                        $this->getLanguage()->formatDuration( $seconds ) );
@@ -331,12 +332,15 @@ class SpecialActiveUsers extends SpecialPage {
         * @return int|bool UNIX timestamp the cache is now up-to-date as of (false on error)
         */
        protected static function doQueryCacheUpdate( DatabaseBase $dbw, $days, $window ) {
+               $dbw->startAtomic( __METHOD__ );
+
                $lockKey = wfWikiID() . '-activeusers';
                if ( !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
                        return false; // exclusive update (avoids duplicate entries)
                }
 
-               $now = time();
+               $nowUnix = time();
+               // Get the last-updated timestamp for the cache
                $cTime = $dbw->selectField( 'querycache_info',
                        'qci_timestamp',
                        array( 'qci_type' => 'activeusers' )
@@ -346,8 +350,8 @@ class SpecialActiveUsers extends SpecialPage {
                // Pick the date range to fetch from. This is normally from the last
                // update to till the present time, but has a limited window for sanity.
                // If the window is limited, multiple runs are need to fully populate it.
-               $sTimestamp = max( $cTimeUnix, $now - $days * 86400 );
-               $eTimestamp = min( $sTimestamp + $window, $now );
+               $sTimestamp = max( $cTimeUnix, $nowUnix - $days * 86400 );
+               $eTimestamp = min( $sTimestamp + $window, $nowUnix );
 
                // Get all the users active since the last update
                $res = $dbw->select(
@@ -375,7 +379,7 @@ class SpecialActiveUsers extends SpecialPage {
                $dbw->delete( 'querycachetwo',
                        array(
                                'qcc_type' => 'activeusers',
-                               'qcc_value < ' . $dbw->addQuotes( $now - $days * 86400 ) // TS_UNIX
+                               'qcc_value < ' . $dbw->addQuotes( $nowUnix - $days * 86400 ) // TS_UNIX
                        ),
                        __METHOD__
                );
@@ -388,7 +392,10 @@ class SpecialActiveUsers extends SpecialPage {
                                        'qcc_type' => 'activeusers',
                                        'qcc_namespace' => NS_USER,
                                        'qcc_title' => array_keys( $names ) ),
-                               __METHOD__
+                               __METHOD__,
+                               // See the latest data (ignoring trx snapshot) to avoid
+                               // duplicates if this method was called in a transaction
+                               array( 'LOCK IN SHARE MODE' )
                        );
                        foreach ( $res as $row ) {
                                unset( $names[$row->user_name] );
@@ -416,15 +423,20 @@ class SpecialActiveUsers extends SpecialPage {
                        }
                }
 
+               // If a transaction was already started, it might have an old
+               // snapshot, so kludge the timestamp range back as needed.
+               $asOfTimestamp = min( $eTimestamp, (int)$dbw->trxTimestamp() );
+
                // Touch the data freshness timestamp
                $dbw->replace( 'querycache_info',
                        array( 'qci_type' ),
                        array( 'qci_type' => 'activeusers',
-                               'qci_timestamp' => $dbw->timestamp( $eTimestamp ) ), // not always $now
+                               'qci_timestamp' => $dbw->timestamp( $asOfTimestamp ) ), // not always $now
                        __METHOD__
                );
 
                $dbw->unlock( $lockKey, __METHOD__ );
+               $dbw->endAtomic( __METHOD__ );
 
                return $eTimestamp;
        }
index 1e4e18b..96be4d0 100644 (file)
@@ -68,10 +68,8 @@ class SpecialAllMessages extends SpecialPage {
 
                $this->langcode = $this->table->lang->getCode();
 
-               $out->addHTML( $this->table->buildForm() .
-                       $this->table->getNavigationBar() .
-                       $this->table->getBody() .
-                       $this->table->getNavigationBar() );
+               $out->addHTML( $this->table->buildForm() );
+               $out->addParserOutputContent( $this->table->getFullOutput() );
        }
 
        protected function getGroupName() {
@@ -103,7 +101,8 @@ class AllMessagesTablePager extends TablePager {
                $this->mIndexField = 'am_title';
                $this->mPage = $page;
                $this->mConds = $conds;
-               $this->mDefaultDirection = true; // always sort ascending
+               // FIXME: Why does this need to be set to DIR_DESCENDING to produce ascending ordering?
+               $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
                $this->mLimitsShown = array( 20, 50, 100, 250, 500, 5000 );
 
                global $wgContLang;
@@ -336,8 +335,9 @@ class AllMessagesTablePager extends TablePager {
        }
 
        function getStartBody() {
+               $tableClass = $this->getTableClass();
                return Xml::openElement( 'table', array(
-                               'class' => 'mw-datatable TablePager',
+                               'class' => "mw-datatable $tableClass",
                                'id' => 'mw-allmessagestable'
                        ) ) .
                        "\n" .
diff --git a/includes/specials/SpecialApiHelp.php b/includes/specials/SpecialApiHelp.php
new file mode 100644 (file)
index 0000000..b43911f
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Implements Special:ApiHelp
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Special page to redirect to API help pages, for situations where linking to
+ * the api.php endpoint is not wanted.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialApiHelp extends UnlistedSpecialPage {
+       public function __construct() {
+               parent::__construct( 'ApiHelp' );
+       }
+
+       public function execute( $par ) {
+               if ( empty( $par ) ) {
+                       $par = 'main';
+               }
+
+               // These come from transclusions
+               $request = $this->getRequest();
+               $options = array(
+                       'action' => 'help',
+                       'nolead' => true,
+                       'submodules' => $request->getCheck( 'submodules' ),
+                       'recursivesubmodules' => $request->getCheck( 'recursivesubmodules' ),
+                       'title' => $request->getVal( 'title', $this->getPageTitle( '$1' )->getPrefixedText() ),
+               );
+
+               // These are for linking from wikitext, since url parameters are a pain
+               // to do.
+               while ( true ) {
+                       if ( substr( $par, 0, 4 ) === 'sub/' ) {
+                               $par = substr( $par, 4 );
+                               $options['submodules'] = 1;
+                               continue;
+                       }
+
+                       if ( substr( $par, 0, 5 ) === 'rsub/' ) {
+                               $par = substr( $par, 5 );
+                               $options['recursivesubmodules'] = 1;
+                               continue;
+                       }
+
+                       $moduleName = $par;
+                       break;
+               }
+
+               if ( !$this->including() ) {
+                       unset( $options['nolead'], $options['title'] );
+                       $options['modules'] = $moduleName;
+                       $link = wfAppendQuery( wfExpandUrl( wfScript( 'api' ), PROTO_CURRENT ), $options );
+                       $this->getOutput()->redirect( $link );
+                       return;
+               }
+
+               $main = new ApiMain( $this->getContext(), false );
+               try {
+                       $module = $main->getModuleFromPath( $moduleName );
+               } catch ( UsageException $ex ) {
+                       $this->getOutput()->addHTML( Html::rawElement( 'span', array( 'class' => 'error' ),
+                               $this->msg( 'apihelp-no-such-module', $moduleName )->inContentLanguage()->parse()
+                       ) );
+                       return;
+               }
+
+               ApiHelp::getHelp( $this->getContext(), $module, $options );
+       }
+
+       public function isIncludable() {
+               return true;
+       }
+}
index 3297c17..cf82b86 100644 (file)
@@ -98,6 +98,7 @@ class SpecialBlock extends FormSpecialPage {
                $form->setWrapperLegendMsg( 'blockip-legend' );
                $form->setHeaderText( '' );
                $form->setSubmitCallback( array( __CLASS__, 'processUIForm' ) );
+               $form->setSubmitDestructive();
 
                $msg = $this->alreadyBlocked ? 'ipb-change-block' : 'ipbsubmit';
                $form->setSubmitTextMsg( $msg );
index 62fadb5..aefd99a 100644 (file)
@@ -103,6 +103,7 @@ class SpecialBlockList extends SpecialPage {
                $form->setMethod( 'get' );
                $form->setWrapperLegendMsg( 'ipblocklist-legend' );
                $form->setSubmitTextMsg( 'ipblocklist-submit' );
+               $form->setSubmitProgressive();
                $form->prepareForm();
 
                $form->displayForm( '' );
@@ -181,11 +182,7 @@ class SpecialBlockList extends SpecialPage {
 
                $pager = new BlockListPager( $this, $conds );
                if ( $pager->getNumRows() ) {
-                       $out->addHTML(
-                               $pager->getNavigationBar() .
-                                       $pager->getBody() .
-                                       $pager->getNavigationBar()
-                       );
+                       $out->addParserOutputContent( $pager->getFullOutput() );
                } elseif ( $this->target ) {
                        $out->addWikiMsg( 'ipblocklist-no-results' );
                } else {
@@ -228,7 +225,7 @@ class BlockListPager extends TablePager {
        function __construct( $page, $conds ) {
                $this->page = $page;
                $this->conds = $conds;
-               $this->mDefaultDirection = true;
+               $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
                parent::__construct( $page->getContext() );
        }
 
@@ -409,7 +406,7 @@ class BlockListPager extends TablePager {
        }
 
        public function getTableClass() {
-               return 'TablePager mw-blocklist';
+               return parent::getTableClass() . ' mw-blocklist';
        }
 
        function getIndexField() {
index 72f4e46..d8eec7d 100644 (file)
@@ -26,7 +26,6 @@
  * The parser creates links to this page when dealing with ISBNs in wikitext
  *
  * @author Rob Church <robchur@gmail.com>
- * @todo Validate ISBNs using the standard check-digit method
  * @ingroup SpecialPage
  */
 class SpecialBookSources extends SpecialPage {
@@ -73,7 +72,9 @@ class SpecialBookSources extends SpecialPage {
                $sum = 0;
                if ( strlen( $isbn ) == 13 ) {
                        for ( $i = 0; $i < 12; $i++ ) {
-                               if ( $i % 2 == 0 ) {
+                               if ( $isbn[$i] === 'X' ) {
+                                       return false;
+                               } elseif ( $i % 2 == 0 ) {
                                        $sum += $isbn[$i];
                                } else {
                                        $sum += 3 * $isbn[$i];
@@ -81,11 +82,14 @@ class SpecialBookSources extends SpecialPage {
                        }
 
                        $check = ( 10 - ( $sum % 10 ) ) % 10;
-                       if ( $check == $isbn[12] ) {
+                       if ( (string)$check === $isbn[12] ) {
                                return true;
                        }
                } elseif ( strlen( $isbn ) == 10 ) {
                        for ( $i = 0; $i < 9; $i++ ) {
+                               if ( $isbn[$i] === 'X' ) {
+                                       return false;
+                               }
                                $sum += $isbn[$i] * ( $i + 1 );
                        }
 
@@ -93,7 +97,7 @@ class SpecialBookSources extends SpecialPage {
                        if ( $check == 10 ) {
                                $check = "X";
                        }
-                       if ( $check == $isbn[9] ) {
+                       if ( (string)$check === $isbn[9] ) {
                                return true;
                        }
                }
@@ -131,9 +135,14 @@ class SpecialBookSources extends SpecialPage {
                        'isbn',
                        20,
                        $this->isbn,
-                       array( 'autofocus' => true )
+                       array( 'autofocus' => true, 'class' => 'mw-ui-input-inline' )
                );
-               $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . "</p>\n";
+
+               $form .= '&#160;' . Html::submitButton(
+                       $this->msg( 'booksources-search' )->text(),
+                       array(), array( 'mw-ui-progressive' )
+               ) . "</p>\n";
+
                $form .= Html::closeElement( 'form' ) . "\n";
                $form .= Html::closeElement( 'fieldset' ) . "\n";
 
index 95f9efd..3a13b7e 100644 (file)
@@ -188,9 +188,11 @@ class CategoryPager extends AlphabeticPager {
                                        $this->msg( 'categories' )->text(),
                                        Xml::inputLabel(
                                                $this->msg( 'categoriesfrom' )->text(),
-                                               'from', 'from', 20, $from ) .
+                                               'from', 'from', 20, $from, array( 'class' => 'mw-ui-input-inline' ) ) .
                                                ' ' .
-                                               Xml::submitButton( $this->msg( 'allpagessubmit' )->text()
+                                               Html::submitButton(
+                                                       $this->msg( 'allpagessubmit' )->text(),
+                                                       array(), array( 'mw-ui-progressive' )
                                                )
                                )
                );
index 7fc4a17..12bbd2a 100644 (file)
  *
  * @ingroup SpecialPage
  */
-class SpecialChangeEmail extends UnlistedSpecialPage {
+class SpecialChangeEmail extends FormSpecialPage {
        /**
-        * Users password
-        * @var string
+        * @var Status
         */
-       protected $mPassword;
-
-       /**
-        * Users new email address
-        * @var string
-        */
-       protected $mNewEmail;
+       private $status;
 
        public function __construct() {
                parent::__construct( 'ChangeEmail', 'editmyprivateinfo' );
@@ -57,196 +50,127 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
         * @param string $par
         */
        function execute( $par ) {
-               global $wgAuth;
-
-               $this->setHeaders();
-               $this->outputHeader();
-
                $out = $this->getOutput();
                $out->disallowUserJs();
                $out->addModules( 'mediawiki.special.changeemail' );
 
-               if ( !$wgAuth->allowPropChange( 'emailaddress' ) ) {
-                       $this->error( 'cannotchangeemail' );
-
-                       return;
-               }
-
-               $user = $this->getUser();
-               $request = $this->getRequest();
-
-               $this->requireLogin( 'changeemail-no-info' );
+               return parent::execute( $par );
+       }
 
-               if ( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
-                       $this->doReturnTo();
+       protected function checkExecutePermissions( User $user ) {
+               global $wgAuth;
 
-                       return;
+               if ( !$wgAuth->allowPropChange( 'emailaddress' ) ) {
+                       throw new ErrorPageError( 'changeemail', 'cannotchangeemail' );
                }
 
-               $this->checkReadOnly();
-               $this->checkPermissions();
+               $this->requireLogin( 'changeemail-no-info' );
 
                // This could also let someone check the current email address, so
                // require both permissions.
-               if ( !$user->isAllowed( 'viewmyprivateinfo' ) ) {
+               if ( !$this->getUser()->isAllowed( 'viewmyprivateinfo' ) ) {
                        throw new PermissionsError( 'viewmyprivateinfo' );
                }
 
-               $this->mPassword = $request->getVal( 'wpPassword' );
-               $this->mNewEmail = $request->getVal( 'wpNewEmail' );
+               parent::checkExecutePermissions( $user );
+       }
 
-               if ( $request->wasPosted()
-                       && $user->matchEditToken( $request->getVal( 'token' ) )
-               ) {
-                       $info = $this->attemptChange( $user, $this->mPassword, $this->mNewEmail );
-                       if ( $info === true ) {
-                               $this->doReturnTo();
-                       } elseif ( $info === 'eauth' ) {
-                               # Notify user that a confirmation email has been sent...
-                               $out->wrapWikiMsg( "<div class='error' style='clear: both;'>\n$1\n</div>",
-                                       'eauthentsent', $user->getName() );
-                               $this->doReturnTo( 'soft' ); // just show the link to go back
-                               return; // skip form
-                       }
-               }
+       protected function getFormFields() {
+               $user = $this->getUser();
 
-               $this->showForm();
-       }
+               $fields = array(
+                       'Name' => array(
+                               'type' => 'info',
+                               'label-message' => 'username',
+                               'default' => $user->getName(),
+                       ),
+                       'OldEmail' => array(
+                               'type' => 'info',
+                               'label-message' => 'changeemail-oldemail',
+                               'default' => $user->getEmail() ?: $this->msg( 'changeemail-none' )->text(),
+                       ),
+                       'NewEmail' => array(
+                               'type' => 'email',
+                               'label-message' => 'changeemail-newemail',
+                       ),
+               );
 
-       /**
-        * @param string $type
-        */
-       protected function doReturnTo( $type = 'hard' ) {
-               $titleObj = Title::newFromText( $this->getRequest()->getVal( 'returnto' ) );
-               if ( !$titleObj instanceof Title ) {
-                       $titleObj = Title::newMainPage();
-               }
-               if ( $type == 'hard' ) {
-                       $this->getOutput()->redirect( $titleObj->getFullURL() );
-               } else {
-                       $this->getOutput()->addReturnTo( $titleObj );
+               if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' ) ) {
+                       $fields['Password'] = array(
+                               'type' => 'password',
+                               'label-message' => 'changeemail-password',
+                               'autofocus' => true,
+                       );
                }
+
+               return $fields;
        }
 
-       /**
-        * @param string $msg
-        */
-       protected function error( $msg ) {
-               $this->getOutput()->wrapWikiMsg( "<p class='error'>\n$1\n</p>", $msg );
+       protected function alterForm( HTMLForm $form ) {
+               $form->setDisplayFormat( 'vform' );
+               $form->setId( 'mw-changeemail-form' );
+               $form->setTableId( 'mw-changeemail-table' );
+               $form->setWrapperLegend( false );
+               $form->setSubmitTextMsg( 'changeemail-submit' );
+               $form->addHiddenFields( $this->getRequest()->getValues( 'returnto', 'returntoquery' ) );
        }
 
-       protected function showForm() {
-               $user = $this->getUser();
+       public function onSubmit( array $data ) {
+               $password = isset( $data['Password'] ) ? $data['Password'] : null;
+               $status = $this->attemptChange( $this->getUser(), $password, $data['NewEmail'] );
 
-               $oldEmailText = $user->getEmail()
-                       ? $user->getEmail()
-                       : $this->msg( 'changeemail-none' )->text();
-
-               $this->getOutput()->addHTML(
-                       Xml::fieldset( $this->msg( 'changeemail-header' )->text() ) .
-                               Xml::openElement( 'form',
-                                       array(
-                                               'method' => 'post',
-                                               'action' => $this->getPageTitle()->getLocalURL(),
-                                               'id' => 'mw-changeemail-form' ) ) . "\n" .
-                               Html::hidden( 'token', $user->getEditToken() ) . "\n" .
-                               Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
-                               $this->msg( 'changeemail-text' )->parseAsBlock() . "\n" .
-                               Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n"
-               );
-               $items = array(
-                       array( 'wpName', 'username', 'text', $user->getName() ),
-                       array( 'wpOldEmail', 'changeemail-oldemail', 'text', $oldEmailText ),
-                       array( 'wpNewEmail', 'changeemail-newemail', 'email', $this->mNewEmail ),
-               );
-               if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' ) ) {
-                       $items[] = array( 'wpPassword', 'changeemail-password', 'password', $this->mPassword );
-               }
+               $this->status = $status;
 
-               $this->getOutput()->addHTML(
-                       $this->pretty( $items ) .
-                               "\n" .
-                               "<tr>\n" .
-                               "<td></td>\n" .
-                               '<td class="mw-input">' .
-                               Xml::submitButton( $this->msg( 'changeemail-submit' )->text() ) .
-                               Xml::submitButton( $this->msg( 'changeemail-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
-                               "</td>\n" .
-                               "</tr>\n" .
-                               Xml::closeElement( 'table' ) .
-                               Xml::closeElement( 'form' ) .
-                               Xml::closeElement( 'fieldset' ) . "\n"
-               );
+               return $status;
        }
 
-       /**
-        * @param array $fields
-        * @return string
-        */
-       protected function pretty( $fields ) {
-               $out = '';
-               foreach ( $fields as $list ) {
-                       list( $name, $label, $type, $value ) = $list;
-                       if ( $type == 'text' ) {
-                               $field = htmlspecialchars( $value );
-                       } else {
-                               $attribs = array( 'id' => $name );
-                               if ( $name == 'wpPassword' ) {
-                                       $attribs[] = 'autofocus';
-                               }
-                               $field = Html::input( $name, $value, $type, $attribs );
-                       }
-                       $out .= "<tr>\n";
-                       $out .= "\t<td class='mw-label'>";
-                       if ( $type != 'text' ) {
-                               $out .= Xml::label( $this->msg( $label )->text(), $name );
-                       } else {
-                               $out .= $this->msg( $label )->escaped();
-                       }
-                       $out .= "</td>\n";
-                       $out .= "\t<td class='mw-input'>";
-                       $out .= $field;
-                       $out .= "</td>\n";
-                       $out .= "</tr>";
-               }
+       public function onSuccess() {
+               $request = $this->getRequest();
 
-               return $out;
+               $titleObj = Title::newFromText( $request->getVal( 'returnto' ) );
+               if ( !$titleObj instanceof Title ) {
+                       $titleObj = Title::newMainPage();
+               }
+               $query = $request->getVal( 'returntoquery' );
+
+               if ( $this->status->value === true ) {
+                       $this->getOutput()->redirect( $titleObj->getFullURL( $query ) );
+               } elseif ( $this->status->value === 'eauth' ) {
+                       # Notify user that a confirmation email has been sent...
+                       $this->getOutput()->wrapWikiMsg( "<div class='error' style='clear: both;'>\n$1\n</div>",
+                               'eauthentsent', $this->getUser()->getName() );
+                       $this->getOutput()->addReturnTo( $titleObj, wfCgiToArray( $query ) ); // just show the link to go back
+               }
        }
 
        /**
         * @param User $user
         * @param string $pass
         * @param string $newaddr
-        * @return bool|string True or string on success, false on failure
+        * @return Status
         */
        protected function attemptChange( User $user, $pass, $newaddr ) {
                global $wgAuth;
 
                if ( $newaddr != '' && !Sanitizer::validateEmail( $newaddr ) ) {
-                       $this->error( 'invalidemailaddress' );
-
-                       return false;
+                       return Status::newFatal( 'invalidemailaddress' );
                }
 
                $throttleCount = LoginForm::incLoginThrottle( $user->getName() );
                if ( $throttleCount === true ) {
                        $lang = $this->getLanguage();
                        $throttleInfo = $this->getConfig()->get( 'PasswordAttemptThrottle' );
-                       $this->error( array(
+                       return Status::newFatal(
                                'changeemail-throttled',
                                $lang->formatDuration( $throttleInfo['seconds'] )
-                       ) );
-
-                       return false;
+                       );
                }
 
                if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' )
                        && !$user->checkTemporaryPassword( $pass )
                        && !$user->checkPassword( $pass )
                ) {
-                       $this->error( 'wrongpassword' );
-
-                       return false;
+                       return Status::newFatal( 'wrongpassword' );
                }
 
                if ( $throttleCount ) {
@@ -256,12 +180,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                $oldaddr = $user->getEmail();
                $status = $user->setEmailWithConfirmation( $newaddr );
                if ( !$status->isGood() ) {
-                       $this->getOutput()->addHTML(
-                               '<p class="error">' .
-                                       $this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
-                                       '</p>' );
-
-                       return false;
+                       return $status;
                }
 
                wfRunHooks( 'PrefsEmailAudit', array( $user, $oldaddr, $newaddr ) );
@@ -270,7 +189,11 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
                $wgAuth->updateExternalDB( $user );
 
-               return $status->value;
+               return $status;
+       }
+
+       public function requiresUnblock() {
+               return false;
        }
 
        protected function getGroupName() {
index af8ab58..107413e 100644 (file)
@@ -478,18 +478,15 @@ class SpecialContributions extends IncludableSpecialPage {
                if ( $tagFilter ) {
                        $filterSelection = Html::rawElement(
                                'td',
-                               array( 'class' => 'mw-label' ),
-                               array_shift( $tagFilter )
-                       );
-                       $filterSelection .= Html::rawElement(
-                               'td',
-                               array( 'class' => 'mw-input' ),
-                               implode( '&#160', $tagFilter )
+                               array(),
+                               array_shift( $tagFilter ) . implode( '&#160', $tagFilter )
                        );
                } else {
                        $filterSelection = Html::rawElement( 'td', array( 'colspan' => 2 ), '' );
                }
 
+               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
+
                $labelNewbies = Xml::radioLabel(
                        $this->msg( 'sp-contributions-newbies' )->text(),
                        'contribs',
@@ -510,9 +507,15 @@ class SpecialContributions extends IncludableSpecialPage {
                        'target',
                        $this->opts['target'],
                        'text',
-                       array( 'size' => '40', 'required' => '', 'class' => 'mw-input' ) +
-                               ( $this->opts['target'] ? array() : array( 'autofocus' )
-                               )
+                       array(
+                               'size' => '40',
+                               'required' => '',
+                               'class' => array(
+                                       'mw-input',
+                                       'mw-ui-input-inline',
+                                       'mw-autocomplete-user', // used by mediawiki.userSuggest
+                               ),
+                       ) + ( $this->opts['target'] ? array() : array( 'autofocus' ) )
                );
                $targetSelection = Html::rawElement(
                        'td',
@@ -522,16 +525,12 @@ class SpecialContributions extends IncludableSpecialPage {
 
                $namespaceSelection = Xml::tags(
                        'td',
-                       array( 'class' => 'mw-label' ),
+                       array(),
                        Xml::label(
                                $this->msg( 'namespace' )->text(),
                                'namespace',
                                ''
-                       )
-               );
-               $namespaceSelection .= Html::rawElement(
-                       'td',
-                       null,
+                       ) .
                        Html::namespaceSelector(
                                array( 'selected' => $this->opts['namespace'], 'all' => '' ),
                                array(
@@ -617,9 +616,9 @@ class SpecialContributions extends IncludableSpecialPage {
                                $this->opts['year'] === '' ? MWTimestamp::getInstance()->format( 'Y' ) : $this->opts['year'],
                                $this->opts['month']
                        ) . ' ' .
-                               Xml::submitButton(
+                               Html::submitButton(
                                        $this->msg( 'sp-contributions-submit' )->text(),
-                                       array( 'class' => 'mw-submit' )
+                                       array( 'class' => 'mw-submit' ), array( 'mw-ui-progressive' )
                                )
                );
 
@@ -652,7 +651,7 @@ class SpecialContributions extends IncludableSpecialPage {
  * @ingroup SpecialPage Pager
  */
 class ContribsPager extends ReverseChronologicalPager {
-       public $mDefaultDirection = true;
+       public $mDefaultDirection = IndexPager::DIR_DESCENDING;
        public $messages;
        public $target;
        public $namespace = '';
index 934b7a3..1b665f6 100644 (file)
@@ -26,7 +26,7 @@
  * @ingroup SpecialPage
  */
 class DeletedContribsPager extends IndexPager {
-       public $mDefaultDirection = true;
+       public $mDefaultDirection = IndexPager::DIR_DESCENDING;
        public $messages;
        public $target;
        public $namespace = '';
@@ -533,6 +533,8 @@ class DeletedContributionsPage extends SpecialPage {
                        $f .= "\t" . Html::hidden( $name, $value ) . "\n";
                }
 
+               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
+
                $f .= Xml::openElement( 'fieldset' );
                $f .= Xml::element( 'legend', array(), $this->msg( 'sp-contributions-search' )->text() );
                $f .= Xml::tags(
@@ -546,7 +548,10 @@ class DeletedContributionsPage extends SpecialPage {
                        'text',
                        array(
                                'size' => '20',
-                               'required' => ''
+                               'required' => '',
+                               'class' => array(
+                                       'mw-autocomplete-user', // used by mediawiki.userSuggest
+                               ),
                        ) + ( $options['target'] ? array() : array( 'autofocus' ) )
                ) . ' ';
                $f .= Html::namespaceSelector(
index 76f2f4a..db83019 100644 (file)
@@ -553,7 +553,15 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $fields = array();
                $count = 0;
 
-               foreach ( $this->getWatchlistInfo() as $namespace => $pages ) {
+               // Allow subscribers to manipulate the list of watched pages (or use it
+               // to preload lots of details at once)
+               $watchlistInfo = $this->getWatchlistInfo();
+               wfRunHooks(
+                       'WatchlistEditorBeforeFormRender',
+                       array( &$watchlistInfo )
+               );
+
+               foreach ( $watchlistInfo as $namespace => $pages ) {
                        $options = array();
 
                        foreach ( array_keys( $pages ) as $dbkey ) {
@@ -601,6 +609,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $context->setTitle( $this->getPageTitle() ); // Remove subpage
                $form = new EditWatchlistNormalHTMLForm( $fields, $context );
                $form->setSubmitTextMsg( 'watchlistedit-normal-submit' );
+               $form->setSubmitDestructive();
                # Used message keys:
                # 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
                $form->setSubmitTooltip( 'watchlistedit-normal-submit' );
@@ -620,15 +629,10 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
        private function buildRemoveLine( $title ) {
                $link = Linker::link( $title );
 
-               if ( $title->isRedirect() ) {
-                       // Linker already makes class mw-redirect, so this is redundant
-                       $link = '<span class="watchlistredir">' . $link . '</span>';
-               }
-
-               $tools[] = Linker::link( $title->getTalkPage(), $this->msg( 'talkpagelinktext' )->escaped() );
+               $tools['talk'] = Linker::link( $title->getTalkPage(), $this->msg( 'talkpagelinktext' )->escaped() );
 
                if ( $title->exists() ) {
-                       $tools[] = Linker::linkKnown(
+                       $tools['history'] = Linker::linkKnown(
                                $title,
                                $this->msg( 'history_short' )->escaped(),
                                array(),
@@ -637,7 +641,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                }
 
                if ( $title->getNamespace() == NS_USER && !$title->isSubpage() ) {
-                       $tools[] = Linker::linkKnown(
+                       $tools['contributions'] = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Contributions', $title->getText() ),
                                $this->msg( 'contributions' )->escaped()
                        );
@@ -645,9 +649,14 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
                wfRunHooks(
                        'WatchlistEditorBuildRemoveLine',
-                       array( &$tools, $title, $title->isRedirect(), $this->getSkin() )
+                       array( &$tools, $title, $title->isRedirect(), $this->getSkin(), &$link )
                );
 
+               if ( $title->isRedirect() ) {
+                       // Linker already makes class mw-redirect, so this is redundant
+                       $link = '<span class="watchlistredir">' . $link . '</span>';
+               }
+
                return $link . " (" . $this->getLanguage()->pipeList( $tools ) . ")";
        }
 
index 0958126..20532a9 100644 (file)
@@ -113,7 +113,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                // error out if sending user cannot do this
                $error = self::getPermissionsError(
                        $this->getUser(),
-                       $this->getRequest()->getVal( 'wpEditToken' )
+                       $this->getRequest()->getVal( 'wpEditToken' ),
+                       $this->getConfig()
                );
 
                switch ( $error ) {
@@ -208,12 +209,15 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         *
         * @param User $user
         * @param string $editToken Edit token
+        * @param Config $config optional for backwards compatibility
         * @return string|null Null on success or string on error
         */
-       public static function getPermissionsError( $user, $editToken ) {
-               global $wgEnableEmail, $wgEnableUserEmail;
-
-               if ( !$wgEnableEmail || !$wgEnableUserEmail ) {
+       public static function getPermissionsError( $user, $editToken, Config $config = null ) {
+               if ( $config === null ) {
+                       wfDebug( __METHOD__ . ' called without a Config instance passed to it' );
+                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               }
+               if ( !$config->get( 'EnableEmail' ) || !$config->get( 'EnableUserEmail' ) ) {
                        return 'usermaildisabled';
                }
 
@@ -256,10 +260,9 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * @return string Form asking for user name.
         */
        protected function userForm( $name ) {
-               global $wgScript;
                $string = Xml::openElement(
                        'form',
-                       array( 'method' => 'get', 'action' => $wgScript, 'id' => 'askusername' )
+                       array( 'method' => 'get', 'action' => wfScript(), 'id' => 'askusername' )
                ) .
                        Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) .
                        Xml::openElement( 'fieldset' ) .
@@ -302,7 +305,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * or maybe even true on success if anything uses the EmailUser hook.
         */
        public static function submit( array $data, IContextSource $context ) {
-               global $wgUserEmailUseReplyTo;
+               $config = $context->getConfig();
 
                $target = self::getTarget( $data['Target'] );
                if ( !$target instanceof User ) {
@@ -310,8 +313,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        return $context->msg( $target . 'text' )->parseAsBlock();
                }
 
-               $to = new MailAddress( $target );
-               $from = new MailAddress( $context->getUser() );
+               $to = MailAddress::newFromUser( $target );
+               $from = MailAddress::newFromUser( $context->getUser() );
                $subject = $data['Subject'];
                $text = $data['Text'];
 
@@ -325,16 +328,14 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        return $error;
                }
 
-               if ( $wgUserEmailUseReplyTo ) {
+               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).
-                       global $wgPasswordSender;
-
-                       $mailFrom = new MailAddress( $wgPasswordSender,
+                       $mailFrom = new MailAddress( $config->get( 'PasswordSender' ),
                                wfMessage( 'emailsender' )->inContentLanguage()->text() );
                        $replyTo = $from;
                } else {
index 269dff6..f3adeba 100644 (file)
@@ -151,7 +151,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        'contexttitle',
                        60,
                        $title,
-                       array( 'autofocus' => true )
+                       array( 'autofocus' => true, 'class' => 'mw-ui-input-inline' )
                ) . '</p>';
                $form .= '<p>' . Xml::label(
                        $this->msg( 'expand_templates_input' )->text(),
@@ -251,6 +251,7 @@ class SpecialExpandTemplates extends SpecialPage {
                ) ) );
                $out->addParserOutputContent( $pout );
                $out->addHTML( Html::closeElement( 'div' ) );
+               $out->setCategoryLinks( $pout->getCategories() );
        }
 
        protected function getGroupName() {
index 2a3ab64..3d762aa 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialImport extends SpecialPage {
+       private $sourceName = false;
        private $interwiki = false;
+       private $subproject;
+       private $fullInterwikiPrefix;
        private $namespace;
        private $rootpage = '';
        private $frompage = '';
@@ -55,6 +58,8 @@ class SpecialImport extends SpecialPage {
                $this->setHeaders();
                $this->outputHeader();
 
+               $this->getOutput()->addModules( 'mediawiki.special.import' );
+
                $user = $this->getUser();
                if ( !$user->isAllowedAny( 'import', 'importupload' ) ) {
                        throw new PermissionsError( 'import' );
@@ -94,7 +99,7 @@ class SpecialImport extends SpecialPage {
                $isUpload = false;
                $request = $this->getRequest();
                $this->namespace = $request->getIntOrNull( 'namespace' );
-               $sourceName = $request->getVal( "source" );
+               $this->sourceName = $request->getVal( "source" );
 
                $this->logcomment = $request->getText( 'log-comment' );
                $this->pageLinkDepth = $this->getConfig()->get( 'ExportMaxLinkDepth' ) == 0
@@ -105,30 +110,41 @@ class SpecialImport extends SpecialPage {
                $user = $this->getUser();
                if ( !$user->matchEditToken( $request->getVal( 'editToken' ) ) ) {
                        $source = Status::newFatal( 'import-token-mismatch' );
-               } elseif ( $sourceName == 'upload' ) {
+               } elseif ( $this->sourceName == 'upload' ) {
                        $isUpload = true;
                        if ( $user->isAllowed( 'importupload' ) ) {
                                $source = ImportStreamSource::newFromUpload( "xmlimport" );
                        } else {
                                throw new PermissionsError( 'importupload' );
                        }
-               } elseif ( $sourceName == "interwiki" ) {
+               } elseif ( $this->sourceName == "interwiki" ) {
                        if ( !$user->isAllowed( 'import' ) ) {
                                throw new PermissionsError( 'import' );
                        }
-                       $this->interwiki = $request->getVal( 'interwiki' );
-                       if ( !in_array( $this->interwiki, $this->getConfig()->get( 'ImportSources' ) ) ) {
+                       $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 ) ) {
                                $source = Status::newFatal( "import-invalid-interwiki" );
                        } else {
-                               $this->history = $request->getCheck( 'interwikiHistory' );
-                               $this->frompage = $request->getText( "frompage" );
-                               $this->includeTemplates = $request->getCheck( 'interwikiTemplates' );
-                               $source = ImportStreamSource::newFromInterwiki(
-                                       $this->interwiki,
-                                       $this->frompage,
-                                       $this->history,
-                                       $this->includeTemplates,
-                                       $this->pageLinkDepth );
+                               if ( $hasSubprojects ) {
+                                       $this->subproject = $request->getVal( 'subproject' );
+                                       $this->fullInterwikiPrefix .= ':' . $request->getVal( 'subproject' );
+                               }
+                               if ( $hasSubprojects && !in_array( $this->subproject, $importSources[$this->interwiki] ) ) {
+                                       $source = Status::newFatal( "import-invalid-interwiki" );
+                               } else {
+                                       $this->history = $request->getCheck( 'interwikiHistory' );
+                                       $this->frompage = $request->getText( "frompage" );
+                                       $this->includeTemplates = $request->getCheck( 'interwikiTemplates' );
+                                       $source = ImportStreamSource::newFromInterwiki(
+                                               $this->fullInterwikiPrefix,
+                                               $this->frompage,
+                                               $this->history,
+                                               $this->includeTemplates,
+                                               $this->pageLinkDepth );
+                               }
                        }
                } else {
                        $source = Status::newFatal( "importunknownsource" );
@@ -166,7 +182,7 @@ class SpecialImport extends SpecialPage {
                        $reporter = new ImportReporter(
                                $importer,
                                $isUpload,
-                               $this->interwiki,
+                               $this->fullInterwikiPrefix,
                                $this->logcomment
                        );
                        $reporter->setContext( $this->getContext() );
@@ -235,7 +251,8 @@ class SpecialImport extends SpecialPage {
                                        Xml::label( $this->msg( 'import-comment' )->text(), 'mw-import-comment' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                       Xml::input( 'log-comment', 50, '',
+                                       Xml::input( 'log-comment', 50, 
+                                               ( $this->sourceName == 'upload' ? $this->logcomment : '' ),
                                                array( 'id' => 'mw-import-comment', 'type' => 'text' ) ) . ' ' .
                                        "</td>
                                </tr>
@@ -299,7 +316,7 @@ class SpecialImport extends SpecialPage {
                                        Xml::openElement( 'table', array( 'id' => 'mw-import-table-interwiki' ) ) .
                                        "<tr>
                                        <td class='mw-label'>" .
-                                       Xml::label( $this->msg( 'import-interwiki-source' )->text(), 'interwiki' ) .
+                                       Xml::label( $this->msg( 'import-interwiki-sourcewiki' )->text(), 'interwiki' ) .
                                        "</td>
                                        <td class='mw-input'>" .
                                        Xml::openElement(
@@ -308,13 +325,63 @@ class SpecialImport extends SpecialPage {
                                        )
                        );
 
-                       foreach ( $importSources as $prefix ) {
-                               $selected = ( $this->interwiki === $prefix ) ? ' selected="selected"' : '';
-                               $out->addHTML( Xml::option( $prefix, $prefix, $selected ) );
+                       $needSubprojectField = false;
+                       foreach ( $importSources as $key => $value ) {
+                               if ( is_int( $key ) ) {
+                                       $key = $value;
+                               } elseif ( $value !== $key ) {
+                                       $needSubprojectField = true;
+                               }
+
+                               $attribs = array(
+                                       'value' => $key,
+                               );
+                               if ( is_array( $value ) ) {
+                                       $attribs['data-subprojects'] = implode( ' ', $value );
+                               }
+                               if ( $this->interwiki === $key ) {
+                                       $attribs['selected'] = 'selected';
+                               }
+                               $out->addHTML( Html::element( 'option', $attribs, $key ) );
+                       }
+
+                       $out->addHTML(
+                               Xml::closeElement( 'select' )
+                       );
+
+                       if ( $needSubprojectField ) {
+                               $out->addHTML(
+                                       Xml::openElement(
+                                               'select',
+                                               array( 'name' => 'subproject', 'id' => 'subproject' )
+                                       )
+                               );
+
+                               $subprojectsToAdd = array();
+                               foreach ( $importSources as $key => $value ) {
+                                       if ( is_array( $value ) ) {
+                                               $subprojectsToAdd = array_merge( $subprojectsToAdd, $value );
+                                       }
+                               }
+                               $subprojectsToAdd = array_unique( $subprojectsToAdd );
+                               sort( $subprojectsToAdd );
+                               foreach ( $subprojectsToAdd as $subproject ) {
+                                       $out->addHTML( Xml::option( $subproject, $subproject, $this->subproject === $subproject ) );
+                               }
+
+                               $out->addHTML(
+                                       Xml::closeElement( 'select' )
+                               );
                        }
 
                        $out->addHTML(
-                               Xml::closeElement( 'select' ) .
+                                       "</td>
+                               </tr>
+                               <tr>
+                                       <td class='mw-label'>" .
+                                       Xml::label( $this->msg( 'import-interwiki-sourcepage' )->text(), 'frompage' ) .
+                                       "</td>
+                                       <td class='mw-input'>" .
                                        Xml::input( 'frompage', 50, $this->frompage, array( 'id' => 'frompage' ) ) .
                                        "</td>
                                </tr>
@@ -365,7 +432,8 @@ class SpecialImport extends SpecialPage {
                                        Xml::label( $this->msg( 'import-comment' )->text(), 'mw-interwiki-comment' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                       Xml::input( 'log-comment', 50, '',
+                                       Xml::input( 'log-comment', 50,
+                                               ( $this->sourceName == 'interwiki' ? $this->logcomment : '' ),
                                                array( 'id' => 'mw-interwiki-comment', 'type' => 'text' ) ) . ' ' .
                                        "</td>
                                </tr>
index 371469b..37edc0f 100644 (file)
@@ -88,7 +88,7 @@ class LinkSearchPage extends QueryPage {
 
                $request = $this->getRequest();
                $target = $request->getVal( 'target', $par );
-               $namespace = $request->getIntorNull( 'namespace', null );
+               $namespace = $request->getIntOrNull( 'namespace', null );
 
                $protocols_list = array();
                foreach ( $this->getConfig()->get( 'UrlProtocols' ) as $prot ) {
index c1dc158..2667270 100644 (file)
@@ -51,6 +51,7 @@ class ListDuplicatedFilesPage extends QueryPage {
         * However this version should be no more expensive then
         * Special:MostLinked, which seems to get handled fine
         * with however we are doing cached special pages.
+        * @return array
         */
        function getQueryInfo() {
                return array(
index ed7648d..bf17a20 100644 (file)
@@ -48,15 +48,13 @@ class SpecialListFiles extends IncludableSpecialPage {
                        $showAll
                );
 
+               $out = $this->getOutput();
                if ( $this->including() ) {
-                       $html = $pager->getBody();
+                       $out->addParserOutputContent( $pager->getBodyOutput() );
                } else {
-                       $form = $pager->getForm();
-                       $body = $pager->getBody();
-                       $nav = $pager->getNavigationBar();
-                       $html = "$form<br />\n$body<br />\n$nav";
+                       $out->addHTML( $pager->getForm() );
+                       $out->addParserOutputContent( $pager->getFullOutput() );
                }
-               $this->getOutput()->addHTML( $html );
        }
 
        protected function getGroupName() {
@@ -89,7 +87,7 @@ class ImageListPager extends TablePager {
                $this->mIncluding = $including;
                $this->mShowAll = $showAll;
 
-               if ( $userName ) {
+               if ( $userName !== null && $userName !== '' ) {
                        $nt = Title::newFromText( $userName, NS_USER );
                        if ( !is_null( $nt ) ) {
                                $this->mUserName = $nt->getText();
@@ -110,12 +108,12 @@ class ImageListPager extends TablePager {
 
                if ( !$including ) {
                        if ( $context->getRequest()->getText( 'sort', 'img_date' ) == 'img_date' ) {
-                               $this->mDefaultDirection = true;
+                               $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
                        } else {
-                               $this->mDefaultDirection = false;
+                               $this->mDefaultDirection = IndexPager::DIR_ASCENDING;
                        }
                } else {
-                       $this->mDefaultDirection = true;
+                       $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
                }
 
                parent::__construct( $context );
@@ -301,6 +299,7 @@ class ImageListPager extends TablePager {
         * @param int $offset
         * @param int $limit
         * @param bool $asc
+        * @return array
         */
        function reallyDoQuery( $offset, $limit, $asc ) {
                $prevTableName = $this->mTableName;
@@ -520,6 +519,7 @@ class ImageListPager extends TablePager {
                        );
                }
 
+               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
                $fields['user'] = array(
                        'type' => 'text',
                        'name' => 'user',
@@ -528,6 +528,7 @@ class ImageListPager extends TablePager {
                        'default' => $this->mUserName,
                        'size' => '40',
                        'maxlength' => '255',
+                       'cssclass' => 'mw-autocomplete-user', // used by mediawiki.userSuggest
                );
 
                $fields['ilshowall'] = array(
@@ -547,6 +548,7 @@ class ImageListPager extends TablePager {
                $form = new HTMLForm( $fields, $this->getContext() );
 
                $form->setMethod( 'get' );
+               $form->setTitle( $this->getTitle() );
                $form->setId( 'mw-listfiles-form' );
                $form->setWrapperLegendMsg( 'listfiles' );
                $form->setSubmitTextMsg( 'table_pager_limit_submit' );
@@ -557,15 +559,15 @@ class ImageListPager extends TablePager {
        }
 
        function getTableClass() {
-               return 'listfiles ' . parent::getTableClass();
+               return parent::getTableClass() . ' listfiles';
        }
 
        function getNavClass() {
-               return 'listfiles_nav ' . parent::getNavClass();
+               return parent::getNavClass() . ' listfiles_nav';
        }
 
        function getSortHeaderClass() {
-               return 'listfiles_sort ' . parent::getSortHeaderClass();
+               return parent::getSortHeaderClass() . ' listfiles_sort';
        }
 
        function getPagingQueries() {
index b5818ea..8b9a0ee 100644 (file)
@@ -38,10 +38,6 @@ class SpecialListGroupRights extends SpecialPage {
         * @param string|null $par
         */
        public function execute( $par ) {
-               global $wgImplicitGroups;
-               global $wgGroupPermissions, $wgRevokePermissions, $wgAddGroups, $wgRemoveGroups;
-               global $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
-
                $this->setHeaders();
                $this->outputHeader();
 
@@ -58,19 +54,26 @@ class SpecialListGroupRights extends SpecialPage {
                                '</tr>'
                );
 
+               $config = $this->getConfig();
+               $groupPermissions = $config->get( 'GroupPermissions' );
+               $revokePermissions = $config->get( 'RevokePermissions' );
+               $addGroups = $config->get( 'AddGroups' );
+               $removeGroups = $config->get( 'RemoveGroups' );
+               $groupsAddToSelf = $config->get( 'GroupsAddToSelf' );
+               $groupsRemoveFromSelf = $config->get( 'GroupsRemoveFromSelf' );
                $allGroups = array_unique( array_merge(
-                       array_keys( $wgGroupPermissions ),
-                       array_keys( $wgRevokePermissions ),
-                       array_keys( $wgAddGroups ),
-                       array_keys( $wgRemoveGroups ),
-                       array_keys( $wgGroupsAddToSelf ),
-                       array_keys( $wgGroupsRemoveFromSelf )
+                       array_keys( $groupPermissions ),
+                       array_keys( $revokePermissions ),
+                       array_keys( $addGroups ),
+                       array_keys( $removeGroups ),
+                       array_keys( $groupsAddToSelf ),
+                       array_keys( $groupsRemoveFromSelf )
                ) );
                asort( $allGroups );
 
                foreach ( $allGroups as $group ) {
-                       $permissions = isset( $wgGroupPermissions[$group] )
-                               ? $wgGroupPermissions[$group]
+                       $permissions = isset( $groupPermissions[$group] )
+                               ? $groupPermissions[$group]
                                : array();
                        $groupname = ( $group == '*' ) // Replace * with a more descriptive groupname
                                ? 'all'
@@ -100,7 +103,7 @@ class SpecialListGroupRights extends SpecialPage {
                                        SpecialPage::getTitleFor( 'Listusers' ),
                                        $this->msg( 'listgrouprights-members' )->escaped()
                                );
-                       } elseif ( !in_array( $group, $wgImplicitGroups ) ) {
+                       } elseif ( !in_array( $group, $config->get( 'ImplicitGroups' ) ) ) {
                                $grouplink = '<br />' . Linker::linkKnown(
                                        SpecialPage::getTitleFor( 'Listusers' ),
                                        $this->msg( 'listgrouprights-members' )->escaped(),
@@ -112,12 +115,12 @@ class SpecialListGroupRights extends SpecialPage {
                                $grouplink = '';
                        }
 
-                       $revoke = isset( $wgRevokePermissions[$group] ) ? $wgRevokePermissions[$group] : array();
-                       $addgroups = isset( $wgAddGroups[$group] ) ? $wgAddGroups[$group] : array();
-                       $removegroups = isset( $wgRemoveGroups[$group] ) ? $wgRemoveGroups[$group] : array();
-                       $addgroupsSelf = isset( $wgGroupsAddToSelf[$group] ) ? $wgGroupsAddToSelf[$group] : array();
-                       $removegroupsSelf = isset( $wgGroupsRemoveFromSelf[$group] )
-                               ? $wgGroupsRemoveFromSelf[$group]
+                       $revoke = isset( $revokePermissions[$group] ) ? $revokePermissions[$group] : array();
+                       $addgroups = isset( $addGroups[$group] ) ? $addGroups[$group] : array();
+                       $removegroups = isset( $removeGroups[$group] ) ? $removeGroups[$group] : array();
+                       $addgroupsSelf = isset( $groupsAddToSelf[$group] ) ? $groupsAddToSelf[$group] : array();
+                       $removegroupsSelf = isset( $groupsRemoveFromSelf[$group] )
+                               ? $groupsRemoveFromSelf[$group]
                                : array();
 
                        $id = $group == '*' ? false : Sanitizer::escapeId( $group );
@@ -135,10 +138,11 @@ class SpecialListGroupRights extends SpecialPage {
        }
 
        private function outputNamespaceProtectionInfo() {
-               global $wgNamespaceProtection, $wgParser, $wgContLang;
+               global $wgParser, $wgContLang;
                $out = $this->getOutput();
+               $namespaceProtection = $this->getConfig()->get( 'NamespaceProtection' );
 
-               if ( count( $wgNamespaceProtection ) == 0 ) {
+               if ( count( $namespaceProtection ) == 0 ) {
                        return;
                }
 
@@ -161,8 +165,8 @@ class SpecialListGroupRights extends SpecialPage {
                        )
                );
 
-               ksort( $wgNamespaceProtection );
-               foreach ( $wgNamespaceProtection as $namespace => $rights ) {
+               ksort( $namespaceProtection );
+               foreach ( $namespaceProtection as $namespace => $rights ) {
                        if ( !in_array( $namespace, MWNamespace::getValidNamespaces() ) ) {
                                continue;
                        }
@@ -231,65 +235,49 @@ class SpecialListGroupRights extends SpecialPage {
                foreach ( $permissions as $permission => $granted ) {
                        //show as granted only if it isn't revoked to prevent duplicate display of permissions
                        if ( $granted && ( !isset( $revoke[$permission] ) || !$revoke[$permission] ) ) {
-                               $description = $this->msg( 'listgrouprights-right-display',
+                               $r[] = $this->msg( 'listgrouprights-right-display',
                                        User::getRightDescription( $permission ),
                                        '<span class="mw-listgrouprights-right-name">' . $permission . '</span>'
                                )->parse();
-                               $r[] = $description;
                        }
                }
                foreach ( $revoke as $permission => $revoked ) {
                        if ( $revoked ) {
-                               $description = $this->msg( 'listgrouprights-right-revoked',
+                               $r[] = $this->msg( 'listgrouprights-right-revoked',
                                        User::getRightDescription( $permission ),
                                        '<span class="mw-listgrouprights-right-name">' . $permission . '</span>'
                                )->parse();
-                               $r[] = $description;
                        }
                }
 
                sort( $r );
 
                $lang = $this->getLanguage();
+               $allGroups = User::getAllGroups();
 
-               if ( $add === true ) {
-                       $r[] = $this->msg( 'listgrouprights-addgroup-all' )->escaped();
-               } elseif ( is_array( $add ) && count( $add ) ) {
-                       $add = array_values( array_unique( $add ) );
-                       $r[] = $this->msg( 'listgrouprights-addgroup',
-                               $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $add ) ),
-                               count( $add )
-                       )->parse();
-               }
-
-               if ( $remove === true ) {
-                       $r[] = $this->msg( 'listgrouprights-removegroup-all' )->escaped();
-               } elseif ( is_array( $remove ) && count( $remove ) ) {
-                       $remove = array_values( array_unique( $remove ) );
-                       $r[] = $this->msg( 'listgrouprights-removegroup',
-                               $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $remove ) ),
-                               count( $remove )
-                       )->parse();
-               }
-
-               if ( $addSelf === true ) {
-                       $r[] = $this->msg( 'listgrouprights-addgroup-self-all' )->escaped();
-               } elseif ( is_array( $addSelf ) && count( $addSelf ) ) {
-                       $addSelf = array_values( array_unique( $addSelf ) );
-                       $r[] = $this->msg( 'listgrouprights-addgroup-self',
-                               $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $addSelf ) ),
-                               count( $addSelf )
-                       )->parse();
-               }
+               $changeGroups = array(
+                       'addgroup' => $add,
+                       'removegroup' => $remove,
+                       'addgroup-self' => $addSelf,
+                       'removegroup-self' => $removeSelf
+               );
 
-               if ( $removeSelf === true ) {
-                       $r[] = $this->msg( 'listgrouprights-removegroup-self-all' )->parse();
-               } elseif ( is_array( $removeSelf ) && count( $removeSelf ) ) {
-                       $removeSelf = array_values( array_unique( $removeSelf ) );
-                       $r[] = $this->msg( 'listgrouprights-removegroup-self',
-                               $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $removeSelf ) ),
-                               count( $removeSelf )
-                       )->parse();
+               foreach ( $changeGroups as $messageKey => $changeGroup ) {
+                       if ( $changeGroup === true ) {
+                               // For grep: listgrouprights-addgroup-all, listgrouprights-removegroup-all,
+                               // listgrouprights-addgroup-self-all, listgrouprights-removegroup-self-all
+                               $r[] = $this->msg( 'listgrouprights-' . $messageKey . '-all' )->escaped();
+                       } elseif ( is_array( $changeGroup ) ) {
+                               $changeGroup = array_intersect( array_values( array_unique( $changeGroup ) ), $allGroups );
+                               if ( count( $changeGroup ) ) {
+                                       // For grep: listgrouprights-addgroup, listgrouprights-removegroup,
+                                       // listgrouprights-addgroup-self, listgrouprights-removegroup-self
+                                       $r[] = $this->msg( 'listgrouprights-' . $messageKey,
+                                               $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $changeGroup ) ),
+                                               count( $changeGroup )
+                                       )->parse();
+                               }
+                       }
                }
 
                if ( empty( $r ) ) {
index 993285f..dad9074 100644 (file)
@@ -69,7 +69,9 @@ class UsersPager extends AlphabeticPager {
                $this->editsOnly = $request->getBool( 'editsOnly' );
                $this->creationSort = $request->getBool( 'creationSort' );
                $this->including = $including;
-               $this->mDefaultDirection = $request->getBool( 'desc' );
+               $this->mDefaultDirection = $request->getBool( 'desc' )
+                       ? IndexPager::DIR_DESCENDING
+                       : IndexPager::DIR_ASCENDING;
 
                $this->requestedUser = '';
 
@@ -192,10 +194,8 @@ class UsersPager extends AlphabeticPager {
 
                $edits = '';
                if ( !$this->including && $this->getConfig()->get( 'Edititis' ) ) {
-                       // @todo fixme i18n issue: Hardcoded square brackets.
-                       $edits = ' [' .
-                               $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped() .
-                               ']';
+                       $count = $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped();
+                       $edits = $this->msg( 'word-separator' )->escaped() . $this->msg( 'brackets', $count )->escaped();
                }
 
                $created = '';
index dc33801..d3aa6c4 100644 (file)
@@ -47,6 +47,7 @@ class SpecialLog extends SpecialPage {
        public function execute( $par ) {
                $this->setHeaders();
                $this->outputHeader();
+               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
 
                $opts = new FormOptions;
                $opts->add( 'type', '' );
index 3f1850d..60225ea 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup SpecialPage
  */
 class MIMEsearchPage extends QueryPage {
-       protected $major, $minor;
+       protected $major, $minor, $mime;
 
        function __construct( $name = 'MIMEsearch' ) {
                parent::__construct( $name );
@@ -99,37 +99,42 @@ class MIMEsearchPage extends QueryPage {
         * that this report gives results in a logical order). As an aditional
         * note, mysql seems to by default order things by img_name ASC, which
         * is what we ideally want, so everything works out fine anyhow.
+        * @return array
         */
        function getOrderFields() {
                return array();
        }
 
-       function execute( $par ) {
-               $mime = $par ? $par : $this->getRequest()->getText( 'mime' );
-               $mime = trim( $mime );
+       /**
+        * Return HTML to put just before the results.
+        */
+       function getPageHeader() {
 
-               $this->setHeaders();
-               $this->outputHeader();
-               $this->getOutput()->addHTML(
-                       Xml::openElement(
+               return Xml::openElement(
                                'form',
                                array( 'id' => 'specialmimesearch', 'method' => 'get', 'action' => wfScript() )
                        ) .
-                               Xml::openElement( 'fieldset' ) .
-                               Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) .
-                               Xml::element( 'legend', null, $this->msg( 'mimesearch' )->text() ) .
-                               Xml::inputLabel( $this->msg( 'mimetype' )->text(), 'mime', 'mime', 20, $mime ) .
-                               ' ' .
-                               Xml::submitButton( $this->msg( 'ilsubmit' )->text() ) .
-                               Xml::closeElement( 'fieldset' ) .
-                               Xml::closeElement( 'form' )
-               );
+                       Xml::openElement( 'fieldset' ) .
+                       Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) .
+                       Xml::element( 'legend', null, $this->msg( 'mimesearch' )->text() ) .
+                       Xml::inputLabel( $this->msg( 'mimetype' )->text(), 'mime', 'mime', 20, $this->mime ) .
+                       ' ' .
+                       Xml::submitButton( $this->msg( 'ilsubmit' )->text() ) .
+                                       Xml::closeElement( 'fieldset' ) .
+                                       Xml::closeElement( 'form' );
+       }
 
-               list( $this->major, $this->minor ) = File::splitMime( $mime );
+       function execute( $par ) {
+               $this->mime = $par ? $par : $this->getRequest()->getText( 'mime' );
+               $this->mime = trim( $this->mime );
+               list( $this->major, $this->minor ) = File::splitMime( $this->mime );
 
                if ( $this->major == '' || $this->minor == '' || $this->minor == 'unknown' ||
                        !self::isValidType( $this->major )
                ) {
+                       $this->setHeaders();
+                       $this->outputHeader();
+                       $this->getOutput()->addHTML( $this->getPageHeader() );
                        return;
                }
 
@@ -183,7 +188,8 @@ class MIMEsearchPage extends QueryPage {
                        'video',
                        'message',
                        'model',
-                       'multipart'
+                       'multipart',
+                       'chemical'
                );
 
                return in_array( $type, $types );
diff --git a/includes/specials/SpecialMediaStatistics.php b/includes/specials/SpecialMediaStatistics.php
new file mode 100644 (file)
index 0000000..1084482
--- /dev/null
@@ -0,0 +1,329 @@
+<?php
+/**
+ * Implements Special:MediaStatistics
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ * @author Brian Wolff
+ */
+
+/**
+ * @ingroup SpecialPage
+ */
+class MediaStatisticsPage extends QueryPage {
+       protected $totalCount = 0, $totalBytes = 0;
+
+       function __construct( $name = 'MediaStatistics' ) {
+               parent::__construct( $name );
+               // Generally speaking there is only a small number of file types,
+               // so just show all of them.
+               $this->limit = 5000;
+               $this->shownavigation = false;
+       }
+
+       function isExpensive() {
+               return true;
+       }
+
+       /**
+        * Query to do.
+        *
+        * This abuses the query cache table by storing mime types as "titles".
+        *
+        * This will store entries like [[Media:BITMAP;image/jpeg;200;20000]]
+        * where the form is Media type;mime type;count;bytes.
+        *
+        * This relies on the behaviour that when value is tied, the order things
+        * come out of querycache table is the order they went in. Which is hacky.
+        * However, other special pages like Special:Deadendpages and
+        * Special:BrokenRedirects also rely on this.
+        */
+       public function getQueryInfo() {
+               $dbr = wfGetDB( DB_SLAVE );
+               $fakeTitle = $dbr->buildConcat( array(
+                       'img_media_type',
+                       $dbr->addQuotes( ';' ),
+                       'img_major_mime',
+                       $dbr->addQuotes( '/' ),
+                       'img_minor_mime',
+                       $dbr->addQuotes( ';' ),
+                       'COUNT(*)',
+                       $dbr->addQuotes( ';' ),
+                       'SUM( img_size )'
+               ) );
+               return array(
+                       'tables' => array( 'image' ),
+                       'fields' => array(
+                               'title' => $fakeTitle,
+                               'namespace' => NS_MEDIA, /* needs to be something */
+                               'value' => '1'
+                       ),
+                       'options' => array(
+                               'GROUP BY' => array(
+                                       'img_media_type',
+                                       'img_major_mime',
+                                       'img_minor_mime',
+                               )
+                       )
+               );
+       }
+
+       /**
+        * How to sort the results
+        *
+        * It's important that img_media_type come first, otherwise the
+        * tables will be fragmented.
+        * @return Array Fields to sort by
+        */
+       function getOrderFields() {
+               return array( 'img_media_type', 'count(*)', 'img_major_mime', 'img_minor_mime' );
+       }
+
+       /**
+        * Output the results of the query.
+        *
+        * @param $out OutputPage
+        * @param $skin Skin (deprecated presumably)
+        * @param $dbr DatabaseBase
+        * @param $res ResultWrapper Results from query
+        * @param $num integer Number of results
+        * @param $offset integer Paging offset (Should always be 0 in our case)
+        */
+       protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
+               $prevMediaType = null;
+               foreach ( $res as $row ) {
+                       list( $mediaType, $mime, $totalCount, $totalBytes ) = $this->splitFakeTitle( $row->title );
+                       if ( $prevMediaType !== $mediaType ) {
+                               if ( $prevMediaType !== null ) {
+                                       // We're not at beginning, so we have to
+                                       // close the previous table.
+                                       $this->outputTableEnd();
+                               }
+                               $this->outputMediaType( $mediaType );
+                               $this->outputTableStart( $mediaType );
+                               $prevMediaType = $mediaType;
+                       }
+                       $this->outputTableRow( $mime, intval( $totalCount ), intval( $totalBytes ) );
+               }
+               if ( $prevMediaType !== null ) {
+                       $this->outputTableEnd();
+               }
+       }
+
+       /**
+        * Output closing </table>
+        */
+       protected function outputTableEnd() {
+               $this->getOutput()->addHtml( Html::closeElement( 'table' ) );
+       }
+
+       /**
+        * Output a row of the stats table
+        *
+        * @param $mime String mime type (e.g. image/jpeg)
+        * @param $count integer Number of images of this type
+        * @param $totalBytes integer Total space for images of this type
+        */
+       protected function outputTableRow( $mime, $count, $bytes ) {
+               $mimeSearch = SpecialPage::getTitleFor( 'MIMEsearch', $mime );
+               $row = Html::rawElement(
+                       'td',
+                       array(),
+                       Linker::link( $mimeSearch, htmlspecialchars( $mime ) )
+               );
+               $row .= Html::element(
+                       'td',
+                       array(),
+                       $this->getExtensionList( $mime )
+               );
+               $row .= Html::rawElement(
+                       'td',
+                       // Make sure js sorts it in numeric order
+                       array( 'data-sort-value' => $count ),
+                       $this->msg( 'mediastatistics-nfiles' )
+                               ->numParams( $count )
+                               /** @todo Check to be sure this really should have number formatting */
+                               ->numParams( $this->makePercentPretty( $count / $this->totalCount ) )
+                               ->parse()
+               );
+               $row .= Html::rawElement(
+                       'td',
+                       // Make sure js sorts it in numeric order
+                       array( 'data-sort-value' =>  $bytes ),
+                       $this->msg( 'mediastatistics-nbytes' )
+                               ->numParams( $bytes )
+                               ->sizeParams( $bytes )
+                               /** @todo Check to be sure this really should have number formatting */
+                               ->numParams( $this->makePercentPretty( $bytes / $this->totalBytes ) )
+                               ->parse()
+               );
+
+               $this->getOutput()->addHTML( Html::rawElement( 'tr', array(), $row ) );
+       }
+
+       /**
+        * @param float $decimal A decimal percentage (ie for 12.3%, this would be 0.123)
+        * @return String The percentage formatted so that 3 significant digits are shown.
+        */
+       protected function makePercentPretty( $decimal ) {
+               $decimal *= 100;
+               // Always show three useful digits
+               if ( $decimal == 0 ) {
+                       return '0';
+               }
+               if ( $decimal >= 100 ) {
+                       return '100';
+               }
+               $percent = sprintf( "%." . max( 0, 2 - floor( log10( $decimal ) ) ) . "f", $decimal );
+               // Then remove any trailing 0's
+               return preg_replace( '/\.?0*$/', '', $percent );
+       }
+
+       /**
+        * Given a mime type, return a comma separated list of allowed extensions.
+        *
+        * @param $mime String mime type
+        * @return String Comma separated list of allowed extensions (e.g. ".ogg, .oga")
+        */
+       private function getExtensionList( $mime ) {
+               $exts = MimeMagic::singleton()->getExtensionsForType( $mime );
+               if ( $exts === null ) {
+                       return '';
+               }
+               $extArray = explode( ' ', $exts );
+               $extArray = array_unique( $extArray );
+               foreach ( $extArray as &$ext ) {
+                       $ext = '.' . $ext;
+               }
+
+               return $this->getLanguage()->commaList( $extArray );
+       }
+
+       /**
+        * Output the start of the table
+        *
+        * Including opening <table>, and first <tr> with column headers.
+        */
+       protected function outputTableStart( $mediaType ) {
+               $this->getOutput()->addHTML(
+                       Html::openElement(
+                               'table',
+                               array( 'class' => array(
+                                       'mw-mediastats-table',
+                                       'mw-mediastats-table-' . strtolower( $mediaType ),
+                                       'sortable',
+                                       'wikitable'
+                               ))
+                       )
+               );
+               $this->getOutput()->addHTML( $this->getTableHeaderRow() );
+       }
+
+       /**
+        * Get (not output) the header row for the table
+        *
+        * @return String the header row of the able
+        */
+       protected function getTableHeaderRow() {
+               $headers = array( 'mimetype', 'extensions', 'count', 'totalbytes' );
+               $ths = '';
+               foreach ( $headers as $header ) {
+                       $ths .= Html::rawElement(
+                               'th',
+                               array(),
+                               // for grep:
+                               // mediastatistics-table-mimetype, mediastatistics-table-extensions
+                               // tatistics-table-count, mediastatistics-table-totalbytes
+                               $this->msg( 'mediastatistics-table-' . $header )->parse()
+                       );
+               }
+               return Html::rawElement( 'tr', array(), $ths );
+       }
+
+       /**
+        * Output a header for a new media type section
+        *
+        * @param $mediaType string A media type (e.g. from the MEDIATYPE_xxx constants)
+        */
+       protected function outputMediaType( $mediaType ) {
+               $this->getOutput()->addHTML(
+                       Html::element(
+                               'h2',
+                               array( 'class' => array(
+                                       'mw-mediastats-mediatype',
+                                       'mw-mediastats-mediatype-' . strtolower( $mediaType )
+                               )),
+                               // for grep
+                               // mediastatistics-header-unknown, mediastatistics-header-bitmap,
+                               // mediastatistics-header-drawing, mediastatistics-header-audio,
+                               // mediastatistics-header-video, mediastatistics-header-multimedia,
+                               // mediastatistics-header-office, mediastatistics-header-text,
+                               // mediastatistics-header-executable, mediastatistics-header-archive,
+                               $this->msg( 'mediastatistics-header-' . strtolower( $mediaType ) )->text()
+                       )
+               );
+               /** @todo Possibly could add a message here explaining what the different types are.
+                *    not sure if it is needed though.
+                */
+       }
+
+       /**
+        * parse the fake title format that this special page abuses querycache with.
+        *
+        * @param $fakeTitle String A string formatted as <media type>;<mime type>;<count>;<bytes>
+        * @return Array The constituant parts of $fakeTitle
+        */
+       private function splitFakeTitle( $fakeTitle ) {
+               return explode( ';', $fakeTitle, 4 );
+       }
+
+       /**
+        * What group to put the page in
+        * @return string
+        */
+       protected function getGroupName() {
+               return 'media';
+       }
+
+       /**
+        * This method isn't used, since we override outputResults, but
+        * we need to implement since abstract in parent class.
+        *
+        * @param $skin Skin
+        * @param $result stdObject Result row
+        */
+       public function formatResult( $skin, $result ) {
+               throw new MWException( "unimplemented" );
+       }
+
+       /**
+        * Initialize total values so we can figure out percentages later.
+        *
+        * @param $dbr DatabaseBase
+        * @param $res ResultWrapper
+        */
+       public function preprocessResults( $dbr, $res ) {
+               $this->totalCount = $this->totalBytes = 0;
+               foreach ( $res as $row ) {
+                       list( , , $count, $bytes ) = $this->splitFakeTitle( $row->title );
+                       $this->totalCount += $count;
+                       $this->totalBytes += $bytes;
+               }
+               $res->seek( 0 );
+       }
+}
index 6efc12b..43f5a1b 100644 (file)
@@ -388,11 +388,11 @@ class SpecialMergeHistory extends SpecialPage {
                }
                # Check that there are not too many revisions to move
                $limit = 5000; // avoid too much slave lag
-               $count = $dbw->select( 'revision', '1',
+               $count = $dbw->selectRowCount( 'revision', '1',
                        array( 'rev_page' => $this->mTargetID, $timewhere ),
                        __METHOD__,
                        array( 'LIMIT' => $limit + 1 )
-               )->numRows();
+               );
                if ( $count > $limit ) {
                        $this->getOutput()->addWikiMsg( 'mergehistory-fail-toobig' );
 
@@ -476,8 +476,9 @@ class SpecialMergeHistory extends SpecialPage {
                );
 
                # @todo message should use redirect=no
-               $this->getOutput()->addWikiMsg( 'mergehistory-success',
-                       $targetTitle->getPrefixedText(), $destTitle->getPrefixedText(), $count );
+               $this->getOutput()->addWikiText( $this->msg( 'mergehistory-success',
+                       $targetTitle->getPrefixedText(), $destTitle->getPrefixedText() )->numParams(
+                       $count )->text() );
 
                wfRunHooks( 'ArticleMergeComplete', array( $targetTitle, $destTitle ) );
 
@@ -496,7 +497,7 @@ class MergeHistoryPager extends ReverseChronologicalPager {
        /** @var array */
        public $mConds;
 
-       function __construct( $form, $conds = array(), $source, $dest ) {
+       function __construct( $form, $conds, $source, $dest ) {
                $this->mForm = $form;
                $this->mConds = $conds;
                $this->title = $source;
@@ -550,7 +551,7 @@ class MergeHistoryPager extends ReverseChronologicalPager {
        function getQueryInfo() {
                $conds = $this->mConds;
                $conds['rev_page'] = $this->articleID;
-               $conds[] = "rev_timestamp < {$this->maxTimestamp}";
+               $conds[] = "rev_timestamp < " . $this->mDb->addQuotes( $this->maxTimestamp );
 
                return array(
                        'tables' => array( 'revision', 'page', 'user' ),
index aff5947..b9d1872 100644 (file)
@@ -140,12 +140,11 @@ class NewFilesPager extends ReverseChronologicalPager {
                        // Note that null for mode is taken to mean use default.
                        $mode = $this->getRequest()->getVal( 'gallerymode', null );
                        try {
-                               $this->gallery = ImageGalleryBase::factory( $mode );
+                               $this->gallery = ImageGalleryBase::factory( $mode, $this->getContext() );
                        } catch ( MWException $e ) {
                                // User specified something invalid, fallback to default.
-                               $this->gallery = ImageGalleryBase::factory();
+                               $this->gallery = ImageGalleryBase::factory( false, $this->getContext() );
                        }
-                       $this->gallery->setContext( $this->getContext() );
                }
 
                return '';
@@ -202,7 +201,10 @@ class NewFilesPager extends ReverseChronologicalPager {
                $context = new DerivativeContext( $this->getContext() );
                $context->setTitle( $this->getTitle() ); // Remove subpage
                $form = new HTMLForm( $fields, $context );
+
                $form->setSubmitTextMsg( 'ilsubmit' );
+               $form->setSubmitProgressive();
+
                $form->setMethod( 'get' );
                $form->setWrapperLegendMsg( 'newimages-legend' );
 
index fbb2d73..3a74e7a 100644 (file)
@@ -117,7 +117,6 @@ class SpecialNewpages extends IncludableSpecialPage {
         * Show a form for filtering namespace and username
         *
         * @param string $par
-        * @return string
         */
        public function execute( $par ) {
                $out = $this->getOutput();
@@ -222,6 +221,8 @@ class SpecialNewpages extends IncludableSpecialPage {
                        list( $tagFilterLabel, $tagFilterSelector ) = $tagFilter;
                }
 
+               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
+
                $form = Xml::openElement( 'form', array( 'action' => wfScript() ) ) .
                        Html::hidden( 'title', $this->getPageTitle()->getPrefixedDBkey() ) .
                        Xml::fieldset( $this->msg( 'newpages' )->text() ) .
@@ -263,7 +264,10 @@ class SpecialNewpages extends IncludableSpecialPage {
                                        Xml::label( $this->msg( 'newpages-username' )->text(), 'mw-np-username' ) .
                                        '</td>
                                <td class="mw-input">' .
-                                       Xml::input( 'username', 30, $userText, array( 'id' => 'mw-np-username' ) ) .
+                                       Xml::input( 'username', 30, $userText, array(
+                                               'id' => 'mw-np-username',
+                                               'class' => 'mw-autocomplete-user', // used by mediawiki.userSuggest
+                                       ) ) .
                                        '</td>
                        </tr>' .
                        '<tr> <td></td>
index 6e04762..2acf23c 100644 (file)
@@ -76,6 +76,7 @@ class SpecialPageLanguage extends FormSpecialPage {
 
                $page['language'] = array(
                        'id' => 'mw-pl-languageselector',
+                       'cssclass' => 'mw-languageselector',
                        'type' => 'select',
                        'options' => $options,
                        'label-message' => 'pagelang-language',
@@ -92,11 +93,13 @@ class SpecialPageLanguage extends FormSpecialPage {
        public function alterForm( HTMLForm $form ) {
                $form->setDisplayFormat( 'vform' );
                $form->setWrapperLegend( false );
+               wfRunHooks( 'LanguageSelector', array( $this->getOutput(), 'mw-languageselector' ) );
        }
 
        /**
         *
         * @param array $data
+        * @return bool
         */
        public function onSubmit( array $data ) {
                $title = Title::newFromText( $data['pagename'] );
index 4cfd445..cea00fa 100644 (file)
@@ -73,6 +73,7 @@ class SpecialPreferences extends SpecialPage {
                $htmlForm = new HTMLForm( array(), $context, 'prefs-restore' );
 
                $htmlForm->setSubmitTextMsg( 'restoreprefs' );
+               $htmlForm->setSubmitDestructive();
                $htmlForm->setSubmitCallback( array( $this, 'submitReset' ) );
                $htmlForm->suppressReset();
 
index b64b029..0ba7385 100644 (file)
@@ -79,11 +79,7 @@ class SpecialProtectedpages extends SpecialPage {
                ) );
 
                if ( $pager->getNumRows() ) {
-                       $this->getOutput()->addHTML(
-                               $pager->getNavigationBar() .
-                                       $pager->getBody() .
-                                       $pager->getNavigationBar()
-                       );
+                       $this->getOutput()->addParserOutputContent( $pager->getFullOutput() );
                } else {
                        $this->getOutput()->addWikiMsg( 'protectedpagesempty' );
                }
@@ -558,7 +554,7 @@ class ProtectedPagesPager extends TablePager {
        }
 
        public function getTableClass() {
-               return 'TablePager mw-protectedpages';
+               return parent::getTableClass() . ' mw-protectedpages';
        }
 
        function getIndexField() {
index 28a1bc5..570ab3b 100644 (file)
@@ -46,7 +46,7 @@
  *
  * @ingroup SpecialPage
  */
-class SpecialRandomInCategory extends SpecialPage {
+class SpecialRandomInCategory extends FormSpecialPage {
        protected $extra = array(); // Extra SQL statements
        protected $category = false; // Title object of category
        protected $maxOffset = 30; // Max amount to fudge randomness by.
@@ -67,10 +67,35 @@ class SpecialRandomInCategory extends SpecialPage {
                $this->minTimestamp = null;
        }
 
-       public function execute( $par ) {
+       protected function getFormFields() {
+               $form = array(
+                       'category' => array(
+                               'type' => 'text',
+                               'label-message' => 'randomincategory-category',
+                               'required' => true,
+                       )
+               );
+
+               return $form;
+       }
+
+       public function requiresWrite() {
+               return false;
+       }
+
+       public function requiresUnblock() {
+               return false;
+       }
+
+       protected function setParameter( $par ) {
+               // if subpage present, fake form submission
+               $this->onSubmit( array( 'category' => $par ) );
+       }
+
+       public function onSubmit( array $data ) {
                $cat = false;
 
-               $categoryStr = $this->getRequest()->getText( 'category', $par );
+               $categoryStr = $data['category'];
 
                if ( $categoryStr ) {
                        $cat = Title::newFromText( $categoryStr, NS_CATEGORY );
@@ -86,41 +111,25 @@ class SpecialRandomInCategory extends SpecialPage {
                }
 
                if ( !$this->category && $categoryStr ) {
-                       $this->setHeaders();
-                       $this->getOutput()->addWikiMsg( 'randomincategory-invalidcategory',
+                       $msg = $this->msg( 'randomincategory-invalidcategory',
                                wfEscapeWikiText( $categoryStr ) );
 
-                       return;
+                       return Status::newFatal( $msg );
+
                } elseif ( !$this->category ) {
-                       $this->setHeaders();
-                       $input = Html::input( 'category' );
-                       $submitText = $this->msg( 'randomincategory-selectcategory-submit' )->text();
-                       $submit = Html::input( '', $submitText, 'submit' );
-
-                       $msg = $this->msg( 'randomincategory-selectcategory' );
-                       $form = Html::rawElement( 'form', array( 'action' => wfScript() ),
-                               Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) .
-                               $msg->rawParams( $input, $submit )->parse()
-                       );
-                       $this->getOutput()->addHtml( $form );
-
-                       return;
+                       return; // no data sent
                }
 
                $title = $this->getRandomTitle();
 
                if ( is_null( $title ) ) {
-                       $this->setHeaders();
-                       $this->getOutput()->addWikiMsg( 'randomincategory-nopages',
+                       $msg = $this->msg( 'randomincategory-nopages',
                                $this->category->getText() );
 
-                       return;
+                       return Status::newFatal( $msg );
                }
 
-               $query = $this->getRequest()->getValues();
-               unset( $query['title'] );
-               unset( $query['category'] );
-               $this->getOutput()->redirect( $title->getFullURL( $query ) );
+               $this->getOutput()->redirect( $title->getFullURL() );
        }
 
        /**
index 5938f01..e6d8f1c 100644 (file)
@@ -595,9 +595,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
 
                # Look up
-               $c = new Categoryfinder;
-               $c->seed( $articles, $cats, $opts['categories_any'] ? 'OR' : 'AND' );
-               $match = $c->run();
+               $catFind = new CategoryFinder;
+               $catFind->seed( $articles, $cats, $opts['categories_any'] ? 'OR' : 'AND' );
+               $match = $catFind->run();
 
                # Filter
                $newrows = array();
@@ -732,7 +732,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                        $link = $this->makeOptionsLink( $linkMessage->text(),
                                array( $key => 1 - $options[$key] ), $nondefaults );
-                       $links[] = $this->msg( $msg )->rawParams( $link )->escaped();
+                       $links[] = "<span class=\"$msg rcshowhideoption\">" . $this->msg( $msg )->rawParams( $link )->escaped() . '</span>';
                }
 
                // show from this onward link
@@ -740,13 +740,16 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $now = $lang->userTimeAndDate( $timestamp, $user );
                $timenow = $lang->userTime( $timestamp, $user );
                $datenow = $lang->userDate( $timestamp, $user );
-               $rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )
-                       ->parse();
-               $rclistfrom = $this->makeOptionsLink(
+               $pipedLinks = '<span class="rcshowhide">' . $lang->pipeList( $links ) . '</span>';
+
+               $rclinks = '<span class="rclinks">' . $this->msg( 'rclinks' )->rawParams( $cl, $dl, $pipedLinks )
+                       ->parse() . '</span>';
+
+               $rclistfrom = '<span class="rclistfrom">' . $this->makeOptionsLink(
                        $this->msg( 'rclistfrom' )->rawParams( $now, $timenow, $datenow )->parse(),
                        array( 'from' => $timestamp ),
                        $nondefaults
-               );
+               ) . '</span>';
 
                return "{$note}$rclinks<br />$rclistfrom";
        }
index 6c5401a..4add742 100644 (file)
@@ -77,6 +77,7 @@ class SpecialResetTokens extends FormSpecialPage {
        /**
         * Display appropriate message if there's nothing to do.
         * The submit button is also suppressed in this case (see alterForm()).
+        * @return array
         */
        protected function getFormFields() {
                $user = $this->getUser();
index 54f224a..d4a06eb 100644 (file)
@@ -61,7 +61,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
 
                $squery = $params;
                unset( $squery['signature'] );
-               $cSig = self::getQuerySignature( $squery ); // correct signature
+               $cSig = self::getQuerySignature( $squery, $this->getConfig()->get( 'SecretKey' ) ); // correct signature
                $rSig = $params['signature']; // provided signature
 
                $verified = is_string( $rSig ) && hash_equals( $cSig, $rSig );
@@ -102,12 +102,11 @@ class SpecialRunJobs extends UnlistedSpecialPage {
 
        /**
         * @param array $query
+        * @param string $secretKey
         * @return string
         */
-       public static function getQuerySignature( array $query ) {
-               global $wgSecretKey;
-
+       public static function getQuerySignature( array $query, $secretKey ) {
                ksort( $query ); // stable order
-               return hash_hmac( 'sha1', wfArrayToCgi( $query ), $wgSecretKey );
+               return hash_hmac( 'sha1', wfArrayToCgi( $query ), $secretKey );
        }
 }
index 59d65bc..c922fbd 100644 (file)
@@ -197,14 +197,6 @@ class SpecialSearch extends SpecialPage {
                $title = Title::newFromText( $term );
                if ( !is_null( $title ) ) {
                        wfRunHooks( 'SpecialSearchNogomatch', array( &$title ) );
-                       wfDebugLog( 'nogomatch', $title->getFullText(), 'private' );
-
-                       # If the feature is enabled, go straight to the edit page
-                       if ( $this->getConfig()->get( 'GoToEdit' ) ) {
-                               $this->getOutput()->redirect( $title->getFullURL( array( 'action' => 'edit' ) ) );
-
-                               return;
-                       }
                }
                $this->showResults( $term );
        }
@@ -367,10 +359,8 @@ class SpecialSearch extends SpecialPage {
                                        $this->limit + $this->offset >= $totalRes
                                );
                        }
-                       wfRunHooks( 'SpecialSearchResults', array( $term, &$titleMatches, &$textMatches ) );
-               } else {
-                       wfRunHooks( 'SpecialSearchNoResults', array( $term ) );
                }
+               wfRunHooks( 'SpecialSearchResults', array( $term, &$titleMatches, &$textMatches ) );
 
                $out->parserOptions()->setEditSection( false );
                if ( $titleMatches ) {
@@ -593,7 +583,7 @@ class SpecialSearch extends SpecialPage {
 
                $title = $result->getTitle();
 
-               $titleSnippet = $result->getTitleSnippet( $terms );
+               $titleSnippet = $result->getTitleSnippet();
 
                if ( $titleSnippet == '' ) {
                        $titleSnippet = null;
@@ -625,9 +615,9 @@ class SpecialSearch extends SpecialPage {
 
                // format redirects / relevant sections
                $redirectTitle = $result->getRedirectTitle();
-               $redirectText = $result->getRedirectSnippet( $terms );
+               $redirectText = $result->getRedirectSnippet();
                $sectionTitle = $result->getSectionTitle();
-               $sectionText = $result->getSectionSnippet( $terms );
+               $sectionText = $result->getSectionSnippet();
                $redirect = '';
 
                if ( !is_null( $redirectTitle ) ) {
@@ -675,26 +665,6 @@ class SpecialSearch extends SpecialPage {
 
                $date = $lang->userTimeAndDate( $timestamp, $this->getUser() );
 
-               // link to related articles if supported
-               $related = '';
-               if ( $result->hasRelated() ) {
-                       $stParams = array_merge(
-                               $this->powerSearchOptions(),
-                               array(
-                                       'search' => $this->msg( 'searchrelated' )->inContentLanguage()->text() .
-                                               ':' . $title->getPrefixedText(),
-                                       'fulltext' => $this->msg( 'search' )->text()
-                               )
-                       );
-
-                       $related = ' -- ' . Linker::linkKnown(
-                               $this->getPageTitle(),
-                               $this->msg( 'search-relatedarticle' )->text(),
-                               array(),
-                               $stParams
-                       );
-               }
-
                $fileMatch = '';
                // Include a thumbnail for media files...
                if ( $title->getNamespace() == NS_FILE ) {
@@ -720,7 +690,7 @@ class SpecialSearch extends SpecialPage {
                                                '<td style="vertical-align: top;">' .
                                                "{$link} {$redirect} {$section} {$fileMatch}" .
                                                $extract .
-                                               "<div class='mw-search-result-data'>{$desc} - {$date}{$related}</div>" .
+                                               "<div class='mw-search-result-data'>{$desc} - {$date}</div>" .
                                                '</td>' .
                                                '</tr>' .
                                                '</table>' .
@@ -740,7 +710,7 @@ class SpecialSearch extends SpecialPage {
                ) ) ) {
                        $html = "<li><div class='mw-search-result-heading'>" .
                                "{$link} {$redirect} {$section} {$fileMatch}</div> {$extract}\n" .
-                               "<div class='mw-search-result-data'>{$size} - {$date}{$related}</div>" .
+                               "<div class='mw-search-result-data'>{$size} - {$date}</div>" .
                                "</li>\n";
                }
 
@@ -1090,16 +1060,15 @@ class SpecialSearch extends SpecialPage {
                        'class' => 'mw-ui-input mw-ui-input-inline',
                ) ) . "\n";
                $out .= Html::hidden( 'fulltext', 'Search' ) . "\n";
-               $out .= Xml::submitButton(
+               $out .= Html::submitButton(
                        $this->msg( 'searchbutton' )->text(),
-                       array( 'class' => array( 'mw-ui-button', 'mw-ui-progressive' ) )
+                       array(), array( 'mw-ui-progressive' )
                ) . "\n";
 
                // Results-info
                if ( $totalNum > 0 && $this->offset < $totalNum ) {
-                       $top = $this->msg( 'showingresultsheader' )
+                       $top = $this->msg( 'search-showingresults' )
                                ->numParams( $this->offset + 1, $this->offset + $resultsShown, $totalNum )
-                               ->params( wfEscapeWikiText( $term ) )
                                ->numParams( $resultsShown )
                                ->parse();
                        $out .= Xml::tags( 'div', array( 'class' => 'results-info' ), $top ) .
index 67c96a7..f0e360e 100644 (file)
@@ -151,7 +151,7 @@ class SpecialStatistics extends SpecialPage {
                                        $this->getLanguage()->formatNum( $this->total ),
                                        array( 'class' => 'mw-statistics-pages' ),
                                        'statistics-pages-desc' ) .
-                               $this->formatRow( Linker::linkKnown( SpecialPage::getTitleFor( 'Listfiles' ),
+                               $this->formatRow( Linker::linkKnown( SpecialPage::getTitleFor( 'MediaStatistics' ),
                                        $this->msg( 'statistics-files' )->parse() ),
                                        $this->getLanguage()->formatNum( $this->images ),
                                        array( 'class' => 'mw-statistics-files' ) );
index 5e5588c..552031f 100644 (file)
@@ -41,7 +41,7 @@ class SpecialTrackingCategories extends SpecialPage {
                $this->outputHeader();
                $this->getOutput()->allowClickjacking();
                $this->getOutput()->addHTML(
-                       Html::openElement( 'table', array( 'class' => 'mw-datatable TablePager',
+                       Html::openElement( 'table', array( 'class' => 'mw-datatable',
                                'id' => 'mw-trackingcategories-table' ) ) . "\n" .
                        "<thead><tr>
                        <th>" .
index 96e4dbf..244b889 100644 (file)
@@ -63,8 +63,10 @@ class SpecialUnblock extends SpecialPage {
 
                if ( $form->show() ) {
                        switch ( $this->type ) {
-                               case Block::TYPE_USER:
                                case Block::TYPE_IP:
+                                       $out->addWikiMsg( 'unblocked-ip', wfEscapeWikiText( $this->target ) );
+                                       break;
+                               case Block::TYPE_USER:
                                        $out->addWikiMsg( 'unblocked', wfEscapeWikiText( $this->target ) );
                                        break;
                                case Block::TYPE_RANGE:
@@ -111,8 +113,14 @@ class SpecialUnblock extends SpecialPage {
                                $fields['Target']['default'] = $target;
                                $fields['Target']['type'] = 'hidden';
                                switch ( $type ) {
-                                       case Block::TYPE_USER:
                                        case Block::TYPE_IP:
+                                               $fields['Name']['default'] = Linker::linkKnown(
+                                                       SpecialPage::getTitleFor( 'Contributions', $target->getName() ),
+                                                       $target->getName()
+                                               );
+                                               $fields['Name']['raw'] = true;
+                                               break;
+                                       case Block::TYPE_USER:
                                                $fields['Name']['default'] = Linker::link(
                                                        $target->getUserPage(),
                                                        $target->getName()
index 8acf8a2..c3e871b 100644 (file)
@@ -99,7 +99,7 @@ class PageArchive {
         * @return bool|ResultWrapper
         */
        protected static function listPages( $dbr, $condition ) {
-               return $dbr->resultObject( $dbr->select(
+               return $dbr->select(
                        array( 'archive' ),
                        array(
                                'ar_namespace',
@@ -113,7 +113,7 @@ class PageArchive {
                                'ORDER BY' => array( 'ar_namespace', 'ar_title' ),
                                'LIMIT' => 100,
                        )
-               ) );
+               );
        }
 
        /**
@@ -152,15 +152,13 @@ class PageArchive {
                        $options
                );
 
-               $res = $dbr->select( $tables,
+               return $dbr->select( $tables,
                        $fields,
                        $conds,
                        __METHOD__,
                        $options,
                        $join_conds
                );
-
-               return $dbr->resultObject( $res );
        }
 
        /**
@@ -177,15 +175,13 @@ class PageArchive {
                }
 
                $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select(
+               return $dbr->select(
                        'filearchive',
                        ArchivedFile::selectFields(),
                        array( 'fa_name' => $this->title->getDBkey() ),
                        __METHOD__,
                        array( 'ORDER BY' => 'fa_timestamp DESC' )
                );
-
-               return $dbr->resultObject( $res );
        }
 
        /**
@@ -532,9 +528,8 @@ class PageArchive {
                        __METHOD__,
                        /* options */ array( 'ORDER BY' => 'ar_timestamp' )
                );
-               $ret = $dbw->resultObject( $result );
-               $rev_count = $dbw->numRows( $result );
 
+               $rev_count = $result->numRows();
                if ( !$rev_count ) {
                        wfDebug( __METHOD__ . ": no revisions to restore\n" );
 
@@ -544,10 +539,10 @@ class PageArchive {
                        return $status;
                }
 
-               $ret->seek( $rev_count - 1 ); // move to last
-               $row = $ret->fetchObject(); // get newest archived rev
+               $result->seek( $rev_count - 1 ); // move to last
+               $row = $result->fetchObject(); // get newest archived rev
                $oldPageId = (int)$row->ar_page_id; // pass this to ArticleUndelete hook
-               $ret->seek( 0 ); // move back
+               $result->seek( 0 ); // move back
 
                // grab the content to check consistency with global state before restoring the page.
                $revision = Revision::newFromArchiveRow( $row,
@@ -589,7 +584,7 @@ class PageArchive {
                $revision = null;
                $restored = 0;
 
-               foreach ( $ret as $row ) {
+               foreach ( $result as $row ) {
                        // Check for key dupes due to shitty archive integrity.
                        if ( $row->ar_rev_id ) {
                                $exists = $dbw->selectField( 'revision', '1',
@@ -720,10 +715,10 @@ class SpecialUndelete extends SpecialPage {
                $this->mUnsuppress = $request->getVal( 'wpUnsuppress' ) && $user->isAllowed( 'suppressrevision' );
                $this->mToken = $request->getVal( 'token' );
 
-               if ( $user->isAllowed( 'undelete' ) && !$user->isBlocked() ) {
+               if ( $this->isAllowed( 'undelete' ) && !$user->isBlocked() ) {
                        $this->mAllowed = true; // user can restore
                        $this->mCanView = true; // user can view content
-               } elseif ( $user->isAllowed( 'deletedtext' ) ) {
+               } elseif ( $this->isAllowed( 'deletedtext' ) ) {
                        $this->mAllowed = false; // user cannot restore
                        $this->mCanView = true; // user can view content
                        $this->mRestore = false;
@@ -752,14 +747,35 @@ class SpecialUndelete extends SpecialPage {
                }
        }
 
+       /**
+        * Checks whether a user is allowed the permission for the
+        * specific title if one is set.
+        *
+        * @param string $permission
+        * @param User $user
+        * @return bool
+        */
+       private function isAllowed( $permission, User $user = null ) {
+               $user = $user ? : $this->getUser();
+               if ( $this->mTargetObj !== null ) {
+                       return $this->mTargetObj->userCan( $permission, $user );
+               } else {
+                       return $user->isAllowed( $permission );
+               }
+       }
+
+       function userCanExecute( User $user ) {
+               return $this->isAllowed( $this->mRestriction, $user );
+       }
+
        function execute( $par ) {
-               $this->checkPermissions();
                $user = $this->getUser();
 
                $this->setHeaders();
                $this->outputHeader();
 
                $this->loadRequest( $par );
+               $this->checkPermissions(); // Needs to be after mTargetObj is set
 
                $out = $this->getOutput();
 
@@ -1458,12 +1474,14 @@ class SpecialUndelete extends SpecialPage {
                $ts = wfTimestamp( TS_MW, $row->fa_timestamp );
                $user = $this->getUser();
 
-               if ( $this->mAllowed && $row->fa_storage_key ) {
-                       $checkBox = Xml::check( 'fileid' . $row->fa_id );
+               $checkBox = '';
+               if ( $this->mCanView && $row->fa_storage_key ) {
+                       if ( $this->mAllowed ) {
+                               $checkBox = Xml::check( 'fileid' . $row->fa_id );
+                       }
                        $key = urlencode( $row->fa_storage_key );
                        $pageLink = $this->getFileLink( $file, $this->getPageTitle(), $ts, $key );
                } else {
-                       $checkBox = '';
                        $pageLink = $this->getLanguage()->userTimeAndDate( $ts, $user );
                }
                $userLink = $this->getFileUser( $file );
@@ -1475,8 +1493,8 @@ class SpecialUndelete extends SpecialPage {
                $comment = $this->getFileComment( $file );
 
                // Add show/hide deletion links if available
-               $canHide = $user->isAllowed( 'deleterevision' );
-               if ( $canHide || ( $file->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
+               $canHide = $this->isAllowed( 'deleterevision' );
+               if ( $canHide || ( $file->getVisibility() && $this->isAllowed( 'deletedhistory' ) ) ) {
                        if ( !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
                                // Revision was hidden from sysops
                                $revdlink = Linker::revDeleteLinkDisabled( $canHide );
index 4fd7cd4..51dd7bd 100644 (file)
@@ -485,6 +485,7 @@ class SpecialUpload extends SpecialPage {
         * @param string $copyStatus
         * @param string $source
         * @return string
+        * @todo Use Config obj instead of globals
         */
        public static function getInitialPageText( $comment = '', $license = '',
                $copyStatus = '', $source = ''
@@ -568,8 +569,6 @@ class SpecialUpload extends SpecialPage {
         * @throws MWException
         */
        protected function processVerificationError( $details ) {
-               global $wgFileExtensions;
-
                switch ( $details['status'] ) {
 
                        /** Statuses that only require name changing **/
@@ -604,7 +603,7 @@ class SpecialUpload extends SpecialPage {
                                } else {
                                        $msg->params( $details['finalExt'] );
                                }
-                               $extensions = array_unique( $wgFileExtensions );
+                               $extensions = array_unique( $this->getConfig()->get( 'FileExtensions' ) );
                                $msg->params( $this->getLanguage()->commaList( $extensions ),
                                        count( $extensions ) );
 
@@ -725,8 +724,7 @@ class SpecialUpload extends SpecialPage {
                        return '';
                }
 
-               $gallery = ImageGalleryBase::factory();
-               $gallery->setContext( $this->getContext() );
+               $gallery = ImageGalleryBase::factory( false, $this->getContext() );
                $gallery->setShowBytes( false );
                foreach ( $dupes as $file ) {
                        $gallery->add( $file->getTitle() );
@@ -740,6 +738,18 @@ class SpecialUpload extends SpecialPage {
        protected function getGroupName() {
                return 'media';
        }
+
+       /**
+        * Should we rotate images in the preview on Special:Upload.
+        *
+        * This controls js: mw.config.get( 'wgFileCanRotate' )
+        *
+        * @todo What about non-BitmapHandler handled files?
+        */
+       static public function rotationEnabled() {
+               $bitmapHandler = new BitmapHandler();
+               return $bitmapHandler->autoRotateEnabled();
+       }
 }
 
 /**
@@ -823,8 +833,6 @@ class UploadForm extends HTMLForm {
         * @return array Descriptor array
         */
        protected function getSourceSection() {
-               global $wgCopyUploadsFromSpecialUpload;
-
                if ( $this->mSessionKey ) {
                        return array(
                                'SessionKey' => array(
@@ -840,7 +848,7 @@ class UploadForm extends HTMLForm {
 
                $canUploadByUrl = UploadFromUrl::isEnabled()
                        && ( UploadFromUrl::isAllowed( $this->getUser() ) === true )
-                       && $wgCopyUploadsFromSpecialUpload;
+                       && $this->getConfig()->get( 'CopyUploadsFromSpecialUpload' );
                $radio = $canUploadByUrl;
                $selectedSourceType = strtolower( $this->getRequest()->getText( 'wpSourceType', 'File' ) );
 
@@ -919,17 +927,18 @@ class UploadForm extends HTMLForm {
        protected function getExtensionsMessage() {
                # Print a list of allowed file extensions, if so configured.  We ignore
                # MIME type here, it's incomprehensible to most people and too long.
-               global $wgCheckFileExtensions, $wgStrictFileExtensions,
-                       $wgFileExtensions, $wgFileBlacklist;
+               $config = $this->getConfig();
 
-               if ( $wgCheckFileExtensions ) {
-                       if ( $wgStrictFileExtensions ) {
+               if ( $config->get( 'CheckFileExtensions' ) ) {
+                       if ( $config->get( 'StrictFileExtensions' ) ) {
                                # Everything not permitted is banned
                                $extensionsList =
                                        '<div id="mw-upload-permitted">' .
                                        $this->msg(
                                                'upload-permitted',
-                                               $this->getContext()->getLanguage()->commaList( array_unique( $wgFileExtensions ) )
+                                               $this->getContext()->getLanguage()->commaList(
+                                                       array_unique( $config->get( 'FileExtensions' ) )
+                                               )
                                        )->parseAsBlock() .
                                        "</div>\n";
                        } else {
@@ -938,13 +947,17 @@ class UploadForm extends HTMLForm {
                                        '<div id="mw-upload-preferred">' .
                                                $this->msg(
                                                        'upload-preferred',
-                                                       $this->getContext()->getLanguage()->commaList( array_unique( $wgFileExtensions ) )
+                                                       $this->getContext()->getLanguage()->commaList(
+                                                               array_unique( $config->get( 'FileExtensions' ) )
+                                                       )
                                                )->parseAsBlock() .
                                        "</div>\n" .
                                        '<div id="mw-upload-prohibited">' .
                                                $this->msg(
                                                        'upload-prohibited',
-                                                       $this->getContext()->getLanguage()->commaList( array_unique( $wgFileBlacklist ) )
+                                                       $this->getContext()->getLanguage()->commaList(
+                                                               array_unique( $config->get( 'FileBlacklist' ) )
+                                                       )
                                                )->parseAsBlock() .
                                        "</div>\n";
                        }
@@ -963,6 +976,7 @@ class UploadForm extends HTMLForm {
         * @return array Descriptor array
         */
        protected function getDescriptionSection() {
+               $config = $this->getConfig();
                if ( $this->mSessionKey ) {
                        $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
                        try {
@@ -1035,8 +1049,7 @@ class UploadForm extends HTMLForm {
                        );
                }
 
-               global $wgUseCopyrightUpload;
-               if ( $wgUseCopyrightUpload ) {
+               if ( $config->get( 'UseCopyrightUpload' ) ) {
                        $descriptor['UploadCopyStatus'] = array(
                                'type' => 'text',
                                'section' => 'description',
@@ -1111,11 +1124,11 @@ class UploadForm extends HTMLForm {
         * Add upload JS to the OutputPage
         */
        protected function addUploadJS() {
-               global $wgUseAjax, $wgAjaxUploadDestCheck, $wgAjaxLicensePreview,
-                       $wgEnableAPI, $wgStrictFileExtensions;
+               $config = $this->getConfig();
 
-               $useAjaxDestCheck = $wgUseAjax && $wgAjaxUploadDestCheck;
-               $useAjaxLicensePreview = $wgUseAjax && $wgAjaxLicensePreview && $wgEnableAPI;
+               $useAjaxDestCheck = $config->get( 'UseAjax' ) && $config->get( 'AjaxUploadDestCheck' );
+               $useAjaxLicensePreview = $config->get( 'UseAjax' ) &&
+                       $config->get( 'AjaxLicensePreview' ) && $config->get( 'EnableAPI' );
                $this->mMaxUploadSize['*'] = UploadBase::getMaxUploadSize();
 
                $scriptVars = array(
@@ -1126,9 +1139,10 @@ class UploadForm extends HTMLForm {
                                // the wpDestFile textbox
                                $this->mDestFile === '',
                        'wgUploadSourceIds' => $this->mSourceIds,
-                       'wgStrictFileExtensions' => $wgStrictFileExtensions,
+                       'wgStrictFileExtensions' => $config->get( 'StrictFileExtensions' ),
                        'wgCapitalizeUploads' => MWNamespace::isCapitalized( NS_FILE ),
                        'wgMaxUploadSize' => $this->mMaxUploadSize,
+                       'wgFileCanRotate' => SpecialUpload::rotationEnabled(),
                );
 
                $out = $this->getOutput();
@@ -1136,8 +1150,7 @@ class UploadForm extends HTMLForm {
 
                $out->addModules( array(
                        'mediawiki.action.edit', // For <charinsert> support
-                       'mediawiki.legacy.upload', // Old form stuff...
-                       'mediawiki.special.upload', // Newer extras for thumbnail preview.
+                       'mediawiki.special.upload', // Extras for thumbnail and license preview.
                ) );
        }
 
index afa12a0..bdd6751 100644 (file)
@@ -41,6 +41,7 @@ class LoginForm extends SpecialPage {
        const USER_BLOCKED = 11;
        const NEED_TOKEN = 12;
        const WRONG_TOKEN = 13;
+       const USER_MIGRATED = 14;
 
        /**
         * Valid error and warning messages
@@ -104,9 +105,12 @@ class LoginForm extends SpecialPage {
         * @param WebRequest $request
         */
        public function __construct( $request = null ) {
+               global $wgUseMediaWikiUIEverywhere;
                parent::__construct( 'Userlogin' );
 
                $this->mOverrideRequest = $request;
+               // Override UseMediaWikiEverywhere to true, to force login and create form to use mw ui
+               $wgUseMediaWikiUIEverywhere = true;
        }
 
        /**
@@ -237,11 +241,19 @@ class LoginForm extends SpecialPage {
                }
                $this->setHeaders();
 
-               // In the case where the user is already logged in, 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.
-               if ( $this->mType !== 'signup' && !$this->mPosted && $this->getUser()->isLoggedIn() ) {
+               // 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 &&
+                       $this->getUser()->isLoggedIn() &&
+                       ( $this->mReturnTo !== '' || $this->mReturnToQuery !== '' )
+               ) {
                        $this->successfulLogin();
                }
 
@@ -697,6 +709,14 @@ class LoginForm extends SpecialPage {
                }
 
                $u = User::newFromName( $this->mUsername );
+
+               // Give extensions a way to indicate the username has been updated,
+               // rather than telling the user the account doesn't exist.
+               if ( !wfRunHooks( 'LoginUserMigrated', array( $u, &$msg ) ) ) {
+                       $this->mAbortLoginErrorMsg = $msg;
+                       return self::USER_MIGRATED;
+               }
+
                if ( !( $u instanceof User ) || !User::isUsableName( $u->getName() ) ) {
                        return self::ILLEGAL;
                }
@@ -996,6 +1016,15 @@ class LoginForm extends SpecialPage {
                                $this->mainLoginForm( $this->msg( $error,
                                                wfEscapeWikiText( $this->mUsername ) )->text() );
                                break;
+                       case self::USER_MIGRATED:
+                               $error = $this->mAbortLoginErrorMsg ?: 'login-migrated-generic';
+                               $params = array();
+                               if ( is_array( $error ) ) {
+                                       $error = array_shift( $this->mAbortLoginErrorMsg );
+                                       $params = $this->mAbortLoginErrorMsg;
+                               }
+                               $this->mainLoginForm( $this->msg( $error, $params )->text() );
+                               break;
                        default:
                                throw new MWException( 'Unhandled case value' );
                }
@@ -1397,16 +1426,9 @@ class LoginForm extends SpecialPage {
                }
 
                $template->set( 'secureLoginUrl', $this->mSecureLoginUrl );
-               // Use loginend-https for HTTPS requests if it's not blank, loginend otherwise
-               // Ditto for signupend.  New forms use neither.
+               // Use signupend-https for HTTPS requests if it's not blank, signupend otherwise
                $usingHTTPS = $this->mRequest->getProtocol() == 'https';
-               $loginendHTTPS = $this->msg( 'loginend-https' );
                $signupendHTTPS = $this->msg( 'signupend-https' );
-               if ( $usingHTTPS && !$loginendHTTPS->isBlank() ) {
-                       $template->set( 'loginend', $loginendHTTPS->parse() );
-               } else {
-                       $template->set( 'loginend', $this->msg( 'loginend' )->parse() );
-               }
                if ( $usingHTTPS && !$signupendHTTPS->isBlank() ) {
                        $template->set( 'signupend', $signupendHTTPS->parse() );
                } else {
index 87ab41c..6b9173f 100644 (file)
@@ -204,7 +204,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string
         */
-       static function softwareInformation() {
+       public static function softwareInformation() {
                $dbr = wfGetDB( DB_SLAVE );
 
                // Put the software in an array of form 'name' => 'version'. All messages should
@@ -212,9 +212,11 @@ class SpecialVersion extends SpecialPage {
                // wikimarkup can be used.
                $software = array();
                $software['[https://www.mediawiki.org/ MediaWiki]'] = self::getVersionLinked();
-               $phpKey = wfIsHHVM() ? '[http://hhvm.com/ HHVM]' :
-                       '[https://php.net/ PHP]';
-               $software[$phpKey] = PHP_VERSION . " (" . PHP_SAPI . ")";
+               if ( wfIsHHVM() ) {
+                       $software['[http://hhvm.com/ HHVM]'] = HHVM_VERSION . " (" . PHP_SAPI . ")";
+               } else {
+                       $software['[https://php.net/ PHP]'] = PHP_VERSION . " (" . PHP_SAPI . ")";
+               }
                $software[$dbr->getSoftwareLink()] = $dbr->getServerInfo();
 
                // Allow a hook to add/remove items.
@@ -426,7 +428,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string Wikitext
         */
-       function getExtensionCredits() {
+       public function getExtensionCredits() {
                global $wgExtensionCredits;
 
                if (
@@ -480,7 +482,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string Wikitext
         */
-       function getSkinCredits() {
+       public function getSkinCredits() {
                global $wgExtensionCredits;
                if ( !isset( $wgExtensionCredits['skin'] ) || count( $wgExtensionCredits['skin'] ) === 0 ) {
                        return '';
@@ -523,8 +525,17 @@ class SpecialVersion extends SpecialPage {
                        );
 
                        array_walk( $tags, function ( &$value ) {
-                               $value = '&lt;' . htmlspecialchars( $value ) . '&gt;';
+                               // Bidirectional isolation improves readability in RTL wikis
+                               $value = Html::element(
+                                       'bdi',
+                                       // Prevent < and > from slipping to another line
+                                       array(
+                                               'style' => 'white-space: nowrap;',
+                                       ),
+                                       "<$value>"
+                               );
                        } );
+
                        $out .= $this->listToText( $tags );
                } else {
                        $out = '';
@@ -591,7 +602,7 @@ class SpecialVersion extends SpecialPage {
         * @param array $b
         * @return int
         */
-       function compare( $a, $b ) {
+       public function compare( $a, $b ) {
                if ( $a['name'] === $b['name'] ) {
                        return 0;
                } else {
@@ -618,7 +629,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string Raw HTML
         */
-       function getCreditsForExtension( array $extension ) {
+       public function getCreditsForExtension( array $extension ) {
                $out = $this->getOutput();
 
                // We must obtain the information for all the bits and pieces!
@@ -724,7 +735,7 @@ class SpecialVersion extends SpecialPage {
                        if ( $vcsDate ) {
                                $vcsTimeString = Html::element( 'span',
                                        array( 'class' => 'mw-version-ext-vcs-timestamp' ),
-                                       $this->getLanguage()->timeanddate( $vcsDate )
+                                       $this->getLanguage()->timeanddate( $vcsDate, true )
                                );
                                $versionString .= " {$vcsTimeString}";
                        }
@@ -741,13 +752,19 @@ class SpecialVersion extends SpecialPage {
                        $licenseLink = Linker::link(
                                $this->getPageTitle( 'License/' . $extensionName ),
                                $out->parseInline( $extension['license-name'] ),
-                               array( 'class' => 'mw-version-ext-license' )
+                               array(
+                                       'class' => 'mw-version-ext-license',
+                                       'dir' => 'auto',
+                               )
                        );
                } elseif ( $this->getExtLicenseFileName( $extensionPath ) ) {
                        $licenseLink = Linker::link(
                                $this->getPageTitle( 'License/' . $extensionName ),
                                $this->msg( 'version-ext-license' ),
-                               array( 'class' => 'mw-version-ext-license' )
+                               array(
+                                       'class' => 'mw-version-ext-license',
+                                       'dir' => 'auto',
+                               )
                        );
                }
 
@@ -903,7 +920,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string HTML fragment
         */
-       function listAuthors( $authors, $extName, $extDir ) {
+       public function listAuthors( $authors, $extName, $extDir ) {
                $hasOthers = false;
 
                $list = array();
@@ -1006,7 +1023,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @return string
         */
-       function listToText( $list, $sort = true ) {
+       public function listToText( $list, $sort = true ) {
                if ( !count( $list ) ) {
                        return '';
                }
index 8269b01..16127d9 100644 (file)
@@ -93,6 +93,18 @@ class WantedFilesPage extends WantedQueryPage {
                return true;
        }
 
+       /**
+        * Does the file exist?
+        *
+        * Use wfFindFile so we still think file namespace pages without
+        * files are missing, but valid file redirects and foreign files are ok.
+        *
+        * @return boolean
+        */
+       protected function existenceCheck( Title $title ) {
+               return (bool)wfFindFile( $title );
+       }
+
        function getQueryInfo() {
                return array(
                        'tables' => array(
index 8f2f86b..7becfaa 100644 (file)
@@ -562,12 +562,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
        protected function daysLink( $d, $options = array() ) {
                $options['days'] = $d;
-               $message = $d ? $this->getLanguage()->formatNum( $d )
-                       : $this->msg( 'watchlistall2' )->escaped();
 
                return Linker::linkKnown(
                        $this->getPageTitle(),
-                       $message,
+                       $this->getLanguage()->formatNum( $d ),
                        array(),
                        $options
                );
@@ -581,8 +579,11 @@ class SpecialWatchlist extends ChangesListSpecialPage {
         * @return string
         */
        protected function cutoffLinks( $days, $options = array() ) {
+               global $wgRCMaxAge;
+               $watchlistMaxDays = ceil( $wgRCMaxAge / ( 3600 * 24 ) );
+
                $hours = array( 1, 2, 6, 12 );
-               $days = array( 1, 3, 7 );
+               $days = array( 1, 3, 7, $watchlistMaxDays );
                $i = 0;
                foreach ( $hours as $h ) {
                        $hours[$i++] = $this->hoursLink( $h, $options );
@@ -594,8 +595,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                return $this->msg( 'wlshowlast' )->rawParams(
                        $this->getLanguage()->pipeList( $hours ),
-                       $this->getLanguage()->pipeList( $days ),
-                       $this->daysLink( 0, $options ) )->parse();
+                       $this->getLanguage()->pipeList( $days ) )->parse();
        }
 
        /**
index 7dc6da1..e373cff 100644 (file)
@@ -431,9 +431,9 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
 
                $f .= Xml::fieldset( $this->msg( 'whatlinkshere' )->text() );
 
-               # Target input
+               # Target input (.mw-searchInput enables suggestions)
                $f .= Xml::inputLabel( $this->msg( 'whatlinkshere-page' )->text(), 'target',
-                       'mw-whatlinkshere-target', 40, $target );
+                       'mw-whatlinkshere-target', 40, $target, array( 'class' => 'mw-searchInput' ) );
 
                $f .= ' ';
 
index 33b2400..5b88dfd 100644 (file)
@@ -72,7 +72,7 @@ if ( !function_exists( 'session_name' ) ) {
                </style>
        </head>
        <body>
-               <img src="<?php echo htmlspecialchars( $path ) ?>skins/common/images/mediawiki.png" alt='The MediaWiki logo' />
+               <img src="<?php echo htmlspecialchars( $path ) ?>resources/assets/mediawiki.png" alt='The MediaWiki logo' />
 
                <h1>MediaWiki <?php echo htmlspecialchars( $wgVersion ) ?></h1>
                <div class='error'>
@@ -81,9 +81,9 @@ if ( !function_exists( 'session_name' ) ) {
                        <p>
                        <?php
                        if ( $installerStarted ) {
-                               echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> complete the installation</a> and download LocalSettings.php.";
+                               echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\">complete the installation</a> and download LocalSettings.php.";
                        } else {
-                               echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> set up the wiki</a> first.";
+                               echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\">set up the wiki</a> first.";
                        }
                        ?>
                        </p>
index 01da0bd..4eea01c 100644 (file)
@@ -254,14 +254,17 @@ class UsercreateTemplate extends BaseTemplate {
                        ?>
                        <div class="mw-ui-vform-field mw-submit">
                                <?php
-                               echo Html::input(
-                                       'wpCreateaccount',
+                               echo Html::submitButton(
                                        $this->getMsg( $this->data['loggedin'] ? 'createacct-another-submit' : 'createacct-submit' ),
-                                       'submit',
-                                       array(
-                                               'class' => "mw-ui-button mw-ui-big mw-ui-block mw-ui-constructive",
+                                       $attrs = array(
                                                'id' => 'wpCreateaccount',
+                                               'name' => 'wpCreateaccount',
                                                'tabindex' => $tabIndex++
+                                       ),
+                                       array(
+                                               'mw-ui-big',
+                                               'mw-ui-block',
+                                               'mw-ui-constructive',
                                        )
                                );
                                ?>
index 8bba426..2a9badf 100644 (file)
@@ -148,11 +148,15 @@ class UserloginTemplate extends BaseTemplate {
 
                        <div class="mw-ui-vform-field">
                                <?php
-                               echo Html::input( 'wpLoginAttempt', $this->getMsg( 'pt-login-button' )->text(), 'submit', array(
+                               $attrs = array(
                                        'id' => 'wpLoginAttempt',
+                                       'name' => 'wpLoginAttempt',
                                        'tabindex' => '6',
-                                       'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-constructive'
-                               ) );
+                               );
+                               $modifiers = array(
+                                       'mw-ui-big', 'mw-ui-block', 'mw-ui-constructive',
+                               );
+                               echo Html::submitButton( $this->getMsg( 'pt-login-button' )->text(), $attrs, $modifiers );
                                ?>
                        </div>
 
index 5de543e..079c7f8 100644 (file)
@@ -69,8 +69,6 @@ abstract class UploadBase {
        const WINDOWS_NONASCII_FILENAME = 13;
        const FILENAME_TOO_LONG = 14;
 
-       const SESSION_STATUS_KEY = 'wsUploadStatusData';
-
        /**
         * @param int $error
         * @return string
@@ -746,6 +744,8 @@ abstract class UploadBase {
                                );
                        }
                        wfRunHooks( 'UploadComplete', array( &$this ) );
+
+                       $this->postProcessUpload();
                }
 
                wfProfileOut( __METHOD__ );
@@ -753,6 +753,35 @@ abstract class UploadBase {
                return $status;
        }
 
+       /**
+        * Perform extra steps after a successful upload.
+        *
+        * @since  1.25
+        */
+       public function postProcessUpload() {
+               global $wgUploadThumbnailRenderMap;
+
+               $jobs = array();
+
+               $sizes = $wgUploadThumbnailRenderMap;
+               rsort( $sizes );
+
+               $file = $this->getLocalFile();
+
+               foreach ( $sizes as $size ) {
+                       if ( $file->isVectorized()
+                               || $file->getWidth() > $size ) {
+                                       $jobs[] = new ThumbnailRenderJob( $file->getTitle(), array(
+                                               'transformParams' => array( 'width' => $size ),
+                                       ) );
+                       }
+               }
+
+               if ( $jobs ) {
+                       JobQueueGroup::singleton()->push( $jobs );
+               }
+       }
+
        /**
         * Returns the title of the file to be uploaded. Sets mTitleError in case
         * the name was illegal.
@@ -1297,7 +1326,8 @@ abstract class UploadBase {
         * @param array $attribs
         * @return bool
         */
-       public function checkSvgScriptCallback( $element, $attribs ) {
+       public function checkSvgScriptCallback( $element, $attribs, $data = null ) {
+
                list( $namespace, $strippedElement ) = $this->splitXmlNamespace( $element );
 
                // We specifically don't include:
@@ -1381,6 +1411,14 @@ abstract class UploadBase {
                        return true;
                }
 
+               # Check <style> css
+               if ( $strippedElement == 'style'
+                       && self::checkCssFragment( Sanitizer::normalizeCss( $data ) )
+               ) {
+                       wfDebug( __METHOD__ . ": hostile css in style element.\n" );
+                       return true;
+               }
+
                foreach ( $attribs as $attrib => $value ) {
                        $stripped = $this->stripXmlNamespace( $attrib );
                        $value = strtolower( $value );
@@ -1423,6 +1461,18 @@ abstract class UploadBase {
                                return true;
                        }
 
+                       # Change href with animate from (http://html5sec.org/#137). This doesn't seem
+                       # possible without embedding the svg, but filter here in case.
+                       if ( $stripped == 'from'
+                               && $strippedElement === 'animate'
+                               && !preg_match( '!^https?://!im', $value )
+                       ) {
+                               wfDebug( __METHOD__ . ": Found animate that might be changing href using from "
+                                       . "\"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+
+                               return true;
+                       }
+
                        # use set/animate to add event-handler attribute to parent
                        if ( ( $strippedElement == 'set' || $strippedElement == 'animate' )
                                && $stripped == 'attributename'
@@ -1463,23 +1513,23 @@ abstract class UploadBase {
                        }
 
                        # use CSS styles to bring in remote code
-                       # catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
-                       $tagsList = "font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke";
                        if ( $stripped == 'style'
-                               && preg_match_all(
-                                       '!((?:' . $tagsList . ')\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim',
-                                       $value,
-                                       $matches
-                               )
+                               && self::checkCssFragment( Sanitizer::normalizeCss( $value ) )
                        ) {
-                               foreach ( $matches[1] as $match ) {
-                                       if ( !preg_match( '!(?:' . $tagsList . ')\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
-                                               wfDebug( __METHOD__ . ": Found svg setting a style with "
-                                                       . "remote url '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found svg setting a style with "
+                                       . "remote url '$attrib'='$value' in uploaded file.\n" );
+                               return true;
+                       }
 
-                                               return true;
-                                       }
-                               }
+                       # Several attributes can include css, css character escaping isn't allowed
+                       $cssAttrs = array( 'font', 'clip-path', 'fill', 'filter', 'marker',
+                               'marker-end', 'marker-mid', 'marker-start', 'mask', 'stroke' );
+                       if ( in_array( $stripped, $cssAttrs )
+                               && self::checkCssFragment( $value )
+                       ) {
+                               wfDebug( __METHOD__ . ": Found svg setting a style with "
+                                       . "remote url '$attrib'='$value' in uploaded file.\n" );
+                               return true;
                        }
 
                        # image filters can pull in url, which could be svg that executes scripts
@@ -1497,6 +1547,58 @@ abstract class UploadBase {
                return false; //No scripts detected
        }
 
+       /**
+        * Check a block of CSS or CSS fragment for anything that looks like
+        * it is bringing in remote code.
+        * @param string $value a string of CSS
+        * @param bool $propOnly only check css properties (start regex with :)
+        * @return bool true if the CSS contains an illegal string, false if otherwise
+        */
+       private static function checkCssFragment( $value ) {
+
+               # Forbid external stylesheets, for both reliability and to protect viewer's privacy
+               if ( strpos( $value, '@import' ) !== false ) {
+                       return true;
+               }
+
+               # We allow @font-face to embed fonts with data: urls, so we snip the string
+               # 'url' out so this case won't match when we check for urls below
+               $pattern = '!(@font-face\s*{[^}]*src:)url(\("data:;base64,)!im';
+               $value = preg_replace( $pattern, '$1$2', $value );
+
+               # Check for remote and executable CSS. Unlike in Sanitizer::checkCss, the CSS
+               # properties filter and accelerator don't seem to be useful for xss in SVG files.
+               # Expression and -o-link don't seem to work either, but filtering them here in case.
+               # Additionally, we catch remote urls like url("http:..., url('http:..., url(http:...,
+               # but not local ones such as url("#..., url('#..., url(#....
+               if ( preg_match( '!expression
+                               | -o-link\s*:
+                               | -o-link-source\s*:
+                               | -o-replace\s*:!imx', $value ) ) {
+                       return true;
+               }
+
+               if ( preg_match_all(
+                               "!(\s*(url|image|image-set)\s*\(\s*[\"']?\s*[^#]+.*?\))!sim",
+                               $value,
+                               $matches
+                       ) !== 0
+               ) {
+                       # TODO: redo this in one regex. Until then, url("#whatever") matches the first
+                       foreach ( $matches[1] as $match ) {
+                               if ( !preg_match( "!\s*(url|image|image-set)\s*\(\s*(#|'#|\"#)!im", $match ) ) {
+                                       return true;
+                               }
+                       }
+               }
+
+               if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ) {
+                       return true;
+               }
+
+               return false;
+       }
+
        /**
         * Divide the element name passed by the xml parser to the callback into URI and prifix.
         * @param string $element
@@ -1882,29 +1984,38 @@ abstract class UploadBase {
        }
 
        /**
-        * Get the current status of a chunked upload (used for polling).
-        * The status will be read from the *current* user session.
+        * Get the current status of a chunked upload (used for polling)
+        *
+        * The value will be read from cache.
+        *
+        * @param User $user
         * @param string $statusKey
         * @return Status[]|bool
         */
-       public static function getSessionStatus( $statusKey ) {
-               return isset( $_SESSION[self::SESSION_STATUS_KEY][$statusKey] )
-                       ? $_SESSION[self::SESSION_STATUS_KEY][$statusKey]
-                       : false;
+       public static function getSessionStatus( User $user, $statusKey ) {
+               $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
+
+               return wfGetCache( CACHE_ANYTHING )->get( $key );
        }
 
        /**
-        * Set the current status of a chunked upload (used for polling).
-        * The status will be stored in the *current* user session.
+        * Set the current status of a chunked upload (used for polling)
+        *
+        * The value will be set in cache for 1 day
+        *
+        * @param User $user
         * @param string $statusKey
         * @param array|bool $value
         * @return void
         */
-       public static function setSessionStatus( $statusKey, $value ) {
+       public static function setSessionStatus( User $user, $statusKey, $value ) {
+               $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
+
+               $cache = wfGetCache( CACHE_ANYTHING );
                if ( $value === false ) {
-                       unset( $_SESSION[self::SESSION_STATUS_KEY][$statusKey] );
+                       $cache->delete( $key );
                } else {
-                       $_SESSION[self::SESSION_STATUS_KEY][$statusKey] = $value;
+                       $cache->set( $key, $value, 86400 );
                }
        }
 }
index d86de79..1499302 100644 (file)
@@ -62,8 +62,6 @@ class UploadFromChunks extends UploadFromFile {
                        }
                        $this->stash = new UploadStash( $this->repo, $this->user );
                }
-
-               return true;
        }
 
        /**
index b97e2ad..3ceb620 100644 (file)
@@ -148,6 +148,7 @@ abstract class CdbWriter {
 
        /**
         * Are we running on Windows?
+        * @return bool
         */
        protected function isWindows() {
                return substr( php_uname(), 0, 7 ) == 'Windows';
index 6c53249..cc13679 100644 (file)
@@ -99,7 +99,8 @@ class MWCryptHKDF {
 
 
        /**
-        * @param string $hash Name of hashing algorithm
+        * @param string $secretKeyMaterial
+        * @param string $algorithm Name of hashing algorithm
         * @param BagOStuff $cache
         * @param string|array $context Context to mix into HKDF context
         */
index 31a71c4..b602f78 100644 (file)
@@ -61,6 +61,7 @@ class MWCryptRand {
 
        /**
         * Initialize an initial random state based off of whatever we can find
+        * @return string
         */
        protected function initialRandomState() {
                // $_SERVER contains a variety of unstable user and system specific information
index dffe242..5346afa 100644 (file)
@@ -117,7 +117,7 @@ class UIDGenerator {
        }
 
        /**
-        * @param array $info (UIDGenerator::millitime(), clock sequence)
+        * @param array $info (UIDGenerator::millitime(), counter, clock sequence)
         * @return string 88 bits
         */
        protected function getTimestampedID88( array $info ) {
index 0f56e33..bc84976 100644 (file)
@@ -129,6 +129,9 @@ class ZipDirectoryReader {
 
        /**
         * Private constructor
+        * @param string $fileName
+        * @param callable $callback
+        * @param array $options
         */
        protected function __construct( $fileName, $callback, $options ) {
                $this->fileName = $fileName;
@@ -359,6 +362,8 @@ class ZipDirectoryReader {
 
        /**
         * Read the central directory at the given location
+        * @param int $offset
+        * @param int $size
         */
        function readCentralDirectory( $offset, $size ) {
                $block = $this->getBlock( $offset, $size );
@@ -450,6 +455,7 @@ class ZipDirectoryReader {
 
        /**
         * Interpret ZIP64 "extra field" data and return an associative array.
+        * @param string $extraField
         * @return array|bool
         */
        function unpackZip64Extra( $extraField ) {
@@ -575,6 +581,7 @@ class ZipDirectoryReader {
 
        /**
         * Get the size of a structure in bytes. See unpack() for the format of $struct.
+        * @param array $struct
         * @return int
         */
        function getStructSize( $struct ) {
index cd8df5d..fb04255 100644 (file)
@@ -143,6 +143,12 @@ class Language {
         */
        static private $fallbackLanguageCache = array();
 
+       /**
+        * Cache for language names
+        * @var MapCacheLRU|null
+        */
+       static private $languageNameCache;
+
        /**
         * Get a cached or new language object for a given language code
         * @param string $code
@@ -731,6 +737,8 @@ class Language {
        }
 
        /**
+        * @deprecated since 1.24, doesn't handle conflicting aliases. Use
+        *   SpecialPageFactory::getLocalNameFor instead.
         * @param string $name
         * @return string
         */
@@ -784,6 +792,14 @@ class Language {
                return self::$dataCache->getSubitem( $this->mCode, 'imageFiles', $image );
        }
 
+       /**
+        * @return array
+        * @since 1.24
+        */
+       function getImageFiles() {
+               return self::$dataCache->getItem( $this->mCode, 'imageFiles' );
+       }
+
        /**
         * @return array
         */
@@ -838,6 +854,33 @@ class Language {
         * @since 1.20
         */
        public static function fetchLanguageNames( $inLanguage = null, $include = 'mw' ) {
+               wfProfileIn( __METHOD__ );
+               $cacheKey = $inLanguage === null ? 'null' : $inLanguage;
+               $cacheKey .= ":$include";
+               if ( self::$languageNameCache === null ) {
+                       self::$languageNameCache = new MapCacheLRU( 20 );
+               }
+               if ( self::$languageNameCache->has( $cacheKey ) ) {
+                       $ret = self::$languageNameCache->get( $cacheKey );
+               } else {
+                       $ret = self::fetchLanguageNamesUncached( $inLanguage, $include );
+                       self::$languageNameCache->set( $cacheKey, $ret );
+               }
+               wfProfileOut( __METHOD__ );
+               return $ret;
+       }
+
+       /**
+        * Uncached helper for fetchLanguageNames
+        * @param null|string $inLanguage Code of language in which to return the names
+        *              Use null for autonyms (native names)
+        * @param string $include One of:
+        *              'all' all available languages
+        *              'mw' only if the language is defined in MediaWiki or wgExtraLanguageNames (default)
+        *              'mwfile' only if the language is in 'mw' *and* has a message file
+        * @return array Language code => language name
+        */
+       private static function fetchLanguageNamesUncached( $inLanguage = null, $include = 'mw' ) {
                global $wgExtraLanguageNames;
                static $coreLanguageNames;
 
@@ -1026,6 +1069,11 @@ class Language {
 
        /**
         * Pass through result from $dateTimeObj->format()
+        * @param DateTime|bool|null &$dateTimeObj
+        * @param string $ts
+        * @param DateTimeZone|bool|null $zone
+        * @param string $code
+        * @return string
         */
        private static function dateTimeObjFormat( &$dateTimeObj, $ts, $zone, $code ) {
                if ( !$dateTimeObj ) {
@@ -3137,7 +3185,7 @@ class Language {
                }
 
                if ( !is_array( $rawEntry ) ) {
-                       error_log( "\"$rawEntry\" is not a valid magic word for \"$mw->mId\"" );
+                       wfWarn( "\"$rawEntry\" is not a valid magic word for \"$mw->mId\"" );
                } else {
                        $mw->mCaseSensitive = $rawEntry[0];
                        $mw->mSynonyms = array_slice( $rawEntry, 1 );
@@ -3161,7 +3209,7 @@ class Language {
 
        /**
         * Get special page names, as an associative array
-        *   case folded alias => real name
+        *   canonical name => array of valid names, including aliases
         * @return array
         */
        function getSpecialPageAliases() {
@@ -3992,7 +4040,7 @@ class Language {
         * Get the list of variants supported by this language
         * see sample implementation in LanguageZh.php
         *
-        * @return array an array of language codes
+        * @return array An array of language codes
         */
        public function getVariants() {
                return $this->mConverter->getVariants();
@@ -4284,7 +4332,7 @@ class Language {
         *
         * @since 1.22
         * @param string $code Language code
-        * @return array array( fallbacks, site fallbacks )
+        * @return array Array( fallbacks, site fallbacks )
         */
        public static function getFallbacksIncludingSiteLanguage( $code ) {
                global $wgLanguageCode;
@@ -4339,7 +4387,7 @@ class Language {
         *
         * @since 1.19
         * @param string $code Language code
-        * @return array of message keys (strings)
+        * @return array Array of message keys (strings)
         */
        public static function getMessageKeysFor( $code ) {
                return self::getLocalisationCache()->getSubItemList( $code, 'messages' );
@@ -4611,7 +4659,7 @@ class Language {
         * @param Title $title Title object to link
         * @param int $offset
         * @param int $limit
-        * @param array|string $query Optional URL query parameter string
+        * @param array $query Optional URL query parameter string
         * @param bool $atend Optional param for specified if this is the last page
         * @return string
         */
index abca495..eae77fb 100644 (file)
@@ -1102,6 +1102,7 @@ class LanguageConverter {
 
        /**
         * Get the cached separator pattern for ConverterRule::parseRules()
+        * @return string
         */
        function getVarSeparatorPattern() {
                if ( is_null( $this->mVarSeparatorPattern ) ) {
index 2051a5b..ad149ad 100644 (file)
@@ -33,7 +33,7 @@
  * Some writing systems require some line-height fixes. This includes
  * most Indic scripts, like Devanagari.
  * If you are adding support for such a language, add it also to
- * the relevant section in skins/common/shared.css.
+ * the relevant section in shared.css.
  *
  * @ingroup Language
  */
        'rmy' => 'Romani',      # Vlax Romany
        'rn' => 'Kirundi',              # Rundi/Kirundi/Urundi
        'ro' => 'română',     # Romanian
-       'roa-rup' => 'Armãneashce', # Aromanian (deprecated code, 'rup' exists in ISO 693-3)
+       'roa-rup' => 'armãneashti', # Aromanian (deprecated code, 'rup' exists in ISO 693-3)
        'roa-tara' => 'tarandíne',     # Tarantino
        'ru' => 'русский',       # Russian
        'rue' => 'русиньскый',        # Rusyn
-       'rup' => 'Armãneashce', # Aromanian
+       'rup' => 'armãneashti', # Aromanian
        'ruq' => 'Vlăheşte',  # Megleno-Romanian (multiple scripts - defaults to Latin)
        'ruq-cyrl' => 'Влахесте',       # Megleno-Romanian (Cyrillic script)
        # 'ruq-grek' => 'Βλαεστε',       # Megleno-Romanian (Greek script)
index f9e54ae..84c5108 100644 (file)
        "passwordreset-emailtitle": "Teuneurang nan ureueng ngui bak {{SITENAME}}",
        "passwordreset-emailelement": "Nan ureuëng ngui: $1\nLageuëm rahsia sijamong: $2",
        "changeemail": "Gantoe alamat surat-e",
-       "changeemail-header": "Gantoe alamat surat-e",
        "changeemail-no-info": "Droeneuh suwah neutamöng mangat jeuet neu'eu laman nyoe",
        "changeemail-oldemail": "Alamat surat-e jinoe:",
        "changeemail-newemail": "Alamat surat-e barô:",
        "changeemail-none": "(hana)",
        "changeemail-password": "Lageuem rahsia {{SITENAME}} droeneuh:",
        "changeemail-submit": "Gantoe surat-e",
-       "changeemail-cancel": "Peubateue",
        "bold_sample": "Rakam teubai",
        "bold_tip": "Haraih teubai",
        "italic_sample": "Rakam singèt naseukah nyoë",
        "search-interwiki-more": "(lom)",
        "searchrelated": "meusambat",
        "searchall": "ban dum",
-       "showingresultsheader": "{{PLURAL:$5|Hase '''$1''' nibak '''$3'''|Hase '''$1 - $2''' nibak '''$3'''}} keu '''$4'''",
        "search-nonefound": "Hana hasé nyang paih lagèë neulakèë",
        "powersearch-legend": "Mita lanjut",
        "powersearch-ns": "Mita bak ruweuëng nan:",
        "pager-older-n": "{{PLURAL:$1|1 leubèh awai|$1 leubèh awai}}",
        "booksources": "Nè kitab",
        "booksources-search-legend": "Mita bak nè kitab",
-       "booksources-go": "Mita",
        "specialloguserlabel": "Ureuëng ngui:",
        "speciallogtitlelabel": "Sasaran (nan atawa ureuëng ngui):",
        "log": "Log",
        "watchthispage": "Kalön ôn nyoë",
        "unwatch": "Bateuë kalön",
        "watchlist-details": "{{PLURAL:$1|$1 ôn|$1 ôn}} geukalön, hana kira ôn peugah haba.",
-       "wlshowlast": "Peudeuh $1 jeum $2 uroë $3 seuneulheuëh",
+       "wlshowlast": "Peudeuh $1 jeum $2 uroë  seuneulheuëh",
        "watchlist-options": "Peuniléh dapeuta kalön",
        "watching": "Kalön...",
        "unwatching": "Hana kalön...",
        "metadata-expand": "Peuleumah tapeusili teunamah",
        "metadata-collapse": "Peusom tapeusili teunamah",
        "metadata-fields": "Bideuëng mètadata gamba nyang na lam peusan nyoë keuneuk geupasoë bak tampilan halaman gamba 'oh watèë tabel mètadata geutôp.\nData nyang la'én eunteuk teupeusom keudroë.\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",
-       "watchlistall2": "ban dum",
        "namespacesall": "ban dum",
        "monthsall": "ban dum",
        "recreate": "Peugöt ulang",
index 32b7b8c..3d74ea2 100644 (file)
        "passwordreset-emailsent-capture": "أرسل بريد إلكتروني تذكيري وهو معروض بالأسفل.",
        "passwordreset-emailerror-capture": "ولّد بريد إلكتروني تذكيري وهو معروض بالأسفل لكن فشل إرساله للمستخدم: $1",
        "changeemail": "تغيير عنوان البريد الإلكتروني",
-       "changeemail-header": "تغيير عنوان البريد الإلكتروني للحساب",
        "changeemail-text": "أكمل هذا النموذج لتغيير عنوان البريد الإلكتروني. سوف تحتاج إلى إدخال كلمة السر الخاصة بك لتأكيد هذا التغيير.",
        "changeemail-no-info": "يجب تسجيل الدخول للوصول إلى هذه الصفحة مباشرة.",
        "changeemail-oldemail": "عنوان البريد الإلكتروني الحالي:",
        "changeemail-newemail": "عنوان البريد الإلكتروني الجديد:",
        "changeemail-none": "(لا شيء)",
        "changeemail-submit": "غيّر البريد الإلكتروني",
-       "changeemail-cancel": "ifsa5",
        "bold_sample": "نص غليظ",
        "bold_tip": "نص غليظ",
        "italic_sample": "نص مائل",
        "search-suggest": "هل كنت تقصد: $1",
        "searchrelated": "مرتبطة",
        "searchall": "Elkol",
-       "showingresultsheader": "{{PLURAL:$5|النتيجة '''$1''' من'''$3'''|النتائج '''$1 - $2''' من'''$3'''}} ل'''$4'''",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "mypreferences": "تفضيلاتي",
        "youremail": "البريد:",
        "pager-older-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
        "booksources": "مصادر كتاب",
        "booksources-search-legend": "البحث عن مصادر الكتب",
-       "booksources-go": "اذهب",
        "log": "سجلات",
        "allpages": "kol ess'afa7at",
        "allarticles": "kol ess'afa7at",
        "watch": "راقب",
        "unwatch": "أوقف المراقبة",
        "watchlist-details": "{{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} في قائمة مراقبتك، بدون عد صفحات النقاش.",
-       "wlshowlast": "عرض آخر $1 ساعات $2 أيام $3",
+       "wlshowlast": "عرض آخر $1 ساعات $2 أيام",
        "watchlist-options": "خيارات قائمة المراقبة",
        "actioncomplete": "انتهاء العملية",
        "actionfailed": "الفعل فشل",
        "metadata": "بيانات ميتا",
        "metadata-help": "هذا الملف يحتوي على معلومات إضافية، غالبا ما تكون أضيفت من قبل الكاميرا الرقمية أو الماسح الضوئي المستخدم في إنشاء الملف.\nإذا كان الملف قد عدل عن حالته الأصلية، فبعض التفاصيل قد لا تعبر عن الملف المعدل.",
        "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",
-       "watchlistall2": "الكل",
        "namespacesall": "الكل",
        "monthsall": "الكل",
        "watchlistedit-clear-explain": "Elɛanawin lkol bech yetnaħaw mel'lista mteɛek",
index 3db54fb..d8b9f6a 100644 (file)
        "otherlanguages": "Ander tale",
        "redirectedfrom": "(Aangestuur vanaf $1)",
        "redirectpagesub": "Aanstuurblad",
+       "redirectto": "Aanstuur na:",
        "lastmodifiedat": "Die bladsy is laas op $1 om $2 bygewerk.",
        "viewcount": "Hierdie bladsy is al {{PLURAL:$1|keer|$1 kere}} aangevra.",
        "protectedpage": "Beskermde bladsy",
        "hidetoc": "versteek",
        "collapsible-collapse": "Vou toe",
        "collapsible-expand": "Vou oop",
+       "confirmable-confirm": "Is {{GENDER:$1|u}} seker?",
+       "confirmable-yes": "Ja",
+       "confirmable-no": "Nee",
        "thisisdeleted": "Wys of herstel $1?",
        "viewdeleted": "Bekyk $1?",
        "restorelink": "{{PLURAL:$1|die geskrapte wysiging|$1 geskrapte wysigings}}",
        "passwordreset-emailsent-capture": "'n E-pos vir die herstel van 'n wagwoord is gestuur. Dit word hieronder vertoon.",
        "passwordreset-emailerror-capture": "'n E-pos vir die herstel van 'n wagwoord is saamgestel. Dit word hieronder vertoon. Die uitstuur daarvan na die {{GENDER:$2|gebruiker}} het egter gefaal: $1",
        "changeemail": "Wysig E-posadres",
-       "changeemail-header": "Wysig rekening se e-posadres",
        "changeemail-text": "Voltooi die vorm om u e-posadres te verander. U sal u wagwoord moet insleutel om die verandering te bevestig.",
        "changeemail-no-info": "U moet aangemeld wees om regstreeks toegang tot die bladsy te kry.",
        "changeemail-oldemail": "Huidige e-posadres:",
        "changeemail-none": "(geen)",
        "changeemail-password": "U wagwoord vir {{SITENAME}}:",
        "changeemail-submit": "Wysig E-posadres",
-       "changeemail-cancel": "Kanselleer",
        "resettokens-token-label": "$1 (huidige waarde: $2)",
        "bold_sample": "Vetgedrukte teks",
        "bold_tip": "Vetdruk",
        "searchrelated": "verwante",
        "searchall": "alle",
        "showingresults": "Hier volg {{PLURAL:$1|'''1''' resultaat|'''$1''' resultate}} vanaf #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resultaat '''$1''' van '''$3'''|Resultate '''$1 - $2''' van '''$3'''}} vir '''$4'''",
        "search-nonefound": "Daar is geen resultate vir u soekopdrag nie.",
        "powersearch-legend": "Gevorderde soektog",
        "powersearch-ns": "Soek in naamruimtes:",
        "randomincategory": "Lukrake bladsy in die kategorie",
        "randomincategory-invalidcategory": "\"$1\" is nie 'n geldige kategorienaam nie.",
        "randomincategory-nopages": "Daar is geen bladsye in kategorie [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Kry 'n lukrake bladsy uit hierdie kategorie: $1 $2.",
-       "randomincategory-selectcategory-submit": "Gaan",
+       "randomincategory-category": "Kategorie:",
        "randomredirect": "Lukrake aanstuur",
        "randomredirect-nopages": "Daar is geen aansture in naamruimte \"$1\" nie.",
        "statistics": "Statistieke",
        "querypage-disabled": "Hierdie spesiale bladsy is afgeskakel om werkverrigting te verbeter (bediener is oorlaai).",
        "booksources": "Boekbronne",
        "booksources-search-legend": "Soek vir boekbronne",
-       "booksources-go": "Soek",
        "booksources-text": "Hieronder is 'n lys van webtuistes wat nuwe en gebruikte boeke verkoop, en dalk meer inligting oor die boeke waarna u soek kan bevat:",
        "booksources-invalid-isbn": "Die ingevoerde ISBN-kode blyk asof dit ongeldig is; maak asseblief seker dat u dit sonder fout oorgekopiëer het vanaf die oorspronklike bron.",
        "specialloguserlabel": "Uitvoerende gebruiker:",
        "wlheader-enotif": "E-pos kennisgewings is aangeskakel.",
        "wlheader-showupdated": "Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys.",
        "wlnote": "Hier volg die laaste {{PLURAL:$1|verandering|'''$1''' veranderings}} binne die laaste {{PLURAL:$2|uur|'''$2''' ure}}, soos vanaf $3 om $4.",
-       "wlshowlast": "Wys afgelope $1 ure, $2 dae of $3",
+       "wlshowlast": "Wys afgelope $1 ure, $2 dae of",
        "watchlist-options": "Opsies vir dophoulys",
        "watching": "Plaas op dophoulys...",
        "unwatching": "Verwyder van dophoulys...",
        "ipb-unblock-addr": "Deblokkeer $1",
        "ipb-unblock": "Deblokkeer 'n gebruiker of IP-adres",
        "ipb-blocklist": "Wys bestaande blokkades",
-       "ipb-blocklist-contribs": "Bydraes van $1",
+       "ipb-blocklist-contribs": "Bydraes van {{GENDER:$1|$1}}",
        "unblockip": "Maak IP-adres oop",
        "unblockiptext": "Gebruik die vorm hier onder om skryftoegang te herstel vir 'n voorheen geblokkeerde IP-adres.",
        "ipusubmit": "Hef blokkade op",
        "import": "Voer bladsye in",
        "importinterwiki": "Transwiki-importeer",
        "import-interwiki-text": "Kies 'n wiki en bladsynaam om te importeer.\nWeergawe- en outeursinligting word sodoende bewaar.\nAlle transwiki-laaie word opgeteken in die [[Special:Log/import|invoer-logboek]].",
-       "import-interwiki-source": "Bronwiki/bladsy:",
+       "import-interwiki-sourcewiki": "Bronwiki:",
+       "import-interwiki-sourcepage": "Bronbladsy:",
        "import-interwiki-history": "Kopieer ook volledige geskiedenis van hierdie bladsy",
        "import-interwiki-templates": "Sluit alle sjablone in",
        "import-interwiki-submit": "Importeer",
        "newimages-summary": "Die spesiale bladsy wys die nuutste lêers wat na die wiki opgelaai is.",
        "newimages-legend": "Filter",
        "newimages-label": "Lêernaam (of deel daarvan):",
+       "newimages-showbots": "Wys robotte se oplaaie",
        "noimages": "Niks te sien nie.",
        "ilsubmit": "Soek",
        "bydate": "volgens datum",
        "exif-urgency-low": "Laag ( $1 )",
        "exif-urgency-high": "Hoog ($1)",
        "exif-urgency-other": "Gebruiker-gedefinieerde prioriteit ($1)",
-       "watchlistall2": "alles",
        "namespacesall": "alle",
        "monthsall": "alle",
        "confirmemail": "Bevestig e-posadres",
        "confirm-watch-top": "Voeg hierdie bladsy by u dophoulys?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Verwyder hierdie bladsy van u dophoulys?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← vorige bladsy",
        "imgmultipagenext": "volgende bladsy →",
        "imgmultigo": "Laat waai!",
        "duplicate-defaultsort": "Waarskuwing: Die standaardsortering \"$2\" kry voorrang voor die sortering \"$1\".",
        "version": "Weergawe",
        "version-extensions": "Uitbreidings geïnstalleer",
-       "version-skins": "Omslae",
+       "version-skins": "Geïnstalleerde omslae",
        "version-specialpages": "Spesiale bladsye",
        "version-parserhooks": "Ontlederhoeke",
        "version-variables": "Veranderlikes",
        "logentry-rights-rights": "$1 {{GENDER:$2|het}} groepslidmaatskap vir $3 van $4 na $5 gewysig",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|het}} groepslidmaatskap vir $3 gewysig",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} outomaties van $4 na $5 gepromoveerd",
+       "logentry-upload-upload": "$1 het $3 {{GENDER:$2|opgelaai}}",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|het}} 'n nuwe weergawe van $3 opgelaai",
+       "logentry-upload-revert": "$1 het $3 {{GENDER:$2|opgelaai}}",
        "rightsnone": "(geen)",
+       "revdelete-summary": "redigeringsopsomming",
        "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-message": "Boodskap:",
        "expand_templates_preview": "Voorskou",
        "pagelang-name": "Bladsy",
        "pagelang-language": "Taal",
-       "pagelang-select-lang": "Kies taal"
+       "pagelang-use-default": "Gebruik standaard taal",
+       "pagelang-select-lang": "Kies taal",
+       "right-pagelang": "Wysig die taal van die bladsy",
+       "log-name-pagelang": "Logboek van taalwysigings",
+       "log-description-pagelang": "Hierdie is 'n logboek van wysigings van die taal van bladsye.",
+       "logentry-pagelang-pagelang": "$1 wysig die taal van bladsy '$3' van $4 na $5.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 greep|$1 grepe}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-tipe",
+       "mediastatistics-table-extensions": "Moontlike uitbreidings",
+       "mediastatistics-table-count": "Aantal lêers",
+       "mediastatistics-table-totalbytes": "Totale grootte",
+       "mediastatistics-header-unknown": "Onbekend",
+       "mediastatistics-header-audio": "Oudio",
+       "mediastatistics-header-video": "Video's"
 }
index 6399f44..d4710b8 100644 (file)
        "searchrelated": "të ngjajshme",
        "searchall": "tâna",
        "showingresults": "Mâ poshtë {{PLURAL:$1|tregohet '''1''' rezultat|tregohen '''$1''' rezultate}} që nisin me #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Rezultati '''$1''' prej '''$3'''|Rezultatet '''$1 - $2''' prej '''$3'''}} për '''$4'''",
        "search-nonefound": "Nuk ka rezultate që përputhen me kërkesën.",
        "powersearch-legend": "Kërkimi i detajshëm",
        "powersearch-ns": "Kërkimi në hapësina:",
        "pager-older-n": "{{PLURAL:$1|mâ e vjetër 1|mâ të vjetra $1}}",
        "booksources": "Burime librash",
        "booksources-search-legend": "Kërkim në burime librash",
-       "booksources-go": "Shko",
        "log": "Regjistrat",
        "allpages": "Tâna faqet",
        "prevpage": "Faqja paraprake ($1)",
        "watchthispage": "Mbikëqyr këtë faqe",
        "unwatch": "Çmbikqyre",
        "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} në listën tuej të mbikëqyrjes, pa i numrue faqet e diskutimit.",
-       "wlshowlast": "Trego $1 orët $2 ditët $3 e fundit",
+       "wlshowlast": "Trego $1 orët $2 ditët  e fundit",
        "watchlist-options": "Opcionet e listës së mbikëqyrjes",
        "watching": "Tuj mbikqyrë...",
        "unwatching": "Tuj çmbikqyrë...",
        "metadata-expand": "Tregoji detajet",
        "metadata-collapse": "Mshefi detajet",
        "metadata-fields": "Fushat EXIF metadata që listohen në këtë mesazh do të përfshihen në faqen e figurës kur palohet tabela e metadatave.\nTjerat kanë me mbetë të mshefuna.\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",
-       "watchlistall2": "krejt",
        "namespacesall": "krejt",
        "monthsall": "krejt",
        "watchlisttools-view": "Shihi ndryshimet përkatëse",
        "revdelete-restricted": "u vendosën kufizime për administruesit",
        "revdelete-unrestricted": "u hoqën kufizimet për administruesit",
        "rightsnone": "(asgjë)",
+       "revdelete-summary": "përmbledhja redaktimit",
        "searchsuggest-search": "Kërkim",
        "searchsuggest-containing": "përmban ..."
 }
index 1ff713b..f186bbb 100644 (file)
        "passwordreset-emailsent-capture": "የማስታወሻ ኢ-ሜል ተልኳል፤ ከዚህም ታች ይታያል።",
        "passwordreset-emailerror-capture": "የማስታወሻ ኢ-ሜል ተልኳል፤ ከዚህም ታች ይታያል፤ ነገር ግን ወደ ተጠቃሚው ለመላክ ስንል አልተከናወነም፡",
        "changeemail": "ኢ-ሜል አድራሻዎን ለመቀይር",
-       "changeemail-header": "የአባልነትዎን ኢ-ሜል አድራሻ ለመቀይር",
        "changeemail-text": "ኢ-ሜል አድራሻዎን ለመቀይር ይህን ማመልከቻ ጨርስ። ለውጡን ለማረጋገጥ፣ መግቢያ ቃልዎን ማስገባት አስፈላጊ ነው።",
        "changeemail-no-info": "ይህንን ገጽ በቀጥታ ለማግኘት አስቀድሞ መግባት ያስፈልጋል።",
        "changeemail-oldemail": "የቆየው ኢ-ሜል አድራሻዎ፦",
        "changeemail-none": "(የለም)",
        "changeemail-password": "የ{{SITENAME}} መግቢያ ቃልዎ፦",
        "changeemail-submit": "አድራሻዎን ለመቀይር",
-       "changeemail-cancel": "ይቅር",
        "bold_sample": "ጉልህ ፊደላት",
        "bold_tip": "በጉልህ ፊደላት ይጻፍ",
        "italic_sample": "ያንጋደደ ፊደላት",
        "searchrelated": "የተዛመደ",
        "searchall": "ሁሉ",
        "showingresults": "ከ ቁ.#<b>$2</b> ጀምሮ እስከ <b>$1</b> ውጤቶች ድረስ ከዚህ በታች ይታያሉ።",
-       "showingresultsheader": "{{PLURAL:$5|ከ'''$3''' ውጤት ውስጥ '''$1'''|ከ'''$3''' ውጤቶች ውስጥ ከ'''$1''' እስከ '''$2'''}} ለ'''$4'''",
        "search-nonefound": "ለጥያቄው ምንም የሚስማማ ውጤት አልተገኘም።",
        "powersearch-legend": "ተጨማሪ ፍለጋ",
        "powersearch-ns": "በነዚሁ ክፍለ-ዊኪዎች ይፈልግ:",
        "recentchanges": "በቅርብ ጊዜ የተለወጡ",
        "recentchanges-legend": "የቅርብ ለውጥ አማራጮች፦",
        "recentchanges-summary": "በዚሁ ገጽ ላይ በቅርብ ጊዜ የወጡ አዳዲስ ለውጦች ለመከታተል ይችላሉ።",
+       "recentchanges-noresult": "ለዚሁ ጥያቄ በተሰጠው ወቅት ውስጥ  አንዳችም ለውጥ አልነበረም።",
        "recentchanges-feed-description": "በዚህ ዊኪ ላይ በቅርብ ግዜ የተለወጠውን በዚሁ feed መከታተል ይችላሉ",
        "recentchanges-label-newpage": "ይኸው ለውጥ አዲስ ገጽ ፈጠረ።",
        "recentchanges-label-minor": "ይህ ለውጥ ጥቃቅን ነው።",
        "booksources": "የመጻሕፍት ቤቶችና ሸጪዎች",
        "booksources-search-legend": "የመጽሐፍ ቦታ ፍለጋ",
        "booksources-isbn": "የመጽሐፉ ISBN #:",
-       "booksources-go": "ይሂድ",
        "booksources-text": "ከዚህ ታች ያሉት ውጭ መያያዦች መጻሕፍት ይሸጣሉ፤ ስለ ተፈለጉት መጻሕፍት ተጨማሪ መረጃ እዚያ እንደሚገኝ ይሆናል።",
        "specialloguserlabel": "ብዕር ስም፡",
        "speciallogtitlelabel": "አርዕስት፡",
        "wlheader-enotif": "የ-ኢሜል ማስታወቂያ እንዲሠራ ተደርጓል።",
        "wlheader-showupdated": "መጨረሻ ከጎበኟቸው ጀምሮ የተቀየሩት ገጾች በ'''ጉልህ ፊደላት''' ይታያሉ",
        "wlnote": "ባለፉት <b>$2</b> ሰዓቶች የተደረጉት $1 መጨረሻ ለውጦች እታች ይገኛሉ።",
-       "wlshowlast": "ያለፉት $1 ሰዓት፤ $2 ቀን፤ $3 ይታዩ።",
+       "wlshowlast": "ያለፉት $1 ሰዓት፤ $2 ቀን፤  ይታዩ።",
        "watchlist-options": "የዝርዝሩ ምርጫዎች",
        "watching": "እየተጨመረ ነው...",
        "unwatching": "እየተወገደ ነው...",
        "thumbnail_invalid_params": "ትክክለኛ ያልሆነ የናሙና ግቤት",
        "import": "ገጾች ከሌላ ዊኪ ለማስገባት",
        "importinterwiki": "ከሌላ ዊኪ ማስገባት",
-       "import-interwiki-source": "መነሻ ዊኪ/ገጽ:",
        "import-interwiki-history": "ለዚህ ገጽ የታሪክ ዕትሞች ሁሉ ለመቅዳት",
        "import-interwiki-submit": "ለማስገባት",
        "import-interwiki-namespace": "መድረሻ ክፍለ-ዊኪ:",
        "exif-iimcategory-spo": "ስፖርት",
        "exif-iimcategory-war": "ጦርነት፣ ግጭት ወይም ሁከት",
        "exif-urgency-high": "ከፍተኛ ($1)",
-       "watchlistall2": "ሁሉ",
        "namespacesall": "ሁሉ (all)",
        "monthsall": "ሁሉ",
        "confirmemail": "ኢ-ሜልዎን ለማረጋገጥ",
        "htmlform-selectorother-other": "ሌላ",
        "logentry-delete-delete": "$1 ገጹን $3 አጠፋ",
        "rightsnone": "(የለም)",
+       "revdelete-summary": "ማጠቃለያ",
        "feedback-cancel": "ይቅር",
        "searchsuggest-search": "ፈልግ",
        "searchsuggest-containing": "በመጣጥፎች ይዘት ለመፈልግ...",
index bc94329..7c710c7 100644 (file)
        "passwordreset-emailsent-capture": "Se le ha ninviau un recordatorio por correu electronico, que s'amuestra contino.",
        "passwordreset-emailerror-capture": "S'ha chenerau un recordatorio por correu electronico, que s'amuestra contino, pero o ninvío ta l'usuario ha fallau: $1",
        "changeemail": "Cambiar l'adreza de correu-e",
-       "changeemail-header": "Cambiar l'adreza de correu-e d'a cuenta",
        "changeemail-text": "Replene iste formulario ta cambiar a suya adreza de correu electronico. Habrá d'introducir a clau ta confirmar iste cambeo.",
        "changeemail-no-info": "Debe identificar-se como usuario ta poder acceder dreitament ta ista pachina.",
        "changeemail-oldemail": "Adreza de correu-e actual:",
        "changeemail-newemail": "No bi ha garra adreza de correu electronico",
        "changeemail-none": "(garra)",
        "changeemail-submit": "Cambiar adreza de correu-e",
-       "changeemail-cancel": "Cancelar",
        "bold_sample": "Texto en negreta",
        "bold_tip": "Texto en negreta",
        "italic_sample": "Texto en cursiva",
        "searchrelated": "relacionato",
        "searchall": "totz",
        "showingresults": "Contino se bi {{PLURAL:$1|amuestra '''1''' resultau|amuestran '''$1''' resultaus}} prencipiando por o numero '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resultau '''$1''' de '''$3'''|Resultaus '''$1-$2''' de '''$3'''}} ta '''$4'''",
        "search-nonefound": "No s'ha trobato garra resultau que cumpla os criterios.",
        "powersearch-legend": "Busca abanzata",
        "powersearch-ns": "Mirar en os espacios de nombres:",
        "querypage-disabled": "Ista pachina especial ye desactivata por motivos de rendimiento.",
        "booksources": "Fuents de libros",
        "booksources-search-legend": "Mirar fuents de libros",
-       "booksources-go": "Ir-ie",
        "booksources-text": "Contino ye una lista de vinclos ta atros puestos an que venden libros nuevos y usatos, talment bi haiga más información sobre os libros que ye mirando.",
        "booksources-invalid-isbn": "O numero d'ISBN dato pareix que no ye conforme; comprebe si no bi ha garra error en copiar d'a fuent orichinal.",
        "specialloguserlabel": "Fedor:",
        "wlheader-enotif": "A notificación por correu electronico ye activata",
        "wlheader-showupdated": "Las pachinas cambiadas dende a suya zaguer vesita s'amuestran en '''negreta'''",
        "wlnote": "Contino se i {{PLURAL:$1|amuestra o solo cambeo|amuestran os zaguers '''$1''' cambeos}} feitos en {{PLURAL:$2|a zaguer hora|as zagueras '''$2''' horas}}, o $3 a las $4.",
-       "wlshowlast": "Amostrar as zagueras $1 horas, $2 días u $3",
+       "wlshowlast": "Amostrar as zagueras $1 horas, $2 días u",
        "watchlist-options": "Opcions d'a lista de seguimiento",
        "watching": "Cosirando...",
        "unwatching": "Deixar de cosirar...",
        "import": "Importar pachinas",
        "importinterwiki": "Importación interwiki",
        "import-interwiki-text": "Trigue un wiki y un títol de pachina ta importar.\nAs calendatas d'as versions y os nombres d'os editors se preservarán.\nTodas as importacions interwiki se rechistran en o [[Special:Log/import|rechistro d'importacions]].",
-       "import-interwiki-source": "Wiki/pachina fuent:",
        "import-interwiki-history": "Copiar todas as versions de l'historial d'ista pachina",
        "import-interwiki-templates": "Incluir-ie todas as las plantillas",
        "import-interwiki-submit": "Importar",
        "exif-urgency-low": "Baixo ($1)",
        "exif-urgency-high": "Alto ($1)",
        "exif-urgency-other": "Prioridat definida por l'usuario ($1)",
-       "watchlistall2": "totz",
        "namespacesall": "totz",
        "monthsall": "totz",
        "confirmemail": "Confirmar adreza de correu-e",
        "logentry-newusers-create2": "$1 creyó una cuenta d'usuario $3",
        "logentry-newusers-autocreate": "S'ha creyau automaticament a cuenta $1",
        "rightsnone": "(garra)",
+       "revdelete-summary": "editar resumen",
        "feedback-bugornote": "Si creye que puede describir en detalle un problema tecnico, [$1 informe d'un bug] por favor.\n\nSi no, puet usar o siguient formulario. O suyo comentario será adhibiu a la pachina [$3 $2], de conchunta con o suyo nombre d'usuario y o navegador que fa servir.",
        "feedback-subject": "Afer:",
        "feedback-message": "Mensache:",
index c3bcbf6..2615fe3 100644 (file)
        "pager-older-n": "{{PLURAL:$1|ieldre 1|ieldran $1}}",
        "booksources": "Bōcfruman",
        "booksources-search-legend": "Sēcan bōcfruman",
-       "booksources-go": "Gān",
        "booksources-text": "Niðer is getæl hlencena tō ōðrum webstedum þe cīpaþ nīwa and gebrocena bēc, and wēninga hæbben ēac mā cȳþþu ymbe bēc þe þu sēcst:",
        "specialloguserlabel": "Gelǣstende brūcend:",
        "speciallogtitlelabel": "Ende (trametes titul oþþe brūcendes nama):",
        "unwatchthispage": "Ablinnan behealdunge",
        "watchlist-details": "{{PLURAL:$1|Þǣr is $1 tramet|Þǣr sind $1 trameta}} on þīnum behealdunggetæle, nā sunderlīce arīmedum mōtunga trametum.",
        "wlnote": "Niðer {{PLURAL:$1|is sēo nīwoste andwendung|sind þā nīwostan '''$1''' andwendunga}} in {{PLURAL:$2|þǣre latostan tīde|þǣm latostan '''$2''' tīda}}, fram: $3, $4.",
-       "wlshowlast": "Īwan þā nīwostan $1 tīda $2 daga $3",
+       "wlshowlast": "Īwan þā nīwostan $1 tīda $2 daga",
        "watchlist-options": "Behealdungtæles cyras",
        "watching": "Behealdende...",
        "unwatching": "Ablinnende behealdunge...",
        "exif-gpslongitude-e": "Ēast lengu",
        "exif-gpslongitude-w": "West lengu",
        "exif-gpsdirection-t": "Sōþ rihtung",
-       "watchlistall2": "eall",
        "namespacesall": "eall",
        "monthsall": "eall",
        "confirmemail_body": "Hwilchwega, gewēne þu of IP stōwe $1, hæfþ in namanbēc gestt ǣnne hordcleofan\n\"$2\" mid þissum e-ǣrendes naman on {{SITENAME}}n.\n\nTō āsēðenne þæt þes hordcleofa tō þē gebyraþ and tō openienne\ne-ǣrenda hwilcnessa on {{SITENAME}}n, opena þisne bend in þīnum webbscēawere:\n\n$3\n\nGif þis is *nā* þū, ne folga þisne bend.\n\n$5\n\nÞēos āsēðungrūn forealdaþ æt $4.",
        "tags-edit": "adihtan",
        "htmlform-submit": "Forþsendan",
        "htmlform-reset": "Undōn andwendunga",
-       "htmlform-selectorother-other": "Ōðer"
+       "htmlform-selectorother-other": "Ōðer",
+       "revdelete-summary": "ādihtscortnes"
 }
index 1d31cda..8a3c5a3 100644 (file)
@@ -62,6 +62,7 @@
        "tog-watchdefault": "أضف الصفحات والملفات التي أعدلها إلى قائمة مراقبتي",
        "tog-watchmoves": "أضف الصفحات والملفات التي أنقلها إلى قائمة مراقبتي",
        "tog-watchdeletion": "أضف الصفحات والملفات التي أحذفها إلى قائمة مراقبتي",
+       "tog-watchrollback": "أضف إلى قائمة مراقبتي الصفحات التي كنت أجريت فيها استرجاعات",
        "tog-minordefault": "أشِّر كل التعديلات على أنها طفيفة مبدئيا",
        "tog-previewontop": "أظهر معاينة النص فوق صندوق التحرير",
        "tog-previewonfirst": "أظهر معاينة مع أول تعديل",
        "jumptonavigation": "تصفح",
        "jumptosearch": "ابحث",
        "view-pool-error": "عذرا، الخواديم منهكة حاليا.\nيحاول مستخدمون كثر الوصول إلى هذه الصفحة.\nمن فضلك تمهّل قليلا قبل محاولة الوصول إلى هذه الصفحة مجددا.\n\n$1",
+       "generic-pool-error": "عذرا، الخوادم مشغولة حاليا لوجود مستخدمون كثر يطلبون عرض هذا المورد. انتظر قليلا وأعد المحاولة.",
        "pool-timeout": "انتهت مهلة القفل",
        "pool-queuefull": "الطابور ملآن",
        "pool-errorunknown": "خطأ غير معروف",
        "hidetoc": "أخف",
        "collapsible-collapse": "أخف",
        "collapsible-expand": "أظهر",
+       "confirmable-confirm": "أأنت متأكد{{GENDER:$1||ة}}؟",
+       "confirmable-yes": "نعم",
+       "confirmable-no": "لا",
        "thisisdeleted": "عرض أو استرجاع $1؟",
        "viewdeleted": "عرض $1؟",
        "restorelink": "{{PLURAL:$1|$1 تعديل محذوف|تعديلا واحدا محذوفا|تعديلين محذوفين|$1 تعديلات محذوفة|$1 تعديلا محذوفا|$1 تعديل محذوف}}",
        "invalidtitle-knownnamespace": "عنوان غير صالح في النطاق «$2» مع نص «$3»",
        "invalidtitle-unknownnamespace": "عنوان غير صالح ذو نطاق غير معروف رقم $1 ونص «$2»",
        "exception-nologin": "غير مسجل الدخول",
-       "exception-nologin-text": "اÙ\84رجاء [[Special:Userlogin|تسجÙ\8aÙ\84 Ø§Ù\84دخÙ\88Ù\84]] Ù\84تتÙ\85Ù\83Ù\86 Ù\85Ù\86 Ø§Ù\84Ù\88صÙ\88Ù\84 Ù\84Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة Ø£Ù\88 Ø£Ø¯Ø§Ø¡ Ù\87ذا Ø§Ù\84إجراء.",
+       "exception-nologin-text": "سجÙ\84 Ø§Ù\84دخÙ\88Ù\84 Ù\84Ù\84تÙ\85Ù\83Ù\86 Ù\85Ù\86 Ø¹Ø±Ø¶ Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة Ø£Ù\88 Ø¥Ø¬Ø±Ø§Ø¡ Ù\87ذا Ø§Ù\84Ù\81عÙ\84.",
        "exception-nologin-text-manual": "الرجاء $1 لتتمكن من الوصول لهذه الصفحة أو أداء هذا الإجراء.",
        "virus-badscanner": "ضبط سيء: ماسح فيروسات غير معروف: ''$1''",
        "virus-scanfailed": "فشل المسح (كود $1)",
        "passwordreset-emailsent-capture": "أُرسل بريد إلكتروني لإعادة ضبط كلمة السر، وهو معروض بالأسفل.",
        "passwordreset-emailerror-capture": "تم توليد رسالة بريد إلكتروني لتصفير كلمة السر نصّه التالي، إلا أنه تعذّر إرسال الرّسالة إلى {{GENDER:$2|المستخدم|المستخدمة}}: $1",
        "changeemail": "تغيير عنوان البريد الإلكتروني",
-       "changeemail-header": "تغيير عنوان البريد الإلكتروني للحساب",
        "changeemail-text": "أكمل هذا النموذج لتغيير عنوان البريد الإلكتروني. سوف تحتاج إلى إدخال كلمة السر الخاصة بك لتأكيد هذا التغيير.",
        "changeemail-no-info": "يجب تسجيل الدخول للوصول إلى هذه الصفحة مباشرة.",
        "changeemail-oldemail": "عنوان البريد الإلكتروني الحالي:",
        "changeemail-none": "(لا شيء)",
        "changeemail-password": "كلمة سر {{SITENAME}} الخاصة بك:",
        "changeemail-submit": "غيّر البريد الإلكتروني",
-       "changeemail-cancel": "إلغاء",
        "changeemail-throttled": "أنت قمت بمحاولات تسجيل دخول كثيرة.\nمن فضلك انتظر $1 قبل المحاولة ثانية.",
        "resettokens": "غير المفاتيح",
        "resettokens-text": " يمكن تغيير المفاتيح من الاطلاع على البيانات الخصوصية المتعلقة بحسابك.\nغير المفاتيح إذا أطلعت عليها أحدهم عن طريف الخطأ أو إذا كان حسابك قد اخترق.",
        "parser-template-recursion-depth-warning": "تم تجاوز حد عمق فرد القوالب ($1)",
        "language-converter-depth-warning": "تم تخطي حد عمق محول اللغة ($1)",
        "node-count-exceeded-category": "تجاوزات تعداد العقد",
-       "node-count-exceeded-warning": "تجاوزت هذه الصفحة تعداد العقد",
+       "node-count-exceeded-category-desc": "الصفحة تتجاوز الحد الأقصى للعقد البرمجية.",
+       "node-count-exceeded-warning": "الصفحة تجاوزت الحد الأقصى للعقد البرمجية.",
        "expansion-depth-exceeded-category": "تجاوزات عمق التوسيع",
-       "expansion-depth-exceeded-category-desc": "هذا تصنيف للصفحات التي تتجاوز عمق التوسيع.",
+       "expansion-depth-exceeded-category-desc": "الصفحة تجاوزت الحد الأقصى لعمق التوسيع.",
        "expansion-depth-exceeded-warning": "الصفحة تجاوزت عمق التوسيع",
        "parser-unstrip-loop-warning": "حلقة معراة تم الكشف عنها",
        "parser-unstrip-recursion-limit": "تعدى حد العودية Unstrip  ($1)",
        "currentrev": "المراجعة الحالية",
        "currentrev-asof": "المراجعة الحالية بتاريخ $1",
        "revisionasof": "مراجعة $1",
-       "revision-info": "Ù\85راجعة $1 Ø¨Ù\88اسطة $2",
+       "revision-info": "Ù\86سخة $1 Ù\84Ù\84Ù\85ستخدÙ\85 {{GENDER:$6|$2}}$7",
        "previousrevision": "→ مراجعة أقدم",
        "nextrevision": "مراجعة أحدث ←",
        "currentrevisionlink": "المراجعة الحالية",
        "rev-deleted-event": "(فعل السجل تمت إزالته)",
        "rev-deleted-user-contribs": "[اسم المستخدم أو عنوان الأيبي تمت إزالته - التعديل مخفي من المساهمات]",
        "rev-deleted-text-permission": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-suppressed-text-permission": "هذه النسخة قد <strong>أخفيت</strong> ([{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} تفاصيل].)",
        "rev-deleted-text-unhide": "'''حُذِفت''' مراجعة الصفحة هذه.\nيمكن العثور على تفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nمازال بإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
        "rev-suppressed-text-unhide": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
        "rev-deleted-text-view": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "revdelete-no-file": "الملف المحدد غير موجود.",
        "revdelete-show-file-confirm": "هل أنت متأكد أنك تريد رؤية مراجعة محذوفة للملف \"<nowiki>$1</nowiki>\" بتاريخ $2 الساعة $3؟",
        "revdelete-show-file-submit": "نعم",
+       "revdelete-selected-text": "{{PLURAL:$1|نسخة مختارة|نسخ مختارة}} ل[[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:",
        "revdelete-text-others": "سيتمكن الإداريون الآخرون على {{SITENAME}} من الوصول إلى المحتوى المخفي وإلغاء حذفه مجددا من خلال ذات الواجهة ما لم تطبق قيود إضافية.",
        "revdelete-confirm": "الإداريون الآخرون في {{SITENAME}} سيظل بإمكانهم رؤية المحتوى المخفي ويمكنهم استرجاعه مجددا من خلال هذه الواجهة نفسها، مالم يتم وضع قيود إضافية.\nمن فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
        "searchrelated": "مرتبطة",
        "searchall": "الكل",
        "showingresults": "معروض بالأسفل {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} بدءا من رقم '''$2'''.",
-       "showingresultsinrange": "معروض بالأسفل حتى {{PLURAL:$1|<strong>1</strong> نتيجة|<strong>$1</strong> نتائج}} في النطاق #<strong>$2</strong> إلى #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|النتيجة '''$1''' من'''$3'''|النتائج '''$1 - $2''' من'''$3'''}} ل'''$4'''",
+       "showingresultsinrange": "بالأسفل {{PLURAL:$1|نتيجة واحدة|<strong>$1</strong> نتائج|<strong>$1</strong> نتيجة}} في النطاق من <strong>$2</strong> إلى <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|النتائج <strong>$1</strong> من <strong>$3</strong>|النتائج <strong>$1 - $2</strong> من أصل <strong>$3</strong>}}",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "powersearch-legend": "بحث متقدم",
        "powersearch-ns": "بحث في النطاقات:",
        "prefs-files": "ملفات",
        "prefs-custom-css": "CSS مخصص",
        "prefs-custom-js": "جافاسكربت مخصص",
-       "prefs-common-css-js": "CSS أو جافاسكربت مشتركة لجميع المظاهر:",
+       "prefs-common-css-js": "سي إس إس وجافاسكربت مشترك لجميع المظاهر:",
        "prefs-reset-intro": "يمكنك استخدام هذه الصفحة لإعادة تفضيلاتك للحالة الافتراضية للموقع.\nلن تستطيع استرجاع الحالة السابقة.",
        "prefs-emailconfirm-label": "تأكيد البريد الإلكتروني:",
        "youremail": "البريد:",
        "userrights-lookup-user": "أدِر مجموعات المستخدم",
        "userrights-user-editname": "أدخل اسم مستخدم:",
        "editusergroup": "عدل مجموعات المستخدم",
-       "editinguser": "تغيير صلاحيات المستخدم '''[[User:$1|$1]]''' $2",
+       "editinguser": "تغيير صلاحيات {{GENDER:$1|المستخدم|المستخدمة}} '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "تعديل مجموعات المستخدم",
        "saveusergroups": "احفظ مجموعات المستخدم",
        "userrights-groupsmember": "عضو في:",
        "randomincategory": "صفحة عشوائية في التصنيف",
        "randomincategory-invalidcategory": "\"$1\" ليس اسم تصنيف صالح.",
        "randomincategory-nopages": "لا توجد صفحات في التصنيف [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "عرض صفحة عشوائية من التصنيف:  $1   $2",
-       "randomincategory-selectcategory-submit": "اذهب",
        "randomredirect": "تحويلة عشوائية",
        "randomredirect-nopages": "لا توجد تحويلات في النطاق \"$1\".",
        "statistics": "إحصاءات",
        "booksources": "مصادر كتاب",
        "booksources-search-legend": "البحث عن مصادر الكتب",
        "booksources-isbn": "ردمك:",
-       "booksources-go": "اذهب",
        "booksources-text": "توجد أدناه قائمة بوصلات لمواقع أخرى تبيع الكتب الجديدة والمستعملة، أيضا يمكنك أن تحصل على معلومات إضافية عن الكتب التي تبحث عنها من هناك:",
        "booksources-invalid-isbn": "رقم ISBN المعطى لا يبدو صحيحا؛ تحقق من أخطاء النسخ من المصدر الأصلي.",
        "specialloguserlabel": "المؤدي:",
        "wlheader-enotif": "الإخطار بالبريد الإلكتروني مُفعّل.",
        "wlheader-showupdated": "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط '''الغليظ'''",
        "wlnote": "بالأسفل {{PLURAL:$1|لا توجد تغييرات|التغيير الأخير|آخر تغييرين|آخر '''$1''' تغييرات|آخر '''$1''' تغييرا|آخر '''$1''' تغيير}} في {{PLURAL:$2||'''الساعة''' الماضية|'''الساعتين''' الماضيتين|ال'''$2''' ساعات الماضية|ال'''$2''' ساعة الماضية}} وفقاً ل$3، $4.",
-       "wlshowlast": "عرض آخر $1 ساعات $2 أيام $3",
+       "wlshowlast": "عرض آخر $1 ساعات $2 يوما",
        "watchlist-options": "خيارات قائمة المراقبة",
        "watching": "يراقب...",
        "unwatching": "إزالة المراقبة...",
        "contribsub2": "ل{{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "حساب المستخدم \"$1\" غير مسجل.",
        "nocontribs": "لم يتم العثور على تغييرات تطابق هذه المحددات.",
-       "uctop": "حالي",
+       "uctop": "(حالية)",
        "month": "من شهر (وأقدم):",
        "year": "من سنة (وأقدم):",
        "sp-contributions-newbies": "اعرض مساهمات الحسابات الجديدة فقط",
        "isimage": "وصلة ملف",
        "whatlinkshere-prev": "{{PLURAL:$1|السابق|ال$1 السابقة}}",
        "whatlinkshere-next": "{{PLURAL:$1|القادمة|ال$1 القادمة}}",
-       "whatlinkshere-links": "← وصلات",
+       "whatlinkshere-links": "وصلات",
        "whatlinkshere-hideredirs": "$1 التحويلات",
        "whatlinkshere-hidetrans": "$1 التضمينات",
        "whatlinkshere-hidelinks": "$1 الوصلات",
        "movepagetalktext": "صفحة النقاش المرفقة سيتم نقلها كذلك، '''إلا في حالة''':\n* توجد صفحة نقاش غير فارغة تحت العنوان الجديد، أو\n* قمت بإزالة اختيار الصندوق بالأسفل.\n\nوفي هذه الحالات، يجب عليك نقل أو دمج محتويات الصفحة يدويا، إذا رغب في ذلك.",
        "movearticle": "انقل الصفحة:",
        "moveuserpage-warning": "'''تحذير: أنت على وشك نقل صفحة مستخدم. من فضلك لاحظ أن الصفحة وحدها سوف تنقل وأن المستخدم لن يعاد تسميته.'''",
-       "movecategorypage-warning": "أنت على وشك نقل صفحة التصنيف إلى عنوان جديد؛ لن تنقل الصفحات المندرجة تحت التصنيف إلى العنوان الجديد.",
+       "movecategorypage-warning": "<strong>تحذير:</strong> أنت على وشك نقل صفحة التصنيف إلى عنوان جديد؛ <em>لن</em> تنقل الصفحات المندرجة تحت التصنيف إلى العنوان الجديد.",
        "movenologintext": "يجب أن تكون مستخدماً مسجلاً وأن  [[Special:UserLogin|تسجل دخولك]] لكي تنقل صفحة.",
        "movenotallowed": "أنت لا تمتلك الصلاحية لنقل الصفحات.",
        "movenotallowedfile": "أنت لا تمتلك الصلاحية لنقل الملفات.",
        "import": "استيراد صفحات",
        "importinterwiki": "استيراد ترانسويكي",
        "import-interwiki-text": "اختر ويكي وعنوان الصفحة للاستيراد.\nتواريخ المراجعات وأسماء المحررين سيتم حفظها.\nكل أفعال الاستيراد عبر الويكي يتم تسجيلها في [[Special:Log/import|سجل الاستيراد]].",
-       "import-interwiki-source": "الويكي/الصفحة المصدر:",
        "import-interwiki-history": "انسخ كل نسخ التاريخ لهذه الصفحة",
        "import-interwiki-templates": "ضمن كل القوالب",
        "import-interwiki-submit": "استيراد",
        "exif-urgency-low": "منخفض ( $1 )",
        "exif-urgency-high": "عالي ( $1 )",
        "exif-urgency-other": "الأولوية محددة من قبل المستخدم ($1)",
-       "watchlistall2": "الكل",
        "namespacesall": "الكل",
        "monthsall": "الكل",
        "confirmemail": "تأكيد عنوان البريد الإلكتروني",
        "logentry-rights-rights-legacy": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية $3",
        "logentry-rights-autopromote": "تمت تلقائيا ترقية {{GENDER:$2|المستخدم|المستخدمة}} $1 من  $4 إلى $5",
        "rightsnone": "(لا شيء)",
+       "revdelete-summary": "ملخص التعديل",
        "feedback-bugornote": "إن كنت مستعدا لشرح  مشكلة تقنية بالتفصيل، رجاءا [$1 قدم تقريرا بالخلل].\nبخلاف ذلك، يمكنك أستخدام الطريقة الأسهل أسفله، سيتم إضافة تعليقك للصفحة \"[$3 $2]\"، بالإضافة إلى اسم المستخدم و نوع المتصفح الذي تستخدمه حاليا.",
        "feedback-subject": "الموضوع:",
        "feedback-message": "الرسالة:",
        "duration-centuries": "{{PLURAL:$1||قرن واحد|قرنان|$1 قرون|$1 قرنًا|$1 قرن}}",
        "duration-millennia": "{{PLURAL:$1||ألفية واحدة|ألفيتان|$1 ألفيات|$1 ألفية}}",
        "rotate-comment": "تدوير الصورة  {{PLURAL:$1||درجة واحدة|درجتان|$1 درجات|$1 درجة}} باتجاه عقارب الساعة",
-       "limitreport-title": "محلل سمات البيانات:",
+       "limitreport-title": "بيانات تحليلية",
        "limitreport-cputime": "زمن المعالجة المستغرق",
        "limitreport-cputime-value": "{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوان|$1 ثانية}}",
        "limitreport-walltime": "الزمن الحقيقي المستغرق",
        "limitreport-walltime-value": "{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوان|$1 ثانية}}",
-       "limitreport-ppvisitednodes": "زار Ø§Ù\84Ù\85عاÙ\84ج Ø¹Ù\82دة Ø¥Ø­ØµØ§Ø¡",
-       "limitreport-ppgeneratednodes": "أحدث Ø§Ù\84Ù\85عاÙ\84ج Ø¹Ù\82دة Ø¥Ø­ØµØ§Ø¡",
-       "limitreport-postexpandincludesize": "بعد ØªÙ\88سÙ\8aع Ø§Ù\84Ù\85ساحة Ø§Ù\84شاÙ\85Ù\84Ø©",
+       "limitreport-ppvisitednodes": "عدد Ø§Ù\84عÙ\82د Ø§Ù\84Ù\85عاÙ\84جة",
+       "limitreport-ppgeneratednodes": "عÙ\82د Ø²Ø§Ø±Ù\87ا Ø§Ù\84Ù\85عاÙ\84ج Ø§Ù\84Ù\85سبÙ\82",
+       "limitreport-postexpandincludesize": "حجÙ\85 ØªØ¶Ù\85Ù\8aÙ\86 Ø§Ù\84تÙ\88سÙ\8aعات",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|بايت}}",
-       "limitreport-templateargumentsize": "حجÙ\85 Ù\86Ù\82اش Ø§Ù\84Ù\82الب",
+       "limitreport-templateargumentsize": "حجÙ\85 Ù\85عطÙ\8aات Ø§Ù\84Ù\82Ù\88الب",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بايت}}",
-       "limitreport-expansiondepth": "أكثر عمق توسعي",
-       "limitreport-expensivefunctioncount": "تحÙ\84Ù\8aÙ\84 Ø¥Ø­ØµØ§Ø¡ Ù\88ظÙ\8aÙ\81Ø© Ù\85Ù\83Ù\84Ù\81",
-       "expandtemplates": "فرد القوالب",
+       "limitreport-expansiondepth": "أعمق التوسيعات",
+       "limitreport-expensivefunctioncount": "دÙ\88اÙ\84 Ù\85Ø­Ù\84Ù\84Ø© Ù\85Ù\83Ù\84Ù\81Ø©",
+       "expandtemplates": "توسعة قالب",
        "expand_templates_intro": "تتعامل هذه الصفحة الخاصة مع نصوص الويكي وتقوم بفرد كل القوالب الموجودة به.\nوتقوم أيضا بفرد دوال القوالب مثل\n<code><nowiki>{{</nowiki>#language:…}}</code> and variables like <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. حقيقةً، تقوم التعامل مع كل ما بين الأقواس المزدوجة.",
        "expand_templates_title": "عنوان صفحة هذا النص، لأجل معالجة {{FULLPAGENAME}} إلخ.:",
        "expand_templates_input": "النص المدخل:",
index 1a86697..6c96052 100644 (file)
        "searchrelated": "ܐܚܝܢܝ̈ܐ",
        "searchall": "ܟܠ",
        "showingresults": "ܚܘܘܝܐ ܠܬܚܬ {{PLURAL:$1|'''1''' ܦܠܛܐ|'''$1''' ܦܠܛ̈ܐ}} ܫܪܐ ܡܢ ܡܢܝܢܐ '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|ܦܠܛܐ '''$1''' ܡܢ '''$3'''|ܦܠܛ̈ܐ '''$1 - $2''' ܡܢ '''$3'''}} ܠ'''$4'''",
        "search-nonefound": "ܠܝܬ ܦܠܛ̈ܐ ܐܘܝܢ̈ܐ ܠܗܢܐ ܒܨܝܐ.",
        "powersearch-legend": "ܒܨܝܐ ܡܬܩܕܡܢܐ",
        "powersearch-ns": "ܒܨܝ ܒܚܩܠܬ̈ܐ:",
        "suppress": "ܚܝܘܪܐ",
        "booksources": "ܙܠ",
        "booksources-search-legend": "ܒܨܝ ܥܠ ܡܒܘܥ̈ܐ ܕܟܬܒ̈ܐ",
-       "booksources-go": "ܙܠ",
        "specialloguserlabel": "ܡܦܩܢܐ:",
        "speciallogtitlelabel": "ܢܘܦܐ (ܟܘܢܝܐ ܐܘ ܡܦܠܚܢܐ):",
        "log": "ܣܓܠ̈ܐ",
        "watchlist-details": "{{PLURAL:$1|$1 ܦܐܬܐ|$1 ܦܐܬܬ̈ܐ}} ܒܪ̈ܗܝܬܟ, ܫܒܘܩ ܡܢ ܦܐܬܬ̈ܐ ܕܡܡܠܠܐ.",
        "wlheader-showupdated": "ܦܐܬܬ̈ܐ ܕܐܫܬܚܠܦܢ ܡܢ ܒܬܪ ܣܘܥܪܢܐ ܐܚܪܝܐ ܠܗܝܢ ܡܬܓܠܚܢ ܒܣܪܛܐ '''ܚܠܝܡܐ'''",
        "wlnote": "ܠܬܚܬ {{PLURAL:$1|ܫܘܚܠܦܐ ܐܚܪܝܐ| '''$1''' ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ}} {{PLURAL:$2|ܒܫܥܬܐ ܐܚܪܝܬܐ|'''$2''' ܒܫܥܬ̈ܐ ܐܚܪ̈ܝܬܐ}}, ܠܦܘܬ $3, $4.",
-       "wlshowlast": "ܚܘܝ $1 ܫܥܬ̈ܐ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ $3",
+       "wlshowlast": "ܚܘܝ $1 ܫܥܬ̈ܐ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ",
        "watchlist-options": "ܨܒܝܢܝܘܬ̈ܐ ܕܪ̈ܗܝܬܐ",
        "watching": "ܪܗܝܐ...",
        "unwatching": "ܠܚܝ ܪܗܝܐ...",
        "exif-gpsdirection-t": "ܨܘܒܐ ܬܪܝܨܐ",
        "exif-gpsdirection-m": "ܨܘܒܐ ܡܓܢܛܝܣܝܐ",
        "exif-dc-contributor": "ܫܘܬܦܢ̈ܐ",
-       "watchlistall2": "ܟܠ",
        "namespacesall": "ܟܠ",
        "monthsall": "ܟܠ",
        "confirmemail": "ܫܪܪ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ",
        "logentry-newusers-create2": "ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $3 {{GENDER:$2|ܐܬܬܟܝܢ}} ܒܝܕ $1",
        "logentry-newusers-autocreate": "ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 {{GENDER:$2|ܐܬܬܣܝܡ}} ܝܬܐܝܬ",
        "rightsnone": "(ܠܐ ܡܕܡ)",
+       "revdelete-summary": "ܫܚܠܦ ܦܣܝܩܬ̈ܐ",
        "feedback-subject": "ܡܠܘܐܐ:",
        "feedback-message": "ܐܓܪܬܐ:",
        "feedback-cancel": "ܒܛܘܠ",
index 4eb0a96..5e55cf6 100644 (file)
        "search-interwiki-more": "(Doy)",
        "searchrelated": "koneltuyelelu",
        "searchall": "kom",
-       "showingresultsheader": "{{PLURAL:$5|'''$1''' ñi tripalu '''$3''' mew|'''$1-$2''' ñi tripalu '''$3''' mew}} '''$4''' ngealu",
        "search-nonefound": "Tripalu dungu falilay chumngechi kintuael.",
        "mypreferences": "Dullin",
        "prefs-edits": "Rakin Wirin:",
        "pager-older-n": "{{PLURAL: Rupachi $1}}",
        "booksources": "Lifüru ñi chew küpan",
        "booksources-search-legend": "Kintun lifüru ñi chew küpan",
-       "booksources-go": "Amun",
        "specialloguserlabel": "Kellufe:",
        "speciallogtitlelabel": "Chew ñi amuael (Üy):",
        "log": "Wirintukun",
        "unwatchthispage": "Llaytuwelan",
        "notanarticle": "Trokiñdungu wülngiñ nu",
        "watchlist-details": "{{PLURAL:$1|$1 wülngiñ}} tami llaytun wif mew. Inantukulay nütramkawün ñi wülngiñ.",
-       "wlshowlast": "Pengelün kalekünun rupalu $1 ora, $2 antü $3",
+       "wlshowlast": "Pengelün kalekünun rupalu $1 ora, $2 antü",
        "watchlist-options": "Llaytun wif ñi dullin",
        "watching": "Llaytumekey...",
        "unwatching": "Llaytumekewelay...",
        "exif-contrast-2": "Yafü",
        "exif-sharpness-2": "Yafü",
        "exif-subjectdistancerange-0": "Kimnoelchi",
-       "watchlistall2": "kom",
        "namespacesall": "kom",
        "monthsall": "(kom)",
        "confirm_purge_button": "Feley may",
index c5e815b..68d2398 100644 (file)
        "search-suggest": "كنت باغي تقول: $1",
        "searchrelated": "مرتابطه",
        "searchall": "ألكل",
-       "showingresultsheader": "{{PLURAL:$5|نتيجه'''$1'''|نتايج'''$1–$2'''}} تع'''$3''' لـ'''$4'''",
        "search-nonefound": "ما كانش نتائج تطابق المسقسية.",
        "mypreferences": "إختيارات",
        "youremail": "البريه الالكترونيه:",
        "pager-older-n": "{{PLURAL:$1|قديم بزاف 1|قديم بزاف $1}}",
        "booksources": "مصادر كتاب",
        "booksources-search-legend": "حوس ما بين مصادر الكتب",
-       "booksources-go": "اذهب",
        "log": "ريجيسترات العمليات",
        "allpages": "قاع الباجات",
        "allarticles": "قاع الباجات",
        "watch": "تبع",
        "unwatch": "ما تزيدش تعس",
        "watchlist-details": "{{PLURAL:$1||باجه وحده|زوج باجات|$1 باجات|$1 باجه }} في ليستت مراقبتك، بلا ما تعد باجات النقاش.",
-       "wlshowlast": "بين آخر $1 سوايع $2 يامات$3",
+       "wlshowlast": "بين آخر $1 سوايع $2 يامات",
        "watchlist-options": "ابسيون ليستت المراقبه",
        "actioncomplete": "العمليه اندارت",
        "actionfailed": "العمليه فشلت",
        "metadata": "بايان ميتا",
        "metadata-help": "هذا الملف راه فيه خبيرات زايدين، بالاك تكون انزادت من عند صواره نيميريك ولا سكانر مين صنع الملف.\nالأصلي، شي تفاصيل بالاك ما تعبرش على الملف المعدل.",
        "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",
-       "watchlistall2": "لكل",
        "namespacesall": "لكل",
        "monthsall": "لكل",
        "watchlisttools-view": "اعرض التبديلات المرتابطه",
index 770e261..de81f16 100644 (file)
        "passwordreset-emailelement": "smiṫ l-mosṫĥdim: $1\nklmṫ s-srr l-mo'qaṫa: $2",
        "passwordreset-emailsent": "ṫsift email liṫ-ṫdkir.",
        "changeemail": "bddel ĝonwan l-email",
-       "changeemail-header": "bddel ĝonwan l-email dl-ḫisab",
        "changeemail-no-info": "ĥaṣṣ tkon daĥol baĥ tqdr twṣl l-had ṣfḫa niċan.",
        "changeemail-oldemail": "ĝonwan l-email l-ḫali:",
        "changeemail-newemail": "ĝonwan dial l-email jdid:",
        "changeemail-none": "(walo)",
        "changeemail-submit": "bddel l-email",
-       "changeemail-cancel": "lġi",
        "bold_sample": "Kṫaba ġliḍa",
        "bold_tip": "Kṫaba ġliḍa",
        "italic_sample": "Kṫaba mayla",
        "searchrelated": "mortabita",
        "searchall": "kolċi",
        "showingresults": "mbyyena l-ṫḫṫ ḫṫṫa l-{{PLURAL:$3|'''1''' n-naṫija|'''$3''' d-nnaṫa'ij}} badya mn rqm '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|n-naṫija '''$1''' mn '''$3'''|n-naṫa'ij '''$1 - $2''' mn '''$3'''}} l-'''$4'''",
        "search-nonefound": "ḫṫṫa naṫija ma bḫal ḫad t-talab.",
        "powersearch-legend": "Ṫeqlab ṣĝib",
        "powersearch-ns": "Qelleb fe maḫel s-smiyyaṫ",
        "booksources": "Ĝyon l-kṫab",
        "booksources-search-legend": "Qelleb ĝla l-kṫoba",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Sir",
        "specialloguserlabel": "Mosṫeĥdim:",
        "speciallogtitlelabel": "l'adresse:",
        "log": "sijillaṫ",
        "watchlist-details": "{{PLURAL:$1|ṣefḫa weḫda|$1 de ṣ-ṣefḫaṫ}} kaynin fe l-lista dyal s-suivi dyalṫek, bla ma nḫesbo ṣ-ṣefḫaṫ dyal n-niqaċ.",
        "wlheader-enotif": "l-iĝlam bl-email mtloq.",
        "wlheader-showupdated": "ṣ-ṣfaḫi lli ṫġyyeraṫ mn aĥir ẓiyaṛa ṫaĝk mkṫoba b-ĥatt '''ġliḍ'''",
-       "wlshowlast": "Werri  l-$1 de s-swayeĝ o l-$2 iyam l-leĥĥrin, ola werri $3",
+       "wlshowlast": "Werri  l-$1 de s-swayeĝ o l-$2 iyam l-leĥĥrin, ola werri",
        "watchlist-options": "Lé-Opsyon de l-lista dyal s-suivi",
        "watching": "Kayraqeb...",
        "unwatching": "Nihayaṫ 's-suivi...",
        "thumbnail_image-missing": "milef naqṣ: $1",
        "import": "Éxporté ċi ṣefḫaṫ",
        "importinterwiki": "sṫirad t-transwiki",
-       "import-interwiki-source": "wiki/ṣfḫṫ l-ṃṣḍṛ:",
        "import-interwiki-submit": "importé",
        "import-upload-filename": "smiyt lfichier:",
        "import-comment": "taĜelleq:",
        "exif-urgency-low": "mnĥafḍa ($1)",
        "exif-urgency-high": "ĝalia ($1)",
        "exif-urgency-other": "l-awlawiyya lli ḫddadha l-mosṫĥdim ($1)",
-       "watchlistall2": "kolċi",
        "namespacesall": "kolċi",
        "monthsall": "kolhom",
        "confirmemail": "konfirmasyon dyal l'email",
        "sqlite-no-fts": "$1 imkaniyat lbaht f nass kaml",
        "revdelete-restricted": "tḅḅq ḍ-ḍawaḅit ll-idariyyin",
        "revdelete-unrestricted": "ḫyyd ḍ-ḍawaḅit ll-idariyyin",
-       "rightsnone": "(walo)"
+       "rightsnone": "(walo)",
+       "revdelete-summary": "molkhass taadil"
 }
index 6f52b4a..781f216 100644 (file)
        "searchrelated": "مرتبطه",
        "searchall": "الكل",
        "showingresults": "القائمة دى بتعرض {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} من أول  رقم '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|النتيجه '''$1''' من'''$3'''|النتايج '''$1 - $2''' من'''$3'''}} ل'''$4'''",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "powersearch-legend": "تدوير متقدم",
        "powersearch-ns": "تدوير فى اسم المساحه:",
        "suppress": "أوفرسايت",
        "booksources": "مصادر من كتب",
        "booksources-search-legend": "التدوير على مصادر الكتب",
-       "booksources-go": "روح",
        "booksources-text": "فى تحت لستة بوصلات لمواقع تانية بتبيع الكتب الجديدة والمستعملة، كمان ممكن تلاقى معلومات إضافية عن الكتب اللى يتدور عليها :",
        "booksources-invalid-isbn": "رقم الـ ISBN اللى كتبته شكله مش صحيح؛ اتإكد من الغلطات بتاعة النسخ من المصدر الاصلى.",
        "specialloguserlabel": "اليوزر:",
        "wlheader-enotif": "*خاصية الاعلام بالايميل متفعلة",
        "wlheader-showupdated": "الصفحات اللى اتغيرت  بعد زيارتك ليها اخر مرة معروضة بالخط '''العريض'''",
        "wlnote": "تحت فى {{PLURAL:$1|آخر تغيير|آخر '''$1''' تغيير}} فى آخر {{PLURAL:$2|ساعه|'''$2''' ساعه}}، من الوقت $3، $4.",
-       "wlshowlast": "عرض اخر $1 ساعات $2 ايام $3",
+       "wlshowlast": "عرض اخر $1 ساعات $2 ايام",
        "watchlist-options": "اختيارات قايمة المراقبة",
        "watching": "بيراقب...",
        "unwatching": "بيبطل مراقبه...",
        "import": "استيراد صفحات",
        "importinterwiki": "استيراد ترانسويكي",
        "import-interwiki-text": "اختار الويكى و عنوان الصفحة اللى عاوز تستوردها.\nتواريخ التعديلات و اسامى المحررين  ح يتحافظ عليها.\nكل عمليات الاستيراد للترانسويكى بتتسجل فى [[Special:Log/import|سجل الاستيراد]].",
-       "import-interwiki-source": "مصدر ويكي/صفحه:",
        "import-interwiki-history": "انسخ كل نسخ التاريخ للصفحة دي",
        "import-interwiki-templates": "اشمل كل القوالب",
        "import-interwiki-submit": "استيراد",
        "exif-gpsspeed-n": "عقد",
        "exif-gpsdirection-t": "الاتجاه الحقيقي",
        "exif-gpsdirection-m": "الاتجاه المغناطيسي",
-       "watchlistall2": "الكل",
        "namespacesall": "الكل",
        "monthsall": "الكل",
        "confirmemail": "اعمل تأكيد للأيميل بتاعك",
        "revdelete-restricted": "طبق التعليمات على السيسوبات",
        "revdelete-unrestricted": "شيل الضوابط من على السيسوبات",
        "rightsnone": "(فاضى)",
+       "revdelete-summary": "ملخص التعديل",
        "searchsuggest-search": "تدوير",
        "searchsuggest-containing": "جوّاه...",
        "expandtemplates": "تكبير القوالب",
index 4c63928..ae3f3cf 100644 (file)
@@ -29,7 +29,7 @@
        "tog-editsectiononrightclick": "অনুচ্ছেদৰ শিৰোনামাত ৰাইট্‌ ক্লিক টিপি সম্পাদনা কৰাটো সক্ৰিয় কৰক",
        "tog-watchcreations": "মই সৃষ্টি সকলো পৃষ্ঠা মোৰ লক্ষ্য-তালিকাত যোগ কৰক",
        "tog-watchdefault": "মই সম্পাদনা কৰা সকলো পৃষ্ঠা মোৰ লক্ষ্য-তালিকাত যোগ কৰক",
-       "tog-watchmoves": "মই স্থানান্তৰ কৰা সকলো পৃষ্ঠা মোৰ লক্ষ্য-তালিকাত যোগ কৰক",
+       "tog-watchmoves": "মà¦\87 à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰা à¦¸à¦\95লà§\8b à¦ªà§\83ষà§\8dঠা à¦\86ৰà§\81 à¦«à¦¾à¦\87ল à¦®à§\8bৰ à¦²à¦\95à§\8dষà§\8dয-তালিà¦\95াত à¦¯à§\8bà¦\97 à¦\95ৰà¦\95",
        "tog-watchdeletion": "মই বিলোপ কৰা সকলো পৃষ্ঠা মোৰ লক্ষ্য-তালিকাত যোগ কৰক",
        "tog-minordefault": "সকলো সম্পাদনা অগুৰুত্বপূৰ্ণ বুলি নিজে নিজে চিহ্নিত কৰক",
        "tog-previewontop": "সম্পাদনা বাকছৰ ওপৰত খচৰা দেখুৱাওক",
        "hidetoc": "দেখুৱাব নালাগে",
        "collapsible-collapse": "সংকোচন",
        "collapsible-expand": "বহলাওক",
+       "confirmable-yes": "হয়",
+       "confirmable-no": "নহয়",
        "thisisdeleted": "$1 চাওক বা সলনি কৰক?",
        "viewdeleted": "$1 চাওক?",
        "restorelink": "{{PLURAL:$1| এটা বিলুপ্ত সম্পাদনা|$1 টা বিলুপ্ত সম্পাদনা}}",
        "invalidtitle-knownnamespace": "নামস্থান \"$2\" আৰু পাঠ্য \"$3\" থকা অবৈধ শিৰোনাম",
        "invalidtitle-unknownnamespace": "অজ্ঞাত নামস্থান সংখ্যা $1 আৰু পাঠ্য \"$2\" থকা অবৈধ শিৰোনাম",
        "exception-nologin": "প্ৰৱেশ কৰা নাই",
-       "exception-nologin-text": "এই কামৰ বাবে আপুনি [[Special:Userlogin|লগ্‌ ইন]] কৰাটো বাধ্যতামূলক।",
+       "exception-nologin-text": "এই কামৰ বাবে আপুনি লগ্‌ ইন কৰাটো বাধ্যতামূলক।",
        "exception-nologin-text-manual": "এই কামৰ বাবে অনুগ্ৰহ কৰি $1 কৰক।",
        "virus-badscanner": "ভুল কনফিগাৰেচন: অজ্ঞাত ভাইৰাছ স্কেনাৰ: ''$1''",
        "virus-scanfailed": "স্কেন অসফল (কোড $1)",
        "noemail": "\"$1\" সদস্যজনৰ কোনো ই-মেইল ঠিকনা সঞ্চিত কৰা নাই।",
        "noemailcreate": "আপুনি এটা সঠিক ই-মেইল ঠিকনা দিব লাগিব",
        "passwordsent": "\"$1\" ৰ ই-মেইল ঠিকনাত নতুন গুপ্তশব্দ এটা পঠোৱা হৈছে। অনুগ্ৰহ কৰি সেয়া পোৱাৰ পাছত পুনৰ প্ৰৱেশ কৰক।",
-       "blocked-mailpassword": "à¦\86পà§\8bনাৰ à¦\86à¦\87পি à¦ à¦¿à¦\95নাৰ à¦ªà§°à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95ৰা à¦¬à¦¾à§°à¦£ à¦\95ৰা à¦¹à§\88à¦\9bà§\87, à¦\8fনà§\87 à¦\85ৱসà§\8dথাত à¦¦à§\81ৰà§\8dবà§\8dযৱহাৰ à§°à§\8bধ à¦\95ৰিবলà§\88 à¦\97à§\81পà§\8dতশবà§\8dদ à¦ªà§\81নà¦\83à¦\89দà§\8dধাৰ à¦\95ৰা à¦¸à§\81বিধাতà§\8b বাতিল কৰা হৈছে।",
+       "blocked-mailpassword": "à¦\86পà§\8bনাৰ à¦\86à¦\87পি à¦ à¦¿à¦\95নাৰ à¦ªà§°à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95ৰা à¦¬à¦¾à§°à¦£ à¦\95ৰা à¦¹à§\88à¦\9bà§\87, à¦\8fনà§\87 à¦\85ৱসà§\8dথাত à¦¦à§\81ৰà§\8dবà§\8dযৱহাৰ à§°à§\8bধ à¦\95ৰিবলà§\88 à¦\97à§\81পà§\8dতশবà§\8dদ à¦ªà§\81নà¦\83à¦\89দà§\8dধাৰ à¦\95ৰা à¦¸à§\81বিধাà¦\93 বাতিল কৰা হৈছে।",
        "eauthentsent": "সঞ্চিত ই-মেইল ঠিকনালৈ নিশ্চিতকৰণ ই-মেইল এখন পঠিওৱা হৈছে।\nএকাউণ্টটোলৈ আন ই-মেইল পঠিওৱাৰ আগতে আপোনাৰ সদস্যতা নিশ্চিত কৰিবলৈ সেই ই-মেইলত দিয়া নিৰ্দেশনা আপুনি অনু্সৰণ কৰিব লাগিব।",
        "throttled-mailpassword": "যোৱা {{PLURAL:$1|এঘণ্টাত|$1 ঘণ্টাত}} এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হৈছে।\nঅবৈধ ব্যৱহাৰ ৰোধ কৰিবলৈ প্ৰতি {{PLURAL:$1|এঘণ্টাত|$1 ঘণ্টাত}} এবাৰহে গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হ'ব।",
        "mailerror": "ই-মেইল পঠিওৱাত সমস্যা হৈছে: $1",
        "login-throttled": "আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে ।\nঅনুগ্ৰহ কৰি $1 সময়ৰ পিছত আকৌ চেষ্টা কৰক ।",
        "login-abort-generic": "আপোনাৰ প্ৰৱেশ অসফল হৈছে- বাতিল কৰা হ’ল",
        "loginlanguagelabel": "ভাষা: $1",
-       "suspicious-userlogout": "আপোনাৰ প্ৰস্থানৰ অনুৰোধ বাতিল কৰা হৈছে কাৰণ হয়তো আপোনাৰ ব্ৰাউজাৰ অসম্পূৰ্ণ নতুবা পূৰ্বৱতী তথ্য পঠাইছে ।",
+       "suspicious-userlogout": "à¦\86পà§\8bনাৰ à¦ªà§\8dৰসà§\8dথানৰ à¦\85নà§\81ৰà§\8bধ à¦¬à¦¾à¦¤à¦¿à¦² à¦\95ৰা à¦¹à§\88à¦\9bà§\87 à¦\95াৰণ à¦¹à¦¯à¦¼à¦¤à§\8b à¦\86পà§\8bনাৰ à¦¬à§\8dৰাà¦\89à¦\9cাৰ à¦\85সমà§\8dপà§\82ৰà§\8dণ à¦¨à¦¤à§\81বা à¦ªà§\82ৰà§\8dবৱতà§\80 à¦¤à¦¥à§\8dয à¦ªà¦ à¦¿à¦¯à¦¼à¦¾à¦\87à¦\9bà§\87 à¥¤",
        "createacct-another-realname-tip": "প্ৰকৃত নাম দিয়াটো বৈকল্পিক।\nআপুনি নামটো দিলে সেইটো আপোনাৰ বৰঙণিসমূহৰ বাবে স্বীকৃতি প্ৰদানত ব্যৱহাৰ কৰা হ'ব।",
        "pt-login": "প্ৰৱেশ",
        "pt-login-button": "প্ৰৱেশ",
        "passwordreset-emailsent-capture": "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হৈছে, এইখন তলত দেখা পাব।",
        "passwordreset-emailerror-capture": "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল সৃষ্টি কৰা হ'ল, কিন্তু {{GENDER:$2|সদস্যজনলৈ}} পঠিয়াব পৰা নগ'ল। সেইখন তলত দেখুওৱা হৈছে: $1",
        "changeemail": "ই-মেইল ঠিকনা সলনি কৰক",
-       "changeemail-header": "একাউণ্টৰ ই-মেইল ঠিকনা সলনি কৰক",
        "changeemail-text": "আপোনাৰ ই-মেইল ঠিকনা সলাবলৈ এই প্ৰপত্ৰখন পূৰাওক । এই সালসলনি নিশ্চিত কৰিবলৈ আপোনাৰ গুপ্তশব্দ দিব লাগিব ।",
        "changeemail-no-info": "এই পৃষ্ঠাটোত প্ৰৱেশাধিকাৰ পাবলৈ আপুনি লগ্‌ ইন কৰিব লাগিব।",
        "changeemail-oldemail": "বৰ্তমানৰ ই-মেইল ঠিকনা:",
        "changeemail-none": "(নাই)",
        "changeemail-password": "আপোনাৰ  {{SITENAME}} গুপ্তশব্দ:",
        "changeemail-submit": "ই-মেইল ঠিকনা সলনি কৰক",
-       "changeemail-cancel": "বাতিল কৰক",
        "changeemail-throttled": "আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে।\nঅনুগ্ৰহ কৰি $1 সময়ৰ পিছত আকৌ চেষ্টা কৰক।",
        "resettokens": "ট'কেন ৰিছে'ট কৰক",
        "resettokens-text": "আপোনাৰ একাউণ্টৰ সৈতে জড়িত কিছুমান ব্যক্তিগত তথ্য চাবলৈ আপুনি ট'কেন ৰিছে'ট কৰিব পাৰে।\n\nআপুনি দুৰ্ঘটনাবশতঃ আন কাৰোবাক সেই ট'কেন দিলে বা আপোনাৰ একাউণ্টৰ বিসংগতি হ'লে আপুনি এনে কৰাটো উচিত।",
        "preview": "খচৰা",
        "showpreview": "খচৰা চাওক",
        "showdiff": "সালসলনিবোৰ দেখুৱাওক",
+       "blankarticle": "<strong>Warning:</strong>আপুনি সৃষ্টি কৰি থকা পৃষ্ঠাটো খালি।\nযদি আপুনি \"{{int:savearticle}}\" বুটামটোত আকৌ ক্লিক কৰে তেন্তে বিষয়বস্তু অবিহনেই পৃষ্ঠাটো সৃষ্টি হ'ব।",
        "anoneditwarning": "<span style=\"color:red;\">'''সাৱধান:''' আপুনি প্ৰৱেশ কৰা নাই ।</span> \nএই পৃষ্ঠাৰ ইতিহাসত আপোনাৰ আই পি ঠিকনা সংৰক্ষিত কৰা হ'ব।",
        "anonpreviewwarning": "''আপুনি প্ৰৱেশ কৰা নাই। আপোনাৰ সম্পাদনা সাঁচিলে আপোনাৰ আই-পি ঠিকনা এই পৃষ্ঠাৰ ইতিহাসত সংৰক্ষিত হ'ব।\"",
        "missingsummary": "'''স্মাৰক:''' আপুনি সম্পাদনা সাৰাংশ দিয়া নাই।\nআপুনি আৰু এবাৰ সংৰক্ষণৰ বাবে ক্লিক কৰিলে সাৰাংশৰ অবিহনে সংৰক্ষিত হব।",
        "summary-preview": "সাৰাংশৰ খচৰা:",
        "subject-preview": "বিষয়/শিৰোনামাৰ খচৰা:",
        "blockedtitle": "সদস্যজনক অৱৰোধ কৰা হৈছে",
-       "blockedtext": "'''আপোনাৰ সদস্যনাম অথবা আই-পি ঠিকনা অৱৰোধ কৰা হৈছে ।'''\n\n$1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।\nইয়াৰ বাবে দিয়া কাৰণ হৈছে ''$2'' ।\n\n* অৱৰোধ আৰম্ভণি: $8\n* অৱৰোধ সমাপ্তি: $6\n* অৱৰোধ কৰা হৈছে: $7\n\nআপুনি এই অৱৰোধৰ বিষয়ে আলোচনা কৰিবলৈ $1 বা [[{{MediaWiki:Grouppage-sysop}}|প্ৰবন্ধকৰ]] লগত সম্পৰ্ক স্থাপন কৰিব পাৰে ।\nআপুনি যেতিয়ালৈ [[Special:Preferences|সদস্য পছন্দ]] পৃষ্ঠাত আপোনাৰ ই-মেইল ঠিকনা নিদিয়ে তেতিয়ালৈ ’সদস্যক ই-মেইল পঠাওক’ সুবিধাতো ব্যৱহাৰ কৰিব নোৱাৰিব, আৰু আপোনাক এয়া কৰিবলৈ ৰোধ কৰা হোৱা নাই ।\nআপোনাৰ এতিয়াৰ আই-পি ঠিকনা হল $3, আৰু আপোনাৰ অবৰোধ ক্ৰমিক হৈছে #$5 ।\nএই বিষয়ে হোৱা আলোচনাত ইয়াৰ সবিশেষ সদৰী কৰে যেন।",
+       "blockedtext": "'''আপোনাৰ সদস্যনাম অথবা আই-পি ঠিকনা অৱৰোধ কৰা হৈছে।'''\n\n$1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।\nইয়াৰ বাবে দিয়া কাৰণ হৈছে ''$2'' ।\n\n* অৱৰোধ আৰম্ভণি: $8\n* অৱৰোধ সমাপ্তি: $6\n* অৱৰোধ কৰা হৈছে: $7\n\nআপুনি এই অৱৰোধৰ বিষয়ে আলোচনা কৰিবলৈ $1 বা [[{{MediaWiki:Grouppage-sysop}}|প্ৰশাসকৰ]] লগত সম্পৰ্ক স্থাপন কৰিব পাৰে ।\nআপুনি যেতিয়ালৈ [[Special:Preferences|সদস্য পছন্দ]] পৃষ্ঠাত আপোনাৰ ই-মেইল ঠিকনা নিদিয়ে তেতিয়ালৈ ’সদস্যক ই-মেইল পঠিয়াওক’ সুবিধাতো ব্যৱহাৰ কৰিব নোৱাৰিব, আৰু আপোনাক এয়া কৰিবলৈ ৰোধ কৰা হোৱা নাই ।\nআপোনাৰ এতিয়াৰ আই-পি ঠিকনা হল $3, আৰু আপোনাৰ অৱৰোধ ক্ৰমিক হৈছে #$5 ।\nএই বিষয়ে হোৱা আলোচনাত ইয়াৰ সবিশেষ সদৰী কৰে যেন।",
        "autoblockedtext": "আপোনাৰ আই-পি ঠিকনা নিজে নিজে অৱৰোধিত হৈছে, কাৰণ ইয়াক কোনোবাই ব্যৱহাৰ কৰি থাকোতে $1ৰ দ্বাৰা অৱৰোধ কৰা হৈছে।\nইয়াৰ বাবে দিয়া কাৰণ হৈছে:\n\n:''$2''\n\n* অৱৰোধ আৰম্ভণি:  $8\n* অৱৰোধ সমাপ্তি: $6\n* অৱৰোধ কৰা হৈছে: $7\n\nআপুনি এই অবৰোধৰ বিষয়ে আলোচনা কৰিবলৈ $1 বা [[{{MediaWiki:Grouppage-sysop}}|প্ৰশাসক]]ৰ লগত সম্পৰ্ক স্থাপন কৰিব পাৰে ।\n\nআপুনি যেতিয়ালৈ [[Special:Preferences|সদস্য পছন্দ]] পৃষ্ঠাত আপোনাৰ ই-মেইল ঠিকনা নিদিয়ে তেতিয়ালৈ ’সদস্যক ই-মেইল পঠাওক’ সুবিধাতো ব্যৱহাৰ কৰিব নোৱাৰে। আপোনাক এয়া কৰিবলৈ ৰোধ কৰা হোৱা নাই ।\nআপোনাৰ এতিয়াৰ আই পি ঠিকনা হৈছে $3, আৰু আপোনাৰ অৱৰোধ ক্ৰমিক হৈছে $5 ।\nএই বিষয়ে হোৱা আলোচনাত ইয়াক ব্যৱহাৰ কৰিবলৈ অনুৰোধ কৰা হ’ল।",
        "blockednoreason": "কাৰণ দিয়া নাই",
        "whitelistedittext": "সম্পাদনা কৰিবলৈ $1 কৰক ।",
        "missing-revision": "\"{{FULLPAGENAME}}\" নামৰ পৃষ্ঠাৰ #$1 সংশোধনৰ অস্তিত্ব নাই।\n\nসাধাৰণতে বিলোপ কৰা এখন পৃষ্ঠাৰ পুৰণা ইতিহাস লিংক অনুসৰণ কৰিলে এনে হয়।\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} বিলোপন ল'গ]ত অধিক তথ্য পাব।",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" নামৰ সদস্য একাউন্ট নিবন্ধিত নহয় ।\nঅনুগ্ৰহ কৰি চাওক আপুনি এই পৃষ্ঠা সৃষ্টি/সম্পাদনা কৰিব বিচাৰিছে নেকি ।",
        "userpage-userdoesnotexist-view": "সদস্য একাউন্ট ''$1'' পঞ্জীভূত নহয়",
-       "blocked-notice-logextract": "বৰ্তমানে এই সদস্যক বাৰণ কৰা হৈছে ।\nপ্ৰসংগক্ৰমে সাম্প্ৰতিক বাৰণ সূচী তলত দিয়া হ'ল ।",
+       "blocked-notice-logextract": "বৰ্তমানে এই সদস্যক বাৰণ কৰা হৈছে।\nআপোনাৰ সুবিধাৰ্থে সাম্প্ৰতিক বাৰণ সূচী তলত দিয়া হ'ল ।",
        "clearyourcache": "'''টোকা:''' সাঁচি ৰখাৰ পিছত পৰিৱৰ্তনখিনি চাবৰ বাবে আপুনি আপোনাৰ ব্ৰাউজাৰৰ কেচ্‌ (cache) অগ্ৰাহ্য কৰিব লগা হ’ব পাৰে।\n* '''Firefox / Safari: ''' ''Shift'' ধৰি ৰাখি ''Reload'' ক্লিক কৰক, নাইবা ''Ctrl-F5'' বা ''Ctrl-R'' টিপক (এপল মেকৰ বাবে ''⌘-R'')\n* '''Google Chrome:''' ''Ctrl-Shift-R'' টিপক (এপল মেকৰ বাবে ''⌘-Shift-R'' )\n* '''Internet Explorer:''' ''Ctrl'' ধৰি ৰাখি ''Refresh'' ক্লিক কৰক, অথবা ''Ctrl-F5'' টিপক\n* '''Opera:''' ''Tools→Preferences'' ত গৈ কেচ্‌ মচি পেলাওক",
        "usercssyoucanpreview": "'''পৰামৰ্শ:''' \"{{int:showpreview}}\" বুটাম ব্যৱহাৰ কৰি সাঁচি ৰখাৰ আগতে আপোনাৰ নতুন CSS পৰীক্ষা কৰক ।",
        "userjsyoucanpreview": "'''পৰামৰ্শ:''' \"{{int:showpreview}}\" বুটাম ব্যৱহাৰ কৰি সাঁচি ৰখাৰ আগতে আপোনাৰ নতুন জাভালিপি পৰীক্ষা কৰক ।",
        "permissionserrorstext": "আপোনাৰ এই কামটো কৰিবলৈ অনুমতি নাই, যাৰ {{PLURAL:$1|কাৰণ|কাৰণসমূহ}} হ'ল:",
        "permissionserrorstext-withaction": "আপোনাৰ $2 কৰিবলৈ অনুমতি নাই, যাৰ {{PLURAL:$1|কাৰণ|কাৰণসমূহ}} হ'ল:",
        "recreate-moveddeleted-warn": "'''সাৱধান: আগতে বিলোপ কৰা পৃষ্ঠা এটা আপুনি পুনঃনিৰ্মাণ কৰি আছে। '''\n\nএই পৃষ্ঠাটো সম্পাদনা কৰা উচিত হব নে নহয় আপুনি বিবেচনা কৰি চাওক।\nএই পৃষ্ঠাটো বিলোপ আৰু স্থানান্তৰ কৰাৰ অভিলেখ আপোনাৰ সুবিধাৰ্থে ইয়াত দিয়া হৈছে।",
-       "moveddeleted-notice": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠা à¦¬à¦¾à¦¤à¦¿à¦² à¦\95ৰা à¦¹à§\88à¦\9bà§\87 à¥¤\nপà§\83ষà§\8dঠাà¦\9fিৰ à¦¬à¦¾à¦¤à¦¿à¦² à¦\86ৰà§\81 à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰা à¦\85ভিলà§\87à¦\96 à¦¤à¦²à¦¤ à¦¦à¦¿à¦¯à¦¼à¦¾ à¦¹'ল ।",
+       "moveddeleted-notice": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠা à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা à¦¹à§\88à¦\9bà§\87।\nপà§\83ষà§\8dঠাৰ à¦¬à¦¿à¦²à§\8bপ à¦\86ৰà§\81 à¦¸à§\8dথানানà§\8dতৰণ à¦\85ভিলà§\87à¦\96 à¦¤à¦²à¦¤ à¦¦à¦¿à¦¯à¦¼à¦¾ à¦¹'ল।",
        "log-fulllog": "সম্পূৰ্ণ অভিলেখ চাওক",
        "edit-hook-aborted": "হুকৰ দ্বাৰা সম্পাদনা প্ৰত্যাখ্যান কৰা হৈছে।\nইয়াৰ কোনো ব্যাখ্যা নাই।",
-       "edit-gone-missing": "পà§\83ষà§\8dঠাà¦\9fà§\8b à¦¨à¦¬à§\80à¦\95ৰণ à¦\95ৰিব à¦ªà§°à¦¾ à¦¨à¦\97â\80\99ল।\nসমà§\8dভৱতà¦\83 à¦ªà§\83ষà§\8dঠাà¦\96ন বিলোপ কৰা হৈছে।",
+       "edit-gone-missing": "পà§\83ষà§\8dঠাà¦\9fà§\8b à¦¨à¦¬à§\80à¦\95ৰণ à¦\95ৰিব à¦ªà§°à¦¾ à¦¨à¦\97â\80\99ল।\nসমà§\8dভৱতà¦\83 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b বিলোপ কৰা হৈছে।",
        "edit-conflict": "সম্পাদনা দ্বন্দ্ব।",
        "edit-no-change": "আপোনাৰ সম্পাদনা আওকাণ কৰা হৈছে, কাৰণ লেখাত কোনো তফাৎ নাই।",
        "postedit-confirmation-created": "পৃষ্ঠাটো সৃষ্টি কৰা হৈছে।",
        "parser-template-recursion-depth-warning": "সাঁচৰ পুনৰাবৃত্তি গভীৰতা সীমা ($1) তকৈ অধিক হৈছে",
        "language-converter-depth-warning": "ভাষা পৰিৱৰ্তকৰ গভীৰতা সীমাই ($1) অতিক্ৰম কৰিছে",
        "node-count-exceeded-category": "ন'ড-গণনা বেছি হোৱা পৃষ্ঠাসমূহ",
-       "node-count-exceeded-warning": "পৃষ্ঠাৰ ন'ড-গণনা বেছি হৈছে",
+       "node-count-exceeded-category-desc": "এই পৃষ্ঠাই সৰ্বোচ্চ ন'ড কাউণ্ট সীমা অতিক্ৰম কৰিছে।",
+       "node-count-exceeded-warning": "পৃষ্ঠাৰ ন'ড গণনা বেছি হৈছে",
        "expansion-depth-exceeded-category": "বিস্তৃতি গভীৰতা বেছি হোৱা পৃষ্ঠা",
        "expansion-depth-exceeded-warning": "পৃষ্ঠাটোৰ বিস্তৃতি গভীৰতা বেছি হৈছে",
        "parser-unstrip-loop-warning": "আন্‌ষ্ট্ৰীপ লুপ চিনাক্ত কৰা হৈছে",
        "converter-manual-rule-error": "মেনুৱেল ভাষা পৰিৱৰ্তন নিয়মত ত্ৰুটি পোৱা গৈছে",
        "undo-success": "এই সম্পাদনা পূৰ্ববৎ কৰিব পাৰি ।\nঅনুগ্ৰহ কৰি তলৰ তুলনাটি পৰীক্ষা কৰি ঠাৱৰ কৰক যে আপুনি এনে কৰিব বিচাৰিছে, আৰু তলত সালসলনিসমূহ সাঁচি এই কাৰ্য্য সম্পন্ন কৰক ।",
        "undo-failure": "এই সম্পাদনা মধ্যৱৰ্তী সম্পাদনাসমূহৰ দ্বন্দৰ কাৰণে পূৰ্ববৎ কৰা নহ'ব ।",
-       "undo-norev": "à¦\8fà¦\87 à¦¸à¦®à§\8dপাদনাà¦\9fি à§°à¦¦ à¦\95ৰিব à¦¨à§\8bৱাৰি, à¦\95াৰণ à¦\87 à¦\86ৰà§\81 à¦¨à¦¾à¦\87 à¦¬à¦¾ à¦\87য়াà¦\95 à¦¬à¦¾à¦¤à¦¿à¦² à¦\95ৰা à¦¹'ল ।",
+       "undo-norev": "à¦\8fà¦\87 à¦¸à¦®à§\8dপাদনাà¦\9fà§\8b à§°à¦¦ à¦\95ৰিব à¦¨à§\8bৱাৰি, à¦\95াৰণ à¦\8fà¦\87à¦\9fà§\8b à¦\86ৰà§\81 à¦¨à¦¾à¦\87 à¦¬à¦¾ à¦\87য়াà¦\95 à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা à¦¹'ল।",
        "undo-nochange": "সম্পাদনাটো ইতিমধ্যেই বাতিল কৰা হৈছে।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলোচনা]]) সম্পাদিত $1 সংশোধনটি বাতিল কৰক",
        "undo-summary-username-hidden": "এজন গোপন ব্যৱহাৰকাৰীয়ে কৰা $1 সংশোধন বাতিল কৰক",
        "rev-deleted-user-contribs": "[সদস্যনাম বা আই-পি ঠিকনা আঁতৰোৱা হ'ল - সম্পাদনা বৰঙনিসমূহৰ পৰা আঁৰ কৰা হৈছে]",
        "rev-deleted-text-permission": "পৃষ্ঠাৰ এই সংশোধনটি '''বিলোপ''' কৰা হ'ল ।\nসবিশেষ পাব [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অবলুপ্তি অভিলেখত]",
        "rev-deleted-text-unhide": "পৃষ্ঠাখনৰ এই সংশোধনটো '''বিলোপ''' কৰা হৈছে | \nসবিশেষ পাব [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অৱলুপ্তি অভিলেখত]।\nআপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে]।",
-       "rev-suppressed-text-unhide": "পà§\83ষà§\8dঠাà¦\96নৰ এই সংশোধনটো '''নিবাৰণ''' কৰা হৈছে ।\nসবিশেষ পাব [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} নিবাৰণ অভিলেখত]।\nআপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে]।",
+       "rev-suppressed-text-unhide": "পà§\83ষà§\8dঠাà¦\9fà§\8bৰ এই সংশোধনটো '''নিবাৰণ''' কৰা হৈছে ।\nসবিশেষ পাব [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} নিবাৰণ অভিলেখত]।\nআপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে]।",
        "rev-deleted-text-view": "পৃষ্ঠাৰ এই সংশোধনটো '''বিলোপ''' কৰা হ'ল ।\nআপুনি এইটো চাব পাৰে; সবিশেষ পাব [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অবলুপ্তি অভিলেখত]।",
        "rev-suppressed-text-view": "পৃষ্ঠাৰ এই সংশোধনটো '''নিবাৰণ''' কৰা হ’ল।\nআপুনি এইটো চাব পাৰে; সবিশেষ পাব [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} নিবাৰণ অভিলেখত]।",
        "rev-deleted-no-diff": "আপুনি এই পাৰ্থক্য চাব নোৱাৰে কাৰণ এটা সংস্কৰণ '''বিলোপ''' কৰা হৈছে ।\nসবিশেষ পাব [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অৱলুপ্তি অভিলেখত]।",
        "searchrelated": "সম্পৰ্কিত",
        "searchall": "সকলো",
        "showingresults": "তলত #'''$2'''ৰ পৰা {{PLURAL:$1|'''1''' ফলাফল|'''$1''' ফলাফল}} দেখুওৱা হৈছে।",
-       "showingresultsheader": "'''$4'''ৰ বাবে {{PLURAL:$5|'''$3''' ৰ '''$1''' ফলাফল| '''$3''' ৰ '''$1 - $2''' ফলাফলসমূহ}}",
        "search-nonefound": "এই অনুসন্ধানৰ কোনো ফলাফল নাই ।",
        "powersearch-legend": "শক্তিশালী সন্ধান",
        "powersearch-ns": "নামস্থানবোৰত সন্ধান:",
        "action-patrol": "আনৰ সম্পাদনা পৰীক্ষিত বুলি চিহ্নিত কৰক",
        "action-autopatrol": "আপোনাৰ সম্পাদনা পৰীক্ষিত বুলি চিহ্নিত কৰক",
        "action-unwatchedpages": "নিৰীক্ষণ নকৰা পৃষ্ঠাসমূহৰ তালিকা চাওক",
-       "action-mergehistory": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96নৰ ইতিহাস একত্ৰিত কৰক",
+       "action-mergehistory": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8bৰ ইতিহাস একত্ৰিত কৰক",
        "action-userrights": "সকলো সদস্য অধিকাৰ সম্পাদনা কৰক",
        "action-userrights-interwiki": "আন ৱিকিৰ সদস্যৰ অধিকাৰসমূহ সম্পাদনা কৰক",
        "action-siteadmin": "তথ্যকোষ বন্ধ কৰক বা খোলক",
        "license": "অনুজ্ঞাপত্ৰ:",
        "license-header": "অনুজ্ঞাপত্ৰ",
        "nolicense": "একো বাছনি কৰা নাই",
+       "licenses-edit": "অনুজ্ঞাপত্ৰ বিকল্পসমূহ সম্পাদনা কৰক",
        "license-nopreview": "(প্ৰাকদৰ্শন উপলব্ধ নহয়)",
        "upload_source_url": "(এটা বৈধ, ৰাজহুৱাকৈ উন্মুক্ত URL)",
        "upload_source_file": "(আপোনাৰ কম্পিউটাৰৰ এটা ফাইল)",
        "download": "ডাউনল’ড কৰক",
        "unwatchedpages": "চকু নৰখা পৃষ্ঠাসমূহ",
        "listredirects": "পুননিৰ্দেশনাৰ তালিকা",
+       "listduplicatedfiles": "প্ৰতিলিপি থকা ফাইলসমূহৰ তালিকা",
+       "listduplicatedfiles-summary": "এই তালিকাখনত থকা ফাইলবোৰৰ শেহতীয়া সংস্কৰণ আন কোনো ফাইলৰ শেহতীয়া সংস্কৰণৰ প্ৰতিলিপি। কেৱল স্থানীয় ফাইলবোৰহে গণ্য কৰা হৈছে।",
        "unusedtemplates": "অব্যৱহৃত সাঁচসমূহ",
        "unusedtemplatestext": "অন্য কোনো পৃষ্ঠাত নথকা {{ns:template}} নামস্থানৰ সকলো পৃষ্ঠা ইয়াত পাব ।\nসাঁচসমূহ বিলোপ কৰাৰ আগতে সেইবোৰলৈ থকা সংযোগ পৰীক্ষা কৰক ।",
        "unusedtemplateswlh": "অন্য সংযোগসমূহ",
        "randomincategory": "শ্ৰেণীৰ যিকোনো পৃষ্ঠা",
        "randomincategory-invalidcategory": "\"$1\" বৈধ শ্ৰেণী নাম নহয়।",
        "randomincategory-nopages": "[[:Category:$1|$1]] শ্ৰেণীত কোনো পৃষ্ঠা নাই।",
-       "randomincategory-selectcategory": "এই শ্ৰেণীৰ পৰা যিকোনো পৃষ্ঠা চাওক: $1 $2।",
-       "randomincategory-selectcategory-submit": "যাওক",
        "randomredirect": "অনিৰ্ধাৰিত পুননিৰ্দেশ",
        "randomredirect-nopages": "\"$1\" নামস্থানত কোনো পুননিৰ্দেশ নাই ।",
        "statistics": "পৰিসংখ্যা",
        "querypage-disabled": "কাৰ্য্যগত কাৰণত এই বিশেষ পৃষ্ঠাটো নিষ্ক্ৰিয় কৰা হৈছে।",
        "booksources": "গ্ৰন্থৰ উৎস সমূহ",
        "booksources-search-legend": "গ্ৰন্থ উৎস অনুসন্ধান",
-       "booksources-go": "যাওক",
        "booksources-text": "নতুন আৰু পুৰণি কিতাপ বেচা চাইটসমূহৰ সংযোগ তলত দিয়া হৈছে, তাত আপুনি বিচৰা কিতাপসমূহৰ বিষয়ে অধিক তথ্যও পাব পাৰে:",
        "booksources-invalid-isbn": "আপুনি দিয়া ISBN সম্ভৱতঃ অবৈধ; মূল উৎসৰ পৰা তুলি লওঁতে হ’ব পৰা ভুলৰ বাবে পৰীক্ষা কৰক ।",
        "specialloguserlabel": "প্ৰদৰ্শনকাৰী:",
        "wlheader-enotif": "ইমেইল জাননী সক্ৰিয় কৰা হৈছে।",
        "wlheader-showupdated": "আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত সলনি হোৱা পৃষ্ঠাসমূহ '''গাঢ়''' আখৰত দেখুওৱা হৈছে।",
        "wlnote": "তলত {{PLURAL:$1| হ'ল সৰ্বশেষ পৰিৱৰ্তন|হ'ল সৰ্বশেষ '''$1''' পৰিৱৰ্তনসমূহ}} সৰ্বশেষ {{PLURAL:$2|ঘন্টা|'''$2''' ঘন্টা}}, $3, $4 -ৰ হিচাপে।",
-       "wlshowlast": "যোৱা $1 ঘণ্টা $2 দিন $3 চাওক",
+       "wlshowlast": "যোৱা $1 ঘণ্টা $2 দিন  চাওক",
        "watchlist-options": "লক্ষ্য-তালিকা পছন্দসমূহ",
        "watching": "চকু দিয়া হৈছে.....",
        "unwatching": "আঁতৰোৱা হৈ আছে.....",
        "actioncomplete": "কাৰ্য সম্পূৰ্ণ",
        "actionfailed": "কাৰ্য বিফল হ'ল",
        "deletedtext": "\"$1\" ক বিলোপন কৰা হৈছে।\nসাম্প্ৰতিক বিলোপনসমূহৰ তালিকা চাবলৈ $2 চাওক।",
-       "dellogpage": "বাতিল কৰা সূচী",
+       "dellogpage": "বিলà§\8bপ কৰা সূচী",
        "dellogpagetext": "তলত সাম্প্ৰতিক বিলোপনৰ তালিকা দিয়া হ'ল ।",
-       "deletionlog": "বাতিল কৰা সূচী",
+       "deletionlog": "বিলà§\8bপ কৰা সূচী",
        "reverted": "পূৰ্ববৰ্তী সংস্কৰণলৈ উভতি যোৱা হ'ল",
        "deletecomment": "কাৰণ:",
        "deleteotherreason": "আন/অতিৰিক্ত কাৰণ:",
        "deletereasonotherlist": "আন কাৰণ:",
        "deletereason-dropdown": "* বিলোপনৰ সাধাৰণ কাৰণসমূহ\n** স্পাম\n** অসভ্যালি\n** কপিৰাইট উলঙ্ঘন\n** লেখকৰ অনুৰোধ\n** ভঙা পুনঃনিৰ্দেশনা",
        "delete-edit-reasonlist": "অপসাৰণ কৰা কাৰণ সম্পাদনা কৰক",
-       "delete-toobig": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96নৰ সম্পাদনা ইতিহাস অতি দীঘল, $1 {{PLURAL:$1|টা সংশোধনৰো|টা সংশোধনৰো}} বেছি ।\n{{SITENAME}}ৰ আকস্মিক ক্ষতি ৰোধ কৰিবলৈ এনে পৃষ্ঠাৰ ইতিহাস বিলোপ কৰাত সীমাবদ্ধতা আৰোপ কৰা হৈছে ।",
+       "delete-toobig": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8bৰ সম্পাদনা ইতিহাস অতি দীঘল, $1 {{PLURAL:$1|টা সংশোধনৰো|টা সংশোধনৰো}} বেছি ।\n{{SITENAME}}ৰ আকস্মিক ক্ষতি ৰোধ কৰিবলৈ এনে পৃষ্ঠাৰ ইতিহাস বিলোপ কৰাত সীমাবদ্ধতা আৰোপ কৰা হৈছে ।",
        "delete-warning-toobig": "এই পৃষ্ঠাখনৰ সম্পাদনা ইতিহাস অতি দীঘল, $1 {{PLURAL:$1|টা সংশোধনৰো|টা সংশোধনৰো}} বেছি ।\nইয়াক বিলোপ কৰিলে {{SITENAME}} ৰ তথ্যভঁৰালৰ কাৰ্য্যকাৰীতাত সমস্যা হ’ব পাৰে;\nসাৱধানেৰে আগ বাঢ়ক ।",
        "rollback": "সম্পাদনা পূৰ্ববৎ কৰক",
        "rollback_short": "পূৰ্ববৎ কৰক",
        "movetalk": "সংলগ্ন বাৰ্তা পৃষ্ঠা স্থানান্তৰ কৰক",
        "move-subpages": "উপ-পৃষ্ঠাসমূহ স্থানান্তৰ কৰক ($1লৈ)",
        "move-talk-subpages": "আলোচনা পৃষ্ঠাৰ উপ-পৃষ্ঠাসমূহ স্থানান্তৰ কৰক ($1-লৈ)",
-       "movepage-page-exists": "$1 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\87তিমধà§\8dযà§\87à¦\87 à¦\86à¦\9bà§\87 à¦\86ৰà§\81 à¦¤à¦¾à§° à¦\93পৰত à¦¸à§\8dবয়à¦\82à¦\95à§\8dৰিয়ভাৱà§\87 à¦²à¦¿à¦\96িব à¦¨à§\8bৱাৰি ।",
+       "movepage-page-exists": "$1 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦\87তিমধà§\8dযà§\87 à¦\86à¦\9bà§\87à¦\87 à¦\86ৰà§\81 à¦¤à¦¾à§° à¦\93পৰত à¦¸à§\8dবয়à¦\82à¦\95à§\8dৰিয়ভাৱà§\87 à¦²à¦¿à¦\96িব à¦¨à§\8bৱাৰি।",
        "movepage-page-moved": "$1 পৃষ্ঠাটো $2লৈ স্থানান্তৰ কৰা হ'ল।",
        "movepage-page-unmoved": "$1 পৃষ্ঠাটো $2লৈ স্থানান্তৰ কৰা সম্ভৱ নহয়",
        "movepage-max-pages": "সৰ্বোচ্চ $1 {{PLURAL:$1|পৃষ্ঠা|পৃষ্ঠা}} স্থানান্তৰ কৰা হৈছে আৰু ইয়াতকৈ অধিক স্বয়ংক্ৰিয়ভাৱে স্থানান্তৰ নহ’ব ।",
        "movelogpage": "স্থানান্তৰন অভিলেখ",
        "movelogpagetext": "সকলো পৃষ্ঠা স্থানান্তৰৰ এখন তালিকা তলত দিয়া হৈছে ।",
        "movesubpage": "{{PLURAL:$1|টা উপপৃষ্ঠা}}",
-       "movesubpagetext": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96নৰ à¦¤à¦²à¦¤ à¦¦à¦¿à¦¯à¦¼à¦¾ {{PLURAL:$1|à¦\9fা à¦\89পপà§\83ষà§\8dঠা}} à¦\86à¦\9bà§\87 ।",
+       "movesubpagetext": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8bৰ à¦¤à¦²à¦¤ à¦¦à¦¿à¦¯à¦¼à¦¾ {{PLURAL:$1|à¦\9fা à¦\89পপà§\83ষà§\8dঠা}} à¦\86à¦\9bà§\87।",
        "movenosubpage": "এই পৃষ্ঠাৰ কোনো উপপৃষ্ঠা নাই ।",
        "movereason": "কাৰণ:",
        "revertmove": "আগৰ অৱস্থালৈ ঘূৰি যাওক",
        "import": "পৃষ্ঠা আমদানি কৰক",
        "importinterwiki": "আন্তঃৱিকি আমদানি",
        "import-interwiki-text": "আমদানি কৰিবলৈ এটা ৱিকি বা পৃষ্ঠাৰ শিৰোনামা নিৰ্বাচন কৰক ।\nসংশোধনৰ তাৰিখ আৰু সম্পাদকৰ নাম সংৰক্ষণ কৰা হ'ব ।\nসকলো আন্তঃৱিকি আমদানি [[Special:Log/import|আমদানি অভিলেখ]]ত লিপিবদ্ধ আছে ।",
-       "import-interwiki-source": "উৎস ৱিকি/পৃষ্ঠা:",
+       "import-interwiki-sourcewiki": "উৎস ৱিকি:",
+       "import-interwiki-sourcepage": "উৎস পৃষ্ঠা:",
        "import-interwiki-history": "এই পৃষ্ঠাৰ সকলো সংশোধনৰ ইতিহাস প্ৰতিলিপি কৰক",
        "import-interwiki-templates": "সকলো সাঁচ অন্তৰ্ভুক্ত কৰক",
        "import-interwiki-submit": "আমদানি",
        "importbadinterwiki": "আন্ত:ৱিকি সংযোগ বেয়া",
        "importsuccess": "আমদানি সমাপ্ত !",
        "importnosources": "কোনো আন্তঃৱিকি আমদানি উৎসৰ সংজ্ঞা দিয়া হোৱা নাই আৰু প্ৰত্যক্ষ ইতিহাস আপল'ড নিষ্ক্ৰিয় কৰা হৈছে ।",
-       "importnofile": "কোনো আমদানি নথি আপল'ড কৰা হোৱা নাই ।",
+       "importnofile": "কোনো আমদানি নথি আপল'ড কৰা হোৱা নাই।",
        "importuploaderrorsize": "আমদানি নথিৰ আপল'ড অসফল হৈছে ।\nঅনুমোদিত আপল'ড নথিতকৈ এই নথিৰ আকাৰ ডাঙৰ ।",
        "importuploaderrorpartial": "আমদানি নথিৰ আপল'ড অসফল হৈছে ।\nনথিখন কেৱল আংশিকভাৱে আপল'ড কৰা হৈছে ।",
        "importuploaderrortemp": "আমদানি নথিৰ আপল'ড বিফল হৈছে ।\nএটা অস্থায়ী ফ'ল্ডাৰ হেৰাইছে ।",
        "import-error-create": "\"$1\" পৃষ্ঠাটো আমদানি কৰা নহ'ল কাৰণ ইয়াক সৃষ্টি কৰিবলৈ আপোনাৰ অনুমতি নাই।",
        "import-error-interwiki": "\"$1\" পৃষ্ঠাটো আমদানি কৰা নহ'ল কাৰণ ইয়াৰ নামটো বাহিৰা সংযোগৰ (আন্তঃৱিকি) বাবে সংৰক্ষিত।",
        "import-error-special": "\"$1\" পৃষ্ঠাটো আমদানি কৰা নহ'ল কাৰণ ই পৃষ্ঠা অনুমোদন নকৰা এটা বিশেষ নামস্থানৰ অন্তৰ্গত।",
-       "import-error-invalid": "\"$1\" à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\86মদানি à¦\95ৰা à¦¨à¦¹'ল à¦\95াৰণ à¦\87য়াৰ à¦¨à¦¾à¦®à¦\9fà§\8b অবৈধ।",
+       "import-error-invalid": "\"$1\" à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦\86মদানি à¦\95ৰা à¦¨à¦¹'ল à¦\95াৰণ à¦¯à¦¿à¦\9fà§\8b à¦¨à¦¾à¦®à¦²à§\88 à¦\87য়াà¦\95 à¦\86মদানি à¦\95ৰিব à¦¬à¦¿à¦\9aৰা à¦¹à§\88à¦\9bিল à¦¸à§\87à¦\87à¦\9fà§\8b à¦\8fà¦\87 à§±à¦¿à¦\95িত অবৈধ।",
        "import-error-unserialize": " \"$1\" পৃষ্ঠাৰ $2 সংশোধনৰ ক্ৰম আঁতৰ কৰিব পৰা নগ'ল। এই সংশোধনে $4 ক্ৰমৰ সমল মডেল $3 ব্যৱহাৰ কৰা বুলি জনোৱা হৈছিল।",
        "import-options-wrong": "ভুল {{PLURAL:$2|বিকল্প|বিকল্পসমূহ}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "মূল পৃষ্ঠাৰ শিৰোনামা অবৈধ।",
        "tooltip-ca-protect": "এই পৃষ্ঠাটো সুৰক্ষিত কৰক",
        "tooltip-ca-unprotect": "এই পৃষ্ঠাৰ সুৰক্ষা সলনি কৰক",
        "tooltip-ca-delete": "এই পৃষ্ঠাটো বিলোপ কৰক",
-       "tooltip-ca-undelete": "বিলà§\8bপ à¦\95ৰাৰ à¦\86à¦\97à§\87য়à§\87 à¦\95ৰা à¦ªà§\83ষà§\8dঠাà¦\96নৰ à¦¸à¦¾à¦²à¦¸à¦²à¦¨à¦¿à¦¸à¦®à§\82হ à¦ªà§\81নà¦\83সংস্থাপন কৰক",
+       "tooltip-ca-undelete": "বিলà§\8bপ à¦\95ৰাৰ à¦\86à¦\97à§\87য়à§\87 à¦\95ৰা à¦ªà§\83ষà§\8dঠাà¦\9fà§\8bৰ à¦¸à¦¾à¦²à¦¸à¦²à¦¨à¦¿à¦¸à¦®à§\82হ à¦ªà§\81নৰà§\8dসংস্থাপন কৰক",
        "tooltip-ca-move": "এই পৃষ্ঠাটো স্থানান্তৰিত কৰক",
        "tooltip-ca-watch": "এই পৃষ্ঠাটো আপোনাৰ লক্ষ্য-তালিকাত যোগ কৰক",
        "tooltip-ca-unwatch": "এই পৃষ্ঠাটো আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰাওক",
        "tooltip-compareselectedversions": "এই পৃষ্ঠাত নিৰ্বাচিত দুটা সংশোধনৰ মাজত পাৰ্থক্য দেখুৱাওক",
        "tooltip-watch": "এই পৃষ্ঠাটো আপোনাৰ লক্ষ্য-তালিকাভুক্ত কৰক",
        "tooltip-watchlistedit-normal-submit": "শিৰোনামা আঁতৰাওক",
-       "tooltip-watchlistedit-raw-submit": "লক্ষ্য-তালিকা আপডেট কৰক",
+       "tooltip-watchlistedit-raw-submit": "লক্ষ্য-তালিকা আপডে'ট কৰক",
        "tooltip-recreate": "বিলোপ কৰা সত্বেও পৃষ্ঠাটো পুনৰ সৃষ্টি কৰক",
        "tooltip-upload": "আপল'ড আৰম্ভ কৰক",
        "tooltip-rollback": "\"পূৰ্ববত\" কৰিলে এটা ক্লিকত এই পৃষ্ঠাৰ শেষ অৱদানকাৰীৰ সম্পাদনা বাতিল কৰি ইয়াক পূৰ্বাৱস্থালৈ ঘূৰাই নিব।",
        "exif-urgency-low": "নিম্ন ($1)",
        "exif-urgency-high": "উচ্চ ($1)",
        "exif-urgency-other": "ব্যৱহাৰকাৰী-বিৱৰিত প্ৰাথমিকতা ($1)",
-       "watchlistall2": "সকলো",
        "namespacesall": "সকলোবোৰ",
        "monthsall": "সকলো",
        "confirmemail": "ই-মেইল ঠিকনা নিশ্চিত কৰক",
        "confirmemail_body": "কোনোবাই (সম্ভৱতঃ আপুনি) আই.পি. ঠিকনা $1ৰ পৰা এইটো ই-মেইল ঠিকনা ব্যৱহাৰ কৰি {{SITENAME}}ত\nএটা একাউণ্ট \"$2\" পঞ্জীয়ন কৰিছে ।\n\nএই একাউণ্ট আপোনাৰ হয়নে নহয় নিশ্চিত কৰাৰ বাবে আৰু {{SITENAME}}ত ই-মেইল বৈশিষ্টসমূহ সক্ৰিয় কৰাৰ বাবে\nআপোনাৰ ব্ৰাউজাৰত এই সংযোগটো খোলক:\n\n$3\n\nযদি আপুনি একাউণ্টটো পঞ্জীয়ন কৰা *নাই*, তেন্তে ই-মেইল ঠিকনা নিশ্চিতকৰণ বাতিলৰ বাবে\nএই সংযোগটো চাওক:\n\n$5\n\nএই নিশ্চিতকৰণ সংকেতৰ ম্যাদ $4ত উকলিব ।",
        "confirmemail_body_changed": "কোনোবাই (সম্ভৱতঃ আপুনি) আই.পি. ঠিকনা $1ৰ পৰা {{SITENAME}}ত\nএকাউণ্ট \"$2\"ৰ ই-মেইল ঠিকনা সলনি  কৰিছে ।\n\nএই একাউণ্ট আপোনাৰ হয়নে নহয় নিশ্চিত কৰাৰ বাবে আৰু {{SITENAME}}ত ই-মেইল বৈশিষ্টসমূহ পুনৰ সক্ৰিয় কৰাৰ বাবে\nআপোনাৰ ব্ৰাউজাৰত এই সংযোগটো খুলক:\n\n$3\n\nযদি একাউণ্টটো আপোনাৰ *নহয়*, তেন্তে ই-মেইল ঠিকনা নিশ্চিতকৰণ বাতিলৰ বাবে\nএই সংযোগটো চাওক:\n\n$5\n\nএই নিশ্চিতকৰণ সংকেতৰ ম্যাদ $4ত উকলিব ।",
        "confirmemail_body_set": "কোনোবাই (সম্ভৱতঃ আপুনি) আই.পি. ঠিকনা $1ৰ পৰা {{SITENAME}}ত\nএকাউণ্ট \"$2\"ৰ ইমেইল ঠিকনা এইটো প্ৰদান কৰিছে ।\n\nএই একাউণ্ট আপোনাৰ হয়নে নহয় নিশ্চিত কৰাৰ বাবে আৰু {{SITENAME}}ত ই-মেইল বৈশিষ্টসমূহ সক্ৰিয় কৰাৰ বাবে\nআপোনাৰ ব্ৰাউজাৰত এই সংযোগটো খোলক:\n\n$3\n\nযদি একাউণ্টটো আপোনাৰ *নহয়*, তেন্তে ইমেইল ঠিকনা নিশ্চিতকৰণ বাতিলৰ বাবে\nএই সংযোগটো চাওক:\n\n$5\n\nএই নিশ্চিতকৰণ সংকেতৰ ম্যাদ $4ত উকলিব ।",
-       "confirmemail_invalidated": "ই-মেইল ঠিকনা নিশ্চিতকৰণ বাতিল কৰা হৈছে",
+       "confirmemail_invalidated": "ইমেইল ঠিকনা নিশ্চিতকৰণ বাতিল কৰা হৈছে",
        "invalidateemail": "ই-মেইল নিশ্চিতকৰণ বাতিল কৰক",
        "scarytranscludedisabled": "[আন্তঃৱিকি আন্তঃভুক্তি নিষ্ক্ৰিয় কৰা আছে]",
        "scarytranscludefailed": "[$1ৰ বাবে সাঁচ অনা অসফল হৈছে]",
        "scarytranscludetoolong": "[URL অত্যাধিক দীঘল]",
        "deletedwhileediting": "'''সতৰ্কবাণী''': আপুনি সম্পাদনা আৰম্ভ কৰাৰ পাছত পৃষ্ঠাটো বিলোপ কৰা হৈছে !",
        "confirmrecreate": "আপুনি সম্পাদনা আৰম্ভ কৰাৰ পিছত সদস্য [[User:$1|$1]] ([[User talk:$1|আলোচনা]])য়ে পৃষ্ঠাটো বিলোপ কৰিছে, তাৰ কাৰণ:\n: ''$2''\nআপুনি এই পৃষ্ঠাটো আকৌ সৃষ্টি কৰিব খোজাটো নিশ্চিত কৰক ।",
-       "confirmrecreate-noreason": "à¦\86পà§\81নি à¦¸à¦®à§\8dপাদনা à¦\86ৰমà§\8dভ à¦\95ৰাৰ à¦ªà¦¿à¦\9bত à¦¸à¦¦à¦¸à§\8dয [[User:$1|$1]] ([[User talk:$1|à¦\86লà§\8bà¦\9aনা]])য়à§\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦¬à¦¿à¦²à§\8bপ à¦\95ৰিà¦\9bà§\87 à¥¤ à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\86à¦\95à§\8c à¦¸à§\83ষà§\8dà¦\9fি à¦\95ৰিব à¦\96à§\8bà¦\9cাà¦\9fà§\8b à¦\85নà§\81à¦\97à§\8dৰহ à¦\95ৰি à¦¨à¦¿à¦¶à§\8dà¦\9aিত à¦\95ৰà¦\95 ।",
+       "confirmrecreate-noreason": "à¦\86পà§\81নি à¦¸à¦®à§\8dপাদনা à¦\86ৰমà§\8dভ à¦\95ৰাৰ à¦ªà¦¿à¦\9bত à¦¸à¦¦à¦¸à§\8dয [[User:$1|$1]] ([[User talk:$1|à¦\86লà§\8bà¦\9aনা]])য়à§\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦¬à¦¿à¦²à§\8bপ à¦\95ৰিà¦\9bà§\87। à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\86à¦\95à§\8c à¦¸à§\83ষà§\8dà¦\9fি à¦\95ৰিব à¦\96à§\8bà¦\9cাà¦\9fà§\8b à¦\85নà§\81à¦\97à§\8dৰহ à¦\95ৰি à¦¨à¦¿à¦¶à§\8dà¦\9aিত à¦\95ৰà¦\95।",
        "recreate": "পুনৰ সৃষ্টি কৰক",
        "confirm_purge_button": "শুদ্ধ",
        "confirm-purge-top": "এই পৃষ্ঠাৰ কেচ্‌ খালী কৰা হওক ?",
        "confirm-watch-top": "এই পৃষ্ঠাটো আপোনাৰ লক্ষ্য-তালিকাত যোগ কৰিব?",
        "confirm-unwatch-button": "শুদ্ধ",
        "confirm-unwatch-top": "এই পৃষ্ঠাটো আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰাব?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← পূৰ্বৱৰ্তী পৃষ্ঠা",
        "imgmultipagenext": "পৰৱৰ্তী পৃষ্ঠা →",
        "imgmultigo": "যাওক",
        "watchlistedit-raw-legend": "অশোধিত অনুসৰণ-তালিকা সম্পাদন কৰক",
        "watchlistedit-raw-explain": "আপোনাৰ দৰ্শন তালিকাত থকা শীৰ্ষকসমূহ তলত দেখুওৱা হৈছে, আৰু তালিকালৈ যোগ কৰি অথবা তালিকাৰ পৰা আতৰাই সম্পাদন কৰিব পাৰি;\nপ্ৰতি শাৰী এটা শীৰ্ষক হিচাপে।\nযেতিয়া সম্পূৰ্ণ হব, \"{{int:Watchlistedit-raw-submit}}\"ত ক্লিক কৰিব।\nআপুনি লগতে [[Special:EditWatchlist|প্ৰামাণিক সম্পাদকক ব্যৱহাৰ কৰিব পাৰে]]।",
        "watchlistedit-raw-titles": "শিৰোনামা:",
-       "watchlistedit-raw-submit": "লক্ষ্য-তালিকা আপডেট কৰক",
+       "watchlistedit-raw-submit": "লক্ষ্য-তালিকা আপডে'ট কৰক",
        "watchlistedit-raw-done": "আপোনাৰ লক্ষ্য-তালিকা নবীকৰণ কৰা হ'ল",
        "watchlistedit-raw-added": "{{PLURAL:$1|এটা শিৰোনামা|$1-টা শিৰোনামা}} যোগ কৰা হ'ল:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|এটা শিৰোনামা|$1-টা শিৰোনামা}} আঁতৰোৱা হ'ল:",
        "watchlistedit-clear-titles": "শিৰোনামাসমূহ:",
        "watchlistedit-clear-submit": "লক্ষ্য-তালিকা পৰিষ্কাৰ কৰক (এইটো স্থায়ী!)",
        "watchlistedit-clear-done": "আপোনাৰ লক্ষ্য-তালিকা পৰিষ্কাৰ কৰা হ'ল।",
+       "watchlisttools-clear": "লক্ষ্য-তালিকা পৰিষ্কাৰ কৰক",
        "watchlisttools-view": "সংগতি থকা সাল-সলনিবোৰ চাওক",
        "watchlisttools-edit": "লক্ষ্য-তালিকা চাওক আৰু সম্পাদনা কৰক",
        "watchlisttools-raw": "অশোধিত লক্ষ্য-তালিকা সম্পাদনা কৰক",
        "version-license": "অনুজ্ঞাপত্ৰ",
        "version-ext-license": "অনুজ্ঞাপত্ৰ",
        "version-ext-colheader-name": "এক্সটেন্‌চন",
+       "version-skin-colheader-name": "আৱৰণ",
        "version-ext-colheader-version": "সংস্কৰণ",
        "version-ext-colheader-license": "অনুজ্ঞাপত্ৰ",
        "version-ext-colheader-description": "বিৱৰণ",
        "version-ext-colheader-credits": "লেখকসকল",
+       "version-license-title": "$1ৰ বাবে অনুজ্ঞাপত্ৰ",
        "version-poweredby-credits": "এই ৱিকি '''[https://www.mediawiki.org/ মিডিয়াৱিকিৰ]''' দ্বাৰা প্ৰচলিত , কপিৰাইট © ২০০১-$1 $2.",
        "version-poweredby-others": "অন্য",
        "version-poweredby-translators": "translatewiki.net অনুবাদকসকল",
        "compare-submit": "তুলনা কৰক",
        "compare-invalid-title": "আপুনি নিৰ্ধাৰণ কৰা শিৰোনামাটো অবৈধ ।",
        "compare-title-not-exists": "আপুনি নিৰ্ধাৰণ কৰা ফাইলটোৰ অস্বিত্ব নাই ।",
-       "compare-revision-not-exists": "à¦\86পà§\81নি à¦¨à¦¿à§°à§\8dধাৰণ à¦\95ৰা à¦¸à¦\82শà§\8bধনà§\80à¦\9fà§\8bৰ à¦\85সà§\8dবিত্ব নাই ।",
+       "compare-revision-not-exists": "à¦\86পà§\81নি à¦¨à¦¿à§°à§\8dধাৰণ à¦\95ৰা à¦¸à¦\82শà§\8bধনà¦\9fà§\8bৰ à¦\85সà§\8dতিত্ব নাই ।",
        "dberr-problems": "দুঃখিত! চাইটটোত কিছু কাৰিকৰী সমস্যা হৈছে ।",
        "dberr-again": "অলপ সময় অপেক্ষা কৰি পুনৰ আপল'ডৰ চেষ্টা কৰক ।",
        "dberr-info": "(তথ্যকোষৰ চাৰ্ভাৰৰ লগত যোগাযোগ কৰিব নোৱাৰি: $1)",
        "sqlite-has-fts": "$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন সহ",
        "sqlite-no-fts": "$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন অবিহনে",
        "logentry-delete-delete": "$3 পৃষ্ঠাটো $1ৰদ্বাৰা {{GENDER:$2|বিলোপ কৰা হ'ল}}",
-       "logentry-delete-restore": "$3 পৃষ্ঠাখন $1 ৰদ্বাৰা {{GENDER:$2|পুনৰ্সংৰক্ষণ কৰা হ'ল}}",
+       "logentry-delete-restore": "$1-এ $3 পৃষ্ঠাটো {{GENDER:$2|পুনৰ্সংৰক্ষণ কৰিলে}}",
        "logentry-delete-event": "$3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 পৰিৱৰ্তন কৰা দৃশ্যমানতা",
        "logentry-delete-revision": "পৃষ্ঠা $3ত {{PLURAL:$5|এটা সংশোধন|$5 সংশোধনসমূহ}}ৰ দৃশ্যমানতা $1 {{GENDER:$2|য়ে সলালে}}: $4",
        "logentry-delete-event-legacy": "$3ত ল'গ ঘটনাসমূহৰ দৃশ্যমানতা $1 {{GENDER:$2|ৰদ্বাৰা সলোৱা হ'ল}}",
        "logentry-rights-rights-legacy": "$1-ৰ গোট সদস্যপদ $3-লৈ সলনি কৰা হ'ল",
        "logentry-rights-autopromote": "$1ক  $4ৰ পৰা $5লৈ স্বয়ংক্ৰিয়ভাৱে পদোন্নীত কৰা হ’ল",
        "rightsnone": "(নাই)",
+       "revdelete-summary": "সম্পাদনাৰ সাৰমৰ্ম",
        "feedback-bugornote": "যদি আপুনি এটা কাৰিকৰী সমস্যাৰ বিৱৰণ দিবলৈ প্ৰস্তুত, অনুগ্ৰহ কৰি [$1 এটা বাগ ৰিপ'ৰ্ট কৰক]।\nনহ'লে আপুনি তলৰ সহজ ফৰ্ম ব্যৱহাৰ কৰিব পাৰিব। আপোনাৰ মন্তব্য আপোনাৰ সদস্যনাম আৰু আপুনি ব্যৱহাৰ কৰা ব্ৰাউজাৰৰ সৈতে \"[$3 $2]\" -পৃষ্ঠাত যোগ কৰা হ'ব।",
        "feedback-subject": "বিষয়:",
        "feedback-message": "বাৰ্তা:",
        "expand_templates_output": "ফলাফল",
        "expand_templates_ok": "ওকে",
        "expand_templates_remove_comments": "মন্তব্য গু়চাওক",
-       "expand_templates_preview": "খচৰা"
+       "expand_templates_preview": "খচৰা",
+       "pagelanguage": "পৃষ্ঠাৰ ভাষা নিৰ্বাচক",
+       "pagelang-name": "পৃষ্ঠা",
+       "pagelang-language": "ভাষা",
+       "pagelang-use-default": "ডিফল্ট ভাষা ব্যৱহাৰ কৰক",
+       "pagelang-select-lang": "ভাষা নিৰ্বাচন কৰক",
+       "right-pagelang": "পৃষ্ঠাৰ ভাষা পৰিৱৰ্তন কৰক",
+       "action-pagelang": "পৃষ্ঠাৰ ভাষা পৰিৱৰ্তন কৰক",
+       "log-name-pagelang": "ভাষা পৰিৱৰ্তন ল'গ"
 }
index dfb04a9..a7dea89 100644 (file)
        "otherlanguages": "N'otres llingües",
        "redirectedfrom": "(Redirixío dende $1)",
        "redirectpagesub": "Páxina de redireición",
+       "redirectto": "Redirixe a:",
        "lastmodifiedat": "L'últimu cambiu d'esta páxina foi el $1, a les $2.",
        "viewcount": "Esta páxina visitóse {{PLURAL:$1|una vegada|$1 vegaes}}.",
        "protectedpage": "Páxina protexida",
        "createaccount-text": "Daquién creó una cuenta cola to direición de corréu electrónicu en {{SITENAME}} ($4) col nome «$2», y cola contraseña «$3».\nAgora tendríes d'aniciar sesión y camudar la contraseña.\n\nPues escaecer esti mensaxe si esta cuenta creóse por error.",
        "login-throttled": "Ficisti demasiaos intentos d'aniciu de sesión recientes.\nPor favor espera $1 enantes d'intentalo otra vuelta.",
        "login-abort-generic": "Falló la identificación - Encaboxao",
+       "login-migrated-generic": "La to cuenta migróse ya'l to nome d'usuariu yá nun esiste nesta wiki.",
        "loginlanguagelabel": "Llingua: $1",
        "suspicious-userlogout": "La to solicitú de zarrar sesión refugose porque paez qu'unvióla un restolador frañíu o un proxy de caché.",
        "createacct-another-realname-tip": "El nome real ye opcional.\nSi decide conseñalu, va usase p'atribuir el trabayu al usuariu.",
        "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-header": "Camudar la direición de corréu electrónicu de la cuenta",
        "changeemail-text": "Rellena esti formulariu pa camudar la to direición de corréu electrónicu. Tendrás d'escribir la contraseña pa confirmar esti cambéu.",
        "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-none": "(nengún)",
        "changeemail-password": "La to contraseña en {{SITENAME}}:",
        "changeemail-submit": "Camudar el corréu electrónicu",
-       "changeemail-cancel": "Encaboxar",
        "changeemail-throttled": "Ficisti demasiaos intentos d'aniciu de sesión.\nPor favor espera $1 enantes d'intentalo otra vuelta.",
        "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.",
        "showpreview": "Amosar previsualización",
        "showdiff": "Amosar cambeos",
        "blankarticle": "<strong>Atención:</strong> La páxina que tas a piques de crear ta balera.\nSi vuelves a facer click en «{{int:savearticle}}», crearáse la páxina ensin conteníu dengún.",
-       "anoneditwarning": "<strong>Avisu:</strong> Nun anició sesión.\nLa direición IP quedará grabada nel historial d'edición d'esta páxina.",
+       "anoneditwarning": "<strong>Avisu:</strong> Nun aniciasti sesión. La direición IP sedrá visible en público si faes dalguna edición. Si <strong>[$1 anicies sesión]</strong> o <strong>[$2 crees una cuenta]</strong>, les ediciones atribuiránse al to nome d'usuariu, xunto con otros beneficios.",
        "anonpreviewwarning": "''Nun aniciasti sesión. Al guardar quedará rexistrada la to direición IP nel historial d'edición d'esta páxina.''",
        "missingsummary": "'''Recordatoriu:''' Nun conseñasti un resume d'edición.\nSi calques nuevamente \"{{int:savearticle}}\", la to edición guardaráse ensin nengún resume.",
        "missingcommenttext": "Por favor, escribi un comentariu abaxo.",
        "searchall": "toos",
        "showingresults": "Abaxo {{PLURAL:$1|amuésase '''un''' resultáu|amuésense '''$1''' resultaos}}, entamando col #'''$2'''.",
        "showingresultsinrange": "Más abaxo s'{{PLURAL:$1|amuesa|amuesen}} fasta {{PLURAL:$1|<strong>1</strong> resultáu|<strong>$1</strong> resultaos}} nel rangu ente #<strong>$2</strong> y #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultáu '''$1''' de '''$3'''|Resultaos '''$1 - $2''' de '''$3'''}} pa '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Resultáu <strong>$1</strong> de <strong>$3</strong>|Resultaos <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Nun hebo resultaos que casaren cola consulta.",
        "powersearch-legend": "Busca avanzada",
        "powersearch-ns": "Buscar nos espacios de nome:",
        "prefs-tokenwatchlist": "Pase",
        "prefs-diffs": "Diferencies",
        "prefs-help-prefershttps": "Esta preferencia aplicaráse nel siguiente aniciu de sesión.",
+       "prefswarning-warning": "Ficisti cambios nes tos preferencies qu'inda nun se guardaron.\nSi abandones esta páxina ensin calcar \"$1\" les preferencies nun s'anovarán.",
        "prefs-tabs-navigation-hint": "Gabitu: pue usar les tecles de flecha izquierda y drecha pa navegar peles llingüetes de la llista.",
        "email-address-validity-valid": "La direición de corréu paez válida",
        "email-address-validity-invalid": "Escribi una direición de corréu válida",
        "randomincategory": "Páxina al debalu de la categoría",
        "randomincategory-invalidcategory": "\"$1\" nun ye un nome de categoría válidu.",
        "randomincategory-nopages": "Nun hai páxines en [[:Category:$1]].",
-       "randomincategory-selectcategory": "Ver una páxina al debalu de la categoría: $1. $2",
-       "randomincategory-selectcategory-submit": "Dir",
+       "randomincategory-category": "Categoría:",
+       "randomincategory-legend": "Páxina al debalu de la categoría",
        "randomredirect": "Redireición al debalu",
        "randomredirect-nopages": "Nun hai redireiciones nel espaciu de nomes \"$1\".",
        "statistics": "Estadístiques",
        "querypage-disabled": "Esta páxina especial ta desactivada por razones de rindimientu.",
        "booksources": "Fontes de llibros",
        "booksources-search-legend": "Busca de fontes de llibros",
-       "booksources-go": "Dir",
+       "booksources-search": "Buscar",
        "booksources-text": "Esta ye una llista d'enllaces a otros sitios que vienden llibros nuevos y usaos, y que puen tener más información sobre los llibros que ta buscando:",
        "booksources-invalid-isbn": "El códigu ISBN que puxisti nun paez que valga; mira que te vien copiáu de la fonte orixinal.",
        "specialloguserlabel": "Fecho por:",
        "wlheader-enotif": "La notificación per corréu electrónicu ta activada.",
        "wlheader-showupdated": "Les páxines que camudaron dende que les visitasti anteriormente amuesense en '''negrina'''",
        "wlnote": "Abaxo {{PLURAL:$1|tá'l caberu cambiu|tan los caberos <strong>$1</strong> cambios}} {{PLURAL:$2|na cabera hora|nes caberes <strong>$2</strong> hores}}, a día $3, a les $4.",
-       "wlshowlast": "Amosar les últimes $1 hores $2 díes $3",
+       "wlshowlast": "Amosar les últimes $1 hores, los últimos $2 díes",
        "watchlist-options": "Opciones de la llista de siguimientu",
        "watching": "Vixilando...",
        "unwatching": "Dexando de vixilar...",
        "exbeforeblank": "el conteníu enantes de dexar en blanco yera: '$1'",
        "delete-confirm": "Desaniciar «$1»",
        "delete-legend": "Desaniciar",
-       "historywarning": "'''Avisu:'''' La páxina que vas desaniciar tien un historial con aproximadamente $1 {{PLURAL:$1|revisión|revisiones}}:",
+       "historywarning": "<strong>Avisu:</strong> La páxina que vas desaniciar tien un historial con $1 {{PLURAL:$1|revisión|revisiones}}:",
        "confirmdeletetext": "Tas a piques d'esborrar una páxina xunto con tol so historial.\nPor favor confirma que ye lo que quies facer, qu'entiendes les consecuencies, y que lo tas faciendo acordies coles [[{{MediaWiki:Policy-url}}|polítiques]].",
        "actioncomplete": "Aición completada",
        "actionfailed": "Falló l'aición",
        "delete-edit-reasonlist": "Editar los motivos d'esborráu",
        "delete-toobig": "Esta páxina tien un historial d'ediciones grande, más de $1 {{PLURAL:$1|revisión|revisiones}}.\nRestrinxóse l'esborráu d'estes páxines pa evitar perturbaciones accidentales de {{SITENAME}}.",
        "delete-warning-toobig": "Esta páxina tien un historial d'ediciones grande, más de $1 {{PLURAL:$1|revisión|revisiones}}.\nEsborralu pue perturbar les operaciones de la base de datos de {{SITENAME}};\nobra con precaución.",
-       "delete-cantedit": "Nun pues desaniciar esta páxina porque nun tienes permisu pa editala.",
+       "deleteprotected": "Nun pues desaniciar esta páxina porque ta protexida.",
        "deleting-backlinks-warning": "'''Avisu:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Otres páxines]] enllacen a, o trescluyen de, la páxina que ta a piques de desaniciar.",
        "rollback": "Revertir ediciones",
        "rollback_short": "Revertir",
        "protect-othertime": "Otru periodu:",
        "protect-othertime-op": "otru periodu",
        "protect-existing-expiry": "Caducidá actual: $2, $3",
+       "protect-existing-expiry-infinity": "Tiempu de caducidá esistente: infinitu",
        "protect-otherreason": "Motivu distintu/adicional:",
        "protect-otherreason-op": "Otru motivu",
        "protect-dropdown": "*Motivos comunes de proteición\n** Vandalismu escomanáu\n** Spamming escesivu\n** Guerra d'ediciones contraproducente\n** Páxina de tráficu altu",
        "unblocked": "[[User:$1|$1]] desbloquióse.",
        "unblocked-range": "$1 se desbloquió",
        "unblocked-id": "Desaniciose'l bloquéu $1.",
+       "unblocked-ip": "Desbloquióse a [[Special:Contributions/$1|$1]].",
        "blocklist": "Usuarios bloquiaos",
        "ipblocklist": "Usuarios bloquiaos",
        "ipblocklist-legend": "Atopar un usuariu bloquiáu",
        "import": "Importar páxines",
        "importinterwiki": "Importación treswiki",
        "import-interwiki-text": "Seleiciona una wiki y un títulu de páxina pa importar.\nLes feches de revisión y los nomes de los editores caltendránse.\nToles aiciones d'importación treswiki queden rexistraes nel [[Special:Log/import|rexistru d'importaciones]].",
-       "import-interwiki-source": "Códigu wiki/páxina:",
+       "import-interwiki-sourcewiki": "Wiki d'orixe:",
+       "import-interwiki-sourcepage": "Páxina d'orixe:",
        "import-interwiki-history": "Copiar toles versiones d'historial d'esta páxina",
        "import-interwiki-templates": "Incluyir toles plantíes",
        "import-interwiki-submit": "Importar",
        "exif-urgency-low": "Baxa ($1)",
        "exif-urgency-high": "Alta ($1)",
        "exif-urgency-other": "Prioridá definía pol usuariu ($1)",
-       "watchlistall2": "too",
        "namespacesall": "toos",
        "monthsall": "toos",
        "confirmemail": "Confirmar direición de corréu",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|xubió}} una versión nueva de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|xubió}} $3",
        "rightsnone": "(nengún)",
+       "revdelete-summary": "editar resume",
        "feedback-bugornote": "Si tas preparáu pa describir un problema técnicu en detalle, [$1 informa del fallu].\nD'otra miente, pues usar el formulariu cenciellu d'abaxo. El to comentariu apaecerá na páxina \"[$3 $2]\" xunto col to nome d'usuariu y el restolador qu'uses.",
        "feedback-subject": "Asuntu:",
        "feedback-message": "Mensaxe:",
        "log-name-pagelang": "Rexistru de cambios de llingua",
        "log-description-pagelang": "Esti ye un rexistru de los cambios de llingua de les páxines.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambió}} la llingua de la páxina $3 del $4 al $5.",
-       "default-skin-not-found": "¡Coime! L'aspeutu predetermináu pa la to wiki (<code>$wgDefaultSkin</code>), <code>$1</code> nun ta disponible.\n\nLa to instalación paez qu'incluye los siguientes aspeutos. Llei [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pa más información sobro cómo activalos y escoyer el predetermináu.\n\n$2\n\n; Si acabes d'instalar MediaWiki:\n: Probablemente instalasti dende git, o'l códigu fonte direutamente usando algún otru métodu. Esto ye d'esperar. Intenta instalar dellos aspeutos dende'l [https://www.mediawiki.org/wiki/Category:All_skins direutoriu d'aspeutos de mediawiki.org's], asina:\n:* Descargando [https://www.mediawiki.org/wiki/Download l'instalador tarball], que vien con dellos aspeutos y estensiones. Pues copiar y apegar el direutoriu <code>skins/</code> d'ehí.\n:* Clonando unu de los direutorios <code>mediawiki/skins/*</code> via git nel direutoriu <code>skins/</code> de la to instalación de MediaWiki.\n: Facer esto nun tendría d'interferir col to repositoriu git si yes un desendolcador de MediaWiki.\n\n; Si acabes d'anovar MediaWiki:\n: MediaWiki 1.24 y más nuevu yá nun activa automáticamente los aspeutos instalaos (llei [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Pues apegar les llinies siguientes en <code>LocalSettings.php</code> p'activar tolos aspeutos instalaos actualmente:\n\n<pre>$3</pre>\n\n; Si acabes d'editar <code>LocalSettings.php</code>:\n: Vuelvi a comprobar los nomes de los aspeutos por si hai errores d'escritura.",
-       "default-skin-not-found-no-skins": "¡Coime! L'aspeutu predetermináu pa la to wiki (<code>$wgDefaultSkin</code>), <code>$1</code> nun ta disponible.\n\nNun tienes aspeutos instalaos.\n\n; Si acabes d'instalar MediaWiki:\n: Probablemente instalasti dende git, o'l códigu fonte direutamente usando algún otru métodu. Esto ye d'esperar. MediaWiki 1.24 y más nuevu nun incluye nengún aspeutu nel repositoriu principal. Intenta instalar dellos aspeutos dende'l [https://www.mediawiki.org/wiki/Category:All_skins direutoriu d'aspeutos de mediawiki.org], asina:\n:* Descargando [https://www.mediawiki.org/wiki/Download l'instalador tarball], que vien con dellos aspeutos y estensiones. Pues copiar y apegar el direutoriu <code>skins/</code> d'ehí.\n:* Clonando unu de los direutorios <code>mediawiki/skins/*</code> via git nel direutoriu <code>skins/</code> de la to instalación de MediaWiki.\n: Facer esto nun tendría d'interferir col to repositoriu git si yes un desendolcador de MediaWiki. Llei [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pa más información sobro cómo activar los aspeutos y escoyer el predetermináu.",
+       "default-skin-not-found": "L'aspeutu predetermináu pa la to wiki, definíu en <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code> nun ta disponible.\n\nLa to instalación paez qu'incluye los siguientes aspeutos. Llei [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pa más información sobro cómo activalos y escoyer el predetermináu.\n\n$2\n\n; Si acabes d'instalar MediaWiki:\n: Probablemente instalasti dende git, o'l códigu fonte direutamente usando algún otru métodu. Esto ye d'esperar. Intenta instalar dellos aspeutos dende'l [https://www.mediawiki.org/wiki/Category:All_skins direutoriu d'aspeutos de mediawiki.org's], asina:\n:* Descargando [https://www.mediawiki.org/wiki/Download l'instalador tarball], que vien con dellos aspeutos y estensiones. Pues copiar y apegar el direutoriu <code>skins/</code> d'ehí.\n:* Clonando unu de los direutorios <code>mediawiki/skins/*</code> via git nel direutoriu <code dir=\"ltr\">skins/</code> de la to instalación de MediaWiki.\n: Facer esto nun tendría d'interferir col to repositoriu git si yes un desendolcador de MediaWiki.\n\n; Si acabes d'anovar MediaWiki:\n: MediaWiki 1.24 y más nuevu yá nun activa automáticamente los aspeutos instalaos (llei [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Pues apegar les llinies siguientes en <code>LocalSettings.php</code> p'activar tolos aspeutos instalaos actualmente:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si acabes d'editar <code>LocalSettings.php</code>:\n: Vuelvi a comprobar los nomes de los aspeutos por si hai errores d'escritura.",
+       "default-skin-not-found-no-skins": "L'aspeutu predetermináu pa la to wiki, definíu en <code>$wgDefaultSkin</code> como <code>$1</code> nun ta disponible.\n\nNun tienes aspeutos instalaos.\n\n; Si acabes d'instalar MediaWiki:\n: Probablemente instalasti dende git, o'l códigu fonte direutamente usando algún otru métodu. Esto ye d'esperar. MediaWiki 1.24 y más nuevu nun incluye nengún aspeutu nel repositoriu principal. Intenta instalar dellos aspeutos dende'l [https://www.mediawiki.org/wiki/Category:All_skins direutoriu d'aspeutos de mediawiki.org], asina:\n:* Descargando [https://www.mediawiki.org/wiki/Download l'instalador tarball], que vien con dellos aspeutos y estensiones. Pues copiar y apegar el direutoriu <code>skins/</code> d'ehí.\n:* Clonando unu de los direutorios <code>mediawiki/skins/*</code> via git nel direutoriu <code dir=\"ltr\">skins/</code> de la to instalación de MediaWiki.\n: Facer esto nun tendría d'interferir col to repositoriu git si yes un desendolcador de MediaWiki. Llei [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pa más información sobro cómo activar los aspeutos y escoyer el predetermináu.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activáu)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desactiváu''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desactiváu''')",
+       "mediastatistics": "Estadístiques de multimedia",
+       "mediastatistics-summary": "Estadístiques sobro los tipos de ficheros xubíos. Esto sólo incluye la versión más nueva d'un ficheru. Escluyense les versiones antigües o desaniciaes de los ficheros.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Tipu MIME",
+       "mediastatistics-table-extensions": "Estensiones posibles",
+       "mediastatistics-table-count": "Númberu de ficheros",
+       "mediastatistics-table-totalbytes": "Tamañu combináu",
+       "mediastatistics-header-unknown": "Desconocíu",
+       "mediastatistics-header-bitmap": "Imaxes de mapa de bits",
+       "mediastatistics-header-drawing": "Dibuxos (imaxes vectoriales)",
+       "mediastatistics-header-audio": "Soníu",
+       "mediastatistics-header-video": "Videos",
+       "mediastatistics-header-multimedia": "Multimedia enriquecida",
+       "mediastatistics-header-office": "Oficina",
+       "mediastatistics-header-text": "Testual",
+       "mediastatistics-header-executable": "Executables",
+       "mediastatistics-header-archive": "Formatos comprimíos",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|coma al final desanicióse|comes al final desaniciáronse}} de JSON",
+       "json-error-unknown": "Hebo un problema col JSON. Error: $1",
+       "json-error-depth": "Pasóse de la fondura máxima de la pila",
+       "json-error-state-mismatch": "JSON inválidu o incorreutu",
+       "json-error-ctrl-char": "Error de caráuter de control, seique codificáu incorreutamente",
+       "json-error-syntax": "Error de sintaxis",
+       "json-error-utf8": "Carauteres UTF-8 con errores de formatu, seique codificaos incorreutamente",
+       "json-error-recursion": "Una o más referencies recursives nel valor a codificar",
+       "json-error-inf-or-nan": "Unu o más valores NAN (númberu nun conseñáu) o INF (infinitu) nel valor a codificar",
+       "json-error-unsupported-type": "Diose un valor d'un tipu que nun pue codificase"
 }
index a8c72d1..b237edb 100644 (file)
        "passwordreset-emailtitle": "Pinta va pata dene {{SITENAME}}",
        "passwordreset-emailelement": "Favesikyolt : $1\nUgaloraf remravlem : $2",
        "changeemail": "Betara va e-mail mane",
-       "changeemail-header": "Betara va patafe e-mail mane",
        "changeemail-oldemail": "Noelafe e-mail mane",
        "changeemail-newemail": "Warzafe e-mail mane",
        "changeemail-none": "(mek)",
        "changeemail-submit": "Betara va e-mail mane",
-       "changeemail-cancel": "Kuidera",
        "bold_sample": "Bold krent",
        "bold_tip": "Bold krent",
        "italic_sample": "Italic krent",
        "searchrelated": "skedaf",
        "searchall": "kot",
        "showingresults": "Vlevefa nedira va {{PLURAL:$1|'''1''' trasiks|'''$1''' trasiks}} dem #'''$2''' toza.",
-       "showingresultsheader": "{{PLURAL:$5|Trasiks '''$1''' ke '''$3'''|Trasiks '''$1 - $2''' ke '''$3'''}} icde '''$4'''",
        "search-nonefound": "Mek trasiks vas kucilara",
        "powersearch-legend": "Aneyapara",
        "powersearch-ns": "Aneyara koe yoltxo:",
        "suppress": "Rokla",
        "booksources": "Vuestes suteks",
        "booksources-search-legend": "Aneyara va nevaklita",
-       "booksources-go": "Rupera",
        "specialloguserlabel": "Favesik:",
        "speciallogtitlelabel": "Vergumvelt:",
        "log": "\"logs\"",
        "wlheader-enotif": "Email walzera tir tegisa.",
        "wlheader-showupdated": "Bu betayanu vielu rin ironokon worayal tir '''sulatcalakorafu'''.",
        "wlnote": "Vleveon tid tela '''$1''' ironokafa betara mali '''$2''' ironokaf bartiv.",
-       "wlshowlast": "Nedira va ironokaf $1 bartiv isu $2 viel isu $3",
+       "wlshowlast": "Nedira va ironokaf $1 bartiv isu $2 viel isu",
        "watchlist-options": "Suzdasikiolkeem",
        "watching": "Nedis...",
        "unwatching": "Menedis...",
        "thumbnail_dest_directory": "Redura va kalbonja tir merotisa",
        "import": "Bukoburera",
        "importinterwiki": "Transwiki koburera",
-       "import-interwiki-source": "Wiki ik bu klita :",
        "import-interwiki-history": "Ksudara va kot izvotsiatos ke batu bu",
        "import-interwiki-submit": "Koburera",
        "import-interwiki-namespace": "Graskarafo yoltxo :",
        "exif-gpsspeed-n": "Webokeem",
        "exif-gpsdirection-t": "Ageltania",
        "exif-gpsdirection-m": "Zatnia",
-       "watchlistall2": "kot",
        "namespacesall": "koto",
        "monthsall": "kot",
        "confirmemail": "Va e-mail gruyel",
        "tag-filter": "[[Special:Tags|Tag]] espara:",
        "revdelete-restricted": "irutara rewana pu ristusik",
        "revdelete-unrestricted": "irutara tiolteyena pu ristusik",
-       "rightsnone": "(mek)"
+       "rightsnone": "(mek)",
+       "revdelete-summary": "betara va vildeks"
 }
index 0b75926..55d44b4 100644 (file)
@@ -25,7 +25,8 @@
                        "아라",
                        "Arystanbek",
                        "Dağlı95",
-                       "Sayginer"
+                       "Sayginer",
+                       "Şeyx Şamil"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
        "changeemail-newemail": "Yeni e-poçt ünvanı:",
        "changeemail-none": "(yoxdur)",
        "changeemail-submit": "E-poçtu dəyiş",
-       "changeemail-cancel": "İmtina",
        "bold_sample": "Qalın mətn",
        "bold_tip": "Qalın mətn",
        "italic_sample": "Kursiv mətn",
        "updated": "(yeniləndi)",
        "note": "'''Qeyd:'''",
        "previewnote": "<strong>Unutmayın ki, bu yalnız sınaq göstərişidir.</strong> Dəyişiklikləriniz hal-hazırda qeyd edilməmişdir!",
+       "continue-editing": "Redaktə sahəsinə qayıt",
        "previewconflict": "Bu sınaq göstərişidir və yaddaşda saxlayacağınız təqdirdə mətnin redaktə səhifəsinin yuxarı hissəsində nəticənin necə olacağını göstərir.",
        "session_fail_preview": "'''Üzr istəyirik! Sizin redaktəniz saxlanılmadı. Serverdə identifikasiyanızla bağlı problemlər yaranmışdır. Lütfən bir daha təkrar edin. Problem həll olunmazsa hesabınızdan çıxın və yenidən daxil olun.'''",
        "editing": "Redaktə $1",
        "searchrelated": "əlaqəli",
        "searchall": "bütün",
        "showingresults": "Aşağıda #'''$2''' ilə başlayan {{PLURAL:$1|'''$1'''-ə qədər}} nəticə göstərilib.",
-       "showingresultsheader": "'''$4''' üçün {{PLURAL:$5|'''$3'''-dən '''$1''' nəticə|'''$3'''-dən '''$1 - $2''' nəticə}}",
        "search-nonefound": "Sorğunuza uyğun nəticə tapılmadı.",
        "powersearch-legend": "Təkmil axtarış",
        "powersearch-ns": "Ad aralığında axtar:",
        "unusedtemplates": "İstifadəsiz şablonlar",
        "unusedtemplateswlh": "digər keçidlər",
        "randompage": "İxtiyari səhifə",
-       "randomincategory-selectcategory-submit": "Keç",
        "randomredirect": "İxtiyari istiqamətləndirmə",
        "randomredirect-nopages": "\"$1\" ad sahəsində heç bir yönləndirmə yoxdur.",
        "statistics": "Statistika",
        "booksources": "Kitab mənbələri",
        "booksources-search-legend": "Kitab mənbələri axtar",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Seç",
        "booksources-text": "Aşağıda yeni və işlənmiş kitablar satan xarici keçidlərdə siz axtardığınız kitab haqqında əlavə məlumat ala bilərsiz:",
        "specialloguserlabel": "İcraçı:",
        "speciallogtitlelabel": "Məqsəd (başlıq və ya istifadəçi):",
        "wlheader-enotif": " E-məktubla bildiriş aktivdir.",
        "wlheader-showupdated": "Son ziyarətinizdən sonra edilən dəyişikliklər '''qalın şriftlərlə''' göstərilmişdir.",
        "wlnote": "Aşağıdakı {{PLURAL:$1|'''$1''' dəyişiklik|'''$1''' dəyişiklik}} son {{PLURAL:$2|saatda|'''$2''' saatda}} edilmişdir.",
-       "wlshowlast": "Bunları göstər: son $1 saatı $2 günü $3",
+       "wlshowlast": "Bunları göstər: son $1 saatı $2 günü",
        "watchlist-options": "İzləmə siyahısının nizamlamaları",
        "watching": "İzlənilir...",
        "unwatching": "İzlənilmir...",
        "thumbnail_image-missing": "Belə görünür ki, $1 faylı yoxdur",
        "import": "Səhifələri idxal et",
        "importinterwiki": "Vikilərarası çıxarma",
-       "import-interwiki-source": "Mənbə viki/səhifə:",
        "import-interwiki-history": "Səhifənin dəyişmə tarixçələrinin hamısını köçür",
        "import-interwiki-templates": "Bütün şablonlarla birlikdə",
        "import-interwiki-submit": "İdxal",
        "exif-urgency-low": "Aşağı ($1)",
        "exif-urgency-high": "Yüksək ($1)",
        "exif-urgency-other": "İstifadəçi tərəfindən müəyyən olunmuş birincilik ($1)",
-       "watchlistall2": "hamısını",
        "namespacesall": "hamısı",
        "monthsall": "hamısı",
        "confirmemail": "E-məktubunu təsdiq et",
        "logentry-newusers-create2": "$1 $3 üçün istifadəçi hesabı yaratdı",
        "logentry-newusers-autocreate": "$1 hesabı avtomatik yaradıldı",
        "rightsnone": "(yoxdur)",
+       "revdelete-summary": "redaktə xülasəsi",
        "feedback-subject": "Mövzu:",
        "feedback-message": "Mesaj:",
        "feedback-cancel": "İmtina",
index e72d941..7a95258 100644 (file)
        "passwordreset-emailsent-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.",
        "passwordreset-emailerror-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی یارادیلیب‌دیر، اما {{GENDER:$2ایستیفاده‌چی}}‌یه گؤندرمگی باشاریلی اولمادی: $1",
        "changeemail": "ایمیل آدرسینی دَییشدیر",
-       "changeemail-header": "حساب ایمیل آدرسینی دَییشدیر",
        "changeemail-text": "ایمیل آدرسینیزی دَییشمک اوچون بو فورمو دولدورون. بو دَییشیگی دوغرولاماق اوچون رمزینیزی وئرمه‌لیسینیز.",
        "changeemail-no-info": "بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.",
        "changeemail-oldemail": "ایندیکی ایمیل آدرس:",
        "changeemail-none": "(هئچ)",
        "changeemail-password": "سیزین {{SITENAME}} رمزینیز:",
        "changeemail-submit": "ایمیلی دَییشدیر",
-       "changeemail-cancel": "لغو",
        "bold_sample": "قالین یازی",
        "bold_tip": "قالین یازی",
        "italic_sample": "اَیری یازی",
        "searchrelated": "ایلگیلی",
        "searchall": "بوتون",
        "showingresults": "آشاغیدا نومره '''$2'''-دن باشلایان {{PLURAL:$1|'''بیر'''|'''$1'''}} سونوجا قدر گؤستریلیر.",
-       "showingresultsheader": "'''$4''' اوچون {{PLURAL:$5|'''$3'''-دن '''$1''' نتیجه|'''$3'''-دن '''$1-$2''' نتیجه}}",
        "search-nonefound": "سیزین سورونوزا اویغون نتیجه تاپیلمادی.",
        "powersearch-legend": "گلیشمیش آختاریش",
        "powersearch-ns": "آدفضالاریندا آختار",
        "randomincategory": "بؤلمه‌ده راست‌گله صحیفه",
        "randomincategory-invalidcategory": "«$1» بیر گئچرلی بؤلمه آدی دئییل.",
        "randomincategory-nopages": "[[:Category:$1|$1]] بؤلمه‌سین‌ده، هئچ صحیفه یوخدور.",
-       "randomincategory-selectcategory": "بؤلمه‌دن آلیناجاق راست‌گله صحیفه: $1 $2.",
-       "randomincategory-selectcategory-submit": "گئت",
        "randomredirect": "راست‌گله یول‌لاندیرما",
        "randomredirect-nopages": "«$1» آدفضاسیندا هئچ بیر یول‌لاندیرما یوخدور.",
        "statistics": "آمارلار",
        "querypage-disabled": "پِرفورمانس اوچون بو اؤزل صحیفه باغلانیب‌دیر.",
        "booksources": "کیتاب قایناقلاری",
        "booksources-search-legend": "کیتاب قایناقلارین آختار",
-       "booksources-go": "گئت",
        "booksources-text": "آشاغیدا یئنی و ایشلنمیش کیتاب‌لار ساتان خاریجی کئچیدلرده سیز آختاردیغینیز کیتاب حاقیندا علاوه معلومات آلا بیلرسیز:",
        "booksources-invalid-isbn": "وئریلن ISBN اعتبارسیز کیمی گؤرونور؛ اورجینال قایناق‌دان کوپیالاما اشکالار اوچون نظارت ائدین.",
        "specialloguserlabel": "ایجراچی",
        "wlheader-enotif": "ایمیل ایله بیلدیریش آچیلیب‌دیر.",
        "wlheader-showupdated": "سون گؤروشونوزدن سونرا ائدیلن دییشیکلیکلر '''قالین''' گؤستریلیبدیلر.",
        "wlnote": "آشاغیداکی {{PLURAL:$1|'''$1''' ديَیشیک‌لیک|'''$1'''ديَیشیک‌لیک}}  سون {{PLURAL:$2|ساعتدا|'''$2''' ساعتدا}} ائدیلمیشدیر.$3، $4",
-       "wlshowlast": "سون $1 ساعات $2 گون گؤستر $3",
+       "wlshowlast": "سون $1 ساعات $2 گون گؤستر",
        "watchlist-options": "ایزله‌دیکلر سئچمه‌لری",
        "watching": "ایزله‌نیلیر...",
        "unwatching": "ایزله‌مه...",
        "import": "صحیفه‌لری ایدخال ائت",
        "importinterwiki": "ویکیلر اراسی چیخارما",
        "import-interwiki-text": "ایچه کؤچورمک اوچون بیر wiki و صحیفه باش‌لیغی سئچین.\nرئویزیون تاریخ‌لری و یازارلارین آدلاری قورونا‌جاق.\nبوتون ویکیلئراراسی ایچه کؤچورمه حرکت‌لری [[Special:Log/import|ایچه کؤچورمه گوندلیگینده]] یازیلماقدا‌دیر.",
-       "import-interwiki-source": "قایناق ویکی/صحیفه:",
        "import-interwiki-history": "صحیفه‌نین دییشمه تاریخچه‌لری‌نین هامی‌سینی کؤچور",
        "import-interwiki-templates": "بوتون شابلون‌لارلا بیرلیکده",
        "import-interwiki-submit": "ایچری توکمه اولسون",
        "exif-urgency-low": "آز ($1)",
        "exif-urgency-high": "چوخ($1)",
        "exif-urgency-other": "ایستیفاده‌چی طرفین‌دن مویین اولونموش بیرینجی‌لیک ($1)",
-       "watchlistall2": "بوتون",
        "namespacesall": "بوتون",
        "monthsall": "بوتون",
        "confirmemail": "ایمیل-پوست اونوانینی تصدیق ائت",
index b92e7b6..ffc411f 100644 (file)
        "passwordreset-emailsent-capture": "Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон хат ебәрелде, уның тексы түбәндә бирелә:",
        "passwordreset-emailerror-capture": "Серһүҙҙе ташлау тураһында хәбәр итеүсе электрон хат булдырылғайны, ләкин уны  {{GENDER:$2|kullanıcıya}} түбәндәге сәбәп арҡаһында ебәреп булманы: $1",
        "changeemail": "Электрон почта адресын үҙгәртергә",
-       "changeemail-header": "Электрон почта адресын үҙгәртеү",
        "changeemail-text": "Электрон почта адресығыҙҙы үҙгәртеү өсөн түбәндәге форманы тултырығыҙ. Үҙгәртеүҙәрҙе раҫлау өсөн серһүҙегеҙҙе керетеү кәрәк буласаҡ.",
        "changeemail-no-info": "Был биткә туранан ирешеү өсөн һеҙгә системала танылыу кәрәк.",
        "changeemail-oldemail": "Хәҙерге электрон почта адресы:",
        "changeemail-none": "(юҡ)",
        "changeemail-password": "{{SITENAME}} прокты өсөн серһүҙегеҙ:",
        "changeemail-submit": "Адресты үҙгәртергә",
-       "changeemail-cancel": "Кире алырға",
        "resettokens": "Токендарҙы ташларға",
        "resettokens-text": "Иҫәп яҙмағыҙ менән бәйләнгән ҡайһы бер шәхси мәғлүмәттәрегеҙгә инеүгә юл асыусы токендарҙы ташлай алаһығыҙ.\n\nЯңылыштан уларҙы берәйһе менән уртаҡлашҡан  йәки аккаунтығыҙ ваттырылған осраҡта быны эшләү мотлаҡ.",
        "resettokens-no-tokens": "Ташлар өсөн токендар юҡ.",
        "searchrelated": "ҡағылышлы",
        "searchall": "барыһы",
        "showingresults": "Түбәндә №&nbsp;<strong>$2</strong> һөҙөмтәнән башлап <strong>$1</strong> {{PLURAL:$1|һөҙөмтә}} күрһәтелгән.",
-       "showingresultsheader": "'''$4''' өсөн '''$3''' һөҙөмтәнән {{PLURAL:$5|1='''$1''' һөҙөмтә|'''$1 - $2''' арауығындағы һөҙөмтәләр}}",
        "search-nonefound": "Был һорауға яуап биреүсе һөҙөмтәләр табылманы.",
        "powersearch-legend": "Киңәйтелгән эҙләү",
        "powersearch-ns": "Исем аралыҡтарында эҙләү:",
        "randomincategory": "Категориялағы осраҡлы бит",
        "randomincategory-invalidcategory": "$1 тигән категория юҡ.",
        "randomincategory-nopages": "[[:Category:$1|$1]] категорияһында биттәр юҡ.",
-       "randomincategory-selectcategory": "$1 $2 категорияһынан осраҡлы биткә күсергә.",
-       "randomincategory-selectcategory-submit": "Күсергә",
        "randomredirect": "Осраҡлы биткә күсеү",
        "randomredirect-nopages": "\"$1\" исемдәр арауығында йүнәлтеүҙәр юҡ.",
        "statistics": "Статистика",
        "querypage-disabled": "Был махсус бит һөҙөмтәлелекте арттырыу өсөн ябылған.",
        "booksources": "Китап сығанаҡтары",
        "booksources-search-legend": "Китап сығанаҡтарын эҙлә",
-       "booksources-go": "Эҙлә",
        "booksources-text": "Түбәндәге исемлектә — китаптар һатыу менән шөғөлләнеүсе сайттарға һәм китапханаларҙың эҙләү системаларына һылтанмалар, һәм уларҙа һеҙ эҙләгән китаптар тураһында өҫтәмә мәғлүмәт булыуы мөмкин.",
        "booksources-invalid-isbn": "Күрһәтелгән ISBN номерҙа хата булырға тейеш. Зинһар, номерҙы сығанаҡтан дөрөҫ күсереүегеҙҙе тикшерегеҙ.",
        "specialloguserlabel": "Башҡарыусы:",
        "wlheader-enotif": "Электрон почта аша белдереү индерелгән.",
        "wlheader-showupdated": "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
        "wlnote": "Түбәндә $3 $4 ваҡытына тиклем аҙаҡҡы {{PLURAL:$2|1=сәғәт|'''$2''' сәғәт}} эсендә эшләнгән {{PLURAL:$1|1=үҙгәртеү|'''$1''' үҙгәртеү}} күрһәтелгән.",
-       "wlshowlast": "Һуңғы $1 сәғәт $2 көн өсөн күрһәт $3",
+       "wlshowlast": "Һуңғы $1 сәғәт $2 көн өсөн күрһәт",
        "watchlist-options": "Күҙәтеү исемлеге көйләүҙәре",
        "watching": "Күҙәтеү исемлегенә өҫтәү...",
        "unwatching": "Күҙәтеү исемлегенән сығарыу...",
        "import": "Биттәрҙе тейәү",
        "importinterwiki": "Вики проекттар-ара индереү",
        "import-interwiki-text": "Вики проектты һәм тейәлә торған биттең исемен күрһәтегеҙ.\nҮҙгәртеү ваҡыттары һәм автор исемдәре һаҡланасаҡ.\nБөтә вики проекттары-ара тейәүҙәр [[Special:Log/import|тейәү яҙмалары журналында]] теркәлә.",
-       "import-interwiki-source": "Сығанаҡ вики проект/бит:",
        "import-interwiki-history": "Был биттең бөтә үҙгәртеү тарихын яҙҙырырға",
        "import-interwiki-templates": "Бөтә ҡалыптарҙы индерергә",
        "import-interwiki-submit": "Тейәргә",
        "exif-urgency-low": "Түбән ($1)",
        "exif-urgency-high": "Юғары ($1)",
        "exif-urgency-other": "Ҡулланыусы билдәләгән өҫтөнлөк ($1)",
-       "watchlistall2": "бөтә",
        "namespacesall": "бөтә",
        "monthsall": "бөтә",
        "confirmemail": "Электрон почта адресын раҫлау",
        "logentry-rights-rights-legacy": "$1  $3 өсөн төркөмдәрҙәге ағзалыҡты {{GENDER:$2|үҙгәртте}}",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|}} автоматик рәүештә {{GENDER:$2|}} $4 урынына $5 ителде.",
        "rightsnone": "(юҡ)",
+       "revdelete-summary": "үҙгәртеүҙәр тасуирламаһы",
        "feedback-bugornote": "Әгәр Һеҙ техник проблеманы ентекле рәүештә аңлатырға теләһәгеҙ, зинһар, [$1 хата тураһында белдерегеҙ].\nБашҡа осраҡта, ошо ябай форманы ҡуллана алаһығыҙ. Комментарийығыҙ «[$3 $2]» битенә ҡулланыусы исемегеҙ һәм браузер мәғлүмәте менән өҫтәләсәк.",
        "feedback-subject": "Тема:",
        "feedback-message": "Хәбәр:",
index 4ebcf4a..bdf4172 100644 (file)
        "search-interwiki-more": "(mea)",
        "searchrelated": "vawandt",
        "searchall": "olle",
-       "showingresultsheader": "{{PLURAL:$5|Ergebnis '''$1''' vo '''$3'''|Ergebniss '''$1–$2''' vo '''$3'''}} fia '''$4'''",
        "search-nonefound": "Fia dei Suachofrog gibts koa Ergebnis",
        "powersearch-legend": "Daweiterde Suach",
        "powersearch-ns": "Suach in Nåmensraim:",
        "pager-older-n": "{{PLURAL:$1|vorheriga|vorherign $1}}",
        "booksources": "ISBN-Suach",
        "booksources-search-legend": "Suach noch Bezugsquejn fia Biacha",
-       "booksources-go": "Suach",
        "log": "Logbiacha",
        "all-logs-page": "Olle effmtlichen Logbiacher",
        "alllogstext": "Des is de kombinierte Anzeige vo alle in {{SITENAME}} gführten Logbiacha. Die Ausgabe ko durch de Auswahl vom Logbuchtyp, vom Benutzer oder vom Seitntitel eigschränkt wern.",
        "wlheader-enotif": "Da E-Mail-Benoochrichtigungsdeanst is aktivierd.",
        "wlheader-showupdated": "Seiten mid noh néd gseengne Änderrungen wern '''fett''' dorgstöd.",
        "wlnote": "Es {{PLURAL:$1|fóigt d' létzde Änderrung|fóing d' létzden '''$1''' Änderrungen}} voh da/dé {{PLURAL:$2|Stund| '''$2''' Stunden}}. Staund: $3, $4 Uar.",
-       "wlshowlast": "Zoag dé Änderrungen voh dé létzden $1 Stunden, $2 Dog óder $3 (in dé létzden 30 Dog).",
+       "wlshowlast": "Zoag dé Änderrungen voh dé létzden $1 Stunden, $2 Dog óder  (in dé létzden 30 Dog).",
        "watchlist-options": "Mei Beobochta: Optiona",
        "watching": "Beówochten ...",
        "unwatching": "Néd Beówochten",
        "metadata-fields": "De foigandn Fejda vo de EXIF-Metadaten, wo im MediaWiki-Systemtext ogebm san, wean auf Buidbschriebseitn mid eikloppta Metadatentabejn ozoagt.\nWeidane wean standardmassi ned ozoagt.\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-gpsspeed": "Gschwindigkeid vom GPS-Empfänger",
        "exif-componentsconfiguration-0": "Gibts néd",
-       "watchlistall2": "olle",
        "namespacesall": "olle",
        "monthsall": "olle",
        "confirmemail": "E-Post-Adressn bestäting (Authentifiziarung)",
        "htmlform-selectorother-other": "Åndre",
        "logentry-move-move_redir": "$1 hod de Seitn $3 af $4 {{GENDER:$2|verschom}} und hod dabei a Weidaloatung ibaschriem",
        "logentry-move-move_redir-noredirect": "$1 hod de Seitn $3 af $4 {{GENDER:$2|verschom}} und dabei a Weidaloatung ibaschriem, ohne a neiche ozlegn",
+       "revdelete-summary": "Zåmmfossungskommentar",
        "searchsuggest-search": "Suach",
        "searchsuggest-containing": "Voitextsuach noch ..."
 }
index 87ea98d..3d2573b 100644 (file)
        "passwordreset-emailsent-capture": "یک ایمیلء پر پسورد واترء واسته که جهلیگء پیش دارگ بیت، راهیگ بیتگ انت.",
        "passwordreset-emailerror-capture": "واترین ایمیل، که جهلیگء پیش دارگ بیت، اڈ بوت، بلئی آئی راهیگ پر {{GENDER:$2|کاربر}} پکا نبوت: $1",
        "changeemail": "ایمیل ادرسء ٹگل بدئ",
-       "changeemail-header": "وتی اکانتء ایمیل ادرسء ٹگل بدئ",
        "changeemail-text": "ائ فرمء پکا کن ات تانکه شمئی ایمیلء ٹگل به بیت. پریشی که ائ تغییرء تایید کن ات ضرور انت وتی پسوردء بلک ات.",
        "changeemail-no-info": "پر یکپارگین دزرسی مان ائ تاکء پیکن لاگین کن ات.",
        "changeemail-oldemail": "انیگین ایمیل ادرس:",
        "changeemail-none": "هج کجام",
        "changeemail-password": " {{SITENAME}} شمئی پسورد:",
        "changeemail-submit": "ایمیلء ٹگل بدئ",
-       "changeemail-cancel": "کنسیل",
        "changeemail-throttled": "شما انیگ پر لاگین کتنء چنت بار جهد کتگ ات. دزبندی انت پیسر چه پدایین جهدء $1 موه بداریت.",
        "resettokens": "پجاروکان(tokens)ی واتر",
        "resettokens-text": "شما توان ات پجاروکان(tokens) که دزرسیء اجازت پر شمئی وتیگین دیتا همگرنچ گون شمئی اکانتء دینت، واتر بکن ات.\nهما درگتء ائ کار بیت کنت که نامالومین شهسء شمئی اکانتء لاگین کتگ انت.",
        "searchall": "کل",
        "showingresults": "جهل پیش دارگنت تا  {{PLURAL:$1|'''1'''نتیجه|'''$1''' نتایج}} شروع بنت گون #'''$2'''.",
        "showingresultsinrange": "پیش دارگ مان جهلء تان {{PLURAL:$1|<strong>1</strong> نتیجگ|<strong>$1</strong> نتیجگ}} in range #<strong>$2</strong> تان #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|نتیجه '''$1''' چه '''$3'''|نتایج '''$1 - $2''' چه '''$3'''}} په '''$4'''",
        "search-nonefound": "نتیجه هم دپ په درخواست نیست",
        "powersearch-legend": "گردگ پیشرفته",
        "powersearch-ns": "گردگ ته نام فضا آن",
        "booksources": "منابع کتاب",
        "booksources-search-legend": "گردگ په منابع کتاب",
        "booksources-isbn": "شابک:",
-       "booksources-go": "برو",
        "booksources-text": "چهلا یک لیستی چه لینکان په دگه سایتان هست که نوکین  یا مستعمل این کتاب بها کنند و شما شاید گیشترین اطلاعات آی کتابانی باره که پرش گردیت در گیزیت:",
        "booksources-invalid-isbn": "داتگین شماره کتاب چوش که جاه کیت درست نهنت, خطایانءِ بچار چه اصلی جاگاه کپی کن",
        "specialloguserlabel": "کاربر:",
        "wlheader-enotif": "اخطار ایمیل فعالنت.",
        "wlheader-showupdated": "صفحات که عوض بوتگنت چه شمی آهری چارتن '''پررنگ''' پیش دراگ بنت.",
        "wlnote": "جهلء {{PLURAL:$1|آهرین تغییر هست|آهرین هست'''$1''' تغییرات}} ته آهرین {{PLURAL:$2|ساعت|'''$2''' ساعات}}.",
-       "wlshowlast": "پیش دار آهرین $1  ساعات $2 روچان $3",
+       "wlshowlast": "پیش دار آهرین $1  ساعات $2 روچان",
        "watchlist-options": "گزینه یان لیست چارگ",
        "watching": "چارگ بین",
        "unwatching": "نه چارگ بیت",
        "delete-edit-reasonlist": "اصلاح کن دلایل حذفء",
        "delete-toobig": "صفحهء یک مزنین تاریح اصلاحی هست گیشتر چه $1 {{PLURAL:$1|بازبینی|بازبینی}}.\nحذف چوشین صفحات په خاظر جلو گر چه ناگهانی اتفاق ته سایت {{SITENAME}} ممنوع بوتت.",
        "delete-warning-toobig": "ای صفحه  مزنین تاریح اصلاح هست، گیش چه  $1 {{PLURAL:$1|بازبینی|بازبینی}}.\nحذف آی شاید کار دیتابیس  {{SITENAME}} قطع کنت؛\nگون اخطار پیش روت.",
-       "delete-cantedit": "شما نه توانیت ای صپحا پاک کنیت بی خاطیریکه شما اجازه نداریت آیرا ایڈیت کنیت.",
        "rollback": "پشت ترگ اصلاحات",
        "rollback_short": "پشتررگ",
        "rollbacklink": "عقب ترگ",
        "import": "وارد کن صفحاتء",
        "importinterwiki": "ورود بین ویکی",
        "import-interwiki-text": "یک ویکی و  عنوان صفحه انتخاب کن په ورود.\nتاریح بازبینی و نامان اصلاح کنوکان دارگ بیت.\nکل کاران ورود بین ویکی وارد بیت نه [[Special:Log/import|ورود آمار]].",
-       "import-interwiki-source": "ویکی بن در/صفحه:",
        "import-interwiki-history": "کپی کن کل بازبینی آن تاریح په ای صفحه",
        "import-interwiki-templates": "کل تمپلت هور بنت",
        "import-interwiki-submit": "ورود",
        "exif-gpsdestdistance-n": "دریایی مایل",
        "exif-gpsdirection-t": "جهت درست",
        "exif-gpsdirection-m": "مسیر آهن ربایی",
-       "watchlistall2": "کل",
        "namespacesall": "کل",
        "monthsall": "کل",
        "confirmemail": "آدرس ایمیل تایید کن",
        "revdelete-restricted": "محدودیت آن په مدیران سیستم بوت",
        "revdelete-unrestricted": "به زور چه مدیران سیستم محدودیتان",
        "rightsnone": "(هچ یک)",
+       "revdelete-summary": "خلاصه اصلاح",
        "expandtemplates": "پچ کن تمپلیت آنء",
        "expand_templates_intro": "ای صفحه حاص لهتی متنء گریت و کل تمپلتان ته آییء برگشتی مزنش کنت.\nآیی هنچوش عمگر تجزیه کنوکء مزن کنت په داب\n<nowiki>{{</nowiki>#language:…}}, و متغییرانی په داب\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash; در حقیقت هر چیزی که ته دو براکتن.\nآیی ای کارء گون توار کنگ تجزیه کنوک مناسب چه مدیا وی کی وت انجام دنت.",
        "expand_templates_title": "عنوان متن په {{FULLPAGENAME}} و دگه.:",
index 1448030..ba2b274 100644 (file)
@@ -12,9 +12,9 @@
                ]
        },
        "tog-underline": "Linyahan an kilyawan:",
-       "tog-hideminor": "Tagoon an saradít na paghira sa nakakaagi pa sanang pagbabàgo",
+       "tog-hideminor": "Tagoon an saradít na mga pagliwat sa dae pa sana nahaloy na mga pagbabàgo",
        "tog-hidepatrolled": "Tagóa an patrolyadong mga paghirá sa nakakaági pa sanáng pagbabàgo",
-       "tog-newpageshidepatrolled": "Tagoon an patrolyadong mga pahina gikan sa listahan kan bàgong pahina",
+       "tog-newpageshidepatrolled": "Tagoon an patrolyadong mga pahina gikan sa baguhong listahan nin pahina",
        "tog-extendwatchlist": "Palakbanga an bantay-listahan (watchlist) na maipahiling an gabos na pinagbago, bako sana an pinakahurihang binago",
        "tog-usenewrc": "Pangrupong mga kaliwatan sa kada pahina kan mga dae pa sana nahaloy na mga kaliwatan asin bantay-listahan",
        "tog-numberheadings": "Tolos-bilang na mga pamayohán",
@@ -27,7 +27,7 @@
        "tog-watchdeletion": "Idagdag an mga pahina asin mga sagunson na ako an nagpura sa sakong bantay-listahan",
        "tog-minordefault": "Markahán gabos na saradit na pagliwat sa paaging panugmad",
        "tog-previewontop": "Ipahilíng an patànaw bàgo an kahon nin paghirá",
-       "tog-previewonfirst": "Ipahiling an patànaw sa inot na paghira",
+       "tog-previewonfirst": "Ipahiling an patànaw sa enot na pagliwat",
        "tog-enotifwatchlistpages": "E-suratan mo ako kunsoarin an sarong pahina o sagunson na yaon sa sakong bantay-listahan pinagliwat",
        "tog-enotifusertalkpages": "E-koreohan ako pag pigribáyan an pahina kan sakóng olay",
        "tog-enotifminoredits": "E-suratan man ako para sa saraditon na mga pagliwat kan mga pahina asin mga sagunson",
@@ -50,7 +50,7 @@
        "tog-useeditwarning": "Patanidan ako kunsoarin na ako nagbaya sa pahinang pigliliwat na dae naitatagama an mga kaliwatan",
        "tog-prefershttps": "Pirmeng gumamit nin sarong seguradong koneksyon kunsoarin na ika nakalaog na",
        "underline-always": "Parati",
-       "underline-never": "Dai lamang",
+       "underline-never": "Dae pa lamang",
        "underline-default": "Kublit o kilyaw na panugmad",
        "editfont-style": "Baguhon an estilo nin kalwig sa sinasakupan",
        "editfont-default": "Kilyawang tugmad",
        "june-date": "Hunyo $1",
        "july-date": "Hulyo $1",
        "august-date": "Agosto $1",
-       "september-date": "Setyembre $1",
+       "september-date": "Septyembre $1",
        "october-date": "Oktobre $1",
        "november-date": "Nobyembre $1",
-       "december-date": "Desyembre $1",
+       "december-date": "Disyembre $1",
        "pagecategories": "{{PLURAL:$1|Kategorya|Mga kategorya}}",
        "category_header": "Mga pahina sa kategoryang \"$1\"",
        "subcategories": "Mga sub-kategorya",
        "category-media-header": "Media sa kategoryang \"$1\"",
-       "category-empty": "''Ining kategorya mayong laog na mga pahina o media sa ngunyan.''",
+       "category-empty": "''Ining kategorya sa ngunyan mayong laog nin mga pahina o midya.''",
        "hidden-categories": "{{PLURAL:$1|Nakatagong kategorya|Mga nakatagong kategorya}}",
        "hidden-category-category": "Mga nakatagong kategorya",
        "category-subcat-count": "{{PLURAL:$2|Ining kategorya igwa sana kan minasunod na sub-kategorya.|Ining kategorya igwa kan minasunod {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
        "category-article-count-limited": "An minasunod na {{PLURAL:$1|pahina|$1 mga pahina}} yaon sa presenteng kategorya.",
        "category-file-count": "{{PLURAL:$2|Ining kategorya naglalaman sana kan minasunod na sagunson.|An minasunod {{PLURAL:$1|sagunson iyo|$1 na mga sagunson iyo}} sa kategoryang ini, na ginahi sa $2 sa kabilogan.}}",
        "category-file-count-limited": "An minasunod {{PLURAL:$1|na sagunson|$1 na mga sagunson}} yaon sa presenteng kategorya.",
-       "listingcontinuesabbrev": "sunod",
+       "listingcontinuesabbrev": "kasumpay",
        "index-category": "Panhinukdong mga pahina",
        "noindex-category": "Bakong panhinukdong mga pahina",
        "broken-file-category": "Mga pahina na igwang nagkaparasa na sagunsong kilyawan",
        "about": "Manonongod",
        "article": "Laog na pahina",
        "newwindow": "(minabukas sa bàgong bintanà)",
-       "cancel": "Pondohon",
+       "cancel": "Kanselaron",
        "moredotdotdot": "Kadagdagan...",
-       "morenotlisted": "Kulang ining listahan.",
+       "morenotlisted": "Ining listahan bakong kumpleto.",
        "mypage": "Pahina",
        "mytalk": "Mag-ulay",
-       "anontalk": "Urulay para kaining IP address",
+       "anontalk": "Urulay para kaining IP estada",
        "navigation": "Paglibotlibot",
        "and": "&#32;asin",
        "qbfind": "Maghanap",
        "qbedit": "Liwaton",
        "qbpageoptions": "Ining pahina",
        "qbmyoptions": "Sakong mga pahina",
-       "faq": "PH (Parating Hapot)",
-       "faqpage": "Proyekto:PH (Parating Hapot)",
+       "faq": "PHK (Pirmehang Hinahapot na mga Kahaputan)",
+       "faqpage": "Proyekto:PHK",
        "actions": "Mga paghiro",
        "namespaces": "Mga espasyong ngaran",
-       "variants": "Mga lain pa",
-       "navigation-heading": "Hihilngan nin paglibotlibot",
+       "variants": "Mga Kinalaenan",
+       "navigation-heading": "Hihilngan sa paglibotlibot",
        "errorpagetitle": "Salâ",
        "returnto": "Magbalik sa $1.",
        "tagline": "Gikan sa {{SITENAME}}",
-       "help": "Tabang",
+       "help": "Katabangan",
        "search": "Maghanap",
        "searchbutton": "Maghanap",
        "go": "Dumani",
        "protectthispage": "Protektaran ining pahina",
        "unprotect": "Ribayan an proteksyon",
        "unprotectthispage": "Ribayan an proteksyon kaining pahina",
-       "newpage": "Bàgong pahina",
+       "newpage": "Bàguhong pahina",
        "talkpage": "Urulayan ining pahina",
        "talkpagelinktext": "Mag-ulay",
-       "specialpage": "Sadyang Pahina",
-       "personaltools": "Pansadiring mga kagamitan",
+       "specialpage": "Espesyal na pahina",
+       "personaltools": "Pansadiring mga gamiton",
        "articlepage": "Tànawon an laog kan pahina",
-       "talk": "Urulay",
-       "views": "Mga tànaw",
-       "toolbox": "Mga gamit:",
+       "talk": "Urulayan",
+       "views": "Mga Tanawon",
+       "toolbox": "Mga gamiton:",
        "userpage": "Tànawon an pahina kan paragamit",
        "projectpage": "Tànawon an pahina kan proyekto",
-       "imagepage": "Hilingon an pahina nin sagunson (file)",
+       "imagepage": "Tànawon an pahina nin sagunson (file)",
        "mediawikipage": "Tànawon an pahina kan mensahe",
        "templatepage": "Tànawon an pahina kan panguyog",
        "viewhelppage": "Tànawon an pahina nin pagtabang",
        "categorypage": "Tànawon an pahina nin kategorya",
        "viewtalkpage": "Tànawon an urulay",
-       "otherlanguages": "Sa ibang mga tataramon",
-       "redirectedfrom": "(Inilikay gikan sa $1)",
-       "redirectpagesub": "Likay na pahina",
+       "otherlanguages": "Sa ibang mga lengguwahe",
+       "redirectedfrom": "(Pinagbalikwat gikan sa $1)",
+       "redirectpagesub": "Balikwaton an pahina",
+       "redirectto": "Balikwaton pasiring sa:",
        "lastmodifiedat": "Ining pahina huring pinagbago kan $1, mga alas $2.",
        "viewcount": "Ining pahina pinaglaog nin {{PLURAL:$1|sarong beses|nin $1 beses}}.",
        "protectedpage": "Protektadong pahina",
        "toc": "Mga laog",
        "showtoc": "ipahiling",
        "hidetoc": "tagoon",
-       "collapsible-collapse": "Ibagsak",
-       "collapsible-expand": "Ibuka",
+       "collapsible-collapse": "Pahalipoton",
+       "collapsible-expand": "Pahiwason",
+       "confirmable-yes": "Iyo",
+       "confirmable-no": "Dae",
        "thisisdeleted": "Hilingon o isulit an $1?",
        "viewdeleted": "Hilingon an $1?",
        "restorelink": "{{PLURAL:$1|sarong pinagpurang pagliwat|$1 na pinagpurang mga pagliwat}}",
        "feedlinks": "Hungit:",
        "feed-invalid": "Imbalidong tipo nin hungit sa subkripsyon.",
-       "feed-unavailable": "Mayò an mga sindikasyon na hungit",
+       "feed-unavailable": "Mga sindikasyong hungit dae magagamit",
        "site-rss-feed": "$1 Hungit nin RSS",
        "site-atom-feed": "$1 Hungit Atomo",
        "page-rss-feed": "\"$1\" Hungit na RSS",
        "nosuchspecialpage": "Mayong siring na espesyal na páhina",
        "nospecialpagetext": "<strong>Dai pwede an pahinang espesyal na pinilî mo.</strong>\n\nPwede mong mahiling an lista nin mga marhay na pahina sa [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Salâ",
-       "databaseerror": "Salâ sa base nin datos",
+       "databaseerror": "Kasalaan sa datos-sarayan",
        "databaseerror-text": "Sarong hapot sa datos-sarayan na kasalaan an nangyari.\nIni puwedeng minapasabot nin sarong kudol sa panuklob.",
        "databaseerror-textcl": "Sarong hapot sa datos-sarayan na kasalaan an nangyari.",
        "databaseerror-query": "Hapot: $1",
        "directorycreateerror": "Dai nagibo an direktorya na \"$1\".",
        "filenotfound": "Dai nahanap an file na \"$1\".",
        "unexpected": "Dai pighuhunà na balór: \"$1\"=\"$2\".",
-       "formerror": "Salâ: dai pwedeng isumitir an porma",
-       "badarticleerror": "Dai pwedeng gibohon ini sa ining páhina.",
+       "formerror": "Salâ: Dae maisusumiter an porma.",
+       "badarticleerror": "Ining aksyon dae magigibo sa pahinang ini.",
        "cannotdelete": "An pahina o an sagunson (file) na \"$1\" dae tabi napupura.\nIni puwede nang napura kan iba.",
        "cannotdelete-title": "Dae mapura an pahina na \"$1\"",
        "delete-hook-aborted": "An pagpura pinundo kan pangawit.\nIni dae nagtao nin kapaliwanagan.",
        "badtitletext": "An pinaghagad na titulo kan pahina imbalido, daeng laog, o sarong salaon na sinugpunan na titulo kan inter-lengguwahe o inter-wiki.\nIni gayod may laog nin o dakol na mga karakter na dae pinaggagamit sa mga titulo.",
        "perfcached": "An minasunod na datos pinagtago asin bakong gayo napapanahon. An maximum na {{PLURAL:$1|sarong resulta na|$1 mga resulta na}} yaon sana sa pinagtago.",
        "perfcachedts": "An minasunod na datos pinagtago, asin huring pinagdagdagan kan $1. An maximum na {{PLURAL:$4|sarong result na |$4 mga resulta na }} yaon sana sa pinagtago.",
-       "querypage-no-updates": "Pigpopogol mùna an mga pagbabàgo sa pahinang ini. Dai mùna mababàgo an mga datos digdi.",
+       "querypage-no-updates": "Mga kasugponan para sa pahinang ini sa ngunyan pinagpupugulan. An datos na yaon digde dae sa presente maipagpresko.",
        "viewsource": "Hilingón an ginikanan",
        "viewsource-title": "Hilnga an piggikanan para sa $1",
        "actionthrottled": "An aksyon pinagpugulan",
        "actionthrottledtext": "Bilang sarong pangontra sa spam, ika limitadong sanang himoon ining aksyon sa kadakulon na beses sa halipot sanang panahon, asin ika nakasobra na sa limitasyong ini.\nPaki-otroha giraray sa nagkapirang minuto sana.",
        "protectedpagetext": "Ining pahina protektado tanganing malikayan an pagliliwat o ibang aksyon.",
-       "viewsourcetext": "Pwede mong hilingón asin arógon an ginikanan kan pahinang ini:",
+       "viewsourcetext": "Ika makakatanaw asin makakakopya sa ginikanan kaining pahina:",
        "viewyourtext": "Saimong mahihiling asin makokopya an gikanan kan '''saimong mga pinagriliwat''' sa pahinang ini:",
        "protectedinterface": "An pahinang ini nagtatao nin panlaog-olay para sa software, asin protektado tangaring malikayan an abuso.\nSa pagdagdag or pagliwat nin mga dakit-taramon para sa bilog na wiki, gamita tabi an [//translatewiki.net/translatewiki.net], an MediaWiki sa proyektong lokalisasyon.",
        "editinginterface": "'''Patanid:''' Ika nagliliwat kan pahina na ginagamit sa pagtao nin pantahaw-olay na teksto para sa software.\nAn mga pagbabago kaining pahina makaka-apekto sa hitsura kan pantahaw-olay nin paragamit para sa iba man na paragamit.\nPara sa mga pagdadakit-taramon, pakikonsidera man tabi an paggagamit kan [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], an MediaWiking lokalisasyon kan proyekto.",
-       "cascadeprotected": "Pinoprotehirán ining páhina sa mga paghirá, ta sarô ini sa mga minasunod na {{PLURAL:$1|páhina|mga páhina}} na pinoprotehiran kan opsyón na \"katarata\" na nakabuká:\n$2",
-       "namespaceprotected": "Mayô kang permisong maghirá kan mga páhina sa '''$1''' ngaran-espacio.",
+       "cascadeprotected": "Ining pahina pinagprotehiran gikan sa pagliliwat nin huli ta ini pinagbale sa minasunod na {{PLURAL:$1|pahina, na iyo ngani an|mga pahina, na iyo ngani an mga}} protektado kan pinagbukasang opsyon na \"pasurunod-sunudan\":\n$2",
+       "namespaceprotected": "Ika mayong permiso sa pagliwat nin mga pahina sa <strong>$1</strong> na ngarang-espasyo.",
        "customcssprotected": "Ika mayong permiso sa pagliwat kaining pahinang CSS, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.",
        "customjsprotected": "Ika mayong permiso sa pagliwat kaining pahinang JavaScript, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.",
        "mycustomcssprotected": "Ika mayo nin permiso sa pagliwat kaining CSS na pahina.",
        "mycustomjsprotected": "Ika mayo nin permiso sa pagliwat kaining JavaScript na pahina.",
        "myprivateinfoprotected": "Ika daeng permiso na magliliwat kan pribado mong impormasyon.",
        "mypreferencesprotected": "Ika daeng permiso na magliliwat kan saimong mga kamuyahan.",
-       "ns-specialprotected": "An mga pahinang nasa {{ns:special}} na liang-liang dai pwedeng hirahón.",
+       "ns-specialprotected": "Mga espesyal na pahina dae makakapagliwat.",
        "titleprotected": "Ining titulo pinagprotektaran poon pagkamukna ni [[User:$1|$1]].\nAn rason na pinagtao iyo na \"''$2''\".",
        "filereadonlyerror": "Dae kinayang baguhon an sagunson (file) \"$1$ nin huli ta an repositoryo kan sagunson \"$2\" yaon sa kamugtakan na basahon sana.\n\nAn administrador na iyo an nagkandado kaini nagpahayag kaining kapaliwanagan: \"$3\".",
        "invalidtitle-knownnamespace": "Imbalidong titulo na igwang espasyadong ngaran na \"$2\" asin teksto na \"$3\"",
        "invalidtitle-unknownnamespace": "Imbalidong titulo na igwang nin bakong bistado na bilang kan espasyadong ngaran na $1 asin teksto na \"$2\"",
-       "exception-nologin": "Dai ka nakalaog",
-       "exception-nologin-text": "Tabi man [[Special:Userlogin|maglaog]]na tanganing makalangkay sa pahinang ini o aksyon.",
+       "exception-nologin": "Dai ka nakapaglaog",
+       "exception-nologin-text": "Pakipalaog tabi tanganing makalangkay sa pahinang ini o aksyon.",
        "exception-nologin-text-manual": "Tabi man $1 na tanganing makalangkay sa pahinang ini o aksyon.",
        "virus-badscanner": "Raot na kasalansanan: Bakong bistadong virus scanner: ''$1''",
        "virus-scanfailed": "An paghingipid (scan) nagpalya (Koda $1)",
        "userlogin-yourname": "Paragamit-na-Ngaran",
        "userlogin-yourname-ph": "Ikaag an saimong paragamit-na-ngaran",
        "createacct-another-username-ph": "Ikaag an paragamit-na-ngaran",
-       "yourpassword": "Sekretong Panlaog",
-       "userlogin-yourpassword": "Sekretong Panlaog",
+       "yourpassword": "Pasa-taramon:",
+       "userlogin-yourpassword": "Pasa-taramon",
        "userlogin-yourpassword-ph": "Ikaag an saimong sekretong panlaog",
        "createacct-yourpassword-ph": "Ikaag an sekretong panlaog",
        "yourpasswordagain": "Pakilaog giraray kan sekretong panlaog:",
        "php-mail-error-unknown": "Bakong bantog na kasalaan sa PHP mail() function.",
        "user-mail-no-addy": "Nagprubar na magpadara nin e-koreo na mayo nin e-koreong address.",
        "user-mail-no-body": "Nagprubar na magpadara nin e-surat na mayong laman o daeng kanultulan na halipot an hawak.",
-       "changepassword": "Ribayan an sekretong panlaog",
+       "changepassword": "Ribayan an pasa-taramon",
        "resetpass_announce": "Sa pagtapos kan paglalaog mo, ika kaipuhanan na magkaag nin sarong baguhong pasa-taramon.",
        "resetpass_text": "<!-- Magdagdag nin teksto digdi -->",
        "resetpass_header": "Ribayan an panindog na sekretong panlaog",
        "resetpass-no-info": "Ika dapat nakalaog na tanganing direktang makagamit kaining pahina.",
        "resetpass-submit-loggedin": "Ribayan an sekretong panlaog",
        "resetpass-submit-cancel": "I-kansela",
-       "resetpass-wrong-oldpass": "Saláng temporaryo o presenteng sekretong panlaog.\nMatriumpo mo nang nailaog an sekretong panlaog o nakua an bàgong temporaryong sekretong panlaog.",
+       "resetpass-wrong-oldpass": "Imbalidong temporaryo o sa ngunyan na pasa-taramon.\nIka matrayumpong nakapagbago na kan saimong pasa-taramon o naghagad nin sarong baguhon na temporaryong pasa-taramon.",
        "resetpass-recycled": "Tabi man pakibaguha an saimong pasa-taramon na magin sarong bagay na ibahon kesa sa ngunyan mong pasa-taramon.",
        "resetpass-temp-emailed": "Ika nakapaglaog na igwa nin sarong temporaryong koda na pinag-esurat saimo. Sa pagtapos kan paglalaog mo, ika kaipuhan na magkaag nin sarong baguhong pasa-taramon digde:",
        "resetpass-temp-password": "Temporaryong sekretong panlaog:",
        "passwordreset-emailsent-capture": "Sarong e-surat sa pagliliwat kan sekretong panlaog an ipinadara na, yaon ipinapahiling sa ibaba.",
        "passwordreset-emailerror-capture": "Sarong e-surat sa pagliliwat kan sekretong panlaog an pinagpuyos na, yaon ipinapahiling sa ibaba, alagad sa pagpapadara kaini sa {{GENDER:$2|paragamit}} nagpalya: $1",
        "changeemail": "Ribayan an e-koreong address",
-       "changeemail-header": "Ribayan an panindog na e-koreong address",
        "changeemail-text": "Kumpletoha ining porma tanganing ribayan an saimong e-koreong address. Kinakaipo mong ilaog an saimong sekretong panlaog tanganing kumpirmaron ining pagribay.",
        "changeemail-no-info": "Ika dapat nakalaog na tanganing direktang makagamit kaining pahina.",
        "changeemail-oldemail": "Presenteng e-koreong address:",
        "changeemail-none": "mayo tabi.",
        "changeemail-password": "An saimong {{SITENAME}} sikretong panlaog:",
        "changeemail-submit": "Ribayan an e-koreo",
-       "changeemail-cancel": "Kanselaha",
        "resettokens": "Pakibaguha an mga paduos",
        "resettokens-text": "Ika makakapagbago kan ma paduos na magtutugot nin kalangkayan pasiring sa siyertong datos na pribado na asosyado sa saimong panindog digde.\n\nGibohon mo ini kun aksidente mong naipagheras sinda sa kiisay man o kun an saimong panindog kompromitido na.",
        "resettokens-no-tokens": "Mayo nin mga paduos na babaguhon.",
        "bold_sample": "Mahìbog na teksto",
        "bold_tip": "Mahìbog na teksto",
        "italic_sample": "Italikong teksto",
-       "italic_tip": "Tekstong Italiko",
+       "italic_tip": "Italikong teksto",
        "link_sample": "Titulo nin sugpon",
        "link_tip": "Panlaog na sugpon",
        "extlink_sample": "http://www.example.com títulong sugpon",
        "sig_tip": "An saimong pirma na igwang tatak-oras",
        "hr_tip": "Pabalagbag na linya (gamiton paminsan-minsan)",
        "summary": "Sumaryo:",
-       "subject": "Tema/pamayohan:",
+       "subject": "Subheto/kapamayuhan:",
        "minoredit": "Ini sarong dikiton na pagliwat",
        "watchthis": "Bantayan ining pahina",
        "savearticle": "Itagáma an pahina",
        "showdiff": "Ipahiling an mga kaliwatan",
        "anoneditwarning": "'''Patanid:''' Ika dae nakapaglaog. An saimong estada kan IP maisusurat sa laog kan historiya nin pagliliwat sa pahinang ini.",
        "anonpreviewwarning": "Dae ka tabi nakalaog. An pagtatagama matala kan saimong IP address sa historya nin pagliwat sa pahinang ini.",
-       "missingsummary": "'''Paisi:''' Dai ka nagkaag nin sumád kan paghirâ. Kun pindotón mo giraray an Itagama, maitatagama an hirá mo na mayô kaini.",
-       "missingcommenttext": "Paki lâgan nin komento sa ibabâ.",
+       "missingsummary": "<strong>Pagiromdom:</strong>Ika dae pa nakapagtao nin sumaryo sa pagliwat. Kun i-klik mo an \"{{int:savearticle}}\" giraray, an saimong pagliwat ipagtatagama na mayo kaiyan.",
+       "missingcommenttext": "Pakikaag nin sarong komento sa ibaba.",
        "missingcommentheader": "'''Pagiromdom:''' Ika dae tabi nagtao nin sarong panultol (subject)/Pamayong linya (headline) para kaining sinambit mo.\nKun saimong pinduton an \"{{int:savearticle}}\" giraray, an saimong pigliwat matatagama na mayo kaiyan.",
-       "summary-preview": "Patànaw nin sumada:",
-       "subject-preview": "Patânaw nin tema/pamayohan:",
-       "blockedtitle": "Pigbágat an parágamit",
+       "summary-preview": "Paenot na patanaw nin sumaryo:",
+       "subject-preview": "Paenot na patanaw sa Subheto/kapamayuhan:",
+       "blockedtitle": "An paragamit pinagbagat",
        "blockedtext": "'''An saimong paragamit na ngaran o IP address pinagkubkob.'''\n\nAn pagkubkob hinimo ni $1.\nAn rason na ipinagtao iyo na ''$2''.\n\n* Pagpoon kan pagkubkob: $8\n* Pagpasó kan pagkubkob: $6\n* Katuyuhan kan parakubkob: $7\n\nIka puwedeng magkontak sa $1 or ibang [[{{MediaWiki:Grouppage-sysop}}|administrador]] tanganing pag-orolayan an pagkubkob.\nIka dae makakagamit kan 'e-koreo kaining paragamit' na panuytuyan laen lang na may sarong balidong e-koreo address na ipinahayag sa saimong [[Special:Preferences|panindog na mga kabotan]] asin ika dae pinagkubkob para sa paggamit kaini.\nAn saimong presenteng IP address iyo $3, asin an kubkob ID iyo #$5.\nPakibale na lang tabi an gabos na mga detalye sa itaas sa anuman na mga kahaputan na saimong himoon.",
        "autoblockedtext": "An saimong IP address awtomatikong pinagkubkob nin huli ta ini pinaggamit kan ibang paragamit, na pinagkubkob ni $1.\nAn rason na ipinagtao iyo na:\n\n:''$2''\n\n* Pagpoon kan pagkubkob: $8\n* Pagpasó kan pagkubkob: $6\n* Katuyuhan kan parakubkob: $7\n\nPuwede mong kontakon si $1 o saro sa [[{{MediaWiki:Grouppage-sysop}}|mga administrador]] tanganing pag-orolayan an kubkob.\n\nPatanid tabi dae mo puwedeng gamiton an \"e-koreo kaining paragamit\" estima laen lang kun ika igwa nin sarong balidong e-koreo address na rehistrado sa saimong [[Special:Preferences|paragamit na mga kabotan]] asin ika dae pinagkubkob para sa paggamit kaini.\n\nAn saimong presenteng IP address iyo an $3, asin and Kubkob ID iyo an #$5.\nPakibale tabi an gabos na mga detalye sa itaas sa arinman na mga kahaputan na saimong himoon.",
-       "blockednoreason": "mayong itinaong rason",
-       "whitelistedittext": "Kaipuhan mong $1 tangarig makahirá nin mga páhina.",
-       "confirmedittext": "Kaipuhan mong kompirmaron an saimong ''e''-surat. Ipwesto tabî asin patunayan an saimong ''e''-surat sa [[Special:Preferences|mga kabôtan kan parágamit]].",
+       "blockednoreason": "mayong rason na ipinagtao",
+       "whitelistedittext": "Tabi man $1 tanganing makapagliwat nin mga pahina.",
+       "confirmedittext": "Ika kaipuhan na magkumpirma kan saimong estada sa e-surat bago makapagliwat nin mga pahina. Tabi man pakikaag asin balidaron an saimong estada sa e-surat sa paagi kan saimong [[Special:Mga Kamuyahan|paragamit na mga kamuyahan]].",
        "nosuchsectiontitle": "Dae managboan an seksyon",
        "nosuchsectiontext": "Ika nagprubar na liwaton an sarong seksyon na bakong eksistido.\nIni puwedeng pinagbalyo o pinagpara na habang saimong pinaghihiling an pahina.",
-       "loginreqtitle": "Kaipuhan Maglaog",
+       "loginreqtitle": "An paglaog pinaghahagad",
        "loginreqlink": "maglaog",
-       "loginreqpagetext": "Kaipuhan kang $1 tangarig makahilíng nin ibang pahina.",
-       "accmailtitle": "Napadará na an sekretong panlaog.",
+       "loginreqpagetext": "Tabi man $1 tanganing makapagtanaw kan ibang mga pahina.",
+       "accmailtitle": "Pasa-taramon naipadara na",
        "accmailtext": "An purak na pinagpuyos na pasa-taramon para ki [[User talk:$1|$1]] ipinagpadara na sa $2. Ini mapupuwedeng pagribayan sa ''[[Special:ChangePassword|change password]]'' na pahina matapos na ika nakalaog na.",
        "newarticle": "(Bàgo)",
-       "newarticletext": "Ika nakapagsunod sa sarong sugpon pasiring sa sarong pahina na bako pang eksistido. Tanganing makapagmukna nin pahina, magpoon sa pagpindot sa laog nin kahon sa ibaba (hilngon an [$1 pahina nin katabangan] para sa kadugangan na impormasyon).\nKun ika napasalang nakadigde, i-klik an  '''ibalik''' na pindutan kan saimong kilyaw.",
+       "newarticletext": "Ika nakapagsunod sa sarong sugpon pasiring sa sarong pahina na bako pang eksistido. Tanganing makapagmukna nin pahina, magpoon sa pagpindot sa laog nin kahon sa ibaba (hilngon an [$1 pahina nin katabangan] para sa kadugangan na impormasyon).\nKun ika napasalang nakadigde, i-klik an  '''ibalik''' na pindutan kan saimong kilyawan.",
        "anontalkpagetext": "----''Ini iyo an pahina kan orolayan para an sarong dae bistadong paragamit na dae pa nakapagmukna nin panindog, o dae pa nakapaggamit kaini.\nKaya kami kaipong gumamit nin numerikal na IP address sa pagbisto saiya.\nAn arog kaining IP address puwedeng maikapagheras sa nagkapirang mga paragamit.\nKun ika sarong dae pa bistadong paragamit asin mati mo na igwang irelebanteng sambit na pinanungod saimo, tabi paki [[Special:UserLogin/signup|mukna nin panindog]] or [[Special:UserLogin|maglaog ka]] tanganing malikayan an pagkaribong sa pag-iriba kan iba pang mga paragamit.''",
        "noarticletext": "Mayo tabi sa presente nin teksto sa pahinang ini.\nIka mapuwedeng [[Special:Search/{{PAGENAME}}|maghanap para sa titulo kan pahinang ini]] sa iba pang mga pahina,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa magkasurundong mga talaan],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} liwaton ining pahina]</span>.",
        "noarticletext-nopermission": "Mayong sa presente nin teksto an pahinang ini.\nIka mapuwedeng [[Special:Search/{{PAGENAME}}|hanapa para kaining titulo kan pahina]] sa iba pang mga pahina,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa magkasurundong mga talaan]</span>.",
        "sitecsspreview": "'''Giromdoma baya na ika nagtatanaw pa sana kaining CSS.'''\n'''Ini dae pa tabi naitatagama!'''",
        "sitejspreview": "'''Giromdoma baya na ika nagtatatanaw pa sana kaining koda sa JavaScript.'''\n'''Ini dae pa tabi naitatagama!'''",
        "userinvalidcssjstitle": "'''Patanid:''' Mayong ''skin'' na \"$1\". Giromdomon tabî na an .css asin .js na mga páhina naggagamit nin titulong nakasurat sa sadit na letras, halimbawa {{ns:user}}:Foo/vector.css bakong {{ns:user}}:Foo/Vector.css.",
-       "updated": "(Binàgo)",
+       "updated": "(Pinagsugpunan na)",
        "note": "'''Paisi:'''",
        "previewnote": "'''Giromdoma na ini sarong patanaw pa sana.'''\nAn saimong mga pinagriliwat dae pa tabi naitatagama!",
        "continue-editing": "Magduman sa lugar nin pagliliwat",
        "searchrelated": "kauyon",
        "searchall": "gabós",
        "showingresults": "Pigpapahiling sa babâ sagkod sa {{PLURAL:$1|'''1''' resulta|'''$1''' mga resulta}} poon sa #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resulta '''$1''' kan '''$3'''|Mga Resulta '''$1 - $2''' kan '''$3'''}} para sa '''$4'''",
        "search-nonefound": "Mayo nin mga resulta na panampok sa kahaputan.",
        "powersearch-legend": "Adbansiyadong paghahanap",
        "powersearch-ns": "Maghanap sa mga espasyong-ngaran:",
        "randomincategory": "Purakan na pahina sa kategoriya",
        "randomincategory-invalidcategory": "\"$1\" bako sarong balidong pangaran nin kategoriya.",
        "randomincategory-nopages": "Mayo nin mga pahina sa [[:Category:$1]].",
-       "randomincategory-selectcategory": "Magkua nin purakan na pahina gikan sa kategoriya: $1 $2.",
-       "randomincategory-selectcategory-submit": "Magduman",
+       "randomincategory-legend": "Purakan na pahina sa kategoriya",
        "randomredirect": "Random na pagredirekta",
        "randomredirect-nopages": "Mayo nin panukdo-liwat sa espasyong-ngaran na \"$1\".",
        "statistics": "Mga Estadistiko",
        "querypage-disabled": "Ining espesyal na pahina pinagpundo nin huli sa kaggibohang mga rason.",
        "booksources": "Mga Ginikanan kan libro",
        "booksources-search-legend": "Maghanap para sa mga ginikanang libro",
-       "booksources-go": "Dumanán",
        "booksources-text": "Mahihiling sa babâ an lista kan mga takod sa ibang ''site'' na nagbenbenta nin mga bâgo asin nagamit nang libro, asin pwede ser na igwa pang mga ibang impormasyon manonongod sa mga librong pighahanap mo:",
        "booksources-invalid-isbn": "An pinagtaong ISBN dae minaluwas na balido; paki-tsek tabi nin mga sala sa pagkopya gikan sa orihinal na piggikanan.",
        "specialloguserlabel": "Paragibo:",
        "mywatchlist": "Bantay-listahan",
        "watchlistfor2": "Para ki $1 $2",
        "nowatchlist": "Mayo ka man na mga bagay saimong lista nin pigbabantayan.",
-       "watchlistanontext": "Mag $1 tabi para mahiling o maghira nin mga bagay saimong lista nin mga pigbabantayan.",
+       "watchlistanontext": "Pakipalaog tabi tanganing makapaghiling o makapagliwat sa mga aytem na yaon sa saimong bantay-listahan.",
        "watchnologin": "Mayô sa laog",
        "addwatch": "Idagdag sa bantay-listahan",
        "addedwatchtext": "Ining pahina \"[[:$1]]\" dinadagdag sa saimong mga [[Special:Watchlist|Bantay-listahan]].\nAn maabot na mga pagbabâgo sa páhinang ini asin sa asosyadong páhina nin olay paglilistahon duman.",
        "wlheader-enotif": "E-surat na paisi pinagpaandar na.",
        "wlheader-showupdated": "Mga pahina na pinagriliwat poon kaidtong huri kang nagbisita sainda ipinapatanaw na '''mahîbog'''",
        "wlnote": "Sa ibaba an {{PLURAL:$1|huring pagbabago|mga huring '''$1''' pagbabago}} sa nakaaging {{PLURAL:$2|oras|'''$2''' mga oras}}, magpoon pa kan $3, $4.",
-       "wlshowlast": "Ipahilíng an nakaaging $1 na mga oras mga $2 na aldaw $3",
+       "wlshowlast": "Ipahilíng an nakaaging $1 na mga oras mga $2 na aldaw",
        "watchlist-options": "Bantay-listahan na mga pagpipilian",
        "watching": "Pigbabantayan...",
        "unwatching": "Dai pigbabantayan...",
        "exbeforeblank": "Ini an dating laog bagô blinankohán: '$1'",
        "delete-confirm": "Puraon \"$1\"",
        "delete-legend": "Paraon",
-       "historywarning": "'''Patanid tabi:''' An pahina na saimong pagpupuraon may historiya na igwa nin haros $1 {{PLURAL:$1|rebisyon|mga rebisyon}}:",
+       "historywarning": "<strong>Patanid:</strong> An pahina na saimong pagpupuraon may historiya na igwa nin $1 {{PLURAL:$1|rebisyon|mga rebisyon}}:",
        "confirmdeletetext": "Paparaon mo sa base nin datos ining pahina kasabay an gabos na mga uusipón kaini.\nKonpirmaron tabì na talagang boot mong gibohon ini, nasasabotan mo an mga resulta, asin an piggigibo mo ini konporme sa\n[[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "An aksyon nakumpleto na",
        "actionfailed": "An aksyon nagpalya",
        "autoblockid": "Awtomatikong-kabarahan #$1",
        "block": "Barahon an paragamit",
        "unblock": "Haleon an bara kan paragamit",
-       "blockip": "Bagáton an paragamit",
+       "blockip": "Bagáton {{KASARIAN:$1|paragamit}}",
        "blockip-legend": "Kubkuba an paragamit",
        "blockiptext": "Gamiton an pormularyo sa babâ para bagaton an pagsurat kan sarong espesipikong IP o ngaran nin parágamit.\nDapat gibohon sana ini para maibitaran vandalismo, asin kompirmi sa [[{{MediaWiki:Policy-url}}|palakaw]].\nMagkaag nin espisipikong rason (halimbawa, magtao nin ehemplo kan mga páhinang rinaot).",
        "ipaddressorusername": "direksyon nin IP o gahâ:",
        "ipb-unblock-addr": "Paagihon $1",
        "ipb-unblock": "Bawion an pagbagat nin ngaran nin paragamit o direccion nin IP",
        "ipb-blocklist": "Hilingon an mga presenteng binagat",
-       "ipb-blocklist-contribs": "Mga kontribusyon para sa $1",
+       "ipb-blocklist-contribs": "Mga kontribusyon para sa {{KASARIAN:$1|$1}}",
        "unblockip": "Paagihon an parâgamit",
        "unblockiptext": "Gamiton an pormulario sa baba para puede giraray suratan an dating binagat na direccion nin IP address o ngaran nin paragamit.",
        "ipusubmit": "Haleon ining bara",
        "import": "Ilaog an mga páhina",
        "importinterwiki": "Ipadara an Transwiki",
        "import-interwiki-text": "Pumili nin sarong wiki asin titulo kan pahina na importaron.\nMga petsa nin kaliwatan asin pangaran kan mga paraliwat pagpepreserbaron.\nGabos na aksyon nin importa sa transwiki nakatala sa [[Special:Log/import|talaan nin importa]].",
-       "import-interwiki-source": "Ginikanang wiki/pahina:",
+       "import-interwiki-sourcepage": "Gikanang pahina:",
        "import-interwiki-history": "Kopyahon an gabos na mga bersyón para sa páhinang ini",
        "import-interwiki-templates": "Ibali an gabos na mga panguyog",
        "import-interwiki-submit": "Ipalaog",
        "exif-urgency-low": "Hababaon ($1)",
        "exif-urgency-high": "Halangkawon ($1)",
        "exif-urgency-other": "Prayoridad na pakahulugan nin paragamit ($1)",
-       "watchlistall2": "gabos",
        "namespacesall": "gabós",
        "monthsall": "gabos",
        "confirmemail": "Kompirmaron an ''e''-surat",
index b921a7a..605ba1a 100644 (file)
        "otherlanguages": "На іншых мовах",
        "redirectedfrom": "(Перанакіравана з «$1»)",
        "redirectpagesub": "Старонка-перанакіраваньне",
+       "redirectto": "Перанакіраваньне на:",
        "lastmodifiedat": "Гэтая старонка апошні раз рэдагавалася $1 году ў $2.",
        "viewcount": "Гэтую старонку праглядалі $1 {{PLURAL:$1|раз|разы|разоў}}.",
        "protectedpage": "Абароненая старонка",
        "pagetitle": "$1 — {{SITENAME}}",
        "retrievedfrom": "Атрымана з «$1»",
        "youhavenewmessages": "Вы атрымалі $1 ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|Вы}} атрымалі $1 ад {{PLURAL:$3|1=іншага ўдзельніка|$3 удзельнікаў}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Вы}} атрымалі $1 ад $3 {{PLURAL:$3|удзельніка|удзельнікаў}} ($2).",
        "youhavenewmessagesmanyusers": "Вы атрымалі $1 ад некалькіх удзельнікаў ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|1=новае паведамленьне|999=новыя паведамленьні}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|1=апошняя зьмена|999=апошнія зьмены}}",
        "createaccount-text": "Нехта стварыў рахунак «$2» у {{GRAMMAR:месны|{{SITENAME}}}} ($4) для Вашага адрасу электроннай пошты. Пароль для гэтага рахунку — «$3». Вам трэба ўвайсьці і зьмяніць Ваш пароль зараз.\n\nВы можаце праігнараваць гэты ліст, калі гэты рахунак быў створаны памылкова.",
        "login-throttled": "Вы зрабілі надта шмат спробаў уваходу ў сыстэму.\nКалі ласка, пачакайце $1 перад тым як паспрабаваць ізноў.",
        "login-abort-generic": "Не атрымалася ўвайсьці ў сыстэму, скасавана",
+       "login-migrated-generic": "Ваш рахунак быў перанесены і вашае імя ўдзельніка больш не існуе ў гэтай вікі.",
        "loginlanguagelabel": "Мова: $1",
        "suspicious-userlogout": "Ваш запыт на выхад з сыстэмы быў адхілены, таму што выглядае, што ён быў дасланы пашкоджаным браўзэрам альбо кэшаваным проксі-сэрвэрам.",
        "createacct-another-realname-tip": "Сапраўднае імя паведамляць неабавязкова.\nКалі Вы яго пазначыце, яно будзе выкарыстоўвацца для пазначэньня Вашай працы.",
        "passwordreset-emailsent-capture": "Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.",
        "passwordreset-emailerror-capture": "Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1",
        "changeemail": "Зьмяніць адрас электроннай пошты",
-       "changeemail-header": "Зьмена адрасу электроннай пошты для рахунку",
        "changeemail-text": "Запоўніце гэтую форму для зьмены адрасу Вашай электроннай пошты. Вам неабходна будзе ўвесьці Ваш пароль для пацьверджаньня зьмены.",
        "changeemail-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
        "changeemail-oldemail": "Цяперашні адрас электроннай пошты:",
        "changeemail-none": "(няма)",
        "changeemail-password": "Ваш пароль у {{GRAMMAR:месны|{{SITENAME}}}}:",
        "changeemail-submit": "Зьмяніць адрас электроннай пошты",
-       "changeemail-cancel": "Скасаваць",
        "changeemail-throttled": "Вы зрабілі зашмат спробаў увайсьці ў сыстэму.\nКалі ласка, пачакайце $1 перад наступнай спробай.",
        "resettokens": "Скідваньне токенаў",
        "resettokens-text": "Тут вы можаце скінуць токены, якія даюць вамд доступ да пэўных прыватных зьвестак, асацыяваных з вашым рахункам.\n\nКалі вы выпадкова падзяліліся токенамі зь іншымі, або калі ваш рахунак быў скампрамэтаваны, скарыстайцеся гэтай магчымасьцю і скіньце токены.",
        "showpreview": "Праглядзець",
        "showdiff": "Паказаць зьмены",
        "blankarticle": "<strong>Папярэджаньне:</strong> вы ствараеце пустую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, старонка будзе створаная без аніякага зьместу.",
-       "anoneditwarning": "'''Папярэджаньне:''' Вы не ўвайшлі ў сыстэму. Ваш IP-адрас будзе запісаны ў гісторыі гэтай старонкі.",
+       "anoneditwarning": "<strong>Папярэджаньне</strong>: вы не ўвайшлі ў сыстэму. Ваш IP-адрас будзе бачны ўсім, калі вы адрэдагуеце старонку. Калі вы <strong>[$1 ўвойдзеце]</strong> або <strong>[$2 створыце рахунак]</strong>, вашыя рэдагаваньні будуць зьвязаныя з вашым імем карыстальніка, а таксама вам будуць даступныя дадатковыя перавагі.",
        "anonpreviewwarning": "''Вы не ўвайшлі ў сыстэму. Падчас захаваньня Ваш IP-адрас будзе дададзены ў гісторыю рэдагаваньняў старонкі.''",
        "missingsummary": "'''Напамін:''' Вы не пазначылі кароткае апісаньне зьменаў.\nКалі Вы націсьніце кнопку «Запісаць» яшчэ раз, Вашае рэдагаваньне будзе запісанае без апісаньня.",
        "missingcommenttext": "Калі ласка, увядзіце камэнтар ніжэй.",
        "searchall": "усе",
        "showingresults": "Ніжэй {{PLURAL:$1|паданы|паданыя|паданыя}} да '''$1''' {{PLURAL:$1|выніку|вынікаў|вынікаў}}, пачынаючы з #<b>$2</b>.",
        "showingresultsinrange": "Ніжэй паказаныя да {{PLURAL:$1|<strong>$1</strong> выніку ў|<strong>$1</strong> вынікаў у}} дыяпазоне ад <strong>$2</strong> да <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|1=Вынік '''$1''' з '''$3'''|Вынікі '''$1—$2''' з '''$3'''}} для '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|1=Вынік <strong>$1</strong> з <strong>$3</strong>|Вынікі <strong>$1—$2</strong> з <strong>$3</strong>}}",
        "search-nonefound": "Супадзеньняў па запыце ня знойдзена.",
        "powersearch-legend": "Удасканалены пошук",
        "powersearch-ns": "Шукаць у прасторах назваў:",
        "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Розьніцы вэрсіяў",
        "prefs-help-prefershttps": "Гэтая налада набудзе моц пры наступным уваходзе ў сыстэму.",
+       "prefswarning-warning": "Вы зрабілі зьмены ў вашых наладах, якія яшчэ не былі захаваныя.\nКалі вы закрыеце гэтую старонку і не націсьніце «$1», вашыя налады ня будуць абноўленыя.",
        "prefs-tabs-navigation-hint": "Падказка: вы можаце пераходзіць паміж укладкамі ў сьпісе ўкладак з дапамогай клявішаў налева і направа.",
        "email-address-validity-valid": "Выглядае слушна",
        "email-address-validity-invalid": "Неабходны слушны адрас!",
        "randomincategory": "Выпадковая старонка ў катэгорыі",
        "randomincategory-invalidcategory": "«$1» — ня слушная назва катэгорыі.",
        "randomincategory-nopages": "У катэгорыі «[[:Category:$1|$1]]» старонак няма.",
-       "randomincategory-selectcategory": "Узяць адвольную старонку з катэгорыі: $1 $2.",
-       "randomincategory-selectcategory-submit": "Паказаць",
+       "randomincategory-category": "Катэгорыя:",
+       "randomincategory-legend": "Выпадковая старонка ў катэгорыі",
        "randomredirect": "Выпадковае перанакіраваньне",
        "randomredirect-nopages": "У прасторы назваў «$1» няма перанакіраваньняў.",
        "statistics": "Статыстыка",
        "booksources": "Пошук кніг",
        "booksources-search-legend": "Пошук кніг",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Паказаць",
+       "booksources-search": "Шукаць",
        "booksources-text": "Ніжэй знаходзіцца сьпіс спасылак на іншыя сайты, якія прадаюць новыя і патрыманыя кнігі, і могуць таксама мець інфармацыю пра кнігі, якія Вы шукаеце:",
        "booksources-invalid-isbn": "Пададзены няслушны ISBN; праверце, магчыма ўзьніклі памылкі пры пераносе нумару з арыгінальнай крыніцы.",
        "specialloguserlabel": "Выканаўца:",
        "post-expand-template-inclusion-category-desc": "Памер старонкі перавысіў <code>$wgMaxArticleSize</code> пасьля разгортваньня ўсіх шаблёнаў, таму некаторыя шаблёны не былі паказаныя цалкам.",
        "post-expand-template-argument-category-desc": "Старонка перавышае памер <code>$wgMaxArticleSize</code> пасьля раскрыцьця аргумэнту шаблёну (нешта ў трайных дужках, напрыклад, <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "На старонцы ўжываецца зашмат рэсурсаёмістых функцыяў парсэру (такіх, як <code>#ifexist</code>). Глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Інструкцыя:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Ð\9aаÑ\82Ñ\8dгоÑ\80Ñ\8bÑ\8f Ð´Ð°Ð´Ð°ÐµÑ\86Ñ\86а, ÐºÐ°Ð»Ñ\96 Ñ\81таронка ўтрымлівае няслушную спасылку на файл (спасылку на файл, які не існуе).",
-       "hidden-category-category-desc": "Ð\93Ñ\8dÑ\82а ÐºÐ°Ñ\82Ñ\8dгоÑ\80Ñ\8bÑ\8f Ð· Ð´Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ð°Ð¹ Ð¼ÐµÑ\82кай <code><nowiki>__HIDDENCAT__</nowiki></code> Ñ\83 Ñ\91й, што па змоўчаньні не адлюстроўвае яе на старонках у сьпісе катэгорыяў.",
+       "broken-file-category-desc": "Старонка ўтрымлівае няслушную спасылку на файл (спасылку на файл, які не існуе).",
+       "hidden-category-category-desc": "Ð\9aаÑ\82Ñ\8dгоÑ\80Ñ\8bÑ\8f Ñ\9eÑ\82Ñ\80Ñ\8bмлÑ\96вае Ð¼ÐµÑ\82кÑ\83 <code><nowiki>__HIDDENCAT__</nowiki></code> Ñ\83 Ð·Ñ\8cмеÑ\81Ñ\8cÑ\86е Ñ\81Ñ\82аÑ\80онкÑ\96, што па змоўчаньні не адлюстроўвае яе на старонках у сьпісе катэгорыяў.",
        "trackingcategories-nodesc": "Апісаньне адсутнічае.",
        "trackingcategories-disabled": "Катэгорыя адключаная",
        "mailnologin": "Няма адрасу атрымальніка",
        "mywatchlist": "Сьпіс назіраньня",
        "watchlistfor2": "Для $1 $2",
        "nowatchlist": "Ваш сьпіс назіраньня пусты.",
-       "watchlistanontext": "Ð\92ам Ð¿Ð°Ñ\82Ñ\80Ñ\8dбна $1, каб праглядаць альбо рэдагаваць сьпіс назіраньня.",
+       "watchlistanontext": "Ð\9aалÑ\96 Ð»Ð°Ñ\81ка, Ñ\83вайдзÑ\96Ñ\86е Ñ\9e Ñ\81Ñ\8bÑ\81Ñ\82Ñ\8dмÑ\83, каб праглядаць альбо рэдагаваць сьпіс назіраньня.",
        "watchnologin": "Вы не ўвайшлі ў сыстэму",
        "addwatch": "Дадаць ў сьпіс назіраньня",
        "addedwatchtext": "Старонка «[[:$1]]» была дададзеная да Вашага [[Special:Watchlist|сьпісу назіраньня]].\nНаступныя зьмены ў гэтай старонцы і зьвязанай зь ёю старонцы абмеркаваньняў будуць бачныя там.",
        "wlheader-enotif": "Апавяшчэньне па e-mail уключанае.",
        "wlheader-showupdated": "Старонкі, зьмененыя з часу вашага апошняга візыту, вылучаныя '''тоўстым''' шрыфтам.",
        "wlnote": "Ніжэй {{PLURAL:$1|паказаная <strong>$1</strong> апошняя зьмена|паказаныя <strong>$1</strong> апошнія зьмены|паказаныя <strong>$1</strong> апошніх зьменаў}} за <strong>$2</strong> {{PLURAL:$2|гадзіну|гадзіны|гадзінаў}}, па стане на $4 $3.",
-       "wlshowlast": "Паказаць: за апошнія $1 гадзінаў, $2 дзён, $3",
+       "wlshowlast": "Паказаць за апошнія $1 гадзінаў, $2 дзён",
        "watchlist-options": "Налады сьпісу назіраньня",
        "watching": "Дадаецца ў сьпіс назіраньня…",
        "unwatching": "Выдаляецца са сьпісу назіраньня…",
        "exbeforeblank": "зьмест да ачысткі: «$1»",
        "delete-confirm": "Выдаліць «$1»",
        "delete-legend": "Выдаліць",
-       "historywarning": "'''Папярэджаньне''': старонка, якую Вы зьбіраецеся выдаліць, мае гісторыю з прыкладна $1 {{PLURAL:$1|вэрсіі|вэрсіяў|вэрсіяў}}:",
+       "historywarning": "<strong>Папярэджаньне</strong>: старонка, якую Вы зьбіраецеся выдаліць, мае гісторыю з $1 {{PLURAL:$1|вэрсіі|вэрсіяў|вэрсіяў}}:",
        "confirmdeletetext": "Зараз Вы выдаліце старонку разам з усёй гісторыяй зьменаў.\nКалі ласка, пацьвердзіце, што Вы зьбіраецеся гэта зрабіць і што Вы разумееце ўсе наступствы, а таксама робіце гэта ў адпаведнасьці з [[{{MediaWiki:Policy-url}}|правіламі]].",
        "actioncomplete": "Дзеяньне выкананае",
        "actionfailed": "Дзеяньне ня выкананае",
        "delete-edit-reasonlist": "Рэдагаваць прычыны выдаленьня",
        "delete-toobig": "Гэтая старонка мае доўгую гісторыю рэдагаваньняў, болей за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсіяў}}.\nВыдаленьне такіх старонак было забароненае, каб пазьбегнуць праблемаў у працы {{GRAMMAR:родны|{{SITENAME}}}}.",
        "delete-warning-toobig": "Гэтая старонка мае доўгую гісторыю рэдагаваньняў, больш за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсіяў}}.\nЯе выдаленьне можа выклікаць праблемы ў працы базы зьвестак {{GRAMMAR:родны|{{SITENAME}}}}; будзьце асьцярожны.",
-       "delete-cantedit": "Вы ня можаце выдаліць гэтую старонку, таму што ня маеце правоў на яе рэдагаваньне.",
+       "deleteprotected": "Вы ня можаце выдаліць гэтую старонку, таму што яна абароненая.",
        "deleting-backlinks-warning": "'''Увага:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|іншыя старонкі]] ўключаюць або спасылаюцца на старонку, якую вы зьбіраецеся выдаліць.",
        "rollback": "Адкаціць рэдагаваньні",
        "rollback_short": "Адкат",
        "protect-othertime": "Іншы тэрмін:",
        "protect-othertime-op": "іншы тэрмін",
        "protect-existing-expiry": "Наяўны час сканчэньня: $3, $2",
+       "protect-existing-expiry-infinity": "Наяўны тэрмін сканчэньня: бясконца",
        "protect-otherreason": "Іншая/дадатковая прычына:",
        "protect-otherreason-op": "Іншая прычына",
        "protect-dropdown": "*Звычайныя прычыны абароны\n** Часты вандалізм\n** Празьмерны спам\n** Непрадуктыўная вайна рэдагаваньняў\n** Папулярная старонка",
        "autoblockid": "Аўтаматычнае блякаваньне №$1",
        "block": "Заблякаваць удзельніка",
        "unblock": "Разблякаваць удзельніка",
-       "blockip": "Заблякаваць",
+       "blockip": "Заблякаваць {{GENDER:$1|удзельніка|удзельніцу}}",
        "blockip-legend": "Заблякаваць удзельніка",
        "blockiptext": "Наступная форма дазваляе заблякаваць магчымасьць рэдагаваньня з пэўнага IP-адрасу альбо імя ўдзельніка. Гэта трэба рабіць толькі дзеля прадухіленьня вандалізму і згодна з [[{{MediaWiki:Policy-url}}|правіламі]]. Пазначце ніжэй дакладную прычыну (напрыклад, пералічыце асобныя старонкі, на якіх былі парушэньні).",
        "ipaddressorusername": "IP-адрас альбо імя ўдзельніка/ўдзельніцы:",
        "unblocked": "[[User:$1|$1]] быў разблякаваны.",
        "unblocked-range": "$1 быў разблякаваны",
        "unblocked-id": "Блякаваньне $1 зьнятае",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] быў разблякаваны.",
        "blocklist": "Заблякаваныя ўдзельнікі",
        "ipblocklist": "Заблякаваныя ўдзельнікі",
        "ipblocklist-legend": "Пошук заблякаванага ўдзельніка",
        "import": "Імпартаваць старонкі",
        "importinterwiki": "Імпартаваньне зь іншых вікі",
        "import-interwiki-text": "Абярыце вікі і назву старонкі для імпартаваньня.\nДаты зьменаў і імёны аўтараў будуць захаваныя.\nУсе дзеяньні імпартаваньня паміж вікі запісваюцца ў [[Special:Log/import|журнал імпартаваньняў]].",
-       "import-interwiki-source": "Крынічная вікі/старонка:",
+       "import-interwiki-sourcewiki": "Крынічная вікі:",
+       "import-interwiki-sourcepage": "Крынічная старонка:",
        "import-interwiki-history": "Капіяваць гісторыю старонкі цалкам",
        "import-interwiki-templates": "Уключыць усе шаблёны",
        "import-interwiki-submit": "Імпартаваць",
        "exif-urgency-low": "Нізкая ($1)",
        "exif-urgency-high": "Высокая ($1)",
        "exif-urgency-other": "Прыярытэт вызначаны карыстальнікам ($1)",
-       "watchlistall2": "усё",
        "namespacesall": "усе",
        "monthsall": "усе",
        "confirmemail": "Пацьвердзіць адрас электроннай пошты",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|загрузіў|загрузіла}} новую вэрсію $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|загрузіў|загрузіла}} $3",
        "rightsnone": "(няма)",
+       "revdelete-summary": "кароткае апісаньне зьменаў",
        "feedback-bugornote": "Калі Вы гатовы падрабязна апісаць тэхнічную праблему, калі ласка [$1 паведаміце пра памылку]. \nУ адваротным выпадку, Вы можаце выкарыстоўваць простую форму пададзеную ніжэй. Ваш камэнтар будзе дададзены на старонку «[$3 $2]», разам з Вашым іменем удзельніка і выкарыстоўваемым браўзэрам.",
        "feedback-subject": "Тэма:",
        "feedback-message": "Паведамленьне:",
        "log-name-pagelang": "Журнал зьменаў мовы",
        "log-description-pagelang": "Гэта журнал зьменаў мовы старонак.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} мову старонкі $3 з $4 на $5.",
-       "default-skin-not-found": "Упс! Тэма афармленьня па змоўчаньні для вашай вікі (<code>$wgDefaultSkin</code>), <code>$1</code> недаступная.\n\nВашае ўсталяваньне, падобна, уключае наступныя тэмы афармленьня. Глядзіце [https://www.mediawiki.org/wiki/Manual:Skin_configuration Інструкцыя:Наладка тэмаў афармленьня] дзеля інфармацыі, як падключыць іх і абраць тэму па змоўчаньні.\n\n$2\n\n; Калі вы толькі што ўсталявалі MediaWiki:\n: Напэўна вы ўсталявалі з git або наўпрост з крынічнага коду з ужываньнем іншага мэтаду. Гэта чакана. Паспрабуйце ўсталяваць некалькі тэмаў афармленьня з [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's каталёгу тэмаў]:\n:* Спампуйце [https://www.mediawiki.org/wiki/Download tarball-усталёўнік], які ўтрымлівае некалькі тэмаў і пашырэньняў. Вы можаце скапіяваць каталёг <code>skins/</code> зь яго.\n:* Зрабіце клон аднаго з сховішчаў <code>mediawiki/skins/*</code> праз git у каталёг <code>skins/</code> вашай усталёўкі MediaWiki.\n: Калі вы распрацоўнік MediaWiki, гэта не павінна ўплываць на вашае git-сховішча.\n\n; Калі вы толькі што абнавілі MediaWiki:\n: MediaWiki вэрсіі 1.24 і навейшыя больш не падключаюць тэмы афармленьня аўтаматычна (глядзіце [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Інструкцыя:Аўтаматычнае выяўленьне тэмаў афармленьня]). Вы можаце дадаць наступныя радкі ў <code>LocalSettings.php</code>, каб падключыць усе ўсталяваныя тэмы афармленьня:\n\n<pre>$3</pre>\n\n; Калі вы толькі што зьмянілі <code>LocalSettings.php</code>:\n: Пераправерце назвы тэмаў афармленьня на наяўнасьць памылак.",
-       "default-skin-not-found-no-skins": "Упс! Тэма афармленьня па змоўчаньня для вашай вікі (<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-усталёўнік], які ўтрымлівае некалькі тэмаў і пашырэньняў. Вы можаце скапіяваць каталёг <code>skins/</code> зь яго.\n:* Зрабіце клон аднаго з сховішчаў <code>mediawiki/skins/*</code> праз git у каталёг <code>skins/</code> вашай усталёўкі MediaWiki.\n: Калі вы распрацоўнік MediaWiki, гэта не павінна ўплываць на вашае git-сховішча. Глядзіце [https://www.mediawiki.org/wiki/Manual:Skin_configuration Інструкцыя:Наладка тэмаў афармленьня] дзеля інфармацыі, як падключыць іх і абраць тэму па змоўчаньні.",
+       "default-skin-not-found": "Упс! Тэма афармленьня па змоўчаньні для вашай вікі, вызначаная ў <code dir=\"ltr\">$wgDefaultSkin</code> як <code>$1</code> недаступная.\n\nВашае ўсталяваньне, падобна, уключае наступныя тэмы афармленьня. Глядзіце [https://www.mediawiki.org/wiki/Manual:Skin_configuration Інструкцыя:Наладка тэмаў афармленьня] дзеля інфармацыі, як падключыць іх і абраць тэму па змоўчаньні.\n\n$2\n\n; Калі вы толькі што ўсталявалі MediaWiki:\n: Напэўна вы ўсталявалі з git або наўпрост з крынічнага коду з ужываньнем іншага мэтаду. Гэта чакана. Паспрабуйце ўсталяваць некалькі тэмаў афармленьня з [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's каталёгу тэмаў]:\n:* Спампуйце [https://www.mediawiki.org/wiki/Download tarball-усталёўнік], які ўтрымлівае некалькі тэмаў і пашырэньняў. Вы можаце скапіяваць каталёг <code>skins/</code> зь яго.\n:* Зрабіце клон аднаго з сховішчаў <code>mediawiki/skins/*</code> праз git у каталёг <code dir=\"ltr\">skins/</code> вашай усталёўкі MediaWiki.\n: Калі вы распрацоўнік MediaWiki, гэта не павінна ўплываць на вашае git-сховішча.\n\n; Калі вы толькі што абнавілі MediaWiki:\n: MediaWiki вэрсіі 1.24 і навейшыя больш не падключаюць тэмы афармленьня аўтаматычна (глядзіце [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Інструкцыя:Аўтаматычнае выяўленьне тэмаў афармленьня]). Вы можаце дадаць наступныя радкі ў <code>LocalSettings.php</code>, каб падключыць усе ўсталяваныя тэмы афармленьня:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Калі вы толькі што зьмянілі <code>LocalSettings.php</code>:\n: Пераправерце назвы тэмаў афармленьня на наяўнасьць памылак.",
+       "default-skin-not-found-no-skins": "Упс! Тэма афармленьня па змоўчаньня для вашай вікі, вызначаная ў <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-усталёўнік], які ўтрымлівае некалькі тэмаў і пашырэньняў. Вы можаце скапіяваць каталёг <code dir=\"ltr\">skins/</code> зь яго.\n:* Зрабіце клон аднаго з сховішчаў <code>mediawiki/skins/*</code> праз git у каталёг <code>skins/</code> вашай усталёўкі MediaWiki.\n: Калі вы распрацоўнік MediaWiki, гэта не павінна ўплываць на вашае git-сховішча. Глядзіце [https://www.mediawiki.org/wiki/Manual:Skin_configuration Інструкцыя:Наладка тэмаў афармленьня] дзеля інфармацыі, як падключыць іх і абраць тэму па змоўчаньні.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (уключана)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''адключана''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''адключана''')",
+       "mediastatistics": "Статыстыка мэдыяфайлаў",
+       "mediastatistics-summary": "Статыстыка тыпаў загружаных файлаў. Яна ўключае толькі актуальныя вэрсіі файлаў. Старыя і выдаленыя вэрсіі ня ўлічваюцца.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 байт|$1 байты|$1 байтаў}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-тып",
+       "mediastatistics-table-extensions": "Магчымыя пашырэньні",
+       "mediastatistics-table-count": "Колькасьць файлаў",
+       "mediastatistics-table-totalbytes": "Агульны памер",
+       "mediastatistics-header-unknown": "Невядомыя",
+       "mediastatistics-header-bitmap": "Растравыя выявы",
+       "mediastatistics-header-drawing": "Рысункі (вэктарныя выявы)",
+       "mediastatistics-header-audio": "Гук",
+       "mediastatistics-header-video": "Відэа",
+       "mediastatistics-header-multimedia": "Зьмяшанае мультымэдыя",
+       "mediastatistics-header-office": "Офіс",
+       "mediastatistics-header-text": "Тэкст",
+       "mediastatistics-header-executable": "Выконваныя файлы",
+       "mediastatistics-header-archive": "Сьціснутыя фарматы",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|залішняя коска ў канцы была выдаленая|залішнія коскі ў канцы былі выдаленыя|залішніх косак у канцы былі выдаленыя}} з JSON",
+       "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": "Было пададзенае значэньне тыпу, які ня можа быць закадаваны"
 }
index 73e5b9c..f72b76c 100644 (file)
        "otherlanguages": "На іншых мовах",
        "redirectedfrom": "(Пасля перасылкі з $1)",
        "redirectpagesub": "Старонка-перасылка",
+       "redirectto": "Перасылае да",
        "lastmodifiedat": "Апошняе змяненне старонкі адбылося $2, $1.",
        "viewcount": "Гэту старонку адкрывалі {{PLURAL:$1|адзін раз|$1 разы|$1 разоў}}.",
        "protectedpage": "Старонка пад аховай",
        "passwordreset-emailsent-capture": "Ніжэй прыведзены адпраўлены ліст пра скід пароля.",
        "passwordreset-emailerror-capture": "Ніжэй прыведзены створаны ліст пра скід пароля, яго адпраўка не атрымалася па прычыне: $1",
        "changeemail": "Змяніць адрас электроннай пошты",
-       "changeemail-header": "Змена электроннага адрасу акаўнта",
        "changeemail-text": "Запоўніце гэтую форму, каб змяніць свой адрас электроннай пошты. Вам трэба будзе ўвесці пароль, каб пацвердзіць змяненне.",
        "changeemail-no-info": "Каб звяртацца непасрэдна да гэтай старонкі, вам варта прадставіцца сістэме.",
        "changeemail-oldemail": "Бягучы адрас электроннай пошты:",
        "changeemail-none": "(няма)",
        "changeemail-password": "Ваш {{SITENAME}} пароль:",
        "changeemail-submit": "Змяніць адрас электроннай пошты:",
-       "changeemail-cancel": "Адмена",
        "changeemail-throttled": "Надта штмат спробаў увайсці пад гэтым рахункам. Пачакайце $1 перад тым, як спрабаваць ізноў.",
        "resettokens": "Скінуць токены",
        "resettokens-text": "Вы можаце пераўстанавіць токены, якія дазваляюць атрымліваць доступ да пэўных прыватных звестак, звязаных з вашым уліковым запісам.\n\nВы мусіце скінуць токены, калі выпадкова падзяліліся імі з кім-небудзь, ці ваш уліковы запіс быў скампраметаваны.",
        "searchall": "усе",
        "showingresults": "Ніжэй паказаны да {{PLURAL:$1|'''$1''' выніку|'''$1''' вынікаў}}, пачынаючы з нумару '''$2'''.",
        "showingresultsinrange": "Ніжэй паказаны да {{PLURAL:$1|<strong>1</strong> выніку|<strong>$1</strong> вынікаў}} у дыяпазоне ад #<strong>$2</strong> да #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Вынік '''$1''' из '''$3'''|Вынікі '''$1 — $2''' из '''$3'''}} для '''$4'''",
        "search-nonefound": "Нічога не было знойдзена.",
        "powersearch-legend": "Падрабязны пошук",
        "powersearch-ns": "Шукаць у прасторах назваў:",
        "listduplicatedfiles-summary": "Гэта пералік файлаў, у якіх найноўшая версія файла ўяўляе сабою копію апошняй версіі якога-небудзь іншага файла. Улічваюцца толькі лакальныя файлы.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] мае [[$3|{{PLURAL:$2|дублікат|$2 дублікаты|$2 дублікатаў}}]].",
        "unusedtemplates": "Шаблоны, якія не выкарыстаны",
-       "unusedtemplatestext": "Тут пералічаныя ўсе старонкі ў прасторы назваў {{ns:template}}, якія ані разу не ўкладзеныя ў іншыя старонкі. Памятайце, што трэба правяраць спасылкі на шаблоны перад тым, як сціраць іх.",
+       "unusedtemplatestext": "Тут пералічаныя ўсе старонкі ў прасторы назваў {{ns:template}}, якія ані разу не ўкладзеныя ў іншыя старонкі.\nПамятайце, што трэба правяраць спасылкі на шаблоны перад тым, як сціраць іх.",
        "unusedtemplateswlh": "іншыя спасылкі",
        "randompage": "Выпадковая старонка",
        "randompage-nopages": "Няма старонак у наступн{{PLURAL:$2|ай прасторы|ых прасторах}} назваў: $1.",
        "randomincategory": "Выпадковая старонка ў катэгорыі",
        "randomincategory-invalidcategory": "\"$1\" - недапушчальная назва катэгорыі.",
        "randomincategory-nopages": "Няма старонак у катэгорыі [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Атрымаць выпадковую старонку з катэгорыі: $1 $2.",
-       "randomincategory-selectcategory-submit": "Перайсці",
+       "randomincategory-category": "Катэгорыя:",
+       "randomincategory-legend": "Выпадковая старонка ў катэгорыі",
        "randomredirect": "Выпадковая перасылка",
        "randomredirect-nopages": "Няма перасылак у прасторы назваў \"$1\".",
        "statistics": "Статыстыка",
        "querypage-disabled": "Гэта адмысловая старонка адключана для павышэння прадукцыйнасці.",
        "booksources": "Кнігі",
        "booksources-search-legend": "Знайсці, дзе купіць кнігі",
-       "booksources-go": "Пошук",
        "booksources-text": "Ніжэй паказаны пералік спасылак на іншыя сеціўныя пляцоўкі, якія прадаюць новыя і б/у кнігі, і, магчыма, маюць больш звестак пра кнігі, якіх вы шукаеце:",
        "booksources-invalid-isbn": "Гэты ISBN не выглядае правільным; праверце правільнасць капіравання з арыгіналу.",
        "specialloguserlabel": "Выканаўца:",
        "wlheader-enotif": "Працуе апавяшчанне праз эл.пошту.",
        "wlheader-showupdated": "Старонкі, якія былі зменены пасля вашага апошняга наведвання, паказаны <strong>абрысам шрыфту</strong>.",
        "wlnote": "Ніжэй {{PLURAL:$1|паказана апошняя <strong>$1</strong> змена|паказаны апошнія <strong>$1</strong> змены|паказаны апошнія <strong>$1</strong> змен}} за {{PLURAL:$2|апошнюю|апошнія|апошнія}} <strong>$2</strong> {{PLURAL:$2|гадзіну|гадзіны|гадзін}}, на момант часу $3 $4.",
-       "wlshowlast": "Паказваць апошнія $1 гадз. $2 дзён $3",
+       "wlshowlast": "Паказваць апошнія $1 гадз. $2 дзён",
        "watchlist-options": "Магчымасці назірання",
        "watching": "Дапісваецца ў спіс назірання...",
        "unwatching": "Спыняем назіранне...",
        "exbeforeblank": "змесціва перад ачысткаю было: '$1'",
        "delete-confirm": "Сцерці \"$1\"",
        "delete-legend": "Сцерці",
-       "historywarning": "'''Увага''': Старонка, якую вы хочаце сцерці, мае гісторыю прыблізна $1 {{PLURAL:$1|праўкі|правак}}:",
+       "historywarning": "<strong>Увага:</strong> Старонка, якую вы хочаце сцерці, мае гісторыю з прыблізна $1 {{PLURAL:$1|праўкі|правак}}:",
        "confirmdeletetext": "Вы збіраецеся сцерці старонку разам з цэлай яе гісторыяй правак.\nПацвердзіце свой намер зрабіць гэта, сваё разуменне наступстваў, і што вы робіце гэта ў адпаведнасці з [[{{MediaWiki:Policy-url}}|палітыкай (асноўнымі правіламі)]].",
        "actioncomplete": "Завершана аперацыя",
        "actionfailed": "Памылка дзеяння",
        "delete-edit-reasonlist": "Правіць прычыны сцірання",
        "delete-toobig": "Старонка мае вялікую гісторыю правак, больш за $1 {{PLURAL:$1|версію|версій}}. Сціранне такіх старонак было абмежавана, каб пазбегчы ўтварэння выпадковых перашкод працы {{SITENAME}}.",
        "delete-warning-toobig": "Старонка мае вялікую гісторыю правак, больш за $1 {{PLURAL:$1|версію|версій}}. Сціранне такіх старонак можа перашкодзіць працы базы даных {{SITENAME}}; будзьце асцярожнымі.",
-       "delete-cantedit": "Вы не можаце сцерці гэту старонку, таму што не маеце дазволу правіць яе.",
+       "deleteprotected": "Вы не можаце сцерці гэтую старонку, таму што яна ахоўваецца.",
        "deleting-backlinks-warning": "'''Увага:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Іншыя старонкі]] спасылаюцца на ці ўключаюць старонку, якую вы збіраецеся сцерці.",
        "rollback": "Адкаціць праўкі",
        "rollback_short": "Адкат",
        "import": "Імпартаваць старонкі",
        "importinterwiki": "Імпарт Transwiki",
        "import-interwiki-text": "Выбар вікі і назвы старонкі дзеля імпарту.\nДаты версій і імёны аўтараў будуць захаваныя.\nУсе транс-вікавыя імпарты запісваюцца ў [[Special:Log/import|журнале імпартаў]].",
-       "import-interwiki-source": "Выточная вікі/старонка:",
+       "import-interwiki-sourcewiki": "Крынічная вікі:",
+       "import-interwiki-sourcepage": "Крынічная старонка:",
        "import-interwiki-history": "Капіраваць усе гістарычныя версіі гэтай старонкі",
        "import-interwiki-templates": "Разам з усімі шаблонамі",
        "import-interwiki-submit": "Імпартаваць",
        "exif-urgency-low": "Нізкая ($1)",
        "exif-urgency-high": "Высокая ($1)",
        "exif-urgency-other": "Вызначаны карыстальнікам прыярытэт ($1)",
-       "watchlistall2": "усе",
        "namespacesall": "усе",
        "monthsall": "усе",
        "confirmemail": "Пацвердзіць адрас эл.пошты",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|уклаў|уклала}} новую версію $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|уклаў|уклала}} $3",
        "rightsnone": "(няма)",
+       "revdelete-summary": "тлумачэнне праўкі",
        "feedback-bugornote": "Калі вы гатовыя падрабязна апісаць тэхнічную праблему, калі ласка, [$1 паведаміце пра памылку].\nУ адваротным выпадку вы можаце выкарыстоўваць гэтую простую форму. Ваш каментар будзе дададзены на старонку «[$3 $2]» разам з вашым імем удзельніка і выкарыстоўваемым браўзерам.",
        "feedback-subject": "Тэма:",
        "feedback-message": "Паведамленне",
index c67f8c0..2ecbb92 100644 (file)
@@ -21,7 +21,9 @@
                        "Петър Петров",
                        "לערי ריינהארט",
                        "아라",
-                       "Gazimagomedov"
+                       "Gazimagomedov",
+                       "StanProg",
+                       "Bjankuloski06"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
@@ -38,6 +40,7 @@
        "tog-watchdefault": "Добавяне на страниците, които редактирам, в списъка ми за наблюдение",
        "tog-watchmoves": "Добавяне на преместените от мен страници и файлове към списъка ми за наблюдение",
        "tog-watchdeletion": "Добавяне на изтритите от мен страници и файлове към списъка ми за наблюдение",
+       "tog-watchrollback": "Добавяне на страници, в които съм {{GENDER:$1|извършвал|извършвала}} отмяна на редакции в списъка ми за наблюдениe",
        "tog-minordefault": "Отбелязване на всички промени като малки по подразбиране",
        "tog-previewontop": "Показване на предварителния преглед преди текстовата кутия",
        "tog-previewonfirst": "Показване на предварителен преглед при първа редакция",
        "permalink": "Постоянна препратка",
        "print": "Печат",
        "view": "Преглед",
+       "view-foreign": "Преглед на $1",
        "edit": "Редактиране",
        "edit-local": "Редактиране на локалното описание",
        "create": "Създаване",
        "jumptonavigation": "навигация",
        "jumptosearch": "търсене",
        "view-pool-error": "Съжаляваме, но сървърите в момента са претоварени.\nТвърде много потребители се опитват да отворят тази страница.\nМоля, изчакайте малко преди отново да пробвате да отворите страницата.\n\n$1",
+       "generic-pool-error": "Съжаляваме, но сървърите в момента са претоварени.\nТвърде много потребители се опитват да отворят тази страница.\nМоля, изчакайте малко преди отново да пробвате да отворите страницата.",
        "pool-timeout": "Изтичане на времето за заключване на страницата",
        "pool-queuefull": "Опашката за заявки е пълна",
        "pool-errorunknown": "Непозната грешка",
        "hidetoc": "скриване",
        "collapsible-collapse": "Свиване",
        "collapsible-expand": "Разгръщане",
+       "confirmable-confirm": "{{GENDER:$1|Сигурен|Сигурна}} ли сте?",
+       "confirmable-yes": "Да",
+       "confirmable-no": "Не",
        "thisisdeleted": "Преглед или възстановяване на $1?",
        "viewdeleted": "Преглед на $1?",
        "restorelink": "{{PLURAL:$1|една изтрита редакция|$1 изтрити редакции}}",
        "badarticleerror": "Действието не може да се изпълни върху страницата.",
        "cannotdelete": "Указаната страница или файл \"$1\" не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от някой друг.",
        "cannotdelete-title": "Страницата „$1“ не може да бъде изтрита",
+       "delete-hook-aborted": "Изтриването беше прекъснато от кука.\nНе беше посочена причина за това.",
        "no-null-revision": "Не може да бъде създадена празна версия на страницата „$1“",
        "badtitle": "Невалидно заглавие",
        "badtitletext": "Желаното заглавие на страница е невалидно, празно или неправилна препратка към друго уики. Възможно е да съдържа знаци, които не са позволени в заглавия.",
        "ns-specialprotected": "Специалните страници не могат да бъдат редактирани.",
        "titleprotected": "Тази страница е била защитена срещу създаване от [[User:$1|$1]].\nПосочената причина е ''$2''.",
        "filereadonlyerror": "Файлът „$1“ не може да бъде променен, тъй като файловото хранилище „$2“ е в режим само за четене.\n\nАдминистраторът, който го е заключил, е посочил следната причина: „$3“.",
-       "exception-nologin-text": "За досъп до желаната страница или действие уикито изисква [[Special:Userlogin|влизане в системата]].",
+       "invalidtitle-knownnamespace": "Невалидно заглавие с именно пространство $2\" и текст \"$3\"",
+       "invalidtitle-unknownnamespace": "Невалидно заглавие с неразпознато именно пространство номер $1 и текст „$2“",
+       "exception-nologin": "Не сте влезли",
+       "exception-nologin-text": "За достъп до избраното действие или страница е необходимо влизане в системата.",
        "exception-nologin-text-manual": "За достъп до избраното действие или страница е необходимо $1 в системата.",
        "virus-badscanner": "Лоша конфигурация: непознат скенер за вируси: ''$1''",
        "virus-scanfailed": "сканирането не сполучи (код $1)",
        "pt-userlogout": "Излизане",
        "php-mail-error-unknown": "Неизвестна грешка в mail() функцията на PHP",
        "user-mail-no-addy": "Опитвате се да изпратите е-писмо без да е посочен адрес за електронна поща.",
+       "user-mail-no-body": "Опитвате се да изпратите е-писмо с празно или изключително кратко съдържание.",
        "changepassword": "Смяна на парола",
        "resetpass_announce": "За да се завърши процеса на влизане, необходимо е да се избере нова парола.",
        "resetpass_text": "<!-- Тук добавете текст -->",
        "retypenew": "Нова парола повторно:",
        "resetpass_submit": "Избиране на парола и влизане",
        "changepassword-success": "Паролата ви беше променена успешно!",
+       "changepassword-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
        "resetpass_forbidden": "Не е разрешена смяна на паролата",
        "resetpass-no-info": "За да достъпвате тази страница директно, необходимо е да влезете в системата.",
        "resetpass-submit-loggedin": "Промяна на паролата",
        "resetpass-submit-cancel": "Отказ",
        "resetpass-wrong-oldpass": "Невалидна временна или текуща парола.\nВъзможно е вече успешно да сте сменили паролата си или да сте поискали нова временна парола.",
+       "resetpass-recycled": "Моля, променете паролата си с такава, различна от текущата.",
        "resetpass-temp-password": "Временна парола:",
        "resetpass-abort-generic": "Промяната на паролата беше прекъсната от използвано разширение.",
        "resetpass-expired": "Срокът на валидност на паролата е изтекъл. Изберете нова парола за влизане.",
        "passwordreset-emailsent-capture": "По-долу е показано електронното писмо за възстановяване на паролата, което беше изпратено.",
        "passwordreset-emailerror-capture": "По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на {{GENDER:$2|потребителя}}: $1",
        "changeemail": "Промяна на адреса за е-поща",
-       "changeemail-header": "Промяна на адреса за е-поща на сметката",
        "changeemail-text": "Попълването на този формуляр ще промени адреса за електронна поща. Необходимо е да се въведе и паролата, за да се потвърди промяната.",
        "changeemail-no-info": "За да достъпвате тази страница директно, необходимо е да влезете в системата.",
        "changeemail-oldemail": "Текущ адрес за е-поща:",
        "changeemail-none": "(няма)",
        "changeemail-password": "Парола за {{SITENAME}}:",
        "changeemail-submit": "Промяна на е-пощата",
-       "changeemail-cancel": "Отказване",
        "resettokens": "Изчистване на маркерите",
        "resettokens-no-tokens": "Няма маркери за изчистване.",
        "resettokens-legend": "Изчистване на маркерите",
        "resettokens-tokens": "Маркери:",
        "resettokens-token-label": "$1 (текуща стойност: $2)",
        "resettokens-watchlist-token": "Маркер за уеб хранилка (Atom/RSS) на [[Special: Watchlist|промени на страници от списъка Ви за наблюдение]]",
+       "resettokens-done": "Маркерите са изчистени.",
        "resettokens-resetbutton": "Изчистване на избраните маркери",
        "bold_sample": "Получер текст",
        "bold_tip": "Получер (удебелен) текст",
        "recreate-moveddeleted-warn": "'''Внимание: Създавате страница, която по-рано вече е била изтрита.'''\n\nОбмислете добре дали е уместно повторното създаване на страницата.\nЗа ваша информация по-долу е посочена причината за предишното изтриване на страницата:",
        "moveddeleted-notice": "Тази страница е била изтрита.\nЗа справка, по-долу са включени извадки от дневниците на изтриванията и преместванията.",
        "log-fulllog": "Преглеждане на пълния дневник",
-       "edit-hook-aborted": "Редакцията беше прекъсната от кука. Не беше посочена причина за това.",
+       "edit-hook-aborted": "Редакцията беше прекъсната от кука.\nНе беше посочена причина за това.",
        "edit-gone-missing": "Страницата не можа да се обнови.\nВероятно междувременно е била изтрита.",
        "edit-conflict": "Редакционен конфликт.",
        "edit-no-change": "Редакцията ви беше пренебрегната, защото не съдържа промени по текста.",
+       "postedit-confirmation-created": "Страницата е създадена.",
+       "postedit-confirmation-restored": "Страницата е възстановена.",
        "postedit-confirmation-saved": "Редакцията ви беше съхранена",
        "edit-already-exists": "Не можа да се създаде нова страница.\nТакава вече съществува.",
        "defaultmessagetext": "Текст на съобщението по подразбиране",
        "invalid-content-data": "Невалидни данни за съдържание",
        "content-not-allowed-here": "\nНа страницата [[$2]] не е позволено използването на $1",
        "editwarning-warning": "Ако излезете от тази страница, може да загубите всички незапазени промени, които сте направили. \nАко сте влезли в системата, можете да изключите това предупреждение през меню \"Редактиране\" във вашите лични настройки.",
+       "editpage-notsupportedcontentformat-title": "Форматът на съдържанието не се поддържа",
        "content-model-wikitext": "уикитекст",
        "content-model-text": "обикновен текст",
        "content-model-javascript": "Джаваскрипт",
        "parser-template-recursion-depth-warning": "Надвишен лимит на дълбочината при шаблонна рекурсия ($1)",
        "language-converter-depth-warning": "Надвишени са възможностите за автоматичен превод ($1)",
        "node-count-exceeded-category": "Страници, където е превишен възел-граф",
-       "node-count-exceeded-warning": "Страница превишава възел-брой",
+       "node-count-exceeded-category-desc": "Страницата превишава максималния възел-граф.",
+       "node-count-exceeded-warning": "Страница превиши броя на възлите",
        "undo-success": "Редакцията може да бъде върната. Прегледайте долното сравнение и се уверете, че наистина искате да го направите. След това съхранете страницата, за да извършите връщането.",
        "undo-failure": "Редакцията не може да бъде върната поради конфликтни междинни редакции.",
        "undo-norev": "Редакцията не може да бъде върната тъй като не съществува или е била изтрита.",
        "currentrev": "Текуща версия",
        "currentrev-asof": "Текуща версия към $1",
        "revisionasof": "Версия от $1",
-       "revision-info": "Версия от $1 на $2",
+       "revision-info": "Версия от $1 на {{GENDER:$6|$2}}$7",
        "previousrevision": "←По-стара версия",
        "nextrevision": "По-нова версия→",
        "currentrevisionlink": "преглед на текущата версия",
        "revdelete-confirm": "Необходимо е да потвърдите, че велаете да извършите действието, разбирате последствията и го правите според [[{{MediaWiki:Policy-url}}|политиката]].",
        "revdelete-suppress-text": "Премахването трябва да се използва '''само''' при следните случаи:\n*Неподходяща или неприемлива лична информация\n*: ''домашни адреси и телефонни номера, номера за социално осигуряване и др.''",
        "revdelete-legend": "Задаване на ограничения:",
-       "revdelete-hide-text": "СкÑ\80иване Ð½Ð° Ñ\82екÑ\81Ñ\82а на версията",
+       "revdelete-hide-text": "ТекÑ\81Ñ\82 на версията",
        "revdelete-hide-image": "Скриване на файловото съдържание",
        "revdelete-hide-name": "Скриване на действието и целта",
        "revdelete-hide-comment": "Скриване на резюмето",
        "search-section": "(раздел $1)",
        "search-suggest": "Вероятно имахте предвид: $1",
        "search-interwiki-caption": "Сродни проекти",
-       "search-interwiki-default": "$1 резултата:",
+       "search-interwiki-default": "Резултати от $1:",
        "search-interwiki-more": "(още)",
        "search-relatedarticle": "Свързани",
        "searchrelated": "свързани",
        "searchall": "всички",
        "showingresults": "Показване на до {{PLURAL:$1|'''1''' резултат|'''$1''' резултата}}, като се започва от номер '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Резултат '''$1''' от '''$3'''|Резултати '''$1 - $2''' от '''$3'''}} за '''$4'''",
        "search-nonefound": "Няма резултати, които да отговарят на заявката.",
        "powersearch-legend": "Разширено търсене",
        "powersearch-ns": "Търсене в именни пространства:",
        "searchdisabled": "Търсенето в {{SITENAME}} е временно изключено. Междувременно можете да търсите чрез Google. Обърнете внимание, че съхранените при тях страници най-вероятно са остарели.",
        "search-error": "Възникна грешка при търсене: $1",
        "preferences": "Настройки",
-       "mypreferences": "РекÑ\8aезаби",
+       "mypreferences": "Ð\9dаÑ\81Ñ\82Ñ\80ойки",
        "prefs-edits": "Брой редакции:",
+       "prefsnologintext2": "За да промените настройките си е необходимо да влезете в систеата.",
        "prefs-skin": "Облик",
        "skin-preview": "предварителен преглед",
        "datedefault": "Без предпочитание",
        "right-move": "преместване на страници",
        "right-move-subpages": "преместване на страници и техните подстраници",
        "right-move-rootuserpages": "Преместване на основни потребителски страници",
+       "right-move-categorypages": "Преместване на категорийни страници",
        "right-movefile": "Преместване на файлове",
        "right-suppressredirect": "без създаване на пренасочване от старото име при преместване на страница",
        "right-upload": "качване на файлове",
        "right-browsearchive": "търсене на изтрити страници",
        "right-undelete": "възстановяване на страници",
        "right-suppressrevision": "преглед и възстановяване на версии, скрити от администраторите",
+       "right-viewsuppressed": "Преглеждане на версии, скрити от който и да е потребител",
        "right-suppressionlog": "преглеждане на тайните дневници",
        "right-block": "спиране на достъпа до редактиране",
        "right-blockemail": "блокиране на потребители да изпращат писма по е-поща",
        "right-editusercssjs": "редактиране на CSS и JS файловете на други потребители",
        "right-editusercss": "редактиране на CSS файловете на други потребители",
        "right-edituserjs": "редактиране на JS файловете на други потребители",
+       "right-editmyusercss": "Редактиране на собствените потребителски CSS файлове",
+       "right-editmyuserjs": "Редактиране на собствените потребителски JavaScript файлове",
+       "right-viewmywatchlist": "Преглеждане на собствения списък за наблюдение",
+       "right-editmywatchlist": "Редактиране на собствения списък за наблюдение. Забележете, че някои действия все пак ще добавят страници, дори и без текущото право.",
+       "right-viewmyprivateinfo": "Преглеждане на собствените лични данни (например: адрес на електронната поща, истинско име)",
+       "right-editmyprivateinfo": "Редактиране на собствените лични данни (например: адрес на електронната поща, истинско име)",
+       "right-editmyoptions": "Редактиране на собствените настройки",
        "right-rollback": "Бърза отмяна на промените, направени от последния потребител, редактирал дадена страница",
        "right-markbotedits": "отбелязване на възвърнатите редакции като редакции на ботове",
        "right-noratelimit": "Пренебрегване на всякакви ограничения",
        "action-createpage": "създаване на страници",
        "action-createtalk": "създаване на дискусионни страници",
        "action-createaccount": "създаване на тази потребителска сметка",
+       "action-history": "преглед на историята на тази страница",
        "action-minoredit": "отбелязване на редакцията като малка",
        "action-move": "преместване на страницата",
        "action-move-subpages": "преместване на страницата и нейните подстраници",
        "action-move-rootuserpages": "преместване на основни потребителски страници",
+       "action-move-categorypages": "преместване на категорийни страници",
        "action-movefile": "преместване на този файл",
        "action-upload": "качване на файла",
        "action-reupload": "съхранение на файл върху вече съществуващ",
        "action-suppressionlog": "преглеждане на този поверителен дневник",
        "action-block": "блокиране на редакциите на този потребител",
        "action-protect": "променяне на нивото на защита на тази страница",
-       "action-import": "внасяне на тази страница от друго уики",
-       "action-importupload": "внасяне на тази страница от качен файл",
+       "action-rollback": "бърза отмяна на промените, направени от последния потребител, редактирал дадена страница",
+       "action-import": "внасяне на страници от други уикита",
+       "action-importupload": "внасяне на страници от качен файл",
        "action-patrol": "отбелязване на чуждите редакции като проверени",
        "action-autopatrol": "отбелязване на собствените редакции като автоматично патрулирани",
        "action-unwatchedpages": "преглеждане на списъка с ненаблюдавани страници",
        "action-userrights-interwiki": "редактиране на потребителските права на потребители от други уикита",
        "action-siteadmin": "заключване и отключване на базата от данни",
        "action-sendemail": "изпращане на е-писма",
+       "action-editmywatchlist": "редактиране на списъка ви за наблюдение",
+       "action-viewmywatchlist": "преглед на списъка ви за наблюдение",
+       "action-viewmyprivateinfo": "преглеждане на личните данни",
+       "action-editmyprivateinfo": "редактиране на личната си информация",
        "nchanges": "$1 {{PLURAL:$1|промяна|промени}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|от последното посещение}}",
        "enhancedrc-history": "история",
        "recentchanges": "Последни промени",
        "recentchanges-legend": "Настройки на списъка с последни промени",
        "recentchanges-summary": "Проследяване на последните промени в {{SITENAME}}.\n\nЛегенда: '''тек''' = разлика на текущата версия,\n'''ист''' = история на версиите",
+       "recentchanges-noresult": "Не бяха намерени промени за дадения период, които отговарят на критериите.",
        "recentchanges-feed-description": "Проследяване на последните промени в {{SITENAME}}.",
        "recentchanges-label-newpage": "Нова страница",
        "recentchanges-label-minor": "Това е малка промяна",
        "license-nopreview": "(Не е наличен предварителен преглед)",
        "upload_source_url": " (правилен, публично достъпен интернет-адрес)",
        "upload_source_file": " (файл на вашия компютър)",
+       "listfiles-delete": "изтриване",
        "listfiles-summary": "Тази специална страница показва всички качени файлове.",
        "listfiles_search_for": "Търсене по име на файла:",
        "imgfile": "файл",
        "download": "сваляне",
        "unwatchedpages": "Ненаблюдавани страници",
        "listredirects": "Списък на пренасочванията",
+       "listduplicatedfiles": "Списък на повтарящи се файлове",
        "unusedtemplates": "Неизползвани шаблони",
        "unusedtemplatestext": "Тази страница съдържа списък на страниците в именно пространство {{ns:template}}, които не са включени в друга страница. Проверявайте за препратки към отделните шаблони преди да ги изтриете или предложите за изтриване.",
        "unusedtemplateswlh": "други препратки",
        "randompage": "Случайна страница",
        "randompage-nopages": "В {{PLURAL:$2|следното именно пространство|следните именни пространства}} няма страници: $1.",
-       "randomincategory": "СлÑ\83Ñ\87айна Ñ\81Ñ\82Ñ\80аниÑ\86а Ð² категорията",
+       "randomincategory": "СлÑ\83Ñ\87айна Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ñ\82 категорията",
        "randomincategory-invalidcategory": "„$1“ не е валидно име на категория.",
        "randomincategory-nopages": "В категория [[:Category:$1|$1]] няма страници.",
+       "randomincategory-category": "Категория:",
+       "randomincategory-legend": "Случайна страница от категорията",
        "randomredirect": "Случайно пренасочване",
        "randomredirect-nopages": "В именно пространство „$1“ няма пренасочвания.",
        "statistics": "Статистика",
        "statistics-users-active": "Активни потребители",
        "statistics-users-active-desc": "Потребители, направили редакция през {{PLURAL:$1|последния ден|последните $1 дни}}",
        "statistics-mostpopular": "Най-преглеждани страници",
+       "pageswithprop-prop": "Име на свойството:",
+       "pageswithprop-submit": "Отваряне",
        "doubleredirects": "Двойни пренасочвания",
        "doubleredirectstext": "Тази страница съдържа списък със страници, които пренасочват към друга пренасочваща страница.\nВсеки ред съдържа препратки към първото и второто пренасочване, както и целта на второто пренасочване, която обикновено е „истинската“ целева страница, към която първото пренасочване би трябвало да сочи.\n<del>Задрасканите</del> записи са коригирани.",
        "double-redirect-fixed-move": "Оправяне на двойно пренасочване след преместването на [[$1]] като [[$2]]",
        "protectedpages": "Защитени страници",
        "protectedpages-indef": "Само безсрочни защити",
        "protectedpages-cascade": "Само каскадни защити",
+       "protectedpages-noredirect": "Скриване на пренасочванията",
        "protectedpagesempty": "В момента няма защитени страници с тези параметри.",
+       "protectedpages-timestamp": "Дата и час",
        "protectedpages-page": "Страница",
+       "protectedpages-expiry": "Срок на изтичане",
+       "protectedpages-performer": "Защитаващ потребител",
+       "protectedpages-params": "Параметри на защита",
        "protectedpages-reason": "Причина",
+       "protectedpages-unknown-timestamp": "Неизвестни",
        "protectedpages-unknown-performer": "Неизвестен потребител",
        "protectedtitles": "Защитени заглавия",
        "protectedtitlesempty": "В момента няма заглавия, защитени с тези параметри.",
        "listusers": "Списък на потребителите",
        "listusers-editsonly": "Показване само на потребители с редакции",
        "listusers-creationsort": "Сортиране по дата на създаване",
+       "listusers-desc": "Сортиране в низходящ ред",
        "usereditcount": "$1 {{PLURAL:$1|редакция|редакции}}",
        "usercreated": "{{GENDER:$3|Създаден}} на $1 в $2",
        "newpages": "Нови страници",
        "querypage-disabled": "Тази специална страница е изключена, защото затруднява производителността на уикито.",
        "booksources": "Източници на книги",
        "booksources-search-legend": "Търсене на информация за книга",
-       "booksources-go": "Отваряне",
        "booksources-text": "По-долу е списъкът от връзки към други сайтове, продаващи нови и използвани книги или имащи повече информация за книгите, които търсите:",
        "booksources-invalid-isbn": "Предоставеният ISBN изглежда е невалиден; проверете за грешки и копирайте от оригиналния източник.",
        "specialloguserlabel": "Изпълнител:",
        "allpagesbadtitle": "Зададеното име е невалидно. Възможно е да съдържа междуезикова или междупроектна представка или пък знаци, които не могат да се използват в заглавия.",
        "allpages-bad-ns": "В {{SITENAME}} не съществува именно пространство „$1“.",
        "allpages-hide-redirects": "Скриване на пренасочванията",
+       "cachedspecial-refresh-now": "Преглед на текущата.",
        "categories": "Категории",
        "categoriespagetext": "{{PLURAL:$1|Следната категория съдържа|Следните категории съдържат}} страници или медийни файлове.\n[[Special:UnusedCategories|Неизползваните категории]] не са показани тук.\nВижте също списъка с [[Special:WantedCategories|желани категории]].",
        "categoriesfrom": "Показване на категориите, като се започне от:",
        "listgrouprights-addgroup-self-all": "Може да добавя всички групи към своята сметка",
        "listgrouprights-removegroup-self-all": "Може да премахва всички групи от собствената сметка",
        "listgrouprights-namespaceprotection-namespace": "Именно пространство",
+       "trackingcategories": "Категории за проследяване",
+       "trackingcategories-summary": "Тази страница съдържа списък на категории за проследяване, които се попълват автоматично от софтуера на МедияУики. Имената им могат да се променят чрез съответните системни съобщения в именното пространство {{ns:8}}.",
+       "trackingcategories-msg": "Категория за проследяване",
+       "trackingcategories-name": "Име на съобщението",
+       "trackingcategories-desc": "Критерий за включване на категория",
+       "trackingcategories-nodesc": "Няма налично описание.",
+       "trackingcategories-disabled": "Категорията е деактивирана",
        "mailnologin": "Няма електронна поща",
        "mailnologintext": "Необходимо е да [[Special:UserLogin|влезете]] и да посочите валидна електронна поща в [[Special:Preferences|настройките]] си, за да може да пращате писма на други потребители.",
        "emailuser": "Писмо до потребителя",
+       "emailuser-title-target": "Изпращане на е-писмо на този {{GENDER:$1|потребител}}",
+       "emailuser-title-notarget": "Изпращане на е-писмо на потребител",
        "emailpage": "Пращане писмо на потребител",
        "emailpagetext": "Можете да използвате формуляра по-долу, за да изпратите електронно писмо на {{GENDER:$1|този потребител}}.\nАдресът, който се въвели в [[Special:Preferences|настройките си]], ще се появи в полето „От“ на писмото, така че получателят ще е в състояние да ви отговори директно.",
        "defemailsubject": "Писмо от потребител $1 в {{SITENAME}}",
        "watchnologin": "Не сте влезли",
        "addwatch": "Добавяне към списъка за наблюдение",
        "addedwatchtext": "Страницата „'''[[:$1]]'''“ беше добавена към [[Special:Watchlist|списъка ви за наблюдение]].\nНейните бъдещи промени, както и на съответната й дискусионна страница, ще се описват там.",
+       "addedwatchtext-short": "Страницата „$1“ беше добавена към списъка Ви за наблюдение.",
        "removewatch": "Премахване от списъка за наблюдение",
        "removedwatchtext": "Страницата „[[:$1]]“ беше премахната от [[Special:Watchlist|списъка ви за наблюдение]].",
+       "removedwatchtext-short": "Страницата „$1“ беше премахната от списъка Ви за наблюдение.",
        "watch": "Наблюдение",
        "watchthispage": "Наблюдаване на страницата",
        "unwatch": "Спиране на наблюдение",
        "wlheader-enotif": "Известяването по е-поща е включено.",
        "wlheader-showupdated": "Страниците, които са били променени след последния път, когато сте ги посетили, са показани в '''получер'''.",
        "wlnote": "{{PLURAL:$1|Показана е последната промяна|Показани са последните '''$1''' промени}} през {{PLURAL:$2|последния час|последните '''$2''' часа}}.",
-       "wlshowlast": "Показване на последните $1 часа $2 дни $3",
+       "wlshowlast": "Показване на последните $1 часа $2 дни",
        "watchlist-options": "Опции на списъка за наблюдение",
        "watching": "Наблюдение…",
        "unwatching": "Спиране на наблюдение…",
        "contributions-title": "Потребителски приноси за $1",
        "mycontris": "Приноси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
        "nocontribs": "Не са намерени промени, отговарящи на критерия.",
        "uctop": "(текуща)",
        "month": "Месец:",
        "ipb-unblock-addr": "Отблокиране на $1",
        "ipb-unblock": "Отблокиране на потребителско име IP-адрес",
        "ipb-blocklist": "Преглед на текущите блокирания",
-       "ipb-blocklist-contribs": "Приноси на $1",
+       "ipb-blocklist-contribs": "Приноси на {{GENDER:$1|$1}}",
        "unblockip": "Отблокиране на потребител",
        "unblockiptext": "Използвайте долния формуляр, за да възстановите правото на писане на по-рано блокиран IP-адрес или потребител.",
        "ipusubmit": "Сваляне на блокирането",
        "blocklist-tempblocks": "Скриване на срочните блокирания",
        "blocklist-addressblocks": "Скриване на отделни блокирани IP адреси",
        "blocklist-rangeblocks": "Скриване на блокиранията по IP диапазон",
+       "blocklist-timestamp": "Дата и час",
        "blocklist-target": "Цел",
-       "blocklist-expiry": "Срок на изтичане:",
+       "blocklist-expiry": "Срок на изтичане",
        "blocklist-by": "Блокиращ администратор",
        "blocklist-params": "Параметри на блокирането",
        "blocklist-reason": "Причина",
        "unblocklink": "отблокиране",
        "change-blocklink": "промяна на параметрите на блокирането",
        "contribslink": "приноси",
+       "emaillink": "изпращане на е-писмо",
        "autoblocker": "Бяхте блокиран автоматично, тъй като неотдавна IP-адресът ви е бил ползван от блокирания в момента потребител [[User:$1|$1]]. Причината за неговото блокиране е: „$2“.",
        "blocklogpage": "Дневник на блокиранията",
        "blocklog-showlog": "Потребителят е бил блокиран в миналото.\nЗа справка по-долу е дадено извлечение от дневника на блокиранията:",
        "import": "Внасяне на страници",
        "importinterwiki": "Внасяне чрез Трансуики",
        "import-interwiki-text": "Изберете уики и име на страницата.\nДатите на редакциите и имената на авторите ще бъдат запазени.\nВсички операции при внасянето от друго уики се записват в [[Special:Log/import|дневника на внасянията]].",
-       "import-interwiki-source": "Изходно уики/страница:",
        "import-interwiki-history": "Копиране на всички версии на страницата",
        "import-interwiki-templates": "Включване на всички шаблони",
        "import-interwiki-submit": "Внасяне",
        "import-error-create": "Страницата „$1“ не беше внесена, тъй като нямате права да я създадете.",
        "import-error-interwiki": "Страницата „$1“ не беше внесена, тъй като името ѝ е запазено за външно свързване (междууики).",
        "import-error-special": "Страницата „$1“ не беше внесена, тъй като принадлежи към специално именно пространство, което не позволява страници.",
-       "import-error-invalid": "Страницата „$1“ не беше внесена, тъй като името ѝ е невалидно.",
+       "import-error-invalid": "Страницата „$1“ не беше внесена, тъй като името към което трябваше да бъде внесена е невалидно на това уики.",
        "import-rootpage-invalid": "Посочената основна страница е с невалидно заглавие.",
        "import-rootpage-nosubpage": "Именното пространство „$1“ на основната страница не позволява създаването на подстраници.",
        "importlogpage": "Дневник на внасянията",
        "importlogpagetext": "Административни внасяния на страници с редакционна история от други уикита.",
        "import-logentry-upload": "[[$1]] беше внесена от файл",
-       "import-logentry-upload-detail": "{{PLURAL:$1|една версия|$1 версии}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|версия беше внесена|версии бяха внесени}}",
        "import-logentry-interwiki": "$1 беше внесена от друго уики",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|една версия|$1 версии}} на $2 бяха внесени",
+       "javascripttest": "Тестване на JavaScript",
        "javascripttest-pagetext-noframework": "Тази страница е запазена за изпълнение на Джаваскрипт тестове.",
        "javascripttest-pagetext-skins": "Избор на облик за тестванията:",
        "javascripttest-qunit-intro": "Вижте [$1 тестовата документация] на mediawiki.org.",
        "spam_reverting": "Връщане на последната версия, несъдържаща препратки към $1",
        "spam_blanking": "Всички версии, съдържащи препратки към $1, изчистване",
        "spam_deleting": "Всички версии съдържат препратки към $1, изтриване",
-       "simpleantispam-label": "Проверка за спам.\nНеобходимо е да '''НЕ''' попълвате това поле!",
+       "simpleantispam-label": "Проверка за спам.\nНеобходимо е да <strong>НЕ</strong> попълвате това поле!",
        "pageinfo-title": "Информация за \"$1\"",
        "pageinfo-not-current": "За съжаление тази информация не може да бъде предоставена за стари версии.",
        "pageinfo-header-basic": "Основна информация",
        "pageinfo-length": "Дължина на страницата (в байтове)",
        "pageinfo-article-id": "Номер на страницата",
        "pageinfo-language": "Език на съдържанието на страницата",
-       "pageinfo-robot-policy": "СÑ\82аÑ\82Ñ\83Ñ\82 Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ð² Ñ\82Ñ\8aÑ\80Ñ\81аÑ\87киÑ\82е",
-       "pageinfo-robot-index": "Ð\98ндекÑ\81иÑ\80Ñ\83ема",
-       "pageinfo-robot-noindex": "Ð\9dеиндекÑ\81иÑ\80Ñ\83ема",
+       "pageinfo-robot-policy": "Ð\98ндекÑ\81иÑ\80ане Ð¾Ñ\82 Ñ\80обоÑ\82и",
+       "pageinfo-robot-index": "Ð\9fозволено",
+       "pageinfo-robot-noindex": "Ð\9dепозволено",
        "pageinfo-views": "Брой прегледи",
        "pageinfo-watchers": "Брой наблюдаващи страницата",
        "pageinfo-few-watchers": "Под $1 {{PLURAL:$1|наблюдаващ|наблюдаващи}}",
        "hours-ago": "преди $1 {{PLURAL:$1|час|часа}}",
        "minutes-ago": "преди $1 {{PLURAL:$1|минута|минути}}",
        "seconds-ago": "преди $1 {{PLURAL:$1|секунда|секунди}}",
+       "monday-at": "Понеделник в $1",
+       "tuesday-at": "Вторник в $1",
+       "wednesday-at": "Сряда в $1",
+       "thursday-at": "Четвъртък в $1",
+       "friday-at": "Петък в $1",
+       "saturday-at": "Събота в $1",
+       "sunday-at": "Неделя в $1",
+       "yesterday-at": "Вчера в $1",
        "bad_image_list": "Спазва се следният формат:\n\nОтчитат се само записите в списъчен вид (редове, започващи със *). Първата препратка в реда трябва да сочи към неприемлив файл. Всички последващи препратки на същия ред се считат за изключения, т.е. страници, в които този файл може да се визуализира.",
        "metadata": "Метаданни",
        "metadata-help": "Файлът съдържа допълнителни данни, обикновено добавяни от цифровите апарати или скенери. Ако файлът е редактиран след създаването си, то някои параметри може да не съответстват на текущото изображение.",
        "exif-specialinstructions": "Специални инструкции",
        "exif-headline": "Заглавие",
        "exif-source": "Източник",
+       "exif-urgency": "Спешност",
        "exif-contact": "Информация за контакти",
        "exif-languagecode": "Език",
        "exif-iimversion": "IIM версия",
        "exif-originalimageheight": "Височина на изображението преди намаляването",
        "exif-originalimagewidth": "Ширина на изображението преди намаляването",
        "exif-compression-1": "Некомпресиран",
-       "exif-copyrighted-true": "С авторски права",
-       "exif-copyrighted-false": "Ð\9eбÑ\89еÑ\81Ñ\82вено Ð´Ð¾Ñ\81Ñ\82оÑ\8fние",
+       "exif-copyrighted-true": "Ð\97аÑ\88Ñ\82иÑ\82ено Ñ\81о авторски права",
+       "exif-copyrighted-false": "СÑ\82аÑ\82Ñ\83Ñ\82а Ð½Ð° Ð°Ð²Ñ\82оÑ\80Ñ\81киÑ\82е Ð¿Ñ\80ава Ð½Ðµ Ðµ Ñ\83казан",
        "exif-unknowndate": "Неизвестна дата",
        "exif-orientation-1": "Нормално",
        "exif-orientation-2": "Отражение по хоризонталата",
        "exif-objectcycle-p": "Само вечер",
        "exif-gpsdirection-t": "истинска",
        "exif-gpsdirection-m": "магнитна",
+       "exif-dc-contributor": "Сътрудници",
        "exif-dc-date": "Дата(и)",
        "exif-dc-rights": "Права",
        "exif-isospeedratings-overflow": "По-голяма от 65535",
        "exif-urgency-low": "Ниска ($1)",
        "exif-urgency-high": "Висока ($1)",
        "exif-urgency-other": "Зададен от потребителя приоритет ($1)",
-       "watchlistall2": "всички",
        "namespacesall": "Всички",
        "monthsall": "всички",
        "confirmemail": "Потвърждаване на адрес за електронна поща",
        "imgmultigo": "Отваряне",
        "imgmultigoto": "Отиване на страница $1",
        "img-lang-default": "(език по подразбиране)",
+       "img-lang-go": "Отваряне",
        "ascending_abbrev": "възх",
        "descending_abbrev": "низх",
        "table_pager_next": "Следваща страница",
        "watchlistedit-raw-done": "Списъкът ви за наблюдение беше обновен.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 страница беше добавена|$1 страници бяха добавени}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Една страница беше премахната|$1 страници бяха премахнати}}:",
+       "watchlistedit-clear-legend": "Изчистване на списъка за наблюдение",
+       "watchlistedit-clear-submit": "Изчистване на списъка за наблюдение (Необратимо!)",
        "watchlisttools-clear": "Изчистване на списъка за наблюдение",
        "watchlisttools-view": "Преглед на списъка за наблюдение",
        "watchlisttools-edit": "Преглед и редактиране на списъка за наблюдение",
        "duplicate-defaultsort": "Внимание: Ключът за сортиране по подразбиране „$2“ отменя по-ранния ключ „$1“.",
        "version": "Версия",
        "version-extensions": "Инсталирани разширения",
-       "version-skins": "Ð\9eблици",
+       "version-skins": "Ð\98нÑ\81Ñ\82алиÑ\80ани Ð¾блици",
        "version-specialpages": "Специални страници",
        "version-parserhooks": "Куки в парсера",
        "version-variables": "Променливи",
        "version-hook-name": "Име на куката",
        "version-hook-subscribedby": "Ползвана от",
        "version-version": "(Версия $1)",
+       "version-no-ext-name": "[без име]",
        "version-license": "Лиценз на МедияУики",
        "version-ext-license": "Лиценз",
        "version-ext-colheader-name": "Разширение",
+       "version-skin-colheader-name": "Облик",
        "version-ext-colheader-version": "Версия",
        "version-ext-colheader-license": "Лиценз",
        "version-ext-colheader-description": "Описание",
        "version-entrypoints": "Адреси на входни точки",
        "version-entrypoints-header-entrypoint": "Входна точка",
        "version-entrypoints-header-url": "Адрес",
+       "redirect-submit": "Отваряне",
        "redirect-user": "Потребителски номер",
+       "redirect-page": "Номер на страницата",
+       "redirect-revision": "Версия на страницата",
        "redirect-file": "Име на файл",
+       "redirect-not-exists": "Стойността не е намерена",
        "fileduplicatesearch": "Търсене на повтарящи се файлове",
        "fileduplicatesearch-summary": "Търсене на повтарящи се файлове на база хеш стойности.",
        "fileduplicatesearch-legend": "Търсене на повтарящ се файл",
        "tags-tag": "Име на етикета",
        "tags-display-header": "Изглед в списъците с промени",
        "tags-description-header": "Пълно описание на значението",
+       "tags-active-header": "Активен?",
        "tags-hitcount-header": "Отбелязани промени",
        "tags-active-yes": "Да",
        "tags-active-no": "Не",
        "logentry-delete-delete": "$1 {{GENDER:$2|изтри}} страницата $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|възстанови}} страницата $3",
        "logentry-suppress-revision": "$1 тайно промени видимостта на {{PLURAL:$5|една версия|$5 версии}} на страницата $3: $4",
-       "logentry-suppress-revision-legacy": "$1 тайно промени видимостта на версиите на страница $3",
+       "logentry-suppress-revision-legacy": "$1 тайно {{GENDER:$2|промени}} видимостта на версиите на страница $3",
        "revdelete-content-hid": "скрито съдържание",
        "revdelete-summary-hid": "скрито резюме на редакцията",
        "revdelete-uname-hid": "скрито потребителско име",
        "logentry-move-move": "$1 {{GENDER:$2|премести}} страница „$3“ като „$4“",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|премести}} страницата „$3“ като „$4“ без пренасочване",
        "logentry-move-move_redir": "$1 {{GENDER:$2|премести}} страницата $3 като $4 (върху пренасочване)",
-       "logentry-move-move_redir-noredirect": "$1 премести върху пренасочване „$3“ като „$4“ без пренасочване",
+       "logentry-move-move_redir-noredirect": "$1 {GENDER:$2|премести}} върху пренасочване $3 като $4 без пренасочване",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|отбеляза}} като патрулирана версия $4 на страницата „$3“",
        "logentry-patrol-patrol-auto": "$1 автоматично {{GENDER:$2|отбеляза}} като патрулирана версия $4 на страницата $3",
        "logentry-newusers-newusers": "Потребителската сметка $1 беше {{GENDER:$2|създадена}}",
        "logentry-newusers-autocreate": "Сметката $1 беше {{GENDER:$2|създадена}} автоматично",
        "logentry-rights-rights": "$1 {{GENDER:$2|промени}} потребителската група на $3 от $4 на $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|промени}} потребителската група на $3",
-       "logentry-rights-autopromote": "\n$1 е автоматично повишен от $4 до $5",
+       "logentry-rights-autopromote": "$1 е автоматично {{GENDER:$2|повишен|повишена}} от $4 до $5",
        "rightsnone": "(никакви)",
+       "revdelete-summary": "резюме",
        "feedback-bugornote": "Ако сте готови подробно да опишете технически проблем, моля [$1 докладвайте го тук].\nВ противен случай, можете да използвате лесния формуляр по-долу. Коментарът ви ще бъде добавен към страницата \"[$3 $2]\", наред с вашето потребителско име.",
        "feedback-subject": "Тема:",
        "feedback-message": "Съобщение:",
        "expand_templates_preview": "Преглед",
        "pagelang-name": "Страница",
        "pagelang-language": "Език",
-       "pagelang-select-lang": "Избиране на език"
+       "pagelang-use-default": "Използване на езика по подразбиране",
+       "pagelang-select-lang": "Избиране на език",
+       "right-pagelang": "Промяна езика на страница",
+       "action-pagelang": "промяна езика на страницата",
+       "log-name-pagelang": "Дневник на езиковите промени",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (включено)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''изключено''')"
 }
index a241a53..7781475 100644 (file)
        "hidetoc": "छुपाईं",
        "collapsible-collapse": "सेकुड़ीं",
        "collapsible-expand": "फैलाईं",
+       "confirmable-yes": "जी",
+       "confirmable-no": "ना",
        "thisisdeleted": "देखीं या भंडार करीं $1?",
        "viewdeleted": "$1 देखब?",
        "restorelink": "देखीं {{PLURAL:$1|एगो हटावल गईल सम्पादन|$1 हटावल गईल कुल सम्पादन}}",
        "resetpass-temp-password": "अस्थायी गुप्तशब्द:",
        "resetpass-abort-generic": "कउनो एक्सटेंशन द्वारा गुप्तशब्द में बदलाव रोक दिहल गईल बा।",
        "resetpass-expired": "राउर पासवर्ड की वैधता अवधि समाप्त हो चुकल बा। कृपया लॉग इन करे खातिर एगो नया पासवर्ड सेट करीं।",
+       "resetpass-expired-soft": "राउर गुप्तशब्द अमान्य हो चुकल बा इ के पुनः स्थापित करे के पड़ी। कृपया अभी एगो नया गुप्तशब्द चुनीं या \"{{int:resetpass-submit-cancel}}\" पर बाद में पुनः स्थापित कर सकत बानी।",
        "resetpass-validity-soft": "राउर पासवर्ड मान्य नईखे: $1 \n\nकृपया अब एक नया पासवर्ड चुनीं, या उ के बाद में पुनर्स्थापित करे खातिर \"{{int:resetpass-submit-cancel}}\" पर क्लिक करीं।",
        "passwordreset": "गुप्तशब्द रिसेट करीं",
        "passwordreset-text-one": "आपन गुप्तशब्द के पुनर्स्थापित करे खातिर इ फॉर्म भरीं।",
index 328fcd2..25afe2a 100644 (file)
        "passwordreset-emailsent-capture": "Sabuting suril pangingat sudah dikirim, nangkaya ditampaiakan di bawah.",
        "passwordreset-emailerror-capture": "Suril paugingat, nang ditampaikan di bawah, hudah dihasilakan, tagal gagal mangirimakannya ka pamakai: $1",
        "changeemail": "Ganti alamat suril",
-       "changeemail-header": "Ganti akun alamat suril",
        "changeemail-text": "Manuntungakan purmulir ngini hagan mangganti alamat suril Pian. Pian akan parlu mamasukakan katasunduk Pian hagan mayakinakan paubahan ngini.",
        "changeemail-no-info": "Pian musti babuat log hagan babuat ka tungkaran ngini langsung.",
        "changeemail-oldemail": "Alamat suril wayah ni:",
        "changeemail-none": "(kadada)",
        "changeemail-password": "Sandi {{SITENAME}} Pian:",
        "changeemail-submit": "Ganti suril",
-       "changeemail-cancel": "Walangi",
        "bold_sample": "Naskah kandal",
        "bold_tip": "Naskah kandal",
        "italic_sample": "Naskah hiring",
        "searchrelated": "bakulaan",
        "searchall": "samunyaan",
        "showingresults": "Di bawah ngini ditampaiakan hingga {{PLURAL:$1|'''1''' kulihan|'''$1''' kukulihan}}, dimulai matan #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Kulihan '''$1''' matan '''$3'''|Kukulihan '''$1 - $2''' matan '''$3'''}} gasan '''$4'''",
        "search-nonefound": "Kadada kulihan nang pas awan parmintaan.",
        "powersearch-legend": "Panggagaian mahir",
        "powersearch-ns": "Manggagai di ngaran kamar:",
        "querypage-disabled": "Tungkaran istimiwa ngini dikada-kawakan gasan alasan ginawi.",
        "booksources": "Buku bamula",
        "booksources-search-legend": "Gagai gasan buku asal mula",
-       "booksources-go": "Tulak ka",
        "booksources-text": "Di bawah adalah sabuah daptar tautan ka situs lain nang manjual bubuku hanyar wan bakas, wan jua baisi panjalasan labih pasal bubuku nang Pian ugai:",
        "booksources-invalid-isbn": "ISBN nang dibari mancungul kada sah; pariksa kalua-ai tasalah marekap matan asal-mula aslinya.",
        "specialloguserlabel": "Pamakai:",
        "wlheader-enotif": "Suril pamadahan dipajahi.",
        "wlheader-showupdated": "Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam '''hurup kandal'''",
        "wlnote": "Di bawah naya adalah {{PLURAL:$1|paubahan|'''$1''' paubahan}} tauncit dalam '''$2''' jam tauncit, par $3, $4.",
-       "wlshowlast": "Tampaiakan $1 jam $2 hari pahabisan $3",
+       "wlshowlast": "Tampaiakan $1 jam $2 hari pahabisan",
        "watchlist-options": "Pilihan daptar itihan",
        "watching": "Maitihi...",
        "unwatching": "Kada jadi maitihi...",
        "import": "Pamasuk tungkaran",
        "importinterwiki": "Impur transwiki",
        "import-interwiki-text": "Pilihi sabuting wiki wan judul tungkaran hagan di-impor.\nTanggal raralatan wan ngaran pambabak akan di partahanakan.\nSamunyaan gawi impur transwiki akan dicatat pada [[Special:Log/import|log impur]].",
-       "import-interwiki-source": "Wiki/tungkaran asal mula:",
        "import-interwiki-history": "Salin sabarataan halam raralatan gasan tungkaran ngini",
        "import-interwiki-templates": "Tamasuk samunyaan cicitakan",
        "import-interwiki-submit": "Impur",
        "exif-urgency-low": "Randah ($1)",
        "exif-urgency-high": "Pancau ($1)",
        "exif-urgency-other": "Ganti-suai utamaan ($1)",
-       "watchlistall2": "samunyaan",
        "namespacesall": "samunyaan",
        "monthsall": "samunyaan",
        "confirmemail": "Yakinakan alamat suril",
        "logentry-newusers-create2": "$1 ma-ulah sabuting akun pamakai $3",
        "logentry-newusers-autocreate": "Akun $1 utumatis diulah",
        "rightsnone": "(kadada)",
+       "revdelete-summary": "Kasimpulan babakan",
        "feedback-bugornote": "Pabila Pian siap manjalasakan sabuah masalah taknik rinci muhun [lapurakan sabuah bug $1].\nSalain ngitu, Pian kawa mamuruk prmulir nyaman di bawah ngini. Kumintar Pian akan ditambahi ka si tungkaran \"[$3 $2]\", baimbai awan ngaran-pamuruk Pian wan panjalajah nagn Pian puruk.",
        "feedback-subject": "Parihal:",
        "feedback-message": "Pasan:",
index 1726678..cade0c3 100644 (file)
@@ -38,6 +38,7 @@
        "tog-watchdefault": "আমার সম্পাদিত পাতা এবং ফাইলগুলো আমার নজরতালিকায় যোগ করা হোক",
        "tog-watchmoves": "আমার স্থানান্তরিত পাতা এবং ফাইলগুলো আমার নজরতালিকায় যোগ করা হোক",
        "tog-watchdeletion": "আমার অপসারিত পাতা এবং ফাইলগুলো আমার নজর তালিকায় যোগ করা হোক",
+       "tog-watchrollback": "আমার দ্বারা রোলব্যাক করা পাতা আমার নজরতালিকায় যোগ করা হোক",
        "tog-minordefault": "শুরুতেই সব সম্পাদনাকে অনুল্লেখ্য বলে চিহ্নিত করা হোক",
        "tog-previewontop": "সম্পাদনা বাক্সের আগে প্রাকদর্শন দেখানো হোক",
        "tog-previewonfirst": "প্রথম সম্পাদনার ক্ষেত্রে প্রাকদর্শন দেখানো হোক",
        "otherlanguages": "অন্যান্য ভাষাসমূহ",
        "redirectedfrom": "($1 থেকে ঘুরে এসেছে)",
        "redirectpagesub": "পুনর্নির্দেশ পাতা",
+       "redirectto": "পুননির্দেশিত হয়েছে:",
        "lastmodifiedat": "এ পাতায় শেষ পরিবর্তন হয়েছিল $2টার সময়, $1 তারিখে।",
        "viewcount": "এ পাতাটি {{PLURAL:$1|বার|$1 বার}} দেখা হয়েছে।",
        "protectedpage": "সুরক্ষিত পাতা",
        "createaccount-text": "কেউ $2-এর জন্য {{SITENAME}}-এ একটি অ্যাকাউন্ট সৃষ্টি করেছেন ($4)। \"$2\"-এর জন্য পাসওয়ার্ড হল \"$3\"। আপনার এখন অ্যাকাউন্টে প্রবেশ করে পাসওয়ার্ড পরিবর্তন করা উচিত।\n\nযদি ভুল করে অ্যাকাউন্টটি সৃষ্টি হয়ে থাকে, তাহলে এই বার্তাটি উপেক্ষা করুন।",
        "login-throttled": "আপনি সাম্প্রতিক সময়ে পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন।\nপুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।",
        "login-abort-generic": "আপনার লগইন সফল ছিলো না - বাতিল করা হয়েছে",
+       "login-migrated-generic": "আপনার অ্যাকাউন্ট স্থানান্তরিত করা হয়েছে, এবং আপনার ব্যবহারকারী নাম আর এই উইকিতে বিদ্যমান নয়।",
        "loginlanguagelabel": "ভাষা: $1",
        "suspicious-userlogout": "আপনার প্রস্থানের অনুরোধ বাতিল হয়েছে কারণ অনুমিত যে আপনার ব্রাউজার অসম্পূর্ণ অথবা পূবর্বতী তথ্য প্রেরণ করেছে।",
        "createacct-another-realname-tip": "আসল নাম ঐচ্ছিক।\nআপনি যদি তা দিতে চান, তাহলে তা ব্যবহারকারীকে তাদের কাজের জন্য স্বীকৃতিদানে ব্যবহার করা হবে।",
        "passwordreset-emailsent-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।",
        "passwordreset-emailerror-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!",
        "changeemail": "ই-মেইল ঠিকানা পরিবর্তন",
-       "changeemail-header": "অ্যাকাউন্ট ই-মেইল ঠিকানা পরিবর্তন",
        "changeemail-text": "ই-মেইল ঠিকানা পরিবর্তন করতে আপনাকে এই ফরমটি পূরণ করতে হবে। এই পরিবর্তনটি নিশ্চিত করতে আপনার পাসওয়ার্ড প্রদানের প্রয়োজন হবে।",
        "changeemail-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই লগইন করতে হবে।",
        "changeemail-oldemail": "বর্তমান ই-মেইল ঠিকানা:",
        "changeemail-none": "(কিছু নাই)",
        "changeemail-password": "আপনার {{SITENAME}} পাসওয়ার্ড:",
        "changeemail-submit": "ই-মেইল পরিবর্তন",
-       "changeemail-cancel": "বাতিল",
        "changeemail-throttled": "আপনি পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন। পুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।",
        "resettokens": "রিসেট টোকেন",
        "resettokens-text": "আপনি টোকেন রিসেট করতে পারেন, যা অ্যাকাউন্টের সাথে সম্পর্কিত আপনার ব্যক্তিগত তথ্য দেখার কাজে ব্যবহার করা হয়।",
        "showpreview": "প্রাকদর্শন",
        "showdiff": "পরিবর্তনসমূহ",
        "blankarticle": "<strong>সতর্ক বার্তা:</strong> আপনি একটি খালি পাতা তৈরী করতে যাচ্ছেন।\nআপনি যদি পুনরায় \"{{int:savearticle}}\" বাটন ক্লিক করেন তাহলে, পাতাটি তৈরী হবে যেখানে কোনো তথ্য লেখা নেই।",
-       "anoneditwarning": "আপনি লগ ইন করেননি। এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি সংখ্যা সংরক্ষিত হবে।",
+       "anoneditwarning": "<strong>সতর্কতা:</strong> আপনি বর্তমানে প্রবেশ করেননি। যদি আপনি সম্পাদনা করেন এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি ঠিকানা সার্বজনীনভাবে সংরক্ষিত হবে। যদি আপনি  <strong>[$1 প্রবেশ করেন]</strong> বা  <strong>[$2 একটি অ্যাকাউন্ট তৈরি করেন]</strong>, তাহলে আপনি আপনার আইপি ঠিকানা গোপন রাখতে পারবেন ও অন্যান্য অনেক কিছু সুবিধা পাবেন।",
        "anonpreviewwarning": "আপনি লগ ইন করেননি। এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি সংখ্যা সংরক্ষিত হবে।",
        "missingsummary": "'''খেয়াল করুন''':  আপনি কিন্তু সম্পাদনার সারাংশ দেননি। আবার যদি \"সংরক্ষণ\" বোতামে ক্লিক করেন, তাহলে ঐ সারাংশ বাক্যটি ছাড়াই আপনার সম্পাদনা সংরক্ষিত হবে।",
        "missingcommenttext": "দয়া করে নিচে মন্তব্য যোগ করুন।",
        "searchall": "সমস্ত",
        "showingresults": "নিচে '''$2''' নং থেকে শুরু করে {{PLURAL:$1|'''1''' ফলাফল|'''$1''' ফলাফলসমূহ}} দেখানো হল।",
        "showingresultsinrange": "#<strong>$2</strong> থেকে #<strong>$3</strong> পরিসীমার মধ্যে {{PLURAL:$1|<strong>১টি</strong> ফলাফল|<strong>$1টি</strong> ফলাফল}} নিচে দেখানো হচ্ছে।",
-       "showingresultsheader": "'''$4''' এর জন্য {{PLURAL:$5|ফলাফল '''$3''' এর '''$1'''|ফলাফলসমূহ '''$3''' এর মধ্যে '''$1 - $2'''}}",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>-এর মধ্যে <strong>$1</strong>টি ফলাফল|<strong>$3</strong>-এর মধ্যে <strong>$1 - $2</strong>টি ফলাফল}}",
        "search-nonefound": "খোঁজকৃত পাতার সাথে মিলে যায় এমন কোনো ফলাফল নেই।",
        "powersearch-legend": "উন্নত অনুসন্ধান",
        "powersearch-ns": "নামস্থানে অনুসন্ধান করো:",
        "right-deletedtext": "অপরাসারিত সংশোধনের অপরাসারিত লেখা এবং পরিবর্তনসমূহ দেখাও",
        "right-browsearchive": "অপসারিত পাতা অনুসন্ধান করো",
        "right-undelete": "পাতাটি পুনরুদ্ধার করুন",
-       "right-suppressrevision": "প্রশাসকদের থেকে লুকানো সংস্করণগুলো রিভিউ এবং রিস্টোর করুন",
+       "right-suppressrevision": "যেকোন ব্যবহারকারী থেকে পাতার নির্দিষ্ট সংশোধন দেখুন, আড়াল করুন এবং অ-আড়াল করুন",
+       "right-viewsuppressed": "সকল ব্যবহারকারীর জন্য লুকিয়াত সংশোধন প্রদর্শন কর",
        "right-suppressionlog": "ব্যক্তিগত লগ দেখাও",
        "right-block": "সম্পাদনা করতে কোনো ব্যবহারকারীকে বাঁধা দাও",
        "right-blockemail": "ই-মেইল পাঠাতে কোনো ব্যবহারকারীকে বাঁধা দাও",
        "largefileserver": "সার্ভারে যতখানি অনুমোদিত তার চেয়ে এই ফাইলের আকার বড়।",
        "emptyfile": "আপনি যে ফাইলটি আপলোড করেছেন, তা খালি মনে হচ্ছে। ফাইলের নামে টাইপিং ত্রুটির কারণে এরকম হতে পারে। অনুগ্রহ করে পরীক্ষা করে দেখুন আপনি আসলেই এই ফাইলটি আপলোড করতে চান কি না।",
        "windows-nonascii-filename": "এই উইকি বিশেষ ক্যারেক্টারসমৃদ্ধ ফাইলের নাম সমর্থন করে না।",
-       "fileexists": "এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান অনুগ্রহ করে <strong>[[:$1]]</strong> পরীক্ষা করে দেখুন, যদি আপনি এটি পরিবর্তনের ব্যাপারে নিশ্চিত না হন। [[$1|thumb]]",
+       "fileexists": "এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান, অনুগ্রহ করে <strong>[[:$1]]</strong> পরীক্ষা করে দেখুন, যদি আপনি এটি পরিবর্তনের ব্যাপারে নিশ্চিত না হন। [[$1|thumb]]",
        "filepageexists": "এই ফাইলের বর্ণনা পাতা এখানে <strong>[[:$1]]</strong> তৈরী করা হয়েছে, কিন্তু এই নামের কোনো ফাইল নেই।\nআপনার লেখা তথ্যগুলো বর্ণনা পাতায় যোগ করা যাচ্ছে না।\nতথ্যটি সংযোজনের জন্য আপনাকে ম্যানুয়ালী এই পাতাটি সম্পাদনা করতে হবে।\n[[$1|thumb]]",
-       "fileexists-extension": "à¦\8fà¦\95à¦\87 à¦¨à¦¾à¦®à§\87র à¦\86রà§\87à¦\95à¦\9fি à¦«à¦¾à¦\87ল à¦\86à¦\9bà§\87: [[$2|thumb]]\n* à¦\86পলà§\8bড à¦\95রা à¦«à¦¾à¦\87লà§\87র à¦¨à¦¾à¦®: <strong>[[:$1]]</strong>\n* à¦\8fà¦\95à¦\87 à¦¨à¦¾à¦®à§\87 à¦¬à¦°à§\8dতমান à¦«à¦¾à¦\87লà§\87র à¦¨à¦¾à¦®: <strong>[[:$2]]</strong>\nà¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦\8fà¦\95à¦\9fি à¦­à¦¿à¦¨à§\8dন à¦¨à¦¾à¦® à¦ªà¦\9bনà§\8dদ à¦\95রà§\81ন।",
+       "fileexists-extension": "à¦\8fà¦\95à¦\87 à¦¨à¦¾à¦®à§\87র à¦\86রà§\87à¦\95à¦\9fি à¦«à¦¾à¦\87ল à¦\86à¦\9bà§\87: [[$2|thumb]]\n* à¦\86পলà§\8bড à¦\95রা à¦«à¦¾à¦\87লà§\87র à¦¨à¦¾à¦®: <strong>[[:$1]]</strong>\n* à¦\8fà¦\95à¦\87 à¦¨à¦¾à¦®à§\87 à¦¬à¦°à§\8dতমান à¦«à¦¾à¦\87লà§\87র à¦¨à¦¾à¦®: <strong>[[:$2]]</strong>\nà¦\86পনি à¦\95ি à¦\86রà§\8b à¦\8fà¦\95à¦\9fি à¦¸à§\8dবতনà§\8dতà§\8dর à¦¨à¦¾à¦® à¦¬à§\8dযবহার à¦\95রতà§\87 à¦\9aান?",
        "fileexists-thumbnail-yes": "ফাইলটি একটি সংক্ষেপিত আকারের ছবি ''(থাম্বনেইল)'' বলে মনে হচ্ছে। [[$1|thumb]]\nঅনুগ্রহ করে <strong>[[:$1]]</strong> ফাইলটি পরীক্ষা করে দেখুন।\nযদি পরীক্ষাকৃত ফাইলটি একই ছবির মূল আকার হয়, তবে একটি অতিরিক্ত থাম্বনেইল আপলোড করার প্রয়োজন নেই।",
        "file-thumbnail-no": "ফাইলের নামটি <strong>$1</strong> দিয়ে শুরু হয়েছে।\nমনে হচ্ছে এটি একটি সংকুচিত আকারের ছবি  ''(থাম্বনেইল)''।\nআপনার কাছে যদি পূর্ণ রেজোলিউশনের ছবিটি থাকে, তবে সেটি আপলোড করুন, নতুবা অনুগ্রহ করে ফাইলের নামটি পরিবর্তন করুন।",
        "fileexists-forbidden": "এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান, এবং এটি প্রতিস্থাপনযোগ্য নয়।\nআপনি যদি এখনো ফাইলটি আপলোড করতে চান, তবে অনুগ্রহপূর্বক পেছনে গিয়ে একটি নতুন নামে ফাইলটি আপলোড করুন।\n[[File:$1|thumb|center|$1]]",
        "nolicense": "কিছুই নির্বাচন করা হয়নি",
        "licenses-edit": "লাইসেন্স অপশন সম্পাদনা করুন",
        "license-nopreview": "(প্রাকদর্শন লভ্য নয়)",
-       "upload_source_url": " (à¦\8fà¦\95à¦\9fি à¦¬à§\88ধ, à¦\89নà§\8dমà§\81à¦\95à§\8dত URL)",
-       "upload_source_file": " (আপনার কম্পিউটারের একটি ফাইল)",
+       "upload_source_url": " (à¦\86পনি à¦\8fà¦\95à¦\9fি à¦¬à§\88ধ, à¦\89নà§\8dমà§\81à¦\95à§\8dত URL à¦¥à§\87à¦\95à§\87 à¦«à¦¾à¦\87ল à¦\9aয়ন à¦\95রà§\87à¦\9bà§\87ন)",
+       "upload_source_file": "(আপনার কম্পিউটারের একটি ফাইল)",
        "listfiles-delete": "অপসারণ",
        "listfiles-summary": "এই বিশেষ পাতাটি আপলোড করা সকল ফাইল প্রদর্শন করে।",
        "listfiles_search_for": "ছবির নাম অনুসন্ধান:",
        "filedelete-maintenance": "রক্ষণাবেক্ষণের সময় ফাইল অপরাসণ এবং পুনরুদ্ধার সাময়িকভাবে নিস্ক্রিয় রয়েছে।",
        "filedelete-maintenance-title": "ফাইলটি অপসারণ করা সম্ভব নয়",
        "mimesearch": "MIME অনুসন্ধান",
-       "mimesearch-summary": "এই পাতার মাধ্যমে MIME-ধরন অনুসারে ফাইলগুলিকে ফিল্টার করা যায়। ইনপুট: contenttype/subtype, যেমন <code>image/jpeg</code>।",
+       "mimesearch-summary": "এই পাতা তাদের MIME-এর ধরণের জন্য ফাইল ফিল্টার করা সক্ষম করে। ইনপুট: contenttype/subtype বা contenttype/*, উদা: <code>image/jpeg</code>।",
        "mimetype": "MIME ধরন:",
        "download": "ডাউনলোড",
        "unwatchedpages": "নজরে না রাখা পাতাগুলি",
        "randomincategory": "বিষয়শ্রেণীর অজানা যেকোনো পাতা",
        "randomincategory-invalidcategory": "\"$1\" একটি ত্রুটিপূর্ণ বিষয়শ্রেণীর নাম।",
        "randomincategory-nopages": "[[:Category:$1]]-এ কোন পাতা নেই।",
-       "randomincategory-selectcategory": "এই বিষয়শ্রেণীর একটি অজানা যেকোনো পাতা: $1 $2।",
-       "randomincategory-selectcategory-submit": "যাও",
+       "randomincategory-category": "বিষয়শ্রেণী:",
+       "randomincategory-legend": "বিষয়শ্রেণীর অজানা যেকোনো পাতা",
        "randomredirect": "অনির্ধারিত পুনর্নির্দেশ",
        "randomredirect-nopages": "\"$1\" এই নামস্থানে কোন পুনর্নির্দেশ নেই।",
        "statistics": "পরিসংখ্যান",
        "wantedfiles": "আবশ্যিক ফাইলগুলো",
        "wantedfiletext-cat": "নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের কোন ফাইল খুজে পেলে <del>অপসারণ করুন</del>। এছাড়া অপসারিত হয়েছে এমন ছবির সংযোগ রয়েছে এমন পাতাসমূহের লিংক পাওয়া যাবে এখানে [[:$1]]।",
        "wantedfiletext-nocat": "নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের ভূলগুলো শিঘ্রই <del>অপসারিত হবে</del>।",
+       "wantedfiletext-nocat-noforeign": "নিম্নলিখিত ফাইলসমূহ ব্যবহৃত হয়েছে কিন্তু এর অস্তিত্ব নেই।",
        "wantedtemplates": "আবশ্যিক টেম্পলেটগুলো",
        "mostlinked": "যেসব পাতার প্রতি সবচেয়ে বেশি সংযোগ আছে",
        "mostlinkedcategories": "যেসব বিষয়শ্রেণীর প্রতি সবচেয়ে বেশি সংযোগ আছে",
        "booksources": "বইয়ের উৎস",
        "booksources-search-legend": "বইয়ের উৎসের জন্য অনুসন্ধান করা হোক",
        "booksources-isbn": "আইএসবিএন:",
-       "booksources-go": "চলো",
+       "booksources-search": "অনুসন্ধান",
        "booksources-text": "নতুন ও পুরাতন ব্যবহৃত বই বিক্রি করে, এমন কতগুলি সাইটের সংযোগের তালিকা নিচে দেওয়া হল, যে সাইটগুলিতে আপনার অনুসন্ধানকৃত বইগুলির উপর আরও তথ্য থাকতে পারে:",
        "booksources-invalid-isbn": "উল্লেখিত ISBN সঠিক নয়; অনুগ্রহ করে মূল উৎস থেকে আবার পরীক্ষা করুন।",
        "specialloguserlabel": "সম্পাদক:",
        "trackingcategories": "বিষয়শ্রেণীসমূহ অনুসরণ করা হচ্ছে",
        "trackingcategories-msg": "বিষয়শ্রেণী অনুসরণ করা হচ্ছে",
        "trackingcategories-name": "বার্তা নাম",
+       "broken-file-category-desc": "এই পাতায় একটি ভাঙ্গা ফাইলের লিঙ্ক রয়েছে (একটি ফাইল এম্বেড করার জন্য একটি লিঙ্ক যখন ফাইলটির অস্তিত্ব নেই)",
        "trackingcategories-nodesc": "কোন বর্ণনা নেই।",
        "trackingcategories-disabled": "বিষয়শ্রেণীটি বিকল",
        "mailnologin": "প্রাপকের ঠিকানা নেই",
        "wlheader-enotif": "ইমেল বিজ্ঞপ্তি সক্রিয় করা আছে।",
        "wlheader-showupdated": "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
        "wlnote": "নিচে $3, $4 তারিখ থেকে বিগত {{PLURAL:$2|১ ঘন্টায়|<strong>$2</strong> ঘন্টায়}} সংঘটিত {{PLURAL:$1|শেষ ১টি পরিবর্তন|শেষ <strong>$1টি</strong> পরিবর্তন}} দেখানো হল।",
-       "wlshowlast": "দà§\87à¦\96াà¦\93 à¦¸à¦°à§\8dবশà§\87ষ  $1 à¦\98ণà§\8dà¦\9fা $2 à¦¦à¦¿à¦¨ $3",
+       "wlshowlast": "সরà§\8dবশà§\87ষ $1 à¦\98ণà§\8dà¦\9fা $2 à¦¦à¦¿à¦¨à§\87 à¦¦à§\87à¦\96াà¦\93",
        "watchlist-options": "নজর তালিকা পছন্দসমূহ",
        "watching": "নজর রাখা হচ্ছে...",
        "unwatching": "নজর তুলে নেওয়া হচ্ছে...",
        "exbeforeblank": "মুছে ফেলার আগে বিষয়বস্তু ছিল: '$1'",
        "delete-confirm": "\"$1\" অপসারণ",
        "delete-legend": "অপসারণ",
-       "historywarning": "'''সতর্কীকরণ:''' যে পাতাটি আপনি মুছে ফেলতে যাচ্ছেন তার ইতিহাসে প্রায় $1টি {{PLURAL:$1|সংশোধন}} রয়েছে:",
+       "historywarning": "<strong>সতর্কীকরণ:</strong> যে পাতাটি আপনি মুছে ফেলতে যাচ্ছেন তার ইতিহাসে প্রায় $1টি {{PLURAL:$1|সংশোধন}} রয়েছে:",
        "confirmdeletetext": "আপনি একটি পাতা সেটির সমস্ত ইতিহাসসহ মুছে ফেলতে যাচ্ছেন।\nঅনুগ্রহ করে নিশ্চিত করুন আপনি আসলেই এটি করতে চান, আপনি এর ফলাফল সম্পর্কে অবহিত, এবং আপনি [[{{MediaWiki:Policy-url}}|নীতিমালা]] মেনে এটি করছেন।",
        "actioncomplete": "কাজটি নিষ্পন্ন হয়েছে",
        "actionfailed": "অ্যাকশন ব্যর্থ",
        "delete-edit-reasonlist": "অপসারণের কারণ সম্পাদনা",
        "delete-toobig": "এই পাতার সম্পাদনার ইতিহাস অনেক বড়, যা $1টি {{PLURAL:$1|সংস্করণের|সংস্করণের}} বেশি।\n{{SITENAME}}-এর দূর্ঘটনাজনিত সমস্যা এড়াতে এই ধরনের পাতা মুছার ব্যপারে সীমাবদ্ধতা আরোপিত হয়েছে।",
        "delete-warning-toobig": "এই পাতাটির একটি বৃহৎ সম্পাদনা ইতিহাস রয়েছে, যা $1 {{PLURAL:$1|সংস্করণেরও|সংস্করণেরও}} বেশি।\nএই পাতাটি মুছে ফেললে তা {{SITENAME}} সাইটের ডেটাবেজ সমস্যার কারণ হতে পারে;\nসাবধানতার সাথে এগিয়ে যান।",
+       "deleteprotected": "আপনি এই পাতাটি মুছে ফেলতে পারবেন না কারণ এটি সুরক্ষিত করা হয়েছে।",
        "deleting-backlinks-warning": "'''সতর্কীকরণ:''' আপনি যেটি মুছে ফেলতে যাচ্ছেন তা [[Special:WhatLinksHere/{{FULLPAGENAME}}|অন্যান্য পাতাসমূহে]] সংযুক্ত অথবা অন্তর্ভুক্ত রয়েছে।",
        "rollback": "সম্পাদনা ফিরিয়ে নিন",
        "rollback_short": "ফিরিয়ে নিন",
        "protect-othertime": "অন্য সময়:",
        "protect-othertime-op": "অন্য সময়",
        "protect-existing-expiry": "বিদ্যমান মেয়াদউত্তীর্ণের সময়: $3, $2",
+       "protect-existing-expiry-infinity": "বিদ্যমান মেয়াদ উত্তীর্নের সময়: অসীম",
        "protect-otherreason": "অন্যান্য/অতিরিক্ত কারণ:",
        "protect-otherreason-op": "অন্য কারণ",
        "protect-dropdown": "*সুরক্ষার প্রচলিত কারণ\n** অতিরিক্ত ধ্বংসপ্রবণতা\n** অতিরিক্ত অর্থহীন বিষয়বস্তু প্রবেশ করানো\n** পাল্টা-গঠনমূলক সম্পাদনা যুদ্ধ\n** বেশি মাত্রায় প্রদর্শনকৃত পাতা",
        "import": "পাতা আমদানি",
        "importinterwiki": "আন্তঃউইকি আমদানি",
        "import-interwiki-text": "আমদানির জন্য একটি উইকি ও পাতার শিরোনাম নির্বাচন করুন।\nসংশোধনের তারিখগুলি এবং সম্পাদকদের নামগুলি সংরক্ষণ করা হবে।\nসমস্ত আন্তঃউইকি আমদানিগুলি [[Special:Log/import|আমদানি লগে]] লিপিবদ্ধ আছে।",
-       "import-interwiki-source": "উৎস উইকি/পাতা:",
+       "import-interwiki-sourcewiki": "উত্স উইকি:",
+       "import-interwiki-sourcepage": "উৎস পাতা:",
        "import-interwiki-history": "এই পাতার সমস্ত ইতিহাসের সংস্করণের অনুলিপি করা হোক",
        "import-interwiki-templates": "সকল টেম্পলেট অন্তর্ভুক্ত",
        "import-interwiki-submit": "আমদানি",
        "import-upload": "XML ডাটা আপলোড",
        "import-token-mismatch": "সেশন ডাটা হারিয়ে গিয়েছে।\nঅনুগ্রহ করে পুনরায় চেষ্টা করুন।",
        "import-invalid-interwiki": "নির্ধারিত উইকি থেকে আমদানী করা যাবে না।",
-       "import-error-edit": "\"$1\" à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\87মà§\8dপà§\8bরà§\8dà¦\9f করা যায়নি কারণ আপনার এটি সম্পাদনা করার অনুমতি নেই।",
+       "import-error-edit": "\"$1\" à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86মদানি করা যায়নি কারণ আপনার এটি সম্পাদনা করার অনুমতি নেই।",
        "import-error-create": "\"$1\" পাতাটি ইম্পোর্ট করা যায়নি কারণ আপনার এটি তৈরী করার অনুমতি নেই।",
        "import-error-interwiki": "\"$1\" পাতাটি ইম্পোর্ট করা যায়নি কারণ এই নামটি বহিঃসংযোগর জন্য নির্ধারিত (ইন্টারউইকি)।",
-       "import-error-special": "\"$1\" à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\87মà§\8dপà§\8bরà§\8dà¦\9f করা যায়নি কারণ এটি একটি বিশেষ নামস্থানকে নির্দেশ করে যেটি সম্পাদনার জন্য অনুমোদিত নয়।",
+       "import-error-special": "\"$1\" à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86মদানি করা যায়নি কারণ এটি একটি বিশেষ নামস্থানকে নির্দেশ করে যেটি সম্পাদনার জন্য অনুমোদিত নয়।",
        "import-error-invalid": "\"$1\" পাতাটি ইম্পোর্ট করা যায়নি কারণ নামটি সঠিক নয়।",
        "import-error-unserialize": "$1 পাতার $2 সংস্করণটি সিরিয়ালাইজ করা যাচ্ছে না। এই রিভিশনে $4 হিসাবে $3 কন্টেন্ট মডেলে সিরিয়ালাইজ করা আছে।",
        "import-options-wrong": "ভুল {{PLURAL:$2|অপশন|অপশনসমূহ}}: <nowiki>$1</nowiki>",
        "exif-urgency-low": "নিম্ন ($1)",
        "exif-urgency-high": "উচ্চ ($1)",
        "exif-urgency-other": "ব্যবহারকারী নির্ধারিত অগ্রাধিকার ক্রম ($1)",
-       "watchlistall2": "সবগুলো",
        "namespacesall": "সমস্ত",
        "monthsall": "সমস্ত",
        "confirmemail": "ই-মেইলের ঠিকানা নিশ্চিত করুন",
        "logentry-upload-overwrite": "$1 $3-এর একটি নতুন সংস্করণ {{GENDER:$2|আপলোড করেছেন}}",
        "logentry-upload-revert": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
        "rightsnone": "(কিছু নাই)",
+       "revdelete-summary": "সম্পাদনা সারাংশ",
        "feedback-bugornote": "কারিগরী ত্রুটির বিস্তারিত বর্ণনা জানতে [$1 বাগ রিপোর্ট করুন]।\nঅথবা নিচের এই সরল ফর্মটি ব্যবহার করতে পারেন। \"[$3 $2]\" পাতায় আপনার ব্যবহারকারী নাম সহ মন্তব্যটি প্রকাশিত হবে।",
        "feedback-subject": "বিষয়:",
        "feedback-message": "বার্তা:",
        "log-description-pagelang": "এটি পাতার ভাষা পরিবর্তনের লগ।",
        "logentry-pagelang-pagelang": "$1 পাতার ভাষা $3 এর জন্য $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন।",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (সক্রিয় করা)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''নিষ্ক্রিয় করা''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''নিষ্ক্রিয় করা''')",
+       "mediastatistics": "মিডিয়া পরিসংখ্যান",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 বাইট}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME ধরন",
+       "mediastatistics-table-extensions": "সম্ভাব্য এক্সটেনশন",
+       "mediastatistics-table-count": "ফাইলের সংখ্যা",
+       "mediastatistics-table-totalbytes": "সম্মিলিত আকার",
+       "mediastatistics-header-unknown": "অজানা",
+       "mediastatistics-header-bitmap": "বিটম্যাপ চিত্র",
+       "mediastatistics-header-drawing": "অংকন (ভেক্টর চিত্র)",
+       "mediastatistics-header-audio": "অডিও",
+       "mediastatistics-header-video": "ভিডিও",
+       "mediastatistics-header-office": "অফিস",
+       "json-error-unknown": "JSON-এ একটি সমস্যা রয়েছে। ত্রুটি: $1",
+       "json-error-syntax": "সিনট্যাক্স ত্রুটি"
 }
index 434232e..2ff0ef4 100644 (file)
        "changeemail-newemail": "དྲ་འཕྲིན་ཁ་བྱང་གསར་བ།",
        "changeemail-none": "(སྟོང་པ།)",
        "changeemail-submit": "དྲ་འཕྲིན་བརྗེ་བ།",
-       "changeemail-cancel": "རྩིས་མེད་ཐོངས།",
        "bold_sample": "ཡིག་གཟུགས་སྦོམ་པོ།",
        "bold_tip": "ཡིག་གཟུགས་སྦོམ་པོ།",
        "italic_sample": "ཡིག་གཟུགས་གསེག་མ།",
        "search-relatedarticle": "འབྲེལ་ཡོད།",
        "searchrelated": "འབྲེལ་ཡོད།",
        "searchall": "ཚང་མ།",
-       "showingresultsheader": "{{PLURAL:$5|གྲུབ་འབྲས་ <strong>$1</strong> ཡི་<strong>$3</strong>གྲབ་འབྲས། <strong>$1 - $2</strong> ཡི་ <strong>$3</strong>}} ཆེད་དུ་ <strong>$4</strong>",
        "search-nonefound": "ཁྱེད་ཀྱི་འདྲི་ཞིབ་དང་མཐུན་པའི་ལན་མི་འདུག་",
        "powersearch-legend": "ཞིབ་ཏུ་འཚོལ་བ།",
        "powersearch-ns": "མིང་གནས་ནང་འཚོལ་བ།",
        "pager-older-n": "{{PLURAL:$1|རྙིང་པ་1|རྙིང་པ་$1}}",
        "booksources": "དཔེ་ཆའི་ཁུངས།",
        "booksources-search-legend": "དེབ་ཁུངས་འཚོལ་བ།",
-       "booksources-go": "སོང་།",
        "log": "པོད་ཁུག",
        "allpages": "དྲ་ངོས་ཡོངས།",
        "prevpage": "ཤོག་ངོས་གོང་མ་ ($1)",
        "watchthispage": "དྲ་ངོས་འདི་ལ་གཟིགས།",
        "unwatch": "མི་བལྟ་བ།",
        "unwatchthispage": "བལྟ་བ་མཚམས་འཇོག",
-       "wlshowlast": "འདས་བའི་དུས་ཚོད་ $1 ནང་ཚུན་  ཉིན་མ་ $2 ནང་ཚུན་ $3 སྟོན།",
+       "wlshowlast": "འདས་བའི་དུས་ཚོད་ $1 ནང་ཚུན་  ཉིན་མ་ $2 ནང་ཚུན་  སྟོན།",
        "watchlist-options": "ལྟ་ཐོའི་འདེམས་ཚན།",
        "watching": "ལྟ་ཐོར་འཇུག་བཞིན་པ་་་",
        "unwatching": "ལྟ་ཐོ་ལས་འདོར་བཞིན་པ་་་",
        "metadata": "རྒྱུ་གཞི་གྲངས།",
        "metadata-help": "ཡིག་ཆ་འདིར་ཆ་འཕྲིན་གཞན་དག་པ་ཁ་ཅིག་འདུག། ཕལ་ཆེར་གྲངས་འཛིན་དཔར་ཆས་འམ་འབེབས་ཆས་ལས་གྲངས་འཛིན་ཡོང་ཆེད་བཟོས་པ་ཡིན། \nགལ་སྲིད་ཡིག་ཆ་འདིར་འགྱུར་བ་གཏོང་གནང་ན། དེ་སྔོན་གྱི་ལྟར་ཞིབས་ཚག་སྟོན་མི་ཐུབ།",
        "metadata-fields": "དཔར་རིས་ཀྱི་ནང་དོན་འདིར་ཡོད་པ་རྣམས་ནང་དོན་ཞིབ་ཕྲའི་སྐབས་སྟོན་རྒྱུ་ཡིན། དེ་མིན་རྣམས་རང་འགུལ་གྱི་འབས་ཞོགས་རྒྱུ་ཡིན།\n* བཟོ་སྐྲུན།\n* དབྱབས་གཟུགས།",
-       "watchlistall2": "ཚང་མ།",
        "namespacesall": "ཡོངས་རྫོགས།",
        "monthsall": "ཡོངས་རྫོགས།",
        "imgmultigo": "སོང་།!",
        "watchlisttools-raw": "ལྟ་ཐོའི་གོ་རིམ་བཅོས་སྒྲིག",
        "specialpages": "ཆེད་ལས་ཤོག་ངོས།",
        "tag-filter": "འདེམས་འཚག། [[Special:Tags|Tag]]",
-       "rightsnone": "(སྟོང་པ།)"
+       "rightsnone": "(སྟོང་པ།)",
+       "revdelete-summary": "བསྡུས་དོན་བཟོ་བཅོས།"
 }
index 3da2377..b4df7b4 100644 (file)
        "passwordreset-username": "আতাকুরার নাংহান:",
        "passwordreset-domain": "ডমেইন:",
        "changeemail": "ই-মেইল ঠিকানাহান সিলকর",
-       "changeemail-header": "অ্যাকাউন্টর ই-মেইল ঠিকানাহান সিলকর",
        "changeemail-text": "ইমেইল ঠিকানাহান সিরকরানি মনেইলে ফরম এহান পুরন কর। সিলপা এহান লেপকরতে তর খন্তাচাবিগ দেনা লাগতই।",
        "changeemail-no-info": "পাতা এহানাত হমিতে গেলেগা তি যেসারেউ লগইন করানি লাগতই।",
        "changeemail-none": "(নেই)",
        "changeemail-submit": "ই-মেইল সিলকর",
-       "changeemail-cancel": "বাতিল করেদে",
        "bold_sample": "গাঢ়পা ৱাহি",
        "bold_tip": "গাঢ়পা ৱাহি",
        "italic_sample": "ইটালিক মেয়েক",
        "search-relatedarticle": "সাকেই আসে",
        "searchrelated": "সাকেই আসে",
        "searchall": "হাব্বি",
-       "showingresultsheader": "'''$4''' র কা {{PLURAL:$5|ফলহান '''$3''' র '''$1'''|ফলহানি '''$3''' র মা '''$1 - $2'''}}",
        "search-nonefound": "তি বিসারার অহানর লগে মান্নাপাতা নাপারাঙ।",
        "powersearch-legend": "উন্নত বিসারানি",
        "powersearch-ns": "নেমস্পেসর মা বিসারা:",
        "pager-older-n": "{{PLURAL:$1|আরাকউ পুরানা ১হান|আরাকউ পুরানা $1হান}}",
        "booksources": "লেরিকর উৎসহান",
        "booksources-search-legend": "লেরিকরর উৎসহান বিসারা",
-       "booksources-go": "হাত",
        "specialloguserlabel": "আতাকুরাগ:",
        "speciallogtitlelabel": "চিঙনাঙ:",
        "log": "লগ",
        "unwatch": "তালাবি নেই",
        "unwatchthispage": "তালাবি এরাদেনা",
        "watchlist-details": "{{PLURAL:$1|$1 পাতা|$1 পাতাহানি}} তর তালাবিত আসে, য়্যারির পাতা ধরানি নাসে।",
-       "wlshowlast": "গেলগা $1 ঘন্টা $2 দিনর $3 দেখাদে",
+       "wlshowlast": "গেলগা $1 ঘন্টা $2 দিনর  দেখাদে",
        "watchlist-options": "তালাবিত আসে পাতার পছনহানি",
        "watching": "চা...",
        "unwatching": "নাউচা...",
        "metadata-collapse": "সালকরিসি পৌ ঝিপা",
        "metadata-fields": "এরে পৌ এহান তিলসে ছবি মেটাপৌ অতা ছবির পাতাত দেখাদেনা ইতই, যেপাগা হেলপা উপাত্ত সারণি অতা জিপানি ইতই। হের ক্ষেত্রহানি স্বাভাবিক অবস্থাত জিপিয়া থাইতই।\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-gpsspeed-n": "গাথিগি",
-       "watchlistall2": "হাব্বি",
        "namespacesall": "হাব্বি",
        "monthsall": "হাব্বি",
        "confirmemail": "ই-মেইল ঠিকানাহান লেপকর",
        "revdelete-restricted": "ডান্ডিকরেকুরাগরাঙ সীমাবদ্ধতাহানি ফলা",
        "revdelete-unrestricted": "ডান্ডিকরেকুরাগরাঙ সীমাবদ্ধতাহানি নেইকর",
        "rightsnone": "(নেই)",
+       "revdelete-summary": "সারাংশ পতানি",
        "searchsuggest-search": "বিসারা",
        "searchsuggest-containing": "আসেতা..."
 }
index c1145a4..7cac1d5 100644 (file)
        "otherlanguages": "Yezhoù all",
        "redirectedfrom": "(Adkaset eus $1)",
        "redirectpagesub": "Pajenn adkas",
+       "redirectto": "Adkas da :",
        "lastmodifiedat": "Kemmoù diwezhañ degaset d'ar bajenn-mañ, d'an/ar $1 da $2.",
        "viewcount": "Sellet ez eus bet {{PLURAL:$1|$1 wezh|$1 gwezh}} ouzh ar bajenn-mañ.",
        "protectedpage": "Pajenn warezet",
        "jumptonavigation": "merdeiñ",
        "jumptosearch": "klask",
        "view-pool-error": "Ho tigarez, soulgarget eo ar servijerioù evit poent.\nRe a implijerien a glask mont war ar bajenn-mañ war un dro.\nGortozit ur pennadig a-raok klask mont war ar bjann-mañ en-dro.\n\n$1",
+       "generic-pool-error": "Ho tigarez, soulgarget eo ar servijerioù evit poent.\nRe a implijerien a glask mont war ar bajenn-mañ war un dro.\nGortozit ur pennadig a-raok klask mont war ar bajenn-mañ en-dro.",
        "pool-timeout": "Aet eur dreist d'an termen gortoz evit ar stankadenn",
        "pool-queuefull": "Soulgarget eo ar servijerioù",
        "pool-errorunknown": "Fazi dianav",
        "invalidtitle-knownnamespace": "Titl direizh gant an esaouenn anv \"$2\" hag an destenn \"$3\"",
        "invalidtitle-unknownnamespace": "Titl direizh gant an niverenn esaouenn anv $1 hag an destenn \"$2\" dianav",
        "exception-nologin": "N'oc'h ket kevreet",
-       "exception-nologin-text": "Ar bajenn-mañ pe an ober-mañ a c'houlenn e vefec'h kevreet er wiki-mañ.",
+       "exception-nologin-text": "Ar bajenn-mañ pe an ober-mañ a c'houlenn e vefec'h kevreet.",
        "exception-nologin-text-manual": "$1, mar plij, evit gallout mont d'ar bajenn-mañ pe ober an dra-mañ",
        "virus-badscanner": "Kefluniadur fall : skanner viruzoù dianav : ''$1''",
        "virus-scanfailed": "Skannadenn c'hwitet (kod $1)",
        "gotaccount": "Ur gont zo ganeoc'h dija ? '''$1'''.",
        "gotaccountlink": "Kevreañ",
        "userlogin-resetlink": "Ha disoñjet eo bet ho titouroù kevreañ ganeoc'h ?",
-       "userlogin-resetpassword-link": "Ankouaet ho peus ho ker-tremen ?",
+       "userlogin-resetpassword-link": "Ankouaet ho ker-tremen ganeoc'h ?",
        "userlogin-helplink2": "Skoazell evit kevreañ",
        "userlogin-loggedin": "Kevreet oc'h dija evel {{GENDER:$1|$1}}.\nImplijit ar furmskrid amañ dindan evit kevreañ evel un implijer all.",
        "userlogin-createanother": "Krouiñ ur gont all",
        "resetpass-submit-cancel": "Nullañ",
        "resetpass-wrong-oldpass": "Direizh eo ar ger-tremen a-vremañ pe da c'hortoz.",
        "resetpass-recycled": "Ret eo d'ho ker-tremen nevez bezañ disheñvel diouzh ho ker-tremen a vremañ.",
+       "resetpass-temp-emailed": "Kevreet e oac'h bet gant ur c'hod dibad kaset deoc'h dre bostel.\nEvit echuiñ kevreañ e rankit lakaat ur ger-tremen nevez amañ :",
        "resetpass-temp-password": "Ger-tremen da c'hortoz :",
        "resetpass-abort-generic": "Nullet eo bet kemm ar ger-tremen gant un astenn.",
        "resetpass-expired": "Deuet eo ho ker-tremen d'e dermen. Lakait ur ger-tremen nevez, mar plij, evit kevreañ.",
        "passwordreset-emailsent-capture": "Ur postel evit aderaouekaat ho ker-tremen, evel diskouezet amañ dindan, zo bet kaset.",
        "passwordreset-emailerror-capture": "Kaset ez eus bet ur postel degas da soñj evel m'emañ diskouezet amañ dindan met c'hwitet eo bet ar gasadenn d'an {{GENDER:$2|implijer|implijerez}} : $1",
        "changeemail": "Kemmañ ar chomlec'h postel",
-       "changeemail-header": "Kemmañ chomlec'h postel ar gont",
        "changeemail-text": "Leugnit ar furmskrid-mañ da cheñch ho chomlec'h postel. Ret e vo deoc'h merkañ ho ker-tremen evit kadarnaat ar c'hemm-se.",
        "changeemail-no-info": "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
        "changeemail-oldemail": "Chomlec'h postel a-vremañ :",
        "changeemail-none": "(hini ebet)",
        "changeemail-password": "Ho ker-tremen war {{SITENAME}}:",
        "changeemail-submit": "Cheñch chomlec'h postel",
-       "changeemail-cancel": "Nullañ",
        "changeemail-throttled": "Betek re hoc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
        "resettokens": "Adderaouekaat ar jedoueroù",
        "resettokens-no-tokens": "N'eus jedouer ebet da adderaouekaat.",
        "parser-template-recursion-depth-warning": "Tizhet bevenn donder galvoù ar patromoù ($1)",
        "language-converter-depth-warning": "Aet eur en tu all d'ar vevenn amdreiñ yezhoù ($1)",
        "node-count-exceeded-category": "Pajennoù m'eur aet en tu all d'an niver a skoulmoù",
-       "node-count-exceeded-warning": "Pajenn a ya en tu all d'an niver a skoulmoù",
+       "node-count-exceeded-category-desc": "Mont a ra ar bajenn-mañ en tu all da gont uhelañ ar skoulmoù.",
+       "node-count-exceeded-warning": "Pajenn hag a ya en tu all d'an niver a skoulmoù",
        "expansion-depth-exceeded-category": "Pajennoù m'eur aet dreist d'an donder astenn",
+       "expansion-depth-exceeded-category-desc": "En tu all d'an donder astenn brasañ emañ ar bajenn.",
        "expansion-depth-exceeded-warning": "Pajenn a ya dreist d'an donder astenn",
        "parser-unstrip-loop-warning": "Detektet ez eus bet ul lagadenn n'haller ket divontañ",
        "parser-unstrip-recursion-limit": "Aet dreist d'ar vevenn rekurziñ n'haller ket divontañ : $1",
        "currentrev": "Stumm a-vremañ pe stumm red",
        "currentrev-asof": "Stumm red eus an $1",
        "revisionasof": "Stumm eus an $1",
-       "revision-info": "Stumm eus an $1 gant $2",
+       "revision-info": "Stumm eus an $1 gant $2$7",
        "previousrevision": "← Stumm kent",
        "nextrevision": "Stumm war-lerc'h →",
        "currentrevisionlink": "Gwelet ar stumm red",
        "revdelete-show-file-confirm": "Ha sur oc'h e fell deoc'h gwelet stumm diverket ar restr \"<nowiki>$1</nowiki>\" deiziataet eus an $2 da $3?",
        "revdelete-show-file-submit": "Ya",
        "logdelete-selected": "{{PLURAL:$1|Darvoud eus ar marilh diuzet}} :",
+       "revdelete-text-file": "Dalc'het e vo da welet stummoù restroù dilamet en istor ar restr, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
+       "logdelete-text": "Gwelet e vo c'hoazh dilamadennoù er marilhoù, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
+       "revdelete-text-others": "Ar verourien a c'hallo c'hoazh mont da welet petra zo e-barzh, hag eilpennañ an dilamadenn, nemet ha reolennoù strishoc'h ouzhpenn a vefe.",
        "revdelete-confirm": "Kadarnait eo mat an dra-se a fell deoc'h ober, e komprenit mat ar pezh a empleg, hag en grit en ur zoujañ d'ar [[{{MediaWiki:Policy-url}}|reolennoù]].",
        "revdelete-suppress-text": "Ne zlefe an dilemel bezañ implijet <strong>nemet</strong> abalamour d'an abegoù da-heul :\n* Titouroù personel dizere\n*: <em>chomlec'hioù, niverennoù pellgomz pe surentez sokial personel, hag all.</em>",
        "revdelete-legend": "Lakaat strishadurioù gwelet",
        "mergehistory-empty": "N'haller ket kendeuziñ stumm ebet.",
        "mergehistory-success": "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.",
        "mergehistory-no-destination": "N'eus ket eus ar bajenn dal $1.",
        "mergehistory-invalid-source": "Ret eo da anv ar bajenn orin bezañ reizh.",
        "shown-title": "Diskouez $1 {{PLURAL:$1|disoc'h|disoc'h}} dre bajenn",
        "viewprevnext": "Gwelet ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Ur bajenn anvet\"[[:$1]]\" zo war ar wiki-mañ'''",
-       "searchmenu-new": "'''Krouiñ ar bajenn \"[[:$1]]\" war ar wiki-mañ !'''",
+       "searchmenu-new": "<strong>Krouiñ ar bajenn \"[[:$1]]\" war ar wiki-mañ !</strong> {{PLURAL:$2|0=|Gwelet ivez ar bajenn kavet gant ho klask.|Gwelet ivez disoc'hoù ar c'hlask.}}",
        "searchprofile-articles": "Pajennoù gant boued",
        "searchprofile-images": "Liesmedia",
        "searchprofile-everything": "Pep tra",
        "searchrelated": "disoc'hoù kar",
        "searchall": "An holl",
        "showingresults": "Diskouez betek {{PLURAL:$1|'''1''' disoc'h|'''$1''' disoc'h}} o kregiñ gant #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Disoc'h '''$1''' diwar '''$3'''|Disoc'hoù '''$1 - $2''' diwar '''$3'''}} evit '''$4'''",
+       "showingresultsinrange": "O tiskouez amañ dindan betek {{PLURAL:$1|<strong>1</strong> disoc'h|<strong>$1</strong> a zisoc'hoù}} etre #<strong>$2</strong> ha #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Disoc'h <strong>$1</strong> of <strong>$3</strong>|a zisoc'hoù <strong>$1 - $2</strong> diwar <strong>$3</strong>}}",
        "search-nonefound": "An enklask-mañ ne zisoc'h war netra.",
        "powersearch-legend": "Klask araokaet",
        "powersearch-ns": "Klask en esaouennoù anv :",
        "preferences": "Penndibaboù",
        "mypreferences": "Penndibaboù",
        "prefs-edits": "Niver a zegasadennoù :",
-       "prefsnologintext2": "$1, mar plij, evit cheñch ho penndibaboù.",
+       "prefsnologintext2": "Kevreit evit cheñch ho penndibaboù, mar plij.",
        "prefs-skin": "Gwiskadur",
        "skin-preview": "Rakwelet",
        "datedefault": "Dre ziouer",
        "recentchangesdays-max": "D'ar muiañ $1 {{PLURAL:$1|deiz|deiz}}",
        "recentchangescount": "Niver a gemmoù da ziskouez dre ziouer",
        "prefs-help-recentchangescount": "Kemer a ra an dra-mañ e kont ar c'hemmoù diwezhañ, istor ar pajennoù hag ar marilhoù.",
+       "prefs-help-watchlist-token2": "Homañ zo an alc'hwez kuzh d'ho roll-evezhiañ davit boued war ar web. Forzh piv a anavez anezhañ a c'hall lenn ho roll-evezhiañ, setu na lavarit grit diwar e benn. M'ho pez ezhomm, e c'hallit [[Special:ResetTokens|assevel anezhañ]].",
        "savedprefs": "Enrollet eo bet ar penndibaboù.",
        "timezonelegend": "Takad eur :",
        "localtime": "Eur lec'hel :",
        "userrights-notallowed": "N'oc'h ket aotreet da ouzhpennañ na da lemel gwirioù an implijerien.",
        "userrights-changeable-col": "Ar strolladoù a c'hallit cheñch",
        "userrights-unchangeable-col": "Ar strolladoù n'hallit ket cheñch",
+       "userrights-conflict": "Bec'h zo abalamour da gemmoù e gwirioù an implijerien. Adwelit an traoù, mar plij, ha kadarnait ho kemmoù.",
        "userrights-removed-self": "Lamet ho peus ho kwirioù deoc'h-c'hwi. Dre se ne c'hallit ket ken mont d'ar bajenn-mañ.",
        "group": "Strollad :",
        "group-user": "Implijerien",
        "right-move": "Adenvel pajennoù",
        "right-move-subpages": "Dilec'hiañ ar pajennoù gant o ispajennoù",
        "right-move-rootuserpages": "Adenvel pajennoù diazez an implijer",
+       "right-move-categorypages": "Dilec'hiañ pajennoù rummad",
        "right-movefile": "Dilec'hiañ ar restroù",
        "right-suppressredirect": "Chom hep sevel un adkas adalek ar bajenn gozh en ur adenvel ar bajenn",
        "right-upload": "Enporzhiañ restroù",
        "action-move": "dilec'hiañ ar bajenn-mañ",
        "action-move-subpages": "dilec'hiañ ar bajenn-mañ hag an ispajennoù anezhi",
        "action-move-rootuserpages": "dilec'hiañ pajennoù an implijer diazez.",
+       "action-move-categorypages": "dilec'hiañ pajennoù rummad",
        "action-movefile": "Adenvel ar restr-mañ",
        "action-upload": "enporzhiañ ar restr-mañ",
        "action-reupload": "frikañ ar restr-mañ",
        "license": "Aotre-implijout :",
        "license-header": "Aotre implijout",
        "nolicense": "Hini ebet diuzet",
+       "licenses-edit": "Aozañ dibarzhioù an aotre-implijout",
        "license-nopreview": "(Dibosupl rakwelet)",
-       "upload_source_url": " (Un URL reizh a c'hall bezañ tizhet gant an holl)",
-       "upload_source_file": " (ur restr war hoc'h urzhiataer)",
+       "upload_source_url": " (ar restr ho peus dibabet diwar un URL reizh hag a c'hall bezañ tizhet gant an holl)",
+       "upload_source_file": " (ar restr ho peus dibabet en hoc'h urzhiataer)",
        "listfiles-delete": "dilemel",
        "listfiles-summary": "Diskouez a ra ar bajenn dibar-mañ an holl restroù bet ezporzhiet.",
        "listfiles_search_for": "Klask anv ar skeudenn :",
        "randomincategory": "Ur bajenn dre zegouezh er rummad",
        "randomincategory-invalidcategory": "\"$1\" n'eo ket un anv rummad reizh.",
        "randomincategory-nopages": "N'eus pajenn ebet e [[:Category:$1]].",
-       "randomincategory-selectcategory": "Tapout ur bajenn dre zegouezh eus ar rummad : $1 $2.",
-       "randomincategory-selectcategory-submit": "Mont",
+       "randomincategory-category": "Rummad :",
+       "randomincategory-legend": "Ur bajenn dre zegouezh er rummad",
        "randomredirect": "Ur bajenn adkas dre zegouezh",
        "randomredirect-nopages": "N'eus pajenn adkas ebet en esaouenn anv \"$1\".",
        "statistics": "Stadegoù",
        "pageswithprop-prophidden-long": "talvoud perzh testenn hir kuzhet ($1)",
        "doubleredirects": "Adkasoù doubl",
        "doubleredirectstext": "Rollañ a ra ar bajenn-mañ ar pajennoù a adkas da bajennoù adkas all.\nWar bep linenn ez eus liammoù war-du pajennoù an adkas kentañ hag en eil adkas, hag ivez war-du pajenn-dal an eil adkas zo sañset bezañ ar pal \"gwirion\" a zlefe an adkas kentañ kas di.\nDiskoulmet eo bet an enmontoù <del>barrennet</del>.",
-       "double-redirect-fixed-move": "Adanvet eo bet [[$1]], adkaset eo war-du [[$2]] bremañ",
-       "double-redirect-fixed-maintenance": "O reizhañ an adkas doubl adalek [[$1]] war-zu [[$2]].",
+       "double-redirect-fixed-move": "Dilec'hiet eo [[$1]].\nHizivaet eo bet ent emgefre ha bremañ ez adkas da [[$2]].",
+       "double-redirect-fixed-maintenance": "O reizhañ ent emgefre an adkas doubl adalek [[$1]] war-zu [[$2]] en un trevell trezalc'h.",
        "double-redirect-fixer": "Reizher adkasoù",
        "brokenredirects": "Adkasoù torret",
        "brokenredirectstext": "Kas a ra an adkasoù-mañ da bajennoù n'eus ket anezho.",
        "wantedpages-badtitle": "Titl direizh er strollad disoc'hoù : $1",
        "wantedfiles": "Restroù a vank",
        "wantedfiletext-cat": "Ober a reer gant ar restroù da-heul koulskoude n'eus ket anezho. Gallout a reer rollañ kavlec'hioù diavaez ha pa vefe anezho. <del>Barrennet</del> e vo an holl falspozitivoù-se. Ouzhpenn-se emañ renablet an holl bajennoù zo enno restroù n'eus ket anezho e [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Implijet eo ar restroù-mañ, met n'eus ket anezho. Ouzhpenn-se, emañ ar pajennoù a enframm ar restroù er roll [[:$1]].",
        "wantedfiletext-nocat": "Ober a reer gant ar restroù da-heul koulskoude n'eus ket anezho. Gallout a reer rollañ kavlec'hioù diavaez ha pa vefe anezho. <del>Barrennet</del> e vo an holl falspozitivoù-se.",
        "wantedfiletext-nocat-noforeign": "Implijet e vez ar restroù-mañ met n'eus ket anezho.",
        "wantedtemplates": "Patromoù a vank",
        "mostlinked": "Pajennoù dezho al liammoù niverusañ",
        "mostlinkedcategories": "Rummadoù dezho al liammoù niverusañ",
-       "mostlinkedtemplates": "Patromoù implijet ar muiañ",
+       "mostlinkedtemplates": "Pajennoù enframmet ar muiañ",
        "mostcategories": "Pennadoù rummatet ar muiañ",
        "mostimages": "Skeudennoù implijet ar muiañ",
        "mostinterwikis": "Pajennoù gant an niver brasañ a etrewikioù",
        "booksources": "Oberennoù dave",
        "booksources-search-legend": "Klask en oberennoù dave",
        "booksources-isbn": "ISBN :",
-       "booksources-go": "Kadarnaat",
+       "booksources-search": "Klask",
        "booksources-text": "Ur roll liammoù a gas da lec'hiennoù all ma werzher levrioù kozh ha nevez a gavot a-is; marteze e kavot eno titouroù pelloc'h war al levrioù a glaskit :",
        "booksources-invalid-isbn": "Evit doare n'eo ket reizh an ISBN merket; gwiriit ha n'oc'h ket faziet en ur eilañ adal ar vammenn orin.",
        "specialloguserlabel": "Implijer :",
        "listgrouprights-addgroup-self-all": "Gallout a ra ouzhpennañ an holl strolladoù da gont an-unan",
        "listgrouprights-removegroup-self-all": "Gallout a ra tennañ kuit an holl strolladoù eus kont an-unan.",
        "listgrouprights-namespaceprotection-namespace": "Esaouenn anv",
+       "listgrouprights-namespaceprotection-restrictedto": "Gwir(ioù) hag a aotre an implijer da aozañ",
+       "trackingcategories": "Rummadoù evezhiañ",
+       "trackingcategories-msg": "Rummad evezhiañ",
        "trackingcategories-name": "Anv ar gemennadenn",
+       "broken-file-category-desc": "Er bajenn-mañ ez eus ul liamm restr torr (ul liamm da enframmañ ur restr pa n'eus ket eus ar restr-se).",
        "trackingcategories-nodesc": "N'eus deskrivadur ebet.",
        "trackingcategories-disabled": "Diweredekaet eo ar rummad",
        "mailnologin": "Chomlec'h ebet",
        "mywatchlist": "Ma roll evezhiañ",
        "watchlistfor2": "Evit $1 $2",
        "nowatchlist": "N'eus pennad ebet en ho roll evezhiañ.",
-       "watchlistanontext": "Ret eo deoc'h $1 evit gwelet pe kemmañ an elfennoù zo en ho roll evezhiañ.",
+       "watchlistanontext": "Ret eo deoc'h kevreañ evit gwelet pe aozañ an elfennoù a zo en ho roll evezhiañ.",
        "watchnologin": "Digevreet",
        "addwatch": "Ouzhpennañ d'ar roll evezhiañ",
        "addedwatchtext": "Ouzh ho [[Special:Watchlist|rollad evezhiañ]] eo bet ouzhpennet ar bajenn \"[[:$1]]\".\nAmañ e vo rollet ar c'hemmoù da zont evit ar bajenn-mañ hag ar bajenn gaozeal stag outi.",
        "unwatchthispage": "Paouez da evezhiañ",
        "notanarticle": "Pennad ebet",
        "notvisiblerev": "Stumm diverket",
-       "watchlist-details": "Lakaet hoc'h eus {{PLURAL:$1|$1 bajenn|$1 pajenn}} dindan evezh, anez kontañ ar pajennoù kaozeal.",
+       "watchlist-details": "Lakaet hoc'h eus {{PLURAL:$1|$1 bajenn|$1 a bajennoù}} war ho roll evezhiañ, anez kontañ ar pajennoù kaozeal.",
        "wlheader-enotif": "Gweredekaet eo ar c'has posteloù.",
        "wlheader-showupdated": "E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
-       "wlnote": "Setu aze {{PLURAL:$1|ar c'hemm diwezhañ|ar '''$1''' kemm diwezhañ}} c'hoarvezet e-kerzh an {{PLURAL:$2|eurvezh|'''$2''' eurvezh}} ziwezhañ, evit an $3 da $4.",
-       "wlshowlast": "Diskouez an $1 eurvezh $2 devezh diwezhañ $3",
+       "wlnote": "Setu aze {{PLURAL:$1|ar c'hemm diwezhañ|ar '''$1''' kemm diwezhañ}} c'hoarvezet e-kerzh an {{PLURAL:$2|eurvezh|'''$2''' eurvezh}} diwezhañ, d'an $3 da $4.",
+       "wlshowlast": "Diskouez an $1 eurvezh $2 devezh diwezhañ",
        "watchlist-options": "Dibarzhioù ar roll evezhiañ",
        "watching": "Heuliet...",
        "unwatching": "Paouez da evezhiañ...",
        "exbeforeblank": "A-raok diverkañ e oa an endalc'had : '$1'",
        "delete-confirm": "Diverkañ \"$1\"",
        "delete-legend": "Diverkañ",
-       "historywarning": "'''Diwallit :''' Emaoc'h war-nes diverkañ ur bajenn dezhi un istor gant e-tro {{PLURAL:$1|adweladenn|adweladenn}} :",
+       "historywarning": "<strong>Diwallit :</strong> Emaoc'h war-nes diverkañ ur bajenn dezhi un istor gant {{PLURAL:$1|adweladenn}} :",
        "confirmdeletetext": "War-nes diverkañ da viken ur bajenn pe ur skeudenn eus ar bank roadennoù emaoc'h. Diverket e vo ivez an holl stummoù kozh stag outi.\nKadarnait, mar plij, eo mat an dra-se hoc'h eus c'hoant da ober, e komprenit mat an heuliadoù, hag e rit se diouzh ar [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Diverkadenn kaset da benn",
        "actionfailed": "Ober c'hwitet",
        "delete-edit-reasonlist": "Kemmañ a ra an abegoù diverkañ",
        "delete-toobig": "Bras eo istor ar bajenn-mañ, ouzhpenn $1 {{PLURAL:$1|stumm|stumm}} zo. Bevennet eo bet an diverkañ pajennoù a-seurt-se kuit da zegas reuz war {{SITENAME}} dre fazi .",
        "delete-warning-toobig": "Bras eo istor ar bajenn-mañ, ouzhpenn {{PLURAL:$1|stumm|stumm}} zo.\nDiverkañ anezhi a c'hallo degas reuz war mont en-dro diaz titouroù {{SITENAME}};\ntaolit evezh bras.",
+       "deleteprotected": "Ne c'hallit ket dilemel ar bajenn-mañ rak gwarezet eo bet.",
        "rollback": "disteuler ar c'hemmoù",
        "rollback_short": "Disteuler",
        "rollbacklink": "disteuler",
        "alreadyrolled": "Dibosupl eo disteuler ar c'hemm diwezhañ graet d'ar bajenn [[:$1]] gant [[User:$2|$2]] ([[User talk:$2|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nkemmet pe distaolet eo bet c'hoazh gant unan bennak all.\n\nAr c'hemm diwezhañ d'ar bajenn-mañ a oa bet graet gant [[User:$3|$3]] ([[User talk:$3|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Diverradenn ar c'hemm a oa : \"''$1''\".",
        "revertpage": "Kemmoù distaolet gant [[Special:Contributions/$2|$2]] ([[User talk:$2|Kaozeal]]); adlakaet d'ar stumm diwezhañ a-gent gant [[User:$1|$1]]",
-       "revertpage-nouser": "Disteuler kemmoù un implijer kuzhet ha distreiñ d'ar stumm diwezhañ gant [[User:$1|$1]]",
+       "revertpage-nouser": "Disteuler kemmoù un implijer kuzhet ha distreiñ d'ar stumm diwezhañ gant an {{GENDER:$1|[[implijer :$1|$1]]}}",
        "rollback-success": "Disteuler kemmoù $1; distreiñ da stumm diwezhañ $2.",
        "sessionfailure-title": "Fazi dalc'h",
        "sessionfailure": "Evit doare ez eus ur gudenn gant ho talc'h;\nNullet eo bet an ober-mañ a-benn en em wareziñ diouzh an tagadennoù preizhañ.\nKlikit war \"kent\" hag adkargit ar bajenn oc'h deuet drezi; goude klaskit en-dro.",
        "autoblockid": "Emstankañ #$1",
        "block": "Stankañ an implijer",
        "unblock": "Distankañ an implijer",
-       "blockip": "Stankañ ur chomlec'h IP",
+       "blockip": "Stankañ an {{GENDER:$1|implijer|implijerez}}",
        "blockip-legend": "Stankañ an implijer",
        "blockiptext": "Grit gant ar furmskrid a-is evit stankañ ar moned skrivañ ouzh ur chomlec'h IP pe un implijer bennak.\nSeurt diarbennoù n'hallont bezañ kemeret nemet evit mirout ouzh ar vandalerezh hag a-du gant an [[{{MediaWiki:Policy-url}}|erbedadennoù ha reolennoù da heuliañ]].\nRoit a-is an abeg resis (o verkañ, da skouer, roll ar pajennoù bet graet gaou outo).",
        "ipaddressorusername": "Chomlec'h IP pe anv implijer",
        "blockipsuccesstext": "Stanket eo bet [[Special:Contributions/$1|$1]].<br />\nSellit ouzh [[Special:BlockList|roll ar chomlec'hioù IP ha kontoù stanket]] evit gwiriañ ar stankadennoù.",
        "ipb-blockingself": "Emaoc'h war-nes stankañ ac'hanoc'h hoc'h-unan ! Ha sur oc'h eo se a fell deoc'h ober ?",
        "ipb-confirmhideuser": "Emaoc'h war-nes stankañ un implijer ha gweredekaet hoc'h eus \"kuzhat an implijer\". Diverkañ a ra an dra-se anv an implijer en holl rolloù ha monedoù ar marilh.",
+       "ipb-confirmaction": "A'z oc'h sur e fell deoc'h ober an dra-se evit gwir, askit ar vaezienn \"{{int:ipb-confirm}}\" en traoñ.",
        "ipb-edit-dropdown": "Kemmañ an abegoù stankañ",
        "ipb-unblock-addr": "Distankañ $1",
        "ipb-unblock": "Distankañ un implijer pe ur chomlec'h IP",
        "unblocked": "Distanket eo bet [[User:$1|$1]]",
        "unblocked-range": "Distanket eo bet $1",
        "unblocked-id": "Distanket eo bet $1",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] zo bet distanket.",
        "blocklist": "Implijerien stanket",
        "ipblocklist": "Implijerien stanket",
        "ipblocklist-legend": "Kavout un implijer stanket",
        "cant-move-user-page": "Noc'h ket aotreet da adenvel pajennoù pennañ an implijerien (er-maez eus o ispajennoù).",
        "cant-move-to-user-page": "Noc'h ket aotreet da adenvel ur bajenn gant anv hini un implijer all (nemet un ispajenn e vefe).",
        "cant-move-category-page": "N'oc'h ket aotreet da zilec'hiañ pajennoù rummad.",
+       "cant-move-to-category-page": "N'oc'h ket aotreet da zilec'hiañ ur bajenn d'ur bajenn rummad.",
        "newtitle": "anv nevez",
        "move-watch": "Evezhiañ ar bajenn-mañ",
        "movepagebtn": "Adenvel ar pennad",
        "import": "Enporzhiañ pajennoù",
        "importinterwiki": "enporzhiadenn etrewiki",
        "import-interwiki-text": "Diuzit ur wiki hag ur bajenn da enporzhiañ.\nMiret e vo deiziadoù ar stummmoù hag anvioù an aozerien.\nMiret eo an holl enporzhiadennoù etrewiki e-barzh [[Special:Log/import|log an enporzhiadennoù]].",
-       "import-interwiki-source": "wiki ha pajennoù tarzh :",
+       "import-interwiki-sourcewiki": "Wiki mammenn :",
+       "import-interwiki-sourcepage": "Pajenn orin :",
        "import-interwiki-history": "Eilañ holl stummoù istor ar bajenn-mañ",
        "import-interwiki-templates": "Lakaat e-barzh an holl batromoù",
        "import-interwiki-submit": "Enporzhiañ",
        "import-error-create": "N'eo ket bet enporzhiet ar bajenn \"$1\" peogwir n'oc'h ket aotreet da grouiñ anezhi.",
        "import-error-interwiki": "Ne vez ket enporzhiet ar bajenn \"$1\" rak miret eo an anv evit liammoù diavaez (etrewiki).",
        "import-error-special": "Ne vez ket enporzhiet ar bajenn \"$1\" rak stag eo ouzh un esaouenn anv dibar na aotre ket pajennoù.",
-       "import-error-invalid": "Ne vez ket enporzhiet ar bajenn \"$1\" rak direizh eo hec'h anv.",
+       "import-error-invalid": "N'eo ket bet enporzhiet ar bajenn \"$1\" rak direizh e vefe hec'h anv er wiki-mañ.",
        "import-options-wrong": "{{PLURAL:$2|Dibab fall|Dibaboù fall}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Pourchas a ra ar bennbajenn un titl n'eo ket reizh.",
        "import-rootpage-nosubpage": "Esaouenn anvioù \"$1\" eus ar bennpajenn ne aotre ket an ispajennoù.",
        "importlogpage": "Log an enporzhiadennoù",
        "importlogpagetext": "Enporzhiadennoù melestradurel eus pajennoù adal wikioù all gant istor ar c'hemmadennoù degaset enno.",
        "import-logentry-upload": "en/he deus enporzhiet (pellgarget) [[$1]]",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|stumm|stumm}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|adweladenn}} enporzhiet",
        "import-logentry-interwiki": "treuzwikiet $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|c'hemm|kemm}} abaoe $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|adweladenn}} enporzhiet eus $2",
        "javascripttest": "Amprouadenn JavaScript",
        "javascripttest-title": "Emeur o seveniñ $1 amprouadenn",
        "javascripttest-pagetext-noframework": "Miret eo ar bajenn-mañ evit amprouiñ JavaScript.",
        "newimages-summary": "Diskouez a ra ar bajenn dibar-mañ roll ar restroù diwezhañ bet enporzhiet.",
        "newimages-legend": "Sil",
        "newimages-label": "Anv ar restr (pe darn anezhi) :",
+       "newimages-showbots": "Diskouez an ezporzhiadennoù graet gant robotoù",
        "noimages": "Netra da welet.",
        "ilsubmit": "Klask",
        "bydate": "dre an deiziad anezho",
        "exif-urgency-low": "Izel ($1)",
        "exif-urgency-high": "Uhel ($1)",
        "exif-urgency-other": "Priorelezh termenet gant an aozer ($1)",
-       "watchlistall2": "pep tra",
        "namespacesall": "pep tra",
        "monthsall": "an holl",
        "confirmemail": "Kadarnaat ar chomlec'h postel",
        "watchlistedit-raw-done": "Nevesaet eo bet ho roll evezhiañ.",
        "watchlistedit-raw-added": "Ouzhpennet ez eus bet {{PLURAL:$1|1 pajenn|$1 pajenn}} :",
        "watchlistedit-raw-removed": "Tennet ez eus bet {{PLURAL:$1|1 pajenn|$1 pajenn}} :",
+       "watchlistedit-clear-title": "Roll evezhiañ goulloet",
        "watchlistedit-clear-legend": "Diverkañ ar roll-evezhiañ",
+       "watchlistedit-clear-explain": "Lamet e vo an holl ditloù eus ho roll evezhiañ",
        "watchlistedit-clear-titles": "Titloù :",
+       "watchlistedit-clear-done": "Goulloet eo bet ho roll evezhiañ.",
        "watchlistedit-clear-removed": "Dilamet ez eus bet {{PLURAL:$1|1 titl|$1 a ditloù}} :",
        "watchlistedit-too-many": "Re a bajennoù zo da ziskwel amañ.",
        "watchlisttools-clear": "Diverkañ ar roll-evezhiañ",
        "fileduplicatesearch-noresults": "N'eus bet kavet restr ebet anvet \"$1\".",
        "specialpages": "Pajennoù dibar",
        "specialpages-note-top": "Alc'hwez",
-       "specialpages-note": "* Pajennoù dibar boutin.\n* <span class=\"mw-specialpagerestricted\">Pajennoù dibar miret strizh.</span>\n* <span class=\"mw-specialpagecached\">Pajennoù dibar krubuilhet hepken (a c'hellfe bezañ re gozh).</span>",
+       "specialpages-note": "* Pajennoù dibar ordinal.\n* <span class=\"mw-specialpagerestricted\">Pajennoù dibar miret strizh.</span>",
        "specialpages-group-maintenance": "Rentaoù-kont trezalc'h",
        "specialpages-group-other": "Pajennoù dibar all",
        "specialpages-group-login": "Kevreañ / krouiñ ur gont",
        "logentry-newusers-byemail": "Krouet eo bet ar gont implijer $3 gant $1 ha kaset eo bet ar ger-tremen dre bostel",
        "logentry-newusers-autocreate": "{{GENDER:$2|Krouet}} eo bet kont $1 ent emgefre",
        "logentry-rights-autopromote": "$1 zo bet {{GENDER:$2|anvet}} ent emgefre a $4 da $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet ur stumm nevez eus $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
        "rightsnone": "(netra)",
+       "revdelete-summary": "diverradenn eus ar c'hemmoù",
        "feedback-bugornote": "Ma'z oc'h prest da zeskrivañ ur gudenn deknikel dre ar munud e c'hallit [$1 kemenn un draen].\nA-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc'h evezhiadenn d'ar bajenn \"[$3 $2]\", a-gevret gant hoc'h anv implijer hag anv ar merdeer a rit gantañ.",
        "feedback-subject": "Danvez :",
        "feedback-message": "Kemennadenn :",
        "pagelang-select-lang": "Dibab ar yezh",
        "right-pagelang": "Cheñch yezh ar bajenn",
        "action-pagelang": "cheñch yezh ar bajenn",
+       "log-name-pagelang": "Cheñch yezh",
+       "log-description-pagelang": "Hemañ zo ur marilh eus ar c'hemmoù e pajenn ar yezhoù.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|en deus|he deus}} cheñchet yezh ar bajenn evit $3 eus $4 da $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (gweredekaet)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''diweredekaet''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''diweredekaet''')",
+       "mediastatistics": "Stadegoù ar media",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 okted|$1 a oktedoù}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Seurt MIME",
+       "mediastatistics-table-extensions": "Astennoù hag a c'haller lakaat",
+       "mediastatistics-table-count": "Niver a restroù",
+       "mediastatistics-table-totalbytes": "Ment kenstrollet",
+       "mediastatistics-header-unknown": "Dianav",
+       "mediastatistics-header-bitmap": "Skeudennom bitmap",
+       "mediastatistics-header-drawing": "Tresadennoù (skeudennoù vektorel)",
+       "mediastatistics-header-audio": "Kleved",
+       "mediastatistics-header-video": "Videoioù",
+       "mediastatistics-header-office": "Burev",
+       "mediastatistics-header-text": "Testenn",
+       "mediastatistics-header-archive": "Furmadoù gwasket",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|virgulenn|a virgulennoù}} dibenn zo bet lamet eus JSON",
+       "json-error-unknown": "Ur gudenn a oa gant ar JSON. Fazi : $1",
+       "json-error-depth": "Aet eur en tu all da zonder brasañ an torn",
+       "json-error-state-mismatch": "JSON direizh pe stummet fall",
+       "json-error-syntax": "Fazi ereadur",
+       "json-error-utf8": "Arouezennoù UTF-8 stummet fall, enkodet en un doare direizh marteze"
 }
index bf0f1e2..fee1e5c 100644 (file)
        "searcharticle": "Idi",
        "history": "Historija stranice",
        "history_short": "Historija",
-       "updatedmarker": "promjene od moje zadnje posjete",
+       "updatedmarker": "promjene od moje posljednje posjete",
        "printableversion": "Prilagođeno štampanju",
        "permalink": "Trajni link",
        "print": "Štampa",
        "view": "Pogled",
+       "view-foreign": "Vidi na $1",
        "edit": "Uredi",
+       "edit-local": "Uredi lokalni opis",
        "create": "Napravi",
+       "create-local": "Dodaj lokalni opis",
        "editthispage": "Uredite ovu stranicu",
        "create-this-page": "Napravi ovu stranicu",
        "delete": "Obriši",
        "jumptonavigation": "navigacija",
        "jumptosearch": "traži",
        "view-pool-error": "Žao nam je, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da pregleda ovu stranicu.\nMolimo pričekajte trenutak prije nego što ponovno pokušate pristupiti ovoj stranici.\n\n$1",
+       "generic-pool-error": "Nažalost, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da vidi ovaj resurs.\nMolimo pričekajte trenutak prije nego što ponovo pokušate da mu pristupite.",
        "pool-timeout": "Zaustavi čekanje na zaključavanje",
        "pool-queuefull": "Red na pool je prenapunjen",
        "pool-errorunknown": "Nepoznata greška",
        "hidetoc": "sakrij",
        "collapsible-collapse": "sklopi",
        "collapsible-expand": "Proširi",
+       "confirmable-confirm": "Da li {{GENDER:$1|ste}} sigurni?",
+       "confirmable-yes": "Da",
+       "confirmable-no": "Ne",
        "thisisdeleted": "Pogledaj ili vrati $1?",
        "viewdeleted": "Pogledaj $1?",
        "restorelink": "{{PLURAL:$1|$1 izbrisana izmjena|$1 izbrisanih izmjena}}",
        "nospecialpagetext": "<strong>Tražili ste nevaljanu posebnu stranicu.</strong>\n\nSpisak valjanih posebnih stranica se može naći na [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Greška",
        "databaseerror": "Greška u bazi",
+       "databaseerror-text": "Došlo je do greške u upitu baze podataka. \nMožda je u pitanju softverska greška.",
+       "databaseerror-textcl": "Došlo je do greške u upitu baze podataka.",
+       "databaseerror-query": "Upit: $1",
        "databaseerror-function": "Funkcija: $1",
        "databaseerror-error": "Greška: $1",
        "laggedslavemode": "'''Upozorenje''': Stranica, možda, nije ažurirana.",
        "badtitle": "Loš naslov",
        "badtitletext": "Zahtjevani naslov stranice je bio neispravan, prazan ili neispravno povezan međujezički ili interviki naslov.",
        "perfcached": "Slijedeći podaci su keširani i možda neće biti u potpunosti ažurirani. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata}}.",
-       "perfcachedts": "Slijedeći podaci se nalaze u memoriji i zadnji put su ažurirani $1. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata}}.",
+       "perfcachedts": "Sljedeći podaci nalaze se u memoriji i posljednji put ažurirani su $1. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je isključeno.\nPodaci koji se ovdje nalaze ne moraju biti aktuelni.",
        "viewsource": "Pogledaj izvor",
        "viewsource-title": "Prikaz izvora stranice $1",
        "invalidtitle-knownnamespace": "Neispravan naslov s imenskim prostorom \"$2\" i tekstom \"$3\"",
        "invalidtitle-unknownnamespace": "Neispravan naslov s imenskim prostorom br. $1 i tekstom \"$2\"",
        "exception-nologin": "Niste prijavljeni",
-       "exception-nologin-text": "[[Special:Userlogin|Prijavite se]] da biste pristupili ovoj stranici ili radnji.",
+       "exception-nologin-text": "Prijavite se da biste pristupili ovoj stranici ili radnji.",
+       "exception-nologin-text-manual": "Molimo $1 da biste pristupili ovoj stranici ili radnji.",
        "virus-badscanner": "Loša konfiguracija: nepoznati anti-virus program: ''$1''",
        "virus-scanfailed": "skeniranje nije uspjelo (code $1)",
        "virus-unknownscanner": "nepoznati anti-virus program:",
        "passwordsent": "Nova šifra je poslata na adresu e-pošte korisnika \"$1\".\nMolimo Vas da se prijavite pošto je primite.",
        "blocked-mailpassword": "Da bi se spriječila nedozvoljena akcija, Vašoj IP adresi je onemogućeno uređivanje stranica kao i mogućnost zahtijevanje nove šifre.",
        "eauthentsent": "Na navedenu adresu poslana je e-poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, pratite uputstva s e-pošte da biste potvrdili da je račun zaista Vaš.",
-       "throttled-mailpassword": "Već Vam je poslan e-mail za promjenu šifre u {{PLURAL:$1|zadnjih sat vremena|zadnja $1 sata|zadnjih $1 sati}}.\nDa bi se spriječila zloupotreba, može se poslati samo jedan e-mail za promjenu šifre {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
+       "throttled-mailpassword": "Već Vam je poslan e-mail za promjenu šifre u {{PLURAL:$1|posljednjih sat vremena|posljednja $1 sata|posljednjih $1 sati}}.\nDa bi se spriječila zloupotreba, može se poslati samo jedan e-mail za promjenu šifre {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
        "mailerror": "Greška pri slanju e-pošte: $1",
        "acct_creation_throttle_hit": "Posjetioci na ovoj wiki koji koriste Vašu IP adresu su već napravili {{PLURAL:$1|$1 račun|$1 računa}} u zadnjih nekoliko dana, što je najveći broj dopuštenih napravljenih računa za ovaj period.\nKao rezultat, posjetioci koji koriste ovu IP adresu ne mogu trenutno praviti više računa.",
        "emailauthenticated": "Vaša adresa e-pošte potvrđena je $2 u $3.",
        "retypenew": "Unesite ponovo novu šifru:",
        "resetpass_submit": "Odredi šifru i prijavi se",
        "changepassword-success": "Vaša šifra/lozinka je uspiješno promjenjena!",
+       "changepassword-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
        "resetpass_forbidden": "Šifre ne mogu biti promjenjene",
        "resetpass-no-info": "Morate biti prijavljeni da bi ste pristupili ovoj stranici direktno.",
        "resetpass-submit-loggedin": "Promijeni šifru",
        "resetpass-submit-cancel": "Odustani",
        "resetpass-wrong-oldpass": "Privremena ili trenutna šifra nije validna.\nMožda ste već uspješno promijenili Vašu šifru ili ste tražili novu privremenu šifru.",
+       "resetpass-recycled": "Molimo resetirajte vašu lozinku u nešto drugo od vaše trenutne lozinke.",
+       "resetpass-temp-emailed": "Prijavili ste se sa privremenim kodom iz e-pošte.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovdje:",
        "resetpass-temp-password": "Privremena šifra:",
        "resetpass-abort-generic": "Promjenu šifre/lozinke je prekinula ekstenzija.",
+       "resetpass-expired": "Vaša lozinka je istekla. Postavite novu lozinku da biste se prijavili.",
        "passwordreset": "Poništavanje šifre",
        "passwordreset-text-one": "Ispunite ovaj obrazac da biste resetovali Vašu šifru/lozinku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako biste dobili privremenu lozinku putem e-pošte.}}",
        "passwordreset-emailsent-capture": "Poslan je podsjetnik preko e-pošte (prikazano ispod).",
        "passwordreset-emailerror-capture": "E-poruka za resetiranje lozinke, prikazano ispod, poslana je, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspjelo: $1",
        "changeemail": "Promijeni e-mail adresu",
-       "changeemail-header": "Promijeni e-mail adresu korisničkog računa",
        "changeemail-text": "Ispunite ovaj formular da biste promijenili svoju e-mail adresu. Morat ćete upisati svoj pasvord da potvrdite ovu promjenu.",
        "changeemail-no-info": "Morate biti prijavljeni za direktan pristup ovoj stranici.",
        "changeemail-oldemail": "Trenutna e-mail adresa:",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Tvoja šifra/lozinka za {{SITENAME}}:",
        "changeemail-submit": "Promijeni e-mail",
-       "changeemail-cancel": "Otkaži",
+       "resettokens-token-label": "$1 (trenutna vrijednost: $2)",
        "bold_sample": "Podebljan tekst",
        "bold_tip": "Podebljan tekst",
        "italic_sample": "Kurzivan tekst",
        "edit-gone-missing": "Stranica se nije mogla osvježiti.\nIzgleda da je obrisana.",
        "edit-conflict": "Sukob izmjena.",
        "edit-no-change": "Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.",
+       "postedit-confirmation-created": "Stranica je napravljena.",
        "postedit-confirmation-saved": "Vaša izmjena je sačuvana.",
        "edit-already-exists": "Stranica nije mogla biti kreirana.\nIzgleda da već postoji.",
        "defaultmessagetext": "Uobičajeni tekst poruke",
        "invalid-content-data": "Nevaljani podaci sadržaja",
        "content-not-allowed-here": "Sadržaj napisan u obliku \"$1\" nije dozvoljen na stranici [[$2]]",
-       "editwarning-warning": "Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.\nAko ste prijavljeni, možete isključiti ovo upozorenje u Sekciji za \"Uređivanje\" vaših opcija.",
+       "editwarning-warning": "Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.\nAko ste prijavljeni, možete isključiti ovo upozorenje u Sekciji za \"{{int:prefs-editing}}\" vaših opcija.",
+       "editpage-notsupportedcontentformat-title": "Format sadržaja nije podržan",
        "content-model-wikitext": "wikitekst",
        "content-model-text": "obični tekst",
        "content-model-javascript": "JavaScript",
        "next": "slijed",
        "last": "preth",
        "page_first": "prva",
-       "page_last": "zadnja",
+       "page_last": "posljednja",
        "histlegend": "Odabir razlika: označite radio dugme verzija koje uspoređujete i pritistnite enter ili dugme na dnu. <br />\nObjašnjenje: '''(tren)''' = razlika sa trenutnom verzijom,\n'''(preth)''' = razlika sa prethodnom verzijom, '''m''' = mala izmjena.",
        "history-fieldset-title": "Pretraga historije",
        "history-show-deleted": "Samo obrisane",
        "searchrelated": "povezano",
        "searchall": "sve",
        "showingresults": "Dolje {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Rezultat '''$1''' od '''$3'''|Rezultati '''$1 - $2''' od '''$3'''}} za '''$4'''",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Pretraga u imenskim prostorima:",
        "prefs-displayrc": "Postavke izgleda",
        "prefs-displaywatchlist": "Postavke izgleda",
        "prefs-diffs": "Razlike",
+       "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sljedećoj prijavi.",
        "email-address-validity-valid": "Izgleda valjano",
        "email-address-validity-invalid": "Neophodna valjana adresa!",
        "userrights": "Postavke korisničkih prava",
        "userrights-notallowed": "Vaš račun nema privilegije da dodaje ili oduzima prava korisnika.",
        "userrights-changeable-col": "Grupe koje možete mijenjati",
        "userrights-unchangeable-col": "Grupe koje ne možete mijenjati",
-       "userrights-conflict": "Sukob u korisničkim pravima! Molimo pošaljite Vaše promjene ponovno.",
+       "userrights-conflict": "Sukob u izmjeni korisničkih prava! Molimo da razmotrite i potvrdite Vaše promjene.",
        "userrights-removed-self": "Uspješno ste uklonili vlastite prava. Zbog toga više niste u stanju pristupiti ovoj stranici.",
        "group": "Grupa:",
        "group-user": "Korisnici",
        "license-nopreview": "(Pregled nije dostupan)",
        "upload_source_url": " (validni, javno dostupni URL)",
        "upload_source_file": " (datoteka na Vašem računaru)",
+       "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve postavljene datoteke.",
        "listfiles_search_for": "Traži medije po imenu:",
        "imgfile": "datoteka",
        "randompage": "Slučajna stranica",
        "randompage-nopages": "Nema stranica u {{PLURAL:$2|slijedećem imenskom prostoru|slijedećim imenskim prostorima}}: \"$1\".",
        "randomincategory": "Slučajna stranica u kategoriji",
-       "randomincategory-selectcategory-submit": "Idi",
+       "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
+       "randomincategory-category": "Kategorija:",
+       "randomincategory-legend": "Slučajna stranica u kategoriji",
        "randomredirect": "Slučajno preusmjerenje",
        "randomredirect-nopages": "Ne postoje preusmjerenja u imenskom prostoru \"$1\".",
        "statistics": "Statistike",
        "statistics-views-peredit": "Pogleda po izmjeni",
        "statistics-users": "Registrovani [[Special:ListUsers|korisnici]]",
        "statistics-users-active": "Aktivni korisnici",
-       "statistics-users-active-desc": "Korisnici koju su izvršili akciju u toku {{PLURAL:$1|zadnjeg dana|zadnja $1 dana|zadnjih $1 dana}}",
+       "statistics-users-active-desc": "Korisnici koji su izvršili akciju u toku {{PLURAL:$1|posljednjeg dana|posljednja $1 dana|posljednjih $1 dana}}",
        "statistics-mostpopular": "Najviše pregledane stranice",
        "pageswithprop-prop": "Naziv svojstva:",
        "pageswithprop-submit": "Idi",
        "protectedpages-expiry": "Istječe",
        "protectedpages-reason": "Razlog",
        "protectedpages-unknown-timestamp": "Nepoznato",
+       "protectedpages-unknown-performer": "Nepoznati korisnik",
        "protectedtitles": "Zaštićeni naslovi",
        "protectedtitlesempty": "Nijedan naslov članka trenutno nije zaštićen ovim parametrima.",
        "listusers": "Spisak korisnika",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
        "booksources": "Štampani izvori",
        "booksources-search-legend": "Traži književne izvore",
-       "booksources-go": "Idi",
        "booksources-text": "Ispod se nalazi spisak vanjskih linkova na ostale stranice koje prodaju nove ili korištene knjige kao i stranice koje mogu da imaju važnije podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije validan; molimo da provjerite da li je došlo do greške pri kopiranju iz prvobitnog izvora.",
        "specialloguserlabel": "Izvršilac:",
        "listusers-noresult": "Nije pronađen korisnik.",
        "listusers-blocked": "(blokiran)",
        "activeusers": "Spisak aktivnih korisnika",
-       "activeusers-intro": "Ovo je spisak korisnika koji su napravili neku aktivnost u {{PLURAL:$1|zadnji $1 dan|zadnja $1 dana|zadnjih $1 dana}}.",
+       "activeusers-intro": "Ovo je spisak korisnika koji su imali neku aktivnost u {{PLURAL:$1|posljednji $1 dan|posljednja $1 dana|posljednjih $1 dana}}.",
        "activeusers-count": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}",
        "activeusers-from": "Prikaži korisnike koji počinju sa:",
        "activeusers-hidebots": "Sakrij botove",
        "listgrouprights-removegroup-self": "Može ukloniti {{PLURAL:$2|grupu|grupe|grupa}} sa svog računa: $1",
        "listgrouprights-addgroup-self-all": "Može dodati sve grupe na svoj račun",
        "listgrouprights-removegroup-self-all": "Može ukloniti sve grupe sa svog računa",
+       "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
+       "trackingcategories-nodesc": "Opis nije dostupan.",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]\nda biste slali e-poštu drugim korisnicima.",
        "emailuser": "Pošalji e-poštu ovom korisniku",
        "wlheader-enotif": "Obavještavanje e-poštom je omogućeno.",
        "wlheader-showupdated": "Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
        "wlnote": "Ispod je {{PLURAL:$1|najskorija izmjena|'''$1''' najskorije izmjene|'''$1''' najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih '''$2''' sata|u posljednjih '''$2''' sati}}, od $3, $4.",
-       "wlshowlast": "Prikaži posljednjih $1 sati $2 dana $3",
+       "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-options": "Opcije spiska praćenja",
        "watching": "Pratim...",
        "unwatching": "Ne pratim...",
        "autoblockid": "Automatska blokada #$1",
        "block": "Blokiraj korisnika",
        "unblock": "Odblokiraj korisnika",
-       "blockip": "Blokiraj korisnika",
+       "blockip": "Blokiraj {{GENDER:$1|korisnika|korisnicu}}",
        "blockip-legend": "Blokiranje korisnika",
        "blockiptext": "Upotrebite donji upitnik da biste uklonili prava pisanja sa određene IP adrese ili korisničkog imena.  Ovo bi trebalo da bude urađeno samo da bi se spriječio vandalizam, i u skladu sa [[{{MediaWiki:Policy-url}}|smjernicama]]. Unesite konkretan razlog ispod (na primjer, navodeći koje stranice su vandalizovane).",
        "ipaddressorusername": "IP adresa ili korisničko ime:",
        "ipb-hardblock": "Onemogući prijavljene korisnike da uređuju sa ove IP adrese",
        "ipbcreateaccount": "Onemogući pravljenje računa",
        "ipbemailban": "Onemogući korisnika da šalje e-mail",
-       "ipbenableautoblock": "Automatski blokiraj zadnju IP adresu koju je koristio ovaj korisnik i sve druge IP adrese s kojih je on pokušao uređivati",
+       "ipbenableautoblock": "Automatski blokiraj posljednju IP-adresu koju je koristio ovaj korisnik i sve druge IP-adrese s kojih je pokušao uređivati",
        "ipbsubmit": "Blokirajte ovog korisnika",
        "ipbother": "Ostali period:",
        "ipboptions": "2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 sedmica:1 week,2 sedmice:2 weeks,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godine:1 year,zauvijek:infinite",
        "import": "Uvoz stranica",
        "importinterwiki": "Međuwiki uvoz",
        "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi revizija i imena autora će biti sačuvani.\nSve akcije pri međuwiki uvozu će biti zapisane u [[Special:Log/import|zapisu uvoza]].",
-       "import-interwiki-source": "Izvorna wiki/stranica:",
        "import-interwiki-history": "Kopiraj sve verzije historije za ovu stranicu",
        "import-interwiki-templates": "Uključi sve šablone",
        "import-interwiki-submit": "Uvoz",
        "spamprotectiontext": "Strana koju želite da sačuvate je blokirana od strane filtera za neželjene poruke.\nOvo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.",
        "spamprotectionmatch": "Slijedeći tekst je izazvao naš filter za neželjene poruke: $1",
        "spambot_username": "MediaWiki čišćenje spama",
-       "spam_reverting": "Vraćanje na zadnju verziju koja ne sadrži linkove ka $1",
+       "spam_reverting": "Vraćanje na posljednju verziju koja ne sadrži linkove ka $1",
        "spam_blanking": "Sve revizije koje sadrže linkove ka $1, očisti",
        "spam_deleting": "Sve revizije koje sadrže linkove na $1, brišem",
        "simpleantispam-label": "Provjera protiv spama.\n'''NE''' popunjavaj ovo!",
        "exif-urgency-low": "Nisko ( $1 )",
        "exif-urgency-high": "Visoko ($1)",
        "exif-urgency-other": "Korisnički određen prioritet ($1)",
-       "watchlistall2": "sve",
        "namespacesall": "sve",
        "monthsall": "sve",
        "confirmemail": "Potvrdite adresu e-pošte",
        "table_pager_next": "Slijedeća stranica",
        "table_pager_prev": "Prethodna stranica",
        "table_pager_first": "Prva stranica",
-       "table_pager_last": "Zadnja stranica",
+       "table_pager_last": "Posljednja stranica",
        "table_pager_limit": "Pokaži $1 stavki po stranici",
        "table_pager_limit_label": "Stavke po stranici:",
        "table_pager_limit_submit": "Idi",
        "version-ext-colheader-license": "Licenca",
        "version-ext-colheader-description": "Opis",
        "version-ext-colheader-credits": "Autori",
+       "version-license-title": "Licenca za $1",
        "version-poweredby-credits": "Ova wiki je zasnovana na '''[https://www.mediawiki.org/ MediaWiki]''', autorska prava zadržana © 2001-$1 $2.",
        "version-poweredby-others": "ostali",
        "version-credits-summary": "Željeli bismo se zahvaliti sljedećim ljudima na njihovom doprinosu [[Special:Version|MediaWikiju]].",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5",
        "rightsnone": "(nema)",
+       "revdelete-summary": "sažetak",
        "feedback-bugornote": "Ako ste spremni detaljno opisati tehnički problem, molimo [$1 prijavite \"bug\" (grešku)].\nInače, možete ispuniti jednostavan obrazac ispod. Vaš komentar bit će dodan na stranicu \"[$3 $2]\" zajedno s Vašim korisničkim imenom.",
        "feedback-subject": "Tema:",
        "feedback-message": "Poruka:",
        "expand_templates_remove_comments": "Ukloni komentare",
        "expand_templates_remove_nowiki": "Onemogući oznake <nowiki> u rezultatima",
        "expand_templates_generate_xml": "Prikaži XML stablo parsera",
-       "expand_templates_preview": "Pregled"
+       "expand_templates_preview": "Pregled",
+       "pagelang-name": "Stranica",
+       "pagelang-language": "Jezik",
+       "pagelang-select-lang": "Izaberi jezik"
 }
diff --git a/languages/i18n/bto.json b/languages/i18n/bto.json
new file mode 100644 (file)
index 0000000..87a246b
--- /dev/null
@@ -0,0 +1,572 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Filipinayzd",
+                       "Rinconada"
+               ]
+       },
+       "tog-hideminor": "Itago a mga gatikot na pagbalyow sa mga bagong pagribay",
+       "tog-hidepatrolled": "Itago a mga binabantayang na pagbalyow sa mga bagong pagribay",
+       "tog-newpageshidepatrolled": "Itago a mga binabantayan na pagbalyow sa lista ka bagong pahina",
+       "tog-extendwatchlist": "Ibuka a lista ka binabantayan para maipabayad a ngamin na pagribay, buku sana a pinakabago",
+       "tog-usenewrc": "Igrupo a mga pagribay por pahina sa mga bagong pagribay anggan binabantayan",
+       "tog-numberheadings": "Automatikong bilangun a mga titulo",
+       "tog-showtoolbar": "Ipabayad a gamit sa pagbalyow",
+       "tog-editondblclick": "Balyowan a mga pahina sa dobleng click",
+       "tog-watchcreations": "Irugang a mga pahinang kanakong ginibo anggan mga file na isinangat sa kanakong binabantayan",
+       "tog-watchdefault": "Irugang a mga pahinang anggan mga file na binabalyowan ko sa kanakong binabantayan",
+       "tog-watchmoves": "Irugang a mga pahinang anggan mga file na inililipat ko sa kanakong binabantayan",
+       "tog-watchdeletion": "Irugang a mga pahinang anggan mga file na pinupura ko sa kanakong binabantayan",
+       "tog-watchlisthideown": "Itago a kanakong mga pagbalyow sa binabantayan ko",
+       "tog-watchlisthidebots": "Itago a mga pagbalyow ka bot sa binabantayan ko",
+       "tog-watchlisthideminor": "Itago a mga gatikot na pagbalyow sa binabantayan ko",
+       "tog-watchlisthideliu": "Itago a mga pagbalyow ka mga nakaloog na user sa binabantayan ko",
+       "tog-watchlisthideanons": "Itago a mga pagbalyow ka mga diri ising user sa binabantayan ko",
+       "tog-watchlisthidepatrolled": "Itago a mga binabantayan na pagbalyow sa binabantayan ko",
+       "tog-ccmeonemails": "Padarhi ko ka mga kopya ka mga email na ipinapadara ko sa obang user",
+       "tog-diffonly": "Diri ipagpabayad a loog ka pahina sa iraraum ka pagkakaiba",
+       "tog-showhiddencats": "Ipabayad a mga nakatagong kategorya",
+       "tog-norollbackdiff": "Galinon an pagkakaiba matapos gibowon a pagbalik",
+       "underline-always": "Pirmi",
+       "underline-never": "Nungka",
+       "editfont-monospace": "font na Monospaced",
+       "editfont-sansserif": "font na Sans-serif",
+       "editfont-serif": "font na Serif",
+       "sunday": "Domingo",
+       "monday": "Lunis",
+       "tuesday": "Martes",
+       "wednesday": "Myirkules",
+       "thursday": "Hwebes",
+       "friday": "Byernis",
+       "saturday": "Sabado",
+       "sun": "Dom",
+       "mon": "Lun",
+       "tue": "Mar",
+       "wed": "Myi",
+       "thu": "Hwe",
+       "fri": "Bye",
+       "sat": "Sab",
+       "january": "Enero",
+       "february": "Pebrero",
+       "march": "Marso",
+       "april": "Abril",
+       "may_long": "Mayo",
+       "june": "Hunyo",
+       "july": "Hulyo",
+       "august": "Agusto",
+       "september": "Sityembre",
+       "october": "Oktubre",
+       "november": "Nubyembre",
+       "december": "Disyembre",
+       "january-gen": "Enero",
+       "february-gen": "Pebrero",
+       "march-gen": "Marso",
+       "april-gen": "Abril",
+       "may-gen": "Mayo",
+       "june-gen": "Hunyo",
+       "july-gen": "Hulyo",
+       "august-gen": "Agusto",
+       "september-gen": "Sityembre",
+       "october-gen": "Oktubre",
+       "november-gen": "Nubyembre",
+       "december-gen": "Disyembre",
+       "jan": "Ene",
+       "feb": "Peb",
+       "mar": "Mar",
+       "apr": "Abr",
+       "may": "May",
+       "jun": "Hun",
+       "jul": "Hul",
+       "aug": "Agu",
+       "sep": "Sit",
+       "oct": "Okt",
+       "nov": "Nub",
+       "dec": "Dis",
+       "january-date": "Enero $1",
+       "february-date": "Pebrero $1",
+       "march-date": "Marso $1",
+       "april-date": "Abril $1",
+       "may-date": "Mayo $1",
+       "june-date": "Hunyo $1",
+       "july-date": "Hulyo $1",
+       "august-date": "Agusto $1",
+       "september-date": "Sityembre $1",
+       "october-date": "Oktubre $1",
+       "november-date": "Nubyembre $1",
+       "december-date": "Disyembre $1",
+       "pagecategories": "{{PLURAL:$1|Kategorya|Mga kategorya}}",
+       "category_header": "Mga pahina sa kategoryang \"$1\"",
+       "subcategories": "Mga subkategorya",
+       "category-media-header": "Mga pahina sa kategoryang \"$1\"",
+       "hidden-categories": "{{PLURAL:$1|Nakatagong kategorya|Mga nakatagong kategorya}}",
+       "hidden-category-category": "Mga nakatagong kategorya",
+       "listingcontinuesabbrev": "sunod",
+       "cancel": "Galinon",
+       "moredotdotdot": "Dakul pa...",
+       "morenotlisted": "Bukung kumpleto ading lista.",
+       "mypage": "Pahina",
+       "mytalk": "Magbisara",
+       "anontalk": "Pagbisara kading IP adres",
+       "navigation": "Nabigasyon",
+       "and": ",&#32;anggan",
+       "qbfind": "Anapun",
+       "qbedit": "Balyowan",
+       "qbpageoptions": "Ading pahina",
+       "qbmyoptions": "Kanakong mga pahina",
+       "faq": "FAQ",
+       "faqpage": "Proyekto:FAQ",
+       "actions": "Mga aksyon",
+       "namespaces": "Bubutangan",
+       "variants": "Iba pa",
+       "navigation-heading": "Menung nabigasyon",
+       "errorpagetitle": "Sala",
+       "returnto": "Bumalik sa $1",
+       "tagline": "Galin {{SITENAME}}",
+       "help": "Tabang",
+       "search": "Pag-anapon",
+       "searchbutton": "Pag-anapon",
+       "go": "Dumuman",
+       "searcharticle": "Dumuman",
+       "history": "Kasaysayan kan pahina",
+       "history_short": "Kasaysayan",
+       "print": "Ilimbag",
+       "view": "Silung",
+       "view-foreign": "Silung sa $1",
+       "edit": "Balyowan",
+       "create": "Gumibo",
+       "create-local": "Dugangan sa lokal na deskripsyon",
+       "editthispage": "Balyowan ading pahina",
+       "create-this-page": "Gumibo kading pahina",
+       "delete": "Puraon",
+       "deletethispage": "Puraon ading pahina",
+       "undeletethispage": "Ibalik ading pahina",
+       "undelete_short": "Ibalik ading {{PLURAL:$1|pagbalyow|$1 mga pagbalyow}}",
+       "viewdeleted_short": "Baydon a {{PLURAL:$1|pagbalyow|$1 mga pagbalyow}}",
+       "protect": "Protektaran",
+       "protect_change": "ribayan",
+       "protectthispage": "Protektaran ading pahina",
+       "unprotect": "Ribayan a proteksyon",
+       "unprotectthispage": "Ribayan a proteksyon kading pahina",
+       "newpage": "Bagong pahina",
+       "talkpage": "Pagbisara kading pahina",
+       "talkpagelinktext": "Magbisara",
+       "specialpage": "Espesyal na pahina",
+       "personaltools": "Mga personal na gamit",
+       "articlepage": "Baydon a loog ka pahina",
+       "talk": "Pagbisara",
+       "views": "Mga silung",
+       "toolbox": "Mga gamit",
+       "userpage": "Baydon a pahina ka paragamit",
+       "projectpage": "Baydon a pahina ka proyekto",
+       "imagepage": "Baydon a pahina ka file",
+       "mediawikipage": "Baydon a pahina ka mensahe",
+       "templatepage": "Baydon a pahina ka template",
+       "viewhelppage": "Baydon a pahina ka tabang",
+       "categorypage": "Baydon a pahina ka kategorya",
+       "viewtalkpage": "Baydon an pagbisara",
+       "otherlanguages": "Sa ibang mga ngangabilon",
+       "redirectedfrom": "(Nilipat galin sa $1)",
+       "redirectpagesub": "Pahina ka paglipat",
+       "lastmodifiedat": "Huring binago ading pahina ku $1, $2.",
+       "viewcount": "Binuksan ading pahina sa {{PLURAL:$1|beses|$1 beses}}.",
+       "protectedpage": "Protektado ading pahina",
+       "jumpto": "Lumukso sa:",
+       "jumptonavigation": "nabigasyon",
+       "jumptosearch": "anapon",
+       "pool-queuefull": "Punu a pool queue",
+       "pool-errorunknown": "Diri isi a sala",
+       "edithelp": "Tabang sa pagbalyow",
+       "mainpage": "Unang Pahina",
+       "mainpage-description": "Unang Pahina",
+       "policy-url": "Proyekto:Polisiya",
+       "portal": "Portal ka kumunidad",
+       "portal-url": "Proyekto:Portal ka kumunidad",
+       "privacy": "Polisiya ka pribasidad",
+       "privacypage": "Proyekto:Polisiya ka pribasidad",
+       "badaccess": "Sala a pagtugot",
+       "badaccess-group0": "Diri ka pwedeng gibowon a aksyon na boot mo.",
+       "ok": "Amo",
+       "retrievedfrom": "Nakuku galin sa \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|Agko ka}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Agko ka}} $1 galin sa {{PLURAL:$3|ibang user|$3 users}} ($2).",
+       "youhavenewmessagesmanyusers": "Agko ka $1 galin dakul na users ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|bagong mensahe|999=mga bagong mensahe}}",
+       "newmessagesdifflinkplural": "huring {{PLURAL:$1|pagbago|999=mga pagbago}}",
+       "youhavenewmessagesmulti": "Agko ka mga bagong mensahe sa $1.",
+       "editsection": "balyowan",
+       "editold": "balyowan",
+       "viewsourceold": "baydon a ginikanan",
+       "editlink": "balyowan",
+       "viewsourcelink": "baydon a ginikanan",
+       "editsectionhint": "Balyowan a sekyon: $1",
+       "toc": "Mga loog",
+       "showtoc": "ipabayad",
+       "hidetoc": "itago",
+       "collapsible-collapse": "Ibaba",
+       "collapsible-expand": "Ibuka",
+       "confirmable-yes": "Amo",
+       "confirmable-no": "Diri",
+       "thisisdeleted": "Baydon o ibalik a $1?",
+       "viewdeleted": "Baydon a $1?",
+       "restorelink": "{{PLURAL:$1|usad na pinurang pagbalyow|$1 mga pinurang pagbalyow}}",
+       "feedlinks": "Karga:",
+       "site-rss-feed": "Kargang $1 RSS",
+       "site-atom-feed": "Kargang $1",
+       "page-rss-feed": "Kargang \"$1\" RSS",
+       "page-atom-feed": "Kargang \"$1\" Atom",
+       "red-link-title": "$1 (uda ading pahina)",
+       "nstab-main": "Pahina",
+       "nstab-user": "Pahina ka user",
+       "nstab-media": "Pahina ka media",
+       "nstab-special": "Espesyal na pahina",
+       "nstab-project": "Pahina ka proyekto",
+       "nstab-image": "File",
+       "nstab-mediawiki": "Mensahe",
+       "nstab-template": "Padron",
+       "nstab-help": "Pahina ka tabang",
+       "nstab-category": "Kategorya",
+       "nosuchaction": "Uda kan aksyon",
+       "nosuchspecialpage": "Uda ka espesyal na pahinang iyan",
+       "error": "Sala",
+       "databaseerror": "Sala a database",
+       "databaseerror-query": "Unga: $1",
+       "databaseerror-function": "Gibo: $1",
+       "databaseerror-error": "Sala: $1",
+       "missingarticle-rev": "(pagbago#: $1)",
+       "missingarticle-diff": "(Iba: $1, $2)",
+       "internalerror": "Panloog na sala",
+       "internalerror_info": "Panloog na sala: $1",
+       "filecopyerror": "Diri makopya a \"$1\" sa \"$2\".",
+       "filerenameerror": "Diri mabalyowan a ngaran ka file na \"$1\" sa \"$2\".",
+       "filedeleteerror": "Diri mapura a file na \"$1\".",
+       "directorycreateerror": "Diri magibo a direktoryong \"$1\".",
+       "filenotfound": "Diri maturakan a file na \"$1\".",
+       "formerror": "Sala: Diri maisumitir ana porma.",
+       "badarticleerror": "Diri magibo ading aksyon sadi pahina.",
+       "cannotdelete-title": "Diri mapura a pahinang \"$1\"",
+       "badtitle": "Bukung tamang titulo",
+       "viewsource": "Baydon a ginikanan",
+       "viewsource-title": "Baydon a ginikanan para sa $1",
+       "viewsourcetext": "Pwede mong silungon anggan arogon a ginikanan kading pahina:",
+       "viewyourtext": "Pwede mong silungon anggan arogon a ginikanan ku <strong?mga pagbalyow mo</strong> kading pahina:",
+       "namespaceprotected": "Uda kang permiso na balyowan a mga pahina sa <strong>$1</strong> bubutangan.",
+       "customjsprotected": "Uda kang permiso na balyowan ading pahina ka JavaScript ta agko di pansadiring settings ka ibang user.",
+       "mycustomjsprotected": "Uda ikang persmiso na balyowan ading pahinang JavaCript.",
+       "mypreferencesprotected": "Uda ikang persmiso na balyowan a kanimong mga kamuyahan.",
+       "ns-specialprotected": "Diri mababalyowan a mga espesyal na pahina.",
+       "exception-nologin": "Diri nakaloog",
+       "virus-unknownscanner": "diri ising antivirus:",
+       "welcomeuser": "Dagos, $1!",
+       "welcomecreation-msg": "Nagibo na a kanimong account.\nPwede mong ribayan a [[Special:kamuyahan|mga kamuyahan]] ka kanimong {{SITENAME}} kin boot mo.",
+       "yourname": "Pangaran:",
+       "userlogin-yourname": "Pangaran",
+       "userlogin-yourname-ph": "Ibutang a kanimong username",
+       "createacct-another-username-ph": "Ibutang a username",
+       "yourpassword": "Password:",
+       "userlogin-yourpassword": "Password",
+       "userlogin-yourpassword-ph": "Ibutang a password",
+       "createacct-yourpassword-ph": "Ibutang a password",
+       "yourpasswordagain": "Ibutang dayday a password:",
+       "createacct-yourpasswordagain": "Ikumpirmar a password",
+       "createacct-yourpasswordagain-ph": "Ibutang dayday a password",
+       "yourdomainname": "A kanimong domain:",
+       "password-change-forbidden": "Diri mo mariribayan a mga password kading wiki.",
+       "login": "Lumoog",
+       "nav-login-createaccount": "Lumoog/gumibo sa account",
+       "userlogin": "Lumoog / gumibo sa account",
+       "userloginnocreate": "Lumoog",
+       "logout": "Lumuwas",
+       "userlogout": "Lumuwas",
+       "notloggedin": "Di nakaloog",
+       "userlogin-noaccount": "Uda sa account?",
+       "userlogin-joinproject": "Bumali sa {{SITENAME}}",
+       "nologin": "Uda sa account? $1.",
+       "nologinlink": "Gumibo sa account",
+       "createaccount": "Gumibo sa account",
+       "gotaccount": "Agko na sa account? $1.",
+       "gotaccountlink": "Lumoog",
+       "userlogin-resetlink": "Nalingawan mo a detalye ku kanimong pagloog?",
+       "createacct-emailrequired": "Email address",
+       "createacct-email-ph": "Iloog a kanimong email adres",
+       "createacct-another-email-ph": "Iloog a email adres",
+       "createaccountreason": "Rason:",
+       "createacct-reason": "Rason",
+       "createacct-reason-ph": "Tauno ta muya mong gumibo sa ibang account",
+       "createacct-imgcaptcha-ph": "Ibutang a tekstong nababayad mo sa ibabow",
+       "createacct-submit": "Gumibo sa sadiring account",
+       "createacct-another-submit": "Gumibo sa ibang account",
+       "createacct-benefit-heading": "Gibo ka mga tawo pareho mo ading {{SITENAME}}.",
+       "createacct-benefit-body1": "{{PLURAL:$1|pabalyow|mga pagbalyow}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|pahina|mga pahina}}",
+       "badretype": "Diri pareho a mga password na ibinutang mo.",
+       "loginerror": "Sala a pagloog",
+       "createacct-error": "Sala a paggibo sa account",
+       "createaccounterror": "Diri makagibo sa account: $1",
+       "loginsuccesstitle": "Matriyumpong nakaloog",
+       "loginsuccess": "'''Nakaloog ka na sa {{SITENAME}} bilang si \"$1\".'''",
+       "mailmypassword": "Balyowan a password",
+       "passwordremindertitle": "Bagong temporaryong password para sa {{SITENAME}}",
+       "noemailcreate": "Kaipowan mong ibutang a tamang email adres.",
+       "mailerror": "Sala ana pagpadara ka surat: $1",
+       "emaildisabled": "Diri makapadadarang surat ading sityo.",
+       "accountcreated": "Nakagibo na sa account",
+       "login-abort-generic": "A kanimong pagloog diri magibo - Pinundo.",
+       "loginlanguagelabel": "Sarita: $1",
+       "pt-login": "Lumoog",
+       "pt-login-button": "Lumoog",
+       "pt-createaccount": "Gumibo sa account",
+       "pt-userlogout": "Lumuwas",
+       "changepassword": "Balyowan a password",
+       "oldpassword": "Lumang password:",
+       "newpassword": "Bagong password:",
+       "resetpass-submit-cancel": "Kanselaron",
+       "resetpass-temp-password": "Temporaryong password:",
+       "passwordreset": "Balyowan a password",
+       "passwordreset-legend": "Balyowan a password",
+       "passwordreset-domain": "Nasasakupan:",
+       "passwordreset-email": "Email address:",
+       "changeemail": "Ribayan a email adres",
+       "changeemail-none": "(uda)",
+       "extlink_sample": "http://www.example.com titulo kan link",
+       "watchthis": "Silungon ading pahina",
+       "blockednoreason": "udang binutang na rason",
+       "nosuchsectiontitle": "diri maturakan a seksyon",
+       "loginreqlink": "lumoog",
+       "loginreqpagetext": "Paki $1 para masilung a ibang mga pahina.",
+       "newarticle": "(Bago)",
+       "updated": "(Binago)",
+       "note": "strong>Paisi:</strong>",
+       "editing": "Binabalyowan a $1",
+       "creating": "Ginigibo a $1",
+       "editingsection": "Binabalyowan a $1 (seksyon)",
+       "editingcomment": "Binabalyowan a $1 (bagong seksyon)",
+       "yourtext": "A kanimong teksto",
+       "template-protected": "(protektado)",
+       "template-semiprotected": "(medyo protektado)",
+       "defaultmessagetext": "Dating teksto ka mensahe",
+       "content-model-wikitext": "wikiteksto",
+       "content-model-text": "simpleng teksto",
+       "content-model-javascript": "JavaScript",
+       "content-model-css": "CSS",
+       "cantcreateaccounttitle": "Diri makagibo sa account",
+       "next": "sunod",
+       "last": "sinundan",
+       "page_first": "una",
+       "page_last": "huri",
+       "history-show-deleted": "Puraon sana",
+       "histfirst": "pinakaluma",
+       "histlast": "pinakabago",
+       "historysize": "({{PLURAL:$1|1 byte|$1 mga byte}})",
+       "historyempty": "(uda loog)",
+       "history-feed-item-nocomment": "$1 sa $2",
+       "rev-showdeleted": "ipabayad",
+       "revdelete-show-file-submit": "Amo",
+       "revdelete-radio-set": "Nakatago",
+       "revdelete-radio-unset": "Nababayad",
+       "revdelete-log": "Rason:",
+       "pagehist": "Kasaysayan kan pahina",
+       "revdelete-otherreason": "Iba/rugang na rason:",
+       "revdelete-reasonotherlist": "Ibang rason",
+       "mergehistory-reason": "Rason:",
+       "lineno": "Linya $1:",
+       "editundo": "ibalik",
+       "diff-empty": "(Udang pagkakaiba)",
+       "searchresults": "Resulta ka pag-anap",
+       "searchprofile-images": "Multimedia",
+       "searchprofile-everything": "Ngamin",
+       "searchprofile-articles-tooltip": "Anapon sa $1",
+       "searchprofile-everything-tooltip": "Anapon sa ngamin na loog (pati sa mga pahina ka pagbisara)",
+       "searchall": "ngamin",
+       "powersearch-toggleall": "Ngamin",
+       "powersearch-togglenone": "Uda",
+       "prefs-misc": "Misc",
+       "prefs-resetpass": "Balyowan a password",
+       "prefs-changeemail": "Ribayan a email adres",
+       "searchresultshead": "Pag-anapon",
+       "recentchangesdays": "Mga aldow na ipababayad a mga bagong pagribay:",
+       "recentchangescount": "Bilang ka pagbalow na ipababayad:",
+       "timezoneregion-africa": "Aprika",
+       "timezoneregion-america": "Amerika",
+       "timezoneregion-antarctica": "Antartika",
+       "timezoneregion-arctic": "Artiko",
+       "timezoneregion-asia": "Asya",
+       "timezoneregion-atlantic": "Kadagatan Atlantiko",
+       "timezoneregion-australia": "Australya",
+       "timezoneregion-europe": "Europa",
+       "timezoneregion-indian": "Kadagatan Indyano",
+       "timezoneregion-pacific": "Kadagatan Pasipiko",
+       "prefs-searchoptions": "Pag-anapon",
+       "default": "dati",
+       "youremail": "Email:",
+       "yourlanguage": "Sarita:",
+       "email": "Email",
+       "prefs-signature": "Pirma",
+       "prefs-editor": "Editor",
+       "userrights-reason": "Rason:",
+       "group": "Grupo:",
+       "group-bot": "Bots",
+       "group-all": "(ngamin)",
+       "right-delete": "Puraon a mga pahina",
+       "right-browsearchive": "Anapon a mga pinurang pahina",
+       "right-userrights": "Balyowan ngamin na katanusan ka user",
+       "action-edit": "balyowan ading pahina",
+       "action-createpage": "gumibo sa mga pahina",
+       "action-delete": "puraon ading pahina",
+       "action-browsearchive": "anapon a mga pinurang pahina",
+       "action-userrights": "balyowan ngamin na katanusan ka user",
+       "enhancedrc-history": "kasaysayan",
+       "rcshowhideminor-show": "Ipabayad",
+       "rcshowhideminor-hide": "Itago",
+       "rcshowhidebots": "$1 bots",
+       "rcshowhidebots-show": "Ipabayad",
+       "rcshowhidebots-hide": "Itago",
+       "rcshowhideliu-show": "Ipabayad",
+       "rcshowhideliu-hide": "Itago",
+       "rcshowhideanons-show": "Ipabayad",
+       "rcshowhideanons-hide": "Itago",
+       "rcshowhidepatr-show": "Ipabayad",
+       "rcshowhidepatr-hide": "Itago",
+       "rcshowhidemine-show": "Ipabayad",
+       "rcshowhidemine-hide": "Itago",
+       "diff": "iba",
+       "hist": "usip",
+       "hide": "Itago",
+       "show": "Ipabayad",
+       "minoreditletter": "m",
+       "newpageletter": "B",
+       "boteditletter": "b",
+       "rc_categories_any": "Dawa uno",
+       "newsectionsummary": "/* $1 */ bagong seksyon",
+       "rc-enhanced-expand": "Ipabayad a mga detalye",
+       "filename": "Filename",
+       "filesource": "Ginalinan:",
+       "watchthisupload": "Silungon ading file",
+       "backend-fail-read": "Diri mabasa a file na \"$1\".",
+       "backend-fail-create": "Diri masuratan a file na \"$1\".",
+       "nolicense": "Udang napili",
+       "listfiles-delete": "puraon",
+       "imgfile": "file",
+       "listfiles_date": "Petsa",
+       "listfiles_name": "Ngaran",
+       "listfiles-latestversion-yes": "Amo",
+       "listfiles-latestversion-no": "Diri",
+       "file-anchor-link": "File",
+       "filehist-deleteall": "puraon ngamin",
+       "filehist-datetime": "Petsa/Oras",
+       "filedelete": "Puraon a $1",
+       "filedelete-submit": "Puraon",
+       "filedelete-success": "Napura na a <strong>$1</strong>.",
+       "filedelete-otherreason": "Iba/rugang na rason:",
+       "randomincategory-category": "Kategorya:",
+       "statistics": "Estadistika",
+       "statistics-pages": "Mga pahina",
+       "statistics-views-total": "Ngamin na mga silung",
+       "brokenredirects-edit": "balyowan",
+       "brokenredirects-delete": "puraon",
+       "withoutinterwiki-submit": "Ipabayad",
+       "nbytes": "$1 {{PLURAL:$1|byte|mga bytes}}",
+       "ncategories": "{{PLURAL:$1|Kategorya|Mga kategorya}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki|mga interwiki}}",
+       "nlinks": "$1 {{PLURAL:$1|link|mga links}}",
+       "prefixindex": "Ngamin na mga pahina na agko prefix",
+       "protectedpages-page": "Pahina",
+       "protectedpages-reason": "Rason",
+       "protectedpages-unknown-timestamp": "Diri isi",
+       "newpages": "Mga bagong pahina",
+       "all-logs-page": "Ngamin na mga pampublikong pagloog",
+       "allpages": "Ngamin na mga pahina",
+       "nextpage": "Sunod na pahina ($1)",
+       "allarticles": "Ngamin na mga pahina",
+       "allinnamespace": "Ngamin na mga pahina ($1 butangan)",
+       "deletedcontributions": "Napurang mga ambag ka user",
+       "linksearch-ok": "Pag-anapon",
+       "listusers-submit": "Ipabayad",
+       "activeusers-hidebots": "Itago a bots",
+       "listgrouprights-group": "Grupo",
+       "listgrouprights-addgroup": "Mairurugang a {{PLURAL:$2|grupo|mga grupo}}: $1",
+       "listgrouprights-addgroup-all": "Irugang ngamin na mga grupo",
+       "listgrouprights-removegroup-all": "Galinon ngamin na mga grupo",
+       "listgrouprights-addgroup-self": "Mairurugang a {{PLURAL:$2|grupo|mga grupo}} sa sadiring account: $1",
+       "listgrouprights-addgroup-self-all": "Irugang a ngamin na mga grupo sa sadiring account",
+       "trackingcategories-name": "Ngaran ka mensahe",
+       "mailnologin": "Udang adres na mapapadarhan",
+       "noemailtitle": "Udang email adres",
+       "emailfrom": "Galin ki:",
+       "emailto": "Para ki:",
+       "emailmessage": "Mensahe:",
+       "emailccme": "Padarhi ako sa kopya ku kanakong mensahe",
+       "emailsenttext": "A kanimong email naipadara na.",
+       "watchlistfor2": "Para sa $1 $2",
+       "wlshowlast": "Ipabayad a huring $1 mga oras $2 mga aldow",
+       "delete-confirm": "Puraon a $1",
+       "deleteotherreason": "Iba/rugang na rason:",
+       "protect-otherreason": "Iba/rugang na rason:",
+       "restriction-edit": "Balyowan",
+       "restriction-move": "Ilipat",
+       "restriction-create": "Gumibo",
+       "restriction-upload": "Magkarga",
+       "restriction-level-all": "dawa unung lebel",
+       "undelete": "Baydon a mga napurang pahina",
+       "undeletepage": "Baydon anggan ibalik a mga napurang pahina",
+       "undeletebtn": "Ibalik",
+       "undeletelink": "baydon/ibalik",
+       "undeleteviewlink": "silungon",
+       "undeletecomment": "Rason:",
+       "undelete-search-title": "Anapon a mga pinurang pahina",
+       "undelete-search-box": "Anapon a mga pinurang pahina",
+       "undelete-search-prefix": "Ipabayad a mga pahinang nagpopoon sa",
+       "undelete-search-submit": "Pag-anapon",
+       "undelete-show-file-submit": "Ano",
+       "namespace": "Butangan:",
+       "blanknamespace": "(Una)",
+       "contributions": "Mga ambag ka {{GENDER:$1|User}}",
+       "mycontris": "Mga ambag",
+       "contribsub2": "Para sa {{GENDER:$3|$1}} ($2)",
+       "uctop": "(nguwan)",
+       "month": "Poon bulan (anggan nauna):",
+       "year": "Poon taon (anggan nauna):",
+       "sp-contributions-newbies-sub": "Para sa mga bagong account",
+       "sp-contributions-deleted": "napurang mga ambag ka user",
+       "sp-contributions-uploads": "mga karga",
+       "sp-contributions-logs": "mga loog",
+       "sp-contributions-talk": "magbisara",
+       "sp-contributions-search": "Mag-anap sa mga ambag",
+       "sp-contributions-submit": "Pag-anapon",
+       "whatlinkshere-page": "Pahina:",
+       "isredirect": "pahina ka paglipat",
+       "whatlinkshere-hideredirs": "$1 mga redirekta",
+       "ipbreason": "Rason:",
+       "ipblocklist-submit": "Pag-anapon",
+       "lockconfirm": "Amo, muya kong ikandado a database.",
+       "delete_and_move": "Puraon anggan ilipat",
+       "delete_and_move_confirm": "Amo, puraon ading pahina",
+       "export-addcattext": "Irugang a mga pahina galin sa kategorya:",
+       "export-addnstext": "Irugang a mga pahina galin sa bubutangan:",
+       "allmessagesname": "Ngaran",
+       "thumbnail_error_remote": "Salang mensahe galin sa $1: $2",
+       "tooltip-ca-delete": "Puraon ading pahina",
+       "tooltip-ca-watch": "Irugang ading pahina sa kanimong binabantayan",
+       "tooltip-search": "Mag-anap sa {{SITENAME}}",
+       "tooltip-ca-nstab-mediawiki": "Silungon a mensahe ka mensahe",
+       "tooltip-watch": "Irugang ading pahina sa kanimong binabantayan",
+       "pageinfo-contentpage-yes": "Amo",
+       "pageinfo-protect-cascading-yes": "Amo",
+       "ilsubmit": "Pag-anapon",
+       "yesterday-at": "Suhapon ku $1",
+       "exif-worldregiondest": "Ipinababayad na rehiyon ka kinaban",
+       "exif-countrycodedest": "Koda para sa ipinababayad na nasyon",
+       "exif-citydest": "Ipinababayad na syudad",
+       "exif-gaincontrol-0": "Uda",
+       "monthsall": "ngamin",
+       "confirm-watch-top": "Muya mong irugang ading pahina sa kanimong binabantayan?",
+       "table_pager_limit": "Ipabayad a $1 na items kada pahina",
+       "version-no-ext-name": "[uda ngaran]",
+       "fileduplicatesearch-submit": "Pag-anapon",
+       "tags-active-yes": "Amo",
+       "htmlform-yes": "Amo",
+       "htmlform-cloner-create": "Rugangan pa",
+       "rightsnone": "(uda)",
+       "feedback-message": "Mensahe:",
+       "searchsuggest-search": "Pag-anapon",
+       "expand_templates_remove_nowiki": "Itago a <nowiki> tags sa resulta"
+}
index e11b71d..06edf40 100644 (file)
@@ -59,6 +59,7 @@
        "tog-watchdefault": "Afegeix les pàgines que vagi editant a la llista de seguiment",
        "tog-watchmoves": "Afegeix les pàgines que reanomeni a la llista de seguiment",
        "tog-watchdeletion": "Afegeix les pàgines que elimini a la llista de seguiment",
+       "tog-watchrollback": "Afegeix les pàgines on he realitzat una reversió a la llista de seguiment",
        "tog-minordefault": "Marca totes les contribucions com a edicions menors per defecte",
        "tog-previewontop": "Mostra una previsualització abans del quadre d'edició",
        "tog-previewonfirst": "Mostra una previsualització en la primera modificació",
@@ -77,7 +78,7 @@
        "tog-watchlisthideliu": "Amaga a la llista les edicions d'usuaris registrats",
        "tog-watchlisthideanons": "Amaga a la llista les edicions d'usuaris anònims",
        "tog-watchlisthidepatrolled": "Amaga edicions patrullades de la llista de seguiment",
-       "tog-ccmeonemails": "Envia'm còpia dels missatges que enviï als altres usuaris",
+       "tog-ccmeonemails": "Envia’m còpies dels missatges que enviï als altres usuaris",
        "tog-diffonly": "Amaga el contingut de la pàgina davall de la taula de diferències",
        "tog-showhiddencats": "Mostra les categories ocultes",
        "tog-norollbackdiff": "Omet la pàgina de diferències després de realitzar una reversió",
        "otherlanguages": "En altres llengües",
        "redirectedfrom": "(S'ha redirigit des de: $1)",
        "redirectpagesub": "Pàgina de redirecció",
+       "redirectto": "Redirigeix a:",
        "lastmodifiedat": "Darrera modificació de la pàgina: $1 a les $2.",
        "viewcount": "S'ha visitat aquesta pàgina {{PLURAL:$1|una vegada|$1 vegades}}.",
        "protectedpage": "Pàgina protegida",
        "gotaccount": "Ja teniu un compte? $1.",
        "gotaccountlink": "Inicia una sessió",
        "userlogin-resetlink": "Heu oblidat les vostres dades d'accés?",
-       "userlogin-resetpassword-link": "Has oblidat la teva contrasenya?",
+       "userlogin-resetpassword-link": "Heu oblidat la contrasenya?",
        "userlogin-helplink2": "Ajuda amb el registre",
        "userlogin-loggedin": "Heu iniciat una sessió com {{GENDER:$1|$1}}.\nFeu servir el formulari de sota per iniciar la sessió com un altre usuari.",
        "userlogin-createanother": "Crea un altre compte",
        "createaccount-text": "Algú ha creat un compte d'usuari anomenat $2 al projecte {{SITENAME}}\n($4) amb la vostra adreça de correu electrònic. La contrasenya per a l'usuari «$2» és «$3». Hauríeu d'accedir al compte i canviar-vos aquesta contrasenya quan abans millor.\n\nSi no hi teniu cap relació i aquest compte s'ha creat per error, simplement ignoreu el missatge.",
        "login-throttled": "Heu realitzat massa intents d'accés a la sessió.\nEspereu $1 abans de tornar-ho a provar.",
        "login-abort-generic": "L'entrada al compte d'usuari no ha reeixit - Abortada",
+       "login-migrated-generic": "S'ha migrat el vostre compte, i el vostre nom d'usuari ja no existeix en aquest wiki.",
        "loginlanguagelabel": "Llengua: $1",
        "suspicious-userlogout": "S'ha denegat la vostra petició per tancar la sessió ja què sembla que va ser enviada per un navegador defectuós o un proxy cau.",
        "createacct-another-realname-tip": "El nom real és opcional.\nSi decidiu proporcionar-lo, s'utilitzarà per a reconèixer a l'usuari el seu treball.",
        "passwordreset-emailsent-capture": "S'ha enviat un correu electrònic de reinicialització de contrasenya, tal com es mostra a continuació.",
        "passwordreset-emailerror-capture": "S'ha generat un correu electrònic de renovació de contrasenya, que es mostra a continuació, però ha fallat l'enviament a {{GENDER:$2:l'usuari|la usuària}}: $1",
        "changeemail": "Canvi de correu electrònic",
-       "changeemail-header": "Canvi de l'adreça de correu electrònic del compte",
        "changeemail-text": "Completeu el següent formulari per canviar la vostra adreça de correu electrònic. Haureu d'introduir la contrasenya per confirmar el canvi.",
        "changeemail-no-info": "Heu d'entrar en un compte d'usuari per accedir directament a aquesta pàgina.",
        "changeemail-oldemail": "Adreça de correu electrònic actual:",
        "changeemail-none": "(cap)",
        "changeemail-password": "La vostra contrasenya a {{SITENAME}}:",
        "changeemail-submit": "Canvia de correu electrònic",
-       "changeemail-cancel": "Cancel·la",
        "changeemail-throttled": "Heu realitzat massa intents d'inici de sessió.\nEspereu $1 abans de tornar-ho a provar.",
        "resettokens": "Reinicia els testimonis",
        "resettokens-text": "Des d'aquí podeu reiniciar els testimonis que permeten l'accés a certes dades privades associades amb el vostre compte.\n\nHo hauríeu de fer si accidentalment els heu compartit amb algú o si el vostre compte ha estat compromès.",
        "showpreview": "Mostra una previsualització",
        "showdiff": "Mostra els canvis",
        "blankarticle": "<strong>Avís:</strong> La pàgina que esteu creant és en blanc.\nSi feu clic a «{{int:savearticle}}» un altre cop, la pàgina es crearà sense cap contingut.",
-       "anoneditwarning": "'''Avís:''' No esteu identificats amb un compte d'usuari. Es mostrarà la vostra adreça IP en l'historial d'aquesta pàgina.",
+       "anoneditwarning": "<strong>Avís</strong>: No heu iniciat cap sessió. Per tant, la vostra adreça IP serà visible públicament si feu qualsevol modificació. Si <strong>[$1 inicieu una sessió]</strong> o <strong>[$2 creeu un compte]</strong>, les vostres edicions s'atribuiran al vostre nom d'usuari, juntament amb altres beneficis.",
        "anonpreviewwarning": "''No us heu identificat amb un compte d'usuari. La vostra adreça IP quedarà registrada a l'historial d'aquesta pàgina.''",
        "missingsummary": "'''Recordatori''': Heu deixat en blanc el resum de l'edició. Si torneu a clicar al botó de desar, l'edició es guardarà sense resum.",
        "missingcommenttext": "Introduïu un comentari a continuació.",
        "searchall": "tots",
        "showingresults": "Tot seguit es {{PLURAL:$1|mostra el resultat|mostren els <b>$1</b> resultats començant pel número <b>$2</b>}}.",
        "showingresultsinrange": "Es mostren a continuació fins a {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resultats}} de #<strong>$2</strong> a #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' de '''$3'''|Resultats '''$1 - $2''' de '''$3'''}} per '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> de <strong>$3</strong>|Resultats <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "La cerca no ha donat cap resultat.",
        "powersearch-legend": "Cerca avançada",
        "powersearch-ns": "Cerca als espais de noms:",
        "username": "{{GENDER:$1|Nom d'usuari}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membre}} {{PLURAL:$1|del grup|dels grups}}:",
        "prefs-registration": "Hora de registre:",
-       "yourrealname": "Nom real *",
+       "yourrealname": "Nom real*:",
        "yourlanguage": "Idioma:",
        "yourvariant": "Variant lingüística:",
        "prefs-help-variant": "La variant lingüística o ortogràfica que preferiu a l'hora de mostrar el contingut d'aquest wiki.",
        "gender-female": "Femení",
        "prefs-help-gender": "Opcional: s'usa perquè el programari se us adreci amb missatges amb el gènere adient. Aquesta informació serà pública.",
        "email": "Correu electrònic",
-       "prefs-help-realname": "* Nom real (opcional): si escolliu donar aquesta informació serà utilitzada per a donar-vos l'atribució de la vostra feina.",
+       "prefs-help-realname": "<nowiki>*</nowiki> Nom real (opcional): si escolliu donar aquesta informació es utilitzarà per a donar-vos l’atribució de la vostra feina.",
        "prefs-help-email": "L'adreça electrònica és opcional, però permet l'enviament d'una nova contrasenya en cas que oblideu l'actual.",
        "prefs-help-email-others": "També podeu optar per deixar que els altres contactin amb vós a través de la pàgina personal de discussió, sense necessitat de desvetllar la vostra identitat.",
        "prefs-help-email-required": "Cal una adreça de correu electrònic.",
        "prefs-tokenwatchlist": "Testimoni",
        "prefs-diffs": "Difs",
        "prefs-help-prefershttps": "Aquesta preferència tindrà efecte quan inicieu una nova sessió.",
+       "prefswarning-warning": "Heu fet canvis a les preferències que encara no s'han desat.\nSi abandoneu la pàgina sense fer clic a «$1», les preferències no s'actualitzaran.",
        "prefs-tabs-navigation-hint": "Consell: Podeu utilitzar les tecles de cursor de dreta i esquerra per a navegar entre les pestanyes.",
        "email-address-validity-valid": "L'adreça de correu electrònic sembla vàlida",
        "email-address-validity-invalid": "Escriviu una adreça vàlida de correu electrònic",
-       "userrights": "Gestió dels permisos d'usuari",
+       "userrights": "Gestió dels permisos dusuari",
        "userrights-lookup-user": "Gestiona els grups d'usuari",
        "userrights-user-editname": "Introduïu un nom d'usuari:",
        "editusergroup": "Edita els grups d'usuaris",
        "randomincategory": "Pàgina aleatòria en una categoria",
        "randomincategory-invalidcategory": "«$1» no és un nom de categoria vàlid.",
        "randomincategory-nopages": "No hi ha pàgines a la categoria [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Obté una pàgina a l'atzar de la categoria: $1 $2.",
-       "randomincategory-selectcategory-submit": "Vés-hi",
+       "randomincategory-category": "Categoria:",
+       "randomincategory-legend": "Pàgina a l’atzar en la categoria",
        "randomredirect": "Redirecció a l'atzar",
        "randomredirect-nopages": "No hi ha cap redirecció a l'espai de noms «$1».",
        "statistics": "Estadístiques",
        "querypage-disabled": "Aquesta pàgina especial està desactivada per a no perjudicar el rendiment.",
        "booksources": "Obres de referència",
        "booksources-search-legend": "Cerca fonts de llibres",
-       "booksources-go": "Vés-hi",
+       "booksources-search": "Cerca",
        "booksources-text": "A sota hi ha una llista d'enllaços d'altres llocs que venen llibres nous i de segona mà, i també podrien tenir més informació dels llibres que esteu cercant:",
        "booksources-invalid-isbn": "El codi ISBN donat no és vàlid. Comproveu si l'heu copiat correctament.",
        "specialloguserlabel": "Realitzador:",
        "noindex-category-desc": "La pàgina conté una paraula màgica <code><nowiki>__NOINDEX__</nowiki></code> (i és en un espai de noms on està permesa) i per tant no està indexada per robots.",
        "index-category-desc": "La pàgina conté un <code><nowiki>__INDEX__</nowiki></code> (i és en un espai de noms on està permès) i per tant està indexat per robots quan normalment no ho seria.",
        "post-expand-template-inclusion-category-desc": "La mida de la pàgina és més gran que <code>$wgMaxArticleSize</code> un cop expandides totes les plantilles, per tant algunes plantilles no s'han expandit.",
-       "post-expand-template-argument-category-desc": "Després d'expandir un argument de plantilla (alguna cosa entre claus triples, com <code>{{{Això}}}</code>), la pàgina és més gran que <code>$wgMaxArticleSize</code>.",
+       "post-expand-template-argument-category-desc": "La pàgina és més gran que <code>$wgMaxArticleSize</code> després d'expandir un argument de plantilla (quelcom entre claus triples, com ara <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "La pàgina utilitza massa funcions d'analitzador costoses (com <code>#ifexist</code>). Vegeu [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "La pàgina conté un enllaç de fitxer trencat (un enllaç per inserir un fitxer quan aquest fitxer no existeix).",
-       "hidden-category-category-desc": "Aquesta és una categoria que conté <code><nowiki>__HIDDENCAT__</nowiki></code>, que impedeix que aparegui en la caixa d'enllaços de categoria a les pàgines, per defecte.",
+       "hidden-category-category-desc": "La categoria conté <code><nowiki>__HIDDENCAT__</nowiki></code> en el contingut de la pàgina, fet que impedeix que aparegui en la caixa d'enllaços de categoria a les pàgines per defecte.",
        "trackingcategories-nodesc": "Sense descripció disponible.",
        "trackingcategories-disabled": "La categoria està inhabilitada",
        "mailnologin": "Cap adreça de remitent",
        "emailsubject": "Assumpte:",
        "emailmessage": "Missatge:",
        "emailsend": "Envia",
-       "emailccme": "Envia'm una còpia del meu missatge.",
+       "emailccme": "Enviam una còpia del meu missatge.",
        "emailccsubject": "Còpia del vostre missatge a $1: $2",
        "emailsent": "Correu electrònic enviat",
        "emailsenttext": "S'ha enviat el vostre correu electrònic.",
        "watchlist-details": "Teniu $1 {{PLURAL:$1|pàgina|pàgines}} a la llista de seguiment, sense comptar les pàgines de discussió.",
        "wlheader-enotif": "La notificació per correu electrònic està habilitada.",
        "wlheader-showupdated": "Les pàgines que s'han canviat des de la vostra darrera visita es mostren en '''negreta'''.",
-       "wlnote": "A sota hi ha {{PLURAL:$1|el darrer canvi|els darrers '''$1''' canvis}} en {{PLURAL:$2|la darrera hora|les  '''$2''' darreres hores}}, a $4 del $3.",
-       "wlshowlast": "<small>- Mostra les darreres $1 hores, els darrers $2 dies o $3</small>",
+       "wlnote": "A sota hi ha {{PLURAL:$1|el darrer canvi|els darrers <strong>$1</strong> canvis}} en {{PLURAL:$2|la darrera hora|les <strong>$2</strong> darreres hores}}, a $4 del $3.",
+       "wlshowlast": "Mostra les darreres $1 hores, els darrers $2 dies",
        "watchlist-options": "Opcions de la llista de seguiment",
        "watching": "S'està vigilant...",
        "unwatching": "S'està desatenent...",
        "exbeforeblank": "el contingut abans de buidar era: '$1'",
        "delete-confirm": "Elimina «$1»",
        "delete-legend": "Elimina",
-       "historywarning": "'''Atenció:''' La pàgina que esteu a punt d'eliminar té un historial amb $1 {{PLURAL:$1|versió|versions}}, aproximadament:",
+       "historywarning": "<strong>Avís:</strong> la pàgina que esteu a punt d'eliminar té un historial amb $1 {{PLURAL:$1|revisió|revisions}}:",
        "confirmdeletetext": "Esteu a punt d'esborrar de forma permanent una pàgina o imatge i tot el seu historial de la base de dades.\nConfirmeu que realment ho voleu fer, que enteneu les\nconseqüències, i que el que esteu fent està d'acord amb la [[{{MediaWiki:Policy-url}}|política]] del projecte.",
-       "actioncomplete": "S'ha realitzat l'acció de manera satisfactòria.",
+       "actioncomplete": "Acció realitzada",
        "actionfailed": "L'acció ha fallat",
        "deletedtext": "S'ha suprimit «$1».\nVegeu $2 per a un registre dels esborrats més recents.",
        "dellogpage": "Registre d'eliminació",
        "delete-edit-reasonlist": "Edita els motius d'eliminació",
        "delete-toobig": "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. L'eliminació d'aquestes pàgines està restringida per a prevenir que hi pugui haver un desajustament seriós de la base de dades de tot el projecte {{SITENAME}} per accident.",
        "delete-warning-toobig": "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. Eliminar-la podria suposar un seriós desajustament de la base de dades de tot el projecte {{SITENAME}}; aneu en compte abans dur a terme l'acció.",
-       "delete-cantedit": "No podeu suprimir la pàgina perquè no teniu permís per a editar-la.",
+       "deleteprotected": "No podeu eliminar la pàgina perquè ha estat protegida.",
        "deleting-backlinks-warning": "'''Avís:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Altres pàgines]] enllacen o transclouen de la pàgina que esteu a punt de suprimir.",
        "rollback": "Reverteix edicions",
        "rollback_short": "Revoca",
        "protect-othertime": "Un altre termini:",
        "protect-othertime-op": "un altre termini",
        "protect-existing-expiry": "Data d'expiració existent: $2 a les $3",
+       "protect-existing-expiry-infinity": "Temps d'expiració existent: infinit",
        "protect-otherreason": "Motiu diferent o addicional:",
        "protect-otherreason-op": "Altres motius",
        "protect-dropdown": "*Motius comuns de protecció\n** Vandalisme excessiu\n** Spam excessiu\n** Guerra d'edicions improductiva\n** Pàgina amb alt trànsit",
        "namespace_association": "Espai de noms associat",
        "tooltip-namespace_association": "Marqueu aquesta casella per incloure l'espai de noms de discussió o de no discussió associat a l'espai de noms seleccionat",
        "blanknamespace": "(Principal)",
-       "contributions": "Contribucions de {{GENDER:$1|l'usuari|la usuària}}",
+       "contributions": "Contribucions de {{GENDER:$1|lusuari|la usuària}}",
        "contributions-title": "Contribucions de l'usuari $1",
        "mycontris": "Contribucions",
        "contribsub2": "Per a {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "El compte d'usuari «$1» no està registrat.",
-       "nocontribs": "No s'ha trobat canvis que encaixessin amb aquests criteris.",
+       "nocontribs": "No s’ha trobat cap canvi que encaixessi amb aquests criteris.",
        "uctop": "(actual)",
        "month": "Mes (i anteriors):",
        "year": "Any (i anteriors):",
        "autoblockid": "Autoblocatge #$1",
        "block": "Blocatge d'usuaris",
        "unblock": "Desblocatge d'usuaris",
-       "blockip": "Bloqueig d'usuaris",
+       "blockip": "Bloca {{GENDER:$1|l'usuari|l'usuària}}",
        "blockip-legend": "Bloca l'usuari",
        "blockiptext": "Empreu el següent formulari per blocar l'accés\nd'escriptura des d'una adreça IP específica o des d'un usuari determinat.\naixò només s'hauria de fer per prevenir el vandalisme, i\nd'acord amb la [[{{MediaWiki:Policy-url}}|política del projecte]].\nEmpleneu el diàleg de sota amb un motiu específic (per exemple, citant\nquines pàgines en concret estan sent vandalitzades).",
        "ipaddressorusername": "Adreça IP o nom de l'usuari",
        "ipb-unblock-addr": "Desbloca $1",
        "ipb-unblock": "Desbloca un usuari o una adreça IP",
        "ipb-blocklist": "Llista els bloquejos existents",
-       "ipb-blocklist-contribs": "Contribucions de $1",
+       "ipb-blocklist-contribs": "Contribucions de {{GENDER:$1|$1}}",
        "unblockip": "Desbloca l'usuari",
        "unblockiptext": "Empreu el següent formulari per restaurar\nl'accés a l'escriptura a una adreça IP o un usuari prèviament bloquejat.",
        "ipusubmit": "Desbloca aquesta adreça",
        "unblocked": "S'ha desbloquejat l'{{GENDER:$1|usuari|usuària}} [[User:$1|$1]]",
        "unblocked-range": "s'ha desblocat $1",
        "unblocked-id": "S'ha eliminat el bloqueig de $1",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] ha estat desbloquejat.",
        "blocklist": "Usuaris blocats",
        "ipblocklist": "Usuaris blocats",
        "ipblocklist-legend": "Cerca un usuari blocat",
        "import": "Importació de pàgines",
        "importinterwiki": "Importa interwiki",
        "import-interwiki-text": "Trieu un web basat en wiki i un títol de pàgina per a importar.\nEs conservaran les dates de les versions i els noms dels editors.\nTotes les accions d'importació interwiki es conserven al [[Special:Log/import|registre d'importacions]].",
-       "import-interwiki-source": "Pàgina/wiki d'origen:",
+       "import-interwiki-sourcewiki": "Wiki d'origen:",
+       "import-interwiki-sourcepage": "Pàgina d'origen:",
        "import-interwiki-history": "Copia totes les versions de l'historial d'aquesta pàgina",
        "import-interwiki-templates": "Inclou totes les plantilles",
        "import-interwiki-submit": "Importa",
        "exif-urgency-low": "Baixa ($1)",
        "exif-urgency-high": "Alta ($1)",
        "exif-urgency-other": "Prioritat definida per l'usuari ($1)",
-       "watchlistall2": "totes",
        "namespacesall": "tots",
        "monthsall": "tots",
        "confirmemail": "Confirma l'adreça de correu electrònic",
        "table_pager_limit": "Mostra $1 elements per pàgina",
        "table_pager_limit_label": "Ítems per pàgina:",
        "table_pager_limit_submit": "Vés-hi",
-       "table_pager_empty": "Sense resultats",
+       "table_pager_empty": "No hi ha resultats",
        "autosumm-blank": "Pàgina blanquejada",
        "autosumm-replace": "Contingut canviat per «$1».",
        "autoredircomment": "Redirecció a [[$1]]",
        "specialpages-group-changes": "Canvis recents i registres",
        "specialpages-group-media": "Informes multimèdia i càrregues",
        "specialpages-group-users": "Usuaris i drets",
-       "specialpages-group-highuse": "Pàgines d'alt ús",
+       "specialpages-group-highuse": "Pàgines d’ús elevat",
        "specialpages-group-pages": "Llistes de pàgines",
-       "specialpages-group-pagetools": "Pàgines d'eines",
+       "specialpages-group-pagetools": "Eines per a les pàgines",
        "specialpages-group-wiki": "Dades i eines",
        "specialpages-group-redirects": "Pàgines especials de redirecció",
        "specialpages-group-spam": "Eines de spam",
        "logentry-rights-rights": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3 de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3",
        "logentry-rights-autopromote": "$1 ha estat {{GENDER:$2|promogut}} automàticament de $4 a $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ha carregat}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|ha carregat}} una nova versió de $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|ha carregat}} $3",
        "rightsnone": "(cap)",
+       "revdelete-summary": "el resum d'edició",
        "feedback-bugornote": "Si podeu descriure un problema tècnic en detall, [$1 informeu-ne].\nAltrament, podeu fer servir un senzill formulari a continuació. El vostre comentari s'afegirà a la pàgina «[$3 $2]», juntament amb el vostre nom d'usuari i el navegador que esteu emprant.",
        "feedback-subject": "Assumpte:",
        "feedback-message": "Missatge:",
        "log-name-pagelang": "Canvia el registre de llengua",
        "log-description-pagelang": "Aquest és un registre dels canvis en les llengües de les pàgines.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha canviat}} la llengua de la pàgina per a $3 de $4 a $5.",
+       "default-skin-not-found": "Òndia! L'aparença per defecte per al wiki, definit en <code dir=\"ltr\">$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nLa vostra instal·lació sembla que inclou les següents aparences. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuració d'aparences] per a la informació de com habilitar-les i triar-ne el valor per defecte.\n\n$2\n\n; Si heu acabat d'instal·lar MediaWiki:\n: Probablement l'instal·làveu des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Intenteu instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org], per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador tarball], que ve amb diverses aparences i ampliacions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Clonar un dels repositoris <code>mediawiki/skins/*</code> a través de git en el directori <code dir=\"ltr\">skins/</code> de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre dipòsit git si sou un desenvolupador de MediaWiki.\n\n; Si només heu actualitzat MediaWiki:\n: Per MediaWiki 1.24 i posteriors ja no permet aparences instal·lades automàticament (consulteu [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Aparences autodiscovery]). Podeu enganxar les línies següents en <code>LocalSettings.php</code> per permetre totes les aparences instal·lades actualment:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si només heu modificat <code>LocalSettings.php</code>:\n: Reviseu els noms de l'aparença per errors tipogràfics.",
+       "default-skin-not-found-no-skins": "Òndia! L'aparença per defecte per al wiki, definit en <code>$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nNo teniu cap aparença instal·lada.\n\n\n; Si heu acabat d'instal·lar o actualitzar MediaWiki:\n: Probablement l'heu instal·lat des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Per MediaWiki 1.24 i posteriors ja no s'inclouen aparences en el repositori principal. Proveu d'instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org], per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador tarball], que ve amb diverses aparences i ampliacions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Clonar un dels repositoris <code>mediawiki/skins/*</code> a través de git en el directori <code dir=\"ltr\">skins/</code> de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre dipòsit git si sou un desenvolupador de MediaWiki. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: configuració de l'aparença] per informació de com permetre aparences i triar-ne per defecte.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (habilitat)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''inhabilitat''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''inhabilitat''')",
+       "mediastatistics": "Estadístiques dels multimèdia",
+       "mediastatistics-summary": "Les estadístiques sobre els tipus de fitxers pujats. Això només inclou la versió més recent d'un fitxer. S'exclouen les versions antigues o eliminades dels fitxers.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Tipus MIME",
+       "mediastatistics-table-extensions": "Extensions possibles",
+       "mediastatistics-table-count": "Nombre de fitxers",
+       "mediastatistics-table-totalbytes": "Mida combinada",
+       "mediastatistics-header-unknown": "Desconegut",
+       "mediastatistics-header-bitmap": "Imatges de mapa de bits",
+       "mediastatistics-header-drawing": "Dibuixos (imatges vectorials)",
+       "mediastatistics-header-audio": "Àudio",
+       "mediastatistics-header-video": "Vídeos",
+       "mediastatistics-header-multimedia": "Multimèdia enriquida",
+       "mediastatistics-header-office": "Oficina",
+       "mediastatistics-header-text": "Textual",
+       "mediastatistics-header-executable": "Executables",
+       "mediastatistics-header-archive": "Formats comprimits",
+       "json-warn-trailing-comma": "$1 al final {{PLURAL:$1|coma ha estat eliminada|comes han estat eliminades}} de JSON",
+       "json-error-unknown": "S'ha produït un error amb el JSON. Error: $1",
+       "json-error-depth": "S'ha superat la profunditat màxima de pila",
+       "json-error-state-mismatch": "JSON incorrecte o no vàlid",
+       "json-error-ctrl-char": "Error de caràcter de control, possiblement incorrectament codificat",
+       "json-error-syntax": "Error de sintaxi",
+       "json-error-utf8": "Caràcters UTF-8 amb errors de format, probablement mal codificats",
+       "json-error-recursion": "Una o més referències recursives en el valor per ser codificat",
+       "json-error-inf-or-nan": "Un o més valors NAN (número no assignat) o INF (infinit) en el valor per ser codificat",
+       "json-error-unsupported-type": "S'ha donat un valor d'un tipus que no pot ser codificat"
 }
index a6fd625..c4674cc 100644 (file)
        "tog-underline": "下劃綫鏈接",
        "tog-hideminor": "藏起最近改變其過要修改",
        "tog-hidepatrolled": "藏起最近改變其巡邏修改",
+       "tog-extendwatchlist": "敆擴展監視單單臺中顯示所有其更改,伓啻最近其更改",
        "tog-numberheadings": "自動編號其標題",
+       "tog-showtoolbar": "顯示編輯工具欄",
        "tog-editondblclick": "雙擊就修改頁面",
+       "tog-editsectiononrightclick": "啟用右擊標題編輯段落",
        "tog-watchcreations": "加添我開其頁面共我上傳其文件遘我其監視單",
        "tog-watchdefault": "添加我編輯其頁面共文件遘我其監視單",
        "tog-watchmoves": "添加我移動其頁面共文件遘我其監視單",
        "editfont-monospace": "蜀様寬其字體",
        "editfont-sansserif": "無襯線其字體",
        "editfont-serif": "有襯線其字體",
-       "sunday": "Lā̤ buái/禮拜",
-       "monday": "Buái ék/拜一",
-       "tuesday": "Buái nê/拜二",
-       "wednesday": "Buái săng / 拜三",
-       "thursday": "Buái sé/拜四",
-       "friday": "Buái ngô/拜五",
-       "saturday": "Buái lĕ̤k/拜六",
-       "sun": "Lā̤ buái/禮拜",
-       "mon": "Buái ék/拜一",
-       "tue": "Buái nê/拜二",
-       "wed": "Buái săng/拜三",
-       "thu": "Buái sé/拜四",
-       "fri": "Buái ngô/拜五",
-       "sat": "Buái lĕ̤k/拜六",
+       "sunday": "禮拜",
+       "monday": "拜一",
+       "tuesday": "拜二",
+       "wednesday": "拜三",
+       "thursday": "拜四",
+       "friday": "拜五",
+       "saturday": "拜六",
+       "sun": "禮拜",
+       "mon": "拜一",
+       "tue": "拜二",
+       "wed": "拜三",
+       "thu": "拜四",
+       "fri": "拜五",
+       "sat": "拜六",
        "january": "一月",
        "february": "二月",
        "march": "三月",
        "category-empty": "''茲類別下底現在無文章也無媒體。''",
        "hidden-categories": "{{PLURAL:$1}}乞藏起其類別",
        "hidden-category-category": "已經藏起其類別",
+       "category-subcat-count": "{{PLURAL:$2|茲萆分類僅包括下底蜀萆子分類|茲分類有 {{PLURAL:$1|子分類|$1 萆子分類}},總計 $2 萆。}}",
        "category-subcat-count-limited": "茲蜀萆類別下底有子類別{{PLURAL:$1}}",
        "category-article-count": "{{PLURAL:$2|茲蜀萆類別儷有下底蜀頁。|共總有$2頁,下底其茲$1頁敆茲蜀萆類別𡅏。}}",
        "category-article-count-limited": "下底$1頁敆茲蜀萆類別𡅏{{PLURAL:$1}}",
        "history_short": "歷史",
        "updatedmarker": "趁我最後蜀回訪問開始更新",
        "printableversion": "會拍印其版本",
-       "permalink": "固定链接",
+       "permalink": "永久鏈接",
        "print": "拍印",
        "view": "覷蜀覷",
        "edit": "修改",
        "talkpage": "討論茲頁",
        "talkpagelinktext": "討論",
        "specialpage": "特殊頁",
-       "personaltools": "å\80\8b人å\85¶å®¶ç§\81",
+       "personaltools": "å\80\8b人å\85¶å\82¢ç§\81è\8a±",
        "articlepage": "覷蜀覷內容頁面",
        "talk": "討論",
        "views": "覷蜀覷",
-       "toolbox": "家ç§\81",
+       "toolbox": "å\82¢ç§\81è\8a±",
        "userpage": "覷蜀覷用戶頁面",
        "projectpage": "看工程頁",
        "imagepage": "覷蜀覷文件頁面",
        "otherlanguages": "其它其語言",
        "redirectedfrom": "(由$1重定向過來)",
        "redirectpagesub": "重定向頁",
-       "lastmodifiedat": "茲頁面是著$2, $1時候修改其。",
+       "lastmodifiedat": "茲蜀頁是着$1 $2其辰候最後修改其。",
        "viewcount": "茲蜀頁已經乞訪問$1回了。{{PLURAL:$1}}",
        "protectedpage": "保護頁",
        "jumpto": "跳遘:",
        "privacypage": "Project:隱私政策",
        "badaccess": "權限錯誤",
        "badaccess-group0": "汝𣍐使做汝要求其茲蜀萆動作。",
-       "badaccess-groups": "汝要求其動作è\91\97$2åº\95è£\8fç\94¨æ\88¶æ\89\8dæ\9c\83å\81\9aå\85¶ï¼\9a$1{{PLURAL:$1}}",
-       "versionrequired": "需要版本$1其媒體維基",
-       "versionrequiredtext": "需要媒體維基其版本$1來使茲蜀頁。\n覷[[Special:Version|版本頁面]]。",
+       "badaccess-groups": "汝要求其動作ç\9d\80$2è£\8få\8b¢ç\94¨æ\88¶ä¹\8dæ\9c\83å\81\9aå\85¶ï¼\9a$1{{PLURAL:$1}}",
+       "versionrequired": "需要版本$1其MediaWiki",
+       "versionrequiredtext": "需要MediaWiki其版本$1來使茲蜀頁。\n覷[[Special:Version|版本頁面]]。",
        "ok": "好",
        "retrievedfrom": "趁「$1」退過來",
        "youhavenewmessages": "汝有$1($2)。",
        "toc": "目錄",
        "showtoc": "顯示",
        "hidetoc": "藏起",
-       "collapsible-collapse": "崩潰",
-       "collapsible-expand": "擴展",
+       "collapsible-collapse": "",
+       "collapsible-expand": "",
        "thisisdeleted": "卜看或者恢復$1?",
        "viewdeleted": "看$1?",
        "restorelink": "$1萆乞刪掉其修改{{PLURAL:$1}}",
        "nosuchspecialpage": "無總款其特殊頁",
        "nospecialpagetext": "<strong>汝請求蜀萆𣍐合法其特殊頁面。</strong>\n\n合法其特殊頁面清單會使敆[[Special:SpecialPages|{{int:特殊頁面}}]]頁面討著",
        "error": "鄭咯",
-       "databaseerror": "數據庫有",
+       "databaseerror": "數據庫有",
        "laggedslavemode": "'''警告:'''頁面可能無最近其更新。",
        "readonly": "數據庫乞鎖起咯",
        "readonlytext": "Só-gé̤ṳ-kó cī-buàng ké̤ṳk nè̤ng sō̤ kī lāu, mâ̤-sāi siā sĭng dèu-mĕ̤k hĕ̤k có̤ siŭ-gāi, ô kō̤-nèng sê ôi-lāu nĭk-siòng mì-hô, cĭ-hâiu cêu â̤ ciáng-siòng.\n\nSō̤ kī só-gé̤ṳ-kó gì guāng-lī-uòng cūng-kuāng gāi-sék: $1",
        "protectedpagetext": "茲頁已經乞保護起咯,𣍐使修改或者其它行動。",
        "viewsourcetext": "汝會使看共複製茲蜀頁其源代碼:",
        "viewyourtext": "汝會使覷蜀覷或者複製茲頁'''汝其修改'''其源代碼:",
-       "editinginterface": "'''警告:'''汝敆𡅏修改其頁面廮𡅏提供茲蜀萆軟件其界面文本。\n茲蜀頁其改變會影響遘其它用戶其用戶界面其顯示。\n如果蔔想修改維基其翻譯,起動遘媒體維基本地化計劃[//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]。",
+       "editinginterface": "'''警告:'''汝敆𡅏修改其頁面廮𡅏提供茲蜀萆軟件其界面文本。\n茲蜀頁其改變會影響遘其它用戶其用戶界面其顯示。\n如果卜想修改維基其翻譯,起動遘MediaWiki本地化計劃[//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]。",
        "namespaceprotected": "汝𣍐使修改敆'''$1'''命名空間其頁面。",
        "customcssprotected": "汝𣍐使修改茲蜀萆CSS頁面,因為伊有別蜀隻用戶其設定。",
        "customjsprotected": "汝𣍐使修改茲蜀萆JavaScript頁面,因為伊有別蜀隻用戶其設定。",
        "userlogin-signwithsecure": "使安全其連接",
        "yourdomainname": "汝其域名:",
        "password-change-forbidden": "汝𣍐使敆茲蜀萆維基百科𡅏修改密碼。",
-       "externaldberror": "可能是驗證數據庫咯,或者是汝𣍐使升級汝其外部賬戶。",
+       "externaldberror": "可能是驗證數據庫咯,或者是汝𣍐使升級汝其外部賬戶。",
        "login": "躒底",
        "nav-login-createaccount": "躒底/開賬戶",
        "userlogin": "躒底/開賬戶",
        "gotaccountlink": "躒底",
        "userlogin-resetlink": "躒底其資料𣍐記咯?",
        "userlogin-resetpassword-link": "密码𣍐記?",
+       "userlogin-helplink2": "對手汝躒底",
        "createacct-emailrequired": "電子郵件地址",
        "createacct-emailoptional": "電子郵件地址(愛寫就寫)",
        "createacct-email-ph": "輸底汝其電子郵件地址",
        "passwordtooshort": "密碼著設最少{{PLURAL:$1|$1萆字符}}。",
        "password-name-match": "汝其密碼硬著共汝其用戶名𣍐蜀様才會使其。",
        "password-login-forbidden": "茲蜀萆用戶名共密碼應經乞禁止去了。",
-       "mailmypassword": "共新密碼發遘電子郵件",
+       "mailmypassword": "重新設置密碼",
        "passwordremindertitle": "{{SITENAME}}其新其臨時密碼",
        "passwordsent": "新密碼已經寄遘「$1」註冊其電子郵件地址了。\n收遘後,請再躒底蜀頭部。",
        "mailerror": "發電子郵件有賺:$1",
        "resetpass-submit-cancel": "取消",
        "resetpass-temp-password": "臨時密碼:",
        "passwordreset": "重置密碼",
+       "passwordreset-text-one": "完成者隻表單,通過電子郵件發送臨時密碼來重新設定汝其密碼。",
        "passwordreset-legend": "重置密碼",
        "passwordreset-username": "用戶名:",
        "passwordreset-domain": "域名:",
        "passwordreset-emailsent": "蜀萆密碼重置其電子郵件已經發出去了。",
        "passwordreset-emailsent-capture": "蜀萆密碼重置其電子郵件已經發出去了,顯示敆下底。",
        "changeemail": "修改電子郵件地址",
-       "changeemail-header": "修改賬戶電子郵件地址",
        "changeemail-oldemail": "現刻時其電子郵件地址:",
        "changeemail-newemail": "新其電子郵件地址:",
        "changeemail-none": "(無)",
        "changeemail-password": "汝其{{SITENAME}}密碼:",
        "changeemail-submit": "修改電子郵件地址",
-       "changeemail-cancel": "取消",
        "bold_sample": "粗體文字",
        "bold_tip": "粗體文字",
        "italic_sample": "敧其文字",
        "preview": "預覽",
        "showpreview": "顯示預覽",
        "showdiff": "看改變其部分",
-       "anoneditwarning": "'''警告:'''汝未躒底。\n汝起IP地址會乞記錄敆茲頁面修改歷史底裏。",
+       "anoneditwarning": "'''警告:'''汝未躒底。\n汝其IP地址會乞記着茲頁面其修改歷史裏勢。",
        "missingcommenttext": "起動敆下底輸底蜀條評論。",
        "summary-preview": "總結預覽:",
        "blockedtitle": "用戶乞封鎖了",
        "readonlywarning": "'''警告:數據庫已經乞鎖定來保養去了,故此汝現刻時𣍐使保存汝其編輯。'''\n汝可能希望複製再粘貼汝其文字遘蜀萆文本文件𡅏,再共伊保存起咯。\n\n鎖定伊其管理員給出茲蜀萆解釋:$1",
        "protectedpagewarning": "''警告:茲蜀頁已經乞保護起去了,故此囇有管理員權力其用戶乍會使修改伊。'''\n最新其日誌已經敆下底提供來做參考:",
        "semiprotectedpagewarning": "'''注意:''' 茲蜀頁已經乞保護起去了,故此囇有註冊其用戶乍會使修改伊。\n最新其日誌已經敆下底提供來做參考:",
-       "templatesused": "{{PLURAL:$1}}茲頁底裏使其模板:",
+       "templatesused": "{{PLURAL:$1}}茲頁裏勢使其模板:",
        "templatesusedpreview": "茲萆預覽使其{{PLURAL:$1|模板}}:",
        "templatesusedsection": "茲蜀段使其{{PLURAL:$1|模板}}:",
        "template-protected": "(保護)",
        "prefs-personal": "用戶資料",
        "prefs-rc": "這般其改變",
        "prefs-watchlist": "監視單",
+       "prefs-watchlist-days": "監視單單臺中顯示其天數",
+       "prefs-watchlist-edits": "敆擴展監視其單單臺中顯示其更改其最大數目:",
        "prefs-misc": "其它",
        "saveprefs": "保存",
+       "prefs-editing": "編輯",
+       "rows": "行數:",
        "searchresultshead": "尋討",
        "recentchangescount": "這般改變其條目:",
        "savedprefs": "汝其設定已經乞保存了。",
        "yournick": "新其簽名:",
        "email": "電子郵件",
        "prefs-help-email": "電子郵件地址是愛寫就寫其,但是如果汝𣍐記密碼咯,密碼重置其時候需要茲。",
+       "prefs-help-email-others": "汝也會使選擇讓其他其用戶通過汝其用戶頁面或者討論頁面懸頂其鏈接,使電子郵件來聯繫汝。其他其用戶聯繫汝其辰候,汝其電子郵件地址𣍐顯示出來。",
        "editusergroup": "修改用戶組",
        "group": "組:",
        "group-bot": "機器人",
        "movethispage": "移動茲頁",
        "booksources": "書源",
        "booksources-search-legend": "尋討書源",
-       "booksources-go": "去",
        "booksources-text": "下底是鏈接遘其它賣新書共舊書其站點其單單,固加可能有更多關於汝敆𡅏看其茲本書其信息:",
        "specialloguserlabel": "表演者:",
        "speciallogtitlelabel": "目標(稱呼或者用戶):",
        "log": "日誌",
        "alllogstext": "所有會使趁{{SITENAME}}獲得其日誌其都合併顯示。\n汝會使使揀選日誌類型、用戶名(大小寫敏感),或者受影響其頁面(大小寫敏感)其方法來縮小視角。",
-       "logempty": "日誌底裏討要𣍐著項目",
+       "logempty": "日誌裏勢討要𣍐着項目",
        "allpages": "所有頁面",
        "nextpage": "下蜀頁($1)",
        "prevpage": "前蜀頁($1)",
        "allinnamespace": "所有頁面($1命名空間)",
        "allpagessubmit": "去",
        "allpagesprefix": "按頭部顯示頁面:",
-       "allpagesbadtitle": "給出其頁面其標題是𣍐合法其,或者有蜀萆跨語言或跨維基其前綴。伊可能包括蜀萆或者価萆𣍐使廮標題底裏其字符。",
+       "allpagesbadtitle": "給出其頁面其標題是𣍐合法其,或者有蜀萆跨語言或跨維基其前綴。伊可能包括蜀萆或者価萆𣍐使廮標題裏勢其字符。",
        "categories": "類別",
        "deletedcontributions": "乞刪掉其用戶貢獻",
        "deletedcontributions-title": "乞刪掉其用戶貢獻",
        "unwatch": "伓使監視",
        "unwatchthispage": "停止監視",
        "watchlist-details": "{{PLURAL:$1}}$1頁敆汝其監視單𡅏,無算討論頁。",
-       "wlshowlast": "顯示最$1點鐘$2日$3",
+       "wlshowlast": "顯示最$1點鐘$2日",
        "watchlist-options": "監視單選項",
        "watching": "監視...",
        "deletepage": "刪頁",
        "sp-contributions-search": "尋討貢獻",
        "sp-contributions-username": "IP地址或者用戶名:",
        "sp-contributions-submit": "尋討",
-       "whatlinkshere": "乇鏈遘嚽塊",
+       "whatlinkshere": "乇鏈遘嚽塊",
        "whatlinkshere-title": "鏈接遘$1其頁面",
        "whatlinkshere-page": "頁面:",
        "linkshere": "下底其頁面鏈接遘'''[[:$1]]''':",
        "block-log-flags-nocreate": "防止開賬戶",
        "ipb_expiry_invalid": "過期時間無效。",
        "ipb_already_blocked": "「$1」已經乞封鎖了",
-       "lockconfirm": "正,我卜想鎖定數據庫。",
+       "lockconfirm": "正,我卜想鎖定數據庫。",
        "lockbtn": "鎖定數據庫",
        "unlockbtn": "開數據庫",
        "lockdbsuccesssub": "數據庫鎖定好了",
        "allmessagesname": "名",
        "allmessagesdefault": "默認其消息文字",
        "allmessagescurrent": "現時其文字",
-       "allmessagestext": "茲是敆媒體維基命名空間底裏系統消息其蜀萆單單。\n如果汝卜想貢獻通用其媒體維基本地化服務,請訪問[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation 媒體維基本地化]共[//translatewiki.net translatewiki.net]。",
+       "allmessagestext": "茲是敆MediaWiki命名空間裏勢系統消息其蜀萆單單。\n如果汝卜想貢獻通用其MediaWiki基本地化服務,起動汝訪問[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki本地化]共[//translatewiki.net translatewiki.net]。",
        "allmessagesnotsupportedDB": "茲蜀頁𣍐使其,因為'''$wgUseDatabaseMessages'''已經乞禁止去了。",
        "thumbnail-more": "放大",
        "tooltip-pt-userpage": "汝其用戶頁",
        "tooltip-pt-mytalk": "汝其討論頁",
        "tooltip-pt-preferences": "汝其設定",
+       "tooltip-pt-watchlist": "汝監視其頁面有改過其單單",
+       "tooltip-pt-mycontris": "汝其貢獻其單單",
        "tooltip-pt-login": "希望汝躒底其;當然,無逼汝總款做。",
        "tooltip-pt-logout": "躒出",
        "tooltip-ca-talk": "茲蜀頁其討論",
        "tooltip-ca-edit": "汝會使修改茲蜀頁。起動敆保存以前使預覽按鈕",
        "tooltip-ca-addsection": "開始蜀萆新其部分",
        "tooltip-ca-viewsource": "茲蜀頁乞保護起去。\n汝會使看伊其源代碼。",
+       "tooltip-ca-history": "覷茲頁舊底其版本",
        "tooltip-ca-protect": "保護茲蜀頁",
        "tooltip-ca-delete": "刪掉茲蜀頁",
        "tooltip-ca-move": "移動茲蜀頁",
        "tooltip-n-recentchanges": "維基百科最近其改變其單單",
        "tooltip-n-randompage": "隨便罔看",
        "tooltip-t-whatlinkshere": "鏈遘嚽塊其所有維基頁面其單單",
+       "tooltip-t-recentchangeslinked": "鏈遘茲頁其頁面其最近修改",
        "tooltip-t-contributions": "茲蜀用戶其貢獻單單",
        "tooltip-t-emailuser": "共茲蜀隻用戶發電子郵件",
        "tooltip-t-upload": "上傳文件",
        "tooltip-t-specialpages": "特殊頁其單單",
        "tooltip-t-print": "茲蜀頁其會拍印其版本",
+       "tooltip-t-permalink": "茲頁茲版本其永久鏈接",
        "tooltip-ca-nstab-main": "看蜀看內容頁",
        "tooltip-ca-nstab-user": "覷蜀覷用戶頁",
        "tooltip-ca-nstab-special": "茲是蜀萆特殊頁,汝𣍐使修改茲蜀頁。",
        "exif-meteringmode-0": "𣍐八",
        "exif-lightsource-0": "𣍐八",
        "exif-subjectdistancerange-0": "𣍐八",
-       "watchlistall2": "所有",
        "namespacesall": "所有",
        "monthsall": "囫圇年",
        "confirmemail": "確定電子郵件地址",
index 0b08299..32a5fcc 100644 (file)
        "category-file-count": "{{PLURAL:$2|ХӀокху категори чохь цхьа файл бе яц.|{{PLURAL:$1|Гойту $1 файл|Гойту $1 файлаш}} хӀокху категорешца кху $2.}}",
        "category-file-count-limited": "ХӀокху категори чохь {{PLURAL:$1|$1 файл|$1 файлаш|1=цхьаъ бен файл яц}}.",
        "listingcontinuesabbrev": "(кхин дlа)",
-       "index-category": "Меттигтерахьйо агlонаш",
+       "index-category": "Меттигтерахьйо агӀонаш",
        "noindex-category": "ДӀахьушйоцу агӀонаш",
        "broken-file-category": "{{#switch:{{NAMESPACE}}\n |{{ns:0}}=Болх цабеш файлийн хьажоргаш йолу агӀонаш}}",
        "about": "Цуьнах лаьцна",
        "viewtalkpage": "Хьажа дийцаре",
        "otherlanguages": "Кхечу маттахь дерш",
        "redirectedfrom": "(ДӀасахьажийна кху $1)",
-       "redirectpagesub": "АгӀо-дӀасахьажайар",
+       "redirectpagesub": "АгӀо-дӀасахьажорг",
+       "redirectto": "ДӀасахьажор тӀе:",
        "lastmodifiedat": "ХӀокху агӀон тӀаьххьаралера хийцам: $2, $1.",
        "viewcount": "ХӀокху агӀонг хьовсийна $1 {{PLURAL:$1|за}}.",
        "protectedpage": "ГӀароллийца йолу агӀо",
        "aboutpage": "Project:Цуьнах лаьцна",
        "copyright": "Чулацам лело мега $1 лицензица (кхениг билгалйина яцахь).",
        "copyrightpage": "{{ns:project}}:Авторан бакъонаш",
-       "currentevents": "ХӀинцлера хилларш",
-       "currentevents-url": "Project:ХӀинцлера хилларш",
+       "currentevents": "Ð¥Ó\80инÑ\86алеÑ\80а Ñ\85иллаÑ\80Ñ\88",
+       "currentevents-url": "Project:Ð¥Ó\80инÑ\86алеÑ\80а Ñ\85иллаÑ\80Ñ\88",
        "disclaimers": "Бехк тӀецалацар",
        "disclaimerpage": "Project:Бехк тӀецалацар",
        "edithelp": "ГӀо оцу тадарна",
        "nosuchaction": "Ишта дийриг дац",
        "nosuchactiontext": "ДӀаязйина URL нийса яц.\nURL язъеш гӀалат даьлла хила мега.\nИза кхин {{SITENAME}} пороектехь гӀалат хила мега.",
        "nosuchspecialpage": "Иштта белхан агӀо яц",
-       "nospecialpagetext": "<strong>Ð\98Ñ\88Ñ\82Ñ\82а Ð±ÐµÐ»Ñ\85ан Ð°Ð³Ó\80о Ñ\8fÑ\86.</strong>\n\nÐ\91елÑ\85ан Ð°Ð³Ó\80онаÑ\88ан могӀам: [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Ð\98Ñ\88Ñ\82Ñ\82а Ð±ÐµÐ»Ñ\85ан Ð°Ð³Ó\80о Ñ\8fÑ\86.</strong>\n\nÐ\91елÑ\85ан Ð°Ð³Ó\80онийн могӀам: [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "ГӀалат",
        "databaseerror": "ГӀалат хаамийн бухера",
        "databaseerror-text": "Хаамийн базан гӀалат даьлла.\nИза хила мега программин гӀалат.",
        "readonlytext": "АгӀонаш тӀетохар а кхин хийцамаш барна а блоктоьхна:\nБлокоьхначо биттина хаам: $1.",
        "missing-article": "ХӀокху чохь кароезаш йолу хьан дехарца йозан агӀонаш цакарийна «$1» $2.\n\nИштнарг наггахь хуьлу хьажораг дӀаяьккхина елахь я хийцам бина тиша хьажорагца дехьа гӀо гӀоьртича.\n\nНагахьсан гӀулкх цуьнах доьзна дацахь, хьуна карийна гӀирс латточехь гӀалат.\nДехар до, хаам бе оцуьнах [[Special:ListUsers/sysop|куьйгалхога]], гойтуш URL.",
        "missingarticle-rev": "(верси № $1)",
-       "missingarticle-diff": "(тейп тайпнара: $1, $2)",
+       "missingarticle-diff": "(башхалла: $1, $2)",
        "readonly_lag": "Хаамашан базина цхьана хан блоктоьхна, хаамашан базан сервераш нисялца.",
        "internalerror": "Чоьхьара гӀалат",
        "internalerror_info": "Чоьхьара гӀалат: $1",
        "invalidtitle-knownnamespace": "Магийна боцу коьртамогӀа цӀерийн меттигца «$2» йоза  «$3»",
        "invalidtitle-unknownnamespace": "Магийна боцу коьртамогӀа ца йовза меттигца $1 «$2» йозанца",
        "exception-nologin": "ХӀинца а ахьа системин чохь болх беш бац",
-       "exception-nologin-text": "Ð\98за Ð´Ð°Ð½ [[Special:Userlogin|системин чугӀо]].",
+       "exception-nologin-text": "Ð¥Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80о Ñ\82Ó\80екÑ\85аÑ\87а Ð»Ñ\83Ñ\88 Ñ\85илийÑ\82а [[Special:Userlogin|системин чугӀо]].",
        "exception-nologin-text-manual": "АгӀо тӀекхача луш хилийта оьшу $1.",
        "virus-badscanner": "Нисяран гӀалат. Ца йовза вирусийн сканер: ''$1''",
        "virus-scanfailed": "сканиран гӀалат (код $1)",
        "passwordreset-emailsent-capture": "Электронан хаам баийтина кхоьссинчу паролах лаьцна хаам чохь болуш. \nцуна йозане хьажа йиш ю лахахь.",
        "passwordreset-emailerror-capture": "Пароль кхоссаран хаам чохь болуш электронан кехат кхоьллина, цуна йоза хьажа йиш ю лахахь, амма иза {{GENDER:$2|декъашхочунга}} дӀадахьийта тар цаделира бахьнехь: $1",
        "changeemail": "Хийца электронан почта",
-       "changeemail-header": "Электронан почтан адрес хийцар",
        "changeemail-text": "Юза хӀара форма хьайн электронан почтан адрес хуьйцуш. Ахьа хийцар бакъдан язъян еза пароль.",
        "changeemail-no-info": "ХӀара агӀо лело системин чугӀо.",
        "changeemail-oldemail": "Карара электронан почтан адрес:",
        "changeemail-none": "(яц)",
        "changeemail-password": "Хьан пароль «{{SITENAME}}» проектан:",
        "changeemail-submit": "Хийца email",
-       "changeemail-cancel": "Цаоьшу",
        "changeemail-throttled": "Хьо дукха гӀиртира.\nДехар до, собар де $1 юха гӀортале.",
        "resettokens": "Токенаш кхоссар",
        "resettokens-text": "Хьан йиш ю токенаш кхосса, цара йиш хуьлуьйту цхьаболу долара хаамашна тӀекхача, уьш ю хьан дӀаяздар ца вовшахтесна. \n\nХьона иза оьшу, ахьа хьай токенаш цхьам гучу яьхна елахь я хьан аккаунт йохийна елахь.",
        "minoredit": "Жим хийцам",
        "watchthis": "Латайе хӀара агӀо тергаме могӀанан юкъахь",
        "savearticle": "Дlайазъé агlо",
-       "preview": "Хьалха муха ю хьажа",
-       "showpreview": "Хьалха муха ю хьажар",
+       "preview": "Хьалха хьажар",
+       "showpreview": "Хьалха хьажар",
        "showdiff": "Хlоттина болу хийцам",
        "blankarticle": "<strong>ДӀахьедар:</strong> Ахьа кхуллуш йолу агӀо еса ю.\nЮху кнопка «{{int:savearticle}}» тӀетаӀаяхь, агӀо цхьа чулацам боцуш кхуллур ю.",
        "anoneditwarning": "'''Тергам бе''': Ахьа хьай цӀарца тадарш деш дац. Хьан IP-адрес дӀаяздина хира ду хӀокху агӀон истори чу.",
        "last": "хьалх.",
        "page_first": "хьалхара",
        "page_last": "тlаьххьара",
-       "histlegend": "Кхетор: (хlинцлера.) — йолучу башхон къастам; (хьалх.) — хьалхлерачу башхон къастам; '''ж''' — жимо бозалца болу хийцам.",
+       "histlegend": "Кхетор: (хӀинцалера.) — йолучу башхон къастам; (хьалх.) — хьалхлерачу башхон къастам; '''ж''' — жимо бозалца болу хийцам.",
        "history-fieldset-title": "АгӀона хийцамаш",
        "history-show-deleted": "ДӀаяхинарш",
        "histfirst": "ширниш",
        "revdelete-nooldid-text": "Ахьа хӀара функци кхочушъян билгалйина яц Ӏалашонан верси (я версеш).",
        "revdelete-no-file": "Иштта файл яц.",
        "revdelete-show-file-confirm": "Бакъалла лаьий хьуна дӀаяьккхина файлан версега хьажа «<nowiki>$1</nowiki>» $2 тӀера, $3?",
-       "revdelete-show-file-submit": "Хlаъ",
+       "revdelete-show-file-submit": "ХӀаъ",
        "revdelete-selected-text": "{{PLURAL:$1|Файлан хаьржина верси|Файлан хаьржина версеш}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Файлан хаьржина верси|Файлан хаьржина версеш}} [[:$2]]:",
        "logdelete-selected": "Тептар чура {{PLURAL:$1|хаьржина дӀаяздар|хаьржина дӀаяздарш}}:",
        "searchresults-title": "Лаха «$1»",
        "titlematches": "АгӀонийн цӀераш цхьаьнанисялар",
        "textmatches": "АгӀонийн йоза цхьаьнанисдалар",
-       "notextmatches": "Агlонаш чура йозанашца цхьатера йогlуш яц",
+       "notextmatches": "АгӀонаш чура йозанашца цхьатера йогlуш яц",
        "prevn": "хьалхарнаш {{PLURAL:$1|$1}}",
        "nextn": "тӀаьхьйогӀурш {{PLURAL:$1|$1}}",
        "prevn-title": "{{PLURAL:$1|1=Хьалхара $1 дӀаяздар|Хьалхара $1 дӀаяздарш}}",
        "viewprevnext": "Хьажа ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''ХӀокху вики чохь йолуш ю ишта агӀо «[[:$1]]»'''",
        "searchmenu-new": "<strong>Кхолла «[[:$1]]» агӀо хӀокху вики-проектехь!</strong>\n{{PLURAL:$2|0=|Хьан лахарца карина.}}",
-       "searchprofile-articles": "Къаьстина агlонаш",
+       "searchprofile-articles": "Къаьстина агӀонаш",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Массанхьа",
        "searchprofile-advanced": "Шуьйра",
        "searchall": "массо",
        "showingresults": "Лахахьа {{PLURAL:$1|гойта|гойту|гойту}} <strong>$1</strong> {{PLURAL:$1|хилам|хиламаш|хиламаш}}, дlаболало кху № <strong>$2</strong>.",
        "showingresultsinrange": "Лахахь гайтина {{PLURAL:$1|<strong>1</strong> хилам}} диапазонехь <strong>$2</strong> тӀера <strong>$3</strong> кхаччалц.",
-       "showingresultsheader": "{{PLURAL:$5|1=Хилам '''$1''' кху '''$3'''|Хиламаш '''$1 — $2''' кху '''$3'''}} оцун '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Хилам <strong>$1</strong> <strong>$3</strong> нах}}",
        "search-nonefound": "Дехаре терра цхьа хӀума ца карийна.",
        "powersearch-legend": "Шуьро лахар",
        "powersearch-ns": "ЦӀерийн меттигашкахь лахар:",
        "prefs-edits": "Нисдарийн дукхалла:",
        "prefsnologintext2": "Оьшу $1, гӀирс дӀанисбан.",
        "prefs-skin": "Кечяран тема",
-       "skin-preview": "Хьалха муха ю хьажа",
+       "skin-preview": "Хьалха хьажар",
        "datedefault": "Iад йитарца",
        "prefs-labs": "Муха ю хьажарна таронаш",
        "prefs-user-pages": "Декъашхочун агӀо",
        "recentchangesdays": "Керла нисдар гайта динахь:",
        "recentchangesdays-max": "Къезиг $1 {{PLURAL:$1|дена}}",
        "recentchangescount": "Iад йитарца гойтуш долу нисдарийн дукхалла",
-       "prefs-help-recentchangescount": "Ð\93ойÑ\82Ñ\83 ÐºÐµÑ\80ла Ð½Ð¸Ñ\81даÑ\80Ñ\88, Ð°Ð³Ó\80онаÑ\88ан истори, тептарш.",
+       "prefs-help-recentchangescount": "Ð\93ойÑ\82Ñ\83 ÐºÐµÑ\80ла Ð½Ð¸Ñ\81даÑ\80Ñ\88, Ð°Ð³Ó\80онийн истори, тептарш.",
        "prefs-help-watchlist-token2": "Иза хьан тергаме могӀан къайла догӀа ду.\nМуьлха и хуучунна йиш ю хьан тергаме могӀам беша, цундела ма хаийта иза кхечаьрга. [[Special:ResetTokens|ТӀетаӀа йе кхуза и хьайга кхосса лууш делахь]].",
        "savedprefs": "Хьан гӀирс Ӏалашбина.",
        "timezonelegend": "Сахьтан аса:",
        "timezoneuseoffset": "Кхин (билгалде дӀахилар)",
        "servertime": "Сервера хан:",
        "guesstimezone": "Юза браузеран чура",
+       "timezoneregion-africa": "Африка",
+       "timezoneregion-america": "Америка",
+       "timezoneregion-antarctica": "Антарктика",
+       "timezoneregion-arctic": "Арктика",
        "timezoneregion-asia": "Ази",
        "timezoneregion-atlantic": "Атлантикан океан",
        "timezoneregion-australia": "Австрали",
+       "timezoneregion-europe": "Европа",
        "timezoneregion-indian": "Индин океан",
        "timezoneregion-pacific": "Тийна океан",
        "allowemail": "Магийта декъашхошна хьайга электрони почтехула кехат кхехьийта",
        "prefs-files": "Файлаш",
        "prefs-custom-css": "Долахь йолу CSS",
        "prefs-custom-js": "Долахь йолу JS",
-       "prefs-common-css-js": "ЮкÑ\8aаÑ\80а CSS/JS Ð¼Ð°Ñ\81Ñ\81о ÐºÐµÑ\87 Ð´Ð°Ñ\80ан Ñ\82емаÑ\88ан:",
+       "prefs-common-css-js": "ЮкÑ\8aаÑ\80а CSS/JS Ð¼Ð°Ñ\81Ñ\81о ÐºÐµÑ\87 Ð´Ð°Ñ\80ан Ñ\82емийн:",
        "prefs-reset-intro": "ХӀара агӀо лело мега ахьа нисбина гӀирс Ӏад битарца юха бокхуш.\nХӀара дешдерг кхочушъ динчул  тӀехьа хьан йиш хир-яц и юха меттахӀотто.",
        "prefs-emailconfirm-label": "Электронан почта бакъ яр:",
        "youremail": "Электронан почта:",
        "prefs-timeoffset": "Хенан  гӀирс",
        "prefs-advancedediting": "Юкъара параметреш",
        "prefs-editor": "Тадар",
-       "prefs-preview": "Хьалха муха ю хьажар",
+       "prefs-preview": "Хьалха хьажар",
        "prefs-advancedrc": "Кхин гӀирс нисбар",
        "prefs-advancedrendering": "Кхин гӀирс нисбар",
        "prefs-advancedsearchoptions": "Кхин гӀирс нисбар",
        "prefs-advancedwatchlist": "Кхин гӀирс нисбар",
        "prefs-displayrc": "Гуш болу гӀирсаш",
        "prefs-displaywatchlist": "Гуш болу гӀирсаш",
+       "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Башхон верси",
        "prefs-help-prefershttps": "И хийцам болх байта юхугӀо системин чу.",
        "email-address-validity-valid": "Го нийса",
        "userrights-nologin": "Куьйгалхочунна бакъо йолу [[Special:UserLogin|дӀаяздарца]] ло декъашхочун бакъо.",
        "userrights-notallowed": "Хьан дӀаяздарца магийна дац декъашхошна бакъо яла а дӀаяккха а.",
        "userrights-changeable-col": "Хьона хийца луш йолу бакъонаш",
-       "userrights-unchangeable-col": "Хьона хийца луш йоцу бакъонаш",
+       "userrights-unchangeable-col": "Хьуна хийца луш йоцу бакъонаш",
        "group": "Тоба:",
        "group-user": "Декъашхой",
        "group-autoconfirmed": "Ша тӀелаьцболу декъашхой",
        "right-createtalk": "Дийцаре агӀонаш кхоллар",
        "right-createaccount": "декъашхошна керла дӀаяздарш кхоллар",
        "right-minoredit": "«къезиг хийцам» аьлла билгало хӀоттор",
-       "right-move": "Ð\90гÓ\80онаÑ\88ан цӀераш хийцар",
-       "right-move-subpages": "Ð\90гÓ\80онаÑ\88ан цӀераш хийцар цера бухара агӀонашцан",
+       "right-move": "Ð\90гÓ\80онийн цӀераш хийцар",
+       "right-move-subpages": "Ð\90гÓ\80онийн цӀераш хийцар цера бухара агӀонашцан",
        "right-move-rootuserpages": "декъашхочун ораман агӀонийн цӀераш хийцар",
        "right-move-categorypages": "Категорийн агӀонийн цӀераш хийцар",
        "right-movefile": "Файлийн цӀе хийцар",
-       "right-suppressredirect": "агÓ\80она Ñ\86Ó\80е Ñ\85Ñ\83Ñ\8cйÑ\86Ñ\83Ñ\88 Ñ\88иÑ\80Ñ\87Ñ\83 Ñ\86Ó\80аÑ\80аÑ\85 Ð¼Ð° ÐºÑ\85олла Ð´Ó\80аÑ\81аÑ\85Ñ\8cажаÑ\8fÑ\80",
+       "right-suppressredirect": "агÓ\80она Ñ\86Ó\80е Ñ\85Ñ\83Ñ\8cйÑ\86Ñ\83Ñ\88 Ñ\88иÑ\80Ñ\87Ñ\83 Ñ\86Ó\80аÑ\80аÑ\85 Ð¼Ð° ÐºÑ\85олла Ð´Ó\80аÑ\81аÑ\85Ñ\8cажоÑ\80г",
        "right-upload": "Файлаш чуйаьхар",
        "right-reupload": "йолуш йолу чера тӀехула файлаш дӀаязъяр",
        "right-reupload-own": "тохарлеррачу декъашхочо файлаш юху дӀаязъяр",
        "recentchanges-label-bot": "ХӀара нисдар шаболх бечо дина",
        "recentchanges-label-unpatrolled": "ХӀара нисдар хӀинца цхьано патрулировать дина дац",
        "recentchanges-label-plusminus": "байташкахь барам хийцар",
+       "recentchanges-legend-heading": "'''Легенда:&nbsp;'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])",
        "rcnotefrom": "Лахахь гайтина тӀера <strong>$2</strong> (хийцамаш <strong>$1</strong> кӀезиг).",
        "rclistfrom": "Гайта хийцам $3 $2 хан",
        "rcshowhidemine-show": "Гайта",
        "rcshowhidemine-hide": "Къайладаха",
        "rclinks": "Гайта тӀаьхьара $1 хийцамаш $2 ден<br />$3",
-       "diff": "тейп тайпнара",
+       "diff": "башхалла",
        "hist": "истори",
        "hide": "Къайлаяккха",
        "show": "Гайта",
        "recentchangeslinked-feed": "Кхуьнца долу нисдарш",
        "recentchangeslinked-toolbox": "Кхуьнца долу нисдарш",
        "recentchangeslinked-title": "Кхуьнца долу нисдарш $1",
-       "recentchangeslinked-summary": "Ð¥Ó\80аÑ\80а Ñ\85ийÑ\86ам Ð±Ð¸Ð½Ð°Ñ\87Ñ\83 Ð°Ð³Ó\80онаÑ\88ан Ð¼Ð¾Ð³Ó\80ам Ð±Ñ\83, Ñ\82Ó\80еÑ\82овжаÑ\80 Ð´Ð¾Ð»Ñ\83Ñ\88 Ñ\85Ñ\8cагÑ\83Ñ\87Ñ\83 Ð°Ð³Ó\80он (йа Ñ\85Ñ\8cагойÑ\82Ñ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83Ñ\87Ñ\83 ÐºÐ°Ñ\82егоÑ\80ена).\nÐ\90гÓ\80онаÑ\88 Ñ\8eÑ\8cкÑ\8aайогӀуш йолу хьан [[Special:Watchlist|тергаме могӀам чохь]] '''къастийна ю'''.",
+       "recentchangeslinked-summary": "Ð¥Ó\80аÑ\80а Ñ\85ийÑ\86ам Ð±Ð¸Ð½Ð°Ñ\87Ñ\83 Ð°Ð³Ó\80онийн Ð¼Ð¾Ð³Ó\80ам Ð±Ñ\83, Ñ\82Ó\80еÑ\82овжаÑ\80 Ð´Ð¾Ð»Ñ\83Ñ\88 Ñ\85Ñ\8cагÑ\83Ñ\87Ñ\83 Ð°Ð³Ó\80он (Ñ\8f Ñ\85Ñ\8cагойÑ\82Ñ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83Ñ\87Ñ\83 ÐºÐ°Ñ\82егоÑ\80ена).\nÐ\90гÓ\80онаÑ\88 Ñ\8eÑ\8cкÑ\8aа йогӀуш йолу хьан [[Special:Watchlist|тергаме могӀам чохь]] '''къастийна ю'''.",
        "recentchangeslinked-page": "АгӀон цӀе:",
        "recentchangeslinked-to": "Кхечу агӀор, гайта хийцамаш агӀонашца, хӀоттийначу агӀонтӀе хьажораг йолуш",
        "upload": "Файл чуяккхар",
        "license-header": "Бакъойалар",
        "nolicense": "Яц",
        "licenses-edit": "Лицензин параметраш хийца",
-       "license-nopreview": "(Хьалха муха ю хьажа цало)",
+       "license-nopreview": "(Хьалха хьажа цало)",
        "upload_source_url": "(ахьа хаьржина нийса, массо тӀекхочу интернет-адрес)",
        "upload_source_file": "(файл хьан компьютер чохь ю)",
        "listfiles-delete": "дӀаяккха",
        "randompage": "Цахууш нисъелла агӀо",
        "randomincategory": "Категори чу цахууш нисъелла  агӀо",
        "randomincategory-nopages": "[[:Category:$1]] категори чохь агӀонаш яц.",
-       "randomincategory-selectcategory": "Категори чу цахууш нийса елла агӀона чу гӀо: $1 $2.",
-       "randomincategory-selectcategory-submit": "Дехьа гӀо",
+       "randomincategory-category": "Категори:",
+       "randomincategory-legend": "Категори чу цахууш нисъелла  агӀо",
        "randomredirect": "Цахууш нисделла дIасахьажор",
        "randomredirect-nopages": "«$1» цӀерийн меттиган чохь дӀасахьажораш яц.",
        "statistics": "Статистика",
        "statistics-header-pages": "АгӀонийн жамӀ",
-       "statistics-header-edits": "Ð\9dиÑ\81даÑ\80ан Ð¶Ð°Ð¼Ó\80",
+       "statistics-header-edits": "Ð\9dиÑ\81даÑ\80ийн Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ика",
        "statistics-header-views": "Хьажаран статистика",
-       "statistics-header-users": "Декъашхойн жамӀа",
+       "statistics-header-users": "Декъашхойн статистика",
        "statistics-header-hooks": "Кхин статистика",
        "statistics-articles": "Яззамаш",
        "statistics-pages": "АгӀонаш",
-       "statistics-pages-desc": "Массо вики агlонаш, дийцаре агlонашцани, дlасахьаждарш а кхин дерш.",
+       "statistics-pages-desc": "Массо вики агӀонаш, дийцаре агӀонашцани, дӀасахьаждарш а кхин дерш.",
        "statistics-files": "Чуяьхна файлаш",
        "statistics-edits": "Нисдаран дукхалла {{grammar:genitive|{{SITENAME}}}} дlа йолайаларца",
-       "statistics-edits-average": "ЮккÑ\8aеÑ\80а Ð°Ð³Ó\80онан Ð½Ð¸Ñ\81даÑ\80ан Ñ\82еÑ\80аÑ\85Ñ\8c",
+       "statistics-edits-average": "Ð\90гÓ\80онан Ð½Ð¸Ñ\81даÑ\80ийн Ñ\8eкÑ\8aаÑ\80а Ð´Ñ\83кÑ\85алла",
        "statistics-views-total": "Массо хьажарш",
        "statistics-views-total-desc": "Ма лара дӀаяьхна а белхан а агӀонашка хьажар",
        "statistics-views-peredit": "Нисдаре хьажарш",
-       "statistics-users": "[[Ð\92Ð\9f\94Ó\80аÑ\8fзвалар|ДӀаязбелларш]] берриге декъашхой чохь болу [[Special:ListUsers|(могӀам)]]",
+       "statistics-users": "[[Ð\92Ð\9f\94Ó\80аÑ\8fзбаллар|ДӀаязбелларш]] берриге декъашхой чохь болу [[Special:ListUsers|(могӀам)]]",
        "statistics-users-active": "Жигара декъашхой",
        "statistics-users-active-desc": "Декъашхой, муьлха цхьа хӀум дина болу, кху {{PLURAL:$1|1=тӀаьххьара $1 динахь|тӀаьххьара $1 дийнахь}}",
        "statistics-mostpopular": "Дукху хьоьжу агӀонаш",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "ncategories": "$1 {{PLURAL:$1|категори|категореш}}",
        "ninterwikis": "$1 {{PLURAL:$1|1=юкъарвики-хьажораг|юкъарвики-хьажоргаш}}",
-       "nlinks": "$1 {{PLURAL:$1|1=хьажораг|хьажоргаш}}",
+       "nlinks": "$1 {{PLURAL:$1|хьажорг}}",
        "nmembers": "$1 {{PLURAL:$1|хӀума|хӀумнаш}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|хӀума|хӀумнаш}}",
        "nrevisions": "$1 {{PLURAL:$1|верси|версеш}}",
        "mostinterwikis": "Дуккха юкъарвики хьажоргаш тӀе тоьхна йолу агӀонаш",
        "mostrevisions": "Сих сиха нисйина йолу агӀонаш",
        "prefixindex": "Хьалха агӀонийн цӀераш хӀотто еза",
-       "prefixindex-namespace": "Ð¥Ñ\8cалÑ\85а Ð°Ð³Ó\80онаÑ\88ан цӀераш хӀотто еза («{{ns:$1}}»)",
+       "prefixindex-namespace": "Ð¥Ñ\8cалÑ\85а Ð°Ð³Ó\80онийн цӀераш хӀотто еза («{{ns:$1}}»)",
        "prefixindex-strip": "Хиламийн могӀам чура префикс къайлаяккха",
        "shortpages": "Боца яззамаш",
        "longpages": "Беха яззамаш",
        "usercreated": "{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2",
        "newpages": "Керла агӀонаш",
        "newpages-username": "Декъашхо:",
-       "ancientpages": "ЯззамаÑ\88 Ð¾Ñ\86Ñ\83 Ñ\82еÑ\80аÑ\85Ñ\8cÑ\86а Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\82адаÑ\80 Ð´Ð¸Ð½Ð° Ð´Ð¾Ð»Ñ\83",
+       "ancientpages": "ТÓ\80еÑ\85Ñ\8cаÑ\80а Ñ\82еÑ\80аÑ\85Ñ\8cÑ\86а Ñ\82адаÑ\80 Ð´Ð¸Ð½Ð° Ñ\8fззамаÑ\88",
        "move": "ЦӀе хийца",
        "movethispage": "ХӀокху агӀон цӀе хийца",
        "unusedimagestext": "Дехар до, тидаме эца, кхин йолу дуьнана машан-меттигаш а лелош хила мега нийсса йогӀу хьажораг (URL) хӀокху хӀуман, хӀокху могӀаме йогӀуш ялахь яцахь а иза хила мега жигара лелош.",
        "suppress": "Хьулдар",
        "booksources": "Жайнан хьосташ",
        "booksources-search-legend": "Жайнех лаьцна хаам лахар",
-       "booksources-go": "Лаха",
+       "booksources-search": "Лаха",
        "specialloguserlabel": "Декъашхо:",
        "speciallogtitlelabel": "Ӏалашо (цӀе я декъашхо):",
        "log": "Тéптарш",
        "allpagesfrom": "Гучé яха агӀонаш, йолалуш йолу оцу:",
        "allpagesto": "Арайахар сацадé оцу:",
        "allarticles": "Массо агӀонаш",
-       "allinnamespace": "Массо агlонаш оцу цlери анахь «$1»",
+       "allinnamespace": "Массо агӀонаш оцу цӀерийн анахь «$1»",
        "allpagessubmit": "Кхочушдé",
        "allpagesprefix": "Лаха агӀонаш, дӀайолалуш йолу:",
        "allpagesbadtitle": "Цамагош йолу агӀон цӀе. Коьрта могӀан юкъах ю юкъарвики меттанашан юкъе тӀечӀагӀйина йолу хьаьрк йа магийна доцу оцу коьрта моӀанца символаш йа кхин.",
        "allpages-bad-ns": "{{SITENAME}} кху чохь ана цӀераш яц «$1».",
        "allpages-hide-redirects": "Къайлаяха дӀасахьажийнарш",
+       "cachedspecial-viewing-cached-ttl": "Хьо хьоьжу агӀона верси кэш чура ю, иза карлаяьккхина хила мега $1 хьалха.",
        "cachedspecial-refresh-now": "Хьажа тӀехьарчу версега.",
        "categories": "Категореш",
        "categoriespagetext": "{{PLURAL:$1|1=Лахара категореш чохь ю|Лахара категореш чохь ю}} агӀонаш я медиа-файлаш.\nКхузахь гойтуш яц [[Special:UnusedCategories|лелош йоцу категореш]].\nКхин дӀа [[Special:WantedCategories| хийла еза категореш]].",
        "watchlist-details": "Хьан тергаме могӀанца $1 {{PLURAL:$1|агӀо}} ю, дийцаре агӀонаш йоцуш.",
        "wlheader-enotif": "Электронан почте хаамаш байтар латина ду.",
        "wlheader-showupdated": "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
-       "wlnote": "Лахахьа {{PLURAL:$1|тlаьхьа богlу $1 хийцам|тlаьхьа богlу $1 хийцамаш|тlаьхьа богlу $1 хийцамаш}} хlокху {{PLURAL:$2|тlаьхьар|тlаьхьара|тlаьхьара}} <strong>$2</strong> {{PLURAL:$2|сохьт|сохьатехь|сохьташкахь}}.",
-       "wlshowlast": "Гайта тӀаьххьара $1 сахьт $2 де $3",
+       "wlnote": "Лахахьа {{PLURAL:$1|тӀаьхьабогӀу $1 хийцам|тӀаьхьабогӀу $1 хийцамаш}} хӀокху {{PLURAL:$2|тӀаьхьар}} <strong>$2</strong> {{PLURAL:$2|сахьтехь}}.",
+       "wlshowlast": "Гайта тӀаьххьара $1 сахьт $2 де",
        "watchlist-options": "Тергаме могlаман гlирс нисбар",
        "watching": "Тергаме мlогаман юкъаяккха…",
        "unwatching": "Тергаме могӀанан чура дӀаяккхар…",
        "exbeforeblank": "чуьраниг дlацlанйале хьалха: «$1»",
        "delete-confirm": "$1 — дӀаяккхар",
        "delete-legend": "ДӀаяккхар",
-       "historywarning": "'''Тергам:''' хӀокху агӀона герггарчу хьесапехь $1 {{PLURAL:$1|версеш|верси|верси}} ю:",
+       "historywarning": "<strong>Тергам бе:</strong> Хьо дӀаяккха гӀертачу агӀона, нисдарийн истори ю, $1 {{PLURAL:$1|верси}} йолуш:",
        "confirmdeletetext": "Хьо гӀерта агӀо я файл дӀаяккха '''дехар до''', дӀаяккхале хьалха хьажа [[{{MediaWiki:Policy-url}}|кхуза]].",
        "actioncomplete": "Дешдерг кхочушдина",
        "actionfailed": "Кхочушъ дина дац",
        "deletecomment": "Бахьна:",
        "deleteotherreason": "Кхин бахьна/тӀетохар:",
        "deletereasonotherlist": "Кхин бахьна",
-       "deletereason-dropdown": "* Даржина долу дӀаяккхаран баьхьанаш \n** зулма  \n** авторан лаамца\n** авторан бакъонаш талхор",
+       "deletereason-dropdown": "* Даржина долу дӀаяккхаран баьхьанаш \n** спам\n** зулма  \n** авторан лаамца\n** авторан бакъонаш талхор\n** болх цабо дӀасхьажорг",
        "delete-edit-reasonlist": "Бахьанин могӀам нисбар",
        "deleting-backlinks-warning": "'''ДӀахьедар:''' Ахьа дӀайоккхуш йолчун тӀе товжийна [[Special:WhatLinksHere/{{FULLPAGENAME}}|кхин агӀонаш]] ю.",
        "rollback": "Юхабаккха хийцам",
        "rollbackfailed": "Юхайоккхуш гӀалат ду",
        "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}}]]).",
        "editcomment": "Хийцамаш барна гайтина бахьна: ''$1''.",
-       "revertpage": "Ð\9dиÑ\81даÑ\80Ñ\88 [[Special:Contributions/$2|$2]] ([[User talk:$2|дийÑ\86аÑ\80е]]) Ñ\8eÑ\85а Ð´Ð°Ñ\8cÑ\85на Ð±Ð°Ñ\88Ñ\85аллийн [[User:$1|$1]]",
-       "revertpage-nouser": "Ð\9dиÑ\81даÑ\80Ñ\88 (декÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\86Ó\80е Ñ\85Ñ\8cÑ\83лйина) Ñ\8eÑ\85адаÑ\8cÑ\85ина Ð±Ð°Ñ\88Ñ\85аллин {{GENDER:$1|[[User:$1|$1]]}}",
+       "revertpage": "Ð\9dиÑ\81даÑ\80Ñ\88 [[Special:Contributions/$2|$2]] ([[User talk:$2|дийÑ\86аÑ\80е]]) Ñ\8eÑ\85а Ð´Ð°Ñ\8cÑ\85на Ð²ÐµÑ\80Ñ\81ин [[User:$1|$1]]",
+       "revertpage-nouser": "Ð\9dиÑ\81даÑ\80Ñ\88 (декÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\86Ó\80е Ñ\85Ñ\8cÑ\83лйина) Ñ\8eÑ\85адаÑ\8cÑ\85ина Ð²ÐµÑ\80Ñ\81ин {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Юхадаьхна $1; нисдарш, $2 версен.",
        "sessionfailure-title": "Сеансан гӀалат",
        "sessionfailure": "Карара белхан сеансан гӀалат деллачух тера ду;\nиза дешдерг сацийна «сеанс долаерзийтта».\nДехар до, тӀетаӀе «ЮхугӀо» кнопка, кхин агӀо карлаяккха.",
        "protect-expiring": "чакхйолу $1 (UTC)",
        "protect-expiring-local": "чекхйолу $1",
        "protect-expiry-indefinite": "хан чаккхе йоцуш",
-       "protect-cascade": "Гlаролла йé агlонаш, хlокху агlонца хlоттайелларш (чахчарé гlаролла)",
+       "protect-cascade": "ГӀаролла йé агӀонаш, хӀокху агӀонца хӀоттайелларш (чахчарé гӀаролла)",
        "protect-cantedit": "Хьéга хийцам цабало хӀокху агӀон гlаролли локхалан, хӀуд аьлча хьан бакъо яц оцунна тадар дан.",
        "protect-othertime": "Кхин хан:",
        "protect-othertime-op": "кхин хан",
+       "protect-existing-expiry": "Карара чекхйолу хан: $2, $3",
        "protect-otherreason": "Кхин бахьна/тӀетохар:",
        "protect-otherreason-op": "Кхин бахьна",
        "protect-dropdown": "* ГӀоралла дарна баьхьаш \n** сих-сиха зулам дар \n** дуккха спам хилар\n** нисдарийн тӀом \n** гӀараялл агӀо",
        "restriction-level": "ТӀекхочаран локхалла:",
        "minimum-size": "Лаххара бараме",
        "maximum-size": "Лаккхара бараме:",
+       "pagesize": "(байт)",
        "restriction-edit": "Тадар",
        "restriction-move": "ЦӀе хийцар",
        "restriction-create": "Кхоллар",
        "viewdeletedpage": "ДӀаяьхна йолу агӀонашка хьажар",
        "undelete-fieldset-title": "МеттахӀоттае версеш",
        "undeleteextrahelp": "Ерриге агӀонан истори меттахӀоттая массо а билгалонаш еса а йити '''«{{int:undeletebtn}}»''' тӀетаӀае.\nЦхӀайолу агӀонан версеш меттахӀоттая хьалха меттахӀоттош йолу версеш билгалъяьхна тӀетагӀе '''«{{int:undeletebtn}}»'''.",
+       "undeleterevisions": "$1 {{PLURAL:$1|верси}} архив чу {{PLURAL:$1|йиллина}}",
        "undeletehistory": "Агӏо меттахӏотта йича цуьнан хийцаман истори меттахӏотта ло.\nАгӏо дӏаяккхинчул тӏяха юху кхолийна елахь меттахӏоттина йолу версеш гучуер ю керлачу версешна хьалха",
        "undeleterevdel": "Метта хlоттор хира дац, нагахь иза дакъошкахь дlадайина далахь а тlаьххьара кисак башхо йа хlума.\nИштнарг хилча ахьа дlабаккха беза хlоттийна болу къастам йа хьагайта тlаьххьара дlайайина башхо.",
        "undelete-revision": "Декъашхочун $3 дӀаяьккхина верси $1 (цу $4 $5 хан):",
+       "undelete-nodiff": "Хьалхалера версеш цакарий.",
        "undeletebtn": "МеттахӀоттае",
        "undeletelink": "хьажа/меттахӀоттае",
        "undeleteviewlink": "хьажа",
        "undeleteinvert": "Къастае массо",
        "undeletecomment": "Бахьна:",
        "undeletedrevisions": "{{PLURAL:$1|меттахӀоттайина}} $1 {{PLURAL:$1|хийцам}}",
+       "undeletedrevisions-files": "меттахӀоьттина $1 {{PLURAL:$1|верси}} а $2 {{PLURAL:$2|файл}} а",
        "undeletedfiles": "$1 {{PLURAL:$1|файл меттахӀоттайина|файлаш меттахӀоттайина}}",
        "cannotundelete": "ГӀалат меттахӀоттайина:\n$1",
        "undeletedpage": "'''МеттахӀоттайина агӀо «$1».'''\n\nДӀадяхнарш долу могӀане [[Special:Log/delete|тéптаре хьажа]].",
        "undelete-error": "АгӀо меттахӀоттаяран гӀалат",
        "undelete-error-short": "Файл меттахӀоттаяран гӀалат: $1",
        "undelete-error-long": "Файл меттахӀоттош гӀалат даьлла:\n\n$1",
-       "undelete-show-file-submit": "Хlаъ",
+       "undelete-show-file-submit": "ХӀаъ",
        "namespace": "Цlерийн ана:",
        "invert": "Хаьржинарг къайлаяккха",
-       "tooltip-invert": "Ð¥Ó\80оÑ\82Ñ\82ае Ñ\85Ó\80аÑ\80а Ð±Ð¸Ð»Ð³Ð°Ð»Ð¾, Ñ\85аÑ\8cÑ\80жинÑ\87Ñ\83 Ñ\86Ó\80еÑ\80ийн Ð¼ÐµÑ\82Ñ\82иган Ð°Ð³Ó\80онаÑ\88ан хийцамаш къайлабаха (кхин дихкина цӀерийн меттигаш, гайтина елахь)",
+       "tooltip-invert": "Ð¥Ó\80оÑ\82Ñ\82ае Ñ\85Ó\80аÑ\80а Ð±Ð¸Ð»Ð³Ð°Ð»Ð¾, Ñ\85аÑ\8cÑ\80жинÑ\87Ñ\83 Ñ\86Ó\80еÑ\80ийн Ð¼ÐµÑ\82Ñ\82иган Ð°Ð³Ó\80онийн хийцамаш къайлабаха (кхин дихкина цӀерийн меттигаш, гайтина елахь)",
        "namespace_association": "Йихкина меттиг",
        "tooltip-namespace_association": "ХӀоттае хӀара билгало, иштта дийцарийн (я кхин) цӀерийн меттиг юкъахь хилийта",
        "blanknamespace": "(Коьрта)",
        "contributions-title": "{{GENDER:$1|Декъашхочун}} къинхьегам $1",
        "mycontris": "Сан къинхьегам",
        "contribsub2": "Къинхьегам $1 ($2)",
-       "contributions-userdoesnotexist": "«$1» Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð´Ó\80аÑ\8fздаÑ\80 Ð´Ó\80аÑ\8fздина Ñ\8fц.",
+       "contributions-userdoesnotexist": "«$1» Ð¸Ñ\88Ñ\82а Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð´Ó\80аÑ\8fздаÑ\80 Ð´Ð°ц.",
        "nocontribs": "Дехарца хийцамаш цакарий.",
        "uctop": "(карара)",
-       "month": "Ð\91аÑ\82Ñ\82аÑ\86а (я хьалхе):",
+       "month": "Ð\91аÑ\82Ñ\82аÑ\87оÑ\85Ñ\8c (я хьалхе):",
        "year": "Шерачохь (я хьалхе):",
        "sp-contributions-newbies": "Гайта бекъ къинхьегам, керла дlабазбиначара бина болу",
        "sp-contributions-newbies-sub": "Керла декъашхойн дӀаяздаршкара",
+       "sp-contributions-newbies-title": "Дукху хан йоцуш кхоьллинчу декъашхойн дӀаяздарийн къинхьегам",
        "sp-contributions-blocklog": "блоктоьхарш",
        "sp-contributions-suppresslog": "Декъашхочун дӀабаьккхина къинхьегам",
        "sp-contributions-deleted": "дӀадяхна нийсдарш",
        "linkshere": "ТӀаьхьайогӀу агӀонаш оцу '''[[:$1]]''': хьажорагца ю",
        "nolinkshere": "ХӀокху '''[[:$1]]''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.",
        "nolinkshere-ns": "Хаьржинчу анахь яц '''[[:$1]]''' цӀе йолу агӀонаш",
-       "isredirect": "агÓ\80о-дÓ\80аÑ\81аÑ\85Ñ\8cажайаÑ\80",
+       "isredirect": "агÓ\80о-дÓ\80аÑ\81аÑ\85Ñ\8cажоÑ\80г",
        "istemplate": "юкъаялийнарш",
        "isimage": "Файлан хьажораг",
        "whatlinkshere-prev": "{{PLURAL:$1|1=хьалхайодарг|хьалхайодарш}} $1",
        "whatlinkshere-links": "← хьажоргаш",
        "whatlinkshere-hideredirs": "$1 дӀасахьажорш",
        "whatlinkshere-hidetrans": "$1 латораш",
-       "whatlinkshere-hidelinks": "$1 хьажоргаш",
+       "whatlinkshere-hidelinks": "$1 хьажорг",
        "whatlinkshere-hideimages": "$1 файлийн хьажоргаш",
        "whatlinkshere-filters": "Литтарш",
        "autoblockid": "Ша блоккхетар #$1",
        "block": "Декъашхочун блоктохар",
        "unblock": "ДекъашхонтӀера блокдӀаякхар",
-       "blockip": "Блоктоха",
+       "blockip": "Блоктоха {{GENDER:$1|декъашхочун}}",
        "blockip-legend": "Декъашхочун блоктохар",
        "blockiptext": "Бухахь йолу форманца блоктоха IP-адресна цунтӏера дӏаяздарш ца дайта.\nБлоктоха магийна цо зенаш деш делахь кхин хӏокху [[{{MediaWiki:Policy-url}}|низам ца]].\nЛахахь билгалде блоктохарна бахьна.",
        "ipaddressorusername": "IP-адрес я декъашхочун цӀе:",
        "ipb-unblock-addr": "ДӀаякхаблок $1",
        "ipb-unblock": "дӀаякхаблок декъашхонтӀера я IP-адрес тӀера",
        "ipb-blocklist": "Блоктоьхнарш",
-       "ipb-blocklist-contribs": "Декъашхочун къинхьегам $1",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} къинхьегам",
        "unblockip": "ДӀаякхаблок декъашхонтӀера",
        "unblockiptext": "Лелае лахара форма IP-адрес тӀера я декъашхойн дӀаяздар тӀера блокдӀайокхуш.",
        "ipusubmit": "ДIаяккха хӀара блок",
        "noautoblockblock": "ша блоктухарг дӏаяйина",
        "createaccountblock": "цамагдо керла дӀаяздарш кхоллар",
        "emailblock": "цамаго кехаташ кхехӀита",
-       "blocklist-nousertalk": "шин дийцаре агӀо тая лууш дац",
+       "blocklist-nousertalk": "шин дийцаре агӀо таян луш дац",
        "ipblocklist-empty": "Блоктохаран могӀам баьсса бу.",
        "ipblocklist-no-results": "И адрес блоктоьхна дац.",
        "blocklink": "блоктоха",
        "block-log-flags-nocreate": "цамагдо керла дӏаяздарш кхоллар",
        "block-log-flags-noautoblock": "ша блоктухарг дӏаяйина",
        "block-log-flags-noemail": "цамаго кехаташ кхехӀита",
-       "block-log-flags-nousertalk": "шин дийцаре агӀо тая лууш дац",
+       "block-log-flags-nousertalk": "шин дийцаре агӀо таян луш дац",
        "block-log-flags-angry-autoblock": "латина шуьйра автоблоктохар",
        "block-log-flags-hiddenname": "декъашхочун цӀе къайлаяьккхина",
        "range_block_disabled": "Куьйгалхошна диапазонашна блоктоха цамага до.",
        "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": "Цle хийца хlокху агlон",
+       "movearticle": "ЦӀе хийца хӀокху агӀон",
        "moveuserpage-warning": "'''Тергам бе.''' Хьо декъашхочун агӀона цӀе хийца гӀерта. Дехар до, тергам бе, декъашхочун агӀона цӀе бен хийца лур яц, декъашхочун дӀаяздаран цӀе хийца лур яц.",
        "movecategorypage-warning": "<strong>ДӀахьедар:</strong> Хьо категорин агӀон цӀе хийца гӀерта. Дехар до, терго йе, хӀокху агӀона бен цӀе хуьйцур яц, шира чу категори чура массо агӀонаш керла категори чу йохур <em>яц</em>.",
        "movenologintext": "АгӀона цӀе хийца [[Special:UserLogin|системин чугӀо]].",
        "movepage-moved-noredirect": "ДӀасхьажорг кхоллар дохина.",
        "articleexists": "ХӀарасанна цӀе йолу агӀо йолуш ю йа ахьа гойтуш йолу цӀе магош яц.\nДехар до, харжа кхин цӀе.",
        "movetalk": "Цуьнца йогӀуш йолу дийцаре агӀон цӀе хийцар",
-       "move-subpages": "ЦӀeрш хийцае бухара агӀонаши ($1 кхаччалц)",
-       "move-talk-subpages": "ЦÓ\80е Ñ\85ийÑ\86а Ð±Ñ\83Ñ\85аÑ\80а Ð°Ð³Ó\80онаÑ\88и Ð° Ð°Ð³Ó\80онаÑ\88ан дийцаре а ($1  кхаччалц)",
+       "move-subpages": "ЦӀераш хийца бухара агӀонийн ($1 кхаччалц)",
+       "move-talk-subpages": "ЦÓ\80е Ñ\85ийÑ\86а Ð±Ñ\83Ñ\85аÑ\80а Ð°Ð³Ó\80онийн Ð° Ð°Ð³Ó\80онийн дийцаре а ($1  кхаччалц)",
        "movepage-page-exists": "Агӏо $1 йолуш ю цундела и ша юху дӏаязъян йиш яц.",
        "movepage-page-moved": "АгӀона $1 цӀе хийцина → $2.",
        "movelogpage": "ЦӀераш хийцаран тептар",
        "revertmove": "юхаяккха",
        "delete_and_move": "Цle а хуьйцуш дӀаяккха",
        "delete_and_move_text": "== ДӀаяккха хьокъ ю ==\nИ цӀе йолу аг1о «[[:$1]]» йолуш ю. \nЛаьий хьуна и дӀаяккха, цӀе хийца таро хилийта?",
-       "delete_and_move_confirm": "Хlаъ, дӀаяккха хlара агlо",
+       "delete_and_move_confirm": "ХӀаъ, дӀаяккха хӀара агӀо",
        "delete_and_move_reason": "ДӀаяьккхина цӀе хийца я таро хилийта  «[[$1]]»",
        "selfmove": "АгӀона цӏе хийца йиш яц: и цӏе хӏокху агӏона йолуш ю.",
        "immobile-source-page": "ХӀокху агӏона цӏе хийца йиш яц.",
        "thumbnail_image-missing": "$1 файл йоцчух тера ду",
        "import": "АгӀонаш чуяхар",
        "importinterwiki": "Викиюкъахь-импорт",
-       "import-interwiki-source": "Вики-хьост/агlо:",
+       "import-interwiki-sourcewiki": "ДӀайолалун вики-проект:",
+       "import-interwiki-sourcepage": "ДӀайолалун агӀо:",
        "import-interwiki-history": "ХӀокху агӀона ерриг хийцаман истори копи ян",
        "import-interwiki-templates": "Юкъайихка массо кепаш",
        "import-interwiki-submit": "Импорт ян",
        "importnopages": "Импорт ян агӀонаш яц.",
        "imported-log-entries": "{{PLURAL:$1|Тептар чура импорт дина $1 дӀаяздар|Тептар чура импорт дина $1 дӀаяздарш}}.",
        "importfailed": "Импорт ян цаелира: $1",
+       "importunknownsource": "Импорт еш йолу агӀона цадевза тайп",
        "importcantopen": "Цатарло импорт еш йолу файл елла.",
        "importbadinterwiki": "Нийса йоцу юкъаравики-хьажорг",
        "importsuccess": "Импорт яр кхочушдина!",
        "import-error-interwiki": "«$1» агӀо импорт ца йина, цуна цӀе арахьара хьажоргашна (юкъаравикешна) кечйина хилар бахьнехь.",
        "import-error-special": "«$1» агӀо импорт йина яц, и къастина цӀерийн меттигийн юкъайогӀуш хиларна.",
        "import-error-invalid": "«$1» агӀо импорт цайина, оцунна импорт еш йолу цӀе хӀокху вики чохь ца магийна хилар бахьнехь.",
+       "import-options-wrong": "{{PLURAL:$2|1=Нийса йоцу опци|Нийса йоцу опцеш}}: <nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "Билгалйина коьрта агӀона цӀе нийса яц.",
        "importlogpage": "Импортан тептар",
        "importlogpagetext": "Куьйгалхоша агӀонаш импорт яр царна бина хийцамашца кхечу википедеш чура.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|верси импорт йина|версеш импорт йина}}",
        "tooltip-ca-unwatch": "ДӀаяккха хӀара агӀо хьай тергаме могӀанан юкъар",
        "tooltip-search": "Лаха иза дош",
        "tooltip-search-go": "Билгала и санна цӀе йолучу агӀон чу дехьа гӀо",
-       "tooltip-search-fulltext": "Лаха агlонаш ше чулацамехь хlара йоза долуш",
+       "tooltip-search-fulltext": "Лаха агӀонаш ше чулацамехь хӀара йоза долуш",
        "tooltip-p-logo": "Коьрта агӀона дехьа гӀо",
        "tooltip-n-mainpage": "Коьрта агӀона дехьа гӀо",
        "tooltip-n-mainpage-description": "Коьрта агӀона дехьа гӀо",
        "tooltip-ca-nstab-category": "Категорешан агӀо",
        "tooltip-minoredit": "Къастам бé хӀокху хийцамна кӀеззиг болуш санна",
        "tooltip-save": "Хьан хийцамаш lалашбой",
-       "tooltip-preview": "Дехар до, агlо lалаш йарал хьалха хьажа муха йу яз!",
+       "tooltip-preview": "Дехар до, агӀо Ӏалаш ярал хьалха хьажа муха ю из!",
        "tooltip-diff": "Гайта долуш долу йозанах бина болу хийцам.",
-       "tooltip-compareselectedversions": "Хlокху шина хаьржина агlона башхо муха ю хьажа.",
+       "tooltip-compareselectedversions": "ХӀокху шина хаьржина агӀона башхо муха ю хьажа.",
        "tooltip-watch": "ТӀетоха хӀара агӀо сан тергаме могӀанан юкъа",
        "tooltip-watchlistedit-normal-submit": "Билгалйина цӀераш дӀаяха",
        "tooltip-watchlistedit-raw-submit": "Тергаме могӀам карлабаккха",
        "exif-imagewidth": "Шоралла",
        "exif-imagelength": "Локхалла",
        "exif-bitspersample": "Бесан кIоргалла",
+       "exif-compression": "ТӀеӀовдан кеп",
        "exif-photometricinterpretation": "Беснин модель",
        "exif-orientation": "Суьртан хьал",
+       "exif-samplesperpixel": "Беснийн компонентийн дукхалла",
+       "exif-planarconfiguration": "Организацин хаамийн некъ",
+       "exif-ycbcrsubsampling": "Барамийн компонент Y а C а",
        "exif-ycbcrpositioning": "Y а C а компонентин листаран кеп",
        "exif-xresolution": "Шоралла",
        "exif-yresolution": "Локхалла",
+       "exif-stripoffsets": "Суьртийн хаамаш болу меттиг",
+       "exif-rowsperstrip": "Сизан тӀера могӀанийн дукхалла",
+       "exif-stripbytecounts": "ТӀеӀовдан сизан тӀера байт",
+       "exif-jpeginterchangeformat": "Доладаларан кеп preview",
+       "exif-jpeginterchangeformatlength": "Сизан хааман барам preview",
+       "exif-whitepoint": "Къайн тӀадаман бос",
+       "exif-primarychromaticities": "Коьрта беснийн бос",
        "exif-referenceblackwhite": "Ӏаьржа а къай а тӀадамийн меттиг",
        "exif-datetime": "Файл хийцина терахь а хан",
        "exif-imagedescription": "Суьртан цӏе",
        "exif-make": "Камера арахоьцург",
        "exif-model": "Камеран модель",
        "exif-software": "Лелина программа",
+       "exif-artist": "Автор",
        "exif-copyright": "Авторан бакъо ерг",
        "exif-exifversion": "Верси Exif",
        "exif-flashpixversion": "Ловш йолу верси FlashPix",
        "exif-compressedbitsperpixel": "Бесан кIоргалла дацдина чул тӀехьа",
        "exif-pixelydimension": "Суьртан шоралла",
        "exif-pixelxdimension": "Суьртан локхалла",
+       "exif-usercomment": "Кхин тӀе къамел",
        "exif-relatedsoundfile": "Къамелан аьзнийн файл",
        "exif-datetimeoriginal": "Дуьххьарлера терахь а хан",
        "exif-datetimedigitized": "Оцифровк йина терахь а хан а",
        "exif-urgency-low": "Лахара ($1)",
        "exif-urgency-high": "Лакхара ($1)",
        "exif-urgency-other": "Декъашхочо билгалйина приоритет ($1)",
-       "watchlistall2": "массо",
        "namespacesall": "массо",
        "monthsall": "массо",
        "confirmemail": "Электронан почтан адрес бакъдар",
        "autoredircomment": "[[$1]] тӀе хьажийна",
        "autosumm-new": "Керла агlо: «$1»",
        "autosumm-newblank": "Кхоьллина еса агӀо",
+       "lag-warn-normal": "{{PLURAL:$1|$1 Секунд}} хьалха бина хийцамаш хӀокху могӀамехь гуш ца хилла мега.",
+       "lag-warn-high": "Сервераш синхронизаци еш тӀехьайисарна, {{PLURAL:$1|$1 секунд}} хьалха бина хийцамаш хӀокху могӀамехь гуш ца хилла мега.",
        "watchlistedit-normal-title": "Тергаме могӀанийн хийцамаш",
        "watchlistedit-normal-legend": "Тергаме могӀам юкъар дӀаяккхар",
        "watchlistedit-normal-explain": "Лахахь гойту хьан тергаме могӀамехь йолу агӀонаш.\nДӀаяздарш дӀадаха билгалде уьш такха тӀетаӀе кнопка «{{int:Watchlistedit-normal-submit}}».\nКхин хьа йиш ю [[Special:EditWatchlist/raw|йозан кепар могӀом нисба ]].",
        "watchlistedit-clear-removed": "{{PLURAL:$1|ДӀаяьккхина|ДӀаяьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
        "watchlistedit-too-many": "Кхузахь гайта тӀехь дукха агӀонаш ю.",
        "watchlisttools-clear": "Тергаман могӀам дӀацӀанбан",
-       "watchlisttools-view": "Ð\9cогÓ\80ам Ñ\87Ñ\83Ñ\80а Ð°Ð³Ó\80онаÑ\88ан хийцамаш",
+       "watchlisttools-view": "Ð\9cогÓ\80ам Ñ\87Ñ\83Ñ\80а Ð°Ð³Ó\80онийн хийцамаш",
        "watchlisttools-edit": "Хьажа/нисбé могӀам",
        "watchlisttools-raw": "Йоза санна тае",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дийцаре]])",
        "fileduplicatesearch-info": "$1 × $2 пиксель<br />Файлан барам: $3<br />MIME-тайп: $4",
        "fileduplicatesearch-result-1": "«$1» файлах тера хӀума яц.",
        "fileduplicatesearch-noresults": "ЦӀе «$1» йолуш файл цакарий.",
-       "specialpages": "Леррина агlонаш",
+       "specialpages": "Леррина агӀонаш",
        "specialpages-note": "* Гуттарлера белха агlонаш.\n* <strong class=\"mw-specialpagerestricted\">Кlеззиг таронаш йолу леррина агlонаш.</strong>",
        "specialpages-group-maintenance": "Жамlаш гlирса хьашташ кхочушдар",
        "specialpages-group-other": "Кхин белхан агӀонаш",
        "specialpages-group-users": "Декъашхой а бакъонаш",
        "specialpages-group-highuse": "Уггаре дукха лелайо агӀонаш",
        "specialpages-group-pages": "АгӀонийн могӀанаш",
-       "specialpages-group-pagetools": "Ð\93Ó\80иÑ\80Ñ\81аÑ\88 Ð¾Ñ\86Ñ\83 Ð°Ð³Ó\80онаÑ\88ан",
+       "specialpages-group-pagetools": "Ð\93Ó\80иÑ\80Ñ\81аÑ\88 Ð¾Ñ\86Ñ\83 Ð°Ð³Ó\80онийн",
        "specialpages-group-wiki": "Хаамаш а гӀирсаш а",
        "specialpages-group-redirects": "ДӀасахьажош йолу белхан агӀонаш",
        "specialpages-group-spam": "Спаман дуьхьала гӀирсаш",
        "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 чу",
+       "logentry-upload-upload": "$1 {{GENDER:$2|чуяьккхина}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|чуяьккхина}} керла верси $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|чуяьккхина}} $3",
        "rightsnone": "(яц)",
+       "revdelete-summary": "хийцамах лаьцна",
        "feedback-bugornote": "Хьайн техникин халонах лаьцна яздан хӀума делахь, дехар до, [$1 хаам бе тхоьга].\nДацахь хьан йиш ю хӀокху атта кепаца «[$3 $2]» агӀонг къамел тӀетоха хьан декъашхочун цӀарца, кхин лелош йолу браузер билгал еш.",
        "feedback-subject": "Къамел:",
        "feedback-message": "Хаам:",
        "expand_templates_remove_nowiki": "ДӀайоху тегаш <nowiki> хилча",
        "expand_templates_generate_xml": "Гойту дитта цу XML",
        "expand_templates_generate_rawhtml": "Гайта HTML",
-       "expand_templates_preview": "Хьалха муха ю хьажа",
+       "expand_templates_preview": "Хьалха хьажар",
        "pagelanguage": "АгӀона мотт харжар",
        "pagelang-name": "АгӀо",
        "pagelang-language": "Мотт",
        "log-description-pagelang": "ХӀара агӀонашкахь мотт хийцаран тептар ду.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|хийцина}} агӀона мотт $3 $4 → $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (латина)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''дӀаяйина''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''дӀаяйина''')",
+       "mediastatistics": "Медиа-статистика",
+       "mediastatistics-nbytes": "$1 {{PLURAL:$1|байт}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-тайп",
+       "mediastatistics-table-extensions": "Хила мега шордарш",
+       "mediastatistics-table-count": "Файлийн дукхалла",
+       "mediastatistics-table-totalbytes": "Юкъара барам",
+       "mediastatistics-header-unknown": "Хууш доцурш",
+       "mediastatistics-header-bitmap": "Басаршца долу сурт",
+       "mediastatistics-header-drawing": "Сурт (векторийн сурташ)",
+       "mediastatistics-header-audio": "Аудио",
+       "mediastatistics-header-video": "Видео",
+       "mediastatistics-header-multimedia": "Къамел-медиа",
+       "mediastatistics-header-office": "Офисийн",
+       "mediastatistics-header-text": "Йозанан",
+       "mediastatistics-header-executable": "Кхочушдийриш",
+       "mediastatistics-header-archive": "Архиваш",
+       "json-error-unknown": "JSON бала бу. ГӀалат: $1",
+       "json-error-syntax": "Синтаксин гӀалат"
 }
index 84c6ea2..427275b 100644 (file)
        "search-interwiki-caption": "Mga kaubang proyekto",
        "search-interwiki-default": "$1 ka mga resulta:",
        "search-interwiki-more": "(dugang pa)",
-       "showingresultsheader": "{{PLURAL:$5|Resulta '''$1''' sa '''$3'''|Mga resulta '''$1 - $2''' of '''$3'''}} sa '''$4'''",
        "search-nonefound": "Walay mga resulta nga nag-match sa gipangita.",
        "powersearch-legend": "Abansadong pagpangita",
        "powersearch-ns": "Pangitaa sa mga ngalang espasyo:",
        "pager-older-n": "{{PLURAL:$1|mas daan1|mas daan $1}}",
        "booksources": "Mga reperensiyang libro",
        "booksources-search-legend": "Pangitaa ang mga reperensiyang libro",
-       "booksources-go": "Sige",
        "log": "Mga log",
        "allpages": "Tanang panid",
        "prevpage": "Miaging panid ($1)",
        "watchthispage": "Bantayi kining panid",
        "unwatch": "Pasagdi",
        "watchlist-details": "{{PLURAL:$1|$1 ka panid|$1 ka mga panid}} ang imong gibantayan, way labot ang mga panid sa hisgot.",
-       "wlshowlast": "Ipakita ang miaging $1 ka oras $2 ka mga adlaw $3",
+       "wlshowlast": "Ipakita ang miaging $1 ka oras $2 ka mga adlaw",
        "watchlist-options": "Mga opsyon sa akong gibantayan",
        "watching": "Gibantayan...",
        "unwatching": "Gipasagdan...",
        "metadata-expand": "Ipakita ang mas daghang detalye",
        "metadata-collapse": "Tagoa ang mga ekstended nga detalye",
        "metadata-fields": "Ang XIF metadata fields nga nakatala niining mensahe iapil sa display sa panid sa imahen kon gi-collapse ang metadata table.\nAng uban default nga nakatago.\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",
-       "watchlistall2": "tanan",
        "namespacesall": "tanan",
        "monthsall": "tanan",
        "watchlisttools-view": "Tan-awa ang may kalabotan nga mga pag-usab",
        "specialpages": "Espesyal nga mga panid",
        "revdelete-restricted": "mga na-aplay nga restriksyon sa mga tagdumala",
        "revdelete-unrestricted": "gitangtang ang mga restriksyon alang sa mga tagdumala",
-       "rightsnone": "(wala)"
+       "rightsnone": "(wala)",
+       "revdelete-summary": "mubong sugid sa pag-usab"
 }
index 6a2eddc..c3c70ea 100644 (file)
        "move": "Kånya",
        "movethispage": "Kånya i påhina",
        "booksources": "I source i lepblo",
-       "booksources-go": "Hånao",
        "specialloguserlabel": "Muna'sesetbi:",
        "speciallogtitlelabel": "Titulo:",
        "log": "Logs",
        "watchthispage": "Pulan este na påhina",
        "unwatch": "Basta mapulan",
        "watchlist-details": "{{PLURAL:$1|$1 påhina|$1 na påhina siha}} un pupulan, sin i påhinan kombetsasion siha.",
-       "wlshowlast": "Na'annok $1 na ora yan $2 na diha siha gi halacha $3",
+       "wlshowlast": "Na'annok $1 na ora yan $2 na diha siha gi halacha",
        "watching": "Mamulan...",
        "unwatching": "Pumapara mamulan...",
        "deletepage": "Na'suha i påhina",
        "metadata": "Metadata",
        "metadata-expand": "Na'annok todu i infotmasion-ña",
        "metadata-collapse": "Na'atok patte i infotmasion-ña",
-       "watchlistall2": "todu",
        "namespacesall": "todu",
        "monthsall": "todu",
        "imgmultigo": "Hånao!",
        "version": "Tinilaika",
        "version-specialpages": "Manespesiat na påhina",
        "fileduplicatesearch-submit": "Aligao",
-       "specialpages": "Manespesiat na påhina"
+       "specialpages": "Manespesiat na påhina",
+       "revdelete-summary": "tulaika i sumaria"
 }
index acf6959..4bade64 100644 (file)
        "category-empty": "''ئەم پۆلە ھەنووکە ھیچ پەڕە یان پەڕگەیەک لە خۆ ناگرێت.‌''",
        "hidden-categories": "{{PLURAL:$1|پۆلی شارداوە|پۆلە شارداوەکان}}",
        "hidden-category-category": "پۆلە شاردراوەکان",
-       "category-subcat-count": "{{PLURAL:$2|ئەم پۆلە تەنیا ژێرپۆلی ژێرەوەی تێدایە.| ئەم پۆلە ئەم {{PLURAL:$1|ژێرپۆلەی|$1 ژێرپۆلانەی}} ژێرەوەی تێدایە، لە کۆی سەرجەم $2 دانە.}}",
+       "category-subcat-count": "{{PLURAL:$2|ئەم پۆلە تەنیا ژێرپۆلی ژێرەوەی تێدایە.|ئەم پۆلە {{PLURAL:$1|ژێرپۆل|$1 ژێرپۆل}}ی ژێرەوەی تێدایە، لە سەرجەم $2 ژێرپۆل.}}",
        "category-subcat-count-limited": "ئەم هاوپۆلە {{PLURAL:$1|ژێرهاوپۆلی}} لەخۆ گرتووە.",
-       "category-article-count": "{{PLURAL:$2|ئەم پۆلە تەنھا ئەم پەڕەی لەخۆگرتووە.|{{PLURAL:$1|پەڕە|$1 پەڕە}} لەم پۆلەدا، لە سەرجەم $2 پەڕە.}}",
+       "category-article-count": "{{PLURAL:$2|ئەم پۆلە تەنیا پەڕەی ژێرەوەی تێدایە.|{{PLURAL:$1|پەڕە|$1 پەڕە}}ی ژێرەوە لەم پۆلەدا{{PLURAL:$1|یە|ن}}، لە سەرجەم $2 پەڕە.}}",
        "category-article-count-limited": "ئەم {{PLURAL:$1|لاپەڕە|$1 لاپەڕانە}}، لەم هاوپۆلەدان.",
        "category-file-count": "{{PLURAL:$2|ئەم هاوپۆلە تەنها ئەم پەڕگەی لەخۆ گرتووە.|ئەم‌ {{PLURAL:$1|پەڕگەیە}} کە بەشێکە لە هەموو $2پەڕگەی ئەم هاوپۆلە‌ دەیبینی.}}",
        "category-file-count-limited": "ئەم {{PLURAL:$1|پەڕگە|پەڕگانە}} لەم هاوپۆلەدایە.",
        "hidetoc": "بیشارەوە",
        "collapsible-collapse": "کۆی بکەوە",
        "collapsible-expand": "بڵاوی بکەوە",
+       "confirmable-confirm": "{{GENDER:$1|دڵنیای}}؟",
+       "confirmable-yes": "بەڵێ",
+       "confirmable-no": "نا",
        "thisisdeleted": "$1 نیشان بدە یا بھێنەوە؟",
        "viewdeleted": "$1 نیشان بده‌؟",
        "restorelink": "{{PLURAL:$1|یەک گۆڕانکاریی سڕاو|$1 گۆڕانکاریی سڕاو}}",
        "invalidtitle-knownnamespace": "سەردێڕی نادروست بە بۆشایی ناوی «$2» و دەقی «$3»",
        "invalidtitle-unknownnamespace": "سەردێڕی هەڵە لەگەڵ ناوەبۆشایی نەناسراوی ژمارە $1 و دەقی \"$2\"",
        "exception-nologin": "لەژوورەوە نیت",
-       "exception-nologin-text": "تکایە [[Special:Userlogin|بچۆ ژوورەوە]] تا بتوانیت بچیتە نێو ئەم پەڕەیە یان ئەم کردەیە ئەنجام بدەیت.",
+       "exception-nologin-text": "تکایە بچۆ ژوورەوە تا بتوانی دەستت بەم پەڕەیە یان کردەوەیە ڕابگات.",
        "exception-nologin-text-manual": "تکایە $1 تا بتوانیت بچیتە نێو ئەم پەڕەیە یان ئەم کردەیە ئەنجام بدەیت.",
        "virus-badscanner": "پێکەربەندیی نابەجێ: ڤایرس سکەنێری نەناسراو: ''$1''",
        "virus-scanfailed": "سکەن ئەنجام نەدرا(کۆد $1)",
        "resetpass-submit-cancel": "ھەڵوەشاندنەوە",
        "resetpass-wrong-oldpass": "تێپەڕوشەی ھەنووکەیی یان تێپەڕوشەی کاتی ھەڵەیە.\nوا دیارە تێپەڕوشەکەت بە سەرکەوتوویی گۆڕدراوە یان داوای تێپەڕوشەیەکی نوێت کردووە.",
        "resetpass-temp-password": "تێپەڕوشەی کاتی:",
-       "passwordreset": "دووبارە ڕێکخستنەوەی تێپەڕوشە",
+       "passwordreset": "ڕێکخستنەوەی تێپەڕوشە",
        "passwordreset-legend": "دووبارە ڕێکخستنەوەی تێپەڕوشە",
        "passwordreset-username": "ناوی بەکارھێنەری:",
        "passwordreset-domain": "پاوان:",
        "passwordreset-emailsent": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.",
        "passwordreset-emailsent-capture": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە.",
        "passwordreset-emailerror-capture": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە، بەڵام ناردنەکەی بۆ {{GENDER:$2|بەکارھێنەر}} سەرکەوتوو نەبوو: $1",
-       "changeemail": "ناونیشانی ئیمەیل بگۆڕە",
-       "changeemail-header": "ناونیشانی ئیمەیلی ھەژمار بگۆڕە",
+       "changeemail": "گۆڕینی ناونیشانی ئیمەیل",
        "changeemail-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە دەبێت بچیتە ژوورەوە.",
        "changeemail-oldemail": "ئەدرەسی ئیمەیڵی ئێستا:",
        "changeemail-newemail": "ناونیشانی ئیمەیلی نوێ:",
        "changeemail-none": "(ھیچ)",
        "changeemail-password": "تێپەڕوشەکەت لە {{SITENAME}}:",
        "changeemail-submit": "ئەمەیل بگۆڕە",
-       "changeemail-cancel": "ھەڵیوەشێنەوە",
        "bold_sample": "دەقی ئەستوور",
        "bold_tip": "دەقی ئەستوور",
        "italic_sample": "دەقی لار",
        "currentrev": "دوایین پێداچوونەوە",
        "currentrev-asof": "دوایین پێداچوونەوەی $1",
        "revisionasof": "وەک پێداچوونەوەی $1",
-       "revision-info": "پێداچوونەوی $1 لە لایەن $2",
+       "revision-info": "پێداچوونەوی $1 لە لایەن {{GENDER:$6|$2}}$7",
        "previousrevision": "→پیاچوونەوەی کۆنتر",
        "nextrevision": "پێداچوونەوەی نوێتر←",
        "currentrevisionlink": "پێداچوونەوەی ئێستا",
        "rev-delundel": "نیشان بدە/بشارەوە",
        "rev-showdeleted": "نیشان بدە",
        "revisiondelete": "سڕینەوە/ھێنانەوەی پێداچوونەوەکان",
-       "revdelete-nooldid-title": "Ù\85Û\95بÛ\95ستÛ\8c Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8c Ù\86ادÛ\8cار",
-       "revdelete-nooldid-text": "پێداچوەنەوەی مەبەستت ڕاچاو نەکردە بۆ ئەنجامی ئەم فەنکشێنە یان ئەو پێداچوونەوەی ڕاچاوت کردە بوونی نیە، یا خەریکی هەوڵی داشاردنی پێداچوونەوهی ئێستا‌ ئەدەی.",
+       "revdelete-nooldid-title": "Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8c Ù\85Û\95بÛ\95ستÛ\8c Ù\86ادرÙ\88ست",
+       "revdelete-nooldid-text": "پێداچوەنەوە(کان)ی مەبەستت بۆ جێبەجێکردنی ئەم کارە دەستنیشان نەکردووە یان پێداچوونەوەی دەستنیشان‌کراو بوونی نییە، یان خەریکی هەوڵی شاردنەوەی پێداچوونەوەی ھەنووکەیی دەدەیت.",
        "revdelete-no-file": "ئەو پەڕگەی ڕاچاوت کردووە بوونی نیە.",
        "revdelete-show-file-confirm": "ئایا دڵنیایت دەتەوێ پێداچوونەوەی سڕاوەی پەڕگەی \"<nowiki>$1</nowiki>\" لە $2، لە $3دا ببیینی؟",
        "revdelete-show-file-submit": "بەڵێ",
+       "revdelete-selected-text": "{{PLURAL:$1|پێداچوونەوەی ھەڵبژێردراوی|پێداچوونەوە ھەڵبژێردراوەکانی}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|لۆگی ڕووداوەی هەڵبژێراو|لۆگی ڕووداوە هەڵبژێراوەکان}}:",
-       "revdelete-confirm": "تکایە بەڵێن بدە کە دەتەوێ ئەوە بکەی و لە ئەنجامەکانی ئەوە ئاگاداریت و بە پێی [[{{MediaWiki:Policy-url}}|سیاسەتنامە]] ئەنجامی ئەدەی.",
+       "revdelete-text-text": "پێداچوونە سڕاوەکان ھێشتا لە مێژووی پەڕەدا دەردەکەوێت بەڵام بەشێک لە ناوەرۆکەکەیان بۆ ھەمووان لەبەر دەست دەبێت.",
+       "revdelete-text-file": "وەشانە سڕاوەکانی پەڕگە ھێشتا لە مێژووی پەڕگەدا دەردەکەوێت بەڵام بەشێک لە ناوەرۆکەکەیان بۆ ھەمووان لەبەر دەست دەبێت.",
+       "logdelete-text": "ڕووداوە سڕاوەکانی لۆگ ھێشتا لە لۆگەکاندا دەردەکەوێت بەڵام بەشێک لە ناوەرۆکەکەیان بۆ ھەمووان لەبەر دەست دەبێت.",
+       "revdelete-text-others": "بەڕێوەبەرانی تر ھێشتا دەتوانن ناوەرۆکی شاردراو ببینن و بیھێننەوە، مەگەر سنووردارکردنی تر ڕێک بخرێت.",
+       "revdelete-confirm": "تکایە پشتڕاست بکەوە دەتەوێ ئەمە بکەیت و لە ئاکامەکەی ئاگاداریت و ئەمە بە پێی [[{{MediaWiki:Policy-url}}|سیاسەتنامە]] دەکەیت.",
        "revdelete-suppress-text": "بەرگری دەبێ '''تەنها''' بۆ ئەم بابەتانە بەکاربهێندرێت:<br />\n* سووکایەتیکردن بە کەسایەتییەک<br />\n* بڵاوکردنەوەی زانیاریی تاکەکەسی نەگونجاو<br />\n*: '' ناونیشانی ماڵ یا ژمارە تەلەفۆن و وەک ئەمانە.''<br />",
-       "revdelete-legend": "سنووردارکردنی دەرکەوتن",
+       "revdelete-legend": "ڕێکخستنی سنووردارکردنی دیاریکردن",
        "revdelete-hide-text": "دەقی پێداچوونەوە",
        "revdelete-hide-image": "ناوەڕۆکی پەڕگە بشارەوە",
        "revdelete-hide-name": "داشاردنی مەبەست و کردەوە",
        "revdelete-suppress": "بەرگری دراوە لە بەڕێوبەران هەر وەک ئەوانی دیکە",
        "revdelete-unsuppress": "لابردنی بەربەستەکان لە سەر پێداچوونەوە گەڕێندراوەکان",
        "revdelete-log": "هۆکار:",
-       "revdelete-submit": "خستÙ\86Û\95کار Ø¨Û\86 Ø³Û\95ر Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95 {{PLURAL:$1|Ú¾Û\95ڵبÚ\98Û\8eردراÙ\88Û\95Ú©Û\95|ھەڵبژێردراوەکان}}",
+       "revdelete-submit": "بÛ\95کاربÛ\95رÛ\95 Ø¨Û\86 Ø³Û\95ر {{PLURAL:$1|Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8c Ú¾Û\95ڵبÚ\98Û\8eردراÙ\88|Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95 ھەڵبژێردراوەکان}}",
        "revdelete-success": "'''چۆنیەتی بیندرانی پێداچوونەوە بە سەرکەوتوویی نوێکراوە.'''",
        "revdelete-failure": "'''ناکرێ دەرکەوتنی پێداچوونەوە نوێبکرێتەوە:'''\n$1",
        "logdelete-success": "'''بیندرانی لۆگ‌ بە سەرکەوتوویی داندرا.'''",
        "difference-multipage": "(جیاوازی نێوان پەڕەکان)",
        "lineno": "ھێڵی  $1:",
        "compareselectedversions": "پیاچوونەوە ھەڵبژێردراوەکان ھەڵسەنگێنە",
-       "showhideselectedversions": "پیاچوونەوە ھەڵبژێردراوەکان نیشانبدە/بشارەوە",
+       "showhideselectedversions": "دیاریکردنی پێداچوونەوە ھەڵبژێردراوەکان بگۆڕە",
        "editundo": "پووچەڵکردنەوە",
        "searchresults": "ئاکامەکانی گەڕان",
        "searchresults-title": "ئاکامەکانی گەڕان بۆ «$1»",
        "search-section": "(بەشی $1)",
        "search-suggest": "ئایا مەبەستت ئەمە بوو: $1",
        "search-interwiki-caption": "پرۆژە خوشکەکان",
-       "search-interwiki-default": "$1 ئەنجام:",
+       "search-interwiki-default": "ئاکام لە $1:",
        "search-interwiki-more": "(زیاتر)",
        "search-relatedarticle": "پەیوەست",
        "searchrelated": "پەیوەست",
        "searchall": "ھەموو",
        "showingresults": "لە خوارەوە {{PLURAL:$1|'''یەک''' ئەنجام|'''$1''' ئەنجام}} نیشان دراوە، بە دەست پێ کردن لە ژمارەی '''$2'''ەوە.",
-       "showingresultsheader": "{{PLURAL:$5|ئاکامی '''$1''' لە '''$3'''|ئاکامەکانی '''$1 - $2''' لە '''$3'''}} بۆ '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|ئاکامی <strong>$1</strong> لە <strong>$3</strong>|ئاکامەکانی <strong>$1 - $2</strong> لە <strong>$3</strong>}}",
        "search-nonefound": "ھیچ ئاکامێک کە بە داواکارییەکەت بخوا نەدۆزرایەوە.",
        "powersearch-legend": "گەڕانی پێشکەوتوو",
        "powersearch-ns": "گەڕان لە بۆشاییی ناوەکانی:",
        "powersearch-togglelabel": "تاوتوێ بکە:",
        "powersearch-toggleall": "ھەموو",
        "powersearch-togglenone": "ھیچیان",
+       "powersearch-remember": "ھەڵبژاردەکانت بۆ گەڕانەکانی تر لە بیر بێت",
        "search-external": "گەڕانی دەرەکی",
        "searchdisabled": "گەڕانی {{SITENAME}} ئێستە کار ناکات.\nدەتوانی بۆ ئێستا لە گەڕانی گووگڵ کەڵک وەرگری.\nلەیادت بێت لەوانەیە پێرستەکانیان بۆ گەڕانی ناو {{SITENAME}}، کات‌بەسەرچوو بێت.",
        "preferences": "ھەڵبژاردەکان",
        "default": "بنچینەیی",
        "prefs-files": "پەڕگەکان",
        "prefs-custom-css": "CSSی دڵخواز",
-       "prefs-custom-js": "JSی دڵخواز",
+       "prefs-custom-js": "جاڤاسکریپتی دڵخواز",
        "prefs-common-css-js": "سی‌ئێس‌ئێس/جاڤاسکریپتی ھاوبەش بۆ گشت پێستەکان:",
        "prefs-reset-intro": "دەتوانی لەم لاپەڕە بۆ گەڕانەوەی هەڵبژاردەکانت بۆ بنچینەیی ماڵپەر کەڵک وەرگریت.\nگەر ئەوە بکەی ئیتر گۆڕانەکەت ناگەڕێتەوە.",
        "prefs-emailconfirm-label": "پشتڕاستکردنەوەی ئیمەیل:",
        "recentchanges-legend-heading": "'''کورتکراوەکان:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])",
        "recentchanges-legend-plusminus": "(''±۱٢٣'')",
-       "rcnotefrom": "ژێرەوە گۆڕانکارییەکانە لە <strong>$2</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
+       "rcnotefrom": "ژێرەوە {{PLURAL:$5|گۆڕانکارییەکەیە|گۆڕانکارییەکانە}} لە strong>$3، $4</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
        "rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $3 $2",
        "rcshowhideminor": "دەستکارییە بچووکەکان $1",
        "rcshowhideminor-show": "نیشان بدە",
        "mimesearch-summary": "ئەم لاپەڕە پاڵێوتنی هەیە بۆ جۆرەکانی MIME.\nناودراو: جۆرەی ناوەڕۆک\\ژێرجۆرە، وەک <code>image/jpeg</code>.",
        "mimetype": "جۆرەی MIME:",
        "download": "داگرتن",
-       "unwatchedpages": "پەڕە چاودێرینەکراوەکان",
+       "unwatchedpages": "پەڕە چاودێری نەکراوەکان",
        "listredirects": "پێرستی ڕەوانەکەرەکان",
-       "unusedtemplates": "داڕێژە بەکارنەھێنراوەکان",
+       "unusedtemplates": "داڕێژە بەکارنەھاتووەکان",
        "unusedtemplatestext": "ئەم پەڕە هەموو پەڕەکانی بۆشاییی ناوی {{ns:template}} بە لیست دەکات کە لە پەڕەی تردا بەکارنەھێنراون.\nلە بیری نەکەی پێش سڕینەوەیان پشکنینی بەستەرەکانی تر بۆ داڕێژەکان بکەی.",
        "unusedtemplateswlh": "بەستەرەکانی تر",
-       "randompage": "پەڕەیەک بە هەڵکەوت",
+       "randompage": "پەڕەی ھەڕەمەکی",
        "randompage-nopages": "هیچ لاپەڕەیەک لەم {{PLURAL:$2|ناوبۆشاییەدا|ناوبۆشاییانەدا}} نیە: $1.",
-       "randomincategory-selectcategory-submit": "بڕۆ",
-       "randomredirect": "ڕەوانەکەری ھەرمەکی",
+       "randomincategory": "پەڕەی پۆلی ھەڕەمەکی",
+       "randomredirect": "ڕەوانەکەری ھەڕەمەکی",
        "randomredirect-nopages": "لە ناوبۆشایی \"$1\" هیچ ڕەوانکەرێک نییە.",
        "statistics": "ئامارەکان",
        "statistics-header-pages": "ئامارەکانی پەڕەکان",
        "pageswithprop-text": "ئەم پەڕەیە ئەو پەڕانەی تایبەتمەندییەکی پەرەیەکی دیاریکراو بەکاردەھێنن پێرست دەکا.",
        "pageswithprop-prop": "ناوی تایبەتمەندی:",
        "pageswithprop-submit": "بڕۆ",
-       "doubleredirects": "دووجار ڕەوانەکراوەکان",
+       "doubleredirects": "ڕەوانەکەرە دووسەرەکان",
        "doubleredirectstext": "ئەم پەڕە لیستی ئەو پەڕانەیە کە ڕەوانەکراون بۆ پەڕەیەکی ڕەوانەکراوی دیکە.\nهەر ڕیزێک، بەستەرەکانی ڕەوانەکردنەوەی یەکەم و دووەم و ھەروەھا ئامانجی ڕەوانەکراوی دووەمی تێدایە کە حاڵەتی ئاساییدا مەبەستی «ڕاستی»ی ڕەوانەکراوی یەکەمیش دەبێ بۆ ئەوێ بێت.\nئەوانەی <del>هێڵیان بەسەردا کێشراوە</del> چارەسەر کراون.",
        "double-redirect-fixed-move": "[[$1]] گوازرایەوە.\nخۆگەڕ نوێ کرایەوە و ئێستا ڕەوانەکەرە بۆ [[$2]].",
        "double-redirect-fixer": "چارەسەرکەری ڕەوانکەر",
        "withoutinterwiki-summary": "ئەم پەڕانە بەستەریان بۆ وەشانەکانی زمانەکانی تر نیە.",
        "withoutinterwiki-legend": "پێشگر",
        "withoutinterwiki-submit": "پیشاندان",
-       "fewestrevisions": "پەڕەکان بە کەمترین پێداچوونەوەکان",
+       "fewestrevisions": "پەڕەکان بە کەمترین پێداچوونەوە",
        "nbytes": "$1 {{PLURAL:$1|بایت|بایت}}",
        "ncategories": "$1 {{PLURAL:$1|ھاوپۆل|ھاوپۆل}}",
        "ninterwikis": "$1 {{PLURAL:$1|نێوانویکی}}",
        "uncategorizedimages": "پەڕگە پۆلێن نەکراوەکان",
        "uncategorizedtemplates": "داڕێژە پۆلێن نەکراوەکان",
        "unusedcategories": "پۆلە بەکارنەھێنراوەکان",
-       "unusedimages": "پەڕگە بەکارنەھێنراوەکان",
+       "unusedimages": "پەڕگە بەکارنەھاتووەکان",
        "popularpages": "پەڕە مەحبووبەکان",
        "wantedcategories": "پۆلە داواکراوەکان",
        "wantedpages": "پەڕە داواکراوەکان",
        "protectedpages-page": "پەڕە",
        "protectedpages-params": "پارامەترەکانی پاراستن",
        "protectedpages-reason": "ھۆکار",
-       "protectedtitles": "سەرناوە پارێزراوەکان",
+       "protectedtitles": "سەردێڕە پارێزراوەکان",
        "protectedtitlesempty": "ھیچ سەرناوێک بەم سنوورانەوە ئێستا نەپارێزراوە.",
        "listusers": "پێرستی بەکارھێنەران",
        "listusers-editsonly": "تەنیا ئەو بەکارھێنەرانە نیشان بدە کە دەستکارییان کردووە",
        "suppress": "چاودێری",
        "booksources": "سەرچاوەکانی کتێب",
        "booksources-search-legend": "بۆ سەرچاوەی کتێب بگەڕێ",
-       "booksources-go": "بڕۆ",
        "booksources-text": "لە خوارەوە لیستێک لە بەستەر بۆ ماڵپەڕهایەک کە کتێبی نوێ و بەکارهێنراو دەفرۆشێت و لەوانەیە لەوێ زانیاریی زیاترت دەست‌کەوێت سەبارەت بەو کتێبانەی لە دووی دەگەڕیت:",
        "booksources-invalid-isbn": "ISBN دراو لەوە ناچی بەکار بێت، سەرنج بدە لە کاتی کۆپی کردن لە سەرچاوە تووشی هەڵە نوبوبێت.",
        "specialloguserlabel": "بەجێھێنەر:",
        "alllogstext": "نیشاندانی تێکڕای هەموو لۆگە بەردەستەکانی {{SITENAME}}.\nدەتوانی بە ھەڵبژاردنی جۆرە لۆگێک، ناوی بەکارھێنەرەکە (ھەستیار بە گەورە و بچووکی پیتەکان) یان پەڕە کارتێکراوەکە (ھەستیار بە گەورە و بچووکی پیتەکان)\nبینینەکە سنووردار بکەیتەوە.",
        "logempty": "هیچ بابەتێکی هاوتا لە لۆگەکاندا نەدۆزرایەوە.",
        "log-title-wildcard": "گەڕانی ئەو سەرناوانە بەم دەقەوە دەست پێدەکەن",
-       "showhideselectedlogentries": "بابÛ\95تÛ\95کاÙ\86Û\8c Ú¾Û\95ڵبÚ\98Û\8eردراÙ\88Û\8c Ù\84Û\86Ú¯ Ù\86Û\8cشاÙ\86 Ø¨Ø¯Û\95/بشارÛ\95Ù\88ە",
+       "showhideselectedlogentries": "دÛ\8cارÛ\8cکردÙ\86Û\8c Ø¨Ø§Ø¨Û\95تÛ\95 Ú¾Û\95ڵبÚ\98Û\8eردراÙ\88Û\95کاÙ\86Û\8c Ù\84Û\86Ú¯ Ø¨Ú¯Û\86Ú\95ە",
        "allpages": "ھەموو پەڕەکان",
        "nextpage": "پەڕەی پاشەوە ($1)",
        "prevpage": "پەڕەی پێشەوە ($1)",
        "listusers-submit": "نیشانیبدە",
        "listusers-noresult": "ھیچ بەکارھێنەرێک نەدۆزرایەوە.",
        "listusers-blocked": "(بەربەست کراوە)",
-       "activeusers": "پێرستی بەکارھێنەرە چالاکەکان",
+       "activeusers": "پێرستی بەکارھێنەرانی چالاک",
        "activeusers-intro": "ئەمە لیستێکی ئەو بەکارھێنەرانەیە کە لە  $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ی ڕابردوودا بە جۆرێک چالاکییەکیان ھەبووە.",
        "activeusers-count": "$1 {{PLURAL:$1|کردەوە}} لە دوایین {{PLURAL:$3|ڕۆژ|$3 ڕۆژ}}دا",
        "activeusers-from": "نیشاندانی بەکارھێنەران بە دەستپێکردن لە:",
        "listgrouprights-namespaceprotection-header": "سنوورداریی بۆشایی ناو",
        "listgrouprights-namespaceprotection-namespace": "بۆشایی ناو",
        "listgrouprights-namespaceprotection-restrictedto": "مافی رێ‌پێدراوی بەکارھێنەر بۆ دەستکاری",
+       "trackingcategories": "پۆلەکانی شوێنکەوتن",
        "trackingcategories-name": "ناوی پەیام",
        "mailnologin": "ناونیشان بۆ ناردن نییه‌",
        "mailnologintext": "ده‌بێ له‌ [[Special:UserLogin|ژووره‌وه‌]] بیت و ناونیشانێکی بڕواپێ‌کراوی ئی‌مه‌یلت له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کان]] دیاری کردبێت تا بتوانی ئی‌مه‌یل بنێریت بۆ به‌کارهێنه‌رانی دیکه‌.",
        "wlheader-enotif": "ئاگاداری بە ئیمەیل چالاکە.",
        "wlheader-showupdated": "‏ئەو پەڕانە کە لە پاش دواین سەردانت دەستکاری کراون بە '''ئەستوور''' نیشان دراون",
        "wlnote": "خوارەوە {{PLURAL:$1|دوایین گۆڕانکارییە|دوایین '''$1''' گۆڕانکارییە}} لە دوایین {{PLURAL:$2|کاتژمێر|'''$2''' کاتژمێر}}دا ھەتا $4 لە $3.",
-       "wlshowlast": "دوایین $1 کاتژمێر $2 ڕۆژی $3 نیشان بدە",
+       "wlshowlast": "دوایین $1 کاتژمێر $2 ڕۆژی  نیشان بدە",
        "watchlist-options": "ھەڵبژاردەکانی لیستی چاودێری",
        "watching": "چاودێری...",
        "unwatching": "لابردنی چاودێری...",
        "deletecomment": "ھۆکار:",
        "deleteotherreason": "ھۆکاری تر/زیاتر:",
        "deletereasonotherlist": "ھۆکاری تر",
-       "deletereason-dropdown": "* Ú¾Û\86کارÛ\8c Ø³Ú\95Û\8cÙ\86Û\95Ù\88Û\95\n** Ø¯Ø§Ù\88اکارÛ\8cÛ\8c Ù\86Ù\88Ù\88سÛ\95ر\n** ØªÛ\8eکداÙ\86Û\8c Ù\85اÙ\81Û\8c Ù\84Û\95بÛ\95رگرتÙ\86Û\95Ù\88Û\95\n** Ø®Ø±Ø§Ù¾Ú©Ø§Ø±Û\8c",
+       "deletereason-dropdown": "* Ú¾Û\86کارÛ\95 Ø¨Ø§Ù\88Û\95کاÙ\86Û\8c Ø³Ú\95Û\8cÙ\86Û\95Ù\88Û\95\n** Ø³Ù¾Ø§Ù\85\n** Ø®Ø±Ø§Ù¾Ú©Ø§Ø±Û\8c\n** Ù¾Û\8eØ´Û\8eÙ\84کردÙ\86Û\8c Ù\85اÙ\81Û\8c Ù\84Û\95بÛ\95رگرتÙ\86Û\95Ù\88Û\95\n** Ø¯Ø§Ø®Ù\88ازÛ\8c Ø¯Ø§Ù\86Û\95ر\n** Ú\95Û\95Ù\88اÙ\86Û\95Ú©Û\95رÛ\8c Ø´Ú©Ø§Ù\88",
        "delete-edit-reasonlist": "دەستکاری کردنی ھۆکارەکانی سڕینەوە",
        "delete-toobig": "ئەم لاپەڕە مێژوویەکی دەستکاری زۆر گەورەی هەیە، زیاتر لە $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}.\nبۆ بەرگری لە خراپ‌بوونی چاوەڕوان نەکراوی {{SITENAME}}، سڕینەوەی لاپەڕەی وا بەربەست‌کراوە.",
        "delete-warning-toobig": "ئەم لاپەڕە مێژوویەکی دەستکاری زۆر گەورەی هەیە، زیاتر لە $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}.\nسڕینەوی ئەوە لە وانەیە کارەکانی بنکەدراوی {{SITENAME}} تووشی کێشە بکات؛\nدوورنواڕانە جێ‌بەجێی بکە.",
        "restriction-move": "گواستنەوە",
        "restriction-create": "دروستکردن",
        "restriction-upload": "بارکردن",
-       "restriction-level-sysop": "تەواو پارێزراو",
+       "restriction-level-sysop": "تەواوپارێزراو",
        "restriction-level-autoconfirmed": "نیوەپارێزراو",
        "restriction-level-all": "هەر ئاستێک",
        "undelete": "پەڕە سڕاوەکان ببینە",
        "whatlinkshere": "بەسراوەکان بە ئێرەوە",
        "whatlinkshere-title": "ئەو پەڕانەی بەستەریان ھەیە بۆ «$1»",
        "whatlinkshere-page": "پەڕە:",
-       "linkshere": "ئەم پەڕانە بەستەریان ھەیە بۆ '''[[:$1]]''':",
+       "linkshere": "پەڕەکانی ژێرەوە بەستەر دراون بۆ <strong>[[:$1]]</strong>:",
        "nolinkshere": "هیچ لاپەڕەیەک بەستەری نەداوە بە '''[[:$1]]'''.",
        "nolinkshere-ns": "هیچ لاپەڕەیەک بەستەری نەداوە بە '''[[:$1]]''' لە بۆشایی‌ناوی هەڵبژێردراو.",
        "isredirect": "پەڕەی ڕەوانەکەر",
        "whatlinkshere-hidelinks": "$1 بەستەر",
        "whatlinkshere-hideimages": "$1 بەستەرەکانی پەڕگە",
        "whatlinkshere-filters": "پاڵێوکەکان",
-       "block": "بەربەستکردنی بەکارھێنەر",
+       "block": "بەربەستنی بەکارھێنەر",
        "unblock": "لە بەربەست‌دەرهێنانی بەکارهێنەر",
-       "blockip": "بەربەستنی بەکارھێنەر",
+       "blockip": "بەربەستنی {{GENDER:$1|بەکارھێنەر}}",
        "blockip-legend": "بەربەست‌کردنی بەکارهێنەر",
        "blockiptext": "لەم فۆرمەی خوارەوە دەتوانی بۆ بەربەست‌کردنی دەست‌پێ‌گەیشتنی نووسین لە ناونیشانێکی ئای‌پی تایبەت یا ناوی بەکارهێنەریەک، کەڵک وەرگریت.\nئەمە تەنها دەبێ بۆ بەرگری لە خراپکاری بەکاربێت و ڕێکەوتنی هەبێ دەگەڵ [[{{MediaWiki:Policy-url}}|سیاسەتەکان]].\nلە خوارەوە هۆکارێک بە ڕوونی بنووسە (بۆ نموونە بە وردی ئەو لاپەڕانە و خراپکاری تێدا کراوە وەک، وەک بەڵگە، بنووسە).",
        "ipaddressorusername": "ناونیشانی ئایپی یان ناوی‌ بەکارھێنەر:",
        "ipb-unblock-addr": "لە بەربەست‌دەرهێنانی $1",
        "ipb-unblock": "لە بەربەست‌دەرهێنانی ناوی بەکارهێنەریەک یا ناونیشانێکی ئای‌پی",
        "ipb-blocklist": "دیتنی ئەو بەربەستانەی وا هەیە",
-       "ipb-blocklist-contribs": "بەشدارییەکانی $1",
+       "ipb-blocklist-contribs": "بەشدارییەکانی {{GENDER:$1|$1}}",
        "unblockip": "لە بەربەست‌دەرهێنانی بەکارهێنەر",
        "unblockiptext": "بۆ گەڕاندنەوەی دەست‌پی‌گەیشتنی نووسین بۆ ئەو دوایین ئای‌پی یان بەکارهێنەری بەربەست کراوە، لەو فۆرمەی خوارەوە کەڵک وەرگرە.",
        "ipusubmit": "لابردنی ئەم بەربەستە",
        "unblocked": "[[User:$1|$1]] لە بەربەست دەرهێنرا",
        "unblocked-id": "بەربەستی $1 لابرا",
-       "blocklist": "بەکارھێنەر بەربەستکراوەکان",
+       "blocklist": "بەکارھێنەرانی بەربەسراو",
        "ipblocklist": "بەکارھێنەرە بەربەستکراوەکان",
        "ipblocklist-legend": "دۆزینەوەی بەکارهێنەرێکی بەربەست‌کراو",
        "blocklist-userblocks": "ھەژمارە بەربەستکراوەکان بشارەوە",
        "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دەبێت بزانی کە پەڕەکە '''ناگوازرێتەوە''' ئەگەر پێشتر پەڕەیەک بە ناوە نوێکەوە ھەبێت، مەگەر ئەوەی کە پەڕەکە واڵا یان ڕەوانەکراوەیەک بێت و ھیچ مێژووی گۆڕاندنی پێشووی نەبێت.\nئەمە بەو واتایە کە ئەگەر ھەڵەیەک بکەی دەتوانی ناوی پەڕەکە دیسانەوە بگۆڕی بۆ ناوی پێشووی، و ناتوانی بیخەیتە جێگەی پەڕەیەک کە ھەنووکە ھەیە.\n\n'''ھۆشیار بە!'''\nئەمە دەتوانێت گۆڕانێکی زۆر نابەجێ و چاوەڕێنەکراو بێت بۆ پەڕەیەکی بەناوبانگ؛\nتکایە پێش گۆڕینی ناو باش بیر لە ئاکامەکەی بکەوە.",
-       "movepagetalktext": "Ù¾Û\95Ú\95Û\95Û\8c Ù\88تÙ\88Ù\88Û\8eÚ\98Û\8c Ù¾Û\95Û\8cÙ\88Û\95Ù\86دÛ\8cدارÛ\8c Ø¨Û\95 Ø´Û\8eÙ\88Û\95Û\8c Ø®Û\86کار Ù\84Û\95Ú¯Û\95ÚµÛ\8cدا Ø¯Û\95Ú¯Ù\88ازرÛ\8eتÛ\95Ù\88Û\95Ø\8c '''Ù\85Û\95Ú¯Û\95ر:'''\n* Ù¾Û\95Ú\95Û\95Û\8cÛ\95Ú©Û\8c Ù\88تÙ\88Ù\88Û\8eÚ\98Û\8c Ù\86اÙ\88اڵا Ù¾Û\8eشتر Ú¾Û\95بÛ\8eت Ù\84Û\95 Ú\98Û\8eر Ù\86اÙ\88Û\95 Ù\86Ù\88Û\8eÚ©Û\95داØ\8c Û\8cاÙ\86\n* Ø¦Û\95Ù\88 Ú\86Ù\88ارÚ\86Û\8eÙ\88Û\95Û\8c Ø®Ù\88ارÛ\95Ù\88Û\95 Ù\84Û\8eÙ\86Û\95دراÙ\88 Ø¨Ú©Û\95Û\8c.\n\nÙ\84Û\95Ù\88 Ø­Ø§ÚµÛ\95تÛ\95داØ\8c Ø¦Û\95Ú¯Û\95ر Ø¨ØªÛ\95Ù\88Û\8eت Ø¨Û\8cÚ¯Ù\88ازÛ\8cتÛ\95Ù\88Û\95 Ù\86اÚ\86ار Ø¯Û\95بÛ\8cت Ø¨Û\95 Ø´Û\8eÙ\88Û\95Û\8c Ø¯Û\95ستÛ\8c Ø¨Û\8cÚ¯Ù\88ازÛ\8cتÛ\95Ù\88Û\95 Û\8cاÙ\86 ØªÛ\8eÚ©Û\95ÚµÛ\8cاÙ\86 Ø¨Ú©Û\95Û\8c.",
+       "movepagetext-noredirectfixer": "بەکارھێنانی فۆرمەکەی ژێرەوە ناوی پەڕەیەک دەگۆڕێت، بە گواستنەوەی ھەموو مێژووەکەی بۆ ناوی نوێ.\nناوە کۆنەکە دەبێتە پەڕەیەکی ڕەوانەکەر بۆ ناوە نوێکە.\nلە بیرت بێ ڕەوانەکەرە [[Special:DoubleRedirects|دووسەرەکان]] یان [[Special:BrokenRedirects|شکاوەکان]] تاوتوێ بکەیت.\nتۆ بەرپرسی بۆ ئەوەی دڵنیا ببیتەوە بەستەرەکان ھەر پەیوەندییان ھەیە بەو شوێنەوە کە چاوەڕوان دەکرێت.\n\nئەمە بزانە کە پەڕەکە <strong>ناگوازرێتەوە</strong> ئەگەر پێشتر پەڕەیەک بە ناوە نوێکەوە ھەبێت، مەگەر ئەوەی کە ڕەوانەکەرێک بێت و مێژووی دەستکاریی پێشووی نەبێت.\nئەمە یانی ئەگەر ھەڵەیەک بکەیت دەتوانی ناوی پەڕەکە بگۆڕییەوە بۆ ناوی پێشووی، و ناتوانی بیخەیتە جێگەی پەڕەیەک کە ئێستا ھەیە.\n\n<strong>ھۆشدار!</strong>\nئەمە دەتوانێت گۆڕانێکی زۆر نابەجێ و چاوەڕوان‌نەکراو بێت بۆ پەڕەیەکی بەناوبانگ؛\nتکایە پێش گۆڕینی ناو دڵنیا بە بیرت لە ئاکامەکەی کردووەتەوە.",
+       "movepagetalktext": "Ù¾Û\95Ú\95Û\95Û\8c Ù\84Û\8eدÙ\88اÙ\86Û\8c Ù¾Û\95Û\8cÙ\88Û\95Ù\86دÛ\8cدار Ø¨Û\95 Ø´Û\8eÙ\88Û\95Û\8c Ø®Û\86Ú¯Û\95Ú\95 Ù\84Û\95Ú¯Û\95ÚµÛ\8c Ø¯Û\95Ú¯Ù\88ازرÛ\8eتÛ\95Ù\88Û\95Ø\8c <strong>Ù\85Û\95Ú¯Û\95ر:</strong>\n* Ù¾Û\95Ú\95Û\95Û\8cÛ\95Ú©Û\8c Ù\84Û\8eدÙ\88اÙ\86Û\8c Ù\86اÙ\88اڵا Ù¾Û\8eشتر Ù\84Û\95 Ú\98Û\8eر Ù\86اÙ\88Û\95 Ù\86Ù\88Û\8eÚ©Û\95دا Ú¾Û\95بÛ\8eتØ\8c Û\8cاÙ\86\n* Ø¦Û\95Ù\88 Ú\86Ù\88ارÚ\86Û\8eÙ\88Û\95Û\8c Ú\98Û\8eرÛ\95Ù\88Û\95 Ù\84Û\8eÙ\86Û\95دراÙ\88 Ø¨Ú©Û\95Û\8cت.\n\nÙ\84Û\95Ù\88 Ø¯Û\86خاÙ\86Û\95داØ\8c Ø¦Û\95Ú¯Û\95ر Ø¨ØªÛ\95Ù\88Û\8eت Ø¯Û\95بÛ\8e Ø¨Û\95 Ø¯Û\95ستÛ\8c Ù¾Û\95Ú\95Û\95Ú©Û\95 Ø¨Ú¯Ù\88ازÛ\8cتÛ\95Ù\88Û\95 Û\8cاÙ\86 ØªÛ\8eÚ©Û\95ÚµÛ\8cاÙ\86 Ø¨Ú©Û\95Û\8cت.",
        "movearticle": "ئەم پەڕەیە بگوازەوە:",
+       "moveuserpage-warning": "<strong>ھۆشدار:</strong> تۆ خەریکی گواستنەوەی پەڕەیەکی بەکارھێنەری. تکایە ئەمە لەبەرچاو بگرە تەنیا پەڕەکە دەگوازرێتەوە و ناوی بەکارھێنەر <em>ناگۆڕدرێ</em>.",
+       "movecategorypage-warning": "<strong>ھۆشدار:</strong> تۆ خەریکی گواستنەوەی پەڕەی پۆلی. تکایە ئەمە لەبەرچاو بگرە تەنیا پەڕەکە دەگوازرێتەوە و پەڕەکانی ناو پۆلە کۆنەکە <em>ناچێتە</em> ناو پۆلە نوێکەوە.",
        "movenologintext": "بۆ گواستنەوەی پەڕەیەک، ئەشێ ببی بە ئەندام و [[Special:UserLogin|لە ژوورەوە]] بیت.",
        "movenotallowed": "ڕێگەت پێ‌نەدراوە بۆ گواستنەوەی لاپەڕەکان.",
        "movenotallowedfile": "ڕێگەت پێ‌نەدراوە بۆ گواستنەوەی پەڕگەکان.",
        "import": "ھاوردنی پەڕەکان",
        "importinterwiki": "ھاوردنی ناووویکی",
        "import-interwiki-text": "بۆ ھاوردن، ویکییەک و سەردێڕێکی پەڕە ھەڵبژێرە.\nڕێکەوتەکانی پێداچوونەوە و ناوی دەستکاریکەرەکان دەپارێزرێت.\nهەموو کردەوەکانی ھاوردنی ناوویکی لە [[Special:Log/import|لۆگی ھاوردن]]دا تۆمار دەکرێت.",
-       "import-interwiki-source": "ویکی/پەڕەی سەرچاوە:",
+       "import-interwiki-sourcewiki": "ویکی سەرچاوە:",
+       "import-interwiki-sourcepage": "پەڕەی سەرچاوە:",
        "import-interwiki-history": "هەموو مێژووی پێداچوونەوەکانی ئەم پەڕەیە کۆپی بکە",
        "import-interwiki-templates": "ھەموو داڕێژەکان لەخۆبگرێتەوە",
        "import-interwiki-submit": "هاوردە بکە",
        "import-upload": "بارکردنی دراوەی XML",
        "import-token-mismatch": "لەدەستدانی دراوەکانی کۆڕ.\nتکایە دیسان تاقی بکەوە.",
        "import-invalid-interwiki": "لە ویکی‌ دیاریکراو ھاوردن ناکرێ.",
-       "import-error-edit": "پەڕەی «$1» ھاوردە ناکرێ، چون ناتوانی ئەم پەڕەیە دەستکاری بکەی.",
-       "import-error-create": "پەڕەی «$1» ھاوردە ناکرێ، چون ناتوانی ئەم پەڕەیە دروست بکەی.",
-       "import-error-interwiki": "پەڕەی «$1» ھاوردە ناکرێ چون ناوەکەی بۆ بەستەری دەرەکیی (interwiki) گیراوەتەوە.",
-       "import-error-special": "پەڕەی «$1» ھاوردە ناکرێ چون لە بۆشاییی ناوی نەگونجاودایە.",
+       "import-error-edit": "پەڕەی «$1» ھاوردە نەکرا، چون ناتوانی ئەم پەڕەیە دەستکاری بکەی.",
+       "import-error-create": "پەڕەی «$1» ھاوردە نەکرا، چون ناتوانی ئەم پەڕەیە دروست بکەی.",
+       "import-error-interwiki": "پەڕەی «$1» ھاوردە نەکرا چون ناوەکەی بۆ بەستەری دەرەکیی (interwiki) گیراوەتەوە.",
+       "import-error-special": "پەڕەی «$1» ھاوردە نەکرا چون لە بۆشاییی ناوی نەگونجاودایە.",
        "import-error-invalid": "پەڕەی «$1» ھاوردە ناکرێ چون ناوەکەی نادروستە.",
        "importlogpage": "لۆگی ھاوردن",
        "importlogpagetext": "ھاوردنی پەڕەکان لەگەڵ مێژووی دەستکاری لە ویکییەکانی ترەوە.",
        "import-logentry-upload": "[[$1]]ی بە بارکردنی پەڕگە ھاورد",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|پێداچوونەوە}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|پێداچوونەوە}} ھاوردە کرا",
        "import-logentry-interwiki": "$1ی ناوویکی کرد",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|پێداچوونەوە}} لە $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|پێداچوونەوە}} لە $2 ھاوردە کرا",
        "javascripttest": "تاقیکردنەوەی جاڤاسکریپت",
        "tooltip-pt-userpage": "پەڕەی بەکارھێنەرییەکەت",
        "tooltip-pt-anonuserpage": "پەڕەی بەکارھێنەری بۆ ئای‌پی یەکە کە بەناویەوە خەریکی دەستکاری کردنی",
        "exif-urgency-normal": "ئاسایی ($1)",
        "exif-urgency-low": "کەم ($1)",
        "exif-urgency-high": "زۆر ($1)",
-       "watchlistall2": "ھەموو",
        "namespacesall": "ھەموو",
        "monthsall": "ھەموو",
        "confirmemail": "بڕواپێکردنی ناونیشانی ئیمەیل",
        "autosumm-replace": "«$1»ی لە جێی ناوەرۆک دانا",
        "autoredircomment": "ڕەوانە کرا بۆ [[$1]]",
        "autosumm-new": "پەڕەی دروست کرد بە «$1»ەوە",
+       "autosumm-newblank": "پەڕەی واڵای دروست کرد",
        "size-bytes": "$1 بایت",
        "size-kilobytes": "$1 کیلۆبایت",
        "size-megabytes": "$1 مێگابایت",
        "version-software-product": "بەرهەم",
        "version-software-version": "وەشان",
        "version-entrypoints-header-url": "ناونیشانی ئینتەرنێتی",
+       "redirect": "ڕەوانەکەر بە پێی پەڕگە، بەکارھێنەر، پەڕە یان پێناسەی پێداچوونەوە",
+       "redirect-legend": "ڕەوانەکەر بۆ پەڕگە یان پەڕەیەک",
+       "redirect-summary": "ئەم پەڕە تایبەتە ڕەوانە دەکرێ بۆ پەڕگەیەک (ناوی پەڕگەکە)، پەڕەیەک (پێناسەی پێداچوونەوەیەک یان پێناسەی پەڕە) یان پەڕەیەکی بەکارھێنەر (پێناسەیەکی  ژمارەیی بەکارھێنەر). بەکارھێنان: [[{{#Special:Redirect}}/file/Example.jpg]]، [[{{#Special:Redirect}}/page/64308]]، [[{{#Special:Redirect}}/revision/328429]] یان [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "بڕۆ",
+       "redirect-lookup": "گەڕان لە:",
+       "redirect-value": "نرخ:",
+       "redirect-user": "پێناسەی بەکارھێنەر",
+       "redirect-page": "پێناسەی پەڕە",
+       "redirect-revision": "پێداچوونەوەی پەڕە",
+       "redirect-file": "ناوی پەڕگە",
        "fileduplicatesearch": "گەڕان بۆ پەڕگە دووپات کراوەکان",
        "fileduplicatesearch-summary": "گەڕان بۆ پەڕگە دووبارەکراوەکان لەسەر بنەمای نرخی hash.",
        "fileduplicatesearch-legend": "گەڕان بۆ دووبارەکردنێک",
        "fileduplicatesearch-noresults": "پەڕگەیەک بە ناوی «$1» نەدۆزرایەوە.",
        "specialpages": "پەڕە تایبەتەکان",
        "specialpages-note": "* پەڕە تایبەتە ئاسایییەکان.\n* <span class=\"mw-specialpagerestricted\">پەڕە تایبەتە بەرگری‌لێکراوەکان.</span>",
-       "specialpages-group-maintenance": "Ú\95اپÛ\86رتÛ\95کاÙ\86Û\8c Ú\86اکسازÛ\8c",
+       "specialpages-group-maintenance": "Ú\95اپÛ\86رتÛ\95کاÙ\86Û\8c Ú\95اگرتÙ\86",
        "specialpages-group-other": "پەڕە تایبەتەکانی دیکە",
        "specialpages-group-login": "چوونەژوورەوە / دروستکردنی ھەژمار",
        "specialpages-group-changes": "دوایین گۆڕانکارییەکان و لۆگەکان",
        "specialpages-group-pages": "پێرستەکانی پەڕەکان",
        "specialpages-group-pagetools": "ئامرازەکانی پەڕە",
        "specialpages-group-wiki": "دراوەکان و ئامرازەکان",
-       "specialpages-group-redirects": "پەڕە تایبەتەکانی رەوانکردنەوە",
+       "specialpages-group-redirects": "پەڕە تایبەتەکانی ڕەوانەکردن",
        "specialpages-group-spam": "ئامرازەکانی سپەم",
        "blankpage": "پەڕەی واڵا",
        "intentionallyblankpage": "ئەم پەڕەیە لەقەست واڵا ھێڵراوەتەوە.",
        "external_image_whitelist": " #ئەم دێڕ ھەر بەم جۆرە کە ھەیە بەجێبێڵە<pre>\n#کەرتەکانی regular expression (تەنیا ئە بەشە کە لە نێوان // دا دێت) لە خوارەوە دابنێ\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#ئەو دێڕانە بە # دەست پێدەکەن وەک شرۆڤە (comments) مامەڵەیان لەگەڵ دەکرێ\n#بە گەورە و بچووکی پیتەکان ھەستیارە (case-insensitive)\n\n#گشت کەرتەکانی regex لە سەرەوەی ئەم دێرەدا دابنێ. ئەم دێڕ ھەر بەم جۆرە کە ھەیە بەجێبێڵە</pre>",
-       "tags": "گۆڕانکاری گونجاوی تاگەکان",
+       "tags": "تاگەکانی گۆڕانکاریی گونجاو",
        "tag-filter": "پاڵێوی [[Special:Tags|تاگ]]:",
        "tag-filter-submit": "پاڵاوتن",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|تاگ|تاگەکان}}]]: $2)",
        "tags-title": "تاگەکان",
        "tags-intro": "ئەم لاپەڕە ئەو تاگانەی لیست دەکات کە لەوانەیە نەرمامێر دەستکاریەکی بۆ نیشان بکات و مەبەستی نیشان بدات.",
        "tags-tag": "ناوی تاگ",
        "logentry-newusers-byemail": "ھەژماری بەکارھێنەریی $3 لە لایەن $1 {{GENDER:$2|دروست کرا}} و تێپەڕوشە بە ئیمەیل نێردرا",
        "logentry-newusers-autocreate": "ھەژماری بەکارھێنەریی $1 بە شێوەی خۆگەڕ {{GENDER:$2|دروست کرا}}",
        "logentry-rights-rights": "$1 ئەندامێتیی $3ی لە $4 بۆ $5 {{GENDER:$2|گۆڕی}}",
+       "logentry-upload-upload": "$1 $3ی {{GENDER:$2|بار کرد}}",
+       "logentry-upload-overwrite": "$1 وەشانێکی نوێی $3ی {{GENDER:$2|بار کرد}}",
        "rightsnone": "(ھیچ)",
+       "revdelete-summary": "پوختەی دەستکاری",
        "feedback-subject": "بابەت:",
        "feedback-message": "پەیام:",
        "feedback-cancel": "ھەڵیوەشێنەوە",
        "feedback-submit": "تێبینییەکان بنێرە",
-       "feedback-close": "ئەنجام درا",
+       "feedback-close": "کرا",
        "searchsuggest-search": "گەڕان",
        "searchsuggest-containing": "بە لەبەرگرتنەوەی ...",
        "api-error-empty-file": "ئەو پەڕگەیە کە ناردووتە واڵا بوو.",
index 01fe0c0..0dba989 100644 (file)
        "loginlanguagelabel": "Lingua: $1",
        "retypenew": "Scrive torna a nova parulla secreta:",
        "resetpass-submit-cancel": "Cancillà",
-       "changeemail-cancel": "Cancillà",
        "bold_sample": "Grassettu",
        "bold_tip": "Grassettu",
        "italic_sample": "Italicu",
        "search-section": "(sezzione $1)",
        "search-suggest": "Forse vulii dì",
        "searchrelated": "currilati",
-       "showingresultsheader": "{{PLURAL:$5|Risultatu '''$1''' di '''$3'''|Risultati '''$1 - $2''' di '''$3'''}} per '''$4'''",
        "search-nonefound": "A ricerca ùn hà micca datu risultati.",
        "powersearch-ns": "Circà in u spaziu di nomi",
        "preferences": "Preferenze",
        "pager-newer-n": "{{PLURAL:$1|1 più ricente|$1 più ricenti}}",
        "pager-older-n": "{{PLURAL:$1|1 menu ricente|$1 menu ricenti}}",
        "booksources": "Libri di fonti",
-       "booksources-go": "Andà",
        "specialloguserlabel": "Utilizatore:",
        "speciallogtitlelabel": "Titulu:",
        "log": "Righjistramenti",
        "watchlistfor2": "Per $1 ($2)",
        "watch": "Suvità",
        "unwatch": "Ùn suvità micca",
-       "wlshowlast": "Mustrà l'ultime $1 ore $2 ghjorni $3",
+       "wlshowlast": "Mustrà l'ultime $1 ore $2 ghjorni",
        "enotif_reset": "Marcà tutte e pagine visitate",
        "created": "creatu",
        "changed": "cambiatu",
        "exif-scenecapturetype-2": "Ritrattu",
        "exif-contrast-0": "Nurmale",
        "exif-saturation-0": "Nurmale",
-       "watchlistall2": "tutte",
        "monthsall": "tutti",
        "confirm_purge_button": "D'accordu",
        "table_pager_next": "Pagina seguente",
index a878acd..4d4784c 100644 (file)
        "search-interwiki-default": "$1 mga resulta:",
        "search-interwiki-more": "(mas damu pa)",
        "searchall": "tanan",
-       "showingresultsheader": "{{PLURAL:$5|Resulta nga '''$1''' sang '''$3'''|Mga resulta nga '''$1 - $2''' sang '''$3'''}} para sa '''$4'''",
        "search-nonefound": "Wala sang mga resulta nga nagatugma sa pamangkot/pagpamangkot.",
        "powersearch-legend": "Abanse nga pagpangita",
        "powersearch-ns": "Magpangita sa mga espasyo sang pangalan:",
        "pager-older-n": "{{PLURAL:$1|mas daan nga 1|mas daan nga $1}}",
        "booksources": "Mga makuhaan nga libro",
        "booksources-search-legend": "Magpangita sa makuha-an nga mga libro",
-       "booksources-go": "Padayon",
        "log": "Mga Listahan",
        "allpages": "Tanan nga pahina",
        "prevpage": "Antes nga pahina ($1)",
        "watchthispage": "Bantayan ang mini nga pahina",
        "unwatch": "Di pagbantayan",
        "watchlist-details": "{{PLURAL:$1|$1 ka pahina|$1 ka mga pahina}} sa imo listahan sang ginabantayan, wala madala ang mga pahina sang istoryahanay.",
-       "wlshowlast": "Ipakita ang nagligad nga $1 ka mga oras $2 ka mga adlaw $3",
+       "wlshowlast": "Ipakita ang nagligad nga $1 ka mga oras $2 ka mga adlaw",
        "watchlist-options": "Pililian para sa listahan sang mga ginabantayan",
        "watching": "Ginabantayan...",
        "unwatching": "Wala ginabantayan...",
        "metadata-expand": "Ipakita ang mga dugang nga detalye",
        "metadata-collapse": "Itago ang mga dugang nga detalye",
        "metadata-fields": "Ang mga lugar sang EXIF metadata nga nalista sa mini nga mensahe pagadal-on sa mga laragway nga ginapakita sa pahina kung maguba ang tabla sang metadata.\nAng iban ay pagataguon sang default.\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",
-       "watchlistall2": "tanan",
        "namespacesall": "tanan",
        "monthsall": "tanan",
        "watchlisttools-view": "Tan-awon ang mga kapareho nga ginbag-o",
index bc24170..f4c5e2a 100644 (file)
        "pager-older-n": "{{PLURAL:$1|1=даа эски 1|даа эски $1}}",
        "booksources": "Китаплар менбасы",
        "booksources-search-legend": "Китаплар менбасыны къыдырув",
-       "booksources-go": "Къыдыр",
        "specialloguserlabel": "Къулланыджы:",
        "speciallogtitlelabel": "Серлева:",
        "log": "Журналлар",
        "wlheader-enotif": "E-mail иле хабер берюв ачылды.",
        "wlheader-showupdated": "Сонъки зияретинъизден сонъ денъиштирильген саифелер '''къалын арифлернен''' косьтерильди.",
        "wlnote": "Ашагъыда саат $3, $4 ичюн сонъки {{PLURAL:$2|1=саат|'''$2''' саат}} ичинде япылгъан сонъки {{PLURAL:$1|1=денъиштирме|'''$1''' денъиштирме}} косьтериле.",
-       "wlshowlast": "Сонъки $1 саат ичюн, $2 кунь ичюн я да $3 косьтер",
+       "wlshowlast": "Сонъки $1 саат ичюн, $2 кунь ичюн я да  косьтер",
        "watchlist-options": "Козетюв джедвели сазламалары",
        "watching": "Козетюв джедвелине кирсетильмекте...",
        "unwatching": "Козетюв джедвелинден ёкъ этильмекте...",
        "exif-scenecapturetype-3": "Гедже съёмкасы",
        "exif-subjectdistancerange-0": "Билинмей",
        "exif-subjectdistancerange-1": "Макро",
-       "watchlistall2": "эписини",
        "namespacesall": "Эписи",
        "monthsall": "Эписи",
        "confirmemail": "E-mail адресини тасдыкъла",
index 1e10057..5d5288a 100644 (file)
        "pager-older-n": "{{PLURAL:$1|daa eski 1|daa eski $1}}",
        "booksources": "Kitaplar menbası",
        "booksources-search-legend": "Kitaplar menbasını qıdıruv",
-       "booksources-go": "Qıdır",
        "specialloguserlabel": "Qullanıcı:",
        "speciallogtitlelabel": "Serleva:",
        "log": "Jurnallar",
        "wlheader-enotif": "E-mail ile haber berüv açıldı.",
        "wlheader-showupdated": "Soñki ziyaretiñizden soñ deñiştirilgen saifeler '''qalın ariflernen''' kösterildi.",
        "wlnote": "Aşağıda saat $3, $4 içün soñki {{PLURAL:$2|saat|'''$2''' saat}} içinde yapılğan soñki {{PLURAL:$1|deñiştirme|'''$1''' deñiştirme}} kösterile.",
-       "wlshowlast": "Soñki $1 saat içün, $2 kün içün ya da $3 köster",
+       "wlshowlast": "Soñki $1 saat içün, $2 kün içün ya da  köster",
        "watchlist-options": "Közetüv cedveli sazlamaları",
        "watching": "Közetüv cedveline kirsetilmekte...",
        "unwatching": "Közetüv cedvelinden yoq etilmekte...",
        "exif-scenecapturetype-3": "Gece syomkası",
        "exif-subjectdistancerange-0": "Bilinmey",
        "exif-subjectdistancerange-1": "Makro",
-       "watchlistall2": "episini",
        "namespacesall": "Episi",
        "monthsall": "Episi",
        "confirmemail": "E-mail adresini tasdıqla",
index 4564c7e..36664d5 100644 (file)
        "otherlanguages": "V jiných jazycích",
        "redirectedfrom": "(Přesměrováno z $1)",
        "redirectpagesub": "Přesměrování",
+       "redirectto": "Přesměrování na:",
        "lastmodifiedat": "Stránka byla naposledy editována $1 v $2.",
        "viewcount": "Stránka byla zobrazena {{PLURAL:$1|jedenkrát|$1krát|$1krát}}.",
        "protectedpage": "Zamčená stránka",
        "nocookiesnew": "Uživatelský účet byl vytvořen, ale nejste přihlášeni. {{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím, zapněte je a poté se přihlaste svým novým uživatelským jménem a heslem.",
        "nocookieslogin": "{{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím zapněte je a zkuste znovu.",
        "nocookiesfornew": "Uživatelský účet nebyl založen, neboť jsme nebyli schopni potvrdit jeho původ.\nUjistěte se, že máte povoleny cookies, obnovte tuto stránku a zkuste to znovu.",
-       "noname": "Musíte uvést jméno svého účtu.",
+       "noname": "{{GENDER:|Nezadal|Nezadala|Nezadali}} jste platné uživatelské jméno.",
        "loginsuccesstitle": "Přihlášení bylo úspěšné",
        "loginsuccess": "Nyní jste přihlášen na {{grammar:6sg|{{SITENAME}}}} jako uživatel „$1“.",
        "nosuchuser": "Neexistuje uživatel se jménem „$1“. U uživatelských jmen se rozlišují malá/velká písmena. Zkontrolujte zápis, nebo si [[Special:UserLogin/signup|vytvořte nový účet]].",
        "createaccount-text": "Někdo na {{grammar:6sg|{{SITENAME}}}} ($4) vytvořil účet s vaší e-mailovou adresou.\nJméno účtu: „$2“\nHeslo: „$3“\nMěli byste se co nejdřív přihlásit a změnit si heslo.\n\nPokud byl účet vytvořen omylem, považujte tuto zprávu za bezpředmětnou.",
        "login-throttled": "Provedli jste příliš mnoho pokusů o přihlášení.\nNež to zkusíte znovu, musíte počkat na vypršení lhůty $1.",
        "login-abort-generic": "Vaše přihlášení se nezdařilo – přerušeno",
+       "login-migrated-generic": "Váš účet byl zmigrován a vaše uživatelské jméno již nadále na této wiki neexistuje.",
        "loginlanguagelabel": "Jazyk: $1",
        "suspicious-userlogout": "Váš požadavek na odhlášení byl odmítnut, neboť to vypadá, že ho poslal rozbitý prohlížeč nebo cachující proxy.",
        "createacct-another-realname-tip": "Skutečné jméno je nepovinné.\nPokud se ho rozhodnete uvést, bude použito pro označení autorství vaší práce.",
        "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-header": "Změna e-mailové adresy k účtu",
        "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-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-none": "(žádná)",
        "changeemail-password": "Vaše heslo do {{gender:2sg|{{SITENAME}}}}:",
        "changeemail-submit": "Změnit e-mail",
-       "changeemail-cancel": "Storno",
        "changeemail-throttled": "Provedli jste příliš mnoho pokusů o přihlášení.\nČekejte prosím $1 a zkuste to znovu.",
        "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.",
        "showpreview": "Ukázat náhled",
        "showdiff": "Ukázat změny",
        "blankarticle": "<strong>Upozornění:</strong> Stránka, kterou se chystáte založit, je prázdná. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude založena zcela bez obsahu.",
-       "anoneditwarning": "'''Varování:''' Nejste přihlášen(a). Vaše IP adresa bude zveřejněna v historii této stránky.",
+       "anoneditwarning": "'''Varování:''' Nejste přihlášen(a). Pokud uložíte jakoukoli editaci, bude vaše IP adresa zveřejněna v historii této stránky. Pokud se <strong>[$1 přihlásíte]</strong> nebo si <strong>[$2 vytvoříte účet]</strong>, budou vaše editace připsány vašemu uživatelskému jménu a získáte i další výhody.",
        "anonpreviewwarning": "''Nejste přihlášen(a). Uložením zveřejníte svou IP adresu v historii této stránky.''",
        "missingsummary": "'''Připomenutí:''' Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na Uložit změny, bude vaše editace zapsána bez shrnutí.",
        "missingcommenttext": "Zadejte komentář",
        "searchresults-title": "Výsledky hledání „$1“",
        "titlematches": "Stránky s odpovídajícím názvem",
        "textmatches": "Stránky s odpovídajícím textem",
-       "notextmatches": "Žádné stránky textem neodpovídají.",
+       "notextmatches": "Žádná stránka s tímto textem nebyla nalezena",
        "prevn": "$1 {{PLURAL:$1|předchozí|předchozí|předchozích}}",
        "nextn": "$1 {{PLURAL:$1|následující|následující|následujících}}",
        "prevn-title": "{{PLURAL:$1|Předchozí výsledek|Předchozí $1 výsledky|Předchozích $1 výsledků}}",
        "searchall": "vše",
        "showingresults": "Níže zobrazuji nejvýše <strong>$1</strong> {{PLURAL:$1|výsledek|výsledky|výsledků}} počínaje od <strong>$2</strong>.",
        "showingresultsinrange": "Níže zobrazuji nejvýše <strong>$1</strong> {{PLURAL:$1|výsledek|výsledky|výsledků}} v rozsahu #<strong>$2</strong>–#<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Výsledek '''$1''' z '''$3'''|Výsledky '''$1–$2''' z '''$3'''}} pro '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Výsledek <strong>$1</strong> z <strong>$3</strong>|Výsledky <strong>$1–$2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Na váš dotaz nebyly nalezeny žádné výsledky.",
        "powersearch-legend": "Rozšířené vyhledávání",
        "powersearch-ns": "Hledat ve jmenných prostorech:",
        "prefs-namespaces": "Jmenné prostory",
        "default": "implicitní",
        "prefs-files": "Soubory",
-       "prefs-custom-css": "Vlastní CSS",
-       "prefs-custom-js": "Vlastní JS",
-       "prefs-common-css-js": "Sdílené CSS/JS pro všechny styly:",
+       "prefs-custom-css": "Uživatelské CSS",
+       "prefs-custom-js": "Uživatelský JavaScript",
+       "prefs-common-css-js": "Sdílené CSS/JavaScript pro všechny styly:",
        "prefs-reset-intro": "Pomocí této stránky můžete všechna nastavení vrátit na implicitní hodnoty.\nTuto operaci nelze vrátit zpět.",
        "prefs-emailconfirm-label": "Ověření e-mailu:",
        "youremail": "E-mail:",
        "prefs-tokenwatchlist": "Klíč",
        "prefs-diffs": "Porovnání verzí",
        "prefs-help-prefershttps": "Toto nastavení se projeví při příštím přihlášení.",
+       "prefswarning-warning": "Provedli jste změny nastavení, které dosud nejsou uloženy. Pokud tuto stránku opustíte, aniž byste klikli na „$1“, vaše nastavení se nezmění.",
        "prefs-tabs-navigation-hint": "Tip: Pro přepínání mezi záložkami můžete používat šipky vlevo a vpravo.",
        "email-address-validity-valid": "E-mailová adresa vypadá jako platná",
        "email-address-validity-invalid": "Zadejte platnou e-mailovou adresu",
        "randomincategory": "Náhodná stránka z kategorie",
        "randomincategory-invalidcategory": "„$1“ není platný název kategorie.",
        "randomincategory-nopages": "V [[:Category:$1|kategorii $1]] žádné stránky nejsou.",
-       "randomincategory-selectcategory": "Získat náhodnou stránku z kategorie: $1 $2",
-       "randomincategory-selectcategory-submit": "Přejít",
+       "randomincategory-category": "Kategorie:",
+       "randomincategory-legend": "Náhodná stránka v kategorii",
        "randomredirect": "Náhodné přesměrování",
        "randomredirect-nopages": "Ve jmenném prostoru „$1“ nejsou žádná přesměrování.",
        "statistics": "Statistika",
        "querypage-disabled": "Tato speciální stránka je z výkonnostních důvodů vypnuta.",
        "booksources": "Zdroje knih",
        "booksources-search-legend": "Vyhledat knižní zdroje",
-       "booksources-go": "Vyhledat",
+       "booksources-search": "Hledat",
        "booksources-text": "Níže je seznam odkazů na servery prodávající knihy, nebo které mohou mít další informace o knihách, které hledáte.",
        "booksources-invalid-isbn": "Zadané ISBN se zdá být neplatné. Zkontrolujte jej s originálním zdrojem.",
        "specialloguserlabel": "Původce:",
        "wlheader-enotif": "Upozorňování e-mailem je zapnuto.",
        "wlheader-showupdated": "Stránky, které se změnily od vaší poslední návštěvy, jsou zobrazeny '''tučně'''.",
        "wlnote": "Níže {{PLURAL:$1|je poslední změna|jsou poslední <strong>$1</strong> změny|je posledních <strong>$1</strong> změn}} za {{PLURAL:$2|poslední hodinu|poslední <strong>$2</strong> hodiny|posledních <strong>$2</strong> hodin}} do $4, $3.",
-       "wlshowlast": "Ukázat posledních $1 hodin $2 dnů $3",
+       "wlshowlast": "Ukázat posledních $1 hodin $2 dnů",
        "watchlist-options": "Možnosti sledovaných stránek",
        "watching": "Přidávám na seznam sledovaných stránek…",
        "unwatching": "Odebírám ze seznamu sledovaných stránek…",
        "exbeforeblank": "obsah před vyprázdněním byl: „$1“",
        "delete-confirm": "Smazání stránky „$1“",
        "delete-legend": "Smazat",
-       "historywarning": "'''Varování:''' Stránka, kterou chcete smazat, má historii se zhruba $1 {{PLURAL:$1|revizí|revizemi}}:",
+       "historywarning": "<strong>Varování:</strong> Stránka, kterou se chystáte smazat, má historii s $1 {{PLURAL:$1|revizí|revizemi}}:",
        "confirmdeletetext": "Chystáte se smazat stránku s celou její historií. Prosím potvrďte, že to opravdu chcete učinit, že si uvědomujete důsledky a že je to v souladu s [[{{MediaWiki:Policy-url}}|pravidly]].",
        "actioncomplete": "Provedeno",
        "actionfailed": "Operace se nezdařila",
        "delete-edit-reasonlist": "Editovat důvody smazání",
        "delete-toobig": "Tato stránka má velkou historii editací, přes $1 {{PLURAL:$1|verzi|verze|verzí}}. Mazání takových stránek je omezeno, aby se předešlo nechtěnému narušení {{grammar:2sg|{{SITENAME}}}}.",
        "delete-warning-toobig": "Tato stránka má velkou historii editací, přes $1 {{PLURAL:$1|verzi|verze|verzí}}. Mazání takových stránek může narušit databázové operace {{grammar:2sg|{{SITENAME}}}}; postupujte opatrně.",
-       "delete-cantedit": "Tuto stránku nemůžete smazat, protože nemáte oprávnění ji editovat.",
+       "deleteprotected": "Tuto stránku nemůžete smazat, protože je zamčena.",
        "deleting-backlinks-warning": "'''Upozornění:''' Stránka, kterou se chystáte smazat, je [[Special:WhatLinksHere/{{FULLPAGENAME}}|na jiných stránkách]] odkazována nebo je do nich vložena.",
        "rollback": "Vrátit zpět editace",
        "rollback_short": "Vrátit zpět",
        "protect-othertime": "Jiný čas vypršení:",
        "protect-othertime-op": "jiný čas",
        "protect-existing-expiry": "Současný čas vypršení: $2, $3",
+       "protect-existing-expiry-infinity": "Současný čas vypršení: do odvolání",
        "protect-otherreason": "Jiný/další důvod:",
        "protect-otherreason-op": "Jiný důvod",
        "protect-dropdown": "*Obvyklé důvody zamčení\n** Opakovaný vandalismus\n** Vkládání reklamních externích odkazů\n** Editační válka\n** Často používaná stránka",
        "unblocked": "{{GENDER:$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.",
        "blocklist": "Zablokovaní uživatelé",
        "ipblocklist": "Zablokovaní uživatelé",
        "ipblocklist-legend": "Hledat zablokovaného uživatele",
        "import": "Import stránek",
        "importinterwiki": "Import mezi wiki",
        "import-interwiki-text": "Pro import zvolte zdrojovou wiki a název stránky. Data revizí a jména autorů budou zachována. Všechny importy se zaznamenávají do [[Special:Log/import|knihy importů]].",
-       "import-interwiki-source": "Zdrojová wiki/stránka:",
+       "import-interwiki-sourcewiki": "Zdrojová wiki:",
+       "import-interwiki-sourcepage": "Zdrojová stránka:",
        "import-interwiki-history": "Zkopírovat všechny historické verze této stránky",
        "import-interwiki-templates": "Zahrnout všechny šablony",
        "import-interwiki-submit": "Importovat",
        "import-error-create": "Stránka „$1“ se nenaimportovala, protože nemáte oprávnění ji založit.",
        "import-error-interwiki": "Stránka „$1“ se nenaimportovala, protože její název je vyhrazen pro externí odkazy (interwiki).",
        "import-error-special": "Stránka „$1“ se nenaimportovala, protože patří do speciálního jmenného prostoru, ve kterém stránky být nemohou.",
-       "import-error-invalid": "Stránka „$1“ se nenaimportovala, protože název, do kterého by se naimportovala, je na této wiki nepoužitelný.",
+       "import-error-invalid": "Stránka „$1“ se nenaimportovala, protože název, pod kterým by se naimportovala, je na této wiki nepoužitelný.",
        "import-error-unserialize": "Nepodařilo se deserializovat revizi $2 stránky „$1“. Revize měla používat model obsahu $3 serializovaný jako $4.",
        "import-error-bad-location": "Revizi $2 používající obsahový model $3 nelze uložit na \"$1\" na této wiki, neboť tento model není na této stránce podporován.",
        "import-options-wrong": "{{PLURAL:$2|Chybná volba|Chybné volby}}: <nowiki>$1</nowiki>",
        "tooltip-pt-anonuserpage": "Uživatelská stránka pro IP adresu, ze které editujete",
        "tooltip-pt-mytalk": "Vaše diskusní stránka",
        "tooltip-pt-anontalk": "Diskuse o editacích provedených z této IP adresy",
-       "tooltip-pt-preferences": "Moje nastavení",
-       "tooltip-pt-watchlist": "Seznam stránek, jejichž změny sleduji",
+       "tooltip-pt-preferences": "Vaše nastavení",
+       "tooltip-pt-watchlist": "Seznam stránek, jejichž změny sledujete",
        "tooltip-pt-mycontris": "Seznam vašich příspěvků",
        "tooltip-pt-login": "Doporučujeme vám přihlásit se, ovšem není to povinné.",
        "tooltip-pt-logout": "Odhlásit se",
        "exif-urgency-low": "Nízká ($1)",
        "exif-urgency-high": "Vysoká ($1)",
        "exif-urgency-other": "Uživatelsky definovaná ($1)",
-       "watchlistall2": "všechny",
        "namespacesall": "všechny",
        "monthsall": "všechny",
        "confirmemail": "Potvrzení e-mailové adresy",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|načetl|načetla}} novou verzi $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|načetl|načetla}} $3",
        "rightsnone": "(žádné)",
+       "revdelete-summary": "shrnutí editace",
        "feedback-bugornote": "Pokud dokážete podrobně popsat technický problém, můžete [$1 nahlásit chybu].\nJinak můžete využít jednoduchý formulář níže. Váš komentář bude přidán na stránku „[$3 $2]“ spolu s vaším uživatelským jménem a informací o tom, jaký prohlížeč používáte.",
        "feedback-subject": "Předmět:",
        "feedback-message": "Zpráva:",
        "log-name-pagelang": "Kniha změn jazyků",
        "log-description-pagelang": "Toto je protokol změn jazyků stránek.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|změnil|změnila}} jazyk stránky $3 z $4 na $5.",
-       "default-skin-not-found": "Jejda! Výchozí vzhled vaší wiki (<code>$wgDefaultSkin</code>), <code>$1</code>, není dostupný.\n\nVaše instalace zřejmě obsahuje následující vzhledy. Informace o tom, jak je povolit a vybrat výchozí, najdete na stránce [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration/cs Manual:Skin configuration].\n\n$2\n\n; Pokud jste právě nainstalovali MediaWiki:\n: Zřejmě jste instalovali z gitu nebo nějakým jiným způsobem přímo ze zdrojového kódu. Tak to má fungovat. Zkuste nainstalovat některé vzhledy ze [https://www.mediawiki.org/wiki/Category:All_skins seznamu vzhledů na mediawiki.org] buď:\n:* Můžete si stáhnout [https://www.mediawiki.org/wiki/Download/cs instalace v tarballu], která zahrnuje několik vzhledů a rozšíření, a vykopírovat si z ní adresář <code>skins/</code>, nebo\n:* Nebo si můžete gitem naklonovat jeden z repozitářů <code>mediawiki/skins/*</code> do adresáře <code>skins/</code> ve vaší instalaci MediaWiki.\n: Pokud jste vývojářem MediaWiki, nemělo by to nijak narušit váš gitový repozitář.\n\n; Pokud jste právě aktualizovali MediaWiki:\n: MediaWiki 1.24 a novější již automaticky nepovolují nainstalované vzhledy (vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_autodiscovery/cs Manual:Skin autodiscovery]). Pro povolení všech právě nainstalovaných vzhledů vlepte následující řádky do <code>LocalSettings.php</code>:\n\n<pre>$3</pre>\n\n; Pokud jste právě upravili <code>LocalSettings.php</code>:\n: Překontrolujte případné překlepy v názvech vzhledů.",
-       "default-skin-not-found-no-skins": "Jejda! Výchozí vzhled vaší wiki (<code>$wgDefaultSkin</code>), <code>$1</code>, není dostupný.\n\nNemáte nainstalovány žádné vzhledy.\n\n; Pokud jste právě nainstalovali nebo aktualizovali MediaWiki:\n: Zřejmě jste instalovali z gitu nebo nějakým jiným způsobem přímo ze zdrojového kódu. Tak to má fungovat. MediaWiki 1.24 a novější již v hlavním repozitáři neobsahují žádné vzhledy. Zkuste nainstalovat některé vzhledy ze [https://www.mediawiki.org/wiki/Category:All_skins seznamu vzhledů na mediawiki.org] buď:\n:* Můžete si stáhnout [https://www.mediawiki.org/wiki/Download/cs instalace v tarballu], která zahrnuje několik vzhledů a rozšíření, a vykopírovat si z ní adresář <code>skins/</code>, nebo\n:* Nebo si můžete gitem naklonovat jeden z repozitářů <code>mediawiki/skins/*</code> do adresáře <code>skins/</code> ve vaší instalaci MediaWiki.\n: Pokud jste vývojářem MediaWiki, nemělo by to nijak narušit váš gitový repozitář. Informace o tom, jak povolit vzhledy a vybrat výchozí, najdete na stránce [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration/cs Manual:Skin configuration].",
+       "default-skin-not-found": "Jejda! Výchozí vzhled vaší wiki, definovaný ve <code dir=\"ltr\">$wgDefaultSkin</code> jako <code>$1</code>, není dostupný.\n\nVaše instalace zřejmě obsahuje následující vzhledy. Informace o tom, jak je povolit a vybrat výchozí, najdete na stránce [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration/cs Manual:Skin configuration].\n\n$2\n\n; Pokud jste právě nainstalovali MediaWiki:\n: Zřejmě jste instalovali z gitu nebo nějakým jiným způsobem přímo ze zdrojového kódu. Tak to má fungovat. Zkuste nainstalovat některé vzhledy ze [https://www.mediawiki.org/wiki/Category:All_skins seznamu vzhledů na mediawiki.org] buď:\n:* Můžete si stáhnout [https://www.mediawiki.org/wiki/Download/cs instalace v tarballu], která zahrnuje několik vzhledů a rozšíření, a vykopírovat si z ní adresář <code dir=\"ltr\">skins/</code>, nebo\n:* Nebo si můžete gitem naklonovat jeden z repozitářů <code>mediawiki/skins/*</code> do adresáře <code>skins/</code> ve vaší instalaci MediaWiki.\n: Pokud jste vývojářem MediaWiki, nemělo by to nijak narušit váš gitový repozitář.\n\n; Pokud jste právě aktualizovali MediaWiki:\n: MediaWiki 1.24 a novější již automaticky nepovolují nainstalované vzhledy (vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_autodiscovery/cs Manual:Skin autodiscovery]). Pro povolení všech právě nainstalovaných vzhledů vlepte následující řádky do <code>LocalSettings.php</code>:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Pokud jste právě upravili <code>LocalSettings.php</code>:\n: Překontrolujte případné překlepy v názvech vzhledů.",
+       "default-skin-not-found-no-skins": "Jejda! Výchozí vzhled vaší wiki, definovaný ve <code dir=\"ltr\">$wgDefaultSkin</code> jako <code>$1</code>, není dostupný.\n\nNemáte nainstalovány žádné vzhledy.\n\n; Pokud jste právě nainstalovali nebo aktualizovali MediaWiki:\n: Zřejmě jste instalovali z gitu nebo nějakým jiným způsobem přímo ze zdrojového kódu. Tak to má fungovat. MediaWiki 1.24 a novější již v hlavním repozitáři neobsahují žádné vzhledy. Zkuste nainstalovat některé vzhledy ze [https://www.mediawiki.org/wiki/Category:All_skins seznamu vzhledů na mediawiki.org] buď:\n:* Můžete si stáhnout [https://www.mediawiki.org/wiki/Download/cs instalace v tarballu], která zahrnuje několik vzhledů a rozšíření, a vykopírovat si z ní adresář <code>skins/</code>, nebo\n:* Nebo si můžete gitem naklonovat jeden z repozitářů <code>mediawiki/skins/*</code> do adresáře <code dir=\"ltr\">skins/</code> ve vaší instalaci MediaWiki.\n: Pokud jste vývojářem MediaWiki, nemělo by to nijak narušit váš gitový repozitář. Informace o tom, jak povolit vzhledy a vybrat výchozí, najdete na stránce [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration/cs Manual:Skin configuration].",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (povolený)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''zakázaný''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''zakázaný''')",
+       "mediastatistics": "Statistika souborů",
+       "mediastatistics-summary": "Statistika o typech načtených souborů. Zahrnuje vždy jen nejnovější verzi souboru. Staré nebo smazané verze se nezapočítávají.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajty|$1 bajtů}} ($2; $3 %)",
+       "mediastatistics-table-mimetype": "MIME typ",
+       "mediastatistics-table-extensions": "Možné přípony",
+       "mediastatistics-table-count": "Počet souborů",
+       "mediastatistics-table-totalbytes": "Celková velikost",
+       "mediastatistics-header-unknown": "Neznámé",
+       "mediastatistics-header-bitmap": "Rastrové obrázky",
+       "mediastatistics-header-drawing": "Kresby (vektorové obrázky)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videa",
+       "mediastatistics-header-multimedia": "Multimédia",
+       "mediastatistics-header-office": "Kancelářské soubory",
+       "mediastatistics-header-text": "Text",
+       "mediastatistics-header-executable": "Spustitelné soubory",
+       "mediastatistics-header-archive": "Komprimované formáty",
+       "json-warn-trailing-comma": "Z JSONu {{PLURAL:$1|byla odstraněna 1 koncová čárka|byly odstraněny $1 koncové čárky|bylo odstraněno $1 koncových čárek}}",
+       "json-error-unknown": "Došlo k potížím s JSONem. Chyba: $1",
+       "json-error-depth": "Byla překročena maximální hloubka zásobníku",
+       "json-error-state-mismatch": "Neplatný nebo poškozený JSON",
+       "json-error-ctrl-char": "Chybný řídicí znak, možná nesprávné kódování",
+       "json-error-syntax": "Syntaktická chyba",
+       "json-error-utf8": "Poškozené znaky UTF-8, možná nesprávné kódování",
+       "json-error-recursion": "Jeden či více rekurzivních odkazů v kódované hodnotě",
+       "json-error-inf-or-nan": "Jedna či více hodnot NAN nebo INF v kódované hodnotě",
+       "json-error-unsupported-type": "Dodána hodnota nekódovatelného typu"
 }
index 7049f9a..2f2094b 100644 (file)
        "pager-older-n": "{{PLURAL:$1|1 stôrszi|$1 stôrszé|$1 stôrszich}}",
        "booksources": "Ksążczi",
        "booksources-search-legend": "Szëkba za wëdowiédzą ò ksążkach",
-       "booksources-go": "Biéj",
        "specialloguserlabel": "Brëkòwnik:",
        "speciallogtitlelabel": "Titel:",
        "log": "Lodżi",
        "watchlist-details": "Ùzérôsz {{PLURAL:$1|$1 artikel|$1 artikle/-ów}}, nie rechùjąc diskùsëjów.",
        "wlheader-showupdated": "Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné '''pògrëbieniém'''",
        "wlnote": "Niżi môsz wëskrzënioné {{PLURAL:$1|slédną zmianã|'''$1''' slédnëch zmianów}} zrobioné òb {{PLURAL:$2|gòdzënã|'''$2''' gòdzënë/gòdzënów}}.",
-       "wlshowlast": "Wëskrzëni zjinaczi z $1 gòdzënów $2 dni $3",
+       "wlshowlast": "Wëskrzëni zjinaczi z $1 gòdzënów $2 dni",
        "watchlist-options": "Òptacëje ùzérónych",
        "watching": "Ùzéróm...",
        "unwatching": "Ju ni ùzéróm...",
        "exif-source": "Zdrój",
        "exif-languagecode": "Jãzëk",
        "exif-iimcategory-spo": "Szpòrt",
-       "watchlistall2": "wszëtczé",
        "namespacesall": "wszëtczé",
        "monthsall": "wszëtczé",
        "confirmemail_loggedin": "Twòjô adresa e-mail òsta pòcwierdzona.",
        "version": "Wersëjô",
        "specialpages": "Specjalné starnë",
        "revdelete-restricted": "nastôwi ògrańczenia dlô sprôwników",
-       "revdelete-unrestricted": "rëmôj ògrańczenia dlô sprôwników"
+       "revdelete-unrestricted": "rëmôj ògrańczenia dlô sprôwników",
+       "revdelete-summary": "òpisënk zjinaczi"
 }
index 3a0a6ab..223f7d1 100644 (file)
        "passwordreset-emailsent-capture": "Anfonwyd e-bost i ailosod cyfrinair, ac fe'i ddangosir isod.",
        "passwordreset-emailerror-capture": "Lluniwyd e-bost i ailosod cyfrinair fel ag a welir isod, ond ni lwyddwyd i'w anfon at y {{GENDER:$2|defnyddiwr}}: $1",
        "changeemail": "Newid y cyfeiriad e-bost",
-       "changeemail-header": "Newid cyfeiriad e-bost y cyfrif",
        "changeemail-text": "Cwblhewch y ffurflen hon i newid eich cyfeiriad e-bost. Bydd angen i chi roi eich cyfrinair i gadarnhau hyn o newid.",
        "changeemail-no-info": "Ni allwch fynd at y dudalen hon heblaw eich bod wedi mewngofnodi.",
        "changeemail-oldemail": "Y cyfeiriad e-bost presennol:",
        "changeemail-none": "(dim)",
        "changeemail-password": "Eich cyfrinair ar {{SITENAME}}:",
        "changeemail-submit": "Newidier y cyfeiriad e-bost",
-       "changeemail-cancel": "Diddymer",
        "changeemail-throttled": "'Da chi wedi trio mewngofnodi gormod o weithiau.\nDaliwch eich gafael am $1 cyn ceisio eto.",
        "resettokens": "Ailosod tocynnau",
        "resettokens-text": "Gallwch ailosod tocynnau sy'n galluogi mynediad at rai manylion preifat sydd ynghlwm wrth y cyfrif yma.\n\nDylech wneud hyn os wnaethoch rannu'r manylion hyn gyda rhywun ar ddamwain neu os oes problem wedi codi gyda diogelwch eich cyfrif.",
        "searchall": "oll",
        "showingresults": "Yn dangos $1 {{PLURAL:$1|canlyniad|canlyniad|ganlyniad|chanlyniad|chanlyniad|canlyniad}} isod gan ddechrau gyda rhif '''$2'''.",
        "showingresultsinrange": "Yn dangos hyd at {{PLURAL:$1||<strong>1</strong> canlyniad|<strong>$1</strong> ganlyniad|$1 o ganlyniadau}} isod yn yr ystod #<strong>$2</strong> i #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5||Canlyniad '''$1''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''}} ar gyfer '''$4'''",
        "search-nonefound": "Ni chafwyd dim canlyniadau i'r ymholiad.",
        "powersearch-legend": "Chwiliad uwch",
        "powersearch-ns": "Chwilio yn y parthau:",
        "randomincategory": "Tudalen ar hap o blith tudalennau'r categori",
        "randomincategory-invalidcategory": "Nid yw \"$1\" yn enw dilys i gategori.",
        "randomincategory-nopages": "Nid oes unrhyw dudalennau yn y categori [[:Category:$1]].",
-       "randomincategory-selectcategory": "Nôl tudalen ar hap o'r categori: $1 $2.",
-       "randomincategory-selectcategory-submit": "Gwneler",
        "randomredirect": "Tudalen ailgyfeirio ar hap",
        "randomredirect-nopages": "Does dim tudalennau ailgyfeirio yn y parth \"$1\".",
        "statistics": "Ystadegau",
        "querypage-disabled": "Analluogwyd y dudalen arbennig hon er mwyn osgoi iddi andwyo perfformiad y wefan.",
        "booksources": "Ffynonellau llyfrau",
        "booksources-search-legend": "Chwilier am lyfrau",
-       "booksources-go": "Mynd",
        "booksources-text": "Mae'r rhestr isod yn cynnwys cysylltiadau i wefannau sy'n gwerthu llyfrau newydd a rhai ail-law. Mae rhai o'r gwefannau hefyd yn cynnig gwybodaeth pellach am y llyfrau hyn:",
        "booksources-invalid-isbn": "Ymddengys nad yw'r rhif ISBN hwn yn ddilys; efallai y cafwyd gwall wrth drosglwyddo'r rhif.",
        "specialloguserlabel": "Gwneuthurwr:",
        "wlheader-enotif": "Galluogwyd hysbysiadau trwy e-bost.",
        "wlheader-showupdated": "Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''.",
        "wlnote": "{{PLURAL:$1|Ni fu unrhyw newid|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf}} yn ystod {{PLURAL:$2||yr awr|y ddwyawr|y teirawr|y \"$2\" awr|y(r) \"$2\" awr}} ddiwethaf, fel ag yr oedd am $4, $3.",
-       "wlshowlast": "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r $3 newidiadau.",
+       "wlshowlast": "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r  newidiadau.",
        "watchlist-options": "Dewisiadau ar gyfer y rhestr wylio",
        "watching": "Wrthi'n ychwanegu...",
        "unwatching": "Wrthi'n tynnu...",
        "import": "Mewnforio tudalennau",
        "importinterwiki": "Mewnforiad traws-wici",
        "import-interwiki-text": "Dewiswch wici a thudalen i'w mewnforio.\nFe gedwir dyddiadau ac enwau'r golygwyr ar gyfer y diwygiadau i'r dudalen.\nMae cofnod o bob weithred o fewnforio i'w gweld ar y [[Special:Log/import|lòg mewnforio]].",
-       "import-interwiki-source": "Wici/tudalen y gwreiddiol:",
        "import-interwiki-history": "Copïer yr holl fersiynau yn hanes y dudalen hon",
        "import-interwiki-templates": "Cynhwyser pob nodyn",
        "import-interwiki-submit": "Mewnforio",
        "exif-urgency-low": "Isel ($1)",
        "exif-urgency-high": "Uchel ($1)",
        "exif-urgency-other": "Blaenoriaeth yn ôl y defnyddiwr ($1)",
-       "watchlistall2": "holl",
        "namespacesall": "pob un",
        "monthsall": "pob mis",
        "confirmemail": "Cadarnhau'r cyfeiriad e-bost",
        "logentry-rights-rights-legacy": "{{GENDER:$2|Newidiodd}} $1 y grwpiau y mae $3 yn aelod ohonynt",
        "logentry-rights-autopromote": "{{GENDER:$2|Dyrchafwyd}} $1 yn awtomatig o $4 i $5",
        "rightsnone": "(dim)",
+       "revdelete-summary": "crynodeb golygu",
        "feedback-bugornote": "Os ydych yn barod i ddisgrifio problem technegol yn fanwl gallwch [$1 gyflwyno adroddiad am y bỳg]. Fel arall, gallwch ddefnyddio'r ffurflen syml isod. Fe roddir eich sylwadau ar y dudalen \"[$3 $2]\", ynghyd â'ch enw defnyddiwr ac enw'r gweinydd sydd ar waith gennych.",
        "feedback-subject": "Gwrthrych:",
        "feedback-message": "Neges:",
index cc426f3..c3b4416 100644 (file)
        "resetpass-submit-loggedin": "Skift adgangskode",
        "resetpass-submit-cancel": "Annuller",
        "resetpass-wrong-oldpass": "Ugyldig midlertidig eller gældende adgangskode.\nDu har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlertidig kode.",
-       "resetpass-recycled": "Vær venlig at ændre dit kodeord til et andet end dit nuværende kodeord.",
-       "resetpass-temp-emailed": "Du loggede på med en midlertidig kode tilsendt på e-mail.\nFor at afslutte indlogning, skal du oprette et nyt kodeord:",
+       "resetpass-recycled": "Vær venlig at ændre din adgangskode til noget andet end din nuværende adgangskode.",
+       "resetpass-temp-emailed": "Du loggede på med en midlertidig kode tilsendt på e-mail.\nFor at afslutte indlogning, skal du oprette en nyt adgangskode:",
        "resetpass-temp-password": "Midlertidig adgangskode",
        "resetpass-abort-generic": "Ændring af adgangskode er blevet afbrudt af en udvidelse",
-       "resetpass-expired": "Dit kodeord er udløbet. Vær venlig at ændre det til et nyt.",
+       "resetpass-expired": "Din adgangskode er udløbet. Angiv en ny adgangskode for at logge på.",
        "resetpass-expired-soft": "Din adgangskode er udløbet og skal ændres. Vær venlig at ændre den nu, eller tryk \"{{int:resetpass-submit-cancel}}\" for at ændre den senere.",
        "resetpass-validity-soft": "Din adgangskode er ikke gyldig:  $1 \n\nVær venlig at ændre den nu, eller tryk \"{{int:resetpass-submit-cancel}}\" for at ændre den senere.",
        "passwordreset": "Nulstil adgangskode",
        "passwordreset-emailsent-capture": "En e-mail om nulstilling af adgangskode, som vist nedenfor, er blevet sendt.",
        "passwordreset-emailerror-capture": "En mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til {{GENDER:$2|bruger}}: $1",
        "changeemail": "Ændre e-mailadresse",
-       "changeemail-header": "Ændre kontoens e-mailadresse",
        "changeemail-text": "Udfyld denne formular for at ændre din e-mailadresse. Du skal indtaste din adgangskode for at bekræfte denne ændring.",
        "changeemail-no-info": "Du skal være logget på for at komme direkte til denne side.",
        "changeemail-oldemail": "Nuværende e-mailadresse:",
        "changeemail-none": "(ingen)",
        "changeemail-password": "Din adgangskode til {{SITENAME}}:",
        "changeemail-submit": "Ændre e-mail",
-       "changeemail-cancel": "Afbryd",
        "changeemail-throttled": "Du har forsøgt at logge på for mange gange.\nVent venligst $1, før du prøver igen.",
        "resettokens": "Nulstil nøgler",
        "resettokens-text": "Du kan nulstille nøgler, som giver adgang til visse private data i forbindelse med din konto her.\n\nDu bør gøre det, hvis du ved et uheld deler dem med nogen, eller hvis din konto er blevet kompromitteret.",
        "searchrelated": "relateret",
        "searchall": "alle",
        "showingresults": "Nedenfor vises <b>$1</b> {{PLURAL:$1|resultat|resultater}} startende med nummer <b>$2</b>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' af '''$3'''|Resultat '''$1 - $2''' af '''$3'''}} for '''$4'''",
        "search-nonefound": "Søgningen gav ingen resultater.",
        "powersearch-legend": "Avanceret søgning",
        "powersearch-ns": "Søg i navnerummene:",
        "randomincategory": "Tilfældig side i kategori",
        "randomincategory-invalidcategory": "\"$1\" er ikke et gyldigt kategorinavn.",
        "randomincategory-nopages": "Der er ingen sider i [[:Category:$1]].",
-       "randomincategory-selectcategory": "Få tilfældig side fra kategori: $1 $2.",
-       "randomincategory-selectcategory-submit": "Gå til",
+       "randomincategory-category": "Kategori:",
        "randomredirect": "Tilfældige henvisninger",
        "randomredirect-nopages": "Der er ingen omdirigeringer i navnerummet $1.",
        "statistics": "Statistik",
        "querypage-disabled": "Denne specialside er deaktiveret af hensyn til ydeevnen.",
        "booksources": "Bogkilder",
        "booksources-search-legend": "Søgning efter bøger",
-       "booksources-go": "Søg",
        "booksources-text": "Dette er en liste med henvisninger til Internetsider, som sælger nye og brugte bøger. Der kan der også findes yderligere informationer om bøgerne. {{SITENAME}} er ikke forbundet med nogen af dem.",
        "booksources-invalid-isbn": "Det angivne ISBN-nummer ser forkert ud. Tjek med kilden om det er skrevet korrekt.",
        "specialloguserlabel": "Udført af:",
        "listgrouprights-namespaceprotection-header": "Navnerumsbegrænsninger",
        "listgrouprights-namespaceprotection-namespace": "Navnerum",
        "listgrouprights-namespaceprotection-restrictedto": "Rettighed(er) der giver brugeren mulighed for at redigere",
+       "trackingcategories-desc": "Optagelseskriterier for kategori",
+       "noindex-category-desc": "Siden indekseres ikke af robotter, fordi den indeholder det magiske ord <code><nowiki>__NOINDEX__</nowiki></code> og er i et navnerum, hvor dette flag er tilladt.",
+       "index-category-desc": "Siden indeholder <code><nowiki>__INDEX__</nowiki></code> (og er i et navnerum, hvor dette flag er tilladt), og bliver derfor indekseret af robotter, hvor den normalt ikke ville blive det.",
        "mailnologin": "Du er ikke logget på",
        "mailnologintext": "Du skal være [[Special:UserLogin|logget på]] og have en gyldig e-mailadresse sat i dine [[Special:Preferences|indstillinger]] for at sende e-mail til andre brugere.",
        "emailuser": "E-mail til denne bruger",
        "watchlist-details": "Du har $1 {{PLURAL:$1|side|sider}} på din overvågningsliste (ekskl. diskussionssider).",
        "wlheader-enotif": "E-mail-underretning er slået til.",
        "wlheader-showupdated": "Sider, der er ændret siden dit sidste besøg, er vist med '''fed skrift'''.",
-       "wlnote": "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste '''$1''' ændringer}} i {{PLURAL:$2|den sidste time|de sidste '''$2''' timer}} op til den $3 kl. $4.",
-       "wlshowlast": "Vis de seneste $1 timer $2 dage $3",
+       "wlnote": "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste <strong>$1</strong> ændringer}} i {{PLURAL:$2|den sidste time|de sidste <strong>$2</strong> timer}} op til den $3 kl. $4.",
+       "wlshowlast": "Vis de seneste $1 timer $2 dage",
        "watchlist-options": "Indstillinger for overvågningslisten",
        "watching": "Tilføjer overvågning …",
        "unwatching": "Fjerner overvågning …",
        "exbeforeblank": "indholdet før siden blev tømt var: '$1'",
        "delete-confirm": "Slet \"$1\"",
        "delete-legend": "Slet",
-       "historywarning": "Advarsel: Siden du er ved at slette har en historie med $1 {{PLURAL:$1|revision|revisioner}}:",
+       "historywarning": "<strong>Advarsel:</strong> Siden du er ved at slette har en historie med $1 {{PLURAL:$1|version|versioner}}:",
        "confirmdeletetext": "Du er ved at slette en side sammen med hele dens tilhørende historik.\nBekræft venligst at du virkelig vil gøre dette, at du forstår konsekvenserne, og at du gør det i overensstemmelse med [[{{MediaWiki:Policy-url}}|retningslinjerne]].",
        "actioncomplete": "Gennemført",
        "actionfailed": "Handlingen mislykkedes",
        "delete-edit-reasonlist": "Rediger sletningsårsager",
        "delete-toobig": "Denne side har en stor historik, over {{PLURAL:$1|en version|$1 versioner}}. Sletning af sådanne sider er begrænset, for at forhindre utilsigtet forstyrrelse af {{SITENAME}}.",
        "delete-warning-toobig": "Denne side har en stor historik, over {{PLURAL:$1|en version|$1 versioner}} versioner, slettes den kan det forstyrre driften af {{SITENAME}}, gå forsigtigt frem.",
+       "deleteprotected": "Du kan ikke slette denne side, fordi den er beskyttet.",
        "deleting-backlinks-warning": "'''Advarsel:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Andre sider]] linker til eller inkluderer den side, du er ved at slette.",
        "rollback": "Fjern redigeringer",
        "rollback_short": "Fjern redigering",
        "contributions-title": "Brugerbidrag for $1",
        "mycontris": "Bidrag",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Brugerkontoen \"$1\" er ikke registreret.",
        "nocontribs": "Ingen ændringer er fundet som opfylder disse kriterier.",
        "uctop": "(seneste)",
        "month": "Måned:",
        "autoblockid": "Autoblock #$1",
        "block": "Bloker bruger",
        "unblock": "Ophæv blokering af bruger",
-       "blockip": "Bloker bruger",
+       "blockip": "Bloker {{GENDER:$1|bruger}}",
        "blockip-legend": "Bloker bruger",
        "blockiptext": "Brug formularen herunder til at blokere for skriveadgang fra en bestemt IP-adresse eller et brugernavn.\nDette bør kun gøres for at forhindre vandalisme og skal være i overensstemmelse med [[{{MediaWiki:Policy-url}}|retningslinjerne]].\nAngiv en konkret begrundelse herunder (for eksempel med angivelse af sider der har været udsat for vandalisme).",
        "ipaddressorusername": "IP-adresse eller brugernavn",
        "ipb-unblock-addr": "Ophæv blokeringen af \"$1\"",
        "ipb-unblock": "Frigive IP-adresse/bruger",
        "ipb-blocklist": "Vis alle blokeringer som er i kraft",
-       "ipb-blocklist-contribs": "Bidrag fra $1",
+       "ipb-blocklist-contribs": "Bidrag fra {{GENDER:$1|$1}}",
        "unblockip": "Ophæv blokering af bruger",
        "unblockiptext": "Brug formularen herunder for at gendanne skriveadgangen for en tidligere blokeret IP-adresse eller bruger.",
        "ipusubmit": "Ophæv blokeringen",
        "import": "Importer sider",
        "importinterwiki": "Importer sider fra en anden wiki",
        "import-interwiki-text": "Vælg en Wiki og en side til importen.\nDatoen i den pågældende version og forfatterne ændres ikke.\nAlle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-loggen]].",
-       "import-interwiki-source": "Kildewiki/-side:",
        "import-interwiki-history": "Importer alle versioner af denne side",
        "import-interwiki-templates": "Inkluder alle skabeloner",
        "import-interwiki-submit": "Importer",
        "import-upload": "Upload XML-data",
        "import-token-mismatch": "Sessionsdata er mistet. Prøv venligst igen.",
        "import-invalid-interwiki": "Kan ikke importere fra den angivne wiki.",
-       "import-error-edit": "Siden \"$1\" importeres ikke, da du ikke har rettigheden til at redigere den.",
-       "import-error-create": "Siden \"$1\" importeres ikke, da du ikke har rettigheden til at oprette den.",
-       "import-error-interwiki": "Siden \"$1\" importeres ikke, da dens navn er reserveret for eksterne henvisninger (interwiki).",
-       "import-error-special": "Siden \"$1\" importeres ikke, da den tilhører et særligt navnerum, der ikke tillader sider.",
-       "import-error-invalid": "Siden \"$1\" importeres ikke, da dens navn er ugyldigt.",
+       "import-error-edit": "Siden \"$1\" blev ikke importeret, da du ikke har rettighed til at redigere den.",
+       "import-error-create": "Siden \"$1\" blev ikke importeret, da du ikke har rettighed til at oprette den.",
+       "import-error-interwiki": "Siden \"$1\" blev ikke importeret, da dens navn er reserveret for eksterne henvisninger (interwiki).",
+       "import-error-special": "Siden \"$1\" blev ikke importeret, da den tilhører et særligt navnerum, der ikke tillader sider.",
+       "import-error-invalid": "Siden \"$1\" blev ikke importeret, fordi det navn, som den ville være importeret til er ugyldigt på denne wiki.",
        "import-error-unserialize": "Ændring $2 af siden \"$1\" kunne ikke afserialiseres. Ændringen brugte indholdsmodel $3 serialiseret som $4.",
        "import-error-bad-location": "Version $2 der bruger indholdsmodellen $3 kan ikke gemmes på \"$1\" på denne wiki, da denne model ikke understøttes på denne side.",
        "import-options-wrong": "{{PLURAL:$2|Ugyldig indstilling|Ugyldige indstillinger}}: <nowiki>$1</nowiki>",
        "importlogpage": "Importlog",
        "importlogpagetext": "Administrativ import af sider med versionshistorik fra andre Wikis.",
        "import-logentry-upload": "[[$1]] blev importeret",
-       "import-logentry-upload-detail": "{{PLURAL:$1|1 version|$1 versioner}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versioner}} importeret",
        "import-logentry-interwiki": "$1 blev importeret (Transwiki)",
-       "import-logentry-interwiki-detail": "{{PLURAL:$1|1 version|$1 versioner}} af $2 importeret",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versioner}} importeret fra $2",
        "javascripttest": "Test af JavaScript",
        "javascripttest-title": "Kører $1 test",
        "javascripttest-pagetext-noframework": "Denne side er reserveret til at teste JavaScript.",
        "newimages-summary": "Denne specialside viser de senest oplagte filer.",
        "newimages-legend": "Filter",
        "newimages-label": "Filnavn (eller en del af det):",
+       "newimages-showbots": "Vis oplægninger af robotter",
        "noimages": "Ingen filer fundet.",
        "ilsubmit": "Søg",
        "bydate": "efter dato",
        "exif-urgency-low": "Lav ($1)",
        "exif-urgency-high": "Høj ($1)",
        "exif-urgency-other": "Bruger-defineret prioritet ($1)",
-       "watchlistall2": "alle",
        "namespacesall": "alle",
        "monthsall": "alle",
        "confirmemail": "Bekræft e-mailadresse",
        "confirm-watch-top": "Tilføj denne side til din overvågningsliste?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Fjern denne side fra din overvågningsliste?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← forrige side",
        "imgmultipagenext": "næste side →",
        "imgmultigo": "OK",
        "autosumm-replace": "Erstatter sidens indhold med \"$1\"",
        "autoredircomment": "Omdirigering til [[$1]] oprettet",
        "autosumm-new": "Oprettede siden med \"$1\"",
+       "autosumm-newblank": "Oprettede tom side",
        "lag-warn-normal": "Ændringer som er nyere end {{PLURAL:$1|et sekund|$1 sekunder}}, vises muligvis ikke i denne liste.",
        "lag-warn-high": "Grundet stor belastning af databaseserveren vil ændringer der er nyere end {{PLURAL:$1|et sekund|$1 sekunder}} måske ikke blive vist i denne liste.",
        "watchlistedit-normal-title": "Rediger overvågningsliste",
        "watchlistedit-raw-done": "Din overvågningsliste blev opdateret.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 side|$1 sider}} er tilføjet:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 side|$1 sider}} er fjernet:",
+       "watchlistedit-clear-title": "Ryddet overvågningsliste",
+       "watchlistedit-clear-legend": "Ryd overvågningsliste",
+       "watchlistedit-clear-explain": "Alle siderne vil blive fjernet fra din overvågningsliste",
+       "watchlistedit-clear-titles": "Sider:",
+       "watchlistedit-clear-submit": "Ryd overvågningslisten (dette er permanent!)",
+       "watchlistedit-clear-done": "Din overvågningsliste er blevet ryddet.",
        "watchlisttools-clear": "Ryd overvågningsliste",
        "watchlisttools-view": "Se ændrede sider i overvågningslisten",
        "watchlisttools-edit": "Rediger overvågningsliste",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3",
        "logentry-rights-autopromote": "$1 blev automatisk {{GENDER:$2|forfremmet}} fra $4 til $5",
        "rightsnone": "(-)",
+       "revdelete-summary": "redigeringsbeskrivelse",
        "feedback-bugornote": "Hvis du er klar til at beskrive et teknisk problem i detaljer, bedes du [$1 rapportere en fejl].\nEllers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføjet siden \"[$3 $2]\" sammen med dit brugernavn og den browser, du anvender.",
        "feedback-subject": "Emne:",
        "feedback-message": "Besked:",
index 90bff13..fae849e 100644 (file)
@@ -82,7 +82,7 @@
        "tog-hideminor": "Kleine Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-hidepatrolled": "Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-newpageshidepatrolled": "Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden",
-       "tog-extendwatchlist": "Beobachtungsliste erweitern, um statt nur der letzten Änderung alle Änderungen anzuzeigen.",
+       "tog-extendwatchlist": "Alle, und nicht nur die aktuellsten Änderungen in der Beobachtungsliste anzeigen",
        "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
        "tog-numberheadings": "Überschriften automatisch nummerieren",
        "tog-showtoolbar": "Bearbeiten-Werkzeugleiste anzeigen",
@@ -92,7 +92,7 @@
        "tog-watchdefault": "Selbst geänderte Seiten und Dateien automatisch beobachten",
        "tog-watchmoves": "Selbst verschobene Seiten und Dateien automatisch beobachten",
        "tog-watchdeletion": "Selbst gelöschte Seiten und Dateien automatisch beobachten",
-       "tog-watchrollback": "Seiten der Beobachtungsliste hinzufügen, bei denen ich eine Zurücksetzung durchgeführt habe.",
+       "tog-watchrollback": "Seiten, bei denen ich eine Zurücksetzung durchgeführt habe, der Beobachtungsliste hinzufügen.",
        "tog-minordefault": "Eigene Änderungen standardmäßig als geringfügig markieren",
        "tog-previewontop": "Vorschau oberhalb des Bearbeitungsfensters anzeigen",
        "tog-previewonfirst": "Beim ersten Bearbeiten immer die Vorschau anzeigen",
        "otherlanguages": "In anderen Sprachen",
        "redirectedfrom": "(Weitergeleitet von $1)",
        "redirectpagesub": "Weiterleitung",
+       "redirectto": "Weiterleitung nach:",
        "lastmodifiedat": "Diese Seite wurde zuletzt am $1 um $2 Uhr geändert.",
        "viewcount": "Diese Seite wurde bisher {{PLURAL:$1|einmal|$1 mal}} abgerufen.",
        "protectedpage": "Geschützte Seite",
        "createaccount-text": "Es wurde für dich ein Benutzerkonto „$2“ auf {{SITENAME}} ($4) erstellt. Das automatisch generierte Passwort für „$2“ ist „$3“. Du solltest dich nun anmelden und das Passwort ändern.\n\nFalls das Benutzerkonto irrtümlich angelegt wurde, kannst du diese Nachricht ignorieren.",
        "login-throttled": "Du hast zu oft versucht, dich anzumelden.\nBitte warte $1, bevor du es erneut probierst.",
        "login-abort-generic": "Deine Anmeldung war nicht erfolgreich – Abgebrochen",
+       "login-migrated-generic": "Dein Benutzerkonto wurde migriert. Dein Benutzername ist auf diesem Wiki nicht mehr vorhanden.",
        "loginlanguagelabel": "Sprache: $1",
        "suspicious-userlogout": "Deine Abmeldeanfrage wurde verweigert, da sie vermutlich von einem defekten Browser oder einem Cache-Proxy gesendet wurde.",
        "createacct-another-realname-tip": "Der bürgerliche Name ist optional.\nWenn du ihn angibst, wird er für die Zuordnung der Beiträge verwendet.",
        "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-header": "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-no-info": "Du musst angemeldet sein, um direkt auf diese Seite zugreifen zu können.",
        "changeemail-oldemail": "Aktuelle E-Mail-Adresse:",
        "changeemail-none": "(keine)",
        "changeemail-password": "Dein {{SITENAME}}-Passwort:",
        "changeemail-submit": "E-Mail-Adresse ändern",
-       "changeemail-cancel": "Abbrechen",
        "changeemail-throttled": "Du hast zu viele Anmeldeversuche unternommen.\nBitte warte $1, bevor du es erneut versuchst.",
        "resettokens": "Tokens zurücksetzen",
        "resettokens-text": "Du kannst Tokens zurücksetzen, welche dir den Zugriff auf bestimmte private Daten ermöglichen, die mit deinem Benutzerkonto hier verknüpft sind.\n\nDu solltest dies nur machen, wenn du die Tokens versehentlich mit jemandem geteilt hast oder dein Konto gefährdet ist.",
        "showpreview": "Vorschau zeigen",
        "showdiff": "Änderungen zeigen",
        "blankarticle": "<strong>Warnung:</strong> Die Seite, die du erstellst, ist leer.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Seite ohne Inhalt erstellt.",
-       "anoneditwarning": "Du bearbeitest diese Seite unangemeldet. Wenn du sie abspeicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
+       "anoneditwarning": "<strong>Warnung:</strong> Du bist nicht angemeldet. Deine IP-Adresse wird öffentlich sichtbar, falls du Bearbeitungen durchführst. Wenn du dich <strong>[$1 anmeldest]</strong> oder <strong>[$2 ein Benutzerkonto erstellst]</strong>, werden deine Bearbeitungen zusammen mit anderen Beiträgen deinem Benutzernamen zugeordnet.",
        "anonpreviewwarning": "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
        "missingsummary": "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
        "missingcommenttext": "Dein Abschnitt enthält keinen Text.",
        "searchall": "alle",
        "showingresults": "Hier {{PLURAL:$1|ist '''1''' Ergebnis|sind '''$1''' Ergebnisse}}, beginnend mit Nummer '''$2.'''",
        "showingresultsinrange": "Unten {{PLURAL:$1|wird <strong>ein</strong> Ergebnis|werden bis zu <strong>$1</strong> Ergebnisse}} im Bereich <strong>$2</strong> bis <strong>$3</strong> angezeigt.",
-       "showingresultsheader": "{{PLURAL:$5|Ergebnis '''$1''' von '''$3'''|Ergebnisse '''$1–$2''' von '''$3'''}} für '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Ergebnis <strong>$1</strong> von <strong>$3</strong>|Ergebnisse <strong>$1 bis $2</strong> von <strong>$3</strong>}}",
        "search-nonefound": "Zu deiner Suchanfrage wurden keine Ergebnisse gefunden.",
        "powersearch-legend": "Erweiterte Suche",
        "powersearch-ns": "Suche in Namensräumen:",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Versionsvergleich",
        "prefs-help-prefershttps": "Diese Einstellung wird bei deiner nächsten Anmeldung wirksam.",
+       "prefswarning-warning": "Du hast Änderungen an deinen Einstellungen durchgeführt, die noch nicht gespeichert wurden.\nWenn du diese Seite verlässt ohne auf „$1“ zu klicken, werden deine Einstellungen nicht aktualisiert.",
        "prefs-tabs-navigation-hint": "Tipp: Du kannst die linke und rechte Pfeiltasten benutzen, um zwischen den Registerkarten in der Reiterliste zu navigieren.",
        "email-address-validity-valid": "Diese E-Mail-Adresse scheint gültig zu sein.",
        "email-address-validity-invalid": "Eine gültige E-Mail-Adresse ist erforderlich.",
        "grouppage-suppress": "{{ns:project}}:Oversighter",
        "right-read": "Seiten lesen",
        "right-edit": "Seiten bearbeiten",
-       "right-createpage": "Seiten erstellen (außer Diskussionsseiten)",
+       "right-createpage": "Seiten erstellen (die keine Diskussionsseiten sind)",
        "right-createtalk": "Diskussionsseiten erstellen",
        "right-createaccount": "Benutzerkonto erstellen",
        "right-minoredit": "Bearbeitungen als klein markieren",
        "randomincategory": "Zufällige Seite einer Kategorie",
        "randomincategory-invalidcategory": "„$1“ ist kein gültiger Kategorienname.",
        "randomincategory-nopages": "Es gibt keine Seiten in [[:Category:$1]].",
-       "randomincategory-selectcategory": "Zufällige Seite aus der Kategorie: $1 $2",
-       "randomincategory-selectcategory-submit": "Los",
+       "randomincategory-category": "Kategorie:",
+       "randomincategory-legend": "Zufällige Seite in Kategorie",
        "randomredirect": "Zufällige Weiterleitung",
        "randomredirect-nopages": "Im Namensraum „$1“ sind keine Weiterleitungen vorhanden.",
        "statistics": "Statistik",
        "querypage-disabled": "Diese Spezialseite wurde aus Gründen der Leistungserhaltung deaktiviert.",
        "booksources": "ISBN-Suche",
        "booksources-search-legend": "Suche nach Bezugsquellen für Bücher",
-       "booksources-go": "Suchen",
+       "booksources-search": "Suchen",
        "booksources-text": "Dies ist eine Liste mit Links zu Internetseiten, die neue und gebrauchte Bücher verkaufen. Dort kann es auch weitere Informationen über die Bücher geben. {{SITENAME}} ist mit keinem dieser Anbieter geschäftlich verbunden.",
        "booksources-invalid-isbn": "Vermutlich ist die ISBN ungültig.\nBitte prüfe, ob sie korrekt von der Quelle übertragen wurde.",
        "specialloguserlabel": "Ausführender Benutzer:",
        "wlheader-enotif": "Der E-Mail-Benachrichtigungsdienst ist aktiviert.",
        "wlheader-showupdated": "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.",
        "wlnote": "Es {{PLURAL:$1|folgt die letzte Änderung|folgen die letzten <strong>$1</strong> Änderungen}} der letzten {{PLURAL:$2|Stunde|<strong>$2</strong> Stunden}}. Stand: $3, $4 Uhr.",
-       "wlshowlast": "Zeige die Änderungen der letzten $1 Stunden, $2 Tage oder $3.",
+       "wlshowlast": "Zeige die Änderungen der letzten $1 Stunden, $2 Tage.",
        "watchlist-options": "Anzeigeoptionen",
        "watching": "Beobachten …",
        "unwatching": "Nicht mehr beobachten …",
        "exbeforeblank": "Inhalt vor dem Leeren der Seite: „$1“",
        "delete-confirm": "Löschen von „$1“",
        "delete-legend": "Löschen",
-       "historywarning": "'''Achtung:''' Die Seite, die du löschen möchtest, hat eine Versionsgeschichte mit ungefähr $1 {{PLURAL:$1|Version|Versionen}}:",
+       "historywarning": "<strong>Achtung:</strong> Die Seite, die du löschen möchtest, hat eine Versionsgeschichte mit {{PLURAL:$1|einer Version|$1 Versionen}}:",
        "confirmdeletetext": "Du bist dabei, eine Seite mit allen zugehörigen älteren Versionen zu löschen. Bitte bestätige dazu, dass du dir der Konsequenzen bewusst bist, und dass du in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]] handelst.",
        "actioncomplete": "Aktion beendet",
        "actionfailed": "Aktion fehlgeschlagen",
        "delete-edit-reasonlist": "Löschgründe bearbeiten",
        "delete-toobig": "Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen solcher Seiten wurde eingeschränkt, um eine versehentliche Überlastung der Server zu verhindern.",
        "delete-warning-toobig": "Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen kann zu Störungen im Datenbankbetrieb führen.",
-       "delete-cantedit": "Du kannst diese Seite nicht löschen, da du nicht über das Recht verfügst, diese Seite zu bearbeiten.",
+       "deleteprotected": "Du kannst diese Seite nicht löschen, da sie geschützt wurde.",
        "deleting-backlinks-warning": "'''Warnung:''' Es verweisen noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere Seiten]] auf die zu löschende Seite oder diese Seite ist noch woanders eingebunden.",
        "rollback": "Zurücksetzen der Änderungen",
        "rollback_short": "Zurücksetzen",
        "protect-othertime": "Andere Sperrdauer:",
        "protect-othertime-op": "andere Sperrdauer",
        "protect-existing-expiry": "Aktuelles Seitenschutzende: $2, $3 Uhr",
+       "protect-existing-expiry-infinity": "Vorhandene Ablaufzeit: unbeschränkt",
        "protect-otherreason": "Anderer/ergänzender Grund:",
        "protect-otherreason-op": "Anderer Grund",
        "protect-dropdown": "* Allgemeine Schutzgründe\n** Edit-War\n** Wiederkehrender Vandalismus\n** Wiederholtes Einstellen von Werbung\n** Häufig eingebundene Vorlage\n** Seite mit hoher Besucherzahl",
        "unblocked": "[[User:$1|$1]] wurde freigegeben",
        "unblocked-range": "Sperre für $1 wurde aufgehoben",
        "unblocked-id": "Sperr-ID $1 wurde freigegeben",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] wurde freigegeben.",
        "blocklist": "Gesperrte Benutzer",
        "ipblocklist": "Gesperrte Benutzer",
        "ipblocklist-legend": "Suche nach einem gesperrten Benutzer",
        "import": "Seiten importieren",
        "importinterwiki": "Transwiki-Import",
        "import-interwiki-text": "Wähle ein Wiki und eine Seite zum Importieren aus.\nDie Versionsdaten und Benutzernamen bleiben dabei erhalten.\nAlle Transwiki-Import-Aktionen werden im [[Special:Log/import|Import-Logbuch]] protokolliert.",
-       "import-interwiki-source": "Quell-Wiki/-Seite:",
+       "import-interwiki-sourcewiki": "Quellwiki:",
+       "import-interwiki-sourcepage": "Quellseite:",
        "import-interwiki-history": "Alle Versionen dieser Seite importieren",
        "import-interwiki-templates": "Alle Vorlagen einschließen",
        "import-interwiki-submit": "Importieren",
        "others": "anderen",
        "siteusers": "{{SITENAME}}-{{PLURAL:$2|Benutzer}} $1",
        "anonusers": "{{PLURAL:$2|unangemeldetem|unangemeldeten}} {{SITENAME}}-{{PLURAL:$2|Benutzer|Benutzern}} $1",
-       "creditspage": "Seiteninformationen",
-       "nocredits": "Für diese Seite sind keine Informationen vorhanden.",
+       "creditspage": "Seitenzuschreibung",
+       "nocredits": "Für diese Seite sind keine Zuschreibungen vorhanden.",
        "spamprotectiontitle": "Spamschutzfilter",
        "spamprotectiontext": "Der Text, die du speichern willst, wurde vom Spamschutzfilter blockiert.\nDas liegt wahrscheinlich an einem Link auf eine externe Seite.",
        "spamprotectionmatch": "'''Der folgende Text wurde vom Spamfilter gefunden: ''$1'''''",
        "exif-urgency-low": "Niedrig ($1)",
        "exif-urgency-high": "Hoch ($1)",
        "exif-urgency-other": "Benutzerdefinierte Priorität ($1)",
-       "watchlistall2": "alle",
        "namespacesall": "alle",
        "monthsall": "alle",
        "confirmemail": "E-Mail-Adresse bestätigen (Authentifizierung)",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|lud}} eine neue Version von $3 hoch",
        "logentry-upload-revert": "$1 {{GENDER:$2|lud}} $3 hoch",
        "rightsnone": "(–)",
+       "revdelete-summary": "Zusammenfassungskommentar",
        "feedback-bugornote": "Sofern du detailliert ein technisches Problem beschreiben möchtest, melde bitte [$1 einen Fehler].\nAnderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kommentar wird, zusammen mit deinem Benutzernamen und der Version des von dir verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.",
        "feedback-subject": "Betreff:",
        "feedback-message": "Nachricht:",
        "duration-millennia": "$1 {{PLURAL:$1|Jahrtausend|Jahrtausende}}",
        "rotate-comment": "Bild um $1 {{PLURAL:$1|Grad}} im Uhrzeigersinn gedreht",
        "limitreport-title": "Profilingdaten des Parsers:",
-       "limitreport-cputime": "CPU-Zeit-Nutzung",
+       "limitreport-cputime": "Genutzte CPU-Zeit",
        "limitreport-cputime-value": "{{PLURAL:$1|Eine Sekunde|$1 Sekunden}}",
-       "limitreport-walltime": "Echtzeitnutzung",
+       "limitreport-walltime": "Genutzte Zeit",
        "limitreport-walltime-value": "{{PLURAL:$1|Eine Sekunde|$1 Sekunden}}",
-       "limitreport-ppvisitednodes": "Besuchte Knotenanzahl des Präprozessors",
+       "limitreport-ppvisitednodes": "Vom Präprozessor besuchte Knoten",
        "limitreport-ppvisitednodes-value": "$1/$2",
-       "limitreport-ppgeneratednodes": "Erzeugte Knotenanzahl des Präprozessors",
+       "limitreport-ppgeneratednodes": "Vom Präprozessor erzeugte Knoten",
        "limitreport-ppgeneratednodes-value": "$1/$2",
        "limitreport-postexpandincludesize": "Einbindungsgröße nach dem Expandieren",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|Byte|Bytes}}",
        "log-name-pagelang": "Sprachenänderungs-Logbuch",
        "log-description-pagelang": "Dies ist ein Logbuch mit Änderungen an Seitensprachen.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|änderte}} die Seitensprache für $3 von $4 nach $5.",
-       "default-skin-not-found": "Hoppla! Die Standard-Benutzeroberfläche für dein Wiki (<code>$wgDefaultSkin</code>), <code>$1</code>, ist nicht verfügbar.\n\nDeine Installation scheint die folgenden Benutzeroberflächen zu enthalten. Siehe das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch] für Informationen zur Aktivierung dieser und Auswahl des Standards.\n\n$2\n\n; Falls du gerade MediaWiki installiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet.\n:* Versuche, einige Benutzeroberflächen aus dem [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren.\n:* Lade den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunter, der einige Benutzeroberflächen und Erweiterungen enthält. Du kannst das Verzeichnis <code>skins/</code> kopieren und einfügen.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist.\n\n; Falls du gerade MediaWiki aktualisiert hast:\n: MediaWiki 1.24 und neuere Versionen aktivieren installierte Benutzeroberflächen nicht mehr automatisch (siehe das [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Benutzerhandbuch]). Du kannst die folgenden Zeilen in die Datei <code>LocalSettings.php</code> einfügen, um alle derzeit installierten Benutzeroberflächen zu aktivieren:\n\n<pre>$3</pre>\n\n; Falls du gerade <code>LocalSettings.php</code> geändert hast:\n: Überprüfe die Namen der Benutzeroberflächen auf Tippfehler.",
-       "default-skin-not-found-no-skins": "Hoppla! Die Standard-Benutzeroberfläche für dein Wiki (<code>$wgDefaultSkin</code>), <code>$1</code>, ist nicht verfügbar.\n\nDu hast keine installierten Benutzeroberflächen.\n\n; Falls du gerade MediaWiki installiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet.\n:* Versuche, einige Benutzeroberflächen aus dem [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren.\n:* Lade den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunter, das mehrere Benutzeroberflächen und Erweiterungen enthält. Du kannst das Verzeichnis <code>skins/</code> kopieren und einfügen.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist. Siehe das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch] für Informationen zur Aktivierung von Benutzeroberflächen und Auswahl des Standards.",
+       "default-skin-not-found": "Hoppla! Die in <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> definierte Standardbenutzeroberfläche für dein Wiki ist nicht verfügbar.\n\nDeine Installation scheint die folgenden Benutzeroberflächen zu enthalten. Siehe [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de das Benutzerhandbuch] zur Aktivierung und Auswahl des Standards.\n\n$2\n\n; Falls du gerade MediaWiki installiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet. Versuche einige Benutzeroberflächen aus dem  [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren, indem du:\n:* Den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunterlädst, der mit verschiedenen Benutzeroberflächen und Erweiterungen kommt. Du kannst das Verzeichnis <code>skins/</code> kopieren und einfügen.\n:* Eine der <code>mediawiki/skins/*</code>-Repositorien über Git in das <code dir=\"ltr\">skins/</code>-Verzeichnis deiner MediaWiki-Installation klonst.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist.\n\n; Falls du gerade MediaWiki aktualisiert hast:\n: MediaWiki 1.24 und neuere Versionen aktivieren nicht mehr automatisch installierte Benutzeroberflächen (siehe das [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Benutzerhandbuch]). Du kannst die folgenden Zeilen in die Datei <code>LocalSettings.php</code> einfügen, um alle derzeit installierten Benutzeroberflächen zu aktivieren:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du gerade <code>LocalSettings.php</code> geändert hast:\n: Überprüfe die Namen der Benutzeroberflächen auf Tippfehler.",
+       "default-skin-not-found-no-skins": "Hoppla! Die in <code>$wgDefaultSkin</code> als <code>$1</code> definierte Standardbenutzeroberfläche für dein Wiki ist nicht verfügbar.\n\nDu hast keine installierten Benutzeroberflächen.\n\n; Falls du gerade MediaWiki installiert oder aktualisiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet. MediaWiki 1.24 und neuere Versionen enthalten keine Benutzeroberflächen im Haupt-Repositorium. Versuche einige Benutzeroberflächen aus dem [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren, indem du:\n:* Den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunterlädst, der mit verschiedenen Benutzeroberflächen und Erweiterungen kommt. Du kannst das  <code>skins/</code>-Verzeichnis kopieren und einfügen.\n:* Eine der <code>mediawiki/skins/*</code>-Repositorien über Git in das <code dir=\"ltr\">skins/</code>-Verzeichnis deiner MediaWiki-Installation klonst.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist. Siehe das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch] zur Aktivierung von Benutzeroberflächen und Auswahl des Standards.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiviert)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''deaktiviert''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''deaktiviert''')",
+       "mediastatistics": "Medienstatistiken",
+       "mediastatistics-summary": "Statistiken über hochgeladene Dateitypen. Dies beinhaltet nur die aktuellste Version einer Datei. Alte oder gelöschte Dateiversionen sind ausgeschlossen.",
+       "mediastatistics-nfiles": "$1 ($2 %)",
+       "mediastatistics-nbytes": "{{PLURAL:$1|Ein Byte|$1 Bytes}} ($2; $3 %)",
+       "mediastatistics-table-mimetype": "MIME-Typ",
+       "mediastatistics-table-extensions": "Mögliche Erweiterungen",
+       "mediastatistics-table-count": "Anzahl der Dateien",
+       "mediastatistics-table-totalbytes": "Gesamtgröße",
+       "mediastatistics-header-unknown": "Unbekannt",
+       "mediastatistics-header-bitmap": "Bitmap-Bilder",
+       "mediastatistics-header-drawing": "Zeichnungen (Vektorbilder)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videos",
+       "mediastatistics-header-multimedia": "Rich Media",
+       "mediastatistics-header-office": "Office",
+       "mediastatistics-header-text": "Text",
+       "mediastatistics-header-executable": "Ausführbare Dateien",
+       "mediastatistics-header-archive": "Komprimierte Formate",
+       "json-warn-trailing-comma": "{{PLURAL:$1|Ein anhängendes Komma wurde|$1 anhängende Kommas wurden}} aus JSON entfernt",
+       "json-error-unknown": "Es gab ein Problem mit dem JSON. Fehler: $1",
+       "json-error-depth": "Die maximale Stapeltiefe wurde überschritten",
+       "json-error-state-mismatch": "Ungültiges oder fehlerhaftes JSON",
+       "json-error-ctrl-char": "Steuerzeichenfehler, vermutlich falsch kodiert",
+       "json-error-syntax": "Syntax-Fehler",
+       "json-error-utf8": "Fehlerhafte UTF-8-Zeichen, vermutlich falsch kodiert",
+       "json-error-recursion": "Eine oder mehrere zu kodierende rekursive Referenzen im Wert",
+       "json-error-inf-or-nan": "Eine oder mehrere zu kodierende NAN- oder INF-Werte im Wert",
+       "json-error-unsupported-type": "Ein Wert eines Typs, der nicht kodiert werden kann, wurde angegeben"
 }
index 7b0a6ad..ca5d41c 100644 (file)
        "qbfind": "Bıvêne",
        "qbbrowse": "Çım ra viyarne",
        "qbedit": "Bıvurne",
-       "qbpageoptions": "Ena pele",
+       "qbpageoptions": "Ena perer",
        "qbmyoptions": "Pelê mı",
        "faq": "PZP (Persê ke zehf persiyenê)",
        "faqpage": "Project: PZP",
        "edit-local": "Şınasnayışê lokali bıvurne",
        "create": "Vıraze",
        "create-local": "Şınasnayışê lokali cı ke",
-       "editthispage": "Ena pele bıvurne",
+       "editthispage": "Perer bıvurne",
        "create-this-page": "Na pele bınuse",
        "delete": "Bestere",
-       "deletethispage": "Ena pele bestere",
+       "deletethispage": "Perer bestere",
        "undeletethispage": "Na perer mebesterne",
        "undelete_short": "{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere",
        "viewdeleted_short": "{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne",
        "protect": "Bışevekne",
        "protect_change": "bıvurne",
-       "protectthispage": "Ena pele bıpawe",
+       "protectthispage": "Perer bıpawe",
        "unprotect": "Starkerdışi bıvurne",
        "unprotectthispage": "Starkerdışe ena peler bıvurne",
        "newpage": "Pela newiye",
-       "talkpage": "Ena pele sero werêne",
+       "talkpage": "Perer sero werêne",
        "talkpagelinktext": "Vatenayış",
        "specialpage": "Pela xısusiye",
        "personaltools": "Hacetê şexsiy",
        "passwordreset-emailsent-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.",
        "passwordreset-emailerror-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1",
        "changeemail": "E-posta adresa xo bıvurnê",
-       "changeemail-header": "E-posya adresta hesabdê xo bıvurnê",
        "changeemail-text": "Şıma ke qailê  e-postay xo bıvırnê, enê formi pırr kerê. Raştkerdışi rê ki şıma gani parolay xo bınusnê",
        "changeemail-no-info": "Şıma gani bıkewê pele ke derdest bıresê na pele.",
        "changeemail-oldemail": "E-postay şımawa nıkaêne:",
        "changeemail-none": "(Çıniyo)",
        "changeemail-password": "Parolay şımawa {{SITENAME}}i:",
        "changeemail-submit": "E-postay xo bıvırnên",
-       "changeemail-cancel": "Bıtexelne",
        "changeemail-throttled": "Şıma zaf ronıştış akerdış ke.\nKerem ke verdi dekewten $1 bıpawe.",
        "resettokens": "Nışanan reset ke",
        "resettokens-text": "Şıma tiya de hesabê şıma ra elaqedar tayê kılitê icazetê cıresayışê melumati şenê sıfır kerê.\n\nŞıma be ğeletiye ra ke nê kerdê vıla ya zi hesabê şıma de xırabiye ke esta, naye bıkerê.",
        "searchall": "pêro",
        "showingresults": "#<strong>$2</strong> netican ra {{PLURAL:$1|<strong>1</strong> netice cêr dero|<strong>$1</strong> neticey cêr derê}}.",
        "showingresultsinrange": "{{PLURAL:$1|<strong>1</strong> netice|<strong>$1</strong> neticey}} be mabeynê #<strong>$2</strong> ra be #<strong>$3</strong> cêr asenê.",
-       "showingresultsheader": "{{PLURAL:$5|Neticeyê '''$1''' of '''$3'''|Neticeyanê '''$1 - $2''' hetê '''$3'''}} qe '''$4'''",
        "search-nonefound": "Zey perskerdışê şıma netice nêvêniya.",
        "powersearch-legend": "Cıgeyrayışo hera",
        "powersearch-ns": "Cayanê nameyan de cıgeyrayış:",
        "action-createtalk": "pelanê werênayışi bıvıraze",
        "action-createaccount": "hesabê nê karberi bıvıraze",
        "action-minoredit": "nê vurnayışi be qıckek işaret ke",
-       "action-move": "ena pele bere",
+       "action-move": "Perer bere",
        "action-move-subpages": "ena pele, u pelanê daê bınênan bere",
        "action-move-rootuserpages": "pelanê karberiyê bıngeyan bere",
        "action-movefile": "ena dosya bere",
        "action-reupload-shared": "dosyayê ki ho embarê medyayî de esto ser ay binusne",
        "action-upload_by_url": "Ena dosya yew URL ra bar bike",
        "action-writeapi": "ser nuşte API gure bike",
-       "action-delete": "ena pele bestere",
+       "action-delete": "Perer bestere",
        "action-deleterevision": "nê çımraviyarnayışi bestere",
        "action-deletedhistory": "tarixê ena pel ki estereyî biya, ey bivine",
        "action-browsearchive": "pelanê esterıteyan bıgeyre",
-       "action-undelete": "ena pele reyna biyere",
+       "action-undelete": "Perer reyna biyere",
        "action-suppressrevision": "revizyone ki nimnaye biye reyna bivîne u restore bike",
        "action-suppressionlog": "enê qeydê xısusi bıvêne",
        "action-block": "enê karberi vurnayışi ra bıreyne",
        "action-editmyprivateinfo": "Xısusi malumate xo bıvurne",
        "nchanges": "$1 {{PLURAL:$1|fın vurna|fıni vurna}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ra yok wazino}}",
-       "enhancedrc-history": "verenayış",
+       "enhancedrc-history": "tarix",
        "recentchanges": "Vurnayışê peyêni",
        "recentchanges-legend": "Tercihê vurnayışanê peyênan",
        "recentchanges-summary": "Ena pele de wiki sero vurnayışanê peyênan teqib ke.",
        "randomincategory": "Ğoseri pera kategoriya",
        "randomincategory-invalidcategory": "\"$1\" yew nameyê kategoriya vêrdiye niyo.",
        "randomincategory-nopages": "Kategori da [[:Category:$1|$1]] de qet  per çıniya.",
-       "randomincategory-selectcategory": "Pera ke cıra raşt ameye kategori do bıgéri yo: $1 $2.",
-       "randomincategory-selectcategory-submit": "Şo",
        "randomredirect": "Serçarnayışo rastameye",
        "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics": "İstatistiki",
        "newpages-username": "Nameyê karberi:",
        "ancientpages": "Wesiqeyê ke vurnayışê ciyê peyeni tewr kehani",
        "move": "Bere",
-       "movethispage": "Ena pele bere",
+       "movethispage": "Perer bere",
        "unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
        "unusedcategoriestext": "Kategoriyê ke cêr derê, nê bıbê zi, terefê qet madeyan ya zi kategoriyan ra nêgureniyenê.",
        "notargettitle": "Hedef çini yo",
        "booksources": "Çımeyê kıtaban",
        "booksources-search-legend": "Seba çımeyanê kıtaban cı geyre",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Şo",
+       "booksources-search": "Cı geyre",
        "booksources-text": "listeya cêrıni, keyepelê kitap rotoxan o.",
        "booksources-invalid-isbn": "ISBN raşt nêasena bıewnê çımeyê orjinali, raşt kopya biya nê nêbiyaya?",
        "specialloguserlabel": "Kerdoğ:",
        "special-categories-sort-count": "goreyê çendi rêz ker.",
        "special-categories-sort-abc": "alfabetik rêz ker",
        "deletedcontributions": "İştiraqê karberan de besternayına",
-       "deletedcontributions-title": "Îştirakê karberî wederna",
+       "deletedcontributions-title": "İştıraqé karberan de besterneyınan",
        "sp-deletedcontributions-contribs": "iştıraqi",
        "linksearch": "Gıreyê teberi cı geyrê",
        "linksearch-pat": "bıgêr motif:",
        "wlheader-enotif": "E-mail xeber dayiş abiyo.",
        "wlheader-showupdated": "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
        "wlnote": "$3 seate u bahde $4 deqa dıma {{PLURAL:$2|ju seate dı|'''$2''' ju seate dı}} {{PLURAL:$1|vurnayışe peyeni|vurnayışe '''$1''' peyeni}} cêrdeyê",
-       "wlshowlast": "Peyni de vurnayışan ra  $1 seata u $2 roca $3 bımocnê",
+       "wlshowlast": "Peyni de vurnayışan ra  $1 seata u $2 roca  bımocnê",
        "watchlist-options": "Tercihê liste da seyri",
        "watching": "Seyr ke...",
        "unwatching": "Seyr meke...",
        "import": "Peleyi import bik",
        "importinterwiki": "Împortê transwîkî",
        "import-interwiki-text": "qey kırıştışê zerreyi yew wiki u pel bıvıcinê.\ntarixê revizyon u nameyê nuştoxi pawyene.\nkarê zerredayişê benateyê wikiyani[[Special:Log/import|zerreyê rocaneyê kırıştî de]] qeyd beno.",
-       "import-interwiki-source": "Çime wîkî/pel:",
        "import-interwiki-history": "Qe eno pel, revizyonê tarixê hemî kopya bike",
        "import-interwiki-templates": "Şablonê hemî dehil bike",
        "import-interwiki-submit": "Azare de",
        "exif-urgency-low": "($1) Kemiyo",
        "exif-urgency-high": "( $1 ) Vêşiyo",
        "exif-urgency-other": "Sıftê  şınasiya karberi ($1)",
-       "watchlistall2": "pêro",
        "namespacesall": "pêro",
        "monthsall": "pêro",
        "confirmemail": "Adresê e-posta tesdiq ker",
        "logentry-rights-rights-legacy": "$1 qandê $3 rê ezayiya grube {{GENDER:$2|vuriye}}",
        "logentry-rights-autopromote": "$1 otomatikmen $4 ra $5 {{GENDER:$2|terfi bi}}",
        "rightsnone": "(çıniyo)",
+       "revdelete-summary": "kılmvatışê vuriyayişi",
        "feedback-bugornote": "Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1  jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da \"[ $3  $2 ]\", namey karber dê xoya piya u wasteriya karfiye.",
        "feedback-subject": "Mewzu:",
        "feedback-message": "Mesac:",
index 2cebf9a..69db69d 100644 (file)
        "passwordreset-emailsent-capture": "E-mail za anulěrowanje gronidła jo se pósłała, kótaraž pokazujo se dołojce.",
        "passwordreset-emailerror-capture": "E-mail za anulěrowanje gronidła jo se napórała, kótaraž se dołojce pokazujo, ale słanje {{GENDER:$2|wužywarjeju|wužywarce}} njejo se raźiło: $1",
        "changeemail": "E-mailowu adresu změniś",
-       "changeemail-header": "Kontowu e-mailowu adresu změniś",
        "changeemail-text": "Wupołni toś ten formular, aby swóju e-mailowu adresu změnił. Musyš swójo gronidło zapódaś, aby toś tu změnu wobkšuśił.",
        "changeemail-no-info": "Dejš pśizjawjony byś, aby direktny pśistup na toś ten bok měł.",
        "changeemail-oldemail": "Aktualna e-mailowa adresa:",
        "changeemail-none": "(žedna)",
        "changeemail-password": "Twójo gronidło za {{GRAMMAR:akuzatiw|{{SITENAME}}}}",
        "changeemail-submit": "E-mailowu adresu změniś",
-       "changeemail-cancel": "Pśetergnuś",
        "changeemail-throttled": "Sy pśecesto wopytał se pśizjawiś.\nPócakaj pšosym $1, nježli až wopytajoš znowego.",
        "resettokens": "Tokeny slědk stajiś",
        "resettokens-text": "Móžoš tokeny slědk stajiś, kótarež dowóluju pśistup na wěste priwatne daty, kótarež su z twójim kontom zwězane.\n\nTy by dejał to cyniś, jolic sy je zmylnje z někim źělił abo jolic twóje konto jo se nadpadało.",
        "searchall": "wše",
        "showingresults": "How {{PLURAL:|jo '''1''' wuslědk|stej '''$1''' wuslědka|su '''$1''' wuslědki}} wót cysła '''$2'''.",
        "showingresultsinrange": "Dołojce pokazujo se do {{PLURAL:$1|<strong>1</strong> wuslědka|<strong>$1</strong> wuslědkowu|<strong>$1</strong> wuslědkow}} we wobłuku <strong>$2</strong> až do <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Wuslědk '''$1''' z '''$3'''|Wuslědki '''$1 - $2''' z '''$3'''}} za '''$4'''",
        "search-nonefound": "Njejsu se wuslědki namakali, kótarež wótpowěduju napšašowanjeju.",
        "powersearch-legend": "Rozšyrjone pytanje",
        "powersearch-ns": "W mjenjowych rumach pytaś:",
        "randomincategory": "Pśipadny bok w kategoriji",
        "randomincategory-invalidcategory": "\"$1\" njejo płaśiwe kategorijowe mě.",
        "randomincategory-nopages": "W kategoriji [[:Category:$1|$1]] žedne boki njejsu.",
-       "randomincategory-selectcategory": "Pśipadny bok z kategorija: $1 $2",
-       "randomincategory-selectcategory-submit": "Wótpósłaś",
        "randomredirect": "Pśipadne dalejpósrědnjenje",
        "randomredirect-nopages": "W mjenjowem rumje \"$1\" njejsu dalejpósrědnjenja.",
        "statistics": "Statistika",
        "querypage-disabled": "Toś ten specialny bok jo z wugbaśowych pśicynow znjemóžnjony.",
        "booksources": "Pytanje pó ISBN",
        "booksources-search-legend": "Knigłowe žrědła pytaś",
-       "booksources-go": "Pytaś",
        "booksources-text": "To jo lisćina z wótkazami na internetowe boki, kótarež pśedawaju nowe a trjebane knigły. Tam mógu teke dalšne informacije wó knigłach byś. {{SITENAME}} njezwisujo góspodarski z žednym z toś tych póbitowarjow.",
        "booksources-invalid-isbn": "Pódane ISBN-cysło njezda se płaśiwe byś; pséglědaj za zmólkami, z tym až kopěrujoš z originalnego žrědła.",
        "specialloguserlabel": "Wuwjeźaŕ:",
        "wlheader-enotif": "E-mailowa zdźěleńska słužba jo zmóžnjona.",
        "wlheader-showupdated": "Boki, kótarež su wót twójogo slědnego woglěda se změnili, pokazuju se '''tucnje'''.",
        "wlnote": "{{PLURAL:$1|Slědujo slědna změna|slědujotej '''$1''' slědnej změnje|slěduju slědne '''$1''' změny}} {{PLURAL:$2|slědneje góźiny|slědneju '''$2''' góźinowu|slědnych '''$2''' góźinow}}, staw: $3, $4.",
-       "wlshowlast": "Pokaž změny slědnych $1 góźinow, $2 dnjow abo $3 (w slědnych 30 dnjach).",
+       "wlshowlast": "Pokaž změny slědnych $1 góźinow, $2 dnjow abo  (w slědnych 30 dnjach).",
        "watchlist-options": "Opcije wobglědowańki",
        "watching": "Wobglědowaś …",
        "unwatching": "Njewobglědowaś …",
        "import": "Boki importěrowaś",
        "importinterwiki": "Transwiki-importěrowanje",
        "import-interwiki-text": "Wuzwól wiki a bok za importěrowanje.\nDatumy wersijow a wužywarske mjenja pśi tym se njezměniju.\nWšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-lisćinje importow]].",
-       "import-interwiki-source": "Žrědłowy wiki/bok:",
        "import-interwiki-history": "Importěruj wšykne wersije toś togo boka",
        "import-interwiki-templates": "Wše pśedłogi zapśěgnuś",
        "import-interwiki-submit": "Importěrowaś",
        "exif-urgency-low": "Niska ($1)",
        "exif-urgency-high": "Wusoka ($1)",
        "exif-urgency-other": "Swójska priorita ($1)",
-       "watchlistall2": "wšykne",
        "namespacesall": "wšykne",
        "monthsall": "wšykne",
        "confirmemail": "E-mailowu adresu wobkšuśiś.",
        "logentry-rights-rights-legacy": "$1 jo kupkowe cłonkojstwo za $3 {{GENDER:$2|změnił|změniła}}",
        "logentry-rights-autopromote": "$1 jo se awtomatiski wót $4 do $5 {{GENDER:$2|pśirědował|pśirědowała}}",
        "rightsnone": "(nic)",
+       "revdelete-summary": "Zespominanje wobźěłanja",
        "feedback-bugornote": "Jolic sy zwólny, techniski problem nadrobnje wopisaś, [$1 daj pšosym zmólku k wěsći].\nHować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo se bokoju \"[$3 $2]\", z twójim wužywarskim mjenim a z wobglědowakom, kótaryž wužywaš.",
        "feedback-subject": "Tema:",
        "feedback-message": "Powěsć:",
index 53f608f..d0bd90b 100644 (file)
        "passwordreset-emailsent-capture": "Surat-i pononsorou nakaatod noh, miagal id siriba diti.",
        "passwordreset-emailerror-capture": "Surat-i pononsorou nopudali noh, miagal id siriba diti, nga awu kaatod id momomoguno: $1",
        "changeemail": "Alanai porikatan surat-i",
-       "changeemail-header": "Alanai akaun porikatan surat-i",
        "changeemail-text": "Gonopo poom diti do mongolon porikatan surat-i nuh. Mangai posuango kaatalibnu do papasaah di naalanan.",
        "changeemail-no-info": "Mositi sumuang log ko do mongoguno monilombus id bolikon diti.",
        "changeemail-oldemail": "Porikatan surat-i maso diti:",
        "changeemail-newemail": "Porikatan surat-i it kawawagu:",
        "changeemail-none": "(ingaa)",
        "changeemail-submit": "Alanai surat-i",
-       "changeemail-cancel": "Kinsilo",
        "bold_sample": "Polombono tik",
        "bold_tip": "Polombono tik",
        "italic_sample": "Tik lingging",
        "search-relatedarticle": "Kompinaian",
        "searchrelated": "kompinaian",
        "searchall": "oinsanan",
-       "showingresultsheader": "{{PLURAL:$5|Kootuson '''$1''' of '''$3'''|Tongkootuson '''$1 - $2''' of '''$3'''}} montok '''$4'''",
        "search-nonefound": "Ingaa kootuson kaagal di kuiri.",
        "powersearch-legend": "Pogigihum poimogot",
        "powersearch-ns": "Pogihum momoguno ngaran:",
        "pager-older-n": "{{PLURAL:$1|nokodori 1|nokodori $1}}",
        "booksources": "Nantadon buuk",
        "booksources-search-legend": "Ihumo tadon buuk",
-       "booksources-go": "Ibok",
        "specialloguserlabel": "Momoguno:",
        "log": "Tongolog",
        "allpages": "Oinsanan bolikon",
        "unwatch": "Awu intangan",
        "unwatchthispage": "Tingkod do mongintong",
        "watchlist-details": "{{PLURAL:$1|$1 bolikon|$1 bobolikon}} id lis piintangannu, bobolikon bolotok awu pinosuang.",
-       "wlshowlast": "Pokitono dohuri $1 jaam $2 tadau $3",
+       "wlshowlast": "Pokitono dohuri $1 jaam $2 tadau",
        "watchlist-options": "Pomilian lis piintangan",
        "watching": "Piintong...",
        "unwatching": "Awu piintong...",
        "metadata-expand": "Pokitono kointalangan pinatapil",
        "metadata-collapse": "Polisoko kointalangan pinatapil",
        "metadata-fields": "Batas pongodata it poinlis id suang pason diti maan poruhango id upa bolikon pongintalangan nung olisok jodual pongodata.\nIri suai sinandad do poinlisok.\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",
-       "watchlistall2": "oinsanan",
        "namespacesall": "oinsanan",
        "monthsall": "oinsanan",
        "watchlisttools-view": "Intaai kinoolonon di kosudong",
        "external_image_whitelist": " #Pologoson baris diti<pre>\n#Suangai do boros koubasanan (guas boros id pialatan //) ponongsiriba\n#Noputan di kaagal pojodion do toput poinsuang (toput koubasanan) do tangagambar\n#Toput di kaagal no silihon do gambar, nung awu nga okito o noputan sinuratan\n#Baris di kisimbol do # nopo nga ointutunan sobaagi do bolotok\n#Tumanud do pisuaian A om a\n\n#Posurato toinsanan id sawat do garis diti. Pologoson iti garis miagal diti</pre>",
        "tag-filter": "[[Special:Tags|Pananda]] gagan:",
        "revdelete-restricted": "pinokogos pogoduhan montok momuruan",
-       "revdelete-unrestricted": "pinoidu pogoduhan montok momuruan"
+       "revdelete-unrestricted": "pinoidu pogoduhan montok momuruan",
+       "revdelete-summary": "idito koinibaan"
 }
index 7f1a29f..0084dd3 100644 (file)
        "hidden-category-category": "Categoréi lughêdi",
        "category-subcat-count": "{{PLURAL:$2|In cla categoréia ché a gh'é sōl 'n'ónica sòt-categoréia.| In cla categoréia ché a gh'é {{PLURAL:$1|la sòt-categoréia sgnêda|al $1 sòt-categoréi sgnêdi}} ed sègvit, só 'n totêl ed $2.}}",
        "category-subcat-count-limited": "In cla categoréia ché a gh'é{{PLURAL:$1|'na sòt-categoréia, nutêda|$1 sòt-categoréi, nutêdi}}ché 'd sègvit.",
-       "category-article-count": "{{PLURAL:$2|In cla categoréia ché a gh'é sōl 'na pàgina, sgnêda ché.|In cla categoréia ché gh'é{{PLURAL:$1|la pàgina sgnêda| al pàgini $1 sgnêdi}} ed sègvit, in un totêl ed $2.}}",
+       "category-article-count": "{{PLURAL:$2|In cla categoréia ché a gh'é sōl 'na pàgina, sgnêda ché.|Cla categoréia ché la gh'à {{PLURAL:$1|la pàgina sgnêda| al pàgini $1 sgnêdi}} ed sègvit, in un totêl ed $2.}}",
        "category-article-count-limited": "In cla categoréia ché a gh'é {{PLURAL:$1|la pàgina nutêda|al  $1 pàgini nutêdi ch'é 'd sègvit.}}",
        "category-file-count": "{{PLURAL:$2|In cla categoréia ché a gh'é sōl un file, sgnê ché.|In cla categoréia ché gh'é{{PLURAL:$1|un file sgnê ché| i file $1, sgnê}} ed sègvit, in un totêl ed $2.}}",
        "category-file-count-limited": "In cla categoréia ché a gh'é {{PLURAL:$1|al file nutê|i $1 file nutê}} ché 'd sègvit.",
        "projectpage": "Guêrda la pàgina dal prugèt",
        "imagepage": "Guêrda la pàgina dal 'file'",
        "mediawikipage": "Guêrda al mesâg",
-       "templatepage": "Guêrda al 'template'",
+       "templatepage": "Guêrda 'l mudèl",
        "viewhelppage": "Guêrda la pàgina 'd ajót",
        "categorypage": "Guêrda la categuréia",
        "viewtalkpage": "Guêrda la discusiòun",
        "otherlanguages": "In êtri léngvi",
        "redirectedfrom": "(Tót còst al deşvîn da <b>$1</b>)",
        "redirectpagesub": "Pàgina 'd partèinsa",
+       "redirectto": "Rimânda a:",
        "lastmodifiedat": "Ûltmi mudéfichi 'dla pàgina: $2, $1.",
        "viewcount": "Cla pàgina ché l'é stêda lişûda {{PLURAL:$1|'na vôlta|$1 vôlti}}.",
        "protectedpage": "Pàgina sòta prutesiòun",
        "hidetoc": "Lōga",
        "collapsible-collapse": "Stréca",
        "collapsible-expand": "Şlêrga",
+       "confirmable-confirm": "Ét {{GENDER:$1|sicûr|sicûra}}?",
        "confirmable-yes": "Sé",
        "confirmable-no": "No",
        "thisisdeleted": "Guêrda e tōrna a mèter $1?",
        "nstab-image": "'File'",
        "nstab-mediawiki": "Mesâg",
        "nstab-template": "Mudèl",
-       "nstab-help": "Per quî rivê da pôch",
+       "nstab-help": "Pàgina 'd ajót",
        "nstab-category": "Categoréia",
        "nosuchaction": "Operasiòun mìa arcgnusûda",
        "nosuchactiontext": "Còl che t'é scrét int l' URL an n'é mìa vâlid.\nL'é anca pusébil che la URL la sia stêda scréta şbaliêda o che sia stê fât un colegamèint mìa vâlid.\nCòst al pré ânca dîr che gh'é un bug in {{SITENAME}}.",
        "protectedinterface": "Cla pàgina ché la gh'à 'n elemèint ch' al fa pêrt dal colegamèint tra utèint e al progrâma 'd cól sît ché e l'é prutèta per schivşêr pusébil abûş. Per zuntêr o mudufichêr tradusiòun per tót i sistēma wiki druvêr [//translatewiki.net/ translatewiki.net], al prugèt 'd adatamèint a ògni léngva 'd MediaWiki.",
        "editinginterface": "'''Atèinti:''' Al tèst ed cla pàgina ché 'l fa pêrt dal colegamèint tra utèint e 'l progrâma dal sît.  Tót' al modéfichi fâti a cla pàgina ché a gnîran spustêdi insém a i mesâg vést da tót j utèint ed cól wiki ché. Per zuntêr o mudufichêr tradusiòun vâlidi per tót i wiki, cunsîdra la pusibilitê 'd druvêr [/ / translatewiki.net / translatewiki.net], al prugèt 'd adatamèint a ògni léngva 'd MediaWiki.",
        "cascadeprotected": "Insém a cla pàgina ché an n'é mìa pusébil fêr dal mudéfichi perchè l'é dèinter {{PLURAL:$1|int la pàgina sgnêda ché  'd sègvit, ch' l'é stêda prutèta|int al pàgini sgnêdi ché  'd sègvit, ch' în stêdi prutèti}} cun la prutesiòun ch' la 's arfà in cuntinvasiòun:\n$2",
-       "namespaceprotected": "An 's gh'à mìa i permès necesâri per mudifichêr al pàgini dal spâsi di nòm '''$1'''.",
+       "namespaceprotected": "An 's gh'à mìa i permès necesâri per mudifichêr al pàgini dal spâsi di nòm <strong>$1</strong>.",
        "customcssprotected": "An 's gh'à mìa i permès necesâri per mudifichêr cla pàgina CSS ché, perchè la gh'à dèinter al j impustasiòun personêli 'd n' êter utèint.",
        "customjsprotected": "An 's gh'à mìa i permès necesâri per mudifichêr cla pàgina JavaScript ché, perchè la gh'à dèinter al j impustasiòun personêli 'd n' êter utèint.",
        "mycustomcssprotected": "An 's gh'à mìa i permès necesâri per mudifichêr cla pàgina CSS ché.",
        "createaccount-text": "Quelchidûn l'à fât un inscrisiòun a  {{SITENAME}} ($4) a nòm ed $2 coleghê a cl'indirés ed pôsta eletrônica ché. La cêva 'd ingrès per l'utèint \"$2\" l'é  impustêda a \"$3\". \nÉ necesâri fêr un ingrès préma ch' es pôl e cambiêr subét la cêva 'd ingrès. \nSe l'inscrisiòun l'é stêda fâta per şbâli, es pōl scanşlêr sté mesâg.",
        "login-throttled": "În stê fât trôp tentatîv 'd ingrès in pôch tèimp. Spèta $1 e pó tōrna pruvêr.",
        "login-abort-generic": "An t'é mìa stê arcgnusû - Scanşlê",
+       "login-migrated-generic": "La tó utèinsa l'é stêda spustêda, e al tó nòm utèint al gh'é mìa pió in sém a cla wiki ché.",
        "loginlanguagelabel": "Léngva: $1",
        "suspicious-userlogout": "La tó dmânda per destachêret l'é stēda rifiutêda perchè la sèmbra spidîda da un navigadōr ch' al funsiòuna mìa o da un proxy di caching.",
-       "createacct-another-realname-tip": "Druvêr al nòm vèira l'é 'na siēlta personêla; s' es pèinsa 'd ruvêrel al gnirâ uşê per dêr la paternitê di lavōr spidî.",
+       "createacct-another-realname-tip": "Druvêr al nòm vèira l'é 'na siēlta personêla; s' es pèinsa 'd druvêrel al gnirâ uşê per dêr la paternitê di lavōr spidî.",
        "pt-login": "Và dèinter",
        "pt-login-button": "Và dèinter",
        "pt-createaccount": "Fà la tó inscrisiòun",
        "passwordreset-emailsent-capture": "É stê spidî un mesâg ed pôsta eletrônica per turnêr a impustêr la cêva 'd ingrès, ché sòta a gh'é al tèst che gh'é scrét.",
        "passwordreset-emailerror-capture": "É stê fât un mesâg ed pôsta eletrônica per turnêr a impustêr la cêva 'd ingrès, scréta ché 'd sègvit. La spedisiòun {{GENDER:$2|a l'utèint}} an n'é mia 'riusîda:$1",
        "changeemail": "Câmbia l'indirés ed la pôsta eletrônica",
-       "changeemail-header": "Câmbia l'indirés ed la pôsta eletrônica 'd la tó inscrisiòun.",
        "changeemail-text": "Impés sté mòdul per cambiêr al tó indirés ed pòsta eletrônica. A srà necesâri mèter dèinter la cêva 'd ingrès per cunfermêr la mudéfica.",
        "changeemail-no-info": "Per andêr dèinter diretamèint a cla pàgina ché 't gh'ê da fêr l'ingrès.",
        "changeemail-oldemail": "L'indirés ed la pôsta eletrànica 'd adès.",
        "changeemail-none": "(nisûn)",
        "changeemail-password": "La cêva 'd ingrès só {{SITENAME}}:",
        "changeemail-submit": "Cambiêr l'indirés ed pôsta eletrônica",
-       "changeemail-cancel": "Scanşèla",
        "changeemail-throttled": "În stê fât trôp tentatîv 'd ingrès in pôch tèimp. Spèta $1 e pó tōrna pruvêr dôp.",
        "resettokens": "Tōrna 'd impustêr la cêva",
        "resettokens-text": "Ché 't pō turnêr a impustêr al cêvi ch'ét permèten l'ingrès a precîşi infurmasiòun privêdi lighêdi a la tó utèinsa. Ét duvrés fêrel se per chêş ét j ê spartîdi cun quelchidûn o se al j infurmasiòun ed la tó utèinsa în  in perécol.",
        "showpreview": "Guêrda préma 'd salvêr",
        "showdiff": "Guêrda i cambiamèint",
        "blankarticle": "<strong>Atèinti:</strong>la pàgina che t'é drē fêr la gh'à gnînto dèinter. S' ét tōren a schisêr in sém a \"{{int:savearticle}}\", la pàgina la srà fât sèinsa gnînto dèinter.",
-       "anoneditwarning": "'''Atensiòun:''' Ingrès mìa fât. Al tó indirés IP al srà sgnê int la stòria ed cla pàgina chè.",
+       "anoneditwarning": "<strong>Atèinti:</strong> An n'é mìa stê fât l'ingrès. S' ét farê dal mudéfichi al tó indirés IP al srà vést da tót. Se <strong>[$1 và dèinter]</strong> o <strong>[$2 fà 'n' utèinsa]</strong>, al tô mudéfichi a srân sgnêdi al tó nòm utèint, insèm a êter benefési.",
        "anonpreviewwarning": "\"An n'é mìa stê fât l'ingrès. Mèinter es sêlva la pàgina, l'indirés IP al srà sgnê int la stòria 'd la pàgina.\"",
        "missingsummary": "'''Atensiòun:''' an n'é mìa stê precişê al mutîv de sté mudéfica. S'es tōrna a clichêr insém a \"{{int:savearticle}}\" la mudéfica la gnirà salvêda cun al mutîv vōd.",
        "missingcommenttext": "Scréver un cumèint ché sòta.",
        "parser-template-recursion-depth-warning": "A s'é rivê al lémit 'd arciâm int al mudèl ($1)",
        "language-converter-depth-warning": "A s'é pasê 'l lémit ed fònd dal cunvertidōr ed léngua ($1)",
        "node-count-exceeded-category": "Pàgin in dó vîn pasê 'l nómer ed nōd",
-       "node-count-exceeded-category-desc": "'Na categoréia p'r al pàgini in dó a's pâsa al nómer di nōd.",
+       "node-count-exceeded-category-desc": "La pàgina la và d'ed sōver al nómer di nōd.",
        "node-count-exceeded-warning": "Cla pàgina ché l'à pasê 'l nómer di nōd",
        "expansion-depth-exceeded-category": "Pàgini 'n dó vî pasê al fònd de şlargamèint",
-       "expansion-depth-exceeded-category-desc": "Còsta l'é 'na categoréia per pàgini in dó vî pasê al fònd dal şlargamèint.",
+       "expansion-depth-exceeded-category-desc": "La pàgina la và d'ed là dal fònd mâsim de slarghêda.",
        "expansion-depth-exceeded-warning": "Cla pàgina ché la pasê al fònd de şlargamèint",
        "parser-unstrip-loop-warning": "Catê sèria 'd Unistrip",
        "parser-unstrip-recursion-limit": "A s'é pasê i lémit 'd arciâm 'd Unstrip ($1)",
        "searchall": "tót",
        "showingresults": "Ed sègvit {{PLURAL:$1|a vîn preşentê al mâsim <strong>1</strong> rişultêt| a vînen preşentê al mâsim <strong>$1</strong> rişultêt}} a partîr dal nómer #<strong>$2</strong>.",
        "showingresultsinrange": "{{PLURAL:$1|A vîn mustrê| a vînen mustrê}} sòta {{PLURAL:$1|<strong>1</strong> rişultêt|<strong>$1</strong> rişultêt}} dal #<strong>$2</strong> al #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Al risultêt '''$1''' ed '''$3'''|I risultêt '''$1 - $2''' ed '''$3'''}} per '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Rişultêt <strong>$1</strong> ed <strong>$3</strong>|Rişultêt <strong>$1 - $2</strong> ed <strong>$3</strong>}}",
        "search-nonefound": "La sērca an n'à mìa dê di rişultê.",
        "powersearch-legend": "Sèirca specêla",
        "powersearch-ns": "Sērca int al spâsi di nòm:",
        "recentchangesdays": "Nómer di dé da fêr vèder int al j ûltmi mudéfichi:",
        "recentchangesdays-max": "Mâsim $1 {{PLURAL:$1|dé}}",
        "recentchangescount": "Nómer ed mudéfichi da fêr vèder per default:",
+       "prefs-help-recentchangescount": "A gh'é dèinter al j ûltmi mudéfichi, stôri, e regéster.",
+       "prefs-help-watchlist-token2": "Còsta l'é la cêva secrēta p'r al flós web di tō tgnû 'd ôc specêl. Tót quî che la cgnòsen a sràn bòun ed lēşer i tō tgnû 'd ôc specêl, per còst an spartîrla mìa cun nisûn. [[Special:ResetTokens|Cléca ché s'ét ghê bişògn ed turnêrla impustêr]].",
+       "savedprefs": "Al preferèinsi în stêdi salvêdi.",
+       "timezonelegend": "Fûş urâri:",
+       "localtime": "Ōra lochêla:",
+       "timezoneuseserverdefault": "Drōva l'ōra stabilîda dal wiki ($1)",
+       "timezoneuseoffset": "Êter (spieghêr la diferèinsa)",
+       "servertime": "Ōra dal server:",
+       "guesstimezone": "Drōva l'ōra dal navigadōr",
        "timezoneregion-africa": "Âfrica",
        "timezoneregion-america": "Amèrica",
        "timezoneregion-antarctica": "Antârtide",
        "timezoneregion-europe": "Eurôpa",
        "timezoneregion-indian": "Ocèan Indiân",
        "timezoneregion-pacific": "Ocèan Pacéfich",
+       "allowemail": "Permèt a chiêter utèin ed mandêret ed la pōsta eletrônica",
+       "prefs-searchoptions": "Sērca",
+       "prefs-namespaces": "Spâsi di nòm",
+       "default": "Stabilî préma",
+       "prefs-files": "File",
+       "prefs-custom-css": "Adâta al CSS al tō necesitê",
+       "prefs-custom-js": "Adâta al JavaScript al tō necesitê",
+       "prefs-common-css-js": "CSS/JavaScript in comûn per tóti 'l skin:",
+       "prefs-reset-intro": "Es pōl druvêr cla pàgina ché per turnêr a impustêr al preferèinsi e cambiêr còli dichiarêdi int al sît. \nL'operasiòun l'an pōl mìa èser scanşlêda.",
+       "prefs-emailconfirm-label": "Cunfèirma ed la pôsta eletrônica:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Nòm utèint}}",
        "prefs-memberingroups": "{{GENDER:$2|Elemèint}}{{PLURAL:$1|dal gróp|di gróp}}:",
+       "prefs-registration": "Dâta 'd registrasiòun:",
        "yourrealname": "Nòm vèira:",
        "yourlanguage": "Léngua",
+       "yourvariant": "Câmbi 'd la léngua:",
+       "prefs-help-variant": "La versiòun o l'ortograféia ch' ét preferés vèder al pàgini ed cla wiki ché.",
+       "yournick": "Scutmâj (nikname):",
+       "prefs-help-signature": "I cumèint int al pàgini 'd discusiòun a dēven èser firmê cun \"<nowiki>~~~~</nowiki>\" ch' al gnirà cambiê cun la tó fîrma cun dôp la dâta.",
+       "badsig": "Erōr int la fîrma mìa standard, verifichêr i tag HTML.",
+       "badsiglength": "La fîrma siēlta l'é trôp lònga, l'an dēv mìa andêr d'ed sōver di $1 {{PLURAL:$1|carâter}}.",
+       "yourgender": "Cme arfêres a té?",
+       "gender-unknown": "Indiferèint",
+       "gender-male": "L'é registrê in sém a {{SITENAME}}",
+       "gender-female": "L'é registrêda in sém a {{SITENAME}}",
+       "prefs-help-gender": "L'impustasiòun ed cla preferèinsa ché l'é a siēlta. Al progrâma al drōva cól valōr ché per parlêr cun tè e numinêret cun chiêter cun al druvêr al gèner ed gramâtica gióst. Cl'infurmasiòun ché la srà póblica.",
        "email": "E-mail",
+       "prefs-help-realname": "Druvêr al nòm vèira l'é 'na siēlta personêla; s' es pèinsa 'd druvêrel al gnirâ uşê per dêr la paternitê di lavōr spidî.",
        "prefs-help-email": "Mèter l'indéris ed la tó pôsta eletrônica an n'é mia necesâri, mó al permèt ed ricêver la cêva 'd ingrès se per chêş ét la scurdés.",
        "prefs-help-email-others": "Ét pō ânca sernîr ed lasêr che chiêter a 's mèten in cuntât  tēgh cun la pôsta eletrônica cun al colegamèint da la tó pàgina utèint o da còla 'd discusiòun.  Al tó indirés al vîn mìa fât savèir a quî ch'ét 's mèten in cuntât tēgh.",
+       "prefs-help-email-required": "L'indirés ed pôsta eletrônica l'é ubligatôri.",
+       "prefs-info": "Infurmasiòun necesâri",
+       "prefs-i18n": "Internalişasiòun",
+       "prefs-signature": "Fîrma",
+       "prefs-dateformat": "Fōrma 'd la dâta",
+       "prefs-timeoffset": "Ōri 'd diferèinsa",
+       "prefs-advancedediting": "Siēlti generêli",
+       "prefs-editor": "Editōr",
+       "prefs-preview": "Guêrda préma",
+       "prefs-advancedrc": "Siēlti pió şvilupêdi",
+       "prefs-advancedrendering": "Siēlti pió şvilupêdi",
+       "prefs-advancedsearchoptions": "Siēlti pió şvilupêdi",
+       "prefs-advancedwatchlist": "Siēlti pió şvilupêdi",
+       "prefs-displayrc": "Siēlti ed vidûda",
+       "prefs-displaywatchlist": "Siēlti ed vidûda",
+       "prefs-tokenwatchlist": "Token",
+       "prefs-diffs": "Diferèinsi",
+       "prefs-help-prefershttps": "Cla diferèinsa ché la gh'à efèt dal st'êter ingrès.",
+       "prefswarning-warning": "T'é fât dal mudéfichi al tō preferèinsi ch'în mìa stêdi salvêdi. S'ét vê fōra da cla pàgina ché sèinsa clichêr \"$1\" al preferèinsi a gnîran mìa arnuvêdi.",
+       "prefs-tabs-navigation-hint": "Sugerimèint: è pusébil druvêr i tâst frècia a mansèina e a dréta per spustêres tr'al schēdi int l'elèinch dal schēdi.",
+       "email-address-validity-valid": "L'indirès ed pôste eletrônica a sèmbra vâlid",
+       "email-address-validity-invalid": "Mèt un indirés ed pôsta eletrônica vâlid",
+       "userrights": "Gestiòun di permès relatîv a j utèint",
+       "userrights-lookup-user": "Gestiòun di gróp utèint",
+       "userrights-user-editname": "Mèt dèinter al nòm utèint:",
+       "editusergroup": "Mudéfica gróp utèint",
+       "editinguser": "Mudéfica i dirét utèint ed l' utèint <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Mudéfica gróp utèint",
+       "saveusergroups": "Sêlva gróp utèint",
+       "userrights-groupsmember": "Al fà pêrt {{PLURAL:$1|al gróp|ai gróp}}:",
+       "userrights-groupsmember-auto": "Al fà pêrt ed sicûr a:",
+       "userrights-groups-help": "L'é pusébil mudifichêr i gróp in dó fà pêrt l'utèint. \n*'Na caşèla sernîda la sègna a che gróp al fà pêrt l'utèint. \n*'Na caşèla mìa serrnîda la sègna che l'utèin al fà mìa pêrt al gróp. \n*Al sègn * al sègna ch' an n'é m'a pusébil scanşlêr che l'utèin al fà pêrt al gróp dōp avèirel sgnê (o invicivêrsa).",
+       "userrights-reason": "Mutîv:",
+       "userrights-no-interwiki": "An es gh'à mìa i permès necesâri per cambiêr i dirét ed j utèint in sém a êter sît.",
+       "userrights-nodatabase": "Al databēş $1 al gh'é mìa o an n' mìa un databêş lochêl.",
+       "userrights-nologin": "Per dêr i dirét a j utèint l'é necesâri [[Special:UserLogin|fêr l'ingrès]] cme aministardōr.",
+       "userrights-notallowed": "An 't gh'ê mìa al permès per zuntêr o tōr via i permès utèint.",
+       "userrights-changeable-col": "Gróp ch'es pōlen mudifichêr.",
+       "userrights-unchangeable-col": "Gróp ch'an 's pōlen mìa mudifichêr.",
+       "userrights-conflict": "Cuntrâst ed mudéfica di dirét utèint! Cuntròla e cunfērma al tó mudéfichi.",
+       "userrights-removed-self": "T'é tôt via cun sucès i tō dirét. E dòunca, an 't prê pió andêr dèinter a cla pàgina ché.",
        "group": "Gróp:",
        "group-user": "Utèint",
        "group-autoconfirmed": "Utèint cunvalidê da per ló",
        "grouppage-suppress": "{{ns:project}}:Oversight",
        "right-read": "Al lēş al pàgini",
        "right-edit": "Mudéfica pàgini",
+       "right-createpage": "Ét pō fêr al pàgini (fōra che 'l pàgini 'd discusiòun).",
+       "right-createtalk": "Fà 'l pàgini 'd discusiòun.",
+       "right-createaccount": "Fà dal j utèinsi nōvi.",
+       "right-minoredit": "Sègna 'l mudéfichi cme céchi.",
+       "right-move": "Spôsta 'l pàgini",
+       "right-move-subpages": "Spôsta 'l pàgini insèm al relatîvi sòt pàgini",
+       "right-move-rootuserpages": "Spôsta 'l pàgini principêli 'd j utèint",
+       "right-move-categorypages": "Spôsta 'l categoréi",
+       "right-movefile": "Spôsta i file",
+       "right-suppressredirect": "An fà mìa un indirés nōv in atvomâtich quând a se spôsta 'na pàgina",
+       "right-upload": "Cârga un file",
+       "right-reupload": "Al scré in sém a 'n file ch' al gh'é bèle",
+       "right-reupload-own": "Al scré in sém a 'n file ch' al gh'é bèle carghê da l'istès utèint",
+       "right-reupload-shared": "Al souvrascrév int al pôst file ch' în int l'archévi spartî",
+       "right-upload_by_url": "Cârga un file da un indirés URL",
+       "right-purge": "Al pulés la memôria pruvişôria dal sît sèinsa cunfērma.",
+       "right-autoconfirmed": "An n'é mìa ublighê al lémit 'd asiòun per IP",
+       "right-bot": "Da tratêr cme şvilóp avtomâtich",
+       "right-nominornewtalk": "Al fa in môd che al mudéfichi céchi al pàgini 'd discussiòun an fâghen mìa vèder l'avîş 'd un mesâg nōv",
+       "right-apihighlimits": "Drōva di lémit pió êlt p'r al j interugasiòun API",
+       "right-writeapi": "Drōva l' API in scritûra",
+       "right-delete": "Scanşèla pàgini",
+       "right-bigdelete": "Scanşèla pàgini cun la stòria 'd la pàgina lònghi",
+       "right-deletelogentry": "Al scanşèla e al tōrna mèter vōş ed regéster bèin precîşi",
+       "right-deleterevision": "Al lōga versiòun precîşi dal pàgini",
+       "right-deletedhistory": "Al fà vèder al versiòun ed la stòria scanşlêdi sèinsa al tèst che gh'é unî",
+       "right-deletedtext": "Al fà veder al tèst scanşlê e al mudéfichi tr'al versiòun scanşlêdi",
+       "right-browsearchive": "Al sêrca int al pàgini scanşlêdi",
+       "right-undelete": "Recópra 'na pàgina",
+       "right-suppressrevision": "Al vèd, al lōga e al tōra mèter versiòun precîşi dal pàgini a utèint bast' ech sìa",
+       "right-viewsuppressed": "Al vèd versiòun lughêdi a utèint bast' ech sìa",
+       "right-suppressionlog": "Al fà vèder i regéster privê",
+       "right-block": "Blôca al mudéfichi da pêrta 'd êter utèint",
+       "right-blockemail": "L'impidés a 'n utèint de spidîr la pôsta eletrônica",
+       "right-hideuser": "Blôca un nòm utèint, e 'l lōga al póblich",
+       "right-ipblock-exempt": "Al vèd mìa i blôch 'd IP, i blôch avtomâtich e i blôch ed range IP",
        "newuserlogpage": "Utèint nōv",
        "action-read": "lēzer cla pàgina ché",
        "action-edit": "Mudifichêr cla pàgina ché",
        "rcshowhidemine": "$1 al mē mudéfichi",
        "rclinks": "Fà vèder al $1 ûltmi mudéfichi fâti int j ûltem $2 dé<br />$3",
        "diff": "dif",
-       "hist": "stòr",
+       "hist": "stòria",
        "hide": "Lōga",
        "show": "Fà vèder",
        "minoreditletter": "m",
        "pager-older-n": "{{PLURAL:$1|1 al pió vèc|$1 i pió vèc}}",
        "booksources": "Tèst o documèint da léber.",
        "booksources-search-legend": "Sērca 'd documèint insém a di léber",
-       "booksources-go": "Và",
        "log": "Regéster",
        "allpages": "Tót al pàgini.",
        "allarticles": "Tót al pàgini.",
        "watchthispage": "Và adrē a cla pàgina ché",
        "unwatch": "Andêr mìa adrē",
        "watchlist-details": "La lésta 'd quî tgnû 'd ôc specêl la gh'à {{PLURAL:$1|'na pàgina (e la relatîva pàgina 'd discusiòun)|$1 pagine (e al relatîvi  pàgini 'd discusiòun)}}.",
-       "wlshowlast": "Fà vèder al j ûltmi $1 ōri $2 dé $3",
+       "wlshowlast": "Fà vèder al j ûltmi $1 ōri $2 dé",
        "watchlist-options": "Siēlti di tgnû sòt ôc specêl.",
        "created": "creät",
        "changed": "mudifegat",
        "actioncomplete": "Asiòun cumpîda",
        "actionfailed": "Asiòun falîda",
        "dellogpage": "Scanşladûri",
-       "rollback_short": "Tōrna préma dal mudéfichi",
-       "rollbacklink": "tōrna préma dal mudéfichi",
+       "rollback_short": "Tōrna préma dal mudéfichi",
+       "rollbacklink": "tōrna préma dal mudéfichi",
        "rollbackfailed": "An t'é mia turnê indrē",
        "protectlogpage": "Al prutesiòun",
        "protectedarticle": "l'à prutèt \"[[$1]]\"",
        "blocklink": "blôca",
        "unblocklink": "şblôca",
        "change-blocklink": "câmbia blôch",
-       "contribslink": "lavōr",
+       "contribslink": "lavōr fât",
        "blocklogpage": "Blôch",
        "blocklogentry": "t'é bluchê [[$1]] per un peréiod ed $2 $3",
        "unblocklogentry": "l'à şbluchê $1",
        "tooltip-pt-login": "A 's cunsélia 'd fêr la registrasiòun, ânca s' an n'é mia ubligatôri.",
        "tooltip-pt-logout": "Và fōra",
        "tooltip-ca-talk": "Guêrda al discusiòun relatîvi a cla pàgina chè.",
-       "tooltip-ca-edit": "Ét pō mudifiche cla pàgina ché. Per piaşèir drōva al ptòun \"Guêrda préma\" préma 'd salvêr còl che t'é fât.",
+       "tooltip-ca-edit": "Ét pō mudifiche cla pàgina ché. Per piaşèir drōva al ptòun \"Guêrda préma 'd salvêr\" per vèder còl che t'é fât.",
        "tooltip-ca-addsection": "Cumîncia 'na sesiòun nōva.",
        "tooltip-ca-viewsource": "Cla pàgina ché l'é sòta prutesiòun, mó 't pō vèder al só côdis surzéia.",
        "tooltip-ca-history": "Versiòun ed préma fâti a cla pàgina ché.",
        "tooltip-ca-nstab-special": "Còsta ché l'é 'na pàgina specêlal l'an pōl mìa èser mudifichêda",
        "tooltip-ca-nstab-project": "Guêrda la pàgina dal prugèt",
        "tooltip-ca-nstab-image": "Guêrda la pàgina dal 'file'",
-       "tooltip-ca-nstab-template": "Guêrda 'l template",
+       "tooltip-ca-nstab-template": "Guêrda 'l mudèl",
        "tooltip-ca-nstab-help": "Guêrda la pàgina d'ajót",
        "tooltip-ca-nstab-category": "Guêrda la pàgina 'd la categoréia",
        "tooltip-minoredit": "Sègna cme 'na mudéfica céca",
        "exif-languagecode": "Léngva",
        "exif-iimcategory": "Categoréia",
        "exif-identifier": "Identificatîv",
-       "watchlistall2": "tót",
        "namespacesall": "tót",
        "monthsall": "tót",
        "recreate": "Tōrna a fêr",
        "fileduplicatesearch-submit": "Sērca",
        "specialpages": "Pàgini specêli",
        "external_image_whitelist": "#Lasêr cla pàgina ché acsé cme l'é<pre>\n#Mèter dèinter i pès dal j espresiòun regolêri (sōl la pêrta cla va fra //) ed sègvit\n#Còsti gnirân més a cunfrûnt cun j indirés URL dal figûri d'ed fōra (hotlinked) \n#Al cunbinasiòun asrân fât vèder cme figûri, se no a gnirà fât vèder sōl al colegamèint\n#Al rîghi che cumîncen cun # în cunsidrêdi di cumèint\n#La diferèinsa tr' al lètri grândi e al lètri céchi an gh'à mìa impurtânsa\n\n#Mèter sōver cla rîga ché tót i pès di regex. Lasêr cla rîga ché acsé cme l'é</pre>",
-       "tag-filter": "Fîlta per  [[Special:Tags|etichèta]]",
+       "tag-filter": "Fîltra per  [[Special:Tags|etichèta]]",
        "tags-edit": "mudéfica",
        "compare-page1": "Pàgina 1",
        "compare-page2": "Pàgina 2",
index 6156867..b2ccc7c 100644 (file)
        "passwordreset-emailsent-capture": "Έχει αποσταλεί email επαναφοράς κωδικού, το οποίο φαίνεται πιο κάτω.",
        "passwordreset-emailerror-capture": "Ένα email επαναφοράς κωδικού έχει δημιουργηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο  {{GENDER:$2|χρήστη}}: $1",
        "changeemail": "Αλλαγή της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
-       "changeemail-header": "Αλλαγή λογαριασμού ηλεκτρονικού ταχυδρομείου",
        "changeemail-text": "Συμπληρώστε αυτή τη φόρμα για να αλλάξετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας. Θα πρέπει να εισάγετε τον κωδικό σας για να επιβεβαιωθεί αυτή η αλλαγή.",
        "changeemail-no-info": "Πρέπει να έχετε συνδεθεί για άμεση πρόσβαση σε αυτήν τη σελίδα.",
        "changeemail-oldemail": "Τρέχουσα διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "changeemail-none": "(κανένα)",
        "changeemail-password": "Ο κωδικός πρόσβασής σας στο εγχείρημα {{SITENAME}}:",
        "changeemail-submit": "Αλλαγή διεύθυνσης ηλεκτρονικού ταχυδρομείου",
-       "changeemail-cancel": "Ακύρωση",
        "changeemail-throttled": "Κάνατε πάρα πολλές απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
        "resettokens": "Επαναφορά των κλειδιών",
        "resettokens-text": "Μπορείτε να επαναφέρετε τα κλειδιά, τα οποία επιτρέπουν την πρόσβαση σε ορισμένα ιδιωτικά δεδομένα που συνδέονται με τον λογαριασμό σας εδώ.\n\nΠρέπει να το κάνετε εάν κατά λάθος τα μοιραστήκατε με κάποιον ή αν ο λογαριασμός σας έχει παραβιαστεί.",
        "showpreview": "Εμφάνιση προεπισκόπησης",
        "showdiff": "Εμφάνιση αλλαγών",
        "blankarticle": "<strong>Προειδοποίηση:</strong> Η σελίδα που δημιουργείτε είναι κενή.\nΕάν κάνετε κλικ στο κουμπί \"{{int:savearticle}}\" και πάλι, η σελίδα θα δημιουργηθεί χωρίς κανένα περιεχόμενο.",
-       "anoneditwarning": "'''Προειδοποίηση:''' Δεν έχετε συνδεθεί. Η διεύθυνση IP σας θα καταγραφεί στο ιστορικό επεξεργασίας αυτής της σελίδας.",
+       "anoneditwarning": "<strong>Προειδοποίηση:</strong> Δεν έχετε συνδεθεί. Η διεύθυνση IP σας θα είναι ορατή δημόσια αν κάνετε κάποια επεξεργασία. Αν <strong>[$1 συνδεθείτε]</strong> ή <strong>[$2 δημιουργήσετε λογαριασμό]</strong>, οι επεξεργασίες σας θα αποδοθούν στο όνομά χρήστη σας, μαζί με άλλα οφέλη.",
        "anonpreviewwarning": "''Δεν έχετε συνδεθεί. Η αποθήκευση θα καταγράψει την διεύθυνσή IP σας στο ιστορικό επεξεργασίας αυτής της σελίδας.''",
        "missingsummary": "'''Υπενθύμιση:''' Δεν έχετε συμπληρώσει τη σύνοψη επεξεργασίας. Αν κάνετε κλικ στο κουμπί Αποθήκευση πάλι, η επεξεργασία σας θα αποθηκευτεί χωρίς σύνοψη.",
        "missingcommenttext": "Παρακαλώ εισάγετε ένα σχόλιο παρακάτω.",
        "nonunicodebrowser": "'''ΠΡΟΣΟΧΗ! Ο περιηγητής σας δεν είναι συμβατός με κωδικοποίηση Unicode.'''\nΓια την ασφαλή επεξεργασία των σελίδων έχει βρεθεί ένας εναλλακτικός τρόπος: Όσοι χαρακτήρες δεν είναι ASCII θα φαίνονται στο πλαίσιο επεξεργασίας ως δεκαεξαδικοί κωδικοί.",
        "editingold": "'''Προειδοποίηση: Επεξεργάζεστε μια παλιότερη αναθεώρηση αυτής της σελίδας.'''\nΑν την αποθηκεύσετε, όσες αλλαγές έχουν γίνει μετά από αυτή την αναθεώρηση θα χαθούν.",
        "yourdiff": "Διαφορές",
-       "copyrightwarning": "Î\9fλεÏ\82 Î¿Î¹ Ï\83Ï\85νειÏ\83Ï\86οÏ\81έÏ\82 Ï\83Ï\84ο {{SITENAME}} Î¸ÎµÏ\89Ï\81οÏ\8dνÏ\84αι Ï\8cÏ\84ι Î´Î·Î¼Î¿Ï\83ιεÏ\8dονÏ\84αι Ï\83Ï\8dμÏ\86Ï\89να Î¼Îµ Ï\84ην $2 (Î\92λ. $1 Î³Î¹Î± Î»ÎµÏ\80Ï\84ομέÏ\81ειεÏ\82).\nÎ\91ν Î´ÎµÎ½ ÎµÏ\80ιθÏ\85μείÏ\84ε Ï\84α ÎºÎµÎ¯Î¼ÎµÎ½Î¬ Ï\83αÏ\82 Î½Î± Ï\84α ÎµÏ\80εξεÏ\81γαÏ\83Ï\84οÏ\8dν ÎºÎ±Ï\84ά Ï\84ην ÎºÏ\81ίÏ\83η Ï\84οÏ\85Ï\82 Î¬Î»Î»Î¿Î¹ Ï\87Ï\81ήÏ\83Ï\84εÏ\82 ÎºÎ±Î¹ Î½Î± Ï\84α Î´Î¹Î±Î´Ï\8eÏ\83οÏ\85ν ÎºÎ±Ï\84ά Î²Î¿Ï\8dληÏ\83η, Ï\80αÏ\81ακαλοÏ\8dμε Î½Î± Î¼Î·Î½ Ï\84α Î±Î½Î±Ï\81Ï\84ήÏ\83εÏ\84ε Ï\83ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\87Ï\8eÏ\81ο. Î\8c\84ι Ï\83Ï\85νειÏ\83Ï\86έÏ\81εÏ\84ε Ï\83Ï\84ο Ï\87Ï\8eÏ\81ο Î±Ï\85Ï\84Ï\8c Ï\83ε ÎºÎµÎ¯Î¼ÎµÎ½Î±, Î´Î¹Î±Î³Ï\81άμμαÏ\84α, Ï\83Ï\84οιÏ\87εία Î® ÎµÎ¹ÎºÏ\8cνεÏ\82 Ï\80Ï\81έÏ\80ει Î½Î± ÎµÎ¯Î½Î±Î¹ Î´Î¹ÎºÎ¬ Ï\83αÏ\82 Î­Ï\81γα Î® Î½Î± Î±Î½Î®ÎºÎ¿Ï\85ν Ï\83Ï\84ο Î´Î·Î¼Ï\8cÏ\83ιο Ï\84ομέα (public domain) Î® Î½Î± Ï\80Ï\81οέÏ\81Ï\87ονÏ\84αι Î±Ï\80Ï\8c ÎµÎ»ÎµÏ\8dθεÏ\81εÏ\82 Î® Î±Î½Î¿Î¹Ï\87Ï\84έÏ\82 Ï\80ηγέÏ\82 Î¼Îµ Ï\81ηÏ\84ή Î¬Î´ÎµÎ¹Î± Î±Î½Î±Î´Î·Î¼Î¿Ï\83ίεÏ\85Ï\83ηÏ\82.<br />\nΤέλοÏ\82 Î²ÎµÎ²Î±Î¹Ï\8eνεÏ\84ε Ï\80Ï\89Ï\82 Ï\8c\84ι Î³Ï\81άÏ\86εÏ\84ε Ï\83ε Î±Ï\85Ï\84Ï\8c Ï\84ον Ï\87Ï\8eÏ\81ο ÎµÎ¯Î½Î±Î¹ Ï\80Ï\81Ï\89Ï\84Ï\8cÏ\84Ï\85Ï\80ο Î´Î¹ÎºÏ\8c Ï\83αÏ\82 Î­Ï\81γο ÎºÎ±Î¹, Î¬Ï\83Ï\87εÏ\84α Î¼Îµ Ï\84ην Î­ÎºÏ\84αÏ\83ή Ï\84οÏ\85, Î´ÎµÎ½ Î­Ï\87ει ÎµÎºÏ\87Ï\89Ï\81ηθεί Ï\83ε Ï\84Ï\81ίÏ\84οÏ\85Ï\82 Î· Î´Î·Î¼Î¿Ï\83ίεÏ\85Ï\83η ÎºÎ±Î¹ Î· ÎµÎºÎ¼ÎµÏ\84άλλεÏ\85Ï\83ή Ï\84οÏ\85.\n'''ΠÎ\91ΡÎ\91Î\9aÎ\91Î\9bÎ\9fÎ¥Î\9cÎ\95 Î\9dÎ\91 Î\9cÎ\97Î\9d Î\91Î\9dÎ\91ΡΤÎ\97ΣÎ\95ΤÎ\95 Î\9aÎ\95Î\99Î\9cÎ\95Î\9dÎ\91 Î¤Î¡Î\99ΤΩÎ\9d Î\95Î\91Î\9d Î\94Î\95Î\9d Î\95ΧÎ\95ΤÎ\95 Î¤Î\97Î\9d Î\91Î\94Î\95Î\99Î\91 Î¤Î\9fÎ¥ Î\99Î\94Î\99Î\9fÎ\9aΤÎ\97ΤÎ\97 Î¤Î\9fÎ¥ COPYRIGHT!'''",
+       "copyrightwarning": "ΠαÏ\81ακαλοÏ\8dμε Ï\83ημειÏ\8eÏ\83Ï\84ε Ï\8cÏ\84ι Ï\8cλεÏ\82 Î¿Î¹ Ï\83Ï\85νειÏ\83Ï\86οÏ\81έÏ\82 Ï\83Ï\84ον Î¹Ï\83Ï\84Ï\8cÏ\84οÏ\80ο {{SITENAME}} Î¸ÎµÏ\89Ï\81οÏ\8dνÏ\84αι Ï\8cÏ\84ι Î´Î·Î¼Î¿Ï\83ιεÏ\8dονÏ\84αι Ï\83Ï\8dμÏ\86Ï\89να Î¼Îµ Ï\84ην $2 (βλ. $1 Î³Î¹Î± Î»ÎµÏ\80Ï\84ομέÏ\81ειεÏ\82).\nÎ\91ν Î´ÎµÎ½ ÎµÏ\80ιθÏ\85μείÏ\84ε Ï\84α ÎºÎµÎ¯Î¼ÎµÎ½Î¬ Ï\83αÏ\82 Î½Î± Ï\84α ÎµÏ\80εξεÏ\81γάζονÏ\84αι Î±Î½Î·Î»ÎµÏ\8eÏ\82 Î¬Î»Î»Î¿Î¹ Ï\87Ï\81ήÏ\83Ï\84εÏ\82 ÎºÎ±Î¹ Î½Î± Ï\84α Î´Î¹Î±Î´Î¯Î´Î¿Ï\85ν ÎºÎ±Ï\84ά Î²Î¿Ï\8dληÏ\83η, Ï\84Ï\8cÏ\84ε Î½Î± Î¼Î·Î½ Ï\84α Ï\85Ï\80οβάλλεÏ\84ε ÎµÎ´Ï\8e.<br />Î\9cαÏ\82 Ï\85Ï\80Ï\8cÏ\83Ï\87εÏ\83Ï\84ε ÎµÏ\80ίÏ\83ηÏ\82 Ï\8cÏ\84ι Î±Ï\85Ï\84Ï\8c Ï\84ο Î³Ï\81άÏ\88αÏ\84ε Î¼Ï\8cνοι Ï\83αÏ\82 Î® Ï\84ο Î±Î½Ï\84ιγÏ\81άÏ\88αÏ\84ε Î±Ï\80Ï\8c ÎºÎ¬Ï\80οια ÎµÎ»ÎµÏ\8dθεÏ\81η Ï\80ηγή Ï\89Ï\82 ÎºÎ¿Î¹Î½Ï\8c ÎºÏ\84ήμα Î® ÎºÎ¬Ï\84ι Î±Î½Î¬Î»Î¿Î³Î¿.\n<strong>Î\9cην Ï\85Ï\80οβάλλεÏ\84ε Î´Î¿Ï\85λειά Ï\80οÏ\85 Ï\80Ï\81οÏ\83Ï\84αÏ\84εÏ\8dεÏ\84αι Î±Ï\80Ï\8c Ï\80νεÏ\85μαÏ\84ικά Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\89Ï\81ίÏ\82 Î¬Î´ÎµÎ¹Î±!</strong>",
        "copyrightwarning2": "Σημειώστε ότι όλες οι συνεισφορές στον ιστότοπο {{SITENAME}} μπορούν να υποστούν επεξεργασία, να αλλαχθούν, ή να αφαιρεθούν από άλλους συνεισφέροντες. Αν δεν θέλετε τα γραπτά σας να υποστούν επεξεργασία κατά βούληση, τότε μην τα τοποθετήσετε σε αυτό το χώρο.<br />\nΕπίσης μας υπόσχεστε πως ό,τι γράφετε είναι δικό σας, ή αντιγραμμένο από μια πηγή που είναι κοινό κτήμα, ή μια παρόμοια ελεύθερη πηγή (δείτε $1 για λεπτομέρειες).\n'''ΠΑΡΑΚΑΛΟΥΜΕ ΝΑ ΜΗΝ ΤΟΠΟΘΕΤΕΙΤΕ ΠΝΕΥΜΑΤΙΚΑ ΚΑΤΟΧΥΡΩΜΕΝΟ ΕΡΓΟ ΧΩΡΙΣ ΑΔΕΙΑ!'''",
        "longpageerror": "'''Σφάλμα: Το κείμενο που καταχωρήσατε έχει μήκος {{PLURAL:$1|ένα kilobyte|$1 kilobytes}}, το οποίο είναι μεγαλύτερο από το μέγιστο {{PLURAL:$2|του ενός kilobyte|των $2 kilobytes}}.'''\nΔεν μπορεί να αποθηκευτεί.",
        "readonlywarning": "'''Προειδοποίηση: Η βάση δεδομένων έχει κλειδωθεί για συντήρηση, έτσι δεν θα μπορέσετε να αποθηκεύσετε τις επεξεργασίες σας αυτή τη στιγμή.'''\nΜπορείτε αν θέλετε να μεταφέρετε με αντιγραφή-επικόλληση το κείμενό σας σε αρχείο κειμένου και να το αποθηκεύσετε για αργότερα.\n\nΟ διαχειριστής που την κλείδωσε έδωσε την εξής εξήγηση: $1",
        "search-relatedarticle": "Σχετικά",
        "searchrelated": "σχετικά",
        "searchall": "όλα",
-       "showingresults": "Î\94είÏ\84ε Ï\80αÏ\81ακάÏ\84Ï\89 Î¼Î­Ï\87Ï\81ι Ï\84α {{PLURAL:$1|'''1'''αÏ\80οÏ\84έλεÏ\83μα|'''$1''' Î±Ï\80οÏ\84ελέÏ\83μαÏ\84α}} Î¾ÎµÎºÎ¹Î½Ï\8eνÏ\84αÏ\82 Î¼Îµ #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Αποτέλεσμα '''$1''' από '''$3'''|Αποτελέσματα '''$1 - $2''' από '''$3'''}} για '''$4'''",
+       "showingresults": "ΠαÏ\81ακάÏ\84Ï\89 {{PLURAL:$1|εμÏ\86ανίζεÏ\84αι Î¼Î­Ï\87Ï\81ι <strong>1</strong> Î±Ï\80οÏ\84έλεÏ\83μα|εμÏ\86ανίζονÏ\84αι Î¼Î­Ï\87Ï\81ι <strong>$1</strong> Î±Ï\80οÏ\84ελέÏ\83μαÏ\84α}} Î¾ÎµÎºÎ¹Î½Ï\8eνÏ\84αÏ\82 Î±Ï\80Ï\8c Ï\84ο Î\9dο <strong>$2</strong>.",
+       "showingresultsinrange": "Παρακάτω {{PLURAL:$1|εμφανίζεται μέχρι <strong>1</strong> αποτέλεσμα|εμφανίζονται μέχρι <strong>$1</strong> αποτελέσματα}} σε εύρος από το Νο <strong>$2</strong> μέχρι το Νο <strong>$3</strong>.",
        "search-nonefound": "Δεν υπάρχουν αποτελέσματα που να ικανοποιούν το ερώτημα.",
        "powersearch-legend": "Αναλυτική αναζήτηση",
        "powersearch-ns": "Αναζήτηση στις περιοχές ονομάτων:",
        "preferences": "Προτιμήσεις",
        "mypreferences": "Προτιμήσεις",
        "prefs-edits": "Αριθμός επεξεργασιών:",
-       "prefsnologintext2": "Παρακαλούμε $1 για να αλλάξετε τις προτιμήσεις σας.",
+       "prefsnologintext2": "Παρακαλώ συνδεθείτε για να αλλάξετε τις προτιμήσεις σας.",
        "prefs-skin": "Οπτική οργάνωση (skin)",
        "skin-preview": "Προεπισκόπηση",
        "datedefault": "Χωρίς προτίμηση",
        "prefs-tokenwatchlist": "Κλειδί",
        "prefs-diffs": "Διαφορές",
        "prefs-help-prefershttps": "Αυτή η προτίμηση θα τεθεί σε ισχύ στην επόμενή σας σύνδεση.",
+       "prefswarning-warning": "Έχετε κάνει αλλαγές στις προτιμήσεις σας που δεν έχουν αποθηκευτεί ακόμα.\nΕάν αφήσετε αυτή τη σελίδα χωρίς να κάνετε κλικ στο \"$1\" οι προτιμήσεις σας δεν θα ενημερωθούν.",
        "prefs-tabs-navigation-hint": "Συμβουλή: Μπορείτε να χρησιμοποιήσετε τα πλήκτρα διευθύνσεων αριστερά και δεξιά για να πλοηγηθείτε μεταξύ των καρτελών στη λίστα καρτελών.",
        "email-address-validity-valid": "Η διεύθυνση ηλεκτρονικού ταχυδρομείου φαίνεται έγκυρη",
        "email-address-validity-invalid": "Εισάγετε  μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "right-move": "Μετακίνηση σελίδων",
        "right-move-subpages": "Μετακίνηση σελίδων μαζί με τις υποσελίδες τους",
        "right-move-rootuserpages": "Μετακίνηση κεντρικών σελίδων χρηστών",
+       "right-move-categorypages": "Μετακίνηση σελίδων κατηγοριών",
        "right-movefile": "Μετακίνηση αρχείων",
        "right-suppressredirect": "Μη δημιουργία ανακατεύθυνσης από το παλιό όνομα κατά τη μετακίνηση μιας σελίδας",
        "right-upload": "Επιφόρτωση αρχείων",
        "right-browsearchive": "Αναζήτηση στις διαγραμμένες σελίδες",
        "right-undelete": "Ανάκληση διαγραφής μίας σελίδας",
        "right-suppressrevision": "Επιθεώρηση και αποκατάσταση αναθεωρήσεων κρυμμένων από τους διαχειριστές",
+       "right-viewsuppressed": "Προβολή αναθεωρήσεων κρυμμένων από κάθε χρήστη",
        "right-suppressionlog": "Προβολή ιδιωτικών καταγραφών",
        "right-block": "Φραγή άλλων χρηστών από την επεξεργασία",
        "right-blockemail": "Φραγή ενός χρήστη από την αποστολή ηλεκτρονικών μηνυμάτων",
        "action-move": "να μετακινήσετε αυτή τη σελίδα",
        "action-move-subpages": "να μετακινήσετε αυτή τη σελίδα, καθώς και τις υποσελίδες της",
        "action-move-rootuserpages": "να μετακινήσετε κεντρικές σελίδες χρηστών",
+       "action-move-categorypages": "μετακίνηση σελίδων κατηγοριών",
        "action-movefile": "να μετακινήσετε αυτό το αρχείο",
        "action-upload": "να επιφορτώσετε αυτό το αρχείο",
        "action-reupload": "να ανεβάσετε νέα έκδοση αυτού του υπάρχοντος αρχείου",
        "recentchanges-legend-heading": "'''Υπόμνημα:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (δείτε [[Special:NewPages|κατάλογος νέων σελίδων]])",
        "rcnotefrom": "Παρακάτω είναι οι αλλαγές από τις <strong>$2</strong>  (εμφανίζονται μέχρι <strong>$1</strong> ).",
-       "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από $3 $2",
+       "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από τις $3 στις $2",
        "rcshowhideminor": "$1 μικροεπεξεργασιών",
        "rcshowhideminor-show": "Εμφάνιση",
        "rcshowhideminor-hide": "Απόκρυψη",
        "windows-nonascii-filename": "Αυτό το wiki δεν υποστηρίζει ονόματα αρχείων με ειδικούς χαρακτήρες.",
        "fileexists": "Υπάρχει ήδη αρχείο με αυτό το όνομα, παρακαλούμε ελέγξτε το <strong>[[:$1]]</strong> εάν δεν είστε {{GENDER:|σίγουρος|σίγουρη}} αν θέλετε να το αλλάξετε.\n[[$1|thumb]]",
        "filepageexists": "Η σελίδα περιγραφής για αυτό το αρχείο δημιουργήθηκε ήδη στο <strong>[[:$1]]</strong>, αλλά κανένα αρχείο με αυτό το όνομα δεν υπάρχει αυτή τη στιγμή.\nΗ περιγραφἠ που θα εισάγετε δεν θα εμφανιστεί στη σελίδα περιγραφής.\nΓια να εμφανιστεί η περιγραφή σας εκεί, θα πρέπει να την επεξεργαστείτε χειροκίνητα.\n[[$1|thumb]]",
-       "fileexists-extension": "Î\88να Î±Ï\81Ï\87είο Î¼Îµ Ï\80αÏ\81Ï\8cμοιο Ï\8cνομα Ï\85Ï\80άÏ\81Ï\87ει: [[$2|thumb]]\n* Î\8cνομα Ï\84οÏ\85 Ï\80Ï\81οÏ\82 ÎµÏ\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η Î±Ï\81Ï\87είοÏ\85: <strong>[[:$1]]</strong>\n* Î\8cνομα Ï\85Ï\80άÏ\81Ï\87ονÏ\84οÏ\82 Î±Ï\81Ï\87είοÏ\85: <strong>[[:$2]]</strong>\nΠαÏ\81ακαλÏ\8e Î´Î¹Î±Î»Î­Î¾Ï\84ε Î­Î½Î± Î´Î¹Î±Ï\86οÏ\81εÏ\84ικÏ\8c Ï\8cνομα.",
+       "fileexists-extension": "Î¥Ï\80άÏ\81Ï\87ει Î­Î½Î± Î±Ï\81Ï\87είο Î¼Îµ Ï\80αÏ\81Ï\8cμοιο Ï\8cνομα: [[$2|thumb]]\n* Î\8cνομα Ï\84οÏ\85 Ï\80Ï\81οÏ\82 Î±Î½Î­Î²Î±Ï\83μα Î±Ï\81Ï\87είοÏ\85: <strong>[[:$1]]</strong>\n* Î\8cνομα Ï\85Ï\80άÏ\81Ï\87ονÏ\84οÏ\82 Î±Ï\81Ï\87είοÏ\85: <strong>[[:$2]]</strong>\nÎ\9cήÏ\80Ï\89Ï\82 Î¸Î± Î¸Î­Î»Î±Ï\84ε Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε ÎºÎ¬Ï\80οιο Ï\8cνομα Ï\80οÏ\85 Î½Î± Î¾ÎµÏ\87Ï\89Ï\81ίζει Ï\80εÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81ο;",
        "fileexists-thumbnail-yes": "Το αρχείο φαίνεται ότι είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''. [[$1|thumb]]\nΠαρακαλώ ελέγξτε το αρχείο <strong>[[:$1]]</strong>.\nΑν το ελεγμένο αρχείο είναι η ίδια εικόνα στο αρχικό μέγεθος δεν είναι απαραίτητο να επιφορτώσετε μια επιπλέον μικρογραφία.",
        "file-thumbnail-no": "Το όνομα αρχείου αρχίζει με <strong>$1</strong>.\nΦαίνεται πως είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''.\nΑν έχετε αυτή την εικόνα σε πλήρη ανάλυση, επιφορτώστε τη, αλλιώς αλλάξτε παρακαλώ το όνομα του αρχείου.",
        "fileexists-forbidden": "Ένα αρχείο με αυτό το όνομα υπάρχει ήδη˙ εάν ακόμη θέλετε να επιφορτώσωτε αυτό το αρχείο παρακαλώ πηγαίνετε πίσω και επιφορτώστε το υπό ένα νέο όνομα. [[File:$1|thumb|center|$1]]",
        "license-header": "Αδειοδότηση",
        "nolicense": "Καμία επιλεγμένη",
        "license-nopreview": "(Μη διαθέσιμη προεπισκόπηση)",
-       "upload_source_url": " (ένα έγκυρο, δημόσια προσβάσιμο URL)",
-       "upload_source_file": " (ένα αρχείο στον υπολογιστή σας)",
+       "upload_source_url": "(το επιλεγμένο σας αρχείο από μια έγκυρη, δημόσια προσβάσιμη διεύθυνση URL)",
+       "upload_source_file": "(το επιλεγμένο αρχείο από τον υπολογιστή σας)",
+       "listfiles-delete": "διαγραφή",
        "listfiles-summary": "Αυτή η ειδική σελίδα δείχνει όλα τα επιφορτωμένα αρχεία.",
        "listfiles_search_for": "Αναζήτηση για όνομα πολυμέσου:",
        "imgfile": "αρχείο",
        "listfiles_size": "Μέγεθος",
        "listfiles_description": "Περιγραφή",
        "listfiles_count": "Εκδόσεις",
+       "listfiles-show-all": "Συμπερίληψη παλαιών εκδόσεων των εικόνων",
        "listfiles-latestversion": "Τρέχουσα έκδοση",
        "listfiles-latestversion-yes": "Ναι",
        "listfiles-latestversion-no": "Όχι",
        "unusedtemplates": "Αχρησιμοποίητα πρότυπα",
        "unusedtemplatestext": "Αυτή η σελίδα περιέχει όλες τις σελίδες στην περιοχή ονομάτος των {{ns:template}}, οι οποίες δεν περιλαμβάνονται σε άλλη σελίδα. Θυμηθείτε να ελέγξετε για άλλους συνδέσμους προς τα πρότυπα πριν τα διαγράψετε.",
        "unusedtemplateswlh": "άλλοι σύνδεσμοι",
-       "randompage": "ΤÏ\85Ï\87αίο Î»Î®Î¼Î¼α",
+       "randompage": "ΤÏ\85Ï\87αία Ï\83ελίδα",
        "randompage-nopages": "Δεν υπάρχουν σελίδες {{PLURAL:$2|στον ακόλουθο ονοματοχώρο|στους ακόλουθους ονοματοχώρους}}: $1.",
        "randomincategory": "Τυχαία σελίδα στην κατηγορία",
        "randomincategory-invalidcategory": "Το «$1» δεν είναι έγκυρο όνομα κατηγορίας.",
        "randomincategory-nopages": "Δεν υπάρχουν σελίδες στην κατηγορία [[:Category:$1|$1]].",
-       "randomincategory-selectcategory-submit": "Μετάβαση",
+       "randomincategory-category": "Κατηγορία:",
+       "randomincategory-legend": "Τυχαία σελίδα στην κατηγορία",
        "randomredirect": "Τυχαία ανακατεύθυνση",
        "randomredirect-nopages": "Δεν υπάρχουν ανακατευθύνσεις στον ονοματοχώρο \"$1\".",
        "statistics": "Στατιστικά",
        "statistics-header-pages": "Στατιστικά σελίδων",
        "statistics-header-edits": "Στατιστικά επεξεργασιών",
-       "statistics-header-views": "Î\95μÏ\86άνιÏ\83η στατιστικών",
+       "statistics-header-views": "ΠÏ\81οβολή στατιστικών",
        "statistics-header-users": "Στατιστικά χρηστών",
        "statistics-header-hooks": "Άλλα στατιστικά",
        "statistics-articles": "Σελίδες περιεχομένου",
        "pageswithprop-submit": "Μετάβαση",
        "doubleredirects": "Διπλές ανακατευθύνσεις",
        "doubleredirectstext": "Αυτή η σελίδα συγκαταλέγει σελίδες οι οποίες ανακατευθύνουν σε άλλες σελίδες ανακατεύθυνσης. Κάθε σειρά περιέχει συνδέσμους προς την πρώτη και τη δεύτερη σελίδα ανακατεύθυνσης, όπως επίσης και την πρώτη αράδα του κειμένου στη δεύτερη σελίδα ανακατεύθυνσης η οποία και είναι, κανονικά, ο πραγματικός προορισμός της ανακατεύθυνσης -εκεί δηλαδή όπου θα έπρεπε να είχατε οδηγηθεί από την αρχή. Τα <del>διεγραμμένα</del> λήμματα έχουν επιλυθεί.",
-       "double-redirect-fixed-move": "Η [[$1]] έχει μετακινηθεί, τώρα είναι ανακατεύθυνση στην [[$2]]",
-       "double-redirect-fixed-maintenance": "Î\94ιÏ\8cÏ\81θÏ\89Ï\83η Î´Î¹Ï\80λήÏ\82 Î±Î½Î±ÎºÎ±Ï\84εÏ\8dθÏ\85νÏ\83ηÏ\82 Î±Ï\80Ï\8c Ï\84ο [[$1]] Ï\83Ï\84ο [[$2]].",
+       "double-redirect-fixed-move": "Η [[$1]] έχει μετακινηθεί.\nΕνημερώθηκε αυτόματα και τώρα είναι ανακατεύθυνση στην [[$2]].",
+       "double-redirect-fixed-maintenance": "Î\91Ï\85Ï\84Ï\8cμαÏ\84η Î´Î¹Ï\8cÏ\81θÏ\89Ï\83η Î´Î¹Ï\80λήÏ\82 Î±Î½Î±ÎºÎ±Ï\84εÏ\8dθÏ\85νÏ\83ηÏ\82 Î±Ï\80Ï\8c [[$1]] Ï\83ε [[$2]] Ï\83ε ÎµÏ\81γαÏ\83ία Ï\83Ï\85νÏ\84ήÏ\81ηÏ\83ηÏ\82.",
        "double-redirect-fixer": "Διορθωτής ανακατευθύνσεων",
        "brokenredirects": "Λανθασμένες ανακατευθύνσεις",
        "brokenredirectstext": "Οι παρακάτω ανακατευθύνσεις οδηγούν σε σελίδες που δεν υπάρχουν:",
        "wantedfiletext-cat": "Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν. Αρχεία από εξωτερικά αποθετήρια ενδέχεται να παρατίθενται παρότι υπάρχουν. Κάθε τέτοιες λανθασμένες αναφορές θα <del>διαγραμμίζονται</del>. Επιπλέον, σελίδες που ενσωματώνουν αρχεία που δεν υπάρχουν παρατίθενται στο [[:$1]].",
        "wantedfiletext-nocat": "Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν. Πέρα από τα υπάρχοντα ενδέχεται να έχουν καταχωριστεί και αρχεία από εξωτερικές πηγές λογισμικού. Τέτοιες ψευδο-υπαρκτές καταχωρίσεις θα εμφανίζονται <del>διαγραμμισμένες</del>.",
        "wantedtemplates": "Ζητούμενα πρότυπα",
-       "mostlinked": "Î\9fι Ï\83ελίδεÏ\82 Î¼Îµ Ï\84ιÏ\82 Ï\80εÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81εÏ\82 Î±Î½Î±Ï\86οÏ\81ές",
+       "mostlinked": "ΣελίδεÏ\82 Î¼Îµ Ï\84οÏ\85Ï\82 Ï\80εÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81οÏ\85Ï\82 Ï\83Ï\85νδέÏ\83μοÏ\85Ï\82 Ï\80Ï\81οÏ\82 Î±Ï\85Ï\84ές",
        "mostlinkedcategories": "Περισσότερο χρησιμοποιούμενες κατηγορίες",
        "mostlinkedtemplates": "Περισσότερο χρησιμοποιούμενα πρότυπα",
-       "mostcategories": "Î\86Ï\81θÏ\81α με τις περισσότερες κατηγορίες",
+       "mostcategories": "ΣελίδεÏ\82 με τις περισσότερες κατηγορίες",
        "mostimages": "Περισσότερο χρησιμοποιούμενα αρχεία",
        "mostinterwikis": "Σελίδες με τους περισσότερους διαγλωσσικούς συνδέσμους",
-       "mostrevisions": "Î\86Ï\81θÏ\81α με τις περισσότερες αναθεωρήσεις",
+       "mostrevisions": "ΣελίδεÏ\82 με τις περισσότερες αναθεωρήσεις",
        "prefixindex": "Όλες οι σελίδες με πρόθεμα",
        "prefixindex-namespace": "Όλες οι σελίδες με πρόθεμα (ονοματοχώρος $1)",
        "prefixindex-strip": "Αφαίρεση του προθέματος στη λίστα",
        "protectedpages-page": "Σελίδα",
        "protectedpages-expiry": "Λήγει",
        "protectedpages-performer": "Προστασία χρήστη",
+       "protectedpages-params": "Παράμετροι προστασίας",
        "protectedpages-reason": "Αιτία",
        "protectedpages-unknown-timestamp": "Άγνωστο",
        "protectedpages-unknown-performer": "Άγνωστος χρήστης",
        "booksources": "Πηγές βιβλίων",
        "booksources-search-legend": "Αναζήτηση για πηγές βιβλίων",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Μετάβαση",
        "booksources-text": "Παρακάτω είναι μια λίστα συνδέσμων σε άλλους ιστοτόπους οι οποίοι πωλούν νέα και μεταχειρισμένα βιβλία, και μπορεί επίσης να έχουν περισσότερες πληροφορίες για βιβλία για τα οποία ψάχνετε:",
        "booksources-invalid-isbn": "Το δοσμένο ISBN δεν φαίνεται να είναι έγκυρο· ελέγξτε για λάθη κατά την αντιγραφή από την αρχική πηγή.",
        "specialloguserlabel": "",
        "activeusers-noresult": "Δεν βρέθηκε χρήστης.",
        "listgrouprights": "Δικαιώματα ομάδων χρηστών",
        "listgrouprights-summary": "Ακόλουθεί μία λίστα με τις ομάδες χρηστών σε αυτό το wiki καθώς και με τα δικαιώματα πρόσβασης αυτών.\nΕνδέχεται να περιέχει [[{{MediaWiki:Listgrouprights-helppage}}|πρόσθετες πληροφορίες]] σχετικά με ατομικά δικαιώματα.",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Δόθηκε δικαίωμα</span>\n* <span class=\"listgrouprights-revoked\">Ανακλήθηκε δικαίωμα</span>",
+       "listgrouprights-key": "Υπόμνημα:\n* <span class=\"listgrouprights-granted\">Χορηγηθέν δικαίωμα</span>\n* <span class=\"listgrouprights-revoked\">Ανακληθέν δικαίωμα</span>",
        "listgrouprights-group": "Ομάδα",
        "listgrouprights-rights": "Δικαιώματα",
        "listgrouprights-helppage": "Help:Δικαιώματα ομάδων",
        "listgrouprights-removegroup-self": "Μπορεί να αφαιρέσει {{PLURAL:$2|ομάδα|ομάδες}} από το δικό σας λογαριασμό: $1",
        "listgrouprights-addgroup-self-all": "Μπορεί να προσθέσει όλες τις ομάδες στο δικό σας λογαριασμό",
        "listgrouprights-removegroup-self-all": "Μπορεί να αφαιρέσει όλες τις ομάδες από το δικό σας λογαριασμό",
+       "listgrouprights-namespaceprotection-header": "Περιορισμοί ονοματοχώρων",
+       "listgrouprights-namespaceprotection-namespace": "Ονοματοχώρος",
+       "listgrouprights-namespaceprotection-restrictedto": "Δικαίωμα(τα) που επιτρέπει(ουν) σε χρήστη να επεξεργαστεί",
+       "trackingcategories": "Παρακολούθηση κατηγοριών",
+       "trackingcategories-name": "Όνομα μηνύματος",
+       "trackingcategories-desc": "Κριτήρια συμπερίληψης κατηγορίας",
        "post-expand-template-inclusion-category-desc": "Το μέγεθος της σελίδας είναι μεγαλύτερο από <code>$wgMaxArticleSize</code> μετά την επέκταση όλων των προτύπων, έτσι ώστε ορισμένα πρότυπα δεν έχουν αναπτυχθεί.",
+       "hidden-category-category-desc": "Η κατηγορία περιέχει <code><nowiki>__HIDDENCAT__</nowiki></code> στο περιεχόμενο της σελίδας της, που την εμποδίζει εκ προεπιλογής να εμφανίζεται στο πλαίσιο συνδέσμων κατηγοριών των σελίδων.",
+       "trackingcategories-nodesc": "Καμία διαθέσιμη περιγραφή.",
+       "trackingcategories-disabled": "Η κατηγορία είναι απενεργοποιημένη",
        "mailnologin": "Δεν υπάρχει διεύθυνση παραλήπτη.",
        "mailnologintext": "Πρέπει να έχετε [[Special:UserLogin|συνδεθεί]] και να έχετε δηλώσει\nμια έγκυρη ηλεκτρονική διεύθυνση στις [[Special:Preferences|Προτιμήσεις]]\nγια να στείλετε e-mail σε άλλους χρήστες.",
        "emailuser": "Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε αυτόν τον χρήστη",
        "watchnologin": "Δεν έχετε συνδεθεί.",
        "addwatch": "Προσθήκη στη λίστα παρακολούθησης",
        "addedwatchtext": "Η σελίδα «[[:$1]]» έχει προστεθεί στη [[Special:Watchlist|λίστα παρακολούθησής σας]].\nΜελλοντικές αλλαγές σε αυτή τη σελίδα και στη συσχετισμένη σελίδα συζήτησής της θα εμφανίζονται εδώ.",
+       "addedwatchtext-short": "Η σελίδα «$1» έχει προστεθεί στην λίστα παρακολούθησής σας.",
        "removewatch": "Αφαίρεση από τη λίστα παρακολούθησης",
        "removedwatchtext": "Η σελίδα \"[[:$1]]\" έχει αφαιρεθεί από [[Special:Watchlist|τη λίστα παρακολούθησής σας]].",
+       "removedwatchtext-short": "Η σελίδα «$1» έχει αφαιρεθεί από τη λίστα παρακολούθησής σας.",
        "watch": "Παρακολούθηση",
        "watchthispage": "Παρακολούθηση αυτής της σελίδας",
        "unwatch": "Παύση παρακολούθησης",
        "unwatchthispage": "Παύση παρακολούθησης αυτής της σελίδας",
        "notanarticle": "Η σελίδα αυτή δεν είναι σελίδα περιεχομένου.",
        "notvisiblerev": "Η έκδοση έχει διαγραφεί",
-       "watchlist-details": "{{PLURAL:$1|$1 σελίδα|$1 σελίδες}} στη λίστα παρακολούθησης σας, χωρίς να προσμετρούνται οι σελίδες συζήτησης.",
+       "watchlist-details": "{{PLURAL:$1|$1 Ï\83ελίδα|$1 Ï\83ελίδεÏ\82}} Ï\83Ï\84η Î»Î¯Ï\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ηÏ\82 Ï\83αÏ\82, Ï\87Ï\89Ï\81ίÏ\82 Î½Î± Ï\80Ï\81οÏ\83μεÏ\84Ï\81οÏ\8dνÏ\84αι Î¾ÎµÏ\87Ï\89Ï\81ιÏ\83Ï\84ά Î¿Î¹ Ï\83ελίδεÏ\82 Ï\83Ï\85ζήÏ\84ηÏ\83ηÏ\82.",
        "wlheader-enotif": "Η ειδοποίηση ηλεκτρονικού ταχυδρομείου ενεργοποιήθηκε.",
        "wlheader-showupdated": "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.",
-       "wlnote": "Παρακάτω είναι {{PLURAL:$1|η πιο πρόσφατη αλλαγή|οι '''$1''' πιο πρόσφατες αλλαγές}} κατά τη διάρκεια {{PLURAL:$2|της τελευταίας ώρας|των '''$2''' τελευταίων ωρών}} ως προς την $3, $4.",
-       "wlshowlast": "Εμφάνιση των τελευταίων $1 ωρών $2 ημερών $3",
+       "wlnote": "Παρακάτω είναι {{PLURAL:$1|η πιο πρόσφατη αλλαγή|οι <strong>$1</strong> πιο πρόσφατες αλλαγές}} κατά τη διάρκεια {{PLURAL:$2|της τελευταίας ώρας|των <strong>$2</strong> τελευταίων ωρών}} ως προς τις $3 στις $4.",
+       "wlshowlast": "Εμφάνιση των τελευταίων $1 ωρών $2 ημερών",
        "watchlist-options": "Επιλογές λίστας παρακολούθησης",
        "watching": "Παρακολούθηση...",
        "unwatching": "Μη παρακολούθηση...",
        "enotif_lastvisited": "Δείτε το $1 για όλες τις αλλαγές που έγιναν από την τελευταία σας επίσκεψη.",
        "enotif_lastdiff": "Δείτε το $1 για να εμφανίσετε αυτή την αλλαγή.",
        "enotif_anon_editor": "ανώνυμος χρήστης $1",
-       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Î\91γαÏ\80ηÏ\84έ|Î\91γαÏ\80ηÏ\84ή}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nΠεÏ\81ιγÏ\81αÏ\86ή ÎµÏ\80εξεÏ\81γαÏ\83ίαÏ\82: $PAGESUMMARY $PAGEMINOREDIT\n\nÎ\95Ï\80ικοινÏ\89νία Î¼Îµ Ï\84ο Ï\87Ï\81ήÏ\83Ï\84η Ï\80οÏ\85 Î­ÎºÎ±Î½Îµ Ï\84ην ÎµÏ\80εξεÏ\81γαÏ\83ία:\nηλεκÏ\84Ï\81ονική Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nÎ\94εν Î¸Î± Ï\85Ï\80άÏ\81ξοÏ\85ν Î¬Î»Î»ÎµÏ\82 ÎµÎ¹Î´Î¿Ï\80οιήÏ\83ειÏ\82 Ï\83ε Ï\80εÏ\81ίÏ\80Ï\84Ï\89Ï\83η Ï\80εÏ\81αιÏ\84έÏ\81Ï\89 Î´Ï\81αÏ\83Ï\84ηÏ\81ιÏ\8cÏ\84ηÏ\84αÏ\82 Î±Î½ Î´ÎµÎ½ ÎµÏ\80ιÏ\83κεÏ\86θείÏ\84ε Ï\84η Ï\83ελίδα. Î\9cÏ\80οÏ\81είÏ\84ε ÎµÏ\80ίÏ\83ηÏ\82 Î½Î± ÎµÏ\80αναÏ\86έÏ\81εÏ\84ε Ï\84ην ÎµÏ\80ιλογή ÎµÎ¹Î´Î¿Ï\80οίηÏ\83ηÏ\82 Î³Î¹Î± Ï\8cλεÏ\82 Ï\84ιÏ\82 Ï\80αÏ\81ακολοÏ\85θοÏ\8dμενεÏ\82 Ï\83ελίδεÏ\82 Ï\83Ï\84η Î»Î¯Ï\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82 Ï\83αÏ\82.\n\n                         Î¦Î¹Î»Î¹ÎºÎ¬,\n                         Tο σύστημα ειδοποίησης του ιστοχώρου {{SITENAME}}\n\n--\nΓια να αλλάξετε τις προτιμήσεις των ειδοποιήσεων ηλεκτρονικού ταχυδρομείου, επισκεφτείτε το\n{{canonicalurl:{{#special:Preferences}}}}\n\nΓια να αλλάξετε τις προτιμήσεις της λίστας παρακολούθησής σας, επισκεφτείτε το\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nΓια να διαγράψετε την σελίδα από την λίστα παρακολούθησής σας, επισκεφτείτε το\n$UNWATCHURL\n\nΠαρατηρήσεις και περισσότερη βοήθεια:\n$HELPPAGE",
+       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Î\91γαÏ\80ηÏ\84έ|Î\91γαÏ\80ηÏ\84ή}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nΠεÏ\81ιγÏ\81αÏ\86ή ÎµÏ\80εξεÏ\81γαÏ\83ίαÏ\82: $PAGESUMMARY $PAGEMINOREDIT\n\nÎ\95Ï\80ικοινÏ\89νία Î¼Îµ Ï\84ο Ï\87Ï\81ήÏ\83Ï\84η Ï\80οÏ\85 Î­ÎºÎ±Î½Îµ Ï\84ην ÎµÏ\80εξεÏ\81γαÏ\83ία:\nδιεÏ\8dθÏ\85νÏ\83η Î·Î»ÎµÎºÏ\84Ï\81ονικήÏ\82 Î±Î»Î»Î·Î»Î¿Î³Ï\81αÏ\86ίαÏ\82: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nÎ\94εν Î¸Î± Ï\85Ï\80άÏ\81ξοÏ\85ν Î¬Î»Î»ÎµÏ\82 ÎµÎ¹Î´Î¿Ï\80οιήÏ\83ειÏ\82 Ï\83ε Ï\80εÏ\81ίÏ\80Ï\84Ï\89Ï\83η Ï\80εÏ\81αιÏ\84έÏ\81Ï\89 Î´Ï\81αÏ\83Ï\84ηÏ\81ιÏ\8cÏ\84ηÏ\84αÏ\82 Î±Î½ Î´ÎµÎ½ ÎµÏ\80ιÏ\83κεÏ\86θείÏ\84ε Ï\84η Ï\83ελίδα Î­Ï\87ονÏ\84αÏ\82 ÎºÎ¬Î½ÎµÎ¹ Ï\83Ï\8dνδεÏ\83η. Î\9cÏ\80οÏ\81είÏ\84ε ÎµÏ\80ίÏ\83ηÏ\82 Î½Î± ÎµÏ\80αναÏ\86έÏ\81εÏ\84ε Ï\84ην ÎµÏ\80ιλογή ÎµÎ¹Î´Î¿Ï\80οίηÏ\83ηÏ\82 Î³Î¹Î± Ï\8cλεÏ\82 Ï\84ιÏ\82 Ï\80αÏ\81ακολοÏ\85θοÏ\8dμενεÏ\82 Ï\83ελίδεÏ\82 Ï\83Ï\84η Î»Î¯Ï\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82 Ï\83αÏ\82.\n\nΦιλικά, \nÏ\84ο σύστημα ειδοποίησης του ιστοχώρου {{SITENAME}}\n\n--\nΓια να αλλάξετε τις προτιμήσεις των ειδοποιήσεων ηλεκτρονικού ταχυδρομείου, επισκεφτείτε το\n{{canonicalurl:{{#special:Preferences}}}}\n\nΓια να αλλάξετε τις προτιμήσεις της λίστας παρακολούθησής σας, επισκεφτείτε το\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nΓια να διαγράψετε την σελίδα από την λίστα παρακολούθησής σας, επισκεφτείτε το\n$UNWATCHURL\n\nΠαρατηρήσεις και περισσότερη βοήθεια:\n$HELPPAGE",
        "created": "δημιουργήθηκε",
        "changed": "έχει αλλάξει",
        "deletepage": "Διαγραφή σελίδας",
        "exbeforeblank": "το περιεχόμενο πριν απο την εκκαθάριση ήταν: '$1'",
        "delete-confirm": "Διαγραφή του \"$1\"",
        "delete-legend": "Διαγραφή",
-       "historywarning": "'''Προσοχή:''' Η σελίδα που πρόκειται να διαγράψετε έχει ιστορικό με περίπου $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}:",
+       "historywarning": "<strong>Προσοχή:</strong> Η σελίδα που πρόκειται να διαγράψετε έχει ιστορικό με περίπου $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}:",
        "confirmdeletetext": "Πρόκειται να διαγράψετε οριστικά από τη βάση δεδομένων μια σελίδα (ή μια εικόνα) μαζί με το ιστορικό της. Παρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να το κάνετε, ότι αντιλαμβάνεσθε τις συνέπειες και ότι το κάνετε σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].",
        "actioncomplete": "Η ενέργεια ολοκληρώθηκε.",
        "actionfailed": "Η ενέργεια απέτυχε",
        "deletecomment": "Λόγος:",
        "deleteotherreason": "Άλλος/πρόσθετος λόγος:",
        "deletereasonotherlist": "Άλλος λόγος",
-       "deletereason-dropdown": "*Συνηθισμένοι λόγοι διαγραφής\n** Αίτηση του δημιουργού της\n** Παραβίαση των πνευματικών δικαιωμάτων\n** Βανδαλισμός",
+       "deletereason-dropdown": "* Συνηθισμένοι λόγοι διαγραφής\n** Σπαμ\n** Βανδαλισμός\n** Παραβίαση πνευματικών δικαιωμάτων\n** Αίτηση του δημιουργού της\n** Κατεστραμμένη ανακατεύθυνση",
        "delete-edit-reasonlist": "Επεξεργασία λόγων διαγραφής",
        "delete-toobig": "Αυτή η σελίδα έχει μεγάλο ιστορικό τροποποιήσεων, πάνω από $1 {{PLURAL:$1|τροποποίηση|τροποποιήσεις}}.\nΗ διαγραφή τέτοιων σελίδων έχει περιοριστεί για την αποφυγή τυχαίας αναστάτωσης του {{SITENAME}}.",
        "delete-warning-toobig": "Αυτή η σελίδα έχει μεγάλο ιστορικό τροποποιήσεων, πάνω από $1 {{PLURAL:$1|τροποποίηση|τροποποιήσεις}}.\nΗ διαγραφή της μπορεί να αναστατώσει τη λειτουργία της βάσης δεδομένων του {{SITENAME}}. Συνιστούμε μεγάλη προσοχή.",
-       "delete-cantedit": "Δεν μπορείτε να διαγράψετε αυτή τη σελίδα, επειδή δεν έχετε δικαίωμα να την επεξεργαστείτε.",
+       "deleteprotected": "Δεν μπορείτε να διαγράψετε αυτή τη σελίδα επειδή είναι προστατευόμενη.",
        "rollback": "Επαναφορά επεξεργασιών",
        "rollback_short": "Επαναφορά",
        "rollbacklink": "αναστροφή",
        "protect-locked-blocked": "Δεν μπορείτε να αλλάξετε επίπεδα προστασίας ενώ είστε σε φραγή.\nΕδώ είναι οι τρέχουσες ρυθμίσεις για τη σελίδα '''$1''':",
        "protect-locked-dblock": "Τα επίπεδα προστασίας δεν μπορούν να αλλαχθούν λόγω ενός ενεργού κλεδώματος της βάσης δεδομένων.\nΕδώ είναι οι τρέχουσες ρυθμίσεις για τη σελίδα '''$1''':",
        "protect-locked-access": "Ο λογαριασμός σας δεν έχει δικαίωμα να αλλάξει τα επίπεδα προστασίας σελίδας.\nΕδώ είναι οι τρέχουσες ρυθμίσεις για τη σελίδα '''$1''':",
-       "protect-cascadeon": "Î\91Ï\85Ï\84ή Î· Ï\83ελίδα ÎµÎ¯Î½Î±Î¹ Ï\80Ï\81οÏ\82 Ï\84ο Ï\80αÏ\81Ï\8cν Ï\80Ï\81οÏ\83Ï\84αÏ\84εÏ\85μένη ÎµÏ\80ειδή Ï\80εÏ\81ιλαμβάνεÏ\84αι {{PLURAL:$1|Ï\83Ï\84ην Î±ÎºÏ\8cλοÏ\85θη Ï\83ελίδα, Î· Î¿Ï\80οία Î­Ï\87ει|Ï\83Ï\84ιÏ\82 Î±ÎºÏ\8cλοÏ\85θεÏ\82 Ï\83ελίδεÏ\82, Î¿Î¹ Î¿Ï\80οίεÏ\82 Î­Ï\87οÏ\85ν}} Ï\84η Î´Î¹Î±Î´Î¿Ï\87ική Ï\80Ï\81οÏ\83Ï\84αÏ\83ία ÎµÎ½ÎµÏ\81γοÏ\80οιημένη. Î\9cÏ\80οÏ\81είÏ\84ε Î½Î± Î±Î»Î»Î¬Î¾ÎµÏ\84ε Ï\84ο ÎµÏ\80ίÏ\80εδο Ï\80Ï\81οÏ\83Ï\84αÏ\83ίαÏ\82 Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82, Î±Î»Î»Î¬ Î´ÎµÎ½ Î¸Î± ÎµÏ\80ηÏ\81εάÏ\83ει τη διαδοχική προστασία.",
+       "protect-cascadeon": "Î\91Ï\85Ï\84ή Î· Ï\83ελίδα ÎµÎ¯Î½Î±Î¹ Ï\80Ï\81οÏ\82 Ï\84ο Ï\80αÏ\81Ï\8cν Ï\80Ï\81οÏ\83Ï\84αÏ\84εÏ\85μένη ÎµÏ\80ειδή Ï\80εÏ\81ιλαμβάνεÏ\84αι {{PLURAL:$1|Ï\83Ï\84ην Î±ÎºÏ\8cλοÏ\85θη Ï\83ελίδα, Î· Î¿Ï\80οία Î­Ï\87ει|Ï\83Ï\84ιÏ\82 Î±ÎºÏ\8cλοÏ\85θεÏ\82 Ï\83ελίδεÏ\82, Î¿Î¹ Î¿Ï\80οίεÏ\82 Î­Ï\87οÏ\85ν}} Ï\84η Î´Î¹Î±Î´Î¿Ï\87ική Ï\80Ï\81οÏ\83Ï\84αÏ\83ία ÎµÎ½ÎµÏ\81γοÏ\80οιημένη. Î\91λλαγέÏ\82 Ï\83Ï\84ο ÎµÏ\80ίÏ\80εδο Ï\80Ï\81οÏ\83Ï\84αÏ\83ίαÏ\82 Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82 Î´ÎµÎ½ Î¸Î± ÎµÏ\80ηÏ\81εάÏ\83οÏ\85ν τη διαδοχική προστασία.",
        "protect-default": "Να επιτρέπονται όλοι οι χρήστες",
        "protect-fallback": "Να επιτρέπεται μόνο σε χρήστες με δικαιώματα «$1»",
        "protect-level-autoconfirmed": "Να επιτρέπονται μόνο αυτοεπιβεβαιωμένοι χρήστες",
        "protect-othertime": "Άλλο χρονικό διάστημα:",
        "protect-othertime-op": "άλλος χρόνος",
        "protect-existing-expiry": "Υπάρχουσα λήξη προθεσμίας: $3, $2",
+       "protect-existing-expiry-infinity": "Τρέχον χρόνος λήξης: αόριστος",
        "protect-otherreason": "Άλλος/πρόσθετος λόγος:",
        "protect-otherreason-op": "Άλλος λόγος",
        "protect-dropdown": "*Συνήθεις λόγοι προστασίας\n** Υπερβολικός βανδαλισμός\n** Υπερβολικό spamming\n** Αντιπαραγωγική μάχη επεξεργασιών\n** Σελίδα μεγάλης κίνησης",
        "contributions-title": "Συνεισφορές χρήστη για {{GENDER:$1|τον|την}} $1",
        "mycontris": "Συνεισφορές",
        "contribsub2": "Για {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος.",
        "nocontribs": "Δεν βρέθηκαν αλλαγές με αυτά τα κριτήρια.",
        "uctop": "(τρέχουσα)",
        "month": "Από το μήνα (και νωρίτερα):",
        "sp-contributions-newbies-sub": "Για νέους λογαριασμούς",
        "sp-contributions-newbies-title": "Συνεισφορές χρηστών για νέους λογαριασμούς",
        "sp-contributions-blocklog": "αρχείο καταγραφών φραγών",
+       "sp-contributions-suppresslog": "διαγεγραμμένες συνεισφορές χρήστη",
        "sp-contributions-deleted": "διαγραμμένες συνεισφορές χρήστη",
        "sp-contributions-uploads": "ανεβάσματα αρχείων",
        "sp-contributions-logs": "καταγραφές",
        "sp-contributions-search": "Αναζήτηση για συνεισφορές",
        "sp-contributions-username": "Διεύθυνση IP ή όνομα χρήστη:",
        "sp-contributions-toponly": "Εμφάνιση μόνο των επεξεργασιών που είναι πρόσφατες αναθεωρήσεις",
+       "sp-contributions-newonly": "Εμφάνιση μόνο των επεξεργασιών που είναι δημιουργία σελίδας",
        "sp-contributions-submit": "Αναζήτηση",
        "whatlinkshere": "Τι συνδέει εδώ",
        "whatlinkshere-title": "Σελίδες που συνδέουν στη σελίδα «$1»",
        "blockipsuccesstext": "{{GENDER:$1|Ο|Η}} [[Special:Contributions/$1|$1]] έχει υποστεί φραγή.<br />\nΔείτε τον [[Special:BlockList|κατάλογο φραγών]] για να εποπτεύσετε τις φραγές.",
        "ipb-blockingself": "Είστε έτοιμος να επιβάλετε φραγή στον ευατό σας! Είστε σίγουροι ότι θέλετε να το κάνετε αυτό;",
        "ipb-confirmhideuser": "Είστε {{GENDER:|έτοιμος|έτοιμη}} να μπλοκάρετε ένα χρήστη με ενεργοποιημένη την \"απόκρυψη χρήστη\" . Αυτό θα καταστείλει το όνομα του χρήστη σε όλες τις λίστες και τις καταχωρήσεις ημερολογίου. Είστε {{GENDER:|σίγουρος|σίγουρη}} ότι θέλετε να το κάνετε αυτό;",
+       "ipb-confirmaction": "Εάν είστε σίγουροι ότι θέλετε πραγματικά να το κάνετε αυτό, παρακαλούμε τσεκάρετε το πεδίο «{{int:ipb-confirm}}» στο κάτω μέρος.",
        "ipb-edit-dropdown": "Επεξεργασία λόγων φραγής",
        "ipb-unblock-addr": "Τερμάτισε τη φραγή του/της $1",
        "ipb-unblock": "Τερμάτισε τη φραγή για ένα όνομα χρήστη ή μια διεύθυνση IP",
        "movepagetalktext": "Η σελίδα συζήτησης που αντιστοιχεί, εάν υπάρχει, θα μετακινηθεί αυτόματα μαζί με αυτήν '''έκτός αν:'''\n*Μετακινείτε τη σελίδα σε διαφορετική περιοχή (namespace),\n*Υπάρχει κάτω από το νέο όνομα μια σελίδα συζήτησης που δεν είναι κενή, ή\n*Έχετε αφαιρέσει τη σημείωση (check) από το κουτάκι που υπάρχει παρακάτω.\n\nΣε αυτές τις περιπτώσεις, θα πρέπει να μετακινήσετε (ή να ενσωματώσετε αν το θέλετε) τη σελίδα με αντιγραφή-και-επικόλληση.",
        "movearticle": "Μετακίνηση σελίδας",
        "moveuserpage-warning": "'''Προσοχή:''' Ετοιμάζεστε να μετακινήσετε μια σελίδα χρήστη. Σημειώστε παρακαλώ ότι θα μετακινηθεί μόνο η σελίδα και ο χρήστης '''δεν''' θα μετονομαστεί.",
+       "movecategorypage-warning": "<strong>Προειδοποίηση:</strong>Πάτε να μετακινήσετε μια σελίδα κατηγορίας. Παρακαλούμε να σημειωθεί ότι μόνο η σελίδα θα μετακινηθεί και τυχόν σελίδες στην παλιά κατηγορία <em>δεν</em> θα επανακατηγοριοποιηθούν στη νέα κατηγορία.",
        "movenologintext": "Για να μετακινήσετε μια σελίδα πρέπει να είστε εγγεγραμένος χρήστης και [[Special:UserLogin|να έχετε συνδεθεί]] στο Wiκi.",
        "movenotallowed": "Δεν έχετε άδεια να μετακινείτε σελίδες.",
        "movenotallowedfile": "Δεν έχετε άδεια να μετακινείτε αρχεία.",
        "cant-move-user-page": "Δεν έχετε άδεια για να μετακινήσετε σελίδες χρηστών (παρά μόνο υποσελίδες).",
        "cant-move-to-user-page": "Δεν έχετε άδεια για να μετακινήσετε μια σελίδα σε σελίδα χρήστη (παρά μόνο σε υποσελίδα χρήστη).",
+       "cant-move-category-page": "Δεν έχετε άδεια να μετακινείτε σελίδες κατηγοριών.",
+       "cant-move-to-category-page": "Δεν έχετε άδεια να μετακινήσετε μια σελίδα σε σελίδα της κατηγορίας.",
        "newtitle": "νέος τίτλος",
        "move-watch": "Παρακολούθησε αυτή τη σελίδα",
        "movepagebtn": "Μετακίνηση σελίδας",
        "import": "Εισαγωγή σελίδων",
        "importinterwiki": "Εισαγωγή από άλλο Wiki",
        "import-interwiki-text": "Επιλέξτε ένα wiki και τίτλο σελίδας για την εισαγωγή.\nΟι ημερομηνίες των αναθεωρήσεων και τα ονόματα των συντακτών θα διατηρηθούν.\nΌλες οι ενέργειες εισαγωγής μεταξύ wiki καταγράφονται στο [[Special:Log/import|αρχείο καταγραφής εισαγωγών]].",
-       "import-interwiki-source": "Wiki και σελίδα πηγή:",
+       "import-interwiki-sourcewiki": "Πηγαίο wiki:",
+       "import-interwiki-sourcepage": "Πηγαία σελίδα:",
        "import-interwiki-history": "Αντιγραφή όλων των εκδόσεων του ιστορικού για αυτή τη σελίδα",
        "import-interwiki-templates": "Συμπερίληψη όλων των προτύπων",
        "import-interwiki-submit": "Εισαγωγή",
        "import-upload": "Επιφόρτωση δεδομένων XML",
        "import-token-mismatch": "Απώλεια των στοιχείων της συνόδου. Παρακαλούμε προσπαθήστε ξανά.",
        "import-invalid-interwiki": "Δεν είναι δυνατή η εισαγωγή από το καθορισμένο wiki.",
-       "import-error-edit": "Η σελίδα \"$1\" δεν εισήχθηκε επειδή δεν επιτρέπεται να το επεξεργαστείτε.",
-       "import-error-create": "Η σελίδα \"$1\" δεν εισήχθηκε επειδή δεν επιτρέπεται να τη δημιουργήσετε.",
-       "import-error-interwiki": "Η σελίδα \" $1 \" δεν έχει εισαχθεί, επειδή το όνομα της δεσμευμένο για εξωτερική σύνδεση (interwiki).",
-       "import-error-special": "Η σελίδα \"$1\" δεν εισήχθη επειδή ανήκει σε έναν ειδικό χώρο ονομάτων που δεν επιτρέπει σελίδες.",
-       "import-error-invalid": "Η σελίδα \"$1\" δεν εισήχθη επειδή το όνομά της δεν είναι έγκυρο.",
+       "import-error-edit": "Η σελίδα «$1» δεν εισήχθη επειδή δεν σας επιτρέπεται να την επεξεργαστείτε.",
+       "import-error-create": "Η σελίδα «$1» δεν εισήχθη επειδή δεν σας επιτρέπεται να την δημιουργήσετε.",
+       "import-error-interwiki": "Η σελίδα «$1» δεν εισήχθη επειδή το όνομα της είναι δεσμευμένο για εξωτερική σύνδεση (interwiki).",
+       "import-error-special": "Η σελίδα «$1» δεν εισήχθη επειδή ανήκει σε έναν ειδικό ονοματοχώρο που δεν επιτρέπει σελίδες.",
+       "import-error-invalid": "Η σελίδα «$1» δεν εισήχθη επειδή το όνομά με το οποίο επρόκειτο να εισαχθεί δεν είναι έγκυρο σε αυτό το wiki.",
        "import-options-wrong": "Λάθος {{PLURAL:$2|επιλογή|επιλογές}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Η δεδομένη ριζική σελίδα είναι μη έγκυρος τίτλος",
        "importlogpage": "Αρχείο καταγραφής εισαγωγών",
        "importlogpagetext": "Διαχειριστικές εισαγωγές σελίδων με ιστορικό επεξεργασίας από άλλα wiki.",
        "import-logentry-upload": "εισάχθηκε η σελίδα [[$1]] με επιφόρτωση αρχείου",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|Εισήχθη $1 αναθεώρηση|Εισήχθησαν $1 αναθεωρήσεις}}",
        "import-logentry-interwiki": "η σελίδα $1 εισάχθηκε μεταξύ wiki",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} από $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|Εισήχθη $1 αναθεώρηση|Εισήχθησαν $1 αναθεωρήσεις}} από $2",
        "javascripttest": "Δοκιμή JavaScript",
        "javascripttest-title": "Εκτελούνται  $1  δοκιμές",
        "javascripttest-pagetext-noframework": "Αυτή η σελίδα είναι δεσμευμένη για την εκτέλεση δοκιμών σε JavaScript.",
        "pageinfo-lasttime": "Ημερομηνία τελευταίας επεξεργασίας",
        "pageinfo-edits": "Συνολικός αριθμός επεξεργασιών",
        "pageinfo-authors": "Συνολικός αριθμός διαφορετικών συντακτών",
-       "pageinfo-recent-edits": "ΠÏ\81Ï\8cÏ\83Ï\86αÏ\84οÏ\82 Î±Ï\81ιθμÏ\8cÏ\82 επεξεργασιών (σε διάστημα $1)",
+       "pageinfo-recent-edits": "Î\91Ï\81ιθμÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84Ï\89ν επεξεργασιών (σε διάστημα $1)",
        "pageinfo-recent-authors": "Πρόσφατος αριθμός μοναδικών συντακτών",
        "pageinfo-magic-words": "{{PLURAL:$1|Μαγική λέξη|Μαγικές λέξεις}} ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Κρυφή κατηγορία|Κρυφές κατηγορίες}} ($1)",
        "newimages-summary": "Αυτή η ειδική σελίδα δείχνει τα πιο πρόσφατα φορτωμένα αρχεία.",
        "newimages-legend": "Φίλτρο",
        "newimages-label": "Όνομα αρχείου (ή μέρος αυτού):",
+       "newimages-showbots": "Εμφάνιση αρχείων ανεβασμένων από ρομπότ",
        "noimages": "Δεν υπάρχουν εικόνες.",
        "ilsubmit": "Αναζήτηση",
        "bydate": "ημερομηνίας",
        "exif-urgency-low": "Χαμηλή ($1)",
        "exif-urgency-high": "Υψηλή ($1)",
        "exif-urgency-other": "Προτεραιότητα που ορίστηκε από το χρήστη ($1)",
-       "watchlistall2": "όλες",
        "namespacesall": "όλοι",
        "monthsall": "όλα",
        "confirmemail": "Επιβεβαίωση διεύθυνσης e-mail",
        "confirm-watch-top": "Προσθήκη αυτής της σελίδας στη λίστα παρακολούθησης σας;",
        "confirm-unwatch-button": "Εντάξει",
        "confirm-unwatch-top": "Κατάργηση αυτής της σελίδας από τη λίστα παρακολούθησης σας;",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← προηγούμενη σελίδα",
        "imgmultipagenext": "επόμενη σελίδα →",
        "imgmultigo": "Πήγαινε!",
        "autosumm-replace": "Αντικατάσταση σελίδας με '$1'",
        "autoredircomment": "Ανακατεύθυνση στη σελίδα [[$1]]",
        "autosumm-new": "Νέα σελίδα με '$1'",
+       "autosumm-newblank": "Δημιουργήθηκε κενή σελίδα",
        "lag-warn-normal": "Αλλαγές νεότερες από {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}} μπορεί να μην φαίνονται σε αυτή τη λίστα.",
        "lag-warn-high": "Εξαιτίας υψηλής καθυστέρησης της βάσης δεδομένων του εξυπηρετητή, αλλαγές νεότερες από $1 {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}} μπορεί να μην φαίνονται σε αυτή τη λίστα.",
        "watchlistedit-normal-title": "Επεξεργασία λίστας παρακολούθησης",
        "watchlistedit-raw-done": "Η λίστα παρακολούθησής σας ενημερώθηκε.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 σελίδα|$1 σελίδες}} προστέθηκαν:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 σελίδα|$1 σελίδες}} αφαιρέθηκαν:",
+       "watchlistedit-clear-explain": "Όλοι οι τίτλοι θα αφαιρεθούν από τη λίστα παρακολούθησής σας",
        "watchlistedit-clear-titles": "Τίτλοι:",
        "watchlistedit-clear-submit": "Καθαρίστε τη λίστα παρακολούθησης (αυτό είναι μόνιμο!)",
+       "watchlistedit-clear-done": "Η λίστα παρακολούθησής σας έχει καθαριστεί.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 τίτλος αφαιρέθηκε|$1 τίτλοι αφαιρέθηκαν}}:",
        "watchlistedit-too-many": "Υπάρχουν υπερβολικά πολλές σελίδες και δεν μπορούν να εμφανιστούν εδώ.",
        "watchlisttools-view": "Προβολή σχετικών αλλαγών",
        "watchlisttools-edit": "Προβολή και επεξεργασία λίστας παρακολούθησης",
        "specialpages-group-other": "Άλλες ειδικές σελίδες",
        "specialpages-group-login": "Σύνδεση / δημιουργία λογαριασμού",
        "specialpages-group-changes": "Πρόσφατες αλλαγές και καταγραφές γεγονότων",
-       "specialpages-group-media": "Î\91ναÏ\86οÏ\81έÏ\82 Ï\80ολÏ\85μέÏ\83Ï\89ν ÎºÎ±Î¹ ÎµÏ\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η αρχείων",
+       "specialpages-group-media": "Î\91ναÏ\86οÏ\81έÏ\82 Ï\80ολÏ\85μέÏ\83Ï\89ν ÎºÎ±Î¹ Î±Î½Î­Î²Î±Ï\83μα αρχείων",
        "specialpages-group-users": "Χρήστες και δικαιώματα",
        "specialpages-group-highuse": "Πολυσύχναστες σελίδες",
        "specialpages-group-pages": "Κατάλογοι σελίδων",
        "logentry-rights-rights": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας για {{GENDER:$3|τον|την}} $3 από $4 σε $5",
        "logentry-rights-rights-legacy": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας {{GENDER:$1|του|της}} $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|προωθήθηκε}} αυτόματα από το $4 στο $5",
+       "logentry-upload-upload": "{{GENDER:$2|Ο|Η}} $1 ανέβασε το $3",
+       "logentry-upload-overwrite": "{{GENDER:$2|Ο|Η}} $1 ανέβασε μια νέα έκδοση του $3",
+       "logentry-upload-revert": "{{GENDER:$2|Ο|Η}} $1 ανέβασε το $3",
        "rightsnone": "(κανένα)",
+       "revdelete-summary": "επεξεργασία σύνοψης",
        "feedback-bugornote": "Εάν είστε έτοιμοι να περιγράψετε ένα τεχνικό πρόβλημα λεπτομερώς παρακαλούμε [$1  κάντε μια αναφορά σφάλματος].\nΔιαφορετικά, μπορείτε να χρησιμοποιήσετε την παρακάτω απλή φόρμα. Το σχόλιό σας θα προστεθεί στη σελίδα \"[$3  $2]\", μαζί με το όνομα χρήστη σας.",
        "feedback-subject": "Θέμα:",
        "feedback-message": "Μήνυμα:",
        "api-error-overwrite": "Αντικατάσταση ενός υπάρχοντος αρχείου δεν επιτρέπεται.",
        "api-error-stashfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-publishfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
+       "api-error-stasherror": "Παρουσιάστηκε ένα σφάλμα κατά το ανέβασμα του αρχείου στην κρύπτη.",
        "api-error-timeout": "Ο διακομιστής δεν αποκρίθηκε εντός του αναμενόμενου χρόνου.",
        "api-error-unclassified": "Προέκυψε ένα άγνωστο σφάλμα.",
        "api-error-unknown-code": "Άγνωστο σφάλμα: \"$1\"",
        "limitreport-ppvisitednodes": "Καταμέτρηση κόμβων επισκεφθέντων από τον προεπεξεργαστή",
        "limitreport-ppgeneratednodes": "Καταμέτρηση κόμβων παραχθέντων από τον προεπεξεργαστή",
        "limitreport-postexpandincludesize": "Μέγεθος συμπερίληψης πριν την ανάπτυξη",
+       "limitreport-postexpandincludesize-value": "$1 από $2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-templateargumentsize": "Μέγεθος ορισμάτων προτύπων",
+       "limitreport-templateargumentsize-value": "$1 από $2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Μεγαλύτερο βάθος ανάπτυξης",
        "limitreport-expensivefunctioncount": "Πλήθος ακριβών συναρτήσεων συντακτικού αναλυτή",
        "expandtemplates": "Επέκτεινε τα πρότυπα",
        "expand_templates_generate_xml": "Εμφάνιση δέντρου συντακτικής ανάλυσης XML",
        "expand_templates_generate_rawhtml": "Εμφάνιση ανεπεξέργαστης HTML",
        "expand_templates_preview": "Προεπισκόπηση",
+       "pagelanguage": "Επιλογέας γλώσσας σελίδας",
+       "pagelang-name": "Σελίδα",
+       "pagelang-language": "Γλώσσα",
+       "pagelang-use-default": "Χρήση προεπιλεγμένης γλώσσας",
+       "pagelang-select-lang": "Επιλογή γλώσσας",
+       "right-pagelang": "Αλλαγή γλώσσας σελίδας",
+       "action-pagelang": "αλλαγή της γλώσσας σελίδας",
        "default-skin-not-found-row-enabled": "* <code>$1</code> /$2 (ενεργοποιημένο)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''απενεργοποιημένο''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''απενεργοποιημένο''')",
+       "mediastatistics": "Στατιστικά πολυμέσων",
+       "mediastatistics-table-mimetype": "Τύποι MIME",
+       "mediastatistics-table-count": "Αριθμός αρχείων",
+       "mediastatistics-header-bitmap": "Εικόνες bitmap",
+       "mediastatistics-header-drawing": "Σχέδια (διανυσματικές εικόνες)",
+       "mediastatistics-header-audio": "Ήχος",
+       "mediastatistics-header-office": "Γραφείο"
 }
index a43a742..133b036 100644 (file)
@@ -4,8 +4,8 @@
        },
        "sidebar": "\n* navigation\n** mainpage|mainpage-description\n** recentchanges-url|recentchanges\n** randompage-url|randompage\n** helppage|help\n* SEARCH\n* TOOLBOX\n* LANGUAGES",
        "tog-underline": "Link underlining:",
-       "tog-hideminor": "Hide minor edits in recent changes",
-       "tog-hidepatrolled": "Hide patrolled edits in recent changes",
+       "tog-hideminor": "Hide minor edits from recent changes",
+       "tog-hidepatrolled": "Hide patrolled edits from recent changes",
        "tog-newpageshidepatrolled": "Hide patrolled pages from new page list",
        "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent",
        "tog-usenewrc": "Group changes by page in recent changes and watchlist",
        "otherlanguages": "In other languages",
        "redirectedfrom": "(Redirected from $1)",
        "redirectpagesub": "Redirect page",
+       "redirectto": "Redirect to:",
        "talkpageheader": "-",
        "lastmodifiedat": "This page was last modified on $1, at $2.",
        "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.",
        "blocked-mailpassword": "Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.",
        "eauthentsent": "A confirmation email has been sent to the specified email address.\nBefore any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.",
        "throttled-mailpassword": "A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.\nTo prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.",
-       "loginstart": "",
-       "loginend": "",
-       "loginend-https": "",
-       "signupstart": "{{int:loginstart}}",
-       "signupend": "{{int:loginend}}",
+       "signupstart": "",
+       "signupend": "",
        "signupend-https": "",
        "mailerror": "Error sending mail: $1",
        "acct_creation_throttle_hit": "Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.\nAs a result, visitors using this IP address cannot create any more accounts at the moment.",
        "createaccount-text": "Someone created an account for your email address on {{SITENAME}} ($4) named \"$2\", with password \"$3\".\nYou should log in and change your password now.\n\nYou may ignore this message, if this account was created in error.",
        "login-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
        "login-abort-generic": "Your login was unsuccessful - Aborted",
+       "login-migrated-generic": "Your account has been migrated, and your username no longer exist on this wiki.",
        "loginlanguagelabel": "Language: $1",
        "loginlanguagelinks": "* {{#language:de}}|de\n* {{#language:en}}|en\n* {{#language:eo}}|eo\n* {{#language:fr}}|fr\n* {{#language:es}}|es\n* {{#language:it}}|it\n* {{#language:nl}}|nl",
        "suspicious-userlogout": "Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.",
        "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-summary": "",
-       "changeemail-header": "Change account email address",
        "changeemail-text": "Complete this form to change your email address. You will need to enter your password to confirm this change.",
        "changeemail-no-info": "You must be logged in to access this page directly.",
        "changeemail-oldemail": "Current email address:",
        "changeemail-none": "(none)",
        "changeemail-password": "Your {{SITENAME}} password:",
        "changeemail-submit": "Change email",
-       "changeemail-cancel": "Cancel",
        "changeemail-throttled": "You have made too many login attempts.\nPlease wait $1 before trying again.",
        "resettokens": "Reset tokens",
        "resettokens-summary": "",
        "showpreview": "Show preview",
        "showdiff": "Show changes",
        "blankarticle": "<strong>Warning:</strong> The page you are creating is blank.\nIf you click \"{{int:savearticle}}\" again, the page will be created without any content.",
-       "anoneditwarning": "<strong>Warning:</strong> You are not logged in.\nYour IP address will be recorded in this page's edit history.",
+       "anoneditwarning": "<strong>Warning:</strong> You are not logged in. Your IP address will be publicly visible if you make any edits. If you <strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
        "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
        "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
        "missingcommenttext": "Please enter a comment below.",
        "searchall": "all",
        "showingresults": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.",
        "showingresultsinrange": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}} for <strong>$4</strong>",
+       "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}}",
        "search-nonefound": "There were no results matching the query.",
        "powersearch-legend": "Advanced search",
        "powersearch-ns": "Search in namespaces:",
        "preferences-summary": "",
        "mypreferences": "Preferences",
        "prefs-edits": "Number of edits:",
-       "prefsnologintext2": "Please login to change your preferences.",
+       "prefsnologintext2": "Please log in to change your preferences.",
        "prefs-skin": "Skin",
        "skin-preview": "Preview",
        "datedefault": "No preference",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Diffs",
        "prefs-help-prefershttps": "This preference will take effect on your next login.",
+       "prefswarning-warning": "You've made changes to your preferences that have not been saved yet.\nIf you leave this page without clicking \"$1\" your preferences will not be updated.",
        "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.",
        "email-address-validity-valid": "Email address appears valid",
        "email-address-validity-invalid": "Enter a valid email address",
        "randomincategory": "Random page in category",
        "randomincategory-invalidcategory": "\"$1\" is not a valid category name.",
        "randomincategory-nopages": "There are no pages in the [[:Category:$1|$1]] category.",
-       "randomincategory-selectcategory": "Get random page from category: $1 $2.",
-       "randomincategory-selectcategory-submit": "Go",
+       "randomincategory-category": "Category:",
+       "randomincategory-legend": "Random page in category",
        "randomredirect": "Random redirect",
        "randomredirect-nopages": "There are no redirects in the namespace \"$1\".",
        "statistics": "Statistics",
        "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
        "suppress": "Oversight",
        "querypage-disabled": "This special page is disabled for performance reasons.",
+       "apihelp": "API help",
+       "apihelp-summary": "",
+       "apihelp-no-such-module": "Module \"$1\" not found.",
+       "apihelp-link": "[[Special:ApiHelp/$1|$2]]",
        "booksources": "Book sources",
        "booksources-summary": "",
        "booksources-search-legend": "Search for book sources",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Go",
+       "booksources-search": "Search",
        "booksources-text": "Below is a list of links to other sites that sell new and used books, and may also have further information about books you are looking for:",
        "booksources-invalid-isbn": "The given ISBN does not appear to be valid; check for errors copying from the original source.",
        "rfcurl": "//tools.ietf.org/html/rfc$1",
        "mywatchlist": "Watchlist",
        "watchlistfor2": "For $1 $2",
        "nowatchlist": "You have no items on your watchlist.",
-       "watchlistanontext": "Please login to view or edit items on your watchlist.",
+       "watchlistanontext": "Please log in to view or edit items on your watchlist.",
        "watchnologin": "Not logged in",
        "addwatch": "Add to watchlist",
        "addedwatchtext": "The page \"[[:$1]]\" has been added to your [[Special:Watchlist|watchlist]].\nFuture changes to this page and its associated talk page will be listed there.",
        "wlheader-enotif": "Email notification is enabled.",
        "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
        "wlnote": "Below {{PLURAL:$1|is the last change|are the last <strong>$1</strong> changes}} in the last {{PLURAL:$2|hour|<strong>$2</strong> hours}}, as of $3, $4.",
-       "wlshowlast": "Show last $1 hours $2 days $3",
+       "wlshowlast": "Show last $1 hours $2 days",
        "watchlist-options": "Watchlist options",
        "watching": "Watching...",
        "unwatching": "Unwatching...",
        "exbeforeblank": "content before blanking was: \"$1\"",
        "delete-confirm": "Delete \"$1\"",
        "delete-legend": "Delete",
-       "historywarning": "<strong>Warning:</strong> The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
+       "historywarning": "<strong>Warning:</strong> The page you are about to delete has a history with $1 {{PLURAL:$1|revision|revisions}}:",
        "confirmdeletetext": "You are about to delete a page along with all of its history.\nPlease confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].",
        "actioncomplete": "Action complete",
        "actionfailed": "Action failed",
        "delete-edit-reasonlist": "Edit deletion reasons",
        "delete-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeletion of such pages has been restricted to prevent accidental disruption of {{SITENAME}}.",
        "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.",
-       "delete-cantedit": "You cannot delete this page because you do not have permission to edit it.",
+       "deleteprotected": "You cannot delete this page because it has been protected.",
        "deleting-backlinks-warning": "'''Warning:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.",
        "rollback": "Roll back edits",
        "rollback_short": "Rollback",
        "protect-othertime": "Other time:",
        "protect-othertime-op": "other time",
        "protect-existing-expiry": "Existing expiry time: $3, $2",
+       "protect-existing-expiry-infinity": "Existing expiry time: infinite",
        "protect-otherreason": "Other/additional reason:",
        "protect-otherreason-op": "Other reason",
        "protect-dropdown": "*Common protection reasons\n** Excessive vandalism\n** Excessive spamming\n** Counter-productive edit warring\n** High traffic page",
        "unblocked": "[[User:$1|$1]] has been unblocked.",
        "unblocked-range": "$1 has been unblocked.",
        "unblocked-id": "Block $1 has been removed.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] has been unblocked.",
        "blocklist": "Blocked users",
        "ipblocklist": "Blocked users",
        "ipblocklist-legend": "Find a blocked user",
        "import-summary": "",
        "importinterwiki": "Transwiki import",
        "import-interwiki-text": "Select a wiki and page title to import.\nRevision dates and editors' names will be preserved.\nAll transwiki import actions are logged at the [[Special:Log/import|import log]].",
-       "import-interwiki-source": "Source wiki/page:",
+       "import-interwiki-sourcewiki": "Source wiki:",
+       "import-interwiki-sourcepage": "Source page:",
        "import-interwiki-history": "Copy all history revisions for this page",
        "import-interwiki-templates": "Include all templates",
        "import-interwiki-submit": "Import",
        "accesskey-pt-mycontris": "y",
        "accesskey-pt-login": "o",
        "accesskey-pt-logout": "",
+       "accesskey-pt-createaccount": "",
        "accesskey-ca-talk": "t",
        "accesskey-ca-edit": "e",
        "accesskey-ca-addsection": "+",
        "tooltip-pt-mycontris": "A list of your contributions",
        "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
        "tooltip-pt-logout": "Log out",
+       "tooltip-pt-createaccount": "You are encouraged to create an account and log in; however, it is not mandatory",
        "tooltip-ca-talk": "Discussion about the content page",
        "tooltip-ca-edit": "You can edit this page. Please use the preview button before saving",
        "tooltip-ca-addsection": "Start a new section",
        "exif-urgency-low": "Low ($1)",
        "exif-urgency-high": "High ($1)",
        "exif-urgency-other": "User-defined priority ($1)",
-       "watchlistall2": "all",
        "namespacesall": "all",
        "monthsall": "all",
        "confirmemail": "Confirm email address",
        "log-name-pagelang": "Change language log",
        "log-description-pagelang": "This is a log of changes in page languages.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|changed}} page language for $3 from $4 to $5.",
-       "default-skin-not-found": "Whoops! The default skin for your wiki (<code>$wgDefaultSkin</code>), <code>$1</code>, is not available.\n\nYour installation seems to include the following skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable them and choose the default.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code>skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following lines into <code>LocalSettings.php</code> to enable all currently installed skins:\n\n<pre>$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>:\n: Double-check the skin names for typos.",
-       "default-skin-not-found-no-skins": "Whoops! The default skin for your wiki (<code>$wgDefaultSkin</code>), <code>$1</code>, is not available.\n\nYou have no installed skins.\n\n; If you have just installed or upgraded MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code>skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.\n",
+       "default-skin-not-found": "Whoops! The default skin for your wiki, defined in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYour installation seems to include the following skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable them and choose the default.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following lines into <code>LocalSettings.php</code> to enable all currently installed skins:\n\n<pre dir=\"ltr\">$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>:\n: Double-check the skin names for typos.",
+       "default-skin-not-found-no-skins": "Whoops! The default skin for your wiki, defined in <code>$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYou have no installed skins.\n\n; If you have just installed or upgraded MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.\n",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enabled)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disabled''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disabled''')",
+       "mediastatistics": "Media statistics",
+       "mediastatistics-summary": "Statistics about uploaded file types. This only includes the most recent version of a file. Old or deleted versions of files are excluded.",
+       "mediastatistics-nfiles": "$1 ($2%)",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME type",
+       "mediastatistics-table-extensions": "Possible extensions",
+       "mediastatistics-table-count": "Number of files",
+       "mediastatistics-table-totalbytes": "Combined size",
+       "mediastatistics-header-unknown": "Unknown",
+       "mediastatistics-header-bitmap": "Bitmap images",
+       "mediastatistics-header-drawing": "Drawings (vector images)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videos",
+       "mediastatistics-header-multimedia": "Rich media",
+       "mediastatistics-header-office": "Office",
+       "mediastatistics-header-text": "Textual",
+       "mediastatistics-header-executable": "Executables",
+       "mediastatistics-header-archive": "Compressed formats",
+       "json-warn-trailing-comma": "$1 trailing {{PLURAL:$1|comma was|commas were}} removed from JSON",
+       "json-error-unknown": "There was a problem with the JSON. Error: $1",
+       "json-error-depth": "The maximum stack depth has been exceeded",
+       "json-error-state-mismatch": "Invalid or malformed JSON",
+       "json-error-ctrl-char": "Control character error, possibly incorrectly encoded",
+       "json-error-syntax": "Syntax error",
+       "json-error-utf8": "Malformed UTF-8 characters, possibly incorrectly encoded",
+       "json-error-recursion": "One or more recursive references in the value to be encoded",
+       "json-error-inf-or-nan": "One or more NAN or INF values in the value to be encoded",
+       "json-error-unsupported-type": "A value of a type that cannot be encoded was given"
 }
index 8b254c7..9df939c 100644 (file)
        "otherlanguages": "Aliaj lingvoj",
        "redirectedfrom": "(Alidirektita el $1)",
        "redirectpagesub": "Alidirektilo",
+       "redirectto": "Alidirektas al:",
        "lastmodifiedat": "Ĉi tiu paĝo estis lastafoje redaktita je $2, $1.",
        "viewcount": "Montrita {{PLURAL:$1|unufoje|$1 fojojn}}.",
        "protectedpage": "Protektita paĝo",
        "hidetoc": "kaŝi",
        "collapsible-collapse": "kaŝi",
        "collapsible-expand": "Montri",
+       "confirmable-confirm": "Ĉu {{GENDER:$1|vi}} certas?",
        "confirmable-yes": "Jes",
        "confirmable-no": "Ne",
        "thisisdeleted": "Vidi aŭ restarigi $1?",
        "invalidtitle-knownnamespace": "Nevalida titolo kun nomspaco \"$2\" kaj teksto \"$3\"",
        "invalidtitle-unknownnamespace": "Nevalida titolo kun nekonata nomspaca numero $1 kaj teksto \"$2\"",
        "exception-nologin": "Ne ensalutinta",
-       "exception-nologin-text": "Bonvolu [[Special:Userlogin|ensaluti]] por atingi ĉi tiun paĝon aŭ agon.",
+       "exception-nologin-text": "Bonvolu ensaluti por atingi ĉi tiun paĝon aŭ agon.",
        "exception-nologin-text-manual": "Vi devas $1, por povi aliri al ĉi tiu paĝo aŭ ago.",
        "virus-badscanner": "Malbona konfiguro: nekonata virusa skanilo: ''$1''",
        "virus-scanfailed": "skano malsukcesis (kun kodo $1)",
        "passwordreset-emailsent-capture": "Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata malsupre.",
        "passwordreset-emailerror-capture": "Retpoŝto kun renovigita pasvorto estis generita, montrata sube, sed sendado al la {{GENDER:$2|uzanto}} malsukcesis: $1",
        "changeemail": "Ŝanĝi retpoŝtadreson",
-       "changeemail-header": "Ŝanĝi retpoŝtadreso por konto",
        "changeemail-text": "Plenumu ĉi tiu formularon por ŝanĝi vian retpoŝtadreson. Vi devas enigi vian pasvorton por konfirmi ĉi tiun ŝanĝon.",
        "changeemail-no-info": "Vi devas ensaluti por atingi ĉi tiun paĝon rekte.",
        "changeemail-oldemail": "Aktuala retpoŝtadreso:",
        "changeemail-none": "(nenio)",
        "changeemail-password": "Via {{SITENAME}}-ensalutado:",
        "changeemail-submit": "Ŝanĝi retpoŝtadreson",
-       "changeemail-cancel": "Nuligi",
        "changeemail-throttled": "Vi tro ofte provis alsaluti.\nBonvolu atendi $1, antaŭ ol vi provos denove.",
        "resettokens": "Renovigi ŝlosilojn",
        "resettokens-text": "Vi povas rekomencigi ĵetonojn, kiuj ebligas aliron al certaj privataj datumoj, kiuj estas ligataj kun via konto de uzanto ĉi tie.\n\nVi faru tion, se vi akcidente kunhavigis ilin kun iu aŭ se via konto estis malkonfidencigita.",
        "preview": "Antaŭrigardo",
        "showpreview": "Antaŭrigardo",
        "showdiff": "Montri ŝanĝojn",
-       "anoneditwarning": "'''Averto:''' Vi ne estas ensalutinta.\nVia IP-adreso enregistriĝos en la redakta historio de tiu ĉi paĝo.",
+       "anoneditwarning": "<strong>Averto:</strong> Vi ne estas ensalutinta.\nVia IP-adreso enregistriĝos en la redakta historio de tiu ĉi paĝo. Se vi <strong>[$1 ensalutas]</strong> aŭ <strong>[$2 kreas konton]</strong>, viaj redaktoj estos atribuitaj al via salutnomo, kune kun aliaj bonaĵoj.",
        "anonpreviewwarning": "''Vi ne estas ensalutita. La konservo de la paĝo registros vian IP-adreson en redakta historio de ĉi tiu paĝo.''",
        "missingsummary": "'''Rememorigilo:''' Vi ne provizis redaktan resumon. Se vi alklakos denove la konservan butonon, via redaktaĵo estos konservita sen resumo.",
        "missingcommenttext": "Bonvolu entajpi komenton malsupre.",
        "logdelete-selected": "{{PLURAL:$1|Selektata protokola evento|Selektataj protokolaj eventoj}}:",
        "revdelete-text-text": "Forigitaj versioj ankoraŭ restas en la versia historio, sed partoj de ilia enhavo ne estas alireblaj por la publiko.",
        "revdelete-text-file": "Forigitaj dosieraj versioj ankoraŭ restas en la dosiera historio, sed partoj de ilia enhavo ne estas alireblaj por la publiko.",
-       "revdelete-text-others": "Aliaj administrantoj sur {{SITENAME}} ankoraŭ havas aliron al la kaŝita enhavo kaj povas malforigi ĝin denove per ĉi tiu sama interfaco, tiel longe kiel aldonaj restriktoj ne estas difinitaj.",
+       "revdelete-text-others": "Aliaj administrantoj ankoraŭ havas aliron al la kaŝita enhavo kaj povas malforigi ĝin, tiel longe kiel aldonaj restriktoj ne estas difinitaj.",
        "revdelete-confirm": "Bonvolu konfirmi ke vi intencias fari ĉi tion, ke vi komprenas la konsekvencojn kaj ke vi faras ĉi tion laŭ [[{{MediaWiki:Policy-url}}|la regularo]].",
        "revdelete-suppress-text": "Subpremo '''nur''' estu uzata por la jenaj kazoj:\n* Ebla kalumnia informo\n* Netaŭga persona informo\n*: ''hejmaj adresoj kaj telefonnumeroj, ŝtataj identnumeroj, ktp.''",
        "revdelete-legend": "Fari videblecajn limigojn",
        "revdelete-offender": "Aŭtoro de revizio:",
        "suppressionlog": "Protokolo pri subigado",
        "suppressionlogtext": "Malsupre estas listo de forigoj kaj forbaroj pri enhavo kaŝita de administrantoj.\nRigardu la [[Special:BlockList|forbarliston]] por la listo de nune operaciaj forbaroj kaj forigoj.",
-       "mergehistory": "Kunfandigi historiojn de paĝoj",
+       "mergehistory": "Kunigi historiojn de paĝoj",
        "mergehistory-header": "Ĉi tiu paĝo permesas al vi kunigi versiojn de la historio de unu fonta paĝo en pli novan paĝon.\nCertigu ke ĉi tiu ŝanĝo tenos kontinuecon de la historia paĝo.",
        "mergehistory-box": "Kunigi versiojn de du paĝoj:",
        "mergehistory-from": "Fontpaĝo:",
        "search-result-category-size": "{{PLURAL:$1|1 membro|$1 membroj}} ({{PLURAL:$2|1 subkategorio|$2 subkategorioj}}, {{PLURAL:$3|1 dosiero|$3 dosieroj}})",
        "search-redirect": "(alidirektilo $1)",
        "search-section": "(sekcio $1)",
+       "search-file-match": "(kongruas kun dosiera enhavo)",
        "search-suggest": "Ĉu vi intenciis: $1",
        "search-interwiki-caption": "Kunprojektoj",
        "search-interwiki-default": "Rezultoj de $1:",
        "searchall": "ĉiuj",
        "showingresults": "Montras {{PLURAL:$1|'''1''' trovitan|'''$1''' trovitajn}} ekde la #'''$2'''-a.",
        "showingresultsinrange": "Malsupre montriĝas {{PLURAL:$1|<strong>1</strong> rezulto|<strong>$1</strong> rezultoj}} en la intervalo #<strong>$2</strong> ĝis #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Rezulto '''$1''' el '''$3'''|Rezultoj '''$1 – $2''' el '''$3'''}} por '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Rezulto <strong>$1</strong> el <strong>$3</strong>|Rezultoj <strong>$1 - $2</strong> el <strong>$3</strong>}}",
        "search-nonefound": "La serĉomendo rezultis kun neniuj trafoj.",
        "powersearch-legend": "Progresa serĉo",
        "powersearch-ns": "Serĉi en nomspacoj:",
        "preferences": "Preferoj",
        "mypreferences": "Preferoj",
        "prefs-edits": "Nombro de redaktoj:",
-       "prefsnologintext2": "Bonvolu $1, por ŝanĝi viajn preferojn.",
+       "prefsnologintext2": "Bonvolu ensaluti, por ŝanĝi viajn preferojn.",
        "prefs-skin": "Etoso",
        "skin-preview": "Antaŭrigardo",
        "datedefault": "Nenia prefero",
        "nolicense": "Neniu elektita",
        "license-nopreview": "(Antaŭvido ne montrebla)",
        "upload_source_url": " (valida, publike atingebla URL-o)",
-       "upload_source_file": " (dosiero en via komputilo)",
+       "upload_source_file": "(dosiero elektita de via komputilo)",
        "listfiles-delete": "forigi",
        "listfiles-summary": "Ĉi tiu speciala paĝo montras ĉiujn alŝutitajn dosierojn.\nKiam oni filtras ĝin laŭ uzanto, nur la aktuala versio de la dosiero estos montrita.",
        "listfiles_search_for": "Serĉi dosieran nomon:",
        "randomincategory": "Hazarda paĝo en kategorio",
        "randomincategory-invalidcategory": "\"$1\" ne estas valida kategoria nomo.",
        "randomincategory-nopages": "Ne estas paĝoj en la kategorio [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Iri al hazarda paĝo el kategorio: $1 $2.$1",
-       "randomincategory-selectcategory-submit": "Ek!",
+       "randomincategory-category": "Kategorio:",
+       "randomincategory-legend": "Hazarda paĝo en kategorio",
        "randomredirect": "Hazarda alidirekto",
        "randomredirect-nopages": "Estas neniuj alidirektiloj en la nomspaco \"$1\".",
        "statistics": "Statistiko",
        "querypage-disabled": "Tiu ĉi speciala paĝo estas malfunkciigita pro rendimentaj kialoj.",
        "booksources": "Libroservoj",
        "booksources-search-legend": "Serĉi librofontojn",
-       "booksources-go": "Ek",
+       "booksources-search": "Serĉi",
        "booksources-text": "Jen ligilaro al aliaj TTT-ejoj, kiuj vendas librojn,\nkaj/aŭ informumos pri la libro ligita.\nLa {{SITENAME}} ne estas komerce ligita al tiuj vendejoj, kaj la listo ne estu\nkomprenata kiel rekomendo aŭ reklamo.",
        "booksources-invalid-isbn": "La donata ISBN verŝajne estas nevalida; kontrolu pri erara kopiado el la originala fonto.",
        "specialloguserlabel": "Faranto:",
        "wlheader-enotif": "Retpoŝta sciigo estas ŝalta.",
        "wlheader-showupdated": "Paĝoj montriĝis per '''dikaj literoj''' kiuj estis ŝanĝitaj ekde vi laste vizitis.",
        "wlnote": "Jen la {{PLURAL:$1|lasta redakto|lastaj <strong>$1</strong> redaktoj}} dum la {{PLURAL:$2|lasta horo|lastaj <strong>$2</strong> horoj}}, ekde $3, $4.",
-       "wlshowlast": "Montri el lastaj $1 horoj $2 tagoj $3",
+       "wlshowlast": "Montri el lastaj $1 horoj $2 tagoj",
        "watchlist-options": "Opcioj por atentaro",
        "watching": "Aldonante al la atentaro...",
        "unwatching": "Malatentante...",
        "exbeforeblank": "antaŭ malplenigo enhavis: '$1'",
        "delete-confirm": "Forigi \"$1\"",
        "delete-legend": "Forigi",
-       "historywarning": "'''Averto:''' La forigota paĝo havas historion kun pli-malpli $1 {{PLURAL:$1|revizio|revizioj}}:",
+       "historywarning": "<strong>Averto:</strong> La forigota paĝo havas historion kun $1 {{PLURAL:$1|revizio|revizioj}}:",
        "confirmdeletetext": "Vi forigos la artikolon aŭ dosieron kaj forviŝos ĝian tutan historion el la datumaro.<br /> Bonvolu konfirmi, ke vi vere intencas tion, kaj ke vi komprenas la sekvojn, kaj ke vi ja sekvas la [[{{MediaWiki:Policy-url}}|regulojn pri forigado]].",
        "actioncomplete": "Ago farita",
        "actionfailed": "Ago malsukcesis",
        "autoblockid": "Aŭtomata forbaro #$1",
        "block": "Forbari uzanton",
        "unblock": "Malforbari uzanton",
-       "blockip": "Forbari uzanton/IP-adreson",
+       "blockip": "Forbari {{GENDER:$1|uzanton}}",
        "blockip-legend": "Forbari uzanton",
        "blockiptext": "Per jena formularo vi povas forpreni de ajna nomo aŭ IP-adreso la rajton skribi en la vikio. Oni faru tion ''nur'' por eviti vandalismon, kaj sekvante la [[{{MediaWiki:Policy-url}}|regulojn pri forbarado]]. Klarigu la precizan kialon malsupre (ekzemple, citu paĝojn, kiuj estis vandaligitaj).",
        "ipaddressorusername": "IP-adreso aŭ salutnomo:",
        "ipb-unblock-addr": "Restarigi $1",
        "ipb-unblock": "Malforbari salutnomon aŭ IP-adreson",
        "ipb-blocklist": "Vidi ekzistantajn forbarojn",
-       "ipb-blocklist-contribs": "Kontribuoj de $1",
+       "ipb-blocklist-contribs": "Kontribuoj de {{GENDER:$1|$1}}",
        "unblockip": "Malforbari IP-adreson/nomon",
        "unblockiptext": "Per la jena formulo vi povas repovigi al iu\nforbarita IP-adreso/nomo la povon enskribi en la vikio.",
        "ipusubmit": "Forigi ĉi tiun forbaron",
        "import": "Importi paĝojn",
        "importinterwiki": "Transvikia importo",
        "import-interwiki-text": "Elektu vikion kaj paĝan titolon por importi.\nDatoj de versioj kaj nomoj de redaktantoj estos preservitaj.\nĈiuj transvikaj importoj estas raportitaj ĉe la [[Special:Log/import|loglibro de importoj]].",
-       "import-interwiki-source": "Fonta vikio/paĝo:",
+       "import-interwiki-sourcewiki": "Fonta vikio:",
+       "import-interwiki-sourcepage": "Fonta paĝo:",
        "import-interwiki-history": "Kopiu ĉiujn historiajn versiojn por ĉi tiu pago.",
        "import-interwiki-templates": "Inkluzivi ĉiujn ŝablonojn",
        "import-interwiki-submit": "Importi",
        "import-upload": "Alŝuti XML-datenojn",
        "import-token-mismatch": "Seancaj datenoj perdiĝis. Bonvolu reprovi.",
        "import-invalid-interwiki": "Ne povas importi de la specifita vikio.",
-       "import-error-edit": "Paĝo \"$1\" ne estas importita ĉar vi ne rajtas radakti ĝin.",
-       "import-error-create": "Paĝo \"$1\" ne estas importita ĉar vi ne rajtas krei ĝin.",
+       "import-error-edit": "Paĝo \"$1\" ne estis importita ĉar vi ne rajtas radakti ĝin.",
+       "import-error-create": "Paĝo \"$1\" ne estis importita ĉar vi ne rajtas krei ĝin.",
        "import-error-interwiki": "Paĝo \"$1\" ne estis importita pro sia nomo estas deklarita por ekstera ligado (intervikia).",
-       "import-error-special": "Paĝo \"$1\" ne estas importata, ĉar ĝi apartenas al speciala nomspaco, kiu ne permesas paĝojn.",
-       "import-error-invalid": "Paĝo \"$1\" ne estas importata, ĉar ĝia nomo estas malvalida.",
+       "import-error-special": "Paĝo \"$1\" ne estis importata, ĉar ĝi apartenas al speciala nomspaco, kiu ne permesas paĝojn.",
+       "import-error-invalid": "Paĝo \"$1\" ne estis importata, ĉar ĝia nomo estas malvalida.",
        "import-error-unserialize": "La revizio n-ro $2 de la paĝo nomata \"$1\" ne povis senseriiĝi. La revizio raportiĝis uzi enhavmodelon n-ro $3, kiu seriiĝis kiel n-ro $4.",
        "import-options-wrong": "{{PLURAL:$2|Erara elekto|Eraraj elektoj}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "La provizita paĝo havas nevalidan titolon.",
        "import-logentry-upload": "importita [[$1]] de dosiera alŝuto",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|versio|versioj}}",
        "import-logentry-interwiki": "transvikiigita $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versio|versioj}} de $2",
+       "import-logentry-interwiki-detail": "Importis $1 {{PLURAL:$1|revizion|reviziojn}} de $2",
        "javascripttest": "Ĝavoskripta testado",
        "javascripttest-title": "Irigante $1 testoj",
        "javascripttest-pagetext-noframework": "Ĉi tiu paĝo estas konservita por funkciigi testojn de JavaScript.",
        "exif-urgency-low": "Malalta ($1)",
        "exif-urgency-high": "Alta ($1)",
        "exif-urgency-other": "Prioritato difinita de uzanto ($1)",
-       "watchlistall2": "ĉiuj",
        "namespacesall": "ĉiuj",
        "monthsall": "ĉiuj",
        "confirmemail": "Konfirmi retadreson",
        "autosumm-replace": "Anstataŭigis paĝon per '$1'",
        "autoredircomment": "Alidirektigis al [[$1]]",
        "autosumm-new": "Nova paĝo kun '$1'",
+       "autosumm-newblank": "Kreis nulan paĝon",
        "lag-warn-normal": "Ŝanĝoj pli novaj ol $1 {{PLURAL:$1|sekundo|sekundoj}} eble ne estos montrataj en ĉi tiu listo.",
        "lag-warn-high": "Pro malrapideco de la servila datumbazo, ŝanĝoj pli novaj ol $1 {{PLURAL:$1|sekundo|sekundoj}} eble ne montriĝos en ĉi tiu listo.",
        "watchlistedit-normal-title": "Redakti atentaron",
        "logentry-rights-rights": "$1 ŝanĝis grupan membrecon por $3 de $4 al $5",
        "logentry-rights-rights-legacy": "$1 ŝanĝis grupan membrecon por $3",
        "logentry-rights-autopromote": "$1 estis aŭtomate {{GENDER:$2|altrangigita}} de $4 al $5",
+       "logentry-upload-revert": "$1 {{GENDER:$2|alŝutis}} $3",
        "rightsnone": "(nenia)",
+       "revdelete-summary": "redaktoresumon",
        "feedback-bugornote": "Se vi pretas priskribi teknikan problemon detale, bonvolu [$1 raporti cimon].\nAŭ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la paĝo \"[$3 $2]\", kune kun via salutnomo kaj uzita retumilo.",
        "feedback-subject": "Temo:",
        "feedback-message": "Mesaĝo:",
        "action-pagelang": "ŝanĝi la lingvon de la paĝo",
        "log-name-pagelang": "Ŝanĝi la lingvan protokolon",
        "log-description-pagelang": "Jen protokolo pri ŝanĝoj de paĝaj lingvoj.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ŝanĝis}} la paĝan lingvon por $3 de $4 al $5."
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ŝanĝis}} la paĝan lingvon por $3 de $4 al $5.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ŝalta)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''malŝalta''')",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bitoko|$1 bitokoj}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-tipo",
+       "mediastatistics-table-count": "Nombro de dosieroj",
+       "mediastatistics-header-unknown": "Nekonata",
+       "mediastatistics-header-bitmap": "Rastrumaj bildoj",
+       "mediastatistics-header-drawing": "Desegnaĵoj (vektoraj bildoj)",
+       "mediastatistics-header-audio": "Sonaj",
+       "mediastatistics-header-video": "Videaj dosieroj",
+       "mediastatistics-header-multimedia": "Multmediaj",
+       "mediastatistics-header-office": "Oficejaj",
+       "mediastatistics-header-text": "Tekstaj",
+       "json-error-syntax": "Sintaksa eraro"
 }
index 2fa6923..e69205a 100644 (file)
                        "Themasterriot",
                        "AVIADOR",
                        "F3RaN",
-                       "Amitie 10g"
+                       "Amitie 10g",
+                       "Eurodyne",
+                       "Gleki",
+                       "Jonathan rrr"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "viewhelppage": "Ver página de ayuda",
        "categorypage": "Ver página de categoría",
        "viewtalkpage": "Ver discusión",
-       "otherlanguages": "Otros idiomas",
+       "otherlanguages": "En otros idiomas",
        "redirectedfrom": "(Redirigido desde «$1»)",
        "redirectpagesub": "Página de redirección",
+       "redirectto": "Redirigir a:",
        "lastmodifiedat": "Esta página fue modificada por última vez el $1 a las $2.",
        "viewcount": "Esta página se ha visitado {{PLURAL:$1|una vez|$1 veces}}.",
        "protectedpage": "Página protegida",
        "yourdomainname": "Tu dominio:",
        "password-change-forbidden": "No puedes cambiar las contraseñas en este wiki.",
        "externaldberror": "Hubo un error de autenticación de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.",
-       "login": "Iniciar sesión",
+       "login": "Acceder",
        "nav-login-createaccount": "Acceder/crear cuenta",
        "userlogin": "Acceder/crear cuenta",
        "userloginnocreate": "Acceder",
        "nocookieslogin": "{{SITENAME}} utiliza <em>cookies</em> para la autenticación de usuarios. Las <em>cookies</em> están desactivadas en tu navegador. Por favor, actívalas e inténtalo de nuevo.",
        "nocookiesfornew": "No se pudo crear la cuenta de usuario, porque no pudimos confirmar su origen.\nAsegúrate de que tienes las cookies activadas, luego recarga esta página e inténtalo de nuevo.",
        "noname": "No se ha especificado un nombre de usuario válido.",
-       "loginsuccesstitle": "Ya iniciaste sesión",
+       "loginsuccesstitle": "Has accedido correctamente",
        "loginsuccess": "<strong>Has accedido a {{SITENAME}} como «$1».</strong>",
        "nosuchuser": "No existe ningún usuario llamado «$1».\nLos nombres de usuario son sensibles a las mayúsculas.\nRevisa la ortografía, o [[Special:UserLogin/signup|crea una cuenta nueva]].",
        "nosuchusershort": "No hay un usuario con el nombre «$1». Comprueba que lo has escrito correctamente.",
        "createaccount-text": "Alguien creó en {{SITENAME}} ($4) una cuenta asociada a este correo electrónico con el nombre «$2» y contraseña «$3». Por favor entra ahora y cambia tu contraseña.\n\nPuedes ignorar este mensaje si esta cuenta fue creada por error.",
        "login-throttled": "Has intentado demasiadas veces iniciar sesión recientemente. Por favor espera $1 antes de intentarlo nuevamente.",
        "login-abort-generic": "Tu inicio de sesión no fue exitoso - Cancelado",
+       "login-migrated-generic": "Tu cuenta se ha migrado y tu nombre de usuario ya no existen en este wiki.",
        "loginlanguagelabel": "Idioma: $1",
        "suspicious-userlogout": "Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.",
        "createacct-another-realname-tip": "El nombre real es opcional.\nSi se proporciona, se usará para dar al usuario la atribución de su trabajo.",
        "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 generó un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero el envío {{GENDER:$2|al usuario|a la usuaria}} falló: $1",
        "changeemail": "Cambiar la dirección de correo electrónico",
-       "changeemail-header": "Cambiar la dirección de correo de la cuenta",
        "changeemail-text": "Rellena este formulario para cambiar tu dirección de correo electrónico. Debes introducir la contraseña para confirmar este cambio.",
        "changeemail-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
        "changeemail-oldemail": "Dirección electrónica actual:",
        "changeemail-none": "(ninguna)",
        "changeemail-password": "Tu contraseña en {{SITENAME}}:",
        "changeemail-submit": "Cambiar correo electrónico",
-       "changeemail-cancel": "Cancelar",
        "changeemail-throttled": "Has intentado acceder demasiadas veces.\nEspera $1 antes de intentarlo de nuevo.",
        "resettokens": "Restablecer claves",
        "resettokens-text": "Aquí puedes restablecer las fichas que permiten el acceso a ciertos datos privados asociados con tu cuenta.\n\nDeberías hacerlo si accidentalmente los has compartido o si tu cuenta ha sido intervenida.",
        "showpreview": "Mostrar previsualización",
        "showdiff": "Mostrar los cambios",
        "blankarticle": "<strong>Aviso:</strong> estás a punto de crear una página vacía.\nSi pulsas en «{{int:savearticle}}» de nuevo, se creará la página sin ningún contenido.",
-       "anoneditwarning": "<strong>Advertencia:</strong> No has iniciado sesión.\nTu dirección IP se almacenará en el historial de edición de esta página.",
+       "anoneditwarning": "<strong>Advertencia:</strong> No has iniciado sesión. Tu dirección IP será visible públicamente si haces cualquier edición. Si <strong>[$1 inicias sesión]</strong> o <strong>[$2 creas una cuenta]</strong>, tus ediciones se atribuirán a tu nombre de usuario, junto con otros beneficios.",
        "anonpreviewwarning": "<em>No has iniciado sesión. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de esta página.</em>",
        "missingsummary": "<strong>Recordatorio:</strong> No has escrito un resumen de edición.\nSi haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
        "missingcommenttext": "Escribe un comentario a continuación.",
        "protectedpagewarning": "'''Aviso: Esta página ha sido protegida de manera que solo usuarios con permisos de administrador puedan editarla.'''\nA continuación se muestra la última entrada de registro para referencia:",
        "semiprotectedpagewarning": "'''Nota:''' Esta página ha sido protegida para que solo usuarios registrados puedan editarla.\nA continuación se provee la última entrada de registro para referencia:",
        "cascadeprotectedwarning": "'''Aviso:''' Esta página está protegida, solo los administradores pueden editarla porque está incluida en  {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} en cascada:",
-       "titleprotectedwarning": "'''Aviso: Esta página está protegida de modo que se necesitan [[Special:ListGroupRights|derechos especificos]] para crearla.'''\nA continuación se muestra la última entrada de registro para referencia:",
+       "titleprotectedwarning": "'''Aviso: Esta página está protegida de modo que se necesitan [[Special:ListGroupRights|permisos especificos]] para crearla.'''\nA continuación se muestra la última entrada de registro para referencia:",
        "templatesused": "{{PLURAL:$1|Plantilla usada|Plantillas usadas}} en esta página:",
        "templatesusedpreview": "{{PLURAL:$1|Plantilla usada|Plantillas usadas}} en esta previsualización:",
        "templatesusedsection": "{{PLURAL:$1|Plantilla usada|Plantillas usadas}} en esta sección:",
        "mergehistory-go": "Mostrar ediciones fusionables",
        "mergehistory-submit": "Fusionar revisiones",
        "mergehistory-empty": "No hay revisiones fusionables.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisión|revisiones}} de [[:$1]] fusionadas de forma exitosa en [[:$2]].",
+       "mergehistory-success": "Se {{PLURAL:$3|fusionó $3 revisión|fusionaron $3 revisiones}} de «[[:$1]]» en «[[:$2]]» correctamente.",
        "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.",
        "searchall": "todos",
        "showingresults": "Abajo se {{PLURAL:$1|muestra '''1''' resultado|muestran hasta '''$1''' resultados}} comenzando por el n.º '''$2'''.",
        "showingresultsinrange": "Abajo se muestran hasta {{PLURAL:$1|<strong>1</strong> resultado|<strong>$1</strong> resultados}} en el rango #<strong>$2</strong> hasta #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1-$2''' de '''$3'''}} para '''$4'''",
        "search-nonefound": "No hay resultados que cumplan los criterios de búsqueda.",
        "powersearch-legend": "Búsqueda avanzada",
        "powersearch-ns": "Buscar en los espacios de nombres:",
        "prefs-tokenwatchlist": "Clave",
        "prefs-diffs": "Diferencias",
        "prefs-help-prefershttps": "Esta preferencia tendrá efecto en tu próximo inicio de sesión.",
+       "prefswarning-warning": "Has hecho cambios en tus preferencias que todavía no se han guardado. Si sales de esta página sin pulsar en «$1» no se actualizarán las preferencias.",
        "prefs-tabs-navigation-hint": "Sugerencia: Puede utilizar las teclas de flecha izquierda y derecha para navegar entre las pestañas de la lista de pestañas.",
        "email-address-validity-valid": "La dirección de correo electrónico parece ser válida",
        "email-address-validity-invalid": "Introduce una dirección de correo válida",
        "randomincategory": "Página aleatoria en categoría",
        "randomincategory-invalidcategory": "\"$1\" no es una categoría válida.",
        "randomincategory-nopages": "No hay páginas en la categoría [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Obtener una página aleatoria de categoría: $1 $2.",
-       "randomincategory-selectcategory-submit": "Ir",
+       "randomincategory-category": "Categoría:",
+       "randomincategory-legend": "Página aleatoria en categoría",
        "randomredirect": "Ir a una redirección cualquiera",
        "randomredirect-nopages": "No hay redirecciones en el espacio de nombres «$1».",
        "statistics": "Estadísticas",
        "querypage-disabled": "Esta página especial está deshabilitada por motivos de rendimiento.",
        "booksources": "Fuentes de libros",
        "booksources-search-legend": "Buscar fuentes de libros",
-       "booksources-go": "Ir",
+       "booksources-search": "Buscar",
        "booksources-text": "Abajo hay una lista de enlaces a otros sitios que venden libros nuevos y usados, puede que contengan más información sobre los libros que estás buscando.",
        "booksources-invalid-isbn": "El número de ISBN no parece ser válido; comprueba los errores copiándolo de la fuente original.",
        "specialloguserlabel": "Usuario:",
        "wlheader-enotif": "La notificación por correo está activada.",
        "wlheader-showupdated": "Las páginas modificadas desde su última visita aparecen en '''negrita'''.",
        "wlnote": "A continuación {{PLURAL:$1|se muestra el último cambio|se muestran los últimos '''$1''' cambios}} en {{PLURAL:$2|la última hora|las últimas '''$2''' horas}} a fecha de $4 $3.",
-       "wlshowlast": "Ver los cambios de las últimas $1 horas, $2 días  $3",
+       "wlshowlast": "Ver los cambios de las últimas $1 horas, $2 días",
        "watchlist-options": "Opciones de la lista de seguimiento",
        "watching": "Vigilando...",
        "unwatching": "Eliminando de la lista de seguimiento...",
        "exbeforeblank": "El contenido antes de blanquear era: «$1»",
        "delete-confirm": "Borrar «$1»",
        "delete-legend": "Borrar",
-       "historywarning": "'''Aviso:''' La página que estás a punto de borrar tiene un historial de aproximadamente $1 {{PLURAL:$1|revisión|revisiones}}:",
+       "historywarning": "<strong>Atención:</strong> la página que estás a punto de borrar tiene un historial con $1 {{PLURAL:$1|revisión|revisiones}}:",
        "confirmdeletetext": "Estás a punto de borrar una página en forma permanente, así como todo su historial.\nPor favor, confirma que realmente quieres hacer eso, que entiendes las\nconsecuencias, y que lo estás haciendo de acuerdo con [[{{MediaWiki:Policy-url}}|las políticas]].",
        "actioncomplete": "Acción completada",
        "actionfailed": "Acción fallida",
        "delete-edit-reasonlist": "Editar razones de borrado",
        "delete-toobig": "Esta página tiene un historial muy grande, con más de $1 {{PLURAL:$1|revisión|revisiones}}. Borrar este tipo de páginas ha sido restringido para prevenir posibles problemas en {{SITENAME}}.",
        "delete-warning-toobig": "Esta página tiene un historial de más de $1 {{PLURAL:$1|revisión|revisiones}}. Eliminarla puede perturbar las operaciones de la base de datos de {{SITENAME}}. Ten cuidado al borrar.",
-       "delete-cantedit": "No puedes borrar esta página porque no tienes permiso de editarla.",
+       "deleteprotected": "No puedes eliminar esta página porque ha sido protegida.",
        "deleting-backlinks-warning": "'''Advertencia:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Otras páginas]] enlazan o transcluyen la página que vas a eliminar.",
        "rollback": "Revertir ediciones",
        "rollback_short": "Revertir",
        "protect-othertime": "Especificar caducidad:",
        "protect-othertime-op": "otra (especificar)",
        "protect-existing-expiry": "Fecha de caducidad actual: $2 a las $3",
+       "protect-existing-expiry-infinity": "Tiempo de caducidad existente: infinito",
        "protect-otherreason": "Otra razón:",
        "protect-otherreason-op": "Otra razón",
        "protect-dropdown": "*Razones de protección habituales\n**Vandalismo excesivo\n**Spam excesivo\n**Guerra de ediciones\n**Página muy visitada",
        "import": "Importar páginas",
        "importinterwiki": "Importación transwiki",
        "import-interwiki-text": "Selecciona un wiki y un título de página para importar.\nLas fechas de revisiones y los nombres de editores se preservarán.\nTodas las importaciones transwiki se registran en el [[Special:Log/import|registro de importaciones]].",
-       "import-interwiki-source": "Wiki o página origen:",
+       "import-interwiki-sourcewiki": "Wiki de origen:",
+       "import-interwiki-sourcepage": "Página de origen:",
        "import-interwiki-history": "Copiar todas las versiones históricas para esta página",
        "import-interwiki-templates": "Incluir todas las plantillas",
        "import-interwiki-submit": "Importar",
        "exif-urgency-low": "Bajo ($1)",
        "exif-urgency-high": "Alto ($1)",
        "exif-urgency-other": "Prioridad definida por el usuario ($1)",
-       "watchlistall2": "todos",
        "namespacesall": "todos",
        "monthsall": "todos",
        "confirmemail": "Confirmar dirección de correo electrónico",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|subió}} una nueva versión de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|subió}} $3",
        "rightsnone": "(ninguno)",
+       "revdelete-summary": "resumen de edición",
        "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-subject": "Asunto:",
        "feedback-message": "Mensaje:",
        "log-name-pagelang": "Registro de cambios en idiomas",
        "log-description-pagelang": "Este es un registro de los cambios en los idiomas de las páginas.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambió}} el idioma de la página «$3» del $4 al $5.",
-       "default-skin-not-found": "¡Oops! La apariencia por defecto de la wiki (<code>$wgDefaultSkin</code>), <code>$1</code>, no está disponible.\n\nLa instalación parece poseer las siguientes opciones de apariencia. Por favor revise [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] para mayor información sobre cómo configurarla y seleccionar la apariencia por defecto.\n\n$2\n\n; Si acaba de instalar MediaWiki:\n: Probablemente la haya instalado desde git, o directamente desde el código fuente usando algún otro método. Esto es lo esperado. Intente instalar algunos sets de apariencia desde [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory]:\n:* Descargando [https://www.mediawiki.org/wiki/Download el instalador tarball], el cual contiene varios sets de apariencia y extensiones. Puede copiar y pegar el directorio <code>skins/</code> desde ahi.\n:* Clonando uno de los repositorios en <code>mediawiki/skins/*</code> via git dentro del directorio <code>skins/</code> de su instaación de MediaWiki.\n: Haciendo esto no debería interferir con su repositorio git si usted es un desarrollador de MediaWiki.\n\n; Si acaba de actualizar MediaWiki:\n: MediaWiki 1.24 y versiones posteriores ya no tiene habilitada la actualización de apariencia (revise [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Puede pegar las siguientes lineas <code>LocalSettings.php</code> para habilitar todos los sets de apariencia que haya configurado:\n\n<pre>$3</pre>\n\n; Si acaba de modificar <code>LocalSettings.php</code>:\n: Compruebe detenidamente posibles errores tipográficos en los nombres de los sets de apariencias.",
+       "default-skin-not-found": "¡Oops! La apariencia predeterminada de la wiki, definida en <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, no está disponible.\n\nLa instalación parece poseer las siguientes apariencias. Revisa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Configuración de apariencias] para mayor información sobre cómo configurar y seleccionar la apariencia predeterminada.\n\n$2\n\n; Si acabas de instalar MediaWiki:\n: Probablemente la hayas instalado desde git, o directamente desde el código fuente usando algún otro método. Esto es lo esperado. Intenta instalar algunas apariencias desde [https://www.mediawiki.org/wiki/Category:All_skins el directorio de apariencias de mediawiki.org] ya sea:\n:* Descargando [https://www.mediawiki.org/wiki/Download el instalador tarball], el cual contiene varias apariencias y extensiones. Puedes copiar y pegar el directorio <code>skins/</code> desde ahí.\n:* Clonando uno de los repositorios en <code>mediawiki/skins/*</code> via git dentro del directorio <code dir=\"ltr\">skins/</code> de tu instalación de MediaWiki.\n: Hacer esto no debería interferir con tu repositorio git si eres un desarrollador de MediaWiki.\n\n; Si acabas de actualizar MediaWiki:\n: MediaWiki 1.24 y versiones posteriores ya no tiene habilitada la actualización de apariencia (revisa [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Puedes pegar las siguientes líneas en <code>LocalSettings.php</code> para habilitar todas las apariencias instaladas:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si acabas de modificar <code>LocalSettings.php</code>:\n: Comprueba detenidamente posibles errores tipográficos en los nombres de las apariencias.",
+       "default-skin-not-found-no-skins": "¡Vaya! La apariencia predeterminada de tu wiki, definida en <code>$wgDefaultSkin</code> como <code>$1</code>, no está disponible.\n\nNo tienes apariencias instaladas.\n\n; Si has instalado o actualizado MediaWiki recientemente:\n: Probablemente has instalado desde git, o directamente desde el código fuente usando algún otro método. Esto es lo esperado. MediaWiki 1.24 y versiones posteriores no incluyen ninguna apariencia en el repositorio principal. Trata de instalar algunas apariencias desde el [https://www.mediawiki.org/wiki/Category:All_skins directorio de apariencias de mediawiki.org], siguiendo el siguiente procedimiento:\n:* Descarga el [https://www.mediawiki.org/wiki/Download instalador tarball], que viene con varias apariencias y extensiones. Puedes copiar y pegar el directorio <code>skins/</code> desde ahí.\n:* Clonando alguno de los repositorios en <code>mediawiki/skins/*</code> usando git en el directorio <code dir=\"ltr\">skins/</code> de tu instalación de MediaWiki.\n: Hacer esto no debería interferir con tu repositorio de MediaWiki si eres un desarrollador de MediaWiki. Revisa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Configuración de apariencias] para información sobre cómo habilitar las apariencias y seleccionar la predeterminada.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activado)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desactivado''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desactivado''')",
+       "mediastatistics": "Estadísticas de multimedia",
+       "mediastatistics-summary": "Estadísticas sobre los tipos de archivos cargados. Sólo se incluyen las versiones más recientes. Los archivos antiguos o eliminados están excluidos.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 ''byte''|$1 ''bytes''}} ($2; $3 %)",
+       "mediastatistics-table-mimetype": "Tipo MIME",
+       "mediastatistics-table-extensions": "Extensiones posibles",
+       "mediastatistics-table-count": "Número de archivos",
+       "mediastatistics-table-totalbytes": "Tamaño combinado",
+       "mediastatistics-header-unknown": "Desconocido",
+       "mediastatistics-header-bitmap": "Imágenes de mapa de bits",
+       "mediastatistics-header-drawing": "Dibujos (imágenes vectoriales)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Vídeos",
+       "mediastatistics-header-multimedia": "Multimedia enriquecida",
+       "mediastatistics-header-office": "Oficina",
+       "mediastatistics-header-text": "Textual",
+       "mediastatistics-header-executable": "Ejecutables",
+       "mediastatistics-header-archive": "Formatos comprimidos",
+       "json-error-unknown": "Ocurrió un problema con el código JSON. Error: $1",
+       "json-error-state-mismatch": "JSON no válido o con formato incorrecto",
+       "json-error-ctrl-char": "Error de carácter de control, posiblemente codificada incorrectamente",
+       "json-error-syntax": "Error de sintaxis",
+       "json-error-utf8": "Los caracteres UTF-8 tienen errores de formato; probablemente la codificación es incorrecta.",
+       "json-error-inf-or-nan": "Hay uno o más valores «NAN» o «INF» en el valor que se codificará",
+       "json-error-unsupported-type": "Se proporcionó un valor en un tipo que no se puede codificar"
 }
index aeabc65..bfe82f4 100644 (file)
        "category-file-count": "{{PLURAL:$2|Selles kategoorias on ainult järgmine fail.|{{PLURAL:$1|Järgmine fail |Järgmised $1 faili}} on selles kategoorias (kokku $2).}}",
        "category-file-count-limited": "{{PLURAL:$1|Järgmine fail|Järgmised $1 faili}} on selles kategoorias.",
        "listingcontinuesabbrev": "jätk",
-       "index-category": "Indeksiga leheküljed",
+       "index-category": "Indekseeritud leheküljed",
        "noindex-category": "Indekseerimata leheküljed",
        "broken-file-category": "Katkiste pildilinkidega leheküljed",
        "about": "Tiitelandmed",
        "otherlanguages": "Teistes keeltes",
        "redirectedfrom": "(Ümber suunatud leheküljelt $1)",
        "redirectpagesub": "Ümbersuunamisleht",
+       "redirectto": "Ümber suunatud lehekülje:",
        "lastmodifiedat": "Viimane muutmine: $2, $1",
        "viewcount": "Seda lehekülge on külastatud {{PLURAL:$1|üks kord|$1 korda}}.",
        "protectedpage": "Kaitstud lehekülg",
        "jumptosearch": "otsi",
        "view-pool-error": "Serverid on hetkel üle koormatud.\nLiiga palju kasutajaid üritab seda lehte vaadata.\nPalun oota hetk, enne kui uuesti proovid.\n\n$1",
        "generic-pool-error": "Kahjuks on serverid praegu üle koormatud.\nLiiga palju kasutajaid proovivad seda ressurssi vaadata.\nPalun oota natuke, enne kui proovid uuesti selle ressursi juurde pääseda.",
+       "pool-timeout": "Ajalõpp luku ootamisel",
+       "pool-queuefull": "Protsessikogumi järjekord on täis.",
        "pool-errorunknown": "Teadmata tõrge",
+       "pool-servererror": "Protsessikogumi loendurteenus pole saadaval ($1).",
        "aboutsite": "{{GRAMMAR:genitive|{{SITENAME}}}} tiitelandmed",
        "aboutpage": "Project:Tiitelandmed",
        "copyright": "Sisu on kasutatav litsentsi $1 tingimustel, kui pole öeldud teisiti.",
        "badarticleerror": "Seda toimingut ei saa sellel leheküljel sooritada.",
        "cannotdelete": "Lehekülge või faili \"$1\" ei saa kustutada.\nVõimalik, et keegi on selle juba kustutanud.",
        "cannotdelete-title": "Lehekülge \"$1\" ei saa kustutada",
+       "delete-hook-aborted": "Haak katkestas kustutamise.\nSeletust pole toodud.",
        "no-null-revision": "Lehekülje \"$1\" nullredaktsiooni ei õnnestunud teha.",
        "badtitle": "Vigane pealkiri",
        "badtitletext": "Soovitud lehekülje pealkiri oli vigane, tühi või teisest keeleversioonist või vikist valesti lingitud.\nSee võib sisaldada ühte või enamat märki, mida ei saa pealkirjades kasutada.",
        "welcomecreation-msg": "Sinu konto on loodud.\nÄra unusta seada oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|eelistusi]].",
        "yourname": "Kasutajanimi:",
        "userlogin-yourname": "Kasutajanimi",
-       "userlogin-yourname-ph": "Sisesta oma kasutajanimi",
+       "userlogin-yourname-ph": "Sisesta kasutajanimi",
        "createacct-another-username-ph": "Sisesta kasutajanimi",
        "yourpassword": "Parool:",
        "userlogin-yourpassword": "Parool",
-       "userlogin-yourpassword-ph": "Sisesta oma parool",
+       "userlogin-yourpassword-ph": "Sisesta parool",
        "createacct-yourpassword-ph": "Sisesta parool",
        "yourpasswordagain": "Sisesta parool uuesti:",
        "createacct-yourpasswordagain": "Parooli kinnitus",
        "yourdomainname": "Sinu domeen:",
        "password-change-forbidden": "Selles vikis ei saa paroole muuta.",
        "externaldberror": "Esines autentimistõrge või sul pole õigust konto andmeid muuta.",
-       "login": "Logi sisse",
+       "login": "Sisselogimine",
        "nav-login-createaccount": "Logi sisse või registreeru kasutajaks",
        "userlogin": "Sisselogimine või kasutajakonto loomine",
        "userloginnocreate": "Sisselogimine",
        "userlogin-joinproject": "Ühine projektiga {{SITENAME}}",
        "nologin": "Kas sul pole kontot? $1.",
        "nologinlink": "Registreeru siin",
-       "createaccount": "Loo uus konto",
+       "createaccount": "Konto loomine",
        "gotaccount": "Kui sul on juba konto, '''$1'''.",
        "gotaccountlink": "logi sisse",
        "userlogin-resetlink": "Kas oled unustanud oma sisselogimisandmed?",
        "userlogin-createanother": "Loo teine konto",
        "createacct-emailrequired": "E-posti aadress",
        "createacct-emailoptional": "E-posti aadress (valikuline)",
-       "createacct-email-ph": "Sisesta oma e-posti aadress",
+       "createacct-email-ph": "Sisesta e-posti aadress",
        "createacct-another-email-ph": "Sisesta e-posti aadress",
        "createaccountmail": "Kasuta juhuslikku parooli ja saada see määratud e-posti aadressile",
        "createacct-realname": "Pärisnimi (valikuline)",
        "createacct-reason-ph": "Miks lood teist kontot?",
        "createacct-captcha": "Turvakontroll",
        "createacct-imgcaptcha-ph": "Sisesta ülalnähtav tekst",
-       "createacct-submit": "Loo oma konto",
+       "createacct-submit": "Loo konto",
        "createacct-another-submit": "Loo teine konto",
        "createacct-benefit-heading": "{{SITENAME}} on sinusuguste inimeste tehtud.",
        "createacct-benefit-body1": "{{PLURAL:$1|muudatus|muudatust}}",
        "createaccount-text": "Keegi on loonud {{GRAMMAR:illative|{{SITENAME}}}} ($4) sinu e-posti aadressile vastava kasutajatunnuse \"$2\". Parooliks seati \"$3\". Logi sisse ja muuda oma parool.\n\nKui kasutajakonto loomine on eksitus, võid käesolevat sõnumit lihtsalt eirata.",
        "login-throttled": "Oled lühikese aja jooksul proovinud liiga palju kordi sisse logida.\nPalun oota $1, enne kui uuesti proovid.",
        "login-abort-generic": "Sisselogimine ebaõnnestus – Katkestatud",
+       "login-migrated-generic": "Sinu konto on migreeritud ja sinu kasutajanime pole enam selles vikis.",
        "loginlanguagelabel": "Keel: $1",
        "suspicious-userlogout": "Sinu väljalogimiskatse nurjus, sest see näis olevat katkise veebilehitseja või puhverserveri saadetud.",
        "createacct-another-realname-tip": "Tegelik nimi on valikuline.\nKui otsustad selle sisestada, kasutatakse seda kasutaja töö temale omistamiseks.",
        "passwordreset-emailsent-capture": "E-kirjatsi on saadetud allpool näidatav parooli lähtestuskiri.",
        "passwordreset-emailerror-capture": "Koostati allpool näidatav parooli lähtestuskiri, aga selle e-kirjatsi {{GENDER:$2|kasutajale}} saatmine ebaõnnestus: $1",
        "changeemail": "E-posti aadressi muutmine",
-       "changeemail-header": "Konto e-posti aadressi muutmine",
        "changeemail-text": "Täida see vorm, et muuta oma e-posti aadress. Et seda muudatust kinnitada, pead sisestama oma parooli.",
        "changeemail-no-info": "Otselingi kaudu sellele lehele jõudmiseks pead olema sisse loginud.",
        "changeemail-oldemail": "Praegune e-posti aadress:",
        "changeemail-none": "(puudub)",
        "changeemail-password": "Sinu parool {{GRAMMAR:inessive|{{SITENAME}}}}:",
        "changeemail-submit": "Muuda e-posti aadress",
-       "changeemail-cancel": "Loobu",
        "changeemail-throttled": "Oled proovinud liiga palju kordi sisse logida.\nPalun oota $1, enne kui uuesti proovid.",
        "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.",
        "showpreview": "Näita eelvaadet",
        "showdiff": "Näita muudatusi",
        "blankarticle": "<strong>Hoiatus:</strong> Lehekülg, mida alustad, on tühi.\nKui klõpsad uuesti \"{{int:savearticle}}\", luuakse lehekülg ilma sisuta.",
-       "anoneditwarning": "'''Hoiatus:''' Sa pole sisse logitud.\nSelle lehe redigeerimislogisse salvestatakse su IP-aadress.",
+       "anoneditwarning": "<strong>Hoiatus:</strong> Sa pole sisse logitud. Sinu IP-aadress on kõigile nähtav, kui muudatusi teed. Kui <strong>[$1 logid sisse]</strong> või <strong>[$2 lood konto]</strong>, siis teiste eeliste seas omistatakse sinu muudatused sulle kasutajanime järgi.",
        "anonpreviewwarning": "''Sa pole sisse logitud. Selle lehe redigeerimislogisse salvestatakse su IP-aadress.''",
        "missingsummary": "'''Meeldetuletus:''' Sa ei ole lisanud muudatuse resümeed.\nKui vajutad uuesti salvestamise nupule, salvestatakse muudatus ilma resümeeta.",
        "missingcommenttext": "Palun sisesta siit allapoole kommentaar.",
        "session_fail_preview_html": "'''Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.'''\n\n''Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud, on eelvaade JavaScripti-rünnakute vastase ettevaatusabinõuna peidetud.''\n\n'''Kui see on õigustatud redigeerimiskatse, proovi palun uuesti.'''\nKui see ikka ei tööta, proovi [[Special:UserLogout|välja]] ja tagasi sisse logida.",
        "token_suffix_mismatch": "'''Muudatus lükati tagasi, kuna sinu klienttarkvara ei suuda õigesti kirjavahemärke kasutada.'''\nMuudatus lükati tagasi, et vältida lehekülje segiminekut.\nSee juhtub mõnikord siis, kui kasutatakse vigast veebipõhist anonüümsusserverit.",
        "edit_form_incomplete": "'''Redigeerimisvormi mõni osa ei jõudnud serverisse; kontrolli, kas sinu tehtud muudatused on alles, ja proovi uuesti.'''",
-       "editing": "Muutmisel on $1",
-       "creating": "Alustamisel on $1",
-       "editingsection": "Muutmisel on osa leheküljest $1",
+       "editing": "Muutmisel on \"$1\"",
+       "creating": "Alustamisel on \"$1\"",
+       "editingsection": "Muutmisel on osa leheküljest \"$1\"",
        "editingcomment": "Muutmisel on $1 (uus alaosa)",
        "editconflict": "Redigeerimiskonflikt: $1",
        "explainconflict": "Keegi teine on muutnud seda lehekülge pärast seda, kui sina seda redigeerima hakkasid.\nÜlemine toimetamiskast sisaldab teksti viimast versiooni.\nSinu muudatused on alumises kastis.\nSul tuleb need viimasesse versiooni üle viia.\nKui klõpsad nupule \"{{int:savearticle}}\", salvestub '''ainult''' ülemises toimetamiskastis olev tekst.",
        "expansion-depth-exceeded-category": "Ületatud hõrendussügavusega leheküljed",
        "expansion-depth-exceeded-category-desc": "Lehekülg ületab hõrendussügavuse ülemmäära.",
        "expansion-depth-exceeded-warning": "Lehekülg ületas hõrendussügavuse.",
+       "parser-unstrip-loop-warning": "''Unstrip''-funktsiooni silmus tuvastatud",
+       "parser-unstrip-recursion-limit": "''Unstrip''-funktsioonis rekursiooni piirmäär ületatud ($1)",
        "converter-manual-rule-error": "Tõrge keelevariandi käsivahetusreeglis",
        "undo-success": "Selle redaktsiooni käigus tehtud muudatusi saab eemaldada. Palun kontrolli allolevat võrdlust veendumaks, et tahad need muudatused tõepoolest eemaldada. Seejärel saad lehekülje salvestada.",
        "undo-failure": "Muudatust ei saa vahapeal tehtud redigeerimiste tõttu tühistada.",
        "shown-title": "Näita lehekülje kohta $1 {{PLURAL:$1|tulemus|tulemust}}",
        "viewprevnext": "Näita ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Lehekülg pealkirjaga \"[[:$1]]\" on olemas.'''",
-       "searchmenu-new": "<strong>Loo lehekülg pealkirjaga \"[[:$1]]\".</strong> {{PLURAL:$2|0=|Vaata ka leitud lehekülge.|Vaata ka leitud otsitulemusi.}}",
+       "searchmenu-new": "<strong>Alusta lehekülge \"[[:$1]]\".</strong> {{PLURAL:$2|0=|Vaata ka leitud lehekülge.|Vaata ka leitud otsitulemusi.}}",
        "searchprofile-articles": "Sisuleheküljed",
        "searchprofile-images": "Multimeedia",
        "searchprofile-everything": "Kõik",
        "searchall": "kõik",
        "showingresults": "Allpool näidatakse '''{{PLURAL:$1|ühte|$1}}''' tulemust alates '''$2'''. tulemusest.",
        "showingresultsinrange": "Allpool näidatakse {{PLURAL:$1|<strong>üht</strong>|<strong>$1</strong>}} tulemust vahemikus <strong>$2</strong>–<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|'''$1''' '''$3'''-st vastest|Vasted '''$1–$2''' '''$3'''-st}} päringule '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|<strong>$1</strong>. tulemus <strong>$3</strong>-st|Tulemused <strong>$1–$2</strong> <strong>$3</strong>-st}}",
        "search-nonefound": "Päringule ei leitud vasteid.",
        "powersearch-legend": "Täpsem otsing",
        "powersearch-ns": "Otsing nimeruumidest:",
        "prefs-namespaces": "Nimeruumid",
        "default": "vaikeväärtus",
        "prefs-files": "Failid",
-       "prefs-custom-css": "kohandatud CSS",
-       "prefs-custom-js": "kohandatud JS",
-       "prefs-common-css-js": "Kõigi kujunduste ühine CSS/JS:",
+       "prefs-custom-css": "Kohandatud CSS",
+       "prefs-custom-js": "Kohandatud JavaScript",
+       "prefs-common-css-js": "Kõigi kujunduste ühine CSS/JavaScript:",
        "prefs-reset-intro": "Sellel leheküljel saad oma eelistused lähtestada võrgukoha vaike-eelistusteks.\nToimingut ei saa hiljem tühistada.",
        "prefs-emailconfirm-label": "E-posti kinnitus:",
        "youremail": "E-posti aadress:",
        "prefs-tokenwatchlist": "Luba",
        "prefs-diffs": "Erinevused",
        "prefs-help-prefershttps": "See eelistus jõustub pärast järgmist sisselogimist.",
+       "prefswarning-warning": "Oled teinud eelistustes muudatusi, mida pole veel salvestatud.\nKui lahkud sellelt leheküljelt ilma nupul \"$1\" klõpsamata, jäävad kehtima senised eelistused.",
        "prefs-tabs-navigation-hint": "Spikker: Kaardiloendis toodud kaartide vahel liikumiseks saad kasutada vasakut ja paremat nooleklahvi.",
        "email-address-validity-valid": "Sobiv e-posti aadress",
        "email-address-validity-invalid": "Sisesta sobiv e-posti aadress.",
        "backend-fail-read": "Faili $1 ei saa lugeda.",
        "backend-fail-create": "Faili $1 ei saa kirjutada.",
        "backend-fail-maxsize": "Faili $1 ei saa kirjutada, sest see on {{PLURAL:$2|ühest baidist|$2 baidist}} suurem.",
+       "backend-fail-readonly": "Tagamälu \"$1\" on praegu kirjutuskaitstud. Põhjus: \"<em>$2</em>\"",
+       "backend-fail-synced": "Faili \"$1\" olek sisemälus on ühtimatu.",
+       "backend-fail-connect": "Ühendus tagamäluga \"$1\" ebaõnnestus.",
+       "backend-fail-internal": "Tagamälus \"$1\" esines tundmatu tõrge.",
        "backend-fail-contenttype": "Faili, mida soovitakse talletada asukohas \"$1\", sisutüüpi saanud kindlaks teha.",
+       "backend-fail-batchsize": "Tagamällu edastati {{PLURAL:$1|ühest|$1}} failioperatsioonist koosnev pakk; ülemmäär on {{PLURAL:$2|üks operatsioon|$2 operatsiooni}}.",
        "backend-fail-usable": "Faili $1 ei saa ebapiisavate õiguste või puuduvate kataloogide/konteinerite tõttu lugeda ega kirjutada.",
+       "filejournal-fail-dbconnect": "Tagamälus \"$1\" ebaõnnestus ühendumine päevikuga.",
+       "filejournal-fail-dbquery": "Tagamälus \"$1\" ebaõnnestus päeviku värskendamine.",
        "lockmanager-notlocked": "Rada \"$1\" ei saa lukust lahti teha, sest see pole lukus.",
        "lockmanager-fail-closelock": "Raja \"$1\" lukustusfaili ei saa sulgeda.",
        "lockmanager-fail-deletelock": "Raja \"$1\" lukustusfaili ei saa kustutada.",
+       "lockmanager-fail-acquirelock": "Ressursi \"$1\" luku hankimine ebaõnnestus.",
        "lockmanager-fail-openlock": "Raja \"$1\" lukustusfaili ei saa avada.",
+       "lockmanager-fail-releaselock": "Ressursi \"$1\" lukku ei õnnestunud vabastada.",
+       "lockmanager-fail-db-bucket": "Komplektis $1 ei õnnestunud saada ühendust piisavalt paljude lukustusandmebaasidega.",
+       "lockmanager-fail-db-release": "Andmebaasis $1 ei õnnestunud lukke vabastada.",
+       "lockmanager-fail-svr-acquire": "Serveris $1 ei õnnestunud lukke hankida.",
+       "lockmanager-fail-svr-release": "Serveris $1 ei õnnestunud lukke vabastada.",
        "zip-file-open-error": "Faili avamisel ZIP-kontrolliks tekkis tõrge.",
        "zip-wrong-format": "Valitud fail ei ole ZIP-fail.",
        "zip-bad": "See ZIP-fail on kas rikutud või muul põhjusel loetamatu.\nSelle turvalisust ei saa kontrollida.",
        "randomincategory": "Juhuslik lehekülg kategoorias",
        "randomincategory-invalidcategory": "\"$1\" pole sobiv kategooria nimi.",
        "randomincategory-nopages": "Kategoorias \"[[:Category:$1|$1]]\" puuduvad leheküljed.",
-       "randomincategory-selectcategory": "Hangi juhuslik lehekülg kategooriast: $1 $2.",
-       "randomincategory-selectcategory-submit": "Mine",
+       "randomincategory-category": "Kategooria:",
+       "randomincategory-legend": "Juhuslik lehekülg kategoorias",
        "randomredirect": "Juhuslik ümbersuunamine",
        "randomredirect-nopages": "Nimeruumis \"$1\" ei ole ümbersuunamislehekülgi.",
        "statistics": "Arvandmestik",
        "querypage-disabled": "See erilehekülg on keelatud, et jõudlust hoida.",
        "booksources": "Raamatuotsimine",
        "booksources-search-legend": "Raamatuotsimine",
-       "booksources-go": "Mine",
+       "booksources-search": "Otsi",
        "booksources-text": "Allpool on linke teistele lehekülgedele, kus müüakse uusi ja kasutatud raamatuid. Lehekülgedel võib olla ka lisainfot raamatute kohta:",
        "booksources-invalid-isbn": "Antud ISBN-number ei ole korrektne; kontrolli algallikast kopeerides vigu.",
        "specialloguserlabel": "Täitja:",
        "wlheader-enotif": "E-posti teel teavitamine on lubatud.",
        "wlheader-showupdated": "Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
        "wlnote": "Allpool on {{PLURAL:$1|viimane muudatus|viimased <strong>$1</strong> muudatust}} viimase {{PLURAL:$2|tunni|<strong>$2</strong> tunni}} jooksul seisuga $3, kell $4.",
-       "wlshowlast": "Näita viimast $1 tundi $2 päeva. $3",
+       "wlshowlast": "Näita viimast $1 tundi $2 päeva.",
        "watchlist-options": "Jälgimisloendi seaded",
        "watching": "Jälgimine...",
        "unwatching": "Jälgimise lõpetamine...",
        "exbeforeblank": "sisu enne lehekülje tühjendamist: '$1'",
        "delete-confirm": "Lehekülje \"$1\" kustutamine",
        "delete-legend": "Kustutamine",
-       "historywarning": "'''Hoiatus:''' Kustutataval leheküljel on ligikaudu {{PLURAL:$1|ühe redaktsiooniga|$1 redaktsiooniga}} ajalugu:",
+       "historywarning": "<strong>Hoiatus:</strong> Kustutataval leheküljel on {{PLURAL:$1|ühe redaktsiooniga|$1 redaktsiooniga}} ajalugu:",
        "confirmdeletetext": "Sa oled andmebaasist kustutamas lehekülge koos kogu tema ajalooga.\nPalun kinnita, et tahad seda tõepoolest teha, et sa mõistad tagajärgi ja et sinu tegevus on kooskõlas siinse [[{{MediaWiki:Policy-url}}|sisekorraga]].",
        "actioncomplete": "Toiming sooritatud",
        "actionfailed": "Toiming ebaõnnestus",
        "delete-edit-reasonlist": "Redigeeri kustutamise põhjuseid",
        "delete-toobig": "See lehekülg on pika redigeerimisajalooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}.\nSelle kustutamine on keelatud, et ära hoida ekslikku {{GRAMMAR:genitive|{{SITENAME}}}} töö häirimist.",
        "delete-warning-toobig": "See lehekülg on pika redigeerimislooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}.\nEttevaatust, selle kustutamine võib esile kutsuda häireid {{GRAMMAR:genitive|{{SITENAME}}}} andmebaasi töös.",
-       "delete-cantedit": "Seda lehekülge ei saa kustutada, kuna sul pole õigust seda redigeerida.",
+       "deleteprotected": "Seda lehekülge ei saa kustutada, sest see on kaitstud.",
        "deleting-backlinks-warning": "'''Hoiatus:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Teised leheküljed]] viitavad leheküljele, mida oled kustutamas, või see lehekülg on kasutuses mallina.",
        "rollback": "Tühista muudatused",
        "rollback_short": "Tühista",
        "protect-othertime": "Muu aeg:",
        "protect-othertime-op": "muu aeg",
        "protect-existing-expiry": "Kehtiv aegumisaeg: $2 kell $3",
+       "protect-existing-expiry-infinity": "Kehtiv aegumisaeg: igavene",
        "protect-otherreason": "Muu või täiendav põhjus:",
        "protect-otherreason-op": "Muu põhjus",
        "protect-dropdown": "*Tavalised kaitsmise põhjused\n** Liigne vandalism\n** Liigne rämpspostitamine\n** Redigeerimissõja pidamine\n** Suure liiklusega lehekülg",
        "unblocked": "Kasutaja [[User:$1|$1]] blokeering on eemaldatud",
        "unblocked-range": "Vahemiku $1 blokeering on eemaldatud",
        "unblocked-id": "Blokeerimine $1 on lõpetatud",
+       "unblocked-ip": "IP-aadressi [[Special:Contributions/$1|$1]] blokeering on eemaldatud.",
        "blocklist": "Blokeeritud kasutajad",
        "ipblocklist": "Blokeeritud kasutajad",
        "ipblocklist-legend": "Leia blokeeritud kasutaja",
        "lockfilenotwritable": "Andmebaasi lukufail ei ole kirjutatav.\nAndmebaasi lukustamiseks ja avamiseks peavad veebiserveril olema sellele kirjutusõigused.",
        "databasenotlocked": "Andmebaas ei ole lukustatud.",
        "lockedbyandtime": "(lukustas $1; $2, kell $3)",
-       "move-page": "Teisalda $1",
+       "move-page": "Lehekülje \"$1\" teisaldamine",
        "move-page-legend": "Lehekülje teisaldamine",
        "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.",
        "import": "Lehekülgede import",
        "importinterwiki": "Vikidevaheline import",
        "import-interwiki-text": "Vali importimiseks viki ja lehekülje pealkiri.\nRedigeerimisajad ja kaastööliste nimed säilitatakse.\nKõik vikidevahelised toimingud on [[Special:Log/import|impordilogis]].",
-       "import-interwiki-source": "Lähteviki/lehekülg:",
+       "import-interwiki-sourcewiki": "Lähteviki:",
+       "import-interwiki-sourcepage": "Alliklehekülg:",
        "import-interwiki-history": "Kopeeri selle lehekülje kogu ajalugu",
        "import-interwiki-templates": "Liida kõik mallid",
        "import-interwiki-submit": "Impordi",
        "import-error-interwiki": "Lehekülge \"$1\" ei imporditud, sest selle pealkirja hoitakse välislinkide (interviki) jaoks.",
        "import-error-special": "Lehekülge \"$1\" ei imporditud, sest see kuulub erinimeruumi, kus pole leheküljed lubatud.",
        "import-error-invalid": "Lehekülge \"$1\" ei imporditud, sest pealkiri, mille alla see siin toodaks, on vigane.",
+       "import-error-unserialize": "Lehekülje \"$1\" jadastatud redaktsiooni $2 ei õnnestunud tagasi muundada. Teate järgi kasutas redaktsioon vormingus $4 jadastatud sisumudelit $3.",
        "import-error-bad-location": "Redaktsiooni $2 sisumudeliga $3 ei saa talletada siin vikis leheküljel \"$1\", mis seda mudelit ei toeta.",
        "import-options-wrong": "{{PLURAL:$2|Vale valik|Valed valikud}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Etteantud juurlehekülje pealkiri on vigane.",
        "exif-urgency-low": "Madal ($1)",
        "exif-urgency-high": "Kõrge ($1)",
        "exif-urgency-other": "Kasutaja määratud tähtsus ($1)",
-       "watchlistall2": "Näita kõiki",
        "namespacesall": "kõik",
        "monthsall": "kõik",
        "confirmemail": "E-posti aadressi kinnitamine",
        "version-ext-colheader-credits": "Autorid",
        "version-license-title": "Tarkvaralisa $1 litsents",
        "version-license-not-found": "Selle lisa kohta ei leitud üksikasjalikku litsentsiteavet.",
-       "version-credits-title": "Tarkvaralisa $1 tegijad",
+       "version-credits-title": "Tarkvarakomponendi $1 tegijad",
        "version-credits-not-found": "Selle lisa tegijate kohta ei leitud üksikasjalikku teavet.",
        "version-poweredby-credits": "See viki kasutab '''[https://www.mediawiki.org/ MediaWiki]''' tarkvara. Autoriõigus © 2001–$1 $2.",
        "version-poweredby-others": "teised",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|laadis üles}} uue versiooni failist $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|laadis üles}} faili $3",
        "rightsnone": "(puudub)",
+       "revdelete-summary": "resümee",
        "feedback-bugornote": "Kui arvad, et oskad tehnilist probleemi üksikasjalikult kirjeldada, [$1 teata veast].\nKui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajanime ja teabega kasutatava võrgulehitsejaga kohta leheküljele \"[$3 $2]\".",
        "feedback-subject": "Teema:",
        "feedback-message": "Sõnum:",
        "action-pagelang": "muuta lehekülje keelt",
        "log-name-pagelang": "Keele muutmise logi",
        "log-description-pagelang": "Siia on logitud lehekülgede keele muutmised.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|muutis}} lehekülje \"$3\" keelt: $4 → $5."
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|muutis}} lehekülje \"$3\" keelt: $4 → $5.",
+       "default-skin-not-found": "Oih! Sinu viki vaikekujundus, milleks muutuja <code dir=\"ltr\">$wgDefaultSkin</code> järgi on <code>$1</code>, pole saadaval.\n\nPaistab, et sinu install sisaldab järgmisi kujundusi. Vaata [https://www.mediawiki.org/wiki/Manual:Skin_configuration kujunduste häälestusjuhendist], kuidas neid lubada ja kuidas valida vaikekujundus.\n\n$2\n\n; Kui oled MediaWiki just paigaldanud:\n: Paigaldasid tarkvara ilmselt Giti kaudu või otse lähtekoodist või mõnel muul viisil. See on ootuspärane. Proovi [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-i kujunduste kataloogist] mõni kujundus paigaldada. Selleks saad:\n:* laadida alla [https://www.mediawiki.org/wiki/Download lintarhiivi paigaldaja], mis sisaldab mitut kujundust ja tarkvaralisa. Saad sealt kleepimiseks kopeerida kausta <code dir=\"ltr\">skins/</code>;\n:* kopeerida Giti kaudu ühe hoidla (<code>mediawiki/skins/*</code>) oma MediaWiki installi kausta <code>skins/</code>.\n: Selle tegemine ei tohiks häirida Giti hoidlat, kui oled MediaWiki arendaja.\n\n; Kui oled MediaWikit just täiendanud:\n: MediaWiki 1.24-s ja uuemates versioonides pole paigaldatud kujundused enam automaatselt lubatud (vaata juhendist [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery kujunduste automaatse leidmise] kohta). Saad kleepida järgmised read leheküljele <code>LocalSettings.php</code>, et lubada kõik praegu paigaldatud kujundused:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Kui oled lehekülge <code>LocalSettings.php</code> just muutnud:\n: Kontrolli üle, ega kujunduste nimedes pole trükivigu.",
+       "default-skin-not-found-no-skins": "Oih! Sinu viki vaikekujundus, milleks muutuja <code dir=\"ltr\">$wgDefaultSkin</code> järgi on <code>$1</code>, pole saadaval.\n\nÜhtegi kujundust pole paigaldatud.\n\n; Kui oled MediaWiki just paigaldanud või täiendasid seda:\n: Paigaldasid tarkvara ilmselt Giti kaudu või otse lähtekoodist või mõnel muul viisil. See on ootuspärane. MediaWiki 1.24 ja uuemad versioonid ei sisalda peahoidlas ühtegi kujundust. Proovi [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-i kujunduste kataloogist] mõni kujundus paigaldada. Selleks saad:\n:* laadida alla [https://www.mediawiki.org/wiki/Download lintarhiivi paigaldaja], mis sisaldab mitut kujundust ja tarkvaralisa. Saad sealt kleepimiseks kopeerida kausta <code dir=\"ltr\">skins/</code>;\n:* kopeerida Giti kaudu ühe hoidla (<code>mediawiki/skins/*</code>) oma MediaWiki installi kausta <code>skins/</code>.\n: Selle tegemine ei tohiks häirida Giti hoidlat, kui oled MediaWiki arendaja. Vaata [https://www.mediawiki.org/wiki/Manual:Skin_configuration kujunduste häälestusjuhendist], kuidas kujundusi lubada ja kuidas valida vaikekujundus.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (lubatud)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''keelatud''')",
+       "mediastatistics": "Meediafailide arvandmestik",
+       "mediastatistics-summary": "Arvandmed üles laaditud failitüüpide kohta. See käib ainult failide viimaste versioonide kohta. Vanu ja kustutatud versioone pole arvesse võetud.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bait|$1 baiti}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME tüüp",
+       "mediastatistics-table-extensions": "Võimalikud laiendid",
+       "mediastatistics-table-count": "Failide arv",
+       "mediastatistics-table-totalbytes": "Suurus kokku",
+       "mediastatistics-header-unknown": "Teadmata",
+       "mediastatistics-header-bitmap": "Rasterpildid",
+       "mediastatistics-header-drawing": "Vektorjoonised",
+       "mediastatistics-header-audio": "Helifailid",
+       "mediastatistics-header-video": "Videofailid",
+       "mediastatistics-header-multimedia": "Rikasmeedia failid",
+       "mediastatistics-header-office": "Kontoritarkvara failid",
+       "mediastatistics-header-text": "Tekstifailid",
+       "mediastatistics-header-executable": "Täitmisfailid",
+       "mediastatistics-header-archive": "Tihendatud vormingud",
+       "json-warn-trailing-comma": "$1 lõpukoma eemaldati JSON-ist.",
+       "json-error-unknown": "JSON-iga oli probleem. Tõrge: $1",
+       "json-error-depth": "Suurim võimalik pinusügavus on ületatud.",
+       "json-error-state-mismatch": "Vigane või väärdunud JSON",
+       "json-error-ctrl-char": "Juhtmärgi tõrge; see võib olla valesti kodeeritud",
+       "json-error-syntax": "Süntaksitõrge",
+       "json-error-utf8": "Väärdunud UTF-8 märgid; need võivad olla valesti kodeeritud",
+       "json-error-recursion": "Vähemalt üks rekursiivne viide kodeeritavas väärtuses",
+       "json-error-inf-or-nan": "Vähemalt üks NAN- või INF-väärtus kodeeritavas väärtuses",
+       "json-error-unsupported-type": "Ette tuli tüüp, mille väärtust ei saa kodeerida"
 }
index fa8c288..610001c 100644 (file)
@@ -19,7 +19,8 @@
                        "לערי ריינהארט",
                        "පසිඳු කාවින්ද",
                        "아라",
-                       "Joxemai"
+                       "Joxemai",
+                       "Arkaitz Barnetik"
                ]
        },
        "tog-underline": "Loturak azpimarratu:",
        "hidetoc": "ezkutatu",
        "collapsible-collapse": "Itxi",
        "collapsible-expand": "Zabaldu",
+       "confirmable-yes": "Bai",
+       "confirmable-no": "Ez",
        "thisisdeleted": "$1 ikusi edo leheneratu?",
        "viewdeleted": "$1 ikusi?",
        "restorelink": "{{PLURAL:$1|ezabatutako aldaketa bat|ezabatutako $1 aldaketa}}",
        "passwordreset-emailsent": "Pasahitza berrezartzeko e-posta bidali da.",
        "passwordreset-emailsent-capture": "Pasahitza berrezartzeko e-posta bat bidali dizugu, behean erakusten dena.",
        "changeemail": "Aldatu e-mail helbidea",
-       "changeemail-header": "Aldatu kontuko e-posta helbidea",
        "changeemail-text": "Bete ezazu formulario hau e-posta helbidea aldatzeko. Zure pasahitza sartu beharko duzu aldaketa hau baieztatzeko.",
        "changeemail-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
        "changeemail-oldemail": "Egungo e-mail helbidea:",
        "changeemail-none": "(bat ere ez)",
        "changeemail-password": "Zure {{SITENAME}}ko pasahitza:",
        "changeemail-submit": "E-posta aldatu",
-       "changeemail-cancel": "Utzi",
        "resettokens": "Tokenak berrezarri",
        "resettokens-no-tokens": "Ez dago tokenik berrezartzeko.",
        "resettokens-legend": "Tokenak berrezarri",
        "edit-gone-missing": "Ezin da orria eguneratu. Ezabatu omen dute.",
        "edit-conflict": "Aldaketa gatazka.",
        "edit-no-change": "Zure edizioa baztertu da testua aldatu ez duzulako.",
+       "postedit-confirmation-created": "Orrialdea sortu da.",
+       "postedit-confirmation-restored": "Orrialdea leheneratua izan da.",
        "postedit-confirmation-saved": "Zure aldaketa gorde da.",
        "edit-already-exists": "Ezin izan da orri berria sortu.\nJada existitzen da.",
        "defaultmessagetext": "Testu lehenetsia",
        "searchrelated": "erlazionatua",
        "searchall": "guztia",
        "showingresults": "Jarraian {{PLURAL:$1|emaitza '''1''' ikus daiteke|'''$1''' emaitza ikus daitezke}}, #'''$2'''.etik hasita.",
-       "showingresultsheader": "{{PLURAL:$5|'''$1'''(e)tik '''$3''' emaitza|'''$1 - $2'''(e)tik '''$3''' emaitza}} '''$4'''(r)entzat",
        "search-nonefound": "Ez dago eskaerarekin bat egiten duten emaitzarik.",
        "powersearch-legend": "Bilaketa aurreratua",
        "powersearch-ns": "Bilatu honako izen-tartetan:",
        "rcnotefrom": "Jarraian azaltzen diren aldaketak data honetatik aurrerakoak dira: <b>$2</b> (gehienez <b>$1</b> erakusten dira).",
        "rclistfrom": "Erakutsi $3 $2 ondorengo aldaketa berriak",
        "rcshowhideminor": "$1 aldaketa txikiak",
+       "rcshowhideminor-show": "Erakutsi",
+       "rcshowhideminor-hide": "Ezkutatu",
        "rcshowhidebots": "$1 bot-ak",
-       "rcshowhideliu": "$1 erabiltzaile erregistratuak",
+       "rcshowhidebots-show": "Erakutsi",
+       "rcshowhidebots-hide": "Ezkutatu",
+       "rcshowhideliu": "$1 erregistratutako erabiltzaileak",
+       "rcshowhideliu-show": "Erakutsi",
+       "rcshowhideliu-hide": "Ezkutatu",
        "rcshowhideanons": "$1 erabiltzaile anonimoak",
+       "rcshowhideanons-show": "Erakutsi",
+       "rcshowhideanons-hide": "Ezkutatu",
        "rcshowhidepatr": "$1 patruilatutako aldaketak",
+       "rcshowhidepatr-show": "Erakutsi",
+       "rcshowhidepatr-hide": "Ezkutatu",
        "rcshowhidemine": "$1 nire ekarpenak",
+       "rcshowhidemine-show": "Erakutsi",
+       "rcshowhidemine-hide": "Ezkutatu",
        "rclinks": "Erakutsi azken $2 egunetako $1 aldaketak<br />$3",
        "diff": "ezb",
        "hist": "hist",
        "license-nopreview": "(Aurreikuspenik ez)",
        "upload_source_url": " (baliozko URL publikoa)",
        "upload_source_file": " (zure ordenagailuko fitxategi bat)",
+       "listfiles-delete": "ezabatu",
        "listfiles-summary": "Orri berezi honek igotako fitxategi guztiak erakusten ditu.\nBerez, azken igotako fitxategiak zerrendaren goiko aldean azaltzen dira.",
        "listfiles_search_for": "Irudiaren izenagatik bilatu:",
        "imgfile": "fitxategia",
        "randomincategory": "Kategoriako ausazko orrialdea",
        "randomincategory-invalidcategory": "\"$1\" ez da kategoria izen baliagarri bat.",
        "randomincategory-nopages": "Ez dago orrialderik [[:Category:$1|$1]] kategorian.",
-       "randomincategory-selectcategory": "Lortu kategoria honetako ausazko orrialdea: $1 $2.",
-       "randomincategory-selectcategory-submit": "Joan",
+       "randomincategory-category": "Kategoria:",
        "randomredirect": "Ausazko birbideratzea",
        "randomredirect-nopages": "Ez dago birzuzenketarik \"$1\" izen-tartean.",
        "statistics": "Estatistikak",
        "querypage-disabled": "Orrialde berezi hau desgaituta dago funtzionamendu arrazoiengatik.",
        "booksources": "Iturri liburuak",
        "booksources-search-legend": "Liburuen bilaketa",
-       "booksources-go": "Joan",
        "booksources-text": "Jarraian liburu berri eta erabiliak saltzen dituzten guneetarako loturen zerrenda bat ikus dezakezu, bilatzen ari zaren liburu horientzako informazio gehigarria aurkitzeko lagungarria izan daitekeena:",
        "booksources-invalid-isbn": "Badirudi emandako ISBNa ez dela baliagarria; egiazta ezazu ea akatsik egin duzun jatorrizko iturritik kopiatzean.",
        "specialloguserlabel": "Egilea:",
        "wlheader-enotif": "Posta bidezko ohartarazpena gaituta dago.",
        "wlheader-showupdated": "Bisitatu zenituen azken alditik aldaketak izan dituzten orrialdeak '''beltzez''' nabarmenduta daude.",
        "wlnote": "Jarraian {{PLURAL:$2|ikus daiteke azken orduko|ikus daitezke azken '''$2''' orduetako}} azken {{PLURAL:$1|aldaketa|'''$1''' aldaketak}}, $3, $4 gisa.",
-       "wlshowlast": "Erakutsi azken $1 orduak $2 egunak $3",
+       "wlshowlast": "Erakutsi azken $1 orduak, azken $2 egunak",
        "watchlist-options": "Jarraitze-zerrendaren aukerak",
        "watching": "Zerrendan gehitzen...",
        "unwatching": "Zerrendatik kentzen...",
        "import": "Orrialdeak inportatu",
        "importinterwiki": "Wikien arteko inportazioa",
        "import-interwiki-text": "Aukeratu inportatzeko wiki eta orrialde izenburu bat. Berrikuspenen datak eta egileak gorde egingo dira. Inportazio ekintza guzti hauek [[Special:Log/import|inportazio erregistroan]] gordetzen dira.",
-       "import-interwiki-source": "Jatorrizko wiki/orrialdea:",
        "import-interwiki-history": "Orrialde honen historiako bertsio guztiak kopiatu",
        "import-interwiki-templates": "Txantiloi guztiak sartu",
        "import-interwiki-submit": "Inportatu",
        "exif-urgency-low": "Baxua ($1)",
        "exif-urgency-high": "Altua ($1)",
        "exif-urgency-other": "Definitutako lehentasuna ($1)",
-       "watchlistall2": "guztiak",
        "namespacesall": "guztiak",
        "monthsall": "guztiak",
        "confirmemail": "E-posta helbidea egiaztatu",
        "version-hook-name": "Estentsioaren izena",
        "version-hook-subscribedby": "Hauen harpidetzarekin",
        "version-version": "(Bertsioa $1)",
+       "version-no-ext-name": "[izenik gabe]",
        "version-license": "MediaWiki Lizentzia",
        "version-ext-license": "Lizentzia",
        "version-ext-colheader-name": "Luzapena",
        "logentry-newusers-create": "$1 erabiltzaile kontua sortu da",
        "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua sortu du",
        "rightsnone": "(bat ere ez)",
+       "revdelete-summary": "aldaketaren laburpena",
        "feedback-subject": "Gaia:",
        "feedback-message": "Mezua:",
        "feedback-cancel": "Utzi",
        "expand_templates_remove_comments": "Iruzkinak kendu",
        "expand_templates_remove_nowiki": "Ezabatu <nowiki> etiketen emaitzak",
        "expand_templates_generate_xml": "Erakutsi XML parse zuhaitza",
-       "expand_templates_preview": "Aurreikusi"
+       "expand_templates_preview": "Aurreikusi",
+       "pagelang-language": "Hizkuntza",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 byte}} ($2; %$3)",
+       "mediastatistics-table-count": "Fitxategi kopurua",
+       "mediastatistics-header-video": "Bideoak",
+       "json-error-syntax": "Sintaxi-errorea"
 }
index b4eb8d5..eff139e 100644 (file)
@@ -6,7 +6,8 @@
                        "The Evil IP address",
                        "Urhixidur",
                        "Xuacu",
-                       "아라"
+                       "아라",
+                       "Babanwalia"
                ]
        },
        "tog-underline": "Surrayal atihus:",
        "qbedit": "Eital",
        "qbpageoptions": "Esta páhina",
        "qbmyoptions": "Las mis páhinas",
-       "faq": "FAQ",
+       "faq": "ਆਮ ਸੁਆਲ਼",
        "faqpage": "Project:FAQ",
        "actions": "Acionis",
        "namespaces": "Espáciu nombris",
        "pager-older-n": "{{PLURAL:$1|1 mas antigu|$1 mas antigus}}",
        "booksources": "Huentis de librus",
        "booksources-search-legend": "Landeal huentis de librus",
-       "booksources-go": "Dil",
        "booksources-text": "Embahu se muestra una lista d'atihus a páhinas que vendin librus usaus i nuevus, i ondi pueis alcuentral enhormación al tentu los librus qu'estás landeandu:",
        "specialloguserlabel": "Usuáriu:",
        "speciallogtitlelabel": "Entítulu:",
        "wlheader-enotif": "Se premitin notificacionis pol email.",
        "wlheader-showupdated": "Las páhinas que s'án emburacau dendi la úrtima vezi que las visoreasti son muestrás en '''negrina'''",
        "wlnote": "Embahu {{PLURAL:$1|es el úrtimu chambu|son los úrtimus '''$1''' chambus}} enas úrtimas {{PLURAL:$2|oras|'''$2''' oras}}.",
-       "wlshowlast": "Muestral úrtimus $1 oras $2 dias $3",
+       "wlshowlast": "Muestral úrtimus $1 oras $2 dias",
        "watchlist-options": "Ocionis de la mi lista e seguimientu",
        "watching": "Vehilandu...",
        "unwatching": "Abaldonandu la vehiláncia en...",
        "exif-gpsspeed-n": "Ñus",
        "exif-gpsdirection-t": "Direción verdaera",
        "exif-gpsdirection-m": "Direción manética",
-       "watchlistall2": "tó",
        "namespacesall": "tó",
        "monthsall": "tó",
        "confirmemail": "Confirmal email",
        "revdelete-restricted": "las restricionis a los çahorilis án siu apricás",
        "revdelete-unrestricted": "las restricionis a los çahorilis án siu esborrás",
        "rightsnone": "(dengunu)",
+       "revdelete-summary": "eital sumáriu",
        "expand_templates_preview": "Previsoreal"
 }
index d425390..a56cd54 100644 (file)
                        "Mostafadaneshvar",
                        "Pouyana",
                        "Oldstoneage",
-                       "Omid.koli"
+                       "Omid.koli",
+                       "Alirezaaa",
+                       "Mogoeilor",
+                       "Hosseinblue"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "tog-hideminor": "تغییرات جزئی از فهرست تغییرات اخیر پنهان شوند",
        "tog-hidepatrolled": "ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر پنهان شوند",
        "tog-newpageshidepatrolled": "صفحه‌های گشت‌خورده از فهرست صفحه‌های تازه پنهان شوند",
-       "tog-extendwatchlist": "گسترش فهرست پیگیری‌ها برای نمایش همهٔ تغییرات، نه فقط آخرین‌ها",
-       "tog-usenewrc": "گروه‌بندی تغییرات بر پایهٔ صفحه‌های تغییرات اخیر و فهرست پیگیری‌ها (نیازمند جاوااسکریپت)",
+       "tog-extendwatchlist": "گسترش فهرست پیگیری‌ها برای نمایش همهٔ تغییرات، نه فقط آخرین‌ها",
+       "tog-usenewrc": "گروه‌بندی تغییرات بر پایهٔ صفحات تغییرات اخیر و فهرست پیگیری‌ها",
        "tog-numberheadings": "شماره‌گذاری خودکار عنوان‌ها",
-       "tog-showtoolbar": "نوار ابزار جعبهٔ ویرایش نمایش یابد",
-       "tog-editondblclick": "ویرایش صفحه‌ها با دوکلیک (نیازمند جاوااسکریپت)",
-       "tog-editsectiononrightclick": "امکان ویرایش بخش‌ها با کلیک راست روی عنوان‌های بخش (نیازمند جاوااسکریپت)",
-       "tog-watchcreations": "صفحه‌هایی که می‌سازم و پرونده‌هایی که بارگذاری می‌کنم به فهرست پیگیری‌هایم افزوده شود",
-       "tog-watchdefault": "صفحه‌ها و پرونده‌هایی که ویرایش می‌کنم به فهرست پیگیری‌هایم افزوده شود",
+       "tog-showtoolbar": "نوار ابزار ویرایش نمایش یابد",
+       "tog-editondblclick": "ویرایش صفحات با دو کلیک",
+       "tog-editsectiononrightclick": "فعال‌کردن ویرایش بخش‌ها با کلیک راست روی عنوان بخش‌ها",
+       "tog-watchcreations": "صفحه‌هایی که می‌سازم و پرونده‌هایی که بارگذاری می‌کنم به فهرست پیگیری‌هایم افزوده شود",
+       "tog-watchdefault": "صفحه‌ها و پرونده‌هایی که ویرایش می‌کنم به فهرست پیگیری‌هایم افزوده شود",
        "tog-watchmoves": "صفحه‌ها و پرونده‌هایی که منتقل می‌کنم به فهرست پی‌گیری‌هایم افزوده شود",
-       "tog-watchdeletion": "صفحه‌ها و پرونده‌هایی که حذف می‌کنم به فهرست پی‌گیری‌هایم افزوده شود",
+       "tog-watchdeletion": "صفحات و پرونده‌هایی که حذف می‌کنم به فهرست پی‌گیری‌هایم افزوده شود",
        "tog-watchrollback": "افزودن صفحاتی که واگردانی کردم برای فهرست پیگیری‌هایم",
        "tog-minordefault": "همهٔ ویرایش‌ها به طور پیش‌فرض به عنوان «جزئی» علامت بخورد",
        "tog-previewontop": "پیش‌نمایش قبل از جعبهٔ ویرایش نمایش یابد",
        "category_header": "صفحه‌های ردهٔ «$1»",
        "subcategories": "زیررده‌ها",
        "category-media-header": "پرونده‌های ردهٔ «$1»",
-       "category-empty": "''این رده در حال حاضر حاوی هیچ صفحه یا پرونده‌ای نیست.''",
+       "category-empty": "<em>این رده در حال حاضر حاوی هیچ صفحه یا پرونده‌ای نیست.</em>",
        "hidden-categories": "{{PLURAL:$1|ردهٔ پنهان|رده‌های پنهان}}",
        "hidden-category-category": "رده‌های پنهان",
        "category-subcat-count": "{{PLURAL:$2|این رده تنها حاوی زیرردهٔ زیر است.|{{PLURAL:$1|این زیررده|این $1 زیررده}} در این رده قرار {{PLURAL:$1|دارد|دارند}}؛ این رده در کل حاوی $2 زیررده است.}}",
        "category-file-count": "{{PLURAL:$2|این رده تنها حاوی پروندهٔ زیر است.|{{PLURAL:$1|این پرونده|این $1 پرونده}} در این رده قرار {{PLURAL:$1|دارد|دارند}}؛ این رده در کل حاوی $2 پرونده است.}}",
        "category-file-count-limited": "{{PLURAL:$1|پروندهٔ|$1 پروندهٔ}} زیر در ردهٔ فعلی قرار دارند.",
        "listingcontinuesabbrev": "(ادامه)",
-       "index-category": "صفحه‌های نمایه‌شده",
+       "index-category": "صفحات فهرست‌شده",
        "noindex-category": "صفحه‌های نمایه‌نشده",
-       "broken-file-category": "صفحه‌های دارای پیوند خراب به پرونده",
+       "broken-file-category": "صفحات دارای پیوند خراب به پرونده",
        "about": "درباره",
        "article": "صفحهٔ محتوایی",
-       "newwindow": "(در Ù¾Ù\86جرÙ\87Ù\94 Ø¬Ø¯Û\8cد باز می‌شود)",
+       "newwindow": "(در Ù¾Ù\86جرÙ\87Ù\94 ØªØ§Ø²Ù\87 باز می‌شود)",
        "cancel": "لغو",
        "moredotdotdot": "بیشتر...",
        "morenotlisted": "این فهرست کامل نیست.",
        "mypage": "صفحه",
        "mytalk": "بحث",
-       "anontalk": "بحث Ø¨Ø±Ø§Û\8c Ø§Û\8cÙ\86 آی‌پی",
-       "navigation": "گشتن",
+       "anontalk": "بحث Ø¯Ø±Ø¨Ø§Ø±Ù\87 Ø§Û\8cÙ\86 Ù\86شاÙ\86Û\8c آی‌پی",
+       "navigation": "ناوبری",
        "and": "&#32;و",
        "qbfind": "یافتن",
        "qbbrowse": "مرور",
        "qbedit": "ویرایش",
        "qbpageoptions": "این صفحه",
-       "qbmyoptions": "صفحه‌های من",
+       "qbmyoptions": "صفحات من",
        "faq": "پرسش‌های متداول",
        "faqpage": "Project:پرسش‌های متداول",
        "actions": "عملکردها",
        "create-this-page": "ایجاد این صفحه",
        "delete": "حذف",
        "deletethispage": "حذف این صفحه",
-       "undeletethispage": "احÛ\8cای این صفحه",
+       "undeletethispage": "بازگرداÙ\86ی این صفحه",
        "undelete_short": "احیای {{PLURAL:$1|یک ویرایش|$1 ویرایش}}",
        "viewdeleted_short": "نمایش {{PLURAL:$1|یک ویرایش حذف‌شده|$1 ویرایش حذف‌شده}}",
        "protect": "محافظت",
        "protect_change": "تغییر",
        "protectthispage": "محافظت از این صفحه",
-       "unprotect": "تغییر سطح محافظت",
-       "unprotectthispage": "تغییر سطح محافظت این صفحه",
-       "newpage": "صÙ\81Ø­Ù\87Ù\94 Ø¬Ø¯Û\8cد",
+       "unprotect": "تغییر محافظت",
+       "unprotectthispage": "تغییر محافظت این صفحه",
+       "newpage": "صÙ\81Ø­Ù\87Ù\94 ØªØ§Ø²Ù\87",
        "talkpage": "بحث دربارهٔ این صفحه",
        "talkpagelinktext": "بحث",
        "specialpage": "صفحهٔ ویژه",
        "otherlanguages": "به زبان‌های دیگر",
        "redirectedfrom": "(تغییرمسیر از $1)",
        "redirectpagesub": "صفحهٔ تغییرمسیر",
+       "redirectto": "تغییر مسیر به:",
        "lastmodifiedat": "این صفحه آخرین‌بار در $1 ساعت $2 تغییر یافته‌است.",
        "viewcount": "از این صفحه {{PLURAL:$1|یک‌بار|$1بار}} بازدید شده‌است.",
        "protectedpage": "صفحهٔ محافظت‌شده",
        "youhavenewmessages": "$1 دارید ($2).",
        "youhavenewmessagesfromusers": "شما از {{PLURAL:$3|یک کاربر دیگر|$3  کاربر}} $1 دارید ($2).",
        "youhavenewmessagesmanyusers": "شما از تعدادی کاربر $1 دارید ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|Ù¾Û\8cاÙ\85 Ø¬Ø¯Û\8cد|999=Ù¾Û\8cاÙ\85â\80\8cÙ\87اÛ\8c Ø¬Ø¯Û\8cد}}",
+       "newmessageslinkplural": "{{PLURAL:$1|Ù¾Û\8cاÙ\85 Ø¬Ø¯Û\8cد|999=Ù¾Û\8cاÙ\85â\80\8cÙ\87اÛ\8c ØªØ§Ø²Ù\87}}",
        "newmessagesdifflinkplural": "{{formatnum:$1}} {{PLURAL:$1|تغییر|999=تغییر}} اخیر",
        "youhavenewmessagesmulti": "پیام‌های جدیدی در $1 دارید.",
        "editsection": "ویرایش",
        "hidetoc": "نهفتن",
        "collapsible-collapse": "نهفتن",
        "collapsible-expand": "گسترش",
+       "confirmable-confirm": "{{GENDER:$1|شما}} مطمئن هستید؟",
        "confirmable-yes": "بله",
        "confirmable-no": "خیر",
        "thisisdeleted": "نمایش یا احیای $1؟",
        "laggedslavemode": "'''هشدار:''' صفحه ممکن است به‌روزرسانی‌های اخیر را شامل نشود.",
        "readonly": "پایگاه داده قفل شد",
        "enterlockreason": "دلیلی برای قفل کردن ذکر کنید، که حاوی تقریبی از زمانی باشد که قفل برداشته خواهد شد",
-       "readonlytext": "پایگاه داده در حال حاضر در برابر تغییرات و ایجاد صفحه‌ها قفل شده‌است؛ این وضعیت احتمالاً به خاطر بهینه‌سازی و رسیدگی‌های معمول است که پس از آن وضع به حالت عادی بازخواهد گشت.\n\nمدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1",
+       "readonlytext": "پایگاه داده در حال حاضر در برابر تغییرات و ایجاد صفحات قفل شده‌است؛ این وضعیت احتمالاً به خاطر بهینه‌سازی و رسیدگی‌های معمول است که پس از آن وضع به حالت عادی بازخواهد گشت.\n\nمدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1",
        "missing-article": "پایگاه داده متن صفحهٔ با نام «$1» $2 را که باید پیدا می‌کرد نیافت.\n\nاین مشکل معمولاً به علت دنبال‌کردن یک پیوند تفاوت تاریخ‌گذشته یا تاریخچهٔ صفحه‌ای که حذف شده‌است، رخ می‌دهد.\n\nدر غیر این صورت ممکن است اشکالی در نرم‌افزار پیدا کرده باشد.\nلطفاً این مشکل را با ذکر نشانی اینترنتی به یکی از [[Special:ListUsers/sysop|مدیران]] گزارش دهید.",
        "missingarticle-rev": "(شمارهٔ نسخه: $1)",
        "missingarticle-diff": "(تفاوت: $1، $2)",
        "userlogin-noaccount": "حساب کاربری ندارید؟",
        "userlogin-joinproject": "در {{SITENAME}} نام‌نویسی کنید!",
        "nologin": "حساب کاربری ندارید؟ $1.",
-       "nologinlink": "Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c Ø¬Ø¯Û\8cد بسازید",
+       "nologinlink": "Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c ØªØ§Ø²Ù\87 بسازید",
        "createaccount": "ایجاد حساب کاربری",
        "gotaccount": "حساب کاربری دارید؟ $1.",
        "gotaccountlink": "به سامانه وارد شوید",
        "noname": "شما نام کاربری معتبری مشخص نکرده‌اید.",
        "loginsuccesstitle": "ورود موفقیت‌آمیز به سامانه",
        "loginsuccess": "'''شما اکنون با نام «$1» به {{SITENAME}} وارد شده‌اید.'''",
-       "nosuchuser": "کاربرÛ\8c Ø¨Ø§ Ù\86اÙ\85 Â«$1» Ù\88جÙ\88د Ù\86دارد.\nÙ\86اÙ\85 Ú©Ø§Ø±Ø¨Ø±Û\8c Ø¨Ù\87 Ø¨Ø²Ø±Ú¯Û\8c Ù\88 Ú©Ù\88Ú\86Ú©Û\8c Ø­Ø±Ù\88Ù\81 Ø­Ø³Ø§Ø³ Ø§Ø³Øª.\nاÙ\85Ù\84اÛ\8c Ù\86اÙ\85 Ø±Ø§ Ø¨Ø±Ø±Ø³Û\8c Ú©Ù\86Û\8cدØ\8c Û\8cا [[Special:UserLogin/signup|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c Ø¬Ø¯Û\8cد بسازید]].",
+       "nosuchuser": "کاربرÛ\8c Ø¨Ø§ Ù\86اÙ\85 Â«$1» Ù\88جÙ\88د Ù\86دارد.\nÙ\86اÙ\85 Ú©Ø§Ø±Ø¨Ø±Û\8c Ø¨Ù\87 Ø¨Ø²Ø±Ú¯Û\8c Ù\88 Ú©Ù\88Ú\86Ú©Û\8c Ø­Ø±Ù\88Ù\81 Ø­Ø³Ø§Ø³ Ø§Ø³Øª.\nاÙ\85Ù\84اÛ\8c Ù\86اÙ\85 Ø±Ø§ Ø¨Ø±Ø±Ø³Û\8c Ú©Ù\86Û\8cدØ\8c Û\8cا [[Special:UserLogin/signup|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c ØªØ§Ø²Ù\87 بسازید]].",
        "nosuchusershort": "هیچ کاربری با نام ''$1'' وجود ندارد.\nاملایتان را وارسی کنید.",
        "nouserspecified": "باید یک نام کاربری مشخص کنید.",
        "login-userblocked": "این کاربر بسته شده‌است. ورود به سامانه مجاز نیست.",
        "createaccount-text": "یک نفر برای رایانامه شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کرده‌است ($4)، که گذرواژهٔ آن چنین است: $3\nشما باید به سامانه وارد شوید تا گذرواژهٔ خود را تغییر بدهید.\n\nاگر این حساب اشتباهی ساخته شده است، این پیغام را نادیده بگیرید.",
        "login-throttled": "شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
        "login-abort-generic": "ورود شما ناموفق بود - خاتمهٔ ناگهانی داده شد",
+       "login-migrated-generic": "حساب کاربری شما منتقل شده‌است، و نام کاربری‌تان دیگر در این ویکی وجود ندارد.",
        "loginlanguagelabel": "زبان: $1",
        "suspicious-userlogout": "درخواست شما برای خروج از سامانه رد شد زیرا به نظر می‌رسد که این درخواست توسط یک مرورگر معیوب یا پروکسی میانگیر ارسال شده باشد.",
        "createacct-another-realname-tip": "نام واقعی اختیاری است.\nاگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.",
        "resetpass_text": "<!-- اینجا متن اضافه کنید -->",
        "resetpass_header": "تغییر گذرواژهٔ حساب کاربری",
        "oldpassword": "گذرواژهٔ پیشین:",
-       "newpassword": "گذرÙ\88اÚ\98Ù\87Ù\94 Ø¬Ø¯Û\8cد:",
-       "retypenew": "گذرÙ\88اÚ\98Ù\87Ù\94 Ø¬Ø¯Û\8cد را دوباره وارد کنید",
+       "newpassword": "گذرÙ\88اÚ\98Ù\87Ù\94 ØªØ§Ø²Ù\87:",
+       "retypenew": "گذرÙ\88اÚ\98Ù\87Ù\94 ØªØ§Ø²Ù\87 را دوباره وارد کنید",
        "resetpass_submit": "تنظیم گذرواژه و ورود به سامانه",
        "changepassword-success": "گذرواژهٔ شما با موفقیت تغییر داده شد!",
        "changepassword-throttled": "شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
        "resetpass-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "resetpass-submit-loggedin": "تغییر گذرواژه",
        "resetpass-submit-cancel": "لغو",
-       "resetpass-wrong-oldpass": "گذرÙ\88اÚ\98Ù\87Ù\94 Ù\85Ù\88Ù\82ت Û\8cا Ø§Ø®Û\8cر Ù\86اÙ\85عتبر.\nÙ\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ú©Ù\87 Ø´Ù\85ا Ù\87Ù\85Û\8cÙ\86Ú© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87â\80\8cتاÙ\86 Ø±Ø§ Ø¨Ø§ Ù\85Ù\88Ù\81Ù\82Û\8cت ØªØºÛ\8cÛ\8cر Ø¯Ø§Ø¯Ù\87 Ø¨Ø§Ø´Û\8cد Û\8cا Ø¯Ø±Ø®Ù\88است Û\8cÚ© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87Ù\94 Ù\85Ù\88Ù\82ت Ø¬Ø¯Û\8cد کرده باشید.",
+       "resetpass-wrong-oldpass": "گذرÙ\88اÚ\98Ù\87Ù\94 Ù\85Ù\88Ù\82ت Û\8cا Ø§Ø®Û\8cر Ù\86اÙ\85عتبر.\nÙ\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ú©Ù\87 Ø´Ù\85ا Ù\87Ù\85Û\8cÙ\86Ú© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87â\80\8cتاÙ\86 Ø±Ø§ Ø¨Ø§ Ù\85Ù\88Ù\81Ù\82Û\8cت ØªØºÛ\8cÛ\8cر Ø¯Ø§Ø¯Ù\87 Ø¨Ø§Ø´Û\8cد Û\8cا Ø¯Ø±Ø®Ù\88است Û\8cÚ© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87Ù\94 Ù\85Ù\88Ù\82ت ØªØ§Ø²Ù\87 کرده باشید.",
        "resetpass-recycled": "لطفاً رمز عبور خود را به چیز دیگری غیر از رمز عبور فعلی تنظیم کنید.",
        "resetpass-temp-emailed": "شما با یک کد رایانامه شدهٔ موقت وارد شده‌اید.\nبرای پایان ورود، شما باید رمز عبور جدیدی اینجا وارد کنید:",
        "resetpass-temp-password": "گذرواژهٔ موقت:",
        "resetpass-abort-generic": "تغییر گذرواژه به دست یکی از افزونه‌ها لغو شده است.",
        "resetpass-expired": "رمز عبور شما منقضی شده‌است. لطفاً برای ورود رمز عبور جدیدی را تنظیم کنید.",
        "resetpass-expired-soft": "رمز عبور شما منقضی شده‌است، و نیاز به تنظیم مجدد دارد. لطفاً اکنون رمز عبور جدیدی را انتخاب کنید، یا برای تنظیم مجدد آن بعدآً، دکمه \"{{int:resetpass-submit-cancel}}\" را کلیک کنید.",
-       "resetpass-validity-soft": "گذرÙ\88اÙ\87Ù\94 Ø´Ù\85ا ØµØ­Û\8cØ­ Ù\86Û\8cست: $1\n\nÙ\84Ø·Ù\81اÙ\8b Û\8cÚ© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87Ù\94 Ø¬Ø¯Û\8cد الآن انتخاب کنید یا بر «{{int:resetpass-submit-cancel}}» کلیک کنید که دوباره آن را بعداً انتخاب کنید.",
+       "resetpass-validity-soft": "گذرÙ\88اÙ\87Ù\94 Ø´Ù\85ا ØµØ­Û\8cØ­ Ù\86Û\8cست: $1\n\nÙ\84Ø·Ù\81اÙ\8b Û\8cÚ© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87Ù\94 ØªØ§Ø²Ù\87 الآن انتخاب کنید یا بر «{{int:resetpass-submit-cancel}}» کلیک کنید که دوباره آن را بعداً انتخاب کنید.",
        "passwordreset": "بازنشانی گذرواژه",
        "passwordreset-text-one": "برای بازنشانی گذرواژه‌تان این فرم را کامل کنید.",
        "passwordreset-text-many": "{{PLURAL:$1|برای دریافت یک گذرواژهٔ موقت از راه رایانامه، یکی از زمینه‌ها را پر کنید.}}",
        "passwordreset-emailsent-capture": "یک رایانامهٔ بازنشانی که در پایین نمایش داده شده، فرستاده شده است.",
        "passwordreset-emailerror-capture": "رایانامهٔ بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیت‌آمیز نبود: $1",
        "changeemail": "تغییر نشانی رایانامه",
-       "changeemail-header": "تغییر نشانی رایانامهٔ حساب کاربری",
        "changeemail-text": "این فرم را تکمیل کنید تا آدرس رایانامه‌تان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.",
        "changeemail-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "changeemail-oldemail": "نشانی رایانامهٔ کنونی:",
-       "changeemail-newemail": "Ù\86شاÙ\86Û\8c Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87Ù\94 Ø¬Ø¯Û\8cد:",
+       "changeemail-newemail": "Ù\86شاÙ\86Û\8c Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87Ù\94 ØªØ§Ø²Ù\87:",
        "changeemail-none": "(هیچ)",
-       "changeemail-password": " {{SITENAME}} رمز عبور شما:",
+       "changeemail-password": "گذرواژهٔ {{SITENAME}} شما:",
        "changeemail-submit": "تغییر رایانامه",
-       "changeemail-cancel": "انصراف",
        "changeemail-throttled": "شما به مراتب برای ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
        "resettokens": "بازنشانی شناساننده‌ها",
        "resettokens-text": "شما می توانید شناساننده‌ها که اجازهٔ دسترسی به برخی داده‌های خصوصی مرتبط با حسابتان را می‌دهد بازنشانی کنید.\nدر صورتی باید این کار را انجام دهید که تصادقاً آن‌ها را با کسی در میان گذاشته‌اید یا به حسابتان نفوذ شده است.",
        "showpreview": "پیش‌نمایش",
        "showdiff": "نمایش تغییرات",
        "blankarticle": "<strong>هشدار:</strong> شما در حال ایجاد صفحه خالی هستید.\nاگر \"{{int:savearticle}}\" را دوباره کلیک کنید، صفحه بدون محتوا ایجاد می‌شود.",
-       "anoneditwarning": "'''هشدار:''' شما به سامانه وارد نشده‌اید.\nنشانی آی‌پی شما در تاریخچهٔ ویرایش این صفحه ثبت خواهد شد.",
+       "anoneditwarning": "<strong>هشدار:</strong> شما وارد نشده‌اید. نشانی آی‌پی شما برای عموم قابل مشاهده خواهد بود اگر هر تغییری ایجاد کنید. اگر <strong>[$1 وارد شوید]</strong> یا <strong>[$2 یک حساب کاربری بسازید]</strong>، ویرایش‌هایتان به نام کاربری‌تان نسبت داده خواهد شد، همراه با مزایای دیگر.",
        "anonpreviewwarning": "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.''",
        "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "missingcommenttext": "لطفاً توضیحی در زیر بیفزایید.",
        "autoblockedtext": "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.\nدلیل ارائه‌شده چنین است:\n\n:''$2''\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا  [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
        "blockednoreason": "دلیلی مشخص نشده‌است",
        "whitelistedittext": "برای ویرایش مقاله‌ها باید $1.",
-       "confirmedittext": "شما باید، پیش از ویرایش صفحه‌ها، نشانی رایانامهٔ خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.",
+       "confirmedittext": "شما باید، پیش از ویرایش صفحات، نشانی رایانامهٔ خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.",
        "nosuchsectiontitle": "چنین بخشی پیدا نشد",
        "nosuchsectiontext": "شما تلاش کرده‌اید یک بخش در صفحه را ویرایش کنید که وجود ندارد.\nممکن است در مدتی که شما صفحه را مشاهده می‌کردید این بخش جا به جا یا حذف شده باشد.",
        "loginreqtitle": "ورود به سامانه لازم است",
        "loginreqpagetext": "برای دیدن صفحه‌های دیگر باید $1.",
        "accmailtitle": "گذرواژه فرستاده شد.",
        "accmailtext": "یک گذرواژهٔ تصادفی برای [[User talk:$1|$1]] به $2 فرستاده شد. می‌توان آن را از صفحهٔ ''[[Special:ChangePassword|تغییر گذرواژه]]'' که هنگام ثبت ورود نمایش می‌یابد تغییر داد.",
-       "newarticle": "(جدÛ\8cد)",
+       "newarticle": "(تازÙ\87)",
        "newarticletext": "شما پیوندی را دنبال کرده‌اید و به صفحه‌ای رسیده‌اید که هنوز وجود ندارد.\nبرای ایجاد صفحه، در مستطیل زیر شروع به نوشتن کنید (برای اطلاعات بیشتر به [$1 صفحهٔ راهنما] مراجعه کنید).\nاگر به اشتباه اینجا آمده‌اید، دکمهٔ «بازگشت» مرورگرتان را بزنید.",
        "anontalkpagetext": "----''این صفحهٔ بحث برای کاربر گمنامی است که هنوز حسابی درست نکرده است یا از آن استفاده نمی‌کند.\nبنا بر این برای شناسایی‌اش مجبوریم از نشانی آی‌پی عددی استفاده کنیم.\nچنین نشانی‌های آی‌پی ممکن است توسط چندین کاربر به شکل مشترک استفاده شود.\nاگر شما کاربر گمنامی هستید و تصور می‌کنید اظهار نظرات نامربوط به شما صورت گرفته است، لطفاً برای پیشگیری از اشتباه گرفته شدن با کاربران گمنام دیگر در آینده [[Special:UserLogin/signup|حسابی ایجاد کنید]] یا [[Special:UserLogin|به سامانه وارد شوید]].''",
        "noarticletext": "این صفحه هم‌اکنون دارای هیچ متنی نیست.\nشما می‌توانید در صفحه‌های دیگر [[Special:Search/{{PAGENAME}}|عنوان این صفحه را جستجو کنید]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را جستجو کنید]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} این صفحه را ویرایش کنید]</span>.",
-       "noarticletext-nopermission": "این صفحه هم‌اکنون متنی ندارد.\nشما می‌توانید در دیگر صفحه‌ها [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،\nیا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید]</span> ولی شما اجازه ایجاد این صفحه را ندارید.",
+       "noarticletext-nopermission": "این صفحه هم‌اکنون متنی ندارد.\nشما می‌توانید در دیگر صفحات [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،\nیا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید]</span> ولی شما اجازه ایجاد این صفحه را ندارید.",
        "missing-revision": "ویرایش #$1 از صفحهٔ «{{FULLPAGENAME}}» موجود نیست.\n\nمعمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
        "userpage-userdoesnotexist": "حساب کاربر «<nowiki>$1</nowiki>» ثبت نشده‌است.\nلطفاً مطمئن شوید که می‌خواهید این صفحه را ایجاد یا ویرایش کنید.",
        "userpage-userdoesnotexist-view": "حساب کاربری «$1» ثبت نشده‌است.",
        "editing": "در حال ویرایش $1",
        "creating": "ایجاد $1",
        "editingsection": "در حال ویرایش $1 (بخش)",
-       "editingcomment": "در Ø­Ø§Ù\84 Ù\88Û\8cراÛ\8cØ´ $1 (بخش Ø¬Ø¯Û\8cد)",
+       "editingcomment": "در Ø­Ø§Ù\84 Ù\88Û\8cراÛ\8cØ´ $1 (بخش ØªØ§Ø²Ù\87)",
        "editconflict": "تعارض ویرایشی: $1",
        "explainconflict": "از وقتی ویرایش این صفحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده‌است.\nناحیهٔ متنی بالایی شامل متن صفحه به شکل کنونی آن است.\nتغییرات شما در ناحیهٔ متنی پایینی نشان داده شده‌است.\nشما باید تغییراتتان را با متن کنونی ترکیب کنید.\nبا فشردن دکمهٔ «{{int:savearticle}}» '''فقط''' متن ناحیهٔ متنی بالایی ذخیره خواهد شد.",
        "yourtext": "متن شما",
        "storedversion": "نسخهٔ ذخیره شده",
-       "nonunicodebrowser": "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.'''\nراه حلی به کار گرفته شده تا شما بتوانید صفحه‌ها را با امنیت ویرایش کنید: کاراکترهای غیر ASCII به صورت کدهایی در مبنای شانزده به شما نشان داده می‌شوند.",
+       "nonunicodebrowser": "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.'''\nراه حلی به کار گرفته شده تا شما بتوانید صفحات را با امنیت ویرایش کنید: کاراکترهای غیر ASCII به صورت کدهایی در مبنای شانزده به شما نشان داده می‌شوند.",
        "editingold": "'''هشدار: شما در حال ویرایش نسخه‌ای قدیمی از این صفحه هستید.'''\nاگر ذخیره‌اش کنید، هر تغییری که پس از این نسخه انجام شده‌است از بین خواهد رفت.",
        "yourdiff": "تفاوت‌ها",
        "copyrightwarning": "لطفاً توجه داشته باشید که فرض می‌شود کلیهٔ مشارکت‌های شما با {{SITENAME}} تحت «$2» منتشر می‌شوند (برای جزئیات بیشتر به $1 مراجعه کنید).\nاگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش شده و به دلخواه توزیع شود، اینجا نفرستیدشان.<br />\nهمچنین شما دارید به ما قول می‌دهید که خودتان این را نوشته‌اید، یا آن را از یک منبع آزاد با مالکیت عمومی یا مشابه آن برداشته‌اید.\n'''کارهای دارای حق تکثیر (copyright) را بی‌اجازه نفرستید!'''",
        "template-semiprotected": "(نیمه‌حفاظت‌شده)",
        "hiddencategories": "این صفحه در {{PLURAL:$1|یک ردهٔ پنهان|$1 ردهٔ پنهان}} قرار دارد:",
        "edittools": "<!-- متن این قسمت زیر صفحه‌های ویرایش و بارگذاری نشان داده می‌شود -->",
-       "nocreatetext": "{{SITENAME}} Ù\82ابÙ\84Û\8cت Ø§Û\8cجاد ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ø¬Ø¯Û\8cد را محدود کرده‌است.\nمی‌توانید بازگردید و صفحه‌ای موجود را ویرایش کنید یا اینکه  [[Special:UserLogin|به سامانه وارد شوید یا حساب کاربری ایجاد کنید]].",
-       "nocreate-loggedin": "Ø´Ù\85ا Ø§Ø¬Ø§Ø²Ù\87Ù\94 Ø§Û\8cجاد ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ø¬Ø¯Û\8cد را ندارید.",
+       "nocreatetext": "{{SITENAME}} Ù\82ابÙ\84Û\8cت Ø§Û\8cجاد ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c ØªØ§Ø²Ù\87 را محدود کرده‌است.\nمی‌توانید بازگردید و صفحه‌ای موجود را ویرایش کنید یا اینکه  [[Special:UserLogin|به سامانه وارد شوید یا حساب کاربری ایجاد کنید]].",
+       "nocreate-loggedin": "Ø´Ù\85ا Ø§Ø¬Ø§Ø²Ù\87Ù\94 Ø§Û\8cجاد ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c ØªØ§Ø²Ù\87 را ندارید.",
        "sectioneditnotsupported-title": "ویرایش بخش‌ها پشتیبانی نمی‌شود",
        "sectioneditnotsupported-text": "این صفحه از ویرایش بخش‌ها پشتیبانی نمی‌کند.",
        "permissionserrors": "خطای سطح دسترسی",
        "postedit-confirmation-created": "صفحه ایجاد شده است.",
        "postedit-confirmation-restored": "صفحه بازیابی شده است.",
        "postedit-confirmation-saved": "ویرایش شما ذخیره شد.",
-       "edit-already-exists": "اÙ\85کاÙ\86 Ø³Ø§Ø®ØªÙ\86 ØµÙ\81Ø­Ù\87Ù\94 Ø¬Ø¯Û\8cد وجود ندارد.\nاین صفحه از قبل وجود داشته‌است.",
+       "edit-already-exists": "اÙ\85کاÙ\86 Ø³Ø§Ø®ØªÙ\86 ØµÙ\81Ø­Ù\87Ù\94 ØªØ§Ø²Ù\87 وجود ندارد.\nاین صفحه از قبل وجود داشته‌است.",
        "defaultmessagetext": "متن پیش‌فرض پیغام",
        "content-failed-to-parse": "عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3",
        "invalid-content-data": "داده محتوای نامعتبر",
        "parser-template-recursion-depth-warning": "محدودیت عمق بازگشت الگو رد شد ($1)",
        "language-converter-depth-warning": "محدودیت عمق مبدل زبانی رد شد ($1)",
        "node-count-exceeded-category": "صفحه‌هایی که از حداکثر تعداد گره تجاوز کرده‌اند",
-       "node-count-exceeded-category-desc": "ردÙ\87 Ø¨Ø±Ø§Û\8c ØµÙ\81حاتÛ\8c Ú©Ù\87 Ø¯Ø± Ø¢Ù\86Ù\87ا Ø´Ù\85ارÙ\86دÙ\87 فراتر رفته است.",
-       "node-count-exceeded-warning": "صفحه از حداکثر تعداد گره، فراتر است",
+       "node-count-exceeded-category-desc": "اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87 Ø§Ø² ØªØ¹Ø¯Ø§Ø¯ Ø­Ø¯Ø§Ú©Ø«Ø± Ø§Ø´Ú©Ø§Ù\84 فراتر رفته است.",
+       "node-count-exceeded-warning": "صفحه از حداکثر تعداد گره فراتر رفته‌است",
        "expansion-depth-exceeded-category": "صفحه‌هایی که از حداکثر عمق بسط دادن تجاوز کرده‌اند",
-       "expansion-depth-exceeded-category-desc": "رده برای صفحاتی که در آنها عمق گسترش فراتر رفته است.",
+       "expansion-depth-exceeded-category-desc": "ردÙ\87 Ø¨Ø±Ø§Û\8c ØµÙ\81حاتÛ\8c Ú©Ù\87 Ø¯Ø± Ø¢Ù\86Ù\87ا Ø§Ø² Ø¹Ù\85Ù\82 Ú¯Ø³ØªØ±Ø´ Ù\81راتر Ø±Ù\81تÙ\87 Ø§Ø³Øª.",
        "expansion-depth-exceeded-warning": "صفحه حداکثر عمق بسط دادن تجاوز کرد",
        "parser-unstrip-loop-warning": "حلقه در دستور unstrip پیدا شد",
        "parser-unstrip-recursion-limit": "از حداکثر ارجاع در دستور unstrip تجاوز شد ($1)",
        "undo-success": "این ویرایش را می‌توان خنثی کرد.\nلطفاً تفاوت زیر را بررسی کنید تا تأیید کنید که این چیزی است که می‌خواهید انجام دهید، سپس تغییرات زیر را ذخیره کنید تا خنثی‌سازی ویرایش را به پایان ببرید.",
        "undo-failure": "به علت تعارض با ویرایش‌های میانی، این ویرایش را نمی‌توان خنثی کرد.",
        "undo-norev": "این ویرایش را نمی‌توان خنثی کرد چون وجود ندارد یا حذف شده‌است.",
-       "undo-nochange": "بÙ\87 Ù\86ظر Ù\85Û\8câ\80\8cرسد Ù\88Û\8cراÛ\8cØ´ Ø¯Ø± Ø­Ø§Ù\84 Ø­Ø§Ø¶Ø± Ø¨Ø§Ø·Ù\84 Ø¨Ù\88ده است.",
+       "undo-nochange": "بÙ\87 Ù\86ظر Ù\85Û\8câ\80\8cرسد Ù\88Û\8cراÛ\8cØ´ Ø§Ø² Ù¾Û\8cØ´ Ù\88اگرداÙ\86Û\8c Ø´ده است.",
        "undo-summary": "خنثی‌سازی ویرایش $1 توسط [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])",
        "undo-summary-username-hidden": "خنثی‌سازی نسخهٔ $1 به دست یک کاربر پنهان‌شده",
        "cantcreateaccounttitle": "نمی‌توان حساب باز کرد",
        "history-feed-title": "تاریخچهٔ ویرایش‌ها",
        "history-feed-description": "تاریخچهٔ ویرایش‌های این صفحه در ویکی",
        "history-feed-item-nocomment": "$1 در $2",
-       "history-feed-empty": "صفحهٔ درخواست شده وجود ندارد.\nممکن است که از ویکی حذف یا اینکه نامش تغییر داده شده باشد.\nصفحه‌های جدید را برای موارد مرتبط در این ویکی [[Special:Search|جستجو کنید]].",
+       "history-feed-empty": "صفحهٔ درخواست شده وجود ندارد.\nممکن است که از ویکی حذف یا اینکه نامش تغییر داده شده باشد.\nصفحات تازه را برای موارد مرتبط در این ویکی [[Special:Search|جستجو کنید]].",
        "rev-deleted-comment": "(خلاصه ویرایش حذف شد)",
        "rev-deleted-user": "(نام کاربری حذف شد)",
        "rev-deleted-event": "(مورد از سیاهه پاک شده)",
        "revdelete-radio-set": "پنهان",
        "revdelete-radio-unset": "نمایان",
        "revdelete-suppress": "از دسترسی مدیران به داده نیز مانند سایر کاربران جلوگیری به عمل آید.",
-       "revdelete-unsuppress": "خاتÙ\85Ù\87Ù\94 Ù\85حدÙ\88دÛ\8cتâ\80\8cÙ\87ا Ø¯Ø± Ù\85Ù\88رد Ù\86سخÙ\87â\80\8cÙ\87اÛ\8c Ø§Ù\86تخاب‌شده",
+       "revdelete-unsuppress": "حذÙ\81 Ù\85حدÙ\88دÛ\8cتâ\80\8cÙ\87ا Ø¯Ø± Ø¨Ø§Ø²Ø¨Û\8cÙ\86Û\8câ\80\8cÙ\87اÛ\8c ØªØ±Ù\85Û\8cÙ\85‌شده",
        "revdelete-log": "دلیل:",
        "revdelete-submit": "اعمال بر {{PLURAL:$1|نسخهٔ|نسخه‌های}} انتخاب شده",
        "revdelete-success": "'''پیدایی نسخه با موفقیت به روز شد.'''",
        "revdelete-offender": "نویسنده نسخه:",
        "suppressionlog": "سیاههٔ فرونشانی",
        "suppressionlogtext": "در زیر فهرستی از آخرین حذف‌ها و قطع دسترسی‌هایی که حاوی محتوایی هستند که از مدیران پنهان شده‌اند را می‌بینید.\nبرای مشاهدهٔ فهرستی از قطع دسترسی‌های فعال [[Special:BlockList|فهرست بسته‌شده‌ها]] را ببینید.",
-       "mergehistory": "ادغام تاریخچه صفحه‌ها",
+       "mergehistory": "ادغام تاریخچه صفحات",
        "mergehistory-header": "این صفحه به شما این امکان را می‌دهد که نسخه‌های تاریخچهٔ یک مقاله را با یک مقاله دیگر ادغام کنید.\nاطمینان حاصل کنید که این تغییر به توالی زمانی ویرایش‌ها لطمه نخواهد زد.",
        "mergehistory-box": "ادغام نسخه‌های دو صفحه:",
        "mergehistory-from": "صفحهٔ مبدأ:",
        "mergehistory-go": "نمایش تاریخچه قابل ادغام",
        "mergehistory-submit": "ادغام نسخه‌ها",
        "mergehistory-empty": "هیچ‌یک از نسخه‌ها قابل ادغام نیستند.",
-       "mergehistory-success": "$3 نسخه از [[:$1]]  با موفقیت در [[:$2]] ادغام {{PLURAL:$3|شد|شدند}}.",
+       "mergehistory-success": "$3 نسخه از [[:$1]]  با موفقیت در [[:$2]] ادغام {{PLURAL:$3|شد}}.",
        "mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.",
        "mergehistory-fail-toobig": "نمی‌توان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
        "mergehistory-no-source": "صفحهٔ مبدأ $1 وجود ندارد.",
        "mergelogpagetext": "در زیر سیاههٔ آخرین موارد ادغام تاریخچهٔ یک صفحه در صفحه‌ای دیگر را می‌بینید.",
        "history-title": "$1: تاریخچهٔ ویرایش‌ها",
        "difference-title": "$1: تفاوت بین نسخه‌ها",
-       "difference-title-multipage": "$1 و $2: تفاوت بین صفحه‌ها",
-       "difference-multipage": "(تفاوت بین صفحه‌ها)",
+       "difference-title-multipage": "$1 و $2: تفاوت بین صفحات",
+       "difference-multipage": "(تفاوت بین صفحات)",
        "lineno": "سطر $1:",
        "compareselectedversions": "مقایسهٔ نسخه‌های انتخاب‌شده",
-       "showhideselectedversions": "نمایش/نهفتن نسخه‌های انتخاب‌شده",
+       "showhideselectedversions": "تغییر پدیداری نسخه‌های انتخاب‌شده",
        "editundo": "خنثی‌سازی",
        "diff-empty": "(بدون تفاوت)",
        "diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ میانی|$1 نسخهٔ میانی}} توسط کاربر مشابهی که نشان داده نشده)",
        "searchrelated": "مرتبط",
        "searchall": "همه",
        "showingresults": "نمایش حداکثر {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} در پایین، آغاز از شماره '''$2'''.",
-       "showingresultsinrange": "نمایش در پائین تا {{PLURAL:$1|<strong>1</strong> نتیجه|<strong>$1</strong> نتیجه}} in range #<strong>$2</strong> تا #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|نتیجهٔ '''$1''' از '''$3'''|نتایج '''$1 تا $2''' از '''$3'''}} برای '''$4'''",
+       "showingresultsinrange": "نمایش در پائین تا {{PLURAL:$1|<strong>1</strong> نتیجه|<strong>$1</strong> نتیجه}} در محدودهٔ #<strong>$2</strong> تا #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|نتایج <strong>$1</strong> از <strong>$3</strong>|نتایج <strong>$1 - $2</strong> از <strong>$3</strong>}}",
        "search-nonefound": "نتیجه‌ای منطبق با درخواست پیدا نشد.",
        "powersearch-legend": "جستجوی پیشرفته",
        "powersearch-ns": "جستجو در فضاهای نام:",
        "preferences": "ترجیحات",
        "mypreferences": "ترجیحات",
        "prefs-edits": "تعداد ویرایش‌ها:",
-       "prefsnologintext2": "لطفاً  $1  برای تنظیم ترجیحات کاربر.",
+       "prefsnologintext2": "خواهشمند است برای تغییر تنظیمات‌تان وارد شوید.",
        "prefs-skin": "پوسته",
        "skin-preview": "پیش‌نمایش",
        "datedefault": "بدون ترجیح",
        "yourlanguage": "زبان:",
        "yourvariant": "گویش زبان محتوا:",
        "prefs-help-variant": "گویش انتخابی شما برای نمایش محتوای صفحه‌ها در این ویکی.",
-       "yournick": "اÙ\85ضاÛ\8c Ø¬Ø¯Û\8cد:",
+       "yournick": "اÙ\85ضاÛ\8c ØªØ§Ø²Ù\87:",
        "prefs-help-signature": "نظرهای نوشته‌شده در صفحهٔ بحث باید با «<nowiki>~~~~</nowiki>» امضا شوند؛ این علامت به‌صورت خودکار به امضای شما و مهر تاریخ تبدیل خواهد شد.",
        "badsig": "امضای خام نامجاز.\nلطفاً برچسب‌های اچ‌تی‌ام‌ال را بررسی کنید.",
        "badsiglength": "امضای شما بیش از اندازه طولانی است.\nامضا باید کمتر از $1 {{PLURAL:$1|نویسه}} طول داشته باشد.",
        "prefs-tokenwatchlist": "نشانه",
        "prefs-diffs": "تفاوت‌ها",
        "prefs-help-prefershttps": "تأثیر این ترجیح بعد از ورود بعدی شما اعمال خواهد شد.",
+       "prefswarning-warning": "تغییراتتان به ترجیحات هنوز ذحیره نشده است.\nاگر این صفحه بدون کلیک بر «$1» ترک کنید ترجیحاتتان ذخیره نخواهد شد.",
        "prefs-tabs-navigation-hint": "نکته: شما می توانید از کلیدهای جهت‌نمای چپ و راست برای حرکت بین زبانه‌ها در فهرست زبانه‌ها استفاده کنید.",
        "email-address-validity-valid": "نشانی رایانامه معتبر به نظر می‌رسد",
        "email-address-validity-invalid": "نشانی رایانامهٔ معتبر وارد کنید",
        "group-autoconfirmed-member": "{{GENDER:$1|کاربر تأییدشده}}",
        "group-bot-member": "ربات",
        "group-sysop-member": "{{GENDER:$1|مدیر}}",
-       "group-bureaucrat-member": "{{GENDER:$1|دیوانسالار}}",
+       "group-bureaucrat-member": "{{GENDER:$1|دیوانسالار}}",
        "group-suppress-member": "{{GENDER:$1|نظارت}}",
        "grouppage-user": "{{ns:project}}:کاربران",
        "grouppage-autoconfirmed": "{{ns:project}}:کاربران تأییدشده",
        "right-createaccount": "ایجاد حساب‌های کاربری",
        "right-minoredit": "علامت‌زدن ویرایش‌ها به‌عنوان جزئی",
        "right-move": "انتقال صفحه",
-       "right-move-subpages": "انتقال صفحÙ\87â\80\8cÙ\87ا Ø¨Ù\87 Ù\87Ù\85راÙ\87 Ø²Û\8cرâ\80\8cصÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8cشاÙ\86",
+       "right-move-subpages": "انتقال صفحات Ø¨Ù\87 Ù\87Ù\85راÙ\87 Ø²Û\8cرâ\80\8cصÙ\81حاتâ\80\8cشاÙ\86",
        "right-move-rootuserpages": "انتقال صفحه‌های کاربری سرشاخه",
        "right-move-categorypages": "انتقال صفحهٔ رده",
        "right-movefile": "انتقال پرونده‌ها",
        "right-purge": "پاک‌کردن میانگیر صفحه بدون مشاهدهٔ صفحهٔ تأیید",
        "right-autoconfirmed": "از محدودیت‌های سرعت آی‌پی‌-محور تاثیر نمی‌گیرد",
        "right-bot": "تلقی‌شده به عنوان یک فرآیند خودکار",
-       "right-nominornewtalk": "Ù\88Û\8cراÛ\8cØ´ Ø¬Ø²Ø¦Û\8c ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ø¨Ø­Ø« Ø¨Ù\87 Ø´Ú©Ù\84Û\8c Ú©Ù\87 Ø¨Ø§Ø¹Ø« Ø§Ø¹Ù\84اÙ\86 Ù¾Û\8cغاÙ\85 Ø¬Ø¯Û\8cد نشود",
+       "right-nominornewtalk": "Ù\88Û\8cراÛ\8cØ´ Ø¬Ø²Ø¦Û\8c ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ø¨Ø­Ø« Ø¨Ù\87 Ø´Ú©Ù\84Û\8c Ú©Ù\87 Ø¨Ø§Ø¹Ø« Ø§Ø¹Ù\84اÙ\86 Ù¾Û\8cغاÙ\85 ØªØ§Ø²Ù\87 نشود",
        "right-apihighlimits": "سقف بالاتر استفاده از API",
        "right-writeapi": "استفاده از API مربوط به نوشتن",
-       "right-delete": "حذف صفحه‌ها",
+       "right-delete": "حذف صفحات",
        "right-bigdelete": "حذف صفحه‌های دارای تاریخچهٔ بزرگ",
        "right-deletelogentry": "حذف و احیای مدخل‌های خاصی از سیاهه",
        "right-deleterevision": "حذف و احیای نسخه‌های خاصی از صفحه",
        "right-deletedhistory": "مشاهدهٔ موارد حذف‌شده از تاریخچه، بدون دیدن متن آن‌ها",
        "right-deletedtext": "مشاهدهٔ متن حذف‌شده و تغییرات بین نسخه‌های حذف‌شده",
        "right-browsearchive": "جستجوی صفحه‌های حذف‌شده",
-       "right-undelete": "احیای صفحه‌ها",
+       "right-undelete": "احیای صفحات",
        "right-suppressrevision": "مشاهده  و احیای ویرایش‌هایی که از کاربران پنهان شده‌اند",
        "right-viewsuppressed": "مشاهده نسخه‌هایی که از کاربران مخفی شده‌اند",
        "right-suppressionlog": "مشاهدهٔ سیاهه‌های خصوصی",
        "right-ipblock-exempt": "تاثیر نپذیرفتن از قطع دسترسی‌های آی‌پی، خودکار یا فاصله‌ای",
        "right-proxyunbannable": "تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسی‌ها",
        "right-unblockself": "بازکردن دسترسی خود",
-       "right-protect": "تغییر میزان محافظت صفحه‌ها و ویرایش صفحه‌های محافظت‌شده آبشاری",
-       "right-editprotected": "ویرایش صفحه‌های محافظت شده به عنوان \"{{int:protect-level-sysop}}\"",
+       "right-protect": "تغییر میزان محافظت صفحات و ویرایش صفحات محافظت‌شده آبشاری",
+       "right-editprotected": "ویرایش صفحه‌های محافظت‌شده به‌عنوان «{{int:protect-level-sysop}}»",
        "right-editsemiprotected": "ویرایش صفحه حفاظت‌شده به عنوان \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "ویرایش واسط کاربری",
        "right-editusercssjs": "ویرایش صفحه‌های CSS و JS دیگر کاربرها",
        "right-editmyusercss": "پرونده‌های سی‌اس‌اس کاربری خود را ویرایش کنید",
        "right-editmyuserjs": "پرونده‌های جاوااسکریپت کاربری خود را ویرایش کنید",
        "right-viewmywatchlist": "فهرست پیگیری‌های خود را ببینید",
-       "right-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید. توجه داشته باشید برخی از اقدامات حتی بدون این دسترسی هم صفحه‌ها را اضافه می‌کنند.",
+       "right-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید. توجه داشته باشید برخی از اقدامات حتی بدون این دسترسی هم صفحات را اضافه می‌کنند.",
        "right-viewmyprivateinfo": "داده‌های خصوصی خود را ببینید (مانند رایانشانی و نام واقعی)",
        "right-editmyprivateinfo": "داده‌های خصوصی خود را ویرایش کنید (مانند رایانشانی و نام واقعی)",
        "right-editmyoptions": "ترجیحات خود را ویرایش",
        "right-autopatrol": "گشت زدن خودکار ویرایش‌های خودش",
        "right-patrolmarks": "مشاهدهٔ برچسب گشت تغییرات اخیر",
        "right-unwatchedpages": "مشاهدهٔ فهرست صفحه‌هایی که پی‌گیری نمی‌شوند",
-       "right-mergehistory": "ادغام تاریخچهٔ صفحه‌ها",
+       "right-mergehistory": "ادغام تاریخچهٔ صفحات",
        "right-userrights": "ویرایش تمام اختیارات کاربرها",
        "right-userrights-interwiki": "ویرایش اختیارات کاربرهای ویکی‌های دیگر",
        "right-siteadmin": "قفل‌کردن و بازکردن پایگاه داده‌ها",
        "recentchanges-summary": "آخرین تغییرات ویکی را در این صفحه پی‌گیری کنید.",
        "recentchanges-noresult": "هیچ تغییری در طول دورهٔ تعیین‌شده با این معیارها هم‌خوانی نداشت.",
        "recentchanges-feed-description": "آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.",
-       "recentchanges-label-newpage": "اÛ\8cÙ\86 Ù\88Û\8cراÛ\8cØ´ ØµÙ\81Ø­Ù\87â\80\8cاÛ\8c Ø¬Ø¯Û\8cد ایجاد کرد",
+       "recentchanges-label-newpage": "اÛ\8cÙ\86 Ù\88Û\8cراÛ\8cØ´ ØµÙ\81Ø­Ù\87â\80\8cاÛ\8c ØªØ§Ø²Ù\87 ایجاد کرد",
        "recentchanges-label-minor": "این یک ویرایش جزئی‌است",
        "recentchanges-label-bot": "این ویرایش را یک ربات انجام داده‌است",
        "recentchanges-label-unpatrolled": "این ویرایش هنوز گشت‌زنی نشده‌است",
        "recentchanges-label-plusminus": "حجم صفحه به اندازه این بایت‌ها تغییر یافته‌است",
        "recentchanges-legend-heading": "'''اختصارها:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (Ù\87Ù\85Ú\86Ù\86Û\8cÙ\86 Ø¨Ù\87 [[Special:NewPages|Ù\81Ù\87رست ØµÙ\81حات Ø¬Ø¯Û\8cد]] نگاه کنید)",
-       "recentchanges-legend-plusminus": "('' ±۱۲۳'')",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (Ù\87Ù\85Ú\86Ù\86Û\8cÙ\86 Ø¨Ù\87 [[Special:NewPages|Ù\81Ù\87رست ØµÙ\81حات ØªØ§Ø²Ù\87]] نگاه کنید)",
+       "recentchanges-legend-plusminus": "(<em>±۱۲۳</em>)",
        "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
-       "rclistfrom": "Ù\86Ù\85اÛ\8cØ´ ØªØºÛ\8cÛ\8cرات Ø¬Ø¯Û\8cد با شروع از $3 $2",
+       "rclistfrom": "Ù\86Ù\85اÛ\8cØ´ ØªØºÛ\8cÛ\8cرات ØªØ§Ø²Ù\87 با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
        "rcshowhideminor-hide": "پنهان‌کردن",
        "upload_directory_read_only": "شاخهٔ بارگذاری ($1) از طرف سرور وب قابل نوشتن نیست.",
        "uploaderror": "خطای بارگذاری",
        "upload-recreate-warning": "'''هشدار: پرونده‌ای با این نام حذف یا منتقل شده است.'''\n\nبرای راحتی، سیاههٔ حذف و انتقال برای این صفحه در زیر آمده است:",
-       "uploadtext": "از فرم زیر برای بارگذاری کردن پرونده‌های جدید استفاده کنید.\nبرای دیدن پرونده‌هایی که قبلاً بارگذاری شده‌اند به [[Special:FileList|فهرست پرونده‌ها]] بروید. بارگذاری نیز مجدد در [[Special:Log/upload|سیاههٔ بارگذاری‌ها]] و حذف پرونده‌ها در [[Special:Log/delete|deletion log]] ثبت می‌شود.\n\nبعد از این که پرونده‌ای را بارگذاری کردید، به این سه شکل می‌توانید آن را در صفحه‌ها استفاده کنید:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' برای استفاده از نسخه کامل پرونده\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' برای استفاده از یک نسخه ۲۰۰ پیکسلی از پرونده درون یک جعبه در سمت چپ متن که عبارت alt text در آن به عنوان توضیح استفاده شده\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' برای ایجاد یک پیونده مستقیم به پرونده بدون نمایش پرونده",
+       "uploadtext": "از فرم زیر برای بارگذاری کردن پرونده‌های جدید استفاده کنید.\nبرای دیدن پرونده‌هایی که قبلاً بارگذاری شده‌اند به [[Special:FileList|فهرست پرونده‌ها]] بروید. بارگذاری نیز مجدد در [[Special:Log/upload|سیاههٔ بارگذاری‌ها]] و حذف پرونده‌ها در [[Special:Log/delete|deletion log]] ثبت می‌شود.\n\nبعد از این که پرونده‌ای را بارگذاری کردید، به این سه شکل می‌توانید آن را در صفحات استفاده کنید:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' برای استفاده از نسخه کامل پرونده\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' برای استفاده از یک نسخه ۲۰۰ پیکسلی از پرونده درون یک جعبه در سمت چپ متن که عبارت alt text در آن به عنوان توضیح استفاده شده\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' برای ایجاد یک پیونده مستقیم به پرونده بدون نمایش پرونده",
        "upload-permitted": "انواع مجاز پرونده‌ها: $1.",
        "upload-preferred": "انواع ترجیح‌داده شده پرونده‌ها: $1.",
        "upload-prohibited": "انواع نامجاز پرونده‌ها: $1.",
        "ignorewarning": "چشم‌پوشی از هشدار و ذخیرهٔ پرونده.",
        "ignorewarnings": "چشم‌پوشی از همهٔ هشدارها",
        "minlength1": "نام پرونده دست کم باید یک حرف باشد.",
-       "illegalfilename": "نام پرونده «$1» نویسه‌هایی را شامل می‌شود که در نام صفحه‌ها مجاز نیستند.\nلطفاً نام پرونده را تغییر دهید و آن را دوباره بارگذاری کنید.",
+       "illegalfilename": "نام پرونده «$1» نویسه‌هایی را شامل می‌شود که در نام صفحات مجاز نیستند.\nلطفاً نام پرونده را تغییر دهید و آن را دوباره بارگذاری کنید.",
        "filename-toolong": "نام پرونده نباید از ۲۴۰ بایت طولانی‌تر باشد.",
        "badfilename": "نام پرونده به «$1» تغییر کرد.",
        "filetype-mime-mismatch": "پسوند پرونده «$1.‎» با نوع MIME آن ($2) مطابقت ندارد.",
        "filerevert-comment": "دلیل:",
        "filerevert-defaultcomment": "واگردانی به نسخهٔ $1 ساعت $2",
        "filerevert-submit": "برو",
-       "filerevert-success": "''[[Media:$1|$1]]''' به [$4 نسخهٔ مورخ $2 ساعت $3] واگردانده شد.",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> به [$4 نسخهٔ مورخ $2 ساعت $3] واگردانده شد.",
        "filerevert-badversion": "نسخهٔ قدیمی‌تری از این پرونده وجود نداشت.",
        "filedelete": "حذف $1",
        "filedelete-legend": "حذف پرونده",
        "listduplicatedfiles-summary": "این فهرست پرونده‌هایی با نسخه‌های اخیر این پرونده تکراری است که نسخه‌های اخبر سایر پرونده‌ها است. فقط پرونده‌های محلی در نظر گرفته شده‌اند.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]][[$3|{{PLURAL:$2|یک تکرار|$2 تکرار}}]] دارد.",
        "unusedtemplates": "الگوهای استفاده‌نشده",
-       "unusedtemplatestext": "این صفحه همهٔ صفحه‌هایی در فضای نام {{ns:template}} را که در هیچ صفحه‌ای به کار نرفته‌اند، فهرست می‌کند.\nبه یاد داشته باشید که پیش از پاک‌کردن این صفحه‌ها پیوندهای دیگر به آنها را هم وارسی کنید.",
+       "unusedtemplatestext": "این صفحه همهٔ صفحاتی در فضای نام {{ns:template}} را که در هیچ صفحه‌ای به کار نرفته‌اند، فهرست می‌کند.\nبه یاد داشته باشید که پیش از پاک‌کردن این صفحات پیوندهای دیگر به آنها را هم وارسی کنید.",
        "unusedtemplateswlh": "پیوندهای دیگر",
        "randompage": "مقالهٔ تصادفی",
        "randompage-nopages": "هیچ صفحه‌ای در این {{PLURAL:$2|فضای نام|فضاهای نام}} موجود نیست: $1.",
        "randomincategory": "صفحهٔ تصادفی در رده",
        "randomincategory-invalidcategory": "«$1» نامی معتبر برای یک ردهٔ نیست.",
        "randomincategory-nopages": "هیج صفحه‌ای در رده [[:Category:$1|$1]] وجود ندارد.",
-       "randomincategory-selectcategory": "دریافت صفحه‌ای تصادفی از دسته‌بندی: $1 $2.",
-       "randomincategory-selectcategory-submit": "برو",
+       "randomincategory-category": "رده:",
+       "randomincategory-legend": "صفحهٔ تصادفی در رده",
        "randomredirect": "تغییرمسیر تصادفی",
        "randomredirect-nopages": "هیج صفحهٔ تغییرمسیری در فضای نام «$1» موجود نیست.",
        "statistics": "آمار",
-       "statistics-header-pages": "آمار صفحه‌ها",
+       "statistics-header-pages": "آمار صفحه",
        "statistics-header-edits": "آمار ویرایش‌ها",
        "statistics-header-views": "آمار بازدیدها",
        "statistics-header-users": "آمار کاربران",
        "statistics-header-hooks": "آمارهای دیگر",
        "statistics-articles": "صفحه‌های محتوایی",
-       "statistics-pages": "صفحه‌ها",
+       "statistics-pages": "صفحات",
        "statistics-pages-desc": "تمام صفحه‌های این ویکی، از جمله صفحه‌های بحث، تغییرمسیر و غیره",
        "statistics-files": "پرونده‌های بارگذاری‌شده",
        "statistics-edits": "ویرایش صفحه‌ها از هنگامی که {{SITENAME}} راه‌اندازی شده",
        "brokenredirects-edit": "ویرایش",
        "brokenredirects-delete": "حذف",
        "withoutinterwiki": "صفحه‌های بدون پیوند میان‌ویکی",
-       "withoutinterwiki-summary": "این صفحه‌ها پیوندی به صفحه‌ای به زبان دیگر نمی‌دارند:",
+       "withoutinterwiki-summary": "این صفحات پیوندی به صفحه‌ای به زبان دیگر نمی‌دارند:",
        "withoutinterwiki-legend": "پیشوند",
        "withoutinterwiki-submit": "نمایش",
        "fewestrevisions": "مقاله‌های دارای کمترین شمار ویرایش",
        "wantedtemplates": "الگوهای مورد نیاز",
        "mostlinked": "صفحه‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
        "mostlinkedcategories": "رده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
-       "mostlinkedtemplates": "ببشترین صفحه‌های تراگنجایش‌شده",
+       "mostlinkedtemplates": "ببشترین صفحات تراگنجانده‌شده",
        "mostcategories": "صفحه‌های دارای بیشترین رده",
        "mostimages": "پرونده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
        "mostinterwikis": "صفحه‌های دارای بیشترین میان‌ویکی",
        "mostrevisions": "صفحه‌های دارای بیشترین نسخه",
-       "prefixindex": "تمام صفحه‌ها با پیشوند",
+       "prefixindex": "تمام صفحات با پیشوند",
        "prefixindex-namespace": "همهٔ صفحه‌های دارای پیشوند (فضای‌نام $1)",
        "prefixindex-strip": "حذف پیشوند در فهرست",
        "shortpages": "صفحه‌های کوتاه",
        "protectedpages-timestamp": "برچسب زمان",
        "protectedpages-page": "صفحه",
        "protectedpages-expiry": "انقضا",
-       "protectedpages-performer": "در حال حفاظت از کاربر",
+       "protectedpages-performer": "کاربر حفاظت‌کننده",
        "protectedpages-params": "پارامترهای حفاظت",
        "protectedpages-reason": "دلیل",
        "protectedpages-unknown-timestamp": "ناشناس",
        "usercreated": "{{GENDER:$3|ایجادشده}} در تاریخ $1 در ساعت $2",
        "newpages": "صفحه‌های تازه",
        "newpages-username": "نام کاربری:",
-       "ancientpages": "قدیمی‌ترین صفحه‌ها",
+       "ancientpages": "قدیمی‌ترین صفحات",
        "move": "انتقال",
        "movethispage": "انتقال این صفحه",
        "unusedimagestext": "پرونده‌های زیر موجودند اما در هیچ صفحه‌ای به کار نرفته‌اند.\nلطفاً توجه داشته باشید که دیگر وبگاه‌ها ممکن است با یک نشانی اینترنتی مستقیم به یک پرونده پیوند دهند، و با وجود این که در استفادهٔ فعال هستند در این جا فهرست شوند.",
        "booksources": "منابع کتاب",
        "booksources-search-legend": "جستجوی منابع کتاب",
        "booksources-isbn": "شابک:",
-       "booksources-go": "برو",
+       "booksources-search": "جستجو",
        "booksources-text": "در زیر فهرستی از پیوندها به وبگاه‌های دیگر آمده‌است که کتاب‌های نو و دست دوم می‌فروشند، و همچنین ممکن است اطلاعات بیشتری راجع به کتاب مورد نظر شما داشته باشند:",
        "booksources-invalid-isbn": "شابک داده شده مجاز به نظر نمی‌رسد؛ از جهت اشکالات هنگام کپی کردن از منبع اصلی بررسی کنید.",
        "specialloguserlabel": "مجری:",
        "alllogstext": "نمایش یک‌جای تمام سیاهه‌های موجود در {{SITENAME}}.\nمی‌توانید با انتخاب نوع سیاهه، نام کاربری (حساس به کوچکی و بزرگی حروف) و صفحه‌های تغییریافته (حساس به بزرگی و کوچکی حروف)، نمایش را محدودتر سازید.",
        "logempty": "مورد منطبق با منظور شما در سیاهه یافت نشد.",
        "log-title-wildcard": "صفحه‌هایی را جستجو کن که عنوانشان با این عبارت آغاز می‌شود",
-       "showhideselectedlogentries": "تغÛ\8cÛ\8cر Ù¾Ø¯Û\8cدارÛ\8c Ù\85Ù\88ارد Ø§Ù\86تخابâ\80\8cشدÙ\87 Ø¯Ø± Ø³Û\8cاÙ\87Ù\87",
-       "allpages": "همهٔ صفحه‌ها",
+       "showhideselectedlogentries": "تغییر پدیداری موارد انتخاب‌شده سیاهه",
+       "allpages": "همهٔ صفحات",
        "nextpage": "صفحهٔ بعد ($1)",
        "prevpage": "صفحهٔ قبلی ($1)",
-       "allpagesfrom": "نمایش صفحه‌ها با شروع از:",
-       "allpagesto": "نمایش صفحه‌ها با پایان در:",
-       "allarticles": "همهٔ صفحه‌ها",
-       "allinnamespace": "همهٔ صفحه‌ها (فضای نام $1)",
+       "allpagesfrom": "نمایش صفحات با شروع از:",
+       "allpagesto": "نمایش صفحات با پایان در:",
+       "allarticles": "همهٔ صفحات",
+       "allinnamespace": "همهٔ صفحات (فضای نام $1)",
        "allpagessubmit": "برو",
        "allpagesprefix": "نمایش صفحه‌های دارای پیشوند:",
-       "allpagesbadtitle": "عنوان صفحهٔ داده‌شده نامعتبر است یا اینکه دارای پیشوندی بین‌زبانی یا بین‌ویکی‌ای است. ممکن است نویسه‌هایی بدارد که نمی‌توان از آنها در عنوان صفحه‌ها استفاده کرد.",
+       "allpagesbadtitle": "عنوان صفحهٔ داده‌شده نامعتبر است یا اینکه دارای پیشوندی بین‌زبانی یا بین‌ویکی‌ای است. ممکن است نویسه‌هایی بدارد که نمی‌توان از آنها در عنوان صفحات استفاده کرد.",
        "allpages-bad-ns": "{{SITENAME}} دارای فضای نام «$1» نیست.",
        "allpages-hide-redirects": "پنهان‌کردن تغییرمسیرها",
        "cachedspecial-viewing-cached-ttl": "شما در حال مشاهدهٔ نسخه‌ای از این صفحه که در میانگیر قرار دارد هستید که ممکن است برای $1 قبل باشد.",
        "cachedspecial-viewing-cached-ts": "شما در حال مشاهدهٔ نسخه‌ای از این صفحه که در میانگیر قرار دارد هستید، و این نسخه ممکن است کاملاً واقعی نباشد.",
        "cachedspecial-refresh-now": "مشاهده آخرین.",
        "categories": "رده‌ها",
-       "categoriespagetext": "{{PLURAL:$1|ردهٔ|رده‌های}} زیر دارای صفحه‌ها یا پرونده‌هایی {{PLURAL:$1|است|هستند}}.\n[[Special:UnusedCategories|رده‌های استفاده‌نشده]] در اینجا نمایش داده نشده‌اند.\nهمچنین [[Special:WantedCategories|رده‌های مورد نیاز]] را ببینید.",
+       "categoriespagetext": "{{PLURAL:$1|ردهٔ|رده‌های}} زیر دارای صفحات یا پرونده‌هایی {{PLURAL:$1|است|هستند}}.\n[[Special:UnusedCategories|رده‌های استفاده‌نشده]] در اینجا نمایش داده نشده‌اند.\nهمچنین [[Special:WantedCategories|رده‌های مورد نیاز]] را ببینید.",
        "categoriesfrom": "نمایش رده‌ها با شروع از:",
        "special-categories-sort-count": "مرتب کردن بر اساس تعداد",
        "special-categories-sort-abc": "مرتب کردن الفبایی",
        "post-expand-template-inclusion-category-desc": "پس از گسترش همهٔ الگوها، حجم صفحه بزرگتر از <code>$wgMaxArticleSize</code> است بنابراین بعضی از الگو گسترش نیافته‌اند.",
        "post-expand-template-argument-category-desc": "پس از گسترش یک آرگومان الگو (چیزی بین آکولادهای سه‌تایی، مانند <code>{{{Foo}}}</code>) صفحه بزرگ‌تر از <code>$wgMaxArticleSize</code> می‌شود.",
        "expensive-parserfunction-category-desc": "توابع هزینه‌بر گران (مانند <code>#ifexist</code>) زیادی در صفجه استفاده شده‌ است. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] را ببینید.",
-       "broken-file-category-desc": "ردÙ\87 Ø§Ù\81زÙ\88د Ù\85Û\8câ\80\8cØ´Ù\88د Ø§Ú¯Ø± ØµÙ\81Ø­Ù\87 Ø´Ø§Ù\85Ù\84 Û\8cÚ© Ù¾Û\8cÙ\88Ù\86د Ø´Ú©Ø³ØªÙ\87 Ø¨Ø§Ø´Ø¯ (Û\8cا Û\8cÚ© Ù¾Ø¨Ù\88Ù\86د Ø¨Ù\87 Ù¾Ø±Ù\88Ù\86دÙ\87Ù\94 ØªÙ\88کارÛ\8c Ø§Ø³Øª Ú©Ù\87 Ù\88جÙ\88د Ù\86دارد)",
-       "hidden-category-category-desc": "اÛ\8cÙ\86 Û\8cÚ© Ø±Ø¯Ù\87Ù\94 <code><nowiki>__HIDDENCAT__</nowiki></code> Ø¯Ø±Ù\88Ù\86Ø´ Ø§Ø³Øª Ú©Ù\87 Ø§Ø² Ù\86Ù\85اÛ\8cشش Ø¯Ø± Ø¬Ø¹Ø¨Ù\87Ù\94 Ù¾Û\8cÙ\88Ù\86دÙ\87اÛ\8c Ø±Ø¯Ù\87 Ø¨Ù\87â\80\8cصÙ\88رت Ù¾Û\8cØ´â\80\8cÙ\81رض جلوگیری می‌کند.",
+       "broken-file-category-desc": "صÙ\81Ø­Ù\87 Ø´Ø§Ù\85Ù\84 Û\8cÚ© Ù¾Û\8cÙ\88Ù\86د Ù¾Ø±Ù\88Ù\86دÙ\87 Ø®Ø±Ø§Ø¨ Ø§Ø³Øª (Ù¾Û\8cÙ\88Ù\86دÛ\8c Ø¨Ø±Ø§Û\8c Ø¬Ø§Ø³Ø§Ø²Û\8câ\80\8cکردÙ\86 Û\8cÚ© Ù¾Ø±Ù\88Ù\86دÙ\87 Ù\87Ù\86گاÙ\85Û\8c Ú©Ù\87 Ø¢Ù\86 Ù¾Ø±Ù\88Ù\86دÙ\87 Ù\88جÙ\88د Ù\86دارد).",
+       "hidden-category-category-desc": "ردÙ\87 Ø¯Ø± Ù\85حتÙ\88اÛ\8c ØµÙ\81Ø­Ù\87â\80\8cاش Ø´Ø§Ù\85Ù\84 <code><nowiki>__HIDDENCAT__</nowiki></code> Ø§Ø³ØªØ\8c Ú©Ù\87 Ø§Ø² Ø¨Ù\87 Ø·Ù\88ر Ù¾Û\8cØ´â\80\8cÙ\81رض Ù\86شاÙ\86â\80\8cدادÙ\86 Ø¬Ø¹Ø¨Ù\87 Ù¾Û\8cÙ\88Ù\86دÙ\87اÛ\8c Ø±Ø¯Ù\87 Ø¯Ø± ØµÙ\81حات جلوگیری می‌کند.",
        "trackingcategories-nodesc": "توضیحی وجود ندارد.",
        "trackingcategories-disabled": "رده غیرفعال‌شده است",
        "mailnologin": "نشانی‌ای از فرستنده موجود نیست",
        "wlheader-enotif": "آگاه‌سازی رایانامه‌ای فعال است.",
        "wlheader-showupdated": "صفحه‌هایی که پس از آخرین بازدید شما تغییر کرده‌اند '''پررنگ''' نمایش داده شده‌اند.",
        "wlnote": "در زیر {{PLURAL:$1|تغییری|<strong>$1</strong> تغییری}} که در {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4",
-       "wlshowlast": "نمایش آخرین $1 ساعت $2 روز $3",
+       "wlshowlast": "نمایش آخرین $1 ساعت $2 روز",
        "watchlist-options": "گزینه‌های پی‌گیری",
        "watching": "پی‌گیری...",
        "unwatching": "توقف پی‌گیری...",
        "watcherrortext": "ایرادی در هنگام عوض کردن تنظیمات فهرست پیگیرتان برای «$1» رخ داد.",
-       "enotif_reset": "نشان‌گذاری همهٔ صفحه‌ها به‌عنوان بازدیدشده",
+       "enotif_reset": "نشان‌گذاری همهٔ صفحات به‌عنوان بازدیدشده",
        "enotif_impersonal_salutation": "کاربر {{SITENAME}}",
        "enotif_subject_deleted": "{{SITENAME}} صفحهٔ $1 توسط {{gender:$2|$2}} حذف شد.",
        "enotif_subject_created": "{{SITENAME}} صفحهٔ $1 توسط {{gender:$2|$2}} ایجاد شده.",
        "exbeforeblank": "محتوای صفحه قبل از خالی‌کردن این بود: «$1»",
        "delete-confirm": "حذف «$1»",
        "delete-legend": "حذف",
-       "historywarning": "'''هشدار!''' صفحه‌ای که قصد دارید حذف کنید تاریخچه‌ای با حدود $1 {{PLURAL:$1|نسخه|نسخه}} دارد:",
+       "historywarning": "<strong>هشدار:</strong> صفحه‌ای که در حال پاک‌کردن آن هستید دارای یک تاریخچه همراه $1 {{PLURAL:$1|بازبینی|بازبینی‌ها}} است:",
        "confirmdeletetext": "شما در حال حذف کردن یک صفحه یا تصویر از پایگاه داده‌ها همراه با تمام تاریخچهٔ آن هستید.\nلطفاً این عمل را تأیید کنید و اطمینان حاصل کنید که عواقب این کار را می‌دانید و این عمل را مطابق با [[{{MediaWiki:Policy-url}}|سیاست‌ها]] انجام می‌دهید.",
        "actioncomplete": "عمل انجام شد",
        "actionfailed": "عمل ناموفق بود",
        "deletereasonotherlist": "دلیل دیگر",
        "deletereason-dropdown": "*دلایل متداول حذف\n** هرزنگار\n** خرابکاری\n** نقض حق تکثیر\n** درخواست کاربر\n** تغییرمسیر شکسته",
        "delete-edit-reasonlist": "ویرایش دلایل حذف",
-       "delete-toobig": "این صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.\nبه منظور جلوگیری از اختلال ناخواسته در {{SITENAME}} حذف این گونه صفحه‌ها محدود شده‌است.",
+       "delete-toobig": "این صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.\nبه منظور جلوگیری از اختلال ناخواسته در {{SITENAME}} حذف این گونه صفحات محدود شده‌است.",
        "delete-warning-toobig": "این صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.\nحذف آن ممکن است که عملکرد پایگاه دادهٔ {{SITENAME}} را مختل کند;\nبا احتیاط ادامه دهید.",
-       "delete-cantedit": "چون شما مجوز ویرایش این صفحه ندارید، نمی‌توانید حذفش کنید.",
-       "deleting-backlinks-warning": "''' هشدار:''' پیوند [[Special:WhatLinksHere/{{FULLPAGENAME}}|صفحات دیگر]] یا تراگنجایش صفحهٔ شما برای حذف.",
+       "deleteprotected": "شما نمی‌توانید این صفحه را پاک کنید چون که از آن محافظت شده‌است.",
+       "deleting-backlinks-warning": "''' هشدار:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|صفحه‌های دیگری]] هستند که به صفحه‌ای که شما در حال حذف آن هستید پیوند دارند یا آن را تراگنجانیده‌اند.",
        "rollback": "واگردانی ویرایش‌ها",
        "rollback_short": "واگردانی",
        "rollbacklink": "واگردانی",
        "protect_expiry_old": "زمان سرآمدن در گذشته‌است.",
        "protect-unchain-permissions": "باز کردن سایر گزینه‌های محافظت",
        "protect-text": "شما می‌توانید سطح محافظت صفحهٔ '''$1''' را ببینید و از اینجا آن را تغییر دهید.",
-       "protect-locked-blocked": "شما در مدتی که دسترسی‌تان قطع است نمی‌توانید سطح محافظت صفحه‌ها را تغییر دهید.\nتنظیمات فعلی صفحهٔ '''$1''' از این قرار است:",
+       "protect-locked-blocked": "شما در مدتی که دسترسی‌تان قطع است نمی‌توانید سطح محافظت صفحات را تغییر دهید.\nتنظیمات فعلی صفحهٔ '''$1''' از این قرار است:",
        "protect-locked-dblock": "به دلیل قفل شدن پایگاه داده، امکان تغییر سطح محافظت صفحه وجود ندارد.\nتنظیمات فعلی صفحهٔ '''$1''' به این قرار است:",
        "protect-locked-access": "حساب کاربری شما اجازهٔ تغییر سطح محافظت صفحه را ندارد.\nتنظیمات فعلی صفحهٔ '''$1''' به این قرار است:",
        "protect-cascadeon": "این صفحه  در حال حاضر محافظت شده‌است زیرا در {{PLURAL:$1|صفحهٔ|صفحه‌های}} زیر که گزینهٔ محافظت آبشاری {{PLURAL:$1|آن|آن‌ها}} فعال است، گنجانده شده است.\nتغییراتی به سطح محافظت این صفحه به محافظت ابشاری تأثیر نخواهد گذاشت.",
        "protect-othertime": "زمانی دیگر:",
        "protect-othertime-op": "زمانی دیگر",
        "protect-existing-expiry": "زمان انقضای موجود: $2، $3",
+       "protect-existing-expiry-infinity": "زمان انقضای موجود: بی‌نهایت",
        "protect-otherreason": "دلیل دیگر/اضافی:",
        "protect-otherreason-op": "دلیل دیگر",
        "protect-dropdown": "*دلایل متداول محافظت\n** خرابکاری گسترده\n** هرزنگاری گسترده\n** جنگ ویرایشی غیر سازنده\n** صفحهٔ پر بازدید",
        "undelete-header": "برای دیدن صفحه‌های حذف‌شدهٔ اخیر [[Special:Log/delete|سیاههٔ حذف]] را ببینید.",
        "undelete-search-title": "جستجوی صفحه‌های حذف‌شده",
        "undelete-search-box": "جستجوی صفحه‌های حذف‌شده.",
-       "undelete-search-prefix": "نمایش صفحه‌ها با شروع از:",
+       "undelete-search-prefix": "نمایش صفحات با شروع از:",
        "undelete-search-submit": "برو",
        "undelete-no-results": "هیچ صفحهٔ منطبقی در بایگانی حذف‌شده‌ها یافت نشد.",
        "undelete-filename-mismatch": "امکان احیای نسخهٔ $1 وجود ندارد: نام پرونده مطابقت نمی‌کند.",
        "contribsub2": "برای {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "حساب کاربری «$1» ثبت نشده‌است.",
        "nocontribs": "هیچ تغییری با این مشخصات یافت نشد.",
-       "uctop": "(نسخه کنونی)",
+       "uctop": "(نسخهٔ کنونی)",
        "month": "در این ماه (و پیش از آن):",
        "year": "در این سال (و پیش از آن):",
        "sp-contributions-newbies": "فقط مشارکت‌های تازه‌کاران نمایش داده شود",
        "autoblockid": "شناسه قطع دسترسی خودکار #$1",
        "block": "بستن کاربر",
        "unblock": "بازکردن کاربر",
-       "blockip": "بستن کاربر",
+       "blockip": "مسدودکردن {{GENDER:$1|کاربر}}",
        "blockip-legend": "بستن کاربر",
        "blockiptext": "از فرم زیر برای بستن دسترسی ویرایش یک نشانی آی‌پی یا نام کاربری مشخص استفاده کنید.\nاین کار فقط فقط باید برای جلوگیری از خرابکاری و بر اساس [[{{MediaWiki:Policy-url}}|سیاست قطع دسترسی]] انجام شود.\nدلیل مشخص این کار را در زیر ذکر کنید (مثلاً با ذکر صفحه‌های به‌خصوصی که مورد خرابکاری واقع شده‌اند).",
        "ipaddressorusername": "نشانی آی‌پی یا نام کاربری:",
        "ipbexpiry": "زمان سرآمدن:",
        "ipbreason": "دلیل:",
-       "ipbreason-dropdown": "*دلایل متداول قطع دسترسی\n**واردکردن اطلاعات نادرست\n**پاک‌کردن اطلاعات مفید از صفحه‌ها\n**هرزنگاری از طریق درج مکرر پیوند به وب‌گاه‌ها\n**درج چرندیات یا نوشته‌های بی‌معنا در صفحه‌ها\n**تهدید یا ارعاب دیگر کاربران\n**سوء استفاده از چند حساب کاربری\n**نام کاربری نامناسب",
+       "ipbreason-dropdown": "*دلایل متداول قطع دسترسی\n**واردکردن اطلاعات نادرست\n**پاک‌کردن اطلاعات مفید از صفحات\n**هرزنگاری از طریق درج مکرر پیوند به وب‌گاه‌ها\n**درج چرندیات یا نوشته‌های بی‌معنا در صفحات\n**تهدید یا ارعاب دیگر کاربران\n**سوء استفاده از چند حساب کاربری\n**نام کاربری نامناسب",
        "ipb-hardblock": "جلوگیری از ویرایش کردن کاربران ثبت نام کرده از طریق این نشانی آی‌پی",
        "ipbcreateaccount": "جلوگیری از ایجاد حساب",
        "ipbemailban": "جلوگیری از ارسال رایانامه",
        "unblocked": "دسترسی [[User:$1|$1]] دوباره برقرار شد",
        "unblocked-range": "$1 باز شد",
        "unblocked-id": "قطع دسترسی شماره $1 خاتمه یافت",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] رفع قطع دسترسی شد.",
        "blocklist": "کاربران بسته‌شده",
        "ipblocklist": "کاربران بسته‌شده",
        "ipblocklist-legend": "جستجوی کاربر بسته شده",
        "contribslink": "مشارکت‌ها",
        "emaillink": "ارسال رایانامه",
        "autoblocker": "به طور خودکار بسته شد چون آی‌پی شما به تازگی توسط کاربر «[[User:$1|$1]]» استفاده شده‌است.\nدلیل قطع دسترسی $1 چنین است \"$2\"",
-       "blocklogpage": "سÛ\8cاÙ\87Ù\87Ù\94 Ø¨Ø³ØªÙ\87â\80\8cشدÙ\86â\80\8cÙ\87ا",
+       "blocklogpage": "سÛ\8cاÙ\87Ù\87Ù\94 Ø¨Ø³ØªÙ\86",
        "blocklog-showlog": "دسترسی این کاربر در گذشته بسته شده‌است.\nسیاههٔ قطع دسترسی در زیر نمایش یافته است:",
        "blocklog-showsuppresslog": "دسترسی این کاربر قبلاً بسته شده و این کاربر پنهان شده‌است.\nسیاههٔ قطع دسترسی در زیر نمایش یافته است:",
        "blocklogentry": "«[[$1]]» را تا $2 بست $3",
        "ipbnounblockself": "شما مجاز به باز کردن دسترسی خود نیستید.",
        "lockdb": "قفل کردن پایگاه داده",
        "unlockdb": "از قفل در آوردن پایگاه داده",
-       "lockdbtext": "قفل کردن پایگاه داده امکان ویرایش صفحه‌ها، تغییر تنظیمات، ویرایش پی‌گیری‌ها، و سایر تغییراتی را که نیازمند تغییری در پایگاه داده است، از همهٔ کاربران سلب می‌کند.\nلطفاً تأیید کنید که همین کار را می‌خواهید انجام دهید، و در اولین فرصت پایگاه داده را از حالت قفل شده خارج خواهید کرد.",
-       "unlockdbtext": "از قفل در آوردن پایگاه داده به تمامی کاربران اجازه می‌دهد که توانایی ویرایش صفحه‌ها، تغییر تنظیمات، تغییر پی‌گیری‌ها و هر تغییر دیگری که نیازمند تغییر در پایگاه داده باشد را دوباره به دست بیاورند.\nلطفاً تأیید کنید که همین کار را می‌خواهید انجام دهید.",
+       "lockdbtext": "قفل کردن پایگاه داده امکان ویرایش صفحات، تغییر تنظیمات، ویرایش پی‌گیری‌ها، و سایر تغییراتی را که نیازمند تغییری در پایگاه داده است، از همهٔ کاربران سلب می‌کند.\nلطفاً تأیید کنید که همین کار را می‌خواهید انجام دهید، و در اولین فرصت پایگاه داده را از حالت قفل شده خارج خواهید کرد.",
+       "unlockdbtext": "از قفل در آوردن پایگاه داده به تمامی کاربران اجازه می‌دهد که توانایی ویرایش صفحات، تغییر تنظیمات، تغییر پی‌گیری‌ها و هر تغییر دیگری که نیازمند تغییر در پایگاه داده باشد را دوباره به دست بیاورند.\nلطفاً تأیید کنید که همین کار را می‌خواهید انجام دهید.",
        "lockconfirm": "بله، من جداً می‌خواهم پایگاه داده را قفل کنم.",
        "unlockconfirm": "بله، من جداً می‌خواهم پایگاه داده را از قفل در آورم.",
        "lockbtn": "قفل کردن پایگاه داده",
        "lockedbyandtime": "(به وسیلهٔ $1 در $2 ساعت $3)",
        "move-page": "انتقال $1",
        "move-page-legend": "انتقال صفحه",
-       "movepagetext": "با استفاده از فرم زیر نام صفحه تغییر خواهد کرد، و تمام تاریخچه‌اش به نام جدید منتقل خواهد شد.\nعنوان قدیمی تبدیل به یک صفحهٔ تغییرمسیر به عنوان جدید خواهد شد.\nشما می‌توانید تغییرمسیرهایی که به عنوان اصلی اشاره دارند را به صورت خودکار به‌روزرسانی کنید.\nپیوندهای که به عنوان صفحهٔ قدیمی وجود دارند، تغییر نخواهند کرد؛ حتماً تغییرمسیرهای [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خراب]] را بررسی کنید.\n'''شما''' مسئول اطمینان از این هستید که پیوندها هنوز به همان‌جایی که قرار است بروند.\n\nتوجه کنید که اگر از قبل صفحه‌ای در عنوان جدید وجود داشته باشد صفحه منتقل '''نخواهد شد'''،\nمگر این آخرین ویرایش تغییرمسیر باشد و در  تاریخچهٔ ویرایشی نداشته باشد.\nاین یعنی اگر اشتباه کردید می‌توانید صفحه را به همان جایی که از آن منتقل شده بود برگردانید، و این که نمی‌توانید روی صفحه‌ها موجود بنویسید.\n\n'''هشدار!'''\nانتقال صفحه‌ها به نام جدید ممکن است تغییر اساسی و غیرمنتظره‌ای برای صفحه‌های محبوب باشد؛\nلطفاً مطمئن شوید که قبل از انتقال دادن صفحه، عواقب این کار را درک می‌کنید.",
+       "movepagetext": "با استفاده از فرم زیر نام صفحه تغییر خواهد کرد، و تمام تاریخچه‌اش به نام جدید منتقل خواهد شد.\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": "صفحهٔ بحث مربوط، اگر وجود داشته باشد، بطور خودکار همراه با مقالهٔ اصلی منتقل خواهد شد '''مگر اینکه''' :\n* در حال انتقال صفحه از این فضای نام به فضای نام دیگری باشید،\n* یک صفحهٔ بحث غیرخالی تحت این نام جدید وجود داشته باشد، یا\n* جعبهٔ زیر را تیک نزده باشید.\n\nدر این حالات، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
        "movearticle": "انتقال صفحه:",
        "moveuserpage-warning": "'''هشدار:''' شما در حال انتقال دادن یک صفحهٔ کاربر هستید. توجه داشته باشید که تنها صفحه منتقل می‌شود و نام کاربر تغییر '''نمی‌یابد'''.",
        "movecategorypage-warning": "<strong>هشدار:</strong> شما در حال انتقال صفحه رده هستید. لطفاً توجه داشته باشید که فقط صفحه منتقل خواهد شد و  صفحات در رده قدیمی می‌مانند و به رده جدید <em>نمی‌روند</em>.",
-       "movenologintext": "برای انتقال صفحه‌ها باید کاربر ثبت‌شده بوده و [[Special:UserLogin|به سامانه وارد شوید]].",
-       "movenotallowed": "شما اجازهٔ انتقال دادن صفحه‌ها را ندارید.",
+       "movenologintext": "برای انتقال صفحات باید کاربر ثبت‌شده بوده و [[Special:UserLogin|به سامانه وارد شوید]].",
+       "movenotallowed": "شما اجازهٔ انتقال دادن صفحات را ندارید.",
        "movenotallowedfile": "شما اجازهٔ انتقال پرونده‌ها را ندارید.",
        "cant-move-user-page": "شما اجازه ندارید صفحه‌های کاربری سرشاخه را انتقال دهید.",
        "cant-move-to-user-page": "شما اجازه ندارید که یک صفحه را به یک صفحهٔ کاربر انتقال دهید (به استثنای زیر صفحه‌های کاربری).",
        "cant-move-category-page": "شما اجازهٔ انتقال دادن صفحهٔ رده‌ها را ندارید.",
        "cant-move-to-category-page": "شما مجوز برای انتقال صفحه به صفحه رده ندارید.",
-       "newtitle": "به‌عنوان جدید",
+       "newtitle": "به عنوان تازه:",
        "move-watch": "پی‌گیری صفحه‌های مبدأ و مقصد",
        "movepagebtn": "صفحه منتقل شود",
        "pagemovedsub": "انتقال با موفقیت انجام شد",
        "movepage-page-unmoved": "صفحهٔ $1 را نمی‌توان به $2 انتقال داد.",
        "movepage-max-pages": "حداکثر تعداد صفحه‌های ممکن ($1 {{PLURAL:$1|صفحه|صفحه}}) که می‌توان انتقال داد منتقل شدند و صفحه‌های دیگر را نمی‌توان به طور خودکار منتقل کرد.",
        "movelogpage": "سیاههٔ انتقال",
-       "movelogpagetext": "در زیر فهرستی از انتقال صفحه‌ها آمده است.",
+       "movelogpagetext": "در زیر فهرستی از انتقال صفحات آمده‌است.",
        "movesubpage": "{{PLURAL:$1|زیرصفحه|زیرصفحه‌ها}}",
        "movesubpagetext": "این صفحه $1 زیرصفحه دارد که در زیر نمایش {{PLURAL:$1|یافته‌است|یافته‌اند}}.",
        "movenosubpage": "این صفحه هیچ زیرصفحه‌ای ندارد.",
        "bad-target-model": "مقصد مورد نظر از مدل محتوایی متفاوتی استفاده می‌کند. تبدیل $1 به $2 ممکن نیست.",
        "imagenocrossnamespace": "امکان انتقال تصویر به فضای نام غیر پرونده وجود ندارد",
        "nonfile-cannot-move-to-file": "امکان انتقال محتوای غیر پرونده به فضای نام پرونده وجود ندارد",
-       "imagetypemismatch": "پسÙ\88Ù\86د Ù¾Ø±Ù\88Ù\86دÙ\87 Ø¬Ø¯Û\8cد با نوع آن سازگار نیست",
+       "imagetypemismatch": "پسÙ\88Ù\86د Ù¾Ø±Ù\88Ù\86دÙ\87 ØªØ§Ø²Ù\87 با نوع آن سازگار نیست",
        "imageinvalidfilename": "نام پروندهٔ هدف نامجاز است",
        "fix-double-redirects": "به روز کردن تمامی تغییرمسیرهایی که به مقالهٔ اصلی اشاره می‌کنند",
        "move-leave-redirect": "بر جا گذاشتن یک تغییرمسیر",
        "semiprotectedpagemovewarning": "'''تذکر:''' این صفحه قفل شده‌است به طوری که تنها کاربران ثبت نام کرده می‌توانند آن را انتقال دهند.\nآخرین موارد سیاهه در زیر آمده است:",
        "move-over-sharedrepo": "== پرونده موجود است ==\n[[:$1]] در یک مخزن مشترک وجود دارد. انتقال یک پرونده به این نام باعث باطل شدن پرونده مشترک خواهد شد.",
        "file-exists-sharedrepo": "نام پرونده انتخاب شده از قبل در یک مخزن مشترک استفاده شده‌است.\nلطفاً یک نام دیگر برگزینید.",
-       "export": "برون‌بری صفحه‌ها",
-       "exporttext": "شما می‌توانید متن و تاریخچهٔ ویرایش یک صفحهٔ مشخص یا مجموعه‌ای از صفحه‌ها را به شکل پوشیده در اکس‌ام‌ال برون‌بری کنید.\nاین اطلاعات را می‌توان در ویکی دیگری که نرم‌افزار «مدیاویکی» را اجرا می‌کند از طریق [[Special:Import|صفحهٔ درون‌ریزی]] وارد کرد.\n\nبرای برون‌بری صفحه‌ها، عنوان آن‌ها را در جعبهٔ زیر وارد کنید (در هر سطر فقط یک عنوان) و مشخص کنید که آیا نسخهٔ اخیر صفحه را به همراه نسخه‌های قدیمی‌تر و تاریخچهٔ صفحه می‌خواهید، یا تنها نسخهٔ اخیر صفحه و اطلاعات آخرین ویرایش را می‌خواهید.\n\nدر حالت دوم، شما می‌توانید از یک پیوند استفاده کنید، مثلاً [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] برای صفحهٔ «[[{{MediaWiki:Mainpage}}]]».",
-       "exportall": "برون‌بری همهٔ صفحه‌ها",
+       "export": "برون‌بری صفحات",
+       "exporttext": "شما می‌توانید متن و تاریخچهٔ ویرایش یک صفحهٔ مشخص یا مجموعه‌ای از صفحات را به شکل پوشیده در اکس‌ام‌ال برون‌بری کنید.\nاین اطلاعات را می‌توان در ویکی دیگری که نرم‌افزار «مدیاویکی» را اجرا می‌کند از طریق [[Special:Import|صفحهٔ درون‌ریزی]] وارد کرد.\n\nبرای برون‌بری صفحات، عنوان آن‌ها را در جعبهٔ زیر وارد کنید (در هر سطر فقط یک عنوان) و مشخص کنید که آیا نسخهٔ اخیر صفحه را به همراه نسخه‌های قدیمی‌تر و تاریخچهٔ صفحه می‌خواهید، یا تنها نسخهٔ اخیر صفحه و اطلاعات آخرین ویرایش را می‌خواهید.\n\nدر حالت دوم، شما می‌توانید از یک پیوند استفاده کنید، مثلاً [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] برای صفحهٔ «[[{{MediaWiki:Mainpage}}]]».",
+       "exportall": "برون‌بری همهٔ صفحات",
        "exportcuronly": "فقط نسخهٔ فعلی شامل شود، نه کل تاریخچه",
-       "exportnohistory": "----\n'''توجه:''' امکان برون‌بری تاریخچهٔ کامل صفحه‌ها از طریق این صفحه به دلایل اجرایی از کار انداخته شده‌است.",
+       "exportnohistory": "----\n'''توجه:''' امکان برون‌بری تاریخچهٔ کامل صفحات از طریق این صفحه به دلایل اجرایی از کار انداخته شده‌است.",
        "exportlistauthors": "شامل فهرست کامل مشارکت‌کنندگان هر صفحه",
        "export-submit": "برون‌بری",
-       "export-addcattext": "افزودن صفحه‌ها از رده:",
+       "export-addcattext": "افزودن صفحات از رده:",
        "export-addcat": "افزودن",
-       "export-addnstext": "افزودن صفحه‌ها از فضای نام:",
+       "export-addnstext": "افزودن صفحات از فضای نام:",
        "export-addns": "افزودن",
        "export-download": "ذخیره به صورت پرونده",
        "export-templates": "شامل شدن الگوها",
        "thumbnail_gd-library": "تنظیمات ناقص کتابخانهٔ GD: عملکرد $1 وجود ندارد",
        "thumbnail_image-missing": "پرونده به نظر گم شده‌است: $1",
        "thumbnail_image-failure-limit": "تلاش‌های ناموفق اخیر بسیاری ($1 یا بیشتر) برای ارائهٔ این تصویر کوچک وجود داشته‌ است. لطفأ بعداً دوباره تلاش کنید.",
-       "import": "درون‌ریزی صفحه‌ها",
+       "import": "درون‌ریزی صفحات",
        "importinterwiki": "درون‌ریزی تراویکی",
-       "import-interwiki-text": "یک ویکی و یک نام صفحه را انتخاب کنید تا اطلاعات از آن درون‌ریزی شود.\nتاریخ نسخه‌ها و نام ویرایش‌کنندگان ثابت خواهد ماند.\nاطلاعات مربوط به درون‌ریزی صفحه‌ها در [[Special:Log/import|سیاههٔ درون‌ریزی‌ها]] درج خواهد شد.",
-       "import-interwiki-source": "ویکی/صفحهٔ منبع:",
+       "import-interwiki-text": "یک ویکی و یک نام صفحه را انتخاب کنید تا اطلاعات از آن درون‌ریزی شود.\nتاریخ نسخه‌ها و نام ویرایش‌کنندگان ثابت خواهد ماند.\nاطلاعات مربوط به درون‌ریزی صفحات در [[Special:Log/import|سیاههٔ درون‌ریزی‌ها]] درج خواهد شد.",
+       "import-interwiki-sourcewiki": "ویکی منبع:",
+       "import-interwiki-sourcepage": "صفحهٔ مبدأ:",
        "import-interwiki-history": "تمام نسخه‌های تاریخچهٔ این صفحه انتقال داده شود",
        "import-interwiki-templates": "تمام الگوها را شامل شود",
        "import-interwiki-submit": "درون‌ریزی شود",
        "import-interwiki-namespace": "فضای نام مقصد:",
-       "import-interwiki-rootpage": "مقصد صفحه ٔ مبنا (اختیاری):",
+       "import-interwiki-rootpage": "ریشهٔ صفحهٔ مقصد (اختیاری):",
        "import-upload-filename": "نام پرونده:",
        "import-comment": "توضیح:",
        "importtext": "لطفاً پرونده را از ویکی منبع با کمک [[Special:Export|ابزار برون‌بری]] دریافت کنید.\nسپس آن را روی دستگاه‌تان ذخیره کنید و اینجا بارگذاری نمایید.",
-       "importstart": "در حال درون‌ریزی صفحه‌ها...",
+       "importstart": "در حال درون‌ریزی صفحات...",
        "import-revision-count": "$1 {{PLURAL:$1|ویرایش|ویرایش}}",
        "importnopages": "صفحه‌ای برای درون‌ریزی نیست.",
        "imported-log-entries": "$1 {{PLURAL:$1|مورد سیاهه|مورد سیاهه}} درون ریزی شد.",
-       "importfailed": "درون‌ریزی صفحه‌ها شکست خورد: <nowiki>$1</nowiki>",
+       "importfailed": "درون‌ریزی صفحات شکست خورد: <nowiki>$1</nowiki>",
        "importunknownsource": "نوع مأخذ درون‌ریزی معلوم نیست",
-       "importcantopen": "پروندهٔ درون‌ریزی صفحه‌ها باز نشد",
+       "importcantopen": "پروندهٔ درون‌ریزی صفحات باز نشد",
        "importbadinterwiki": "پیوند میان‌ویکی نادرست",
        "importsuccess": "درون‌ریزی با موفقیت انجام شد!",
        "importnosources": "هیچ منبعی برای درون‌ریزی اطلاعات از ویکی دیگر تعریف نشده‌است.",
        "importuploaderrortemp": "در بارگذاری پروندهٔ درون‌ریزی، اشکال رخ داد.\nپوشهٔ موقت پیدا نشد.",
        "import-parse-failure": "خطا در تجزیهٔ اکس‌ام‌ال بارگذاری‌شده",
        "import-noarticle": "صفحه‌ای برای بارگذاری وجود ندارد!",
-       "import-nonewrevisions": "Ù\87Û\8cÚ\86 Ø¨Ø§Ø²Ø¨Û\8cÙ\86Û\8c Ù\88ارد Ù\86شدÙ\87 (همه یا در حال حاضر وجود دارند، یا به دلیل خطا‌ها نادیده گرفته شده‌اند).",
+       "import-nonewrevisions": "Ù\86سخÙ\87â\80\8cاÛ\8c Ø¯Ø±Ù\88Ù\86â\80\8cرÛ\8cزÛ\8c Ù\86شد (همه یا در حال حاضر وجود دارند، یا به دلیل خطا‌ها نادیده گرفته شده‌اند).",
        "xml-error-string": "$1 در سطر $2، ستون $3 (بایت $4): $5",
        "import-upload": "بارگذاری داده اکس‌ام‌ال",
        "import-token-mismatch": "از دست رفتن اطلاعات نشست کاربری. لطفاً دوباره امتحان کنید.",
        "import-rootpage-invalid": "با توجه به ریشه صفحه عنوان نامعتبر است.",
        "import-rootpage-nosubpage": "فضای نام  \"$1\" صفحهٔ مبنا اجازهٔ زیرصفحه نمی‌دهد.",
        "importlogpage": "سیاههٔ درون‌ریزی‌ها",
-       "importlogpagetext": "درون‌ریزی صفحه‌ها به همراه تاریخچهٔ ویرایش آن‌ها از ویکی‌های دیگر.",
+       "importlogpagetext": "درون‌ریزی صفحات به همراه تاریخچهٔ ویرایش آن‌ها از ویکی‌های دیگر.",
        "import-logentry-upload": "[[$1]] را از طریق بارگذاری پرونده درون‌ریزی کرد",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} واردشده",
        "import-logentry-interwiki": "$1 را تراویکی کرد",
        "tooltip-ca-unwatch": "حذف این صفحه از فهرست پی‌گیری‌هایتان",
        "tooltip-search": "جستجو در {{SITENAME}}",
        "tooltip-search-go": "در صورت امکان به صفحه‌ای با همین نام برو",
-       "tooltip-search-fulltext": "جستجوی این عبارت در صفحه‌ها",
+       "tooltip-search-fulltext": "جستجوی این عبارت در صفحات",
        "tooltip-p-logo": "مشاهدهٔ صفحهٔ اصلی",
        "tooltip-n-mainpage": "مشاهدهٔ صفحهٔ اصلی",
        "tooltip-n-mainpage-description": "مشاهدهٔ صفحهٔ اصلی",
        "creditspage": "اعتبارات این صفحه",
        "nocredits": "اطلاعات سازندگان این صفحه موجود نیست.",
        "spamprotectiontitle": "پالایهٔ هرزنگاری‌ها",
-       "spamprotectiontext": "از Ø°Ø®Û\8cرÙ\87 Ú©Ø±Ø¯Ù\86 ØµÙ\81Ø­Ù\87 ØªÙ\88سط Ù¾Ø§Ù\84اÛ\8cÙ\87Ù\94 Ù\87رزÙ\86گارÛ\8câ\80\8cÙ\87ا Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø´Ø¯.\nÙ\85عÙ\85Ù\88Ù\84اÙ\8b Ø§Û\8cÙ\86 Ø§ØªÙ\81اÙ\82 Ø²Ù\85اÙ\86Û\8c Ù\85Û\8câ\80\8cاÙ\81تد Ú©Ù\87 Ù\85تÙ\86 Ø¬Ø¯Û\8cد صفحه، حاوی پیوندی به یک نشانی وب باشد که در فهرست سیاه قرار دارد.",
+       "spamprotectiontext": "از Ø°Ø®Û\8cرÙ\87 Ú©Ø±Ø¯Ù\86 ØµÙ\81Ø­Ù\87 ØªÙ\88سط Ù¾Ø§Ù\84اÛ\8cÙ\87Ù\94 Ù\87رزÙ\86گارÛ\8câ\80\8cÙ\87ا Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø´Ø¯.\nÙ\85عÙ\85Ù\88Ù\84اÙ\8b Ø§Û\8cÙ\86 Ø§ØªÙ\81اÙ\82 Ø²Ù\85اÙ\86Û\8c Ù\85Û\8câ\80\8cاÙ\81تد Ú©Ù\87 Ù\85تÙ\86 ØªØ§Ø²Ù\87 صفحه، حاوی پیوندی به یک نشانی وب باشد که در فهرست سیاه قرار دارد.",
        "spamprotectionmatch": "متن زیر چیزی‌است که پالایهٔ هرزه‌نگاری ما را به کارانداخت: $1",
        "spambot_username": "هرزه‌تمیزکارِ مدیاویکی",
        "spam_reverting": "واگردانی به آخرین نسخه‌ای که پیوندی به $1 ندارد.",
        "pageinfo-magic-words": "{{PLURAL:$1|حرف|حروف}} جادویی ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1| ردهٔ|ردهٔ}} پنهان ( $1 )",
        "pageinfo-templates": "{{PLURAL:$1|الگو|الگو}} استفاده‌شده ($1)",
-       "pageinfo-transclusions": "{{PLURAL:$1|صفحهٔ|صفحه‌های}} تراگنجایش‌شده در ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|صفحهٔ|صفحه‌های}} تراگنجانش‌شده در ($1)",
        "pageinfo-toolboxlink": "اطلاعات صفحه",
        "pageinfo-redirectsto": "تغییرمسیر به",
        "pageinfo-redirectsto-info": "اطلاعات",
        "pageinfo-protect-cascading-yes": "بله",
        "pageinfo-protect-cascading-from": "محافظت آبشاری از",
        "pageinfo-category-info": "اطلاعات رده",
-       "pageinfo-category-pages": "تعداد صفحه‌ها",
+       "pageinfo-category-pages": "تعداد صفحات",
        "pageinfo-category-subcats": "تعداد زیررده‌ها",
        "pageinfo-category-files": "تعداد پرونده‌ها",
        "markaspatrolleddiff": "برچسب گشت بزن",
        "exif-urgency-low": "کم ($1)",
        "exif-urgency-high": "زیاد ($1)",
        "exif-urgency-other": "اولویت تعریف شده توسط کاربر ($1)",
-       "watchlistall2": "همه",
        "namespacesall": "همه",
        "monthsall": "همهٔ ماه‌ها",
        "confirmemail": "تأیید نشانی رایانامه",
        "autosumm-blank": "صفحه را خالی کرد",
        "autosumm-replace": "جایگزینی صفحه با '$1'",
        "autoredircomment": "تغییرمسیر به [[$1]]",
-       "autosumm-new": "صÙ\81Ø­Ù\87â\80\8cاÛ\8c Ø¬Ø¯Û\8cد حاوی «$1» ایجاد کرد",
+       "autosumm-new": "صÙ\81Ø­Ù\87â\80\8cاÛ\8c ØªØ§Ø²Ù\87 حاوی «$1» ایجاد کرد",
        "autosumm-newblank": "ایجاد صفحه خالی",
        "size-bytes": "$1 بایت",
        "size-kilobytes": "$1 کیلوبایت",
        "specialpages-group-media": "گزارش بارگذاری رسانه‌ها",
        "specialpages-group-users": "کاربرها و دسترسی‌ها",
        "specialpages-group-highuse": "صفحه‌های پربازدید",
-       "specialpages-group-pages": "فهرست‌های صفحه‌ها",
-       "specialpages-group-pagetools": "ابزارهای صفحه‌ها",
+       "specialpages-group-pages": "فهرست‌های صفحات",
+       "specialpages-group-pagetools": "ابزارهای صفحات",
        "specialpages-group-wiki": "داده و ابزارها",
        "specialpages-group-redirects": "صفحه‌های ویژهٔ تغییرمسیر دهنده",
        "specialpages-group-spam": "ابزارهای هرزنگاری",
        "tags": "برچسب‌های تغییر مجاز",
        "tag-filter": "پالایش [[Special:Tags|برچسب‌ها]]:",
        "tag-filter-submit": "پالایه",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|برچسب|برچسب}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|برچسب|برچسب‌ها}}]]: $2)",
        "tags-title": "برچسب‌ها",
        "tags-intro": "این صفحه فهرستی‌است از برچسب‌هایی که نرم‌افزار با آن‌ها ویرایش‌ها را علامت‌گذری می‌کند، به همراه معانی آن‌ها.",
        "tags-tag": "نام برچسب",
        "tags-active-no": "خیر",
        "tags-edit": "ویرایش",
        "tags-hitcount": "$1 {{PLURAL:$1|تغییر|تغییر}}",
-       "comparepages": "مقایسهٔ صفحه‌ها",
+       "comparepages": "مقایسهٔ صفحات",
        "compare-page1": "صفحهٔ ۱",
        "compare-page2": "صفحهٔ ۲",
        "compare-rev1": "نسخهٔ ۱",
        "logentry-rights-rights": "$1 عضویت $3 را از گروه $4 به $5 {{GENDER:$2|تغییر داد}}",
        "logentry-rights-rights-legacy": "$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}",
        "logentry-rights-autopromote": "$1 به طور خودکار از $4 به $5 {{GENDER:$2|ارتقاء داد}}",
-       "logentry-upload-upload": "$1 {{GENDER:$2|بارگذاری کرد}} $3",
-       "logentry-upload-overwrite": "$1 یک نسخهٔ جدید {{GENDER:$2|بارگذاری‌کرد}} $3",
+       "logentry-upload-upload": "$1 $3 را {{GENDER:$2|بارگذاری کرد}}",
+       "logentry-upload-overwrite": "$1 نسخهٔ تازه‌ای از $3 را {{GENDER:$2|بارگذاری کرد}}",
        "logentry-upload-revert": "$1 {{GENDER:$2|بارگذاری کرد}} $3",
        "rightsnone": "(هیچ)",
+       "revdelete-summary": "خلاصه ویرایش",
        "feedback-bugornote": "اگر آماده‌اید تا مشکلی فنی را با جزئیاتش شرح دهید لطفاً [$1 یک ایراد گزارش دهید]. در غیر این صورت می‌توانید از فرم سادهٔ زیر استفاده کنید. نظر شما به همراه نام کاربری و مرورگرتان به صفحهٔ «[$3 $2]» افزوده خواهد شد.",
        "feedback-subject": "موضوع:",
        "feedback-message": "پیغام:",
        "feedback-thanks": "سپاس! بازخورد شما در صفحهٔ «[$1 $2]» ثبت شد.",
        "feedback-close": "انجام شد",
        "feedback-bugcheck": "عالی‌است! فقط بررسی کنید که از [$1 ایرادهای شناخته‌شده] نباشد.",
-       "feedback-bugnew": "بررسÛ\8c Ú©Ø±Ø¯Ù\85. Ø§Û\8cرادÛ\8c Ø¬Ø¯Û\8cد را گزارش بده",
+       "feedback-bugnew": "بررسÛ\8c Ú©Ø±Ø¯Ù\85. Ø§Û\8cرادÛ\8c ØªØ§Ø²Ù\87 را گزارش بده",
        "searchsuggest-search": "جستجو",
        "searchsuggest-containing": "صفحه‌های دربردارنده...",
        "api-error-badaccess-groups": "شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.",
        "duration-millennia": "{{PLURAL:$1|هزار سال |$1 هزار سال}}",
        "rotate-comment": "تصویر به دست $1 {{PLURAL:$1|درجهٔ|درجهٔ}} ساعت‌گرد چرخانده شد",
        "limitreport-title": "داده‌های رخ‌نمانگاری تجزیه‌کننده:",
-       "limitreport-cputime": "زمان مصرف سی‌پی‌یو",
+       "limitreport-cputime": "زمان مصرفی سی‌پی‌یو",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|ثانیه}}",
-       "limitreport-walltime": "استÙ\81ادÙ\87 Ø²Ù\85اÙ\86 واقعی",
+       "limitreport-walltime": "زÙ\85اÙ\86 Ù\85صرÙ\81Û\8c واقعی",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه}}",
-       "limitreport-ppvisitednodes": "شمارش گرهٔ پیش‌پردازنده مشاهده‌شده",
-       "limitreport-ppgeneratednodes": "شمارش گره پیش‌پردازنده تولیدشده",
-       "limitreport-postexpandincludesize": "شاÙ\85Ù\84 Ø§Ù\86دازÙ\87 Ù¾Ø³ گسترش",
+       "limitreport-ppvisitednodes": "شمارندهٔ گره بازدیدشدهٔ پیش‌پردازنده",
+       "limitreport-ppgeneratednodes": "شمارندهٔ گره تولیدی پیش‌پردازنده",
+       "limitreport-postexpandincludesize": "اÙ\86دازÙ\87Ù\94 Ø¯Ø±Ø¨Ø±Ú¯Û\8cرÙ\86دÙ\87 Ù¾Ø³ Ø§Ø² گسترش",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|بایت|بایت}}",
-       "limitreport-templateargumentsize": "اÙ\86دازÙ\87 Ø¹Ù\85Ù\84گر الگو",
+       "limitreport-templateargumentsize": "اÙ\86دازÙ\87 Ø¢Ø±Ú¯Ù\88Ù\85اÙ\86 الگو",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بایت|بایت}}",
        "limitreport-expansiondepth": "بیشترین عمق گسترش",
        "limitreport-expensivefunctioncount": "تعداد تابع تجزیه‌گر پرمصرف",
        "log-name-pagelang": "تغییر سیاههٔ زبان",
        "log-description-pagelang": "این سیاههٔ تغییرات صفحهٔ زبان‌ها است.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2| تغییریافت}} زبان صفحه برای  $3  از  $4  به  $5 .",
+       "default-skin-not-found": "اوه! پوسته پیش‌فرض برای ویکی شما تعریف‌شده در <code dir=\"ltr\"<$wgDefaultSkin</code> به‌عنوان <code>$1</code>، در دسترس نیست.\n\nبه نظر می‌آید نصب شما شامل پوسته‌های زیر می‌شود. [https://www.mediawiki.org/wiki/Manual:Skin_configuration راهنما: تنظیمات پوسته] را برای کسب اطلاعات در باره چگونگی فعال‌ساختن آن‌ها و انتخاب پیش‌فرض ببینید.\n\n$2\n\n; اگر اخیراً مدیاویکی را نصب کرده‌اید:\n: احتمالاً از گیت، یا به طور مستقیم از کد مبدأ که از چند متد دیگر استفاده می‌کند نصب کردید. انتظار می‌رود. چند پوسته از [https://www.mediawiki.org/wiki/Category:All_skins فهرست پوسته mediawiki.org] نصب کنید، که همراه چندین پوسته و افزونه هستند. شما می‌توانید شاخه <code>skins/</code> را از آن نسخه‌برداری کرده و بچسبانید.\n\n:* همسانه‌سازی یکی از مخازن <code>mediawiki/skins/*</code> از طریق گیت به داخل شاخه <code dir=\"ltr\">skins/</code> از نصب مدیاویکی‌تان.\n: انجام این کار با مخزن گیت‌تان تداخل نمی‌کند اگر توسعه‌دهنده مدیاویکی هستید.\n\n; اگر اخیراً مدیاویکی را ارتقاء دادید:\n: مدیاویکی ۱٫۲۴ و تازه‌تر دیگر به طور خودکار پوسته‌های نصب‌شده را فعال نمی‌کند ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery راهنما: کشف خودکار پوسته] را ببینید). شما می‌توانید خطوط زیر را به داخل <code>LocalSettings.php</code> بچسبانید تا همه پوسته‌های نصب‌شده جاری را فعال کنید:\n\n<pre dir=\"ltr\">$3</pre>\n\n; اگر اخیراً <code>LocalSettings.php</code> را تغییر دادید:\n: نام پوسته‌ها را برای غلط املایی دوباره بررسی کنید.",
+       "default-skin-not-found-no-skins": "پوستهٔ پیش‌فرض برای ویکی شما تعریف‌شده در<code>$wgDefaultSkin</code> به‌عنوان <code>$1</code>، هست موجود نیست.\n\nشما پوسته‌ها را نصب نکرده‌اید.\n\n:اگر مدیاویکی را به‌روز یا نصب کرده‌اید:\n:ممکن است از گیت یا از کند منبع با روش های دیگر نصب کرده‌اید. انتظار می‌رود MediaWiki 1.24 یا جدیدتر در پوشهٔ اصلی هیچ پوسته‌ای نداشته باشند.\nسعی کنید تعدادی پوسته از [https://www.mediawiki.org/wiki/Category:All_skins پوشهٔ پوسته‌های مدیاویکی]، با:\n:*دانلود کردن [https://www.mediawiki.org/wiki/Download نصب‌کننده تاربال]، که با چندین پوسته و افزونه هست. شما می توانید پوستهٔ <code>skins/</code> را  از آن کپی و پیست کنید.\n:*کلون کردن یکی از <code dir=\"ltr\">mediawiki/skins/*</code> از ریپوزیتوری در پوشهٔ <code>skins/</code> مدیاویکی‌تان.\n:اگر توسعه‌دهندهٔ مدیاویکی هستید، انجام این کار نباید تعارضی با ریپوزیتوری گیت شما داشته باشد. برای اطلاعات بیشتر و فعال کردن پوسته‌ها و انتخاب آنها به عنوان پیش‌فرض [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: تنظیمات پوسته] را مشاهده کنید.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (فعال)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''غیر فعال''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''غیر فعال''')",
+       "mediastatistics": "آمار رسانه‌ها",
+       "mediastatistics-summary": "آمارها دربارهٔ نوع‌های پرونده‌ای به روزشده. این فقط شامل آخرین نسخهٔ پرونده است. نسخه‌های قدیمی یا حذف‌شده مسثنی هستند.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 بایت}} ($2؛ $3٪)",
+       "mediastatistics-table-mimetype": "نوع مایم",
+       "mediastatistics-table-extensions": "افزونه‌های محتمل",
+       "mediastatistics-table-count": "تعداد پرونده‌ها",
+       "mediastatistics-table-totalbytes": "حجم ترکیبی",
+       "mediastatistics-header-unknown": "ناشناخته",
+       "mediastatistics-header-bitmap": "تصاویر بیت‌مپ",
+       "mediastatistics-header-drawing": "طراحی‌ها (تصاویر برداری)",
+       "mediastatistics-header-audio": "صدا",
+       "mediastatistics-header-video": "ویدیو‌ها",
+       "mediastatistics-header-multimedia": "رسانه‌های غنی",
+       "mediastatistics-header-office": "دفتر",
+       "mediastatistics-header-text": "متنی",
+       "mediastatistics-header-executable": "اجرایی",
+       "mediastatistics-header-archive": "قالب‌های فشرده",
+       "json-warn-trailing-comma": "$1 کامای در انتها از جی‌سن {{PLURAL:$1|حذف شد}}.",
+       "json-error-unknown": "مشکلی با جی‌سن بود. خطا: $1",
+       "json-error-depth": "بیشینهٔ عمق پشته رد شده است",
+       "json-error-state-mismatch": "جی‌سن نادرست یا نافض",
+       "json-error-ctrl-char": "خطای نویسهٔ کنترلی، احتمالاً به نادرستی کدگذاری شده است",
+       "json-error-syntax": "خطای نحوی",
+       "json-error-utf8": "نویسه‌های نادرست یوتی‌اف-۸، احتمالاً نادرست کدگذاری شده است",
+       "json-error-recursion": "ارجاع بازگشتی یک یا بیشتر در مقداری که کذگذاری می‌شود",
+       "json-error-inf-or-nan": "مقادیر INF یا NAN یک یا بیشتر در مقداری که کدگذاری می‌شود",
+       "json-error-unsupported-type": "یک مقداری نوعی که نمی‌تواند کدگذاری شود داده شده است"
 }
index f28373f..f24b1a2 100644 (file)
@@ -40,7 +40,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Syreeni",
-                       "MrTapsa"
+                       "MrTapsa",
+                       "SMAUG"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "searchbutton": "Hae",
        "go": "Siirry",
        "searcharticle": "Siirry",
-       "history": "Historia",
+       "history": "Sivun historia",
        "history_short": "Historia",
        "updatedmarker": "päivitetty viimeisimmän käyntisi jälkeen",
        "printableversion": "Tulostettava versio",
        "otherlanguages": "Muilla kielillä",
        "redirectedfrom": "Ohjattu sivulta $1",
        "redirectpagesub": "Ohjaussivu",
+       "redirectto": "Ohjaus sivulle:",
        "lastmodifiedat": "Sivua on viimeksi muutettu $1 kello $2.",
        "viewcount": "Tämä sivu on näytetty {{PLURAL:$1|yhden kerran|$1 kertaa}}.",
        "protectedpage": "Suojattu sivu",
        "cannotdelete-title": "Sivua $1 ei voi poistaa",
        "delete-hook-aborted": "Laajennuskoodi esti poiston antamatta syytä.",
        "no-null-revision": "Nollamuokkausta sivulla \"$1\" ei voi tehdä",
-       "badtitle": "Virheellinen otsikko",
+       "badtitle": "Kelvoton sivun nimi",
        "badtitletext": "Pyytämäsi sivunimi oli virheellinen, tyhjä tai väärin linkitetty kieltenvälinen tai wikienvälinen nimi.\nSiinä saattaa olla yksi tai useampi sellainen merkki, jota ei voi käyttää sivujen nimissä.",
        "perfcached": "Nämä tiedot ovat välimuistista eivätkä välttämättä ole ajan tasalla. Välimuistissa on saatavilla enintään {{PLURAL:$1|yksi tulos|$1 tulosta}}.",
        "perfcachedts": "Nämä tiedot ovat välimuistista, ja ne on päivitetty viimeksi $1. Välimuistissa on saatavilla enintään {{PLURAL:$4|yksi tulos|$4 tulosta}}.",
        "createaccount-text": "Joku on luonut tunnuksen $2 {{GRAMMAR:illative|{{SITENAME}}}} ($4).\nTunnus on \"$2\" ja sen salasana on \"$3\". Sinun on syytä kirjautua sisään ja vaihtaa salasanasi heti.\n\nSinun ei tarvitse välittää tästä viestistä, jos tämä tunnus on luotu virheellisesti.",
        "login-throttled": "Olet tehnyt liian monta kirjautumisyritystä.\nOdota $1 ennen kuin yrität uudelleen.",
        "login-abort-generic": "Kirjautuminen epäonnistui – keskeytetty",
+       "login-migrated-generic": "Tunnuksesi on siirretty, ja käyttäjänimeäsi ei löydy enää tästä wikistä.",
        "loginlanguagelabel": "Kieli: $1",
        "suspicious-userlogout": "Pyyntösi kirjautua ulos evättiin, koska se näytti rikkinäisen selaimen tai välimuistipalvelimen lähettämältä.",
        "createacct-another-realname-tip": "Vapaaehtoinen.\nNimesi näytetään käyttäjätunnuksesi sijasta sivun tekijäluettelossa.",
        "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-header": "Muuta tunnuksen sähköpostiosoite",
        "changeemail-text": "Voit vaihtaa sähköpostiosoitteesi täyttämällä tämän lomakkeen. Muutoksen vahvistamiseen tarvitaan myös salasana.",
        "changeemail-no-info": "Tämän sivun käyttö edellyttää sisäänkirjautumista.",
        "changeemail-oldemail": "Nykyinen sähköpostiosoite:",
        "changeemail-none": "(ei asetettu)",
        "changeemail-password": "{{SITENAME}}-salasanasi:",
        "changeemail-submit": "Muuta sähköpostiosoite",
-       "changeemail-cancel": "Peruuta",
        "changeemail-throttled": "Olet tehnyt liian monta kirjautumisyritystä.\nOdota $1 ennen kuin yrität uudelleen.",
        "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.",
        "showpreview": "Esikatsele",
        "showdiff": "Näytä muutokset",
        "blankarticle": "<strong>Varoitus:</strong> Sivu, jota olet luomassa, on tyhjä.\nJos napsautat \"{{int:savearticle}}\" uudelleen, sivu luodaan ilman sisältöä.",
-       "anoneditwarning": "'''Varoitus:''' Et ole kirjautunut sisään.\nIP-osoitteesi kirjataan tämän sivun muutoshistoriaan.",
+       "anoneditwarning": "<strong>Varoitus:</strong> Et ole kirjautunut sisään. IP-osoitteesi näkyy julkisesti kaikille, jos muokkaat. Jos <strong>[$1 kirjaudut sisään]</strong> tai <strong>[$2 luot tunnuksen]</strong>, muokkauksesi kirjataan käyttäjätunnuksesi tekemiksi ja samalla saat käyttöösi hyödyllisiä välineitä.",
        "anonpreviewwarning": "''Et ole kirjautunut sisään. Tallentaminen kirjaa IP-osoitteesi tämän sivun muutoshistoriaan.''",
        "missingsummary": "Et ole antanut yhteenvetoa. Jos valitset Tallenna uudelleen, niin muokkauksesi tallennetaan ilman yhteenvetoa.",
        "missingcommenttext": "Kirjoita viesti alle.",
        "mergehistory-same-destination": "Lähde- ja kohdesivut eivät voi olla samat",
        "mergehistory-reason": "Syy:",
        "mergelog": "Yhdistämisloki",
-       "pagemerge-logentry": "yhdisti kohteen [[$1]] kohteeseen [[$2]] (muokkaukseen $3 saakka)",
+       "pagemerge-logentry": "yhdisti kohteen [[$1]] kohteeseen [[$2]] (versiot $3 saakka)",
        "revertmerge": "Peru yhdistäminen",
        "mergelogpagetext": "Alla on loki viimeisimmistä muutoshistorioiden yhdistämisistä.",
        "history-title": "Sivun ”$1” muutoshistoria",
        "compareselectedversions": "Vertaile valittuja versioita",
        "showhideselectedversions": "Näytä tai piilota valitut versiot",
        "editundo": "kumoa",
-       "diff-empty": "(ei eroavaisuuksia)",
+       "diff-empty": "(ei mitään eroa)",
        "diff-multi-sameuser": "({{PLURAL:$1|Yhtä välissä olevaa versiota|$1 välissä olevaa versiota}} samalta käyttäjältä ei näytetä)",
        "diff-multi-otherusers": "({{PLURAL:$1|Yhtä välissä olevaa versiota|$1 välissä olevaa versiota}} {{PLURAL:$2|toisen käyttäjän tekemänä|$2 käyttäjän tekeminä}} ei näytetä)",
        "diff-multi-manyusers": "(Versioiden välissä on {{PLURAL:$1|yksi muu muokkaus|$1 muuta muokkausta, jotka on tehnyt {{PLURAL:$2|yksi käyttäjä|yli $2 eri käyttäjää}}}}.)",
        "searchall": "kaikki",
        "showingresults": "Alla on vain {{PLURAL:$1|<strong>1</strong> hakutulos|<strong>$1</strong> hakutulosta}} alkaen tuloksesta nro <strong>$2</strong>.",
        "showingresultsinrange": "Alla näytetään {{PLURAL:$1|<strong>1</strong> tulos|<strong>$1</strong> tulosta}} väliltä <strong>$2</strong> – <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Tulokset '''$1'''–'''$3'''|Tulokset '''$1'''–'''$2''' kaikkiaan '''$3''' osuman joukosta}} haulle '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Tulos <strong>$1</strong> enimmäismäärästä <strong>$3</strong>|Tulokset <strong>$1 - $2</strong> enimmäismäärästä <strong>$3</strong>}}",
        "search-nonefound": "Hakusi ei tuottanut tulosta.",
        "powersearch-legend": "Laajennettu haku",
        "powersearch-ns": "Hae nimiavaruuksista:",
        "prefs-tokenwatchlist": "Avain",
        "prefs-diffs": "Eroavaisuudet",
        "prefs-help-prefershttps": "Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.",
+       "prefswarning-warning": "Olet tehnyt asetuksiisi muutoksia, joita ei ole vielä tallennettu.\nJos poistut sivulta klikkaamatta \"$1\", asetuksiasi ei päivitetä.",
        "prefs-tabs-navigation-hint": "Vihje: Voit käyttää vasenta ja oikeata nuolinäppäintä liikkumiseen välilehtien välillä.",
        "email-address-validity-valid": "Sähköpostiosoite vaikuttaa kelvolliselta",
        "email-address-validity-invalid": "Virheellinen sähköpostiosoite",
        "right-writeapi": "Käyttää kirjoitus-APIa",
        "right-delete": "Poistaa sivuja",
        "right-bigdelete": "Poistaa sivuja, joilla on pitkä historia",
-       "right-deletelogentry": "Poistaa ja palauttaa tiettyjä lokimerkintöjä",
-       "right-deleterevision": "Poistaa ja palauttaa sivujen versioita",
-       "right-deletedhistory": "Tarkastella poistettujen versioiden tietoja ilman niihin liittyvää tekstisisältöä",
-       "right-deletedtext": "Tarkastella poistettujen sivujen tekstiä ja muutoksia poistettujen versioiden välillä",
+       "right-deletelogentry": "Poistaa ja palauttaa näkyviin yksittäisiä lokimerkintöjä",
+       "right-deleterevision": "Poistaa ja palauttaa näkyviin sivujen yksittäisiä versioita",
+       "right-deletedhistory": "Nähdä poistetut merkinnät sivuhistoriassa ilman niihin liittyvää tekstisisältöä",
+       "right-deletedtext": "Nähdä poistettu teksti ja muutokset poistettujen versioiden välillä",
        "right-browsearchive": "Hakea poistettuja sivuja",
        "right-undelete": "Palauttaa poistettuja sivuja",
-       "right-suppressrevision": "Katsoa, piilottaa ja tuoda näkyviin tiettyjä sivujen versioita kaikilta käyttäjiltä",
+       "right-suppressrevision": "Nähdä, piilottaa ja tuoda näkyviin yksittäisiä sivujen versioita, jotka on piilotettu kaikilta käyttäjiltä",
        "right-viewsuppressed": "Katsoa versioita, jotka on piilotettu jokaiselta käyttäjältä",
-       "right-suppressionlog": "Tarkastella yksityisiä lokeja",
+       "right-suppressionlog": "Nähdä yksityiset lokit",
        "right-block": "Asettaa toiselle käyttäjälle muokkausesto",
        "right-blockemail": "Estää käyttäjää lähettämästä sähköpostia",
        "right-hideuser": "Estää käyttäjätunnus ja piilottaa se näkyvistä",
        "right-editmyusercss": "Muokata omia CSS-tiedostoja",
        "right-editmyuserjs": "Muokata omia JavaScript-tiedostoja",
        "right-viewmywatchlist": "Nähdä oma tarkkailulista",
-       "right-editmywatchlist": "Muokata tarkkailulistaasi. Huomaa, että jotkin toiminnot lisäävät yhä sivuja listallesi riippumatta tästä oikeudesta.",
+       "right-editmywatchlist": "Muokata omaa tarkkailulistaasi. (Jotkut toiminnot lisäävät edelleen sivuja listallesi ilmankin tätä oikeutta.)",
        "right-viewmyprivateinfo": "Nähdä omat yksityiset tietosi (esim. sähköpostiosoite, oikea nimi)",
        "right-editmyprivateinfo": "Muokata omia yksityisiä tietojasi (esim. sähköpostiosoite, oikea nimi)",
        "right-editmyoptions": "Muokata omia asetuksiasi",
        "right-patrol": "Merkitä muiden tekemät muokkaukset tarkastetuiksi",
        "right-autopatrol": "Omat muokkaukset on automaattisesti merkitty tarkastetuksi",
        "right-patrolmarks": "Nähdä tarkastusmerkit tuoreissa muutoksissa",
-       "right-unwatchedpages": "Nähdä luetteloa tarkkailemattomista sivuista",
+       "right-unwatchedpages": "Nähdä luettelon tarkkailemattomista sivuista",
        "right-mergehistory": "Yhdistää sivujen historioita",
        "right-userrights": "Muuttaa kaikkia käyttäjäoikeuksia",
        "right-userrights-interwiki": "Muokata käyttäjien oikeuksia muissa wikeissä",
        "action-userrights-interwiki": "muokata muiden wikien käyttäjien käyttöoikeuksia",
        "action-siteadmin": "lukita tai avata tietokantaa",
        "action-sendemail": "lähettää sähköpostia",
-       "action-editmywatchlist": "muokata tarkkailulistaasi",
+       "action-editmywatchlist": "muokata omaa tarkkailulistaasi",
        "action-viewmywatchlist": "tarkastella tarkkailulistaasi",
        "action-viewmyprivateinfo": "katsoa omia yksityisiä tietojasi",
        "action-editmyprivateinfo": "muokata omia yksityisiä tietojasi",
        "enhancedrc-history": "historia",
        "recentchanges": "Tuoreet muutokset",
        "recentchanges-legend": "Tuoreiden muutosten asetukset",
-       "recentchanges-summary": "Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.",
+       "recentchanges-summary": "Tällä sivulla voi seurata tuoreita tähän wikiin tehtyjä muutoksia.",
        "recentchanges-noresult": "Ei muutoksia, jotka täyttävät nämä kriteerit valitun ajanjakson aikana.",
        "recentchanges-feed-description": "Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.",
        "recentchanges-label-newpage": "Tämä muutos loi uuden sivun",
        "recentchangeslinked-toolbox": "Linkitettyjen sivujen muutokset",
        "recentchangeslinked-title": "Sivulta $1 linkitettyjen sivujen muutokset",
        "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": "Sivu",
+       "recentchangeslinked-page": "Sivun nimi:",
        "recentchangeslinked-to": "Näytä sen sijaan muutokset sivuihin, joista on linkki tähän sivuun",
        "upload": "Tallenna tiedosto",
        "uploadbtn": "Tallenna tiedosto",
        "upload-description": "Tiedoston kuvaus",
        "upload-options": "Tallennusasetukset",
        "watchthisupload": "Tarkkaile tätä tiedostoa",
-       "filewasdeleted": "Tämän niminen tiedosto on lisätty ja poistettu aikaisemmin. Tarkista $1 ennen jatkamista.",
+       "filewasdeleted": "Tiedosto tällä samalla nimellä on aikaisemmin tallennettu ja sittemmin poistettu.\nKatso $1 ennen kuin jatkat tiedoston tallentamista uudestaan.",
        "filename-bad-prefix": "Tallentamasi tiedoston nimi alkaa merkkijonolla '''$1''', joka on yleensä digitaalikameroiden automaattisesti antama nimi, joka ei kuvaa tiedoston sisältöä. Anna tiedostolle kuvaavampi nimi.",
        "filename-prefix-blacklist": " #<!-- älä muokkaa tätä riviä --> <pre>\n# Syntaksi on seuraava:\n#   * #-merkki aloittaa kommentin, joka jatkuu rivin loppuun\n#   * Jokainen epätyhjä rivi on tiedostonimien etuliite digitaalikameroiden yleisesti käyttämille tiedostonimille\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # jotkut matkapuhelimet\nIMG # yleinen\nJD # Jenoptik\nMGP # Pentax\nPICT # muut\n #</pre> <!-- älä muokkaa tätä riviä -->",
        "upload-success-subj": "Tallennus onnistui",
        "randomincategory": "Satunnainen sivu luokasta",
        "randomincategory-invalidcategory": "$1 ei ole kelvollinen luokan nimi.",
        "randomincategory-nopages": "Luokassa [[:Category:$1|$1]] ei ole sivuja.",
-       "randomincategory-selectcategory": "Hae satunnainen sivu luokasta: $1 $2",
-       "randomincategory-selectcategory-submit": "Hae",
+       "randomincategory-category": "Luokka:",
+       "randomincategory-legend": "Satunnainen sivu luokassa",
        "randomredirect": "Satunnainen ohjaus",
        "randomredirect-nopages": "Nimiavaruudessa ”$1” ei ole ohjaussivuja.",
        "statistics": "Tilastot",
        "unusedimagestext": "Seuraavat tiedostot ovat olemassa, mutta niitä ei käytetä millään sivulla.\nHuomaa, että muut verkkosivut saattavat viitata tiedostoon suoran URL:n avulla, jolloin tiedosto saattaa olla tässä listassa, vaikka sitä käytetäänkin.",
        "unusedcategoriestext": "Nämä luokat ovat olemassa, mutta niitä ei käytetä.",
        "notargettitle": "Ei kohdetta",
-       "notargettext": "Et ole määritellyt kohdesivua tai -käyttäjää johon toiminto kohdistuu.",
+       "notargettext": "Et ole määritellyt kohteeksi sivua tai käyttäjää, johon toiminto suoritetaan.",
        "nopagetitle": "Kohdesivua ei ole olemassa.",
        "nopagetext": "Määritettyä kohdesivua ei ole olemassa.",
        "pager-newer-n": "← {{PLURAL:$1|1 uudempi|$1 uudempaa}}",
        "booksources": "Kirjalähteet",
        "booksources-search-legend": "Etsi kirjalähteitä",
        "booksources-isbn": "ISBN",
-       "booksources-go": "Siirry",
+       "booksources-search": "Hae",
        "booksources-text": "Alla linkkejä ulkopuolisiin sivustoihin, joilla myydään uusia ja käytettyjä kirjoja. Sivuilla voi myös olla lisätietoa kirjoista.",
        "booksources-invalid-isbn": "Annettu ISBN-numero ei ole kelvollinen. Tarkista alkuperäisestä lähteestä kirjoitusvirheiden varalta.",
        "specialloguserlabel": "Suorittaja:",
        "allarticles": "Kaikki sivut",
        "allinnamespace": "Kaikki sivut nimiavaruudessa $1",
        "allpagessubmit": "Hae",
-       "allpagesprefix": "Katkaisuhaku",
+       "allpagesprefix": "Sivut, jotka alkavat etuliitteellä:",
        "allpagesbadtitle": "Annettu otsikko oli kelvoton tai siinä oli wikien välinen etuliite.",
        "allpages-bad-ns": "{{GRAMMAR:inessive|{{SITENAME}}}} ei ole nimiavaruutta ”$1”.",
        "allpages-hide-redirects": "Piilota ohjaukset",
        "linksearch-text": "Jokerimerkkejä, kuten \"*.wikipedia.org\", voidaan käyttää.\nVaaditaan vähintään ylätason verkkotunnus, esimerkiksi \"*.org\".<br />\n{{PLURAL:$2|Tuettu protokolla|Tuetut protokollat}}: <code>$1</code> (oletuksena on <code>http://</code>, jos protokollaa ei määritetä).",
        "linksearch-line": "$1 on linkitetty sivulta $2",
        "linksearch-error": "Jokerimerkkiä voi käyttää ainoastaan osoitteen alussa.",
-       "listusersfrom": "Katkaisuhaku",
+       "listusersfrom": "Käyttäjien tunnukset alkavat kirjaimilla:",
        "listusers-submit": "Hae",
        "listusers-noresult": "Käyttäjiä ei löytynyt.",
        "listusers-blocked": "(estetty)",
        "mywatchlist": "Tarkkailulista",
        "watchlistfor2": "Käyttäjälle $1 $2",
        "nowatchlist": "Tarkkailulistallasi ei ole sivuja.",
-       "watchlistanontext": "Sinun täytyy kirjautua sisään, jos haluat muokata kohteita omalla tarkkailulistallasi.",
+       "watchlistanontext": "Sinun täytyy kirjautua sisään, jos haluat nähdä oman tarkkailulistasi.",
        "watchnologin": "Et ole kirjautunut sisään",
        "addwatch": "Lisää tarkkailulistalle",
        "addedwatchtext": "Sivu '''[[:$1]]''' on lisätty [[Special:Watchlist|tarkkailulistallesi]].\nTulevaisuudessa sivuun ja sen keskustelusivuun tehtävät muutokset listataan täällä.",
        "wlheader-enotif": "Sähköposti-ilmoitus on käytössä.",
        "wlheader-showupdated": "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
        "wlnote": "Alla {{PLURAL:$1|on viimeisin muutos|ovat viimeisimmät <strong>$1</strong> muutosta}} edellisen {{PLURAL:$2|tunnin|<strong>$2</strong> tunnin}} ajalta $3 kello $4 lukien.",
-       "wlshowlast": "Näytä edelliset $1 tuntia tai $2 päivää tai $3",
+       "wlshowlast": "Näytä edelliset $1 tuntia tai $2 päivää",
        "watchlist-options": "Tarkkailulistan asetukset",
        "watching": "Lisätään tarkkailulistalle...",
        "unwatching": "Poistetaan tarkkailulistalta...",
        "exbeforeblank": "ennen tyhjentämistä sisälsi: ”$1”",
        "delete-confirm": "Poista ”$1”",
        "delete-legend": "Sivun poisto",
-       "historywarning": "'''Varoitus:''' Sivua, jota olet poistamassa, on muokattu noin $1 {{PLURAL:$1|kerta|kertaa}}:",
+       "historywarning": "<strong>Varoitus:</strong> Sivulla, jota olet poistamassa, on muokkaushistoriaa ja sitä on muokattu $1 {{PLURAL:$1|kerran|kertaa}}:",
        "confirmdeletetext": "Olet poistamassa sivun tai tiedoston ja kaiken sen historian. Ymmärrä teon seuraukset ja tee poisto {{GRAMMAR:genitive|{{SITENAME}}}} [[{{MediaWiki:Policy-url}}|käytäntöjen]] mukaisesti.",
        "actioncomplete": "Toiminto suoritettu",
        "actionfailed": "Toiminto epäonnistui",
        "dellogpagetext": "Alla on loki viimeisimmistä poistoista.",
        "deletionlog": "poistoloki",
        "reverted": "Palautettu aikaisempaan versioon",
-       "deletecomment": "Syy",
-       "deleteotherreason": "Muu syy tai tarkennus",
+       "deletecomment": "Syy:",
+       "deleteotherreason": "Muu syy tai tarkennus:",
        "deletereasonotherlist": "Muu syy",
        "deletereason-dropdown": "* Yleiset poistosyyt\n** Spam tai mainossivu\n** Vandalismi\n** Tekijänoikeusrikkomus\n** Sivun tekijän pyyntö\n** Virheellinen ohjaus",
        "delete-edit-reasonlist": "Muokkaa poistosyitä",
-       "delete-toobig": "Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistamista on rajoitettu suorituskykysyistä.",
+       "delete-toobig": "Tällä sivulla on pitkä muokkaushistoria, yli $1 {{PLURAL:$1|versio|versiota}}. \nTämänkaltaisten sivujen poistamista on rajoitettu. Tällä ehkäistään sivuston {{SITENAME}} vaurioitumista tahattomasti.",
        "delete-warning-toobig": "Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistaminen voi haitata sivuston suorituskykyä.",
-       "delete-cantedit": "Et voi poistaa tätä sivua, koska sinulla ei ole oikeutta sen muokkaamiseen.",
+       "deleteprotected": "Et voi poistaa tätä sivua, koska se on suojattu.",
        "deleting-backlinks-warning": "'''Varoitus:''' Sivulle, jota olet poistamassa, johtaa [[Special:WhatLinksHere/{{FULLPAGENAME}}|linkkejä muilta sivuilta]], tai sivu on sisällytetty muuhun sivuun.",
        "rollback": "palauta aiempaan versioon",
        "rollback_short": "Palautus",
        "protect-othertime": "Muu kesto:",
        "protect-othertime-op": "muu kesto",
        "protect-existing-expiry": "Nykyinen vanhentumisaika: $2 kello $3",
+       "protect-existing-expiry-infinity": "Nykyinen kesto: ikuinen",
        "protect-otherreason": "Muu syy tai tarkennus:",
        "protect-otherreason-op": "Muu syy",
        "protect-dropdown": "*Yleiset suojaussyyt\n** Jatkuva vandalismi\n** Jatkuva mainoslinkkien lisääminen\n** Muokkaussota\n** Suuri näkyvyys",
        "undelete": "Tarkastele poistettuja sivuja",
        "undeletepage": "Tarkastele ja palauta poistettuja sivuja",
        "undeletepagetitle": "'''Poistetut versiot sivusta [[:$1]]'''.",
-       "viewdeletedpage": "Poistettujen sivujen selaus",
+       "viewdeletedpage": "Tarkastele poistettuja sivuja",
        "undeletepagetext": "{{PLURAL:$1|Seuraava sivu|Seuraavat sivut}} on poistettu, mutta {{PLURAL:$1|se löytyy|ne löytyvät}} vielä arkistosta, joten {{PLURAL:$1|se|ne}} voidaan palauttaa takaisin. Arkisto saatetaan tyhjentää aika ajoin.",
        "undelete-fieldset-title": "Palauta versioita",
        "undeleteextrahelp": "Palauttaaksesi sivun koko muutoshistorian jätä kaikki valintalaatikot tyhjiksi ja napsauta '''''{{int:undeletebtn}}'''''.\nVoit palauttaa versioita valikoivasti valitsemalla vain niiden versioiden valintalaatikot, jotka haluat palauttaa.",
        "sp-contributions-blocked-notice": "Tämä käyttäjä on tällä hetkellä estetty. Alla on viimeisin estolokin tapahtuma:",
        "sp-contributions-blocked-notice-anon": "Tämä IP-osoite on tällä hetkellä estetty.\nAlla on viimeisin estolokin tapahtuma:",
        "sp-contributions-search": "Etsi muokkauksia",
-       "sp-contributions-username": "IP-osoite tai käyttäjätunnus",
+       "sp-contributions-username": "IP-osoite tai käyttäjätunnus:",
        "sp-contributions-toponly": "Näytä vain muokkaukset, jotka ovat viimeisimpiä versioita",
        "sp-contributions-newonly": "Näytä vain muokkaukset, joilla on luotu sivu",
        "sp-contributions-submit": "Hae",
        "whatlinkshere": "Tänne viittaavat sivut",
        "whatlinkshere-title": "Sivut, jotka viittaavat sivulle $1",
-       "whatlinkshere-page": "Sivu",
+       "whatlinkshere-page": "Sivu:",
        "linkshere": "Seuraavilta sivuilta on linkki sivulle <strong>[[:$1]]</strong>:",
        "nolinkshere": "Sivulle <strong>[[:$1]]</strong> ei ole linkkejä.",
        "nolinkshere-ns": "Sivulle <strong>[[:$1]]</strong> ei ole linkkejä valitussa nimiavaruudessa.",
        "blockip": "Estä {{GENDER:$1|käyttäjä}}",
        "blockip-legend": "Estä käyttäjä",
        "blockiptext": "Tällä toiminnolla voit estää käyttäjätunnusta tai IP-osoitetta muokkaamasta.<br />\nTällainen muokkausesto pitäisi asettaa vain vandalismin torjumiseksi ja [[{{MediaWiki:Policy-url}}|käytännön]] mukaisesti.\nKirjoita eston syy alla olevaan kenttään.",
-       "ipaddressorusername": "IP-osoite tai käyttäjätunnus",
+       "ipaddressorusername": "IP-osoite tai käyttäjätunnus:",
        "ipbexpiry": "Vanhentuu:",
        "ipbreason": "Syy:",
        "ipbreason-dropdown": "*Yleiset estosyyt\n** Väärän tiedon lisääminen\n** Sisällön poistaminen\n** Mainoslinkkien lisääminen\n** Sotkeminen tai roskan lisääminen\n** Häiriköinti\n** Useamman käyttäjätunnuksen väärinkäyttö\n** Sopimaton käyttäjätunnus",
        "unblocked": "Käyttäjän [[User:$1|$1]] esto on poistettu",
        "unblocked-range": "$1 ei ole enää estettynä",
        "unblocked-id": "Esto $1 on poistettu",
+       "unblocked-ip": "Käyttäjän [[Special:Contributions/$1|$1]] esto on poistettu.",
        "blocklist": "Estetyt käyttäjät",
        "ipblocklist": "Estetyt käyttäjät",
        "ipblocklist-legend": "Haku",
        "ipb-needreblock": "$1 on jo estetty. Haluatko muuttaa eston asetuksia?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Muu esto|Muut estot}}",
        "unblock-hideuser": "Et voi poistaa estoa tältä käyttäjältä, koska hänen käyttäjätunnuksensa on piilotettu.",
-       "ipb_cant_unblock": "Estoa ”$1” ei löytynyt. Se on saatettu poistaa.",
+       "ipb_cant_unblock": "Virhe: Estoa tunnuksella ”$1” ei löytynyt. Se on ehkä jo otettu pois.",
        "ipb_blocked_as_range": "IP-osoite $1 on estetty välillisesti ja sen estoa ei voi poistaa. Se on estetty osana verkkoaluetta $2, jonka eston voi poistaa",
        "ip_range_invalid": "Virheellinen IP-alue.",
        "ip_range_toolarge": "Suuremmat osoitealue-estot kuin /$1 eivät ole sallittuja.",
        "sorbsreason": "IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}.",
        "sorbs_create_account_reason": "IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}. \nEt voi luoda käyttäjätunnusta.",
        "xffblockreason": "Yhteydet IP-osoitteesta, joka löytyy sinun tai käyttämäsi välipalvelimen X-Forwarded-For-otsakkeesta, on estetty. Alkuperäinen estämisen syy oli: $1",
-       "cant-see-hidden-user": "Käyttäjä, jota yrität estää on jo estetty ja piilotettu. Koska sinulla ei ole hideuser-oikeutta, et voi nähdä tai muokata käyttäjän estoa.",
+       "cant-see-hidden-user": "Käyttäjä, jota yrität estää, on jo estetty ja käyttäjänimi on piilotettu. \nKoska sinulla ei ole hideuser-oikeutta, et voi nähdä tai muuttaa käyttäjän estoasetuksia.",
        "ipbblocked": "Et voi estää tai poistaa estoja muilta käyttäjiltä, koska itse olet estettynä",
        "ipbnounblockself": "Et ole oikeutettu poistamaan estoa itseltäsi",
        "lockdb": "Lukitse tietokanta",
        "import": "Tuo sivuja",
        "importinterwiki": "Tuo sivuja muista wikeistä (transwiki import)",
        "import-interwiki-text": "Valitse wiki ja sivun nimi tuontia varten.\nVersioiden päivämäärät ja muokkaajien nimet säilyvät ennallaan. \nKaikki wikienväliset tuontitapahtumat kirjataan [[Special:Log/import|tuontilokiin]].",
-       "import-interwiki-source": "Lähdewiki/sivu:",
+       "import-interwiki-sourcewiki": "Lähdewiki:",
+       "import-interwiki-sourcepage": "Lähdesivu:",
        "import-interwiki-history": "Kopioi sivun koko historia ja kaikki versiot",
        "import-interwiki-templates": "Ota mukaan kaikki mallineet",
        "import-interwiki-submit": "Tuo",
        "exif-urgency-low": "Matala ($1)",
        "exif-urgency-high": "Korkea ($1)",
        "exif-urgency-other": "Käyttäjän määrittelemä prioriteetti ($1)",
-       "watchlistall2": "koko historia",
        "namespacesall": "kaikki",
        "monthsall": "kaikki",
        "confirmemail": "Varmenna sähköpostiosoite",
        "bitrate-zetabits": "$1 Zbit/s",
        "bitrate-yottabits": "$1 Ybit/s",
        "lag-warn-normal": "Muutokset, jotka ovat uudempia kuin $1 {{PLURAL:$1|sekunti|sekuntia}}, eivät välttämättä näy tällä sivulla.",
-       "lag-warn-high": "Tietokannoilla on työjonoa. Muutokset, jotka ovat uudempia kuin $1 {{PLURAL:$1|sekunti|sekuntia}}, eivät välttämättä näy tällä sivulla.",
+       "lag-warn-high": "Tietokantojen päivityksessä on huomattavaa viivettä. Muutokset, jotka ovat tuoreempia kuin $1 {{PLURAL:$1|sekunti|sekuntia}}, eivät välttämättä näy luettelossa.",
        "watchlistedit-normal-title": "Tarkkailulistan muokkaus",
        "watchlistedit-normal-legend": "Poista sivuja tarkkailulistalta",
        "watchlistedit-normal-explain": "Tarkkailulistasi sivut on lueteltu alla. Voit poistaa sivuja valitsemalla niitä vastaavat valintaruudut ja napsauttamalla ”{{int:Watchlistedit-normal-submit}}”. Voit myös muokata listaa [[Special:EditWatchlist/raw|tekstimuodossa]].",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|tallensi}} uuden version tiedostosta $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|tallensi}} tiedoston $3",
        "rightsnone": "(ei oikeuksia)",
+       "revdelete-summary": "yhteenvedon",
        "feedback-bugornote": "Jos voit kuvailla teknisen ongelman tarkasti – [$1 ilmoita ohjelmointivirheestä].\nMuussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi lisätään sivulle [$3 $2], ja siinä on mukana käyttäjätunnuksesi.",
        "feedback-subject": "Otsikko",
        "feedback-message": "Viesti",
        "log-name-pagelang": "Kielenvaihtoloki",
        "log-description-pagelang": "Tämä on loki, johon merkitään muutokset sivujen kieliasetuksissa.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|muutti}} sivun kieltä sivulla $3 kielestä $4 kieleksi $5.",
+       "default-skin-not-found": "Hupsista! Oletuksena tuleva ulkoasu sinun wikillesi, joka on määritelty koodissa <code dir=\"ltr\">$wgDefaultSkin</code> muotoon <code>$1</code>, ei ole saatavilla.\n\n\n<strong>Alla on ohjeita englanniksi:</strong>\n\n\nYour installation seems to include the following skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable them and choose the default.\n\n$2\n\n; If you have just installed MediaWiki: \n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by: :* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it. \n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code>skins/</code> directory of your MediaWiki installation. \n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n\n; If you have just upgraded MediaWiki: \n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following lines into <code>LocalSettings.php</code> to enable all currently installed skins:\n\n<pre>$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>: \n: Double-check the skin names for typos.",
+       "default-skin-not-found-no-skins": "Hupsista! Oletusulkoasua sinun wikillesi ei ole saatavilla. Se on määritelty ulkoasuksi <code>$1</code> kohteessa <code>$wgDefaultSkin</code>.\n\nSinulla ei ole lainkaan asennettuja ulkoasuja. (You have no installed skins.)\n\nAlla on lisäohjeita englanniksi:\n\n\n; If you have just installed or upgraded MediaWiki: \n\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by: \n\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it. \n\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation. \n\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (käytössä)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ei käytössä''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ei käytössä''')",
+       "mediastatistics": "Median tilastotiedot",
+       "mediastatistics-summary": "Tietoja tallennettujen tiedostojen tyypeistä. Luettelossa ovat ainoastaan tiedostojen uusimmat versiot eikä lainkaan vanhoja tai poistettuja versioita.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 tavu|$1 tavua}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-tyyppi",
+       "mediastatistics-table-extensions": "Tiedostopäätteet",
+       "mediastatistics-table-count": "Tiedostojen lukumäärä",
+       "mediastatistics-table-totalbytes": "Yhteenlaskettu koko",
+       "mediastatistics-header-unknown": "Tuntematon",
+       "mediastatistics-header-bitmap": "Bitmap-kuvat",
+       "mediastatistics-header-drawing": "Piirrokset (vektorikuvat)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videot",
+       "mediastatistics-header-multimedia": "Rich media",
+       "mediastatistics-header-office": "Office-tiedostot",
+       "mediastatistics-header-text": "Tekstitiedostot",
+       "mediastatistics-header-executable": "Ohjelmatiedostot",
+       "mediastatistics-header-archive": "Pakatussa muodossa",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|jäljelle jäänyt pilkku|jäljelle jäänyttä pilkkua}} poistettiin JSON-tekstistä.",
+       "json-error-unknown": "Syntyi ongelma JSONin kanssa. Virhe: $1",
+       "json-error-depth": "Suurin mahdollinen pinosyvyys (stack depth) on ylitetty",
+       "json-error-state-mismatch": "Kelvoton tai vääränmuotoinen JSON",
+       "json-error-ctrl-char": "Kontrollimerkissä on virhe; se saattaa olla väärin koodattu",
+       "json-error-syntax": "Jäsennysvirhe (syntax error)",
+       "json-error-utf8": "Huonosti muotoiltuja UTF-8 merkkejä; mahdollisesti koodattu virheellisesti",
+       "json-error-recursion": "Joku arvossa (value) oleva rekursiivinen viite pitää vielä muuttaa koodiksi",
+       "json-error-inf-or-nan": "Joku NAN- tai INF-arvo arvossa (value) pitää muuttaa koodiksi",
+       "json-error-unsupported-type": "On annettu sellainen tyypin arvo, jota ei voi muuttaa koodiksi"
 }
index 40620b4..54a9bf2 100644 (file)
        "passwordreset-emailsent-capture": "Ein teldupostur, har ið tú kanst nullstilla loyniorðið, er blivin sendur, sum víst niðanfyri.",
        "passwordreset-emailerror-capture": "Ein teldupostur við nullstillaðum loyniorði var gjørdur, sum víst niðanfyri, men tað miseydnaðist at senda til {{GENDER:$2|brúkaran}}: $1",
        "changeemail": "Broyt teldupost adressu",
-       "changeemail-header": "Broyt t-post adressuna hjá kontuni",
        "changeemail-text": "Útfyll henda formularin fyri at broyta tína t-post adressu. Tú mást skriva títt loyniorð fyri at vátta hesa broyting.",
        "changeemail-no-info": "Tú mást vera innritað/ur fyri at fáa beinleiðis atgongd til hesa síðu.",
        "changeemail-oldemail": "Verandi t-post adressa:",
        "changeemail-none": "(ongin)",
        "changeemail-password": "Títt {{SITENAME}} loyniorð:",
        "changeemail-submit": "Broyt t-post",
-       "changeemail-cancel": "Ógilda",
        "changeemail-throttled": "Tú hevur roynt at rita inn ov nógvar ferðir.\nVinarliga bíða $1 áðrenn tú roynir aftur.",
        "resettokens": "Nullstilla lyklar",
        "resettokens-text": "Tú kanst nullstilla lyklar sum geva atgongd til ávís privat dáta sum eru knýtt at tínari konto her.\n\nTú eigur at gera tað um tú av óvart hevur deilt lyklarnar við onkran, ella um tín konta hevur verið útsett fyri vandastøðu.",
        "searchall": "alt",
        "showingresults": "Niðanfyri standa upp til {{PLURAL:$1|'''$1''' úrslit, sum byrjar|'''$1''' úrslit, sum byrja}} við #<b>$2</b>.",
        "showingresultsinrange": "Niðanfyri verða víst upp til {{PLURAL:$1|<strong>1</strong> úrslit|<strong>$1</strong> úrslit}} í økinum #<strong>$2</strong> til #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Úrslit '''$1''' av '''$3'''|Úrslit '''$1 - $2''' av '''$3'''}} fyri '''$4'''",
        "search-nonefound": "Leitingin gav onki úrslit.",
        "powersearch-legend": "Víðkað leitan",
        "powersearch-ns": "Leita í navnaøkinum:",
        "randomincategory": "Tilvildarlig síða í bólkinum",
        "randomincategory-invalidcategory": "\"$1\" kann ikki brúkast sum bólkaheiti.",
        "randomincategory-nopages": "Tað eru ongar síður í [[:Category:$1]].",
-       "randomincategory-selectcategory": "Fá tilvildarliga síðu frá bólki: $1 $2.",
-       "randomincategory-selectcategory-submit": "Far",
        "randomredirect": "Tilvildarlig ávísingarsíða",
        "randomredirect-nopages": "Tað eru ongar víðaristillingar til navnarúmið \"$1\".",
        "statistics": "Hagtøl",
        "suppress": "Yvirlit",
        "booksources": "Bókakeldur",
        "booksources-search-legend": "Leita eftir bókum",
-       "booksources-go": "Far",
        "specialloguserlabel": "Gjørt hevur:",
        "speciallogtitlelabel": "Mál (heiti ella brúkari):",
        "log": "Gerðabøkur",
        "wlheader-enotif": "Tað ber nú til at senda teldupost.",
        "wlheader-showupdated": "Síður sum eru broyttar síðan tú seinast vitjaði tær, eru vístar við '''feitum'''.",
        "wlnote": "Niðanfyri {{PLURAL:$1|stendur seinasta broytingin|standa seinastu '''$1''' broytingarnar}} seinasta/u {{PLURAL:$2| tíman|'''$2''' tímarnar}} hin $3 kl. $4",
-       "wlshowlast": "Vís seinastu $1 tímar $2 dagar $3",
+       "wlshowlast": "Vís seinastu $1 tímar $2 dagar",
        "watchlist-options": "Møguleikar í ansingarlistanum",
        "watching": "Eftirlitir...",
        "unwatching": "Strikar eftirlit...",
        "import": "Innflyt síður",
        "importinterwiki": "Innflyt frá aðrari wiki",
        "import-interwiki-text": "Vel eina wiki og síðuheiti at innflyta.\nDato og nøvnini á høvundunum í versjónini verða varveitt.\nAllar transwiki innflytingar handlingar verða goymdar í [[Special:Log/import|innflytingarlogginum]].",
-       "import-interwiki-source": "Kelduwiki/síða:",
        "import-interwiki-history": "Avrita alla versjónssøguna fyri hesa síðu",
        "import-interwiki-templates": "Tak allar fyrimyndir við",
        "import-interwiki-submit": "Innflyta",
        "exif-iimcategory-spo": "Ítróttur",
        "exif-iimcategory-wea": "Veðrið",
        "exif-urgency-normal": "Vanligt ($1)",
-       "watchlistall2": "alt",
        "namespacesall": "alt",
        "monthsall": "allir",
        "confirmemail": "Vátta t-post adressu",
        "compare-rev2": "Versjón 2",
        "compare-submit": "Samanber",
        "rightsnone": "(ongin)",
+       "revdelete-summary": "yvirlit yvir broytingar",
        "searchsuggest-search": "Leita",
        "api-error-empty-file": "Fílan sum tú sendi inn var tóm.",
        "api-error-file-too-large": "Fílan sum tú sendi inn var óv stór.",
index 8de0858..c9893e1 100644 (file)
                        "Yona b",
                        "SnowedEarth",
                        "Orikrin1998",
-                       "Automatik"
+                       "Automatik",
+                       "Elodark"
                ]
        },
        "tog-underline": "Souligner les liens :",
        "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 renomme à ma liste de suivi",
        "tog-watchdeletion": "Ajouter les pages et les fichiers que je supprime à ma liste de suivi",
-       "tog-watchrollback": "Ajouter à ma liste de suivi les pages sur lesquelles j’ai effectué une annulation",
+       "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",
        "tog-previewontop": "Afficher la prévisualisation au-dessus de la zone de modification",
        "tog-previewonfirst": "Afficher la prévisualisation lors de la première modification",
        "edit": "Modifier",
        "edit-local": "Modifier la description locale",
        "create": "Créer",
-       "create-local": "ajouter une description locale",
+       "create-local": "Ajouter une description locale",
        "editthispage": "Modifier cette page",
        "create-this-page": "Créer cette page",
        "delete": "Supprimer",
        "otherlanguages": "Autres langues",
        "redirectedfrom": "(Redirigé depuis $1)",
        "redirectpagesub": "Page de redirection",
+       "redirectto": "Rediriger vers :",
        "lastmodifiedat": "Dernière modification de cette page le $1 à $2.<br />",
        "viewcount": "Cette page a été consultée {{PLURAL:$1|une fois|$1 fois}}.",
        "protectedpage": "Page protégée",
        "createaccount-text": "Quelqu’un a créé un compte pour votre adresse de courriel sur {{SITENAME}} ($4) intitulé « $2 », avec le mot de passe « $3 ».\nVous devriez ouvrir une session et modifier dès à présent votre mot de passe.\n\nIgnorez ce message si ce compte a été créé par erreur.",
        "login-throttled": "Vous avez tenté un trop grand nombre de connexions dernièrement.\nVeuillez attendre $1 avant d'essayer à nouveau.",
        "login-abort-generic": "Votre tentative de connexion a échoué",
+       "login-migrated-generic": "Votre compte a été migré, et votre nom d’utilisateur n’existe plus sur ce wiki.",
        "loginlanguagelabel": "Langue : $1",
        "suspicious-userlogout": "Votre demande de déconnexion a été refusée car il semble qu'elle a été envoyée par un navigateur cassé ou la mise en cache d'un proxy.",
        "createacct-another-realname-tip": "Le vrai nom est optionnel.\nSi vous décidez de le fournir, il sera utilisé pour attribuer à l’utilisateur ses travaux.",
        "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-header": "Changer l’adresse de courriel du compte",
        "changeemail-text": "Remplissez ce formulaire pour changer votre adresse de courriel. Vous devrez entrer votre mot de passe pour confirmer ce changement.",
        "changeemail-no-info": "Vous devez être connecté pour pouvoir accéder directement à cette page.",
        "changeemail-oldemail": "Adresse de courriel actuelle :",
        "changeemail-none": "(aucune)",
        "changeemail-password": "Votre mot de passe sur {{SITENAME}} :",
        "changeemail-submit": "Changer l’adresse de courriel",
-       "changeemail-cancel": "Annuler",
        "changeemail-throttled": "Vous avez fait trop de tentatives de connexion.\nVeuillez attendre $1 avant de réessayer.",
        "resettokens": "Réinitialiser les jetons",
        "resettokens-text": "Ici, vous pouvez réinitialiser les jetons qui permettent d’accéder à certaines données privées associées à votre compte.\n\nVous devriez le faire si vous les avez partagés accidentellement avec quelqu'un ou si votre compte a été compromis.",
        "showpreview": "Prévisualiser",
        "showdiff": "Voir les modifications",
        "blankarticle": "<strong>Attention :</strong> La page que vous créez est vide.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la page sera créée sans aucun contenu.",
-       "anoneditwarning": "<strong>Attention :</strong> Vous n’êtes pas identifié(e). Votre adresse IP sera enregistrée dans l’historique de cette page.",
+       "anoneditwarning": "<strong>Attention :</strong> Vous n’êtes pas connecté. Votre adresse IP sera visible de tout le monde si vous faites des modifications. Si vous <strong>[$1 vous connectez]</strong> ou <strong>[$2 créez un compte]</strong>, vos modifications seront attribuées à votre nom d’utilisateur, entre autres avantages.",
        "anonpreviewwarning": "''Vous n’êtes pas identifié(e). Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.''",
        "missingsummary": "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
        "missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
        "searchall": "tout",
        "showingresults": "Affichage de <b>$1</b> résultat{{PLURAL:$1||s}} à partir du n°<b>$2</b>.",
        "showingresultsinrange": "Afficher ci-dessous jusqu’à {{PLURAL:$1|<strong>1</strong> résultat|<strong>$1</strong> résultats}} dans la série #<strong>$2</strong> à #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Résultat '''$1'''|Résultats '''$1–$2'''}} de '''$3''' pour '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Résultat <strong>$1</strong> parmi <strong>$3</strong>|Résultats <strong>$1 à $2</strong> parmi <strong>$3</strong>}}",
        "search-nonefound": "Il n'y a aucun résultat correspondant à la requête.",
        "powersearch-legend": "Recherche avancée",
        "powersearch-ns": "Rechercher dans les espaces de noms :",
        "prefs-tokenwatchlist": "Jeton",
        "prefs-diffs": "Différences",
        "prefs-help-prefershttps": "Cette préférence sera effective lors de votre prochaine connexion.",
+       "prefswarning-warning": "Vous avez effectué des modifications dans vos préférences qui n’ont pas encore été enregistrées.\nSi vous quittez cette page sans cliquer sur « $1 », vos préférences ne seront pas mises à jour.",
        "prefs-tabs-navigation-hint": "Astuce : Vous pouvez utiliser les flèches de gauche et de droite pour naviguer entre les onglets.",
        "email-address-validity-valid": "Semble valide",
        "email-address-validity-invalid": "Une adresse valide est nécessaire !",
        "userrights-lookup-user": "Gestion des groupes d'utilisateurs",
        "userrights-user-editname": "Entrez un nom d'utilisateur :",
        "editusergroup": "Modification des groupes d'utilisateurs",
-       "editinguser": "Modification des droits de l'{{GENDER:$1|utilisateur|utilisatrice}} <strong>[[User:$1|$1]]</strong>' $2",
+       "editinguser": "Modification des droits de l’{{GENDER:$1|utilisateur|utilisatrice}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modifier les groupes de l'utilisateur",
        "saveusergroups": "Enregistrer les groupes de l'utilisateur",
        "userrights-groupsmember": "Membre de :",
        "randomincategory": "Page au hasard dans la catégorie",
        "randomincategory-invalidcategory": "« $1 » n’est pas un nom de catégorie valide.",
        "randomincategory-nopages": "Il n’y a pas de page dans [[:Category:$1]].",
-       "randomincategory-selectcategory": "Prendre une page au hasard dans la catégorie : $1 $2.",
-       "randomincategory-selectcategory-submit": "Aller",
+       "randomincategory-category": "Catégorie :",
+       "randomincategory-legend": "Page aléatoire dans la catégorie",
        "randomredirect": "Page de redirection au hasard",
        "randomredirect-nopages": "Il n'y a aucune page de redirection dans l'espace de noms « $1 ».",
        "statistics": "Statistiques",
        "booksources": "Ouvrages de référence",
        "booksources-search-legend": "Rechercher parmi des ouvrages de référence",
        "booksources-isbn": "ISBN :",
-       "booksources-go": "Lister",
+       "booksources-search": "Rechercher",
        "booksources-text": "Voici une liste indicative de liens vers d’autres sites vendant des livres neufs et d’occasion et sur lesquels vous trouverez peut-être des informations sur les ouvrages que vous cherchez :",
        "booksources-invalid-isbn": "L’ISBN donné ne semble pas être correct ; vérifiez si vous avez fait une erreur en copiant la source originale.",
        "specialloguserlabel": "Auteur :",
        "emailuser-title-notarget": "Envoyer un courriel à l'utilisateur",
        "emailpage": "Envoyer un courriel à l'utilisateur",
        "emailpagetext": "Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}.\nL'adresse électronique que vous avez indiquée dans [[Special:Preferences|vos préférences]] apparaîtra dans le champ « Expéditeur » de votre message ; ainsi, le destinataire pourra vous répondre directement.",
-       "defemailsubject": "{{SITENAME}} Courriel de l'utilisateur « $1 »",
+       "defemailsubject": "Courriel de {{SITENAME}} de l'utilisateur « $1 »",
        "usermaildisabled": "L'envoi de courriels entre utilisateurs est désactivé",
        "usermaildisabledtext": "Vous ne pouvez pas envoyer de courriels à d'autres utilisateurs sur ce wiki",
        "noemailtitle": "Aucune adresse de courriel",
        "wlheader-enotif": "La notification par courriel est activée.",
        "wlheader-showupdated": "Les pages qui ont été modifiées depuis votre dernière visite sont affichées en '''gras'''.",
        "wlnote": "Ci-dessous {{PLURAL:$1|figure la dernière modification effectuée|figurent les <strong>$1</strong> dernières modifications effectuées}} durant {{PLURAL:$2|la dernière heure|les <strong>$2</strong> dernières heures}}, depuis $3, $4.",
-       "wlshowlast": "Montrer les dernières $1 heures, les derniers $2 jours ou bien $3",
+       "wlshowlast": "Montrer les dernières $1 heures, les derniers $2 jours",
        "watchlist-options": "Options de la liste de suivi",
        "watching": "Suivi…",
        "unwatching": "Fin du suivi…",
        "exbeforeblank": "contenait avant blanchiment « $1 »",
        "delete-confirm": "Supprimer « $1 »",
        "delete-legend": "Supprimer",
-       "historywarning": "'''Attention :''' la page que vous êtes sur le point de supprimer a un historique avec environ $1 {{PLURAL:$1|version|versions}} :",
+       "historywarning": "<strong>Attention :</strong> la page que vous êtes sur le point de supprimer a un historique avec $1 {{PLURAL:$1|version|versions}} :",
        "confirmdeletetext": "Vous êtes sur le point de supprimer une page ou un fichier, ainsi que toutes ses versions antérieures historisées. Veuillez confirmer que c’est bien là ce que vous voulez faire, que vous en comprenez les conséquences et que vous faites ceci en accord avec les [[{{MediaWiki:Policy-url}}|règles internes]].",
        "actioncomplete": "Action effectuée",
        "actionfailed": "L'action a échoué",
        "delete-edit-reasonlist": "Modifier les motifs de suppression de page",
        "delete-toobig": "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.\nLa suppression de telles pages a été restreinte pour prévenir des perturbations accidentelles de {{SITENAME}}.",
        "delete-warning-toobig": "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.\nLa supprimer peut perturber le fonctionnement de la base de données de {{SITENAME}} ;\nveuiller ne procéder qu'avec prudence.",
-       "delete-cantedit": "Vous ne pouvez pas supprimer cette page car vous n’avez pas le droit de la modifier.",
+       "deleteprotected": "Vous ne pouvez pas supprimer cette page car elle a été protégée.",
        "deleting-backlinks-warning": "'''Attention :''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|D’autres pages]] ont un lien vers ou incorporent la page que vous allez supprimer.",
        "rollback": "Révoquer les modifications",
        "rollback_short": "Révoquer",
        "protect-othertime": "Autre date d'expiration :",
        "protect-othertime-op": "autre date d'expiration",
        "protect-existing-expiry": "Date d'expiration existante : $2 à $3",
+       "protect-existing-expiry-infinity": "Délai d’expiration existant : infini",
        "protect-otherreason": "Motif autre ou supplémentaire :",
        "protect-otherreason-op": "Autre motif",
        "protect-dropdown": "* Motifs de protection courants\n** Vandalisme excessif\n** Pourriels\n** Conflits de modifications contre-productives\n** Page à fort trafic",
        "undelete-error": "Page d’erreur d’annulation",
        "undelete-error-short": "Erreur lors de la restauration du fichier : $1",
        "undelete-error-long": "Des erreurs ont été rencontrées lors de la restauration du fichier :\n\n$1",
-       "undelete-show-file-confirm": "Êtes-vous sûr de vouloir visionner une version supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
+       "undelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e|(e)} de vouloir visionner une version supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
        "undelete-show-file-submit": "Oui",
        "undelete-revision-row": "$1 $2 ($3) $4 — $5 $6 $7 $8 $9",
        "namespace": "Espace de noms :",
        "blockipsuccesssub": "Blocage réussi",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e|}}.<br />\nConsultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.",
        "ipb-blockingself": "Vous êtes sur le point de bloquer votre propre compte ! Êtes-vous certain{{GENDER:||e}} de vouloir faire cela ?",
-       "ipb-confirmhideuser": "Vous êtes sur le point de bloquer un utilisateur avec « cacher l'utilisateur » activé. Cela supprime le nom de l'utilisateur dans toutes les listes et les entrées du journal. Êtes-vous sûr de vouloir le faire ?",
-       "ipb-confirmaction": "Si vous êtes sûr de vraiment vouloir le faire, veuillez cocher le champ « {{int:ipb-confirm}} » en bas.",
+       "ipb-confirmhideuser": "Vous êtes sur le point de bloquer un utilisateur avec « cacher l'utilisateur » activé. Cela supprime le nom de l'utilisateur dans toutes les listes et les entrées du journal. Êtes-vous sûr{{GENDER:||e|(e)} de vouloir le faire ?",
+       "ipb-confirmaction": "Si vous êtes sûr{{GENDER:||e|(e)} de vraiment vouloir le faire, veuillez cocher le champ « {{int:ipb-confirm}} » en bas.",
        "ipb-edit-dropdown": "Modifier les motifs de blocage par défaut",
        "ipb-unblock-addr": "Débloquer $1",
        "ipb-unblock": "Débloquer un compte utilisateur ou une adresse IP",
        "unblocked": "[[User:$1|$1]] a été débloqué{{GENDER:$1||e}}",
        "unblocked-range": "Le compte $1 a été débloqué",
        "unblocked-id": "Le blocage $1 a été enlevé",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] a été débloqué.",
        "blocklist": "Utilisateurs bloqués",
        "ipblocklist": "Utilisateurs bloqués",
        "ipblocklist-legend": "Chercher un utilisateur bloqué",
        "sorbs_create_account_reason": "Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.\nVous ne pouvez pas créer un compte.",
        "xffblockreason": "Une adresse IP dans l'en-tête X-Forwarded-For, soit la vôtre ou celle d'un serveur proxy que vous utilisez, a été bloquée. La raison du blocage initial est : $1",
        "cant-see-hidden-user": "L’utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. N’ayant pas le droit ''hideuser'', vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
-       "ipbblocked": "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué",
+       "ipbblocked": "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué{{GENDER:||e|}",
        "ipbnounblockself": "Vous n'êtes pas autorisé{{GENDER:||e}} à vous débloquer vous-même",
        "lockdb": "Verrouiller la base de données",
        "unlockdb": "Déverrouiller la base de données",
        "import": "Importer des pages",
        "importinterwiki": "Importation inter-wiki",
        "import-interwiki-text": "Sélectionnez un wiki et un titre de page à importer.\nLes dates des versions et les noms des contributeurs seront préservés.\nToutes les actions d'importation inter-wiki sont consignées dans l'[[Special:Log/import|historique des importations]].",
-       "import-interwiki-source": "Wiki et page sources :",
+       "import-interwiki-sourcewiki": "Wiki source :",
+       "import-interwiki-sourcepage": "Page source :",
        "import-interwiki-history": "Copier toutes les versions de l’historique de cette page",
        "import-interwiki-templates": "Inclure tous les modèles",
        "import-interwiki-submit": "Importer",
        "exif-urgency-low": "Faible ($1)",
        "exif-urgency-high": "Haute ($1)",
        "exif-urgency-other": "Urgence définie par l'utilisateur ($1)",
-       "watchlistall2": "tout",
        "namespacesall": "Tous",
        "monthsall": "tous",
        "confirmemail": "Confirmer l’adresse de courriel",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|a téléchargé}} une nouvelle version de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|a téléchargé}} $3",
        "rightsnone": "(aucun)",
+       "revdelete-summary": "résumé de modification",
        "feedback-bugornote": "Si vous êtes prêt à décrire un problème technique en détail, veuillez [$1 signaler un bogue].\nSinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentaire sera ajouté à la page « [$3 $2] », avec votre nom d'utilisateur.",
        "feedback-subject": "Objet :",
        "feedback-message": "Message :",
        "log-name-pagelang": "Tracer les changements de langue",
        "log-description-pagelang": "Ceci est un journal des changements dans les langues des pages.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a changé}} la langue de la page $3 de $4 à $5.",
-       "default-skin-not-found": "Oups ! L’habillage par défaut pour votre wiki (<code>$wgDefaultSkin</code>), <code>$1</code>, n’est pas disponible.\n\nVotre installation semble inclure les habillages suivants. Voyez [https://www.mediawiki.org/wiki/Manual:Skin_configuration le manuel de configuration des habillages] pour savoir comment les activer et choisir celui par défaut.\n\n$2\n\n; Si vous venez juste d’installer MédiaWiki :\n: Vous l’avez probablement installé depuis git, ou directement depuis le code source avec une autre méthode. C’est normal. Essayez d’installer des habillages depuis [https://www.mediawiki.org/wiki/Category:All_skins le répertoire des habillages de mediawiki.org], en:\n:* Téléchargeant le [https://www.mediawiki.org/wiki/Download fichier tar de l’installeur], qui comprend plusieurs habillages et extensions. Vous pouvez copier et coller le répertoire <code>skins/</code> depuis là.\n:* Clonant un des dépôts <code>mediawiki/skins/*</code> via git dans le répertoire <code>skins/</code> de votre installation de MédiaWiki.\n: Faire ainsi ne devrait pas interférer avec votre dépôt git, si vous êtes un développeur de MédiaWiki.\n\n; Si vous venez juste de mettre à jour MédiaWiki :\n: MédiaWiki 1.24 et au-delà n’active plus automatiquement les habillages installés (voyez [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery le manuel sur la découverte automatique des habillages]). Vous pouvez coller les lignes suivantes dans <code>LocalSettings.php</code> pour activer tous les habillages actuellement installés :\n\n<pre>$3</pre>\n\n; Si vous venez de modifier <code>LocalSettings.php</code> :\n: Vérifiez deux fois le nom des habillages pour éviter les erreurs de frappe.",
-       "default-skin-not-found-no-skins": "Oups ! L’habillage par défaut pour votre wiki (<code>$wgDefaultSkin</code>), <code>$1</code>, n’est pas disponible.\n\nVous n’avez aucun habillage d’installé.\n\n; Si vous venez juste d’installer ou de mettre à jour MédiaWiki :\n: Vous l’avez sans doute fait depuis git, ou directement depuis le code source avec une autre méthode. C’est normal. MédiaWiki 1.24 et au-delà n’inclut aucun habillage dans le dépôt principal. Essayez d’installer des habillages depuis [https://www.mediawiki.org/wiki/Category:All_skins le répertoire des habillages de mediawiki.org], en :\n:* Téléchargeant [https://www.mediawiki.org/wiki/Download le fichier tar de l’installeur], qui comprend différents habillages et extensions. Vous pouvez copier et coller le répertoire <code>skins/</code> depuis là.\n:*Clonant un des dépôts <code>mediawiki/skins/*</code> via git dans le répertoire <code>skins/</code> de votre installation de MédiaWiki.\n: Faire ainsi ne devrait pas interférer avec votre dépôt git si vous êtes un développeur de MédiaWiki. Voyez [https://www.mediawiki.org/wiki/Manual:Skin_configuration le manuel de la configuration des habillages] pour des instructions sur la manière d’activer les habillages et choisir celui par défaut.",
+       "default-skin-not-found": "Oups ! L’habillage par défaut pour votre wiki, défini par <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, n’est pas disponible.\n\nVotre installation semble inclure les habillages suivants. Voyez [https://www.mediawiki.org/wiki/Manual:Skin_configuration le manuel de configuration des habillages] pour savoir comment les activer et choisir celui par défaut.\n\n$2\n\n; Si vous venez juste d’installer MediaWiki :\n: Vous l’avez probablement installé depuis git, ou directement depuis le code source avec une autre méthode. C’est normal. Essayez d’installer des habillages depuis [https://www.mediawiki.org/wiki/Category:All_skins le répertoire des habillages de mediawiki.org], en:\n:* Téléchargeant le [https://www.mediawiki.org/wiki/Download fichier tar de l’installeur], qui comprend plusieurs habillages et extensions. Vous pouvez copier et coller le répertoire <code>skins/</code> depuis là.\n:* Clonant un des dépôts <code>mediawiki/skins/*</code> via git dans le répertoire <code dir=\"ltr\">skins/</code> de votre installation de MediaWiki.\n: Faire ainsi ne devrait pas interférer avec votre dépôt git, si vous êtes un développeur de MediaWiki.\n\n; Si vous venez juste de mettre à jour MediaWiki :\n: MediaWiki 1.24 et au-delà n’active plus automatiquement les habillages installés (voyez [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery le manuel sur la découverte automatique des habillages]). Vous pouvez coller les lignes suivantes dans <code>LocalSettings.php</code> pour activer tous les habillages actuellement installés :\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si vous venez de modifier <code>LocalSettings.php</code> :\n: Vérifiez deux fois le nom des habillages pour éviter les erreurs de frappe.",
+       "default-skin-not-found-no-skins": "Oups ! L’habillage par défaut pour votre wiki , défini par <code>$wgDefaultSkin</code> comme <code>$1</code>, n’est pas disponible.\n\nVous n’avez aucun habillage d’installé.\n\n; Si vous venez juste d’installer ou de mettre à jour MediaWiki :\n: Vous l’avez sans doute fait depuis git, ou directement depuis le code source avec une autre méthode. C’est normal. MediaWiki 1.24 et au-delà n’inclut aucun habillage dans le dépôt principal. Essayez d’installer des habillages depuis [https://www.mediawiki.org/wiki/Category:All_skins le répertoire des habillages de mediawiki.org], en :\n:* Téléchargeant [https://www.mediawiki.org/wiki/Download le fichier tar de l’installeur], qui comprend différents habillages et extensions. Vous pouvez copier et coller le répertoire <code>skins/</code> depuis là.\n:*Clonant un des dépôts <code>mediawiki/skins/*</code> via git dans le répertoire <code dir=\"ltr\">skins/</code> de votre installation de MediaWiki.\n: Faire ainsi ne devrait pas interférer avec votre dépôt git si vous êtes un développeur de MediaWiki. Voyez [https://www.mediawiki.org/wiki/Manual:Skin_configuration le manuel de la configuration des habillages] pour des instructions sur la manière d’activer les habillages et choisir celui par défaut.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activé)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''désactivé''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''désactivé''')",
+       "mediastatistics": "Statistiques sur les médias",
+       "mediastatistics-summary": "Statistiques sur les types de fichier téléchargés. Elles ne prennent en compte que la version la plus récente d’un fichier. Les versions anciennes ou supprimées des fichiers sont exclues.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 octet|$1 octets}} ($2 ; $3%)",
+       "mediastatistics-table-mimetype": "Type MIME",
+       "mediastatistics-table-extensions": "Extensions possibles",
+       "mediastatistics-table-count": "Nombre de fichiers",
+       "mediastatistics-table-totalbytes": "Taille combinée",
+       "mediastatistics-header-unknown": "Inconnu",
+       "mediastatistics-header-bitmap": "Images raster",
+       "mediastatistics-header-drawing": "Dessins (images vectorielles)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Vidéos",
+       "mediastatistics-header-multimedia": "Média riche",
+       "mediastatistics-header-office": "Bureautique",
+       "mediastatistics-header-text": "Textuel",
+       "mediastatistics-header-executable": "Exécutables",
+       "mediastatistics-header-archive": "Formats compressés",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|virgule finale a été supprimée|virgules finales ont été supprimées}} du JSON",
+       "json-error-unknown": "Il y a eu un problème avec le JSON. Erreur : $1",
+       "json-error-depth": "La taille maximale de la pile a été dépassée",
+       "json-error-state-mismatch": "JSON non valide ou mal formé",
+       "json-error-ctrl-char": "Erreur de caractères de contrôle, peut-être mal encodé",
+       "json-error-syntax": "Erreur de syntaxe",
+       "json-error-utf8": "Caractères UTF-8 mal formés, peut-être mal encodé",
+       "json-error-recursion": "Une ou plusieurs références récursives dans la valeur à encoder",
+       "json-error-inf-or-nan": "Une une plusieurs valeurs NaN ou INF dans la valeur à encoder",
+       "json-error-unsupported-type": "Une valeur a été donnée dans un type ne pouvant pas être encodé"
 }
index 29c6d43..6db997a 100644 (file)
        "passwordreset-emailsent-capture": "Un mèssâjo de remês’a zérô de contresegno est étâ mandâ, qu’est montrâ ce-desot.",
        "passwordreset-emailerror-capture": "Un mèssâjo de remês’a zérô de contresegno est étâ fêt, qu’est montrâ ce-desot, mas l’èxpèdicion a l’utilisat{{GENDER:$2|or|rice}} at pas reussi : $1",
        "changeemail": "Changiér l’adrèce èlèctronica",
-       "changeemail-header": "Changiér l’adrèce èlèctronica du compto",
        "changeemail-text": "Rempléd ceti formulèro por changiér voutron adrèce èlèctronica. Vos devréd buchiér voutron contresegno por confirmar cél changement.",
        "changeemail-no-info": "Vos dête étre branchiê por arrevar tot drêt a cela pâge.",
        "changeemail-oldemail": "Adrèce èlèctronica d’ora :",
        "changeemail-none": "(pas yona)",
        "changeemail-password": "Voutron contresegno dessus {{SITENAME}} :",
        "changeemail-submit": "Changiér l’adrèce èlèctronica",
-       "changeemail-cancel": "Anular",
        "bold_sample": "Tèxto grâs",
        "bold_tip": "Tèxto grâs",
        "italic_sample": "Tèxto étalico",
        "searchrelated": "aparentâ",
        "searchall": "tot",
        "showingresults": "Vua de '''$1''' rèsultat{{PLURAL:$1||s}} dês lo numerô '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Rèsultat '''$1'''|Rèsultats '''$1 - $2'''}} de '''$3''' por '''$4'''",
        "search-nonefound": "Y at gins de rèsultat que corrèspond a la rechèrche.",
        "powersearch-legend": "Rechèrche avanciêe",
        "powersearch-ns": "Rechèrchiér dedens los èspâços de noms :",
        "booksources": "Ôvres de refèrence",
        "booksources-search-legend": "Rechèrchiér entre-mié les ôvres de refèrence",
        "booksources-isbn": "ISBN :",
-       "booksources-go": "Listar",
        "booksources-text": "Vê-que na lista de lims de vers d’ôtros setos que vendont des lévros nôfs et d’ocasion, et pués pôvont avêr des enformacions de ples sur les ôvres que vos chèrchiéd :",
        "booksources-invalid-isbn": "L’ISBN balyê semble pas étre justo ; controlâd se vos éd fêt na fôta en copiyent la sôrsa originâla.",
        "specialloguserlabel": "Ôtor :",
        "wlheader-enotif": "La notificacion per mèssageria èlèctronica est activâye.",
        "wlheader-showupdated": "Les pâges que sont étâyes changiêes dês voutra dèrriére visita sont montrâyes en '''grâs'''.",
        "wlnote": "Vê-que {{PLURAL:$1|lo dèrriér changement fêt|los '''$1''' dèrriérs changements fêts}} pendent {{PLURAL:$2|l’hora passâye|les '''$2''' hores passâyes}}, dês $3 a $4.",
-       "wlshowlast": "Montrar les $1 hores passâyes, los $2 jorns passâs ou ben $3",
+       "wlshowlast": "Montrar les $1 hores passâyes, los $2 jorns passâs ou ben",
        "watchlist-options": "Chouèx de la lista de siuvu",
        "watching": "Siuvu...",
        "unwatching": "Fin du siuvu...",
        "import": "Importar des pâges",
        "importinterwiki": "Importacion entèrvouiqui",
        "import-interwiki-text": "Chouèsésséd un vouiqui et un titro de pâge a importar.\nLes dâtes de les vèrsions et los noms ux contributors seront presèrvâs.\nTotes les accions d’importacion entèrvouiqui sont consignês dens lo [[Special:Log/import|jornal de les importacions]].",
-       "import-interwiki-source": "Vouiqui / pâge d’origina :",
        "import-interwiki-history": "Copiyér totes les vèrsions de l’historico de ceta pâge",
        "import-interwiki-templates": "Encllure tôs los modèlos",
        "import-interwiki-submit": "Importar",
        "exif-urgency-low": "Fêbla ($1)",
        "exif-urgency-high": "Hôta ($1)",
        "exif-urgency-other": "Prioritât dèfenia per l’usanciér ($1)",
-       "watchlistall2": "tot",
        "namespacesall": "tôs",
        "monthsall": "tôs",
        "confirmemail": "Confirmar l’adrèce èlèctronica",
        "logentry-rights-rights-legacy": "$1 at changiê l’apartegnence a la tropa por « $3 »",
        "logentry-rights-autopromote": "$1 est étâ nomâ ôtomaticament de $4 a $5",
        "rightsnone": "(nion)",
+       "revdelete-summary": "rèsumâ du changement",
        "feedback-bugornote": "Se vos éte prèst a dècrire un problèmo tècnico en dètaly, volyéd [$1 signalar una cofierie].\nÔtrament, vos pouede utilisar lo formulèro simplifiâ ce-desot. Voutron comentèro serat apondu a la pâge « [$3 $2] », avouéc voutron nom d’usanciér et lo navigator que vos utilisâd.",
        "feedback-subject": "Sujèt :",
        "feedback-message": "Mèssâjo :",
index 1bcd678..6674ede 100644 (file)
@@ -24,6 +24,7 @@
        "tog-watchdefault": "Salew feranert sidjen an datein leewen uun't uug behual",
        "tog-watchmoves": "Salew fersköwen sidjen an datein leewen uun't uug behual",
        "tog-watchdeletion": "Salew stregen sidjen an datein leewen uun't uug behual",
+       "tog-watchrollback": "Sidjen, diar ik turagsaat haa, uun't uug behual",
        "tog-minordefault": "Aanj feranrangen üs \"letjen\" kääntiakne",
        "tog-previewontop": "\"Iarst ans luke\" boowen faan't wönang tu bewerkin",
        "tog-previewonfirst": "Bi't iarst bewerkin \"iarst ans luke\" uunwise",
        "moredotdotdot": "Muar ...",
        "morenotlisted": "Detdiar list as ei komplet.",
        "mypage": "Sidj",
-       "mytalk": "Diskusjuun",
+       "mytalk": "Diskuschuun",
        "anontalk": "Diskusjuunssidj faan detdiar IP",
        "navigation": "Nawigatjuun",
        "and": "&#32;an",
        "unprotectthispage": "Sääkering aphääwe",
        "newpage": "Nei sidj",
        "talkpage": "Detdiar sidj diskutiare",
-       "talkpagelinktext": "Diskusjuun",
+       "talkpagelinktext": "Diskuschuun",
        "specialpage": "Spezial-sidj",
        "personaltools": "Min werktjüügen",
        "articlepage": "Artiikel wise",
-       "talk": "Diskusjuun",
+       "talk": "Diskuschuun",
        "views": "Uunsichten",
        "toolbox": "Werktjüügen",
        "userpage": "Brükersidj uunwise",
        "templatepage": "Föörlaagensidj uunwise",
        "viewhelppage": "Halepsidj uunwise",
        "categorypage": "Kategoriisidj uunwise",
-       "viewtalkpage": "Diskusjuun uunluke",
+       "viewtalkpage": "Diskuschuun uunluke",
        "otherlanguages": "Uun ööder spriaken",
        "redirectedfrom": "(Widjerfeerd faan $1)",
        "redirectpagesub": "Widjerfeerang",
+       "redirectto": "Widjerfeer tu:",
        "lastmodifiedat": "Detdiar sidj as tuleetst di $1, am a klook $2 anert wurden.",
        "viewcount": "Aw jüdeer sid as  {{PLURAL:$1|iinjsen|$1 tunge}} tugram wörden.",
        "protectedpage": "Sääkerd sid",
        "hidetoc": "Fersteeg",
        "collapsible-collapse": "Tuupdoble",
        "collapsible-expand": "Wise",
+       "confirmable-confirm": "Beest {{GENDER:$1|dü}} seeker?",
+       "confirmable-yes": "Ja",
+       "confirmable-no": "Naan",
        "thisisdeleted": "$1 uunluke of weder iinstel",
        "viewdeleted": "$1 uunluke?",
        "restorelink": "$1 {{PLURAL:$1|stregen werjuun|stregen werjuunen}}",
        "invalidtitle-knownnamespace": "Ferkiard auerskraft uun di nöömrüm „$2“ an tekst „$3“",
        "invalidtitle-unknownnamespace": "Ferkiard auerskraft uun di ünbekäänd nöömrüm „$1“ an tekst „$2“",
        "exception-nologin": "Ei uunmeldet",
-       "exception-nologin-text": "Wees so gud an [[Special:Userlogin|melde di uun]], am detdiar sidj of aktjuun ütjtufeeren.",
+       "exception-nologin-text": "Wees so gud an melde di uun, am detdiar sidj of aktjuun ütjtufeeren.",
        "exception-nologin-text-manual": "Wees so gud an $1 , am detdiar sidj of aktjuun ütjtufeeren.",
        "virus-badscanner": "Ferkiard iinstelang: Ünbekäänd wiirenscanner: ''$1''",
        "virus-scanfailed": "scan ging skiaf (code $1)",
        "createaccount-text": "Diar as mä din e-mail adres för di en brükerkonto \"$2\" üüb {{SITENAME}} ($4) maaget wurden. För \"$2\" as automaatisk det paaswurd \"$3\" iinracht wurden.\nDü skulst di nü uunmelde an det paaswurd anre.\n\nWan det brükerkonto ütj fersen uunlaanj wurden as, säärst dü niks widjer onernem.",
        "login-throttled": "Dü heest tufölsis fersoocht, di uuntumeldin.\nWees so gud an teew $1, iar dü det noch ans ferschükst.",
        "login-abort-generic": "Det uunmeldin hää ei loket - Ufbreegen",
+       "login-migrated-generic": "Din brükerkonto as feranert wurden. Dan brükernööm jaft det üüb detheer Wiki ei muar.",
        "loginlanguagelabel": "Spriak: $1",
        "suspicious-userlogout": "Din ufmeldang as ei föörnimen wurden, auer det uunfraag ferlicht faan en uunstakenen browser of faan en cache-proxy kaam.",
        "createacct-another-realname-tip": "Stäänt tu wool. Wan dü dan rochten nööm uundääst, koon hi mä din feranrangen ferbünjen wurd.",
        "passwordreset-emailsent-capture": "Detdiar E-Mail, wat oner uunwiset woort, as tu di onerwais.",
        "passwordreset-emailerror-capture": "Detdiar E-Mail, wat oner uunwiset woort, wiar tu di onerwais, oober küd ei tu di {{GENDER:$2|brüker}} ufsjüürd wurd: $1",
        "changeemail": "Feranre det E-Mail-adres",
-       "changeemail-header": "Feranre det E-Mail-adres",
        "changeemail-text": "Fal detdiar formulaar hialandaal ütj, am din E-Mail-adres tu feranrin. Diarför skel dü din paaswurd uundu.",
        "changeemail-no-info": "Dü möist önjmälded weese am ju sid diräkt tu tu gripen.",
        "changeemail-oldemail": "Aktuel e-mail adres",
        "changeemail-none": "(niin)",
        "changeemail-password": "Din {{SITENAME}} paaswurd:",
        "changeemail-submit": "E-mail adres feranre",
-       "changeemail-cancel": "Ufbreeg",
        "changeemail-throttled": "Dü heest tufölsis fersoocht, di uuntumeldin.\nWees so gud an teew $1, iar dü det noch ans ferschükst.",
        "resettokens": "Tokens turagsaat",
        "resettokens-text": "Dü könst 'tokens' turagsaat, am priwoot dooten tu bewerkin, diar mä din brükerkonto ferbünjen san.",
        "preview": "Iarst ans luke",
        "showpreview": "Iarst ans luke",
        "showdiff": "Feranrangen wise",
-       "anoneditwarning": "'''Paase üüb:''' Dü bewerkest detdiar sidj anonüüm. Wan dü det seekerst, woort din aktuel IP-adres uun a ferluup aptiakent, an as diarmä '''för arken''' iintusen.",
+       "blankarticle": "<strong>Paase üüb:</strong> Dü maagest en leesag sidj.\nWan dü üüb \"{{int:savearticle}}\" trakst, woort det sidj iinracht saner wat uun.",
+       "anoneditwarning": "'''Paase üüb:''' Dü beest ei uunmeldet. Din aktuel IP-adres komt tu sen, wan dü feranrangen föörnamst. Wan dü di <strong>[$1 uunmeldest]</strong> of <strong>[$2 en konto iinrachtst]</strong>, wurd din feranrangen mä dan brükernööm ferbünjen, tuup mä ööder föördialen.",
        "anonpreviewwarning": "\"Dü beest ei uunmeldet. Bi't seekrin woort din IP-adres uun a ferluup faan werjuunen aptiakent.\"",
        "missingsummary": "'''Paase üüb:''' Dü heest det ei tuupfaadet.\nWan dü det sidj seekerst, woort det saner en kurtfaadet beskriiwang auernimen.",
        "missingcommenttext": "Faade det oner tuup.",
        "parser-template-recursion-depth-warning": "Tuföl föörlaagen uun föörlaagen ($1)",
        "language-converter-depth-warning": "Spriakenkonwerter auerläästet ($1)",
        "node-count-exceeded-category": "Jodiar sidjen haa tuföl ferbinjangen (nodes)",
-       "node-count-exceeded-category-desc": "En kategorii för sidjen mä tuföl knooter (nodes).",
+       "node-count-exceeded-category-desc": "Detdiar sidj brükt tuföl knooter (nodes).",
        "node-count-exceeded-warning": "Detdiar sidj hää tuföl ferbinjangen (nodes)",
        "expansion-depth-exceeded-category": "Jodiar sidjen haa tuföl ütjwidjangen (expansion)",
-       "expansion-depth-exceeded-category-desc": "Det as en kategorii för sidjen mä tuföl ütjwidjangen.",
+       "expansion-depth-exceeded-category-desc": "Detdiar sidj hää tuföl ütjwidjangen.",
        "expansion-depth-exceeded-warning": "Detdiar sidj hää tuföl ütjwidjangen (expansion)",
        "parser-unstrip-loop-warning": "Diar as en jinsidjag ferwisang",
        "parser-unstrip-recursion-limit": "Tuföl jinsidjag ferwisangen bi $1",
        "undo-failure": "Det feranrang küd ei stregen wurd, auer di kirew uuntesken feranert wurden as.",
        "undo-norev": "Det feranrang küd ei turagsaat wurd, auer diar niks as of auer det sidj stregen wurden as.",
        "undo-nochange": "Detdiar feranrang as wel al ans turagsaat wurden.",
-       "undo-summary": "Feranrang $1 faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusjuun]]) turagsaat.",
+       "undo-summary": "Feranrang $1 faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschuun]]) turagsaat.",
        "undo-summary-username-hidden": "Feranrang $1 faan en ferbürgenen brüker turagsaat",
        "cantcreateaccounttitle": "Det brükerkonto koon ei iinracht wurd",
        "cantcreateaccount-text": "Det iinrachten faan en brükerkonto faan det IP-adres '''($1)''' as faan [[User:$3|$3]] speret wurden.\n\nGrünj för det sper: ''$2''",
        "rev-deleted-event": "(Logbuk-iindrach stregen)",
        "rev-deleted-user-contribs": "[Brükernööm of IP-adres wechnimen - Feranrangen uun bidracher ferbürgen]",
        "rev-deleted-text-permission": "Detdiar werjuun as '''stregen''' wurden.\nUun't [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbuk] stäänt muar diartu.",
+       "rev-suppressed-text-permission": "Detdiar werjuun as '''ferbürgen''' wurden.\nDü könst det noch uunluke uun't [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} fersteeg-logbuk].",
        "rev-deleted-text-unhide": "Detdiar werjuun as '''stregen''' wurden.\nUun't [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbuk] stäänt muar diartu.\nDü könst [$1 detdiar werjuun uunluke], wan dü wel.",
        "rev-suppressed-text-unhide": "Detdiar werjuun as '''ferbürgen''' wurden.\nUun't [{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} fersteeg-logbuk] stäänt muar diartu.\nDü könst [$1 detdiar werjuun uunluke], wan dü wel.",
        "rev-deleted-text-view": "Detdiar werjuun as '''stregen''' wurden.\nDü könst det noch uunluke. Uun't [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbuk] stäänt muar diartu.",
        "revdelete-text-text": "Stregen werjuunen bliiw uun't werjuunshistoore, man dialen diarfaan san ei för arken tu sen.",
        "revdelete-text-file": "Stregen datei-werjuunen bliiw uun't werjuunshistoore, man dialen diarfaan san ei för arken tu sen.",
        "logdelete-text": "Stregen logbuk-iindracher bliiw uun a logbuken, man dialen diarfaan san ei för arken tu sen.",
-       "revdelete-text-others": "Ööder administratooren faan {{SITENAME}} kön widjerhen ales uunluke an kön det uk weder mä detheer spezial-sidj iinstel, wan diar niks ööders uun a wai as.",
+       "revdelete-text-others": "Ööder administratooren kön widjerhen ales uunluke an kön det uk weder iinstel, wan diar niks ööders uun a wai as.",
        "revdelete-confirm": "Ferseekre noch ans, dat dü det würelk du wel, dat dü witjst, wat dü dääst, an dat det mä a [[{{MediaWiki:Policy-url}}|bestemangen]] auerian stemet.",
        "revdelete-suppress-text": "Det skul '''bluas''' onertrakt wurd bi:\n* Persöönelk informatsjuunen, diar näämen wat uungung\n*: ''Adresen, tilefoonnumern, ferseekerangsnumern an sowat''",
        "revdelete-legend": "Iinstelangen, hüföl tu sen wees skal",
        "searchall": "aaltumaal",
        "showingresults": "Heer {{PLURAL:$1|as '''1''' resultaat|san '''$1''' resultaaten}}, jo began mä numer '''$2.'''",
        "showingresultsinrange": "Oner {{PLURAL:$1|woort <strong>ian</strong> resultaat|wurd bit tu <strong>$1</strong> resultaaten}} tesken <strong>$2</strong> an <strong>$3</strong> uunwiset.",
-       "showingresultsheader": "{{PLURAL:$5|resultaat '''$1''' faan '''$3'''|resultaaten '''$1-$2''' faan '''$3'''}}, för '''$4.'''",
+       "search-showingresults": "{{PLURAL:$4|Resultaat <strong>$1</strong> faan <strong>$3</strong>|Resultaaten <strong>$1 - $2</strong> faan <strong>$3</strong>}}",
        "search-nonefound": "För din uunfraag san nian resultaaten fünjen wurden.",
        "powersearch-legend": "Ütjwidjet schüken",
        "powersearch-ns": "Schük uun nöömrümer:",
        "preferences": "Iinstelangen",
        "mypreferences": "Iinstelangen",
        "prefs-edits": "Taal faan feranrangen:",
-       "prefsnologintext2": "Wees so gud an $1 , am din brüker-iinstelangen fäästtuleien.",
+       "prefsnologintext2": "Wees so gud an meldi di uun, am din brüker-iinstelangen tu feranrin.",
        "prefs-skin": "Skak",
        "skin-preview": "Föörskau",
        "datedefault": "Föör-iinstelang",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Ferskeel",
        "prefs-help-prefershttps": "Detdiar iinstelang täält, wan dü di naist tooch uunmeldest.",
+       "prefswarning-warning": "A feranrangen bi din iinstelangen san noch ei seekert wurden.\nWan dü detheer sidj ferläätst, saner üüb \"$1\" tu traken, wurd din iinstelangen ei aktualisiaret.",
        "prefs-tabs-navigation-hint": "Halep: Dü könst a lachter of rochter wiiser-knoop brük, am tesken a ridjerkoorden boowen uun't menüü hen an weder tu springen.",
        "email-address-validity-valid": "Detdiar E-Mail-adres schocht gud ütj.",
        "email-address-validity-invalid": "Du en echt E-Mail-adres uun.",
        "right-deletedtext": "Stregen tekst an feranrangen tesken stregen werjuunen uunluke",
        "right-browsearchive": "Schük stregen sidjen",
        "right-undelete": "Stregen sidjen turaghaale",
-       "right-suppressrevision": "Werjuunen uunluke an turaghaale, diar uk för administratooren ei tu sen san",
+       "right-suppressrevision": "Werjuunen faan sidjen för arke brüker fersteeg, turaghaale an uunluke.",
+       "right-viewsuppressed": "För arke brüker ferbürgen werjuunen uunluke.",
        "right-suppressionlog": "Priwoot logbuken uunluke",
        "right-block": "Brükern spere (för't skriiwen)",
        "right-blockemail": "Brüker spere för't e-mail schüüren",
        "recentchanges-legend-heading": "'''Ferklaarang:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (luke uk bi't [[Special:NewPages|list mä nei sidjen]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Diar wurd a feranrangen sant <strong>$2</strong>uunwiset (ei muar üs <strong>$1</strong> feranrangen).",
+       "rcnotefrom": "Diar {{PLURAL:$5|woort det feranrang|wurd a feranrangen}} sant <strong>$3,$4</strong>uunwiset (ei muar üs <strong>$1</strong> feranrangen).",
        "rclistfrom": "Bluas feranrangen sant $3 $2 wise",
        "rcshowhideminor": "$1 letj feranrangen",
        "rcshowhideminor-show": "Wise",
        "license": "Lisens:",
        "license-header": "Lisens",
        "nolicense": "Nian ütjwool",
+       "licenses-edit": "Lisensmögelkhaiden bewerke",
        "license-nopreview": "(Diar as noch niks tu sen)",
-       "upload_source_url": "(en tuläät URL)",
-       "upload_source_file": "(en datei üüb dan computer)",
+       "upload_source_url": "(din ütjsoocht datei faan en tuläät URL)",
+       "upload_source_file": "(din ütjsoocht datei faan dan computer)",
+       "listfiles-delete": "strik",
        "listfiles-summary": "Üüb detdiar spezialsidj wurd aal a huuchschüürd datein uunwiset.",
        "listfiles_search_for": "Schük efter det datei:",
        "imgfile": "datei",
        "randomincategory": "Tufelag sidj uun't kategorii",
        "randomincategory-invalidcategory": "\"$1\" as üs kategoriinööm ei tuläät.",
        "randomincategory-nopages": "Diar san nian sidjen uun [[:Category:$1]].",
-       "randomincategory-selectcategory": "Tufelag sidj uun't kategorii: $1 $2.",
-       "randomincategory-selectcategory-submit": "Widjer",
+       "randomincategory-category": "Kategorii:",
+       "randomincategory-legend": "Tufelag sidj uun't kategorii",
        "randomredirect": "Tufelag widjerfeerang",
        "randomredirect-nopages": "Uun di nöömrüm „$1“ san nian widjerfeerangen.",
        "statistics": "Statistik",
        "wantedpages-badtitle": "Diar as en artiikelnööm ei tuläät uun: $1",
        "wantedfiles": "Datein, diar brükt wurd",
        "wantedfiletext-cat": "Jodiar datein wurd brükt, oober san ei diar. Datein faan ööder archiiwen wurd apfeerd, san oober <del>trochstregen</del>. An jo sidjen, diar sok datein brük, stun uun  [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Jodiar datein wurd brükt, man san ei diar. An do wurd diar üüb [[:$1]] sidjen apfeerd, diar datein brük, diar't ei jaft.",
        "wantedfiletext-nocat": "Jodiar datein wurd brükt, oober san ei diar. Datein faan ööder archiiwen wurd apfeerd, san oober <del>trochstregen</del>.",
+       "wantedfiletext-nocat-noforeign": "Jodiar datein wurd brükt, man san ei diar.",
        "wantedtemplates": "Föörlaagen, diar brükt wurd",
        "mostlinked": "Sidjen, huar a miast ööder sidjen üüb ferwise",
        "mostlinkedcategories": "Miast brükt kategoriin",
        "querypage-disabled": "Detdiar spezial-sidj as ei aktiif, am det süsteem ei tu auerläästin.",
        "booksources": "Schük efter ISBN-numer",
        "booksources-search-legend": "Schük efter bukloodens",
-       "booksources-go": "Widjer",
+       "booksources-search": "Schük",
        "booksources-text": "Detdiar list ferwiset üüb wääbsteeden, diar nei an brükt buken ferkuupe. Diar feist dü uk muar tu weden. {{SITENAME}} hää mo jodiar kuuplidj oober niks tu dun.",
        "booksources-invalid-isbn": "Detdiar ISBN as woorskiinelk ferkiard. Luke noch ans efter, of det rocht auerdraanj wurden as.",
        "specialloguserlabel": "Brüker:",
        "index-category-desc": "Üüb detdiar sidj stäänt det maagisk wurd <code><nowiki>__INDEX__</nowiki></code> an as uun en nöömrüm, huar det ei tuläät as. Sodenang woort det faan a bots likes indisiaret.",
        "post-expand-template-inclusion-category-desc": "Efter't ütjwidjin faan a föörlaagen as det sidj grater üs <code>$wgMaxArticleSize</code>, sodenang kön enkelt föörlaagen ei ütjwidjet wurd.",
        "post-expand-template-argument-category-desc": "Efter't ütjwidjin faan en föörlaagenargument (det stäänt uun trebelt kläämen so üs <code>{{{Foo}}})</code> as det sidj grater üs <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Diar san tu föl parser-funktjuunen (so üs <code>#ifexist</code>) uun det sidj iinbünjen. Luke efter uun't [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit brüker-hoonbuk].",
-       "broken-file-category-desc": "Detdiar kategorii woort iinsaat, wan üüb det sidj en uunstaken ferwisang föörkomt. (Det as ferlicht en ferwisang üüb en datei, wat det goorei jaft.)",
+       "expensive-parserfunction-category-desc": "Det sidj brükt tuföl parser-funktjuunen (so üs <code>#ifexist</code>). Luke efter uun't [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit brüker-hoonbuk].",
+       "broken-file-category-desc": "Det sidj brükt en uunstaken ferwisang. (Det as ferlicht en ferwisang üüb en datei, wat det goorei jaft.)",
        "hidden-category-category-desc": "Det as en kategorii, huar <code><nowiki>__HIDDENCAT__</nowiki></code> üüb stäänt. Hat woort normoolerwiis ei bi a kategoriin uunwiset.",
        "trackingcategories-nodesc": "Diar as nian beskriiwang.",
        "trackingcategories-disabled": "Detdiar kategorii as ufsteld wurden",
        "mywatchlist": "Uun't uug behual",
        "watchlistfor2": "Foon $1 $2",
        "nowatchlist": "Diar as nään iindrach, diar dü uun't uug behual wel.",
-       "watchlistanontext": "Dü skel di $1, am iindracher tu leesen of tu bewerkin, diar dü uun't uug behual wel.",
+       "watchlistanontext": "Dü skel di uunmelde, am iindracher tu leesen of tu bewerkin, diar dü uun't uug behual wel.",
        "watchnologin": "Ei uunmeldet",
        "addwatch": "Uk uun't uug behual",
        "addedwatchtext": "Det sidj „[[:$1]]“ wel dü [[Special:Watchlist|uun't uug behual]].\nFeranrangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
        "watchlist-details": "Dü behäälst {{PLURAL:$1|1 sidj|$1 sidjen}} uun't uug, diarbi wurd diskuschuunsidjen ei mätääld.",
        "wlheader-enotif": "Di e-mail siinst as aktiif.",
        "wlheader-showupdated": "Nei feranert sidjen wurd '''fäät''' uunwiset.",
-       "wlnote": "Diar {{PLURAL:$1|stäänt det leetst feranrang|stun a leetst '''$1''' feranrangen}} faan a leetst {{PLURAL:$2|stünj|'''$2''' stünjen}}. Stant: $3, klook $4.",
-       "wlshowlast": "Wise a feranrangen faan leetst $1 stünjen, $2 daar of $3.",
+       "wlnote": "Diar {{PLURAL:$1|stäänt det leetst feranrang|stun a leetst <strong>$1</strong> feranrangen}} faan a leetst {{PLURAL:$2|stünj|<strong>$2</strong> stünjen}}. Stant: $3, klook $4.",
+       "wlshowlast": "Wise a feranrangen faan leetst $1 stünjen, $2 daar of .",
        "watchlist-options": "Iinstelangen för't uunwisin",
        "watching": "Uun't uug behual ...",
        "unwatching": "Ei uun't uug behual ...",
        "exbeforeblank": "diar sted föör't leesag maagin: „$1“",
        "delete-confirm": "Strik \"$1\"",
        "delete-legend": "Strike",
-       "historywarning": "'''Paase üüb:''' Det sidj, wat dü strik wel, hää amanbi $1 {{PLURAL:$1|werjuun|werjuunen}}:",
+       "historywarning": "<strong>Paase üüb:</strong> Det sidj, wat dü strik wel, hää $1 {{PLURAL:$1|werjuun|werjuunen}}:",
        "confirmdeletetext": "Dü wel en sidj mä aal sin werjuunen strik. Dü skel gudkään, dat dü witjst, wat dü dääst an dat din dun mä a [[{{MediaWiki:Policy-url}}|brükerreegeln]] auerian stemet.",
        "actioncomplete": "Klaar",
        "actionfailed": "Diar ging wat skiaf",
        "delete-edit-reasonlist": "Grünjer för't striken bewerke",
        "delete-toobig": "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Sok sidjen kön ei so gau stregen wurd, ööders san a servers plaat.",
        "delete-warning-toobig": "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Det striken koon komer maage bi't dootenbeenk.",
+       "deleteprotected": "Dü könst detdiar sidj ei strik, auer det seekert wurden as.",
        "deleting-backlinks-warning": "'''Paase üüb:''' Diar ferwise noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|ööder sidjen]] üüb det sidj, diar dü strik wel. Of det sidj as noch huarööders iinbünjen.",
        "rollback": "Feranrangen turagsaat",
        "rollback_short": "Turagsaat",
        "rollbacklinkcount-morethan": "Muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} turagsaat",
        "rollbackfailed": "Bi't turagsaaten as wat skiaf gingen.",
        "cantrollback": "Det feranrang koon ei turagsaat wurd, diar san nian ööder skriiwern weesen.",
-       "alreadyrolled": "A anrangen faan [[User:$2|$2]] ([[User talk:$2|Diskusjuun]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) bi [[:$1]] kön ei turagsaat wurd. Diar hää uuntesken en öödern brüker det sidj feranert.\n\nDet leetst feranrang as faan [[User:$3|$3]] ([[User talk:$3|Diskusjuun]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "A feranrangen faan [[User:$2|$2]] ([[User talk:$2|Diskuschuun]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) bi [[:$1]] kön ei turagsaat wurd. Diar hää uuntesken en öödern brüker det sidj feranert.\n\nDet leetst feranrang as faan [[User:$3|$3]] ([[User talk:$3|Diskuschuun]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Tuupfaadet feranrang: ''„$1“''.",
-       "revertpage": "Feranrangen faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusjuun]]) san üüb di leetst stant faan [[User:$1|$1]] turagsaat wurden.",
+       "revertpage": "Feranrangen faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschuun]]) san üüb di leetst stant faan [[User:$1|$1]] turagsaat wurden.",
        "revertpage-nouser": "Feranrangen faan en ferbürgenen brüker turagsaat an det leetst werjuun faan {{GENDER:$1|[[User:$1|$1]]}} weder iinsteld.",
        "rollback-success": "Feranrangen faan $1 turagsaat an det leetst werjuun faan $2 weder iinsteld.",
        "sessionfailure-title": "session feeler",
        "protect-othertime": "Ööder sperdüür:",
        "protect-othertime-op": "ööder sperdüür",
        "protect-existing-expiry": "Sidjenseekerang lääpt uf: $2, klook $3",
+       "protect-existing-expiry-infinity": "Sidjenseekrang lääpt uf: saner aanj",
        "protect-otherreason": "Ööder/noch en grünj:",
        "protect-otherreason-op": "Ööder grünj:",
        "protect-dropdown": "* Miast brükt grünjer\n** Edit-War\n** Wandaalen onerwais\n** Tuföl rekloome\n** Flooksis brükt föörlaag\n** Sidj mä föl beschük",
        "sp-contributions-deleted": "Stregen bidracher",
        "sp-contributions-uploads": "Huuchschüürd bilen",
        "sp-contributions-logs": "Logbuken",
-       "sp-contributions-talk": "Diskusjuun",
+       "sp-contributions-talk": "Diskuschuun",
        "sp-contributions-userrights": "Brükerrochten",
        "sp-contributions-blocked-notice": "Didiar brüker as speret. Det stäänt uun't sperlogbuk:",
        "sp-contributions-blocked-notice-anon": "Detdiar IP-adres as speret. Det stäänt uun't sperlogbuk:",
        "autoblockid": "Automaatisk sper #$1",
        "block": "Brüker spere",
        "unblock": "Brüker ei muar spere",
-       "blockip": "IP-adres/brüker spere",
+       "blockip": "IP-adres/{{GENDER:$1|brüker}} spere",
        "blockip-legend": "IP-adres/brüker spere",
        "blockiptext": "Mä detdiar formulaar sperest dü en IP-adres of en brükernööm, so dat faan diar nian feranrangen muar maaget wurd kön. \nDet skul bluas föörnimen wurd, am jin wandaalen föörtugungen an uun auerianstemang mä a [[{{MediaWiki:Policy-url}}|brükerreegeln]].\nSkriiw en guden grünj för det sper ap.",
        "ipaddressorusername": "IP-adres of brükernööm:",
        "ipb-unblock-addr": "„$1“ ei muar spere",
        "ipb-unblock": "IP-adres/brüker ei muar spere",
        "ipb-blocklist": "Speren uunwise",
-       "ipb-blocklist-contribs": "Bidracher faan „$1“",
+       "ipb-blocklist-contribs": "Bidracher faan „{{GENDER:$1|$1}}“",
        "unblockip": "Brüker ei muar spere",
        "unblockiptext": "Mä detdiar formulaar könst dü det sper faan en IP-adres of en brüker apheew.",
        "ipusubmit": "Ei muar spere",
        "unblocked": "[[User:$1|$1]] woort ei muar speret.",
        "unblocked-range": "Sper för $1 as apheewen wurden.",
        "unblocked-id": "Sperang $1 as apheewen",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] as freiden wurden.",
        "blocklist": "Speret brükern",
        "ipblocklist": "Speret brükern",
        "ipblocklist-legend": "Speret brüker finj",
        "import": "Sidjen importiare",
        "importinterwiki": "Transwiki import",
        "import-interwiki-text": "Schük en Wiki an en sidj tu importiarin ütj. A werjuunen an brükernöömer bliiw erhäälen.\nTranswiki-import-aktjuunen wurd uun't [[Special:Log/import|Import-logbuk]] fäästhäälen.",
-       "import-interwiki-source": "Faan hün Wiki/sidj:",
+       "import-interwiki-sourcewiki": "Faan hün Wiki:",
+       "import-interwiki-sourcepage": "Faan hün sidj:",
        "import-interwiki-history": "Aal a werjuunen faan det sidj importiare",
        "import-interwiki-templates": "Mä aal a föörlaagen",
        "import-interwiki-submit": "Import",
        "import-error-create": "Det sidj „$1“ as ei importiaret wurden, auer dü det ei maage mutst.",
        "import-error-interwiki": "Det sidj „$1“ as ei importiaret wurden, auer di nööm för ferwisangen (interwiki) föörsen as.",
        "import-error-special": "Det sidj „$1“ as ei importiaret wurden, auer hat tu en nöömrüm hiart, huar nian sidjen mögelk san.",
-       "import-error-invalid": "Det sidj „$1“ as ei importiaret wurden, auer di nööm ei stemet.",
+       "import-error-invalid": "Det sidj „$1“ as ei importiaret wurden, auer di nööm üüb detheer Wiki ei tuläät as.",
        "import-error-unserialize": "Det werjuun $2 faan det sidj „$1“ küd ei deserialisiaret wurd. Det werjuun woort mä det münster $3 brükt, an det as mä $4 serialisiaret.",
        "import-error-bad-location": "Det feranrang $2 mä model $3 koon ei üs \"$1\" üüb detheer wiki seekert wurd, auer detdiar model heer ei brükt wurd koon.",
        "import-options-wrong": "Ferkiard {{PLURAL:$2|iinstelang|iinstelangen}}: <nowiki>$1</nowiki>",
        "importlogpage": "Import-logbuk",
        "importlogpagetext": "Administratiif import faan sidjen mä aal a werjuunen faan ööder Wikis.",
        "import-logentry-upload": "„[[$1]]“ faan en datei importiaret",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|werjuun|werjuunen}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|werjuun|werjuunen}} importiaret",
        "import-logentry-interwiki": "„$1“ mä transwiki importiaret",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|werjuun|werjuunen}} faan $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|werjuun|werjuunen}} faan $2 importiaret",
        "javascripttest": "JavaScript-test",
        "javascripttest-title": "$1-tests wurd ütjfeerd.",
        "javascripttest-pagetext-noframework": "Detdiar sidj as för JavaScript-tests föörsen.",
        "tooltip-pt-userpage": "Din brükersidj",
        "tooltip-pt-anonuserpage": "Brükersidj faan det IP-adres, faan huar ütj dü werkest",
        "tooltip-pt-mytalk": "Din diskusjuunssidj",
-       "tooltip-pt-anontalk": "Diskusjuun auer feranrangen faan detdiar IP-adres",
+       "tooltip-pt-anontalk": "Diskuschuun auer feranrangen faan detdiar IP-adres",
        "tooltip-pt-preferences": "Min iinstelangen",
        "tooltip-pt-watchlist": "Sidjen, diar dü uun't uug behual wel",
        "tooltip-pt-mycontris": "List mä aanj bidracher",
        "tooltip-pt-login": "Wan dü di uunmeldest, heest dü muar mögelkhaiden. Dü säärst det oober ei.",
        "tooltip-pt-logout": "Ufmelde",
-       "tooltip-ca-talk": "Diskusjuun auer di artiikel",
+       "tooltip-ca-talk": "Diskuschuun auer di artiikel",
        "tooltip-ca-edit": "Sidj bewerke. Luke di det iarst ans uun, iar dü det seekerst.",
        "tooltip-ca-addsection": "Nei kirew began",
        "tooltip-ca-viewsource": "Detdiar sidj as seekert wurden.\nDü könst di kweltekst uunluke.",
        "exif-urgency-low": "Liach ($1)",
        "exif-urgency-high": "Huuch ($1)",
        "exif-urgency-other": "Faan a brüker fäästlaanj prioriteet ($1)",
-       "watchlistall2": "aaltumaal",
        "namespacesall": "aaltumaal",
        "monthsall": "aaltumaal",
        "confirmemail": "E-mail-adres gudkään",
        "scarytranscludefailed-httpstatus": "[Ufrepen faan föörlaagen för $1 as skiaf gingen: HTTP  $2]",
        "scarytranscludetoolong": "[URL as tu lung]",
        "deletedwhileediting": "'''Paase üüb:''' Det sidj as stregen wurden, üs dü diar jüst bi werket heest!\nUun't [{{fullurl:{{#special:Log}}|type=delete&page={{FULLPAGENAMEE}}}} Strik-logbuk] fanjst dü di grünj för't striken. Wan dü det sidj seekerst, woort det nei uunlaanj.",
-       "confirmrecreate": "Di brüker [[User:$1|$1]] ([[User talk:$1|Diskusjuun]]) hää det sidj stregen, üs dü diar jüst bi werket heest. Di grünj wiar:\n:''$2''\nFerseekre, dat dü det sidj würelk nei maage wel.",
-       "confirmrecreate-noreason": "Di brüker [[User:$1|$1 ]] ([[User talk:$1|Diskusjuun]]) hää det sidj stregen, huar dü jüst bi werket heest. Ferseekre, dat dü det sidj würelk nei maage wel.",
+       "confirmrecreate": "Di brüker [[User:$1|$1]] ([[User talk:$1|Diskuschuun]]) hää det sidj stregen, üs dü diar jüst bi werket heest. Di grünj wiar:\n:''$2''\nFerseekre, dat dü det sidj würelk nei maage wel.",
+       "confirmrecreate-noreason": "Di brüker [[User:$1|$1 ]] ([[User talk:$1|Diskuschuun]]) hää det sidj stregen, huar dü jüst bi werket heest. Ferseekre, dat dü det sidj würelk nei maage wel.",
        "recreate": "Nei maage",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Det sidj ütj a cache strik?",
        "autosumm-replace": "Di tekst as ütjbütjet wurden mä \"$1\"",
        "autoredircomment": "Sidj tu [[$1]] widjerfeerd",
        "autosumm-new": "Det sidj as nei uunlaanj wurden: \"$1\"",
+       "autosumm-newblank": "En leesag sidj maaget",
        "lag-warn-normal": "Feranrangen faan {{PLURAL:$1|at leetst sekund|a leetst $1 sekunden}} kön noch ei uunwiset wurd.",
        "lag-warn-high": "Auer det huuch dootenbeenklääst kön a feranrangen faan {{PLURAL:$1|at leetst sekund|a leetst $1 sekunden}} noch ei uunwiset wurd.",
        "watchlistedit-normal-title": "List mä sidjen, diar dü uun't uug behual wel, bewerke",
        "watchlisttools-view": "Uun't uug behual: Feranrangen",
        "watchlisttools-edit": "Normool bewerke",
        "watchlisttools-raw": "Uun't listenformoot bewerke",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskusjuun]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskuschuun]])",
        "unknown_extension_tag": "Ünbekäänd ''tag'' „$1“",
        "duplicate-defaultsort": "'''Paase üüb:''' Di sortiarkai \"$2\" auerskraft di ual sortiarkai \"$1\"",
+       "duplicate-displaytitle": "<strong>Paase üüb:</strong> Di uunwiset tiitel \"$2\" auerskraft di ual tiitel \"$1\".",
        "version": "Werjuun",
        "version-extensions": "Instaliaret ütjwidjangen",
        "version-skins": "Instaliaret brükerskaker",
        "logentry-rights-rights": "$1 {{GENDER:$2|hää}} det brükerskööl för $3 faan $4 tu $5 feranert.",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|hää}} det brükerskööl för $3 feranert.",
        "logentry-rights-autopromote": "$1 as automaatisk faan $4 tu $5 {{GENDER:$2|tuwiset}} wurden.",
+       "logentry-upload-upload": "$1 {{GENDER:$2|hää}} $3 huuchschüürd",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|hää}} en nei werjuun faan $3 huuchschüürd",
+       "logentry-upload-revert": "$1 {{GENDER:$2|hää}} $3 huuchschüürd",
        "rightsnone": "(-)",
+       "revdelete-summary": "tuhuupefootings-komäntoor",
        "feedback-bugornote": "Wan dü en technisk probleem beskriiw wel, wees so gud an skriiw [$1 am di feeler].\nÖöders könst dü uk det formulaar oner brük. Dan komentaar woort tuup mä dan brükernööm an det werjuun faan dan browser üüb det sidj „[$3 $2]“ skrewen.",
        "feedback-subject": "Teemo:",
        "feedback-message": "Mädialang:",
        "action-pagelang": "det sidjenspriak tu feranrin",
        "log-name-pagelang": "Logbuk för spriak-feranrangen",
        "log-description-pagelang": "Det as en logbuk för sidjenspriak-feranrangen",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|hää}} det sidjenspriak för $3 faan $4 tu $5 feranert."
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|hää}} det sidjenspriak för $3 faan $4 tu $5 feranert.",
+       "default-skin-not-found": "Hoppla! Die in <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> definierte Standardbenutzeroberfläche für dein Wiki ist nicht verfügbar.\n\nDeine Installation scheint die folgenden Benutzeroberflächen zu enthalten. Siehe [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de das Benutzerhandbuch] zur Aktivierung und Auswahl des Standards.\n\n$2\n\n; Falls du gerade MediaWiki installiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet. Versuche einige Benutzeroberflächen aus dem  [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren, indem du:\n:* Den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunterlädst, der mit verschiedenen Benutzeroberflächen und Erweiterungen kommt. Du kannst das Verzeichnis <code>skins/</code> kopieren und einfügen.\n:* Eine der <code>mediawiki/skins/*</code>-Repositorien über Git in das <code dir=\"ltr\">skins/</code>-Verzeichnis deiner MediaWiki-Installation klonst.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist.\n\n; Falls du gerade MediaWiki aktualisiert hast:\n: MediaWiki 1.24 und neuere Versionen aktivieren nicht mehr automatisch installierte Benutzeroberflächen (siehe das [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Benutzerhandbuch]). Du kannst die folgenden Zeilen in die Datei <code>LocalSettings.php</code> einfügen, um alle derzeit installierten Benutzeroberflächen zu aktivieren:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du gerade <code>LocalSettings.php</code> geändert hast:\n: Überprüfe die Namen der Benutzeroberflächen auf Tippfehler.",
+       "default-skin-not-found-no-skins": "Hoppla! Die in <code>$wgDefaultSkin</code> als <code>$1</code> definierte Standardbenutzeroberfläche für dein Wiki ist nicht verfügbar.\n\nDu hast keine installierten Benutzeroberflächen.\n\n; Falls du gerade MediaWiki installiert oder aktualisiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet. MediaWiki 1.24 und neuere Versionen enthalten keine Benutzeroberflächen im Haupt-Repositorium. Versuche einige Benutzeroberflächen aus dem [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren, indem du:\n:* Den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunterlädst, der mit verschiedenen Benutzeroberflächen und Erweiterungen kommt. Du kannst das  <code>skins/</code>-Verzeichnis kopieren und einfügen.\n:* Eine der <code>mediawiki/skins/*</code>-Repositorien über Git in das <code dir=\"ltr\">skins/</code>-Verzeichnis deiner MediaWiki-Installation klonst.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist. Siehe das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch] zur Aktivierung von Benutzeroberflächen und Auswahl des Standards.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiwiaret)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ufsteld''')",
+       "mediastatistics": "Statistik faan meedien",
+       "mediastatistics-summary": "Statistiken faan huuchschüürd dateitypen. Diar woort bluas det leetst werjuun uunwiset. Ual of stregen werjuunen san diar ei bi.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|Ian byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-Typ",
+       "mediastatistics-table-extensions": "Mögelk ütjwidjangen",
+       "mediastatistics-table-count": "Taal faan datein",
+       "mediastatistics-table-totalbytes": "Grate tuup",
+       "mediastatistics-header-unknown": "Ünbekäänd",
+       "mediastatistics-header-bitmap": "Bitmap-bilen",
+       "mediastatistics-header-drawing": "Tiaknangen (vektor-bilen)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videos",
+       "mediastatistics-header-multimedia": "Rik meedien",
+       "mediastatistics-header-office": "Office",
+       "mediastatistics-header-text": "Tekst",
+       "mediastatistics-header-executable": "Datein tu ütjfeeren",
+       "mediastatistics-header-archive": "Komprimiaret formaaten",
+       "json-error-unknown": "Diar ging wat skiaf mä't JSON. Feeler: $1",
+       "json-error-depth": "Det staabeljipde as tu grat.",
+       "json-error-state-mismatch": "Ferkiard JSON",
+       "json-error-ctrl-char": "Schüürtiakenfeeler, ferlich ferkiard kodiaret",
+       "json-error-syntax": "Süntaksfeeler",
+       "json-error-utf8": "Ferkiard UTF-8-tiakens, ferlicht ferkiard kodiaret.",
+       "json-error-recursion": "Ian of muar rekursiif referensen uun a wäärs tu kodiarin.",
+       "json-error-inf-or-nan": "Ään of muar NAN of INF wäärser uun a wäärs tu kodiarin.",
+       "json-error-unsupported-type": "Diar stäänt en wäärs faan en typ, diar ei kodiaret wurd koon."
 }
index 18b5c72..a2490b8 100644 (file)
        "searchrelated": "leâts",
        "searchall": "ducj",
        "showingresults": "Ca sot {{PLURAL:$1|al è fin a '''1''' risultât|a son fin a '''$1''' risultâts}} scomençant dal numar '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Risultât '''$1''' su '''$3'''|Risultâts '''$1 - $2''' su '''$3'''}} par '''$4'''",
        "search-nonefound": "Nissun risultât par cheste ricercje.",
        "powersearch-legend": "Ricercje avanzade",
        "powersearch-ns": "Cîr tai spazis dai nons:",
        "pager-older-n": "{{PLURAL:$1|1 plui vieri|$1 plui vieris}}",
        "booksources": "Fonts librariis",
        "booksources-search-legend": "Ricercje di fonts libraris",
-       "booksources-go": "Va",
        "specialloguserlabel": "Utent:",
        "speciallogtitlelabel": "Titul:",
        "log": "Regjistris",
        "wlheader-enotif": "Notifiche par pueste eletroniche ativade.",
        "wlheader-showupdated": "Lis pagjinis gambiadis de ultime volte che tu lis âs cjaladis a son mostradis in '''gruessut'''",
        "wlnote": "Ca sot {{PLURAL:$1|al è il cambiament plui recent|a son i '''$1''' cambiaments plui recents}} {{PLURAL:$2|inte ultime ore|intes '''$2''' oris passadis}}.",
-       "wlshowlast": "Mostre ultimis $1 oris $2 zornadis $3",
+       "wlshowlast": "Mostre ultimis $1 oris $2 zornadis",
        "watchlist-options": "Opzions pe liste dai tignûts di voli",
        "watching": "Daûr a zontâ aes pagjinis tignudis di voli...",
        "unwatching": "Daûr a gjavâ des pagjinis tignudis di voli...",
        "exif-compression-1": "Cence compression",
        "exif-unknowndate": "Date no cognossude",
        "exif-orientation-1": "Normâl",
-       "watchlistall2": "dutis",
        "namespacesall": "ducj",
        "monthsall": "ducj",
        "confirmemail": "Conferme direzione di pueste",
index 9c23ae8..65d4bd9 100644 (file)
        "passwordreset-email": "E-mailadres:",
        "passwordreset-emailtitle": "Akkountdetails op {{SITENAME}}",
        "changeemail": "Feroarje e-mailadres",
-       "changeemail-header": "Feroarje akkount e-mailadres",
-       "changeemail-cancel": "Ofbrekke",
        "bold_sample": "Fette tekst",
        "bold_tip": "Fette tekst",
        "italic_sample": "Skeane tekst",
        "suppress": "Tafersjoch",
        "booksources": "Boekynformaasje",
        "booksources-search-legend": "Boarnen en ynformaasje oer in boek sykje",
-       "booksources-go": "Sykje",
        "booksources-text": "Hjirûnder is in list mei keppelings nei oare websites dy't nije of brûkte boeken ferkeapje en dy't faaks mear ynformaasje hawwe oer it boek dat jo sykje:",
        "booksources-invalid-isbn": "It ynjûne ISBN liket net jildich te wêzen.\nKontrolearje oft jo faaks in flater makke hawwe by de ynfier.",
        "specialloguserlabel": "Meidogger:",
        "notanarticle": "Dit kin net folge wurde.",
        "watchlist-details": "Jo folchlist hat {{PLURAL:$1|$1 side|$1 siden}}, oerlissiden net meiteld.",
        "wlnote": "Dit {{PLURAL:$1|is de lêste feroaring|binne de lêste '''$1''' feroarings}} yn de lêste {{PLURAL:$2|oer|'''$2''' oeren}}.",
-       "wlshowlast": "Lit feroarings sjen fan de lêste $1 oeren $2 dagen $3",
+       "wlshowlast": "Lit feroarings sjen fan de lêste $1 oeren $2 dagen",
        "watching": "Dwaande mei op'e folchlist te setten ...",
        "unwatching": "Dwaande mei fan'e folchlist ôf te heljen ...",
        "enotif_impersonal_salutation": "meidogger fan {{SITENAME}}",
        "exif-subjectdistancerange-2": "Tichtby",
        "exif-gpsdestdistance-m": "Milen",
        "exif-gpsdestdistance-n": "Seemilen",
-       "watchlistall2": "alles",
        "namespacesall": "alles",
        "monthsall": "alle",
        "confirmemail": "Befêstigjen netpostadres",
        "revdelete-restricted": "hat beheinings oplein oan behearders",
        "revdelete-unrestricted": "hat beheinings foar behearders goedmakke",
        "rightsnone": "(gjin)",
+       "revdelete-summary": "gearfetting bewurkje",
        "feedback-subject": "Underwerp:",
        "feedback-message": "Berjocht:",
        "feedback-cancel": "Ofbrekke",
index 42bf7e9..c5e6ee6 100644 (file)
        "passwordreset-email": "Seoladh ríomhphoist:",
        "changeemail-none": "(neamhní)",
        "changeemail-password": "D'fhocal faire {{SITENAME}}:",
-       "changeemail-cancel": "Cealaigh",
        "bold_sample": "Cló trom",
        "bold_tip": "Cló trom",
        "italic_sample": "Cló iodálach",
        "pager-older-n": "{{PLURAL:$1|1 níos sine|$1 níos sine}}",
        "booksources": "Leabharfhoinsí",
        "booksources-search-legend": "Cuardaigh le foinsí leabhar",
-       "booksources-go": "Gabh",
        "specialloguserlabel": "Úsáideoir:",
        "speciallogtitlelabel": "Teideal:",
        "log": "Logaí",
        "wlheader-enotif": "Cumasaíodh fógraí riomhphoist.",
        "wlheader-showupdated": "Tá '''cló trom''' ar leathanaigh a athraíodh ón uair is deireanaí a d'fhéach tú orthu.",
        "wlnote": "Is {{PLURAL:$1|é seo thíos an t-athrú deireanach|iad seo thíos na '''$1''' athruithe deireanacha}} {{PLURAL:$2|san uair deireanach|sna '''$2''' uaire deireanacha}}.",
-       "wlshowlast": "Líon na n-uair is déanaí le taispeáint: $1. Líon na laethanta is déanaí le taispeáint: $2. Taispeáin $3.",
+       "wlshowlast": "Líon na n-uair is déanaí le taispeáint: $1. Líon na laethanta is déanaí le taispeáint: $2. Taispeáin .",
        "watchlist-options": "Roghanna don liosta faire",
        "watching": "Ag faire...",
        "unwatching": "Á bhaint de do liosta faire...",
        "exif-gpsspeed-n": "Muirmhílte",
        "exif-gpsdirection-t": "Fíorthreo",
        "exif-gpsdirection-m": "Treo maighnéadach",
-       "watchlistall2": "an t-iomlán",
        "namespacesall": "iad uile",
        "monthsall": "gach mí",
        "confirmemail": "Deimhnigh do ríomhsheoladh",
index eca10f7..97ef897 100644 (file)
        "pager-older-n": "{{PLURAL:$1|1 taa eski|$1 taa eski}}",
        "booksources": "Kaynak kiyatlar",
        "booksources-search-legend": "Kiyat kaynaklarını aara",
-       "booksources-go": "Git",
        "specialloguserlabel": "Kullanıcı:",
        "speciallogtitlelabel": "Yazı adı:",
        "log": "Jurnallar",
        "watchthispage": "Bak bu sayfaya",
        "unwatch": "Durgun sayfa izlemää",
        "watchlist-details": "Diil konuşmaa sayfaları {{PLURAL:$1|$1 sayfa|$1 sayfa}} bakmaa listanızda.",
-       "wlshowlast": "Bitki $1 saati $2 günü göster $3",
+       "wlshowlast": "Bitki $1 saati $2 günü göster",
        "watchlist-options": "İzlemäk listası opţiyaları",
        "watching": "Bakılêr...",
        "unwatching": "Durgundurulêr...",
        "metadata-expand": "Detalları göster",
        "metadata-collapse": "Detalları gösterme",
        "metadata-fields": "Bu listadaki meta bilgilerin eri, resim sayfasında sormadan gösterilecek, übürleri saklanacêk.\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",
-       "watchlistall2": "Hepsini göster",
        "namespacesall": "Hepsi",
        "monthsall": "hepsi",
        "watchlisttools-view": "İlgili diişmäkleri göster",
index 5c67aa4..4d10623 100644 (file)
@@ -14,7 +14,8 @@
                        "아라",
                        "Mywood",
                        "Duolaimi",
-                       "Impersonator 1"
+                       "Impersonator 1",
+                       "Babanwalia"
                ]
        },
        "tog-underline": "下划链接",
        "qbedit": "编写",
        "qbpageoptions": "个页",
        "qbmyoptions": "偶𠮶选项",
-       "faq": "FAQ",
+       "faq": "ਆਮ ਸੁਆਲ਼",
        "faqpage": "Project:问得蛮多𠮶问题",
        "actions": "动作",
        "namespaces": "空间名",
        "searchrelated": "相关",
        "searchall": "所有",
        "showingresults": "底下从第<b>$2</b>条显示起先𠮶<b>$1</b>条结果:",
-       "showingresultsheader": "'''$4'''𠮶{{PLURAL:$5|第'''$1'''到第'''$3'''只结果|第'''$1 - $2'''只,拢共'''$3'''只结果}}",
        "search-nonefound": "冇合到𠮶查询结果。",
        "powersearch-legend": "高级搜寻",
        "powersearch-ns": "到名子空间里头寻:",
        "pager-older-n": "{{PLURAL:$1|更旧𠮶 1|更旧𠮶 $1}}",
        "booksources": "书籍来源",
        "booksources-search-legend": "寻吖书籍来源",
-       "booksources-go": "跳到",
        "booksources-text": "底下系一部分网络书店𠮶链接列表,可以提供到倷要找𠮶书籍𠮶更多资料:",
        "specialloguserlabel": "用户:",
        "speciallogtitlelabel": "标题:",
        "wlheader-enotif": "启动嘞email通知功能。",
        "wlheader-showupdated": "上回倷眵𠮶页面改动𠮶部分用'''粗体'''显到",
        "wlnote": "下底系最近'''$2'''钟头内𠮶最晏'''$1'''道修改:",
-       "wlshowlast": "显示近来$1钟头$2日$3𠮶改动",
+       "wlshowlast": "显示近来$1钟头$2日𠮶改动",
        "watchlist-options": "监视清单选项",
        "watching": "眏到...",
        "unwatching": "莫眏到...",
        "exif-gpsspeed-n": "海浬每小时(节)",
        "exif-gpsdirection-t": "真实方位",
        "exif-gpsdirection-m": "地磁方位",
-       "watchlistall2": "全部",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "确认email地址",
index 8e2a350..3e0a10a 100644 (file)
        "searchrelated": "相關",
        "searchall": "所有",
        "showingresults": "底下從第<b>$2</b>條顯示起先嗰<b>$1</b>條結果:",
-       "showingresultsheader": "'''$4'''嗰{{PLURAL:$5|第'''$1'''到第'''$3'''隻結果|第'''$1 - $2'''隻,攏共'''$3'''隻結果}}",
        "search-nonefound": "冇合到嗰查詢結果。",
        "powersearch-legend": "高級搜尋",
        "powersearch-ns": "到名子空間裡頭尋:",
        "pager-older-n": "先$1次",
        "booksources": "書籍來源",
        "booksources-search-legend": "尋下書籍來源",
-       "booksources-go": "跳到",
        "booksources-text": "底下係一部分網絡書店嗰連結列表,可以提供到倷要找嗰書籍嗰更多資料:",
        "specialloguserlabel": "用戶:",
        "speciallogtitlelabel": "標題:",
        "wlheader-enotif": "啟動哩email通知功能。",
        "wlheader-showupdated": "上回倷眵嗰頁面改動嗰部分用'''粗體'''顯到",
        "wlnote": "下底係最近'''$2'''鐘頭內嗰最晏'''$1'''道修改:",
-       "wlshowlast": "顯示箇日子$1鐘頭$2日$3嗰改動",
+       "wlshowlast": "顯示箇日子$1鐘頭$2日嗰改動",
        "watchlist-options": "監視清單選項",
        "watching": "眏到...",
        "unwatching": "莫眏到...",
        "exif-gpsspeed-n": "海浬每小時(節)",
        "exif-gpsdirection-t": "真實方位",
        "exif-gpsdirection-m": "地磁方位",
-       "watchlistall2": "全部",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認email地址",
index cd72433..ea10570 100644 (file)
@@ -25,6 +25,7 @@
        "tog-watchdefault": "Cuir duilleagan a dheasaicheas mi air a' chlàr-fhaire agam",
        "tog-watchmoves": "Cuir duilleagan a ghluaiseas mi air a' chlàr-fhaire agam",
        "tog-watchdeletion": "Cuir duilleagan a sguabas mi às air a' chlàr-fhaire agam",
+       "tog-watchrollback": "Cuir duilleagan air an do rinn mi roladh air ais air a' chlàr-fhaire agam",
        "tog-minordefault": "Comharraich gach mùthadh mar mhùthadh beag a ghnàth",
        "tog-previewontop": "Nochd an ro-shealladh os cionn a' bhogsa deasachaidh",
        "tog-previewonfirst": "Nochd an ro-shealladh nuair a nithear a' chiad deasachadh",
        "otherlanguages": "Ann an cànain eile",
        "redirectedfrom": "(Air ath-sheòladh o $1)",
        "redirectpagesub": "Ath-sheòl an duilleag",
+       "redirectto": "Dèan ath-stiùireadh gu:",
        "lastmodifiedat": "Chaidh an duilleag seo a mhùthadh $1 aig $2 turas mu dheireadh.",
        "viewcount": "Chaidh inntrigeadh a dhèanamh dhan duilleag seo $1 {{PLURAL:$1|turas|thuras|tursan|turas}}.",
        "protectedpage": "Duilleag fo dhìon",
        "hidetoc": "falaich",
        "collapsible-collapse": "Co-theannaich",
        "collapsible-expand": "Leudaich",
+       "confirmable-confirm": "A bheil {{GENDER:$1|thu}} cinnteach?",
+       "confirmable-yes": "Tha",
+       "confirmable-no": "Chan eil",
        "thisisdeleted": "A bheil thu airson $1 a shealltainn no aiseag?",
        "viewdeleted": "A bheil thu airson $1 a shealltainn?",
        "restorelink": "$1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} a chaidh a sguabadh às",
        "invalidtitle-knownnamespace": "Tiotal mì-dhligheach leis an ainm-spàs \"$2\" agus an teacsa \"$3\"",
        "invalidtitle-unknownnamespace": "Tiotal mì-dhligheach leis an àireamh ainm-spàis $1 agus an teacsa \"$2\"",
        "exception-nologin": "Chan eil thu air logadh a-steach",
-       "exception-nologin-text": "Feumaidh tu [[Special:Userlogin|logadh a-steach]] mus fhaic thu an duilleag seo no mus urrainn dhut seo a dhèanamh.",
+       "exception-nologin-text": "Dèan logadh a-steach gus cothrom fhaighinn air an duilleag no air a' ghnìomh seo.",
        "exception-nologin-text-manual": "Ma tha thu ag iarraidh cothrom air an duilleag no air a' ghnìomh seo, $1.",
        "virus-badscanner": "Droch cho-dhealbhachd: sganair bhìorasan neo-aithnichte: <em>$1</em>",
        "virus-scanfailed": "dh'fhàillig an sganadh (còd $1)",
        "createaccount-text": "Chruthaich cuideigin cunntas airson a' phost-d agad air {{SITENAME}} ($4) air a bheil \"$2\", leis an fhacal-fhaire \"$3\".\nBu chòir dhut logadh a-steach agus am facal-faire agad atharrachadh gu h-ìosal an-dràsta.\n\n'S urrainn dhut an teachdaireachd seo a leigeil seachad ma chaidh an cunntas a chruthachadh air mhearachd.",
        "login-throttled": "Dh'fheuch thu ri logadh a-steach ro thric o chionn ghoirid.\nFuirich ort $1 mus feuch thu ris a-rithist.",
        "login-abort-generic": "Cha do shoirbhich leat leis an logadh a-steach - Chaidh sgur dheth",
+       "login-migrated-generic": "Chaidh an cunntas agad imrich 's chan eil an t-ainm cleachdaiche agad ann tuilleadh air an uicidh seo.",
        "loginlanguagelabel": "Cànan: $1",
        "suspicious-userlogout": "Chaidh d' iarrtas airson logadh a-mach a dhiùltadh a chionn 's gu bheil coltas gun deach a chur le brabhsair briste no le progsaidh tasglannaidh.",
        "createacct-another-realname-tip": "Cha leig thu leas innse dè am fìor-ainm a tha ort.\nMa bheir thu seachad e, thèid seo a chleachdadh gus urram a thoirt dha na h-ùghdaran airson an cuid obrach.",
        "passwordreset-emailsent-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a chur agus chì thu sin gu h-ìosal.",
        "passwordreset-emailerror-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
        "changeemail": "Atharraich am post-d",
-       "changeemail-header": "Atharraich cunntas a' phuist-d",
        "changeemail-text": "Lìon am foirm seo gus am post-d agad atharrachadh. Feumaidh tu am facal-faire agad a chur a-steach a-rithist gus a dhearbhadh.",
        "changeemail-no-info": "Feumaidh tu logadh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.",
        "changeemail-oldemail": "An seòladh puist-d làithreach:",
        "changeemail-none": "(chan eil gin)",
        "changeemail-password": "Am facal-faire agad air {{SITENAME}}:",
        "changeemail-submit": "Atharraich am post-d",
-       "changeemail-cancel": "Sguir dheth",
        "changeemail-throttled": "Dh'fheuch thu ri logadh a-steach ro thric.\nFuirich ort $1 mus feuch thu ris a-rithist.",
        "resettokens": "Ath-shuidhich na tòcanan",
        "resettokens-text": "'S urrainn dhut tòcanan ath-shuidheachadh a bheir cothrom dhut air cuid a dhàta prìobhaideach a tha co-cheangailte ris a' chunntas agad.\n\nBu chòir dhut seo a dhèanamh ma thug thu do chuideigin e air mhearachd no ma bhris cuideigin a-steach air a' chunntas agad.",
        "preview": "Ro-shealladh",
        "showpreview": "Seall an ro-shealladh",
        "showdiff": "Seall na mùthaidhean",
-       "anoneditwarning": "<strong>Rabhadh:</strong> Chan eil thu air logadh a-steach.\nThèid an seòladh IP agad a chlàradh ann an eachdraidh na duilleige seo.",
+       "blankarticle": "<strong>Rabhadh:</strong> Tha an duilleag a tha thu a' cruthachadh bàn.\nMa nì thu briogadh air \"{{int:savearticle}}\" a-rithist, thèid an duilleag a chruthachadh gun susbaint sam bith innte.",
+       "anoneditwarning": "<strong>Rabhadh:</strong> Chan eil thu air logadh a-steach. Chithear an seòladh IP agad gu poblach ma nì thu deasachadh sam bith. Ma nì thu <strong>[$1 logadh a-steach]</strong> no ma <strong>[$2 chruthaicheas tu cunntas]</strong>, thèid d' ainm a chur ris na dheasaich thu 's gheibh thu buannachd a bharrachd às cuideachd.",
        "anonpreviewwarning": "<em>Chan eil thu air logadh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.</em>",
        "missingsummary": "<strong>Cuimhnich:</strong> Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
        "missingcommenttext": "Cuir a-steach beachd gu h-ìosal.",
        "parser-template-recursion-depth-warning": "Chaidh thu thairis air crìoch doimhne nan ath-chùrsaidhean teamplaid ($1)",
        "language-converter-depth-warning": "Chaidh thu thairis air crìoch doimhne an iompachair chànain ($1)",
        "node-count-exceeded-category": "Duilleagan far an deachas thairis air cunntas nan nòdan",
-       "node-count-exceeded-category-desc": "Roinn-seòrsa airson duilleagan far a bheilear thairis air crìoch nan nòdan.",
-       "node-count-exceeded-warning": "Chaidh an duilleag thairis air cunntas nan nòdan",
+       "node-count-exceeded-category-desc": "Tha barrachd nòdan san duilleag na tha ceadaichte.",
+       "node-count-exceeded-warning": "Bha barrachd nòdan san duilleag na tha ceadaichte.",
        "expansion-depth-exceeded-category": "Duilleagan far an deachas thairis air a' chrìoch leudachaidh",
-       "expansion-depth-exceeded-category-desc": "Seo roinn-seòrsa airson duilleagan far a bheilear thairis air doimhne an leudachaidh.",
-       "expansion-depth-exceeded-warning": "Chaidh an duilleag thairis air an doimhne leudachaidh",
+       "expansion-depth-exceeded-category-desc": "Tha an leudachadh san duilleag nas doimhne na tha ceadaichte.",
+       "expansion-depth-exceeded-warning": "Bha an leudachadh san duilleag na bu dhoimhne na tha ceadaichte",
        "parser-unstrip-loop-warning": "Mhothaich sinn do lùb unstrip",
        "parser-unstrip-recursion-limit": "Chaidheas thairis air crìoch unstrip recursion ($1)",
        "converter-manual-rule-error": "Mhothaich sinn do mhearachd san riaghailt iompachadh làimhe airson cànan",
        "rev-deleted-event": "(chaidh gnìomh an loga a thoirt air falbh)",
        "rev-deleted-user-contribs": "[chaidh an t-ainm-cleachdaiche no an seòladh IP a thoirt air falbh - chaidh an deasachadh fhalach o liosta na h-obrach]",
        "rev-deleted-text-permission": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+       "rev-suppressed-text-permission": "Chaidh mùthadh na duilleige seo <strong>a mhùchadh</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
        "rev-deleted-text-unhide": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
        "rev-suppressed-text-unhide": "Chaidh mùthadh na duilleige seo <strong>a mhùchadh</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
        "rev-deleted-text-view": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
        "revdelete-text-text": "Nochdaidh mùthaidhean a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
        "revdelete-text-file": "Nochdaidh tionndaidhean dhen fhaidhle a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
        "logdelete-text": "Nochdaidh tachartasan san loga a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
-       "revdelete-text-others": "Gheibh rianairean eile air {{SITENAME}} cothrom air an t-susbaint fhalaichte fhathast agus is urrainn dhaibh an sguabadh às a neo-dhèanamh san dearbh eadar-aghaidh mur an deach cuingeachaidhean a bharrachd a chur orra.",
+       "revdelete-text-others": "Gheibh rianairean eile cothrom air an t-susbaint fhalaichte fhathast agus is urrainn dhaibh an sguabadh às a neo-dhèanamh mur an deach cuingeachaidhean a bharrachd a chur orra.",
        "revdelete-confirm": "Dearbhaich gu bheil thu airson seo a dhèanamh, gu bheil thu a' tuigsinn na thachras ri linn agus gu bheil thu a' dèanamh seo a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].",
        "revdelete-suppress-text": "Cha bu chòir dhut mùchadh a chleachdadh <strong>ach</strong> ann an suidheachaidhean mar seo:\n* Fiosrachadh a dh'fhaodadh a bhith dìteachail\n* Fiosrachadh pearsanta a tha cearr\n*: <em>seòladh taighe, àireamhan fòn, àireamhan NI is msaa.</em>",
        "revdelete-legend": "Suidhich cuingeachaidhean na faicsinneachd",
        "searchall": "a h-uile",
        "showingresults": "A' sealltainn suas ri <strong>$1</strong> {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le àireamh <strong>$2</strong>.",
        "showingresultsinrange": "A' sealltainn suas ri <strong>$1</strong> {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} san rainse eadar àireamh <strong>$2</strong> is <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Toradh <strong>$1</strong> à <strong>$3</strong>|Toraidhean <strong>$1 - $2</strong> à <strong>$3</strong>}} airson <strong>$4</strong>",
+       "search-showingresults": "{{PLURAL:$4|Toradh <strong>$1</strong> à <strong>$3</strong>|Toraidhean <strong>$1 - $2</strong> à <strong>$3</strong>|Toraidhean <strong>$1 - $2</strong> à <strong>$3</strong>|Toraidhean <strong>$1 - $2</strong> à <strong>$3</strong>}}",
        "search-nonefound": "Cha do fhreagair toradh sam bith ri d' iarrtas.",
        "powersearch-legend": "Rannsachadh adhartach",
        "powersearch-ns": "Lorg ann an ainm-spàsan:",
        "preferences": "Roghainnean",
        "mypreferences": "Na roghainnean agam",
        "prefs-edits": "Co mheud deasachadh:",
-       "prefsnologintext2": "Ma tha thu airson na roghainnean agad atharrachadh, $1.",
+       "prefsnologintext2": "Log a-steach gus na roghainnean agad atharrachadh.",
        "prefs-skin": "Bian",
        "skin-preview": "Ro-shealladh",
        "datedefault": "Gun roghainnean",
        "prefs-tokenwatchlist": "Tòcan",
        "prefs-diffs": "Diofaran",
        "prefs-help-prefershttps": "Thèid an roghainn seo a chur an sàs an ath thuras a nì thu logadh a-steach.",
+       "prefswarning-warning": "Rinn thu atharrachadh air na roghainnean agad nach deach a shàbhaladh fhathast.\nCha tèid na roghainnean agad ùrachadh ma dh'fhàgas tu an duilleag seo gun bhriogadh air \"$1\".",
        "prefs-tabs-navigation-hint": "Gliocas: 'S urrainn dhut na h-iuchraichean saighde chlì 's dheas a chleachdadh gus leum a ghearradh o thaba gu taba air liosta nan taba.",
        "email-address-validity-valid": "Tha coltas gu bheil am post-d dligheach",
        "email-address-validity-invalid": "Cuir a-steach post-d dligheach",
        "right-deletedtext": "Cead teacsa 's atharraichean eadar mùthaidhean air an sguabadh às a shealltainn",
        "right-browsearchive": "Cead lorg sna duilleagan air an sguabadh às",
        "right-undelete": "Cead duilleagan air an sguabadh às aiseag",
-       "right-suppressrevision": "Cead sùil a thoirt air mùthaidhean a chaidh a sguabadh às 's am falach o na rianairean 's an aiseag",
+       "right-suppressrevision": "Seall, falaich 's neo-fhalaich mùthaidhean sònraichte de dhuilleagan o chleachdaiche sam bith",
+       "right-viewsuppressed": "Seall na mùthaidhean a tha falaichte o chleachdaiche sam bith",
        "right-suppressionlog": "Cead logaichean prìobhaideach a shealltainn",
        "right-block": "Cead càch a bhacadh o dheasachadh",
        "right-blockemail": "Cead cleachdaiche a bhacadh o chur phost-d",
        "recentchanges-legend-heading": "'''Treòir:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (faic [[Special:NewPages|liosta nan duilleagan ùra]] cuideachd)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
-       "rcnotefrom": "Gheibhear na mùthaidhean a-mach o <strong>$2</strong> (gu ruige <strong>$1</strong>) gu h-ìosal.",
+       "rcnotefrom": "Chì thu {{PLURAL:$5|am mùthadh|na mùthaidhean|na mùthaidhean|na mùthaidhean}} o <strong>$3 $4</strong> (gu ruige <strong>$1</strong> dhiubh) gu h-ìosal.",
        "rclistfrom": "Seall na mùthaidhean ùra a-mach o $3 $2",
        "rcshowhideminor": "$1 mùthaidhean beaga",
        "rcshowhideminor-show": "Seall",
        "license": "Ceadachadh:",
        "license-header": "Ceadachadh",
        "nolicense": "Cha deach gin a thaghadh",
+       "licenses-edit": "Deasaich roghainnean a' cheadachais",
        "license-nopreview": "(Chan eil ro-shealladh ri làimh)",
-       "upload_source_url": "(URL dligheach a ghabhas inntrigeadh gu poblach)",
-       "upload_source_file": "(faidhle air a' choimpiutair agad)",
+       "upload_source_url": "(am faidhle a thagh thu o URL dligheach a ghabhas inntrigeadh gu poblach)",
+       "upload_source_file": "(am faidhle a thagh thu air a' choimpiutair agad)",
+       "listfiles-delete": "sguab às",
        "listfiles-summary": "Seallaidh an duilleag shònraichte seo gach faidhle a chaidh a luchdadh suas.",
        "listfiles_search_for": "Lorg airson ainm a' mheadhain:",
        "imgfile": "faidhle",
        "randomincategory": "Duilleag air thuaiream san roinn-seòrsa",
        "randomincategory-invalidcategory": "Chan e \"$1\" 'na ainm roinn-seòrsa dligheach.",
        "randomincategory-nopages": "Chan eil duilleag san roinn-seòrsa [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Faigh duilleag air thuaiream a tha san roinn-seòrsa: $1 $2.",
-       "randomincategory-selectcategory-submit": "Siuthad",
+       "randomincategory-category": "Roinn-seòrsa:",
+       "randomincategory-legend": "Duilleag air thuaiream san roinn-seòrsa",
        "randomredirect": "Ath-stiùireadh air thuaiream",
        "randomredirect-nopages": "Chan eil ath-stiùireadh san ainm-spàs \"$1\".",
        "statistics": "Stadastaireachd",
        "wantedpages-badtitle": "Tha tiotal mì-dhligheach am measg nan toraidhean: $1",
        "wantedfiles": "Faidhlichean a thathar 'gan iarraidh",
        "wantedfiletext-cat": "Tha na faidhlichean a leanas 'gan cleachdadh ach chan eil iad ann. Dh'fhaoidte gum bi faidhlichean o ionadan-tasgaidh cèine 'gan sealltainn an-seo ged a tha iad ann. Bidh <del>loidhne tro</del> na toraidhean a bharrachd seo. A bharrachd air sin, chì thu na duilleagan sa bhios faidhlichean nach eil ann leabaichte air [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Tha na faidhlichean a leanas 'gan cleachdadh ach chan eil iad ann. A bharrachd air sin, chì thu na duilleagan le faidhlichean leabaichte nach eil ann air [[:$1]].",
        "wantedfiletext-nocat": "Tha na faidhlichean a leanas 'gan cleachdadh ach chan eil iad ann. Dh'fhaoidte gum bi faidhlichean o ionadan-tasgaidh cèine 'gan sealltainn an-seo ged a tha iad ann. Bidh <del>loidhne tro</del> na toraidhean a bharrachd seo.",
+       "wantedfiletext-nocat-noforeign": "Tha na faidhlichean a leanas 'gan cleachdadh ach chan eil iad ann.",
        "wantedtemplates": "Teamplaidean a thathar 'gan iarraidh",
        "mostlinked": "Na duilleagan ris a bheil an àireamh as motha de cheanglaichean",
        "mostlinkedcategories": "Na roinnean-seòrsa ris a bheil an àireamh as motha de cheanglaichean",
        "booksources": "Tùsan a tha 'nan leabhraichean",
        "booksources-search-legend": "Lorg tùsan a tha 'nan leabhraichean",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Siuthad",
        "booksources-text": "Chì thu liosta dhe cheanglaichean gu làraichean eile a reiceas leabhraichean ùra 's cleachdte gu h-ìosal 's ma dh'fhaoidte gum faigh thu barrachd fiosrachaidh orra mu leabhraichean a tha thu a' sireadh:",
        "booksources-invalid-isbn": "Tha coltas mì-dhligheach air an ISBN a chaidh a thoirt seachad; dearbhaich gun deach lethbhreac a dhèanamh dheth on tùs gun mhearachd.",
        "specialloguserlabel": "Cò rinn e:",
        "noindex-category-desc": "Cha dèid an duilleag seo a chur ris an inneacs luirg le botaichean on a tha am facal draoidheach <code><nowiki>__NOINDEX__</nowiki></code> air 's a tha i ann an ainm-spàs far a bheil a' bhratach seo ceadaichte.",
        "index-category-desc": "Tha <code><nowiki>__INDEX__</nowiki></code> air an duilleag seo ('s tha i ann an ainm-spàs far a bheil a' bhratach seo ceadaichte) 's mar sin thèid a chur ri inneacsan luirg le botaichean ged nach tachradh seo gu h-àbhaisteach.",
        "post-expand-template-inclusion-category-desc": "Bhiodh an duilleag nas motha na <code>$wgMaxArticleSize</code> às dèidh a h-uile teamplaid a leudachadh 's mar sin cha deach a h-uile teamplaid a leudachadh.",
-       "post-expand-template-argument-category-desc": "Bidh an duilleag nas motha na  <code>$wgMaxArticleSize</code> às dèidh argamaid teamplaid a leudachadh (rudeigin eadar camagan dualach trìoblaichte, can <code>{{{Foo}}}</code>).",
-       "expensive-parserfunction-category-desc": "Tha cus foincseanan cosgail a' pharsair (can <code>#ifexist</code>) am broinn duilleige. Faic [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Thèid an roinn-seòrsa seo a chur ris nuair a bhios ceangal gu faidhle briste am broinn na duilleige (ceangal gus faidhle a leabachadh mur eil am faidhle ann).",
-       "hidden-category-category-desc": "Seo ronn-seòrsa le <code><nowiki>__HIDDENCAT__</nowiki></code> oirre ach nach nochd i ann am bogsa nan ceanglaichean gu roinnean-seòrsa air na duilleagan o thùs.",
+       "post-expand-template-argument-category-desc": "Bidh an duilleag nas motha na <code>$wgMaxArticleSize</code> às dèidh argamaid teamplaid a leudachadh (rudeigin eadar camagan dualach trìoblaichte, can <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Tha cus foincseanan cosgail a' pharsair (can <code>#ifexist</code>) am broinn na duilleige. Faic [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Tha ceangal gu faidhle briste am broinn na duilleige (ceangal gus faidhle a leabachadh fad 's nach eil am faidhle ann).",
+       "hidden-category-category-desc": "Seo roinn-seòrsa le <code><nowiki>__HIDDENCAT__</nowiki></code> 'na susbaint ach nach nochd i ann am bogsa nan ceanglaichean gu roinnean-seòrsa air na duilleagan o thùs.",
        "trackingcategories-nodesc": "Chan eil tuairisgeul ri làimh.",
        "trackingcategories-disabled": "Tha an roinn-seòrsa à comas",
        "mailnologin": "Gun seòladh an t-seòladair",
        "mywatchlist": "An clàr-faire",
        "watchlistfor2": "aig $1 $2",
        "nowatchlist": "Chan eil rud sam bith air a' chlàr-fhaire agad.",
-       "watchlistanontext": "$1 gus nithean air a' chlàr-fhaire agad a shealltainn no a dheasachadh.",
+       "watchlistanontext": "Log a-steach gus nithean air a' chlàr-fhaire agad a shealltainn no a dheasachadh.",
        "watchnologin": "Chan eil thu air logadh a-steach",
        "addwatch": "Cuir air a' chlàr-fhaire",
        "addedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a chur ris a' [[Special:Watchlist|chlàr-fhaire]] agad.\nNochdaidh mùthaidhean a nithear air an duilleag seo 's air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.",
        "watchlist-details": "Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air a' chlàr-fhaire agad, gun luaidh air na duilleagan deasbaireachd.",
        "wlheader-enotif": "Tha brathan-naidheachd air a' phost-d an comas.",
        "wlheader-showupdated": "Tha clò <strong>trom</strong> air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
-       "wlnote": "Seo {{PLURAL:$1|an $1 mhùthadh|$1 mhùthadh|na $1 mùthaidhean|$1 mùthadh}} mu dheireadh san {{PLURAL:$2|$2 uair a thìde|$2 uair a thìde|$2 uairean a thìde|$2 uair a thìde}} mu dheireadh, mar a bha e $3, $4.",
-       "wlshowlast": "Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh $3",
+       "wlnote": "Chì thu gu h-ìosal {{PLURAL:$1|a' $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh san {{PLURAL:$2|$2 uair a thìde|$2 uair a thìde|$2 uairean a thìde|$2 uair a thìde}} mu dheireadh, mar a bha e $3, $4.",
+       "wlshowlast": "Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh",
        "watchlist-options": "Roghainnean mo chlàir-faire",
        "watching": "'Ga chur air a' chlàr-fhaire...",
        "unwatching": "A' toirt far a' chlàir-fhaire...",
        "delete-edit-reasonlist": "Deasaich adhbharan sguabadh às",
        "delete-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nChaidh sguabadh às nan duilleagan dhen leithid a chuingeachadh ach na dèid cron a dhèanamh air {{SITENAME}} le mearachd.",
        "delete-warning-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nMa sguabas tu às dhi, dh'fhaoidte gun dèan thu cron air na gnìomhan stòr-dàta aig {{SITENAME}}; mar sin, thoir an aire.",
+       "deleteprotected": "Chan urrainn dhut an duilleag seo a sguabadh às on a chaidh a dìon.",
        "deleting-backlinks-warning": "'''Rabhadh:''' Tha [[Special:WhatLinksHere/{{FULLPAGENAME}}|duilleag eile]] a' ceangal ris an duilleag a tha thu airson sguabadh às no 'ga gabhail a-steach 'na h-iomradh.",
        "rollback": "Roilig atharraichean air ais",
        "rollback_short": "Roladh air ais",
        "protect-othertime": "Àm eile:",
        "protect-othertime-op": "àm eile",
        "protect-existing-expiry": "Falbhaidh an ùine air mar-thà: $2 $3",
+       "protect-existing-expiry-infinity": "Chan fhalbh an ùine air gu buan mar-thà",
        "protect-otherreason": "Adhbhar eile/a bharrachd:",
        "protect-otherreason-op": "Adhbhar eile",
        "protect-dropdown": "*Na h-adhbharan dìona as cumanta\n** Cus bhandalachd\n** Cus spama\n** Còmhstrithean deasachaidh nach eil torrach\n** Duilleag air a bheil trafaig mhòr",
        "unblocked": "Chaidh [[User:$1|$1]] a neo-bhacadh.",
        "unblocked-range": "Chaidh $1 a neo-bhacadh.",
        "unblocked-id": "Chaidh am bacadh $1 a thoirt air falbh.",
+       "unblocked-ip": "Chaidh [[Special:Contributions/$1|$1]] a neo-bhacadh.",
        "blocklist": "Cleachdaichean a chaidh a bhacadh",
        "ipblocklist": "Cleachdaichean a chaidh a bhacadh",
        "ipblocklist-legend": "Lorg cleachdaiche a chaidh a bhacadh",
        "import": "Ion-phortaich duilleagan",
        "importinterwiki": "Ion-phortachadh tar-uicidh",
        "import-interwiki-text": "Tagh uicidh 's tiotal na duilleige airson ion-phortachadh.\nThèid cinn-là nam mùthaidhean 's ainmean nan deasaichean a ghlèidheadh.\nThèid gach gnìomh ion-phortachadh tar-uicidh a chur ris an [[Special:Log/import|loga ion-phortachaidh]].",
-       "import-interwiki-source": "An uicidh/duilleag thùsail:",
+       "import-interwiki-sourcewiki": "An uicidh thùsail:",
+       "import-interwiki-sourcepage": "An duilleag thùsail:",
        "import-interwiki-history": "Dèan lethbhreac de dh'eachdraidh nam mùthaidhean slàna airson na duilleige seo",
        "import-interwiki-templates": "Gabh a-steach na teamplaidean uile",
        "import-interwiki-submit": "Ion-phortaich",
        "import-error-create": "Cha deach an duilleag \"$1\" ion-phortachadh o nach fhaod thu a cruthachadh.",
        "import-error-interwiki": "Cha deach an duilleag \"$1\" ion-phortachadh on a chaidh ainm a ghlèidheadh airson ceangal a-mach (eadar-uicidh).",
        "import-error-special": "Cha deach an duilleag \"$1\" ion-phortadh on a bhuineas i ri ainm-spàs sònraichte nach ceadaich duilleagan.",
-       "import-error-invalid": "Cha deach an duilleag \"$1\" ion-phortachadh on a tha ainm mì-dhligheach.",
+       "import-error-invalid": "Cha deach an duilleag \"$1\" ion-phortachadh on a tha a h-ainm mì-dhligheach air an uicidh seo.",
        "import-error-unserialize": "Cha ghabh mùthadh $2 dhen duilleag \"$1\" a thogail on tionndadh serialized. Chaidh aithris gun cleachd am mùthadh modail susbaint $3 a tha serialized mar $4.",
        "import-error-bad-location": "Cha ghabh am mùthadh $2 a chleachdas modail susbainte $3 a stòradh air \"$1\" air an uicidh seo o nach cuir an duilleag ud taic ris a' mhodail seo.",
        "import-options-wrong": "{{PLURAL:$2|Roghainn cearr|Roghainnean cearra}}: <nowiki>$1</nowiki>",
        "importlogpage": "Loga an ion-phortachaidh",
        "importlogpagetext": "Ion-phortachadh rianachd de dhuilleagan aig a bheil eachdraidh mhùthaidhean o uicidhean eile.",
        "import-logentry-upload": "chaidh [[$1]] ion-phortachadh le luchdadh suas faidhle",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|mhùthadh|mùthadh|mùthaidhean|mùthadh}}",
+       "import-logentry-upload-detail": "Chaidh $1 {{PLURAL:$1|mhùthadh|mùthadh|mùthaidhean|mùthadh}} ion-phortachadh",
        "import-logentry-interwiki": "air fhaighinn 'na thar-uicidh $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} o $2",
+       "import-logentry-interwiki-detail": "Chaidh $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} ion-phortachadh o $2",
        "javascripttest": "Deuchainn air JavaScript",
        "javascripttest-title": "A' ruith deuchainnean aig $1",
        "javascripttest-pagetext-noframework": "Tha an duilleag seo glèidhte airson deuchainnean JavaScript a ruith.",
        "exif-urgency-low": "Ìosal ($1)",
        "exif-urgency-high": "Àrd ($1)",
        "exif-urgency-other": "Prìomhachas gnàthaiche ($1)",
-       "watchlistall2": "na h-uile",
        "namespacesall": "na h-uile",
        "monthsall": "na h-uile",
        "confirmemail": "Dearbhaich an seòladh puist-dhealain",
        "autosumm-replace": "Chaidh \"$1\" a chur an àite na susbaint",
        "autoredircomment": "Chaidh an duilleag ath-stiùireadh gu [[$1]]",
        "autosumm-new": "Chaidh duilleag le \"$1\" a chruthachadh",
+       "autosumm-newblank": "Chaidh duilleag bhàn a chruthachadh",
        "size-bytes": "$1 B",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "timezone-utc": "UTC",
        "unknown_extension_tag": "Taga leudachain \"$1\" neo-aithnichte",
        "duplicate-defaultsort": "<strong>Rabhadh:</strong> Tha an iuchair seòrsachaidh bhunaiteach \"$2\" a' dol thairis air seann iuchair eile, \"$1\".",
+       "duplicate-displaytitle": "<strong>Rabhadh:</strong> Tha an tiotal taisbeanaidh \"$2\" a' dol thairis air seann tiotal taisbeanaidh eile, \"$1\".",
        "version": "Tionndadh",
        "version-extensions": "Leudachain air an stàladh",
        "version-skins": "Craicnean",
        "logentry-rights-rights": "Dh'atharraich $1 {{GENDER:$2|a bhallrachd|a ballrachd}} ann am buidheann airson $3 o $4 gu $5",
        "logentry-rights-rights-legacy": "Dh'atharraich $1 {{GENDER:$2|a bhallrachd|a ballrachd}} ann am buidheann airson $3",
        "logentry-rights-autopromote": "Chaidh $1 àrdachadh o $4 gu $5 gu fèin-obrachail",
+       "logentry-upload-upload": "Luchdaich $1 $3 suas",
+       "logentry-upload-overwrite": "Luchdaich $1 tionndadh ùr de $3 suas",
+       "logentry-upload-revert": "Luchdaich $1 $3 suas",
        "rightsnone": "(chan eil gin)",
+       "revdelete-summary": "gearr-chunntas an deasachaidh",
        "feedback-bugornote": "Ma tha fiosrachadh mionaideach agad air duilgheadas teicnigeach, feuch an dèan thu [$1 aithris air buga].\nMur eil, 's urrainn dhut am foirm furasta a chleachdadh gu h-ìosal. Thèid do bheachd a chur ris an duilleag \"[$3 $2]\" is d' ainm-cleachdaiche a chur ris.",
        "feedback-subject": "Cuspair:",
        "feedback-message": "Teachdaireachd:",
        "duration-centuries": "$1 {{PLURAL:$1|linn|linn|linntean|linn}}",
        "duration-millennia": "$1 {{PLURAL:$1|mhìle bliadhna|mhìle bliadhna|mìle bliadhna|mìle bliadhna}}",
        "rotate-comment": "Chaidh an dealbh a chuairteachadh le $1 {{PLURAL:$1|cheum|cheum|ceuman|ceum}} gu tuathal",
+       "limitreport-title": "Dàta pròifil a' pharsair",
+       "limitreport-cputime": "Cleachdadh ùine a' CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|diog|dhiog|diogan|diog}}",
+       "limitreport-walltime": "Cleachdadh fìor-ùine",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|diog|dhiog|diogan|diog}}",
+       "limitreport-ppvisitednodes": "Àireamh nan nòdan ris an do thadhal an ro-phròiseasar",
        "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes": "Àireamh nan nòdan a ghin an ro-phròiseasar",
        "limitreport-ppgeneratednodes-value": "$1/$2",
+       "limitreport-postexpandincludesize": "Meud na gabhail a-steach às dèidh an leudachaidh",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bhaidht|bhaidht|baidhtichean|baidht}}",
+       "limitreport-templateargumentsize": "Meud nan argamaidean air an teamplaid",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bhaidht|bhaidht|baidhtichean|baidht}}",
+       "limitreport-expansiondepth": "Doimhne as motha an leudachaidh",
        "limitreport-expansiondepth-value": "$1/$2",
+       "limitreport-expensivefunctioncount": "Cunntadh air foincseanan daora a' pharsair",
        "limitreport-expensivefunctioncount-value": "$1/$2",
        "expandtemplates": "Leudaich na templaidean",
        "expand_templates_intro": "Gabhaidh an duilleag shònraichte seo ri teacsa agus leudaichidh i a h-uile teamplaid na broinn gu ath-chùrsach.\nLeudaichidh i cuideachd foincseanan parsair ris a chuirear taic, can\n<code><nowiki>{{</nowiki>#language:…}}</code> agus caochladairean mar\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nAir deireadh na sgeòil, leudaichidh i cha mhòr gach rud eadar camagan dualach dùbailte.",
        "action-pagelang": "atharraich cànan nan duilleagan",
        "log-name-pagelang": "Loga air atharrachadh nan cànan",
        "log-description-pagelang": "Seo loga dhe na h-atharraichean air cànanan nan duilleagan.",
-       "logentry-pagelang-pagelang": "Dh'atharraich $1 cànan nan duilleagan airson $3 o $4 gu $5."
+       "logentry-pagelang-pagelang": "Dh'atharraich $1 cànan nan duilleagan airson $3 o $4 gu $5.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (an comas)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''à comas''')",
+       "mediastatistics": "Stadastaireachd nam meadhanan",
+       "mediastatistics-summary": "Stadastaireachd air na seòrsaichean faidhle a chaidh a luchdadh suas. Cha ghabh seo a-steach ach an tionndadh as ùire de gach faidhle. Tha seann-tionndaidhean 's faidhlichean air an sguabadh às 'gan leigeil seachad.",
+       "mediastatistics-nfiles": "$1 ($2%)",
+       "mediastatistics-nbytes": "%1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Seòrsa MIME",
+       "mediastatistics-table-extensions": "Leudachain comasach",
+       "mediastatistics-table-count": "Àireamh de dh'fhaidhlichean",
+       "mediastatistics-table-totalbytes": "Meud iomlan",
+       "mediastatistics-header-unknown": "Chan eil fhios",
+       "mediastatistics-header-bitmap": "Dealbhan bitmap",
+       "mediastatistics-header-drawing": "Tàirngean (dealbhan vector)",
+       "mediastatistics-header-audio": "Fuaim",
+       "mediastatistics-header-video": "Videothan",
+       "mediastatistics-header-multimedia": "Meadhanan beartach",
+       "mediastatistics-header-office": "Oifis",
+       "mediastatistics-header-text": "Teacsa",
+       "mediastatistics-header-executable": "Faidhlichean so-ghnìomhaichte",
+       "mediastatistics-header-archive": "Fòrmatan dùmhlaichte"
 }
index f489bd9..fb7f9dc 100644 (file)
@@ -32,6 +32,7 @@
        "tog-watchdefault": "Engadir as páxinas e os ficheiros que edite á miña lista de vixilancia",
        "tog-watchmoves": "Engadir as páxinas e os ficheiros que mova á miña lista de vixilancia",
        "tog-watchdeletion": "Engadir as páxinas e os ficheiros que borre á miña lista de vixilancia",
+       "tog-watchrollback": "Engadir as páxinas nas que realice unha reversión á miña lista de vixilancia",
        "tog-minordefault": "Marcar por omisión todas as edicións como pequenas",
        "tog-previewontop": "Mostrar a vista previa antes da caixa de edición",
        "tog-previewonfirst": "Mostrar a vista previa na primeira edición",
        "hidetoc": "agochar",
        "collapsible-collapse": "Contraer",
        "collapsible-expand": "Expandir",
+       "confirmable-confirm": "Está {{GENDER:$1|seguro|segura}}?",
+       "confirmable-yes": "Si",
+       "confirmable-no": "Non",
        "thisisdeleted": "Quere ver ou restaurar $1?",
        "viewdeleted": "Quere ver $1?",
        "restorelink": "{{PLURAL:$1|unha edición borrada|$1 edicións borradas}}",
        "invalidtitle-knownnamespace": "Título inválido co espazo de nomes \"$2\" e o texto \"$3\"",
        "invalidtitle-unknownnamespace": "Título inválido cun número de espazo de nomes, $1, descoñecido e o texto \"$2\"",
        "exception-nologin": "Non accedeu ao sistema",
-       "exception-nologin-text": "[[Special:Userlogin|Acceda ao sistema]] para poder realizar esa acción ou acceder a esa páxina.",
+       "exception-nologin-text": "Acceda ao sistema para poder realizar esa acción ou acceder a esa páxina.",
        "exception-nologin-text-manual": "Debe $1 para poder realizar esa acción ou acceder a esa páxina.",
        "virus-badscanner": "Configuración errónea: escáner de virus descoñecido: ''$1''",
        "virus-scanfailed": "fallou o escaneado (código $1)",
        "createaccount-text": "Alguén creou unha conta chamada \"$2\" para o seu enderezo de correo electrónico en {{SITENAME}} ($4), e con contrasinal \"$3\".\nDebe acceder ao sistema e mudar o contrasinal agora.\n\nPode facer caso omiso desta mensaxe se se creou esta conta por erro.",
        "login-throttled": "Fixo demasiados intentos de acceder ao sistema.\nPor favor, agarde $1 antes de probar outra vez.",
        "login-abort-generic": "Acceso ao sistema incorrecto; abortado",
+       "login-migrated-generic": "A súa conta foi migrada, e o seu nome de usuario xa non existe nesta wiki.",
        "loginlanguagelabel": "Lingua: $1",
        "suspicious-userlogout": "Rexeitouse a súa petición de saír do sistema porque semella que a enviou un navegador roto ou a caché dun proxy.",
        "createacct-another-realname-tip": "O nome real é opcional.\nSe escolle dalo utilizarase para atribuír ao usuario o seu traballo.",
        "passwordreset-emailsent-capture": "Enviouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación.",
        "passwordreset-emailerror-capture": "Xerouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación, pero o envío {{GENDER:$2|ao usuario|á usuaria}} fallou: $1",
        "changeemail": "Cambiar o enderezo de correo electrónico",
-       "changeemail-header": "Cambiar o enderezo de correo electrónico da conta",
        "changeemail-text": "Encha este formulario para cambiar o seu enderezo de correo electrónico. Terá que escribir o seu contrasinal para confirmar este cambio.",
        "changeemail-no-info": "Debe rexistrarse para acceder directamente a esta páxina.",
        "changeemail-oldemail": "Enderezo de correo electrónico actual:",
        "changeemail-none": "(ningún)",
        "changeemail-password": "O seu contrasinal en {{SITENAME}}:",
        "changeemail-submit": "Cambiar o correo electrónico",
-       "changeemail-cancel": "Cancelar",
        "changeemail-throttled": "Fixo demasiados intentos de acceder ao sistema.\nPor favor, agarde $1 antes de probar outra vez.",
        "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.",
        "showpreview": "Mostrar a vista previa",
        "showdiff": "Mostrar os cambios",
        "blankarticle": "<strong>Advertencia:</strong> A páxina que está a piques de crear está baleira.\nSe preme no botón \"{{int:savearticle}}\" outra vez, a páxina crearase sen contido.",
-       "anoneditwarning": "'''Aviso:''' Non accedeu ao sistema.\nO seu enderezo IP quedará rexistrado no historial de revisións desta páxina.",
+       "anoneditwarning": "<strong>Aviso:</strong> Non accedeu ao sistema. O seu enderezo IP será rexistado no histórico de edicións desta páxina. Se <strong>[$1 accede ao sistema]</strong> ou <strong>[$2 crea unha conta]</strong>, as súas edicións serán rexistadas co seu nome de usuario, ademais doutros beneficios.",
        "anonpreviewwarning": "''Non accedeu ao sistema. Se garda a páxina, o seu enderezo IP quedará rexistrado no historial de edicións.''",
        "missingsummary": "'''Aviso:''' Esqueceu incluír o texto do campo resumo.\nSe preme en \"{{int:savearticle}}\" a súa edición gardarase sen ningunha descrición da edición.",
        "missingcommenttext": "Por favor, escriba un comentario a continuación.",
        "parser-template-recursion-depth-warning": "Excedeuse o límite de profundidade de recursión do modelo ($1)",
        "language-converter-depth-warning": "Excedeuse o límite de profundidade do convertedor de lingua ($1)",
        "node-count-exceeded-category": "Páxinas nas que se supera o número de nodos",
-       "node-count-exceeded-category-desc": "Unha categoría para as páxinas que superan o número de nodos.",
+       "node-count-exceeded-category-desc": "A páxina supera o número máximo de nodos.",
        "node-count-exceeded-warning": "A páxina supera o número de nodos",
        "expansion-depth-exceeded-category": "Páxinas nas que se supera a profundidade de expansión",
-       "expansion-depth-exceeded-category-desc": "Esta é unha categoría para as páxinas que superan a profundidade de expansión.",
+       "expansion-depth-exceeded-category-desc": "A páxina supera a profundidade de expansión máxima.",
        "expansion-depth-exceeded-warning": "A páxina supera a profundidade de expansión",
        "parser-unstrip-loop-warning": "Detectouse un bucle inamovible",
        "parser-unstrip-recursion-limit": "Excedeuse o límite de recursión inamovible ($1)",
        "searchall": "todo",
        "showingresults": "{{PLURAL:$1|Móstrase '''1''' resultado|Móstranse '''$1''' resultados}}, comezando polo número '''$2'''.",
        "showingresultsinrange": "{{PLURAL:$1|Móstrase <strong>1</strong> resultado|Móstranse <strong>$1</strong> resultados}}, comezando polo número <strong>$2</strong> e rematando polo número <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados do '''$1''' ao '''$2''', dun total de '''$3''',}} para \"'''$4'''\"",
        "search-nonefound": "Non se atopou ningún resultado que coincidise coa procura.",
        "powersearch-legend": "Busca avanzada",
        "powersearch-ns": "Procurar nos espazos de nomes:",
        "preferences": "Preferencias",
        "mypreferences": "Preferencias",
        "prefs-edits": "Número de edicións:",
-       "prefsnologintext2": "Debe $1 para definir as preferencias de usuario.",
+       "prefsnologintext2": "Acceda ao sistema para modificar as súas preferencias.",
        "prefs-skin": "Aparencia",
        "skin-preview": "Vista previa",
        "datedefault": "Ningunha preferencia",
        "nolicense": "Ningunha seleccionada",
        "licenses-edit": "Editar as opcións de licenza",
        "license-nopreview": "(A vista previa non está dispoñible)",
-       "upload_source_url": "  (un URL válido e accesible publicamente)",
-       "upload_source_file": "  (un ficheiro no seu ordenador)",
+       "upload_source_url": "(o ficheiro elixido, cun URL válido e accesible publicamente)",
+       "upload_source_file": "(o ficheiro elixido do seu ordenador)",
        "listfiles-delete": "borrar",
        "listfiles-summary": "Esta páxina especial mostra todos os ficheiros cargados.",
        "listfiles_search_for": "Buscar polo nome do ficheiro multimedia:",
        "randomincategory": "Páxina aleatoria na categoría",
        "randomincategory-invalidcategory": "\"$1\" non é un nome de categoría válido.",
        "randomincategory-nopages": "Non hai páxinas na [[:Category:$1]].",
-       "randomincategory-selectcategory": "Ir a unha páxina ao chou da categoría: $1 $2.",
-       "randomincategory-selectcategory-submit": "Ir",
+       "randomincategory-category": "Categoría:",
+       "randomincategory-legend": "Páxina aleatoria na categoría",
        "randomredirect": "Redirección aleatoria",
        "randomredirect-nopages": "Non hai redireccións no espazo de nomes \"$1\".",
        "statistics": "Estatísticas",
        "querypage-disabled": "Esta páxina especial está desactivada por razóns de rendemento.",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Procurar fontes bibliográficas",
-       "booksources-go": "Ir",
        "booksources-text": "A continuación aparece unha lista de ligazóns cara a outros sitios web que venden libros novos e usados, neles tamén pode obter máis información sobre as obras que está a buscar:",
        "booksources-invalid-isbn": "O ISBN inserido parece non ser válido; comprobe que non haxa erros ao copialo da fonte orixinal.",
        "specialloguserlabel": "Executante:",
        "trackingcategories-desc": "Criterio de inclusión da categoría",
        "noindex-category-desc": "A páxina non está indexada polos bots porque contén a palabra máxica <code><nowiki>__NOINDEX__</nowiki></code> e está nun espazo de nomes no que esa marca está permitida.",
        "index-category-desc": "A páxina contén a palabra máxica <code><nowiki>__INDEX__</nowiki></code> (e está nun espazo de nomes no que esa marca está permitida) e, polo tanto, será indexada polos bots cando non debera selo normalmente.",
-       "post-expand-template-inclusion-category-desc": "Despois de expandir todos os modelos, o tamaño da páxina é maior que <code>$wgMaxArticleSize</code>; algúns modelos non se expandiron.",
-       "post-expand-template-argument-category-desc": "Despois de expandir o argumento dun modelo (algo entre chaves triples, como <code>{{{Proba}}}</code>), a páxina é maior que <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Hai demasiadas funcións analíticas custosas (como <code>#ifexist</code>) incluídas nunha páxina. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Categoría engadida se a páxina contén unha ligazón de ficheiro rota (unha ligazón para incorporar un ficheiro cando o ficheiro non existe).",
-       "hidden-category-category-desc": "Esta é unha categoría coa palabra máxica <code><nowiki>__HIDDENCAT__</nowiki></code>, que impide que se mostre por defecto na caixa de categorías das páxinas.",
+       "post-expand-template-inclusion-category-desc": "O tamaño da páxina é maior que <code>$wgMaxArticleSize</code> despois de expandir todos os modelos; algúns modelos non se expandiron.",
+       "post-expand-template-argument-category-desc": "A páxina é maior que <code>$wgMaxArticleSize</code> despois de expandir o argumento dun modelo (algo entre chaves triples, como <code>{{{Proba}}}</code>).",
+       "expensive-parserfunction-category-desc": "A páxina utiliza demasiadas funcións analíticas custosas (como <code>#ifexist</code>). Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "A páxina contén unha ligazón de ficheiro rota (unha ligazón para incorporar un ficheiro que non existe).",
+       "hidden-category-category-desc": "A categoría contén a palabra máxica <code><nowiki>__HIDDENCAT__</nowiki></code>, que impide que se mostre por defecto na caixa de categorías das páxinas.",
        "trackingcategories-nodesc": "Non hai ningunha descrición dispoñible.",
        "trackingcategories-disabled": "A categoría está desactivada",
        "mailnologin": "Non existe enderezo para o envío",
        "mywatchlist": "Lista de vixilancia",
        "watchlistfor2": "De $1 $2",
        "nowatchlist": "Non ten elementos na súa lista de vixilancia.",
-       "watchlistanontext": "Debe $1 para ver ou editar os elementos da súa lista de vixilancia.",
+       "watchlistanontext": "Acceda ao sistema para ver ou editar os elementos da súa lista de vixilancia.",
        "watchnologin": "Non accedeu ao sistema",
        "addwatch": "Engadir á lista vixilancia",
        "addedwatchtext": "A páxina \"[[:$1]]\" foi engadida á súa [[Special:Watchlist|lista de vixilancia]].\nOs cambios futuros nesta páxina e na súa páxina de conversa asociada serán listados alí.",
        "watchlist-details": "Hai {{PLURAL:$1|unha páxina|$1 páxinas}} na súa lista de vixilancia, sen contar as de conversa.",
        "wlheader-enotif": "A notificación por correo electrónico está activada.",
        "wlheader-showupdated": "As páxinas que cambiaron desde a súa última visita móstranse en '''negra'''.",
-       "wlnote": "A continuación {{PLURAL:$1|está a última modificación|están as últimas '''$1''' modificacións}} {{PLURAL:$2|na última hora|nas últimas '''$2''' horas}} ata o $3 ás $4.",
-       "wlshowlast": "Mostrar as últimas $1 horas, os últimos $2 días ou $3",
+       "wlnote": "A continuación {{PLURAL:$1|está a última modificación|están as últimas <strong>$1</strong> modificacións}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} ata o $3 ás $4.",
+       "wlshowlast": "Mostrar as últimas $1 horas e os últimos $2 días",
        "watchlist-options": "Opcións de vixilancia",
        "watching": "Vixiando...",
        "unwatching": "Deixando de vixiar...",
        "exbeforeblank": "o contido antes do baleirado era: \"$1\"",
        "delete-confirm": "Borrar \"$1\"",
        "delete-legend": "Borrar",
-       "historywarning": "'''Atención:''' A páxina que está a piques de borrar ten un historial con aproximadamente $1 {{PLURAL:$1|revisión|revisións}}:",
+       "historywarning": "<strong>Atención:</strong> A páxina que está a piques de borrar ten un historial con $1 {{PLURAL:$1|revisión|revisións}}:",
        "confirmdeletetext": "Está a piques de borrar de xeito permanente unha páxina ou imaxe con todo o seu historial na base de datos.\nPor favor, confirme que é realmente a súa intención, que comprende as consecuencias e que está obrando de acordo coas regras [[{{MediaWiki:Policy-url}}|da política e normas]].",
        "actioncomplete": "Completouse a acción",
        "actionfailed": "Fallou a acción",
        "delete-edit-reasonlist": "Editar os motivos de borrado",
        "delete-toobig": "Esta páxina conta cun historial longo, de máis {{PLURAL:$1|dunha revisión|de $1 revisións}}.\nLimitouse a eliminación destas páxinas para previr problemas de funcionamento accidentais en {{SITENAME}}.",
        "delete-warning-toobig": "Esta páxina conta cun historial de edicións longo, de máis {{PLURAL:$1|dunha revisión|de $1 revisións}}.\nAo eliminala pódense provocar problemas de funcionamento nas operacións da base de datos de {{SITENAME}};\nproceda con coidado.",
+       "deleteprotected": "Non pode borrar esta páxina porque está protexida.",
        "deleting-backlinks-warning": "'''Atención:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Outras páxinas]] conteñen unha ligazón ou unha transclusión da páxina que está a piques de borrar.",
        "rollback": "Reverter as edicións",
        "rollback_short": "Reverter",
        "autoblockid": "Bloqueo automático nº$1",
        "block": "Bloquear un usuario",
        "unblock": "Desbloquear un usuario",
-       "blockip": "Bloquear o usuario",
+       "blockip": "Bloquear {{GENDER:$1|o usuario|a usuaria}}",
        "blockip-legend": "Bloquear un usuario",
        "blockiptext": "Use o seguinte formulario para bloquear o acceso de escritura desde un enderezo IP ou para bloquear un usuario específico.\nIsto debería facerse só para previr vandalismo, e de acordo coa [[{{MediaWiki:Policy-url}}|política e normas]] vixentes.\nExplique a razón específica do bloqueo (por exemplo, citando as páxinas concretas que sufriron vandalismo).",
        "ipaddressorusername": "Enderezo IP ou nome de usuario:",
        "ipb-unblock-addr": "Desbloquear a $1",
        "ipb-unblock": "Desbloquear un usuario ou enderezo IP",
        "ipb-blocklist": "Ver os bloqueos vixentes",
-       "ipb-blocklist-contribs": "Contribucións de $1",
+       "ipb-blocklist-contribs": "Contribucións de {{GENDER:$1|$1}}",
        "unblockip": "Desbloquear un usuario",
        "unblockiptext": "Use o seguinte formulario para dar de novo acceso de escritura a un enderezo IP ou usuario que estea bloqueado.",
        "ipusubmit": "Retirar o bloqueo",
        "import": "Importar páxinas",
        "importinterwiki": "Importación transwiki",
        "import-interwiki-text": "Seleccione o wiki e o título da páxina que queira importar.\nAs datas das revisións e os nomes dos editores manteranse.\nTodas as accións relacionadas coa importación entre wikis poden verse no [[Special:Log/import|rexistro de importacións]].",
-       "import-interwiki-source": "Wiki/Páxina de orixe:",
+       "import-interwiki-sourcewiki": "Wiki de orixe:",
+       "import-interwiki-sourcepage": "Páxina de orixe:",
        "import-interwiki-history": "Copiar todas as versións que hai no historial desta páxina",
        "import-interwiki-templates": "Incluír todos os modelos",
        "import-interwiki-submit": "Importar",
        "exif-urgency-low": "Baixa ($1)",
        "exif-urgency-high": "Alta ($1)",
        "exif-urgency-other": "Prioridade definida polo usuario ($1)",
-       "watchlistall2": "todo",
        "namespacesall": "todos",
        "monthsall": "todos",
        "confirmemail": "Confirmar o enderezo de correo electrónico",
        "logentry-rights-rights": "$1 {{GENDER:$2|cambiou}} o grupo ao que pertence $3 de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|cambiou}} o grupo ao que pertence $3",
        "logentry-rights-autopromote": "$1 foi {{GENDER:$2|promovido|promovida}} automaticamente de $4 a $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|cargou}} \"$3\"",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|cargou}} unha nova versión de \"$3\"",
+       "logentry-upload-revert": "$1 {{GENDER:$2|cargou}} \"$3\"",
        "rightsnone": "(ningún)",
+       "revdelete-summary": "o resumo de edición",
        "feedback-bugornote": "Se está listo para describir un problema técnico en detalle, [$1 informe do erro].\nEn caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario aparecerá na páxina \"[$3 $2]\" xunto ao seu nome de usuario e o navegador que está usando.",
        "feedback-subject": "Asunto:",
        "feedback-message": "Mensaxe:",
        "action-pagelang": "cambiar a lingua da páxina",
        "log-name-pagelang": "Rexistro de cambios de lingua",
        "log-description-pagelang": "Este é un rexistro dos cambios na lingua das páxinas.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambiou}} a lingua da páxina \"$3\" do $4 ao $5."
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambiou}} a lingua da páxina \"$3\" do $4 ao $5.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code>/$2 (activada)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code>/$2 ('''desactivada''')"
 }
index 01dc517..317202e 100644 (file)
        "passwordreset-username": "Ὄνομα χρωμένου:",
        "changeemail-none": "(οὐδέν)",
        "changeemail-submit": "Ἀλλάττειν ἠλ.-ταχυδρομεῖον",
-       "changeemail-cancel": "Ἀκυροῦν",
        "bold_sample": "Γράμματα παχέα",
        "bold_tip": "Γράμματα παχέα",
        "italic_sample": "Γράμματα πλάγια",
        "searchrelated": "σχετικά",
        "searchall": "ἅπασαι",
        "showingresults": "Δεικνύναι κατωτέρω μέχρι {{PLURAL:$1|'''1''' ἀποτέλεσμα|'''$1''' ἀποτελέσματα}}· ἐκκίνησις ἐκ τοῦ #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Ἀποτέλεσμα'''$1''' ἀπὸ '''$3'''|Ἀποτελέσματα '''$1 - $2''' ἀπὸ '''$3'''}} περὶ '''$4'''",
        "search-nonefound": "Οὐδὲν ἀποτέλεσμα ἀντίστοιχον τῆς πεύσεως.",
        "powersearch-legend": "Ἀνωτέρα ἀναζήτησις",
        "powersearch-ns": "Ζήτησις ἐν τοῖς ὀνοματείοις:",
        "suppress": "Ἐπόπτης",
        "booksources": "Αἱ ἐν βίβλοις πηγαί",
        "booksources-search-legend": "Ζητεῖν πηγὰς βίβλων",
-       "booksources-go": "Ἰέναι",
        "booksources-invalid-isbn": "Τὸ δοθὲν ISBN προφανῶς ἄκυρον ἐστίν· διεξάγαγε ἔλεγχον περὶ πιθανῶν σφαλμάτων προερχομένων ἐκ τῆς πρωτοτύπου πηγῆς.",
        "specialloguserlabel": "Χρώμενος:",
        "speciallogtitlelabel": "Ἐπιγραφή:",
        "watchlist-details": "{{PLURAL:$1|$1 δέλτος|$1 δέλτοι}} ἐφορωμέναι, ἄνευ τῶν δέλτων διαλέξεως περιλαμβανομένων.",
        "wlheader-enotif": "Σύστημα εἰδήσεως μέσῳ ἠλ-ἐπιστολῶν ἐνεργόν.",
        "wlnote": "Κατωτέρω {{PLURAL:$1|ἐστὶν ἡ ὑστάτη μεταβολὴ|εἰσὶν αἱ ὑστάται  '''$1'''  μεταβολαὶ}} ἐν {{PLURAL:$2|τῇ ὑστάτῃ μίᾳ ὥρᾳ|ταῖς ὑστάταις '''$2''' ὥραις}}.",
-       "wlshowlast": "Ἐμφάνισις τῶν τελευταίων $1 ὡρῶν $2 ἡμερῶν $3",
+       "wlshowlast": "Ἐμφάνισις τῶν τελευταίων $1 ὡρῶν $2 ἡμερῶν",
        "watchlist-options": "Ἐπιλογαὶ ἐφοροδιαλογῆς",
        "watching": "Ἐφορῶν...",
        "unwatching": "Ἀνεφορῶν...",
        "thumbnail_image-missing": "Ἀρχεῖον καταφανῶς ἐκλιπόν: $1",
        "import": "Εἰσάγειν δέλτους",
        "importinterwiki": "Ὑπερδιαβικι-εἰσαγωγή",
-       "import-interwiki-source": "Βίκι/δέλτος πηγή:",
        "import-interwiki-history": "Ἀντιγράφειν ἁπάσας τὰς ἐκδόσεις τοῦ ἱστορικοῦ τῆσδε τῆς δέλτου",
        "import-interwiki-templates": "Συμπερίληψις ἁπάντων τῶν προτύπων",
        "import-interwiki-submit": "Εἰσάγειν",
        "exif-dc-publisher": "Ἐκδότης",
        "exif-iimcategory-pol": "Πολιτική",
        "exif-iimcategory-spo": "Άθλοπαιδιαί",
-       "watchlistall2": "ἅπασαι",
        "namespacesall": "ἅπασαι",
        "monthsall": "ἅπαντες",
        "confirmemail": "Ἐπιβεβαίωσον διεύθυνσιν ἠλ-ταχυδρομείου",
        "revdelete-restricted": "ἐφηρμοσμένοι περιορισμοὶ διὰ τοὺς ἐπιτρόπους",
        "revdelete-unrestricted": "αἱρεθέντες περιορισμοὶ διὰ τοὺς ἐπιτρόπους",
        "rightsnone": "(Οὐδέν)",
+       "revdelete-summary": "σύνοψις μεταγραφῶν",
        "feedback-cancel": "Ἀκυροῦν",
        "searchsuggest-search": "Ζητεῖν",
        "searchsuggest-containing": "περιέχον...",
index 97e5b09..5c2215d 100644 (file)
        "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-header": "D E-Mail-Adräss vo däm Chonto ä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-no-info": "Du muesch aagmolde sy zum uff die Syte diräkt zuegryfe z chönne.",
        "changeemail-oldemail": "Aktuelli E-Mail-Adräss",
        "changeemail-none": "(nyt)",
        "changeemail-password": "Dy {{SITENAME}}-Passwort:",
        "changeemail-submit": "E-Mail Adräss ändre",
-       "changeemail-cancel": "Abbräche",
        "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.",
        "searchrelated": "verwandt",
        "searchall": "alli",
        "showingresults": "Do {{PLURAL:$1|isch '''1''' Ergebnis|sin '''$1''' Ergebniss}}, s fangt aa mit dr Nummerer '''$2.'''",
-       "showingresultsheader": "{{PLURAL:$5|Ergebnis '''$1''' vu '''$3'''|Ergebnis '''$1 - $2''' vu '''$3'''}} fir '''$4'''",
        "search-nonefound": "Fir Dyyni Suechaafrog sin keini Ergebniss gfunde wore.",
        "powersearch-legend": "Erwytereti Suech",
        "powersearch-ns": "Suech in Namensryym:",
        "querypage-disabled": "Die Spezialsyte isch deaktiviert wore us Leischtigserhaltigs-Grind.",
        "booksources": "ISBN-Suech",
        "booksources-search-legend": "Suech no Bezugsquälle fir Biecher",
-       "booksources-go": "Sueche",
        "booksources-text": "Des isch e Lischt mit Link zue Netzsyte, wu neiji un bruchti Biecher verchaufe. S cha syy, ass es dert au meh Informatione zue dr Biecher git. {{SITENAME}} isch mit keinem vu däne Aabieter gschäftli verbunde.",
        "booksources-invalid-isbn": "D ISBN isch schyyns falsch. Lueg no Fähler in dr Kopii.",
        "specialloguserlabel": "Benutzer, wu des gmacht het:",
        "wlheader-enotif": "Dr E-Mail-Benochrichtigungsdienscht isch aktiviert.",
        "wlheader-showupdated": "Syte mit Anderige, wu no nit aagluegt sin, sin '''fett''' dargstellt.",
        "wlnote": "Do {{PLURAL:$1|chunnt di letscht Änderig|chemme di letschte '''$1''' Änderige}} vu dr letschte {{PLURAL:$2|Stund|'''$2''' Stunde}}. Stand: $3, $4 Uhr.",
-       "wlshowlast": "Zeig di letschte $1 Stunde $2 Tage $3",
+       "wlshowlast": "Zeig di letschte $1 Stunde $2 Tage",
        "watchlist-options": "Aazeigoptione",
        "watching": "Am beobachte …",
        "unwatching": "Nümm am beobachten …",
        "import": "Sytene importiere",
        "importinterwiki": "Transwiki-Import",
        "import-interwiki-text": "Wääl e Wiki un e Syte zum Importiere us.\nS Datum vo dr Bearbeitig un dr Benutzername blybe erhalte.\nAlli Transwiki-Import-Aktione werde im [[Special:Log/import|Import-Logbuech]] protokolliert.",
-       "import-interwiki-source": "Quell-Wiki/-Syte:",
        "import-interwiki-history": "Alli früeneri Versione vo dere Syte importiere",
        "import-interwiki-templates": "Mit allene Vorlage",
        "import-interwiki-submit": "Import",
        "exif-urgency-low": "Nider ($1)",
        "exif-urgency-high": "Hoch ($1)",
        "exif-urgency-other": "Benutzerdefinierti Prioritet ($1)",
-       "watchlistall2": "alli",
        "namespacesall": "alli",
        "monthsall": "alli",
        "confirmemail": "Bstätigung vo Ihre E-Poscht-Adräss",
        "logentry-rights-rights-legacy": "$1 het d Gruppezuegherigkeit fir $3 gänderet",
        "logentry-rights-autopromote": "$1 isch automatisch vu $4 zue $5 zuegordnet wore",
        "rightsnone": "(keini)",
+       "revdelete-summary": "Zämmefassig",
        "feedback-bugornote": "Wän Du detailliert e tächnisch Probläm witt bschryybe, no mäld bitte [$1 ne Fähler].\nSunscht chasch au s eifach Formular unte nutze. Dyy Kommentar wird, zämme mit Dyym Benutzername un dr Version vu Dyym Webbrowser un em Betribssyschtem, uf dr Syte „[$3 $2]“ zuegfiegt.",
        "feedback-subject": "Beträff:",
        "feedback-message": "Noochricht:",
index 26fa4cb..0a6dfad 100644 (file)
        "passwordreset-emailsent-capture": "પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે, જે નીચે પ્રમાણે છે.",
        "passwordreset-emailerror-capture": "પાસવર્ડ ફરી ગોઠવવા માટેનો ઇમેલ બનાવવામાં આવ્યો છે, જે નીચે પ્રમાણે છે, પરંતુ તે {{GENDER:$2|સભ્ય}}ને મોકલવામાં નિષ્ફળ થયો છે: $1",
        "changeemail": "ઇમેલ સરનામું બદલો",
-       "changeemail-header": "તમારા ખાતાનું ઇમેલ સરનામું બદલો",
        "changeemail-text": "તમારું ઈ-મેઈલ સરનામું બદલવા માટે આ ફોર્મ ભરો. આ ફેરફાર કાયમ કરવા માટે તમારે પાસવર્ડ ભરવાની જરૂર પડશે.",
        "changeemail-no-info": "બારોબાર આ પાનું જોવા માટે પ્રવેશ કરવો આવશ્યક છે.",
        "changeemail-oldemail": "હાલનું ઈમેલ સરનામું:",
        "changeemail-none": "(કંઈ નહી)",
        "changeemail-password": "તમારો {{SITENAME}} પાસવર્ડ:",
        "changeemail-submit": "ઈમેલ બદલો",
-       "changeemail-cancel": "રદ કરો",
        "resettokens": "નિશાનીઓ ફરી ગોઠવો",
        "resettokens-no-tokens": "અહીં ફરી ગોઠવવા માટેનાં કોઇ ટોકન નથી",
        "resettokens-legend": "નિશાનીઓ ફરી ગોઠવો",
        "searchrelated": "શોધ સંબંધિત",
        "searchall": "બધા",
        "showingresults": " {{PLURAL:$1|'''1''' પરિણામ|'''$1''' પરિણામો}} સુધી #'''$2''' થી શરૂ  કરી",
-       "showingresultsheader": "'''$4''' માટે {{PLURAL:$5|પરિણામ  '''$1''' of '''$3'''|પરિણામો '''$1 - $2''' of '''$3'''}}",
        "search-nonefound": "તમે આપેલી માહિતી ને મળતાં આવતાં કોઈ પરિણામો નથી",
        "powersearch-legend": "વધુ પર્યાયો સાથે શોધો",
        "powersearch-ns": "નામસ્થળોમાં શોધો:",
        "randomincategory": "શ્રેણીમાં ગમે તે પાનું",
        "randomincategory-invalidcategory": "\"$1\" એ યોગ્ય શ્રેણી નામ નથી.",
        "randomincategory-nopages": "[[:Category:$1|$1]] વર્ગમાં કોઇ પાનું નથી.",
-       "randomincategory-selectcategory": "વર્ગમાંથી ગમે તે પાનું મેળવો: $1 $2.",
-       "randomincategory-selectcategory-submit": "જાઓ",
        "randomredirect": "દિશાહીન  નિર્દેશન",
        "randomredirect-nopages": "નામ સ્થળ \"$1\" માં કોઇ દિશા નિર્દેશન નથી",
        "statistics": "આંકડાકીય માહિતી",
        "booksources": "પુસ્તક સ્રોત",
        "booksources-search-legend": "પુસ્તક સ્રોત શોધો",
        "booksources-isbn": "આઇએસબીએન:",
-       "booksources-go": "જાઓ",
        "booksources-text": "નીચે દર્શાવેલ યાદી એ કડીઓ બતાવે છે જેઓ નવા અને જૂના પુસ્તકો  વેચે છે , અને તમે માંગેલ વસ્તુ સંબંધિ વધુ મહિતી પણ ધરાવી શકે છે.",
        "booksources-invalid-isbn": "આપેલ ISBN વૈધ નથી લાગતો; મૂળ સ્રોતને ચકાસી, ભૂલ શોધી, ખરી માહિતી આપો.",
        "specialloguserlabel": "અભિનય:",
        "wlheader-enotif": "ઈમેલ સૂચના પદ્ધતિ સક્રીય કરાઈ.",
        "wlheader-showupdated": "તમારી છેલ્લી મુલાકાત પછી બદલાયેલાં પાના  '''ઘાટા''' અક્ષરો વડે દર્શાવ્યાં છે.",
        "wlnote": "નીચે $3, $4 વાગ્યા સુધીના છેલ્લા {{PLURAL:$2|એક કલાક|'''$2''' કલાક}}માં થયેલા {{PLURAL:$1|ફેરફાર|'''$1''' ફેરફારો }} દર્શાવ્યા છે.",
-       "wlshowlast": "છેલ્લા $1 કલાક $2 દિવસ $3 બતાવો",
+       "wlshowlast": "છેલ્લા $1 કલાક $2 દિવસ  બતાવો",
        "watchlist-options": "ધ્યાનસૂચિના વિકલ્પો",
        "watching": "નજર રાખી રહ્યાં છો...",
        "unwatching": "નજર રાખવાની બંધ કરી છે...",
        "import": "પાના આયાત કરો",
        "importinterwiki": "ટ્રાંસ વિકિ આયાત",
        "import-interwiki-text": "આયાત કરવા માટેનાં પાનાનું શીર્ષક અને વિકિ પસંદ કરો.\nફેરફારની તારીખ અને લેખકો વિષેની માહિતી જેમની તેમ રાખવામાં આવશે.\nબધા જ આંતરવિકિ આયાતની નોંધ [[Special:Log/import|import log]]માં રખાય છે.",
-       "import-interwiki-source": "સ્રોત વિકિ/પાનું:",
        "import-interwiki-history": "આ પાનું બધા ફેરફારોના ઇતિહાસ સાથે આયાત કરો",
        "import-interwiki-templates": "બધા ઢાંચા શામિલ કરો",
        "import-interwiki-submit": "આયાત કરો",
        "exif-urgency-low": "નિમ્ન ($1)",
        "exif-urgency-high": "ઉચ્ચ ($1)",
        "exif-urgency-other": "વપરાશકર્તા-વ્યાખ્યાયિત અગ્રતા ($1)",
-       "watchlistall2": "બધા",
        "namespacesall": "બધા",
        "monthsall": "બધાં",
        "confirmemail": "તમારા ઇ-મેઇલ સરનામાની પુષ્ટિ કરો",
        "logentry-newusers-create2": "સભ્ય ખાતું $3 $1 વડે {{GENDER:$2|બનાવવામાં આવ્યું હતું}}",
        "logentry-newusers-autocreate": "વપરાશકર્તા ખાતું $1 આપમેળે {{GENDER:$2|બનાવવામાં આવ્યું હતું}}",
        "rightsnone": "(કંઈ નહી)",
+       "revdelete-summary": "સંપાદનનો સંક્ષિપ્ત અહેવાલ",
        "feedback-bugornote": "જો તમે તકનીકી સમસ્યા વર્ણવવા માંગતા હોય તો  કૃપયા [$1 report a bug] એ બગ અહીં નોંધાવો.\nઅન્યથા, તમે નીચે આપેલ સરળ ફોર્મ વાપરી શકો છો. તમારા સભ્ય નામ અને કયું બ્રાઉઝર વાપરો છો તેની માહિતી સાથે, તમારી ટિપ્પણીનો \"[$3 $2]\" પાનામાં સમાવેશ કરાશે.",
        "feedback-subject": "વિષય:",
        "feedback-message": "સંદેશ",
index ebce018..e5d1a7d 100644 (file)
        "suppress": "Oaseirys",
        "booksources": "Bun-gheillyn lioar",
        "booksources-search-legend": "Jean ronsaghey er bun-gheillyn lioar",
-       "booksources-go": "Gow",
        "specialloguserlabel": "Ymmydeyr:",
        "speciallogtitlelabel": "Ennym (duillag ny ymmydeyr):",
        "log": "Lioaryn cooishyn",
        "notanarticle": "Cha nel eh shoh ny ghuillag cummal",
        "notvisiblerev": "Va'n aavriwnys scryssit",
        "watchlist-details": "Ta {{PLURAL:$1|$1 duillag|$1 duillag|$1 ghuillag|$1 duillagyn}} er dty rolley arrey, faagail magh duillagyn resoonaght.",
-       "wlshowlast": "Taishbyn ny kied $1 ooryn $2 laaghyn $3 s'jerree",
+       "wlshowlast": "Taishbyn ny kied $1 ooryn $2 laaghyn  s'jerree",
        "watchlist-options": "Reihyn da'n rolley arrey",
        "watching": "Jannoo arrey...",
        "unwatching": "Stap y chur er arrey...",
        "exif-sharpness-2": "Creoi",
        "exif-gpsspeed-k": "Kilometeryn 'syn oor",
        "exif-gpsspeed-m": "Meeillaghyn 'syn oor",
-       "watchlistall2": "yn clane",
        "namespacesall": "yn clane",
        "monthsall": "yn clane",
        "recreate": "Aachroo",
        "specialpages-group-users": "Ymmydeyryn as kiartyn",
        "tags-edit": "reaghey",
        "rightsnone": "(veg)",
+       "revdelete-summary": "giare-choontey yn reaghey",
        "searchsuggest-search": "Ronsaghey",
        "searchsuggest-containing": "goaill stiagh...",
        "expand_templates_ok": "OK",
index cb43f56..6f1b471 100644 (file)
        "passwordreset-emailtitle": "在{{SITENAME}}上嘅詳細信息",
        "passwordreset-emailsent": "密碼重置電子郵件已發送。",
        "changeemail": "更改電子郵件地址",
-       "changeemail-header": "更改電子郵件帳戶",
        "changeemail-no-info": "汝必須登入後直接進入邇隻頁面。",
        "changeemail-oldemail": "當前電郵地址:",
        "changeemail-newemail": "新嘅電郵地址:",
        "changeemail-none": "(無)",
        "changeemail-submit": "更改電郵地址",
-       "changeemail-cancel": "取消",
        "bold_sample": "粗體文字",
        "bold_tip": "粗體文字",
        "italic_sample": "斜體文字",
        "template-protected": "(保護)",
        "template-semiprotected": "(半保護)",
        "hiddencategories": "邇頁屬於$1隻隱藏分類嘅成員:",
-       "edittools": "<!-- 邇肚嘅文字將分展示在編寫撈上傳表單以下。 -->",
+       "edittools": "<!-- 邇肚嘅文字將分展示在編寫撈上傳表單以下。 -->\n<div id=\"editpage-specialchars\" class=\"plainlinks edittools-version-test003\" style=\"margin-top: 15px; border-width: 1px; border-style: solid; border-color: #aaaaaa; padding: 2px;\"> <span id=\"edittools_main\">'''Insert:''' <charinsert>– — … ‘ “ ’ ” ° ″ ′ ≈ ≠ ≤ ≥ ± − × ÷ ← → · § </charinsert></span><span id=\"edittools_name\">&nbsp;&nbsp;'''Sign your username:''' <charinsert>--~~&#126;~</charinsert> <small>(on [[Help:Talk pages|talk pages]])</small></span> ---- <small id=\"edittools_newsectionshere\"><span id=\"edittools_hide_for_script_test\"><span id=\"edittools_wikimarkup\">'''Wiki markup:''' <charinsert><nowiki>{{</nowiki>+<nowiki>}}</nowiki> </charinsert> &nbsp; <charinsert><nowiki>{{{</nowiki>+<nowiki>}}}</nowiki> </charinsert> &nbsp; <charinsert><nowiki>|</nowiki></charinsert> &nbsp; <charinsert>[+]</charinsert> &nbsp; <charinsert>[[+]]</charinsert> &nbsp; <charinsert>[[Category:+]]</charinsert> &nbsp; <charinsert>#REDIRECT&#32;[[+]]</charinsert> &nbsp; <charinsert>{{Subst:Fôn-ngiàng}}</charinsert> &nbsp; <charinsert>{{Subst:PAGENAME}}</charinsert> &nbsp; <charinsert>&nbsp;</charinsert> &nbsp; <charinsert><s>+</s></charinsert> &nbsp; <charinsert><sup>+</sup></charinsert> &nbsp; <charinsert><sub>+</sub></charinsert> &nbsp; <charinsert><code>+</code></charinsert> &nbsp; <charinsert><blockquote>+</blockquote></charinsert> &nbsp; <charinsert><ref>+</ref></charinsert> &nbsp; <charinsert><nowiki>{{</nowiki>Reflist<nowiki>}}</nowiki></charinsert> &nbsp; <charinsert><references/></charinsert> &nbsp; <charinsert><includeonly>+</includeonly></charinsert> &nbsp; <charinsert><noinclude>+</noinclude></charinsert> &nbsp; <charinsert><nowiki>{{</nowiki>DEFAULTSORT:+<nowiki>}}</nowiki></charinsert> &nbsp; <charinsert>&lt;nowiki>+</nowiki></charinsert> &nbsp; <charinsert><nowiki><!-- </nowiki>+<nowiki> --></nowiki></charinsert>&nbsp; <charinsert><nowiki><span class=\"plainlinks\"></nowiki>+<nowiki></span></nowiki></charinsert>&nbsp;&nbsp;&bull;&nbsp; ([[Wikipedia:Template messages|templates]])<br/></span> <span id=\"edittools_symbols\">'''Symbols:''' <charinsert> ~ | ¡ ¿ † ‡ ↔ ↑ ↓ • ¶</charinsert> &nbsp; <charinsert> # ½ ⅓ ⅔ ¼ ¾ ⅛ ⅜ ⅝ ⅞ ∞ </charinsert> &nbsp; <charinsert> ‘ “ ’ ” «+»</charinsert> &nbsp; <charinsert> ¤ ₳ ฿ ₵ ¢ ₡ ₢ $ ₫ ₯ € ₠ ₣ ƒ ₴ ₭ ₤ ℳ ₥ ₦ № ₧ ₰ £ ៛ ₨ ₪ ৳ ₮ ₩ ¥ </charinsert> &nbsp; <charinsert> ♠ ♣ ♥ ♦ </charinsert>&nbsp; <charinsert>m²</charinsert>&nbsp;<charinsert>m³</charinsert><br/></span> <span id=\"edittools_characters\">'''Characters:''' <span class=\"latinx\"> <charinsert> Á á Ć ć É é Í í Ĺ ĺ Ḿ ḿ Ń ń Ó ó Ŕ ŕ Ś ś Ú ú Ý ý Ź ź </charinsert> &nbsp; <charinsert> À à È è Ì ì M̀ m̀  Ǹ ǹ Ò ò Ù ù </charinsert> &nbsp; <charinsert> Â â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ </charinsert> &nbsp; <charinsert> A̤ a̤ E̤ e̤ I̤ i̤ O̤ o̤ Ṳ ṳ </charinsert> &nbsp;\n<charinsert> A̍ a̍ E̍ e̍ I̍ i̍ O̍ o̍ U̍ u̍ </charinsert> &nbsp; <charinsert> À̤ à̤ È̤ è̤ Ì̤ ì̤ Ò̤ ò̤ Ṳ̀ ṳ̀ </charinsert> &nbsp;\n<charinsert> Á̤ á̤ É̤ é̤ Í̤ í̤ Ó̤ ó̤ Ṳ́ ṳ́ </charinsert> &nbsp; <charinsert> A̤̍ a̤̍ E̤̍ e̤̍ I̤̍ i̤̍ O̤̍ o̤̍ Ṳ̍ ṳ̍ </charinsert> &nbsp;\n<charinsert> Â̤ â̤ Ê̤ ê̤ Î̤ î̤ Ô̤ ô̤ Ṳ̂ ṳ̂ </charinsert> &nbsp; <charinsert> Â â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ </charinsert> &nbsp; <charinsert> Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ </charinsert> &nbsp; <charinsert> ß </charinsert> &nbsp; <charinsert> Ã ã Ẽ ẽ Ĩ ĩ Ñ ñ Õ õ Ũ ũ Ỹ ỹ</charinsert> &nbsp; <charinsert> Ç ç Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ </charinsert> &nbsp; <charinsert> Đ đ </charinsert> &nbsp; <charinsert> Ů ů </charinsert> &nbsp; <charinsert> Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž </charinsert> &nbsp; <charinsert> Ā ā Ē ē Ī ī Ō ō Ū ū Ȳ ȳ Ǣ ǣ </charinsert> &nbsp; <charinsert> ǖ ǘ ǚ ǜ </charinsert> &nbsp; <charinsert> Ă ă Ĕ ĕ Ğ ğ Ĭ ĭ Ŏ ŏ Ŭ ŭ </charinsert> &nbsp; <charinsert> Ċ ċ Ė ė Ġ ġ İ ı Ż ż </charinsert> &nbsp; <charinsert> Ą ą Ę ę Į į Ǫ ǫ Ų ų </charinsert> &nbsp; <charinsert> Ḍ ḍ Ḥ ḥ Ḷ ḷ Ḹ ḹ Ṃ ṃ Ṇ ṇ Ṛ ṛ Ṝ ṝ Ṣ ṣ Ṭ ṭ </charinsert> &nbsp; <charinsert> Ł ł </charinsert> &nbsp; <charinsert> Ő ő Ű ű </charinsert> &nbsp; <charinsert> Ŀ ŀ </charinsert> &nbsp; <charinsert> Ħ ħ </charinsert> &nbsp; <charinsert> Ð ð Þ þ </charinsert> &nbsp; <charinsert> Œ œ </charinsert> &nbsp; <charinsert> Æ æ Ø ø Å å </charinsert> &nbsp; <charinsert> Ə ə </charinsert></span>&nbsp;<span id=\"edittools_latinx_template\">&nbsp;&bull;&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>Unicode|</nowiki>+<nowiki>}}</nowiki></charinsert></span><br/></span> <span id=\"edittools_greek\">'''Hî-lia̍p-vùn:''' <charinsert> Ά ά Έ έ Ή ή Ί ί Ό ό Ύ ύ Ώ ώ </charinsert> &nbsp; <charinsert> Α α Β β Γ γ Δ δ </charinsert> &nbsp; <charinsert> Ε ε Ζ ζ Η η Θ θ </charinsert> &nbsp; <charinsert> Ι ι Κ κ Λ λ Μ μ </charinsert> &nbsp; <charinsert> Ν ν Ξ ξ Ο ο Π π </charinsert> &nbsp; <charinsert> Ρ ρ Σ σ ς Τ τ Υ υ </charinsert> &nbsp; <charinsert> Φ φ Χ χ Ψ ψ Ω ω </charinsert> &nbsp;<span id=\"edittools_greek_template\">•&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>Polytonic|</nowiki>+<nowiki>}}</nowiki></charinsert></span> &nbsp;<span id=\"edittools_greek_example\">•&nbsp; ([[Greek diacritics#Computer encoding|polytonic list]])</span><br/></span> <span id=\"edittools_cyrillic\">'''Cyrillic:''' <charinsert> А а Б б В в Г г </charinsert> &nbsp; <charinsert> Ґ ґ Ѓ ѓ Д д Ђ ђ </charinsert> &nbsp; <charinsert> Е е Ё ё Є є Ж ж </charinsert> &nbsp; <charinsert> З з Ѕ ѕ И и І і </charinsert> &nbsp; <charinsert> Ї ї Й й Ј ј К к </charinsert> &nbsp; <charinsert> Ќ ќ Л л Љ љ М м </charinsert> &nbsp; <charinsert> Н н Њ њ О о П п </charinsert> &nbsp; <charinsert> Р р С с Т т Ћ ћ </charinsert> &nbsp; <charinsert> У у Ў ў Ф ф Х х </charinsert> &nbsp; <charinsert> Ц ц Ч ч Џ џ Ш ш </charinsert> &nbsp; <charinsert> Щ щ Ъ ъ Ы ы Ь ь </charinsert> &nbsp; <charinsert> Э э Ю ю Я я </charinsert> &nbsp;<br/></span> <span id=\"edittools_ipa\">'''IPA:''' <span title=\"Pronunciation in IPA\" class=\"IPA\"><charinsert>t̪ d̪ ʈ ɖ ɟ ɡ ɢ ʡ ʔ </charinsert> &nbsp; <charinsert> ɸ ʃ ʒ ɕ ʑ ʂ ʐ ʝ ɣ ʁ ʕ ʜ ʢ ɦ </charinsert> &nbsp; <charinsert> ɱ ɳ ɲ ŋ ɴ </charinsert> &nbsp; <charinsert> ʋ ɹ ɻ ɰ </charinsert> &nbsp; <charinsert> ʙ ʀ ɾ ɽ </charinsert> &nbsp; <charinsert> ɫ ɬ ɮ ɺ ɭ ʎ ʟ </charinsert> &nbsp; <charinsert> ɥ ʍ ɧ </charinsert> &nbsp; <charinsert> ɓ ɗ ʄ ɠ ʛ </charinsert> &nbsp; <charinsert> ʘ ǀ ǃ ǂ ǁ </charinsert> &nbsp; <charinsert> ɨ ʉ ɯ </charinsert> &nbsp; <charinsert> ɪ ʏ ʊ </charinsert> &nbsp; <charinsert> ɘ ɵ ɤ </charinsert> &nbsp; <charinsert> ə ɚ </charinsert> &nbsp; <charinsert> ɛ ɜ ɝ ɞ ʌ ɔ </charinsert> &nbsp; <charinsert> ɐ ɶ ɑ ɒ </charinsert> &nbsp; <charinsert> ʰ ʷ ʲ ˠ ˤ ⁿ ˡ </charinsert> &nbsp; <charinsert> ˈ ˌ ː ˑ ̪ </charinsert>&nbsp;</span> &nbsp;&bull;&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>IPA|</nowiki>+<nowiki>}}</charinsert></small>\n</div>",
        "nocreatetext": "Chhṳ́ mióng-chham han-chṳ chhóng-chho sîn hong-mien ke kûng-yung. ngì khó-yî fán-fì pin phiên-cho yí-kîn yû ke hong-mien, fe̍t-chá [[Special:UserLogin|tên-liu̍k fe̍t-he chhóng-kien sîn chong-fu]].",
        "nocreate-loggedin": "汝並無權限去創建新頁面。",
        "permissionserrors": "權限差錯",
        "searchrelated": "相關",
        "searchall": "全部",
        "showingresults": "Ha-mien hién-sṳ chhiùng thi-'''$2'''-thiàu khôi-sṳ́ ke '''$1'''-thiàu kiet-kó:",
-       "showingresultsheader": "對'''$4'''嘅{{PLURAL:$5|第'''$1'''到第'''$3'''隻結果|第'''$1 - $2'''隻,共'''$3'''隻結果}}",
        "search-nonefound": "在查詢肚無結果相符。",
        "powersearch-legend": "高級搜尋",
        "powersearch-ns": "在下背嘅名字空間肚搜尋:",
        "pager-older-n": "舊$1次",
        "booksources": "網絡書源",
        "booksources-search-legend": "尋找網絡書源",
-       "booksources-go": "送出",
        "booksources-text": "下背係一份銷售新書或二手書嘅列表,並可能有汝尋找緊嘅書嘅進一步信息:",
        "specialloguserlabel": "Yung-fu:",
        "speciallogtitlelabel": "Phêu-thì:",
        "wlheader-enotif": "Yí-kîn khí-thung email thûng-tî kûng-nèn.",
        "wlheader-showupdated": "Chhai ngì song-chhṳ kiám-sṳ heu yû pûn chhùng-siû ko ke vùn-chông chiông-voi hién-sṳ vi '''chhû-thí'''.",
        "wlnote": "Yî-ha he chui-khiûn <b>$2</b> séu-sṳ̀ nui-ke chui-heu $1-chhṳ chin-siû.",
-       "wlshowlast": "展示最近$1隻鐘頭,$2日或$3嘅更改。",
+       "wlshowlast": "展示最近$1隻鐘頭,$2日或嘅更改。",
        "watchlist-options": "監視列表選項",
        "watching": "監視中...",
        "unwatching": "停止監視中...",
        "metadata-expand": "Hién-sṳ siòng-se ke chṳ̂-liau",
        "metadata-collapse": "Yún-chhòng siòng-se ke chṳ̂-liau",
        "metadata-fields": "在本信息肚所列出嘅EXIF元數據域將包含在圖片顯示頁面,當元數據表損壞時單淨顯示下背信息。\n其他嘅元數據默認做隱藏。\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
-       "watchlistall2": "全部",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認電郵地址",
        "tag-filter": "[[Special:Tags|標籤]]過濾器:",
        "revdelete-restricted": "yí-kîn yin-yung han-tsṳ tsṳ tshâu-tsok-yèn",
        "revdelete-unrestricted": "yí-kîn yì-tshù yû-kûan tshâu-tsok-yè ke han-tsṳ",
-       "rightsnone": "(無)"
+       "rightsnone": "(無)",
+       "revdelete-summary": "piên-sip tsak-yêu"
 }
index 5532175..ef99450 100644 (file)
        "passwordreset-username": "Inoa mea ho'ohana:",
        "passwordreset-email": "Wahinoho lekauila:",
        "changeemail": "Hoʻololi i ka wahinoho lekauila",
-       "changeemail-header": "Hoʻololi i ka wahinoho lekauila moʻokāki",
        "changeemail-oldemail": "Wahinoho lekauila hananei:",
        "changeemail-newemail": "Wahinoho lekauila hou:",
        "changeemail-none": "(ʻaʻohe)",
        "changeemail-password": "Kāu ʻōlelo hūnā {{SITENAME}}:",
        "changeemail-submit": "Loli i kāu lekauila",
-       "changeemail-cancel": "Hoʻōki",
        "resettokens-token-label": "$1 (helu okamanawa: $2)",
        "bold_sample": "Ho‘okā‘ele",
        "bold_tip": "Ho‘okā‘ele",
        "search-relatedarticle": "Nā Mea ʻālike",
        "searchrelated": "na mea ʻālike",
        "searchall": "nā mea apau",
-       "showingresultsheader": "{{PLURAL:$5|<strong>$1</strong> hualoaʻa o <strong>$3</strong> mau hualoaʻa|<strong$1-$2</strong> mau hualoaʻa o <strong>$3</strong> mau hualoaʻa}} no <strong>$4</strong>",
        "search-nonefound": "ʻAʻohe hualoaʻa no kēia huli.",
        "powersearch-legend": "Hulina kūlana kiʻekiʻe",
        "powersearch-ns": "Huli i loko o nā wahi inoa:",
        "filedelete-reason-otherlist": "Nā kumu ʻē aʻe",
        "download": "hoʻoili",
        "randompage": "ʻAtikala Kaulele",
-       "randomincategory-selectcategory-submit": "Huli",
        "statistics": "ʻIkepilihelu",
        "statistics-header-pages": "ʻIkepilihelu ʻaoʻao",
        "statistics-header-edits": "ʻIkepilihelu hoʻololi",
        "pager-older-n": "{{PLURAL:$1|1 aku nei|$1 aku nei}}",
        "booksources": "Kumu puke",
        "booksources-search-legend": "Huli i nā kūmole  puke",
-       "booksources-go": "E huli",
        "log": "Nā Mo‘olelo",
        "all-logs-page": "Nā Moʻolelo lehulehu apau",
        "allpages": "Nā ‘Ao‘ao apau",
        "watchthispage": "E nānā pono i kēia mea",
        "unwatch": "Kiaʻi ʻole",
        "watchlist-details": "{{PLURAL:$1|$1 ʻaoʻao|$1 mau ʻaoʻao}} a kāu papakiaʻi, me ʻole ke koe ʻana o nā ʻaoʻao walaʻau.",
-       "wlshowlast": "Hōʻike $1 hola aku nei $2 lā aku nei $3",
+       "wlshowlast": "Hōʻike $1 hola aku nei $2 lā aku nei",
        "watchlist-options": "Nā Koho papakiaʻi",
        "watching": "Kia‘i nei...",
        "unwatching": "Ke wehe nei i ke kiaʻi...",
        "exif-iimcategory-evn": "ʻĀina",
        "exif-iimcategory-hth": "Olakino",
        "exif-iimcategory-wea": "Anianilā",
-       "watchlistall2": "nā mea apau",
        "namespacesall": "nā mea apau",
        "monthsall": "nā mea apau",
        "confirm_purge_button": "Hiki nō",
index 9bad958..4630efe 100644 (file)
        "category-empty": "'''קטגוריה זו אינה כוללת דפים או קובצי מדיה.'''",
        "hidden-categories": "{{PLURAL:$1|קטגוריה מוסתרת|קטגוריות מוסתרות}}",
        "hidden-category-category": "קטגוריות מוסתרות",
-       "category-subcat-count": "{{PLURAL:$2|קטגוריה זו כוללת את קטגוריית המשנה הבאה בלבד.|קטגוריה זו כוללת את {{PLURAL:$1|קטגוריית המשנה המוצגת להלן|$1 קטגוריות המשנה המוצגות להלן}}, וכוללת בסך הכול $2 קטגוריות משנה.}}",
+       "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": "{{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": "{{PLURAL:$2|קטגוריה זו כוללת את הקובץ הבא בלבד.|קטגוריה זו כוללת את {{PLURAL:$1|הקובץ המוצג להלן|$1 הקבצים המוצגים להלן}}, וכוללת בסך־הכול $2 קבצים.}}",
        "category-file-count-limited": "קטגוריה זו כוללת את {{PLURAL:$1|הקובץ הבא|$1 הקבצים הבאים}}.",
        "listingcontinuesabbrev": "(המשך)",
        "index-category": "דפים המופיעים במנועי חיפוש",
        "otherlanguages": "דף זה בשפות אחרות",
        "redirectedfrom": "(הופנה מהדף $1)",
        "redirectpagesub": "דף הפניה",
+       "redirectto": "הפניה ל:",
        "lastmodifiedat": "שונה לאחרונה ב־$2, $1.",
        "viewcount": "דף זה נצפה {{PLURAL:$1|פעם אחת|פעמיים|$1 פעמים}}.",
        "protectedpage": "דף מוגן",
        "privacy": "מדיניות הפרטיות",
        "privacypage": "Project:מדיניות הפרטיות",
        "badaccess": "שגיאה בהרשאות",
-       "badaccess-group0": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d ×\9c×\91צע ×\90ת ×\94פע×\95×\9c×\94 ×©×\91×\99קשת×\9d.",
-       "badaccess-groups": "הפעולה שביקשתם לבצע מוגבלת למשתמשים ב{{PLURAL:$2|קבוצה הבאה|אחת הקבוצות הבאות}}: $1.",
+       "badaccess-group0": "×\90×\99× ×\9a ×\9e×\95רש×\94 ×\9c×\91צע ×\90ת ×\94פע×\95×\9c×\94 ×©×\91×\99קשת.",
+       "badaccess-groups": "הפעולה שביקשת לבצע מוגבלת למשתמשים ב{{PLURAL:$2|קבוצה הבאה|אחת הקבוצות הבאות}}: $1.",
        "versionrequired": "נדרשת גרסה $1 של מדיה־ויקי",
        "versionrequiredtext": "גרסה $1 של מדיה־ויקי נדרשת לשימוש בדף זה. למידע נוסף, ראו את [[Special:Version|דף הגרסה]].",
        "ok": "אישור",
        "databaseerror-error": "שגיאה: $1",
        "laggedslavemode": "'''אזהרה:''' הדף עשוי שלא להכיל עדכונים אחרונים.",
        "readonly": "בסיס הנתונים נעול",
-       "enterlockreason": "×\94×\96×\99× ×\95 ×¡×\99×\91×\94 ×\9c× ×¢×\99×\9cת ×\91ס×\99ס ×\94נת×\95× ×\99×\9d, ×\9b×\95×\9c×\9c ×\94ער×\9b×\94 ×\9c×\92×\91×\99 ×\9e×\95×¢×\93 ×©×\97ר×\95ר ×\94× ×¢×\99×\9c×\94.",
+       "enterlockreason": "×\99ש ×\9c×\94×\96×\99×\9f ×¡×\99×\91×\94 ×\9c× ×¢×\99×\9c×\94, ×\9b×\95×\9c×\9c ×\94ער×\9b×\94 ×\9c×\9e×\95×¢×\93 ×©×\97ר×\95ר ×\94× ×¢×\99×\9c×\94",
        "readonlytext": "בסיס נתונים זה של האתר נעול ברגע זה לצורך הזנת נתונים ושינויים. ככל הנראה מדובר בתחזוקה שוטפת, שלאחריה יחזור האתר לפעולתו הרגילה.\n\nמנהל המערכת שנעל את בסיס הנתונים סיפק את ההסבר הבא: $1",
-       "missing-article": "בסיס הנתונים לא מצא את הטקסט של הדף שהוא היה אמור למצוא, בשם \"$1\" $2.\n\nהדבר נגרם בדרך כלל על ידי קישור ישן להשוואת גרסאות של דף שנמחק או לגרסה של דף כזה.\n\nאם זה אינו המקרה, זהו כנראה באג בתוכנה.\nאנא דווחו על כך ל[[Special:ListUsers/sysop|מפעיל מערכת]], תוך שמירת פרטי כתובת ה־URL.",
+       "missing-article": "בסיס הנתונים לא מצא את הטקסט של הדף שהוא היה אמור למצוא, בשם \"$1\" $2.\n\nהדבר נגרם בדרך כלל על־ידי קישור ישן להשוואת גרסאות של דף שנמחק או לגרסה של דף כזה.\n\nאם זה אינו המקרה, זהו כנראה באג בתוכנה.\nאנא דווחו על כך ל[[Special:ListUsers/sysop|מפעיל מערכת]], תוך שמירת פרטי כתובת ה־URL.",
        "missingarticle-rev": "(מספר גרסה: $1)",
        "missingarticle-diff": "(השוואת הגרסאות: $1, $2)",
        "readonly_lag": "בסיס הנתונים ננעל אוטומטית כדי לאפשר לבסיסי הנתונים המשניים להתעדכן מהבסיס הראשי.",
        "directorycreateerror": "יצירת התיקייה \"$1\" נכשלה.",
        "filenotfound": "הקובץ \"$1\" לא נמצא.",
        "unexpected": "ערך לא צפוי: \"$1\"=\"$2\"",
-       "formerror": "ש×\92×\99×\90×\94: ×\9c×\90 ×\99×\9b×\95×\9c ×\9cש×\9c×\95×\97 טופס.",
+       "formerror": "ש×\92×\99×\90×\94: ×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9cש×\9c×\95×\97 ×\90ת ×\94טופס.",
        "badarticleerror": "לא ניתן לבצע פעולה זו בדף זה.",
-       "cannotdelete": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\9e×\97×\95ק ×\90ת ×\94×\93×£ ×\90×\95 ×\94ק×\95×\91×¥ \"$1\".\n×\99×\99ת×\9b×\9f ×©×\94×\95×\90 × ×\9e×\97ק ×\9b×\91ר ×¢×\9c ×\99×\93×\99 ×\9e×\99ש×\94×\95 אחר.",
+       "cannotdelete": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\9e×\97×\95ק ×\90ת ×\94×\93×£ ×\90×\95 ×\94ק×\95×\91×¥ \"$1\".\n×\99×\99ת×\9b×\9f ×©×\94×\95×\90 ×\9b×\91ר × ×\9e×\97ק ×¢×\9cÖ¾×\99×\93×\99 ×\9eשת×\9eש אחר.",
        "cannotdelete-title": "לא ניתן למחוק את הדף \"$1\"",
        "delete-hook-aborted": "המחיקה הופסקה על־ידי מבנה Hook.\nלא ניתן הסבר.",
        "no-null-revision": "לא ניתן היה ליצור גרסת־דמה בדף \"$1\"",
        "viewsource": "הצגת מקור",
        "viewsource-title": "הצגת המקור של $1",
        "actionthrottled": "הפעולה הוגבלה",
-       "actionthrottledtext": "×\9b×\90×\9eצע×\99 × ×\92×\93 ×¡×¤×\90×\9d, ×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d ×\9c×\91צע ×¤×¢×\95×\9c×\94 ×\96×\95 ×¤×¢×\9e×\99×\9d ×¨×\91×\95ת ×\9e×\93×\99 ×\91×\96×\9e×\9f ×§×¦×¨. ×\90× ×\90 × ×¡×\95 שוב בעוד מספר דקות.",
+       "actionthrottledtext": "×\9b×\90×\9eצע×\99 × ×\92×\93 ×¡×¤×\90×\9d, ×§×\99×\99×\9eת ×\9e×\92×\91×\9c×\94 ×¢×\9c ×\91×\99צ×\95×¢ ×¤×¢×\95×\9c×\94 ×\96×\95 ×¤×¢×\9e×\99×\9d ×¨×\91×\95ת ×\9e×\93×\99 ×\91×\96×\9e×\9f ×§×¦×¨, ×\95×\97ר×\92ת ×\9e×\94×\9e×\92×\91×\9c×\94 ×\94×\96×\95.\n× ×\90 ×\9cנס×\95ת שוב בעוד מספר דקות.",
        "protectedpagetext": "דף זה מוגן כדי למנוע עריכה ופעולות אחרות.",
        "viewsourcetext": "באפשרותך לצפות בטקסט המקור של הדף ולהעתיקו:",
-       "viewyourtext": "×\91×\90פשר×\95ת×\9b×\9d ×\9cצפ×\95ת ×\91×\98קס×\98 ×\94×\9eק×\95ר ×©×\9c '''×\94ער×\99×\9b×\95ת ×©×\9c×\9b×\9d''' ×©×\9c ×\94×\93×£ ולהעתיקו:",
+       "viewyourtext": "×\91×\90פשר×\95ת×\9a ×\9cצפ×\95ת ×\91×\98קס×\98 ×\94×\9eק×\95ר ×©×\9c <strong>×\94ער×\99×\9b×\95ת ×©×\9c×\9a</strong> ×\91×\93×£ ×\94×\96×\94 ולהעתיקו:",
        "protectedinterface": "דף זה הוא אחד מסדרת דפים המספקים הודעות מערכת לתוכנה באתר ויקי זה, ומוגן כדי למנוע השחתות.\nכדי להוסיף או לשנות תרגומים בכל אתרי הוויקי, אנא השתמשו ב־[//translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
        "editinginterface": "'''אזהרה:''' הדף שאתם עורכים הוא אחד הדפים המספקים הודעות מערכת לתוכנה.\nשינויים בדף זה ישפיעו על תצוגת ממשק המשתמש של משתמשים אחרים באתר ויקי זה.\nכדי להוסיף או לשנות תרגומים בכל אתרי הוויקי, אנא השתמשו ב־[//translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
        "cascadeprotected": "דף זה מוגן מעריכה כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:\n$2",
-       "namespaceprotected": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d ×\9cער×\95×\9a ×\93פ×\99×\9d ×\91×\9eר×\97×\91 ×\94ש×\9d '''$1'''.",
-       "customcssprotected": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d ×\9cער×\95×\9a ×\93×£ CSS ×\96×\94, ×\9b×\99×\95×\95×\9f ×©×\94×\95×\90 ×\9b×\95×\9c×\9c ×\90ת ×\94×\94×\92×\93ר×\95ת ×\94אישיות של משתמש אחר.",
-       "customjsprotected": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d ×\9cער×\95×\9a ×\93×£ JavaScript ×\96×\94, ×\9b×\99×\95×\95×\9f ×©×\94×\95×\90 ×\9b×\95×\9c×\9c ×\90ת ×\94×\94×\92×\93ר×\95ת ×\94אישיות של משתמש אחר.",
-       "mycustomcssprotected": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d לערוך דף CSS זה.",
-       "mycustomjsprotected": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d לערוך דף JavaScript זה.",
+       "namespaceprotected": "×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 ×\9cער×\95×\9a ×\93פ×\99×\9d ×\91×\9eר×\97×\91 ×\94ש×\9d <strong>$1</strong>.",
+       "customcssprotected": "×\90×\99× ×\9a ×\9e×\95רש×\94 ×\9cער×\95×\9a ×\93×£ CSS ×\96×\94 ×\9b×\99×\95×\95×\9f ×©×\94×\95×\90 ×\9b×\95×\9c×\9c ×\94×\92×\93ר×\95ת אישיות של משתמש אחר.",
+       "customjsprotected": "×\90×\99× ×\9a ×\9e×\95רש×\94 ×\9cער×\95×\9a ×\93×£ JavaScript ×\96×\94 ×\9b×\99×\95×\95×\9f ×©×\94×\95×\90 ×\9b×\95×\9c×\9c ×\94×\92×\93ר×\95ת אישיות של משתמש אחר.",
+       "mycustomcssprotected": "×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 לערוך דף CSS זה.",
+       "mycustomjsprotected": "×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 לערוך דף JavaScript זה.",
        "myprivateinfoprotected": "אין לך הרשאה לערוך את המידע הפרטי שלך",
        "mypreferencesprotected": "אין לך הרשאה לערוך את ההעדפות שלך.",
        "ns-specialprotected": "לא ניתן לערוך דפים מיוחדים.",
-       "titleprotected": "לא ניתן ליצור דף זה, כיוון שהמשתמש [[User:$1|$1]] הגן עליו מפני יצירה.\nהסיבה שניתנה לכך היא \"$2\".",
+       "titleprotected": "[[User:$1|$1]] {{GENDER:$1|הפעיל|הפעילה}} הגנה על הדף הזה מפני יצירה.\nהסיבה שניתנה לכך היא \"<em>$2</em>\".",
        "filereadonlyerror": "לא ניתן לשנות את הקובץ \"$1\" כיוון שמאגר הקבצים \"$2\" במצב קריאה בלבד.\n\nמנהל המערכת שנעל את המאגר סיפק את ההסבר הבא: \"'''$3'''\".",
        "invalidtitle-knownnamespace": "כותרת בלתי־תקינה עם מרחב השם \"$2\" ושם דף \"$3\"",
        "invalidtitle-unknownnamespace": "כותרת בלתי־תקינה עם מרחב שם בלתי־ידוע מספר $1 ושם דף \"$2\"",
        "exception-nologin": "לא בחשבון",
        "exception-nologin-text": "אנא היכנסו לחשבון כדי לראות את הדף הזה או לבצע את הפעולה הזו.",
-       "exception-nologin-text-manual": "×\90× ×\90 $1 כדי לראות את הדף הזה או לבצע את הפעולה הזו.",
+       "exception-nologin-text-manual": "× ×\93רשת $1 כדי לראות את הדף הזה או לבצע את הפעולה הזו.",
        "virus-badscanner": "הגדרות שגויות: סורק הווירוסים אינו ידוע: ''$1''",
        "virus-scanfailed": "הסריקה נכשלה (קוד: $1)",
        "virus-unknownscanner": "אנטי־וירוס בלתי ידוע:",
        "userlogin-signwithsecure": "שימוש בחיבור מאובטח",
        "yourdomainname": "המתחם שלך:",
        "password-change-forbidden": "אין באפשרותך לשנות סיסמאות באתר זה.",
-       "externaldberror": "×\94×\99×\99ת×\94 ×©×\92×\99×\90×\94 ×\91×\91ס×\99ס ×\94נת×\95× ×\99×\9d ×©×\9c ×\94×\94×\96×\93×\94×\95ת, ×\90×\95 ×©×\90×\99× ×\9b×\9d ×¨×©×\90×\99×\9d ×\9c×¢×\93×\9b×\9f ×\90ת ×\97ש×\91×\95× ×\9b×\9d ×\94×\97×\99צ×\95× ×\99.",
+       "externaldberror": "×\90×\99רע×\94 ×©×\92×\99×\90ת ×\90×\99×\9e×\95ת ×\91×\91ס×\99ס ×\94נת×\95× ×\99×\9d, ×\90×\95 ×©×\90×\99× ×\9a ×\9e×\95רש×\94 ×\9c×¢×\93×\9b×\9f ×\90ת ×\94×\97ש×\91×\95×\9f ×\94×\97×\99צ×\95× ×\99 ×©×\9c×\9a.",
        "login": "כניסה לחשבון",
        "nav-login-createaccount": "כניסה לחשבון / הרשמה",
        "userlogin": "כניסה לחשבון / הרשמה",
        "nologin": "אין לך חשבון? $1.",
        "nologinlink": "הרשמה",
        "createaccount": "יצירת חשבון חדש",
-       "gotaccount": "×\9b×\91ר × ×¨×©×\9eת×\9d? $1.",
+       "gotaccount": "×\9b×\91ר ×\99ש ×\9c×\9a ×\97ש×\91×\95×\9f? $1.",
        "gotaccountlink": "כניסה לחשבון",
        "userlogin-resetlink": "שכחת את פרטי הכניסה?",
        "userlogin-resetpassword-link": "שכחת את הסיסמה?",
        "createacct-benefit-body1": "{{PLURAL:$1|עריכה|עריכות}}",
        "createacct-benefit-body2": "{{PLURAL:$1|דף|דפים}}",
        "createacct-benefit-body3": "{{PLURAL:$1|תורם|תורמים}} לאחרונה",
-       "badretype": "הסיסמאות שהזנתם אינן מתאימות.",
+       "badretype": "הסיסמאות שהזנת אינן מתאימות.",
        "userexists": "שם המשתמש שבחרתם כבר נמצא בשימוש.\nאנא בחרו שם אחר.",
        "loginerror": "שגיאה בכניסה לאתר",
        "createacct-error": "שגיאה ביצירת חשבון",
        "noemail": "לא רשומה כתובת דואר אלקטרוני עבור ה{{GENDER:$1|משתמש|משתמשת}} \"$1\".",
        "noemailcreate": "יש לספק כתובת דואר אלקטרוני תקינה.",
        "passwordsent": "סיסמה חדשה נשלחה לכתובת הדואר האלקטרוני הרשומה עבור \"$1\".\nאנא היכנסו חזרה לאתר אחרי שתקבלו אותה.",
-       "blocked-mailpassword": "×\9bת×\95×\91ת ×\94Ö¾IP ×©×\9c×\9b×\9d ×\97ס×\95×\9e×\94 ×\9eער×\99×\9b×\94, ×\95×\9cפ×\99×\9b×\9a ×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d ×\9c×\94שת×\9eש ×\91×\90פשר×\95ת ×©×\97×\96×\95ר ×\94ס×\99ס×\9e×\94 כדי למנוע ניצול לרעה של התכונה.",
+       "blocked-mailpassword": "×\9bת×\95×\91ת ×\94Ö¾IP ×©×\9c×\9a × ×\97ס×\9e×\94 ×\9eער×\99×\9b×\94, ×\95×\9cפ×\99×\9b×\9a ×\90×\99× ×\9a ×\9e×\95רש×\94 ×\9c×\94שת×\9eש ×\91×\90פשר×\95ת ×©×\97×\96×\95ר ×\94ס×\99ס×\9e×\94, ×\95×\96×\90ת כדי למנוע ניצול לרעה של התכונה.",
        "eauthentsent": "דוא\"ל אימות נשלח לכתובת הדוא\"ל שצוינה.\nלפני שדברי דוא\"ל אחרים יישלחו לחשבון הזה, יהיה עליכם לפעול לפי ההוראות בדוא\"ל, כדי לאשר שהחשבון אכן שייך לכם.",
        "throttled-mailpassword": "כבר נשלח דוא\"ל לאיפוס הסיסמה ב{{PLURAL:$1|שעה האחרונה|שעתיים האחרונות|־$1 השעות האחרונות}}.\nכדי למנוע ניצול לרעה, יכול להישלח רק דוא\"ל אחד כזה בכל {{PLURAL:$1|שעה|שעתיים|$1 שעות}}.",
        "mailerror": "שגיאה בשליחת דואר: $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 × ×\9b×\95×\9f.\n×\90× ×\90 ×\94ק×\9c×\99×\93×\95 ×\9bת×\95×\91ת ×ª×§×\99× ×\94 ×\90×\95 ×\94ש×\90×\99ר×\95 את השדה ריק.",
+       "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 ×\9bת×\95×\91ת ×ª×§×\99× ×\94 ×\90×\95 ×\9c×\94ש×\90×\99ר את השדה ריק.",
        "cannotchangeemail": "לא ניתן לשנות את כתובות הדוא\"ל של חשבונות באתר ויקי זה.",
        "emaildisabled": "אתר זה לא יכול לשלוח דואר אלקטרוני.",
        "accountcreated": "החשבון נוצר",
        "createaccount-text": "מישהו יצר חשבון בשם $2 ב{{grammar:תחילית|{{SITENAME}}}} ($4), והסיסמה הזמנית של החשבון היא \"$3\". עליכם להיכנס ולשנות עכשיו את הסיסמה.\n\nבאפשרותכם להתעלם מהודעה זו, אם החשבון נוצר בטעות.",
        "login-throttled": "ביצעתם לאחרונה ניסיונות רבים מדי להיכנס לחשבון זה.\nאנא המתינו $1 לפני שתנסו שוב.",
        "login-abort-generic": "הכניסה לחשבון לא הצליחה - היא הופסקה",
+       "login-migrated-generic": "חשבון המשתמש שלך הועבר, ושם המשתמש שלך כבר לא קיים באתר ויקי זה.",
        "loginlanguagelabel": "שפה: $1",
        "suspicious-userlogout": "בקשתך לצאת מהחשבון נדחתה כיוון שנראה שהיא נשלחה על־ידי דפדפן שבור או שרת פרוקסי עם זיכרון מטמון.",
        "createacct-another-realname-tip": "השם האמיתי הוא אופציונאלי.\nאם תבחרו לספקו, הוא ישמש לייחוס עבודת המשתמש אליו.",
        "newpassword": "סיסמה חדשה:",
        "retypenew": "חזרה על הסיסמה החדשה:",
        "resetpass_submit": "הגדרת הסיסמה וכניסה לחשבון",
-       "changepassword-success": "ס×\99ס×\9eת×\9b×\9d שונתה בהצלחה!",
+       "changepassword-success": "ס×\99ס×\9eת×\9a שונתה בהצלחה!",
        "changepassword-throttled": "ביצעתם לאחרונה ניסיונות רבים מדי להיכנס לחשבון זה.\nאנא המתינו $1 לפני שתנסו שוב.",
        "resetpass_forbidden": "לא ניתן לשנות סיסמאות.",
-       "resetpass-no-info": "×\99ש ×\9c×\94×\99×\9bנס לחשבון כדי לגשת לדף זה באופן ישיר.",
+       "resetpass-no-info": "× ×\93רשת ×\9b× ×\99ס×\94 לחשבון כדי לגשת לדף זה באופן ישיר.",
        "resetpass-submit-loggedin": "שינוי סיסמה",
        "resetpass-submit-cancel": "ביטול",
        "resetpass-wrong-oldpass": "הסיסמה הזמנית או הנוכחית אינה תקינה.\nייתכן שכבר שינית את סיסמתך או שכבר ביקשת סיסמה זמנית חדשה.",
        "passwordreset-emailsent-capture": "נשלח דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן.",
        "passwordreset-emailerror-capture": "נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1",
        "changeemail": "שינוי כתובת דוא\"ל",
-       "changeemail-header": "שינוי כתובת הדואר האלקטרוני בחשבון",
        "changeemail-text": "מלאו טופס זה כדי לשנות את כתובת הדואר האלקטרוני שלכם. יהיה עליכם למלא סיסמה כדי לאשר את השינוי.",
-       "changeemail-no-info": "×\99ש ×\9c×\94×\99×\9bנס לחשבון כדי לגשת לדף זה ישירות.",
+       "changeemail-no-info": "× ×\93רשת ×\9b× ×\99ס×\94 לחשבון כדי לגשת לדף זה ישירות.",
        "changeemail-oldemail": "כתובת דוא\"ל נוכחית:",
        "changeemail-newemail": "כתובת דוא\"ל חדשה:",
        "changeemail-none": "(אין)",
        "changeemail-password": "סיסמה ב{{grammar:תחילית|{{SITENAME}}}}:",
        "changeemail-submit": "שינוי כתובת הדוא\"ל",
-       "changeemail-cancel": "ביטול",
        "changeemail-throttled": "ביצעתם ניסיונות רבים מדי להיכנס לחשבון זה.\nאנא המתינו $1 לפני שתנסו שוב.",
        "resettokens": "איפוס אסימונים",
        "resettokens-text": "בעמוד זה ניתן לאפס אסימונים שמאפשרים גישה לנתונים פרטיים של החשבון שלך.\n\nרצוי לעשות זאת אם שיתפת אותם בטעות עם אחרים או אם חשבונך נפרץ.",
        "showpreview": "תצוגה מקדימה",
        "showdiff": "הצגת שינויים",
        "blankarticle": "<strong>אזהרה:</strong> הדף שאתם יוצרים הוא ריק.\nאם תלחצו שוב על \"{{int:savearticle}}\", הדף ייווצר ללא תוכן.",
-       "anoneditwarning": "'''אזהרה:''' אינכם מחוברים לחשבון. כתובת ה־IP שלכם תירשם בהיסטוריית העריכות של הדף.",
+       "anoneditwarning": "<strong>אזהרה:</strong> אינכם מחוברים לחשבון. כתובת ה־IP שלכם תוצג בפומבי אם תבצעו עריכות כלשהן. אם <strong>[$1 תיכנסו לחשבון]</strong> או <strong>[$2 תיצרו חשבון]</strong>, העריכות שלכם תיוחסנה לשם המשתמש שלכם ותקבלו גם יתרונות אחרים.",
        "anonpreviewwarning": "''אינכם מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.''",
-       "missingsummary": "'''תזכורת:''' לא הזנתם תקציר עריכה.\nאם תלחצו שוב על הכפתור \"{{int:savearticle}}\", עריכתכם תישמר בלעדיו.",
-       "missingcommenttext": "×\90× ×\90 ×\94ק×\9c×\99×\93×\95 את ההודעה למטה.",
-       "missingcommentheader": "'''תזכורת:''' לא הזנתם נושא/כותרת להודעה זו.\nאם תלחצו שוב על הכפתור \"{{int:savearticle}}\", עריכתכם תישמר בלעדיו.",
+       "missingsummary": "<strong>תזכורת:</strong> לא הזנת תקציר עריכה.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר בלעדיו.",
+       "missingcommenttext": "×\99ש ×\9c×\94ק×\9c×\99×\93 את ההודעה למטה.",
+       "missingcommentheader": "<strong>תזכורת:</strong> לא הזנת נושא/כותרת להודעה זו.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר ללא נושא/כותרת.",
        "summary-preview": "תצוגה מקדימה של התקציר:",
        "subject-preview": "תצוגה מקדימה של הנושא/הכותרת:",
        "blockedtitle": "המשתמש חסום",
        "blockedtext": "'''שם המשתמש או כתובת ה־IP שלכם נחסמו.'''\n\nהחסימה בוצעה על ידי $1. הסיבה שניתנה לכך היא '''$2'''.\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותכם ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון על החסימה.\nאינכם יכולים להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\" אם לא ציינתם כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלכם]] או אם נחסמתם משליחת דוא\"ל.\nכתובת ה־IP שלכם היא $3, ומספר החסימה שלכם הוא #$5.\nאנא ציינו את כל הפרטים הללו בכל פנייה למפעילי המערכת.",
-       "autoblockedtext": "כתובת ה־IP שלכם נחסמה באופן אוטומטי כיוון שמשתמש אחר, שנחסם על־ידי $1, השתמש בה.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותכם ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון בחסימה.\n\nבאפשרותכם להשתמש בתכונת \"{{int:emailuser}}\", אלא אם לא ציינתם כתובת דוא\"ל תקינה ב[[Special:Preferences|העדפות המשתמש שלכם]] או אם נחסמתם משליחת דוא\"ל.\n\nכתובת ה־IP שלכם היא $3, ומספר החסימה שלכם הוא #$5.\nאנא ציינו את כל הפרטים הללו בכל פנייה למפעילי המערכת.",
+       "autoblockedtext": "כתובת ה־IP שלכם נחסמה באופן אוטומטי כיוון שמשתמש אחר, שנחסם על־ידי $1, השתמש בה.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותכם ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון בחסימה.\n\nבאפשרותכם להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\", אלא אם לא ציינתם כתובת דוא\"ל תקינה ב[[Special:Preferences|העדפות המשתמש שלכם]] או אם נחסמתם משליחת דוא\"ל.\n\nכתובת ה־IP שלכם היא $3, ומספר החסימה שלכם הוא #$5.\nאנא ציינו את כל הפרטים הללו בכל פנייה למפעילי המערכת.",
        "blockednoreason": "לא ניתנה סיבה",
-       "whitelistedittext": "×¢×\9c×\99×\9b×\9d $1 כדי לערוך דפים.",
+       "whitelistedittext": "× ×\93רשת $1 כדי לערוך דפים.",
        "confirmedittext": "עליכם לאמת את כתובת הדוא\"ל שלכם לפני שתוכלו לערוך דפים. אנא הגדירו ואמתו את כתובת הדוא\"ל שלכם באמצעות [[Special:Preferences|העדפות המשתמש]] שלכם.",
        "nosuchsectiontitle": "הפסקה לא נמצאה",
        "nosuchsectiontext": "ניסית לערוך פסקה שאינה קיימת.\nייתכן שהיא הועברה או נמחקה בעת שצפית בדף.",
        "loginreqtitle": "נדרשת כניסה לחשבון",
-       "loginreqlink": "×\9c×\94×\99×\9bנס לחשבון",
-       "loginreqpagetext": "×¢×\9c×\99×\9b×\9d $1 כדי לצפות בדפים אחרים.",
+       "loginreqlink": "×\9b× ×\99ס×\94 לחשבון",
+       "loginreqpagetext": "× ×\93רשת $1 כדי לצפות בדפים אחרים.",
        "accmailtitle": "הסיסמה נשלחה",
        "accmailtext": "סיסמה אקראית עבור [[User talk:$1|$1]] נשלחה אל $2. ניתן לשנותה בדף '''[[Special:ChangePassword|שינוי הסיסמה]]''' לאחר הכניסה.",
        "newarticle": "(חדש)",
        "newarticletext": "הגעתם לדף שעדיין איננו קיים.\nכדי ליצור את הדף הזה, התחילו להקליד בתיבת הטקסט למטה (ראו את [$1 דף העזרה] למידע נוסף).\nאם הגעתם לכאן בטעות, לחצו על כפתור ה<strong>חזרה</strong> (Back) בדפדפן שלכם.",
-       "anontalkpagetext": "----\n'''זהו דף שיחה של משתמש אנונימי שעדיין לא יצר חשבון במערכת, או שהוא לא משתמש בו. כיוון שכך, אנו צריכים להשתמש בכתובת ה־IP כדי לזהותו. ייתכן שכתובת IP זו תייצג מספר משתמשים. אם אתם משתמשים אנונימיים ומרגישים שקיבלתם הודעות בלתי רלוונטיות, אנא [[Special:UserLogin|היכנסו לחשבון]] או [[Special:UserLogin/signup|הירשמו לאתר]] כדי להימנע מבלבול עתידי עם משתמשים אנונימיים נוספים.'''\n----",
+       "anontalkpagetext": "----\n<em>זהו דף שיחה של משתמש אנונימי שעדיין לא יצר חשבון במערכת, או שהוא לא משתמש בו.</em>\nלכן עלינו להשתמש בכתובת ה־IP המספרית כדי לזהותו.\nייתכן שכתובת IP זו תהיה משותפת למספר משתמשים.\nאם אתם משתמשים אנונימיים ומרגישים שקיבלתם הודעות בלתי רלוונטיות, אנא [[Special:UserLogin/signup|צרו חשבון]] או [[Special:UserLogin|היכנסו לחשבון]] כדי להימנע מבלבול עתידי עם משתמשים אנונימיים נוספים.",
        "noarticletext": "אין כרגע טקסט בדף זה.\nבאפשרותכם [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש ביומנים הרלוונטיים],\nאו [{{fullurl:{{FULLPAGENAME}}|action=edit}} לערוך דף זה]</span>.",
        "noarticletext-nopermission": "אין כרגע טקסט בדף זה.\nבאפשרותכם [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים,\nאו <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש ביומנים הרלוונטיים]</span>,\nאך אינכם מורשים ליצור את הדף.",
        "missing-revision": "גרסה #$1 של הדף \"{{FULLPAGENAME}}\" אינה קיימת.\n\nזה נגרם בדרך כלל על־ידי לחיצה על קישור ישן לגרסה קודמת של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "userpage-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.\nאנא בדקו אם ברצונכם ליצור/לערוך דף זה.",
        "userpage-userdoesnotexist-view": "חשבון המשתמש \"$1\" אינו רשום.",
        "blocked-notice-logextract": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
-       "clearyourcache": "'''הערה:''' לאחר השמירה, עליכם לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.\n* '''פיירפוקס / ספארי:''' לחצו על Shift בעת לחיצתכם על '''העלה מחדש''' (Reload), או הקישו על ''Ctrl-F5'' או על ''Ctrl-R'' (או על ''<span dir=\"ltr\">⌘-R</span>'' במחשב מק)\n* '''גוגל כרום:''' לחצו על ''Ctrl-Shift-R'' (או על ''<span dir=\"ltr\">⌘-Shift-R</span>'' במק)\n* '''אינטרנט אקספלורר:''' לחצו על Ctrl בעת לחיצתכם על '''רענן''' (Refresh), או הקישו על ''Ctrl-F5''\n* '''אופרה''': נקו את המטמון ב־''Tools‏ ← Preferences''",
+       "clearyourcache": "<strong>הערה:</strong> לאחר השמירה, ייתכן שתצטרכו לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.\n* <strong>פיירפוקס / ספארי:</strong> לחצו והחזיקו את המקש <em>Shift</em> בעת לחיצתכם על <strong>טעינה מחדש</strong> (Reload), או לחצו על צירוף המקשים <em>Ctrl-F5</em> או <em>Ctrl-R</em>&rlm; (<em><span dir=\"ltr\">⌘-R</span></em> במחשב מק)\n* <strong>גוגל כרום:</strong> לחצו על צירוף המקשים <em>Ctrl-Shift-R</em>&rlm; (<em><span dir=\"ltr\">⌘-Shift-R</span></em> במחשב מק)\n* <strong>אינטרנט אקספלורר:</strong> לחצו והחזיקו את המקש <em>Ctrl</em> בעת לחיצתכם על <strong>רענן</strong> (Refresh), או לחצו על צירוף המקשים <em>Ctrl-F5</em>\n* <strong>אופרה:</strong> נקו את המטמון ב־<em>Tools‏ ← Preferences</em>",
        "usercssyoucanpreview": "'''עצה:''' השתמשו בלחצן \"{{int:showpreview}}\" כדי לבחון את גיליון ה־CSS החדש שלכם לפני השמירה.",
        "userjsyoucanpreview": "'''עצה:''' השתמשו בלחצן \"{{int:showpreview}}\" כדי לבחון את סקריפט ה־JavaScript החדש שלכם לפני השמירה.",
        "usercsspreview": "'''זכרו שזו רק תצוגה מקדימה של גיליון ה־CSS שלכם.'''\n'''הוא טרם נשמר!'''",
        "yourdiff": "הבדלים",
        "copyrightwarning": "'''שימו לב:''' תרומתכם ל{{grammar:תחילית|{{SITENAME}}}} תפורסם תחת תנאי הרישיון $2 (ראו $1 לפרטים נוספים). אם אינכם רוצים שעבודתכם תהיה זמינה לעריכה על־ידי אחרים, שתופץ לעיני כול, ושאחרים יוכלו להעתיק ממנה בציון המקור – אל תפרסמו אותה פה. כמו־כן, אתם מבטיחים לנו כי כתבתם את הטקסט הזה בעצמכם, או העתקתם אותו ממקור שאינו מוגן בזכויות יוצרים. '''אל תעשו שימוש בחומר המוגן בזכויות יוצרים ללא רשות!'''",
        "copyrightwarning2": "'''שימו לב:''' תורמים אחרים עשויים לערוך או אף להסיר את תרומתכם ל{{grammar:תחילית|{{SITENAME}}}}. אם אינכם רוצים שעבודתכם תהיה זמינה לעריכה על־ידי אחרים, אל תפרסמו אותה פה. כמו־כן, אתם מבטיחים לנו כי כתבתם את הטקסט הזה בעצמכם, או העתקתם אותו ממקור שאינו מוגן בזכויות יוצרים (ראו $1 לפרטים נוספים). '''אל תעשו שימוש בחומר המוגן בזכויות יוצרים ללא רשות!'''",
-       "longpageerror": "'''שגיאה: אורך הטקסט ששלחתם הוא {{PLURAL:$1|קילובייט אחד|$1 קילובייטים}}, והוא ארוך יותר מהאורך המרבי של {{PLURAL:$2|קילובייט אחד|$2 קילובייטים}}.'''\nלא ניתן לשמור אותו.",
+       "longpageerror": "<strong>שגיאה: אורך הטקסט ששלחת הוא {{PLURAL:$1|קילובייט אחד|$1 קילובייטים}}, והוא ארוך יותר מהאורך המרבי של {{PLURAL:$2|קילובייט אחד|$2 קילובייטים}}.</strong>\nלא ניתן לשמור אותו.",
        "readonlywarning": "'''אזהרה: בסיס הנתונים ננעל לצורך תחזוקה. בזמן זה לא ניתן לשמור את הטקסט הערוך.'''\nבאפשרותך להעתיק ולהדביק את הטקסט לתוך קובץ טקסט ולשמור אותו למאוחר יותר.\n\nמפעיל המערכת שנעל את בסיס הנתונים סיפק את ההסבר הבא: $1",
        "protectedpagewarning": "'''אזהרה: דף זה מוגן כך שרק מפעילי מערכת יכולים לערוך אותו.'''\nפעולת היומן האחרונה מוצגת להלן:",
        "semiprotectedpagewarning": "'''הערה:''' דף זה מוגן כך שרק משתמשים רשומים יכולים לערוך אותו.\nפעולת היומן האחרונה מוצגת להלן:",
        "template-semiprotected": "(מוגנת חלקית)",
        "hiddencategories": "דף זה כלול ב{{PLURAL:$1|קטגוריה מוסתרת אחת|־$1 קטגוריות מוסתרות}}:",
        "edittools": "<!-- הטקסט הנכתב כאן יוצג מתחת לטופסי עריכת דפים והעלאת קבצים, ולפיכך ניתן לכתוב להציג בו תווים קשים לכתיבה, קטעים מוכנים של טקסט ועוד. -->",
-       "nocreatetext": "ב{{grammar:תחילית|{{SITENAME}}}} קיימת הגבלה על יצירת דפים חדשים.\nבאפשרותך לחזור אחורה ולערוך דף קיים, או [[Special:UserLogin|להיכנס לחשבון]].",
+       "nocreatetext": "ב{{grammar:תחילית|{{SITENAME}}}} קיימת הגבלה על יצירת דפים חדשים.\nבאפשרותך לחזור אחורה ולערוך דף קיים, או [[Special:UserLogin|להיכנס לחשבון או ליצור חשבון]].",
        "nocreate-loggedin": "אינך מורשה ליצור דפים חדשים.",
        "sectioneditnotsupported-title": "עריכת פסקאות אינה נתמכת",
        "sectioneditnotsupported-text": "עריכת פסקאות אינה נתמכת בדף זה.",
        "edit-hook-aborted": "העריכה בוטלה על־ידי Hook.\nלא ניתן הסבר לביטול.",
        "edit-gone-missing": "לא ניתן לעדכן את הדף.\nנראה שהוא נמחק.",
        "edit-conflict": "התנגשות עריכה.",
-       "edit-no-change": "×\94×\9eער×\9bת ×\94תע×\9c×\9e×\94 ×\9eער×\99×\9bת×\9b×\9d, כיוון שלא נעשה שינוי בטקסט.",
+       "edit-no-change": "×\94×\9eער×\9bת ×\94תע×\9c×\9e×\94 ×\9eער×\99×\9bת×\9a כיוון שלא נעשה שינוי בטקסט.",
        "postedit-confirmation-created": "הדף נוצר.",
        "postedit-confirmation-restored": "הדף שוחזר.",
        "postedit-confirmation-saved": "עריכתך נשמרה.",
        "history-feed-title": "היסטוריית גרסאות",
        "history-feed-description": "היסטוריית הגרסאות של הדף הזה בוויקי",
        "history-feed-item-nocomment": "$1 ב־$2",
-       "history-feed-empty": "×\94×\93×£ ×\94×\9e×\91×\95קש ×\9c×\90 × ×\9eצ×\90.\n×\99×\99ת×\9b×\9f ×©×\94×\95×\90 × ×\9e×\97ק, ×\90×\95 ×©×©×\9e×\95 ×©×\95× ×\94.\nנס×\95 [[Special:Search|×\9c×\97פש]] ×\90×\97ר דפים רלוונטיים חדשים.",
+       "history-feed-empty": "×\94×\93×£ ×\94×\9e×\91×\95קש ×\9c×\90 × ×\9eצ×\90.\n×\99×\99ת×\9b×\9f ×©×\94×\95×\90 × ×\9e×\97ק, ×\90×\95 ×©×©×\9e×\95 ×©×\95× ×\94.\n×\91×\90פשר×\95ת×\9a ×\9cנס×\95ת [[Special:Search|×\9c×\97פש]] דפים רלוונטיים חדשים.",
        "rev-deleted-comment": "(תקציר העריכה הוסר)",
        "rev-deleted-user": "(שם המשתמש הוסר)",
        "rev-deleted-event": "(פעולת היומן הוסרה)",
        "suppressionlog": "יומן העלמות",
        "suppressionlogtext": "להלן רשימת המחיקות והחסימות הכוללות תוכן המוסתר ממפעילי המערכת.\nראו את [[Special:BlockList|רשימת החסומים]] לרשימת החסימות הפעילות כעת.",
        "mergehistory": "מיזוג גרסאות של דפים",
-       "mergehistory-header": "×\93×£ ×\96×\94 ×\9e×\90פשר ×\9c×\9b×\9d ×\9c×\9e×\96×\92 ×\92רס×\90×\95ת ×\9e×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\93×£ ×©×\9c ×\93×£ ×\9eק×\95ר ×\9cת×\95×\9a ×\93×£ ×\97×\93ש ×\99×\95תר.\n×\90× ×\90 ×\95×\93×\90×\95 ×©×©×\99× ×\95×\99 ×\96×\94 ×\9c×\90 ×\99פ×\92×¢ ×\91×\94×\9eש×\9b×\99×\95ת ×\94ש×\99× ×\95×\99×\99×\9d ×\91×\93×£ ×\94×\99ש×\9f.\n\n'''×\9cפ×\97×\95ת ×\92רס×\94 ×\90×\97ת ×©×\9c ×\93×£ ×\94×\9eק×\95ר ×\97×\99×\99×\91ת ×\9c×\94×\99ש×\90ר ×\91×\95.'''",
+       "mergehistory-header": "×\93×£ ×\96×\94 ×\9e×\90פשר ×\9c×\9a ×\9c×\9e×\96×\92 ×\92רס×\90×\95ת ×\9eת×\95×\9a ×\94×\99ס×\98×\95ר×\99×\99ת ×\92רס×\90×\95ת ×©×\9c ×\93×£ ×\90×\97×\93 (×\93×£ ×\94×\9eק×\95ר) ×\9cת×\95×\9a ×\93×£ ×\97×\93ש.\n×\99ש ×\9c×\95×\95×\93×\90 ×©×\94×\9e×\99×\96×\95×\92 ×\9c×\90 ×\99פ×\92×¢ ×\91×\94×\9eש×\9b×\99×\95ת ×\94ש×\99× ×\95×\99×\99×\9d ×\91×\93×£ ×\94×\99ש×\9f.",
        "mergehistory-box": "מיזוג גרסאות של שני דפים:",
        "mergehistory-from": "דף המקור:",
        "mergehistory-into": "דף היעד:",
        "mergehistory-list": "היסטוריית עריכות בת מיזוג",
-       "mergehistory-merge": "ניתן למזג את הגרסאות הבאות של [[:$1]] לתוך [[:$2]]. אנא השתמשו בלחצני האפשרות כדי לבחור זמן שרק גרסאות שנוצרו בו ולפניו ימוזגו. שימוש בקישורי הניווט יאפס עמודה זו.",
+       "mergehistory-merge": "ניתן למזג את הגרסאות הבאות של [[:$1]] לתוך [[:$2]].\nיש להשתמש בלחצני האפשרות כדי לבחור זמן שרק גרסאות שנוצרו בו ולפניו ימוזגו.\nשימוש בקישורי הניווט יאפס עמודה זו.",
        "mergehistory-go": "הצגת עריכות בנות מיזוג",
        "mergehistory-submit": "מיזוג",
        "mergehistory-empty": "אין גרסאות למיזוג.",
        "mergehistory-success": "{{PLURAL:$3|גרסה אחת|$3 גרסאות}} של [[:$1]] מוזגו בהצלחה לתוך [[:$2]].",
-       "mergehistory-fail": "×\9c×\90 × ×\99ת×\9f ×\9c×\91צע ×\90ת ×\9e×\99×\96×\95×\92 ×\94×\92רס×\90×\95ת, ×\90× ×\90 ×\91×\93ק×\95 שנית את הגדרות הדף והזמן.",
+       "mergehistory-fail": "×\9c×\90 × ×\99ת×\9f ×\9c×\91צע ×\90ת ×\9e×\99×\96×\95×\92 ×\94×\92רס×\90×\95ת, ×\99ש ×\9c×\91×\93×\95ק שנית את הגדרות הדף והזמן.",
        "mergehistory-fail-toobig": "לא ניתן לבצע את מיזוג הגרסאות כיוון שצריך להעביר יותר גרסאות מהמגבלה, שהיא {{PLURAL:$1|גרסה אחת|‏‏֫$1 גרסאות}}.",
        "mergehistory-no-source": "דף המקור $1 אינו קיים.",
        "mergehistory-no-destination": "דף היעד $1 אינו קיים.",
        "pagemerge-logentry": "מיזג את [[$1]] לתוך [[$2]] (גרסאות עד $3)",
        "revertmerge": "ביטול המיזוג",
        "mergelogpagetext": "זוהי רשימה של המיזוגים האחרונים של גרסאות מדף אחד לתוך דף שני.",
-       "history-title": "$1: היסטוריית גרסאות",
-       "difference-title": "$1: הבדלים בין גרסאות",
-       "difference-title-multipage": "$1 ו{{GRAMMAR:תחילית|$2}}: הבדלים בין דפים",
+       "history-title": "היסטוריית גרסאות של הדף \"$1\"",
+       "difference-title": "הבדלים בין גרסאות בדף \"$1\"",
+       "difference-title-multipage": "הבדלים בין הדף \"$1\" לבין הדף \"$2\"",
        "difference-multipage": "(הבדלים בין דפים)",
        "lineno": "שורה $1:",
        "compareselectedversions": "השוואת הגרסאות שנבחרו",
        "shown-title": "הצגת {{PLURAL:$1|תוצאה אחת|$1 תוצאות}} בדף",
        "viewprevnext": "צפייה ב: ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''קיים דף בשם \"[[:$1]]\" באתר זה.'''",
-       "searchmenu-new": "<strong>'''×\99צ×\99רת ×\94×\93×£ \"[[:$1]]\" ×\91×\90תר ×\96×\94.'''</strong> \n{{PLURAL:$2|0=|ר×\90×\95 ×\92×\9d ×\90ת ×\94×\93×£ ×©× ×\9eצ×\90 ×\91×\97×\99פ×\95ש ×©×\9c×\9b×\9d.|ר×\90×\95 ×\92×\9d ×\90ת ×ª×\95צ×\90×\95ת ×\94×\97×\99פ×\95ש ×©×\9c×\9b×\9d.}}",
+       "searchmenu-new": "<strong>'''×\99צ×\99רת ×\94×\93×£ \"[[:$1]]\" ×\91×\90תר ×\94×\95×\95×\99ק×\99 ×\94×\96×\94.'''</strong>\n{{PLURAL:$2|0=|ר' ×\92×\9d ×\90ת ×\94×\93×£ ×©× ×\9eצ×\90 ×\91×\97×\99פ×\95ש.|ר' ×\92×\9d ×\90ת ×ª×\95צ×\90×\95ת ×\94×\97×\99פ×\95ש.}}",
        "searchprofile-articles": "דפי תוכן",
        "searchprofile-images": "מולטימדיה",
        "searchprofile-everything": "הכול",
        "searchall": "הכול",
        "showingresults": "{{PLURAL:$1|מוצגת תוצאה <strong>אחת</strong>|מוצגות עד <strong>$1</strong> תוצאות}} החל ממספר <strong>$2</strong>:",
        "showingresultsinrange": "{{PLURAL:$1|מוצגת תוצאה <strong>אחת</strong>|מוצגות עד <strong>$1</strong> תוצאות}} בין המספרים <strong>$2</strong> ו‏‏־<strong>$3</strong>:",
-       "showingresultsheader": "{{PLURAL:$5|תוצאה '''$1''' מתוך '''$3'''|תוצאות '''$1 - $2''' מתוך '''$3'''}} עבור '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|תוצאה <strong>$1</strong> מתוך <strong>$3</strong>|תוצאות <strong>$1 - $2</strong> מתוך <strong>$3</strong>}}",
        "search-nonefound": "לא נמצאו תוצאות המתאימות לחיפוש.",
        "powersearch-legend": "חיפוש מתקדם",
        "powersearch-ns": "חיפוש על־פי מרחבי שם:",
        "preferences": "העדפות",
        "mypreferences": "העדפות",
        "prefs-edits": "מספר עריכות:",
-       "prefsnologintext2": "×\90× ×\90 ×\94×\99×\9bנס×\95 לחשבון כדי לשנות העדפות משתמש.",
+       "prefsnologintext2": "× ×\93רשת ×\9b× ×\99ס×\94 לחשבון כדי לשנות העדפות משתמש.",
        "prefs-skin": "עיצוב",
        "skin-preview": "תצוגה מקדימה",
        "datedefault": "ברירת המחדל",
        "timezoneregion-europe": "אירופה",
        "timezoneregion-indian": "האוקיינוס ההודי",
        "timezoneregion-pacific": "האוקיינוס השקט",
-       "allowemail": "קבלת דוא\"ל ממשתמשים אחרים",
+       "allowemail": "×\9c×\90פשר ×§×\91×\9cת ×\93×\95×\90\"×\9c ×\9e×\9eשת×\9eש×\99×\9d ×\90×\97ר×\99×\9d",
        "prefs-searchoptions": "חיפוש",
        "prefs-namespaces": "מרחבי שם",
        "default": "ברירת מחדל",
        "prefs-help-variant": "סוג הכתב המועדף להצגת דפי התוכן באתר ויקי זה.",
        "yournick": "חתימה:",
        "prefs-help-signature": "על הודעות בדפי שיחה יש לחתום באמצעות הטקסט \"<nowiki>~~~~</nowiki>\", שיומר לחתימה שלך ואחריה תאריך ושעה.",
-       "badsig": "×\97ת×\99×\9e×\94 ×\9eס×\95×\92ננת ×©×\92×\95×\99×\94.\n×\90× ×\90 ×\91×\93ק×\95 את תגיות ה־HTML.",
-       "badsiglength": "×\97ת×\99×\9eת×\9b×\9d ארוכה מדי.\nאורך החתימה המרבי הוא {{PLURAL:$1|תו אחד|$1 תווים}}.",
+       "badsig": "×\97ת×\99×\9e×\94 ×\9eס×\95×\92ננת ×©×\92×\95×\99×\94.\n× ×\90 ×\9c×\91×\93×\95ק את תגיות ה־HTML.",
+       "badsiglength": "×\97ת×\99×\9eת×\9a ארוכה מדי.\nאורך החתימה המרבי הוא {{PLURAL:$1|תו אחד|$1 תווים}}.",
        "yourgender": "איזה תיאור מתאים לך?",
        "gender-unknown": "איני רוצה לומר",
        "gender-male": "הוא עורך דפים בוויקי",
        "prefs-tokenwatchlist": "אסימון",
        "prefs-diffs": "הבדלים בין גרסאות",
        "prefs-help-prefershttps": "העדפה זו תיכנס לתוקף בכניסה הבאה לחשבון.",
+       "prefswarning-warning": "ביצעת שינויים בהעדפות שלך, והם עדיין לא נשמרו.\nעזיבת דף זה ללא לחיצה על \"$1\" תגרום לכך שההעדפות שלך לא יעודכנו.",
        "prefs-tabs-navigation-hint": "טיפ: ניתן להשתמש במקשי החצים הימני והשמאלי כדי לנווט בין הלשוניות ברשימת הלשוניות.",
        "email-address-validity-valid": "כתובת הדוא\"ל נראית תקינה",
        "email-address-validity-invalid": "יש להקליד כתובת דוא\"ל תקינה",
        "userrights-groupsmember-auto": "{{GENDER:$2|חבר|חברה}} אוטומטית ב{{PLURAL:$1|קבוצה|קבוצות}}:",
        "userrights-groups-help": "באפשרותכם לשנות את הקבוצות שמשתמש זה חבר בהן:\n* תיבה מסומנת פירושה שהמשתמש חבר בקבוצה.\n* תיבה בלתי מסומנת פירושה שהמשתמש אינו חבר בקבוצה.\n* סימון * פירושו שלא תוכלו להסיר משתמש מהקבוצה מרגע שהוספתם אותו אליה, או להפך.",
        "userrights-reason": "סיבה:",
-       "userrights-no-interwiki": "×\90×\99×\9f ×\9c×\9b×\9d הרשאה לערוך הרשאות משתמש באתרים אחרים.",
+       "userrights-no-interwiki": "×\90×\99×\9f ×\9c×\9a הרשאה לערוך הרשאות משתמש באתרים אחרים.",
        "userrights-nodatabase": "בסיס הנתונים $1 אינו קיים או אינו מקומי.",
        "userrights-nologin": "עליכם [[Special:UserLogin|להיכנס לחשבון]] עם הרשאות מתאימות כדי לשנות הרשאות של משתמשים.",
-       "userrights-notallowed": "×\90×\99×\9f ×\9c×\9b×\9d הרשאה להוסיף או להסיר הרשאות של משתמשים.",
+       "userrights-notallowed": "×\90×\99×\9f ×\9c×\9a הרשאה להוסיף או להסיר הרשאות של משתמשים.",
        "userrights-changeable-col": "קבוצות שבאפשרותכם לשנות",
        "userrights-unchangeable-col": "קבוצות שאין באפשרותכם לשנות",
        "userrights-conflict": "התנגשות בין שינויי הרשאות משתמש! אנא בדקו את השינויים שלכם ואשרו אותם.",
        "action-import": "לייבא דפים מאתר ויקי אחר",
        "action-importupload": "לייבא דפים באמצעות העלאת קובץ",
        "action-patrol": "לסמן עריכות של אחרים כבדוקות",
-       "action-autopatrol": "×\9cס×\9e×\9f ×\90ת ×¢×¨×\99×\9b×\95ת×\99ך כבדוקות",
+       "action-autopatrol": "×\9cס×\9e×\9f ×\90ת ×\94ער×\99×\9b×\95ת ×©×\9cך כבדוקות",
        "action-unwatchedpages": "לצפות ברשימת הדפים שאינם במעקב",
        "action-mergehistory": "למזג את ההיסטוריה של דף זה",
        "action-userrights": "לערוך את כל הרשאות המשתמש",
        "action-sendemail": "לשלוח דואר אלקטרוני",
        "action-editmywatchlist": "לערוך את רשימת המעקב שלך",
        "action-viewmywatchlist": "לצפות ברשימת המעקב שלך",
-       "action-viewmyprivateinfo": "×\9cצפ×\95ת ×\91×\9e×\99×\93×¢ ×\94פר×\98×\99 ×©×\9c×\9b×\9d",
-       "action-editmyprivateinfo": "×\9cער×\95×\9a ×\90ת ×\94×\9e×\99×\93×¢ ×\94פר×\98×\99 ×©×\9c×\9b×\9d",
+       "action-viewmyprivateinfo": "×\9cצפ×\95ת ×\91×\9e×\99×\93×¢ ×\94פר×\98×\99 ×©×\9c×\9a",
+       "action-editmyprivateinfo": "×\9cער×\95×\9a ×\90ת ×\94×\9e×\99×\93×¢ ×\94פר×\98×\99 ×©×\9c×\9a",
        "nchanges": "{{PLURAL:$1|שינוי אחד|$1 שינויים}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|מאז ביקורך האחרון}}",
        "enhancedrc-history": "היסטוריה",
        "uploadbtn": "העלאה",
        "reuploaddesc": "ביטול ההעלאה וחזרה לטופס העלאת קבצים לשרת",
        "upload-tryagain": "שליחת התיאור החדש של הקובץ",
-       "uploadnologin": "לא נכנסתם לחשבון",
-       "uploadnologintext": "×¢×\9c×\99×\9b×\9d $1 כדי להעלות קבצים.",
+       "uploadnologin": "לא נכנסת לחשבון",
+       "uploadnologintext": "× ×\93רשת $1 כדי להעלות קבצים.",
        "upload_directory_missing": "שרת האינטרנט אינו יכול ליצור את תיקיית ההעלאות ($1) החסרה.",
        "upload_directory_read_only": "שרת האינטרנט אינו יכול לכתוב בתיקיית ההעלאות ($1).",
        "uploaderror": "שגיאה בהעלאת הקובץ",
        "filename-tooshort": "שם הקובץ קצר מדי",
        "filetype-banned": "אסור להעלות קבצים מהסוג הזה.",
        "verification-error": "קובץ זה לא עבר את תהליך אימות הקבצים",
-       "hookaborted": "השינוי שניסית לבצע הופסק על ידי מבנה Hook של הרחבה",
+       "hookaborted": "השינוי שניסית לבצע הופסק על־ידי הרחבה.",
        "illegal-filename": "שם הקובץ אינו מותר להעלאה",
        "overwrite": "דריסת קובץ קיים אינה מותרת",
        "unknown-error": "אירעה שגיאה בלתי ידועה",
        "tmp-write-error": "שגיאה בכתיבה לקובץ הזמני",
        "large-file": "מומלץ שהקבצים לא יהיו גדולים יותר מ־$1 (גודל הקובץ שהעליתם הוא $2).",
        "largefileserver": "גודל הקובץ חורג ממגבלת השרת.",
-       "emptyfile": "נראה שהקובץ שהעליתם ריק. ייתכן שהסיבה לכך היא שגיאת הקלדה בשם הקובץ. אנא ודאו שזהו הקובץ שברצונכם להעלות.",
+       "emptyfile": "נראה שהקובץ שהעלית ריק.\nייתכן שהסיבה לכך היא שגיאת הקלדה בשם הקובץ.\nיש לוודא שזה הקובץ שברצונך להעלות.",
        "windows-nonascii-filename": "אתר ויקי זה אינו תומך בשמות קבצים עם תווים מיוחדים או תווים שאינם באנגלית.",
        "fileexists": "קובץ בשם הזה כבר קיים, אנא בדקו את <strong>[[:$1]]</strong> אם אינכם בטוחים שברצונכם להחליף אותו.\n[[$1|thumb]]",
        "filepageexists": "דף תיאור הקובץ עבור קובץ זה כבר נוצר ב<strong>[[:$1]]</strong>, אך לא קיים קובץ בשם זה.\nתיאור הקובץ שתכתבו לא יופיע בדף תיאור הקובץ.\nכדי לגרום לו להופיע שם, יהיה עליכם לערוך אותו ידנית. [[$1|thumb]]",
        "fileexists-extension": "קובץ עם שם דומה כבר קיים: [[$2|thumb]]\n* שם הקובץ המועלה: <strong>[[:$1]]</strong>\n* שם הקובץ הקיים: <strong>[[:$2]]</strong>\nאולי כדאי לתת לקובץ שם ספציפי יותר?",
-       "fileexists-thumbnail-yes": "×\94ק×\95×\91×¥ ×\94×\95×\90 ×\9bנר×\90×\94 ×ª×\9e×\95× ×\94 ×\9e×\95ק×\98נת (×\9e×\9e×\95×\96ערת). [[$1|thumb]]\n×\90× ×\90 ×\91×\93ק×\95 ×\90ת ×\94ק×\95×\91×¥ <strong>[[:$1]]</strong>.\n×\90×\9d ×\94ק×\95×\91×¥ ×©×\91×\93קת×\9d הוא אותה התמונה בגודל מקורי, אין זה הכרחי להעלות גם תמונה ממוזערת.",
-       "file-thumbnail-no": "ש×\9d ×\94ק×\95×\91×¥ ×\9eת×\97×\99×\9c ×¢×\9d <strong>$1</strong>. × ×¨×\90×\94 ×©×\96×\95×\94×\99 ×ª×\9e×\95× ×\94 ×\9e×\95ק×\98נת (×\9e×\9e×\95×\96ערת).\n×\90×\9d ×\94ת×\9e×\95× ×\94 ×\91×\92×\95×\93×\9c ×\9e×\9c×\90 ×\9eצ×\95×\99×\94 ×\91רש×\95ת×\9b×\9d, ×\90× ×\90 ×\94×¢×\9c×\95 ×\90×\95ת×\94 ×\95×\9c×\90 ×\90ת ×\94ת×\9e×\95× ×\94 ×\94×\9e×\9e×\95×\96ערת; ×\90×\97רת, ×\90× ×\90 ×©× ×\95 את שם הקובץ.",
+       "fileexists-thumbnail-yes": "נר×\90×\94 ×©×\94ק×\95×\91×¥ ×\94×\95×\90 ×ª×\9e×\95× ×\94 ×\9e×\95ק×\98נת (×\9e×\9e×\95×\96ערת).\n[[$1|thumb]]\n×\99ש ×\9c×\91×\93×\95ק ×\90ת ×\94ק×\95×\91×¥ <strong>[[:$1]]</strong>.\n×\90×\9d ×\94ק×\95×\91×¥ ×©×\91×\93קת הוא אותה התמונה בגודל מקורי, אין זה הכרחי להעלות גם תמונה ממוזערת.",
+       "file-thumbnail-no": "ש×\9d ×\94ק×\95×\91×¥ ×\9eת×\97×\99×\9c ×\91Ö¾<strong>$1</strong>.\nנר×\90×\94 ×©×\96×\95×\94×\99 ×ª×\9e×\95× ×\94 ×\9e×\95ק×\98נת (×\9e×\9e×\95×\96ערת).\n×\90×\9d ×\94ת×\9e×\95× ×\94 ×\91×\92×\95×\93×\9c ×\9e×\9c×\90 ×\9eצ×\95×\99×\94 ×\91רש×\95ת×\9a, ×\99ש ×\9c×\94×¢×\9c×\95ת ×\90×\95ת×\94 ×\95×\9c×\90 ×\90ת ×\94ת×\9e×\95× ×\94 ×\94×\9e×\9e×\95×\96ערת; ×\90×\97רת, ×\99ש ×\9cשנ×\95ת את שם הקובץ.",
        "fileexists-forbidden": "קובץ בשם זה כבר קיים, ואינכם יכולים להחליף אותו.\nאם אתם עדיין מעוניינים להעלות קובץ זה, אנא חזרו לדף הקודם והעלו את הקובץ תחת שם חדש.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "קובץ בשם זה כבר קיים כקובץ משותף.\nאם אתם עדיין מעוניינים להעלות קובץ זה, אנא חזרו לדף הקודם והעלו את הקובץ תחת שם חדש.\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "קובץ זה זהה {{PLURAL:$1|לקובץ הבא|לקבצים הבאים}}:",
-       "file-deleted-duplicate": "ק×\95×\91×¥ ×\96×\94×\94 ×\9cק×\95×\91×¥ ×\96×\94 ([[:$1]]) × ×\9e×\97ק ×\91×¢×\91ר.\n×\90× ×\90 ×\91×\93ק×\95 ×\90ת ×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\9e×\97×\99ק×\94 ×©×\9c ×\94ק×\95×\91×¥ ×\9cפנ×\99 ×©×ª×¢×\9c×\95 ×\90×\95תו מחדש.",
-       "file-deleted-duplicate-notitle": "ק×\95×\91×¥ ×\96×\94×\94 ×\9cק×\95×\91×¥ ×\96×\94 × ×\9e×\97ק ×\91×¢×\91ר, ×\95×\94×\9b×\95תרת ×©×\9c×\95 ×\94×\95×¢×\9c×\9e×\94.\n×\90× ×\90 ×\91קש×\95 ×\9e×\9e×\99ש×\94×\95 ×©×\99×\9b×\95×\9c ×\9cר×\90×\95ת × ×ª×\95× ×\99×\9d ×¢×\9c ×§×\91צ×\99×\9d ×©×\94×\95×¢×\9c×\9e×\95 ×\9c×\91×\93×\95ק ×\90ת ×\94×\9eצ×\91 ×\9cפנ×\99 ×©×ª×¢×\9c×\95 ×\90×\95ת×\95 מחדש.",
+       "file-deleted-duplicate": "ק×\95×\91×¥ ×\96×\94×\94 ×\9cק×\95×\91×¥ ×\96×\94 ([[:$1]]) × ×\9e×\97ק ×\91×¢×\91ר.\n×\99ש ×\9c×\91×\93×\95ק ×\90ת ×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\9e×\97×\99ק×\94 ×©×\9c ×\94ק×\95×\91×¥ ×\9cפנ×\99 ×\94×¢×\9c×\90תו מחדש.",
+       "file-deleted-duplicate-notitle": "ק×\95×\91×¥ ×\96×\94×\94 ×\9cק×\95×\91×¥ ×\96×\94 × ×\9e×\97ק ×\91×¢×\91ר, ×\95×\94×\9b×\95תרת ×©×\9c×\95 ×\94×\95×¢×\9c×\9e×\94.\n×\99ש ×\9c×\91קש ×\9e×\9eשת×\9eש ×©×\99×\9b×\95×\9c ×\9cר×\90×\95ת × ×ª×\95× ×\99×\9d ×¢×\9c ×§×\91צ×\99×\9d ×©×\94×\95×¢×\9c×\9e×\95 ×\9c×\91×\93×\95ק ×\90ת ×\94×\9eצ×\91 ×\9cפנ×\99 ×\94×¢×\9c×\90ת ×\94ק×\95×\91×¥ מחדש.",
        "uploadwarning": "אזהרת העלאת קבצים",
        "uploadwarning-text": "אנא שנו את תיאור הקובץ שלמטה ונסו שוב.",
        "savefile": "שמירת קובץ",
        "copyuploaddisabled": "העלאת קבצים מכתובת URL מבוטלת.",
        "uploaddisabledtext": "אפשרות העלאת הקבצים מבוטלת.",
        "php-uploaddisabledtext": "אפשרות העלאת הקבצים מבוטלת ברמת PHP. אנא בדקו את ההגדרה file_uploads.",
-       "uploadscripted": "הקובץ כולל קוד סקריפט או HTML שעשוי להתפרש או להתבצע בטעות על ידי הדפדפן.",
+       "uploadscripted": "הקובץ כולל קוד סקריפט או HTML שעשוי להתפרש או להתבצע בטעות על־ידי הדפדפן.",
        "uploadscriptednamespace": "קובץ ה‏‏֫־SVG הזה כולל מרחב שם בלתי חוקי: '$1'",
        "uploadinvalidxml": "לא ניתן לפרש את ה־XML בקובץ שהועלה.",
        "uploadvirus": "הקובץ מכיל וירוס!\nפרטים:\n<div dir=\"ltr\">$1</div>",
        "upload-source": "קובץ המקור",
        "sourcefilename": "שם הקובץ:",
        "sourceurl": "כתובת URL של המקור:",
-       "destfilename": "ש×\9e×\95ר קובץ בשם:",
+       "destfilename": "ש×\9e×\99רת ×\94קובץ בשם:",
        "upload-maxfilesize": "גודל הקובץ המרבי: $1",
        "upload-description": "תיאור הקובץ",
        "upload-options": "אפשרויות העלאה",
        "watchthisupload": "מעקב אחרי קובץ זה",
        "filewasdeleted": "קובץ בשם זה כבר הועלה בעבר, ולאחר מכן נמחק. אנא בדקו את הדף $1 לפני שתמשיכו להעלותו שנית.",
-       "filename-bad-prefix": "ש×\9d ×\94ק×\95×\91×¥ ×©×\90ת×\9d ×\9e×¢×\9c×\99×\9d ×\9eת×\97×\99×\9c ×¢×\9d '''\"$1\"''', ×©×\94×\95×\90 ×©×\9d ×©×\90×\99× ×\95 ×\9eת×\90ר ×\90ת ×\94ק×\95×\91×¥ ×\95×\91×\93ר×\9a ×\9b×\9c×\9c ×\9e×\95×\9bנס ×\90×\95×\98×\95×\9e×\98×\99ת ×¢×\9c ×\99×\93×\99 ×\9eצ×\9c×\9e×\95ת ×\93×\99×\92×\99×\98×\9c×\99×\95ת. ×\90× ×\90 ×\91×\97ר×\95 שם מתאים יותר לקובץ, שיתאר את תכניו.",
+       "filename-bad-prefix": "ש×\9d ×\94ק×\95×\91×¥ ×©×\90ת×\9d ×\9e×¢×\9c×\99×\9d ×\9eת×\97×\99×\9c ×\91Ö¾<strong>\"$1\"</strong>, ×©×\94×\95×\90 ×©×\9d ×©×\90×\99× ×\95 ×\9eת×\90ר ×\90ת ×\94ק×\95×\91×¥ ×\95×\91×\93ר×\9a ×\9b×\9c×\9c ×\9e×\95קצ×\94 ×\90×\95×\98×\95×\9e×\98×\99ת ×¢×\9cÖ¾×\99×\93×\99 ×\9eצ×\9c×\9e×\95ת ×\93×\99×\92×\99×\98×\9c×\99×\95ת.\n×\99ש ×\9c×\91×\97×\95ר שם מתאים יותר לקובץ, שיתאר את תכניו.",
        "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-failure-subj": "בעיה בהעלאה",
-       "upload-failure-msg": "הייתה בעיה עם הקובץ שהעליתם מהכתובת [$2]:\n\n$1",
+       "upload-failure-msg": "הייתה בעיה עם הקובץ שהעלית מהכתובת [$2]:\n\n$1",
        "upload-warning-subj": "אזהרה בהעלאה",
        "upload-warning-msg": "הייתה בעיה עם הקובץ שהעליתם מהכתובת [$2]. באפשרותכם לחזור ל[[Special:Upload/stash/$1|טופס ההעלאה]] כדי לתקן בעיה זו.",
        "upload-proto-error": "פרוטוקול שגוי",
        "sharedupload-desc-edit": "זהו קובץ מתוך $1 וניתן להשתמש בו גם במיזמים אחרים.\nניתן לערוך את התקציר שלו ב[$2 דף תיאור הקובץ] שם.",
        "sharedupload-desc-create": "זהו קובץ מתוך $1 וניתן להשתמש בו גם במיזמים אחרים.\nניתן לערוך את התקציר שלו ב[$2 דף תיאור הקובץ] שם.",
        "filepage-nofile": "לא קיים קובץ בשם זה.",
-       "filepage-nofile-link": "×\9c×\90 ×§×\99×\99×\9d ×§×\95×\91×¥ ×\91ש×\9d ×\96×\94, ×\90×\9a ×\91×\90פשר×\95ת×\9b×\9d [$1 להעלות אחד].",
+       "filepage-nofile-link": "×\9c×\90 ×§×\99×\99×\9d ×§×\95×\91×¥ ×\91ש×\9d ×\96×\94, ×\90×\9a ×\91×\90פשר×\95ת×\9a [$1 להעלות אחד].",
        "uploadnewversion-linktext": "העלאת גרסה חדשה של קובץ זה",
        "shared-repo-from": "מתוך $1",
        "shared-repo": "מקום איחסון משותף",
        "shared-repo-name-wikimediacommons": "ויקישיתוף",
        "filepage.css": "/* הסגנונות הנכתבים כאן יוכללו בדף תיאור הקובץ, כולל באתרי ויקי זרים */",
-       "upload-disallowed-here": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9b×\9d לדרוס את הקובץ הזה.",
+       "upload-disallowed-here": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a לדרוס את הקובץ הזה.",
        "filerevert": "שחזור $1",
        "filerevert-legend": "שחזור קובץ",
        "filerevert-intro": "אתם עומדים לשחזר את הקובץ '''[[Media:$1|$1]]''' ל[$4 גרסה מ־$3, $2].",
        "filerevert-comment": "סיבה:",
        "filerevert-defaultcomment": "שוחזר לגרסה מ־$2, $1",
        "filerevert-submit": "שחזור",
-       "filerevert-success": "'''[[Media:$1|$1]]''' שוחזרה ל[$4 גרסה מ־$3, $2].",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> שוחזר ל[$4 גרסה מ־$3, $2].",
        "filerevert-badversion": "אין גרסה מקומית קודמת של הקובץ שהועלתה בתאריך המבוקש.",
        "filedelete": "מחיקת $1",
        "filedelete-legend": "מחיקת קובץ",
        "randomincategory": "דף אקראי בקטגוריה",
        "randomincategory-invalidcategory": "\"$1\" אינו שם תקין לקטגוריה.",
        "randomincategory-nopages": "אין דפים בקטגוריה [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "קבלת דף אקראי מהקטגוריה: $1 $2.",
-       "randomincategory-selectcategory-submit": "מעבר",
+       "randomincategory-category": "קטגוריה:",
+       "randomincategory-legend": "דף אקראי בקטגוריה",
        "randomredirect": "הפניה אקראית",
        "randomredirect-nopages": "אין הפניות במרחב השם \"$1\".",
        "statistics": "סטטיסטיקות",
        "doubleredirects": "הפניות כפולות",
        "doubleredirectstext": "בדף הזה מופיעה רשימת דפי הפניה שמפנים לדפי הפניה אחרים.\nכל שורה מכילה קישור לשתי ההפניות הראשונות, וכן את היעד של ההפניה השנייה, שהיא לרוב היעד ה\"אמיתי\" של ההפניה, שההפניה הראשונה אמורה להצביע אליו.\nפריטים <del>מחוקים</del> כבר תוקנו.",
        "double-redirect-fixed-move": "הדף [[$1]] הועבר.\nהוא עודכן אוטומטית ועכשיו מפנה לדף [[$2]].",
-       "double-redirect-fixed-maintenance": "תיקון אוטומטי של הפניה כפולה מ[[$1]] ל[[$2]] במשימת תחזוקה.",
+       "double-redirect-fixed-maintenance": "תיקון אוטומטי של הפניה כפולה מהדף [[$1]] אל הדף [[$2]] במשימת תחזוקה.",
        "double-redirect-fixer": "מתקן הפניות",
        "brokenredirects": "הפניות לא תקינות",
        "brokenredirectstext": "ההפניות שלהלן מפנות לדפים שאינם קיימים:",
        "protectedpages-timestamp": "תאריך ושעה",
        "protectedpages-page": "דף",
        "protectedpages-expiry": "זמן פקיעה",
-       "protectedpages-performer": "הוגן על ידי",
+       "protectedpages-performer": "הוגן על־ידי",
        "protectedpages-params": "פרמטרים להגנה",
        "protectedpages-reason": "סיבה",
        "protectedpages-unknown-timestamp": "לא ידוע",
        "booksources": "משאבי ספרות חיצוניים",
        "booksources-search-legend": "חיפוש משאבי ספרות חיצוניים",
        "booksources-isbn": "מסת\"ב (ISBN):",
-       "booksources-go": "הצגה",
+       "booksources-search": "חיפוש",
        "booksources-text": "להלן רשימת קישורים לאתרים אחרים המוכרים ספרים חדשים ויד־שנייה, ושבהם עשוי להיות מידע נוסף לגבי ספרים שאתם מחפשים:",
        "booksources-invalid-isbn": "המסת\"ב שניתן כנראה אינו תקין; אנא בדקו אם ביצעתם טעויות בהעתקה מהמידע המקורי.",
        "specialloguserlabel": "בוצעו על־ידי המשתמש:",
        "speciallogtitlelabel": "יעד (כותרת או משתמש):",
        "log": "יומנים",
        "all-logs-page": "כל היומנים הציבוריים",
-       "alllogstext": "תצוגה משולבת של כל סוגי היומנים הזמינים ב{{grammar:תחילית|{{SITENAME}}}}.\nניתן לצמצם את התצוגה על ידי בחירת סוג היומן, שם המשתמש (תלוי רישיות) או הדף המושפע (גם כן תלוי רישיות).",
+       "alllogstext": "תצוגה משולבת של כל סוגי היומנים הזמינים ב{{grammar:תחילית|{{SITENAME}}}}.\nניתן לצמצם את התצוגה על־ידי בחירת סוג היומן, שם המשתמש (תלוי רישיות) או הדף המושפע (גם כן תלוי רישיות).",
        "logempty": "אין פריטים תואמים ביומן.",
        "log-title-wildcard": "חיפוש כותרות המתחילות באותיות אלה",
        "showhideselectedlogentries": "הצגת/הסתרת פעולות היומן שנבחרו",
        "allpagessubmit": "הצגה",
        "allpagesprefix": "הדפים ששמם מתחיל ב:",
        "allpagesbadtitle": "כותרת הדף שניתנה הייתה בלתי־תקינה או שהייתה בה קידומת של קישור לשפה אחרת או לוויקי אחר.\nייתכן שהיא מכילה תו אחד או יותר האסורים לשימוש בכותרות.",
-       "allpages-bad-ns": "×\90×\99×\9f ×\9eר×\97×\91 ×©×\9d ×\91ש×\9d \"$1\".",
+       "allpages-bad-ns": "×\9eר×\97×\91 ×\94ש×\9d \"$1\" ×\9c×\90 ×§×\99×\99×\9d ×\91{{grammar:ת×\97×\99×\9c×\99ת|{{SITENAME}}}}.",
        "allpages-hide-redirects": "הסתרת הפניות",
        "cachedspecial-viewing-cached-ttl": "זוהי גרסה שמורה בזיכרון המטמון של דף זה, שעשויה להיות בת $1.",
        "cachedspecial-viewing-cached-ts": "זוהי גרסה שמורה בזיכרון המטמון של דף זה, שעשויה שלא להיות מעודכנת.",
        "trackingcategories-nodesc": "התיאור אינו זמין.",
        "trackingcategories-disabled": "הקטגוריה מבוטלת",
        "mailnologin": "אין כתובת לשליחה",
-       "mailnologintext": "×¢×\9c×\99×\9b×\9d [[Special:UserLogin|×\9c×\94×\99×\9bנס ×\9c×\97ש×\91×\95×\9f]] ×\95×\9c×\94×\92×\93×\99ר ×\9cעצ×\9e×\9b×\9d ×\9bת×\95×\91ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×ª×§×\99× ×\94 ×\91[[Special:Preferences|×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש]] ×©×\9c×\9b×\9d ×\9b×\93×\99 ×\9cש×\9c×\95×\97 ×\93×\95×\90ר ×\9c×\9eשת×\9eש ×\90×\97ר.",
+       "mailnologintext": "×\99ש [[Special:UserLogin|×\9c×\94×\99×\9bנס ×\9c×\97ש×\91×\95×\9f]] ×\95×\9c×\94×\92×\93×\99ר ×\9bת×\95×\91ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×ª×§×\99× ×\94 ×\91[[Special:Preferences|×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש]] ×\9b×\93×\99 ×\9cש×\9c×\95×\97 ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\9c×\9eשת×\9eש×\99×\9d ×\90×\97ר×\99×\9d.",
        "emailuser": "שליחת דואר אלקטרוני למשתמש זה",
        "emailuser-title-target": "שליחת דוא\"ל {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
        "emailuser-title-notarget": "שליחת דוא\"ל למשתמש",
        "emailpage": "שליחת דואר למשתמש",
-       "emailpagetext": "ניתן להשתמש בטופס כדי לשלוח הודעת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}.\nכתובת הדואר האלקטרוני שכתבתם ב[[Special:Preferences|העדפות המשתמש שלכם]] תופיע ככתובת שההודעה נשלחה ממנה, כדי לאפשר תגובה ישירה.",
+       "emailpagetext": "ניתן להשתמש בטופס כדי לשלוח הודעת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}.\nכתובת הדואר האלקטרוני שכתבת ב[[Special:Preferences|העדפות המשתמש שלך]] תופיע ככתובת שההודעה נשלחה ממנה, כדי לאפשר תגובה ישירה.",
        "defemailsubject": "דוא\"ל מ{{grammar:תחילית|{{SITENAME}}}} מהמשתמש \"$1\"",
        "usermaildisabled": "שליחת דוא\"ל למשתמשים מבוטלת",
        "usermaildisabledtext": "אינכם רשאים לשלוח דואר אלקטרוני למשתמשים אחרים באתר זה",
        "noemailtext": "משתמש זה לא הזין כתובת דואר אלקטרוני תקינה.",
        "nowikiemailtext": "משתמש זה בחר שלא לקבל דואר אלקטרוני ממשתמשים אחרים.",
        "emailnotarget": "שם המשתמש של הנמען לא קיים או בלתי תקין.",
-       "emailtarget": "×\94ק×\9c×\99×\93×\95 את שם המשתמש של הנמען",
+       "emailtarget": "×\99ש ×\9c×\94×\96×\99×\9f את שם המשתמש של הנמען",
        "emailusername": "שם משתמש:",
        "emailusernamesubmit": "שליחה",
        "email-legend": "שליחת דואר אלקטרוני למשתמש אחר של {{SITENAME}}",
        "emailccsubject": "העתק של הודעתך למשתמש $1: $2",
        "emailsent": "הדואר נשלח",
        "emailsenttext": "הודעת הדואר האלקטרוני שלך נשלחה.",
-       "emailuserfooter": "דואר זה נשלח על ידי $1 למשתמש $2 באמצעות תכונת \"שליחת דואר אלקטרוני למשתמש זה\" ב{{grammar:תחילית|{{SITENAME}}}}.",
+       "emailuserfooter": "דואר זה נשלח על־ידי $1 ל{{GRAMMAR:תחילית|$2}} באמצעות פעולת \"שליחת דואר אלקטרוני למשתמש זה\" באתר {{SITENAME}}.",
        "usermessage-summary": "השארת הודעת מערכת.",
        "usermessage-editor": "שולח הודעות המערכת",
        "watchlist": "רשימת המעקב",
        "mywatchlist": "רשימת מעקב",
        "watchlistfor2": "עבור $1 $2",
        "nowatchlist": "אין דפים ברשימת המעקב.",
-       "watchlistanontext": "×\90× ×\90 ×\94×\99×\9bנס×\95 לחשבון כדי לצפות או לערוך פריטים ברשימת המעקב.",
+       "watchlistanontext": "× ×\93רשת ×\9b× ×\99ס×\94 לחשבון כדי לצפות או לערוך פריטים ברשימת המעקב.",
        "watchnologin": "לא נכנסת לחשבון",
        "addwatch": "הוספה לרשימת המעקב",
        "addedwatchtext": "הדף \"[[:$1]]\" נוסף ל[[Special:Watchlist|רשימת המעקב]].\nשינויים שייערכו בעתיד בדף זה ובדף השיחה שלו, יוצגו ברשימת המעקב.",
        "wlheader-enotif": "הודעות דוא\"ל מאופשרות.",
        "wlheader-showupdated": "דפים שהשתנו מאז ביקורך האחרון בהם מוצגים ב'''הדגשה'''.",
        "wlnote": "להלן {{PLURAL:$1|השינוי האחרון|<strong>$1</strong> השינויים האחרונים}} {{PLURAL:$2|בשעה האחרונה|בשעתיים האחרונות|ב־<strong>$2</strong> השעות האחרונות}}, עד $4, $3.",
-       "wlshowlast": "(הצגת $1 שעות אחרונות | $2 ימים אחרונים | $3)",
+       "wlshowlast": "הצגת $1 שעות אחרונות $2 ימים אחרונים",
        "watchlist-options": "אפשרויות ברשימת המעקב",
        "watching": "בהוספה לרשימת המעקב…",
        "unwatching": "בהסרה מרשימת המעקב…",
        "watcherrortext": "אירעה שגיאה בעת שינוי הגדרות רשימת המעקב של \"$1\".",
        "enotif_reset": "סימון כל הדפים כאילו נצפו",
-       "enotif_impersonal_salutation": "×\9eשת×\9eש ×©×\9c {{SITENAME}}",
-       "enotif_subject_deleted": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק על ידי $2",
-       "enotif_subject_created": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נוצר על ידי $2",
-       "enotif_subject_moved": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} הועבר על ידי $2",
-       "enotif_subject_restored": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שוחזר על ידי $2",
-       "enotif_subject_changed": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שונה על ידי $2",
+       "enotif_impersonal_salutation": "×\9eשת×\9eש ×\91{{GRAMMAR:ת×\97×\99×\9c×\99ת|{{SITENAME}}}}",
+       "enotif_subject_deleted": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק על־ידי $2",
+       "enotif_subject_created": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נוצר על־ידי $2",
+       "enotif_subject_moved": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} הועבר על־ידי $2",
+       "enotif_subject_restored": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שוחזר על־ידי $2",
+       "enotif_subject_changed": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שונה על־ידי $2",
        "enotif_body_intro_deleted": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק ב־$PAGEEDITDATE על ידי $2, ראו $3.",
        "enotif_body_intro_created": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נוצר ב־$PAGEEDITDATE על ידי $2, ראו $3 לגרסה הנוכחית.",
        "enotif_body_intro_moved": "הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} הועבר ב־$PAGEEDITDATE על ידי $2, ראו $3 לגרסה הנוכחית.",
        "exbeforeblank": "התוכן לפני שרוקן היה: \"$1\"",
        "delete-confirm": "מחיקת $1",
        "delete-legend": "מחיקה",
-       "historywarning": "'''אזהרה:''' לדף שאתם עומדים למחוק יש היסטוריית שינויים של {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
+       "historywarning": "<strong>אזהרה:</strong> לדף שאתם עומדים למחוק יש היסטוריית שינויים של {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
        "confirmdeletetext": "אתם עומדים למחוק דף יחד עם כל ההיסטוריה שלו.\n\nאנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
        "actioncomplete": "הפעולה בוצעה",
        "actionfailed": "הפעולה נכשלה",
        "delete-edit-reasonlist": "עריכת סיבות המחיקה",
        "delete-toobig": "דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקת דפים כאלה הוגבלה כדי למנוע פגיעה בביצועי האתר.",
        "delete-warning-toobig": "דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקה שלו עלולה להפריע לפעולות בבסיס הנתונים; אנא שקלו שנית את המחיקה.",
-       "delete-cantedit": "אין באפשרותך למחוק את הדף כי אין לך הרשאה לערוך אותו.",
+       "deleteprotected": "אין באפשרותך למחוק את הדף כי הוא מוגן.",
        "deleting-backlinks-warning": "'''אזהרה:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|דפים אחרים]] מקשרים לדף שאתם עומדים למחוק או מכלילים אותו.",
        "rollback": "שחזור עריכות",
        "rollback_short": "שחזור",
        "protect-expiring-local": "פוקעת $1",
        "protect-expiry-indefinite": "בלתי מוגבלת בזמן",
        "protect-cascade": "הגנה על כל הדפים המוכללים בדף זה (הגנה מדורגת)",
-       "protect-cantedit": "×\90×\99× ×\9b×\9d ×\99×\9b×\95×\9c×\99×\9d ×\9cשנ×\95ת ×\90ת ×¨×\9eת ×\94×\94×\92× ×\94 ×¢×\9c ×\93×£ ×\96×\94, ×\9b×\99×\95×\95×\9f ×©×\90×\99×\9f ×\9c×\9b×\9d הרשאה לערוך אותו.",
+       "protect-cantedit": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9cשנ×\95ת ×\90ת ×¨×\9eת ×\94×\94×\92× ×\94 ×¢×\9c ×\93×£ ×\96×\94 ×\9b×\99×\95×\95×\9f ×©×\90×\99×\9f ×\9c×\9a הרשאה לערוך אותו.",
        "protect-othertime": "זמן אחר:",
        "protect-othertime-op": "זמן אחר",
        "protect-existing-expiry": "זמן פקיעה נוכחי: $3, $2",
+       "protect-existing-expiry-infinity": "זמן פקיעה נוכחי: ללא הגבלת זמן",
        "protect-otherreason": "סיבה אחרת/נוספת:",
        "protect-otherreason-op": "סיבה אחרת",
        "protect-dropdown": "* סיבות הגנה נפוצות\n** השחתה רבה\n** ספאם רב\n** מלחמת עריכה בלתי מועילה\n** דף בשימוש רב",
        "unblocked": "[[User:$1|$1]] {{GENDER:$1|שוחרר מחסימתו|שוחררה מחסימתה}}.",
        "unblocked-range": "$1 שוחרר מחסימתו.",
        "unblocked-id": "חסימה מספר $1 שוחררה.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] שוחררה מחסימתה.",
        "blocklist": "משתמשים חסומים",
        "ipblocklist": "משתמשים חסומים",
        "ipblocklist-legend": "מציאת משתמש חסום",
        "ipb_expiry_temp": "חסימות הכוללות הסתרת שם משתמש חייבות להיות לזמן בלתי מוגבל.",
        "ipb_hide_invalid": "לא ניתן להעלים את החשבון הזה; {{PLURAL:$1|בוצעה ממנו יותר מעריכה אחת|בוצעו ממנו יותר מ‏‏֫־$1 עריכות}}.",
        "ipb_already_blocked": "המשתמש \"$1\" כבר נחסם.",
-       "ipb-needreblock": "$1 ×\9b×\91ר × ×\97ס×\9d. ×\94×\90×\9d ×\91רצ×\95× ×\9b×\9d לשנות את הגדרות החסימה?",
+       "ipb-needreblock": "$1 ×\9b×\91ר × ×\97ס×\9d. ×\94×\90×\9d ×\91רצ×\95× ×\9a לשנות את הגדרות החסימה?",
        "ipb-otherblocks-header": "{{PLURAL:$1|חסימה אחרת|חסימות אחרות}}",
        "unblock-hideuser": "לא ניתן לשחרר משתמש זה, כיוון ששם המשתמש שלו הוסתר.",
        "ipb_cant_unblock": "שגיאה: חסימה מספר $1 לא נמצאה. ייתכן שהיא כבר שוחררה.",
        "sorbsreason": "כתובת ה־IP שלך רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר {{SITENAME}} משתמש בו.",
        "sorbs_create_account_reason": "כתובת ה־IP שלך רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר {{SITENAME}} משתמש בו.\nאין באפשרותך ליצור חשבון.",
        "xffblockreason": "כתובת IP הנמצאת בכותרת X-Forwarded-For, בין אם שלכם או של שרת פרוקסי שאתם משתמשים בו, נחסמה. סיבת החסימה המקורית הייתה: $1",
-       "cant-see-hidden-user": "המשתמש שאתם מנסים לחסום כבר נחסם והוסתר. כיוון שאין לכם את ההרשאה לחסימת משתמש והסתרתו, אינכם רשאים לצפות בחסימת המשתמש או לערוך אותה.",
+       "cant-see-hidden-user": "המשתמש שאתם מנסים לחסום כבר נחסם והוסתר.\nכיוון שאין לכם הרשאה להסתרת משתמשים, אין באפשרותכם לצפות בחסימת המשתמש או לערוך אותה.",
        "ipbblocked": "אינכם יכולים לחסום או לשחרר את חסימתם של משתמשים אחרים, כיוון שאתם עצמכם חסומים.",
-       "ipbnounblockself": "×\90×\99× ×\9b×\9d ×¨×©×\90×\99×\9d ×\9cש×\97רר ×\90ת ×\97ס×\99×\9eת×\9b×\9d.",
+       "ipbnounblockself": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9c×\91×\98×\9c ×\90ת ×\94×\97ס×\99×\9e×\94 ×©×\9c ×¢×¦×\9e×\9a.",
        "lockdb": "נעילת בסיס נתונים",
        "unlockdb": "שחרור בסיס נתונים",
        "lockdbtext": "נעילת בסיס הנתונים תמנע ממשתמשים את האפשרות לערוך דפים, לשנות את העדפותיהם, לערוך את רשימות המעקב שלהם, ופעולות אחרות הדורשות ביצוע שינויים בבסיס הנתונים.\n\nאנא אשרו שזה מה שאתם מתכוונים לעשות, ושתשחררו את בסיס הנתונים מנעילה כאשר פעולת התחזוקה תסתיים.",
        "unlockconfirm": "כן, ברצוני לשחרר את בסיס הנתונים מנעילה.",
        "lockbtn": "נעילת בסיס הנתונים",
        "unlockbtn": "שחרור בסיס הנתונים מנעילה",
-       "locknoconfirm": "לא סימנתם את תיבת האישור.",
+       "locknoconfirm": "לא סימנת את תיבת האישור.",
        "lockdbsuccesssub": "נעילת בסיס הנתונים הושלמה בהצלחה",
        "unlockdbsuccesssub": "שוחררה הנעילה מבסיס הנתונים",
-       "lockdbsuccesstext": "בסיס הנתונים ננעל.\n\nזכרו [[Special:UnlockDB|לשחרר את הנעילה]] לאחר שפעולת התחזוקה הסתיימה.",
+       "lockdbsuccesstext": "בסיס הנתונים ננעל.<br />\nיש לזכור [[Special:UnlockDB|לשחרר את הנעילה]] לאחר שפעולת התחזוקה תסתיים.",
        "unlockdbsuccesstext": "שוחררה הנעילה של בסיס הנתונים",
        "lockfilenotwritable": "קובץ נעילת בסיס הנתונים אינו ניתן לכתיבה. כדי שאפשר יהיה לנעול את בסיס הנתונים או לבטל את נעילתו, שרת האינטרנט צריך לקבל הרשאות לכתוב אליו.",
        "databasenotlocked": "בסיס הנתונים אינו נעול.",
        "movearticle": "העברת דף:",
        "moveuserpage-warning": "'''אזהרה:''' אתם עומדים להעביר דף משתמש. שימו לב שרק הדף יועבר וששם המשתמש '''לא''' ישתנה.",
        "movecategorypage-warning": "<strong>אזהרה:</strong> אתם עומדים להעביר דף קטגוריה. שימו לב שרק הדף יועבר ושכל הדפים בקטגוריה הישנה <strong>לא</strong> יסווגו לקטגוריה החדשה.",
-       "movenologintext": "עליכם [[Special:UserLogin|להיכנס לחשבון]] כדי להעביר דפים.",
-       "movenotallowed": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d להעביר דפים.",
-       "movenotallowedfile": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d להעביר קבצים.",
-       "cant-move-user-page": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d להעביר דפי משתמש (למעט דפי משנה).",
-       "cant-move-to-user-page": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d להעביר דף לדף משתמש (למעט לדף משנה של דף משתמש).",
-       "cant-move-category-page": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d להעביר דפי קטגוריה.",
-       "cant-move-to-category-page": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d להעביר דף לדף קטגוריה.",
+       "movenologintext": "עליכם להיות רשומים ו[[Special:UserLogin|להיכנס לחשבון]] כדי להעביר דפים.",
+       "movenotallowed": "×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 להעביר דפים.",
+       "movenotallowedfile": "×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 להעביר קבצים.",
+       "cant-move-user-page": "×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 להעביר דפי משתמש (למעט דפי משנה).",
+       "cant-move-to-user-page": "×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 להעביר דף לדף משתמש (למעט לדף משנה של דף משתמש).",
+       "cant-move-category-page": "×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 להעביר דפי קטגוריה.",
+       "cant-move-to-category-page": "×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 להעביר דף לדף קטגוריה.",
        "newtitle": "לשם החדש:",
        "move-watch": "מעקב אחר דף המקור ואחר דף היעד",
        "movepagebtn": "העברה",
        "movereason": "סיבה:",
        "revertmove": "החזרה",
        "delete_and_move": "מחיקה והעברה",
-       "delete_and_move_text": "== בקשת מחיקה ==\nדף היעד, [[:$1]], כבר קיים. האם ברצונכם למחוק אותו כדי לאפשר את ההעברה?",
+       "delete_and_move_text": "== בקשת מחיקה ==\nדף היעד, \"[[:$1]]\", כבר קיים.\nהאם ברצונך למחוק אותו כדי לאפשר את ההעברה?",
        "delete_and_move_confirm": "אישור מחיקת הדף",
-       "delete_and_move_reason": "מחיקה כדי לאפשר העברה מ[[$1]]",
+       "delete_and_move_reason": "מחיקה כדי לאפשר העברה מהשם \"[[$1]]\"",
        "selfmove": "כותרות המקור והיעד זהות; לא ניתן להעביר דף לעצמו.",
        "immobile-source-namespace": "לא ניתן להעביר דפים במרחב השם \"$1\"",
        "immobile-target-namespace": "לא ניתן להעביר דפים למרחב השם \"$1\"",
        "protectedpagemovewarning": "'''אזהרה:''' דף זה מוגן כך שרק מפעילי מערכת יכולים להעביר אותו.\nפעולת היומן האחרונה מוצגת להלן:",
        "semiprotectedpagemovewarning": "'''הערה:''' דף זה מוגן כך שרק משתמשים רשומים יכולים להעביר אותו.\nפעולת היומן האחרונה מוצגת להלן:",
        "move-over-sharedrepo": "== הקובץ קיים ==\n[[:$1]] כבר קיים כקובץ משותף. העברת הקובץ לכותרת זו תדרוס את הקובץ המשותף.",
-       "file-exists-sharedrepo": "ק×\95×\91×¥ ×\91ש×\9d ×©× ×\91×\97ר ×\9b×\91ר ×§×\99×\99×\9d ×\9bק×\95×\91×¥ ×\9eש×\95תף.\n×\90× ×\90 ×\91×\97ר×\95 שם אחר.",
+       "file-exists-sharedrepo": "ק×\95×\91×¥ ×\91ש×\9d ×©× ×\91×\97ר ×\9b×\91ר ×§×\99×\99×\9d ×\9bק×\95×\91×¥ ×\9eש×\95תף.\n×\99ש ×\9c×\91×\97×\95ר שם אחר.",
        "export": "ייצוא דפים",
        "exporttext": "באפשרותכם לייצא את התוכן ואת היסטוריית העריכה של דף אחד או של מספר דפים, בתבנית של קובץ XML.\nניתן לייבא את הקובץ למיזם ויקי אחר המשתמש בתוכנת מדיה־ויקי באמצעות [[Special:Import|דף הייבוא]].\n\nכדי לייצא דפים, הקישו את שמותיהם בתיבת הטקסט שלהלן, כל שם בשורה נפרדת, ובחרו האם לייצא גם את הגרסה הנוכחית וגם את היסטוריית השינויים של הדפים, או רק את הגרסה הנוכחית עם מידע על העריכה האחרונה.\n\nבנוסף, ניתן להשתמש בקישור, כגון [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] לדף [[{{MediaWiki:Mainpage}}]] ללא היסטוריית השינויים שלו.",
        "exportall": "ייצוא כל הדפים",
        "import": "ייבוא דפים",
        "importinterwiki": "ייבוא בין־אתרי",
        "import-interwiki-text": "אנא בחרו אתר ויקי וכותרת דף לייבוא.\nתאריכי העריכות ושמות העורכים יישמרו.\nכל פעולות הייבוא הבין־אתרי נשמרות ב[[Special:Log/import|יומן הייבוא]].",
-       "import-interwiki-source": "אתר/דף המקור:",
+       "import-interwiki-sourcewiki": "אתר המקור:",
+       "import-interwiki-sourcepage": "דף המקור:",
        "import-interwiki-history": "העתקת כל היסטוריית העריכות של דף זה",
        "import-interwiki-templates": "ייבוא גם של כל התבניות המוכללות בדף",
        "import-interwiki-submit": "ייבוא",
        "import-invalid-interwiki": "לא ניתן לייבא מאתר הוויקי שצוין.",
        "import-error-edit": "לא ניתן לייבא את הדף \"$1\" כיוון שאין לך הרשאה לערוך אותו.",
        "import-error-create": "לא ניתן לייבא את הדף \"$1\" כיוון שאין לך הרשאה ליצור אותו.",
-       "import-error-interwiki": "×\9c×\90 × ×\99ת×\9f ×\9c×\99×\99×\91×\90 ×\90ת ×\94×\93×£ \"$1\" ×\9b×\99×\95×\95×\9f ×©×©×\9e×\95 ×©×\9e×\95ר ×\9cק×\99ש×\95ר ×\97×\99צ×\95× ×\99 (×\91×\99×\9fÖ¾ויקי).",
+       "import-error-interwiki": "×\9c×\90 × ×\99ת×\9f ×\9c×\99×\99×\91×\90 ×\90ת ×\94×\93×£ \"$1\" ×\9b×\99×\95×\95×\9f ×©×©×\9e×\95 ×©×\9e×\95ר ×\9cק×\99ש×\95ר ×\97×\99צ×\95× ×\99 (×\91×\99× ×\95ויקי).",
        "import-error-special": "לא ניתן לייבא את הדף \"$1\" כיוון שהוא שייך למרחב שם מיוחד שלא יכול להכיל דפים.",
        "import-error-invalid": "לא ניתן לייבא את הדף \"$1\" כיוון ששמו אינו תקין.",
        "import-error-unserialize": "לא ניתן היה לפענח את הגרסה $2 של הדף \"$1\". הגרסה מסומנת כאילו היא משתמשת במודל התוכן $3, אך קודדה כ{{GRAMMAR:תחילית|$4}}.",
        "anonymous": "{{PLURAL:$1|משתמש אנונימי|משתמשים אנונימיים}} של {{SITENAME}}",
        "siteuser": "משתמש {{SITENAME}} $1",
        "anonuser": "משתמש אנונימי של {{SITENAME}} $1",
-       "lastmodifiedatby": "דף זה שונה לאחרונה בתאריך $2, $1 על ידי $3.",
+       "lastmodifiedatby": "דף זה שונה לאחרונה ב־$2, $1 על־ידי $3.",
        "othercontribs": "מבוסס על העבודה של $1.",
        "others": "אחרים",
        "siteusers": "{{PLURAL:$2|משתמש|משתמשי}} {{SITENAME}} $1",
        "rcpatroldisabled": "אפשרות סימון השינויים כבדוקים מבוטלת",
        "rcpatroldisabledtext": "תכונת סימון שינויים כבדוקים בדף השינויים האחרונים בוטלה.",
        "markedaspatrollederror": "לא ניתן לסמן כבדוק",
-       "markedaspatrollederrortext": "×¢×\9c×\99×\9b×\9d ×\9cצ×\99×\99×\9f ×\92רס×\94 ×©×ª×¦×\99×\99× ×\95 כבדוקה.",
-       "markedaspatrollederror-noautopatrol": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d ×\9cס×\9e×\9f ×\90ת ×\94ש×\99× ×\95×\99×\99×\9d ×©×\9c ×¢×¦×\9e×\9b×\9d כבדוקים.",
+       "markedaspatrollederrortext": "×\99ש ×\9cצ×\99×\99×\9f ×\92רס×\94 ×©×\91רצ×\95× ×\9a ×\9cס×\9e×\9f כבדוקה.",
+       "markedaspatrollederror-noautopatrol": "×\90×\99× ×\9a ×\9e×\95רש×\94 ×\9cס×\9e×\9f ×©×\99× ×\95×\99×\99×\9d ×©×\9c ×¢×¦×\9e×\9a כבדוקים.",
        "markedaspatrollednotify": "שינוי זה ל\"$1\" סומן כבדוק.",
        "markedaspatrollederrornotify": "סימון השינוי כבדוק נכשל.",
        "patrol-log-page": "יומן שינויים בדוקים",
        "filedelete-archive-read-only": "השרת אינו יכול לכתוב לתיקיית הארכיון \"$1\".",
        "previousdiff": "→ מעבר להשוואת הגרסאות הקודמת",
        "nextdiff": "מעבר להשוואת הגרסאות הבאה ←",
-       "mediawarning": "'''אזהרה:''' סוג קובץ זה עלול להכיל קוד זדוני.\nהרצת הקוד עלולה לסכן את המערכת שלכם.",
+       "mediawarning": "<strong>אזהרה:</strong> סוג קובץ זה עלול להכיל קוד זדוני.\nהרצת הקוד עלולה לסכן את המחשב שלך.",
        "imagemaxsize": "גודל תמונה מרבי:<br />(לדפי תיאור קובץ)",
        "thumbsize": "הקטנה לגודל של:",
        "widthheightpage": "<span dir=\"ltr\">$1 × $2</span>, {{PLURAL:$3|דף אחד|$3 דפים}}",
        "sunday-at": "ביום ראשון בשעה $1",
        "yesterday-at": "אתמול בשעה $1",
        "bad_image_list": "דרך הכתיבה בהודעה היא כמתואר להלן:\n\nרק פריטי רשימה (שורות המתחילות עם *) נחשבים.\nהקישור הראשון בשורה חייב להיות קישור לקובץ בעייתי.\nכל הקישורים הבאים באותה השורה נחשבים לחריגים, כלומר לדפים שבהם ניתן להציג את הקובץ.",
-       "metadata": "×\9e×\99×\93×¢ × ×\95סף ×¢×\9c ×\94ק×\95×\91×¥",
+       "metadata": "×\9e×\98×\90־נת×\95× ×\99×\9d",
        "metadata-help": "קובץ זה מכיל מידע נוסף, שכנראה הגיע ממצלמה דיגיטלית או מסורק שבהם הקובץ נוצר או עבר דיגיטציה.\nאם הקובץ שונה ממצבו הראשוני, כמה מהנתונים להלן עלולים שלא לשקף באופן מלא את הקובץ הנוכחי.",
        "metadata-expand": "הצגת פרטים מורחבים",
        "metadata-collapse": "הסתרת פרטים מורחבים",
        "exif-originalimageheight": "גובה התמונה לפני קיטוע",
        "exif-originalimagewidth": "רוחב התמונה לפני קיטוע",
        "exif-compression-1": "לא דחוס",
-       "exif-compression-2": "ק×\99×\93×\95×\93 ×\94×\95פ×\9e×\9f ×\9e×\95×\90ת×\9d ×\97×\93-מימדי לאורך ריצה CCITT קבוצה 3",
+       "exif-compression-2": "ק×\99×\93×\95×\93 ×\94×\95פ×\9e×\9f ×\9e×\95ת×\90×\9d ×\97×\93Ö¾מימדי לאורך ריצה CCITT קבוצה 3",
        "exif-compression-3": "קידוד פקס CCITT קבוצה 3",
        "exif-compression-4": "קידוד פקס CCITT קבוצה 4",
        "exif-compression-6": "JPEG (ישן)",
        "exif-lightsource-2": "פלואורסצנטי",
        "exif-lightsource-3": "טונגסטן (אור מתלהט)",
        "exif-lightsource-4": "מַבזק",
-       "exif-lightsource-9": "מזג אוויר טוב",
-       "exif-lightsource-10": "מזג אוויר מעונן",
+       "exif-lightsource-9": "מזג־אוויר נאה",
+       "exif-lightsource-10": "מזג־אוויר מעונן",
        "exif-lightsource-11": "צל",
        "exif-lightsource-12": "אור יום פלואורסצנטי (D 5700 – 7100K)",
        "exif-lightsource-13": "אור יום לבן פלואורסצנטי (N 4600 – 5400K)",
        "exif-iimcategory-soi": "סוגיות חברתיות",
        "exif-iimcategory-spo": "ספורט",
        "exif-iimcategory-war": "מלחמה, סכסוך והפרת סדר",
-       "exif-iimcategory-wea": "מזג אוויר",
+       "exif-iimcategory-wea": "מזג־אוויר",
        "exif-urgency-normal": "רגילה ($1)",
        "exif-urgency-low": "נמוכה ($1)",
        "exif-urgency-high": "גבוהה ($1)",
        "exif-urgency-other": "מותאמת אישית ($1)",
-       "watchlistall2": "הכול",
        "namespacesall": "הכול",
        "monthsall": "הכול",
        "confirmemail": "אימות כתובת דוא\"ל",
        "confirmemail_oncreate": "קוד אימות דוא\"ל נשלח לכתובת הדוא\"ל שלכם. הקוד הזה אינו נדרש לכניסה, אך תצטרכו לספקו כדי להשתמש בכל תכונה מבוססת דוא\"ל באתר זה.",
        "confirmemail_sendfailed": "{{SITENAME}} לא הצליח לשלוח לכם הודעת דוא\"ל עם קוד האימות.\nאנא בדקו שאין תווים שגויים בכתובת הדוא\"ל.\n\nתוכנת שליחת הדוא\"ל החזירה את ההודעה הבאה: $1",
        "confirmemail_invalid": "קוד האימות שגוי. ייתכן שפג תוקפו.",
-       "confirmemail_needlogin": "×¢×\9c×\99×\9b×\9d $1 ×\9b×\93×\99 ×\9c×\90×\9eת ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9b×\9d.",
+       "confirmemail_needlogin": "× ×\93רשת $1 ×\9b×\93×\99 ×\9c×\90×\9eת ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9a.",
        "confirmemail_success": "כתובת הדוא\"ל שלך אושרה.\nכעת באפשרותך [[Special:UserLogin|להיכנס לחשבון שלך]] וליהנות מהאתר.",
        "confirmemail_loggedin": "כתובת הדוא\"ל שלך אושרה כעת.",
        "confirmemail_subject": "קוד אימות דוא\"ל מ{{grammar:תחילית|{{SITENAME}}}}",
        "scarytranscludefailed": "[אחזור התבנית נכשל עבור $1]",
        "scarytranscludefailed-httpstatus": "[אחזור התבנית נכשל עבור $1&rlm;: HTTP $2]",
        "scarytranscludetoolong": "[כתובת ה־URL ארוכה מדי]",
-       "deletedwhileediting": "'''אזהרה:''' דף זה נמחק לאחר שהתחלתם לערוך!",
-       "confirmrecreate": "הדף נמחק על ידי המשתמש [[User:$1|$1]] ([[User talk:$1|שיחה]]) לאחר שהתחלתם לערוך אותו, מסיבה זו:\n:'''$2'''\nאנא אשרו שאתם אכן רוצים ליצור מחדש את הדף.",
-       "confirmrecreate-noreason": "הדף נמחק על ידי המשתמש [[User:$1|$1]] ([[User talk:$1|שיחה]]) לאחר שהתחלתם לערוך אותו.\nאנא אשרו שאתם אכן רוצים ליצור מחדש את הדף.",
+       "deletedwhileediting": "<strong>אזהרה:</strong> דף זה נמחק לאחר שהתחלת לערוך!",
+       "confirmrecreate": "ה{{GENDER:$1|משתמש|משתמשת}} [[User:$1|$1]] ([[User talk:$1|שיחה]]) {{GENDER:$1|מחק|מחקה}} את הדף הזה לאחר שהתחלת לערוך אותו, מהסיבה הבאה:\n: <em>$2</em>\nיש לאשר שאכן ברצונך ליצור מחדש את הדף.",
+       "confirmrecreate-noreason": "ה{{GENDER:$1|משתמש|משתמשת}} [[User:$1|$1]] ([[User talk:$1|שיחה]]) {{GENDER:$1|מחק|מחקה}} את הדף הזה לאחר שהתחלת לערוך אותו. יש לאשר שאכן ברצונך ליצור מחדש את הדף.",
        "recreate": "יצירה מחדש",
        "confirm_purge_button": "אישור",
        "confirm-purge-top": "לנקות את המטמון של דף זה?",
        "lag-warn-high": "בגלל עיכוב בעדכון בסיס הנתונים, שינויים שבוצעו לפני פחות מ{{PLURAL:$1|שנייה אחת|־$1 שניות}} אינם מוצגים ברשימה זו.",
        "watchlistedit-normal-title": "עריכת רשימת המעקב",
        "watchlistedit-normal-legend": "הסרת דפים מרשימת המעקב",
-       "watchlistedit-normal-explain": "×\9b×\9c ×\94×\93פ×\99×\9d ×\91רש×\99×\9eת ×\94×\9eעק×\91 ×\9e×\95צ×\92×\99×\9d ×\9c×\94×\9c×\9f.\n×\9b×\93×\99 ×\9c×\94ס×\99ר ×\93×£, ×\99ש ×\9cס×\9e×\9f ×\90ת ×\94ת×\99×\91×\94 ×\9c×\99×\93×\95, ×\95×\9c×\9c×\97×\95×¥ ×¢×\9c \"{{int:Watchlistedit-normal-submit}}\".\n×\91×\90פשר×\95ת×\9b×\9d גם [[Special:EditWatchlist/raw|לערוך את הרשימה הגולמית]].",
+       "watchlistedit-normal-explain": "×\9b×\9c ×\94×\93פ×\99×\9d ×\91רש×\99×\9eת ×\94×\9eעק×\91 ×\9e×\95צ×\92×\99×\9d ×\9c×\94×\9c×\9f.\n×\9b×\93×\99 ×\9c×\94ס×\99ר ×\93×£, ×\99ש ×\9cס×\9e×\9f ×\90ת ×\94ת×\99×\91×\94 ×\9c×\99×\93×\95, ×\95×\9c×\9c×\97×\95×¥ ×¢×\9c \"{{int:Watchlistedit-normal-submit}}\".\n×\91×\90פשר×\95ת×\9a גם [[Special:EditWatchlist/raw|לערוך את הרשימה הגולמית]].",
        "watchlistedit-normal-submit": "הסרת הדפים",
        "watchlistedit-normal-done": "{{PLURAL:$1|כותרת אחת הוסרה|$1 כותרות הוסרו}} מרשימת המעקב:",
        "watchlistedit-raw-title": "עריכת הרשימה הגולמית",
        "watchlistedit-raw-added": "{{PLURAL:$1|כותרת אחת נוספה|$1 כותרות נוספו}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|כותרת אחת הוסרה|$1 כותרות הוסרו}}:",
        "watchlistedit-clear-title": "רשימת המעקב נמחקה",
-       "watchlistedit-clear-legend": "×\9e×\97×\99קת רשימת המעקב",
+       "watchlistedit-clear-legend": "× ×\99ק×\95×\99 רשימת המעקב",
        "watchlistedit-clear-explain": "כל הכותרות של הדפים שיוסרו מרשימת המעקב",
        "watchlistedit-clear-titles": "כותרות:",
-       "watchlistedit-clear-submit": "×\9e×\97×\99קת רשימת המעקב (לצמיתות!)",
-       "watchlistedit-clear-done": "רש×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a × ×\9e×\97קה.",
+       "watchlistedit-clear-submit": "× ×\99ק×\95×\99 רשימת המעקב (לצמיתות!)",
+       "watchlistedit-clear-done": "רש×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a × ×\95קתה.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|כותרת אחת הוסרה|$1 כותרות הוסרו}}:",
        "watchlistedit-too-many": "יש יותר מדי דפים ולא ניתן להציגם כאן.",
-       "watchlisttools-clear": "×\9e×\97×\99קת רשימת המעקב",
+       "watchlisttools-clear": "× ×\99ק×\95×\99 רשימת המעקב",
        "watchlisttools-view": "הצגת השינויים הרלוונטיים",
        "watchlisttools-edit": "הצגה ועריכה של רשימת המעקב",
        "watchlisttools-raw": "עריכת הרשימה הגולמית",
        "dberr-again": "נסו להמתין מספר שניות ולהעלות מחדש את הדף.",
        "dberr-info": "(לא ניתן ליצור קשר עם שרת הנתונים: $1)",
        "dberr-info-hidden": "(לא ניתן ליצור קשר עם שרת הנתונים)",
-       "dberr-usegoogle": "×\91×\90פשר×\95ת×\9b×\9d ×\9cנס×\95ת ×\9c×\97פש ×\93ר×\9a גוגל בינתיים.",
+       "dberr-usegoogle": "×\91×\90פשר×\95ת×\9a ×\9cנס×\95ת ×\9c×\97פש ×\91×\90×\9eצע×\95ת גוגל בינתיים.",
        "dberr-outofdate": "שימו לב שהתוכן שלנו כפי שנשמר במאגר שם עשוי שלא להיות מעודכן.",
        "dberr-cachederror": "זהו עותק שמור של המידע, והוא עשוי שלא להיות מעודכן.",
        "htmlform-invalid-input": "יש בעיות עם חלק מהקלט שהכנסת",
        "logentry-newusers-create2": "חשבון המשתמש $3 נוצר על־ידי $1",
        "logentry-newusers-byemail": "חשבון המשתמש $3 נוצר על־ידי $1 והסיסמה נשלחה בדוא\"ל",
        "logentry-newusers-autocreate": "חשבון המשתמש $1 {{GENDER:$2|נוצר}} אוטומטית",
-       "logentry-rights-rights": "$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של $3 מ$4 ל$5&rlm;",
-       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של $3",
-       "logentry-rights-autopromote": "$1 קודם אוטומטית מ$4 ל$5",
+       "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}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|העלה|העלתה}} את $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|העלה|העלתה}} גרסה חדשה של $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|העלה|העלתה}} את $3",
        "rightsnone": "(כלום)",
+       "revdelete-summary": "תקציר העריכה",
        "feedback-bugornote": "אם אתם מוכנים לתאר בעיה טכנית בפרטים, אנא [$1 דווחו באג].\nאחרת, תוכלו להשתמש בטופס הפשוט שלהלן. הערתכם תתווסף לדף \"[$3 $2]\", יחד עם שם המשתמש שלכם.",
        "feedback-subject": "נושא:",
        "feedback-message": "הודעה:",
        "feedback-error1": "שגיאה: תוצאה לא מזוהה מה־API",
        "feedback-error2": "שגיאה: העריכה נכשלה",
        "feedback-error3": "שגיאה: אין תשובה מה־API",
-       "feedback-thanks": "ת×\95×\93×\94! ×\94×\9eש×\95×\91 ×©×\9c×\9b×\9d פורסם בדף \"[$2 $1]\".",
+       "feedback-thanks": "ת×\95×\93×\94! ×\94×\9eש×\95×\91 ×©×\9c×\9a פורסם בדף \"[$2 $1]\".",
        "feedback-close": "סיום",
        "feedback-bugcheck": "מצוין! נא לבדוק שזה לא אחד מה[$1 באגים הידועים].",
        "feedback-bugnew": "בדקתי. נא לדווח כבאג חדש",
        "searchsuggest-search": "חיפוש",
        "searchsuggest-containing": "כולל...",
-       "api-error-badaccess-groups": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d להעלות קבצים לאתר הוויקי הזה.",
-       "api-error-badtoken": "ש×\92×\99×\90×\94 ×¤× ×\99×\9e×\99ת: ×\90ס×\99×\9e×\95×\9f ×¨×¢.",
+       "api-error-badaccess-groups": "×\90×\99× ×\9a ×\9e×\95רש×\94 להעלות קבצים לאתר הוויקי הזה.",
+       "api-error-badtoken": "ש×\92×\99×\90×\94 ×¤× ×\99×\9e×\99ת: ×\90ס×\99×\9e×\95×\9f ×©×\91×\95ר.",
        "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-empty-file": "הקובץ ששלחתם היה ריק.",
+       "api-error-empty-file": "הקובץ ששלחת היה ריק.",
        "api-error-emptypage": "יצירת דפים חדשים ריקים אינה אפשרית.",
        "api-error-fetchfileerror": "שגיאה פנימית: משהו השתבש בזמן אחזור הקובץ.",
        "api-error-fileexists-forbidden": "קובץ בשם \"$1\" כבר קיים ואי־אפשר לדרוס אותו.",
        "api-error-fileexists-shared-forbidden": "קובץ בשם \"$1\" כבר קיים במאגר הקבצים המשותף ואי־אפשר לדרוס אותו.",
-       "api-error-file-too-large": "הקובץ ששלחתם היה גדול מדי.",
+       "api-error-file-too-large": "הקובץ ששלחת היה גדול מדי.",
        "api-error-filename-tooshort": "שם הקובץ קצר מדי.",
        "api-error-filetype-banned": "סוג קובץ זה חסום.",
        "api-error-filetype-banned-type": "$1 {{PLURAL:$4|הוא סוג קובץ אסור להעלאה|הם סוגי קבצים אסורים להעלאה}}. {{PLURAL:$3|סוג הקובץ המותר הוא|סוגי הקבצים המותרים הם}} $2.",
        "api-error-filetype-missing": "חסרה סיומת לשם הקובץ.",
-       "api-error-hookaborted": "השינוי שניסיתם לעשות נחסם על ידי הרחבה.",
+       "api-error-hookaborted": "השינוי שניסית לעשות נחסם על־ידי הרחבה.",
        "api-error-http": "שגיאה פנימית: לא ניתן להתחבר לשרת.",
        "api-error-illegal-filename": "שם הקובץ הזה אינו מורשה.",
-       "api-error-internal-error": "ש×\92×\99×\90×\94 ×¤× ×\99×\9e×\99ת: ×\9eש×\94×\95 ×\94שת×\91ש ×\91עת ×¢×\99×\91×\95×\93 ×\94×\94×¢×\9c×\90×\94 ×©×\9c×\9b×\9d באתר הוויקי.",
+       "api-error-internal-error": "ש×\92×\99×\90×\94 ×¤× ×\99×\9e×\99ת: ×\9eש×\94×\95 ×\94שת×\91ש ×\91עת ×¢×\99×\91×\95×\93 ×\94×\94×¢×\9c×\90×\94 ×©×\9c×\9a באתר הוויקי.",
        "api-error-invalid-file-key": "שגיאה פנימית: הקובץ לא נמצא במאגר הזמני.",
        "api-error-missingparam": "שגיאה פנימית: פרמטרים חסרים בבקשה שנשלחה.",
        "api-error-missingresult": "שגיאה פנימית: לא ניתן לקבוע אם ההעתקה הצליחה.",
        "api-error-timeout": "השרת לא השיב בזמן המצופה.",
        "api-error-unclassified": "אירעה שגיאה בלתי ידועה.",
        "api-error-unknown-code": "שגיאה בלתי ידועה: \"$1\".",
-       "api-error-unknown-error": "ש×\92×\99×\90×\94 ×¤× ×\99×\9e×\99ת: ×\9eש×\94×\95 ×\94שת×\91ש ×\91עת × ×\99ס×\99×\95×\9f ×\9c×\94×¢×\9c×\95ת ×\90ת ×\94ק×\95×\91×¥ ×©×\9c×\9b×\9d.",
+       "api-error-unknown-error": "ש×\92×\99×\90×\94 ×¤× ×\99×\9e×\99ת: ×\9eש×\94×\95 ×\94שת×\91ש ×\91עת × ×\99ס×\99×\95×\9f ×\9c×\94×¢×\9c×\95ת ×\90ת ×\94ק×\95×\91×¥ ×©×\9c×\9a.",
        "api-error-unknown-warning": "אזהרה בלתי ידועה: \"$1\".",
        "api-error-unknownerror": "שגיאה בלתי ידועה: \"$1\".",
        "api-error-uploaddisabled": "ההעלאה מבוטלת באתר הוויקי הזה.",
        "log-name-pagelang": "יומן שינוי שפה",
        "log-description-pagelang": "זהו יומן של שינויים בשפות של הדפים.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|שינה|שינתה}} את שפת הדף $3 מ$4 ל$5.",
-       "default-skin-not-found": "אופס! עיצוב ברירת המחדל עבור אתר הוויקי שלכם  (<code>$wgDefaultSkin</code>),&rlm; <code>$1</code>, אינו זמין.\n\nנראה שההתקנה שלכם כוללת את העיצובים הבאים. ראו מידע בדף [https://www.mediawiki.org/wiki/Manual:Skin_configuration \"הגדרת עיצובים\" במדריך] על האפשרות להפעיל אותם ולבחור את עיצוב ברירת המחדל.\n\n$2\n\n; אם כרגע התקנתם את מדיה־ויקי:\n: נראה שזו התקנה מ־git, או ישירות מקוד המקור בשיטה אחרת כלשהי. במקרה הזה, בעיה זו צפויה. נסו להתקין כמה עיצובים מ[https://www.mediawiki.org/wiki/Category:All_skins ספריית העיצובים של mediawiki.org], על־ידי:\n:* הורדת [https://www.mediawiki.org/wiki/Download קובץ ה־tar להתקנה], שכולל מספר עיצובים והרחבות. באפשרותכם להעתיק ולהדביק מתוכו את תיקיית ה‏‏־<code>skins/</code>.\n:* שכפול אחת מה־git repostiroies ב־<code>mediawiki/skins/*</code> בעזרת git לתוך תיקיית ה־<code>skins/</code> בהתקנת מדיה־ויקי שלכם.\n: אם תעשו זאת, זה לא אמור להפריע ל‏‏־git repository שלכם (אם אתם מפתחים של מדיה־ויקי).\n\n; אם כרגע שדרגתם את מדיה־ויקי:\n: מדיה־ויקי 1.24 וגרסאות חדשות יותר כבר לא מפעילות עיצובים מותקנים באופן אוטומטי (ראו [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery \"גילוי אוטומטי של עיצובים\" במדריך]). תוכלו להעתיק את השורות הבאות לתוך הקובץ <code>LocalSettings.php</code> כדי להפעיל את כל העיצובים המותקנים כעת:\n\n<pre>$3</pre>\n\n; אם כרגע שיניתם את <code>LocalSettings.php</code>:\n: בדקו שנית האם ביצעתם שגיאות הקלדה בשמות העיצובים.",
-       "default-skin-not-found-no-skins": "אופס! עיצוב ברירת המחדל עבור אתר הוויקי שלכם  (<code>$wgDefaultSkin</code>),&rlm; <code>$1</code>, אינו זמין.\n\nאין לכם עיצובים מותקנים.\n\n$2\n\n; אם כרגע התקנתם או שדרגתם את מדיה־ויקי:\n: נראה שזו התקנה מ־git, או ישירות מקוד המקור בשיטה אחרת כלשהי. במקרה הזה, בעיה זו צפויה. מדיה־ויקי 1.24 וגרסאות חדשות יותר אינן כוללות עיצובים ב־git repository הראשי. נסו להתקין כמה עיצובים מ[https://www.mediawiki.org/wiki/Category:All_skins ספריית העיצובים של mediawiki.org], על־ידי:\n:* הורדת [https://www.mediawiki.org/wiki/Download קובץ ה‏‏־tar להתקנה], שכולל מספר עיצובים והרחבות. באפשרותכם להעתיק ולהדביק מתוכו את תיקיית ה‏‏־<code>skins/</code>.\n:* שכפול אחת מה־git repostiroies ב־<code>mediawiki/skins/*</code> בעזרת git לתוך תיקיית ה־<code>skins/</code> בהתקנת מדיה־ויקי שלכם.\n: אם תעשו זאת, זה לא אמור להפריע ל‏‏־git repository שלכם (אם אתם מפתחים של מדיה־ויקי). ראו מידע בדף [https://www.mediawiki.org/wiki/Manual:Skin_configuration \"הגדרת עיצובים\" במדריך] על האפשרות להפעיל עיצובים ולבחור את עיצוב ברירת המחדל.",
+       "default-skin-not-found": "אופס! עיצוב ברירת המחדל עבור אתר הוויקי שלכם, שמוגדר ב־<code dir=\"ltr\">$wgDefaultSkin</code> כ־<code>$1</code>, אינו זמין.\n\nנראה שההתקנה שלכם כוללת את העיצובים הבאים. ראו מידע בדף [https://www.mediawiki.org/wiki/Manual:Skin_configuration \"הגדרת עיצובים\" במדריך] על האפשרות להפעיל אותם ולבחור את עיצוב ברירת המחדל.\n\n$2\n\n; אם כרגע התקנתם את מדיה־ויקי:\n: נראה שזו התקנה מ־git, או ישירות מקוד המקור בשיטה אחרת כלשהי. במקרה הזה, בעיה זו צפויה. נסו להתקין כמה עיצובים מ[https://www.mediawiki.org/wiki/Category:All_skins ספריית העיצובים של mediawiki.org], על־ידי:\n:* הורדת [https://www.mediawiki.org/wiki/Download קובץ ה־tar להתקנה], שכולל מספר עיצובים והרחבות. באפשרותכם להעתיק ולהדביק מתוכו את תיקיית ה‏‏־<code>skins/</code>.\n:* שכפול (clone) אחד מהמאגרים ב־<code dir=\"ltr\">mediawiki/skins/*</code> בעזרת git לתוך תיקיית ה־<code dir=\"ltr\">skins/</code> בהתקנת מדיה־ויקי שלכם.\n: אם תעשו זאת, זה לא אמור להפריע ל‏‏מאגר ה־git שלכם אם אתם מפתחים של מדיה־ויקי.\n\n; אם כרגע שדרגתם את מדיה־ויקי:\n: מדיה־ויקי 1.24 וגרסאות חדשות יותר כבר לא מפעילות עיצובים מותקנים באופן אוטומטי (ראו [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery \"גילוי אוטומטי של עיצובים\" במדריך]). תוכלו להעתיק את השורות הבאות לתוך הקובץ <code>LocalSettings.php</code> כדי להפעיל את כל העיצובים המותקנים כעת:\n\n<pre dir=\"ltr\">$3</pre>\n\n; אם כרגע שיניתם את <code>LocalSettings.php</code>:\n: בדקו שנית האם עשיתם שגיאות הקלדה בשמות העיצובים.",
+       "default-skin-not-found-no-skins": "אופס! עיצוב ברירת המחדל עבור אתר הוויקי שלכם, שמוגדר ב־<code dir=\"ltr\">$wgDefaultSkin</code> כ־<code>$1</code>, אינו זמין.\n\nאין לכם עיצובים מותקנים.\n\n; אם כרגע התקנתם או שדרגתם את מדיה־ויקי:\n: נראה שזו התקנה מ־git, או ישירות מקוד המקור בשיטה אחרת כלשהי. במקרה הזה, בעיה זו צפויה. מדיה־ויקי 1.24 וגרסאות חדשות יותר אינן כוללות עיצובים ב־git repository הראשי. נסו להתקין כמה עיצובים מ[https://www.mediawiki.org/wiki/Category:All_skins ספריית העיצובים של mediawiki.org], על־ידי:\n:* הורדת [https://www.mediawiki.org/wiki/Download קובץ ה‏‏־tar להתקנה], שכולל מספר עיצובים והרחבות. באפשרותכם להעתיק ולהדביק מתוכו את תיקיית ה‏‏־<code>skins/</code>.\n:* שכפול (clone) אחד ממאגרים ב־<code>mediawiki/skins/*</code> בעזרת git לתוך תיקיית ה־<code dir=\"ltr\">skins/</code> בהתקנת מדיה־ויקי שלכם.\n: אם תעשו זאת, זה לא אמור להפריע ל‏‏מאגר ה־git שלכם (אם אתם מפתחים של מדיה־ויקי). ראו מידע בדף [https://www.mediawiki.org/wiki/Manual:Skin_configuration \"הגדרת עיצובים\" במדריך] על האפשרות להפעיל עיצובים ולבחור את עיצוב ברירת המחדל.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (מופעל)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''מבוטל''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''מבוטל''')",
+       "mediastatistics": "סטטיסטיקות קבצים",
+       "mediastatistics-summary": "סטטיסטיקה על סוגי קבצים שהועלו. הסטטיסטיקה כוללת רק את הגרסה החדשה ביותר של הקובץ: גרסאות ישנות או מחוקות של קבצים אינן כלולות.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|בית אחד|$1 בתים}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "סוג MIME",
+       "mediastatistics-table-extensions": "סיומות אפשריות",
+       "mediastatistics-table-count": "מספר הקבצים",
+       "mediastatistics-table-totalbytes": "גודל כולל",
+       "mediastatistics-header-unknown": "לא ידוע",
+       "mediastatistics-header-bitmap": "תמונות מפת סיביות",
+       "mediastatistics-header-drawing": "ציורים (תמונות וקטוריות)",
+       "mediastatistics-header-audio": "שמע",
+       "mediastatistics-header-video": "וידאו",
+       "mediastatistics-header-multimedia": "מדיה עשירה",
+       "mediastatistics-header-office": "מסמכים",
+       "mediastatistics-header-text": "טקסט",
+       "mediastatistics-header-executable": "בני־הרצה",
+       "mediastatistics-header-archive": "מכווצים",
+       "json-warn-trailing-comma": "{{PLURAL:$1|פסיק מסיים אחד הוסר|$1 פסיקים מסיימים הוסרו}} מטקסט ה־JSON",
+       "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": "ניתן ערך מסוג שלא יכול להיות מקודד"
 }
index dcccfad..c6eeae8 100644 (file)
        "hidetoc": "छुपाएँ",
        "collapsible-collapse": "छोटा करें",
        "collapsible-expand": "विस्तार करें",
+       "confirmable-confirm": "क्या {{GENDER:$1|आप}} निश्चित हो?",
+       "confirmable-yes": "हाँ",
+       "confirmable-no": "नहीं",
        "thisisdeleted": "$1 देखें या वापिस लाएँ?",
        "viewdeleted": "$1 दिखायें?",
        "restorelink": "{{PLURAL:$1|एक हटाया हुआ|$1 हटाये हुए}} बदलाव",
        "passwordreset-emailsent-capture": "नीचे दिखाया गया कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
        "passwordreset-emailerror-capture": "नीचे दृष्टित कूटशब्द रीसेट ई-मेल उत्पन्न किया गया था, परंतु उसे {{GENDER:$2|सदस्य}} को भेजना असफल रहा।\nत्रुटि: $1",
        "changeemail": "ई-मेल पता परिवर्तित करें",
-       "changeemail-header": "खाते का ई-मेल पता परिवर्तित करें",
        "changeemail-text": "अपना ई-मेल पता परिवर्तित करने के लिए इस फ़ॉर्म को पूरा करें। इस बदलाव की पुष्टि करने के लिये आपको अपना कूटशब्द पुनः लिखना पड़ेगा।",
        "changeemail-no-info": "इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।",
        "changeemail-oldemail": "वर्तमान ई-मेल पता:",
        "changeemail-none": "(कोई नहीं)",
        "changeemail-password": "आपका {{SITENAME}} पासवर्ड:",
        "changeemail-submit": "ई-मेल बदलें",
-       "changeemail-cancel": "रद्द करें",
        "changeemail-throttled": "आपने हाल ही में कई बार लॉग इन करने के प्रयास किये हैं।\nपुनः प्रयास करने से पहले कृपया $1 प्रतीक्षा करें।",
        "resettokens": "टोकन रीसेट करें",
        "resettokens-text": "जो टोकन आपके खाते से सम्बद्ध कुछ विशिष्ट व्यक्तिगत जानकारी प्रदान करते हैं, आप उन्हें यहाँ रीसेट कर सकते हैं।\n\nयदि आपने उन्हें गलती से किसी को दिखा दिया है या फिर आपका खाता हैक हो गया है तो आपको इन्हें रीसेट कर देना चाहिए।",
        "node-count-exceeded-category-desc": "यह उन पृष्ठों की श्रेणी है जिनमें नोड-संख्या सीमा पार की गयी है।",
        "node-count-exceeded-warning": "पृष्ठ ने नोड-संख्या पार की है",
        "expansion-depth-exceeded-category": "पृष्ठ जिनमें विस्तार गहराई पार की गई है",
-       "expansion-depth-exceeded-category-desc": "यह à¤\89न à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95à¥\80 à¤¶à¥\8dरà¥\87णà¥\80 à¤¹à¥\88 à¤\9cिनमà¥\87à¤\82 à¤µà¤¿à¤¸à¥\8dतार à¤\97हराà¤\88 à¤ªà¤¾à¤° à¤\95à¥\80 à¤\97यà¥\80 है।",
+       "expansion-depth-exceeded-category-desc": "यह à¤ªà¥\83षà¥\8dठ à¤µà¤¿à¤¸à¥\8dतार à¤\97हराà¤\88 à¤ªà¤¾à¤° à¤\95रता है।",
        "expansion-depth-exceeded-warning": "पृष्ठ में विस्तार गहराई पार की गई है",
        "parser-unstrip-loop-warning": "Unstrip लूप पाया गया",
        "parser-unstrip-recursion-limit": "Unstrip पुनरावर्तन सीमा पार की गई ($1)",
        "searchrelated": "सम्बंधित",
        "searchall": "सभी",
        "showingresults": "नीचे क्रमांक '''$2''' से प्रारंभ कर के अधिकतम '''$1''' परिणाम {{PLURAL:$1|दिखाया गया है|दिखाए गए हैं}}।",
-       "showingresultsheader": "'''$4''' के खोज परिणाम {{PLURAL:$5|कुल '''$3''' में से #'''$1'''|कुल '''$3''' में से क्रं. '''$1 - $2'''}}",
        "search-nonefound": "आपकी खोज से मेल खाते कोई परिणाम नहीं मिले।",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "नामस्थानों में खोजें:",
        "filedelete-maintenance": "रखरखाव चल रहा है और रखरखाव के दौरान फ़ाइलों को हटाना और पुनर्स्थापित करना अक्षम है।",
        "filedelete-maintenance-title": "फ़ाइल हटा नहीं सकते",
        "mimesearch": "MIME खोज",
-       "mimesearch-summary": "MIME-प्रकारों के अनुसार फ़ाइलें खोजने के लिये इस पृष्ठ का इस्तेमाल किया जा सकता है।\nइनपुट: फ़ाइल का प्रकार/उपप्रकार या प्रकार/*, उदा. <code>image/jpeg</code>।",
+       "mimesearch-summary": "MIME-प्रकारों के अनुसार फ़ाइलें खोजने के लिये इस पृष्ठ का इस्तेमाल किया जा सकता है।\nइनपुट: फ़ाइल का प्रकार/उपप्रकार या प्रकार/*, उदा <code>image/jpeg</code>।",
        "mimetype": "MIME प्रकार:",
        "download": "डाउनलोड",
        "unwatchedpages": "ध्यान न दिये हुए पृष्ठ",
        "randomincategory": "श्रेणी में यादृच्छिक (रैंडम) पृष्ठ",
        "randomincategory-invalidcategory": "\"$1\" एक मान्य श्रेणी नाम नहीं है।",
        "randomincategory-nopages": "[[:Category:$1|$1]] श्रेणी में कोई पृष्ठ नहीं हैं।",
-       "randomincategory-selectcategory": "श्रेणी से यादृच्छिक (रैंडम) पृष्ठ खोलें: $1 $2",
-       "randomincategory-selectcategory-submit": "खोलें",
        "randomredirect": "किसी एक पुनर्निर्देशन पर जाएँ",
        "randomredirect-nopages": "नामस्थान \"$1\" में कोई पुनर्निर्देशन नहीं हैं।",
        "statistics": "आँकड़े",
        "booksources": "पुस्तकों के स्रोत",
        "booksources-search-legend": "पुस्तकों के स्रोत खोजें",
        "booksources-isbn": "आइ॰एस॰बी॰एन:",
-       "booksources-go": "जायें",
        "booksources-text": "नीचे पुरानी और नई पुस्तकें बेचने वाली वेबसाइटों के एड्रेस हैं, जिसमें आपको आप द्वारा खोजी जाने वाली पुस्तक के बारे में अधिक जानकारी मिल सकती है:",
        "booksources-invalid-isbn": "यह आइ॰एस॰बी॰एन सही नहीं लग रहा है; मूल स्रोत से नकल करने में हुई त्रुटि के लिए जाँचें।",
        "specialloguserlabel": "कर्ता:",
        "wlheader-enotif": "ई-मेल नोटिफ़िकेशन सक्षम हैं।",
        "wlheader-showupdated": "पृष्ठ जो आपके द्वारा देखे जाने के बाद बदले गये हैं '''बोल्ड''' दिखेंगे।",
        "wlnote": "$3 को $4 बजे तक पिछले '''$2''' {{PLURAL:$2|घंटे|घंटों}} में {{PLURAL:$1|हुआ एक|हुए '''$1'''}} परिवर्तन निम्न {{PLURAL:$1|है|हैं}}।",
-       "wlshowlast": "पिछले $1 घंटे $2 दिन $3 देखें",
+       "wlshowlast": "पिछले $1 घंटे $2 दिन  देखें",
        "watchlist-options": "ध्यानसूची विकल्प",
        "watching": "ध्यान दे रहे हैं...",
        "unwatching": "ध्यान हटा रहे हैं...",
        "delete-edit-reasonlist": "हटाने के कारण संपादित करें",
        "delete-toobig": "इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है।\n{{SITENAME}} के अनपेक्षित रूप से बंद होने से रोकने के लिये ऐसे पृष्ठों को हटाने की अनुमति नहीं है।",
        "delete-warning-toobig": "इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है।\nइसे हटाने से {{SITENAME}} के डाटाबेस की गतिविधियों में व्यवधान आ सकता है;\nकृपया सोच समझ कर आगे बढ़ें।",
-       "delete-cantedit": "आप इस पृष्ठ को नहीं हटा सकते क्योंकि आपको इसकी अनुमति नहीं है।",
        "deleting-backlinks-warning": "'''चेतावनी:''' जो पृष्ठ आप हटाने जा रहे हैं उससे [[Special:WhatLinksHere/{{FULLPAGENAME}}|अन्य पृष्ठ]] जुड़ते हैं अथवा उसे ट्रांसक्लूड करते हैं।",
        "rollback": "संपादन वापिस लें",
        "rollback_short": "वापिस लें",
        "import": "पृष्ठ इम्पोर्ट करें",
        "importinterwiki": "ट्रान्सविकि आयात",
        "import-interwiki-text": "आयात करने के लिये एक विकि और एक पृष्ठ चुनें।\nअवतरण दिनांक और संपादक नाम ज्यों-के-त्यों रखे जाएँगे।\nसभी ट्रान्सविकि आयात क्रियाएँ [[Special:Log/import|आयात लॉग]] में डाली जाती हैं।",
-       "import-interwiki-source": "स्रोत विकि/पृष्ठ:",
        "import-interwiki-history": "इस पृष्ठ के सभी इतिहास अवतरण कॉपी करें",
        "import-interwiki-templates": "सभी साँचे शामिल करें",
        "import-interwiki-submit": "आयात",
        "exif-urgency-low": "न्यूनतम ($1)",
        "exif-urgency-high": "उच्चतम ($1)",
        "exif-urgency-other": "यूज़र-डिफ़ाइंड प्राथमिकता ( $1 )",
-       "watchlistall2": "सभी",
        "namespacesall": "सभी",
        "monthsall": "सभी",
        "confirmemail": "ई-मेल प्रमाणित करे",
        "logentry-rights-rights-legacy": "$1 ने $3 के सदस्य समूह {{GENDER:$2|बदले}}",
        "logentry-rights-autopromote": "$1 के सदस्य समूह स्वतः $4 से बदलकर $5 {{GENDER:$2|किये}} गए",
        "rightsnone": "(कोई नहीं)",
+       "revdelete-summary": "संपादन सारांश",
        "feedback-bugornote": "यदि आप किसी तकनीकी परेशानी को विस्तार से समझाने के लिये तैयार हैं तो कृपया [$1 बग फ़ाइल करें]।\nयदि नहीं, तो आप नीचे दिये सरल फ़ॉर्म का प्रयोग कर सकते हैं। आपकी टिप्पणी आपके सदस्य नाम और आपके ब्राउज़र के नाम के सहित \"[$3 $2]\" पृष्ठ में जोड़ दी जाएगी।",
        "feedback-subject": "विषय:",
        "feedback-message": "संदेश:",
index 0062c26..2015cef 100644 (file)
        "passwordreset-emailsent-capture": "Ek password yaad karae waala e-mail, jiske niche dekhawa jaawe hae, ke bhej dewa gais hae.",
        "passwordreset-emailerror-capture": "Ek password yaad karae waala e-mail ke banawa gais hae, jiske niche dekhawa jaawe hae, lekin jiske {{GENDER:$2|user}} ke lage bheje nai jawa sake hae: $1",
        "changeemail": "E-mail address ke badlo",
-       "changeemail-header": "Account e-mail address ke badlo",
        "changeemail-text": "Aapan e-mail ke badle kae khaatir ii form ke fill karo. Ii badlao ke khatir aap ke aapan password ke de ke parri.",
        "changeemail-no-info": "Ii panna ke sidha dekhe ke khaatir, aap ke login kare ke parri.",
        "changeemail-oldemail": "Abhi ke E-mail address:",
        "changeemail-none": "(kuchh nai)",
        "changeemail-password": "Aap ke {{SITENAME}} password:",
        "changeemail-submit": "E-mail badlo",
-       "changeemail-cancel": "Kaat do",
        "resettokens": "Token ke reset karo",
        "resettokens-text": "Aap aapan private data pe access roke ke khatir token ke reset kare saktaa hae.\n\nAap ke ii kare ke chaahi agar aap galti se ii jaankari ke aur koi ke de diya hae nai to aap ke account ke bare me aur koi ke pataa hae.",
        "resettokens-no-tokens": "Reset kare ke jhatir koi token nai hae.",
        "searchrelated": "sambhand rakkhe hai",
        "searchall": "sab",
        "showingresults": "Niche dekhae hai {{PLURAL:$1|'''1''' result|'''$1''' results}} #'''$2''' se suruu hoe ke.",
-       "showingresultsheader": "{{PLURAL:$5|Natija '''$1''' of '''$3'''|Natija '''$1 - $2''' of '''$3'''}} '''$4''' khatir",
        "search-nonefound": "Ii sawaal ke koi jawab nai hae.",
        "powersearch-legend": "Gahira khoj",
        "powersearch-ns": "Namespaces me khojo:",
        "querypage-disabled": "Ii khaas panna ke performance kaaran se disable kar drwa gais hae.",
        "booksources": "Pustak sources",
        "booksources-search-legend": "Book sources ke khojo",
-       "booksources-go": "Jao",
        "booksources-text": "Niche ke suchi me uu websites ke jorr hai jon ki nawaa aur use karaa gais book ke beche hai aur jon book ke aap khojtaa hai uske baare aur jaankari de sake hai:",
        "booksources-invalid-isbn": "Dewa gais ISBN thiik nai hai; iske purana jagha se copy kare ke time ke error ke check karo.",
        "specialloguserlabel": "Sadasya:",
        "wlheader-enotif": "E-mail notification ke enable kar dewa gais hai.",
        "wlheader-showupdated": "Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa jaawe hai.",
        "wlnote": "Niche ke {{PLURAL:$1|pahile waala badlao hai| pahile '''$1''' badlao hai}} pichhle {{PLURAL:$2|ghanta|'''$2''' ghanta}} me as of $3, $4..",
-       "wlshowlast": "Pichhla $1 ghanta $2 din $3 ke dekhao",
+       "wlshowlast": "Pichhla $1 ghanta $2 din  ke dekhao",
        "watchlist-options": "Dhyan suchi ke options",
        "watching": "Dekhtaa...",
        "unwatching": "Nai dekhtaa...",
        "import": "Panna ke import karo",
        "importinterwiki": "Transwiki se ayaat",
        "import-interwiki-text": "Ek wiki aur panna ke title ke select karo.\nBadalo ke tarik aur badle waala sadasya ke naam wahii rakam rahii.\nSab transwiki import actions ke [[Special:Log/import|import log]] pe log karaa jaawe hai.",
-       "import-interwiki-source": "Suruu waala wiki/panna:",
        "import-interwiki-history": "Ii panna ke sab badlao ke itihaas ke copy karo",
        "import-interwiki-templates": "Sab template ke include karo",
        "import-interwiki-submit": "Import karo",
        "exif-urgency-low": "Kamti ($1)",
        "exif-urgency-high": "Jaada ($1)",
        "exif-urgency-other": "Sadasya-defined priority ($1)",
-       "watchlistall2": "sab",
        "namespacesall": "sab",
        "monthsall": "sab",
        "confirmemail": "E-mail address ke pakka karo",
        "logentry-rights-rights-legacy": "$1 $3 ke group membership ke badal dia hae",
        "logentry-rights-autopromote": "$1 ke apne se $2 se $3 ke promotion dewa gais",
        "rightsnone": "(koi nai hai)",
+       "revdelete-summary": "summary ke badlo",
        "searchsuggest-search": "Khojo"
 }
index 1600b9d..d81fe6b 100644 (file)
        "passwordreset-emailsent-capture": "May e-mail nga nagapahanumdum, nga ginapakita sa idalom.",
        "passwordreset-emailerror-capture": "May e-mail nga nagapahanumdom nga ginbuhat, nga ginapakita sa idalom, apang ang pagpadala sa manuggamit indi madinalag-on: $1",
        "changeemail": "Ilisan ang E-mail adres",
-       "changeemail-header": "Ilisan ang e-mail adres sang akawnt",
        "changeemail-text": "Tapusa ang ini nga formas agod nga ma-ilisan ang imo e-mail adres. Kinahanglan mo nga magbutang sang imo pasword sa pag-kumperma sang sini nga pag-ilis.",
        "changeemail-no-info": "Kinahanglan nga nakasulod ka agod nga makadtoan ang ini nga panid sing derecho.",
        "changeemail-oldemail": "E-mail adres sa subong:",
        "changeemail-none": "(wala)",
        "changeemail-password": "Ang imong {{SITENAME}} nga password:",
        "changeemail-submit": "Ilisan and E-mail",
-       "changeemail-cancel": "Kanselahon",
        "bold_sample": "Dukot nga teksto",
        "bold_tip": "Dukot nga teksto",
        "italic_sample": "Gahilay nga teksto",
        "searchrelated": "konektado",
        "searchall": "tanan",
        "showingresults": "Ginapakita sa dalom pakadto sa {{PLURAL:$1|'''1''' ka resulta|'''$1''' ka mga resulta}} umpisa ang #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resulta nga '''$1''' sang '''$3'''|Mga resulta nga '''$1 - $2''' sang '''$3'''}} para sa '''$4'''",
        "search-nonefound": "Wala sang mga resulta nga nagsanto sa imo nga ginapangita.",
        "powersearch-legend": "Abanse nga pagpangita",
        "powersearch-ns": "Pangita sa mga ngalan-espasyo:",
        "pager-older-n": "{{PLURAL:$1|mas daan 1|mas daan $1}}",
        "booksources": "Mga ginkuhaan sang Libro",
        "booksources-search-legend": "Pangita-on ang ginakuhaan sang libro",
-       "booksources-go": "Lakat",
        "log": "Logs",
        "allpages": "Tanan nga mga pahina",
        "prevpage": "Antes nga pahina ($1)",
        "watchthispage": "Bantayan ining panid",
        "unwatch": "Di maglantaw",
        "watchlist-details": "{{PLURAL:$1|$1 pahina|$1 mga pahina}} sa imo nga lista sang paglantaw, indi ang pag-isip sang imo ginahambal nga mga pahina.",
-       "wlshowlast": "Ipakita ang nagligad nga $1 oras $2 adlaw $3",
+       "wlshowlast": "Ipakita ang nagligad nga $1 oras $2 adlaw",
        "watchlist-options": "Pililian sa lista sang nagalantaw",
        "watching": "Nagalantaw...",
        "unwatching": "Di-paglantaw...",
        "exif-digitalzoomratio": "Antas sang digital zoom",
        "exif-focallengthin35mmfilm": "Laba sang pokus sang film nga 35 mm",
        "exif-scenecapturetype": "Tipo sang pag-kuha sang litrato",
-       "watchlistall2": "tanan",
        "namespacesall": "tanan",
        "monthsall": "tanan",
        "imgmultigo": "Lakat",
        "revdelete-restricted": "ginapatuman nga pagbawal sa mga administrador",
        "revdelete-unrestricted": "ginkakas nga pagbawal sa mga administrador",
        "rightsnone": "(wala)",
+       "revdelete-summary": "liwaton ang kabilogan",
        "expand_templates_preview": "Ipakita subong"
 }
index a66de3d..d6aad10 100644 (file)
        "tog-showtoolbar": "Prikaži traku s alatima za uređivanje (zahtijeva JavaScript)",
        "tog-editondblclick": "Dvoklik otvara uređivanje stranice (JavaScript)",
        "tog-editsectiononrightclick": "Pritiskom na desnu tipku miša otvori uređivanje pojedinih odlomaka (JavaScript)",
-       "tog-watchcreations": "Dodaj članke koje kreiram na moj popis praćenja",
+       "tog-watchcreations": "Dodaj stranice koje sam stvorio na moj popis praćenja",
        "tog-watchdefault": "Dodaj svaku stranicu koju uredim na moj popis praćenja",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premjestim na moj popis praćenja",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje izbrišem na popis praćenja",
+       "tog-watchrollback": "Dodaj stranice na kojima sam vratio uređivanja na popis praćenja",
        "tog-minordefault": "Normalno označavaj sve moje izmjene kao manje",
        "tog-previewontop": "Prikaži kako će stranica izgledati iznad okvira za uređivanje",
        "tog-previewonfirst": "Prikaži kako će stranica izgledati čim otvorim uređivanje",
        "view": "Vidi",
        "view-foreign": "vidi na projektu $1",
        "edit": "uredi",
+       "edit-local": "Uredi lokalni opis",
        "create": "Započni",
        "create-local": "dodaj lokalni opis",
        "editthispage": "Uredi ovu stranicu",
        "hidetoc": "sakrij",
        "collapsible-collapse": "sklopi stablo",
        "collapsible-expand": "raširi stablo",
+       "confirmable-confirm": "Jeste li sigurni?",
+       "confirmable-yes": "Da",
+       "confirmable-no": "Ne",
        "thisisdeleted": "Vidi ili vrati $1?",
        "viewdeleted": "Vidi $1?",
        "restorelink": "{{PLURAL:$1|$1 pobrisanu izmjenu|$1 pobrisane izmjene|$1 pobrisanih izmjena}}",
        "createacct-benefit-heading": "{{SITENAME}} su stvorili ljudi poput Vas.",
        "createacct-benefit-body1": "{{PLURAL:$1|uređivanje|uređivanja}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice|stranica}}",
-       "createacct-benefit-body3": "nedavnih {{PLURAL:$1|suradnik|suradnika}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|nedavni suradnik|nedavnih suradnika}}",
        "badretype": "Unesene lozinke nisu istovjetne.",
        "userexists": "Uneseno suradničko ime već je u upotrebi.\nUnesite neko drugo ime.",
        "loginerror": "Pogrješka u prijavi",
        "login-userblocked": "Ovaj je suradnik blokiran. Prijava nije dopuštena.",
        "wrongpassword": "Lozinka koju ste unijeli nije ispravna. Pokušajte ponovno.",
        "wrongpasswordempty": "Niste unijeli lozinku. Pokušajte ponovno.",
-       "passwordtooshort": "Lozinka mora sadržavati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
+       "passwordtooshort": "Zaporka mora sadržavati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
        "password-name-match": "Vaša lozinka mora biti različita od Vašeg suradničkog imena.",
        "password-login-forbidden": "Uporaba ovog suradničkog imena i lozinke nije dozvoljena.",
        "mailmypassword": "Pošalji mi novu lozinku",
        "passwordremindertext": "Netko je (vjerojatno Vi, s IP adrese $1) zatražio novu lozinku za projekt {{SITENAME}} ($4).\nPrivremena lozinka za suradnika \"$2\" je postavljena na \"$3\".\nUkoliko ste to Vi učinili, molimo Vas da se prijavite i promijenite lozinku.\nPrivremena lozinka vrijedi još {{PLURAL:$5|$5 dan|$5 dana}}.\n\nUkoliko niste zatražili novu lozinku, ili ste se sjetili stare lozinke i\nviše ju ne želite promijeniti, slobodno zanemarite ovu poruku i nastavite\nkoristiti staru lozinku.",
        "noemail": "Suradnik \"$1\" nema zapisanu e-mail adresu.",
        "noemailcreate": "Morate navesti važeću e-mail adresu",
-       "passwordsent": "Nova je lozinka poslana na e-mail adresu suradnika \"$1\"",
+       "passwordsent": "Nova je zaporka poslana na adresu elektroničke pošte suradnika \"$1\"",
        "blocked-mailpassword": "Vašoj IP adresi je blokirano uređivanje stranica, a da bi se spriječila nedopuštena radnja, mogućnost zahtijevanja nove lozinke je također onemogućena.",
        "eauthentsent": "Na navedenu adresu poslana je e-poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, molimo Vas otvorite e-poruku i slijedite u njemu sadržana uputstva kako biste potvrdili da je adresa e-pošte zaista Vaša.",
        "throttled-mailpassword": "Već Vam je poslan e-mail za promjenu zaporke, u {{PLURAL:$1|posljednjih sat vremena|posljednja $1 sata|posljednjih $1 sati}}.\nDa bi spriječili zloupotrebu, moguće je poslati samo jedan e-mail za promjenu zaporke {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
        "php-mail-error-unknown": "Nepoznata pogrješka u funkciji PHP-poruke()",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez e-mail adrese.",
        "user-mail-no-body": "Pokušali ste poslati e-mail bez sadržaja ili s prekratkim sadržajem.",
-       "changepassword": "Promjena lozinke",
+       "changepassword": "Promjena zaporke",
        "resetpass_announce": "Da biste završili proces mijenjanja lozinke, upišite \nnovu lozinku.",
        "resetpass_header": "Promijeni lozinku računa",
        "oldpassword": "Stara lozinka",
        "passwordreset": "Ponovno postavi lozinku",
        "passwordreset-text-one": "Ispunite ovaj obrazac ako želite ponovno postaviti Vašu zaporku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja da biste dobili privremenu zaporku e-poštom.}}",
-       "passwordreset-legend": "Poništi lozinku",
+       "passwordreset-legend": "Poništi zaporku",
        "passwordreset-disabled": "Poništavanje lozinke je onemogućeno na ovom wikiju.",
        "passwordreset-emaildisabled": "Funkcija e-pošte je onemogućena na ovom wikiju.",
        "passwordreset-username": "Suradničko ime:",
        "passwordreset-emailsent-capture": "Poslan Vam je podsjetnik kao e-pošta (tekst je prikazan dolje).",
        "passwordreset-emailerror-capture": "Napravljena je e-poruka za ponovno postavljanje zaporke (prikazana ispod), ali njeno slanje suradniku nije uspjelo: $1",
        "changeemail": "Promijeni e-mail adresu",
-       "changeemail-header": "Promijeni e-mail adresu računa",
        "changeemail-text": "Za promjenu e-mail adrese popunite ovaj obrazac. Morat ćete unijeti svoju lozinku da potvrdite ovu promjenu.",
        "changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
-       "changeemail-oldemail": "Trenutna E-mail adresa:",
-       "changeemail-newemail": "Nova E-mail adresa:",
+       "changeemail-oldemail": "Trenutačna adresa e-pošte:",
+       "changeemail-newemail": "Nova adresa e-pošte:",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Zaporka za {{SITENAME}}:",
        "changeemail-submit": "Promijeni E-mail",
-       "changeemail-cancel": "Odustani",
        "bold_sample": "Podebljani tekst",
        "bold_tip": "Podebljani tekst",
        "italic_sample": "Kurzivni tekst",
        "autoblockedtext": "Vaša IP adresa automatski je blokirana zbog toga što ju je koristio drugi suradnik, kojeg je blokirao $1.\nRazlog blokiranja je sljedeći:\n\n:''$2''\n\n* Početak blokade: $8\n* Blokada istječe: $6\n* Ime blokiranog suradnika: $7\n\nMožete kontaktirati $1 ili jednog od [[{{MediaWiki:Grouppage-sysop}}|administratora]] kako bi Vam pojasnili razlog blokiranja.\n\nPrimijetite da ne možete rabiti opciju \"Pošalji mu e-poruku\" ako niste upisali valjanu adresu e-pošte u Vašim [[Special:Preferences|suradničkim postavkama]] i ako niste u tome onemogućeni prilikom blokiranja.\n\nVaša trenutačna IP adresa je $3, a oznaka bloka #$5. Molimo navedite ovaj broj kod svakog upita vezano za razlog blokiranja.",
        "blockednoreason": "bez obrazloženja",
        "whitelistedittext": "Za uređivanje stranice morate se $1.",
-       "confirmedittext": "Morate potvrditi Vašu e-mail adresu prije nego što Vam bude omogućeno uređivanje. Molim unesite i ovjerite Vašu e-mail adresu u [[Special:Preferences|suradničkim postavkama]].",
+       "confirmedittext": "Morate potvrditi Vašu adresu e-pošte prije nego što Vam bude omogućeno uređivanje. Molim unesite i ovjerite Vašu adresu e-pošte u [[Special:Preferences|suradničkim postavkama]].",
        "nosuchsectiontitle": "Ne mogu pronaći odlomak",
        "nosuchsectiontext": "Pokušali ste uređivati odlomak koji ne postoji.\nMožda je premješten ili izbrisan dok ste pregledavali stranicu.",
        "loginreqtitle": "Nužna prijava",
        "edit-conflict": "Sukob uređivanja.",
        "edit-no-change": "Vaše uređivanje je zanemareno, jer nikakva promjena sadržaja nije napravljena.",
        "postedit-confirmation-created": "Stranica je stvorena.",
+       "postedit-confirmation-restored": "Stranica je vraćena.",
        "postedit-confirmation-saved": "Vaše je uređivanje sačuvano.",
        "edit-already-exists": "Neuspješno stvaranje nove stranice.\nStranica već postoji.",
        "defaultmessagetext": "Prvotni tekst poruke",
        "revdelete-selected-file": "{{PLURAL:$1|Označena inačica|Označene inačice}} datoteke [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Odabrani zapis u evidenciji|Odabrani zapisi u evidenciji}}:",
        "revdelete-text-text": "Izbrisane izmjene će i dalje biti vidljive u povijesti stranice, ali dijelovi sadržaja neće biti vidljivi javno.",
+       "logdelete-text": "Izbrisane izmjene i dalje će biti vidljive u zapisnicima, ali dijelovi njihova sadržaja biti će nedostupni za javnost.",
        "revdelete-text-others": "Ostali administratori na projektu {{SITENAME}} će moći vidjeti i vratiti izbrisani sadržaj na isti način, osim ako nisu postavljena dodatna ograničenja.",
        "revdelete-confirm": "Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sklanjanje uređivanja treba raditi '''iznimno''' u slijedećih par slučajeva:\n* Privatne informacije neprilične javnom mediju tipa\n*: ''kućna adresa i broj telefona, JMBG ili OIB, itd.''",
        "revdelete-failure": "'''Vidljivost inačice nije mogla biti ažurirana:'''\n$1",
        "logdelete-success": "'''Vidljivost uređivanja uspješno postavljena.'''",
        "logdelete-failure": "'''Vidljivost evidencije ne može biti postavljena:'''\n$1",
-       "revdel-restore": "Promijeni dostupnost",
+       "revdel-restore": "promijeni dostupnost",
        "pagehist": "stare izmjene",
        "deletedhist": "Obrisana povijest",
        "revdelete-hide-current": "Pogrješka u skrivanju stavke datirane $2, $1: ovo je trenutačna inačica. Ne može biti skrivena.",
        "searchall": "sve",
        "showingresults": "Dolje {{PLURAL:$1|je prikazan '''$1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}}, počevši od '''$2'''.",
        "showingresultsinrange": "Dolje {{PLURAL:$1|je prikazan '''$1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}}, u rasponu od '''$2''' do '''$3'''.",
-       "showingresultsheader": "{{PLURAL:$5|Rezultat '''$1''' od '''$3'''|Rezultati '''$1 - $2''' od '''$3'''}} za '''$4'''",
        "search-nonefound": "Ne postoje rezultati koji se podudaraju s upitom.",
        "powersearch-legend": "Napredno pretraživanje",
        "powersearch-ns": "Traži u imenskom prostoru:",
        "prefs-watchlist-token": "Token popisa praćenja:",
        "prefs-misc": "Razno",
        "prefs-resetpass": "Promijeni lozinku",
-       "prefs-changeemail": "promijeni e-mail",
+       "prefs-changeemail": "promijeni adresu e-pošte",
        "prefs-setemail": "Postavite E-mail adresu",
        "prefs-email": "Mogućnosti e-maila",
        "prefs-rendering": "Izgled",
        "recentchanges-noresult": "U zadanom vremenu nema promjena za zadane kriterije.",
        "recentchanges-feed-description": "Na ovoj stranici možete pratiti nedavne promjene u wikiju.",
        "recentchanges-label-newpage": "Ova izmjena stvorila je novu stranicu",
-       "recentchanges-label-minor": "Ovo je manja izmjena",
-       "recentchanges-label-bot": "Ovu izmjenu napravio je bot",
-       "recentchanges-label-unpatrolled": "Ova izmjena još nije pregledana",
+       "recentchanges-label-minor": "Manja izmjena",
+       "recentchanges-label-bot": "Izmjenu napravio bot",
+       "recentchanges-label-unpatrolled": "Nepregledana izmjena",
        "recentchanges-label-plusminus": "Promjena veličine stranice (u bajtovima)",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "$1 - nova stranica",
+       "recentchanges-legend-newpage": "Nova stranica",
        "rcnotefrom": "Slijede promjene od <b>$2</b> (prikazano ih je do <b>$1</b>).",
        "rclistfrom": "Prikaži nove promjene počevši od $3 $2",
        "rcshowhideminor": "$1 manje promjene",
        "listfiles_description": "Opis",
        "listfiles_count": "Inačice",
        "listfiles-show-all": "Uključujući starije inačice slika",
+       "listfiles-latestversion": "Trenutačna inačica",
        "listfiles-latestversion-yes": "Da",
        "listfiles-latestversion-no": "Ne",
        "file-anchor-link": "Slika",
        "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 $2, $1",
+       "filerevert-defaultcomment": "vraćeno na inačicu od $1 ($2)",
        "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.",
        "unusedtemplateswlh": "druge poveznice",
        "randompage": "Slučajna stranica",
        "randompage-nopages": "Nema stranica u {{PLURAL:$2|imenskom prostoru|imenskim prostorima}}: $1.",
-       "randomincategory-selectcategory-submit": "Idi",
        "randomredirect": "Slučajno preusmjeravanje",
        "randomredirect-nopages": "Nema preusmjeravanja u imenskom prostoru \"$1\".",
        "statistics": "Statistika",
        "statistics-users-active": "Aktivni suradnici",
        "statistics-users-active-desc": "Suradnici koji su napravili neku od radnji u posljednjih {{PLURAL:$1|dan|$1 dana}}",
        "statistics-mostpopular": "Najposjećenije stranice",
+       "pageswithprop": "Stranice sa osobinom stranice",
+       "pageswithprop-legend": "Stranice sa osobinom stranice",
        "pageswithprop-prop": "Ime osobine:",
        "pageswithprop-submit": "Idi",
        "doubleredirects": "Dvostruka preusmjeravanja",
        "querypage-disabled": "Ova posebna stranica onemogućena je jer bi usporila funkcioniranje projekta.",
        "booksources": "Pretraživanje po ISBN-u",
        "booksources-search-legend": "Traženje izvora za knjigu",
-       "booksources-go": "Kreni",
        "booksources-text": "Ovdje je popis vanjskih poveznica na internetskim stranicama koje prodaju nove i rabljene knjige, ali mogu sadržavati i ostale podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Čini se da dani ISBN nije valjan; provjerite greške kopirajući iz izvornika.",
        "specialloguserlabel": "Suradnik:",
        "wlheader-enotif": "Uključeno je izvješćivanje e-poštom.",
        "wlheader-showupdated": "Stranice koje su promijenjene od Vašeg posljednjeg posjeta prikazane su '''podebljano'''",
        "wlnote": "Ovdje {{PLURAL:$1|je posljednja $1 promjena|su posljednje $1 promjene|je posljednjih $1 promjena}} u {{PLURAL:$2|posljednjem '''$2''' satu|posljednja '''$2''' sata|posljednjih '''$2''' sati}}, od $3, $4.",
-       "wlshowlast": "Prikaži posljednjih $1 sati $2 dana $3",
+       "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-options": "Izbornik popisa praćenja",
        "watching": "Pratim...",
        "unwatching": "Prestajem pratiti...",
        "blocklogpage": "Evidencija blokiranja",
        "blocklog-showlog": "Ovaj suradnik je ranije blokiran.\nEvidencija blokiranja je prikazan ispod kao napomena:",
        "blocklog-showsuppresslog": "Ovaj suradnik je ranije blokiran i skriven.\nZapisnik skrivanja je prikazan ispod kao napomena:",
-       "blocklogentry": "Blokiran je \"[[$1]]\" na rok $2 $3",
+       "blocklogentry": "Blokiran je \"[[$1]]\" na rok $2 $3.",
        "reblock-logentry": "promijenjene postavke blokiranja za [[$1]] na rok od $2 $3",
        "blocklogtext": "Ovo je evidencija blokiranja i deblokiranja.\nNa popisu nema automatski blokiranih IP adresa.\nZa popis trenutačnih zabrana i blokiranja vidi [[Special:BlockList|popis blokiranja]].",
-       "unblocklogentry": "Deblokiran \"$1\"",
+       "unblocklogentry": "Deblokiran je \"$1\".",
        "block-log-flags-anononly": "samo za neprijavljene suradnike",
        "block-log-flags-nocreate": "otvaranje novih suradničkih imena nije moguće",
        "block-log-flags-noautoblock": "autoblok je onemogućen",
        "import": "Uvezi stranice",
        "importinterwiki": "Transwiki uvoz",
        "import-interwiki-text": "Izaberite wiki i ime stranice za uvoz.\nPovijest stranice i imena suradnika će biti sačuvani.\nTranswiki uvoz stranica je zabilježen u [[Special:Log/import|evidenciji uvoza stranica]].",
-       "import-interwiki-source": "Izvor wiki/stranica:",
        "import-interwiki-history": "Prenesi sve inačice ove stranice",
        "import-interwiki-templates": "Uključi sve predloške",
        "import-interwiki-submit": "Uvezi",
        "pageinfo-length": "Dužina stranice (u bajtovima)",
        "pageinfo-article-id": "ID stranice",
        "pageinfo-language": "Jezik stranice",
+       "pageinfo-content-model": "Tip podataka na stranici",
        "pageinfo-robot-policy": "Status tražilice",
        "pageinfo-robot-index": "Stranicu je moguće indeksirati",
        "pageinfo-robot-noindex": "Indeksiranje stranice onemogućeno",
        "pageinfo-views": "Broj pregleda",
        "pageinfo-watchers": "Broj pratitelja stranice",
+       "pageinfo-few-watchers": "Manje od $1 {{PLURAL:$1|suradnika koji prate ovu stranicu|suradnika koji prate ovu stranicu}}",
        "pageinfo-redirects-name": "Broj preusmjeravanja na ovu stranicu",
        "pageinfo-subpages-name": "Podstranice",
        "pageinfo-subpages-value": "Ukupno $1 ($2 {{PLURAL:$2|preusmjeravanje|preusmjeravanja}}; $3 {{PLURAL:$3|obična podstranica|obične podstranice|običnih podstranica}})",
        "markedaspatrollednotify": "Uređivanje stranice $1 označeno je pregledanim.",
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Evidencija pregledavanja promjena",
-       "patrol-log-header": "Ovo su evidencije patroliranih izmjena.",
+       "patrol-log-header": "Ovo su evidencije ophođenih izmjena.",
        "log-show-hide-patrol": "$1 evidenciju patroliranja",
        "deletedrevision": "Izbrisana stara inačica $1",
        "filedeleteerror-short": "Pogrješka u brisanju datoteke: $1",
        "minutes-ago": "prije $1 {{PLURAL:$1|minute|minuta}}",
        "seconds-ago": "prije $1 {{PLURAL:$1|sekunde|sekundi}}",
        "bad_image_list": "Rabi se sljedeći format:\n\nSamo retci koji počinju sa zvjezdicom su prikazani. Prva poveznica u retku mora biti poveznica na nevaljanu sliku.\nSvaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se slike pojavljuju ''inline''.",
-       "variantname-sr-ec": "ћирилица",
+       "variantname-sr-ec": "ćirilica",
        "variantname-sr-el": "latinica",
        "metadata": "Metapodaci",
        "metadata-help": "Ova datoteka sadržava dodatne podatke koje je vjerojatno dodala digitalna kamera ili skener u procesu snimanja odnosno digitalizacije. Ako je datoteka mijenjana, podatci možda nisu u skladu sa stvarnim stanjem.",
        "exif-urgency-low": "Nisko ( $1 )",
        "exif-urgency-high": "Visoko ($1)",
        "exif-urgency-other": "Suradnički definiran prioritet ($1)",
-       "watchlistall2": "sve",
        "namespacesall": "sve",
        "monthsall": "sve",
-       "confirmemail": "Potvrda e-mail adrese",
+       "confirmemail": "Potvrdite adresu e-pošte",
        "confirmemail_noemail": "Niste unijeli važeću e-mail adresu u Vaše [[Special:Preferences|suradničke postavke]].",
        "confirmemail_text": "U ovom wikiju morate prije korištenja e-mail naredbi potvrditi svoju e-mail adresu. Kliknite na gumb ispod kako biste poslali poruku s potvrdom na Vašu adresu. U poruci će biti poveznica koju morate otvoriti u svom web pregledniku i time potvrditi svoju e-mail adresu.",
        "confirmemail_pending": "Već Vam je e-mailom poslan potvrdni kôd;\nako ste upravo otvorili suradnički račun, molimo pričekajte još nekoliko minuta da e-mail stigne prije nego što zatražite novi kôd.",
        "confirmemail_invalid": "Pogrešna potvrda. Kôd je možda istekao.",
        "confirmemail_needlogin": "Molimo $1 kako biste potvrdili Vašu e-mail adresu.",
        "confirmemail_success": "Vaša je e-mail adresa potvrđena. Možete se prijaviti i uživati u wikiju.",
-       "confirmemail_loggedin": "Vaša je e-mail adresa potvrđena.",
+       "confirmemail_loggedin": "Vaša je adresa e-pošte potvrđena.",
        "confirmemail_subject": "{{SITENAME}}: potvrda e-mail adrese",
-       "confirmemail_body": "Netko, vjerojatno Vi, s IP adrese $1 je otvorio\nsuradnički račun pod imenom \"$2\" s ovom e-mail adresom na {{SITENAME}}.\n\nKako biste potvrdili da je ovaj suradnički račun uistinu Vaš i\nomogućili e-mail funkcije na {{SITENAME}}, otvorite u Vašem\npregledniku sljedeću poveznicu:\n\n$3\n\nAko to *niste* Vi, slijedite ovaj link za poništavanje potvrde:\n\n$5\n\nValjanost ovog potvrdnog koda istječe na $4.",
+       "confirmemail_body": "Netko, vjerojatno Vi, s IP adrese $1 otvorio je\nsuradnički račun pod imenom \"$2\" s ovom adresom e-pošte na {{SITENAME}}.\n\nKako biste potvrdili da je ovaj suradnički račun uistinu Vaš i\nomogućili funkcije e-pošte na {{SITENAME}}, otvorite u Vašem\npregledniku sljedeću poveznicu:\n\n$3\n\nAko to *niste* Vi, slijedite ovu poveznicu za poništavanje potvrde:\n\n$5\n\nValjanost ovog potvrdnog kȏda istječe na $4.",
        "confirmemail_body_changed": "Netko, vjerojatno Vi, s IP adrese $1,\npromijenio je adresu e-pošte suradničkog računa \"$2\" u ovu adresu na {{SITENAME}}.\n\nKako biste potvrdili da je ovaj suradnički račun uistinu Vaš te uključili\nmogućnosti e-pošte na {{SITENAME}}, otvorite u Vašem pregledniku sljedeću poveznicu:\n\n$3\n\nUkoliko suradnički račun *ne* pripada Vama, slijedite ovu poveznicu\nza poništavanje potvrde adrese e-pošte:\n\n$5\n\nValjanost ovog potvrdnog koda istječe $4.",
        "confirmemail_body_set": "Netko, najvjerojatnije vi, s IP adrese $1,\notvorio je suradnički račun pod imenom \"$2\" s ovom adresom e-pošte na {{SITENAME}}.\n\nKako biste potvrdili da je ovaj suradnički račun uistinu vaš i uključili \nmogućnosti e-poruka na {{SITENAME}}, otvorite u vašem pregledniku sljedeću poveznicu:\n\n$3\n\nAko ovaj suradnički račun *ne* pripada vama, slijedite ovaj link \nkako biste poništili potvrdu adrese elektroničke pošte:\n\n$5\n\nValjanost ovog potvrdnog kȏda istječe u $4",
        "confirmemail_invalidated": "Potvrda E-mail adrese je otkazana",
        "logentry-rights-rights": "$1 {{GENDER:$2|je promijenio|je promijenila}} suradnička prava računa $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|je promijenio|je promijenila}} članstvo skupine suradničkog računa $3",
        "logentry-rights-autopromote": "Suradničkom računu $1 {{GENDER:$1| automatski je promijenjeno članstvo|automatski su promijenjena članstva}} iz $4 u $5",
+       "logentry-upload-upload": "$1 је {{GENDER:$2|postavio|postavila}} $3",
+       "logentry-upload-overwrite": "$1 је {{GENDER:$2|postavio|postavila}} novu inačicu $3",
+       "logentry-upload-revert": "$1 је {{GENDER:$2|postavio|postavila}} $3",
        "rightsnone": "(suradnik)",
+       "revdelete-summary": "sažetak",
        "feedback-bugornote": "Ako ste spremni detaljno opisati tehnički problem molimo [$1 prijavite \"bug\"].\nInače, možete ispuniti jednostavan obrazac u nastavku. Vaš komentar biti će dodan na stranicu \"[$3 $2]\", zajedno s vašim suradničkim imenom i imenom internetskog preglednika koji rabite.",
        "feedback-subject": "Tema:",
        "feedback-message": "Poruka:",
index d51bf83..ee194cd 100644 (file)
        "passwordreset-emailsent-capture": "En Passwortzurücksetzung-E-Mail woard versandt, die unne oongezeicht weard.",
        "passwordreset-emailerror-capture": "Die unne oongezeichte Passwortzurücksetzungs-E-Mail woard generiert, awer der Versand an {{GENDER:$2|den Benutzer|die Benutzrin}} ist gescheitert: $1",
        "changeemail": "E-Mail-Adress ännre",
-       "changeemail-header": "E-Mail-Adress ännre",
        "changeemail-text": "Füll das Formular vollständig aus, um dein E-Mail-Adress zu ännre. Du musst dein Passwort oongewe, um die Ännrung zu bestätiche.",
        "changeemail-no-info": "Du musst dich oonmelde, um uff die Seit direkt zuzugreife.",
        "changeemail-oldemail": "Aktuell E-Mail-Adress:",
        "changeemail-none": "(ken)",
        "changeemail-password": "Dein {{SITENAME}}-Passwort:",
        "changeemail-submit": "E-Mail-Adress ännre",
-       "changeemail-cancel": "Abbreche",
        "changeemail-throttled": "Du host keerzlich zu viele Oonmeldversuche unnernomm.\nBittachön woort $1, bevoar du das erneit versuchst.",
        "resettokens": "Tokens zurücksetze",
        "resettokens-text": "Du kannst Tokens zurücksetze, wo dir den Zugriff uff bestimmte private Date ermöchliche, wo mit deinem Benutzerkonto hier verknüpft sind.\n\nDu sollst das nuar mache, wenn du verguckt die Tokens versiehntlich mit jemandem geteilt host orrer dein Konto gefährdet ist.",
        "searchall": "alle",
        "showingresults": "Hier {{PLURAL:$1|ist '''1''' Ergebnis|sind '''$1''' Ergebnisse}}, beginnend mit Nummer '''$2.'''",
        "showingresultsinrange": "Unne {{PLURAL:$1|weard <strong>en</strong> Ergebnis|werre bis zu <strong>$1</strong> Ergebnisse}} im Bereich <strong>$2</strong> bis <strong>$3</strong> oongezeicht.",
-       "showingresultsheader": "{{PLURAL:$5|Ergebnis '''$1''' von '''$3'''|Ergebnisse '''$1–$2''' von '''$3'''}} für '''$4'''",
        "search-nonefound": "Zu deiner Suchoonfroch wore ken Ergebnisse gefund.",
        "powersearch-legend": "Erweiterte Such",
        "powersearch-ns": "Such in Noomeräume:",
        "randomincategory": "Zufälliche Seit von en Kategorie",
        "randomincategory-invalidcategory": "\"$1\" ist ken gülticher Kategorieenoome.",
        "randomincategory-nopages": "Es gebt kene Seite in [[:Category:$1]].",
-       "randomincategory-selectcategory": "Zufälliche Seit aus der Kategorie: $1 $2",
-       "randomincategory-selectcategory-submit": "Geh, los",
        "randomredirect": "Zufällich Weiterleitung",
        "randomredirect-nopages": "Im Noomeraum „$1“ sind ken Weiterleitunge voarhand.",
        "statistics": "Statistik",
        "querypage-disabled": "Die Spezialseit woard aus Gründe von der Leistungserhaltung deaktiviert.",
        "booksources": "ISBN-Suche",
        "booksources-search-legend": "Such noh Bezugsquelle für Bücher",
-       "booksources-go": "Suche",
        "booksources-text": "Dies ist en List mit Links zu Internetseite, wo neie und gebrauchte Bücher verkoofe. Dort kann das ooch weitre Informationen üwer die Bücher gebe. {{SITENAME}} ist mit kenem von der Oonbieter geschäftlich verbünd.",
        "booksources-invalid-isbn": "Vermutlich ist die ISBN ungültich.\nBittschön prüf, ob die korrekt von der Quell üwertroohr woard.",
        "specialloguserlabel": "Ausführender Benutzer:",
        "watchlist-details": "Du beobachtest {{PLURAL:$1|en Seit|$1 Seite}}, ohne dass Diskussionsseite getrennt gezählt werre.",
        "wlheader-enotif": "Der E-Mail-Benachrichtigungsdienst ist aktiviert.",
        "wlheader-showupdated": "Seite mit noch net gesiehne Ännrunge werre'''fett''' dorgestellt.",
-       "wlshowlast": "Zeich die Ännrunge von der letzte $1 Stunde, $2 Tooch orrer $3.",
+       "wlshowlast": "Zeich die Ännrunge von der letzte $1 Stunde, $2 Tooch orrer .",
        "watchlist-options": "Oonzeichoptione",
        "watching": "Beobachte …",
        "unwatching": "Netmehr beobachte …",
        "import": "Seite importiere",
        "importinterwiki": "Transwiki-Import",
        "import-interwiki-text": "Wähl en Wiki und en Seit für se importiere.\nDie Versionsdate und Benutzernoome bleibe dabei erhalt.\nAll Transwiki-Import-Aktione werre im [[Special:Log/import|Import-Logbuch]] protokolliert.",
-       "import-interwiki-source": "Quell-Wiki/-Seit:",
        "import-interwiki-history": "Alle Versione von der Seit importiere",
        "import-interwiki-templates": "Alle Vorlooche einschliesse",
        "import-interwiki-submit": "Importiere",
        "exif-urgency-low": "Niedrich ($1)",
        "exif-urgency-high": "Hoch ($1)",
        "exif-urgency-other": "Benutzerdefinierte Priorität ($1)",
-       "watchlistall2": "all",
        "namespacesall": "all",
        "monthsall": "all",
        "confirmemail": "E-Mail-Adress bestätiche (Authentifizierung)",
index a15861f..adb54f6 100644 (file)
@@ -11,7 +11,8 @@
                        "Tchoř",
                        "Tlustulimu",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Mikławš"
                ]
        },
        "tog-underline": "Wotkazy podšmórnić:",
        "perfcached": "Slědowace daty pochadźeja z pufrowaka a njejsu snano cyle aktualne. Maksimalnje {{PLURAL:$1|jedyn wuslědk|$1 wuslědkaj|$1 wuslědki|$1 wuslědkow}} w pufrowaku k dispoziciji {{PLURAL:$1|steji|stejitej|steja|steji}}.",
        "perfcachedts": "Slědowace daty su z pufrowaka a buchu $1 posledni raz zaktualizowane. Maksimalnje {{PLURAL:$4|jedyn wuslědk|$4 wuslědkaj|$4 wuslědki|$4 wuslědkow}} w pufrowaku k dispoziciji {{PLURAL:$4|steji|stejitej|steja|steji}}.",
        "querypage-no-updates": "Aktualizacije za tutu stronu su tuchwilu znjemóžnjene. Daty so hač na dalše njewobnowja.",
-       "viewsource": "žórÅ\82o wobhladaÄ\87",
+       "viewsource": "ŽórÅ\82owy tekst",
        "viewsource-title": "Žórłowy tekst za $1 sej wobhladać",
        "actionthrottled": "Akcije wobmjezowane",
        "actionthrottledtext": "Jako připrawa přećiwo spamej, je častosć wuwjedźenja tuteje akcije w krótkej dobje wobmjezowana a ty sy tutón limit překročił. Prošu spytaj za něšto mjeńšiny hišće raz.",
        "passwordreset-emailsent-capture": "E-mejl za anulowanje hesła je so pósłała, kotraž so deleka pokazuje.",
        "passwordreset-emailerror-capture": "E-mejl za anulowanje hesła je so wutworiła, kotraž so deleka pokazuje, ale słanje {{GENDER:$2|wužiwarjej|wužiwarce}} je so njeporadźiło: $1",
        "changeemail": "E-mejlowu adresu změnić",
-       "changeemail-header": "Kontowu e-mejlowu adresu změnić",
        "changeemail-text": "Wupjelń tutón formular, zo by swoju e-mejlowu adresu změnił. Dyrbiš swoje hesło zapodać, zo by tutu změnu wobkrućił.",
        "changeemail-no-info": "Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.",
        "changeemail-oldemail": "Aktualna e-mejlowa adresa:",
        "changeemail-none": "(žana)",
        "changeemail-password": "Twoje hesło za {{GRAMMAR:akuzatiw|{{SITENAME}}}}",
        "changeemail-submit": "E-mejlowu adresu změnić",
-       "changeemail-cancel": "Přetorhnyć",
        "changeemail-throttled": "Sy přehusto spytał so přizjewić.\nPočakaj prošu $1, prjedy hač hišće raz spytaš.",
        "resettokens": "Tokeny wróćo stajić",
        "resettokens-text": "Móžeš tokeny wróćo stajić, kotrež přistup na wěste priwatne daty dowoleja, kotrež su z twojim kontom zwjazane.\n\nTy dyrbjał zo činić, jeli sy je zmylnje z někim dźělił abo jelic twoje konto je so napadało.",
        "searchall": "wšě",
        "showingresults": "Deleka so hač {{PLURAL:$1|'''1''' wuslědk pokazuje|'''$1''' wuslědkaj pokazujetej|'''$1''' wuslědki pokazuja|'''$1''' wuslědkow pokazuje}}, započinajo z #'''$2'''.",
        "showingresultsinrange": "Deleka so do {{PLURAL:$1|<strong>1</strong> wuslědka|<strong>$1</strong> wuslědkow}} we wobłuku <strong>$2</strong> hač do <strong>$3</strong> pokazuje.",
-       "showingresultsheader": "{{PLURAL:$5|Wuslědk '''$1''' z '''$3'''|Wuslědki '''$1 - $2''' z '''$3'''}} za '''$4'''",
        "search-nonefound": "Njebuchu wuslědki namakane, kotrež naprašowanju wotpowěduja.",
        "powersearch-legend": "Rozšěrjene pytanje",
        "powersearch-ns": "W mjenowych rumach pytać:",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (hlej tež [[Special:NewPages|lisćinu nowych stronow]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Deleka so změny wot <strong>$2</strong> pokazuja (hač k <strong>$1</strong>).",
-       "rclistfrom": "Nowe změny pokazać, započinajo z $3 $2",
+       "rclistfrom": "Jenož změny wot $3, $2 pokazać.",
        "rcshowhideminor": "snadne změny $1",
-       "rcshowhideminor-show": "Pokazać",
-       "rcshowhideminor-hide": "Schować",
+       "rcshowhideminor-show": "pokazać",
+       "rcshowhideminor-hide": "schować",
        "rcshowhidebots": "Boćiki $1",
-       "rcshowhidebots-show": "Pokazać",
-       "rcshowhidebots-hide": "Schować",
+       "rcshowhidebots-show": "pokazać",
+       "rcshowhidebots-hide": "schować",
        "rcshowhideliu": "Zregistrowani wužiwarjo $1",
-       "rcshowhideliu-show": "Pokazać",
-       "rcshowhideliu-hide": "Schować",
+       "rcshowhideliu-show": "pokazać",
+       "rcshowhideliu-hide": "schować",
        "rcshowhideanons": "Anonymni wužiwarjo $1",
-       "rcshowhideanons-show": "Pokazać",
-       "rcshowhideanons-hide": "Schować",
+       "rcshowhideanons-show": "pokazać",
+       "rcshowhideanons-hide": "schować",
        "rcshowhidepatr": "Dohladowane změny $1",
        "rcshowhidepatr-show": "Pokazać",
        "rcshowhidepatr-hide": "Schować",
        "rcshowhidemine": "moje změny $1",
-       "rcshowhidemine-show": "Pokazać",
-       "rcshowhidemine-hide": "Schować",
-       "rclinks": "Poslednje $1 změnow poslednich $2 dnjow pokazać<br />$3",
+       "rcshowhidemine-show": "pokazać",
+       "rcshowhidemine-hide": "schować",
+       "rclinks": "Pokazuj poslednje $1 změny poslednich $2 dnjow.<br />$3",
        "diff": "rozdźěl",
        "hist": "wersije",
        "hide": "schować",
        "randomincategory": "Připadna strona w kategoriji",
        "randomincategory-invalidcategory": "\"$1\" płaćiwe kategorijowe mjeno njeje.",
        "randomincategory-nopages": "W kategoriji [[:Category:$1|$1]] žane strony njejsu.",
-       "randomincategory-selectcategory": "Připadna strona z kategorija: $1 $2",
-       "randomincategory-selectcategory-submit": "Wotesłać",
+       "randomincategory-category": "Kategorija:",
+       "randomincategory-legend": "Připadna strona w kategoriji",
        "randomredirect": "Připadne daleposrědkowanje",
        "randomredirect-nopages": "Žane daleposrědkowanja w mjenowym rumje \"$1\".",
        "statistics": "Statistika",
        "querypage-disabled": "Tuta specialna strona je z wukonowych přičinow znjemóžnjena.",
        "booksources": "Pytanje po ISBN",
        "booksources-search-legend": "Žórła za knihi pytać",
-       "booksources-go": "Pytać",
        "booksources-text": "To je lisćina wotkazow k druhim sydłam, kotrež nowe a trjebane knihi předawaja. Tam móžeš tež dalše informacije wo knihach dóstać, kotrež pytaš:",
        "booksources-invalid-isbn": "Podate ISBN-čisło njezda so płaćiwe być; přepruwuj za zmylkami, z tym zo z orginialneho žórła kopěruješ.",
        "specialloguserlabel": "Wukonjer:",
        "wlheader-enotif": "E-mejlowa zdźělenska słužba je zmóžnjena.",
        "wlheader-showupdated": "Strony, kotrež su so po twojim poslednim wopyće změnili, so '''tučne''' pokazuja.",
        "wlnote": "Deleka {{PLURAL:$1|je poslednja změna|stej poslednjej '''$1''' změnje|su poslednje '''$1''' změny|je poslednich '''$1''' změnow}} za {{PLURAL:$2|poslednju hodźinu|poslednje '''$2''' hodźinje|poslednje '''$2''' hodźiny|poslednje '''$2''' hodźin}}, staw : $3, $4.",
-       "wlshowlast": "Poslednje $1 hodź. - $2 dnjow - $3 pokazać",
+       "wlshowlast": "Poslednje $1 hodź. - $2 dnjow -  pokazać",
        "watchlist-options": "Opcije wobkedźbowankow",
        "watching": "Wobkedźbuju…",
        "unwatching": "Njewobkedźbuju…",
        "delete-edit-reasonlist": "Přičiny za wušmórnjenje wobdźěłać",
        "delete-toobig": "Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje tajkich stronow bu wobmjezowane, zo by připadne přetorhnjenje {{SITENAME}} wobešło.",
        "delete-warning-toobig": "Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje móže operacije datoweje banki {{SITENAME}} přetorhnyć; pokročuj z kedźbliwosću.",
-       "delete-cantedit": "Njemóžeš tutu stronu zhašeć, dokelž nimaš prawo ju wobdźěłować.",
        "deleting-backlinks-warning": "'''Warnowanje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druhe strony]] wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
        "rollback": "Změny cofnyć",
        "rollback_short": "Cofnyć",
        "import": "Strony importować",
        "importinterwiki": "Import z druheho wikija",
        "import-interwiki-text": "Wuběr wiki a stronu za importowanje. Daty wersijow a mjena awtorow so zachowaja. Wšě akcije za transwiki-importy so w [[Special:Log/import|protokolu importow]] protokoluja.",
-       "import-interwiki-source": "Žórłowy wiki/Žórłowa strona:",
        "import-interwiki-history": "Wšě wersije ze stawiznow tuteje strony kopěrować",
        "import-interwiki-templates": "Wšě předłohi zapřijeć",
        "import-interwiki-submit": "Importować",
        "exif-urgency-low": "Niska ($1)",
        "exif-urgency-high": "Wysoka ($1)",
        "exif-urgency-other": "Swójska priorita ($1)",
-       "watchlistall2": "wšě",
        "namespacesall": "wšě",
        "monthsall": "wšě",
        "confirmemail": "Emailowu adresu wobkrućić",
        "logentry-upload-overwrite": "$1 je nowu wersiju $3 {{GENDER:$2|nahrał|nahrała}}",
        "logentry-upload-revert": "$1 je $3 {{GENDER:$2|nahrał|nahrała}}",
        "rightsnone": "(ničo)",
+       "revdelete-summary": "zjeće wobdźěłać",
        "feedback-bugornote": "Jeli sy zwólniwy, techniski problem nadrobnje wopisać, [$1 zdźěl prošu zmylk].\nHewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so stronje \"[$3 $2]\", z twojim wužiwarskim mjenom a z wobhladowakom, kotryž wužiwaš.",
        "feedback-subject": "Tema:",
        "feedback-message": "Powěsć:",
index f006760..cc114db 100644 (file)
        "pager-older-n": "{{PLURAL:$1|pi vye|$1 pi vye yo}}",
        "booksources": "Ouvraj referans yo",
        "booksources-search-legend": "Chache nan lis ouvraj ki sèvi pou referans",
-       "booksources-go": "Ale",
        "specialloguserlabel": "itilizatè :",
        "speciallogtitlelabel": "Tit :",
        "log": "Jounal yo",
        "watchthispage": "Swiv paj sa a",
        "unwatch": "Pa swiv ankò",
        "watchlist-details": "W ap swiv {{PLURAL:$1|paj|paj}}, san konte paj diskisyon yo.",
-       "wlshowlast": "Montre dènye $1 è yo, dènye $2 jou yo, oubyen $3.",
+       "wlshowlast": "Montre dènye $1 è yo, dènye $2 jou yo, oubyen .",
        "watchlist-options": "Opsyon pou lis swivi",
        "watching": "Swiv...",
        "unwatching": "Fini swiv paj sa a...",
        "metadata-expand": "Montre detay konplè yo",
        "metadata-collapse": "Kache enfòmasyon ak tout detay yo",
        "metadata-fields": "Chan metadone EXIF ki liste nan mesaj sa a ap parèt nan paj deskripsyon imaj la lè tab metadone a ap pi piti. Lòt chan yo ap kache pa defo.\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",
-       "watchlistall2": "tout",
        "namespacesall": "Tout",
        "monthsall": "tout",
        "watchlisttools-view": "Wè chanjman enpòtan yo",
        "version": "Vèsyon",
        "specialpages": "Paj espesyal yo",
        "htmlform-reset": "Revoke chanjman yo",
-       "revdelete-restricted": "aplike restriksyon sa yo pou administratè yo"
+       "revdelete-restricted": "aplike restriksyon sa yo pou administratè yo",
+       "revdelete-summary": "somè pou modifikasyon"
 }
index 2ab1aed..ffb77f5 100644 (file)
@@ -35,7 +35,8 @@
                        "Xbspiro",
                        "아라",
                        "Csega",
-                       "ViDam"
+                       "ViDam",
+                       "Adam78"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
        "otherlanguages": "Más nyelveken",
        "redirectedfrom": "($1 szócikkből átirányítva)",
        "redirectpagesub": "Átirányító lap",
+       "redirectto": "Átirányítás ide:",
        "lastmodifiedat": "A lap utolsó módosítása: $1, $2",
        "viewcount": "Ezt a lapot {{PLURAL:$1|egy|$1}} alkalommal keresték fel.",
        "protectedpage": "Védett lap",
        "jumptonavigation": "navigáció",
        "jumptosearch": "keresés",
        "view-pool-error": "A szerverek jelenleg túl vannak terhelve, mert túl sok felhasználó próbálta megtekinteni ezt az oldalt.\nKérjük, várj egy kicsit, mielőtt újra próbálkoznál a lap megtekintésével!\n\n$1",
-       "generic-pool-error": "Sajnálom, a szerverek jelenleg túl vannak terhelve.\nTúl sok felhasználó próbálja ezt az oldalt megtekinteni.\nKérjük, várj egy kicsit, mielőtt újra próbálkoznál az oldal megtekintésével!",
+       "generic-pool-error": "Sajnáljuk, a szerverek jelenleg túl vannak terhelve.\nTúl sok felhasználó próbálja ezt az oldalt megtekinteni.\nKérjük, várj egy kicsit, mielőtt újra próbálkoznál!",
        "pool-timeout": "Letelt a zárolás feloldására szánt várakozási idő",
        "pool-queuefull": "A pool sor megtelt",
        "pool-errorunknown": "Ismeretlen hiba",
        "versionrequired": "A MediaWiki $1 verziója szükséges",
        "versionrequiredtext": "A lap használatához a MediaWiki $1 verziójára van szükség.\nTovábbi információkat a [[Special:Version|verzióinformációs lapon]] találsz.",
        "ok": "OK",
+       "pagetitle": "$1 – {{SITENAME}}",
        "retrievedfrom": "A lap eredeti címe: „$1”",
        "youhavenewmessages": "$1 a vitalapodon! ($2 külön is megtekintheted.)",
        "youhavenewmessagesfromusers": "$2 kaptál {{PLURAL:$3|egy|$3}} szerkesztőtől $1!",
        "hidetoc": "elrejtés",
        "collapsible-collapse": "becsuk",
        "collapsible-expand": "kinyit",
+       "confirmable-confirm": "Biztos {{GENDER:$1|vagy}} benne?",
+       "confirmable-yes": "Igen",
+       "confirmable-no": "Nem",
        "thisisdeleted": "$1 megtekintése vagy helyreállítása?",
        "viewdeleted": "$1 megtekintése?",
        "restorelink": "{{PLURAL:$1|Egy|$1}} törölt szerkesztés",
        "delete-hook-aborted": "A törlés meg lett szakítva egy hook által.\nNem lett magyarázat csatolva.",
        "no-null-revision": "Nem sikerült új null-revíziót létrehozni a(z) „$1” lap számára.",
        "badtitle": "Hibás cím",
-       "badtitletext": "A kért oldal címe érvénytelen, üres, vagy rosszul hivatkozott nyelvközi vagy wikiközi cím volt. Olyan karaktereket is tartalmazhatott, melyek a címekben nem használhatóak.",
+       "badtitletext": "A kért oldal címe érvénytelen, üres, vagy rosszul hivatkozott nyelvközi vagy wikiközi cím volt. Olyan karaktereket is tartalmazhatott, melyek címekben nem használhatók.",
        "perfcached": "Az alábbi adatok gyorsítótárból (''cache''-ből) származnak, és ezért lehetséges, hogy nem a legfrissebb változatot mutatják. Legfeljebb {{PLURAL:$1|egy|$1 }} eredmény áll rendelkezésre a gyorsítótárban.",
        "perfcachedts": "Az alábbi adatok gyorsítótárból (''cache''-ből) származnak, legutóbbi frissítésük ideje $1. Legfeljebb {{PLURAL:$4|egy|$4}} eredmény áll rendelkezésre a gyorsítótárban.",
        "querypage-no-updates": "Az oldal frissítése jelenleg le van tiltva. Az itt szereplő adatok nem frissülnek azonnal.",
        "createaccount-text": "Valaki létrehozott számodra egy \"$2\" nevű {{SITENAME}}-azonosítót ($4).\nA hozzá tartozó jelszó \"$3\", melyet a bejelentkezés után minél előbb változtass meg.\n\nHa nem kértél új azonosítót, és tévedésből kaptad ezt a levelet, hagyd figyelmen kívül.",
        "login-throttled": "Túl sok hibás bejelentkezés.\nVárj $1, mielőtt újra próbálkozol.",
        "login-abort-generic": "A bejelentkezés sikertelen – megszakítva",
+       "login-migrated-generic": "A fiók áttelepítése megtörtént, felhasználóneved már nem létezik ezen a wikin.",
        "loginlanguagelabel": "Nyelv: $1",
        "suspicious-userlogout": "A kijelentkezési kérésed vissza lett utasítva, mert úgy tűnik, hogy egy hibás böngésző vagy gyorsítótárazó proxy küldte.",
        "createacct-another-realname-tip": "A valódi nevet nem kötelező megadni, de ha úgy döntesz, hogy megadod, azzal leszel feltüntetve a munkád szerzőjeként.",
        "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-text-one": "A jelszavad alaphelyzetbe állításához töltsd ki az űrlapot.",
+       "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-legend": "Új jelszó kérése",
        "passwordreset-disabled": "Új jelszó kérése nem engedélyezett ezen a wikin.",
        "passwordreset-emailsent-capture": "Az alább látható jelszó-visszaállító e-mail lett elküldve.",
        "passwordreset-emailerror-capture": "A jelszó-visszaállító e-mail generálása megtörtént, mint az alább látszik, de elküldése a {{GENDER:$2|szerkesztőnek}} nem sikerült: $1",
        "changeemail": "E-mail cím megváltoztatása",
-       "changeemail-header": "A fiókhoz tartozó e-mail cím megváltoztatása",
        "changeemail-text": "Az e-mail címed megváltoztatásához ki kell töltened az alábbi űrlapot. Megerősítésképpen meg kell adnod a jelszavadat is.",
        "changeemail-no-info": "A lap közvetlen eléréséhez be kell jelentkezned.",
        "changeemail-oldemail": "Jelenlegi e-mail cím:",
        "changeemail-none": "(nincs)",
        "changeemail-password": "A {{SITENAME}} jelszavad:",
        "changeemail-submit": "E-mail cím megváltoztatása",
-       "changeemail-cancel": "Mégse",
        "changeemail-throttled": "Túl sok hibás bejelentkezés.\nVárj $1, mielőtt újra próbálkozol.",
        "resettokens": "Tokenek törlése",
        "resettokens-no-tokens": "Nincs újragenerálható token.",
        "showpreview": "Előnézet megtekintése",
        "showdiff": "Változtatások megtekintése",
        "blankarticle": "<strong>Figyelem:</strong> A létrehozandó szócikk üres.\nHa ismét a \"{{int:savearticle}}\" gombra kattintasz, a szócikket tartalom nélkül fogod létrehozni.",
-       "anoneditwarning": "'''Figyelem:''' Nem vagy bejelentkezve, ha szerkesztesz, az IP-címed látható lesz a laptörténetben.",
+       "anoneditwarning": "'''Figyelem:''' Nem vagy bejelentkezve. Ha szerkesztesz, az IP-címed látható lesz a laptörténetben.",
        "anonpreviewwarning": "''Nem vagy bejelentkezve. A mentéskor az IP-címed rögzítve lesz a laptörténetben.''",
        "missingsummary": "'''Emlékeztető:''' Nem adtál meg szerkesztési összefoglalót. Ha összefoglaló nélkül akarod elküldeni a szöveget, kattints újra a mentésre.",
        "missingcommenttext": "Kérjük, írj összefoglalót a szerkesztésedhez.",
        "parser-template-loop-warning": "Végtelen ciklus a következő sablonban: [[$1]]",
        "parser-template-recursion-depth-warning": "A sablon rekurzív beillesztésének mélysége átlépte a határérékét ($1)",
        "language-converter-depth-warning": "A nyelvátalakító rekurzióinak száma túllépve ($1)",
-       "node-count-exceeded-category": "Lapok, ahogy a csomópont szám túl nagy",
-       "node-count-exceeded-category-desc": "Azon oldalaknak a kategóriája, ahol a csomópont szám túl nagy.",
+       "node-count-exceeded-category": "Lapok, ahogy a csomópontszám túl nagy",
+       "node-count-exceeded-category-desc": "Azon oldalaknak a kategóriája, ahol a csomópontszám túl nagy.",
        "node-count-exceeded-warning": "Az oldal meghaladta a csomópont számot",
        "expansion-depth-exceeded-category": "Lapok, melyeken a sablonok kibontása meghaladja a megengedett szintet",
        "expansion-depth-exceeded-warning": "A lap meghaladta az engedélyezett kiterjesztési mélységet",
        "searchrelated": "kapcsolódó",
        "searchall": "mind",
        "showingresults": "Lent '''{{PLURAL:$1|egy|$1}}''' találat látható, az eleje '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|'''$1'''|'''$1 - $2'''}}. találat a(z) '''$4''' kifejezésre (összesen: '''$3''')",
        "search-nonefound": "Nincs egyezés a megadott szöveggel.",
        "powersearch-legend": "Részletes keresés",
        "powersearch-ns": "Névterek:",
        "preferences": "Beállítások",
        "mypreferences": "Beállítások",
        "prefs-edits": "Szerkesztéseid száma:",
-       "prefsnologintext2": "Kérjük jelentkezzen be a beállítások módosításához.",
+       "prefsnologintext2": "Kérjük, jelentkezz be a beállítások módosításához.",
        "prefs-skin": "Felület",
        "skin-preview": "előnézet",
        "datedefault": "Nincs beállítás",
        "prefs-advancedwatchlist": "Haladó beállítások",
        "prefs-displayrc": "Megjelenítési beállítások",
        "prefs-displaywatchlist": "Megjelenítési beállítások",
+       "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Eltérések (diffek)",
        "prefs-help-prefershttps": "A beállítás a legközelebbi belépés után lép érvénybe.",
        "email-address-validity-valid": "Az e-mail cím érvényesnek tűnik",
        "right-move": "lapok átnevezése",
        "right-move-subpages": "lapok átnevezése az allapjukkal együtt",
        "right-move-rootuserpages": "szerkesztői lapok mozgatása",
+       "right-move-categorypages": "kategóriák átnevezése",
        "right-movefile": "fájlok átnevezése",
        "right-suppressredirect": "nem készít átirányítást a régi néven lapok átnevezésekor",
        "right-upload": "fájlok feltöltése",
        "right-proxyunbannable": "proxyk automatikus blokkjainak megkerülése",
        "right-unblockself": "saját felhasználói fiók blokkjának feloldása",
        "right-protect": "védelmi szintek megváltoztatása és kaszkádolt védelemmel rendelkező lapok szerkesztése",
-       "right-editprotected": "\"{{int:protect-level-sysop}}\" védelmi szintű lapok szerkesztése",
+       "right-editprotected": "„{{int:protect-level-sysop}}” védelmi szintű lapok szerkesztése",
+       "right-editsemiprotected": "„{{int:protect-level-autoconfirmed}}” védelmi szintű lapok szerkesztése",
        "right-editinterface": "felhasználói felület szerkesztése",
        "right-editusercssjs": "más felhasználók CSS és JS fájljainak szerkesztése",
        "right-editusercss": "más felhasználók CSS fájljainak szerkesztése",
        "right-edituserjs": "más felhasználók JS fájljainak szerkesztése",
        "right-editmyusercss": "A saját szerkesztői CSS-fájlok szerkesztése",
        "right-editmyuserjs": "Saját szerkesztői JavaScript-fájlok szerkesztése",
-       "right-viewmywatchlist": "Saját figyelőlista megtekintése",
-       "right-editmyoptions": "Saját beállítások szerkesztése",
+       "right-viewmywatchlist": "saját figyelőlista megtekintése",
+       "right-editmywatchlist": "saját figyelőlista szerkesztése; bizonyos műveletek képesek lapok figyelőlistához adására ezen jog nélkül is",
+       "right-viewmyprivateinfo": "saját személyes adatok megtekintése (pl. e-mail cím, valódi név)",
+       "right-editmyprivateinfo": "saját személyes adatok szerkesztése (pl. e-mail cím, valódi név)",
+       "right-editmyoptions": "saját beállítások szerkesztése",
        "right-rollback": "a lap utolsó szerkesztésének gyors visszaállítása",
        "right-markbotedits": "visszaállított szerkesztések botként való jelölése",
        "right-noratelimit": "sebességkorlát figyelmen kívül hagyása",
        "action-createpage": "új lap készítése",
        "action-createtalk": "vitalap készítése",
        "action-createaccount": "felhasználói fiók elkészítése",
+       "action-history": "laptörténet megtekintése",
        "action-minoredit": "szerkesztés aprónak jelölése",
        "action-move": "lap átnevezése",
        "action-move-subpages": "lap és allapjainak átnevezése",
        "action-move-rootuserpages": "szerkesztői lapok átnevezése",
+       "action-move-categorypages": "kategóriák átnevezése",
        "action-movefile": "fájlok átnevezése",
        "action-upload": "fájl feltöltése",
        "action-reupload": "már létező fájl felülírása",
        "action-siteadmin": "adatbázis lezárása vagy felnyitása",
        "action-sendemail": "e-mailek küldése",
        "action-editmywatchlist": "saját figyelőlista szerkesztése",
+       "action-viewmywatchlist": "saját figyelőlista megtekintése",
+       "action-viewmyprivateinfo": "személyes adatok megtekintése",
+       "action-editmyprivateinfo": "személyes adatok szerkesztése",
        "nchanges": "{{PLURAL:$1|egy|$1}} változtatás",
        "enhancedrc-since-last-visit": "$1 az utolsó látogatás óta",
        "enhancedrc-history": "történet",
        "license": "Licenc:",
        "license-header": "Licenc",
        "nolicense": "Válassz licencet!",
+       "licenses-edit": "Licenc-tulajdonságok szerkesztése",
        "license-nopreview": "(Előnézet nem elérhető)",
        "upload_source_url": "(a kiválasztott fájlod egy nyilvánosan elérhető URL-ről)",
        "upload_source_file": "(a számítógépeden kiválasztott fájl)",
        "download": "letöltés",
        "unwatchedpages": "Nem figyelt lapok",
        "listredirects": "Átirányítások listája",
+       "listduplicatedfiles": "Duplikált fájlok listája",
        "unusedtemplates": "Nem használt sablonok",
        "unusedtemplatestext": "Ez a lap azon {{ns:template}} névtérbe tartozó lapokat gyűjti össze, melyek nincsenek használva egyetlen lapon sem.\nEllenőrizd a meglévő hivatkozásokat, mielőtt törölnéd őket.",
        "unusedtemplateswlh": "más hivatkozások",
        "randompage-nopages": "A következő {{PLURAL:$2|névtérben|névterekben}} nincsenek lapok: $1.",
        "randomincategory": "Véletlen lap egy kategóriából",
        "randomincategory-invalidcategory": "\"$1\" nem egy érvényes kategória neve.",
+       "randomincategory-category": "Kategória:",
+       "randomincategory-legend": "Véletlen lap a kategóriából",
        "randomredirect": "Átirányítás találomra",
        "randomredirect-nopages": "A(z) „$1” névtérben nincsenek átirányítások.",
        "statistics": "Statisztika",
        "statistics-users-active": "Aktív szerkesztők",
        "statistics-users-active-desc": "Szerkesztők, akik csináltak valamit az elmúlt {{PLURAL:$1|egy|$1}} napban",
        "statistics-mostpopular": "Legtöbbször megtekintett lapok",
+       "pageswithprop-prop": "Tulajdonságnév:",
+       "pageswithprop-submit": "Ugrás",
        "doubleredirects": "Dupla átirányítások",
        "doubleredirectstext": "Ez a lap azokat a lapokat listázza, melyek átirányító lapokra irányítanak át.\nMinden sor tartalmaz egy hivatkozást az első, valamint a második átirányításra, valamint a második átirányítás céljára, ami általában a valódi céllap, erre kellene az első átirányításnak mutatnia.\nAz <del>áthúzott</del> sorok a lista elkészülése óta javítva lettek.",
        "double-redirect-fixed-move": "[[$1]] áthelyezve.\nAutomatikusan frissült, és mostantól a(z) [[$2]] lapra irányít át.",
        "mostlinked": "Legtöbbet hivatkozott lapok",
        "mostlinkedcategories": "Legtöbbet hivatkozott kategóriák",
        "mostlinkedtemplates": "Legtöbbet hivatkozott sablonok",
-       "mostcategories": "Legtöbb kategóriába tartozó lapok",
+       "mostcategories": "Legtöbb kategóriába tartozó szócikkek",
        "mostimages": "Legtöbbet hivatkozott fájlok",
-       "mostinterwikis": "Legtöbb interwikit tartalmazó lapok",
+       "mostinterwikis": "Legtöbb interwikit tartalmazó szócikkek",
        "mostrevisions": "Legtöbbet szerkesztett lapok",
        "prefixindex": "Keresés előtag szerint",
        "prefixindex-namespace": "Összes lap adott előtaggal ($1 névtér)",
        "deadendpagestext": "Az itt található lapok nem kapcsolódnak hivatkozásokkal ezen wiki más oldalaihoz.",
        "protectedpages": "Védett lapok",
        "protectedpages-indef": "Csak a meghatározatlan idejű védelmek",
+       "protectedpages-summary": "Az alábbi speciális lap listázza azokat a már létező lapokat, melyeket levédtek az adminisztrátorok, ellentétben azokkal a lapokkal, melyeket [[{{#special:ProtectedTitles}}|létrehozás ellen]] védtek le.",
        "protectedpages-cascade": "Csak a kaszkádvédelmek",
+       "protectedpages-noredirect": "Átirányítások elrejtése",
        "protectedpagesempty": "Jelenleg nincsenek ilyen paraméterekkel védett lapok.",
        "protectedpages-timestamp": "Időbélyeg",
+       "protectedpages-page": "Lap",
        "protectedpages-expiry": "Lejárat",
+       "protectedpages-performer": "A levédést végrehajtó szerkesztő",
+       "protectedpages-params": "A védelem paraméterei",
        "protectedpages-reason": "Indoklás",
        "protectedpages-unknown-timestamp": "Ismeretlen",
        "protectedpages-unknown-performer": "Ismeretlen felhasználó",
        "protectedtitles": "Létrehozás ellen védett lapok",
+       "protectedtitles-summary": "Az alábbi speciális lap listázza azokat a nem létező címeket, melyeket létrehozás ellen védtek le az adminisztrátorok, ellentétben azokkal a [[{{#special:ProtectedPages}}|létező lapokkal]], melyeket módosítás ellen védtek le.",
        "protectedtitlesempty": "Jelenleg nincsenek ilyen típusú védett lapok.",
        "listusers": "Szerkesztők",
        "listusers-editsonly": "Csak a szerkesztéssel rendelkező szerkesztők mutatása",
        "listusers-creationsort": "Rendezés létrehozási dátum szerint",
+       "listusers-desc": "Rendezés csökkenő sorrendben",
        "usereditcount": "{{PLURAL:$1|egy|$1}} szerkesztés",
        "usercreated": "{{GENDER:$3|Létrehozva}} $1, $2-kor",
        "newpages": "Új lapok",
        "querypage-disabled": "Ez a speciális lap a megfelelő teljesítmény fenntartása érdekében le van tiltva.",
        "booksources": "Könyvforrások",
        "booksources-search-legend": "Könyvforrások keresése",
-       "booksources-go": "Keresés",
+       "booksources-search": "Keresés",
        "booksources-text": "Alább látható a másik webhelyekre mutató hivatkozások listája, ahol új és használt könyveket árulnak, és\ntovábbi információkat lelhetsz ott az általad keresett könyvekről:",
        "booksources-invalid-isbn": "A megadott ISBN hibásnak tűnik; ellenőrizd, hogy jól másoltad-e át az eredeti forrásból.",
        "specialloguserlabel": "Szerkesztő:",
        "listgrouprights-removegroup-self": "eltávolíthatja a következő {{PLURAL:$2|csoportból|csoportokból}} a saját fiókját: $1",
        "listgrouprights-addgroup-self-all": "az összes csoportot hozzáadhatja a saját fiókjához",
        "listgrouprights-removegroup-self-all": "az összes csoporból eltávolíthatja a saját fiókját",
+       "listgrouprights-namespaceprotection-header": "Névtér korlátozások",
        "listgrouprights-namespaceprotection-namespace": "Névtér",
        "trackingcategories-nodesc": "Nem található leírás.",
        "trackingcategories-disabled": "A kategória le van tiltva",
        "watchnologin": "Nem vagy bejelentkezve",
        "addwatch": "Hozzáadás a figyelőlistához",
        "addedwatchtext": "A(z) „[[:$1]]” lapot hozzáadtam a [[Special:Watchlist|figyelőlistádhoz]].\nEzután minden, a lapon vagy annak vitalapján történő változást ott fogsz látni.",
+       "addedwatchtext-short": "Az oldal: \"$1\" hozzá lett adva a figyelőlistádhoz.",
        "removewatch": "Eltávolítás a figyelőlistáról",
        "removedwatchtext": "A(z) „[[:$1]]” lapot eltávolítottam a [[Special:Watchlist|figyelőlistáról]].",
+       "removedwatchtext-short": "Az oldal: \"$1\" el lett távolítva a figyelőlistádról.",
        "watch": "Lap figyelése",
        "watchthispage": "Lap figyelése",
        "unwatch": "Lapfigyelés vége",
        "wlheader-enotif": "Az e-mailen keresztül történő értesítés engedélyezve.",
        "wlheader-showupdated": "Azok a lapok, amelyek megváltoztak, mióta utoljára megnézted őket, '''vastagítva''' láthatók.",
        "wlnote": "Alább {{PLURAL:$1|az utolsó változás|az utolsó <strong>$1</strong> változás}} látható az elmúlt {{PLURAL:$2|órában|<strong>$2</strong> órában}}, $3 $4-kor.",
-       "wlshowlast": "Az elmúlt $1 órában | $2 napon | $3 történt változtatások legyenek láthatóak",
+       "wlshowlast": "Az elmúlt $1 órában | $2 napon |  történt változtatások legyenek láthatóak",
        "watchlist-options": "A figyelőlista beállításai",
        "watching": "Figyelés...",
        "unwatching": "Figyelés befejezése...",
        "protect-cascadeon": "A lap jelenleg le van védve, mert {{PLURAL:$1|tartalmazza az alábbi lap, amelyen|tartalmazzák az alábbi lapok, amelyeken}} be van kapcsolva a kaszkád védelem.\nEzen lap védelmi szintjének megváltoztatása nem lesz hatással a kaszkád védelemre.",
        "protect-default": "Minden szerkesztő számára engedélyezett",
        "protect-fallback": "\"$1\" engedély szükséges hozzá",
-       "protect-level-autoconfirmed": "Csak automatikusan ellenőrzött szerkesztőknek engedélyezett (nem vagy frissen regisztráltaknak nem)",
-       "protect-level-sysop": "Csak adminisztrátoroknak engedélyezett",
+       "protect-level-autoconfirmed": "Csak automatikusan megerősített szerkesztőknek engedélyezett (nem vagy frissen regisztráltaknak nem)",
+       "protect-level-sysop": "csak adminisztrátoroknak engedélyezett",
        "protect-summary-cascade": "kaszkád védelem",
        "protect-expiring": "lejár: $1 (UTC)",
        "protect-expiring-local": "lejárat: $1",
        "contributions-title": "$1 közreműködései",
        "mycontris": "Közreműködések",
        "contribsub2": "$1 ($2)",
+       "contributions-userdoesnotexist": "Nincs regisztrálva „$1” szerkesztői azonosító.",
        "nocontribs": "Nem található a feltételeknek megfelelő változtatás.",
        "uctop": "(aktuális)",
        "month": "E hónap végéig:",
        "movepagetalktext": "A laphoz tartozó vitalap automatikusan átneveződik, '''kivéve, ha:'''\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 a kívánságaid szerint.",
        "movearticle": "Lap átnevezése",
        "moveuserpage-warning": "'''Figyelem:''' Egy felhasználólapot készülsz átmozgatni. Csak a lap lesz átmozgatva, a szerkesztő ''nem'' lesz átnevezve.",
+       "movecategorypage-warning": "<string>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]].",
        "movenotallowed": "Nincs jogod a lapok átnevezéséhez.",
        "movenotallowedfile": "Nincs megfelelő jogosultságod a fájlok átnevezéséhez.",
        "cant-move-user-page": "Nem nevezhetsz át szerkesztői lapokat (az allapokon kívül).",
        "cant-move-to-user-page": "Nincs jogosultságod átnevezni egy lapot szerkesztői lapnak (kivéve annak allapjának).",
+       "cant-move-category-page": "Nincs jogosultságod kategórialapok átnevezéséhez.",
+       "cant-move-to-category-page": "Nincs jogosultságod átnevezni egy lapot kategórialapnak.",
        "newtitle": "Az új cím:",
        "move-watch": "Figyeld a lapot",
        "movepagebtn": "Lap átnevezése",
        "import": "Lapok importálása",
        "importinterwiki": "Transwiki importálása",
        "import-interwiki-text": "Válaszd ki az importálandó wikit és lapcímet.\nA változatok dátumai és a szerkesztők nevei megőrzésre kerülnek.\nValamennyi transwiki importálási művelet az [[Special:Log/import|importálási naplóban]] kerül naplózásra.",
-       "import-interwiki-source": "Forrás wiki/lap:",
        "import-interwiki-history": "A lap összes előzményváltozatainak másolása",
        "import-interwiki-templates": "Az összes sablon hozzáadása",
        "import-interwiki-submit": "Importálás",
        "newimages-summary": "Ezen a speciális lapon láthatóak a legutóbb feltöltött fájlok.",
        "newimages-legend": "Fájlnév",
        "newimages-label": "Fájlnév (vagy annak részlete):",
+       "newimages-showbots": "Botos feltöltések mutatása",
        "noimages": "Nem tekinthető meg semmi.",
        "ilsubmit": "Keresés",
        "bydate": "dátum szerint",
        "exif-urgency-low": "Alacsony ($1)",
        "exif-urgency-high": "Magas ($1)",
        "exif-urgency-other": "Egyedi prioritás ($1)",
-       "watchlistall2": "bármikor",
        "namespacesall": "Összes",
        "monthsall": "mind",
        "confirmemail": "E-mail cím megerősítése",
        "watchlistedit-raw-done": "A figyelőlistád változtatásait elmentettem.",
        "watchlistedit-raw-added": "A {{PLURAL:$1|következő|következő $1}} cikket hozzáadtam a figyelőlistádhoz:",
        "watchlistedit-raw-removed": "A {{PLURAL:$1|következő|következő $1}} cikket eltávolítottam a figyelőlistádról:",
+       "watchlisttools-clear": "A figyelőlista kiürítése",
        "watchlisttools-view": "Kapcsolódó változtatások",
        "watchlisttools-edit": "A figyelőlista megtekintése és szerkesztése",
        "watchlisttools-raw": "A nyers figyelőlista szerkesztése",
        "version-hook-name": "Hook neve",
        "version-hook-subscribedby": "Használja",
        "version-version": "(verzió: $1)",
+       "version-no-ext-name": "[nincs név]",
        "version-license": "MediaWiki licenc",
        "version-ext-license": "Licenc",
        "version-ext-colheader-name": "Kiterjesztés",
        "version-entrypoints": "Belépési pont URL-címek",
        "version-entrypoints-header-entrypoint": "Belépési pont",
        "version-entrypoints-header-url": "URL",
+       "redirect": "Átirányítás fájl, szerkesztő, oldal vagy oldalváltozat alapján",
        "redirect-lookup": "Keresés:",
        "redirect-value": "Érték:",
        "redirect-user": "Felhasználói azonosító",
        "logentry-rights-rights-legacy": "$1 megváltoztatta $3 csoporttagságát",
        "logentry-rights-autopromote": "$1 automatikusan előléptetve erről: $4 erre: $5",
        "rightsnone": "(semmi)",
+       "revdelete-summary": "a szerkesztési összefoglalóját",
        "feedback-bugornote": "Ha kész technikai problémát részletesen leírni, akkor kérjük [$1 jelents egy hibát]. Egyébként használd az alábbi űrlapot. A hozzászólásod a „[$3 $2]” laphoz kerül felvételre, a szerkesztő neveddel és böngésződ típusával együtt.",
        "feedback-subject": "Tárgy:",
        "feedback-message": "Üzenet:",
        "right-pagelang": "Oldal nyelvének megváltoztatása",
        "action-pagelang": "oldal nyelvének módosítása",
        "log-name-pagelang": "Nyelvváltoztatások naplója",
-       "log-description-pagelang": "Ebben a naplóban a lap nyelvének változásait követheted nyomon."
+       "log-description-pagelang": "Ebben a naplóban a lap nyelvének változásait követheted nyomon.",
+       "mediastatistics-table-mimetype": "MIME-típus",
+       "mediastatistics-table-extensions": "Lehetséges kiterjesztések",
+       "mediastatistics-table-count": "Fájlok száma",
+       "mediastatistics-table-totalbytes": "Kombinált méret",
+       "mediastatistics-header-unknown": "Ismeretlen",
+       "mediastatistics-header-bitmap": "Bittérképes képek",
+       "mediastatistics-header-drawing": "Rajzok (vektoros képek)",
+       "mediastatistics-header-audio": "Hang",
+       "mediastatistics-header-video": "Videók",
+       "mediastatistics-header-office": "Iroda",
+       "mediastatistics-header-text": "Szöveges",
+       "mediastatistics-header-executable": "Futtatható",
+       "mediastatistics-header-archive": "Tömörített formátumok",
+       "json-error-state-mismatch": "Érvénytelen vagy hibás JSON",
+       "json-error-syntax": "Szintaktikai hiba",
+       "json-error-utf8": "Hibás UTF-8 karakter, esetleg helytelenül kódolt"
 }
index 1b775f0..16ca978 100644 (file)
@@ -16,7 +16,8 @@
                        "Xelgen",
                        "Համլետ",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Lilitik22"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
        "tog-hidepatrolled": "Թաքցնել պարեկված խմբագրումները վերջին փոփոխությունների ցանկից",
        "tog-newpageshidepatrolled": "Թաքցնել պարեկված էջերը նոր էջերի ցանկից",
        "tog-extendwatchlist": "Ընդարձակել հսկացանկը՝ ցույց տալով բոլոր փոփոխությունները, այլ ոչ միայն վերջինները",
-       "tog-usenewrc": "Ô½Õ´Õ¢Õ¡Õ¾Õ¸Ö\80Õ¥Õ¬ Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨ Õ\8eերջին փոփոխություններում և հսկացանկում (պահանջում է JavaScript)",
+       "tog-usenewrc": "Ô½Õ´Õ¢Õ¡Õ¾Õ¸Ö\80Õ¥Õ¬ Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨ Õ¾երջին փոփոխություններում և հսկացանկում (պահանջում է JavaScript)",
        "tog-numberheadings": "Ինքնաթվագրել վերնագրերը",
        "tog-showtoolbar": "Ցույց տալ խմբագրումների գործիքների վահանակը",
        "tog-editondblclick": "Խմբագրել էջերը կրկնակի մատնահարմամբ",
        "tog-editsectiononrightclick": "Խմբագրել բաժինները վերնագրի աջ մատնահարմամբ",
-       "tog-watchcreations": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ½Õ¿Õ¥Õ²Õ®Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¢Õ¥Õ¼Õ¶Õ¡Õ® Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ«Õ¶",
-       "tog-watchdefault": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ«Õ¶",
-       "tog-watchmoves": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ¾Õ¥Ö\80Õ¶Õ¡Õ¾Õ¡Õ¶Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ«Õ¶",
-       "tog-watchdeletion": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ»Õ¶Õ»Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ«Õ´ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ«Õ¶",
-       "tog-minordefault": "Նշել խմբագրումները որպես չնչին ըստ լռության",
+       "tog-watchcreations": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ½Õ¿Õ¥Õ²Õ®Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¢Õ¥Õ¼Õ¶Õ¡Õ® Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-watchdefault": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-watchmoves": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ¾Õ¥Ö\80Õ¶Õ¡Õ¾Õ¡Õ¶Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-watchdeletion": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ»Õ¶Õ»Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-minordefault": "Խմբագրումները լռելյայն նշել որպես չնչին",
        "tog-previewontop": "Ցույց տալ նախադիտումը խմբագրման դաշտից առաջ",
        "tog-previewonfirst": "Նախադիտել մինչև առաջին խմբագրությունը",
        "tog-enotifwatchlistpages": "էլ-փոստով տեղեկացնել հսկվող էջերում փոփոխությունների մասին",
@@ -56,6 +57,7 @@
        "tog-showhiddencats": "Ցուցադրել թաքնված կատեգորիաները",
        "tog-norollbackdiff": "Չցուցադրել տարբերությունները հետ գլորելուց հետո",
        "tog-useeditwarning": "Զգուշացնել ինձ, երբ ես լքում եմ խմբագրման էջը առանց կատարած փոփոխությունները հիշելու։",
+       "tog-prefershttps": "Մուտք գործելուց հետո, միշտ գործածել անվնտանգ միացումից (HTTPS)",
        "underline-always": "Միշտ",
        "underline-never": "Երբեք",
        "underline-default": "Դիտարկչի կամ թեմայի լռելյայն ոճով",
        "permalink": "Մշտական հղում",
        "print": "Տպել",
        "view": "Դիտել",
+       "view-foreign": "Նայել $1-ում",
        "edit": "Խմբագրել",
+       "edit-local": "Խմբագրել տեղական նկարագրությունը",
        "create": "Ստեղծել",
        "editthispage": "Խմբագրել այս էջը",
        "create-this-page": "Ստեղծել այս էջը",
        "otherlanguages": "Այլ լեզուներով",
        "redirectedfrom": "(Վերահղված է $1ից)",
        "redirectpagesub": "Վերահղման էջ",
+       "redirectto": "Վերահղել դեպի՝",
        "lastmodifiedat": "Այս էջը վերջին անգամ փոփոխվել է ժամը $2-ին, $1 թվին։",
        "viewcount": "Այս էջին դիմել են {{PLURAL:$1|մեկ անգամ|$1 անգամ}}։",
        "protectedpage": "Պաշտպանված էջ",
        "jumptonavigation": "նավարկություն",
        "jumptosearch": "որոնում",
        "view-pool-error": "Ներեցեք՝ սերվերները գերբեռնված են այս պահին։\nՉափից շատ օգտվողներ փորձում են դիտել այս էջը։\nԽնդրում ենք սպասել որոշ ժամանակ էջը դիտելու կրկին հայցում անելուց առաջ։\n\n$1",
+       "generic-pool-error": "Ներեցեք՝ սերվերները գերբեռնված են այս պահին։\nՉափից շատ օգտվողներ փորձում են դիտել այս էջը։\nԽնդրում ենք սպասել որոշ ժամանակ էջը դիտելու կրկին հայցում անելուց առաջ։",
        "pool-errorunknown": "Անհայտ սխալ",
        "aboutsite": "{{grammar:genitive|{{SITENAME}}}} մասին",
        "aboutpage": "Project:Էությունը",
        "hidetoc": "թաքցնել",
        "collapsible-collapse": "Ծալել",
        "collapsible-expand": "Բացել",
+       "confirmable-confirm": "{{GENDER:$1|Դուք}} վստա՞հ եք:",
+       "confirmable-yes": "Այո",
+       "confirmable-no": "Ոչ",
        "thisisdeleted": "Դիտե՞լ կամ վերականգնե՞լ $1։",
        "viewdeleted": "Դիտե՞լ $1։",
        "restorelink": "{{PLURAL:$1|մեկ ջնջված խմբագրում|$1 ջնջված խմբագրում}}",
        "viewsource-title": "Դիտել $1 էջի աղբյուրը",
        "actionthrottled": "Գործողությունը արգելափակվեց",
        "actionthrottledtext": "Որպես հակա-սպամային միջոց, այս գործողության չափից շատ կատարումը կարճ ժամանակահատվածի ընթացքում սահմանափակված է։ Խնդրում ենք փորձել կրկին մի քանի րոպե անց։",
-       "protectedpagetext": "Այս էջը կողպված խմբագրման համար։",
+       "protectedpagetext": "Ô±ÕµÕ½ Õ§Õ»Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö\80Ö\89",
        "viewsourcetext": "Դուք կարող եք դիտել և պատճենել այս էջի ելատեքստը.",
        "viewyourtext": "Դուք կարող եք դիտել «ձեր ներդրումների» աղբյուրը և պատճենել այս էջ",
        "protectedinterface": "Այս էջը պարունակում է ծրագրային ապահովման միջերեսի տեքստ, և պաշտպանված է չարաշահումների կանխարգելման նպատակով։\nԲոլոր վիքիների թարգմանությունները փոփոխելու կամ ավելացնելու համար, խնդրում ենք այցելել ՄեդիաՎիքիի տեղայնացման նախագիծը՝ [//translatewiki.net/ translatewiki.net]։",
        "badretype": "Ձեր մուտքագրած գաղտնաբառերը չեն համընկնում։",
        "userexists": "Այս մասնակցի անունը արդեն զբաղված է։ Խնդրում ենք ընտրել մեկ այլ անուն։",
        "loginerror": "Մուտքի սխալ",
+       "createacct-error": "Հաշվի ստեղծման սխալ",
        "createaccounterror": "Չհաջողվեց ստեղծել մասնակցային հաշիվ. $1",
        "nocookiesnew": "Մասնակցային հաշիվը ստեղծված է, սակայն մուտքը համակարգ չհաջողվեց։ {{SITENAME}} կայքը օգտագործում է «քուքիներ» մասնակիցների վավերացման համար։ Ձեր մոտ «քուքիները» արգելված են։ Խնդրում ենք թույլատրել սրանք, ապա մտնել համակարգ ձեր նոր մասնակցի անունով և գաղտնաբառով։",
        "nocookieslogin": "{{SITENAME}} կայքը օգտագործում է «քուքիներ» մասնակիցների վավերացման համար։ Ձեր մոտ «քուքիները» արգելված են։ Խնդրում ենք թույլատրել սրանք և փորձել կրկին։",
        "passwordtooshort": "Գաղտնաբառը պետք է պարունակի առնվազն {{PLURAL:$1|1 սիմվոլ|$1 սիմվոլ}}։",
        "password-name-match": "Գաղտնաբառը պետք է տարբեր լինել ձեր մասնակցի անունից։",
        "password-login-forbidden": "Այս ծածկանվան և գաղտնաբառի օգտագործումն արգելված է",
-       "mailmypassword": "Õ\88Ö\82Õ²Õ¡Ö\80Õ¯Õ¥Õ¬ Õ¶Õ¸Ö\80 Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼ Õ§Õ¬â\80\93Ö\83Õ¸Õ½Õ¿Õ¸Õ¾",
+       "mailmypassword": "Õ\8eÕ¥Ö\80Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨",
        "passwordremindertitle": "Նոր ժամանակավոր գաղտնաբառ {{grammar:genitive|{{SITENAME}}}} համար",
        "passwordremindertext": "Ինչ-որ մեկը (հավանաբար դուք՝ $1 IP-հասցեից) խնդրել է նոր գաղտնաբառ {{grammar:genitive|{{SITENAME}}}} ($4)։ «$2» մասնակցի ժամանակավոր գաղտնաբառն է՝ <code>$3</code>։ Եթե սա իսկապես ձեր մտադրություններ, ապա ձեզ հարկավոր է մտնել համակարգ և փոխել գաղտնաբառը։ Ձեր ժամանակավոր գաղտնաբառը գործելու է {{PLURAL:$5|օր|$5 օր}}։\n\nԵթե դուք չեք արել այսպիսի հայցում կամ արդեն հիշել եք ձեր գաղտնաբառը և մտադրություն չունեք այն փոխել, ապա կարող եք անտեսել այս ուղերձը և շարունակել օգտվել ձեր հին գաղտնաբառից։",
        "noemail": "«$1» մասնակցի համար էլ-փոստի հասցե չի նշվել։",
        "invalidemailaddress": "Նշված էլ-փոստի հասցեն անընդունելի է, քանի որ այն ունի անթույլատրելի ֆորմատ։ Խնդրում ենք նշել ճշմարիտ հասցե կամ այս դաշտը թողնել դատարկ։",
        "emaildisabled": "Այս կայքը չի կարող ուղարկել էլ․ նամակներ։",
        "accountcreated": "Հաշիվը ստեղծված է",
-       "accountcreatedtext": "$1 մասնակցի հաշիվը ստեղծված է։",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|քննարկում]]) մասնակցի հաշիվը ստեղծված է։",
        "createaccount-title": "{{SITENAME}}. մասնակցային հաշվի ստեղծում",
        "createaccount-text": "Ինչ-որ մեկը ստեղծել է «$2» անվանմամբ մասնակցային հաշիվ «$3» գաղտնաբառով {{SITENAME}} ($4) նախագծում՝ նշելով ձեր էլ-հասցեն։ Ձեզ անհրաժեշտ է մտնել համակարգ և փոխել գաղտնաբառը։\n\nԿարող եք անտեսել այս հաղորդագրությունը, եթե հաշիվը ստեղծվել է սխալմամբ։",
        "login-throttled": "Դուք կատարել եք չափից շատ մուտքի փորձ։\nԽնդրում ենք սպասել որոշ ժամանակ կրկին փորձելուց առաջ։",
        "loginlanguagelabel": "Լեզու՝ $1",
        "pt-login": "Մտնել",
+       "pt-login-button": "Մտնել",
        "pt-createaccount": "Ստեղծել մասնակցի հաշիվ",
        "pt-userlogout": "Դուրս գալ",
        "php-mail-error-unknown": "Անհայտ սխալ PHP-ի mail() ֆունկցիայում",
        "newpassword": "Նոր գաղտնաբառը.",
        "retypenew": "Հաստատեք նոր գաղտնաբառը.",
        "resetpass_submit": "Հաստատել գաղտնաբառը և մտնել համակարգ",
-       "changepassword-success": "Ձեր գաղտնաբառը փոխված է։ Մուտք համակարգ…",
+       "changepassword-success": "Ձեր գաղտնաբառը հաջողությամբ փոխված է։",
        "resetpass_forbidden": "Գաղտնաբառը չի կարող փոխվել",
        "resetpass-no-info": "Այս էջին ուղիղ դիմելու համար անհրաժեշտ է մտնել համակարգ։",
        "resetpass-submit-loggedin": "Փոխել գաղտնաբառը",
        "passwordreset-emailsent-capture": "Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։",
        "passwordreset-emailerror-capture": "Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։ Սակայն մասնակցին ուղարկելը չհաջողվեց․",
        "changeemail": "Փոխել էլ. հասցեն",
-       "changeemail-header": "Փոխել հաշվի էլ․ հասցեն",
        "changeemail-oldemail": "Ներկա էլ․ հասցե․",
        "changeemail-newemail": "Նոր էլ․ հասցե․",
        "changeemail-none": "(ոչ մի)",
        "changeemail-password": "Քո {{SITENAME}} գաղտնաբառը՝",
        "changeemail-submit": "Փոխել էլ․ հասցեն",
-       "changeemail-cancel": "Չեղարկել",
+       "resettokens-tokens": "Կտրոններ՝",
        "bold_sample": "Թավատառ տեքստ",
        "bold_tip": "Թավատառ տեքստ",
        "italic_sample": "Շեղատառ տեքստ",
        "showpreview": "Նախադիտել",
        "showdiff": "Կատարված փոփոխությունները",
        "anoneditwarning": "'''Ուշադրություն.''' Դուք չեք մտել համակարգ։\nՁեր IP հասցեն կգրանցվի այս էջի խմբագրումների պատմության մեջ։",
-       "anonpreviewwarning": "Դուք չեք մտել համակարգ։\n''Հիշելով ձեր կատարած խմբագրումը, այն կգրանցվի Ձեր IP հասցեի ներքո այս էջի խմբագրումների պատմության մեջ։''",
+       "anonpreviewwarning": "<em>Դուք չեք մտել համակարգ։\nՀիշելով Ձեր կատարած խմբագրումը, այն կպահանվի Ձեր IP հասցեի հետ միասին այս էջի խմբագրումների պատմության մեջ։</em>",
        "missingsummary": "'''Հիշեցում.''' Դուք չեք տվել խմբագրման ամփոփում։ «Հիշել» կոճակի կրկնակի մատնահարման դեպքում փոփոխությունները կհիշվեն առանց ամփոփման։",
        "missingcommenttext": "Խնդրում ենք մեկնաբանություն ավելացնել ստորև։",
        "missingcommentheader": "'''Հիշեցում.''' Դուք չեք նշել մեկնաբանության վերնագիրը։ «Հիշել» կոճակի կրկնակի մատնահարման դեպքում ձեր մեկնաբանությունը կհիշվի առանց վերնագրի։",
        "notextmatches": "Չկան համընկած տեքստերով էջեր",
        "prevn": "նախորդ {{PLURAL:$1|$1}}",
        "nextn": "հաջորդ {{PLURAL:$1|$1}}",
+       "prevn-title": "Նախկին $1 {{PLURAL:$1|արդյունքը|արդյունքները}}",
+       "nextn-title": "Հաջորդ $1 {{PLURAL:$1|արդյունքը|արդյունքները}}",
        "viewprevnext": "Դիտել ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Այս վիքիում, գոյություն ունի \"[[:$1]]\" անվանումով էջը։'''",
        "searchmenu-new": "'''Ստեղծե՛լ \"[[:$1]]\" էջը այս վիքիում'''",
        "searchrelated": "հարակից",
        "searchall": "բոլոր",
        "showingresults": "Ստորև բերված է մինչև {{PLURAL:$1|'''1''' արդյունք|'''$1''' արդյունք}}՝ սկսած №&nbsp;<strong>$2</strong>-ից։",
-       "showingresultsheader": "{{PLURAL:$5|'''$1''' արդյունք '''$3'''-ից|'''$1 - $2''' արդյունքներ '''$3'''-ից}}  '''$4'''-ի համար",
        "search-nonefound": "Որոնմանը համապատասխանող արդյունքներ չեն գտնվել։",
        "powersearch-legend": "Ընդլայնված որոնում",
        "powersearch-ns": "Որոնել անվանատարածքում.",
        "prefs-skin": "Տեսք",
        "skin-preview": "նախադիտել",
        "datedefault": "Առանց նախընտրության",
+       "prefs-user-pages": "Մասնակցային էջերը",
        "prefs-personal": "Անձնական",
        "prefs-rc": "Վերջին փոփոխություններ",
        "prefs-watchlist": "Հսկացանկ",
        "prefs-watchlist-days": "Հսկացանկում ցուցադրվող օրերի թիվը՝",
-       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "prefs-watchlist-days-max": "Առավելագույնը $1 {{PLURAL:$1|օր}}",
        "prefs-watchlist-edits": "Ընդարձակված հսկացանկում ցուցադրվող օրերի թիվը՝",
-       "prefs-watchlist-edits-max": "(1000-ից ոչ ավել)",
+       "prefs-watchlist-edits-max": "1000-ից ոչ ավել",
        "prefs-watchlist-token": "Հսկացանկի կտրոն.",
        "prefs-misc": "Այլ",
        "prefs-resetpass": "Փոխել գաղտնաբառը",
        "prefs-email": "Էլ-հասցեի ընտրանքներ",
        "prefs-rendering": "Արտաքին տեսք",
        "saveprefs": "Հիշել",
-       "restoreprefs": "Զրոյացնել, բերելով իլռելայն նախընտրանքներին",
+       "restoreprefs": "Զրոյացնել, բերելով իլռելայն նախընտրանքներին (բոլոր բաժիններում)",
        "prefs-editing": "Խմբագրում",
        "rows": "Տողեր`",
        "columns": "Սյունակներ",
        "searchresultshead": "Որոնում",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Պատառ հոդվածների հղումների</a> ձևավորման որոշման սահմանը.",
+       "stub-threshold-disabled": "Անջատված է",
        "recentchangesdays": "Վերջին փոփոխություններում ցուցադրվող օրերի թիվը՝",
        "recentchangesdays-max": "($1 {{PLURAL:$1|օրից|օրից}} ոչ ավել)",
        "recentchangescount": "Խմբագրումների թիվը ըստ լռության.",
        "prefs-help-recentchangescount": "Ներառում է վերջին փոփոխությունները, էջերի պատմությունը և տեղեկամատյանները։",
+       "prefs-help-watchlist-token2": "Սա գաղտնի բանալի է հսկականկի օգնույամբ նորություն ստանալու համար:\nՈվ որ գիտի այն կարող է կարդալ ձեր հսկացանկը, ուստի մի տարածեք այն:\nԵթե ձեզ պետք է զրոյացնել հսկացանկի կտրոնը, [[Special:ResetTokens| սեղմեք այստեղ]]:",
        "savedprefs": "Ձեր նախընտրությունները հիշված են։",
        "timezonelegend": "Ժամային գոտի.",
        "localtime": "Տեղական ժամանակ.",
-       "timezoneuseserverdefault": "Օգտագործել սերվերի ժամանակը",
+       "timezoneuseserverdefault": "Օգտագործել սերվերի ժամանակը ($1)",
        "timezoneuseoffset": "Այլ (նշեք տարբերությունը)",
        "servertime": "Սերվերի ժամանակ.",
        "guesstimezone": "Լրացնել բրաուզերից",
        "recentchanges-label-minor": "Սա չնչին խմբագրում է",
        "recentchanges-label-bot": "Այս խմբագրումը կատարվել է բոտի կողմից",
        "recentchanges-label-unpatrolled": "Այս խմբագրումը դեռ չի պարեկվել",
-       "recentchanges-label-plusminus": "Ô·Õ»Õ« Õ¹Õ¡Ö\83Õ½Õ¶ Ö\83Õ¸Õ­Õ¸Õ­Õ¾Õ¥Ö\81 Õ¡ÕµÕ½Ö\84Õ¡Õ¶ Õ¢Õ¡ÕµÕ©Õ¸Õ¾Ö\89",
+       "recentchanges-label-plusminus": "Ô·Õ»Õ« Õ¹Õ¡Ö\83Õ½Õ¨ Ö\83Õ¸Ö\83Õ¸Õ­Õ¾Õ¥Ö\81 Õ¡ÕµÕ½Ö\84Õ¡Õ¶ Õ¢Õ¡ÕµÕ©Õ¸Õ¾",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
        "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
        "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $3 $2",
        "pager-older-n": "{{PLURAL:$1|ավելի հին 1|ավելի հին $1}}",
        "booksources": "Գրքային աղբյուրներ",
        "booksources-search-legend": "Գրքի մասին տեղեկությունների որոնում",
-       "booksources-go": "Անցնել",
        "booksources-text": "Ստորև բերված են հղումներ դեպի արտաքին կայքեր, որտեղ կգտնեք հավելյալ տեղեկություններ գրքի մասին։ Սրանց մեջ ընդգրկված են ցանցային գրախանութներ և ընդհանուր գրադարանային կատալոգներ։",
        "booksources-invalid-isbn": "Նշված ISBN համարը ըստ երևույթի սխալ է պարունակում։ Համոզվեք որ համարը մուտքագրելիս, սխալ չի պատահել։",
        "specialloguserlabel": "Մասնակից.",
        "wlheader-enotif": "Էլ-փոստով տեղեկացումը միացված է։",
        "wlheader-showupdated": "Էջերը, որոնք փոփոխվել են ձեր դրանց վերջին այցից հետո բերված են '''թավատառ'''։",
        "wlnote": "Ստորև բերված {{PLURAL:$1|է վերջին փոփոխությունը|են վերջին '''$1''' փոփոխությունները}} վերջին <strong>$2</strong> ժամվա ընթացքում։",
-       "wlshowlast": "Ցուցադրել վերջին $1 ժամերը $2 օրերը $3",
+       "wlshowlast": "Ցուցադրել վերջին $1 ժամերը $2 օրերը",
        "watchlist-options": "Հսկացանկի նախընտրություններ",
        "watching": "Հսկվում է...",
        "unwatching": "Հանվում է հսկումից...",
        "exif-urgency-normal": "Նորմալ ($1)",
        "exif-urgency-low": "Թույլ ($1)",
        "exif-urgency-high": "Ուժեղ ($1)",
-       "watchlistall2": "բոլոր",
        "namespacesall": "բոլոր",
        "monthsall": "բոլոր",
        "confirmemail": "Էլ-հասցեի վավերացում",
        "confirm-watch-button": "ԼԱՎ",
        "confirm-watch-top": "Ավելացնե՞լ ձեր հսկացանկին",
        "confirm-unwatch-button": "ԼԱՎ",
-       "confirm-unwatch-top": "Õ\80Õ¥Õ¼Õ¡Ö\81Õ¶Õ¥Õ\9eÕ¬ Õ±եր հսկացանկից։",
+       "confirm-unwatch-top": "Õ\80Õ¥Õ¼Õ¡Ö\81Õ¶Õ¥Õ\9eÕ¬ Õ\81եր հսկացանկից։",
        "imgmultipageprev": "← նախորդ էջ",
        "imgmultipagenext": "հաջորդ էջ →",
        "imgmultigo": "Անցնե՛լ",
index 07f2fd1..82c4ae2 100644 (file)
        "otherlanguages": "In altere linguas",
        "redirectedfrom": "(Redirigite ab $1)",
        "redirectpagesub": "Pagina de redirection",
+       "redirectto": "Rediriger verso:",
        "lastmodifiedat": "Ultime modification de iste pagina: le $1 a $2.",
        "viewcount": "Iste pagina ha essite visitate {{PLURAL:$1|un vice|$1 vices}}.",
        "protectedpage": "Pagina protegite",
        "hidetoc": "celar",
        "collapsible-collapse": "Plicar",
        "collapsible-expand": "Displicar",
+       "confirmable-confirm": "Es {{GENDER:$1|tu}} secur?",
+       "confirmable-yes": "Si",
+       "confirmable-no": "No",
        "thisisdeleted": "Vider o restaurar $1?",
        "viewdeleted": "Vider $1?",
        "restorelink": "{{PLURAL:$1|un modification|$1 modificationes}} delite",
        "invalidtitle-knownnamespace": "Titulo invalide con spatio de nomines \"$2\" e texto \"$3\"",
        "invalidtitle-unknownnamespace": "Titulo invalide con spatio de nomines incognite $1 e texto \"$2\"",
        "exception-nologin": "Non identificate",
-       "exception-nologin-text": "[[Special:Userlogin|Aperi session]] pro poter acceder a iste pagina o action.",
+       "exception-nologin-text": "Aperi session pro poter acceder a iste pagina o action.",
        "exception-nologin-text-manual": "Es necessari $1 pro poter acceder a iste pagina o action.",
        "virus-badscanner": "Configuration incorrecte: programma antivirus non cognoscite: ''$1''",
        "virus-scanfailed": "scannamento fallite (codice $1)",
        "createaccount-text": "Un persona ha create un conto in tu adresse de e-mail a {{SITENAME}} ($4) denominate \"$2\", con le contrasigno \"$3\".\nTu deberea aperir un session e cambiar tu contrasigno ora.\n\nTu pote ignorar iste message si iste conto ha essite create in error.",
        "login-throttled": "Tu ha facite troppo de tentativas de aperir session.\nPer favor attende $1 ante de probar lo novemente.",
        "login-abort-generic": "Apertura de session non succedite - Abortate",
+       "login-migrated-generic": "Tu conto ha essite migrate, e tu nomine de usator non plus existe in iste wiki.",
        "loginlanguagelabel": "Lingua: $1",
        "suspicious-userlogout": "Le requesta de clauder le session ha essite refusate proque illo pare haber essite inviate per un navigator o proxy de cache defectuose.",
        "createacct-another-realname-tip": "Le nomine real es optional.\nSi tu opta pro dar lo, isto essera usate pro dar al usator attribution pro su contributiones.",
        "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-header": "Cambiar le adresse de e-mail del conto",
        "changeemail-text": "Completa iste formulario pro cambiar tu adresse de e-mail. Essera necessari entrar tu contrasigno pro confirmar iste cambio.",
        "changeemail-no-info": "Tu debe aperir un session pro poter acceder directemente a iste pagina.",
        "changeemail-oldemail": "Adresse de e-mail actual:",
        "changeemail-none": "(nulle)",
        "changeemail-password": "Contrasigno de {{SITENAME}}:",
        "changeemail-submit": "Cambiar e-mail",
-       "changeemail-cancel": "Cancellar",
        "changeemail-throttled": "Tu ha facite troppo de tentativas de aperir session.\nPer favor attende $1 ante de probar lo novemente.",
        "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.",
        "showpreview": "Monstrar previsualisation",
        "showdiff": "Detaliar modificationes",
        "blankarticle": "<strong>Advertimento:</strong> Le pagina que tu vole crear es vacue.\nSi tu clicca de novo sur \"{{int:savearticle}}\", le pagina essera create sin contento.",
-       "anoneditwarning": "'''Attention:''' Tu non ha aperite un session.\nTu adresse IP essera registrate in le historia de modificationes de iste pagina.",
+       "anoneditwarning": "<strong>Attention:</strong> Tu non ha aperite un session. Le adresse IP tue essera publicamente visibile si tu face modificationes. Si tu <strong>[$1 aperi un session]</strong> o <strong>[$2 crea un conto]</strong>, le modificationes essera attribuite al nomine de usator tue, inter altere avantages.",
        "anonpreviewwarning": "''Tu non ha aperite un session. Salveguardar registrara tu adresse IP in le historia de modificationes de iste pagina.''",
        "missingsummary": "'''Rememoration:''' Tu non ha specificate un summario del modification.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin summario.",
        "missingcommenttext": "Per favor entra un commento infra.",
        "parser-template-recursion-depth-warning": "Limite de recursion del patrono excedite ($1)",
        "language-converter-depth-warning": "Limite de profunditate del conversor de lingua excedite ($1)",
        "node-count-exceeded-category": "Paginas in que le numero de nodos excede le limite",
-       "node-count-exceeded-category-desc": "Un categoria pro paginas ubi le numero de nodos ha essite excedite.",
+       "node-count-exceeded-category-desc": "Le pagina excede le numero maxime de nodos.",
        "node-count-exceeded-warning": "Le numero de nodos in iste pagina excede le limite",
        "expansion-depth-exceeded-category": "Paginas in que le profunditate de expansion excede le limite",
-       "expansion-depth-exceeded-category-desc": "Isto es un categoria pro paginas in le quales le profunditate de expansion ha essite excedite.",
+       "expansion-depth-exceeded-category-desc": "Le pagina excede le profunditate de expansion maxime.",
        "expansion-depth-exceeded-warning": "Le profunditate de expansion in iste pagina excede le limite",
        "parser-unstrip-loop-warning": "Bucla de \"unstrip\" detegite",
        "parser-unstrip-recursion-limit": "Limite de recursion de \"unstrip\" excedite ($1)",
        "searchall": "totes",
        "showingresults": "Infra se monstra non plus de {{PLURAL:$1|'''1''' resultato|'''$1''' resultatos}} a partir del numero '''$2'''.",
        "showingresultsinrange": "In basso es monstrate usque a {{PLURAL:$1|<strong>1</strong> resultato|<strong>$1</strong> resultatos}} inter #<strong>$2</strong> e #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultato '''$1'''|Resultatos '''$1 - $2'''}} de '''$3''' pro '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Resultato <strong>$1</strong> de <strong>$3</strong>|Resultatos <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Le recerca non ha producite resultatos.",
        "powersearch-legend": "Recerca avantiate",
        "powersearch-ns": "Cercar in spatios de nomines:",
        "preferences": "Preferentias",
        "mypreferences": "Preferentias",
        "prefs-edits": "Numero de modificationes:",
-       "prefsnologintext2": "Es necessari $1 pro definir le preferentias de usator.",
+       "prefsnologintext2": "Es necessari aperir session pro cambiar le preferentias.",
        "prefs-skin": "Apparentia",
        "skin-preview": "Previsualisation",
        "datedefault": "Nulle preferentia",
        "prefs-tokenwatchlist": "Indicio",
        "prefs-diffs": "Differentias",
        "prefs-help-prefershttps": "Iste preferentia habera effecto a partir de tu proxime session.",
+       "prefswarning-warning": "To ha facite modificationes in tu preferentias que non ha ancora essite confirmate. Si tu quita iste pagina sin cliccar sur \"$1\", tu preferentias non essera cambiate.",
        "prefs-tabs-navigation-hint": "Consilio: Tu pote usar le claves de sagitta sinistre e dextre pro navigar inter le schedas in le lista.",
        "email-address-validity-valid": "Sembla valide",
        "email-address-validity-invalid": "Un adresse valide es obligatori!",
        "randomincategory": "Pagina aleatori in categoria",
        "randomincategory-invalidcategory": "\"$1\" non es un nomine de categoria valide.",
        "randomincategory-nopages": "Il non ha paginas in [[:Category:$1]].",
-       "randomincategory-selectcategory": "Prender un pagina qualcunque del categoria: $1 $2.",
-       "randomincategory-selectcategory-submit": "Va",
+       "randomincategory-category": "Categoria:",
+       "randomincategory-legend": "Pagina aleatori in categoria",
        "randomredirect": "Redirection aleatori",
        "randomredirect-nopages": "Il non ha redirectiones in le spatio de nomines \"$1\".",
        "statistics": "Statisticas",
        "querypage-disabled": "Iste pagina special es disactivate pro evitar de supercargar le systema.",
        "booksources": "Fontes de libros",
        "booksources-search-legend": "Cercar fontes de libros",
-       "booksources-go": "Va",
+       "booksources-search": "Cercar",
        "booksources-text": "Infra es un lista de ligamines a altere sitos que vende libros nove e usate, e pote etiam haber altere informationes super libros que tu cerca:",
        "booksources-invalid-isbn": "Le ISBN date non pare esser valide; verifica que tu non ha facite errores copiante lo del fonte original.",
        "specialloguserlabel": "Executor:",
        "trackingcategories-desc": "Criterios pro inclusion in categoria",
        "noindex-category-desc": "Iste pagina es excludite del indice perque illo contine le marca <code><nowiki>__NOINDEX__</nowiki></code> e es in un spatio de nomines ubi le uso de iste marca es permittite.",
        "index-category-desc": "Iste pagina contine le marca <code><nowiki>__INDEX__</nowiki></code> (e es in un spatio de nomines ubi le uso de iste marca es permittite), e dunque es includite in le indice mesmo si illo normalmente non lo esserea.",
-       "post-expand-template-inclusion-category-desc": "Le expansion de tote le patronos facerea le dimension del pagina exceder le limite de <code>$wgMaxArticleSize</code>, dunque alcun patronos non ha essite expandite.",
-       "post-expand-template-argument-category-desc": "Post le expansion de un parametro de patrono (qualcosa inter accolladas triple, como <code>{{{Exemplo}}}</code>), le dimension del pagina excede le limite de <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Troppo de functiones costose de analysator syntactic (como <code>#ifexist</code>) ha essite includite in un pagina. Vide [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Iste categoria es addite si le pagina contine un ligamine de file rupte (un ligamine pro incorporar un file quando le file non existe).",
-       "hidden-category-category-desc": "Iste categoria contine le marca <code><nowiki>__HIDDENCAT__</nowiki></code>, impediente lo de apparer in le quadro de ligamines de categoria in paginas, si non configurate alteremente.",
+       "post-expand-template-inclusion-category-desc": "Le dimension del pagina es plus grande de <code>$wgMaxArticleSize</code> post le expansion de tote le patronos, dunque alcun patronos non ha essite expandite.",
+       "post-expand-template-argument-category-desc": "Le dimension del pagina es plus grande de <code>$wgMaxArticleSize</code> post le expansion de un parametro de patrono (qualcosa inter accolladas triple, como <code>{{{Exemplo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Le pagina usa troppo de functiones costose de analysator syntactic (como <code>#ifexist</code>). Vide [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Le pagina contine un ligamine de file rupte (un ligamine pro incorporar un file quando le file non existe).",
+       "hidden-category-category-desc": "Le categoria contine <code><nowiki>__HIDDENCAT__</nowiki></code> in su contento de pagina, impediente que illo appare in le quadro de ligamines de categoria in paginas, si non configurate alteremente.",
        "trackingcategories-nodesc": "Nulle description disponibile.",
        "trackingcategories-disabled": "Le categoria es disactivate",
        "mailnologin": "Necun adresse de invio",
        "mywatchlist": "Observatorio",
        "watchlistfor2": "De $1 $2",
        "nowatchlist": "Tu non ha paginas sub observation.",
-       "watchlistanontext": "Tu debe $1 pro poter vider o modificar entratas in tu observatorio.",
+       "watchlistanontext": "Per favor, aperi session pro poter vider o modificar entratas in tu observatorio.",
        "watchnologin": "Tu non ha aperite un session",
        "addwatch": "Adder al observatorio",
        "addedwatchtext": "Le pagina \"[[:$1]]\" ha essite addite a tu [[Special:Watchlist|observatorio]].\nLe modificationes futur in iste pagina e in le pagina de discussion associate essera listate in illo.",
        "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginas}} in tu observatorio. Le paginas de discussion non es contate separatemente.",
        "wlheader-enotif": "Le notification via e-mail es active.",
        "wlheader-showupdated": "Le paginas que ha essite modificate post tu ultime visita se monstra in litteras '''grasse'''.",
-       "wlnote": "Ecce le ultime {{PLURAL:$1|modification|'''$1''' modificationes}} durante le ultime {{PLURAL:$2|hora|'''$2''' horas}}, a partir del $3 a $4.",
-       "wlshowlast": "Revelar ultime $1 horas $2 dies $3",
+       "wlnote": "Ecce le ultime {{PLURAL:$1|modification|<strong>$1</strong> modificationes}} durante le ultime {{PLURAL:$2|hora|<strong>$2</strong> horas}}, a partir del $3 a $4.",
+       "wlshowlast": "Monstrar le ultime $1 horas $2 dies",
        "watchlist-options": "Optiones del observatorio",
        "watching": "Observation in curso...",
        "unwatching": "Disobservation in curso...",
        "exbeforeblank": "contento ante radimento esseva: '$1'",
        "delete-confirm": "Deler \"$1\"",
        "delete-legend": "Deler",
-       "historywarning": "'''Attention:''' Le pagina que tu vole deler ha un historia de circa $1 {{PLURAL:$1|version|versiones}}:",
+       "historywarning": "<strong>Attention:</strong> Le pagina que tu vole deler ha un historia de circa $1 {{PLURAL:$1|version|versiones}}:",
        "confirmdeletetext": "Tu va deler un pagina con tote su historia.\nPer favor confirma que tu ha le intention de facer isto, que tu comprende le consequentias, e que tu face isto in accordo con [[{{MediaWiki:Policy-url}}|le politicas]].",
        "actioncomplete": "Action complete",
        "actionfailed": "Action fallite",
        "delete-edit-reasonlist": "Modificar le motivos pro deletion",
        "delete-toobig": "Iste pagina ha un grande historia de modificationes con plus de $1 {{PLURAL:$1|version|versiones}}.\nLe deletion de tal paginas ha essite restringite pro impedir le disruption accidental de {{SITENAME}}.",
        "delete-warning-toobig": "Iste pagina ha un grande historia de modificationes con plus de $1 {{PLURAL:$1|version|versiones}}.\nLe deletion de illo pote disrumper le operationes del base de datos de {{SITENAME}};\nprocede con caution.",
+       "deleteprotected": "Tu non pote deler iste pagina perque illo ha essite protegite.",
        "deleting-backlinks-warning": "'''Attention:''' Il ha [[Special:WhatLinksHere/{{FULLPAGENAME}}|altere paginas]] que liga a o transclude le pagina que tu es sur le puncto de deler.",
        "rollback": "Revocar modificationes",
        "rollback_short": "Revocar",
        "protect-othertime": "Altere duration:",
        "protect-othertime-op": "altere duration",
        "protect-existing-expiry": "Expiration existente: le $2 a $3",
+       "protect-existing-expiry-infinity": "Termino de expiration existente: infinite",
        "protect-otherreason": "Motivo altere/additional:",
        "protect-otherreason-op": "Altere motivo",
        "protect-dropdown": "*Motivos commun de protection\n** Vandalismo excessive\n** Spam excessive\n** Guerra de modificationes contraproductive\n** Pagina frequentemente visitate",
        "autoblockid": "Auto-blocada №$1",
        "block": "Blocar usator",
        "unblock": "Disblocar usator",
-       "blockip": "Blocar usator",
+       "blockip": "Blocar {{GENDER:$1|usator}}",
        "blockip-legend": "Blocar usator",
        "blockiptext": "Usa le formulario infra pro blocar le accesso de scriptura\na partir de un adresse IP specific.\nIsto debe esser facite solmente pro impedir vandalismo, e de\naccordo con le [[{{MediaWiki:Policy-url}}|politica de {{SITENAME}}]].\nScribe un motivo specific infra (per exemplo, citante paginas\nspecific que ha essite vandalisate).",
        "ipaddressorusername": "Adresse IP o nomine de usator:",
        "ipb-unblock-addr": "Disblocar $1",
        "ipb-unblock": "Disblocar un nomine de usator o un adresse IP",
        "ipb-blocklist": "Vider blocadas existente",
-       "ipb-blocklist-contribs": "Contributiones de $1",
+       "ipb-blocklist-contribs": "Contributiones de {{GENDER:$1|$1}}",
        "unblockip": "Disblocar adresse IP",
        "unblockiptext": "Usa le formulario infra pro restaurar le accesso de scriptura\na un adresse IP blocate previemente.",
        "ipusubmit": "Cancellar iste blocada",
        "unblocked": "[[User:$1|$1]] ha essite disblocate",
        "unblocked-range": "$1 ha essite disblocate",
        "unblocked-id": "Le blocada $1 ha essite eliminate",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] ha essite disblocate.",
        "blocklist": "Usatores blocate",
        "ipblocklist": "Usatores blocate",
        "ipblocklist-legend": "Cercar un usator blocate",
        "import": "Importar paginas",
        "importinterwiki": "Importation transwiki",
        "import-interwiki-text": "Selige le wiki e le titulo del pagina a importar.\nLe datas del versiones e nomines del contributores essera preservate.\nTote le actiones de importation transwiki se registra in le [[Special:Log/import|registro de importationes]].",
-       "import-interwiki-source": "Wiki/pagina de origine:",
+       "import-interwiki-sourcewiki": "Wiki de origine:",
+       "import-interwiki-sourcepage": "Pagina de origine:",
        "import-interwiki-history": "Copiar tote le versiones del historia de iste pagina",
        "import-interwiki-templates": "Includer tote le patronos",
        "import-interwiki-submit": "Importar",
        "exif-urgency-low": "Basse ($1)",
        "exif-urgency-high": "Alte ($1)",
        "exif-urgency-other": "Prioritate definite per usator ($1)",
-       "watchlistall2": "totes",
        "namespacesall": "totes",
        "monthsall": "totes",
        "confirmemail": "Confirmar adresse de e-mail",
        "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",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ha incargate}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|ha incargate}} un nove version de $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|ha incargate}} $3",
        "rightsnone": "(nulle)",
+       "revdelete-summary": "summario del modification",
        "feedback-bugornote": "Si tu es preste a describer un problema technic in detalio, per favor [$1 reporta un falta].\nSi non, tu pote usar le formulario facile hic infra. Tu commento essera addite al pagina \"[$3 $2]\", con tu nomine de usator e le navigator del web que tu usa.",
        "feedback-subject": "Subjecto:",
        "feedback-message": "Message:",
        "action-pagelang": "cambiar le lingua del pagina",
        "log-name-pagelang": "Registro de cambios de lingua",
        "log-description-pagelang": "Isto es un registro de cambios de lingua in paginas.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambiava}} le lingua del pagina $3 de $4 a $5."
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambiava}} le lingua del pagina $3 de $4 a $5.",
+       "default-skin-not-found": "Attention! Le apparentia predefinite de tu wiki, definite in <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, non es disponibile.\n\nLe installation pare includer le sequente apparentias. Vide [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pro saper como activar los e seliger le predefinite.\n\n$2\n\n; Si tu ha justo installate MediaWiki:\n: Tu lo ha probabilemente installate a partir de git, o directemente del codice fonte con un altere methodo. Isto es normal. Essaya installar alcun apparentias desde [https://www.mediawiki.org/wiki/Category:All_skins le directorio de apparentias de mediawiki.org], per:\n:* Discargar le [https://www.mediawiki.org/wiki/Download archivo tar del installator], que include plure apparentias e extensiones. Tu pote copiar e collar le directorio <code>skins/</code> de illo.\n:* Clonar un del repositorios <code>mediawiki/skins/*</code> via git in le directorio <code dir=\"ltr\">skins/</code> de tu installation de MediaWiki.\n: Facer isto non deberea interferer con tu repositorio git si tu es un disveloppator de MediaWiki.\n\n; Si tu ha justo actualisate MediaWiki:\n: MediaWiki a partir del version 1.24 non plus activa automaticamente le apparentias installate (vide [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Tu pote collar le sequente lineas in <code>LocalSettings.php</code> pro activar tote le apparentias actualmente installate:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si tu ha justo modificate <code>LocalSettings.php</code>:\n: Verifica meticulosemente que le nomines del apparentias non ha errores.",
+       "default-skin-not-found-no-skins": "Attention! Le apparentia predefinite de tu wiki, definite in <code>$wgDefaultSkin</code> como <code>$1</code>, non es disponibile.\n\nTu non ha apparentias installate.\n\n; Si tu ha justo installate o actualisate MediaWiki:\n: Tu lo ha probabilemente installate a partir de git, o directemente del codice fonte con un altere methodo. Isto es normal. Essaya installar alcun apparentias desde [https://www.mediawiki.org/wiki/Category:All_skins le directorio de apparentias de mediawiki.org], per:\n:* Discargar le [https://www.mediawiki.org/wiki/Download archivo tar del installator], que include plure apparentias e extensiones. Tu pote copiar e collar le directorio <code>skins/</code> de illo.\n:* Clonar un del repositorios <code>mediawiki/skins/*</code> via git in le directorio <code dir=\"ltr\">skins/</code> de tu installation de MediaWiki.\n: Facer isto non deberea interferer con tu repositorio git si tu es un disveloppator de MediaWiki. Vide [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pro saper como activar skins e seliger le predefinite.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activate)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disactivate''')",
+       "mediastatistics": "Statisticas de multimedia",
+       "mediastatistics-summary": "Statisticas sur le typos de file incargate. Isto include solmente le version le plus recente de un file. Versiones ancian o delite de files es excludite.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Typo MIME",
+       "mediastatistics-table-extensions": "Extensiones possibile",
+       "mediastatistics-table-count": "Numero de files",
+       "mediastatistics-table-totalbytes": "Dimension combinate",
+       "mediastatistics-header-unknown": "Incognite",
+       "mediastatistics-header-bitmap": "Imagines de mappa de bits",
+       "mediastatistics-header-drawing": "Designos (imagines vectorial)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-multimedia": "Multimedia complexe",
+       "mediastatistics-header-office": "Officio",
+       "mediastatistics-header-text": "Textual",
+       "mediastatistics-header-executable": "Executabiles",
+       "mediastatistics-header-archive": "Formatos comprimite",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|comma|commas}} final ha essite removite de JSON",
+       "json-error-unknown": "Il habeva un problema con le JSON. Error: $1",
+       "json-error-depth": "Le profunditate maxime del pila ha essite excedite",
+       "json-error-state-mismatch": "JSON non valide o mal formate",
+       "json-error-ctrl-char": "Error de character de controlo, possibilemente codificate incorrectemente",
+       "json-error-syntax": "Error de syntaxe",
+       "json-error-utf8": "Characteres UTF-8 mal formate, possibilemente codificate incorrectemente",
+       "json-error-recursion": "Il ha un o plure referentias recursive in le valor a codificar",
+       "json-error-inf-or-nan": "Un o plure valores NAN o INF se trova in le valor a codificar",
+       "json-error-unsupported-type": "Un valor de un typo que non pote esser codificate ha essite date"
 }
index 3f68663..d671f80 100644 (file)
@@ -35,7 +35,8 @@
                        "아라",
                        "C5st4wr6ch",
                        "Raynasution",
-                       "Arifin.wijaya"
+                       "Arifin.wijaya",
+                       "Ahdan"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "userlogout": "Keluar log",
        "notloggedin": "Belum masuk log",
        "userlogin-noaccount": "Belum punya akun?",
-       "userlogin-joinproject": "Join {{SITENAME}}",
+       "userlogin-joinproject": "Gabung {{SITENAME}}",
        "nologin": "Belum mempunyai akun? $1.",
        "nologinlink": "Daftarkan akun baru",
        "createaccount": "Buat akun baru",
        "userlogin-loggedin": "Andan telah masuk log sebagai $1.\nGunakan formulir di bawah untuk masuk log sebagai pengguna lain.",
        "userlogin-createanother": "Buat akun lain",
        "createacct-emailrequired": "Alamat surel",
-       "createacct-emailoptional": "Alamat surel (opsional)",
+       "createacct-emailoptional": "Alamat surel/email (dianjurkan untuk diisi)",
        "createacct-email-ph": "Masukkan alamat surel Anda",
        "createacct-another-email-ph": "Masukkan alamat surel",
        "createaccountmail": "Gunakan kata sandi acak sementara dan kirimkan ke surel yang diinginkan",
        "passwordreset-emailsent-capture": "Surel setel ulang kata sandi telah dikirim, yang ditampilkan di bawah.",
        "passwordreset-emailerror-capture": "Surel setel ulang kata sandi telah dibuat, yang ditampilkan di bawah, namun pengiriman pada {{GENDER:$2|pengguna}} gagal: $1",
        "changeemail": "Ubah alamat surel",
-       "changeemail-header": "Ubah alamat surel akun",
        "changeemail-text": "Selesaikan formulir ini untuk mengubah alamat surel Anda. Anda perlu memasukkan sandi untuk mengkonfirmasi perubahan ini.",
        "changeemail-no-info": "Anda harus masuk log untuk mengakses halaman ini secara langsung.",
        "changeemail-oldemail": "Alamat surel saat ini:",
        "changeemail-none": "(tidak ada)",
        "changeemail-password": "Sandi {{SITENAME}} Anda:",
        "changeemail-submit": "Ubah surel",
-       "changeemail-cancel": "Batalkan",
        "changeemail-throttled": "Anda sudah terlalu banyak mencoba masuk log.\nSilakan menunggu $1 sebelum mencoba lagi.",
        "resettokens": "Reset token",
        "resettokens-text": "Anda dapat me-reset Token yang memungkinkan akses ke data pribadi tertentu yang terkait dengan akun Anda di sini.\n\nAnda harus melakukannya jika Anda secara tidak sengaja berbagi dengan seseorang atau jika akun Anda telah disusupi.",
        "searchall": "semua",
        "showingresults": "Di bawah ini ditampilkan hingga {{PLURAL:$1|'''1''' hasil|'''$1''' hasil}}, dimulai dari #'''$2'''.",
        "showingresultsinrange": "Menampilkan sampai dengan {{PLURAL:$1|<strong>1</strong> hasil|<strong>$1</strong> hasil}} dalam jangkauan #<strong>$2</strong> sampai #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Hasil '''$1''' dari '''$3'''|Hasil '''$1 - $2''' dari '''$3'''}} untuk '''$4'''",
        "search-nonefound": "Tidak ada hasil yang sesuai dengan kriteria.",
        "powersearch-legend": "Pencarian lanjut",
        "powersearch-ns": "Mencari di ruang nama:",
        "powersearch-togglelabel": "Pilih:",
        "powersearch-toggleall": "Semua",
        "powersearch-togglenone": "Tidak ada",
-       "powersearch-remember": "Ingar pilihan untuk pencarian selanjutnya",
+       "powersearch-remember": "Ingat pilihan untuk pencarian selanjutnya",
        "search-external": "Pencarian eksternal",
        "searchdisabled": "Pencarian {{SITENAME}} sementara dimatikan.\nAnda dapat mencari melalui Google untuk sementara waktu.\nPerlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencakup perubahan-perubahan terakhir.",
        "search-error": "Kesalahan terjadi saat mencari: $1",
        "prefs-tokenwatchlist": "Tanda",
        "prefs-diffs": "Beda",
        "prefs-help-prefershttps": "Preferensi ini akan diaktifkan kali berikutnya Anda masuk log.",
+       "prefswarning-warning": "Perubahan preferensi anda belum tersimpan. Apabila anda meninggalkan halaman ini tanpa men-klik \"$1\" preferensi anda tidak akan diperbarui.",
        "prefs-tabs-navigation-hint": "Tip: Anda dapat menggunakan tombol panah kiri dan kanan untuk bernavigasi antartab di dalam daftar tab.",
        "email-address-validity-valid": "Alamat surel tampaknya sah",
        "email-address-validity-invalid": "Masukkan alamat surel yang sah",
        "randomincategory": "Halaman acak dalam kategori",
        "randomincategory-invalidcategory": "\"$1\" bukanlah nama kategori yang berlaku.",
        "randomincategory-nopages": "Tidak ada halaman dalam [[:Category:$1]].",
-       "randomincategory-selectcategory": "Dapatkan halaman acak dari kategori: $1 $2.",
-       "randomincategory-selectcategory-submit": "Lanjut",
        "randomredirect": "Pengalihan sembarang",
        "randomredirect-nopages": "Tak terdapat pengalihan pada ruang nama \"$1\".",
        "statistics": "Statistik",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Cari di sumber buku",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Tuju ke",
+       "booksources-search": "Cari",
        "booksources-text": "Di bawah ini adalah daftar pranala ke situs lain yang menjual buku baru dan bekas, dan mungkin juga mempunyai informasi lebih lanjut mengenai buku yang sedang Anda cari:",
        "booksources-invalid-isbn": "ISBN yang diberikan tampaknya tidak valid; periksa kesalahan penyalinan dari sumber asli.",
        "specialloguserlabel": "Pengguna:",
        "wlheader-enotif": "Notifikasi surel diaktifkan.",
        "wlheader-showupdated": "Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''.",
        "wlnote": "Di bawah ini adalah {{PLURAL:$1|perubahan|'''$1''' perubahan}} terakhir dalam '''$2''' jam terakhir, per $3, $4.",
-       "wlshowlast": "Tampilkan $1 jam $2 hari terakhir $3",
+       "wlshowlast": "Tampilkan $1 jam $2 hari terakhir",
        "watchlist-options": "Opsi daftar pantauan",
        "watching": "Memantau...",
        "unwatching": "Menghilangkan pemantauan...",
        "import": "Impor halaman",
        "importinterwiki": "Impor transwiki",
        "import-interwiki-text": "Pilih suatu wiki dan judul halaman yang akan di impor.\nTanggal revisi dan nama penyunting akan dipertahankan.\nSemua aktivitas impor transwiki akan dicatat di [[Special:Log/import|log impor]].",
-       "import-interwiki-source": "Wiki/halaman sumber:",
        "import-interwiki-history": "Salin semua versi terdahulu dari halaman ini",
        "import-interwiki-templates": "Sertakan semua templat",
        "import-interwiki-submit": "Impor",
        "exif-urgency-low": "Rendah ($1)",
        "exif-urgency-high": "Tinggi ($1)",
        "exif-urgency-other": "Prioritas ubahsuaian ($1)",
-       "watchlistall2": "semua",
        "namespacesall": "semua",
        "monthsall": "semua",
        "confirmemail": "Konfirmasi alamat surel",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|mengubah}} keanggotaan grup $3",
        "logentry-rights-autopromote": "$1 secara otomatis {{GENDER:$2|dipromosikan}} dari $4 menjadi $5",
        "rightsnone": "(tidak ada)",
+       "revdelete-summary": "ringkasan",
        "feedback-bugornote": "Jika Anda sudah siap untuk mendeskripsikan masalah teknis secara rinci silakan [$1 melaporkan bug].\nJika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda akan ditambahkan ke halaman \"[$3 $2]\", bersama dengan nama pengguna Anda dan apa browser yang Anda gunakan.",
        "feedback-subject": "Perihal:",
        "feedback-message": "Pesan:",
        "action-pagelang": "mengubah bahasa halaman",
        "log-name-pagelang": "Ubah bahasa log",
        "log-description-pagelang": "Ini adalah log perubahan dalam bahasa halaman.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|mengubah}} bahasa halaman $3 dari $4 menjadi $5."
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|mengubah}} bahasa halaman $3 dari $4 menjadi $5.",
+       "mediastatistics-summary": "Statistik tentang jenis file yang terunggah. Ini hanya mencakup versi terbaru dari sebuah file. Terkecuali file lama dan file yang sudah dihapus",
+       "mediastatistics-table-count": "Jumlah file",
+       "mediastatistics-table-totalbytes": "Ukuran gabungan",
+       "mediastatistics-header-unknown": "Tidak diketahui",
+       "mediastatistics-header-bitmap": "Gambar bitmap",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-office": "Office",
+       "mediastatistics-header-text": "Tekstual",
+       "mediastatistics-header-executable": "Executable",
+       "mediastatistics-header-archive": "Format terkompresi",
+       "json-error-depth": "Kedalaman tumpukan maksimal telah terlewati",
+       "json-error-syntax": "Kesalahan sintaks"
 }
index b1f5651..b3b2af5 100644 (file)
        "search-suggest": "Esque tu ha intentet: «$1»?",
        "searchrelated": "relatet",
        "searchall": "omni",
-       "showingresultsheader": "{{PLURAL:$5|Resultate '''$1''' de '''$3'''|Resultates '''$1 – $2''' de '''$3'''}} por '''$4'''",
        "search-nonefound": "Tu sercha ne ha trovat un resultate.",
        "preferences": "Preferenties",
        "mypreferences": "Preferenties",
        "suppress": "Perspective comun",
        "booksources": "Librari fontes",
        "booksources-search-legend": "Serchar por fontes de libre",
-       "booksources-go": "Ear",
        "specialloguserlabel": "Executor:",
        "speciallogtitlelabel": "Cible (titul o usator):",
        "log": "Diariumes",
        "wlheader-enotif": "Li notification de e-mail es permisset.",
        "wlheader-showupdated": "Págines quel hat esset mutat desde tui ultim visitation es monstrat in '''nigri'''",
        "wlnote": "Infra {{PLURAL:$1|es li ultim change|es li ultim '''$1''' changes}} in li ultim {{PLURAL:$2|hor|'''$2''' hores}}.",
-       "wlshowlast": "Monstra ultim $1 hores $2 dies $3",
+       "wlshowlast": "Monstra ultim $1 hores $2 dies",
        "watchlist-options": "Optiones de liste de págines vigilat",
        "watching": "Vigilant...",
        "unwatching": "Desvigilant...",
        "metadata": "Metadata",
        "metadata-help": "Ti file contene information additional, probabilmen adjuntet de li cámera digitale o scandetor usat por crear o digitalizar it. Si li file ha esset redactet de tui statu original, alcun detallies posse ne reflecter completmen li file redactet.",
        "metadata-fields": "Campes metadata de figura listat in ti missage va esser includet in págine de figura monstra quande li tabelle metadata es crulat.\nAltri va esser ocultat per contumacie.\n* fabrication\n* modelle\n* origine de figura\n* témpor de exposition\n* númere\n* percentages de velocitá\n* longore focal\n* artist\n* jure editorial\n* descrition de figura\n* latitúdine\n* longitúdine\n* altitudine",
-       "watchlistall2": "omni",
        "namespacesall": "omni",
        "monthsall": "omni",
        "imgmultigo": "Ear!",
index e976fac..3c3a16a 100644 (file)
        "passwordreset": "Nkuwaria okwúngáfè",
        "passwordreset-emailelement": "Áhà Ọ'banife: $1\nPasswod nke gi gbanwe: $2",
        "changeemail-none": "(efù)",
-       "changeemail-cancel": "Kàchá",
        "bold_sample": "Mkpúrù èdè íke",
        "bold_tip": "Mkpúrù èdè íke",
        "italic_sample": "Mkpurụ okwu sélénsé",
        "suppress": "Aghọ",
        "booksources": "Ébé ákwúkwó shị",
        "booksources-search-legend": "Tuó íshí akwúkwó shì",
-       "booksources-go": "Gá",
        "specialloguserlabel": "Ọ'bànifé:",
        "speciallogtitlelabel": "Ishi:",
        "log": "Ndetu-nchétá",
        "unwatch": "A hükwàlà",
        "notanarticle": "Búghị ihü ihe nọr",
        "watchlist-details": "{{PLURAL:$1|ihü $1|ihü $1}} nọr na ndétu ihe Í ne lé, nke à gúgị ihü okwu.",
-       "wlshowlast": "Zi nke mbu àmànị $1 chi $2 $3",
+       "wlshowlast": "Zi nke mbu àmànị $1 chi $2",
        "watchlist-options": "Nrọta ndetu nlènlé",
        "watching": "O na hü...",
        "unwatching": "O mele ka o na á hü kwagi...",
        "filemissing": "Usòrò è fwuólé",
        "import": "Gọbàtá ihü",
        "importinterwiki": "Ngọbàtá Transwiki",
-       "import-interwiki-source": "Mkpòlógwù wiki/ihü:",
        "import-interwiki-templates": "Bàtụcha átụ́ nile",
        "import-interwiki-submit": "Dọwá bànyé",
        "import-upload-filename": "Áhà usòrò:",
        "exif-urgency-normal": "Nkịtị ($1)",
        "exif-urgency-low": "Nàlà ($1)",
        "exif-urgency-high": "Nélú ($1)",
-       "watchlistall2": "nke níle",
        "namespacesall": "nke níle",
        "monthsall": "nke níle",
        "recreate": "Ké ya ohúrù",
        "htmlform-selectorother-other": "Nke ozor",
        "revdelete-content-hid": "ihe zọ̀nàri",
        "rightsnone": "(efù)",
+       "revdelete-summary": "mmẹkotá orü",
        "feedback-message": "Ozi:",
        "feedback-close": "Ọméchá.",
        "searchsuggest-search": "Chọwa",
index 360cf5c..c472fc6 100644 (file)
        "passwordreset-emailsent-capture": "Ti maysa nga esurat ti panangisaad manen ti kontrasenias ket naipatuloden, a naipakita dita baba.",
        "passwordreset-emailerror-capture": "Naaramid ti maysa nga esurat a panangisaad manen ti kontrasenias, a napaikita dita baba, ngem ti panangitulod kenni {{GENDER:$2|agar-aramat}} ket napaay: $1",
        "changeemail": "Sukatan ti esurat a pagtaengan",
-       "changeemail-header": "Sukatan ti esurat a pagtaengan ti pakabilangan",
        "changeemail-text": "Kompletuen daytoy a porma ti panagsukat ti esurat a pagtaengam. Nasken nga ikabilmo ti kontrasenias tapno mapasingkedan daytoy a panagsukat.",
        "changeemail-no-info": "Masapul a nakastrekka tapno dagus a makapan iti ditoy a panid.",
        "changeemail-oldemail": "Agdama nga esurat a pagtaengan:",
        "changeemail-none": "(awan)",
        "changeemail-password": "Ti bukodmo a kontrasenias ti {{SITENAME}}:",
        "changeemail-submit": "Sukatan ti esurat",
-       "changeemail-cancel": "Ukasen",
        "changeemail-throttled": "Adu unay ti panagpadasmo a sumrek.\nPangngaasi nga aguray ti $1 sakbay a padasen manen.",
        "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.",
        "searchall": "amin",
        "showingresults": "Maiparang dita baba agingga {{PLURAL:$1|iti <strong>1</strong> a nagbanagan|dagiti <strong>$1</strong> a nagbanagan}} a mangrugi ti #<strong>$2</strong>.",
        "showingresultsinrange": "Mangipakpakita aginggana {{PLURAL:$1|iti <strong>1</strong> a resulta|dagiti <strong>$1</strong> a resulta}} iti sakop ti #<strong>$2</strong> aginggana ti #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Nagbanagan a <strong>$1</strong> iti <strong>$3</strong>|Dagiti Nagbanagan a <strong>$1 - $2</strong> iti <strong>$3</strong>}} para iti <strong>$4</strong>",
        "search-nonefound": "Awan dagiti nagbanagan a maipada ti usisa.",
        "powersearch-legend": "Napasayat a panagbiruk",
        "powersearch-ns": "Agbiruk kadagiti nagan ti espasio:",
        "randomincategory": "Pugto a panid iti kategoria",
        "randomincategory-invalidcategory": "Ti \"$1\" ket saan nga umisu a nagan ti kategoria.",
        "randomincategory-nopages": "Awan ti pampanid iti kategoria ti [[:Category:$1]].",
-       "randomincategory-selectcategory": "Agala ti pugto a panid manipud ti kategoria: $1 $2.",
-       "randomincategory-selectcategory-submit": "Inkan",
        "randomredirect": "Pugto a baw-ing",
        "randomredirect-nopages": "Awan dagiti baw-ing iti daytoy a nagan ti espasio ti \"$1\".",
        "statistics": "Estadistika",
        "querypage-disabled": "Daytoy nga espesial a panid ket nabaldado gapu kadagiti rason ti kasayaat ti panagpataray.",
        "booksources": "Dagiti taudan ti libro",
        "booksources-search-legend": "Agbiruk para kadagiti taudan ti libro",
-       "booksources-go": "Inkan",
        "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": "Perpormer:",
        "wlheader-enotif": "Napakabaelan ti panangipakaammo ti esurat.",
        "wlheader-showupdated": "Dagiti panid a nasukatanen manipud ti kinaudi a panagsarungkarmo ket naipakita iti <strong>napuskol</strong>.",
        "wlnote": "Dita baba ket {{PLURAL:$1|naudi a sinukatan|dagiti naudi a <strong>$1</strong> a sinukatan}} iti napalabas {{PLURAL:$2|nga oras|a <strong>$2</strong> nga or-oras}}, manipud idi $3, $4.",
-       "wlshowlast": "Ipakita dagiti naudi a $1 nga or-oras $2 nga al-aldaw $3",
+       "wlshowlast": "Ipakita dagiti naudi a $1 nga or-oras $2 nga al-aldaw",
        "watchlist-options": "Dagiti pagpilian ti listaan a bambantayan",
        "watching": "Bambantayan...",
        "unwatching": "Saanen a bantayan...",
        "import": "Agala kadagiti panid",
        "importinterwiki": "Agala ti transwiki",
        "import-interwiki-text": "Agpilika ti wiki ken titulo ti panid nga alaem.\nDagiti rebision ti petsa ken dagiti nagan ti mannurat ket maipreserba.\nAmin a transwiki nga alaem ket mailista iti [[Special:Log/import|listaan ti panagala]].",
-       "import-interwiki-source": "Taudan ti wiki/panid:",
        "import-interwiki-history": "Kopiaen amin dagiti rebision ti pakasaritaan daytoy a panid",
        "import-interwiki-templates": "Iraman amin dagiti plantilia",
        "import-interwiki-submit": "Agala",
        "exif-urgency-low": "Nababa ($1)",
        "exif-urgency-high": "Nangato ($1)",
        "exif-urgency-other": "Inpalawag ti agar-aramat a prioridad ($1)",
-       "watchlistall2": "amin",
        "namespacesall": "amin",
        "monthsall": "amin",
        "confirmemail": "Pasingkedan ti esurat a pagtaengam",
        "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",
        "rightsnone": "(awan)",
+       "revdelete-summary": "pakabuklan ti panagedit",
        "feedback-bugornote": "No sisasagakan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi nga [$1 ireporta ti parikut].\nNupay kasta, mausarmo ti nalaka a porma dita baba. Ti komentario nga itedmo ket mainayon iti panid \"[$3 $2], a mairaman ti naganmo nga agar-aramat ken no ania ti pagbasabasa nga us-sarem.",
        "feedback-subject": "Suheto:",
        "feedback-message": "Mensahe:",
index d350f64..573c581 100644 (file)
        "search-relatedarticle": "шоайл дола",
        "searchrelated": "гаргара",
        "searchall": "деррига",
-       "showingresultsheader": "{{PLURAL:$5|1='''$1''' толамче укх '''$3''' долачарах|'''$1 — $2''' толамчаш укх '''$3''' долачарах}} '''$4'''а",
        "search-nonefound": "ДIахаттама нийсамаш корадаьдац.",
        "powersearch-legend": " Доккха тахкар",
        "powersearch-ns": " ЦIерий аренашкахь лахар",
        "pager-older-n": "{{PLURAL:$1|къаьнара дара|къаьнара долaчаьрахь|къаьнара дараш}} $1",
        "booksources": "Китабий гIувам",
        "booksources-search-legend": "Китаба лоаца маIандара тохкам",
-       "booksources-go": "Лаха",
        "log": "Тептараш",
        "allpages": "Еррига оагIувнаш",
        "prevpage": "($1) хьалхара оагIув",
        "watchthispage": "Укх оагIува теркам бе",
        "unwatch": "Лора ма де",
        "watchlist-details": "Шун теркама дагарченгахь йола  $1 {{PLURAL:$1|1=оагIув|оагIувнаш}}, дувцама оагIувнаш ца лоархIаш.",
-       "wlshowlast": "Тlехьара $1 сахьаташ $2 денош $3 хьахьокха",
+       "wlshowlast": "Тlехьара $1 сахьаташ $2 денош  хьахьокха",
        "watchlist-options": "Зем баккха дагарена хувцамаш",
        "watching": "Тохкам беча оагIув тIа тIадаккха",
        "unwatching": "Тохкам беча оагIув тIера дIадаккха",
        "exif-iimcategory-spo": "Нидзоамал",
        "exif-iimcategory-war": "ТIемаш, кховсамаши латтараши",
        "exif-iimcategory-wea": "Хаоттам",
-       "watchlistall2": "деррига",
        "namespacesall": "деррига",
        "monthsall": "деррига",
        "confirm_purge_button": "ХIаа",
        "htmlform-submit": "ДIадахьийта",
        "htmlform-reset": "Хувцамаш юхадаккха",
        "htmlform-selectorother-other": "Кхыдола",
-       "rightsnone": "(а)"
+       "rightsnone": "(а)",
+       "revdelete-summary": "хувцамий лоацам"
 }
index a519039..533204c 100644 (file)
        "search-interwiki-more": "(plusa)",
        "searchall": "omna",
        "showingresults": "Montrante infre {{PLURAL:$1|'''1''' rezulto|'''$1''' rezulti}}, qui komencas kun numero #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Rezultajo '''$1''' ek '''$3'''|Rezultaji '''$1 - $2''' ek '''$3'''}} di '''$4'''",
        "powersearch-legend": "Avancita sercho",
        "powersearch-ns": "Serchez en nomari:",
        "powersearch-toggleall": "Omna",
        "pager-older-n": "{{PLURAL:$1|plu anciena 1|plu anciena $1}}",
        "booksources": "Fonti di libri",
        "booksources-search-legend": "Serchez librala fonti",
-       "booksources-go": "Irar",
        "specialloguserlabel": "Uzanto:",
        "speciallogtitlelabel": "Titulo:",
        "log": "Registrari",
        "unwatchthispage": "Ne plus surveyar",
        "notanarticle": "Ne esas artiklo",
        "wlnote": "Infre esas la lasta {{PLURAL:$1|chanjo|'''$1''' chanji}} dum la lasta {{PLURAL:$2|horo|'''$2''' hori}}.",
-       "wlshowlast": "Montrar la lasta $1 hori $2 dii $3",
+       "wlshowlast": "Montrar la lasta $1 hori $2 dii",
        "watchlist-options": "Surveryo-listo selekti",
        "watching": "Surveyanta…",
        "unwatching": "Cesanta surveyar…",
        "exif-sharpness-0": "Normala",
        "exif-gpsspeed-k": "Kilometri per horo",
        "exif-gpsspeed-m": "Milii per horo",
-       "watchlistall2": "omna",
        "namespacesall": "omna",
        "monthsall": "omna",
        "confirmemail_needlogin": "Vu mustas $1 pro konfirmar vua adreso di e-posto.",
        "htmlform-reset": "Desfacar chanji",
        "htmlform-selectorother-other": "Altra",
        "rightsnone": "(nula)",
+       "revdelete-summary": "redakto-rezumo",
        "searchsuggest-search": "Serchez",
        "searchsuggest-containing": "quan kontenas...",
        "expand_templates_output": "Rezulto",
index 3375101..18aaf20 100644 (file)
        "invalidtitle-knownnamespace": "Ógildur titill í nafnrými \"$2\" og með textann \"$3\"",
        "invalidtitle-unknownnamespace": "Ógildur titill með óþekkt nafnrými númer $1 og texta \"$2\"",
        "exception-nologin": "Óinnskráð(ur)",
-       "exception-nologin-text": "Vinsamlegast [[Special:Userlogin|skráðu þig inn]] til þess að hafa aðgang að þessari síðu eða aðgerð.",
+       "exception-nologin-text": "Vinsamlegast skráðu þig inn til þess að hafa aðgang að þessari síðu eða aðgerð.",
        "virus-badscanner": "Slæm stilling: óþekktur veiruskannari: ''$1''",
        "virus-scanfailed": "skönnun mistókst (kóði $1)",
        "virus-unknownscanner": "óþekkt mótveira:",
        "passwordreset-emailsent-capture": "Tölvupóstur til að endursetja lykilorðið hefur verið sendur í tölvupósti, sem er sýndur hér fyrir neðan.",
        "passwordreset-emailerror-capture": "Tölvupóstur til að endursetja lykilorðið var búinn til, sem er sýndur hér fyrir neðan, en ekki tókst að senda hana til {{GENDER:$2|notandans}}: $1",
        "changeemail": "Breyting netfangs",
-       "changeemail-header": "Breyta skráðu netfangi",
        "changeemail-text": "Fylltu út þetta eyðublað til að breyta netfanginu þínu. Þú þarft að slá inn lykilorðið þitt til að staðfesta breytinguna.",
        "changeemail-no-info": "Þú verður að vera skráð(ur) inn til að hafa aðgang að þessari síðu.",
        "changeemail-oldemail": "Núverandi netfang:",
        "changeemail-none": "(ekkert)",
        "changeemail-password": "{{SITENAME}} lykilorðið þitt:",
        "changeemail-submit": "Breyta netfangi",
-       "changeemail-cancel": "Hætta við",
        "resettokens": "Endurstilla lykla",
        "resettokens-text": "Hér getur þú endurstillt lykla sem veita þér aðgang að ákveðnum persónuupplýsingum um aðganginn þinn.\n\nÞú átt að gera það ef þú ert búin(n) að deila þeim með einhverjum öðrum óviljandi eða ef búið er að brjóta inn í aðganginn þinn.",
        "resettokens-no-tokens": "Það eru engir lyklar að endurstilla.",
        "preview": "Forskoða",
        "showpreview": "Forskoða",
        "showdiff": "Sýna breytingar",
-       "anoneditwarning": "'''Viðvörun:''' Þú ert ekki innskráð(ur). Vistfang þitt skráist í breytingaskrá síðunnar.",
+       "anoneditwarning": "<strong>Viðvörun:</strong> Þú ert ekki innskráð(ur). Vistfang þitt verður sýnt opinberlega ef þú gerir einhverjar breytingar. Ef þú <strong>[$1 skráir þig inn]</strong> eða <strong>[$2 stofnar aðgang]</strong> munu breytingarnar þínar vera tengdar við notendanafn þitt, ásamt öðrum kostum.",
        "anonpreviewwarning": "Þú ert ekki innskráð(ur). Vistfang þitt skráist í breytingaskrá síðunnar.",
        "missingsummary": "'''Áminning:''' Þú hefur ekki skrifað breytingarágrip.\nEf þú smellir á Vista aftur, verður breyting þín vistuð án þess.",
        "missingcommenttext": "Gerðu svo vel og skrifaðu athugasemd fyrir neðan.",
        "searchrelated": "tengt",
        "searchall": "öllum",
        "showingresults": "Sýni <strong>$1</strong> {{PLURAL:$1|niðurstöðu|niðurstöður}} frá og með #<strong>$2</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Niðurstaða '''$1''' af '''$3'''|Niðurstöður'''$1 - $2''' af '''$3'''}} fyrir '''$4'''",
        "search-nonefound": "Engar niðurstöður pössuðu við fyrirspurnina.",
        "powersearch-legend": "Ítarlegri leit",
        "powersearch-ns": "Leita í nafnrýmum:",
        "right-deletedtext": "Sjá eyddan texta og breytingar á milli eyddra útgáfna",
        "right-browsearchive": "Leita í eyddum síðum",
        "right-undelete": "Endurvekja eydda síðu",
-       "right-suppressrevision": "Skoða og endurvekja breytingar faldar fyrir stjórnendum",
+       "right-suppressrevision": "Skoða, fela og endurvekja ákveðnar breytingar síðna frá öllum notendum",
        "right-suppressionlog": "Skoða einrænar aðgerðaskrár",
        "right-block": "Banna öðrum notendum að gera breytingar",
        "right-blockemail": "Banna notanda að senda tölvupóst",
        "recentchanges-label-bot": "Þessi breyting var gerð af vélmenni",
        "recentchanges-label-unpatrolled": "Þessi breyting hefur ekki verið yfirfarin",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjá einng [[Special:NewPages|lista yfir nýjar síður]])",
-       "rcnotefrom": "Að neðan eru breytingar síðan <strong>$2<strong> (allt að <strong>$1<strong> sýndar).",
+       "rcnotefrom": "Að neðan {{PLURAL:$5|er breyting síðan|eru breytingar síðan}} <strong>$3, $4</strong> (allt að <strong>$1</strong> sýndar).",
        "rclistfrom": "Sýna breytingar frá og með $3 $2",
        "rcshowhideminor": "$1 minniháttar breytingar",
        "rcshowhideminor-show": "Sýna",
        "license-header": "Leyfisupplýsingar:",
        "nolicense": "Ekkert valið",
        "license-nopreview": "(Forskoðun ekki fáanleg)",
-       "upload_source_url": "(gild, aðgengileg vefslóð)",
-       "upload_source_file": "(skrá á tölvunni þinni)",
+       "upload_source_url": "(þín valda skrá frá gildri, aðgengilegri vefslóð)",
+       "upload_source_file": "(þín valda skrá frá tölvunni þinni)",
        "listfiles-summary": "Þessi kerfissíða sýnir allar upphlaðnar skrár.",
        "listfiles_search_for": "Leita að miðilsnafni:",
        "imgfile": "skrá",
        "randomincategory": "Handhófsvalin síða í flokki",
        "randomincategory-invalidcategory": "„$1“ er ekki gilt flokkarheiti",
        "randomincategory-nopages": "Það eru engar síður í flokkinum [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Fá handhófsvalda síðu úr flokkinum: $1 $2.",
-       "randomincategory-selectcategory-submit": "Fara",
        "randomredirect": "Handahófsvalin tilvísun",
        "randomredirect-nopages": "Það eru engar tilvísanir í nafnrýminu „$1“.",
        "statistics": "Tölfræði",
        "querypage-disabled": "Þessi kerfisíða er óvirk til að minnka ekki afköst vefþjónsins.",
        "booksources": "Bókaleit",
        "booksources-search-legend": "Leita að bókaverslunum",
-       "booksources-go": "Áfram",
        "booksources-text": "Fyrir neðan er listi af tenglum í aðrar síður sem selja nýjar og notaðar bækur og gætu einnig haft nánari upplýsingar í sambandi við bókina sem þú varst að leita að:",
        "booksources-invalid-isbn": "ISBN gildið virðist ekki vera gilt; leitaðu eftir villum við innslátt eða afritun gildisins frá upsprettu þess.",
        "specialloguserlabel": "Gerandi:",
        "mywatchlist": "Vaktlisti",
        "watchlistfor2": "Eftir $1 $2",
        "nowatchlist": "Vaktlistinn er tómur.",
-       "watchlistanontext": "Vinsamlegast $1ðu þig til að skoða eða breyta vaktlistanum þínum.",
+       "watchlistanontext": "Vinsamlegast skráðu þig til að skoða eða breyta hlutum á vaktlistanum þínum.",
        "watchnologin": "Óinnskráð(ur)",
        "addwatch": "Bæta á vaktlistann",
        "addedwatchtext": "Síðunni „[[:$1]]“ hefur verið bætt á [[Special:Watchlist|vaktlistann]] þinn.\nFrekari breytingar á henni eða spjallsíðu hennar munu verða sýndar þar.",
        "wlheader-enotif": "Tilkynning með tölvupósti er virk.",
        "wlheader-showupdated": "Síðum sem hefur verið breytt síðan þú skoðaðir þær síðast eru '''feitletraðar'''.",
        "wlnote": "Hér fyrir neðan {{PLURAL:$1|er síðasta <strong>$1</strong> breyting|eru síðustu <strong>$1</strong> breytingar}} {{PLURAL:$2|síðustu <strong>$2</strong> klukkutímann|síðastliðna <strong>$2</strong> klukkutímana}}, frá $3, $4.",
-       "wlshowlast": "Sýna síðustu $1 klukkutíma, $2 daga, $3",
+       "wlshowlast": "Sýna síðustu $1 klukkutíma, $2 daga",
        "watchlist-options": "Vaktlistastillingar",
        "watching": "Vakta...",
        "unwatching": "Afvakta...",
        "exbeforeblank": "innihald fyrir tæmingu var: '$1'",
        "delete-confirm": "Eyða „$1“",
        "delete-legend": "Eyða",
-       "historywarning": "'''Viðvörun:''' Síðan sem þú ert um það bil að eyða hefur breytingarskrá með $1 {{PLURAL:$1|breytingu|breytingum}}:",
+       "historywarning": "<strong>Viðvörun:</strong> Síðan sem þú ert um það bil að eyða hefur breytingarskrá með $1 {{PLURAL:$1|breytingu|breytingum}}:",
        "confirmdeletetext": "Þú ert um það bil að eyða síðu ásamt breytingaskrá hennar.\nVinsamlegast staðfestu það að þú ætlir að gera svo, það að þú skiljir afleiðingarnar, og að þú sért að gera þetta í samræmi við [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Aðgerð lokið",
        "actionfailed": "Aðgerð mistókst",
        "autoblockid": "Sjálfvirkt bann $1",
        "block": "Banna notanda",
        "unblock": "Afbanna notanda",
-       "blockip": "Banna notanda",
+       "blockip": "Banna {{GENDER:$1|notanda}}",
        "blockip-legend": "Banna notanda",
        "blockiptext": "Notaðu eyðublaðið hér að neðan til þess að banna ákveðið vistfang eða notandanafn.\nÞetta ætti einungis að gera til þess að koma í veg fyrir skemmdarverk, og í samræmi við [[{{MediaWiki:Policy-url}}|samþykktir]].\nGefðu nákvæma skýringu að neðan (til dæmis, með því að vísa í þær síður sem skemmdar voru).",
        "ipaddressorusername": "Vistfang eða notandanafn:",
        "ipb-unblock-addr": "Afbanna $1",
        "ipb-unblock": "Afbanna notanda eða vistfang",
        "ipb-blocklist": "Sjá núverandi bönn",
-       "ipb-blocklist-contribs": "Framlög fyrir $1",
+       "ipb-blocklist-contribs": "Framlög fyrir {{GENDER:$1|$1}}",
        "unblockip": "Afbanna notanda",
        "unblockiptext": "Endurvekja skrifréttindi bannaðra notenda eða vistfanga.",
        "ipusubmit": "Afbanna",
        "import": "Flytja inn síður",
        "importinterwiki": "Milli-Wiki innflutningur",
        "import-interwiki-text": "Veldu Wiki-kerfi og síðutitil til að flytja inn.\nBreytingaupplýsingar s.s. dagsetningar og höfundanöfn eru geymd.\nAllir innflutningar eru skráð í [[Special:Log/import|innflutningsskránna]].",
-       "import-interwiki-source": "Uppruni wiki síðunnar:",
        "import-interwiki-history": "Afrita allar breytingar þessarar síðu",
        "import-interwiki-templates": "Innifala öll snið með",
        "import-interwiki-submit": "Flytja inn",
        "import-error-create": "Síðan \"$1\" var ekki flutt inn því þú hefur ekki réttindi til að stofna hana.",
        "import-error-interwiki": "Síðan \"$1\" var ekki flutt inn því nafn hennar er frátekið fyrir ytri tengla (tungumálatengla).",
        "import-error-special": "Síðan \"$1\" var ekki flutt inn því hún tilheyrir ákveðnu nafnrými sem leyfir ekki síður.",
-       "import-error-invalid": "Síðan \"$1\" var ekki flutt inn því nafn hennar er ógilt.",
+       "import-error-invalid": "Síðan \"$1\" var ekki flutt inn því nafnið sem hún yrði flutt á er ógilt á þessum wiki.",
        "import-error-unserialize": "Ekki unnt að afraða útgáfu $2 af síðunni „$1“. Útgáfan var sögð nota innihaldslíkan $3 raðað sem $4.",
        "import-options-wrong": "{{PLURAL:$2|Rangur möguleiki|Rangir möguleikar}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Uppgefin móðursíða hefur ógildan titil.",
        "importlogpage": "Innflutningsskrá",
        "importlogpagetext": "Hér er listi yfir innflutninga möppdýra á síðum ásamt breytingarskránni frá öðrum wiki.",
        "import-logentry-upload": "flutti inn [[$1]] frá skrá",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|breyting|breytingar}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|breyting flutt|breytingar fluttar}} inn",
        "import-logentry-interwiki": "flutti inn $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|breyting|breytingar}} frá $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|breyting flutt|breytingar fluttar}} inn frá $2",
        "javascripttest": "JavaScript prófun",
        "javascripttest-title": "Keyri $1 prófun",
        "javascripttest-pagetext-noframework": "Þessi síða er frátekin fyrir JavaScript prófanir.",
        "exif-urgency-low": "Lítið ($1)",
        "exif-urgency-high": "Hátt ($1)",
        "exif-urgency-other": "Mikilvægi ákveðið af notanda ($1)",
-       "watchlistall2": "allt",
        "namespacesall": "öll",
        "monthsall": "allir",
        "confirmemail": "Staðfesta netfang",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|breytti}} réttindum $3",
        "logentry-rights-autopromote": "$1 fékk sjálfvirkt {{GENDER:$2|aukin}} réttindi frá $4 til $5",
        "rightsnone": "(engum)",
+       "revdelete-summary": "breytingarágrip",
        "feedback-bugornote": "Ef þú ert reiðubúinn að lýsa tæknilegri villu í smáatriðum, vinsamlegast [$1 tilkynntu villu].\nEf ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemdin þín verður bætt við síðuna \"[$3 $2]\" ásamt notendanafni og nafni vafrarans sem þú ert að nota.",
        "feedback-subject": "Fyrirsögn:",
        "feedback-message": "Skilaboð:",
index 91b5254..95af635 100644 (file)
                        "לערי ריינהארט",
                        "PeppeAeco",
                        "아라",
-                       "Lucas2"
+                       "Lucas2",
+                       "Taxandru",
+                       "C.R.",
+                       "Elitre"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "tog-watchdefault": "Aggiungi le pagine e i file modificati agli osservati speciali",
        "tog-watchmoves": "Aggiungi le pagine e i file spostati agli osservati speciali",
        "tog-watchdeletion": "Aggiungi le pagine e i file cancellati agli osservati speciali",
-       "tog-watchrollback": "Aggiungi le pagine dove ho effettuato un rollback agli osservati speciali",
+       "tog-watchrollback": "Aggiungi agli osservati speciali le pagine su cui ho effettuato un rollback",
        "tog-minordefault": "Indica ogni modifica come minore (solo come predefinito)",
        "tog-previewontop": "Mostra l'anteprima sopra la casella di modifica e non sotto",
-       "tog-previewonfirst": "Mostra l'anteprima almeno una volta prima di salvare",
+       "tog-previewonfirst": "Mostra l'anteprima sulla prima modifica",
        "tog-enotifwatchlistpages": "Inviami una email quando viene modificata una pagina o un file presente tra gli osservati speciali",
        "tog-enotifusertalkpages": "Inviami una email quando viene modificata la mia pagina di discussione",
        "tog-enotifminoredits": "Inviami una email anche per le modifiche minori di pagine e file",
        "tog-enotifrevealaddr": "Mostra il mio indirizzo nelle e-mail di notifica",
        "tog-shownumberswatching": "Mostra il numero di utenti che hanno la pagina in osservazione",
        "tog-oldsig": "Firma attuale:",
-       "tog-fancysig": "Tratta la firma come wikitesto (senza collegamento automatico)",
+       "tog-fancysig": "Gestisci la firma come wikitesto (senza collegamento automatico)",
        "tog-uselivepreview": "Abilita la funzione ''Live preview'' (anteprima in diretta - sperimentale)",
        "tog-forceeditsummary": "Chiedi conferma se il campo oggetto è vuoto",
        "tog-watchlisthideown": "Nascondi le mie modifiche negli osservati speciali",
        "tog-prefershttps": "Usa sempre una connessione sicura quando si effettua l'accesso",
        "underline-always": "Sempre",
        "underline-never": "Mai",
-       "underline-default": "Mantieni le impostazioni del browser o della skin",
+       "underline-default": "Impostazioni predefinite del browser o della skin",
        "editfont-style": "Stile del carattere nella casella di modifica:",
        "editfont-default": "Predefinito del browser",
        "editfont-monospace": "Carattere a larghezza fissa",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Pagine indicizzate",
        "noindex-category": "Pagine non indicizzate",
-       "broken-file-category": "Pagine che includono file inesistenti",
+       "broken-file-category": "Pagine che richiamano file inesistenti",
        "about": "Informazioni",
        "article": "Voce",
        "newwindow": "(si apre in una nuova finestra)",
        "otherlanguages": "In altre lingue",
        "redirectedfrom": "(Reindirizzamento da '''$1''')",
        "redirectpagesub": "Pagina di reindirizzamento",
+       "redirectto": "Reindirizza a:",
        "lastmodifiedat": "Questa pagina è stata modificata per l'ultima volta il $1 alle $2.",
        "viewcount": "Questa pagina è stata letta {{PLURAL:$1|una volta|$1 volte}}.",
        "protectedpage": "Pagina protetta",
        "youhavenewmessagesmulti": "Hai nuovi messaggi su $1",
        "editsection": "modifica",
        "editold": "modifica",
-       "viewsourceold": "visualizza sorgente",
+       "viewsourceold": "visualizza wikitesto",
        "editlink": "modifica",
-       "viewsourcelink": "visualizza sorgente",
+       "viewsourcelink": "visualizza wikitesto",
        "editsectionhint": "Modifica la sezione $1",
        "toc": "Indice",
        "showtoc": "mostra",
        "hidetoc": "nascondi",
        "collapsible-collapse": "Comprimi",
        "collapsible-expand": "Espandi",
+       "confirmable-confirm": "Sei {{GENDER:$1|sicuro|sicura}}?",
        "confirmable-yes": "Sì",
        "confirmable-no": "No",
        "thisisdeleted": "Vedi o ripristina $1?",
        "perfcached": "I dati che seguono sono estratti da una copia ''cache'' del database, e potrebbero non essere aggiornati. Un massimo di {{PLURAL:$1|un risultato è disponibile|$1 risultati sono disponibili}} in cache.",
        "perfcachedts": "I dati che seguono sono estratti da una copia ''cache'' del database, il cui ultimo aggiornamento risale al $1. Un massimo di {{PLURAL:$4|un risultato è disponibile|$4 risultati è disponibile}} in cache.",
        "querypage-no-updates": "Gli aggiornamenti della pagina sono temporaneamente sospesi. I dati in essa contenuti non verranno aggiornati.",
-       "viewsource": "Visualizza sorgente",
-       "viewsource-title": "Visualizza sorgente di $1",
+       "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.",
        "protectedpagetext": "Questa pagina è stata protetta per impedirne la modifica o altre operazioni.",
        "invalidtitle-knownnamespace": "Titolo non valido con namespace \"$2\" e testo \"$3\"",
        "invalidtitle-unknownnamespace": "Titolo non valido con namespace sconosciuto \"$1\" e testo \"$2\"",
        "exception-nologin": "Accesso non effettuato",
-       "exception-nologin-text": "Si prega di [[Special:Userlogin|eseguire l'accesso]] per poter accedere a questa pagina o azione.",
+       "exception-nologin-text": "Per poter accedere a questa pagina o azione è necessario eseguire l'accesso.",
        "exception-nologin-text-manual": "Si prega di $1 per poter accedere a questa pagina o azione.",
        "virus-badscanner": "Errore di configurazione: antivirus sconosciuto: ''$1''",
        "virus-scanfailed": "scansione fallita (codice $1)",
        "createacct-benefit-body2": "{{PLURAL:$1|pagina|pagine}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contributore recente|contributori recenti}}",
        "badretype": "Le password inserite non coincidono tra loro.",
-       "userexists": "Il nome utente inserito è già utilizzato.\nScegliere un nome utente diverso.",
+       "userexists": "Il nome utente inserito è già utilizzato.\nScegli un nome utente diverso.",
        "loginerror": "Errore durante l'accesso",
        "createacct-error": "Errore durante la creazione dell'utenza",
        "createaccounterror": "Impossibile creare l'account: $1",
        "createaccount-text": "Qualcuno ha creato un accesso a {{SITENAME}} ($4) a nome di $2, associato a questo indirizzo di posta elettronica. La password per l'utente \"$2\" è impostata a \"$3\".\nÈ opportuno eseguire un accesso quanto prima e cambiare la password immediatamente.\n\nSe l'accesso è stato creato per errore, si può ignorare questo messaggio.",
        "login-throttled": "Sono stati effettuati troppi tentativi di accesso in breve tempo.\nAttendi $1 e riprova in seguito.",
        "login-abort-generic": "Il tuo login non ha avuto successo - Annullato",
+       "login-migrated-generic": "La tua utenza è stata migrata, e il tuo nome utente non esiste più su questo wiki.",
        "loginlanguagelabel": "Lingua: $1",
        "suspicious-userlogout": "La tua richiesta di disconnessione è stata negata perché sembra inviata da un browser non funzionante o un proxy di caching.",
        "createacct-another-realname-tip": "L'indicazione del proprio nome vero è opzionale; se si sceglie di inserirlo, verrà utilizzato per attribuire la paternità dei contenuti inviati.",
        "passwordreset-domain": "Dominio:",
        "passwordreset-capture": "Visualizzare il contenuto del messaggio e-mail?",
        "passwordreset-capture-help": "Se si seleziona questa casella, l'indirizzo e-mail (con la password temporanea), verrà mostrato a voi, oltre ad essere inviato all'utente.",
-       "passwordreset-email": "Indirizzo e-mail:",
+       "passwordreset-email": "Indirizzo email:",
        "passwordreset-emailtitle": "Dettagli dell'utente su {{SITENAME}}",
        "passwordreset-emailtext-ip": "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
        "passwordreset-emailtext-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-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-header": "Modifica l'indirizzo email dell'account",
        "changeemail-text": "Completa questo modulo per cambiare il tuo indirizzo email. Sarà necessario inserire la password per confermare la modifica.",
        "changeemail-no-info": "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
        "changeemail-oldemail": "Indirizzo email attuale:",
        "changeemail-none": "(nessuno)",
        "changeemail-password": "La password su {{SITENAME}}:",
        "changeemail-submit": "Modifica email",
-       "changeemail-cancel": "Annulla",
        "changeemail-throttled": "Sono stati effettuati troppi tentativi di accesso.\nAttendi $1 e riprova in seguito.",
        "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.",
        "showpreview": "Visualizza anteprima",
        "showdiff": "Mostra modifiche",
        "blankarticle": "<strong>Attenzione:</strong> la pagina che stai creando è vuota.\nCliccando nuovamente su \"{{int:savearticle}}\", la pagina sarà creata senza alcun contenuto.",
-       "anoneditwarning": "'''Attenzione:''' Accesso non effettuato. Nella cronologia della pagina verrà registrato il tuo indirizzo IP.",
+       "anoneditwarning": "<strong>Attenzione:</strong> Accesso non effettuato. Se effettuerai delle modifiche il tuo indirizzo IP sarà visibile pubblicamente. Se <strong>[$1 accedi]</strong> o <strong>[$2 crei un'utenza]</strong>, le tue modifiche saranno attribuite al tuo nome utente, insieme ad altri benefici.",
        "anonpreviewwarning": "''Non è stato eseguito il login. Salvando la pagina, il proprio indirizzo IP sarà registrato nella cronologia.''",
        "missingsummary": "'''Attenzione:''' non è stato specificato l'oggetto di questa modifica. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata con l'oggetto vuoto.",
        "missingcommenttext": "Inserire un commento qui sotto.",
        "noarticletext": "In questo momento la pagina richiesta è vuota. È possibile [[Special:Search/{{PAGENAME}}|cercare questo titolo]] nelle altre pagine del sito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercare nei registri correlati] oppure [{{fullurl:{{FULLPAGENAME}}|action=edit}} modificare la pagina ora]</span>.",
        "noarticletext-nopermission": "In questo momento la pagina richiesta è vuota. È possibile [[Special:Search/{{PAGENAME}}|cercare questo titolo]] nelle altre pagine del sito o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercare nei registri correlati]</span>, ma non hai i permessi per creare questa pagina.",
        "missing-revision": "La versione #$1 della pagina \"{{FULLPAGENAME}}\" non esiste.\n\nQuesto si verifica solitamente seguendo un collegamento a una pagina cancellata, in una cronologia non aggiornata.\nI dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro delle cancellazioni].",
-       "userpage-userdoesnotexist": "L'account \"<nowiki>$1</nowiki>\" non corrisponde a un utente registrato. Verificare che si intenda davvero creare o modificare questa pagina.",
+       "userpage-userdoesnotexist": "L'account \"$1\" non corrisponde a un utente registrato.\nVerificare che si intenda davvero creare o modificare questa pagina.",
        "userpage-userdoesnotexist-view": "L'account utente \"$1\" non è registrato.",
        "blocked-notice-logextract": "Questo utente è attualmente bloccato.\nL'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
        "clearyourcache": "'''Nota:''' dopo aver salvato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti. \n*'''Firefox / Safari''': tenere premuto il tasto delle maiuscole e fare clic su ''Ricarica'', oppure premere ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' su Mac)\n*'''Google Chrome''': premere ''Ctrl-Shift-R'' (''⌘-Shift-R'' su un Mac)\n*'''Internet Explorer''': tenere premuto il tasto ''Ctrl'' mentre si fa clic su ''Refresh'', oppure premere ''Ctrl-F5''\n*'''Opera''': svuotare completamente la cache dal menu ''Strumenti → Preferenze''",
        "yourtext": "Il tuo testo",
        "storedversion": "La versione memorizzata",
        "nonunicodebrowser": "'''Attenzione: si sta utilizzando un browser non compatibile con i caratteri Unicode. Per consentire la modifica delle pagine senza creare inconvenienti, i caratteri non ASCII vengono visualizzati nella casella di modifica sotto forma di codici esadecimali.'''",
-       "editingold": "'''ATTENZIONE: si sta modificando una versione non aggiornata della pagina. Salvandola così, tutti i cambiamenti apportati dopo questa versione saranno sovrascritti.'''",
+       "editingold": "<strong>Attenzione: si sta modificando una versione non aggiornata della pagina.</strong>\nSalvandola così, tutti i cambiamenti apportati dopo questa versione saranno sovrascritti.",
        "yourdiff": "Differenze",
        "copyrightwarning": "Per favore tieni presente che tutti i contributi a {{SITENAME}} si considerano pubblicati nei termini d'uso della licenza $2 (vedi $1 per maggiori dettagli).\nSe non desideri che i tuoi testi possano essere modificati e ridistribuiti da chiunque senza alcuna limitazione, non inviarli qui.<br />\nInviando il testo dichiari inoltre, sotto tua responsabilità, che è stato scritto da te personalmente oppure è stato copiato da una fonte di pubblico dominio o similarmente libera.\n'''Non inviare materiale protetto da copyright senza autorizzazione!'''",
        "copyrightwarning2": "Per favore tieni presente che tutti i contributi a {{SITENAME}} possono essere modificati, stravolti o cancellati da altri contributori.\nSe non vuoi che i tuoi testi possano essere alterati, allora non inserirli.<br />\nInviando il testo dichiari inoltre, sotto tua responsabilità, che è stato scritto da te personalmente oppure è stato copiato da una fonte di pubblico dominio o similarmente libera (vedi $1 per maggiori dettagli).\n'''Non inviare materiale protetto da copyright senza autorizzazione!'''",
        "permissionserrors": "Permessi non sufficienti",
        "permissionserrorstext": "Non si dispone dei permessi necessari ad eseguire l'azione richiesta, per {{PLURAL:$1|il seguente motivo|i seguenti motivi}}:",
        "permissionserrorstext-withaction": "Non si dispone dei permessi necessari per $2, per {{PLURAL:$1|il seguente motivo|i seguenti motivi}}:",
-       "recreate-moveddeleted-warn": "'''Attenzione: si sta per ricreare una pagina già cancellata in passato.'''\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à:",
+       "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.",
        "log-fulllog": "Visualizza log completo",
        "edit-hook-aborted": "La modifica è stata annullata dall'hook.\nNon è stata restituita alcuna spiegazione.",
        "defaultmessagetext": "Testo predefinito",
        "content-failed-to-parse": "Impossibile analizzare $2 per il modello $1: $3",
        "invalid-content-data": "Dati contenuti non validi",
-       "content-not-allowed-here": "Contenuto in \"$1\" non consentito nella pagine [[$2]]",
+       "content-not-allowed-here": "Contenuto in \"$1\" non consentito nella pagina [[$2]]",
        "editwarning-warning": "Lasciare questa pagina potrebbe causare la perdita di tutte le modifiche fatte.\nSe hai effettuato l'accesso, puoi disattivare questo avviso nella sezione \"{{int:prefs-editing}}\" delle tue preferenze.",
        "editpage-notsupportedcontentformat-title": "Formato contenuto non supportato",
        "editpage-notsupportedcontentformat-text": "Il formato del contenuto $1 non è supportato dal modello di contenuto $2.",
        "content-model-css": "CSS",
        "expensive-parserfunction-warning": "'''Attenzione:''' Questa pagina contiene troppe chiamate alle parser functions.\n\nDovrebbe averne meno di $2, al momento ce {{PLURAL:$1|n'è $1|ne sono $1}}.",
        "expensive-parserfunction-category": "Pagine con troppe chiamate alle funzioni parser",
-       "post-expand-template-inclusion-warning": "'''Attenzione:''' la dimensione dei template inclusi è troppo grande.\nAlcuni template non verranno inclusi.",
+       "post-expand-template-inclusion-warning": "<strong>Attenzione:</strong> la dimensione dei template inclusi è troppo grande.\nAlcuni template non verranno inclusi.",
        "post-expand-template-inclusion-category": "Pagine per le quali la dimensione dei template inclusi supera il limite consentito",
        "post-expand-template-argument-warning": "'''Attenzione:''' questa pagina contiene uno o più argomenti di template troppo grandi per essere espansi. Tali argomenti verranno omessi.",
        "post-expand-template-argument-category": "Pagine contenenti template con argomenti mancanti",
        "parser-template-recursion-depth-warning": "È stato raggiunto il limite di ricorsione nel template ($1)",
        "language-converter-depth-warning": "Limite di profondità del convertitore di lingua superato ($1)",
        "node-count-exceeded-category": "Pagine dove viene superato il numero di nodi",
-       "node-count-exceeded-category-desc": "Una categoria per pagine dove viene superato il numero di nodi.",
+       "node-count-exceeded-category-desc": "La pagina supera il numero massimo di nodi.",
        "node-count-exceeded-warning": "Questa pagina ha superato il numero di nodi",
        "expansion-depth-exceeded-category": "Pagine nelle quali è superata la profondità di espansione",
-       "expansion-depth-exceeded-category-desc": "Questa è una categoria per pagine dove viene superata la profondità di espansione.",
+       "expansion-depth-exceeded-category-desc": "La pagina supera la profondità massima di espansione.",
        "expansion-depth-exceeded-warning": "Questa pagina ha superato la profondità di espansione",
        "parser-unstrip-loop-warning": "Rilevato ciclo di Unstrip",
        "parser-unstrip-recursion-limit": "Superati i limiti di ricorsione di Unstrip ($1)",
        "rev-suppressed-text-view": "Questa versione della pagina è stata '''rimossa'''.\nGli amministratori possono ancora visualizzarla; consultare il [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log di rimozione] per ulteriori dettagli.",
        "rev-deleted-no-diff": "Non è possibile visualizzare questo confronto tra versioni perché una delle versioni è stata '''cancellata'''.\nConsultare il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.",
        "rev-suppressed-no-diff": "Non è possibile visualizzare questo confronto tra versioni perché una delle versioni è stata '''cancellata'''.",
-       "rev-deleted-unhide-diff": "Una delle versioni di questo confronto tra versioni è stata '''cancellata'''.\nConsultare il [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.\nAgli amministratori è ancora consentito [$1 visualizzare il confronto] se necessario.",
+       "rev-deleted-unhide-diff": "Una delle versioni di questo confronto tra versioni è stata <strong>cancellata</strong>.\nConsultare il [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.\nAgli amministratori è ancora consentito [$1 visualizzare il confronto] se necessario.",
        "rev-suppressed-unhide-diff": "Una delle versioni di questo confronto di versioni è stata '''rimossa'''.\nPotrebbero esserci dettagli nel [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log delle rimozioni].\nIn quanto amministratore puoi ancora [$1 visualizzare questo confronto di versioni], se vuoi procedere.",
        "rev-deleted-diff-view": "Una delle versioni di questo confronto di versioni è stata '''cancellata'''.\nIn quanto amministratore, puoi visualizzare questo confronto di versioni; potrebbero esserci dettagli nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log delle cancellazioni].",
        "rev-suppressed-diff-view": "Una delle versioni di questo confronto di versioni è stata '''rimossa'''.\nIn quanto amministratore puoi visualizzare questo confronto di versioni; potrebbero esserci dettagli nel [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log delle rimozioni].",
        "revdelete-show-file-confirm": "Si desidera visualizzare la versione cancellata del file \"<nowiki>$1</nowiki>\" del $2 alle $3?",
        "revdelete-show-file-submit": "Sì",
        "revdelete-selected-text": "{{PLURAL:$1|Versione selezionata|Versioni selezionate}} di [[:$2]]:",
-       "revdelete-selected-file": "{{PLURAL:$1|Versione selezionata|Versioni selezionate}} del file di [[:$2]]:",
-       "logdelete-selected": "{{PLURAL:$1|Evento del registro selezionato|Eventi del registro selezionati}}:",
+       "revdelete-selected-file": "{{PLURAL:$1|Versione selezionata|Versioni selezionate}} del file [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Evento del registro selezionato|Eventi del registro selezionato}}:",
        "revdelete-text-text": "Le versioni cancellate appariranno ancora nella cronologia della pagina, ma parte del loro contenuto sarà inaccessibile al pubblico.",
        "revdelete-text-file": "Le versioni di file cancellati appariranno ancora nella cronologia del file, ma parti del loro contenuto sarà inaccessibile al pubblico.",
        "logdelete-text": "Gli eventi cancellati appariranno ancora nei registri, ma parti del loro contenuto sarà inaccessibile al pubblico.",
        "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-fail": "Impossibile unire le cronologie. Verificare la pagina e i parametri temporali.",
-       "mergehistory-fail-toobig": "Impossibile eseguire l'unione della cronologia con oltre $1 {{PLURAL:$1|revisione|revisioni}} da spostare.",
+       "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.",
        "mergehistory-no-destination": "La pagina di destinazione $1 non esiste.",
        "mergehistory-invalid-source": "La pagina di origine deve avere un titolo corretto.",
        "searchall": "tutti",
        "showingresults": "Di seguito {{PLURAL:$1|viene presentato al massimo '''1''' risultato|vengono presentati al massimo '''$1''' risultati}} a partire dal numero '''$2'''.",
        "showingresultsinrange": "{{PLURAL:$1|Viene mostrato|Vengono mostrati}} sotto {{PLURAL:$1|<strong>1</strong> risultato|<strong>$1</strong> risultati}} dal <strong>$2</strong> al <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Risultato '''$1''' di '''$3'''|Risultati '''$1 - $2''' di '''$3'''}} per '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Risultato <strong>$1</strong> di <strong>$3</strong>|Risultati <strong>$1 - $2</strong> di <strong>$3</strong>}}",
        "search-nonefound": "La ricerca non ha prodotto risultati.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Cerca nei namespace:",
        "preferences": "Preferenze",
        "mypreferences": "preferenze",
        "prefs-edits": "Modifiche effettuate:",
-       "prefsnologintext2": "Si prega di $1 per impostare le preferenze dell'utente.",
+       "prefsnologintext2": "Per modificare le tue preferenze è necessario eseguire l'accesso.",
        "prefs-skin": "Aspetto grafico (skin)",
        "skin-preview": "Anteprima",
        "datedefault": "Nessuna preferenza",
        "prefs-setemail": "Imposta un indirizzo email",
        "prefs-email": "Opzioni email",
        "prefs-rendering": "Aspetto",
-       "saveprefs": "Salva le preferenze",
+       "saveprefs": "Salva",
        "restoreprefs": "Ripristina le impostazioni predefinite (in tutte le sezioni)",
        "prefs-editing": "Casella di modifica",
        "rows": "Righe:",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Differenze",
        "prefs-help-prefershttps": "Questa preferenza avrà effetto dal prossimo accesso.",
+       "prefswarning-warning": "Hai fatto modifiche alle tue preferenze che non sono state ancora salvate.\nSe esci da questa pagina senza cliccare \"$1\" le preferenze non verranno aggiornate.",
        "prefs-tabs-navigation-hint": "Suggerimento: è possibile utilizzare i tasti freccia sinistra e destra per spostarsi tra le schede nell'elenco delle schede.",
        "email-address-validity-valid": "L'indirizzo e-mail sembra valido",
        "email-address-validity-invalid": "Inserisci un indirizzo e-mail valido",
        "upload_directory_missing": "La directory di upload ($1) non esiste e non può essere creata dal server web.",
        "upload_directory_read_only": "Il server web non è in grado di scrivere nella directory di upload ($1).",
        "uploaderror": "Errore nel caricamento",
-       "upload-recreate-warning": "'Attenzione'': un file con questo nome è stato cancellato o spostato.'''\nIll log delle cancellazioni e degli spostamenti di questa pagina viene qui riportato per comodità:",
+       "upload-recreate-warning": "'Attenzione'': un file con questo nome è stato cancellato o spostato.'''\nIl log delle cancellazioni e degli spostamenti di questa pagina viene qui riportato per comodità:",
        "uploadtext": "Usare il modulo sottostante per caricare nuovi file. Per visualizzare o ricercare i file già caricati, consultare il [[Special:FileList|log dei file caricati]]. Caricamenti di file e di nuove versioni di file sono registrati nel [[Special:Log/upload|log degli upload]], le cancellazioni nell'[[Special:Log/delete|apposito]].\n\nPer inserire un file all'interno di una pagina, fare un collegamento di questo tipo:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' per usare la versione completa del file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></code>''' per usare una versione larga 200 pixel inserita in un box, allineata a sinistra e con 'testo alternativo' come didascalia\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' per generare un collegamento diretto al file senza visualizzarlo",
        "upload-permitted": "Tipi di file consentiti: $1.",
        "upload-preferred": "Tipi di file consigliati: $1.",
        "filesource": "Fonte:",
        "ignorewarning": "Ignora l'avviso e salva comunque il file",
        "ignorewarnings": "Ignora i messaggi di avvertimento del sistema",
-       "minlength1": "Il nome del file dev'essere composto da almeno un carattere.",
+       "minlength1": "Il nome del file dev'essere composto da almeno una lettera.",
        "illegalfilename": "Il nome \"$1\" contiene dei caratteri non ammessi nei titoli delle pagine. Dare al file un nome diverso e provare a caricarlo di nuovo.",
        "filename-toolong": "I nomi dei file non possono superare i 240 byte.",
        "badfilename": "Il nome del file è stato convertito in \"$1\".",
        "uploadscriptednamespace": "Questo file SVG contiene un namespace '$1' non consentito",
        "uploadinvalidxml": "Il codice XML nel file caricato non può essere elaborato.",
        "uploadvirus": "Questo file contiene un virus! Dettagli: $1",
-       "uploadjava": "Questo file è un file ZIP che contiene un file .class Java.\nCarica i file Java non è consentito, perché possono causare l'aggiramento delle restrizioni di sicurezza.",
+       "uploadjava": "Questo file è un file ZIP che contiene un file .class Java.\nCaricare i file Java non è consentito, perché possono causare l'aggiramento delle restrizioni di sicurezza.",
        "upload-source": "File di origine",
        "sourcefilename": "Nome del file di origine:",
        "sourceurl": "URL di origine:",
        "backend-fail-backup": "Impossibile eseguire il backup del file $1 .",
        "backend-fail-notexists": "Il file $1 non esiste.",
        "backend-fail-hashes": "Impossibile ottenere hash dei file per confronto.",
-       "backend-fail-notsame": "Esiste già un file non identico a  $1 .",
+       "backend-fail-notsame": "Esiste già un file non identico a \"$1\".",
        "backend-fail-invalidpath": "$1 non è un percorso di archiviazione valido.",
        "backend-fail-delete": "Impossibile cancellare il file $1.",
        "backend-fail-describe": "Impossibile modificare i metadati del file \"$1\".",
        "randomincategory": "Pagina casuale in una categoria",
        "randomincategory-invalidcategory": "\"$1\" non è un nome di categoria valido.",
        "randomincategory-nopages": "Non ci sono pagine in [[:Category:$1]].",
-       "randomincategory-selectcategory": "Ottieni una pagina casuale dalla categoria: $1 $2.",
-       "randomincategory-selectcategory-submit": "Vai",
+       "randomincategory-category": "Categoria:",
+       "randomincategory-legend": "Pagina casuale in una categoria",
        "randomredirect": "Un redirect a caso",
        "randomredirect-nopages": "Non ci sono redirect nel namespace \"$1\".",
        "statistics": "Statistiche",
        "booksources": "Fonti librarie",
        "booksources-search-legend": "Ricerca di fonti librarie",
        "booksources-isbn": "Codice ISBN:",
-       "booksources-go": "Vai",
+       "booksources-search": "Cerca",
        "booksources-text": "Di seguito sono elencati alcuni collegamenti verso siti esterni che vendono libri nuovi e usati, attraverso i quali è possibile ottenere maggiori informazioni sul testo cercato.",
        "booksources-invalid-isbn": "L'ISBN inserito sembra non essere valido; verificare che non siano stati commessi errori nel copiarlo dalla fonte originale.",
        "specialloguserlabel": "Azione effettuata da:",
        "trackingcategories-desc": "Criteri per l'inclusione nella categoria",
        "noindex-category-desc": "La pagina non è indicizzata dai robot perché contiene la parola magica <code><nowiki>__NOINDEX__</nowiki></code> e si trova in un namespace dove tale flag è consentito.",
        "index-category-desc": "La pagina contiene <code><nowiki>__INDEX__</nowiki></code> (e si trova in un namespace dove tale flag è consentito) e quindi è indicizzata dai robot, anche se normalmente non lo sarebbe.",
-       "post-expand-template-inclusion-category-desc": "Dopo aver espanso tutti i template, la dimensione della pagina sarà più grande di <code>$wgMaxArticleSize</code>, e dunque alcuni non si espanderanno.",
-       "post-expand-template-argument-category-desc": "Dopo aver espanso il parametro di un template (qualcosa tra parentesi graffe, come <code>{{{Foo}}})</code>, la pagina sarà più grande di <code>$wgMaxArticleSize</code>.",
+       "post-expand-template-inclusion-category-desc": "La dimensione della pagina sarà più grande di <code>$wgMaxArticleSize</code> dopo aver espanso tutti i template, e dunque alcuni non si espanderanno.",
+       "post-expand-template-argument-category-desc": "La pagina sarà più grande di <code>$wgMaxArticleSize</code> dopo aver espanso il parametro di un template (qualcosa tra tre parentesi graffe, come <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "La pagina usa troppe funzioni parser (come <code>#ifexist</code>). Vedi [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Categoria aggiunta se la pagina contiene un collegamento interrotto ad un file (un collegamento per incorporare un file quando questo non esiste).",
-       "hidden-category-category-desc": "Questa è una categoria che contiene <code><nowiki>__HIDDENCAT__</nowiki></code>, il quale impedisce che venga mostrata, in modo predefinito, nel riquadro dei collegamenti alle categorie delle pagine.",
+       "broken-file-category-desc": "La pagina contiene un collegamento interrotto ad un file (un collegamento per incorporare un file quando questo non esiste).",
+       "hidden-category-category-desc": "Questa categoria contiene <code><nowiki>__HIDDENCAT__</nowiki></code> nella sua pagina, il quale impedisce che venga mostrata, in modo predefinito, nel riquadro dei collegamenti alle categorie delle pagine.",
        "trackingcategories-nodesc": "Nessuna descrizione disponibile.",
        "trackingcategories-disabled": "La categoria è disabilitata",
        "mailnologin": "Nessun indirizzo cui inviare il messaggio",
        "mywatchlist": "osservati speciali",
        "watchlistfor2": "Dell'utente $1 $2",
        "nowatchlist": "La lista degli osservati speciali è vuota.",
-       "watchlistanontext": "Per visualizzare e modificare l'elenco degli osservati speciali è necessario $1.",
+       "watchlistanontext": "Per visualizzare e modificare l'elenco degli osservati speciali è necessario eseguire l'accesso.",
        "watchnologin": "Accesso non effettuato",
        "addwatch": "Aggiungi agli osservati speciali",
        "addedwatchtext": "La pagina \"[[:$1]]\" è stata aggiunta alla propria [[Special:Watchlist|lista degli osservati speciali]].\nD'ora in poi, le modifiche apportate alla pagina e alla sua discussione verranno elencate in quella sede.",
        "wlheader-enotif": "La notifica via email è attiva.",
        "wlheader-showupdated": "Le pagine che sono state modificate dopo l'ultima visita sono evidenziate in '''grassetto'''.",
        "wlnote": "Di seguito {{PLURAL:$1|è elencata la modifica più recente apportata|sono elencate le <strong>$1</strong> modifiche più recenti apportate}} {{PLURAL:$2|nella scorsa ora|nelle scorse <strong>$2</strong> ore}}; i dati sono aggiornati alle $4 del $3.",
-       "wlshowlast": "Mostra le ultime $1 ore $2 giorni $3",
+       "wlshowlast": "Mostra le ultime $1 ore $2 giorni",
        "watchlist-options": "Opzioni osservati speciali",
        "watching": "Aggiunta agli osservati speciali...",
        "unwatching": "Eliminazione dagli osservati speciali...",
        "exbeforeblank": "Il contenuto prima dello svuotamento era: '$1'",
        "delete-confirm": "Cancella \"$1\"",
        "delete-legend": "Cancella",
-       "historywarning": "'''Attenzione:''' La pagina che stai per cancellare ha una cronologia con approssimativamente $1 {{PLURAL:$1|versione|versioni}}:",
+       "historywarning": "'''Attenzione:''' La pagina che stai per cancellare ha una cronologia con $1 {{PLURAL:$1|versione|versioni}}:",
        "confirmdeletetext": "Stai per cancellare una pagina con tutta la sua cronologia. Per cortesia, conferma che è tua intenzione procedere a tale cancellazione, che hai piena consapevolezza delle conseguenze della tua azione e che essa è conforme alle linee guida stabilite in [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Azione completata",
        "actionfailed": "Azione fallita",
        "delete-edit-reasonlist": "Modifica i motivi di cancellazione",
        "delete-toobig": "La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|versione|versioni}}). La sua cancellazione è stata limitata per evitare di creare accidentalmente dei problemi di funzionamento al database di {{SITENAME}}.",
        "delete-warning-toobig": "La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|versione|versioni}}). La sua cancellazione può creare dei problemi di funzionamento al database di {{SITENAME}}; procedere con cautela.",
+       "deleteprotected": "Non puoi cancellare questa pagina perché è stata protetta.",
        "deleting-backlinks-warning": "'''Attenzione:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|altre pagine]] contengono collegamenti o inclusioni alla pagina che stai per cancellare.",
        "rollback": "Annulla le modifiche",
        "rollback_short": "Rollback",
        "protect-othertime": "Durata non in elenco:",
        "protect-othertime-op": "durata non in elenco",
        "protect-existing-expiry": "Scadenza attuale: $2, $3",
+       "protect-existing-expiry-infinity": "Scadenza attuale: infinito",
        "protect-otherreason": "Altri motivi/dettagli:",
        "protect-otherreason-op": "Altra motivazione",
        "protect-dropdown": "*Motivi comuni di protezione\n** Reiterati vandalismi\n** Reiterati inserimenti di spam\n** Edit war\n** Pagina molto usata",
        "undelete-show-file-confirm": "Si desidera visualizzare la versione cancellata del file \"<nowiki>$1</nowiki>\" del $2 alle $3?",
        "undelete-show-file-submit": "Sì",
        "namespace": "Namespace:",
-       "invert": "inverti la selezione",
-       "tooltip-invert": "Seleziona questa casella per nascondere le modifiche alle pagine all'interno del namespace selezionato (ed il relativo namespace, se selezionato)",
+       "invert": "Inverti selezione",
+       "tooltip-invert": "Seleziona questa casella per nascondere le modifiche alle pagine all'interno del namespace selezionato (ed il namespace associato, se selezionato)",
        "namespace_association": "Namespace associato",
        "tooltip-namespace_association": "Seleziona questa casella per includere anche la pagina di discussione o l'oggetto del namespace associato con il namespace selezionato",
        "blanknamespace": "(Principale)",
        "autoblockid": "Autoblocco #$1",
        "block": "Blocca utente",
        "unblock": "Sblocca utente",
-       "blockip": "Blocco utente",
+       "blockip": "Blocca {{GENDER:$1|utente}}",
        "blockip-legend": "Blocca l'utente",
        "blockiptext": "Usare il modulo sottostante per bloccare l'accesso in scrittura a uno specifico indirizzo IP o a un utente registrato.\nIl blocco dev'essere operato per prevenire atti di vandalismo e in stretta osservanza delle [[{{MediaWiki:Policy-url}}|regole di {{SITENAME}}]].\nIndicare il motivo specifico per il quale si procede al blocco (per esempio, citando i titoli di eventuali pagine oggetto di vandalismo).",
        "ipaddressorusername": "Indirizzo IP o nome utente:",
        "ipb-unblock-addr": "Sblocca $1",
        "ipb-unblock": "Sblocca un utente o un indirizzo IP",
        "ipb-blocklist": "Elenca i blocchi attivi",
-       "ipb-blocklist-contribs": "Contributi di $1",
+       "ipb-blocklist-contribs": "Contributi di {{GENDER:$1|$1}}",
        "unblockip": "Sblocca l'utente",
        "unblockiptext": "Usare il modulo sottostante per restituire l'accesso in scrittura ad un utente o indirizzo IP bloccato.",
        "ipusubmit": "Rimuovi questo blocco",
        "unblocked": "L'utente [[User:$1|$1]] è stato sbloccato",
        "unblocked-range": "$1 è stato sbloccato",
        "unblocked-id": "Il blocco $1 è stato rimosso",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] è stato sbloccato.",
        "blocklist": "Utenti bloccati",
        "ipblocklist": "Utenti bloccati",
        "ipblocklist-legend": "Cerca un utente bloccato",
        "import": "Importa pagine",
        "importinterwiki": "Importazione transwiki",
        "import-interwiki-text": "Selezionare un progetto wiki e il titolo della pagina da importare.\nLe date di pubblicazione e i nomi degli autori delle varie versioni saranno conservati.\nTutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log/import|log di importazione]].",
-       "import-interwiki-source": "Sorgente wiki/pagina:",
+       "import-interwiki-sourcewiki": "Wiki di origine:",
+       "import-interwiki-sourcepage": "Pagina di origine:",
        "import-interwiki-history": "Copia l'intera cronologia di questa pagina",
        "import-interwiki-templates": "Includi tutti i template",
        "import-interwiki-submit": "Importa",
        "exif-urgency-low": "Bassa ($1)",
        "exif-urgency-high": "Alta ($1)",
        "exif-urgency-other": "Priorità definite dal'utente ($1)",
-       "watchlistall2": "tutte",
        "namespacesall": "tutti",
        "monthsall": "tutti",
        "confirmemail": "Conferma indirizzo email",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ha caricato}} una nuova versione di $3.",
        "logentry-upload-revert": "$1 {{GENDER:$2|ha caricato}} $3",
        "rightsnone": "(nessuno)",
+       "revdelete-summary": "oggetto della modifica",
        "feedback-bugornote": "Se si è in grado di descrivere il problema tecnico riscontrato in maniera precisa, [$1 segnalate il bug]. In alternativa, si può usare il modulo semplificato sottostante. Il commento inserito sarà aggiunto alla pagina \"[$3 $2]\", insieme al proprio nome utente e al browser in uso.",
        "feedback-subject": "Oggetto:",
        "feedback-message": "Messaggio:",
        "action-pagelang": "modificare la lingua della pagina",
        "log-name-pagelang": "Modifiche lingua",
        "log-description-pagelang": "Questo è un registro delle modifiche alla lingua delle pagine.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha modificato}} la lingua della pagina $3 da $4 a $5."
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha modificato}} la lingua della pagina $3 da $4 a $5.",
+       "default-skin-not-found": "Oops! La skin predefinita per il tuo wiki, definita in <code dir=\"ltr\">$wgDefaultSkin</code> come <code>$1</code>, non è disponibile.\n\nLa tua installazione sembra includere le seguenti skin. Vedi [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione skin] per informazioni su come abilitarle e scegliere quella predefinita.\n\n$2\n\n; Se hai appena installato MediaWiki:\n: Probabilmente lo hai installato da git, o direttamente dal codice sorgente usando qualche altro metodo. Ciò era previsto. Prova ad installare alcune skin dalla [https://www.mediawiki.org/wiki/Category:All_skins directory su mediawiki.org], tramite:\n:* Scaricando il [https://www.mediawiki.org/wiki/Download programma di installazione tarball], che viene fornito con diverse skin ed estensioni. Puoi fare copia ed incolla della directory <code dir=\"ltr\">skins/</code> da lì.\n:* Clonando uno dei repository <code>mediawiki/skins/*</code> tramite git nella directory <code>skins/</code> della tua installazione MediaWiki.\n: In questo modo non dovrebbe interferire con il tuo repository git se sei uno sviluppatore MediaWiki.\n\n; Se hai appena aggiornato MediaWiki:\n: MediaWiki 1.24 e versioni successive non abilità più automaticamente le skin installate (vedi [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automatico skin]). Puoi copiare le seguenti linee nel <code>LocalSettings.php</code> per abilitare tutte le skin attualmente installate:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se hai appena modificato <code>LocalSettings.php</code>:\n: Ricontrolla i nomi delle skin per errori di battitura.",
+       "default-skin-not-found-no-skins": "Oops! La skin predefinita per il tuo wiki, definita in <code>$wgDefaultSkin</code> come <code>$1</code>, non è disponibile.\n\nNon hai skin installate.\n\n; Se hai appena installato o aggiornato MediaWiki:\n: Probabilmente lo hai installato da git, o direttamente dal codice sorgente usando qualche altro metodo. Ciò era previsto. MediaWiki 1.24 e versioni successive non include alcuna skin nel repository principale. Prova ad installare alcune skin dalla [https://www.mediawiki.org/wiki/Category:All_skins directory su mediawiki.org], tramite:\n:* Scaricando il [https://www.mediawiki.org/wiki/Download programma di installazione tarball], che viene fornito con diverse skin ed estensioni. Puoi fare copia ed incolla della directory <code>skins/</code> da lì.\n:* Clonando uno dei repository <code>mediawiki/skins/*</code> tramite git nella directory <code dir=\"ltr\">skins/</code> della tua installazione MediaWiki.\n: In questo modo non dovrebbe interferire con il tuo repository git se sei uno sviluppatore MediaWiki. Vedi [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione skin] per informazioni su come abilitarle e scegliere quella predefinita.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (abilitata)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disabilitata''')",
+       "mediastatistics": "Statistiche relative ai file multimediali",
+       "mediastatistics-summary": "Statistiche sui tipi di file caricati. Sono incluse solo la versione più recente di un file. Versioni vecchie o cancellate dei file sono escluse.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Tipo MIME",
+       "mediastatistics-table-extensions": "Possibili estensioni",
+       "mediastatistics-table-count": "Numero di file",
+       "mediastatistics-table-totalbytes": "Dimensione combinata",
+       "mediastatistics-header-unknown": "Sconosciuto",
+       "mediastatistics-header-bitmap": "Immagini bitmap",
+       "mediastatistics-header-drawing": "Disegni (immagini vettoriali)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-multimedia": "Contenuti multimediali",
+       "mediastatistics-header-office": "Ufficio",
+       "mediastatistics-header-text": "Testuali",
+       "mediastatistics-header-executable": "File eseguibili",
+       "mediastatistics-header-archive": "Formati compressi",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|virgola finale è stata rimossa|virgole finali sono state rimosse}} dal JSON",
+       "json-error-unknown": "Si è verificato un problema con il JSON. Errore: $1",
+       "json-error-depth": "La profondità massima dello stack è stata superata",
+       "json-error-state-mismatch": "JSON non valido o malformato",
+       "json-error-ctrl-char": "Errore nel carattere di controllo, possibile codifica errata",
+       "json-error-syntax": "Errore di sintassi",
+       "json-error-utf8": "Caratteri UTF-8 non validi, possibile codifica errata",
+       "json-error-recursion": "Uno o più riferimenti ricorsivi nel valore da codificare",
+       "json-error-inf-or-nan": "Uno o più valori NAN o INF nel valore da codificare",
+       "json-error-unsupported-type": "È stato fornito un valore di un tipo che non può essere codificato"
 }
index f3e00c8..9a348f3 100644 (file)
        "otherlanguages": "他言語版",
        "redirectedfrom": "($1から転送)",
        "redirectpagesub": "転送ページ",
+       "redirectto": "転送先:",
        "lastmodifiedat": "このページの最終更新日時は $1 $2 です。",
        "viewcount": "このページは {{PLURAL:$1|$1 回}}アクセスされました。",
        "protectedpage": "保護されたページ",
        "hidetoc": "非表示",
        "collapsible-collapse": "折り畳む",
        "collapsible-expand": "展開する",
-       "confirmable-confirm": "本当にいいですか?",
+       "confirmable-confirm": "{{GENDER:$1|}}本当によろしいですか?",
        "confirmable-yes": "はい",
        "confirmable-no": "いいえ",
        "thisisdeleted": "$1を閲覧または復元しますか?",
        "createacct-benefit-body2": "{{PLURAL:$1|ページ}}",
        "createacct-benefit-body3": "最近の{{PLURAL:$1|投稿者数}}",
        "badretype": "入力したパスワードが一致しません。",
-       "userexists": "å\85¥å\8a\9bã\81\95ã\82\8cã\81\9få\88©ç\94¨è\80\85å\90\8dã\81¯æ\97¢ã\81«ä½¿ç\94¨ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82\nä»\96ã\81®å\90\8då\89\8dã\82\92é\81¸ã\82\93ã\81§ください。",
+       "userexists": "å\85¥å\8a\9bã\81\97ã\81\9få\88©ç\94¨è\80\85å\90\8dã\81¯æ\97¢ã\81«ä½¿ç\94¨ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82\nå\88¥ã\81®å\88©ç\94¨è\80\85å\90\8dã\82\92æ\8c\87å®\9aã\81\97ã\81¦ください。",
        "loginerror": "ログインのエラー",
        "createacct-error": "アカウント作成エラー",
        "createaccounterror": "アカウントを作成できませんでした: $1",
        "createaccount-text": "誰か (おそらくあなた) が、{{SITENAME}} ($4) にあなたのメールアドレスのアカウントを作成しました。\nアカウント名「$2」、パスワード「$3」です。\n今すぐログインしてパスワードを変更してください。\n\nこのアカウントが何かの手違いで作成された場合は、このメッセージを無視してください。",
        "login-throttled": "ログインの失敗が制限回数を超えました。\n$1待ってから再度試してください。",
        "login-abort-generic": "ログインに失敗しました - 中止",
+       "login-migrated-generic": "あなたのアカウントは移行が完了しており、その利用者名はこのウィキにはもう存在しません。",
        "loginlanguagelabel": "言語: $1",
        "suspicious-userlogout": "壊れたブラウザーまたはキャッシュプロキシによって送信された可能性があるため、ログアウト要求は拒否されました。",
        "createacct-another-realname-tip": "本名は省略できます。\n入力すると、その利用者の著作物の帰属表示に使われます。",
        "passwordreset-emailsent-capture": "下記の内容の、パスワード再設定メールをお送りしました。",
        "passwordreset-emailerror-capture": "以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1",
        "changeemail": "メールアドレスの変更",
-       "changeemail-header": "アカウントのメールアドレスの変更",
        "changeemail-text": "このフォームではメールアドレスを変更できます。この変更を確認するためにパスワードを入力する必要があります。",
        "changeemail-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
        "changeemail-oldemail": "現在のメールアドレス:",
        "changeemail-none": "(なし)",
        "changeemail-password": "{{SITENAME}}のパスワード:",
        "changeemail-submit": "メールアドレスを変更",
-       "changeemail-cancel": "中止",
        "changeemail-throttled": "ログインの試行回数が多すぎます。\n$1待ってから再度試してください。",
        "resettokens": "トークンの再設定",
        "resettokens-text": "ここでは、アカウントに関連付けられた特定の非公開データにアクセスするためのトークンを再設定できます。\n\nトークンを誤って他人に教えてしまった場合やあなたのアカウントが侵害された場合は、必ず再設定してください。",
        "showpreview": "プレビューを表示",
        "showdiff": "差分を表示",
        "blankarticle": "<strong>警告:</strong>作成しようとしているページの内容がありません。{{Int:savearticle}}\"をもう一度クリックすると、中身の無いページが作成されます。",
-       "anoneditwarning": "<strong>警告:</strong> ログインしていません。\n編集すると、IPアドレスがこのページの編集履歴に記録されます。",
+       "anoneditwarning": "<strong>警告:</strong> ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。<strong>[$1 ログイン]</strong>または<strong>[$2 アカウントを作成]</strong>すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。",
        "anonpreviewwarning": "<em>ログインしていません。投稿を保存すると、ご使用中のIPアドレスがこのページの履歴に記録されます。</em>",
        "missingsummary": "<strong>注意:</strong> 編集内容の要約が空欄です。\n「{{int:savearticle}}」をもう一度クリックすると、編集内容は要約なしで保存されます。",
        "missingcommenttext": "以下にコメントを入力してください。",
        "searchall": "すべて",
        "showingresults": "<strong>$2</strong> 件目以降の最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。",
        "showingresultsinrange": "<strong>$2</strong> 件目から<strong>$3</strong> 件目までの範囲内で最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。",
-       "showingresultsheader": "「<strong>$4</strong>」の検索結果 {{PLURAL:$5|<strong>$3</strong> 件中の <strong>$1</strong> 件目|<strong>$3</strong> 件中の <strong>$1</strong> 件目から <strong>$2</strong> 件目}}",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> 件中の <strong>$1</strong> 件目|<strong>$3</strong> 件中の <strong>$1</strong> 件目から <strong>$2</strong> 件目}}",
        "search-nonefound": "問い合わせに合致する検索結果はありませんでした。",
        "powersearch-legend": "高度な検索",
        "powersearch-ns": "名前空間を指定して検索:",
        "prefs-watchlist": "ウォッチリスト",
        "prefs-watchlist-days": "ウォッチリストの表示日数:",
        "prefs-watchlist-days-max": "最大 $1 {{PLURAL:$1|日間}}",
-       "prefs-watchlist-edits": "拡張ウォッチリストの表示件数:",
+       "prefs-watchlist-edits": "ウォッチリストの展開時の最大表示件数:",
        "prefs-watchlist-edits-max": "最大数: 1000",
        "prefs-watchlist-token": "ウォッチリストのトークン:",
        "prefs-misc": "その他",
        "prefs-tokenwatchlist": "トークン",
        "prefs-diffs": "差分",
        "prefs-help-prefershttps": "この設定は、次回ログインの際に反映されます。",
+       "prefswarning-warning": "個人設定にまだ保存されていない変更があります。\n「$1」をクリックせずに離れた場合、個人設定は更新されません。",
        "prefs-tabs-navigation-hint": "ヒント: ← キーと → キーで、タブ一覧内のタブ間を移動できます。",
        "email-address-validity-valid": "メールアドレスは有効のようです",
        "email-address-validity-invalid": "有効なメールアドレスを入力してください",
        "randomincategory": "カテゴリ内でおまかせ表示",
        "randomincategory-invalidcategory": "「$1」は有効なカテゴリ名ではありません。",
        "randomincategory-nopages": "カテゴリ [[:Category:$1|$1]] にはページがありません。",
-       "randomincategory-selectcategory": "以下のカテゴリでおまかせ表示: $1 $2",
-       "randomincategory-selectcategory-submit": "表示",
+       "randomincategory-category": "カテゴリ:",
+       "randomincategory-legend": "カテゴリ内でおまかせ表示",
        "randomredirect": "おまかせリダイレクト",
        "randomredirect-nopages": "「$1」名前空間に転送ページはありません。",
        "statistics": "統計",
        "booksources": "書籍情報源",
        "booksources-search-legend": "書籍情報源を検索",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "検索",
+       "booksources-search": "検索",
        "booksources-text": "お探しの書籍の新品/中古品を販売している外部サイトへのリンクを以下に列挙します。この書籍についてさらに詳しい情報があるかもしれません:",
        "booksources-invalid-isbn": "指定した ISBN は有効ではないようです。情報源から写し間違えていないか確認してください。",
        "specialloguserlabel": "実行者:",
        "wlheader-enotif": "メール通知が有効になっています。",
        "wlheader-showupdated": "最終訪問以降に変更されたページは、<strong>太字</strong>で表示されます。",
        "wlnote": "$3 $4 までの{{PLURAL:$2|<strong>$2</strong>時間}}になされた{{PLURAL:$1|<strong>$1</strong>件の変更}}は以下の通りです。",
-       "wlshowlast": "表示する期間: $1時間、$2日間、$3",
+       "wlshowlast": "表示する期間: $1時間、$2日間",
        "watchlist-options": "ウォッチリストのオプション",
        "watching": "ウォッチリストに追加中...",
        "unwatching": "ウォッチリストから除去中...",
        "exbeforeblank": "白紙化前の内容:「$1」",
        "delete-confirm": "「$1」の削除",
        "delete-legend": "削除",
-       "historywarning": "<strong>警告:</strong> 削除しようとしているページには、$1版の履歴があります:",
+       "historywarning": "<strong>警告:</strong> 削除しようとしているページには、$1版の履歴があります:",
        "confirmdeletetext": "ページをすべての履歴とともに削除しようとしています。\n本当にこの操作を行いたいか、操作の結果を理解しているか、およびこの操作が[[{{MediaWiki:Policy-url}}|方針]]に従っているかどうか、確認してください。",
        "actioncomplete": "操作を完了しました",
        "actionfailed": "操作に失敗しました",
        "delete-edit-reasonlist": "削除理由を編集",
        "delete-toobig": "このページには、$1版を超える編集履歴があります。\nこのようなページの削除は、{{SITENAME}}の偶発的な問題を避けるため、制限されています。",
        "delete-warning-toobig": "このページには、 $1版を超える編集履歴があります。\n削除すると、{{SITENAME}}のデータベース処理に大きな負荷がかかります。\n十分に注意してください。",
-       "delete-cantedit": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\99ã\82\8b権é\99\90ã\81\8cã\81ªã\81\84ã\81\9fã\82\81ã\80\81å\89\8aé\99¤ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
+       "deleteprotected": "ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81å\89\8aé\99¤ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
        "deleting-backlinks-warning": "'''警告:''' 削除しようとしているページは、[[Special:WhatLinksHere/{{FULLPAGENAME}}|他のページ]]からリンクまたは参照読み込みされています。",
        "rollback": "編集を巻き戻し",
        "rollback_short": "巻き戻し",
        "protect-othertime": "その他の期間:",
        "protect-othertime-op": "その他の期間",
        "protect-existing-expiry": "現在の保護期限: $2 $3",
+       "protect-existing-expiry-infinity": "既存の有効期限: 無期限",
        "protect-otherreason": "他の、または追加の理由:",
        "protect-otherreason-op": "その他の理由",
        "protect-dropdown": "*よくある保護理由\n** 度重なる荒らし\n** 度重なるスパム投稿\n** 非生産的な編集合戦\n** 高負荷ページ",
        "unblocked": "[[User:$1|$1]]のブロックを解除しました。",
        "unblocked-range": "$1のブロックを解除しました。",
        "unblocked-id": "ブロック$1を除去しました。",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]]はブロックされています。",
        "blocklist": "ブロックされている利用者",
        "ipblocklist": "ブロックされている利用者",
        "ipblocklist-legend": "ブロックされている利用者の検索",
        "import": "ページデータの取り込み",
        "importinterwiki": "ウィキ間移動の取り込み",
        "import-interwiki-text": "取り込むウィキとページ名を選択してください。\n版の日付と編集者名は保持されます。\nウィキ間移動のすべての取り込み操作は[[Special:Log/import|取り込み記録]]に記録されます。",
-       "import-interwiki-source": "取り込み元のウィキ/ページ:",
+       "import-interwiki-sourcewiki": "取り込み元のウィキ:",
+       "import-interwiki-sourcepage": "取り込み元のページ:",
        "import-interwiki-history": "このページのすべての版を複製する",
        "import-interwiki-templates": "すべてのテンプレートを含める",
        "import-interwiki-submit": "取り込み",
        "exif-urgency-low": "低 ($1)",
        "exif-urgency-high": "高 ($1)",
        "exif-urgency-other": "利用者定義の優先度 ($1)",
-       "watchlistall2": "すべて",
        "namespacesall": "すべて",
        "monthsall": "すべて",
        "confirmemail": "メールアドレスの確認",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|トーク]])",
        "unknown_extension_tag": "不明な拡張機能タグ「$1」です",
        "duplicate-defaultsort": "<strong>警告:</strong> 既定のソートキー「$2」が、その前に書かれている既定のソートキー「$1」を上書きしています。",
-       "duplicate-displaytitle": "<strong>警告:</strong> 既定のDISPLAYTITLE「$2」が、その前に書かれている既定のDISPLAYTITLE「$1」を上書きしています。",
+       "duplicate-displaytitle": "<strong>警告:</strong> DISPLAYTITLE「$2」が、その前に書かれているDISPLAYTITLE「$1」を上書きしています。",
        "version": "バージョン情報",
        "version-extensions": "インストール済み拡張機能",
        "version-skins": "インストール済み外装",
        "logentry-upload-overwrite": "$1 が $3 の新しいバージョンを {{GENDER:$2|アップロードしました}}",
        "logentry-upload-revert": "$1 が $3 を {{GENDER:$2|アップロードしました}}",
        "rightsnone": "(なし)",
+       "revdelete-summary": "編集内容の要約",
        "feedback-bugornote": "技術的な問題の詳細を説明する準備ができている場合は、[$1 バグ報告]をお願いします。\n準備ができていない場合は、下の簡易フォームを使用してください。あなたのコメントと利用者名が、ページ「[$3 $2]」に追加されます。",
        "feedback-subject": "件名:",
        "feedback-message": "メッセージ:",
        "log-name-pagelang": "言語変更記録",
        "log-description-pagelang": "これはページ言語の変更の記録です。",
        "logentry-pagelang-pagelang": "$1 がページ $3 の言語を $4 から $5 に{{GENDER:$2|変更しました}}",
-       "default-skin-not-found": "おっと! あなたのウィキのデフォルト外装「<code>$1</code>」 (<code>$wgDefaultSkin</code>)は利用できません。\n\nあなたのインストールには以下の外装が含まれています。外装の有効化とデフォルトの選択については、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル: 外装設定] をご覧ください。\n\n$2\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。\n:* [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これにはいくつかの外装と拡張機能が含まれています。 <code>skins/</code> ディレクトリからコピー&ペーストできます。\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitレポジトリに干渉することはありません。\n\n; MediaWiki をアップグレードした場合:\n: MediaWiki 1.24 以降のバージョンでは、インストール済みの外装は自動的には有効になりません。 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery マニュアル: 外装の自動探索] をご覧ください。)。<code>LocalSettings.php</code> に以下の行をペーストして、現在インストールされている外装を有効にできます。\n\n<pre>$3</pre>\n\n; <code>LocalSettings.php</code>を編集したばかりの場合:\n: 外装名に打ち間違いがないか再度確認して下さい。",
-       "default-skin-not-found-no-skins": "おっと! あなたのWikiのデフォルト外装「<code>$1</code>」 (<code>$wgDefaultSkin</code>)は利用できません。\n\n外装をインストールしていません。\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。\n:* [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これには外装と拡張機能がいくつか含まれています。 <code>skins/</code> ディレクトリからコピー&ペーストできます。\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitレポジトリに干渉することはありません。外装の有効化とデフォルトの選択についての情報は、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル: 外装設定] をご覧ください。",
+       "default-skin-not-found": "おっと! あなたのウィキの既定の外装「<code>$1</code>」 (<code>$wgDefaultSkin</code>)は利用できません。\n\nあなたのインストールには以下の外装が含まれています。外装の有効化と既定の選択については、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル: 外装設定] をご覧ください。\n\n$2\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。\n:* [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これにはいくつかの外装と拡張機能が含まれています。 <code>skins/</code> ディレクトリからコピー&ペーストできます。\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。\n\n; MediaWiki をアップグレードした場合:\n: MediaWiki 1.24 以降のバージョンでは、インストール済みの外装は自動的には有効になりません。 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery マニュアル:外装の自動探索] をご覧ください)。<code>LocalSettings.php</code> に以下の行をペーストして、現在インストールされている外装を有効にできます。\n\n<pre>$3</pre>\n\n; <code>LocalSettings.php</code>を編集したばかりの場合:\n: 外装名に打ち間違いがないか再度確認してください。",
+       "default-skin-not-found-no-skins": "おっと! あなたのウィキの既定の外装「<code>$1</code>」 (<code>$wgDefaultSkin</code>)は利用できません。\n\n外装をインストールしていません。\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。\n:* [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これには外装と拡張機能がいくつか含まれています。 <code>skins/</code> ディレクトリからコピー&ペーストできます。\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。外装の有効化と既定の選択についての情報は、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル:外装設定] をご覧ください。",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (有効)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''無効''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''無効''')",
+       "mediastatistics": "メディア統計",
+       "mediastatistics-summary": "アップロードされたファイルの種類に関する統計です。これはファイルの最新バージョンのみを含みます。以前のまたは削除されたバージョンについては除外されています。",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 バイト}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIMEタイプ",
+       "mediastatistics-table-extensions": "取りうる拡張子",
+       "mediastatistics-table-count": "ファイル数",
+       "mediastatistics-table-totalbytes": "合計サイズ",
+       "mediastatistics-header-unknown": "不明",
+       "mediastatistics-header-bitmap": "ビットマップ画像",
+       "mediastatistics-header-drawing": "線画 (ベクターイメージ)",
+       "mediastatistics-header-audio": "オーディオ",
+       "mediastatistics-header-video": "動画",
+       "mediastatistics-header-multimedia": "リッチメディア",
+       "mediastatistics-header-office": "オフィス",
+       "mediastatistics-header-text": "テキスト",
+       "mediastatistics-header-executable": "実行ファイル",
+       "mediastatistics-header-archive": "圧縮フォーマット",
+       "json-warn-trailing-comma": "JSON の末尾の{{PLURAL:$1|カンマ $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": "エンコードされる値に1つ以上の循環参照が含まれます",
+       "json-error-inf-or-nan": "エンコードされる値に1つ以上の NAN または INF が含まれます",
+       "json-error-unsupported-type": "エンコードできない種類の値が入力されました"
 }
index 81bc7a8..d9fa6f7 100644 (file)
        "pager-older-n": "{{PLURAL:$1|uola 1|uola $1}}",
        "booksources": "Buk suos",
        "booksources-search-legend": "Saach fi buk suos",
-       "booksources-go": "Gwaan",
        "log": "Lagdem",
        "allpages": "Aal piej",
        "prevpage": "Priivos piej ($1)",
        "watchthispage": "Wach dis piej",
        "unwatch": "Anwach",
        "watchlist-details": "{{PLURAL:$1|$1 piej|$1 piej}} pahn yu wachlis, naa kount taak piej.",
-       "wlshowlast": "Shuo laas $1 howa $2 die $3",
+       "wlshowlast": "Shuo laas $1 howa $2 die",
        "watchlist-options": "Wachlis apshan",
        "watching": "De wach ...",
        "unwatching": "De anwach ...",
        "metadata-expand": "Shuo extendid ditiel",
        "metadata-collapse": "Aid extendid ditiel",
        "metadata-fields": "EXIF metadieta fiil wa lis ina dis mechiz wi inkluud pahn imij piej displie wen di metadieta tiebl get kalaps.\nAda wandem wi aid bai difaalt.\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",
-       "watchlistall2": "aal",
        "namespacesall": "aal",
        "monthsall": "aal",
        "watchlisttools-view": "Vyuu rilivant chienjdem",
index 0f1efd1..d0067ab 100644 (file)
        "passwordreset-emailsent-capture": "Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim, bisa didelok ngisor iki.",
        "passwordreset-emailerror-capture": "Layang èlèktronik pangèling tembung sandhi wis digawe, yaiku sing ditampilaké nèng ngisor iki, nanging ora kasil dikirim ing {{GENDER:$2|panganggo}}: $1",
        "changeemail": "Ganti alamat layang èlèktronik",
-       "changeemail-header": "Ganti alamat layang èlèktronik akun",
        "changeemail-text": "Rampungaké pormulir iki kanggo ngganti alamat layang èlèktronik Sampéyan. Sampéyan bakal butuh nglebokaké tembung sandhi Sampéyan kanggo pepesthèn owahan kuwi.",
        "changeemail-no-info": "Sampéyan kudu mlebu log kanggo ngaksès kaca iki langsung.",
        "changeemail-oldemail": "Alamat layang èlèktronik saiki:",
        "changeemail-none": "(ora ana)",
        "changeemail-password": "Sandi {{SITENAME}} panjenengan:",
        "changeemail-submit": "Ganti layang èlèktronik",
-       "changeemail-cancel": "Batal",
        "resettokens": "Reset token",
        "resettokens-text": "Anda dapat me-reset Token yang memungkinkan akses ke data pribadi tertentu yang terkait dengan akun Anda di sini.\n\nAnda harus melakukannya jika Anda secara tidak sengaja berbagi dengan seseorang atau jika akun Anda telah disusupi.",
        "resettokens-no-tokens": "Ora ana token sing bisa direset.",
        "searchrelated": "kagandhèng",
        "searchall": "kabèh",
        "showingresults": "Ing ngisor iki dituduhaké {{PLURAL:$1|'''1''' kasil|'''$1''' kasil}}, wiwitané saking #<strong>$2</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Asil '''$1''' saka '''$3'''|Asil '''$1 - $2''' saka '''$3'''}} kanggo '''$4'''",
        "search-nonefound": "Ora ana kasil sing cocog karo pitakonan (''query'').",
        "powersearch-legend": "Panggolèkan sabanjuré (''advance search'')",
        "powersearch-ns": "Panggolèkan ing ruang jeneng:",
        "randomincategory": "Sembarang kaca ing kategori",
        "randomincategory-invalidcategory": "\"$1\" dudu jeneng kategori sing apik.",
        "randomincategory-nopages": "Ora ana kaca ing kategori [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Dheleng kaca sembarang saking kategori: $1 $2.",
-       "randomincategory-selectcategory-submit": "Golèk",
        "randomredirect": "Pangalihan sembarang",
        "randomredirect-nopages": "Ora ana pangalihan ing bilik jeneng \"$1\".",
        "statistics": "Statistik",
        "querypage-disabled": "Kaca kusus iki dipatèni kanggo alesan kinerja.",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Golèk ing sumber buku",
-       "booksources-go": "Golèk",
        "booksources-text": "Ing ngisor iki kapacak daftar pranala menyang situs liyané sing ngadol buku anyar lan bekas, lan mbok-menawa uga ndarbèni informasi sabanjuré ngenani buku-buku sing lagi panjenengan golèki:",
        "booksources-invalid-isbn": "ISBN sing diwènèhaké katonané ora valid; priksa kasalahan penyalinan saka sumber asli.",
        "specialloguserlabel": "Panampil:",
        "wlheader-enotif": "Notifikasi layang elektronik diaktifaké.",
        "wlheader-showupdated": "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
        "wlnote": "Ngisor iki {{PLURAL:$1|owahan pungkasan|'''$1''' owahan pungkasan}} {{PLURAL:$2|jam|'''$2''' jam}} kapungkur, per $3, $4.",
-       "wlshowlast": "Tuduhna $1 jam $2 dina $3 pungkasan",
+       "wlshowlast": "Tuduhna $1 jam $2 dina  pungkasan",
        "watchlist-options": "Opsi daftar pangawasan",
        "watching": "Ngawasi...",
        "unwatching": "Ngilangi pangawasan...",
        "import": "Impor kaca",
        "importinterwiki": "Impor transwiki",
        "import-interwiki-text": "Pilih sawijining wiki lan irah-irahan kaca sing arep diimpor.\nTanggal révisi lan jeneng panyunting bakal dilestarèkaké.\nKabèh aktivitas impor transwiki bakal dilog ing [[Special:Log/import|log impor]].",
-       "import-interwiki-source": "Kaca/sumber wiki:",
        "import-interwiki-history": "Tuladen kabèh vèrsi lawas saka kaca iki",
        "import-interwiki-templates": "Katutna kabèh cithakan",
        "import-interwiki-submit": "Impor",
        "exif-urgency-low": "Cendhèk ($1)",
        "exif-urgency-high": "Dhuwur ($1)",
        "exif-urgency-other": "Prioritas sing ditetepaké panganggo ($1)",
-       "watchlistall2": "kabèh",
        "namespacesall": "kabèh",
        "monthsall": "kabèh",
        "confirmemail": "Konfirmasi alamat e-mail",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ngganti}} kanggotaan grup kanggo $3",
        "logentry-rights-autopromote": "$1 otomatis {{GENDER:$2|dipromosikne}} saka $4 nèng $5",
        "rightsnone": "(ora ana)",
+       "revdelete-summary": "ringkesan suntingan",
        "feedback-bugornote": "Yèn Sampéyan siap njelasaké masalah tèhnis kanthi rinci mangga [$1 laporaké bug].\nUtawa, Sampéyan bisa nganggo pormulir gampang ngisor. Tanggepan Sampéyan bakal ditambahaké nèng kaca \"[$3 $2]\", bebarengan karo jeneng panganggo Sampéyan lan pramban sing Sampéyan anggo.",
        "feedback-subject": "Jejer:",
        "feedback-message": "Layang:",
index f740776..00a2b11 100644 (file)
        "hidetoc": "დამალვა",
        "collapsible-collapse": "ჩაკეცვა",
        "collapsible-expand": "გაშლა",
+       "confirmable-confirm": "{{GENDER:$1|დარწმუნებული}} ხართ?",
+       "confirmable-yes": "დიახ",
+       "confirmable-no": "არა",
        "thisisdeleted": "$1-ის ჩვენება თუ აღდგენა?",
        "viewdeleted": "იხილე $1?",
        "restorelink": "{{PLURAL:$1|ერთი წაშლილი რედაქტირება|$1 წაშლილი რედაქტირება}}",
        "invalidtitle-knownnamespace": "დაუშვებელი სათაური სახელთა სივრცე \"$2\" და ტექსტი \"$3\"-თან",
        "invalidtitle-unknownnamespace": "დაუშვებელი სათაური უცნობი სახელთა სივრცის ნომერი $1 და ტექსტი \"$2\"-ით",
        "exception-nologin": "შესვლა არ განხორციელდა",
-       "exception-nologin-text": "á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\98á\83¡ á\83¡á\83\90á\83\9cá\83\90á\83®á\83\90á\83\95á\83\90á\83\93 á\83\90á\83\9c á\83\9bá\83\9dá\83\97á\83®á\83\9dá\83\95á\83\9cá\83\98á\83\9aá\83\98 á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83¡á\83\90á\83¡á\83 á\83£á\83\9aá\83\94á\83\91á\83\9aá\83\90á\83\93 á\83¡á\83\90á\83­á\83\98á\83 á\83\9dá\83\90 [[Special:Userlogin|á\83¡á\83\98á\83¡á\83¢á\83\94á\83\9bá\83\90á\83¨á\83\98 á\83¨á\83\94á\83¡á\83\95á\83\9aá\83\90]].",
+       "exception-nologin-text": "á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 á\83¬á\83\95á\83\93á\83\9dá\83\9bá\83\98á\83¡á\83\90á\83\97á\83\95á\83\98á\83¡ á\83\90á\83\9c á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\94á\83\91á\83\98á\83¡á\83\97á\83\95á\83\98á\83¡ á\83¡á\83\90á\83­á\83\98á\83 á\83\9dá\83\90 á\83¡á\83\98á\83¡á\83¢á\83\94á\83\9bá\83\90á\83¨á\83\98 á\83¨á\83\94á\83¡á\83\95á\83\9aá\83\90.",
        "virus-badscanner": "შეცდომა. ვირუსთა უცნობი სკანერი: ''$1''",
        "virus-scanfailed": "სკანირების შეცდომა  (კოდი $1)",
        "virus-unknownscanner": "უცნობი ანტივირუსი:",
        "passwordreset-emailsent-capture": "ქვემოთ ნაჩვენები პაროლის თავიდან დასაყენებელი წერილი გაიგზავნა.",
        "passwordreset-emailerror-capture": "ქვემოთ მოცემულია შექმნილი პაროლის დასაყენებელი წერილი, რომლის გაგზავნაც {{GENDER:$2|მომხმარებელთან}} ვერ მოხერხდა: $1 გამო",
        "changeemail": "ელ-ფოსტის მისამართის შეცვლა",
-       "changeemail-header": "ანგარიშის ელ-ფოსტის მისამართის შეცვლა",
        "changeemail-text": "შეავსეთ ეს ფორმა თქვენი ელ-ფოსტის მისამართის შესაცვლელად. თქვენი პაროლის შეყვანა დაგჭირდებათ ამ ცვლილების დასადასტურებლად.",
        "changeemail-no-info": "თქვენ ავტირიზებული უნდა იყოთ ამ გვერდთან უშუალო წვდომისთვის.",
        "changeemail-oldemail": "ელ-ფოსტის ამჟამინდელი მისამართი:",
        "changeemail-none": "(არაფერი)",
        "changeemail-password": "თქვენი პაროლი პროექტში {{SITENAME}}:",
        "changeemail-submit": "ელ-ფოსტის შეცვლა",
-       "changeemail-cancel": "გაუქმება",
        "resettokens-tokens": "ჟეტონები:",
        "resettokens-token-label": "$1 (მიმდინარე მნიშვნელობა: $2)",
        "bold_sample": "მუქი ტექსტი",
        "currentrev": "მიმდინარე შესწორება",
        "currentrev-asof": "მიმდინარე ცვლილება $1 მდგომარეობით",
        "revisionasof": "$1-ის ვერსია",
-       "revision-info": "$1-ის ვერსია, შეტანილი $2-ის მიერ",
+       "revision-info": "$1-ის ვერსია, {{GENDER:$6|$2}}$7",
        "previousrevision": "←წინა ვერსია",
        "nextrevision": "შემდეგი ვერსია→",
        "currentrevisionlink": "მიმდინარე ვერსია",
        "searchrelated": "მიბმული",
        "searchall": "ყველა",
        "showingresults": "ქვემოთ იხილეთ <b>$1</b>-მდე შედეგი დაწყებული #<b>$2</b>-იდან.",
-       "showingresultsheader": "{{PLURAL:$5|რეზულტატი '''$1'''  '''$3'''-დან|რეზულტატები '''$1 — $2''' -დან '''$3'''}}  '''$4'''-თვის",
        "search-nonefound": "მოთხოვნის შესაბამისობა არ არის ნაპოვნი.",
        "powersearch-legend": "გაფართოებული ძიება",
        "powersearch-ns": "ძიება სახელთა სივრცეებში:",
        "right-deletedtext": "წაშლილი ტექსტის და განსხვავებების ხილვა.",
        "right-browsearchive": "წაშლილი გვერდების ძიება",
        "right-undelete": "გვერდის აღდგენა",
-       "right-suppressrevision": "á\83\90á\83\93á\83\9bá\83\98á\83\9cá\83\97á\83\90á\83\92á\83\90á\83\9c á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83£á\83\9aá\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98á\83¡ á\83®á\83\98á\83\9aá\83\95á\83\90 á\83\93á\83\90 á\83\90á\83¦á\83\93á\83\92á\83\94á\83\9cá\83\90",
+       "right-suppressrevision": "á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98á\83¡ á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83£á\83\9aá\83\98 á\83\95á\83\94á\83 á\83¡á\83\98á\83\94á\83\91á\83\98á\83¡ á\83®á\83\98á\83\9aá\83\95á\83\90, á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\95á\83\90 á\83\93á\83\90 á\83\90á\83¦á\83\93á\83\92á\83\94á\83\9cá\83\90 á\83§á\83\95á\83\94á\83\9aá\83\90 á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡á\83\92á\83\90á\83\9c",
        "right-suppressionlog": "კერძო ჟურნალების ნახვა",
        "right-block": "სხვა მომხმარებლების მიერ რედაქტირების აკრძალვა",
        "right-blockemail": "ელ ფოსტის გაგზავნის აკრძალვა",
        "recentchanges": "ბოლო ცვლილებები",
        "recentchanges-legend": "ბოლო ცვლილებების პარამეტრები",
        "recentchanges-summary": "უთვალთვალეთ ვიკის ბოლო ცვლილებებს ამ გვერდზე.",
+       "recentchanges-noresult": "მითითებულ პერიოდსა და სახელთა სივრცეში ცვლილებები არ არის.",
        "recentchanges-feed-description": "ვიკის უახლესი ცვლილებების მეთვალყურეობა ამ არხში.",
        "recentchanges-label-newpage": "ამ რედაქტირებით შეიქმნა ახალი გვერდი",
        "recentchanges-label-minor": "ეს არის მცირე შესწორება",
        "license-header": "ლიცენზია",
        "nolicense": "არაფერი არის მონიშნული",
        "license-nopreview": "(წინასწარ გადახედვა არ არის ხელმისაწვდომი)",
-       "upload_source_url": " (სწორი, საზოგადოდ ხელმისაწვდომი URL)",
-       "upload_source_file": " (ფაილი შენს კომპიუტერზე)",
+       "upload_source_url": "(თქვენ აირჩიეთ სწორი, საზოგადოდ ხელმისაწვდომი URL)",
+       "upload_source_file": "(თქვენ აირჩიეთ ფაილი თქვენი კომპიუტერიდან)",
+       "listfiles-delete": "წაშლა",
        "listfiles-summary": "ეს სპეციალური გვერდი აჩვენებს ყველა ატვირთულ ფაილს.",
        "listfiles_search_for": "ძიება სურათის სახელის მიხედვით:",
        "imgfile": "ფაილი",
        "randompage-nopages": "{{PLURAL:$2|სახელთა შემდეგი სივრცე|სახელთა შემდეგ სივრცეში}} \"$1\" არ არის გვერდები.",
        "randomincategory": "კატეგორიის შემთხვევითი გვერდი",
        "randomincategory-invalidcategory": "კატეგორია „$1“ არ არსებობს.",
-       "randomincategory-selectcategory-submit": "მიდი",
        "randomredirect": "ნებისმიერი გადამისამართება",
        "randomredirect-nopages": "სახელთა სივრცეში „$1“ არ არის გადამისამართებები.",
        "statistics": "სტატისტიკა",
        "protectedpages": "დაცული გვერდები",
        "protectedpages-indef": "მხოლოდ უვადო დაცვები",
        "protectedpages-cascade": "მხოლოდ კასკადური დაცვა",
+       "protectedpages-noredirect": "გადამისამართებების დამალვა",
        "protectedpagesempty": "ამ დროისთვის არ არსებობს დაცული გვერდები მოთხოვნილი პარამეტრებით.",
+       "protectedpages-timestamp": "თარიღი/დრო",
        "protectedpages-page": "გვერდი",
        "protectedpages-expiry": "ვადა გასდის",
+       "protectedpages-performer": "მომხმარებლის დაცვა",
+       "protectedpages-params": "დაცვის პარამეტრები",
        "protectedpages-reason": "მიზეზი",
        "protectedpages-unknown-timestamp": "უცნობი",
        "protectedpages-unknown-performer": "უცნობი მომხმარებელი",
        "listusers": "მომხმარებლების სია",
        "listusers-editsonly": "აჩვენთ მხოლოდ ის მომხმარებლები, რომლებსაც ერთი შესწორება აქვს გაკეთებული.",
        "listusers-creationsort": "დაალაგეთ შექმნის თარიღის მიხედვით.",
+       "listusers-desc": "კლების მიხედვით დალაგება",
        "usereditcount": "$1 რედაქტირება",
        "usercreated": "{{GENDER:$3|შექმნილია}} $2-ზე $1-ში",
        "newpages": "ახალი გვერდები",
        "booksources": "წიგნის წყაროები",
        "booksources-search-legend": "წიგნის წყაროს ძებნა",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "გადასვლა",
        "booksources-text": "ქვემოთ არის ვებ გვერდების ბმულების სია სადაც იყიდება ახალი და ნახმარი წიგნები, და შესაძლოა შეიცავდნენ დამატებით ინფორმაციას წიგნების შესახებ, რომლებსაც ეძებთ:",
        "booksources-invalid-isbn": "თქვენს მიერ მითითებული ISBN, შეცდომას შეიცავს.  შეამოწმეთ, თუ თავდაპირველი წყარო სწორადაა აკრეფილი.",
        "specialloguserlabel": "შემსრულებელი:",
        "wlheader-enotif": "ელ.ფოსტით შეტყობინება ჩართულია.",
        "wlheader-showupdated": "თქვენი ბოლო ვიზიტის შემდეგ შეცვლილი გვერდები, აღნიშნულია '''მუქად'''.",
        "wlnote": "ქვემოთ {{PLURAL:$1|ნაჩვენებია ბოლო ცვლილება|ნაჩვენებია ბოლო '''$1''' ცვლილება}} უკანასკნელი {{PLURAL:$2|საათის|'''$2''' საათის}} მანძილზე, $3, $4 მდგომარეობით.",
-       "wlshowlast": "აჩვენე ბოლო $1 საათის $2 დღის $3",
+       "wlshowlast": "აჩვენე ბოლო $1 საათის $2 დღის",
        "watchlist-options": "კონტროლის სიის პარამეტრები",
        "watching": "კონტროლებადი...",
        "unwatching": "არაკონტროლირებადი...",
        "autoblockid": "ავტომატური ბლოკირება #$1",
        "block": "მომხმარებლის დაბლოკვა",
        "unblock": "მომხმარებელზე ბლოკის მოხსნა",
-       "blockip": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ á\83\90á\83\9c IP á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\98á\83¡ á\83\91á\83\9aá\83\9dá\83\99á\83\98á\83 á\83\94á\83\91á\83\90",
+       "blockip": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9a {{GENDER:$1|á\83\93á\83\90á\83\91á\83\9aá\83\9dá\83\99á\83\95á\83\90}}",
        "blockip-legend": "მომხმარებლის დაბლოკვა",
        "blockiptext": "გამოიყენეთ ქვემოთ მოყვანილი ფორმა სპეციფიური IP მისამართის\nან მომხმარებლისთვის რედაქტირების ბლოკირებისთვის.\nამის გაკეთება შეიძლება მხოლოდ ვანდალიზმის ასარიდებლად,\nდა [[{{MediaWiki:Policy-url}}|პოლიტიკასთან]] თანხმობაში.\nჩაწერეთ სპეციფიური მიზეზი ქვემოთ (მაგ. მიუთითეთ გვერდები,\nრომლებზეც ვანდალიზმი განხორციელდა).",
        "ipaddressorusername": "IP მისამართი ან მომხმარებლის სახელი",
        "ipb-unblock-addr": "ბლოკის მოხსნა $1",
        "ipb-unblock": "მომხმარებლის სახელზე ან IP მისამართზე ბლოკის მოხსნა",
        "ipb-blocklist": "იხილე არსებული ბლოკირებები",
-       "ipb-blocklist-contribs": "$1 მომხმარებლის წვლილი",
+       "ipb-blocklist-contribs": "მომხმარებელ {{GENDER:$1|$1}} წვლილი",
        "unblockip": "მომხმარებელზე ბლოკის მოხსნა",
        "unblockiptext": "გამოიყენეთ ქვემოთ მოცემული ფორმულარი, რათა  დაბლოკილი IP მისამართი ან მომხმარებლის სახელი აღადგინოთ.",
        "ipusubmit": "ამ ბლოკის მოხსნა",
        "import": "გვერდების იმპორტი",
        "importinterwiki": "ტრანსვიკი იმპორტი",
        "import-interwiki-text": "წარმოადგინეთ ვიკი და იმპორტირებადი გვერდის სახელი.\nცვლილებათა რიცხვები და ავტორთა სახელები შენნარჩუნდება.\nტრანსვიკი იმპორტის ყველა ოპერაცია რეგისტრირდება [[Special:Log/import|სპეციალურ ჟურნალში]].",
-       "import-interwiki-source": "ვიკი წყარო/გვერდი:",
        "import-interwiki-history": "ამ გვერდის ცვლილებათა ისტორიის კოპირება.",
        "import-interwiki-templates": "ყველა თარგის ჩართვა",
        "import-interwiki-submit": "იმპორტირება",
        "exif-urgency-low": "დაბალი ($1)",
        "exif-urgency-high": "მაღალი ($1)",
        "exif-urgency-other": "მომხმარებლის მიერ განსაზღვრული პრიორიტეტი ($1)",
-       "watchlistall2": "ყველა",
        "namespacesall": "ყველა",
        "monthsall": "ყველა",
        "confirmemail": "ელ. ფოსტის მისამართის დადასტურება",
        "version-hook-name": "ჰუკის სახელი",
        "version-hook-subscribedby": "ჩაწერილია",
        "version-version": "(ვერსია $1)",
+       "version-no-ext-name": "[სახელის გარეშე]",
        "version-svn-revision": "(r$2)",
        "version-license": "მედიავიკის ლიცენზია",
        "version-ext-license": "ლიცენზია",
        "version-ext-colheader-name": "გაფართოებები",
+       "version-skin-colheader-name": "იერსახე",
        "version-ext-colheader-version": "ვერსია",
        "version-ext-colheader-license": "ლიცენზია",
        "version-ext-colheader-description": "აღწერა",
        "logentry-rights-rights-legacy": "მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} ჯგუფის წევრობა $3-თვის",
        "logentry-rights-autopromote": "მომხმარებელი $1 ავტომატურად იქნა {{GENDER:$2|გადაყვანილი}} $4–დან $5–ში",
        "rightsnone": "(არცერთი)",
+       "revdelete-summary": "ცვლილებების აღწერა",
        "feedback-bugornote": "თუ თქვენ მზად ხართ დეტალურად აღწეროთ ტექნიკური პრობლემა, გთხოვთ, [$1 შეგვატყობინეთ შეცდომის შესახებ].\nწინააღმდეგ შემთხვევაში თქვენ შეგიძლიათ ისარგებლოთ ამ მარტივი ფორმით. თქვენი კომენტარი დაემატება  „[$3 $2]“ გვერდზე თქვენი მომხმარებლის სახელთან და გამოყენებულ ბრაუზერთან ერთად.",
        "feedback-subject": "თემა:",
        "feedback-message": "შეტყობინება:",
        "expand_templates_ok": "შესრულება",
        "expand_templates_remove_comments": "კომენტარების წაშლა",
        "expand_templates_remove_nowiki": "ტეგების დათრგუნვა <nowiki> შედეგში",
-       "expand_templates_preview": "წინა"
+       "expand_templates_preview": "წინა",
+       "pagelanguage": "გვერდის ენის არჩევა",
+       "pagelang-name": "გვერდი",
+       "pagelang-language": "ენა",
+       "pagelang-use-default": "საწყისი ენის გამოყენება",
+       "pagelang-select-lang": "აირჩიეთ ენა",
+       "right-pagelang": "გვერდის ენის შეცვლა",
+       "action-pagelang": "გვერდის ენის შეცვლა",
+       "log-name-pagelang": "ენის ცვლილებების ჟურნალი",
+       "log-description-pagelang": "ეს არის გვერდის ენის ცვლილებების ჟურნალი",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ჩართულია)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''გამორთულია''')"
 }
index f5237ee..368016c 100644 (file)
        "tog-underline": "Siltewdin' astın sız:",
        "tog-hideminor": "Aqırg'ı o'zgerislerden kishilerin jasır",
        "tog-extendwatchlist": "Baqlaw dizimin barlıq o'zgerislerdi ko'rsetetug'ın qılıp ken'eyt (tek aqırg'ıların emes)",
-       "tog-usenewrc": "Ken'eytilgen jaqındag'ı o'zgerislerdi qollan (JavaScript bolıwın talap etedi)",
+       "tog-usenewrc": "Jaqındag'ı o'zgerisler ha'm baqlaw dizimindegi o'zgerislerdi birlestiriw",
        "tog-numberheadings": "Atamalardı avtomat nomerle",
-       "tog-showtoolbar": "O'zgertiw a'sbapların ko'rset (JavaScript)",
-       "tog-editondblclick": "Eki ma'rte basıp o'zgertiw (JavaScript)",
-       "tog-editsectiononrightclick": "Bo'lim atamasın on' jaqqa basıp o'zgertiwdi qos (JavaScript)",
-       "tog-watchcreations": "Men jaratqan betlerdi baqlaw dizimime qos",
-       "tog-watchdefault": "Men o'zgeris kiritken betlerdi baqlaw dizimime qos",
-       "tog-watchmoves": "Men ko'shirgen betlerdi baqlaw dizimime qos",
-       "tog-watchdeletion": "Men o'shirgen betlerdi baqlaw dizimime qos",
+       "tog-showtoolbar": "O'zgertiw a'sbapların ko'rset",
+       "tog-editondblclick": "Betlerdi eki ma'rte basıp o'zgertiw",
+       "tog-editsectiononrightclick": "Bo'lim atamasın on' jaqqa basıp o'zgertiwdi qos",
+       "tog-watchcreations": "Men jaratqan betlerdi ha'm ju'klegen fayllardı baqlaw dizimime qos",
+       "tog-watchdefault": "Men o'zgeris kiritken betler ha'm fayllardı baqlaw dizimime qos",
+       "tog-watchmoves": "Men ko'shirgen betler ha'm fayllardı baqlaw dizimime qos",
+       "tog-watchdeletion": "Men o'shirgen betler ha'm fayllardı baqlaw dizimime qos",
        "tog-minordefault": "Defolt boyınsha barlıq o'zgerislerdi kishi dep esaplaw",
        "tog-previewontop": "O'zgertiw maydanınan aldın ko'rip shıg'ıw maydanın ko'rset",
        "tog-previewonfirst": "Birinshi o'zgertiwdi ko'rip shıq",
-       "tog-enotifwatchlistpages": "Baqlaw dizimimdegi bet o'zgertilgende mag'an xat jiber",
+       "tog-enotifwatchlistpages": "Baqlaw dizimimdegi bet yamasa fayl o'zgertilgende mag'an xat jiber",
        "tog-enotifusertalkpages": "Menin' sa'wbetim o'zgertilgende mag'an xat jiber",
-       "tog-enotifminoredits": "Kishi o'zgerisler haqqında da mag'an xat jiber",
+       "tog-enotifminoredits": "Bet ha'm fayllardag'ı kishi o'zgerisler haqqında da mag'an xat jiber",
        "tog-enotifrevealaddr": "Eskertiw xatlarında e-mail adresimdi ko'rset",
        "tog-shownumberswatching": "Baqlag'an paydalanıwshılar sanın ko'rset",
        "tog-fancysig": "İmzalardı wikitext dep qabıl etiw (avtomat siltewsiz)",
-       "tog-uselivepreview": "Janlı ko'rip shıg'ıwdı qollan (JavaScript) (Sınawda)",
+       "tog-uselivepreview": "Janlı ko'rip shıg'ıwdı qollan (Sınawda)",
        "tog-forceeditsummary": "O'zgertiw juwmag'ı bos qalg'anda mag'an eskert",
        "tog-watchlisthideown": "Baqlaw dizimindegi menin' o'zgertiwlerimdi jasır",
        "tog-watchlisthidebots": "Baqlaw dizimindegi bot o'zgertiwlerin jasır",
        "newwindow": "(jan'a aynada)",
        "cancel": "Biykar etiw",
        "moredotdotdot": "Ja'ne...",
-       "mypage": "Menin' betim",
-       "mytalk": "Menin' sa'wbetim",
+       "mypage": "Bet",
+       "mytalk": "Sa'wbet",
        "anontalk": "Usı IP sa'wbeti",
        "navigation": "Navigatsiya",
        "and": "&#32;ha'm",
        "jumptosearch": "izlew",
        "aboutsite": "{{SITENAME}} haqqında",
        "aboutpage": "Project:Haqqında",
-       "copyright": "Mag'lıwmat $1 boyınsha alıng'an.",
+       "copyright": "Mag'lıwmat $1 litsenziyası boyınsha alıng'an (eger basqa sha'rtler ko'rsetilmese).",
        "copyrightpage": "{{ns:project}}:Avtorlıq huquqları",
        "currentevents": "Ha'zirgi ha'diyseler",
        "currentevents-url": "Project:Ha'zirgi ha'diyseler",
        "viewsource": "Deregin ko'riw",
        "actionthrottled": "Ha'reket toqtatıldı",
        "actionthrottledtext": "Spamg'a qarsı gu'res esabında, bunday ha'reketti qısqa waqıtta dım ko'p ma'rte bejeriwin'iz sheklenedi, ha'mde siz usı limitten o'tip ketkensiz.\nBirneshe minuttan keyin qaytadan ha'reket qılıp ko'rin'.",
-       "protectedpagetext": "Bul bet o'zgertiwdin' aldın alıw ushın qulplang'an.",
+       "protectedpagetext": "Bul bet o'zgertiwdin' ha'm basqa ha'reketlerdin' aldın alıw ushın qulplang'an.",
        "viewsourcetext": "Bul bettin' deregin qarawın'ızg'a ha'mde ko'shirip alıwın'ızg'a boladı:",
-       "editinginterface": "'''Esletpe:''' Siz ishinde MediaWiki sistema xabarı bar bolg'an betti o'zgertip atırsız.\nBul bettin' o'zgeriwi basqa paydalanıwshılardın' sırtqı interfeisine ta'sir etedi.\nAudarıw ushın,  MediaWiki programmasın jersindiriw [//translatewiki.net/wiki/Main_Page?setlang=kaa translatewiki.net proyektisin] qarap shıg'ın'ız.",
+       "editinginterface": "'''Esletpe:''' Siz ishinde MediaWiki sistema xabarı bar bolg'an betti o'zgertip atırsız.\nBul bettin' o'zgeriwi basqa paydalanıwshılardın' sırtqı interfeysine ta'sir etedi.\nBul xabardın' awdarmasın qosıw yamasa o'zgertiw ushın,  MediaWiki programmasının' lokallastırıw [//translatewiki.net/wiki/Main_Page?setlang=kaa translatewiki.net proektinen] paydalanın'.",
        "namespaceprotected": "'''$1''' isimler ko'pligindegi betlerdi o'zgertiwge ruxsatın'ız joq.",
        "ns-specialprotected": "\"{{ns:special}}:\" isimler ko'pligindegi betler o'zgertilmeydi",
        "titleprotected": "Bul atamanı jaratıw [[User:$1|$1]] ta'repinen qorg'alg'an.\nKeltirilgen sebep: ''$2''.",
        "virus-unknownscanner": "belgisiz antivirus:",
-       "logouttext": "'''Siz endi sayttan shıqtın'ız.'''\n\nSiz {{SITENAME}} saytınan anonim halda paydalanıwın'ız mu'mkin.\nYamasa siz ja'ne ha'zirgi yaki basqa paydalanıwshı atı menen <span class='plainlinks'>[$1 qaytadan sistemag'a kiriwin'izge]</span> boladı.\nSonı este saqlan', ayrım betler sizin' brauzerin'izdin' keshi tazalanbag'anlıg'ı sebebli sistemada kirgenin'izdey ko'riniste dawam ettire beriwi mu'mkin.",
+       "logouttext": "'''Siz endi sayttan shıqtın'ız.'''\n\nSonı este saqlan', ayrım betler sizin' brauzerin'izdin' keshi tazalanbag'anlıg'ı sebebli sistemada kirgenin'izdey ko'riniste dawam ettire beriwi mu'mkin.",
        "yourname": "Paydalanıwshı atı:",
        "yourpassword": "Parol:",
        "yourpasswordagain": "Paroldi qayta kiritin':",
        "createaccount": "Akkaunt jarat",
        "gotaccount": "Akkauntın'ız barma? '''$1'''.",
        "gotaccountlink": "Kir",
-       "createaccountmail": "e-mail arqalı",
+       "createaccountmail": "Waqtınshalıq parol jaratıw ha'm onı ko'rsetilgen e-mail adresin jiber",
        "badretype": "Siz kiritken parol tuwra kelmedi.",
        "userexists": "Kiritken paydalanıwshı atı ba'nt. \nİltimas, basqa at saylan'.",
        "loginerror": "Kiriwde qatelik",
        "throttled-mailpassword": "Aqırg'ı {{PLURAL:$1|saat|$1 saat}} ishinde parol eskertiw xatı jiberildi.\nJaman jolda paydalanıwdın' aldın alıw ushın, ha'r {{PLURAL:$1|saat|$1 saat}} sayın tek g'ana bir parol eskertiw xatı jiberiledi.",
        "mailerror": "Xat jiberiwde qatelik juz berdi: $1",
        "acct_creation_throttle_hit": "Keshirersiz, siz aldın {{PLURAL:$1|1 akkaunt|$1 akkaunt}} jaratqansız.\nBunnan artıq jaratıw mu'mkinshiligin'iz joq.",
-       "emailauthenticated": "Sizin' e-mail adresin'iz tastıyqlang'an waqtı: $2, $3.",
+       "emailauthenticated": "Sizin' e-mail adresin'iz tastıyqlang'an waqtı: $3, $2.",
        "emailnotauthenticated": "E-mail adresin'iz ele tastıyıqlanbag'an.\nTo'mendegi mu'mkinshilikler ushın hesh xat jiberilmeydi.",
        "noemailprefs": "Usı mu'mkinshilikler islewi ushın e-mail adresin'izdi ko'rsetin'.",
        "emailconfirmlink": "E-mail adresin'izdi tastıyıqlan'",
        "invalidemailaddress": "E-mail adresin'iz nadurıs formatta bolg'anı ushın qabıl etile almaydı.\nDurıs formattag'ı adresin'izdi ko'rsetin', yamasa qatardı bos qaldırın'.",
        "accountcreated": "Akkaunt jaratıldı",
-       "accountcreatedtext": "$1 paydalanıwshısına akkaunt jaratıldı.",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) paydalanıwshısına akkaunt jaratıldı.",
        "createaccount-title": "{{SITENAME}} ushın akkaunt jaratıw",
        "createaccount-text": "Kimdir e-mail adresin'izdi paydalanıp {{SITENAME}} saytında ($4) \"$2\" atı menen, \"$3\" paroli menen akkaunt jaratqan.\nEndi saytqa kirip parolin'izdi o'zgertiwin'iz kerek.\n\nEger bul akkaunt nadurıs jaratılg'an bolsa, bul xabarg'a itibar bermesen'izde boladı.",
        "loginlanguagelabel": "Til: $1",
        "changepassword": "Paroldi o'zgertiw",
-       "resetpass_announce": "E-mailin'izge jiberilgen waqtınshalıq kod penen kirdin'iz.\nKiriw protsessin juwmaqlaw ushın jan'a parolin'izdi usı jerge kiritin':",
+       "resetpass_announce": "Kiriw protsessin juwmaqlaw ushın jan'a parol jaratıwın'ız kerek.",
        "resetpass_header": "Akkaunt parolin o'zgertiw",
        "oldpassword": "Aldıng'ı parol:",
        "newpassword": "Taza parol:",
        "retypenew": "Taza paroldi qayta kiritin':",
        "resetpass_submit": "Paroldi kirgizin'",
-       "changepassword-success": "Parolin'iz sa'tli o'zgertildi! Endi kirin'...",
+       "changepassword-success": "Parolin'iz sa'tli o'zgertildi!",
        "resetpass_forbidden": "Paroller o'zgertile almaydi",
        "resetpass-submit-loggedin": "Paroldi o'zgertiw",
        "resetpass-temp-password": "Waqtınshalıq parol:",
        "hiddencategories": "Bul bet {{PLURAL:$1|1 jasırın kategoriyasının'|$1 jasırın kategoriyalarının'}} ag'zası:",
        "nocreatetext": "{{SITENAME}} saytında taza betlerdi jaratıw sheklengen.\nArqag'a qaytıp bar betti o'zgertiwin'izge yamasa [[Special:UserLogin|kiriwin'izge / akkaunt jaratıwın'ızg'a]] boladı.",
        "nocreate-loggedin": "Taza betler jaratıwın'ızg'a ruxsatın'ız joq.",
-       "permissionserrors": "Ruxsatnamalar Qatelikleri",
+       "permissionserrors": "Ruxsatnama qateligi",
        "permissionserrorstext-withaction": "$2 ha'reketine ruxsatın'ız joq, to'mendegi {{PLURAL:$1|sebep|sebepler}} boyınsha:",
        "recreate-moveddeleted-warn": "'''Esletpe: Aldın o'shirilgen betti qayta jaratajaqsız.'''\n\nUsi betti qaytadan jaratıw tuwrılıg'ın oylap ko'rin'.\nQolaylıq ushın to'mende o'shiriw jurnalı keltirilgen:",
        "moveddeleted-notice": "Bul bet o'shirilgen.\nTo'mende mag'lıwmat ushın bettin' o'shiriw ha'm ko'shiriw jurnalı ko'rsetilgen.",
        "page_last": "aqırg'ı",
        "histlegend": "Tu'sindirme: salıstırajaq nusqaların'ızdı saylan' ha'mde Enter knopkasın yamasa to'mendegi knopkani basın'.<br />\nSha'rtli belgiler: (ha'z.) = ha'zirgi nusqasi menen parqı,\n(aqır.) = aldıng'ı nusqasi menen parqı, k = kishi o'zgeris",
        "history-fieldset-title": "Tariyxınan izlew",
-       "histfirst": "En' aldıng'ısı",
-       "histlast": "En' aqırg'ısı",
+       "histfirst": "en' aldıng'ısı",
+       "histlast": "en' aqırg'ısı",
        "historysize": "({{PLURAL:$1|1 bayt|$1 bayt}})",
        "historyempty": "(bos)",
        "history-feed-title": "Nusqa tariyxı",
        "rev-deleted-event": "(jurnal ha'reketi o'shirildi)",
        "rev-delundel": "ko'rsetiw/jasırıw",
        "revdelete-legend": "Ko'rinis sheklewlerin belgilew",
-       "revdelete-hide-text": "Nusqa tekstin jasır",
+       "revdelete-hide-text": "O'zgeris teksti",
        "revdelete-hide-image": "Fayl mag'lıwmatın jasır",
        "revdelete-hide-name": "Ha'reket ha'm onın' obyektin jasır",
-       "revdelete-hide-comment": "O'zgertiw kommentariyin jasır",
-       "revdelete-hide-user": "O'zgeriwshi atın/IP jasır",
+       "revdelete-hide-comment": "O'zgerisler ta'ripleri",
+       "revdelete-hide-user": "Paydalanıwshı atı/IP-adres",
        "revdelete-hide-restricted": "Mag'lıwmatlardı administratorlar menen basqalardan da jasırıw",
        "revdelete-suppress": "Mag'lıwmatlardı administratorlar menen basqalardan da jasırıw",
        "revdelete-unsuppress": "Qayta tiklengen nusqalardan sheklewlerdi alıp taslaw",
        "powersearch-ns": "Usı isimler ko'pliginen izlew:",
        "search-external": "Sırtqı izlewshi",
        "preferences": "Sazlawlar",
-       "mypreferences": "Menin' sazlawlarım",
+       "mypreferences": "Sazlawlar",
        "prefs-edits": "O'zgertiwler sanı:",
        "prefs-skin": "Sırtqı ko'rinis",
        "skin-preview": "Korip al",
        "servertime": "Server waqtı:",
        "guesstimezone": "Brauzerden alıp toltırıw",
        "allowemail": "Basqalardan xat qabıllawdı qos",
-       "prefs-searchoptions": "İzlew sazlawları",
+       "prefs-searchoptions": "İzlew",
        "prefs-namespaces": "İsimler ko'plikleri",
        "default": "defolt",
        "prefs-files": "Fayllar",
        "youremail": "E-mail:",
-       "username": "Paydalanıwshı atı:",
+       "username": "{{GENDER:$1|Paydalanıwshı atı}}:",
        "prefs-memberingroups": "Kirgen {{PLURAL:$1|toparın'ız|toparların'ız}}:",
        "yourrealname": "Haqıyqıy isimin'iz:",
        "yourlanguage": "Til:",
        "pager-older-n": "{{PLURAL:$1|eskilew 1|eskilew $1}}",
        "booksources": "Kitap derekleri",
        "booksources-search-legend": "Kitap haqqında informatsiya izlew",
-       "booksources-go": "O'tin'",
        "specialloguserlabel": "Paydalanıwshı:",
        "speciallogtitlelabel": "Atama:",
        "log": "Jurnallar",
        "watchlist-details": "Baqlaw dizimin'izde (sa'wbet betlerin esapqa almag'anda) {{PLURAL:$1|1 bet|$1 bet}} bar.",
        "wlheader-enotif": "E-mail arqalı eskertiw qosılg'an.",
        "wlnote": "To'mende aqırg'ı {{PLURAL:$2|saattag'ı|'''$2''' saattag'ı}} {{PLURAL:$1|aqırg'ı o'zgeris bar|aqırg'ı '''$1''' o'zgeris bar}}.",
-       "wlshowlast": "Aqırg'ı $1 saat, $2 ku'n, $3 ko'rset",
+       "wlshowlast": "Aqırg'ı $1 saat, $2 ku'n,  ko'rset",
        "watchlist-options": "Baqlaw diziminin' sazlawları",
        "watching": "Baqlaw...",
        "unwatching": "Baqlamaw...",
        "exif-imagelength": "Uzunlıg'ı",
        "exif-imagedescription": "Su'wret ataması",
        "exif-artist": "Avtor",
-       "watchlistall2": "ha'mmesin",
        "namespacesall": "ha'mmesi",
        "monthsall": "ha'mme",
        "confirmemail": "E-mail adresin tastıyıqlaw",
        "specialpages-group-users": "Paydalanıwshılar ha'm olardın' huqıqları",
        "revdelete-restricted": "administratorlarg'a qollanılg'an sheklewler",
        "revdelete-unrestricted": "administratorlardan alıp taslang'an sheklewler",
-       "rightsnone": "(hesh qanday)"
+       "rightsnone": "(hesh qanday)",
+       "revdelete-summary": "o'zgerislerdin' qısqasha mazmunı"
 }
index 256af44..86b33f8 100644 (file)
        "passwordreset-emailsent-capture": "Tirawt n uwennez n awal n uɛaddi tetwaceggaɛ, ẓeṛ-itt ddaw agi.",
        "passwordreset-emailerror-capture": "Tirawt n uwennez n awal n uɛaddi t-arewed, ẓeṛ-itt ddaw agi, lamaɛna aceggaɛ i {{GENDER:$2|umseqdac}} yefkad anezri : $1",
        "changeemail": "Beddel tansa n e-mail",
-       "changeemail-header": "Beddel tansa n e-mail n umiḍan",
        "changeemail-text": "Ččur tiferkit agi iwakken ad beddeleḍ tansa e-mail inek/inem. Ilaq ad sekcemeḍ awal ik/im n uɛaddi iwakken ad sergegeḍ abeddel agi.",
        "changeemail-no-info": "Ilaq ad qqeneḍ iwakken ad ẓṛeḍ asebter agi.",
        "changeemail-oldemail": "Tansa e-mail n tura :",
        "changeemail-none": "(ulac)",
        "changeemail-password": "Awal-ik/im n uɛaddi ɣef {{SITENAME}} :",
        "changeemail-submit": "Beddel tansa e-mail",
-       "changeemail-cancel": "Semmewet",
        "changeemail-throttled": "Tɛerdeḍ ad qqeneḍ aṭas tiqwal.\nIlaq ad rǧuḍ $1 uqbel ad ɛerdeḍ tikkelt nniḍen.",
        "resettokens": "Wennez tiddas",
        "resettokens-text": "D-agi tzemreḍ ad twennezeḍ tiddas i ɛemmeden ad kecmeḍ ar isefka usligen i qqenen ar amiḍan inek/inem.\n\nIlaq ad twennezeḍ tiddas ma tferqeḍ-ten s tuccḍa s umseqdac nniḍen neɣ ma amiḍan inek/inem yexṣer.",
        "searchrelated": "ineqqes",
        "searchall": "akk",
        "showingresults": "Tamuli n {{PLURAL:$1|'''Yiwen''' wegmud|'''$1''' n yigmad}} seg  #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Agmud '''$1'''|Igmad '''$1–$2'''}} n '''$3''' i '''$4'''",
        "search-nonefound": "Ulac igmad i usuter agi.",
        "powersearch-legend": "Anadi amahlan",
        "powersearch-ns": "Nadi deg tallunin n isemawen",
        "randomincategory": "Asebtar s ugacur deg taggayt",
        "randomincategory-invalidcategory": "« $1 » mačči d-isem n taggayt yeɣblen.",
        "randomincategory-nopages": "Ulac asebtar deg [[:Category:$1]].",
-       "randomincategory-selectcategory": "Ddem asebtar s ugacur deg taggayt : $1 $2.",
-       "randomincategory-selectcategory-submit": "Ruḥ",
        "randomredirect": "Asemmimeḍ menwala",
        "randomredirect-nopages": "Ulac asebter n alsanamad deg tallunt n isemawen « $1 ».",
        "statistics": "Tisnaddanin",
        "querypage-disabled": "Asebter uslig agi yensa , taɣzint : timellal is.",
        "booksources": "Iɣbula n yidlisen",
        "booksources-search-legend": "Nadi ɣef iɣbula n yidlisen",
-       "booksources-go": "Ruḥ",
        "booksources-text": "Deg ukessar, yella wumuɣ n yizdayen iberraniyen izzenzen idlisen (imaynuten akk d weqdimen), yernu ahat sɛan kter talɣut ɣef idlisen i tettnadiḍ fell-asen:",
        "booksources-invalid-isbn": "ISBN agi ur yeɣbel ara ; selken ma ulac anezri deg-es.",
        "specialloguserlabel": "Ameskar :",
        "wlheader-enotif": "Talɣut s email yessermed.",
        "wlheader-showupdated": "Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s uḍris '''aberbuz'''.",
        "wlnote": "Ddaw agi  {{PLURAL:$1|yella abeddel aneggaru|llan '''$1''' ibeddilen ineggura}} n {{PLURAL:$2|usrag aneggaru|'''$2''' isragen ineggura}}, seg $3 af $4.",
-       "wlshowlast": "Ssken $1 n swayeɛ $2 n wussan neɣ $3 ineggura",
+       "wlshowlast": "Ssken $1 n swayeɛ $2 n wussan neɣ  ineggura",
        "watchlist-options": "Tifranin n umuɣ n uɛessi",
        "watching": "Ad iɛass...",
        "unwatching": "Ad ifukk aɛessi...",
        "import": "Ssekcem isebtar",
        "importinterwiki": "Assekcem n transwiki",
        "import-interwiki-text": "Fren yiwen wiki d yiwen azwel n usebtar ad ketreḍ.\nIzemzen n ileqman d isemawen n ittekkiyen ad qqimen.\nAkkw tigawin n taktert ager-wiki ad illint deg [[Special:Log/import|umezruy n tiketrin]].",
-       "import-interwiki-source": "Wiki d usebtar n taɣbalut",
        "import-interwiki-history": "Xdem alsaru n akk tisiwal umezruy n usebter-agi",
        "import-interwiki-templates": "Sekcem akkw talɣiwin",
        "import-interwiki-submit": "Ssekcem",
        "exif-urgency-low": "Anammum ($1)",
        "exif-urgency-high": "Afella ($1)",
        "exif-urgency-other": "Lḥir id yefka amseqdac ($1)",
-       "watchlistall2": "akk",
        "namespacesall": "akk",
        "monthsall": "akk",
        "confirmemail": "Sentem tansa n e-mail",
index 29f6f2e..8d7b40f 100644 (file)
        "pager-older-n": "{{PLURAL:$1|нэхъ жьыуэ 1|нэхъ жьыху $1}}",
        "booksources": "Тхылъ къыздихар",
        "booksources-search-legend": "Тхылъым и хъыбар лъыхъуэн",
-       "booksources-go": "Къэгъуэтын",
        "log": "Тхылъхэр",
        "allpages": "НапэкIуэцIухъуар",
        "prevpage": "Япэреуэ кӀуа напэкӀуэцӀыр ($1)",
        "watchthispage": "НапэкӀуэцӀым кӀэлъыплъын",
        "unwatch": "КӀэлъымыплъын",
        "watchlist-details": "Уи щӀэлъыплъыгъуэ тхылъым $1 {{PLURAL:$1|напэкӀуэцӀ|напэкӀуэцӀу}}, напэкӀуэцӀ тепсэлъыхьыгъуэхэр хэмыту",
-       "wlshowlast": "Гъэлъэгъуэн кӀуа $1 сэхьэтым $2 махуэ $3",
+       "wlshowlast": "Гъэлъэгъуэн кӀуа $1 сэхьэтым $2 махуэ",
        "watchlist-options": "ЩӀэлъыплъыгъуэхэм я тхылъ зэгъэзэхуэгъуэ",
        "watching": "СызыкӀэлъыплъ тхылъым хэлъхьэн...",
        "unwatching": "СызыкӀэлъыплъ тхылъым хэхын",
        "metadata-expand": "Дээпыкъуэгъу кэӀуэтэгъуэхэр гъэлъэгъуэн",
        "metadata-collapse": "Дээпыкъуэгъу кэӀуэтэгъуэхэр гъэпшкӀун",
        "metadata-fields": "Метаданнэхэр, мыбы кърибжэкІхэр къызэрыгуэкІыу сурэтым и напэкІуэцІым къщридзэнущ, адрейхэр гъэпщкІуау щытынущ.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
-       "watchlistall2": "псори",
        "namespacesall": "псори",
        "monthsall": "псори",
        "imgmultipageprev": "япэрыт напэкӀуэцӀыр",
        "version-specialpages": "Лэжыгъэ напэкӀуэцӀ",
        "specialpages": "СпецнапэкӀуэцӀхэр",
        "revdelete-restricted": "теубыдыгъуэхэр тхьэмадэхэм ятохуэ",
-       "revdelete-unrestricted": "теубыдыгъуэхэр тхьэмадэхэм ятеха"
+       "revdelete-unrestricted": "теубыдыгъуэхэр тхьэмадэхэм ятеха",
+       "revdelete-summary": "зэхъуэкӀыгъуэхэм я тепсэлъыхьыгъуэ"
 }
index f9976fa..c4de62a 100644 (file)
        "passwordreset": "پاسورڈو ری سیٹ کورے",
        "passwordreset-username": "ممبارو نم",
        "changeemail-none": "(نو)",
-       "changeemail-cancel": "کھینسل",
        "bold_sample": "بوسک متن",
        "bold_tip": "بولڈ ٹیکسٹ",
        "italic_sample": "کولی/اٹالک نیویشیرو",
        "search-interwiki-more": "(مزید)",
        "searchrelated": "متعلقہ",
        "searchall": "کھل",
-       "showingresultsheader": "{{PLURAL:$5|نتیجہ'''$1''' of '''$3'''|نتیجہ'''$1 - $2''' of '''$3'''}} بچے'''$4'''",
        "search-nonefound": "استفسارو مطابقا نتائج ملاو نو ھونی.",
        "powersearch-legend": "ایڈوانس سرچ",
        "powersearch-ns": "جائے ناما تلاش:",
        "pager-older-n": "{{PLURAL:$1|قدیم1|قدیم ترین $1}}",
        "booksources": "کتابی وسائل",
        "booksources-search-legend": "کتابی وسایلان تلاش",
-       "booksources-go": "Go/بوغے",
        "specialloguserlabel": "یوزر",
        "speciallogtitlelabel": "عنوان:",
        "log": "نوشتہ جات",
        "watchthispage": "ھیہ صفحو تان نظرا لاکھے",
        "unwatch": "زیرنظرمنسوخ",
        "watchlist-details": " تہ زیرِنظرفہرستا {{PLURAL:$1|$1 صفحہ شیر|$1 صفحات شینی}}، ھیارا تبادلۂ خیالو صفحاتن تعداد شامل نیکی.",
-       "wlshowlast": "پشاوے آخری $1 گھنٹو $2 آنوسو $3",
+       "wlshowlast": "پشاوے آخری $1 گھنٹو $2 آنوسو",
        "watchlist-options": "واچ لسٹ آپشن",
        "watching": "زیر نظر",
        "unwatching": "منسوخ",
        "metadata-collapse": "درونگار تفصیلان کھوشتاوے",
        "metadata-fields": "ایگزف میٹاڈیٹا ھیارا دیونو بیرو ھوٹوان صفحا دیونو بونی وا کیاوتکہ میٹاڈیٹا ٹیبل کھولاو ھوی باقی اشناری بائی ڈیفالٹ کھوشت تان بہچونی\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-dc-date": "تاریخ",
-       "watchlistall2": "سف",
        "namespacesall": "تھمامو",
        "monthsall": "سف",
        "confirm_purge_button": "OK/ٹھیک شیر",
index 4b2bf84..71f6bb9 100644 (file)
        "search-relatedarticle": "alaqedar",
        "searchrelated": "alaqedar",
        "searchall": "pêro",
-       "showingresultsheader": "'''$4''' rê {{PLURAL:$5|'''$3''' netice ra '''$1'''i|'''$1 - $2''' miyan de '''$3''' netice}}",
        "search-nonefound": "Neticeo ke ebe perşi zubini cêno çino.",
        "powersearch-legend": "Cıcêraiso hira",
        "powersearch-ns": "Caunê namun de cıcêre:",
        "pager-older-n": "{{PLURAL:$1|1 khanêr|$1 khanêri}}",
        "booksources": "Çımê kıtabun",
        "booksources-search-legend": "Serba çımeunê kıtabu cıfeteliye",
-       "booksources-go": "So",
        "specialloguserlabel": "Kerdoğ:",
        "speciallogtitlelabel": "Sernuste:",
        "log": "Qeydi",
        "watchthispage": "Na pele de şêr ke",
        "unwatch": "Şêr meke",
        "watchlist-details": "Pelunê hurênaişi ra qêri {{PLURAL:$1|$1 pele lista şêrkerdişi dera|$1 peli lista şêrkerdişi derê}}.",
-       "wlshowlast": "$1 saetunê $2 rozunê peyênu bıasne $3",
+       "wlshowlast": "$1 saetunê $2 rozunê peyênu bıasne",
        "watchlist-options": "Alternatifê lista şêrkerdene",
        "watching": "Şêr ke…",
        "unwatching": "Şêr meke…",
        "exif-imagewidth": "Verındêni",
        "exif-imagelength": "Berzêni",
        "exif-meteringmode-255": "Bin",
-       "watchlistall2": "pêro",
        "namespacesall": "pêro",
        "monthsall": "pêro",
        "confirm_purge_button": "Temam",
        "tag-filter": "Parzünê [[Special:Tags|etiket]]i:",
        "compare-page1": "Pele 1",
        "compare-page2": "Pele 2",
-       "rightsnone": "(qet jü)"
+       "rightsnone": "(qet jü)",
+       "revdelete-summary": "xulasa vurnaene"
 }
index e70e9c8..abfc2bf 100644 (file)
        "suppress": "شەتتەتۋ",
        "booksources": "كىتاپ قاينارلارى",
        "booksources-search-legend": "كىتاپ قاينارلارىن ىزدەۋ",
-       "booksources-go": "ٴوتۋ",
        "booksources-text": "تومەندە جاڭا جانە قولدانعان كىتاپتار ساتاتىن توراپتارىنىڭ سىلتەمەلەرى تىزىمدەلگەن. بۇل توراپتاردا ىزدەلگەن كىتاپتار تۋرالى بىلايعى اقپارات بولۋعا مۇمكىن.",
        "specialloguserlabel": "قاتىسۋشى:",
        "speciallogtitlelabel": "تاقىرىپ اتى:",
        "wlheader-enotif": "ەسكەرتۋ حات جىبەرۋى قوسىلعان.",
        "wlheader-showupdated": "سوڭعى كەلىپ-كەتۋىڭىزدەن بەرى وزگەرتىلگەن بەتتەردى '''جۋان''' قارىپىمەن كورسەت",
        "wlnote": "تومەندە سوڭعى {{PLURAL:$2|ساعاتتا|'''$2''' ساعاتتا}} بولعان, {{PLURAL:$1|جۋىقتاعى وزگەرىس|جۋىقتاعى '''$1''' وزگەرىس}} كورسەتىلەدى.",
-       "wlshowlast": "سوڭعى $1 ساعاتتاعى, $2 كۇندەگى, $3 بولعان وزگەرىستى كورسەتۋ",
+       "wlshowlast": "سوڭعى $1 ساعاتتاعى, $2 كۇندەگى,  بولعان وزگەرىستى كورسەتۋ",
        "watching": "باقىلاۋدا…",
        "unwatching": "باقىلاماۋدا…",
        "enotif_reset": "بارلىق بەت كەلىپ-كەتىلدى دەپ بەلگىلە",
        "exif-gpsspeed-n": "knot",
        "exif-gpsdirection-t": "شىن باعىت",
        "exif-gpsdirection-m": "ماگنىيتتى باعىت",
-       "watchlistall2": "بارلىق",
        "namespacesall": "بارلىعى",
        "monthsall": "بارلىعى",
        "confirmemail": "ە-پوشتا مەكەنجايىن قۇپتاۋ",
        "revdelete-restricted": "اكىمشىلەرگە تىيىمدار قولدادى",
        "revdelete-unrestricted": "اكىمشىلەردەن تىيىمداردى الاستادى",
        "rightsnone": "(ەشقانداي)",
+       "revdelete-summary": "وڭدەمەنىڭ قىسقاشا مازمۇنداماسى",
        "expandtemplates": "ۇلگىلەردى ۇلعايتۋ",
        "expand_templates_intro": "وسى قۇرال ارنايى بەتى الدەبىر ٴماتىندى الادى دا,\nبۇنىڭ ىشىندەگى بارلىق كىرىكتەلگەن ۇلگىلەردى مەيلىنشە ۇلعايتادى.\nمىنا <nowiki>{{#language:...}} سىيياقتى جوڭدەتۋ فۋنكتسىييالارىن دا, جانە {{CURRENTDAY}}\nسىيياقتى اينامالىلارىن دا ۇلعايتادى (ناقتى ايتقاندا, قوس قابات ساداق جاقشالار اراسىنداعى بارلىعىن).\nبۇنى ٴوز MediaWiki باعدارلاماسىنان قاتىستى جوڭدەتۋ ساتىن شاقىرىپ ىستەلىنەدى.",
        "expand_templates_title": "ٴماتىن ارالىق اتاۋى ({{FULLPAGENAME}} ت.ب. بەتتەر ٴۇشىن):",
index 3bc0cc0..71e236d 100644 (file)
        "passwordreset-emailsent-capture": "Құпия сөзді өзгерту электронды пошта арқылы жөнелтілді, ол төменде көрсетілген.",
        "passwordreset-emailerror-capture": "Жазылған ескертпе-хат төменде көрсетілген, оның жөнелтілмеу себебі: $1",
        "changeemail": "Е-пошта мекен-жайын өзгерту",
-       "changeemail-header": "Е-пошта мекен-жайының өзгертілуі",
        "changeemail-text": "Е-поштаның мекен-жайын өзгерту үшін мына пішінді толтырыңыз. Өзгертулерді растау үшін құпия сөздіңізді енгізу керек.",
        "changeemail-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.",
        "changeemail-oldemail": "Е-поштаның қазіргі уақыттағы мекен-жайы:",
        "changeemail-none": "(ешкім)",
        "changeemail-password": "{{SITENAME}} жобасындағы құпия сөзіңіз:",
        "changeemail-submit": "Е-поштаны өзгерту",
-       "changeemail-cancel": "Болдырмау",
        "changeemail-throttled": "Сіз жақында кіруге тым көп әрекет жасадыңыз.\nҚайта байқап көру үшін $1 уақыт күте тұрыңыз.",
        "bold_sample": "Жуан мәтін",
        "bold_tip": "Жуан мәтін",
        "preview": "Қарап шығу",
        "showpreview": "Алдын-ала қарау",
        "showdiff": "Өзгерістерді көрсет",
+       "blankarticle": "<strong>Ескерту:</strong> Сіз бастамақшы болған бет бос.\nЕгер сіз «{{int:savearticle}}» дегенші қайта шертсеңіз бет қандайда бір мағлұматсыз басталады.",
        "anoneditwarning": "<strong> Ескерту:</strong>  Сіз жүйеге кірмегенсіз.\nIP мекенжайыңыз бұл беттің өңделу тарихында жазылып алынады.",
        "anonpreviewwarning": "<em>Сіз жүйеге кірмегенсіз. IP мекенжайыңыз бұл беттің өңделу тарихында жазылып алынады.</em>",
        "missingsummary": "<strong>Ескерту:</strong> Өңдеменің қысқаша түйіндемесін енгізбепсіз.\n«{{int:savearticle}}» батырмасын қайта бассаңыз өңденмеңіз түйіндемесіз сақталады.",
        "clearyourcache": "<strong>Ескерту:</strong> Сақтағаннан кейін өзгерістерді көру үшін броузеріңіздің бүркемесін (кэшін) тазарту керек болуы мүмкін. \n* <strong>Firefox / Safari:</strong> <em>Қайта жүктеуді</em> нұқығанда <em>Shift</em> басып тұрыңыз немесе <em>Ctrl-F5</em> не <em>Ctrl-Shift-R</em> екеуінің біреуін басыңыз (Mac — <em>⌘-R</em>) \n* <strong>Google Chrome:</strong>  <em>Ctrl-Shift-R</em> басыңыз (Mac — <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong> <em>Жаңарту</em> батырмасын нұқығанда <em>Ctrl</em> басып тұрыңыз немесе <em>Ctrl-F5</em> басыңыз;  не <em>F5</em> басыңыз \n* <strong>Opera:</strong> <em>Құралдар → Бапталымдар</em> дегеннен бүркемесін тазарту керек.",
        "usercssyoucanpreview": "<strong>Кеңес:</strong> Жаңа CSS файлыңызды сақтау алдында «{{int:showpreview}}» батырмасын қолданып сынақтаңыз.",
        "userjsyoucanpreview": "<strong>Кеңес:</strong> Жаңа JavaScript файлыңызды сақтау алдында «{{int:showpreview}}» батырмасын қолданып сынақтаңыз.",
-       "usercsspreview": "</strong>Бұл тек қатысушы CSS файлыңызды қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!</strong>",
+       "usercsspreview": "<strong>Бұл тек қатысушы CSS файлыңызды қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!</strong>",
        "userjspreview": "<strong>Мынау JavaScript қатысушы бағдарламасын тынау/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!</strong>",
        "sitecsspreview": "<strong>Мынау тек бұл CSS файлын қарап шығуыңыз екенін ұмытпаңыз, ол әлі сақталған жоқ!</strong>",
        "sitejspreview": "<strong>Мынау тек бұл JavaScript кодын алдын-ала қарап алу екенін ұмытпаңыз, ол әлі сақталған жоқ!</strong>",
        "userinvalidcssjstitle": "</strong>Ескерту:</strong> Осы арада «$1» деген еш мәнер жоқ.\nҚалыпты .css және .js беттерінің атауына кіші әріп қолданыңыз, мысалы {{ns:user}}:Foo/vector.css дегенді {{ns:user}}:Foo/Vector.css дегенмен салыстырып қараңыз.",
        "updated": "(Жаңартылған)",
        "note": "'''Ескерту:'''",
-       "previewnote": "</strong>Бұл тек қарап шығу екенін ұмытпаңыз.</strong> \nӨзгертулеріңіз әлі сақталған жоқ!",
+       "previewnote": "<strong>Бұл тек қарап шығу екенін ұмытпаңыз.</strong> \nӨзгертулеріңіз әлі сақталған жоқ!",
        "continue-editing": "Өңдеу аумағына өту",
        "previewconflict": "Бұл қарап шығу беті жоғарғы кірістіру орнындағы мәтінді қамтиды да және сақталғандағы өңді көрсетпек.",
        "session_fail_preview": "<strong>Кешіріңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.</strong>\nҚайта байқап көріңіз. \nЕгер бұл әлі істелмесе [[Special:UserLogout|шығуды]] және қайта кіруді байқап көріңіз.",
        "undo-failure": "Бұл өңдеме жоққа шығарылмайды, себебі арада қақтығысты өңдемелер бар.",
        "undo-norev": "Бұл өңдеме жоққа шығарылмайды, себебі бұл бет жоқ немесе жойылған.",
        "undo-nochange": "Өңдеме әлдеқашан жоққа шығарылғаны анықталды.",
-       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|т]]) істеген нөмір $1 түзетуін жоққа шығарды",
+       "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>",
        "pagemerge-logentry": "[[$1]] деген [[$2]] дегенге біріктірілді ($3 дейінгі түзетулері)",
        "revertmerge": "Біріктіруді болдырмау",
        "mergelogpagetext": "Төменде бір беттің тарихы өзге бетке біріктіру ең соңғы тізімі келтіріледі.",
-       "history-title": "«$1» дегеннің өңдеу тарихы",
+       "history-title": "«$1» дегеннің өңделу тарихы",
        "difference-title": "$1 — нұсқалар арасындағы айырмашылық",
        "difference-title-multipage": "\"$1\" және \"$2\" беттерінің арасындағы айырмашылық",
        "difference-multipage": "(Беттер арасындағы айырмашылық)",
        "searchrelated": "қатысты",
        "searchall": "барлық",
        "showingresults": "Төменде нөмір '''$2''' орнынан бастап барынша '''$1''' нәтиже көрсетіледі.",
-       "showingresultsheader": "«<strong>$4</strong>» сұранысына {{PLURAL:$5|тек <strong>$1</strong> нәтиже табылды|табылған <strong>$3</strong> нәтиженің <strong>$1 - $2</strong> аралығы көрсетілген}}",
        "search-nonefound": "Сұрауға сәйкес нәтижелер табылмады.",
        "powersearch-legend": "Кеңейтілген іздеу",
        "powersearch-ns": "Атау кеңістіктері бойынша іздеу:",
        "randomincategory": "Санаттағы кездейсоқ бет",
        "randomincategory-invalidcategory": "\"$1\" жарамды санат аты емес.",
        "randomincategory-nopages": "Бұлар [[:Category:$1]] беттері мес.",
-       "randomincategory-selectcategory-submit": "Өту",
        "randomredirect": "Кездейсоқ айдағыш",
        "randomredirect-nopages": "Бұл есім аясында еш айдағыш жоқ \"$1\".",
        "statistics": "Санақ",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|мүше|мүше}}",
        "nrevisions": "$1 {{PLURAL:$1|түзету|түзету}}",
        "nviews": "$1 {{PLURAL:$1|қаралу|қаралу}}",
-       "nimagelinks": "$1 {{PLURAL:$1|беÑ\82Ñ\96нде|беÑ\82Ñ\82еÑ\80Ñ\96нде}} қолданылады",
-       "ntransclusions": "$1 {{PLURAL:$1|беÑ\82Ñ\96нде|беÑ\82Ñ\82еÑ\80Ñ\96нде}} қолданылады",
+       "nimagelinks": "$1 {{PLURAL:$1|беÑ\82Ñ\82е|беÑ\82Ñ\82е}} қолданылады",
+       "ntransclusions": "$1 {{PLURAL:$1|беÑ\82Ñ\82е|беÑ\82Ñ\82е}} қолданылады",
        "specialpage-empty": "Бұл сұраныс бойынша нәтиже жоқ.",
        "lonelypages": "Еш беттен сілтелмеген беттер",
        "lonelypagestext": "Келесі беттерге {{SITENAME}} жобасындағы басқа беттерінің ішіндегі кірікбеттер сілтемейді.",
        "querypage-disabled": "Бұл арнайы бет өнімділік себептері үшін өшірілген",
        "booksources": "Кітап қайнарлары",
        "booksources-search-legend": "Кітап қайнарларын іздеу",
-       "booksources-go": "Өту",
        "booksources-text": "Төменде жаңа және қолданған кітаптар сататын тораптарының сілтемелері тізімделген және ізделген кітаптар туралы қосымша ақпарат болуы мүмкін:",
        "specialloguserlabel": "Орындаушы:",
        "speciallogtitlelabel": "Нысана (атауы немесе қатысушы):",
        "wlheader-enotif": "Ескерту хат жіберуі қосылған.",
        "wlheader-showupdated": "Соңғы келіп-кетуіңізден бері өзгертілген беттер '''жуан''' қаріпімен көрсетіледі.",
        "wlnote": "Төменде $3, $4 кезіне дейінгі соңғы {{PLURAL:$2|сағатта|'''$2''' сағатта}} болған, {{PLURAL:$1|жуықтағы өзгеріс|жуықтағы '''$1''' өзгеріс}} көрсетіледі.",
-       "wlshowlast": "Соңғы $1 сағаттағы, $2 күндегі, $3 болған өзгерісті көрсету",
+       "wlshowlast": "Соңғы $1 сағаттағы, $2 күндегі,  болған өзгерісті көрсету",
        "watchlist-options": "Бақылау тізімінің баптаулары",
        "watching": "Бақылауда…",
        "unwatching": "Бақыламауда…",
        "rollbacklinkcount-morethan": "$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|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) соңғы рет өңдеген.",
+       "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|талқылауы]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) істеген [[:$1]] бетіндегі соңғы өңдемесі шегіндірілмеді, себебі басқа біреу бұл бетті әлдеқашан өңдеген немесе шегіндірген.\n\nБетті [[User:$3|$3]] ([[User talk:$3|талқылауы]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) соңғы рет өңдеген.",
        "editcomment": "Болған өңдеме түйіндемесі: «''$1''».",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|т]]) өңдемелерінен [[User:$1|$1]] соңғы нұсқасына қайтарды",
        "revertpage-nouser": "Жасырылған қатысушы өңдемелерінен {{GENDER:$1|[[User:$1|$1]]}} соңғы нұсқасына қайтарды",
        "delete_and_move": "Жою және жылжыту",
        "delete_and_move_text": "== Жоюды қажет етеді ==\nТағайындалған «[[:$1]]» беті әлдеқашан бар.\nЖылжытуға жол беру үшін бұны жойғыңыз келе ме?",
        "delete_and_move_confirm": "Иә, бұл бетті жой",
-       "delete_and_move_reason": "\"[[$1]]\" дегеннен жылжытуға жол беру үшін жойылған",
+       "delete_and_move_reason": "«[[$1]]» дегеннен жылжытуға жол беру үшін жойылған",
        "selfmove": "Қайнар және нысана тақырып аттары бірдей;\nбет өзінің үстіне жылжытылмайды.",
        "immobile-source-namespace": "\"$1\" есім кеңістігіндегі беттер жылжытылмайды",
        "immobile-target-namespace": "\"$1\" есім кеңістігіне беттерді жылдытылмайды",
        "import": "Беттерді сырттан алу",
        "importinterwiki": "Уики-апару үшін сырттан алу",
        "import-interwiki-text": "Сырттан алынатын уикиді және беттің тақырып атын бөлектеңіз.\nТүзету күн-айы және өңдеуші есімдері сақталады.\nУики-апару үшін сырттан алу барлық әрекеттер [[{{#special:Log}}/import|сырттан алу журналына]] жазылып алынады.",
-       "import-interwiki-source": "Қайнар уики/бет:",
        "import-interwiki-history": "Бұл беттің барлық тарихи нұсқаларын көшіру",
        "import-interwiki-templates": "Кірістірілген барлық үлгілер",
        "import-interwiki-submit": "Сырттан алу",
        "tooltip-recreate": "Бет жойылғанына қарамастан қайта бастау",
        "tooltip-upload": "Жүктеуді бастау",
        "tooltip-rollback": "\"Шегіндіру\" сілтемесін бір рет басу арқылы соңға редактордың барлық қатар өңдемелерін өшіру",
+       "tooltip-undo": "«Жоққа шығару» сілтемесін бассаңыз бұл өңдеме болдырылмайды және өңдеу пішіні қарап шығу режимінде ашылады. Ол өңдеу түйіндемесіне себебін қосуға мүмкіндік береді.",
        "tooltip-preferences-save": "Бапталымдарыңызды сақтау",
        "tooltip-summary": "Қысқаша түйіндемесін енгізіңіз",
        "interlanguage-link-title-nonlang": "$1 – $2",
        "pageinfo-header-edits": "Өңдеу тарихы",
        "pageinfo-header-restrictions": "Бет қорғалуы",
        "pageinfo-header-properties": "Бет сипаттары",
-       "pageinfo-display-title": "Бейнебет атауы",
+       "pageinfo-display-title": "Көрініс атауы",
+       "pageinfo-default-sort": "Әдепкі іріктеу кілті",
        "pageinfo-length": "Бет ұзындығы (байтпен)",
        "pageinfo-article-id": "Бет ID-і",
        "pageinfo-language": "Бет мәлімет тілі",
        "pageinfo-content-model": "Бет мағлұмат қалпы",
-       "pageinfo-robot-policy": "Индекстеуді робот жүргізеді",
-       "pageinfo-robot-index": "Рұқсат берілген",
-       "pageinfo-robot-noindex": "Рұқсат етілмеген",
+       "pageinfo-robot-policy": "Индекстеуді робот жүргізуге",
+       "pageinfo-robot-index": "рұқсат берілген",
+       "pageinfo-robot-noindex": "рұқсат етілмеген",
        "pageinfo-views": "Қараушылар саны",
        "pageinfo-watchers": "Бетті қараушылар саны",
        "pageinfo-few-watchers": "$1 азырақ {{PLURAL:$1|қараушы|қараушы}}",
-       "pageinfo-redirects-name": "Ð\91ұл Ð±ÐµÑ\82ке Ð°Ð¹Ð´Ð°Ñ\82Ñ\8bлғандар саны",
+       "pageinfo-redirects-name": "Ð\91ұл Ð±ÐµÑ\82ке Ð±Ð°Ò\93Ñ\8bÑ\82Ñ\82алғандар саны",
        "pageinfo-subpages-name": "Бұл беттің төменгі беттер саны",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|айдатқыш|айдатқыш}}; $3 {{PLURAL:$3|айдатқыш емес|айдатқыш емес}})",
        "pageinfo-firstuser": "Бетті бастаушы",
        "exif-urgency-normal": "Қалыпты ($1)",
        "exif-urgency-low": "Төмен ($1)",
        "exif-urgency-high": "Жоғары ($1)",
-       "watchlistall2": "барлық",
        "namespacesall": "барлығы",
        "monthsall": "барлығы",
        "confirmemail": "Е-пошта мекенжайын құптау",
        "logentry-rights-rights": "$1 $3 үшін топ мүшелігін $4 дегеннен $5 дегенге {{GENDER:$2|өзгерті}}",
        "logentry-rights-rights-legacy": "$1 $3 үшін топ мүшелігін {{GENDER:$2|өзгерті}}",
        "rightsnone": "(ешқандай)",
+       "revdelete-summary": "өңдеменің қысқаша мазмұндамасы",
        "feedback-subject": "Тақырып:",
        "feedback-message": "Хабарлама:",
        "feedback-cancel": "Болдырмау",
index a3a4cd8..a00317a 100644 (file)
        "suppress": "Şettetw",
        "booksources": "Kitap qaýnarları",
        "booksources-search-legend": "Kitap qaýnarların izdew",
-       "booksources-go": "Ötw",
        "booksources-text": "Tömende jaña jäne qoldanğan kitaptar satatın toraptarınıñ siltemeleri tizimdelgen. Bul toraptarda izdelgen kitaptar twralı bılaýğı aqparat bolwğa mümkin.",
        "specialloguserlabel": "Qatıswşı:",
        "speciallogtitlelabel": "Taqırıp atı:",
        "wlheader-enotif": "Eskertw xat jiberwi qosılğan.",
        "wlheader-showupdated": "Soñğı kelip-ketwiñizden beri özgertilgen betterdi '''jwan''' qaripimen körset",
        "wlnote": "Tömende soñğı {{PLURAL:$2|sağatta|'''$2''' sağatta}} bolğan, {{PLURAL:$1|jwıqtağı özgeris|jwıqtağı '''$1''' özgeris}} körsetiledi.",
-       "wlshowlast": "Soñğı $1 sağattağı, $2 kündegi, $3 bolğan özgeristi körsetw",
+       "wlshowlast": "Soñğı $1 sağattağı, $2 kündegi,  bolğan özgeristi körsetw",
        "watching": "Baqılawda…",
        "unwatching": "Baqılamawda…",
        "enotif_reset": "Barlıq bet kelip-ketildi dep belgile",
        "exif-gpsspeed-n": "knot",
        "exif-gpsdirection-t": "Şın bağıt",
        "exif-gpsdirection-m": "Magnïttı bağıt",
-       "watchlistall2": "barlıq",
        "namespacesall": "barlığı",
        "monthsall": "barlığı",
        "confirmemail": "E-poşta mekenjaýın quptaw",
        "revdelete-restricted": "äkimşilerge tïımdar qoldadı",
        "revdelete-unrestricted": "äkimşilerden tïımdardı alastadı",
        "rightsnone": "(eşqandaý)",
+       "revdelete-summary": "öñdemeniñ qısqaşa mazmundaması",
        "expandtemplates": "Ülgilerdi ulğaýtw",
        "expand_templates_intro": "Osı qural arnaýı beti äldebir mätindi aladı da,\nbunıñ işindegi barlıq kiriktelgen ülgilerdi meýlinşe ulğaýtadı.\nMına <nowiki>{{</nowiki>#language:...}} sïyaqtı jöñdetw fwnkcïyaların da, jäne <nowiki>{{</nowiki>CURRENTDAY}}\nsïyaqtı aýnamalıların da ulğaýtadı (naqtı aýtqanda, qos qabat sadaq jaqşalar arasındağı barlığın).\nBunı öz MediaWiki bağdarlamasınan qatıstı jöñdetw satın şaqırıp istelinedi.",
        "expand_templates_title": "Mätin aralıq atawı ({{FULLPAGENAME}} t.b. better üşin):",
index 1c97771..cd8d378 100644 (file)
        "passwordreset-emailsent-capture": "អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានផ្ញើទៅហើយ។",
        "passwordreset-emailerror-capture": "អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានបង្កើតហើយ ប៉ុន្តែការផ្ញើទៅកាន់ {{GENDER:$2|អ្នកប្រើប្រាស់}}មិនបានសំរេចទេ៖ $1",
        "changeemail": "ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល",
-       "changeemail-header": "ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែលសំរាប់គណនីនេះ",
        "changeemail-text": "សូមបំពេញសំនុំបែបបទនេះដើម្បីផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែលរបស់អ្នក។ អ្នកនឹងត្រូវបញ្ចូលពាក្យសម្ងាត់ដើម្បីអះអាងលើការផ្លាស់ប្ដូរនេះ។",
        "changeemail-no-info": "អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។",
        "changeemail-oldemail": "អាសយដ្ឋានអ៊ីមែលបច្ចុប្បន្ន៖",
        "changeemail-none": "(គ្មាន​)",
        "changeemail-password": "ពាក្យសំងាត់{{SITENAME}}របស់អ្នក:",
        "changeemail-submit": "ផ្លាស់ប្ដូរអ៊ីមែល",
-       "changeemail-cancel": "បោះបង់",
        "changeemail-throttled": "អ្នកបានព្យាយាមកត់ឈ្មោះចូលច្រើនដងពេកហើយ។​\nសូមរង់ចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។",
        "bold_sample": "អក្សរដិត",
        "bold_tip": "អក្សរដិត",
        "searchrelated": "ទាក់ទិន",
        "searchall": "ទាំងអស់",
        "showingresults": "ខាងក្រោមកំពុងបង្ហាញរហូតដល់ {{PLURAL:$1|'''១''' លទ្ឋផល|'''$1''' លទ្ឋផល}} ចាប់ផ្ដើមពីលេខ #'''$2'''។",
-       "showingresultsheader": "{{PLURAL:$5|លទ្ឋផល '''$1''' ក្នុងចំណោមលទ្ឋផលសរុប '''$3'''|លទ្ឋផល '''$1 - $2''' ក្នុងចំណោមលទ្ឋផលសរុប '''$3'''}} សម្រាប់ '''$4'''",
        "search-nonefound": "មិនមានលទ្ធផលណាមួយ​ត្រូវគ្នានឹងសំណើសុំនេះទេ",
        "powersearch-legend": "ស្វែងរកថ្នាក់ខ្ពស់",
        "powersearch-ns": "ស្វែងរកក្នុងលំហឈ្មោះ៖",
        "randomincategory": "ទំព័រចៃដន្យក្នុងចំណាត់ថ្នាក់ក្រុម",
        "randomincategory-invalidcategory": "\"$1\" មិនមែនជាឈ្មោះចំណាតក្រុមត្រឹមត្រូវ។",
        "randomincategory-nopages": "គ្មានទំព័រណាមួយក្នុងចំណាត់ថ្នាក់ក្រុម [[:Category:$1|$1]] ទេ។",
-       "randomincategory-selectcategory": "បង្ហាញទំព័រចៃដន្យពីចំណាត់ថ្នាក់ក្រុម៖ $1 $2។",
-       "randomincategory-selectcategory-submit": "ទៅ",
        "randomredirect": "ទំព័របញ្ជូនបន្តចៃដន្យ",
        "randomredirect-nopages": "គ្មានទំព័របញ្ជូនបន្តណាមួយនៅក្នុងប្រភេទ \"$1\" ទេ។",
        "statistics": "ស្ថិតិ",
        "booksources": "ប្រភពសៀវភៅ",
        "booksources-search-legend": "ស្វែងរកប្រភពសៀវភៅ",
        "booksources-isbn": "លេខ​កូដ​សៀវ​ភៅ​ ISBN ៖",
-       "booksources-go": "ទៅ",
        "booksources-text": "ខាងក្រោមនេះជាបញ្ជីនៃតំណភ្ជាប់ទៅវិបសាយនានាដែលលក់​សៀវភៅថ្មីនិងជជុះ ហើយអាចផ្ដល់ព័ត៌មានបន្ថែមផ្សេងទៀតអំពីសៀវភៅដែលអ្នកកំពុងស្វែងរក៖",
        "booksources-invalid-isbn": "លេខISBNដែលអ្នកផ្ដល់អោយហាក់ដូចជាមិនត្រឹមត្រូវទេ។ សូមពិនិត្យក្រែងលោមានកំហុសក្នុងការចម្លងចេញពីប្រភពដើម។",
        "specialloguserlabel": "អ្នកប្រព្រឹត្តិ៖",
        "wlheader-enotif": "បើកប្រើការផ្ដល់ដំណឹងតាមរយៈអ៊ីមែល។",
        "wlheader-showupdated": "ទំព័រដែលត្រូវបានផ្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយរបស់អ្នក ត្រូវបានបង្ហាញជា '''អក្សរដិត'''។",
        "wlnote": "ខាងក្រោមនេះជា {{PLURAL:$1|បំលាស់ប្តូរចុងក្រោយ|'''$1'''បំលាស់ប្តូរចុងក្រោយ}}ក្នុងរយះពេល{{PLURAL:$2|'''$2'''ម៉ោង}}ចុងក្រោយ គិតចាប់ពី $3, $4។",
-       "wlshowlast": "បង្ហាញ $1ម៉ោងចុងក្រោយ $2ថ្ងៃចុងក្រោយ ឬ$3",
+       "wlshowlast": "បង្ហាញ $1ម៉ោងចុងក្រោយ $2ថ្ងៃចុងក្រោយ ឬ",
        "watchlist-options": "ជម្រើសនានាក្នុងបញ្ជីតាមដាន",
        "watching": "កំពុង​តាមដាន...",
        "unwatching": "ឈប់​តាមដាន...",
        "thumbnail_image-missing": "ឯកសារហាក់ដូចជាកំពុងបាត់ខ្លួន៖$1",
        "import": "ការនាំចូលទំព័រ",
        "importinterwiki": "ការនាំចូលអន្តរវិគី",
-       "import-interwiki-source": "ប្រភព​ វិគី​/ទំព័រ​៖",
        "import-interwiki-history": "ចម្លង គ្រប់កំណែចាស់ នៃទំព័រនេះ",
        "import-interwiki-templates": "រាប់​បញ្ចូល​ទំព័រគំរូ​ទាំងអស់​",
        "import-interwiki-submit": "នាំចូល",
        "exif-urgency-low": "ទាប ($1)",
        "exif-urgency-high": "ខ្ពស់ ($1)",
        "exif-urgency-other": "តាមការកំណត់របស់អ្នកប្រើប្រាស់ ($1)",
-       "watchlistall2": "ទាំងអស់",
        "namespacesall": "ទាំងអស់",
        "monthsall": "ទាំងអស់",
        "confirmemail": "បញ្ជាក់ទទួលស្គាល់អាសយដ្ឋានអ៊ីមែល",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|បានផ្លាស់ប្ដូរ}}សមាជិកភាពរបស់ $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|ត្រូវបានតំឡើង}}សមាជិកភាពពី $4 ជា $5 ដោយស្វ័យប្រវត្តិ",
        "rightsnone": "(ទទេ)",
+       "revdelete-summary": "កែប្រែចំណារពន្យល់",
        "feedback-subject": "កម្មវត្ថុ ៖",
        "feedback-message": "សារ​៖",
        "feedback-cancel": "បោះបង់​",
index 675808c..e06db43 100644 (file)
        "changeemail-newemail": "ಹೊಸ  ಇ-ಅಂಚೆ ವಿಳಾಸ:",
        "changeemail-none": "(ಯಾವೂ ಇಲ್ಲ)",
        "changeemail-submit": "ಇಮೇಲ್ ಬದಲಾಯಿಸಿ",
-       "changeemail-cancel": "ರದ್ದುಗೊಳಿಸಿ",
        "bold_sample": "ದಪ್ಪಗಿನ ಅಚ್ಚು",
        "bold_tip": "ದಪ್ಪಗಿನ ಅಚ್ಚು",
        "italic_sample": "ಓರೆ ಅಕ್ಷರಗಳು",
        "searchrelated": "ಸಂಬಂಧಿತ",
        "searchall": "ಎಲ್ಲಾ",
        "showingresults": "ಕೆಳಗೆ #'''$2''' ಇಂದ ಶುರುವಾದ {{PLURAL:$1|'''೧''' ಫಲಿತಾಂಶದ|'''$1''' ಫಲಿತಾಂಶಗಳ}}ವರೆಗೂ ತೋರಿಸಲಾಗುತ್ತಿದೆ.",
-       "showingresultsheader": "'''$4''' ಗೆ {{PLURAL:$5|'''$3''' ರಲ್ಲಿ '''$1'''  ಫಲಿತಾಂಶ|'''$3''' ರಲ್ಲಿ '''$1 - $2'''  ಫಲಿತಾಂಶಗಳು}}",
        "search-nonefound": "ನಿಮ್ಮ ವಿಚಾರಣೆಗೆ ತಕ್ಕ ಫಲಿತಾಂಶಗಳಿಲ್ಲ.",
        "powersearch-legend": "ಮುಂದುವರೆದ ಹುಡುಕಾಟ",
        "powersearch-ns": "ಈ ಪುಟ ಪ್ರಬೇಧಗಳಲ್ಲಿ ಹುಡುಕು:",
        "linkstoimage": "ಈ ಕೆಳಗಿನ {{PLURAL:$1|ಪುಟವು|$1 ಪುಟಗಳು}} ಈ ಚಿತ್ರಕ್ಕೆ ಸಂಪರ್ಕ {{PLURAL:$1|ಹೊಂದಿದೆ|ಹೊಂದಿವೆ}}:",
        "nolinkstoimage": "ಈ ಫೈಲಿಗೆ ಯಾವ ಪುಟವೂ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
        "sharedupload": "ಈ ಫೈಲು $1 ಇಂದ. ಇದು ಇತರ ಯೋಜನೆಗಳಲ್ಲಿ ಉಪಯೋಗದಲ್ಲಿರಬಹುದು.",
-       "sharedupload-desc-here": "ಈಧು ಬನ್ದಿರುವುಧು $1 ಮಥು ಹಲವು ಯೋಜನೆ  ಯಲ್ಲಿ ಉಪಯೊಗ ವಗುಥದೆ. \nಕೊಟುರುವ   ವಿವರನೆ [$2 ಕತಥೆ ವಿವರನೆ ಪುಟಾ] ಕೆಲ್ಲಕೆ ನೊಡೀ.",
+       "sharedupload-desc-here": "ಈ ಕಡತವು $1 ಇಂದ ಬಂದಿದ್ದು, ಬೇರೆ ಯೋಜನೆಗಳಲ್ಲೂ ಉಪಯೋಗಿಸಲ್ಪಡಬಹುದು. \n[[$2 ಕಡತ ವಿವರಣಾ ಪುಟ]]ದಲ್ಲಿರುವ ವಿವರಣೆಯನ್ನು ಕೆಳಗೆ ಕೊಡಲಾಗಿದೆ.",
        "filepage-nofile": "ಈ ಹೆಸರಿನ ಫೈಲ್ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ",
        "filepage-nofile-link": "ಈ ಹೆಸರಿನ ಫೈಲ್ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ ಆದರೆ ನೀವು ಇದನ್ನು [$1 ನಕಲೆರಿಸಬಹುದು ]",
        "uploadnewversion-linktext": "ಈ ಫೈಲಿನ ಹೊಸ ಆವೃತ್ತಿಯನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ",
        "unusedtemplateswlh": "ಇತರ ಕೊಂಡಿಗಳು",
        "randompage": "ಯಾದೃಚ್ಛಿಕ ಪುಟ",
        "randompage-nopages": "ಈ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುಟವೂ ಇಲ್ಲ.",
-       "randomincategory-selectcategory-submit": "ಹೋಗು",
        "randomredirect": "ಯದೃಚ್ಛಿಕ ಪುನರ್ನಿರ್ದೇಶಿತ ಪುಟ",
        "randomredirect-nopages": "ಈ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುನರ್ನಿರ್ದೇಶನಗಳೂ ಇಲ್ಲ.",
        "statistics": "ಅಂಕಿ ಅಂಶಗಳು",
        "suppress": "ನಿಗಾ ಇಡುವವ",
        "booksources": "ಪುಸ್ತಕಗಳ ಮೂಲ",
        "booksources-search-legend": "ಪುಸ್ತಕ ಮೂಲಗಳಿಗೆ ಹುಡುಕು",
-       "booksources-go": "ಹೋಗು",
        "specialloguserlabel": "ಸದಸ್ಯ:",
        "speciallogtitlelabel": "ಶೀರ್ಷಿಕೆ:",
        "log": "ದಾಖಲೆಗಳು",
        "watchlist-details": "ಚರ್ಚೆ ಪುಟಗಳನ್ನು ಹೊರತುಪಡಿಸಿ, ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ {{PLURAL:$1|$1 ಪುಟ ಇದೆ|$1 ಪುಟಗಳು ಇವೆ}}.",
        "wlheader-enotif": "ಮಿಂಚಂಚೆ ಸೂಚನೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.",
        "wlheader-showupdated": "ನೀವು ಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳು ಆಗಿರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರಗಳಲ್ಲಿ''' ತೋರಿಸಲಾಗಿದೆ",
-       "wlshowlast": "ಕೊನೆಯ $1 ಗಂಟೆ $2 ದಿನಗಳು $3 ಅನ್ನು ತೋರಿಸು",
+       "wlshowlast": "ಕೊನೆಯ $1 ಗಂಟೆ $2 ದಿನಗಳು  ಅನ್ನು ತೋರಿಸು",
        "watchlist-options": "ವೀಕ್ಷಣಾಪಟ್ಟಿ ಆಯ್ಕೆಗಳು",
        "watching": "ವೀಕ್ಷಣೆಗೆ ಸೇರಿಸಲಾಗುತ್ತಿದೆ...",
        "unwatching": "ವೀಕ್ಷಣೆಯಿಂದ ತೆಗೆಯಲಾಗುತ್ತಿದೆ...",
        "exif-gpsspeed-n": "ಕ್ನಾಟ್‍ಗಳು",
        "exif-gpsdirection-t": "ನಿಜ ದಿಕ್ಕು",
        "exif-gpsdirection-m": "ಆಯಸ್ಕಾಂತೀಯ ದಿಕ್ಕು",
-       "watchlistall2": "ಎಲ್ಲಾ",
        "namespacesall": "ಎಲ್ಲಾ",
        "monthsall": "ಎಲ್ಲಾ",
        "confirmemail": "ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ಖಾತ್ರಿ ಮಾಡಿ",
        "revdelete-restricted": "ನಿರ್ವಾಹಕರಿಗೆ ನಿಬಂಧನೆಗಳನ್ನು ಅನ್ವಯಿಸಲಾಯಿತು",
        "revdelete-unrestricted": "ನಿರ್ವಾಹಕರ ನಿಬಂಧನೆಗಳನ್ನು ತೆಗೆಯಲಾಯಿತು",
        "rightsnone": "(ಯಾವೂ ಇಲ್ಲ)",
+       "revdelete-summary": "ಸಂಪಾದನೆಯ ತಾತ್ಪರ್ಯ",
        "feedback-subject": "ವಿಷಯ:",
        "feedback-message": "ಸಂದೇಶ:",
        "duration-seconds": "$1 {{PLURAL:$1|ಕ್ಷಣ|ಕ್ಷಣಗಳು}}",
index bc0d91a..7d56808 100644 (file)
                        "관인생략",
                        "아라",
                        "Keysuck",
-                       "Infinity"
+                       "Infinity",
+                       "Bluemersen",
+                       "Revi"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "tog-hideminor": "최근 바뀜에서 사소한 편집을 숨기기",
-       "tog-hidepatrolled": "최근 바뀜에서 검토한 편집을 숨기기",
+       "tog-hidepatrolled": "최근 바뀜에서 점검한 편집을 숨기기",
        "tog-newpageshidepatrolled": "새 문서 목록에서 검토한 문서를 숨기기",
        "tog-extendwatchlist": "주시문서 목록에서 가장 최근의 편집만이 아닌 모든 편집을 보기",
        "tog-usenewrc": "최근 바뀜과 주시문서 목록의 문서별 그룹 바뀜",
@@ -55,6 +57,7 @@
        "tog-watchdefault": "내가 편집하는 문서와 파일을 주시문서 목록에 추가",
        "tog-watchmoves": "내가 이동하는 문서와 파일을 주시문서 목록에 추가",
        "tog-watchdeletion": "내가 삭제하는 문서와 파일을 주시문서 목록에 추가",
+       "tog-watchrollback": "내가 되돌리기 기능을 사용한 문서를 주시문서 목록에 추가",
        "tog-minordefault": "모든 편집에 기본적으로 사소한 편집을 표시",
        "tog-previewontop": "편집 상자 앞에 미리 보기 보이기",
        "tog-previewonfirst": "처음 편집할 때 미리 보기 보이기",
@@ -72,7 +75,7 @@
        "tog-watchlisthideminor": "주시문서 목록에서 사소한 편집을 숨기기",
        "tog-watchlisthideliu": "주시문서 목록에서 로그인한 사용자의 편집을 숨기기",
        "tog-watchlisthideanons": "주시문서 목록에서 익명 사용자의 편집을 숨기기",
-       "tog-watchlisthidepatrolled": "주시문서 목록에서 검토한 편집을 숨기기",
+       "tog-watchlisthidepatrolled": "주시문서 목록에서 점검한 편집을 숨기기",
        "tog-ccmeonemails": "이메일을 보낼 때 내 이메일로 복사본을 보내기",
        "tog-diffonly": "편집 차이를 비교할 때 문서 내용을 보지 않기",
        "tog-showhiddencats": "숨은 분류 보이기",
@@ -82,7 +85,7 @@
        "underline-always": "항상",
        "underline-never": "항상 치지 않기",
        "underline-default": "스킨 또는 브라우저 기본값",
-       "editfont-style": "í\8e¸ì§\91 ì°½의 글꼴:",
+       "editfont-style": "í\8e¸ì§\91 ì\98\81ì\97­의 글꼴:",
        "editfont-default": "브라우저 기본값",
        "editfont-monospace": "고정폭 글꼴",
        "editfont-sansserif": "산세리프 글꼴",
        "hidden-categories": "{{PLURAL:$1|숨은 분류}}",
        "hidden-category-category": "숨은 분류",
        "category-subcat-count": "{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|하위 분류}} $2개 가운데 $1개입니다.}}",
-       "category-subcat-count-limited": "이 분류에 {{PLURAL:$1|하위 분류}} $1개가 있습니다.",
+       "category-subcat-count-limited": "이 분류에 {{PLURAL:$1|하위 분류가|하위 분류 $1개가}} 있습니다.",
        "category-article-count": "{{PLURAL:$2|이 분류에는 문서 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|문서}} $2개 가운데 $1개입니다.}}",
-       "category-article-count-limited": "이 분류에 {{PLURAL:$1|문서}} $1개가 있습니다.",
+       "category-article-count-limited": "이 분류에 {{PLURAL:$1|문서가|문서 $1개가}} 있습니다.",
        "category-file-count": "{{PLURAL:$2|이 분류에는 파일 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|파일}} $2개 가운데 $1개입니다.}}",
-       "category-file-count-limited": "이 분류에 {{PLURAL:$1|파일}} $1개가 있습니다.",
+       "category-file-count-limited": "이 분류에 {{PLURAL:$1|파일이|파일 $1개가}} 있습니다.",
        "listingcontinuesabbrev": "(계속)",
        "index-category": "색인된 문서",
        "noindex-category": "색인에서 제외되는 문서",
        "morenotlisted": "이 목록은 완성되지 않았습니다.",
        "mypage": "문서",
        "mytalk": "토론",
-       "anontalk": "ì\9dµëª\85 사용자와 토론",
+       "anontalk": "ì\9d´ IP ì£¼ì\86\8cì\9d\98 사용자와 토론",
        "navigation": "둘러보기",
        "and": ",",
        "qbfind": "찾기",
        "delete": "삭제",
        "deletethispage": "이 문서 삭제하기",
        "undeletethispage": "이 문서를 되살리기",
-       "undelete_short": "{{PLURAL:$1|편집}} $1개 되살리기",
-       "viewdeleted_short": "{{PLURAL:$1|삭제된 편집}} $1개 보기",
+       "undelete_short": "{{PLURAL:$1|편집 한 개|편집 $1개}} 되살리기",
+       "viewdeleted_short": "{{PLURAL:$1|삭제된 편집 한 개|삭제된 편집 $1개}} 보기",
        "protect": "보호",
        "protect_change": "보호 수준 바꾸기",
        "protectthispage": "이 문서 보호하기",
        "otherlanguages": "다른 언어",
        "redirectedfrom": "($1에서 넘어옴)",
        "redirectpagesub": "넘겨주기 문서",
+       "redirectto": "넘겨줄 대상:",
        "lastmodifiedat": "이 문서는 $1 $2에 마지막으로 바뀌었습니다.",
        "viewcount": "이 문서는 {{PLURAL:$1|한 번|$1번}} 읽혔습니다.",
        "protectedpage": "보호된 문서",
        "privacypage": "Project:개인 정보 정책",
        "badaccess": "권한 오류",
        "badaccess-group0": "요청한 명령을 실행할 권한이 없습니다.",
-       "badaccess-groups": "요청한 명령은 {{PLURAL:$2|다음|다음 중 하나의}} 권한을 가진 사용자에게만 가능합니다: $1",
+       "badaccess-groups": "요청한 명령은 {{PLURAL:$2|다음|다음 중 하나의}} 권한을 가진 사용자에게 제한됩니다: $1.",
        "versionrequired": "미디어위키 $1 버전 필요",
        "versionrequiredtext": "이 문서를 사용하려면 $1 버전 미디어위키가 필요합니다.\n[[Special:Version|설치된 미디어위키 버전]]을 참고하세요.",
        "ok": "확인",
        "retrievedfrom": "원본 주소 \"$1\"",
-       "youhavenewmessages": "다른 사용자가 $1를 {{PLURAL:$3|남겼습니다}}. ($2)",
-       "youhavenewmessagesfromusers": "{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1를 {{PLURAL:$4|남겼습니다}}. ($2)",
-       "youhavenewmessagesmanyusers": "여러 사용자가 $1를 남겼습니다. ($2)",
+       "youhavenewmessages": "다른 사용자로부터의 $1가 {{PLURAL:$3|있습니다}}. ($2)",
+       "youhavenewmessagesfromusers": "{{PLURAL:$3|다른 사용자로|사용자 $3명으로}}부터의 $1가 {{PLURAL:$4|있습니다}}. ($2)",
+       "youhavenewmessagesmanyusers": "여러 사용자로부터의 $1가 있습니다. ($2)",
        "newmessageslinkplural": "{{PLURAL:$1|새 메시지}}",
        "newmessagesdifflinkplural": "마지막으로 {{PLURAL:$1|바뀐 내용}}",
        "youhavenewmessagesmulti": "다른 사용자가 $1에 남긴 새 메시지가 있습니다",
        "hidetoc": "숨기기",
        "collapsible-collapse": "접기",
        "collapsible-expand": "펼치기",
+       "confirmable-confirm": "{{GENDER:$1|}}확실합니까?",
+       "confirmable-yes": "예",
+       "confirmable-no": "아니오",
        "thisisdeleted": "$1 문서를 보거나 되살리겠습니까?",
        "viewdeleted": "$1 문서를 보겠습니까?",
-       "restorelink": "{{PLURAL:$1|삭제된 편집}} $1개",
+       "restorelink": "{{PLURAL:$1|삭제된 편집 한 개|삭제된 편집 $1개}}",
        "feedlinks": "피드:",
        "feed-invalid": "잘못된 구독 피드 방식입니다.",
-       "feed-unavailable": "피드 서비스를 사용할 수 없습니다",
+       "feed-unavailable": "피드 배달을 사용할 수 없습니다",
        "site-rss-feed": "$1 RSS 피드",
        "site-atom-feed": "$1 Atom 피드",
        "page-rss-feed": "\"$1\" RSS 피드",
        "nstab-template": "틀",
        "nstab-help": "도움말",
        "nstab-category": "분류",
-       "nosuchaction": "해당하는 명령이 없습니다.",
-       "nosuchactiontext": "URLì\9d´ ì§\80ì \95í\95\9c ëª\85ë ¹ì\9d´ ì\9e\98못ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.\nURLì\9d\84 ì\9e\98못 ì\9e\85ë ¥í\95\98ì\98\80ê±°ë\82\98, ì\9e\98못ë\90\9c ë§\81í\81¬ë¥¼ ë\94°ë\9d¼ê°\94ì\9d\84 ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\n{{SITENAME}}ì\9d\98 ë²\84ê·¸ì\9d¼ ì\88\98ë\8f\84 있습니다.",
+       "nosuchaction": "이러한 명령이 없습니다",
+       "nosuchactiontext": "URLì\97\90 ì§\80ì \95í\95\9c ëª\85ë ¹ì\9d´ ì\98¬ë°\94르ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤.\nURLì\9d\84 ì\9e\98못 ì\9e\85ë ¥í\96\88ê±°ë\82\98, ì\98¬ë°\94르ì§\80 ì\95\8aì\9d\80 ë§\81í\81¬ë¥¼ ë\94°ë\9d¼ê°\94ì\9d\84 ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\n{{SITENAME}}ì\97\90 ì\82¬ì\9a©í\95\98ë\8a\94 ì\86\8cí\94\84í\8a¸ì\9b¨ì\96´ì\9d\98 ë²\84ê·¸ê°\80 ì\9e\88ì\9d\84 ì\88\98 있습니다.",
        "nosuchspecialpage": "해당하는 특수 문서가 없습니다.",
        "nospecialpagetext": "<strong>요청한 특수 문서가 존재하지 않습니다.</strong>\n\n특수 문서의 목록은 [[Special:SpecialPages|여기]]에서 볼 수 있습니다.",
        "error": "오류",
        "databaseerror-query": "쿼리: $1",
        "databaseerror-function": "함수: $1",
        "databaseerror-error": "오류: $1",
-       "laggedslavemode": "'''경고:''' 문서가 최근에 바뀐 내용을 포함하지 않을 수도 있습니다.",
+       "laggedslavemode": "<strong>경고:</strong> 문서가 최근에 바뀐 내용을 포함하지 않을 수도 있습니다.",
        "readonly": "데이터베이스 잠김",
        "enterlockreason": "데이터베이스를 잠그는 이유와 예상되는 기간을 적어 주세요.",
        "readonlytext": "데이터베이스가 잠겨 있어서 문서를 편집할 수 없습니다. 데이터베이스 관리가 끝난 후에는 정상으로 돌아올 것입니다.\n\n관리자가 데이터베이스를 잠글 때 남긴 메시지는 다음과 같습니다: $1",
        "filedeleteerror": "\"$1\" 파일을 삭제할 수 없습니다.",
        "directorycreateerror": "\"$1\" 디렉터리를 만들 수 없습니다.",
        "filenotfound": "\"$1\" 파일을 찾을 수 없습니다.",
-       "unexpected": "예기치 못한 값: \"$1\"=\"$2\"",
+       "unexpected": "예기치 않은 값: \"$1\"=\"$2\".",
        "formerror": "오류: 양식을 제출할 수 없습니다.",
-       "badarticleerror": "해당 명령은 이 문서에서 실행할 수 없습니다.",
+       "badarticleerror": "이 명령은 이 문서에서 수행할 수 없습니다.",
        "cannotdelete": "\"$1\" 문서나 파일을 삭제할 수 없습니다.\n이미 삭제되었을 수도 있습니다.",
        "cannotdelete-title": "\"$1\" 문서를 삭제할 수 없습니다.",
        "delete-hook-aborted": "훅이 삭제를 중단했습니다.\n아무런 설명도 주어지지 않았습니다.",
        "no-null-revision": "\"$1\" 문서에 대한 새 빈 판을 만들 수 없습니다",
        "badtitle": "잘못된 제목",
        "badtitletext": "요청한 문서 제목이 잘못되었거나, 비어있거나, 잘못된 인터위키 제목으로 링크했습니다.\n문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.",
-       "perfcached": "ë\8b¤ì\9d\8c ì\9e\90ë£\8cë\8a\94 ìº\90ì\8b\9cë\90\9c ê²\83ì\9d´ë¯\80ë¡\9c ì\83\88ë¡\9c ë°\94ë\80\90 ë\82´ì\9a©ì\9d\84 ë°\98ì\98\81í\95\98ì§\80 ëª»í\95  ì\88\98ë\8f\84 ì\9e\88ì\8aµë\8b\88ë\8b¤. ìº\90ì\8b\9cì\97\90 ìµ\9cë\8c\80 {{PLURAL:$1|$1ê°\9cì\9d\98 ê²°ê³¼}}가 있습니다.",
-       "perfcachedts": "ë\8b¤ì\9d\8c ì\9e\90ë£\8cë\8a\94 ìº\90ì\8b\9cë\90\9c ê²\83ì\9c¼ë¡\9c, $1ì\97\90 ë§\88ì§\80ë§\89ì\9c¼ë¡\9c ì\83\88ë¡\9c ê³ ì³\90ì¡\8cì\8aµë\8b\88ë\8b¤. ìº\90ì\8b\9cì\97\90 ìµ\9cë\8c\80 {{PLURAL:$4|결과 $4개}}가 있습니다.",
-       "querypage-no-updates": "ì\9d´ ë¬¸ì\84\9cì\9d\98 ì\83\88ë¡\9c ê³ ì¹¨ì\9d´ í\98\84ì\9e¬ ë¹\84í\99\9cì\84±í\99\94ë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9d´ ë¬¸ì\84\9cì\9d\98 ì\9e\90ë£\8c를 ì\9e ì\8b\9c ë\8f\99ì\95\88 새로 고치지 않을 것입니다.",
+       "perfcached": "ë\8b¤ì\9d\8c ì\9e\90ë£\8cë\8a\94 ìº\90ì\8b\9cë\90\9c ê²\83ì\9d´ë©° ìµ\9cì\8b ì\9d´ ì\95\84ë\8b\90 ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤. ìº\90ì\8b\9cì\97\90 ìµ\9cë\8c\80 {{PLURAL:$1|ê²°ê³¼ í\95\9c ê°\9c|ê²°ê³¼ $1ê°\9c}}가 있습니다.",
+       "perfcachedts": "ë\8b¤ì\9d\8c ì\9e\90ë£\8cë\8a\94 ìº\90ì\8b\9cë\90\9c ê²\83ì\9c¼ë¡\9c, $1ì\97\90 ë§\88ì§\80ë§\89ì\9c¼ë¡\9c ì\97\85ë\8d°ì\9d´í\8a¸ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤. ìº\90ì\8b\9cì\97\90 ìµ\9cë\8c\80 {{PLURAL:$4|ê²°ê³¼ í\95\9c ê°\9c|결과 $4개}}가 있습니다.",
+       "querypage-no-updates": "ì\9d´ ë¬¸ì\84\9cì\9d\98 ì\83\88ë¡\9c ê³ ì¹¨ì\9d´ í\98\84ì\9e¬ ë¹\84í\99\9cì\84±í\99\94ë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9e\90ë£\8cê°\80 ì\9e ì\8b\9c 새로 고치지 않을 것입니다.",
        "viewsource": "원본 보기",
        "viewsource-title": "$1 문서 원본 보기",
        "actionthrottled": "동작 중지",
        "invalidtitle-knownnamespace": "제목 오류: \"$2\" 이름공간과 \"$3\" 텍스트",
        "invalidtitle-unknownnamespace": "제목 오류: 알 수 없는 $1 이름공간 번호와, \"$2\" 텍스트",
        "exception-nologin": "로그인하지 않음",
-       "exception-nologin-text": "ì\9d´ ë¬¸ì\84\9cì\97\90 ì \91ê·¼í\95\98ê±°ë\82\98 ì\9d´ ëª\85ë ¹ì\9d\84 ì\88\98í\96\89í\95\98려면 [[Special:Userlogin|ë¡\9cê·¸ì\9d¸]]하세요.",
+       "exception-nologin-text": "ì\9d´ ë¬¸ì\84\9cì\97\90 ì \91ê·¼í\95\98ê±°ë\82\98 ì\9d´ ë\8f\99ì\9e\91ì\9d\84 ì\88\98í\96\89í\95\98려면 ë¡\9cê·¸ì\9d¸하세요.",
        "exception-nologin-text-manual": "이 문서에 접근하거나 이 명령을 수행하려면 $1하세요.",
        "virus-badscanner": "잘못된 설정: 알 수 없는 바이러스 검사기: '''$1'''",
        "virus-scanfailed": "검사 실패 (코드 $1)",
-       "virus-unknownscanner": "알 수 없는 백신 소프트웨어:",
-       "logouttext": "'''지금 로그아웃했습니다.'''\n\n브라우저 캐시를 지우지 않으면 일부 문서에서 로그인이 되어 있는 것처럼 보일 수 있습니다.",
+       "virus-unknownscanner": "알 수 없는 안티 바이러스:",
+       "logouttext": "<strong>지금 로그아웃했습니다.</strong>\n\n브라우저 캐시를 지우지 않으면 일부 문서에서 로그인이 되어 있는 것처럼 보일 수 있습니다.",
        "welcomeuser": "$1님, 환영합니다!",
        "welcomecreation-msg": "계정이 만들어졌습니다.\n[[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.",
        "yourname": "사용자 이름:",
        "loginerror": "로그인 오류",
        "createacct-error": "계정 만들기 오류",
        "createaccounterror": "계정을 만들수 없습니다: $1",
-       "nocookiesnew": "사용자 계정을 만들었지만, 아직 로그인하지 않았습니다.\n{{SITENAME}}에서는 로그인 정보를 저장하기 위해 쿠키를 사용합니다.\n지금 사용하는 웹 브라우저는 쿠키를 사용하지 않도록 설정되어 있습니다.\n로그인하기 전에 웹 브라우저에서 쿠키를 사용하도록 설정해주세요.",
+       "nocookiesnew": "사용자 계정을 만들었지만, 아직 로그인하고 있지 않습니다.\n{{SITENAME}}에서는 로그인 정보를 저장하기 위해 쿠키를 사용합니다.\n지금 사용하는 웹 브라우저는 쿠키를 사용하지 않도록 설정되어 있습니다.\n로그인하기 전에 웹 브라우저에서 쿠키를 사용하도록 설정해주세요.",
        "nocookieslogin": "{{SITENAME}}에서는 로그인을 위해 쿠키를 사용합니다.\n쿠키가 비활성되어 있습니다.\n쿠키 사용을 활성화한 다음 다시 시도하세요.",
        "nocookiesfornew": "요청의 출처를 확인할 수 없기 때문에 사용자 계정이 만들어지지 않았습니다.\n쿠키를 허용한 것을 확인한 후에 이 문서를 새로 고치고 나서 다시 시도하세요.",
        "noname": "사용자 계정 이름이 올바르지 않습니다.",
        "createaccount-text": "누군가가 {{SITENAME}} ($4)에서 사용자 이름 \"$2\", 비밀번호 \"$3\"로 당신의 이메일 주소가 등록된 계정을 만들었습니다. \n지금 로그인하여 비밀번호를 바꾸십시오.\n\n실수로 계정을 잘못 만들었다면 이 메시지는 무시해도 됩니다.",
        "login-throttled": "로그인에 연속으로 실패하였습니다.\n$1 기다렸다가 다시 시도하세요.",
        "login-abort-generic": "로그인에 실패했습니다 - 중지됨",
+       "login-migrated-generic": "당신의 계정이 마이그레이션되었으며, 당신의 사용자 이름이 더 이상 이 위키에 존재하지 않습니다.",
        "loginlanguagelabel": "언어: $1",
        "suspicious-userlogout": "브라우저에 이상이 있거나 캐싱 프록시에서 로그아웃을 요청했기 때문에 로그아웃이 거부되었습니다.",
        "createacct-another-realname-tip": "실명은 선택 사항입니다.\n실명을 입력하면 문서 기여에 사용자의 이름이 들어가게 됩니다.",
        "passwordreset-emailsent-capture": "비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.",
        "passwordreset-emailerror-capture": "비밀번호 재설정 이메일이 생성되어 아래에 보여져 있지만, {{GENDER:$2|사용자}}에게 발송하는 데에는 실패했습니다: $1",
        "changeemail": "이메일 주소 바꾸기",
-       "changeemail-header": "계정 이메일 주소 바꾸기",
        "changeemail-text": "이메일 주소를 바꾸려면 이 양식을 채우세요. 이 바뀜을 확인하기 위해 비밀번호를 입력해야 합니다.",
        "changeemail-no-info": "이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.",
        "changeemail-oldemail": "현재 이메일 주소 :",
        "changeemail-none": "(없음)",
        "changeemail-password": "{{SITENAME}} 비밀번호:",
        "changeemail-submit": "이메일 주소 바꾸기",
-       "changeemail-cancel": "취소",
        "changeemail-throttled": "로그인에 연속으로 너무 많이 실패하였습니다.\n$1 기다렸다가 다시 시도하세요.",
        "resettokens": "토큰 재설정",
        "resettokens-text": "여기에 당신의 계정과 관련된 특정 개인 데이터에 접근을 허용하는 토큰을 재설정합니다.\n\n토큰이 다른 사람에게 알려졌거나 계정이 침해되었을 때는 재설정해야 합니다.",
        "showpreview": "미리 보기",
        "showdiff": "차이 보기",
        "blankarticle": "<strong>경고:</strong> 만들려는 문서가 비어 있습니다.\n\"{{int:savearticle}}\"을 다시 클릭하면, 문서에 내용이 없이 만들어집니다.",
-       "anoneditwarning": "'''경고''': 로그인하고 있지 않습니다.\nIP 주소가 문서 역사에 남게 됩니다.",
-       "anonpreviewwarning": "'''로그인하고 있지 않습니다. 문서를 저장하면 당신의 IP 주소가 문서 역사에 남게 됩니다.'''",
+       "anoneditwarning": "<strong>경고:</strong> 로그인하고 있지 않습니다. 편집하면 당신의 IP 주소가 공개적으로 보여집니다. <strong>[$1 로그인]</strong>하거나 <strong>[$2 계정을 만들면]</strong>, 당신의 편집에 다른 이익과 함께, 사용자 이름이 표시됩니다.",
+       "anonpreviewwarning": "<em>로그인하고 있지 않습니다. 문서를 저장하면 당신의 IP 주소가 문서의 편집 역사에 남게 됩니다.</em>",
        "missingsummary": "'''알림:''' 편집 요약을 적지 않았습니다.\n이대로 \"{{int:savearticle}}\"을 클릭하면 편집 요약 없이 저장됩니다.",
        "missingcommenttext": "아래에 내용을 채워 넣어 주세요.",
        "missingcommentheader": "'''알림:''' 글의 제목을 입력하지 않았습니다.\n다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
        "yourtext": "당신의 편집",
        "storedversion": "현재 문서",
        "nonunicodebrowser": "'''경고: 웹 브라우저가 유니코드를 완벽하게 지원하지 않습니다.'''\n아스키가 아닌 문자가 16진수 코드로 나타날 수 있습니다.",
-       "editingold": "'''경고: 지금 이전 버전의 문서를 고치고 있습니다.'''\n이것을 저장하면 최근에 편집된 부분이 사라질 수 있습니다.",
+       "editingold": "<strong>경고: 이 문서의 오래된 판을 편집하고 있습니다.</strong>\n이것을 저장하면, 이 판 이후로 바뀐 모든 편집이 사라집니다.",
        "yourdiff": "차이",
        "copyrightwarning": "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).\n만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
        "copyrightwarning2": "{{SITENAME}}에서의 모든 기여는 다른 사용자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요.\n만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 내용에 대해서는 $1 문서를 읽어 주세요).\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
        "parser-template-recursion-depth-warning": "틀 반복 깊이 제한을 초과함 ($1)",
        "language-converter-depth-warning": "언어 변환기 실행 제한 초과($1)",
        "node-count-exceeded-category": "문서가 노드 횟수를 초과하였습니다.",
-       "node-count-exceeded-category-desc": "ë\85¸ë\93\9c í\9a\9fì\88\98를 ì´\88ê³¼í\95\98ë\8a\94 ë¬¸ì\84\9cì\9d\98 ë¶\84ë¥\98ì\9e\85니다.",
+       "node-count-exceeded-category-desc": "문ì\84\9cê°\80 ìµ\9cë\8c\80 ë\85¸ë\93\9c ì\88\98를 ì´\88ê³¼í\95©니다.",
        "node-count-exceeded-warning": "문서가 노드 수를 초과하였습니다.",
        "expansion-depth-exceeded-category": "문서가 확장 깊이를 초과하였습니다.",
-       "expansion-depth-exceeded-category-desc": "확장 깊이를 초과하는 문서의 분류입니다.",
+       "expansion-depth-exceeded-category-desc": "최대 확장 깊이를 초과하는 문서입니다.",
        "expansion-depth-exceeded-warning": "문서가 확장 깊이를 초과하였습니다",
        "parser-unstrip-loop-warning": "Unstrip의 반복을 감지했습니다",
        "parser-unstrip-recursion-limit": "Unstrip의 재귀 한도를 초과했습니다 ($1)",
        "rev-deleted-user": "(사용자 이름 삭제됨)",
        "rev-deleted-event": "(기록 동작이 제거됨)",
        "rev-deleted-user-contribs": "[사용자 이름 또는 IP 주소 삭제됨 -  기여 목록에서 편집이 숨겨짐]",
-       "rev-deleted-text-permission": "해당 편집이 문서 역사에서 '''삭제'''되었습니다.\n자세한 사항은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 볼 수 있습니다.",
-       "rev-deleted-text-unhide": "해당 편집이 문서 역사에서 '''삭제'''되었습니다.\n자세한 사항은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 볼 수 있습니다.\n이 편집을 보기를 원하신다면 [$1 해당 편집]을 볼 수 있습니다.",
-       "rev-suppressed-text-unhide": "해당 편집이 문서 역사에서 '''숨겨져''' 있습니다.\n자세한 사항은 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 숨김 기록]에서 볼 수 있습니다.\n이 편집을 보기를 원하신다면 [$1 해당 편집]을 볼 수 있습니다.",
-       "rev-deleted-text-view": "이 문서의 편집은 역사에서 '''삭제'''되었습니다.\n삭제된 편집을 볼 수 있으며 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 자세한 내용을 볼 수 있습니다.",
-       "rev-suppressed-text-view": "이 문서의 편집은 역사에서 '''숨겨져''' 있습니다.\n숨겨진 편집을 볼 수 있으며 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 숨김 기록]에서 자세한 내용을 볼 수 있습니다.",
+       "rev-deleted-text-permission": "이 문서의 판은 <strong>삭제되어</strong> 있습니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 찾을 수 있습니다.",
+       "rev-suppressed-text-permission": "이 문서의 판은 <strong>숨겨져</strong> 있습니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 숨김 기록]에서 찾을 수 있습니다.",
+       "rev-deleted-text-unhide": "이 문서의 판이 <strong>삭제되어</strong> 있습니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 찾을 수 있습니다.\n이 판을 보기를 원한다면 여전히 [$1 해당 판]을 볼 수 있습니다.",
+       "rev-suppressed-text-unhide": "이 문서의 판이 <strong>숨겨져</strong> 있습니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 숨김 기록]에서 찾을 수 있습니다.\n이 판을 보기를 원한다면 여전히 [$1 해당 판]을 볼 수 있습니다.",
+       "rev-deleted-text-view": "이 문서의 판은 <strong>삭제되어</strong> 있습니다.\n삭제된 판을 볼 수 있으며 자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 찾을 수 있습니다.",
+       "rev-suppressed-text-view": "이 문서의 판은 <strong>숨겨져</strong> 있습니다.\n숨겨진 판을 볼 수 있으며 자세한 내용은 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 숨김 기록]에서 찾을 수 있습니다.",
        "rev-deleted-no-diff": "특정 판이 문서 역사에서 '''삭제'''되었기 때문에 비교할 수 없습니다.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 자세한 내용을 볼 수 있습니다.",
        "rev-suppressed-no-diff": "두 판 중 일부가 '''삭제'''되었기 때문에 문서 편집 내용을 비교할 수 없습니다.",
        "rev-deleted-unhide-diff": "이 비교에 사용된 판 가운데 하나가 '''삭제'''되었습니다.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에 자세한 내용을 찾아볼 수 있습니다.\n계속 작업하고 싶다면 여전히 [$1 비교 보기]를 계속할 수 있습니다.",
        "search-file-match": "(내용이 일치하는 파일 있음)",
        "search-suggest": "$1 문서를 찾고 있으신가요?",
        "search-interwiki-caption": "자매 프로젝트",
-       "search-interwiki-default": "$1 로부터의 결과:",
+       "search-interwiki-default": "$1로부터의 결과:",
        "search-interwiki-more": "(더 보기)",
        "search-relatedarticle": "관련",
        "searchrelated": "관련",
        "searchall": "모두",
        "showingresults": "'''$2'''번 부터의 {{PLURAL:$1|결과 '''1'''개|결과 '''$1'''개}}입니다.",
        "showingresultsinrange": "#<strong>$2</strong>부터 #<strong>$3</strong>까지의 범위에서 <strong>$1</strong>개의 {{PLURAL:$1|결과}}가 아래에 보입니다.",
-       "showingresultsheader": "'''$4''' 검색어에 대한 {{PLURAL:$5|결과 '''$3'''개 중 '''$1'''개|결과 '''$3'''개 중 '''$1 - $2'''번째}}",
+       "search-showingresults": "{{PLURAL:$4|결과 <strong>$3</strong>개 중 <strong>$1</strong>개|결과 <strong>$3</strong>개 중 <strong>$1 - $2</strong>개}}",
        "search-nonefound": "검색어와 일치하는 결과가 없습니다.",
        "powersearch-legend": "고급 검색",
        "powersearch-ns": "다음 이름공간에서 검색:",
        "powersearch-toggleall": "모두",
        "powersearch-togglenone": "모두 제외",
        "powersearch-remember": "향후 검색에 선택 기억하기",
-       "search-external": "바깥에서 검색",
+       "search-external": "바깥 검색",
        "searchdisabled": "{{SITENAME}} 검색이 비활성화되어 있습니다.\n검색이 작동하지 않는 동안에는 Google(구글)을 통해 검색할 수 있습니다.\n검색 엔진의 내용은 최신이 아닐 수 있다는 점을 참고하세요.",
        "search-error": "검색하는 동안 오류가 발생했습니다: $1",
        "preferences": "사용자 환경 설정",
        "mypreferences": "환경 설정",
        "prefs-edits": "편집 수:",
-       "prefsnologintext2": "사용자 환경 설정을 설정하려면 $1하십시오.",
+       "prefsnologintext2": "사용자 환경 설정을 바꾸려면 로그인하세요.",
        "prefs-skin": "스킨",
        "skin-preview": "미리 보기",
        "datedefault": "설정하지 않음",
        "prefs-changeemail": "이메일 주소 바꾸기",
        "prefs-setemail": "이메일 주소 설정하기",
        "prefs-email": "이메일 설정",
-       "prefs-rendering": "문서 보기 설정",
+       "prefs-rendering": "문서 보기 설정",
        "saveprefs": "저장",
        "restoreprefs": "(모든 부분에서) 모두 기본 설정으로 되돌리기",
        "prefs-editing": "편집 상자",
        "prefs-files": "파일",
        "prefs-custom-css": "사용자 CSS",
        "prefs-custom-js": "사용자 자바스크립트",
-       "prefs-common-css-js": "모든 스킨에 대한 공통 CSS/자바스크립트:",
+       "prefs-common-css-js": "모든 스킨에 공유된 CSS/자바스크립트:",
        "prefs-reset-intro": "이 페이지를 사용해 사이트 기본값으로 환경 설정을 재설정할 수 있습니다.\n이는 되돌릴 수 없습니다.",
        "prefs-emailconfirm-label": "이메일 인증:",
        "youremail": "이메일:",
        "prefs-tokenwatchlist": "토큰",
        "prefs-diffs": "차이",
        "prefs-help-prefershttps": "이 사용자 환경 설정은 다음 로그인부터 적용됩니다.",
+       "prefswarning-warning": "사용자 환경 설정에서 바뀐 것이 아직 저장되어 있지 않습니다.\n사용자 환경 설정에서 \"$1\"을 클릭하지 않고 이 페이지를 떠나면 바뀌지 않습니다.",
        "prefs-tabs-navigation-hint": "팁: 탭 목록에서 탭 사이를 둘러보려면 왼쪽과 오른쪽 화살표 키를 사용할 수 있습니다.",
        "email-address-validity-valid": "이메일 주소가 올바른 것으로 보입니다",
        "email-address-validity-invalid": "올바른 이메일 주소를 입력하세요",
        "right-deletedtext": "삭제된 문서의 내용과 편집상의 차이를 보기",
        "right-browsearchive": "삭제된 문서 검색",
        "right-undelete": "삭제된 문서 되살리기",
-       "right-suppressrevision": "관리자가 보지 못하도록 숨겨진 판을 검토하고 되살리기",
+       "right-suppressrevision": "어떤 사용자도 보지 못하도록 숨겨진 판을 검토하고 되살리기",
        "right-viewsuppressed": "어떤 사용자가 숨긴 판 보기",
        "right-suppressionlog": "숨겨진 기록을 보기",
        "right-block": "다른 사용자가 편집을 못하도록 차단",
        "right-noratelimit": "속도 제한에 영향을 받지 않음",
        "right-import": "다른 위키에서 문서 가져오기",
        "right-importupload": "파일 올리기를 통해 문서 가져오기",
-       "right-patrol": "다른 사용자의 편집을 검토",
-       "right-autopatrol": "자신의 편집을 자동으로 검토",
-       "right-patrolmarks": "최근 바뀜에서 검토 표시를 보기",
+       "right-patrol": "다른 사용자의 편집을 점검된 것으로 표시",
+       "right-autopatrol": "자신의 편집을 자동으로 점검된 판으로 표시",
+       "right-patrolmarks": "최근 바뀜에서 점검 표시를 보기",
        "right-unwatchedpages": "주시되지 않은 문서 목록 보기",
        "right-mergehistory": "문서의 역사를 합침",
        "right-userrights": "사용자의 모든 권한 조정",
        "action-rollback": "특정 문서를 마지막으로 편집한 사용자의 모든 편집을 간편하게 되돌리기",
        "action-import": "다른 위키에서 문서 가져오기",
        "action-importupload": "파일 올리기를 통해 문서를 가져오기",
-       "action-patrol": "다른 사용자의 편집을 검토된 것으로 표시하기",
-       "action-autopatrol": "자신의 편집을 검토된 것으로 표시할",
+       "action-patrol": "다른 사용자의 편집을 점검된 것으로 표시할",
+       "action-autopatrol": "자신의 편집을 점검된 것으로 표시할",
        "action-unwatchedpages": "주시되지 않은 문서 목록 보기",
        "action-mergehistory": "이 문서의 역사 합치기",
        "action-userrights": "사용자의 모든 권한 조정",
        "recentchanges-feed-description": "이 피드에 위키의 최근 바뀜을 추적합니다.",
        "recentchanges-label-newpage": "새로 만든 문서",
        "recentchanges-label-minor": "사소한 편집",
-       "recentchanges-label-bot": "ë´\87ì\9d\98 편집",
-       "recentchanges-label-unpatrolled": "ì\95\84ì§\81 ì\88\9cì°°하지 않은 편집",
+       "recentchanges-label-bot": "ë´\87ì\9d´ ì\88\98í\96\89í\95\9c 편집",
+       "recentchanges-label-unpatrolled": "ì\95\84ì§\81 ì \90ê²\80하지 않은 편집",
        "recentchanges-label-plusminus": "바이트로 표기된 바뀐 문서 크기",
        "recentchanges-legend-heading": "'''범례:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|새 문서 목록]]도 보세요)",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "다음은 <strong>$2</strong>에서부터 바뀐 문서 <strong>$1</strong>개입니다.",
+       "rcnotefrom": "아래는 <strong>$3, $4</strong>부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 <strong>$1</strong>개가 보여집니다)",
        "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
        "rcshowhideminor": "사소한 편집을 $1",
        "rcshowhideminor-show": "보이기",
        "rcshowhideanons": "익명 사용자를 $1",
        "rcshowhideanons-show": "보이기",
        "rcshowhideanons-hide": "숨기기",
-       "rcshowhidepatr": "ì\88\9cì°°ë\90\9c í\8e¸ì§\91ì\9d\84 $1",
+       "rcshowhidepatr": "ì \90ê²\80í\95\9c í\8e¸ì§\91ì\9d\84 $1",
        "rcshowhidepatr-show": "보이기",
        "rcshowhidepatr-hide": "숨기기",
        "rcshowhidemine": "내 편집을 $1",
        "nolicense": "선택하지 않음",
        "licenses-edit": "라이선스 옵션 편집",
        "license-nopreview": "(미리 보기 불가능)",
-       "upload_source_url": "(올바르고, 공개적으로 접근할 수 있는 URL)",
+       "upload_source_url": "(올바르고, 공개적으로 접근할 수 있는 URL에서 선택한 파일)",
        "upload_source_file": "(당신의 컴퓨터에서 선택한 파일)",
        "listfiles-delete": "삭제",
        "listfiles-summary": "이 특수 문서는 모든 올려진 파일을 보여줍니다.",
        "filedelete-maintenance-title": "파일을 삭제할 수 없습니다",
        "mimesearch": "MIME 검색",
        "mimesearch-summary": "이 페이지는 MIME 유형에 해당하는 파일을 필터합니다.\n입력: 내용종류/하위종류나 내용종류/*, 예를 들어 <code>image/jpeg</code>",
-       "mimetype": "MIME 형식:",
+       "mimetype": "MIME 종류:",
        "download": "다운로드",
        "unwatchedpages": "주시되지 않는 문서 목록",
        "listredirects": "넘겨주기 문서 목록",
        "randomincategory": "분류 안의 임의 문서",
        "randomincategory-invalidcategory": "\"$1\"(은)는 올바른 분류 이름이 아닙니다.",
        "randomincategory-nopages": "[[:Category:$1]]에 문서가 없습니다.",
-       "randomincategory-selectcategory": "분류에서 임의 문서 얻기: $1 $2",
-       "randomincategory-selectcategory-submit": "보기",
+       "randomincategory-category": "분류:",
+       "randomincategory-legend": "분류 안의 임의 문서",
        "randomredirect": "임의 넘겨주기 문서로",
        "randomredirect-nopages": "\"$1\" 이름공간에서 해당하는 넘겨주기 문서가 없습니다.",
        "statistics": "통계",
        "booksources": "책 찾기",
        "booksources-search-legend": "책 원본 검색",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "검색",
+       "booksources-search": "검색",
        "booksources-text": "아래의 목록은 새 책이나 중고 책을 판매하는 바깥 사이트로, 원하는 책의 정보를 얻을 수 있습니다.",
        "booksources-invalid-isbn": "입력한 ISBN이 잘못된 것으로 보입니다. 원본과 대조해 보세요.",
        "specialloguserlabel": "작업 수행자:",
        "trackingcategories-desc": "분류 포함 기준",
        "noindex-category-desc": "문서는 그것과 그 플래그가 허용된 곳에 있는 이름공간에서 <code><nowiki>__NOINDEX__</nowiki></code> 특수 명령이 있기 때문에 로봇이 색인하지 않습니다.",
        "index-category-desc": "문서는 그것(과 플래그가 허용된 곳에 있는 이름공간에 있는 것)에 <code><nowiki>__INDEX__</nowiki></code>가 있어서, 정상적이지 않을 곳에 로봇에 의해 색인됩니다.",
-       "post-expand-template-inclusion-category-desc": "모든 틀을 확장하고 나서, 문서 크기가 <code>$wgMaxArticleSize</code>보다 커지므로, 어떤 틀은 확장하지 않았습니다.",
-       "post-expand-template-argument-category-desc": "틀 변수 (<code>{{{Foo}}}</code>와 같은, 중괄호가 세 개 있는 무언가)를 확장하고 나서, 문서는 <code>$wgMaxArticleSize</code>보다 커집니다.",
-       "expensive-parserfunction-category-desc": "(<code>#ifexist</code>와 같은) 느린 파서 함수가 너무 많이 문서에 포함되어 있습니다. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]를 보세요.",
-       "broken-file-category-desc": "ë\84ë¥\98ê°\80 ê¹¨ì§\84 í\8c\8cì\9d¼ ë§\81í\81¬ (í\8c\8cì\9d¼ì\9d´ ì¡´ì\9e¬í\95\98ì§\80 ì\95\8aì\9d\84 ë\95\8c í\8f¬í\95¨ë\90\98ë\8a\94 ë§\81í\81¬)ê°\80 ì\9e\88ë\8a\94 ë¬¸ì\84\9cê°\80 ì\9e\88ë\8b¤ë©´ ì¶\94ê°\80ë\90©ë\8b\88ë\8b¤.",
-       "hidden-category-category-desc": "기본적으로 문서에 분류 링크 상자가 보여지는 것에서 막기 위한, <code><nowiki>__HIDDENCAT__</nowiki></code>가 있는 분류입니다.",
+       "post-expand-template-inclusion-category-desc": "모든 틀을 전개하였을 때, 문서 크기가 <code>$wgMaxArticleSize</code>보다 커지므로, 어떤 틀은 전개하지 않았습니다.",
+       "post-expand-template-argument-category-desc": "틀 변수 (<code>{{{Foo}}}</code>와 같은, 중괄호가 세 개 있는 무언가)를 확장하고 나서 문서는 <code>$wgMaxArticleSize</code>보다 커집니다.",
+       "expensive-parserfunction-category-desc": "문서에 (<code>#ifexist</code>와 같은) 느린 파서 함수가 너무 많이 쓰이고 있습니다. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]를 보세요.",
+       "broken-file-category-desc": "문ì\84\9cì\97\90 ê¹¨ì§\84 í\8c\8cì\9d¼ ë§\81í\81¬ (í\8c\8cì\9d¼ì\9d´ ì¡´ì\9e¬í\95\98ì§\80 ì\95\8aì\9d\84 ë\95\8c í\8f¬í\95¨ë\90\98ë\8a\94 ë§\81í\81¬)를 í\8f¬í\95¨í\95©ë\8b\88ë\8b¤.",
+       "hidden-category-category-desc": "기본적으로 문서에 분류 링크 상자가 보여지는 것에서 막기 위한, 분류의 문서 내용에 <code><nowiki>__HIDDENCAT__</nowiki></code>를 포함합니다.",
        "trackingcategories-nodesc": "사용할 수 있는 설명이 없습니다.",
        "trackingcategories-disabled": "분류가 비활성화되어 있습니다",
        "mailnologin": "보낼 이메일 주소가 없음",
        "mywatchlist": "주시문서 목록",
        "watchlistfor2": "사용자:$1 $2",
        "nowatchlist": "주시하는 문서가 아직 없습니다.",
-       "watchlistanontext": "주시문서 목록을 보거나 고치려면 $1 하세요.",
+       "watchlistanontext": "주시문서 목록을 보거나 고치려면 로그인하세요.",
        "watchnologin": "로그인하지 않음",
        "addwatch": "주시문서 목록에 추가",
        "addedwatchtext": "\"[[:$1]]\" 문서를 [[Special:Watchlist|주시문서 목록]]에 추가했습니다.\n앞으로 이 문서나 관련된 토론 문서가 바뀌면 보일 것입니다.",
        "watchlist-details": "별도의 토론 문서를 세지 않고, 주시문서 목록에 {{PLURAL:$1|문서 $1개}}가 있습니다.",
        "wlheader-enotif": "이메일 알림 기능이 활성화되었습니다.",
        "wlheader-showupdated": "마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보입니다.",
-       "wlnote": "다음은 최근 {{PLURAL:$2|'''$2'''시간}} 동안 {{PLURAL:$1|바뀐 문서 '''$1'''개 입니다}}. ($3 $4 기준)",
-       "wlshowlast": "ìµ\9cê·¼ $1ì\8b\9cê°\84 $2ì\9d¼ ë\98\90ë\8a\94 $3 ë\8f\99ì\95\88ì\97\90 ë°\94ë\80\90 ë¬¸ì\84\9c ë³´ê¸°",
+       "wlnote": "$3 $4 기준으로, 아래에 최근 {{PLURAL:$2|한 시간|<strong>$2</strong>시간}} 동안 {{PLURAL:$1|마지막 바뀜이|마지막 바뀜 <strong>$1</strong>개가}} 있습니다.",
+       "wlshowlast": "ìµ\9cê·¼ $1ì\8b\9cê°\84 $2ì\9d¼ ë\8f\99ì\95\88ì\9d\98 ë°\94ë\80\9c ë³´ê¸°",
        "watchlist-options": "주시문서 목록 설정",
        "watching": "주시 추가 중…",
        "unwatching": "주시 해제 중…",
        "exbeforeblank": "비우기 전의 내용: \"$1\"",
        "delete-confirm": "\"$1\" 삭제",
        "delete-legend": "삭제",
-       "historywarning": "'''경고:''' 삭제하려는 문서에 이전 {{PLURAL:$1|편집 역사}} 약 $1개가 있습니다:",
+       "historywarning": "<strong>경고:</strong> 삭제하려고 하는 문서에 {{PLURAL:$1|판}} $1개의 역사가 있습니다:",
        "confirmdeletetext": "문서와 문서 역사를 삭제하려고 합니다.\n삭제하려는 문서가 맞는지, 이 문서를 삭제하는 것이 [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지를 확인해 주세요.",
        "actioncomplete": "동작 완료",
        "actionfailed": "명령 실패",
        "delete-edit-reasonlist": "삭제 이유 편집",
        "delete-toobig": "이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.\n편집 역사가 긴 문서를 삭제하면 {{SITENAME}}에 큰 혼란을 줄 수 있기 때문에 삭제할 수 없습니다.",
        "delete-warning-toobig": "이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.\n편집 역사가 긴 문서를 삭제하면 {{SITENAME}} 데이터베이스 동작에 큰 영향을 줄 수 있습니다.\n주의해 주세요.",
+       "deleteprotected": "이 문서가 잠겨 있기 때문에 삭제할 수 없습니다.",
        "deleting-backlinks-warning": "'''경고:''' 삭제하려는 문서가 [[Special:WhatLinksHere/{{FULLPAGENAME}}|다른 문서]]에 링크되어 있거나 끼워져 있습니다.",
        "rollback": "편집 되돌리기",
        "rollback_short": "되돌리기",
        "protect-othertime": "다른 기간:",
        "protect-othertime-op": "다른 기간",
        "protect-existing-expiry": "현재 만료 기간: $2 $3",
+       "protect-existing-expiry-infinity": "기존 만료 시간: 무기한",
        "protect-otherreason": "다른 이유/추가적인 이유:",
        "protect-otherreason-op": "다른 이유",
-       "protect-dropdown": "*ì\9d¼ë°\98ì \81ì\9d¸ ë³´í\98¸ ì\9d´ì\9c \n** ë¹\88ë²\88í\95\9c í\9b¼ì\86\90 í\96\89ì\9c\84\n** ë¹\88ë²\88í\95\9c ê´\91ê³  í\96\89ì\9c\84\n** 비생산적인 편집 분쟁\n** 방문이 많은 문서",
+       "protect-dropdown": "*ì\9d¼ë°\98ì \81ì\9d¸ ë³´í\98¸ ì\9d´ì\9c \n** ë¹\88ë²\88í\95\9c í\9b¼ì\86\90 í\96\89ì\9c\84\n** ë¹\88ë²\88í\9e\88 ê´\91고를 ë\84£ì\9d\8c\n** 비생산적인 편집 분쟁\n** 방문이 많은 문서",
        "protect-edit-reasonlist": "보호 이유 편집하기",
        "protect-expiry-options": "1시간:1 hour,1일:1 day,1주일:1 week,2주일:2 weeks,1개월:1 month,3개월:3 months,6개월:6 months,1년:1 year,무기한:infinite",
        "restriction-type": "권한:",
        "undeletepagetext": "다음 {{PLURAL:$1|문서는 삭제되었지만|문서 $1개는 삭제되었지만}} 아직 보관되어 있고 되살릴 수 있습니다.\n보관된 문서는 주기적으로 삭제될 것입니다.",
        "undelete-fieldset-title": "문서 되살리기",
        "undeleteextrahelp": "문서 역사 전체를 되살리려면 모든 체크박스의 선택을 해제하고 '''{{int:undeletebtn}}'''를 누르세요.\n특정한 버전만 되살리려면 되살리려는 버전을 선택하고 '''{{int:undeletebtn}}'''를 누르세요.",
-       "undeleterevisions": "{{PLURAL:$1|판}} $1개 보관 중",
+       "undeleterevisions": "{{PLURAL:$1|판}} $1개가 보존되어 있습니다",
        "undeletehistory": "문서를 되살리면 모든 역사가 같이 복구됩니다.\n문서가 삭제된 뒤 같은 이름의 문서가 만들어졌다면, 복구되는 역사는 지금 역사의 과거 부분에 나타날 것입니다.",
        "undeleterevdel": "복구하려는 문서의 최신판이 삭제되어 있는 경우 문서를 되살릴 수 없습니다.\n이러한 경우 삭제된 최신판 문서의 확인 상자를 선택 해제하거나 숨김을 해제해야 합니다.",
        "undeletehistorynoadmin": "이 문서는 삭제되었습니다.\n삭제된 이유와 삭제되기 전에 이 문서를 편집한 사용자가 아래에 나와 있습니다.\n삭제된 문서의 내용을 보려면 관리자 권한이 필요합니다.",
        "autoblockid": "자동 차단 #$1",
        "block": "사용자 차단",
        "unblock": "사용자 차단 해제",
-       "blockip": "사용자 차단",
+       "blockip": "{{GENDER:$1|사용자}} 차단",
        "blockip-legend": "사용자 차단",
        "blockiptext": "차단할 IP 주소나 사용자 이름을 아래에 적어 주세요.\n차단은 문서 훼손을 막기 위해, [[{{MediaWiki:Policy-url}}|정책]]에 의해서만 이루어져야 합니다.\n차단 이유를 같이 적어주세요(예: 특정 문서 훼손).",
        "ipaddressorusername": "IP 주소 또는 사용자 이름:",
        "ipb-unblock-addr": "$1 차단 해제하기",
        "ipb-unblock": "사용자 또는 IP 주소 차단 해제하기",
        "ipb-blocklist": "현재 차단 기록 보기",
-       "ipb-blocklist-contribs": "$1의 기여",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}}의 기여",
        "unblockip": "사용자 차단 해제",
        "unblockiptext": "아래의 양식에 차단 해제하려는 IP 주소나 사용자 이름을 입력하세요.",
        "ipusubmit": "차단 해제",
        "unblocked": "[[User:$1|$1]] 사용자의 차단을 해제했습니다.",
        "unblocked-range": "$1 대역이 차단 해제되었습니다.",
        "unblocked-id": "$1 차단이 해제되었습니다.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] 사용자가 차단 해제되었습니다.",
        "blocklist": "차단된 사용자 목록",
        "ipblocklist": "차단된 사용자",
        "ipblocklist-legend": "차단된 사용자 찾기",
        "import": "문서 가져오기",
        "importinterwiki": "다른 위키에서 문서 가져오기",
        "import-interwiki-text": "문서를 가져올 위키를 선택하고 문서 제목을 입력해주세요.\n편집 날짜와 편집자의 이름이 보존될 것입니다.\n모든 가져오기는 [[Special:Log/import|가져오기 기록]]에 기록될 것입니다.",
-       "import-interwiki-source": "원본 위키/문서:",
+       "import-interwiki-sourcewiki": "원본 위키:",
+       "import-interwiki-sourcepage": "원본 문서:",
        "import-interwiki-history": "이 문서의 모든 역사를 가져오기",
        "import-interwiki-templates": "모든 틀을 포함하기",
        "import-interwiki-submit": "가져오기",
        "import-upload": "XML 데이터 올리기",
        "import-token-mismatch": "세션 데이터가 손실되었습니다.\n다시 시도하세요.",
        "import-invalid-interwiki": "해당 위키에서 문서를 가져올 수 없습니다.",
-       "import-error-edit": "현재 문서를 편집할 권한이 없기 때문에 \"$1\" 문서를 불러올 수 없습니다.",
-       "import-error-create": "현재 문서를 만들 권한이 없기 때문에 \"$1\" 문서를 불러올 수 없습니다.",
-       "import-error-interwiki": "\"$1\" 문서는 제목이 바깥 링크(인터위키)용으로 할당되어 있기 때문에 가져오지 않습니다.",
-       "import-error-special": "\"$1\" 문서는 특수 문서에 속해 있기 때문에 가져오지 않습니다.",
-       "import-error-invalid": "\"$1\" ë¬¸ì\84\9cë\8a\94 ì \9c목ì\9d´ ì\9e\98못ë\90\98ì\97\88기 ë\95\8c문ì\97\90 ê°\80ì ¸ì\98¤ì§\80 ì\95\8a습니다.",
+       "import-error-edit": "문서를 편집할 수 없기 때문에 \"$1\" 문서를 가져올 수 없었습니다.",
+       "import-error-create": "문서를 만들 수 없기 때문에 \"$1\" 문서를 가져올 수 없었습니다.",
+       "import-error-interwiki": "\"$1\" ë¬¸ì\84\9cë\8a\94 ì \9c목ì\9d´ ë°\94ê¹¥ ë§\81í\81¬(ì\9d¸í\84°ì\9c\84í\82¤)ì\9a©ì\9c¼ë¡\9c í\95 ë\8b¹ë\90\98ì\96´ ì\9e\88기 ë\95\8c문ì\97\90 ê°\80ì ¸ì\98¤ì§\80 ì\95\8aì\95\98ì\8aµë\8b\88ë\8b¤.",
+       "import-error-special": "\"$1\" 문서는 문서가 허용하지 않는 특수 이름공간에 속해 있기 때문에 가져오지 않았습니다.",
+       "import-error-invalid": "\"$1\" ë¬¸ì\84\9cë\8a\94 ì\9d´ ì\9c\84í\82¤ì\97\90ì\84\9c ê°\80ì ¸ì\98¤ë ¤ê³  í\95\98ë\8a\94 ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d´ ì\98¬ë°\94르ì§\80 ì\95\8a기 ë\95\8c문ì\97\90 ê°\80ì ¸ì\98¤ì§\80 ì\95\8aì\95\98습니다.",
        "import-error-unserialize": "\"$1\" 문서의 $2 판이 일렬적이지 않습니다. $3 내용 모델을 사용하여 $4 형식으로 일렬화되도록 판을 보고했습니다.",
        "import-error-bad-location": "$3 내용 모델을 사용하는 $2 판을 이 위키의 \"$1\"에 저장할 수 없습니다. 모델을 문서에서 지원하지 않습니다.",
        "import-options-wrong": "잘못된 {{PLURAL:$2|선택 사항}}: <nowiki>$1</nowiki>",
        "importlogpage": "가져오기 기록",
        "importlogpagetext": "다른 위키에서 가져온 문서 기록입니다.",
        "import-logentry-upload": "사용자가 파일 올리기를 통해 [[$1]] 문서를 가져왔습니다",
-       "import-logentry-upload-detail": "{{PLURAL:$1|판}} $1개",
+       "import-logentry-upload-detail": "{{PLURAL:$1|판}} $1개를 가져왔습니다",
        "import-logentry-interwiki": "$1 문서를 다른 위키에서 가져왔습니다",
        "import-logentry-interwiki-detail": "$2에서 {{PLURAL:$1|판}} $1개를 가져왔습니다",
        "javascripttest": "자바스크립트 테스트",
        "print.css": "/* 이 CSS 설정은 인쇄 출력 화면에 적용됩니다 */",
        "noscript.css": "/* 이 CSS 설정은 자바스크립트를 비활성화한 사용자에 적용됩니다 */",
        "group-autoconfirmed.css": "/* 이 CSS 설정은 자동 인증된 사용자에만 적용됩니다 */",
+       "group-user.css": "/* 이 CSS 설정은 등록된 사용자에만 적용됩니다 */",
        "group-bot.css": "/* 이 CSS 설정은 봇에만 적용됩니다 */",
        "group-sysop.css": "/* 이 CSS 설정은 관리자에만 적용됩니다 */",
        "group-bureaucrat.css": "/* 이 CSS 설정은 사무관에만 적용됩니다 */",
        "common.js": "/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */",
        "group-autoconfirmed.js": "/* 이 자바스크립트 설정은 자동 인증된 사용자에만 적용됩니다 */",
+       "group-user.js": "/* 이 자바스크립트 설정은 등록된 사용자에만 적용됩니다 */",
        "group-bot.js": "/* 이 자바스크립트 설정은 봇에만 적용됩니다 */",
        "group-sysop.js": "/* 이 자바스크립트 설정은 관리자에만 적용됩니다 */",
        "group-bureaucrat.js": "/* 이 자바스크립트 설정은 사무관에만 적용됩니다 */",
        "pageinfo-category-pages": "문서 수",
        "pageinfo-category-subcats": "하위 분류 수",
        "pageinfo-category-files": "파일 수",
-       "markaspatrolleddiff": "검토한 문서로 표시",
-       "markaspatrolledtext": "이 문서를 검토한 것으로 표시",
-       "markedaspatrolled": "검토한 문서로 표시",
+       "markaspatrolleddiff": "점검한 문서로 표시",
+       "markaspatrolledtext": "이 문서를 점검한 것으로 표시",
+       "markedaspatrolled": "점검한 문서로 표시",
        "markedaspatrolledtext": "[[:$1]] 문서의 선택한 판을 순찰한 것으로 표시하였습니다.",
-       "rcpatroldisabled": "최근 바뀜 검토 기능 비활성화됨",
-       "rcpatroldisabledtext": "최근 바뀜 검토 기능은 현재 비활성화되어 있습니다.",
-       "markedaspatrollederror": "검토한 것으로 표시할 수 없습니다.",
-       "markedaspatrollederrortext": "검토한 것으로 표시할 판을 지정해야 합니다.",
-       "markedaspatrollederror-noautopatrol": "자신의 편집은 스스로 검토할 수 없습니다.",
-       "markedaspatrollednotify": "$1에 대한 바뀜을 검토한 것으로 표시했습니다.",
-       "markedaspatrollederrornotify": "검토한 것으로 표시를 실패했습니다.",
-       "patrol-log-page": "검토 기록",
-       "patrol-log-header": "문서 검토에 대한 기록입니다.",
-       "log-show-hide-patrol": "검토 기록을 $1",
+       "rcpatroldisabled": "최근 바뀜 점검 기능 비활성화됨",
+       "rcpatroldisabledtext": "최근 바뀜 점검 기능은 현재 비활성화되어 있습니다.",
+       "markedaspatrollederror": "점검한 것으로 표시할 수 없습니다.",
+       "markedaspatrollederrortext": "점검한 것으로 표시할 판을 지정해야 합니다.",
+       "markedaspatrollederror-noautopatrol": "자신의 편집은 스스로 점검할 수 없습니다.",
+       "markedaspatrollednotify": "$1에 대한 바뀜을 점검한 것으로 표시했습니다.",
+       "markedaspatrollederrornotify": "점검한 것으로 표시를 실패했습니다.",
+       "patrol-log-page": "점검 기록",
+       "patrol-log-header": "문서 점검에 대한 기록입니다.",
+       "log-show-hide-patrol": "점검 기록을 $1",
        "deletedrevision": "예전 $1 판이 삭제되었습니다.",
        "filedeleteerror-short": "파일 삭제 오류: $1",
        "filedeleteerror-long": "파일을 삭제하는 도중 오류가 발생했습니다:\n\n$1",
        "exif-urgency-low": "낮음 ($1)",
        "exif-urgency-high": "높음 ($1)",
        "exif-urgency-other": "사용자 정의 ($1)",
-       "watchlistall2": "모두",
        "namespacesall": "모두",
        "monthsall": "모든 달",
        "confirmemail": "이메일 주소 확인",
        "logentry-move-move-noredirect": "$1 사용자가 $3 문서를 넘겨주기를 만들지 않고 $4 문서로 {{GENDER:$2|옮겼습니다}}",
        "logentry-move-move_redir": "$1 사용자가 $3 문서를 $4 문서로 {{GENDER:$2|옮기면서}} 넘겨주기를 덮어썼습니다",
        "logentry-move-move_redir-noredirect": "$1 사용자가 $3 문서를 $4 문서로 넘겨주기를 남기지 않으면서 {{GENDER:$2|옮기면서}} 옮길 대상에 있던 넘겨주기를 덮어썼습니다",
-       "logentry-patrol-patrol": "$1 사용자가 $3 문서의 $4판을 검토한 것으로 {{GENDER:$2|표시했습니다}}",
-       "logentry-patrol-patrol-auto": "$1 사용자가 자동적으로 $3 문서의 $4판을 검토한 것으로 {{GENDER:$2|표시했습니다}}",
+       "logentry-patrol-patrol": "$1 사용자가 $3 문서의 $4판을 점검한 것으로 {{GENDER:$2|표시했습니다}}",
+       "logentry-patrol-patrol-auto": "$1 사용자가 자동적으로 $3 문서의 $4판을 점검한 것으로 {{GENDER:$2|표시했습니다}}",
        "logentry-newusers-newusers": "$1 사용자 계정을 {{GENDER:$2|만들었습니다}}",
        "logentry-newusers-create": "$1 사용자 계정을 {{GENDER:$2|만들었습니다}}",
        "logentry-newusers-create2": "$1 사용자가 $3 사용자 계정을 {{GENDER:$2|만들었습니다}}",
        "logentry-rights-rights": "$1 사용자가 $3 사용자의 권한을 $4에서 $5으로 {{GENDER:$2|바꾸었습니다}}",
        "logentry-rights-rights-legacy": "$1 사용자가 $3 사용자의 권한을 {{GENDER:$2|바꾸었습니다}}",
        "logentry-rights-autopromote": "$1 사용자의 권한을 자동적으로 $4에서 $5으로 {{GENDER:$2|바꾸었습니다}}",
+       "logentry-upload-upload": "$1 사용자가 $3 파일을 {{GENDER:$2|올렸습니다}}",
+       "logentry-upload-overwrite": "$1 사용자가 $3의 새 판을 {{GENDER:$2|올렸습니다}}",
+       "logentry-upload-revert": "$1 사용자가 $3 파일을 {{GENDER:$2|올렸습니다}}",
        "rightsnone": "(없음)",
+       "revdelete-summary": "편집 요약",
        "feedback-bugornote": "기술적 문제를 구체적으로 설명할 준비가 되었다면 [$1 버그를 신고]해 주세요.\n아니면 아래에 쉬운 양식을 쓸 수 있습니다. 의견은 사용자 이름과 함께 \"[$3 $2]\"에 남겨질 것입니다.",
        "feedback-subject": "제목:",
        "feedback-message": "내용:",
        "action-pagelang": "문서 언어 바꾸기",
        "log-name-pagelang": "언어 바꾸기 기록",
        "log-description-pagelang": "문서 언어를 바꾼 기록입니다.",
-       "logentry-pagelang-pagelang": "$1 사용자가 $3의 문서 언어를 $4에서 $5로 {{GENDER:$2|바꾸었습니다}}."
+       "logentry-pagelang-pagelang": "$1 사용자가 $3의 문서 언어를 $4에서 $5로 {{GENDER:$2|바꾸었습니다}}.",
+       "default-skin-not-found": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치에는 다음 스킨이 포함된 것으로 보입니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.\n\n$2\n\n; 미디어위키를 설치했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 프로그램]을 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다.\n\n; 미디어위키를 업그레이드했다면:\n: 미디어위키 1.24와 새 버전은 더 이상 설치된 스킨을 자동으로 활성화하지 않습니다 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: 스킨 자동발견]을 보세요). 현재 설치된 스킨을 모두 활성화하려면 <code>LocalSettings.php</code> 안에 다음 줄을 붙여 넣을 수 있습니다:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>를 수정했다면:\n: 스킨 이름에 오타가 났는지 다시 확인하세요.",
+       "default-skin-not-found-no-skins": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치된 스킨은 없습니다.\n\n; 미디어위키를 설치했거나 업그레이드했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. 미디어위키 1.24와 새 버전은 주 저장소에 어떠한 스킨도 포함되어 있지 않습니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 프로그램]을 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (활성화)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''비활성화''')",
+       "mediastatistics": "미디어 통계",
+       "mediastatistics-summary": "올려진 파일 유형에 대한 통계입니다. 이 통계는 파일의 가장 최신 판만을 포함합니다. 오래되거나 삭제된 파일의 판은 제외됩니다.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 바이트}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME 종류",
+       "mediastatistics-table-extensions": "가능한 확장 기능",
+       "mediastatistics-table-count": "파일 수",
+       "mediastatistics-table-totalbytes": "압축된 크기",
+       "mediastatistics-header-unknown": "알 수 없음",
+       "mediastatistics-header-bitmap": "비트맵 그림",
+       "mediastatistics-header-drawing": "드로잉 (벡터 그램)",
+       "mediastatistics-header-audio": "소리",
+       "mediastatistics-header-video": "동영상",
+       "mediastatistics-header-multimedia": "리치 미디어",
+       "mediastatistics-header-office": "오피스",
+       "mediastatistics-header-text": "텍스트",
+       "mediastatistics-header-executable": "실행 파일",
+       "mediastatistics-header-archive": "압축 파일",
+       "json-warn-trailing-comma": "뒤 {{PLURAL:$1|쉼표}} $1개가 JSON에서 제거되었습니다",
+       "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": "인코딩할 수 없는 유형의 값을 받았습니다"
 }
index d027276..bd0d9a6 100644 (file)
        "passwordreset-emailsent-capture": "Ийилген пароль эсгертиу e-mail тюбюрекде берилибди.",
        "passwordreset-emailerror-capture": "Пароль эсгертиу e-mail генерация этилди (тюбюрекде берилибди), аны {{GENDER:$2|къошулуучугъа}} ашырыу джетишимсиз болду, чурум: $1",
        "changeemail": "Электрон почтаны адресин ауушдур",
-       "changeemail-header": "Электрон почтаны адресин ауушдуруу",
        "changeemail-text": "Сизни e-mail адресигизни тюрлендирир ючюн бу форманы толтуругъуз. Тюрлениуню бегитир ючюн паролну джазаргъа керек боллукъду.",
        "changeemail-no-info": "Бу бетни кёрюр ючюн сиз системагъа тергеу джазыуугъуз (аккаунтугъуз) бла кирирге керексиз.",
        "changeemail-oldemail": "Почтаны бусагъатдагъы адреси:",
        "changeemail-none": "(джокъ)",
        "changeemail-password": "«{{SITENAME}}» проектде паролугъуз:",
        "changeemail-submit": "Адресни тюрлендир",
-       "changeemail-cancel": "Ызына алыу",
        "resettokens": "Токенлени джибер",
        "resettokens-legend": "Токенлени джибер",
        "resettokens-tokens": "Токенле:",
        "searchrelated": "бейламлы",
        "searchall": "бютеу",
        "showingresults": "Тюбюрек №&nbsp;<strong>$2</strong> башлаб <strong>$1</strong> {{PLURAL:$1|1=эсеб|эсебле}} {{PLURAL:$1|1=кёргюзюлгенди|кёргюзюлгендиле}}.",
-       "showingresultsheader": "'''$4''' ючюн {{PLURAL:$5|1='''$3''' эсебден '''$1'''|'''$1 — $2''' арасы '''$3''' эсеб}}",
        "search-nonefound": "Соруу бла келишген эсеб джокъду",
        "powersearch-legend": "Кенг излеу",
        "powersearch-ns": "Атла аламда излеу:",
        "randomincategory": "Категориядагъы эсде болмагъан бет",
        "randomincategory-invalidcategory": "«$1» категория джокъду.",
        "randomincategory-nopages": "[[:Category:$1]] категорияда бетле джокъдула.",
-       "randomincategory-selectcategory-submit": "Кёч",
        "randomredirect": "Сакъланмагъан джибериу",
        "randomredirect-nopages": "«$1» ат аланда чырт бир джибериу джокъду.",
        "statistics": "Статистика",
        "booksources": "Китабланы чыкъгъан джерлери",
        "booksources-search-legend": "Китабны юсюнден информация излеу",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Таб",
        "booksources-text": "Бу бетде джангы эмда эски китаб сатхан башха сайтлагъа джибериулени тизмеси барды, эм излеген китабларыгъызны юсюнден кёбюрек билги билирге боллукъсуз.",
        "booksources-invalid-isbn": "Берилген ISBN джараусуз кибик кёрюнеди; оригинал къайнакъдан кёчюрюлген заманда халатланы контроль этигиз.",
        "specialloguserlabel": "Толтуруучу:",
        "wlheader-enotif": "E-mail бла хапар бериу джандырылыбды.",
        "wlheader-showupdated": "Ахыр кириуюгюзден сора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
        "wlnote": "Тюбюндеди кёргюзюлгенди: ахыр '''$2''' сагъатха этилген ахыр '''$1''' тюрлениу, $3 $4 заманнга дери.",
-       "wlshowlast": "Арт $1 сагъат $2 кюннге $3 кёргюз",
+       "wlshowlast": "Арт $1 сагъат $2 кюннге  кёргюз",
        "watchlist-options": "Кёзде тургъан тизмени джарашдырыулары",
        "watching": "Кёзде тургъан тизмеге къошуу...",
        "unwatching": "Кёзде тургъан тизмеден кетериу...",
        "import": "Бетлени импорт эт",
        "importinterwiki": "Викиле арасы импорт",
        "import-interwiki-text": "Импорт этер ючюн викини эм импорт этилген бетни атын сайлагъыз.\nТюрлениулени тарихи бла джазыучуланы атлары сакъланныкъды.\nБютеу викиле арасы импорт операцияла [[Special:Log/import|импортну журналына]] кёчюрюллюкдю.",
-       "import-interwiki-source": "Къайнакъ вики/бет:",
        "import-interwiki-history": "Бу бетни бютеу тюрлениу тарихин копия эт",
        "import-interwiki-templates": "Бютеу шаблонланы ичине сал",
        "import-interwiki-submit": "Импорт",
        "exif-urgency-low": "Алаша ($1)",
        "exif-urgency-high": "Мийик ($1)",
        "exif-urgency-other": "Къошулуучу салгъан приоритет ($1)",
-       "watchlistall2": "бютеу",
        "namespacesall": "бютеу",
        "monthsall": "бютеу",
        "confirmemail": "Электорн адресни мюкюл эт",
        "logentry-rights-rights-legacy": "$1 къошулуучу, $3 къушулуучуну къауумлада членлигин {{GENDER:$2|тюрлендирди}}",
        "logentry-rights-autopromote": "$1 къошулуучу, $4 къауумдан автомат халда $5 къауумгъа {{GENDER:$2|кёчюрюлдю}}",
        "rightsnone": "(джокъ)",
+       "revdelete-summary": "тюрлениулени ачыкълау",
        "feedback-subject": "Тема:",
        "feedback-message": "Билдириу:",
        "feedback-cancel": "Ызына алыу",
index da11257..6e94709 100644 (file)
        "otherlanguages": "En ander Schprooche",
        "redirectedfrom": "(Ömjeleit vun $1)",
        "redirectpagesub": "Ömleidongssigg",
+       "redirectto": "Ömleide op:",
        "lastmodifiedat": "Heh di Sigg es et letz aam $1 öm $2 Uhr jeändert woode.",
        "viewcount": "De Sigg es bes jetz {{PLURAL:$1|eimol|$1 Mol|keijmol}} avjerofe woode.",
        "protectedpage": "Jeschötzte Sigg",
        "hidetoc": "ußblände",
        "collapsible-collapse": "Zohklappe",
        "collapsible-expand": "Opklappe",
+       "confirmable-confirm": "{{GENDER:$1|Verhaftesch}}?",
+       "confirmable-yes": "Joh",
+       "confirmable-no": "Nää",
        "thisisdeleted": "$1 - aanluure oder widder zeröckholle?",
        "viewdeleted": "$1 aanzeije?",
        "restorelink": "{{PLURAL:$1|eijn fottjeschmesse Änderung|$1 fottjeschmesse Änderunge|keij fottjeschmesse Änderunge}}",
        "invalidtitle-knownnamespace": "„$3“ es ene onjöltijje Tittel för em Appachtemang „$2“",
        "invalidtitle-unknownnamespace": "„$2“ es ene onjöltijje Tittel för e Appachtemang met dä verkehte Nommer $1.",
        "exception-nologin": "Nit enjelogg",
-       "exception-nologin-text": "Heh di Sigg udder heh dä Opdraach jeiht blooß, wann De heh [[Special:Userlogin|em Wiki enjelogg]] bes.",
+       "exception-nologin-text": "Heh di Sigg udder heh dä Opdraach jeiht blooß, wann De heh enjelogg bes.",
        "exception-nologin-text-manual": "De mööds ald $1, öm heh di Sigg udder di Axjuhn zohjriife ze dörve.",
        "virus-badscanner": "Fääler en de Enstellunge: Dat Projramm ''$1'' fö noh Kompjuterwiere ze söke, dat kenne mer nit.",
        "virus-scanfailed": "Dat Söhke eß donevve jejange, dä Kood för dä Fähler es „$1“.",
        "passwordreset-emailsent-capture": "En <i lang=\"en\">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck woode. Heh dronger kanns De se lässe.",
        "passwordreset-emailerror-capture": "En <i lang=\"en\">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh sullt verscheck wääde, ävver dat Verschecke 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-header": "Donn en Adräß 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-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-none": "(kein)",
        "changeemail-password": "Ding Passwoot {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}}:",
        "changeemail-submit": "Lohß jonn!",
-       "changeemail-cancel": "Ophüre",
        "changeemail-throttled": "Do häs zoh öff versöhk, enzelogge. Waat $1 Ih dat De es widder probeers.",
        "resettokens": "Neue Schlößel maache",
        "resettokens-text": "Do kanns neue Schlößel maache lohße för op beschtemmpte päsöhnlesche Daate uohjriife ze künne, di met Dingem Zohjang heh ze donn han.\n\nDonn dat op jeede Fall, wann se enem Andere bikannt jewoode sin, udder wann Dinge Zohjang jeknack woode es.",
        "searchall": "all",
        "showingresults": "Onge {{PLURAL:$1|weed <strong>eine</strong>|wääde bes <strong>$1</strong>|weed <strong>keine</strong>}} vun de jefonge Endrähsch jezeisch, vun de Nommer <strong>$2</strong> av.",
        "showingresultsinrange": "{{PLURAL:$1|<strong>Ein</strong> Saachjropp|<strong>$1</strong> Saachjroppe|Kein Saachjropp}}, vun Nommer <strong>$2</strong> bes Nommer <strong>$3</strong> {{PLURAL:$1|weed|wääde|weed}} heh opjeleß.",
-       "showingresultsheader": "Jefonge un aanjezeisch: {{PLURAL:$5|'''$1''' vun '''$3'''|'''$1''' beß '''$2''' vun '''$3'''|nix}} för '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Heh es dä <strong>$1</strong>-te vun <strong>$3</strong> Träffere.|Träffer Nommero <strong>$1 bes $2</strong> vun <strong>$3</strong> Träffer.|Jevonge woodt woodt nix.}}",
        "search-nonefound": "Mer han nix zopaß jefonge för Ding Aanfrohch.",
        "powersearch-legend": "Extra Söhke",
        "powersearch-ns": "Söök en de Apachtemangs:",
        "prefs-registration-date-time": "dem $2 öm $3 Uhr",
        "yourrealname": "Dinge richtije Name *",
        "yourlanguage": "Di Schprooch, di et Wiki kalle soll:",
-       "yourvariant": "Der Dijaläk, de Schriefwies, de Zoot Shprooch för der Enhald.",
-       "prefs-help-variant": "Der Dijaläk udder de Schriefwies udder de Zoot Shprooch, di De för der Enhald.vun Sigge am leevsde häs.",
+       "yourvariant": "Der Dijaläk, de Schriefwies, de Zoot Schprohch för der Enhald:",
+       "prefs-help-variant": "Der Dijalägg udder de Schriefwies udder de Zoot Schprohch, di De för der Enhald vun Sigge am leevsde häß.",
        "yournick": "Ding&nbsp;„Ongerschreff“&nbsp;*",
        "prefs-help-signature": "* Beidrääsch op Klaafsigge sullte met „<nowiki>~~~~</nowiki>“ ophüere, dat weed beim Afshpeishere en Ding „Ongerschreff“ met de Uhrzig un em Dattum ömjewandelt.",
        "badsig": "Di Ungeschreff jëijd_esu nit — luer noh dem HTML do_dren un maach et rėshtėsh.",
        "right-browsearchive": "Noh fottjeschmesse Sigge söke",
        "right-undelete": "Fottjeschmeße Sigge widder zeröck holle",
        "right-suppressrevision": "Versione vun Sigge beloore un zeröck holle, di sujaa för de Wiki-Köbesse verstoche sin",
+       "right-viewsuppressed": "Beloor de Väsjohne, di vun jeedem verschtoche sin.",
        "right-suppressionlog": "De private Logböcher aanloore",
        "right-block": "Medmaacher Sperre, un domet am Schrive hindere",
        "right-blockemail": "Metmaacher för et E-Mail Verschecke sperre",
        "windows-nonascii-filename": "Heh dat Wiki löht kein Datteiname met Sönderzeische zoh.",
        "fileexists": "Et jitt ald en Datei met däm Name.\nWann De op „Datei avspeichere“ klicks, weed se ersetz.\nBes esu jod  un luur Der <strong>[[:$1]]</strong> aan, wann De nit 100% secher bes.\n[[$1|thumb]]",
        "filepageexists": "En Sigg övver di Datei met däm Tittel <strong>[[:$1]]</strong> es ald doh, ävver en Datei met däm Name ham_mer nit. Dinge Tex kütt nit automattesch op di Sigg övver di Dattei. Di Sigg moß De wann nüüdesch noch ens extra ändere.\n[[$1|thumb]]",
-       "fileexists-extension": "Mer han ald en Dattei, di bahl jenou esu heijß: [[$2|thumb]]\n* Huh am laade sim_mer: <strong>[[:$1]]</strong>\n* Ald om ßörve eß:</td><td><strong>[[:$2]]</strong>\nBes esu joot, un söök Der ene ander Name fö di Datei us.",
+       "fileexists-extension": "Mer han ald en Dattei, di bahl jenou esu heijß: [[$2|thumb]]\n* Huh am laade sim_mer: <strong>[[:$1]]</strong>\n* Ald om ßörve eß: <strong>[[:$2]]</strong>\nWels De nit leever ene andere Nahme fö di Datei ußsöhke?",
        "fileexists-thumbnail-yes": "Dat süühd uß, wi wann dat hee en Minni-Beldsche em Breefmarrke-Fommaat (''<span lang=\"en\">thumbnail</span>'') wöhr. [[$1|thumb]]\nDon ens di Dattei <strong>[[:$1]]</strong> prööfe.\nWann dat de Orjinaaljrüß es, do moß keij för dat Beld keij extra Vör-Aansich huhjelade wäde.",
        "file-thumbnail-no": "Dä Name fö di Datei fängk met <strong>$1</strong> aan.\nDat süühd uß, wi wann dat en Minni-Beldsche em Breefmarrke-Fommaat\n(''<span lang=\"en\">thumbnail</span>'') wöhr. Don ens di Dattei\n<strong>$1</strong> prööfe, of de nit e besser opjelööß Beld\ndofun häß, un don dat met singe Orjinaaljrüß huhlade, wann möjjelesch.\nSöns donn besser ene andere Dateiname ußsöke.",
        "fileexists-forbidden": "Et jitt ald en Dattei met däm Name, un mer kann se nit övverschriive.\nWann de Ding Dattei trozdämm huhlaade wells, da jangk zeröck un lad se\nunger enem andere Name huh. [[File:$1|thumb|center|$1]]",
        "randomincategory": "En zohfälleje Sigg us ener Saachjropp",
        "randomincategory-invalidcategory": "„$1“ es keine jölteje Nahme för en Saachjropp.",
        "randomincategory-nopages": "et sinn er kein Sigge en dä Saachjropp [[:Category:$1|$1]] dren.",
-       "randomincategory-selectcategory": "Holl en zohfälleje Sigg us dä Saachjropp: $1 $2.",
-       "randomincategory-selectcategory-submit": "Lohß Jonn!",
+       "randomincategory-category": "Saachjropp:",
+       "randomincategory-legend": "En zohfälleje Sigg us dä Saachjropp",
        "randomredirect": "Zofällije Ömleitung",
        "randomredirect-nopages": "En däm Appachtemang „$1“ sin ja kein Ömleidonge dren.",
        "statistics": "Schtatistike",
        "booksources": "Böcher",
        "booksources-search-legend": "Söök noh Bezochsquelle för Bööcher",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Lohß Jonn!",
+       "booksources-search": "Söhke",
        "booksources-text": "Hee noh küdd_en Leßß met Websigge,\nwo mir {{GRAMMAR:Dative fun|{{SITENAME}}}} nix wigger med ze donn hänn,\nwo mer jät övver Böösher erfaare\nun zom Dëijl och Böösher koufe kann.\nDoför moßß De Desh mannshmool allodengs eetß ennß aanmällde,\nwat Koßte un Jefaare met sesh brenge künndt.\nWo_t jëijdt,\njonn di Lengkß hee tirrägg_op dat Booch,\nwadd_Er am Sööke sidt.",
        "booksources-invalid-isbn": "De ISBNummer schingk verkeeht ze sin. Loohr ens donoh, woh se häe kütt.",
        "specialloguserlabel": "Dä Metmaacher, dä et jedonn hät:",
        "listgrouprights-removegroup-self-all": "Kann sesch sällver uß alle Metmaacherjroppe eruß nämme",
        "listgrouprights-namespaceprotection-namespace": "Appachtemang",
        "trackingcategories-name": "Dä Nohreesch udder däm Täxschtöck singe Nahme",
+       "broken-file-category-desc": "En heh dä Sigg es ene Lengk obb en Dattei, di mer nit han.",
        "trackingcategories-disabled": "Di Saachjrobb es afjeschalldt.",
        "mailnologin": "Keij E-Mail Adress",
        "mailnologintext": "Do mööts ald aanjemeldt un [[Special:UserLogin|enjelogg]] sin, un en jode E-Mail\nAdress en Dinge [[Special:Preferences|ming Enstellunge]] stonn han, öm en E-Mail aan andere Metmaacher ze\nschecke.",
        "mywatchlist": "Oppaßleß",
        "watchlistfor2": "För dä $1 $2",
        "nowatchlist": "En Ding Oppassliss es nix dren.",
-       "watchlistanontext": "Do muss $1, domet de en Ding Oppassliss erenluure kanns, oder jet dran ändere.",
+       "watchlistanontext": "Do moß enlogge, domet de en Ding Oppassliss erenluure kanns, oder jet dran ändere.",
        "watchnologin": "Nit enjelogg",
        "addwatch": "En de Oppassliss don",
        "addedwatchtext": "Die Sigg „[[:$1]]“ es jetz en Dinge [[Special:Watchlist|Oppaßleß]].\nWann di Sigg udder ier Klaafsigg verändert weed, kütt dat af jäz heh en di Oppaßleß.",
        "watchlist-details": "Do häß {{PLURAL:$1|ein Sigg|$1 Sigge|kein Sigg}} en Dinge Oppaßleß{{PLURAL:$1|, un di Klaafsigg dohzoh|, un de Klaafsigge dohzoh|}}.",
        "wlheader-enotif": "Et <i lang=\"en\">e-mail</i> Schecke es enjeschalt.",
        "wlheader-showupdated": "Wann se Einer jeändert hätt, zickdäm De se et letzte Mol aanjeluurt häs, sin die Sigge <strong>extra markeet</strong>.",
-       "wlnote": "{{PLURAL:$1|Hee es de letzte Änderung us|Hee sin de letzte <strong>$1</strong> Änderunge us|Mer han kein Äbderunge en}} de letzte {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}} zigg em $3 öm $4 Uhr.",
-       "wlshowlast": "Zeich de letzte | $1 | Stunde | $2 | Dage | $3 | aan, dun",
+       "wlnote": "{{PLURAL:$1|Hee es de läzde Änderong uß|Hee sin de läzde <strong>$1</strong> Änderonge uß|Mer han kein Änderonge en}} de läzde {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}} zigg em $3 öm $4 Uhr.",
+       "wlshowlast": "Zeich de letzte | $1 | Stunde | $2 | Dage |  | aan, dun",
        "watchlist-options": "Eijeschaffte fun de Oppassless",
        "watching": "Drop oppasse…",
        "unwatching": "Nimmieh drop oppasse",
        "exbeforeblank": "drop stundt vörher: „$1“",
        "delete-confirm": "„$1“ fottschmieße",
        "delete-legend": "Fottschmieße",
-       "historywarning": "<strong>Opjepass:</strong> Die Sigg, di De fott schmiiße wells, hät {{PLURAL:$1|ein ällder Version|ald Stöcker $1 ällder Versione|jaa kei ällder Versione}}.",
+       "historywarning": "<strong>Opjepass:</strong> Die Sigg, di De fott schmiiße wells, hät {{PLURAL:$1|ein ällder Väsjohn|ald $1 ällder Väsjohne|jaa kein ällder Väsjohne}}.",
        "confirmdeletetext": "Do bes koot dovör, en Sigg för iwich fottzeschmieße. Dobei verschwind och de janze Verjangenheit vun dä Sigg us de Daatebank, met all ehr Änderunge un Metmaacher Name, un all dä Opwand, dä do dren stich. Do muss heh jetz bestätije, dat de versteihs, wat dat bedügg, un dat De weiß, wat Do do mähs.\n<strong>Dun et nor, wann dat met de [[{{MediaWiki:Policy-url}}|Rejelle]] wirklich zosamme jeiht!</strong>",
        "actioncomplete": "Jedonn!",
        "actionfailed": "Dat es donevve jejange",
        "delete-edit-reasonlist": "De Jrönde för et Fottschmieße beärbeide",
        "delete-toobig": "Di Sigg hät {{PLURAL:$1|ein Version|$1 Versione|jaa kein Version}}. Dat sinn_er ärsch fill. Domet unsere ẞööver do nit draan en de Kneen jeit, dom_mer esu en Sigg nit fottschmieße.",
        "delete-warning-toobig": "Di Sigg hät {{PLURAL:$1|ein Version|$1 Versione|jakein Version}}. Dat sinn_er ärsch fill. Wann De die all fottschmieße wells, dat kann dem Wiki sing Datenbangk schwer ußbremse.",
-       "deleting-backlinks-warning": "<strong>Opjepaß:</strong> Es jitt Sigge met Lenks noh heh doh, udder Sigge, di heh di Sigg enbenge!",
+       "deleteprotected": "Di Sigg es jeschöz, un dröm kam_mer se nit fott schmiiße.",
+       "deleting-backlinks-warning": "<strong>Opjepaß:</strong> Es jitt Sigge met Lengks noh heh, udder Sigge, di heh di Sigg enbenge!",
        "rollback": "Em Letzte sing Änderunge zeröcknemme",
        "rollback_short": "Zeröcknemme",
        "rollbacklink": "All dem Letzte sing Änderunge zeröckdriehe",
        "protect-locked-blocked": "Do kanns nit der Siggeschotz ändere, esu lang wi Dinge Zojang zom Wiki jesperrt es. Hee es der aktuelle Stand fum Siggeschotz för di Sigg '''„$1“:'''",
        "protect-locked-dblock": "De Datebank es jesperrt. Dröm künne mer der Siggeschotz nit ändere.\nHee es der aktuelle Stand fum Siggeschotz för di Sigg '''„$1“:'''",
        "protect-locked-access": "Do häs nit dat Rääsch, heh em Wiki Sigge ze schötze udder dä Schotz widder opzehevve.\nDi Sigg '''„$1“:''' es jetz jrad:",
-       "protect-cascadeon": "Die Sigg es en enne Schotz-Kaskad. Se es enjebonge en {{PLURAL:$1|die Sigg|$1 Sigge|kein Sigg}}, die per Kaskade-Schotz jeschötz {{PLURAL:$1|es|sin|es}}. Do kanns dä Schotz för die Sigg heh ändere, ävver di Kaskad blief bestonn. Dat heh sin die Sigge en dä Kaskad:",
+       "protect-cascadeon": "Die Sigg es en enne Schotz-Kaskad. Se es enjebonge en {{PLURAL:$1|einSigg|$1 Sigge|kein Sigg}}, die per Kaskade-Schotz jeschötz {{PLURAL:$1|es|sin|es}}. Do kanns dä Schotz för die Sigg heh ändere, ävver di Kaskad blief bestonn.",
        "protect-default": "Jeede Metmaacher eraan lohße",
        "protect-fallback": "Do weet dat Rääsch „$1“ jebruch.",
        "protect-level-autoconfirmed": "Bloß de automattesch beschtääteschte Metmaacher dranlooße",
        "protect-othertime": "En ander Door:",
        "protect-othertime-op": "en ander Door",
        "protect-existing-expiry": "Beß am $2 öm $3 Uhr",
+       "protect-existing-expiry-infinity": "Dä schöz bliev em momang för iewisch beschtonn.",
        "protect-otherreason": "En andere udder zosätzlijje Jrund:",
        "protect-otherreason-op": "Ene andere udder zosätzlijje Jrond",
        "protect-dropdown": "* Jewöhnlijje Jrönd för dä Sigge-Schotz\n** ußerjewöhnlesch fill Kapottmaacherei\n** ußerjewöhnlesch fill SPAMlinks op ander Sigge wäde neu enjedraare\n** Hen- un her-Änderei, woh mer süht, dat nix mieh joods erus kumme weed\n** janz weschtejje Sigg, met ußerjewöhnlesch fill Afroofe",
        "autoblockid": "Automattesche Sperr Nommer $1",
        "block": "Metmaacher udder en <i lang=\"en\">IP</i>-Addräß sperre",
        "unblock": "Don en Sperr för ene Metmaacher udder en <i lang=\"en\">IP</i>-Addräß ophävve",
-       "blockip": "Metmaacher sperre",
+       "blockip": "{{GENDER:$1|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} schpärre",
        "blockip-legend": "Metmaacher ov IP-Adresse Sperre",
        "blockiptext": "Hee kanns De bestemmte Metmaacher oder IP-Adresse sperre, su dat se hee em Wiki nit mieh schrieve und Sigge ändere künne.\nDat sollt nor jedon wääde om sujenannte Vandaale ze bremse. Un mer müsse uns dobei natörlich aan uns [[{{MediaWiki:Policy-url}}|Rejelle]] för esu en Fäll halde.\nDrag bei „Aanlass“ ene möchlichs jenaue Jrund en, wöröm dat Sperre passeet. Nenn un Link op de Sigge wo Einer kapott jemaat hät, zem Beispill.",
        "ipaddressorusername": "<i lang=\"en\">IP</i>-Adress oder Metmaacher Name:",
        "ipb-unblock-addr": "„$1“ widder zohlohße",
        "ipb-unblock": "En IP-Addräß ov ene Metmaacher widder zohlohße",
        "ipb-blocklist": "All de Sperre för Metmaacher un IP-Adresse aanzeije, die jrad bestonn",
-       "ipb-blocklist-contribs": "De Metmaacher ier Bäjdrähsch för „$1“",
+       "ipb-blocklist-contribs": "{{GENDER:$1|Däm|Däm|Däm Metmaacher|Dä|Däm}} $1 {{GENDER:$1|sing|singe|sing|iere|sing}} Bäjdrähsch",
        "unblockip": "Dä Medmacher widder maache looße",
        "unblockiptext": "Heh kanns De vörher jesperrte IP_Adresse oder Metmaacher widder freijevve, un dänne esu dat Rääch för ze Schrieve heh em Wiki widder jevve.",
        "ipusubmit": "Sperr ophevve!",
        "unblocked": "[[User:$1|$1]] wood widder zojelooße",
        "unblocked-range": "Dä Berett $1 es nit mieh jesperrt.",
        "unblocked-id": "De Sperr met dä Nommer $1 es opjehovve",
+       "unblocked-ip": "{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dä}} [[Special:Contributions/$1|$1]] es jäz nit mieh jeschpächt.",
        "blocklist": "De Leß met jesperrte <i lang=\"en\">IP</i>-Adräße un Metmaacher",
        "ipblocklist": "Leß met jesperrte <i lang=\"en\">IP</i>-Adresse un Metmaacher",
        "ipblocklist-legend": "Ene jesperrte Metmaacher fenge",
        "import": "Sigge Emporteere",
        "importinterwiki": "Trans Wiki Emport",
        "import-interwiki-text": "Wähl en Wiki un en Sigg zem Emporteere us.\nEt Datum vun de Versione un de Metmaacher Name vun de Schriever wääde dobei metjenomme.\nAll de Trans Wiki Emporte wääde em [[Special:Log/import|Emport_Logboch]] fassjehallde.",
-       "import-interwiki-source": "Quelle-Wiki un -Sigg:",
        "import-interwiki-history": "All de Versione vun dä Sigg heh kopeere",
        "import-interwiki-templates": "All Schablone metnämme",
        "import-interwiki-submit": "Huhlade!",
        "import-upload": "En XML-Datei impochteere",
        "import-token-mismatch": "Schadt. Et senn nit alle Date heh aanjekumme.\nBes esu joot, un versök et noch ens.",
        "import-invalid-interwiki": "Us dämm jenannte Wiki künne mer nix Importeere.",
-       "import-error-edit": "Di Sigg „$1“ es nit impoteet woode. Do häs nit et Rääsch, se ze ändre.",
-       "import-error-create": "Di Sigg „$1“ es nit impoteet woode. Do häs nit et Rääsch, se aanzlääje.",
-       "import-error-interwiki": "Di Sigg „$1“ weed nit empoteet, weil dä iehre Name för et Verlengke noh ußerhallef, pä Engerwiki-Lengk, jebruch weed.",
-       "import-error-special": "Di Sigg „$1“ weed nit empoteet, weil dä iehre Name en enem besöndere Appachtemang litt, woh kein Sigge dren zohjelohße sin.",
-       "import-error-invalid": "Di Sigg „$1“ weed nit empoteet, weil dä iehre Name nit jöltesch es.",
+       "import-error-edit": "Di Sigg „$1“ es nit impotehrt woode. Do häs nit et Rääsch, se ze ändere.",
+       "import-error-create": "Di Sigg „$1“ es nit impotehrt woode. Do häs nit et Rääsch, se aanzelähje.",
+       "import-error-interwiki": "Di Sigg „$1“ weed nit empotehrt, weil dä iehre Name för et Verlengke noh ußerhallef, pä Engerwikilengk, jebruch weed.",
+       "import-error-special": "Di Sigg „$1“ weed nit empotehrt, weil dä iehre Name en enem besöndere Appachtemang litt, woh kein Sigge dren zohjelohße sin.",
+       "import-error-invalid": "Di Sigg „$1“ weed nit empotehrt, weil dä Sigg iehre Name, woh se hen empotehrt wääde sull, nit jöltesch es.",
        "import-error-unserialize": "De Väsjohn $2 vun dä Sigg „$1“ kunnt nit von serijäll ußjepack wääde. De Väsjohn sull Daate vun dä Zoot „$3“ änthallde un ußjepack „$4“ jävve.",
        "import-options-wrong": "{{PLURAL:$2|En verkiehrte Aanjab|Verkiehrte Aanjabe|Kein verkiehrte Aanjabe}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Di aanjejovve Aanfangssigg hät keine jölteje Tittel.",
        "importlogpage": "Logboch met emporteerte Sigge",
        "importlogpagetext": "Sigge met ehre Versione vun ander Wikis emporteere.",
        "import-logentry-upload": "„[[$1]]“ emporteet fun enne huhjelade Dattei",
-       "import-logentry-upload-detail": "{{PLURAL:$1|ein Version|$1 Versione|kein Version}} emporteet",
+       "import-logentry-upload-detail": "{{PLURAL:$1|ein Väsjohn|$1 Väsjohne|kein Väsjohn}} woodt emportehrt.",
        "import-logentry-interwiki": "hät tirek vum ander Wiki emporteet: „$1“",
-       "import-logentry-interwiki-detail": "{{PLURAL:$1|ein Version|$1 Versione|kein Version}} vun „$2“",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|ein Väsjohn|$1 Väsjohne|kein VVäsjohnersion}} woodt empottehrt vun „$2“",
        "javascripttest": " JavaSkrepte ußprobeere.",
        "javascripttest-title": "De Prööfunge „$1“ loufe.",
        "javascripttest-pagetext-noframework": "Heh di Sigg es för JavaSkrepte ußzeprobeere.",
        "exif-urgency-low": "Klein ($1)",
        "exif-urgency-high": "Huh ($1)",
        "exif-urgency-other": "Selfs faßjelaat ($1)",
-       "watchlistall2": "all",
        "namespacesall": "all",
        "monthsall": "all",
        "confirmemail": "E-Mail Adress bestätije",
        "timezone-utc": "<i lang=\"en\">UTC</i>",
        "unknown_extension_tag": "„<code>$1</code>“ es en zosäzlejje Kennzeichnung, die kenne mer nit.",
        "duplicate-defaultsort": "'''Opjepaß:'''\nDä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlößel „$2“.",
+       "duplicate-displaytitle": "<strong>opjepaß:</strong> Dä Nahme „$2“ övverschriev dä fröjere Nahme „$1“ för zem Aanzeije.",
        "version": "Väsjohn vun de Wiki Soffwär zeije",
        "version-extensions": "Installeete Erjänzunge un Zohsätz",
-       "version-skins": "Ovverflääsche",
+       "version-skins": "De enschtallehrte Bedeenbovverflääsche",
        "version-specialpages": "{{int:nstab-special}}e",
        "version-parserhooks": "De Parser-Hooke",
        "version-variables": "Variable",
        "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.",
        "rightsnone": "(nix)",
+       "revdelete-summary": "dä Täx en „{{int:summary}}“",
        "feedback-bugornote": "Wann de em Bejreff bes, övver e täschesch Probleem ze schrieve, bes esu jood un donn dat als en [$1 Fählermäldong].\nSöns, nemm dat koote Fommulaa heh dronger.\nWat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg „[$3 $2]“ drop.",
        "feedback-subject": "Theema:",
        "feedback-message": "Nohreesch:",
        "pagelang-name": "Sigg",
        "pagelang-language": "De Schprooch",
        "pagelang-use-default": "Nemm de Schtandatt_Schprohch",
-       "pagelang-select-lang": "Söhg_en Schprooch uß"
+       "pagelang-select-lang": "Söhg_en Schprooch uß",
+       "right-pagelang": "Ener Sigg ier Schprohch tuusche",
+       "action-pagelang": "Sigge ier Schprohch zu tuusche",
+       "log-name-pagelang": "Logbooch vum Tuusche vun Sige iehr Schprohche"
 }
index 07a1d75..bd6c9bf 100644 (file)
        "userlogin-resetpassword-link": "Şîfreyê ji nû ve çêke",
        "userlogin-helplink2": "Alîkariya têketinê",
        "createacct-emailrequired": "E-name",
+       "createacct-emailoptional": "E-name",
+       "createacct-email-ph": "E-nameya xwe binivîse",
        "createaccountmail": "Use a temporary random password and send it to the email address specified below",
        "createaccountreason": "Sedem:",
        "createacct-reason": "Sedem",
+       "createacct-imgcaptcha-ph": "Nivîsa ku tu li jor dibînî binivîse",
        "createacct-submit": "Hesabê xwe biafirîne",
        "createacct-benefit-body2": "{{PLURAL:$1|rûpel}}",
        "badretype": "Her du şîfreyên ku te nivîsîn li hevdu nayên.",
        "changeemail-newemail": "Navnîşana E-nameya nû:",
        "changeemail-none": "(nîne)",
        "changeemail-submit": "E-nameyê biguherîne",
-       "changeemail-cancel": "Betal bike",
        "bold_sample": "Nivîsa stûr",
        "bold_tip": "Nivîsa stûr",
        "italic_sample": "Nivîsa xwehr (îtalîk)",
        "searchrelated": "pêwendîdar",
        "searchall": "hemû",
        "showingresults": "{{PLURAL:$1|Encamek|'''$1''' encam}}, bi #'''$2''' dest pê dike.",
-       "showingresultsheader": "{{PLURAL:$5|Encam '''$1''' ên '''$3'''|Encam '''$1 - $2''' ên '''$3'''}} ji bo '''$4'''",
        "search-nonefound": "Ti rûpelên wek ya daxwazkirî nînin.",
        "powersearch-legend": "Lê bigere",
        "powersearch-ns": "Di valahiya navan de lêbigere:",
        "pager-older-n": "{{PLURAL:$1|kevintir 1|kevintir $1}}",
        "booksources": "Çavkaniyên pirtûkan",
        "booksources-search-legend": "Li pirtûkan bigere",
-       "booksources-go": "Here",
        "booksources-text": "Li vir listek ji lînkên rûpelên, yê pirtûkên nû ya kevin difiroşin, heye. Hên jî li vir tu dikarî înformasyonan li ser wan pirtûkan tê derxê.",
        "specialloguserlabel": "Bikarhêner:",
        "speciallogtitlelabel": "Sernav:",
        "wlheader-enotif": "Agahdariya E-nameyê pêk tê.",
        "wlheader-showupdated": "Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
        "wlnote": "Niha {{PLURAL:$1|xeyrandinê|'''$1''' xeyrandinên}} dawî yê {{PLURAL:$2|seetê|'''$2''' seetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
-       "wlshowlast": "Guhertinên berî $1 saetan, $2 rojan, ya $3 nîşan bide",
+       "wlshowlast": "Guhertinên berî $1 saetan, $2 rojan, ya  nîşan bide",
        "watchlist-options": "Vebijarkên lîsteya şopandinê",
        "watching": "Bişopîne...",
        "unwatching": "Neşopîne…",
        "exif-iimcategory-spo": "Werzîş",
        "exif-iimcategory-war": "Şer, pevçûn û alozî",
        "exif-iimcategory-wea": "Hewa",
-       "watchlistall2": "hemû",
        "namespacesall": "hemû",
        "monthsall": "hemû",
        "confirmemail": "Adrêsa e-nameyan nasbike",
        "logentry-newusers-newusers": "$1 hesabekî bikarhêneriyê çêkir",
        "logentry-newusers-create": "$1 hesabekî bikarhêneriyê çêkir",
        "rightsnone": "(tune)",
+       "revdelete-summary": "kurteyê biguherîne",
        "feedback-subject": "Mijar:",
        "feedback-message": "Peyam:",
        "feedback-cancel": "Betal bike",
index e8320d8..cfb0f45 100644 (file)
        "passwordreset-emailsent": "Ebost dassettya ger tremena re beu danvenys.",
        "passwordreset-emailsent-capture": "Ebost dassettya ger tremena re beu danvenys, hag y hyllir y weles a-woles.",
        "changeemail": "Chanjya trigva ebost",
-       "changeemail-header": "Chanjya trigva ebost an akont",
        "changeemail-text": "Lenwewgh an furvlen-ma rag chanjya agas trigva ebost. Y fydh res dhywgh entra agas ger tremena rag afydhya an chanj-ma.",
        "changeemail-oldemail": "Agas trigva ebost a-lemmyn:",
        "changeemail-newemail": "Agas trigva ebost nowyth:",
        "changeemail-none": "(nagonan)",
        "changeemail-password": "Agas ger tremena war {{SITENAME}}:",
        "changeemail-submit": "Chanjya an trigva ebost",
-       "changeemail-cancel": "Hedhi",
        "bold_sample": "Tekst tew",
        "bold_tip": "Tekst tew",
        "italic_sample": "Tekst italek",
        "search-relatedarticle": "Kelmys",
        "searchrelated": "kelmys",
        "searchall": "oll",
-       "showingresultsheader": "{{PLURAL:$5|Sewyans '''$1''' a '''$3'''|Sewyansow '''$1 - $2''' a '''$3'''}} rag '''$4'''",
        "search-nonefound": "Nyns esa sewyans vyth owth omdhesedha orth an govyn.",
        "powersearch-legend": "Hwilans avonsys",
        "powersearch-ns": "Hwilas yn spasys-hanow:",
        "pager-older-n": "{{PLURAL:$1|1 kottha|$1 kottha}}",
        "booksources": "Pennfentynyow lyver",
        "booksources-search-legend": "Hwilas pennfentynyow lyver",
-       "booksources-go": "Mos",
        "specialloguserlabel": "Awtour:",
        "speciallogtitlelabel": "Kosten (titel po devnydhyer):",
        "log": "Kovnotennow",
        "watchlist-details": "Yma {{PLURAL:$1|$1 folen}} war agas rol wolya, marnas folennow keskows.",
        "wlheader-showupdated": "Yn '''tew''' y tiskwedhir folennow re beu chanjyes a-dhia agas vysytyans diwettha.",
        "wlnote": "A-woles yma an {{PLURAL:$1|chanj diwettha|'''$1''' chanj diwettha}} y'n {{PLURAL:$2|our|'''$2''' our}} diwettha, a-dhia $3, $4.",
-       "wlshowlast": "Diskwedhes an $1 our diwettha, an $2 dydh diwettha, po $3",
+       "wlshowlast": "Diskwedhes an $1 our diwettha, an $2 dydh diwettha, po",
        "watchlist-options": "Etholyow an rol wolya",
        "watching": "Ow kolya...",
        "unwatching": "Ow tisgolya...",
        "exif-sharpness-1": "Medhes",
        "exif-sharpness-2": "Kales",
        "exif-subjectdistancerange-0": "Ankoth",
-       "watchlistall2": "puptra",
        "namespacesall": "oll",
        "monthsall": "oll",
        "confirmemail": "Afydhya an drigva ebost",
index f3fb4ec..b22ab0e 100644 (file)
@@ -12,7 +12,8 @@
                        "Tynchtyk Chorotegin",
                        "Ztimur",
                        "Викиней",
-                       "아라"
+                       "아라",
+                       "Askar Nazyrov"
                ]
        },
        "tog-underline": "Шилтемелердин алдын сызуу:",
        "passwordreset-emailsent-capture": "Төмөндө көрсөтүлгөн эмейлге сырсөздү алмаштыруучу кат жөнөтүлдү.",
        "passwordreset-emailerror-capture": "Төмөндө көрсөтүлгөн дарекке сырсөздү алмаштыруу кат түзүлдү,бирок аны  {{GENDER:$2|катышуучуга}} жөнөтүү оңунан чыккан жок: $1",
        "changeemail": "E-mail даректи өзгөртүү",
-       "changeemail-header": "Эл. почтанын дарегин өзгөртүү",
        "changeemail-text": "Эмейл дарегиңизди алмаштыруу үчүн ушул үлгүнү толтуруңуз. Өзгөрүүнү аныктоо үчүн сырсөздү киргизүү талап кылынат.",
        "changeemail-no-info": "Бул баракка түз кайрылыш үчүн, сиз системага киришиңиз керек.",
        "changeemail-oldemail": "Учурдагы e-mail дарек:",
        "changeemail-none": "(жок)",
        "changeemail-password": "«{{SITENAME}}» долбоору үчүн сиздин сырсөзүңүз:",
        "changeemail-submit": "E-mail'ди өзгөртүү",
-       "changeemail-cancel": "Жокко чыгаруу",
        "bold_sample": "Калың текст",
        "bold_tip": "Калың текст",
        "italic_sample": "жантык текст",
        "search-relatedarticle": "Байланыштуу",
        "searchrelated": "байланыштуу",
        "searchall": "баары",
-       "showingresultsheader": "'''$4''' үчүн {{PLURAL:$5|'''$3''' жыйынтыктан '''$1'''-и|'''$1 - $2''' -дан '''$3''' жыйынтык}}",
        "search-nonefound": "Талапка төп маалымат табылган жок.",
        "powersearch-legend": "Кеңейтилген издөө",
        "powersearch-ns": "Аталыш мейкиндиктеринен издөө:",
        "pager-older-n": "{{PLURAL:$1|эскирээк 1|эскирээк $1}}",
        "booksources": "Китеп тууралуу маалыматтар",
        "booksources-search-legend": "Китеп тууралуу маалыматтарды издөө",
-       "booksources-go": "Алга",
        "specialloguserlabel": "Аткаруучу:",
        "speciallogtitlelabel": "Максаты (аталышы же колдонуучу):",
        "log": "Журналдар",
        "watch": "Көзөмөлдөө",
        "unwatch": "Көзөмөлдөбөө",
        "watchlist-details": "Талкуу барактарын эсепке албаганда көзөмөл тизмеңизде {{PLURAL:$1|$1 барак|$1 барак}} бар.",
-       "wlshowlast": "Соңку $1 саат $2 күн $3 көрсөтүү.",
+       "wlshowlast": "Соңку $1 саат $2 күн  көрсөтүү.",
        "watchlist-options": "Көзөмөл тизменин ырастоолору",
        "created": "түзүлдү",
        "changed": "өзгөртүлдү",
        "thumbnail_image-type": "Сүрөт түрү колдолбойт",
        "import": "Барактарды импорттоо",
        "importinterwiki": "Уики аралык импорт",
-       "import-interwiki-source": "Уики-булак/барак:",
        "import-interwiki-history": "Бул барактын бүткүл өзгөртүү тарыхын көчүрүү",
        "import-interwiki-templates": "Бардык калыптарды камтуу",
        "import-interwiki-submit": "Импорттоо",
        "exif-iimcategory-soi": "Социалдык маселелер",
        "exif-iimcategory-spo": "Спорт",
        "exif-iimcategory-wea": "Аба-ырайы",
-       "watchlistall2": "баары",
        "namespacesall": "баары",
        "monthsall": "баары",
        "confirmemail": "Электрондук даректи аныктоо",
        "duration-years": "$1 {{PLURAL:$1|жыл}}",
        "duration-decades": "$1 {{PLURAL:$1|оң жылдык мөөнөт}}",
        "duration-centuries": "$1 {{PLURAL:$1|кылым}}",
-       "duration-millennia": "$1 {{PLURAL:$1|миң жылдык мөөнөт}}"
+       "duration-millennia": "$1 {{PLURAL:$1|миң жылдык мөөнөт}}",
+       "mediastatistics-table-count": "Файлдар саны",
+       "mediastatistics-table-totalbytes": "Жалпы өлчөм",
+       "mediastatistics-header-unknown": "Белгисиз",
+       "mediastatistics-header-audio": "Аудио",
+       "mediastatistics-header-video": "Видеолор",
+       "mediastatistics-header-office": "Кеңсе",
+       "mediastatistics-header-text": "Тексттик"
 }
index 5da1b59..9862797 100644 (file)
        "passwordreset-emailelement": "Nomen usoris: $1\nMomentarius Tessera: $2",
        "changeemail-none": "(nulla)",
        "changeemail-submit": "Inscriptionem electronicam mutare",
-       "changeemail-cancel": "Abrogare",
        "bold_sample": "Litterae pingues",
        "bold_tip": "Litterae pingues",
        "italic_sample": "Textus litteris Italicis scriptus",
        "editinguser": "Modificare potestates usoris '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Greges usorum recensere",
        "saveusergroups": "Greges usorum servare",
-       "userrights-groupsmember": "In grege aut in gregibus:",
+       "userrights-groupsmember": "{{PLURAL:$1|In grege|In gregibus}}:",
        "userrights-reason": "Causa:",
        "userrights-changeable-col": "Greges quos tibi oportet mutare",
        "userrights-unchangeable-col": "Greges quos tibi non oportet mutare",
        "rcnotefrom": "Subter sunt '''$1''' nuperrime mutata in proxima '''$2''' die.",
        "rclistfrom": "Monstrare mutata nova incipiens ab $3 $2",
        "rcshowhideminor": "$1 recensiones minores",
+       "rcshowhideminor-show": "Monstrare",
+       "rcshowhideminor-hide": "Celare",
        "rcshowhidebots": "$1 automata",
+       "rcshowhidebots-show": "Monstrare",
+       "rcshowhidebots-hide": "Celare",
        "rcshowhideliu": "$1 usores notos",
+       "rcshowhideliu-show": "Monstrare",
+       "rcshowhideliu-hide": "Celare",
        "rcshowhideanons": "$1 usores ignotos",
+       "rcshowhideanons-show": "Monstrare",
+       "rcshowhideanons-hide": "Celare",
        "rcshowhidepatr": "$1 recensiones circumitae",
+       "rcshowhidepatr-show": "Monstrare",
+       "rcshowhidepatr-hide": "Celare",
        "rcshowhidemine": "$1 conlationes meas",
+       "rcshowhidemine-show": "Monstrare",
+       "rcshowhidemine-hide": "Celare",
        "rclinks": "Monstrare $1 nuperrime mutata in $2 diebus proximis.<br />$3",
        "diff": "diss",
        "hist": "hist",
        "unusedtemplateswlh": "nexus alii",
        "randompage": "Pagina fortuita",
        "randompage-nopages": "Non est ulla pagina {{PLURAL:$2|hoc in spatio nominale|in his spatiis nominalibus}}: $1.",
-       "randomincategory-selectcategory-submit": "Pergere",
        "randomredirect": "Redirectio fortuita",
        "randomredirect-nopages": "Non est ulla redirectio in spatio nominali \"$1\".",
        "statistics": "Census",
        "suppress": "Censura",
        "booksources": "Librorum fontes",
        "booksources-search-legend": "Fontes impressas quaerere",
-       "booksources-go": "Ire",
        "specialloguserlabel": "Usor:",
        "speciallogtitlelabel": "Destinatum (titulus aut usor):",
        "log": "Acta",
        "notvisiblerev": "Emendatio deleta est",
        "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginae}} in indice paginarum custoditarum tuarum, sine paginis disputationis.",
        "wlnote": "Subter {{PLURAL:$1|est mutatio proxima|sunt '''$1''' mutationes proximae}} in {{PLURAL:$2|proxima hora|proximis '''$2''' horis}} ex $4, $3.",
-       "wlshowlast": "Monstrare proximas $1 horas $2 dies $3",
+       "wlshowlast": "Monstrare proximas $1 horas $2 dies",
        "watchlist-options": "Indicis paginarum custoditarum praeferentiae",
        "watching": "Custodiens...",
        "unwatching": "Decustodiens...",
        "djvu_page_error": "Pagina DjVu extra latitudinem",
        "import": "Paginas importare",
        "importinterwiki": "Adportatio transvici",
-       "import-interwiki-source": "Vici et pagina fons:",
        "import-interwiki-submit": "Importare",
        "import-interwiki-namespace": "Spatium nominale destinatum:",
        "import-upload-filename": "Nomen fasciculi:",
        "exif-gpsdestdistance-n": "Milia nautica",
        "exif-gpsdirection-t": "Directio vera",
        "exif-gpsdirection-m": "Directio magnetica",
-       "watchlistall2": "omnes",
        "namespacesall": "omnia",
        "monthsall": "omnes",
        "confirmemail": "Inscriptionem electronicam adfirmare",
        "logentry-newusers-create2": "Ratio usoris $3 creata est ab usore $1",
        "logentry-newusers-autocreate": "Ratio usoris $1 automatice creata est",
        "rightsnone": "(nullus)",
+       "revdelete-summary": "summarium recensionis",
        "feedback-message": "Nuntius:",
        "feedback-cancel": "Dimittere",
        "feedback-error2": "Error: Recensio non additur",
index db68ff1..a8ba550 100644 (file)
        "passwordreset-email": "Adresso de letral:",
        "passwordreset-emailelement": "Usuario: $1\nKontrasenya temporal: $2",
        "changeemail": "Kambiar adreso de korreo elektroniko",
-       "changeemail-header": "Kambiar adreso de korreo elektroniko de kuento",
        "changeemail-oldemail": "Adreso de korreo elektroniko aktual:",
        "changeemail-newemail": "Muevo adreso de korreo elektroniko:",
        "changeemail-none": "(dinguno)",
        "changeemail-password": "Tu kontrasenya en {{SITENAME}}:",
        "changeemail-submit": "Trocar letral",
-       "changeemail-cancel": "Anular",
        "resettokens-token-label": "$1(valor aktual: $2)",
        "bold_sample": "Teksto reforçado",
        "bold_tip": "Teksto reforçado",
        "search-interwiki-more": "(mas)",
        "searchrelated": "lisionado",
        "searchall": "todos",
-       "showingresultsheader": "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1-$2''' de '''$3'''}} parâ '''$4'''",
        "search-nonefound": "No ay resultados por esta búxquida.",
        "powersearch-legend": "Búsqueda adelantada",
        "powersearch-ns": "Busca en los espacios de nombres:",
        "download": "deskargar",
        "unusedtemplateswlh": "otros enlases",
        "randompage": "Hoja por azardo",
-       "randomincategory-selectcategory-submit": "Ir",
        "statistics": "Estatísticas",
        "statistics-articles": "Pajinas de kontenido",
        "statistics-pages": "Pajinas",
        "pager-older-n": "{{PLURAL:$1|1 de antes|$1 de antes}}",
        "booksources": "Fuentes de livros",
        "booksources-search-legend": "Buscar fuentes de libros",
-       "booksources-go": "Ir",
        "log": "Rejistros",
        "allpages": "Todas las hojas",
        "nextpage": "La sigiente pajina ($1)",
        "watchthispage": "Cudia esta hoja",
        "unwatch": "dexa de cudiar",
        "watchlist-details": "{{PLURAL:$1|$1 hoja|$1 hojas}} en tu lista de escogidas, sin contar las de la diskussión.",
-       "wlshowlast": "Ver los trocamientos de las últimas $1 oras, $2 días  $3",
+       "wlshowlast": "Ver los trocamientos de las últimas $1 oras, $2 días",
        "watchlist-options": "Opciones de la lista de escogidas",
        "watching": "Cudiando...",
        "unwatching": "Dexando de cudiar...",
        "exif-iimcategory-hth": "Salud",
        "exif-iimcategory-lab": "Lavoro",
        "exif-iimcategory-sci": "Sensiya i teknolojiya",
-       "watchlistall2": "todos",
        "namespacesall": "todos",
        "monthsall": "(todos)",
        "confirmemail": "Konfirmar adreso de korreo elektronika",
index 2894e7f..b33c180 100644 (file)
        "otherlanguages": "An anere Sproochen",
        "redirectedfrom": "(Virugeleet vu(n) $1)",
        "redirectpagesub": "Viruleedungssäit",
+       "redirectto": "Viruleeden op:",
        "lastmodifiedat": "Dës Säit gouf de(n) $1 ëm $2 Auer fir d'lescht geännert.",
        "viewcount": "Dës Säit gouf bis elo {{PLURAL:$1|emol|$1-mol}} ofgefrot.",
        "protectedpage": "Gespaart Säit",
        "createaccount-text": "Et gouf e Benotzerkont \"$2\" fir Iech op {{SITENAME}} ($4) ugeluecht mat dem Passwuert \"$3\".\nDir sollt Iech aloggen an Äert Passwuert elo änneren.\n\nWann dëse Benotzerkont ongewollt ugeluecht gouf, kënnt Dir dës Noriicht einfach ignoréieren.",
        "login-throttled": "Dir hutt zevill dacks versicht Iech anzeloggen.\nWaart w.e.g. $1 ier Dir et nach eng Kéier probéiert.",
        "login-abort-generic": "Dir sidd net ageloggt - Aloggen ofgebrach",
+       "login-migrated-generic": "Äre Benotzerkont gouf migréiert an Äre Benotzernumm gëtt et net méi op dëser Wiki.",
        "loginlanguagelabel": "Sprooch: $1",
        "suspicious-userlogout": "Är Ufro fir Iech auszeloggen gouf refuséiert well et sou ausgesäit wéi wa se vun engem futtise Browser oder Proxy-Tëschespäicher kënnt.",
        "createacct-another-realname-tip": "De richtegen Numm ass fakultativ.\n\nWann Dir en ugitt, gëtt e benotzt fir d'Benotzerattributiounen fir Är Aarbecht zouzeuerdnen.",
        "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-header": "Mailadress vum Benotzerkont ä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-no-info": "Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.",
        "changeemail-oldemail": "Aktuell Mailadress:",
        "changeemail-none": "(keng)",
        "changeemail-password": "Äert {{SITENAME}}-Passwuert:",
        "changeemail-submit": "Mailadress änneren",
-       "changeemail-cancel": "Ofbriechen",
        "changeemail-throttled": "Dir hutt zevill dacks versicht Iech anzeloggen.\nWaart w.e.g. $1 ier Dir et nach eng Kéier probéiert.",
        "resettokens": "Token zrécksetzen",
        "resettokens-no-tokens": "Et gëtt keng Tokens fir zréck ze setzen.",
        "showpreview": "Kucken ouni ofzespäicheren",
        "showdiff": "Ännerunge weisen",
        "blankarticle": "<strong>Opgepasst:</strong> D'Säit déi Dir uleet ass eidel.\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Säit ugeluecht.",
-       "anoneditwarning": "'''Opgepasst:''' Dir sidd net ageloggt. Dowéinst gëtt amplaz vun engem Benotzernumm Är IP Adress am Historique vun dëser Säit gespäichert.",
+       "anoneditwarning": "<strong>Opgepasst:</strong> Dir sidd net ageloggt. Dowéinst gëtt amplaz vun engem Benotzernumm Är IP Adress ëffentlech gewise wann Dir Ännerunge maacht. Wann Dir <strong>[$1 Iech aloggt]</strong> oder <strong>[$2 e Bnotzerkont opmaachen]</strong>, Är Ännerunge ginn dann Ärem Benotzerkont zougedeelt, genee wéi aner Avantagen.",
        "anonpreviewwarning": "''Dir sidd net ageloggt. Wann Dir ofspäichert gëtt Är IP-Adress an der Lëscht vun de Versioune vun dëser Säit enregistréiert.''",
        "missingsummary": "'''Erënnerung:''' Dir hutt kee Resumé aginn.\nWann Dir nacheemol op \"{{int:savearticle}}\" klickt, gëtt Är Ännerung ouni Resumé ofgespäichert.",
        "missingcommenttext": "Gitt w.e.g. eng Bemierkung an.",
        "revdelete-selected-text": "{{PLURAL:$1|Erausgesicht Versioun|Erausgesicht Versioune}} vu(n) [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Erausgesicht Versioun|Erausgesicht Versioune}} vum Fichier vu(n) [[:$2]]:",
        "logdelete-selected": "Ausgewielten {{PLURAL:$1|Evenement|Evenementer}} aus dem Logbuch:",
+       "revdelete-text-text": "Geläscht Versioune bleiwen am Historique vun der Säit, awer Deeler vun hirem Inhalt sinn net ëffentlech zougänglech.",
+       "revdelete-text-file": "Geläscht Versioune vu Fichiere bleiwen am Historique vum Fichier awer Deeler vun hirem Inhalt sinn net ëffentlech zougänglech.",
        "revdelete-text-others": "Aner Administrateure kënnen nach ëmmer de verstoppten Inhalt gesinn an en nees restauréieren, ausser wann zousätzlech Limitatiounen agestallt sinn.",
        "revdelete-confirm": "Confirméiert w.e.g. datt Dir dat maache wëllt, datt Dir d'Konsequenze verstitt an datt Dir dëst an Aklang mat de [[{{MediaWiki:Policy-url}}|Richtlinne]] maacht.",
        "revdelete-suppress-text": "Ënnerdréckung sollt '''nëmmen''' an dëse Fäll benotzt ginn:\n* Informatiounen déi beleidege kéinten\n* Net ubruechte perséinlechen Informatiounen\n*: ''Adressen, Telefonsnummeren, Sozialversécherungsnummeren asw.''",
        "searchrelated": "a Verbindng",
        "searchall": "all",
        "showingresults": "Hei gesitt der  {{PLURAL:$1| '''1''' Resultat|'''$1''' Resultater}}, ugefaange mat #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' vu(n) '''$3'''|Resultater '''$1 - $2''' vu(n) '''$3'''}} fir '''$4'''",
        "search-nonefound": "Fir Är Ufro gouf näischt fonnt.",
        "powersearch-legend": "Erweidert Sich",
        "powersearch-ns": "Sichen an den Nummraim:",
        "unwatchedpages": "Net iwwerwaacht Säiten",
        "listredirects": "Lëscht vun de Viruleedungen",
        "listduplicatedfiles": "Lëscht vu Fichiere mat Doublonen",
+       "listduplicatedfiles-summary": "Dëst ass eng Lëscht vu Fichiere wou déi lescht Versioun vum Fichier en Doublon vun der leschter Versioun vun engem anere Fichier ass. Et ginn nëmme lokal Fichiere consideréiert.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] huet [[$3|{{PLURAL:$2|een Doublon|$2 Doublonen}}]].",
        "unusedtemplates": "Net benotzt Schablounen",
        "unusedtemplatestext": "Op dëser Säit stinn all Säiten aus dem {{ns:template}} Nummraum, déi a kenger anerer Säit benotzt ginn. Vergiesst net nozekucken, ob et keng aner Linken op dës Schabloune gëtt, ier Dir eng Schabloun läscht.",
        "randomincategory": "Zoufälleg Säit an der Kategorie",
        "randomincategory-invalidcategory": "\"$1\" ass kee valabelen Numm fir eng Kategorie.",
        "randomincategory-nopages": "Et gëtt keng Säiten an der [[:Category:$1]].",
-       "randomincategory-selectcategory": "Eng zoufälleg Säit aus der Kategorie: $1 $2 opruffen",
-       "randomincategory-selectcategory-submit": "Lass",
+       "randomincategory-category": "Kategorie:",
+       "randomincategory-legend": "Zoufälleg Säit an der Kategorie",
        "randomredirect": "Zoufälleg Viruleedung",
        "randomredirect-nopages": "Am Nummraum $1 gëtt et keng Viruleedungen.",
        "statistics": "Statistik",
        "querypage-disabled": "Dës Spezialsäit ass aus Performance-Grënn ausgeschalt.",
        "booksources": "Bicherreferenzen",
        "booksources-search-legend": "No Bicherreferenze sichen",
-       "booksources-go": "Sichen",
+       "booksources-search": "Sichen",
        "booksources-text": "Hei ass eng Lëscht mat Linken op Internetsäiten, déi nei a gebraucht Bicher verkafen. Do kann et sinn datt Dir méi Informatiounen iwwer déi Bicher fannt déi Dir sicht.",
        "booksources-invalid-isbn": "D'ISBN-Nummer déi Dir uginn hutt schéngt net gëlteg ze sinn. Kuckt w.e.g. no ob beim Kopéiere kee Feeler geschitt ass.",
        "specialloguserlabel": "Aktive Benotzer:",
        "trackingcategories-msg": "Tracking-Kategorie",
        "trackingcategories-name": "Numm vum Message",
        "noindex-category-desc": "D'Säit gëtt net vu Botten indexéiert, well dat magescht Wuert <code><nowiki>__NOINDEX__</nowiki></code> dran ass a well se an engem Nummraum ass, an deem déi Markéierung erlaabt ass.",
+       "index-category-desc": "D'Säit huet <code><nowiki>__INDEX__</nowiki></code> an ass an engem Nummraum, wou déi Markéierung erlaabt ass an dofir gëtt d'Säit vu Sichroboter indexéiert wou dat normalerweis net de Fall wier.",
        "post-expand-template-inclusion-category-desc": "D'Säit ass méi grouss wéi <code>$wgMaxArticleSize</code> nom expandéiere vun alle Schablounen, dofir goufen e puer Schablounen net expandéiert.",
        "broken-file-category-desc": "D'Säit huet e futtise Link op e Fichier (e Link op en agebonnene Fichier wann et de Fichier net gëtt).",
        "hidden-category-category-desc": "D'Kategorie huet <code><nowiki>__HIDDENCAT__</nowiki></code> an hirer Säit drastoen, dat verhënnert datt se standardméisseg an der Këscht mat de Kategorielinken op der Säit gewise gëtt.",
        "wlheader-enotif": "E-Mail-Notifikatioun ass ageschalt.",
        "wlheader-showupdated": "Säiten déi zanter Ärer leschter Visite geännert goufen, si '''fett''' geschriwwen",
        "wlnote": "Hei {{PLURAL:$1|ass déi lescht Ännerung|sinn déi lescht <strong>$1</strong> Ännerunge}} vun {{PLURAL:$2|der leschter Stonn|de leschte(n) <strong>$2</strong> Stonnen}}, Stand: $3 ëm $4 Auer.",
-       "wlshowlast": "D'Ännerunge vun de leschte(n) $1 Stonnen, $2 Deeg oder $3 (an de leschten 30 Deeg) weisen.",
+       "wlshowlast": "D'Ännerunge vun de leschte(n) $1 Stonnen, $2 Deeg oder  (an de leschten 30 Deeg) weisen.",
        "watchlist-options": "Optioune vun der Iwwerwaachungslëscht",
        "watching": "Iwwerwaachen …",
        "unwatching": "Net méi iwwerwaachen …",
        "exbeforeblank": "Den Inhalt virum Läsche war: '$1'",
        "delete-confirm": "Läsche vu(n) \"$1\"",
        "delete-legend": "Läschen",
-       "historywarning": "'''Opgepasst:''' Déi Säit déi Dir läsche wëllt huet en Historique mat ongeféier $1 {{PLURAL:$1|Versioun|Versiounen}}:",
+       "historywarning": "<strong>Opgepasst:</strong> D'Säit déi Dir läsche wëllt huet en Historique mat $1 {{PLURAL:$1|Versioun|Versiounen}}:",
        "confirmdeletetext": "Dir sidd am Gaang, eng Säit mat hirem kompletten Historique vollstänneg aus der Datebank ze läschen.\nW.e.g. confirméiert, datt Dir dëst wierklech wëllt, datt Dir d'Konsequenze verstitt, an datt dat Ganzt am Aklang mat de [[{{MediaWiki:Policy-url}}|Richtlinne]] geschitt.",
        "actioncomplete": "Aktioun ofgeschloss",
        "actionfailed": "Aktioun huet net funktionéiert",
        "delete-edit-reasonlist": "Läschgrënn änneren",
        "delete-toobig": "Dës Säit huet e laangen Historique, méi wéi $1 {{PLURAL:$1|Versioun|Versiounen}}.\nD'Läsche vu sou Säite gouf limitéiert fir ongewollte Stéierungen op {{SITENAME}} ze verhënneren.",
        "delete-warning-toobig": "Dës Säit huet eng laang Versiounsgeschicht, méi wéi $1 {{PLURAL:$1|Versioun|Versiounen}}.\nD'Läschen dovu kann zu Stéierungen am Fonctionnement vun {{SITENAME}} féieren;\ndës Aktioun soll mat Virsiicht gemaach ginn.",
-       "delete-cantedit": "Dir däerft dës Säit net läsche well Dir net d'Recht hutt fir se z'änneren.",
+       "deleteprotected": "Dir däerft dëst Säit net läsche well se gespaart ass.",
        "deleting-backlinks-warning": "'''Opgepasst:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Aner Säite]] linken op déi Säit déi Dir am Gaang sidd ze läschen oder déi Säit Déi Dir am Gaang sidd ze läschen ass an aner Säiten agebonn.",
        "rollback": "Ännerungen zrécksetzen",
        "rollback_short": "Zrécksetzen",
        "unblocked": "D'Spär fir de [[User:$1|Benotzer $1]] gouf opgehuewen",
        "unblocked-range": "D'Spär vum $1 gouf opgehuewen",
        "unblocked-id": "D'Spär $1 gouf opgehuewen",
+       "unblocked-ip": "D'Spär vum [[Special:Contributions/$1|$1]] gouf opgehuewen.",
        "blocklist": "Gespaart Benotzer",
        "ipblocklist": "Gespaart Benotzer",
        "ipblocklist-legend": "No engem gespaarte Benotzer sichen",
        "import": "Säiten importéieren",
        "importinterwiki": "Transwiki-Import",
        "import-interwiki-text": "Sicht eng Wiki an e Säitentitel eraus fir z'importéieren.\nD'Versiounsdatumen an d'Benotzernimm bleiwen dobäi erhalen.\nAll Transwiki-Import-Aktioune ginn am [[Special:Log/import|Import-Logbuch]] protokolléiert.",
-       "import-interwiki-source": "Quelle Wiki/Säit:",
+       "import-interwiki-sourcewiki": "Quellwiki:",
+       "import-interwiki-sourcepage": "Originalsäit:",
        "import-interwiki-history": "Importéier all d'Versioune vun dëser Säit",
        "import-interwiki-templates": "Mat alle Schablounen",
        "import-interwiki-submit": "Import",
        "exif-urgency-low": "Niddreg ($1)",
        "exif-urgency-high": "Héich ($1)",
        "exif-urgency-other": "Benotzerdefinéiert Prioritéit ($1)",
-       "watchlistall2": "all",
        "namespacesall": "all",
        "monthsall": "all",
        "confirmemail": "E-Mailadress confirméieren",
        "logentry-upload-overwrite": "$1 huet eng nei Versioun vu(n) $3 {{GENDER:$2|eropgelueden}}",
        "logentry-upload-revert": "$1 huet $3 {{GENDER:$2|eropgelueden}}",
        "rightsnone": "(keen)",
+       "revdelete-summary": "Resumé änneren",
        "feedback-bugornote": "Wann Dir bereet sidd fir en technesche Problem am Detail ze beschreiwen da [$1 mellt w.e.g. e Feeler (Bug)].\nSoss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gëtt op d'Säit \"[$3 $2]\" derbäigesat, zesumme mat Ärem Benotzernumm an dem Numm vum Browser deen Dir benotzt.",
        "feedback-subject": "Sujet:",
        "feedback-message": "Message:",
        "log-name-pagelang": "Log vum Ännere vun der Sprooch",
        "log-description-pagelang": "Dëst ass a Log mat den Ännerunge vun de Sprooche vun de Säiten.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktivéiert)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desaktivéiert''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desaktivéiert''')",
+       "mediastatistics-table-extensions": "Méiglech Erweiderungen",
+       "mediastatistics-table-count": "Zuel vun de Fichieren",
+       "mediastatistics-header-unknown": "Onbekannt",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videoen",
+       "mediastatistics-header-office": "Office",
+       "json-error-unknown": "Et gouf e Problem mam JSON. Feeler: $1",
+       "json-error-syntax": "Syntaxfeeler"
 }
index 69b197c..c93489e 100644 (file)
        "changeemail": "Э-почта дегишарун",
        "changeemail-none": "(садни)",
        "changeemail-submit": "E-адрес дегишун",
-       "changeemail-cancel": "Гьич авун",
        "bold_sample": "ЯцIу текст",
        "bold_tip": "Къалин текст",
        "italic_sample": "Курсивдин текст",
        "search-relatedarticle": "Галкlанавай",
        "searchrelated": "Галкlанавай",
        "searchall": "вири",
-       "showingresultsheader": "'''$4'''  патал {{PLURAL:$5|1='''$3''' - кай  '''$1''' нетижа|'''$3''' - кай  '''$1 - $2''' нетижаяр}}",
        "search-nonefound": "Тlалабдив кьадай са нетижани жагъанвач.",
        "powersearch-legend": "Гегьенш жугъурун",
        "powersearch-ns": "Жугъурун тlварарин генгвилера:",
        "suppress": "Чуьнуьхун",
        "booksources": "Ктабрин чешмеяр",
        "booksources-search-legend": "Ктабдикай малумат жугъурун",
-       "booksources-go": "Фин",
        "log": "Журналар",
        "allpages": "Вири ччинар",
        "prevpage": "Алатай чар ($1)",
        "watchthispage": "Гелкъуьн и хъувун",
        "unwatch": "Вилив хуьмир",
        "watchlist-details": "Куь вилив хуьнин сиягьда {{PLURAL:$1|1=$1 ччин|$1 ччин}} авайди я, веревирдрин ччинар квачиз.",
-       "wlshowlast": "Эхиримжи $1 сят $2 югъ $3 къалура",
+       "wlshowlast": "Эхиримжи $1 сят $2 югъ  къалура",
        "watchlist-options": "Вилив хуьнин сиягьдин низамарунар",
        "watching": "Килигун...",
        "unwatching": "Амма клигнай",
        "exif-disclaimer": "Жавабдарвал хивяй акъудун",
        "exif-contrast-1": "Жими",
        "exif-sharpness-1": "Жими",
-       "watchlistall2": "вири",
        "namespacesall": "вири",
        "monthsall": "вири",
        "confirm_purge_button": "ЭХь",
index b7592f5..e92a88d 100644 (file)
        "pager-newer-n": "{{PLURAL:$1|1 plu resente|$1 plu resentes}}",
        "pager-older-n": "{{PLURAL:$1|1 plu vea|$1 plu veas}}",
        "booksources": "Orijines de libros",
-       "booksources-go": "Vade",
        "specialloguserlabel": "Usor:",
        "speciallogtitlelabel": "Titulo:",
        "log": "Lista de atas",
        "watchthispage": "Oserva esta paje",
        "unwatch": "Nonoserva",
        "watchlist-details": "{{PLURAL:$1|$1 paje|$1 pajes}} osservada, sin pajes de discutes.",
-       "wlshowlast": "Mostra la $1 oras e $2 dias presedente $3",
+       "wlshowlast": "Mostra la $1 oras e $2 dias presedente",
        "watching": "Oserva...",
        "unwatching": "No oserva...",
        "created": "Creada",
        "metadata-collapse": "Asconde detalias estendeda",
        "metadata-fields": "Campos de EXIF metadata listada en esta mesaje va es inclui cuando la table de metadata es minimida.\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-exposuretime-format": "$1 sec. ($2)",
-       "watchlistall2": "tota",
        "namespacesall": "tota",
        "monthsall": "tota",
        "confirm_purge_button": "Oce",
index ee0185a..192cba7 100644 (file)
        "pager-older-n": "{{PLURAL:$1|ekyasooka bino 1|ebyasooka bino $1}}",
        "booksources": "Ebitabo ebijulizidwa",
        "booksources-search-legend": "Noonya ebitabo eby'okujuliza",
-       "booksources-go": "Nona",
        "specialloguserlabel": "Memba:",
        "log": "Empapula ez'ebyafaayo eby'emirimu egitaligimu",
        "allpages": "Empapula zonna",
        "watchthispage": "Goberera olupapula luno",
        "unwatch": "Lekerawo okugoberera olupapula luno",
        "watchlist-details": "Olina {{PLURAL:$1|olupapula $1|empapula $1}} z'ogoberera, nga tobalideko n'eza yogera-nange.",
-       "wlshowlast": "Ndaga ez'omu ssaawa $1 n'ennaku $2 eziyise oba $3",
+       "wlshowlast": "Ndaga ez'omu ssaawa $1 n'ennaku $2 eziyise oba",
        "watchlist-options": "Enteetakeeka y'endaga ya mpapula zengoberera",
        "watching": "Kikolebwako...",
        "unwatching": "Kikolebwako...",
        "metadata-expand": "Laba ebisingawo",
        "metadata-collapse": "Kisako ebimu, wasigalewo ebisinga obukulu",
        "metadata-fields": "Ebiddako bye ebikwata ku fayiro eno ebyagiwandikibwamu ekyagitegekera kompyuta ebijakusigala nga biragibwa.<br />\nEbirala biyinza butalabika okujjako ng'okiragidde.\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",
-       "watchlistall2": "Zonna",
        "namespacesall": "Gonna",
        "monthsall": "gyonna",
        "confirm_purge_button": "Kale",
index e09c114..7e37ade 100644 (file)
        "passwordreset-emailsent-capture": "d'r Is 'ne herinneringse-mail versjik. Deze weurt hieónger getuind.",
        "passwordreset-emailerror-capture": "d'r Is 'ne herinneringse-mail aangemaak. Deze weurt hieónger getuind. 't Verzènje nao de gebroeker is mislök óm de volgende raeje: $1",
        "changeemail": "Veranger dien e-mailadres",
-       "changeemail-header": "Veranger 't e-mailadres van miene gebroekersnaam",
        "changeemail-text": "Völ dit form in óm dien e-mailadres te verangere. Doe mós dien wachwaord inveuren óm dees veranger te bevestige.",
        "changeemail-no-info": "Doe moos aangemeld zien ierdets doe dees pagina gebroeke kens.",
        "changeemail-oldemail": "Hujig mailadres:",
        "changeemail-newemail": "Nuuj mailadres:",
        "changeemail-none": "(gein)",
        "changeemail-submit": "Veranger e-mail",
-       "changeemail-cancel": "Braek aaf",
        "bold_sample": "Vètten teks",
        "bold_tip": "Vetten teks",
        "italic_sample": "Sjuunsen tèks",
        "searchrelated": "gerelateerd",
        "searchall": "alle",
        "showingresults": "Hieonger staon de <b>$1</b> {{PLURAL:$1|resultaat|resultaat}}, vanaaf #<b>$2</b>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultaat '''$1''' van '''$3'''|Resultate '''$1 - $2''' van '''$3'''}} veur '''$4'''",
        "search-nonefound": "D'r zien gein resultate veur diene zeukopdrach.",
        "powersearch-legend": "Oetgebreid zeuke",
        "powersearch-ns": "Zeuke in naamruumdes:",
        "querypage-disabled": "Dees speciaal pagina steit oet veur performanceredene.",
        "booksources": "Bookwinkele",
        "booksources-search-legend": "Zeuk informatie euver 'n book",
-       "booksources-go": "Zeuk",
        "booksources-text": "Hiej onger stuit 'n lies met koppelinge nao anger websites die nuuje of gebroekde beuk verkoupe, en die wellich meer informatie euver 't book detse zeuks höbbe:",
        "booksources-invalid-isbn": "t Ingegaeve ISBN liek neet geldig te zeen.\nControleer of se wellich n fout höbs gemaak bie de inveur.",
        "specialloguserlabel": "Oetveurder:",
        "wlheader-enotif": "Doe wörs per e-mail gewaarsjuwd",
        "wlheader-showupdated": "Pazjena's die verangerd zeen saers doe ze veur 't lètste bekeeks sjtaon '''vet'''",
        "wlnote": "Hieónger {{PLURAL:$1|steit de lètste verangering|staon de lètste $1 verangeringe}} van {{PLURAL:$2|'t lètste oer|de lètste <b>$2</b> oer}} óp $3 óm $4.",
-       "wlshowlast": "Tuin lètste $1 ore $2 daag $3",
+       "wlshowlast": "Tuin lètste $1 ore $2 daag",
        "watchlist-options": "Opties veur volglies",
        "watching": "Bezig mit plaatse op de volglies...",
        "unwatching": "Oet de volglies aan 't haole...",
        "import": "Pazjena's importere",
        "importinterwiki": "Transwiki-import",
        "import-interwiki-text": "Selecteer 'ne wiki en pazjenanaam om te importere.\nVersie- en auteursgegaeves blieve hiej bie bewaard.\nAlle transwiki-importhanjelinge waere opgeslage in 't [[Special:Log/import|importlogbook]].",
-       "import-interwiki-source": "Bronwiki/pagina:",
        "import-interwiki-history": "Volledige gesjiedenis van deze pazjena ouch kopiëre",
        "import-interwiki-templates": "Alle sjablone opnaeme",
        "import-interwiki-submit": "Importere",
        "exif-urgency-low": "Lieg ($1)",
        "exif-urgency-high": "Hoeg ($1)",
        "exif-urgency-other": "Door gebroeker gedefinieerde prioriteit ($1)",
-       "watchlistall2": "al",
        "namespacesall": "alle",
        "monthsall": "al",
        "confirmemail": "Bevèstig e-mailadres",
        "htmlform-selectorother-other": "Anges",
        "sqlite-has-fts": "Zeuk versie $1 mit óngersteuning veur \"full-text\"",
        "sqlite-no-fts": "Zeuk versie $1 zónger óngersteuning veur \"fulltext\"",
-       "logentry-delete-delete": "$1 haef de pagina $3 gewösj",
+       "logentry-delete-delete": "$1 {{GENDER:$1|haet}} de pagina $3 gewösj",
        "logentry-delete-restore": "$1 haet de pagina $3 trögkgezat",
        "logentry-delete-event": "$1 haet de zichbaarheid van {{PLURAL:$5|'ne logbookregel|$5 logbookregels}} van $3 gewiezig: $4",
        "logentry-delete-revision": "$1 haet de zichbaarheid van {{PLURAL:$5|'n versie|$5 versies}} van $3 gewiezig: $4",
        "logentry-newusers-create2": "$1 haet 'ne gebroeker $3 aangemaak",
        "logentry-newusers-autocreate": "De gebroeker $1 is autematis aangemaak",
        "rightsnone": "(gein)",
+       "revdelete-summary": "samevatting bewerke",
        "feedback-bugornote": "Es se zewied bös óm e technisch perbleem in détail te besjrieve, [$1 rapperteer 'ne bug]. \nAnges kin se-n ouch 't einvawdig formeleer hieónger gebroeke. Dien commentaar zal waere toegeveug ane pagina \"[$3 $2]\", same mit diene gebroekersnaam enne browser dae se gebruuks.",
        "feedback-subject": "Óngerwerp:",
        "feedback-message": "Berich:",
index c475327..3a1d771 100644 (file)
        "passwordreset-emailtitle": "Dettaggi account sciu {{SITENAME}}",
        "passwordreset-emailelement": "Nomme utente: $1\nPoula segretta temporannia: $2",
        "changeemail": "Cangia l'adresso e-mail",
-       "changeemail-header": "Cangia l'adresso e-mail de questa utensa",
        "changeemail-newemail": "Noeuvo adresso e-mail",
        "changeemail-none": "(nisciun)",
        "changeemail-password": "A to password pe {{SITENAME}}:",
        "changeemail-submit": "Cangia e-mail",
-       "changeemail-cancel": "Annulla",
        "resettokens-token-label": "$1 (oua o l'è: $2)",
        "bold_sample": "Grascetto",
        "bold_tip": "Grascetto",
        "search-suggest": "Fòscia ti voéivi: $1",
        "searchrelated": "corelæ",
        "searchall": "tùtti",
-       "showingresultsheader": "{{PLURAL:$5|Rizoltato '''$1''' di '''$3'''|Rizoltati '''$1 - $2''' de '''$3'''}} pe '''$4'''",
        "search-nonefound": "Mi n'ho atrovòu ninte",
        "preferences": "Preferençe",
        "mypreferences": "Preferençe",
        "booksources": "Fonte libraie",
        "booksources-search-legend": "Çerca e fonti",
        "booksources-isbn": "Codice ISBN:",
-       "booksources-go": "Vànni",
        "booksources-text": "De sotta unn-a lista de ingançi a ätri sciti che vendan neuvi e vegi libbri, e che peuvre avei informaçioin in sci libbri che ti te çerchi",
        "specialloguserlabel": "Ûtente:",
        "speciallogtitlelabel": "Tittolo:",
        "watchthispage": "Vigilâ 'sta paggina",
        "unwatch": "Leva da sott'oservaçion",
        "watchlist-details": "A lista d'oservaçión speçiâle a contegne {{PLURAL:$1|ina pàgina (co-a seu pàgina de discusción)|$1 de pàgine (co-e so pàgine de discusción)}}.",
-       "wlshowlast": "Famme vedde e ûrtime $1 ôe $2 giorni $3",
+       "wlshowlast": "Famme vedde e ûrtime $1 ôe $2 giorni",
        "watchlist-options": "Inpostaçioìn di oservæ speciâli",
        "watching": "Inti osservæ speçiâli...",
        "unwatching": "Scassâ da-i osservæ speçiâli",
        "exif-copyright": "Diritti d'autô de",
        "exif-filesource": "Reixe do papê",
        "exif-languagecode": "Lengua",
-       "watchlistall2": "Tùtti",
        "namespacesall": "Tùtti",
        "monthsall": "tutti",
        "imgmultipageprev": "← Pagina de primma",
index 80bfa6b..f875f91 100644 (file)
        "passwordreset-emailsent": "Gh'è stat mandàt vià 'na e-mail de redefinisiù de la password.",
        "passwordreset-emailsent-capture": "Gh'è stat mandàt vià chèsta e-mail de redefinisiù de la password:",
        "changeemail": "Càmbia l'indirìs e-mail",
-       "changeemail-header": "Càmbia l'indirìs e-mail de l'ütènsa",
        "changeemail-none": "(nisü)",
        "changeemail-password": "La password sö {{SITENAME}}:",
        "changeemail-submit": "Càmbia l'indirìs e-mail",
-       "changeemail-cancel": "Scancèla l'operasiù",
        "changeemail-throttled": "Te g'hét fat tròp tacc tentatìf de autenticàt, adès te g'hét de spetà $1 per püdì turnà a pröà.",
        "resettokens": "Redefenés i tokens",
        "resettokens-no-tokens": "Gh'è nisü token de redefenéser.",
        "unusedtemplates": "Templat mia druvaa",
        "unusedtemplateswlh": "alter culegament",
        "randompage": "Una pagina a cas",
-       "randomincategory-selectcategory-submit": "Và",
        "randomredirect": "Un redirect a cas",
        "statistics": "Statistich",
        "statistics-header-pages": "Statistegh di paginn",
        "pager-older-n": "{{PLURAL:$1|1|$1}} püssee vegg",
        "booksources": "Surgent per i lìber",
        "booksources-search-legend": "Cerca i fónt di liber",
-       "booksources-go": "Va",
        "specialloguserlabel": "Ütent:",
        "speciallogtitlelabel": "Asiù fàda sö:",
        "log": "Register",
        "unwatch": "Tegn pü d'ögg",
        "unwatchthispage": "Desmèt de tègner d'öcc",
        "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginn}} tegnüü sot ögg, fö che i paginn de discüssión.",
-       "wlshowlast": "Fa vidé i ültim $1 ur $2 dì $3",
+       "wlshowlast": "Fa vidé i ültim $1 ur $2 dì",
        "watchlist-options": "Upzión lista d'ussevazión",
        "watching": "Giuntà ai pagin da ten d'ögg...",
        "unwatching": "Eliminà dai pagin da ten d'ögg...",
        "exif-stripoffsets": "Puzisiù dei dati de la foto",
        "exif-rowsperstrip": "Nömer de rìghe per fàsa",
        "exif-imagedescription": "Tìtol de la foto",
-       "watchlistall2": "tücc",
        "namespacesall": "tücc",
        "monthsall": "tücc",
        "confirmemail": "Cunferma l<nowiki>'</nowiki>''e-mail''",
index 7f03841..f262071 100644 (file)
        "move": "Nyanganyisize",
        "movethispage": "Nyanganyisize bye petulo",
        "booksources": "Desusorsi",
-       "booksources-go": "Afi",
        "specialloguserlabel": "Sebelu:",
        "speciallogtitlelabel": "Sebu:",
        "log": "Desuni",
        "unwatchthispage": "Ngambu kentezi",
        "notanarticle": "Ni di petulo infomelo",
        "watchlist-details": "{{PLURAL:$1|$1 petulo|$1 petulo}} sa kentezi e no bulelezi.",
-       "wlshowlast": "Kamukile lapu-lila $1 holani $2 dia $3",
+       "wlshowlast": "Kamukile lapu-lila $1 holani $2 dia",
        "watching": "Kentezi...",
        "unwatching": "Dikentezi...",
        "enotif_impersonal_salutation": "{{SITENAME}} sebelu",
        "metadata-collapse": "Cwankekile petulo tabu",
        "metadata-fields": "EXIF metadata fields mukoloko kwa mulumiwa sa ike kwa imegipetulo ka metadata tablu sa tibekile. Xetewi sa cwankekile auto.\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-imagedescription": "Sebu di imegi",
-       "watchlistall2": "xeti",
        "namespacesall": "xeti",
        "monthsall": "xeti",
        "confirm_purge_button": "Afi",
index e5b7208..9058ecd 100644 (file)
        "index-category": "بلگيا سيائه دار",
        "noindex-category": "بلگيا بی سيائه",
        "broken-file-category": "بلگیایی که هوم پیوند فایلیا اشکسه دارن",
+       "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "دباره",
        "article": "محتوا بلگه",
        "newwindow": "(نيمدری  تازه وا کو)",
        "otherlanguages": "د زونيا هنی",
        "redirectedfrom": "(ورگشتن د$1)",
        "redirectpagesub": "بلگه دوباره ورگشتن",
+       "redirectto": "واگردونی سی:",
        "lastmodifiedat": "ای بلگه تازه ايا وضع آلشت بيه د $1, د $2.",
        "viewcount": "ای بلگه قاول دسترسی بيه {{PLURAL:$1|once|$1 times}}.",
        "protectedpage": "بلگه حفاظت بيه",
        "versionrequired": "یه نسقه د نیازمنیا ویکی رسانه\n$1",
        "versionrequiredtext": "نسقه $1 ویکی مدیا سی وه کار بستن د ای بلگه لازم هئی .\nوه نه بوینیت [[ویجه:نسقه|نسقه بلگه]].",
        "ok": "خوئه",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "بازيافته د\"$1\"",
        "youhavenewmessages": "شما داريت $1($2)",
        "youhavenewmessagesfromusers": "{{جمی:$4|شما }} $1 د {{جمی:$3|کارور هنی|$3 کاروریا}}داریتو($2).",
        "site-atom-feed": "خور حون Atom سی $1",
        "page-rss-feed": "خورحو RSS سی «$1»",
        "page-atom-feed": "خور حون Atom سی $1",
+       "feed-atom": "اتم",
+       "feed-rss": "آر اس اس",
        "red-link-title": "$1(بلگه وجود ناره)",
        "sort-descending": "كم بيئن منظم",
        "sort-ascending": "زياد بيئن منظم",
        "nocookiesnew": "حساو کاروری راس بی،اما شما وامئن نیامایئته.{{نوم مالگه}} د کوکیا سی اومائن د سیستم کاروریا استفاده می که.کوکیا شما د کار افتائه.لطفن وا کارشو بونیت، اوسه وا نوم کاروری تازه و پسورد هنی بیایت وا مئن.",
        "nocookieslogin": "{{نوم مالگه}} د کوکیا سی وامئن اومائن کاروریا استفاده می که. کوکیا شما د کار افتائه.\nلطف بکید د کارشو بونیت و دوواره تلاش بکید.",
        "nocookiesfornew": "حساو کاروری راس نبیه، سی یه ایما نتونیم سرچشمه ونه مئکم بکیم.\nمطمئن بوئیت که کوکیا فعال بینه، ای بلگه نه د نو سوار بکید و د نو تلاش بکید.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "شما یه گل نوم کاروری خو ناریت",
        "loginsuccesstitle": "اومائن د سيستم موفق بی",
        "loginsuccess": "شما ایسه وارد بیته {{SITENAME}} د دعنوان \"$1\".'",
        "createaccount-text": "یه نفر وا تیرنشون انجونامه تو یه گل حساو راس کرده{{نوم دیارگه}} ($4) نومشه نیائه\"$2\", با پاسورد \"$3\".\nشما همی ایسه باید روئیت وامین و پاسوردتونه آلشت بکیت.\n\nار شما ای پیغوم نه وش التفات نکیت، د راس بیین ای حساو خطا دروس موئه.",
        "login-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید",
        "login-abort-generic": "اومائن وامین تو شکست حرد-شکست حرده",
+       "login-migrated-generic": "حساو کاریاری شما جا وه جا بیه، و نوم کاریاری شما دیه د ای ویکی نیئش.",
        "loginlanguagelabel": "زون:$1",
        "suspicious-userlogout": "درحاست وه در رئتن شما انکار بیه سی یه کل وه نظر میا که د یه گل دووارته نیئر گن یا یه گل پروکسی که ها د ویرگه نهو کل بیه",
        "createacct-another-realname-tip": "نوم راستکی دل به حائه.\nار شما وه نه نهااماییه بکیت، یه سی هوم نسبت دئن وه کاریار   سی کاریاش استفاده بوئه.",
        "user-mail-no-body": "سی کل کردن ایمیل وا مینونه حالی یا کؤچک بیئن سی دلیل غیر علقمنی تلاش بکید.",
        "changepassword": "پاسورد نه آلشت بكيت",
        "resetpass_announce": "سی تموم کردن وا مین اومائن، شما باید یه گل پاسورد هنی وارد بکیتو.",
+       "resetpass_text": "<!-- یه گل نیسسه ایچه اضاف بکیت -->",
        "resetpass_header": "پاسورد حساوتونه آلشت بکید",
        "oldpassword": "پاسورد قدیمی:",
        "newpassword": "پاسورد تازه:",
        "passwordreset-capture-help": "ار شما ای جعوه نه وارسی بکید. ایمیل و خوئی اوسه که سی کارور کل بیه بوئه بوینیتش.",
        "passwordreset-email": "نشونی ايميل",
        "passwordreset-emailtitle": "جزئیات حساو ها د {{نوم مالگه}}",
+       "passwordreset-emailtext-ip": "یه کسی(شات خوتو، وا تیرنشون آی پی $1) سی د نو زنه کردن رازینه گواردن تو د {{SITENAME}}  درحاست کرده($4).\nسی کاریار «$2» یه گل رازینه گواردن موقتی دروس بیه و و هؤمبراور «$3» ئه.\nار تمارزو تو یه بیه ایسه باید بیایت وامین سامونه و یه گل رازینه گواردن هنی بهاییت\nرازینه گواردن شما د طیل {{PLURAL:$5|یه رو|$5 رو}} باطل بوئه.\n\nار کس هنی چنی درحاستی کرده یا یه که شما رازینه گواردن دمایی خوتونه د ویر اوردیت و تر نمیهایت ونه آلشت بیئت، می تونیت د ای پیغوم تیه پوشی بکیت و همو رازینه گواردن دمایی نه وه کار به ونیت.",
+       "passwordreset-emailtext-user": "کاریار $1 د {{SITENAME}} د نو زنه کردن رازینه گواردن شمانه د{{SITENAME}} ($4) کرده. {{PLURAL:$3|حساو|حساویا}} کاریاری که هان د هار د وا ای تیرنشون انجومانامه ها د ارتواط:\n\n$2\n\n{{PLURAL:$3|ای رازینه گواردن موقت|ای رازینه گواردنیا موقت}} تا {{PLURAL:$5|یه رو|$5 رو}} باطل بوئه.\nار کس هنی چنی درحاستی کرده یا یه که شما رازینه گواردن دمایی خوتونه د ویر اوردیت و تر نمیهایت ونه آلشت بیئت، می تونیت د ای پیغوم تیه پوشی بکیت و همو رازینه گواردن دمایی نه وه کار به ونیت.",
        "passwordreset-emailelement": "نوم کاروری: $1\nپاسورد موقتی: $2",
        "passwordreset-emailsent": "پاسورد هنی سی ایمیل کل بیه.",
        "passwordreset-emailsent-capture": "پاسورد تازه تو د ایمیلتو که د هار نشو دئه بیه کل بیه",
        "passwordreset-emailerror-capture": "رازینه گواردن د انجومانامه د نو زنه کننه راس بیه، و وه د هار دیاری می که، اما کل بیین وه د{{جنس:$2|کاریار}} شکست حرده:$1",
        "changeemail": "ایمیل تو نه آلشت بکید",
-       "changeemail-header": "ایمیل حساوتونه آلشت بکید",
        "changeemail-text": "ای نوم بلگه نه سی آلشت دئن تیرنشون انجومانامه تو پر بکیت. شما سی پشت راس کردن ای آلشت واس رازینه گواردن خوتونه وارد بکیت.",
        "changeemail-no-info": "شما با بیایت د سیستم تا د ای بلگه دسرسی داشتویت",
        "changeemail-oldemail": "نشونی ایمیل تازه باو:",
        "changeemail-none": "(هيش كوم)",
        "changeemail-password": "شما {{SITENAME}} پاسورد:",
        "changeemail-submit": "آلشت کردن ایمیل",
-       "changeemail-cancel": "انجوم شیوسن",
        "changeemail-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید.",
        "resettokens": "تازه کردن نشونه یا",
        "resettokens-text": "شما سی صلا دئن دسرسی وه رسینه یا خصوصی که ها د حساو ایچنی تو می تونیت دیارگریا نه د نو زنه بکیت.\n\nشما اوسنی واس ای کار بکیت که رسینه یا شما سی یه کسی تر بئر بیه یا د حساو شما چل بیه.",
        "headline_tip": "قدم 2 خط سر ون",
        "nowiki_sample": "د ایچه یه گل متن بی شلک وارد بکید",
        "nowiki_tip": "شلک ویکی نه ندید بگر",
+       "image_sample": "Example.jpg",
        "image_tip": "جانیا محاط بيه",
+       "media_sample": "Example.ogg",
        "media_tip": "فایل هوم پیوند",
        "sig_tip": "امضا شما و برچسو وخت",
        "hr_tip": "خط افق ونه(سوا سوا دش استفاده کو)",
        "showpreview": "پيش نمائش نشون بيئه",
        "showdiff": "آلشتيانه نشون بيئه",
        "blankarticle": "<strong>زنئار:</strong> بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"{{int:savearticle}}\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.",
-       "anoneditwarning": "زنهار شما وامین نیومایته.\nنشونی آی پی تو د ویرگار ویرایشت ای بلگه ضفط بوئه",
+       "anoneditwarning": "<strong>زئنار:</strong> شما هنی نیوماته وامین. تیرنشون آی پی شما هر گاتی که آلشتی راس بکیت سی کل خلک دیاره. ار <strong>[$1 روئیت وامین]</strong> یا <strong>[$2 یه گل حساو کاریاری راس بکیت]</strong>، ویرایشتیا شما وه نوم کاریاری خوتون دیاری می که، و وا چیا بیتر هنی.",
        "anonpreviewwarning": "<em>شما نیومائته وامین. تیرنشون آی پی شما د ویرگار ویرایشت ای بلگه اماییه بوئه.</em>",
        "missingsummary": "<strong>د ویر ونا:</strong> شما هنی یه گل چکسته ویرایشتی نها اماییه نکردیته.\nار شما د نو د ری\"{{int:savearticle}}\" بپورنیت, ویرایشت شما حالی اماییه بوئه.",
        "missingcommenttext": "لطفن د ایچه نظر بیئتو",
        "nonunicodebrowser": "<strong>زئنار:دووارته نئر شما وا نیسسه یا یونیکد سازگاری ناره.</strong>\nیه گل راحل وه کار گرته بیه سی یه که شما بلگه یا نه وا امنیت ویرایشت بکیت:\nنیسه یا غیر-ASCII  د پایه رازینه یا 16 تایی دتو نشو دئه بوئه.",
        "editingold": "<strong>زئنار:شما داریت یه گل وانئری نا به هنگوم بیه نه سی ای بلگه ویرایشت می کید</strong>\nار شما ونه اماییه بکیت،هر آلشتی که د اول سی ای وانئری انجوم بیه گم بوئه.",
        "yourdiff": "فرخيا",
+       "copyrightwarning": "لطفن د ویرتو با که ایچه فرض بوئه که همه هومیاریا شما وا{{SITENAME}} د شکل «$2» درتیچ بوئن(سی چیا تر روئیت وه $1).\nار نمیهایت که که نیسسه یاتو که فره ویرایشت بینه و دلحا درتیچ بان، د ایچه کلشو نکیت.<br />\nهمچنو شما داریت وه ایما قول میئیت که خوتو ونونن نویسنیته، یا ونه د یه گل سرچشمه آزاد وا بئرکرد همگونی یا چی وه ؤرداشتیته.\n'''کاریایی که حق درتیچسن (copyright) دارن بی صلا کل نکیت!'''",
+       "copyrightwarning2": "لطفن د ویرتو با که ایچه فرض بوئه که همه هومیاریا شما وا{{SITENAME}} د شکل «$2» درتیچ بوئن(سی چیا تر روئیت وه $1).\nار نمیهایت که که نیسسه یاتو که فره ویرایشت بینه و دلحا درتیچ بان، د ایچه کلشو نکیت.<br />\nهمچنو شما داریت وه ایما قول میئیت که خوتو ونونن نویسنیته، یا ونه د یه گل سرچشمه آزاد وا بئرکرد همگونی یا چی وه ؤرداشتیته.\n'''کاریایی که حق درتیچسن (copyright) دارن بی صلا کل نکیت!'''",
        "longpageerror": "<strong>خطا:نیسسه شما  {{جمی:$1|یه کلوبایت|$1 کلوبایت}}  درازی نه دئه، که ونو د بیشرونه انازه{{جمی:$2|یه کلوبایت|$2 کلوبایت}} گپترن.</strong>\nنبوئه وه اماییه با.",
        "readonlywarning": "<strong>زئنار:رسینه گا سی واداشت قلف بیه، سی یه نه که شما ایسه نمی تونیت ویرایشتیاتونه اماییه بکیت.</strong>\nشات شما بحایت که نیسسه خوتونه د جانیا نیسسه ای وردار بدیس بکیت و ونه سی نهاتر اماییه بکیت.\n\nدیوونداری که ونه قلف کرده چنی گوته:$1",
        "protectedpagewarning": "<strong>زئنار:ای بلگه سی یه پر و پیم بیه که کاریاریایی که دسرسی دیوونداری دارن فقط بتونن دش ویرایشت بکن.</strong>\nآخرین سیائه سی سرچشمه یا د هار اماییه کاری بیه:",
        "template-protected": "(حمايت بيه)",
        "template-semiprotected": "(نيم-حفاظت بيه)",
        "hiddencategories": "ای بلگه يه اندوم د{{PLURAL:$1|1 hidden category|$1 hidden categories}}: هئ",
+       "edittools-upload": "-",
        "nocreatetext": "{{نوم مالگه}} سی راس کردن بلگه یا تازه محدود بیه.\nشما تونید روئیت وادما و بلگه ای که هئیش ویرایشت بکید ، یا [[ویجه:وامین اومائن کاریار|بیایت وامین یا یه گل حساو بسازیت]].",
        "nocreate-loggedin": "شما حق ناریت  که بلگه یا تازه نه راس بکید.",
        "sectioneditnotsupported-title": "ویرایشت بخش حمایت نبوئه",
        "revdelete-text-file": "وانئریا پاکسا بیه هنی د بلگه ویرگار دیاری می کن،اما به شیا مینونه یاشو د مین خلک دیار نیئن.",
        "logdelete-text": "وانئریا پاکسا بیه هنی د بلگه ویرگار دیاری می کن،اما به شیا مینونه یاشو د مین خلک دیار نیئن.",
        "revdelete-text-others": "دیوونداریا هنی می تونن د مینونه یا قام بیه دسرسی داشتوئن و ونه د نو زنه بکن، مه ر محدودیتیا اضافی میزوکاری بان.",
+       "revdelete-confirm": "لطفن بکید پشت راسی بکیت که میهایت ای کار نه انجوم بیئت، و یه دل بایت که شما نتیجه یا ای کار نه فئمستیته و ای کار نه  مطاوق وا  [[{{MediaWiki:Policy-url}}|the policy]].انجوم می ئیت",
+       "revdelete-suppress-text": "پاکساگری فقط با <strong>تئنا</strong> سی جایایی که هان د هار وه کار گرته بوئه:\n*دونسمنیایی که فره تنادارن\n*دونسمنیا نامناسو شخصی\n*: <em>تیرنشون حونه، شماره تیلیفون،رازینه زایاره ای و چیا تر</em>",
        "revdelete-legend": "میزونکاری محدودیتیا دیار بیین.",
        "revdelete-hide-text": "متن دوواره دیئن",
        "revdelete-hide-image": "چی یا مئن فایل قام کو",
        "revdel-restore": "آلشت وضئيت ديئن",
        "pagehist": "ويرگار بلگه",
        "deletedhist": "ویرگار پاکسا بیه",
+       "revdelete-hide-current": "خطا د قام کردن چی که ها د ویرگار $2 ساعت $1: ای نسقه، نسقه ایسنی یه و نبوئه نهوش بکیت.",
+       "revdelete-show-no-access": "خطا د قام کردن چیی که ها د ویرگار $2 ساعت $1: ای نسقه نشون «مئن تنگلا بیئن» داره و شما نمی تونیت وه ش دسرسی داشتویت.",
+       "revdelete-modify-no-access": "خطا د قام کردن چیی که ها د ویرگار $2 ساعت $1: ای نسقه نشون «مئن تنگلا بیئن» داره و شما نمی تونیت وه ش دسرسی داشتویت.",
+       "revdelete-modify-missing": "خطا د قام کردن چی شمارهٔ $1: ای نسقه د رسینه گا نیئش!",
+       "revdelete-no-change": "'''زئنار:''' چی که ها د ویرگا $2 ساعت $1 د دماتر دیاری میزونکاری حاسته بینه داشته.",
+       "revdelete-concurrent-change": "خطا د قام کردن چیی که ها د ویرگار $2 ساعت $1: وه ویر و باور میا که د او گاتی که شما سی آلشت دئن حال و بار وه سعی می کردیته، حال و بارش وه دس کسی تر آلشت دئه بیه.\nلطفن پهرستنومه یا نه وارسی بکیت.",
+       "revdelete-only-restricted": "خطا د قام کردن چیی که ها د ویرگار $2 ساعت $1: شما نیمی تونیت چیانه د ورتیه دیوونداریا قام بکیتو مر یه که یه گل د گزینه یا دیاری کردن هنی نه انتخاو بکیت.",
+       "revdelete-reason-dropdown": "*دلیلیا جاونه سی پاکسا کردن\n** تیه پوشی د حق درتیچ کردن\n** ویر و باور یا دونسمنیا شخصی نامناسو\n** نوم کاریاری نامناسو\n** دونسمنیا فره تنادار",
        "revdelete-otherreason": "دلیل هنی:",
        "revdelete-reasonotherlist": "دلیل هنی",
        "revdelete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
        "revdelete-offender": "نیسنه وانیری:",
        "suppressionlog": "پهرستنومه پاکسازی",
+       "suppressionlogtext": "د هار یه گل نوم گه ای هئ که مینونه یا پاکسا بیه و قلف بیه  که هان دش د ورتیه دیوونداریا قام بینه.\n[[ویجه:نوم گه قلف بیه|نوم گه قلف بیئنیا]]نه سی نوم گه ایی که انجومکاریا قدقن بیه و قلف بینیا هان دش بونیت.",
        "mergehistory": "ویرگاریا بلگه نه یکی بکید",
        "mergehistory-header": "ای بلگه وه شما اجازه می ئه که وانیریانه ویرگار سرچشمه بلگه نه د یه گل بلگه تازه سریک سازی بکید.\nمطمئن بویت که ای آلشت د لحاظ ویرگاری د مین بلگه موندگار هئ.",
        "mergehistory-box": "دوواره دیئن دوبلگه ای نه سر یک سازی کو:",
        "mergehistory-from": "بلگه سرچشمه:",
        "mergehistory-into": "بلگه مقصد:",
        "mergehistory-list": "ویرگار ویرایشت سر یک سازی بیئنی",
+       "mergehistory-merge": "نسقه یا هاری که د [[:$1]] وه یک شیوسنی وا[[:$2]] هئن.\nستین دگمه یا رادیویی نه به کار به ونیت سی یه که نسقه یایی نه که د گاتی دماتر دروس بینه انتخاو بکیت.\nد ویرتو با که پورسن ری پیوندیا باعث بوئه که ستین وه شکل اولیه خوش ؤرئرده.",
        "mergehistory-go": "ویرایشتیایی که سریک سازی بوئن نشو بیئه",
        "mergehistory-submit": "سر یک سازی دوواره دیئنیا",
        "mergehistory-empty": "هیپ دوواره دیئنی نبوئه یکی سازی بوئه.",
        "mergehistory-success": "$3 {{جمی:$3|وانیری|وانیریا}} د [[:$1]] وه خوئی د [[:$2]] سریک سازی بی.",
        "mergehistory-fail": "سریک سازی ویرگار انجوم نبوئه، لطفن پینیاریا زمون و بلگه نه د نو وارسی بکید.",
+       "mergehistory-fail-toobig": "نبوئه وه یک شیوسن ویرگان انجوم دئه سی یکه وه بیشتر د محدودیت $1 {{PLURAL:$1|نسقه}}جا وه جا موئه.",
        "mergehistory-no-source": "سرچشمه بلگه $1 وجود ناره.",
        "mergehistory-no-destination": "بلگه مقصد $1 وجود ناره.",
        "mergehistory-invalid-source": "نوم ون بلگه سرچشمه با معتور بوئه.",
        "mergehistory-comment": " [[:$1]]وا[[:$2]] یکی بیه:$3",
        "mergehistory-same-destination": "سرچشمه و بلگه یا مقصد نبوئه یکی بوئن",
        "mergehistory-reason": "دليل:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "سریک سازی پهرستنومه",
        "pagemerge-logentry": " [[$1]] وا [[$2]] سریک سازی بی (وانیریا که د $3 فره تر هئن)",
        "revertmerge": "بی لوئه",
+       "mergelogpagetext": "شما د هار نوم گه آخرین چیا وه یک شیوسن ویرگار یه بلگه نه د بلگه تر میئنیت.",
        "history-title": "دوواره دیئن ویرگار$1",
        "difference-title": "فرخ مینجا وانیریا \"$1\"",
        "difference-title-multipage": "فرخ مینجا بلگه یا \"$1\" و \"$2\"",
        "showhideselectedversions": "شلک دیئن وانیریا انتخاو بیه نه آلشت بکید",
        "editundo": "رد كردن",
        "diff-empty": "(بی فرق)",
+       "diff-multi-sameuser": "({{PLURAL:$1|یه گل نسقه مینجایی|$1 نسقه یا مینجایی}} وه دس{{PLURAL:$2|کاریاری تر|$2 کاریاریا}} نشو دئه نبیه)",
+       "diff-multi-otherusers": "({{PLURAL:$1|یه گل نسقه مینجایی|$1 نسقه یا مینجایی}} وه دس{{PLURAL:$2|کاریاری تر|$2 کاریاریا}} نشو دئه نبیه)",
        "diff-multi-manyusers": "({{جمی:$1|یه گل وانیری مینجاگرته|$1وانیریا مینجا گرته}} بیشتر د $2 {{جمی:$2|کارور|کاروریا}} نشو دئه نبیه)",
+       "difference-missing-revision": "{{PLURAL:$2|یه گل ویرایشت|$2 ویرایشت}} د فرق مینجا($1) {{PLURAL:$2|پیدا نبی|پیدا نبینه}}.\n\nشایت بانی جاونه وه وا یه گل ویرگار وه هنگوم نبیه که د یه گل بلگه پاکسا بیه هوم پیوند بیه بوئه.\nشایت جزئیات د   [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]  پیدا بوئن.",
        "searchresults": "نتيجه يا پی جوری",
        "searchresults-title": "نتيجه يا پی جوری سی \"$1\"",
        "titlematches": "عنوان بلگه مطاوقت داره",
        "search-relatedarticle": "مرتوط",
        "searchrelated": "مرتوط",
        "searchall": "همه",
-       "showingresultsheader": "{{PLURAL:$5|نتيجه '''$1''' د'''$3'''|نتيجه يا '''$1 - $2''' د'''$3'''}} سيli'''$4'''",
+       "showingresults": "نمائشت بیشترونه {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} د هار، شرو د شماره'''$2'''.",
+       "showingresultsinrange": "نمائشت بیشترونه {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} د هار، شرو د شماره'''$2''' تا شماره '''$3'''.",
+       "search-showingresults": "{{PLURAL:$4|نتیجه یا<strong>$1</strong> د <strong>$3</strong>|نتیجه یا<strong>$1 - $2</strong د <strong>$3</strong>}}",
        "search-nonefound": "هیژ نتیجه یی سی پی جست تو مطاوقت نکرده",
        "powersearch-legend": "پی جوری پیشبرده",
        "powersearch-ns": "نوم جايا نوم ديار بگرد:",
        "powersearch-togglelabel": "چك كردن:",
        "powersearch-toggleall": "همه",
        "powersearch-togglenone": "هيش كوم",
+       "powersearch-remember": "د ویر داشتن انتخاو سی پی جوریا نهایی",
        "search-external": "پی جوری د در",
+       "searchdisabled": "مئن جوری د {{SITENAME}} کنشتگر نئ.\nموقتاً می تونیت مئن جوری Google نه بونیت وه کار.\nد ویرتو با که نتیجه یایی که د مئن جوری وا او روشت وه دست میان شایت وه روز نبان.",
        "search-error": "یه گل خطا سی اوسنی که پی جوری می کردیت اتفاق افتائه:$1",
        "preferences": "خصوصيات هنی",
        "mypreferences": "خصوصيات هنی",
        "prefs-edits": "شماره ویرایشتا:",
+       "prefsnologintext2": "لطف بکیت بیایت وامین و ترجیحات خوتونه آلشت بئیت.",
        "prefs-skin": "پوست",
        "skin-preview": "پیش سیل",
+       "datedefault": "هیچ ترجیحات دش نئ",
+       "prefs-labs": "گزینشتیا آزمایشتی",
        "prefs-user-pages": "بلگیا كارور",
        "prefs-personal": "پروفایل کارور",
        "prefs-rc": "آلشتیا تازه باو",
        "prefs-watchlist": "سیل برگ",
        "prefs-watchlist-days": "روزیا نه د سیل برگ نشو دئه بو:",
        "prefs-watchlist-days-max": "$1 بیشترونه {{جمی:$1|روز|روزیا}}",
+       "prefs-watchlist-edits": "بیشترونه انازه آلشتیایی که د سیل برگ گپ بیه نشو دئه بیه:",
        "prefs-watchlist-edits-max": "شماره بیشترونه:1000",
        "prefs-watchlist-token": "نشونه سیل برگ:",
        "prefs-misc": "شيوسن",
        "prefs-email": "چیا هنی انجومانامه",
        "prefs-rendering": "شلک و ری",
        "saveprefs": "اماییه كردن",
+       "restoreprefs": "د نو زنه کردن همه میزونکاریا پیش فرض(د همه جایا)",
        "prefs-editing": "د حالت ويرايشت",
        "rows": "رديفيا:",
        "columns": "ستينا:",
        "searchresultshead": "پی جوری",
+       "stub-threshold": "آستونه ویرایشتیا د یک دیسسه<a href=\"#\" class=\"stub\">ناقص</a> (بایت):",
        "stub-threshold-disabled": "د كار ونن",
        "recentchangesdays": "روزیا آلشتیا تازه باو نه نشو بیه:",
        "recentchangesdays-max": "$1 بیشترونه {{جمی:$1|روز|روزیا}}",
        "recentchangescount": "انازه ویرایشتیایی که دیاری می که:",
        "prefs-help-recentchangescount": "یه شامل آلشتیا تازه،ویرگاریا بلگه و پهرستنومه یا هئ.",
+       "prefs-help-watchlist-token2": "یه یه گل کلیت رازینه دار سی خوارک تیارگه سیل برگه شمانه.\nهر کسی که شما مئشناسیت می تونه سیل برگ شما نه بوحونه،په ونه هومبئری نکیت.[[Special:ResetTokens|ار لازمه ونه آلشت بئیت ایچه نه بپورنیت]].",
        "savedprefs": "ویجه گیا هنی تو اماییه بیه.",
        "timezonelegend": "وخت راساگه",
        "localtime": "وخت ولاتی:",
        "prefs-custom-css": "سی اس اس جاافتائه",
        "prefs-custom-js": "جاوا نیسسه جاافتائه",
        "prefs-common-css-js": " سی اس اس/جاوا اسکریپت بهر بیه سی همه پوسه یا:",
+       "prefs-reset-intro": "شما می تونیت ای بلگه سی د نو زنه کردن ترجیحات خوت وه شکل تیارگه پیش فرض وه کار بوونیت.\nیه ورئشت پذیر نئ.",
        "prefs-emailconfirm-label": "مئکم کردن ایمیل:",
        "youremail": "ايميل:",
        "username": "{{جنس:$1|نوم کاروری}}:",
        "prefs-memberingroups": "{{جنس:$2|اندوم}}  {{جمی:$1|گرویا|گرویا}}:",
+       "prefs-memberingroups-type": "$1",
        "prefs-registration": "موقع ثوت نام:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "نوم راستكی:",
        "yourlanguage": "زون:",
        "yourvariant": "محتوا آلشتگر زون:",
+       "prefs-help-variant": "قسه وری انتخاوی شما سی نمائشت مینونه بلگه یا د ای ویکی.",
        "yournick": "امضا تازه:",
+       "prefs-help-signature": "ویر و باوریا نیسسه بیه د بلگه چک چنه باید وا«<nowiki>~~~~</nowiki>» امضا بان؛ ای نشون وه شکل خودانجومی وه امضا شما و مؤر ویرگار تبدیل بوئه.",
+       "badsig": "امضا خؤم بی اعتوار.\nسردیسیا اچ تی ام ال نه وارسی بکیت.",
+       "badsiglength": "امضا شما فره گپه.\nطیل امضا باید کمتر  د $1 {{PLURAL:$1|نیسه}} بوئه.",
        "yourgender": "شما بیشتر میهایت که چه جوری گوته بوئه؟",
        "gender-unknown": "مه میهام چی یی نموئم",
        "gender-male": "وه(پیا) بلگه یا ویکی نه ویرایشت می که",
        "gender-female": "وه(زئنه)بلگه یا ویکی نه ویرایشت می که",
+       "prefs-help-gender": "انجوم دئن ای میزونکاری دل به هاییه.\nنرم افزار سی هشاره درست وه جنسیت و گوتن شما سی کسونا تر د شکل درست وه کار بسن یه گل دستور زون یه نه وه کار می بنه.\nای دونسمنیا سی کل خلک دیارن.",
        "email": "پیومک برقی",
+       "prefs-help-realname": "نوم راستکی دل به حائه.\nار شما ونه وارد بکیت د گات واگردونی وه آرنگیاتو و نسوت دئن ونو وه خوتو د نوم راستکی استفاده بوئه.",
        "prefs-help-email": "نشونی ایمیل اختیاری هئ.اما سی بازجست پاسورد دش نیاز بوئه.شما باید پاسوردتونه د ویر بوریت",
        "prefs-help-email-others": "شما می تونید سی پیوند گرتن تو وا نهایین ایمیل مئن یه هوم پیوند د بلگه کاروری یا بلگه چک چنه تو انتخاو بکید.\nنشونی ایمیلتو وختی که کاروریا هنی وا تو پیوند می گرن دیار نی.",
        "prefs-help-email-required": "نشونی ایمیل لازم هئ.",
        "prefs-displaywatchlist": "گزینه یا نه نشو بیه",
        "prefs-tokenwatchlist": "نشو",
        "prefs-diffs": "فرخیا",
+       "prefs-help-prefershttps": "کارگرایی ای ترجیح نها وامین اومائن نهایی شما وه کار گرته بوئه.",
+       "prefswarning-warning": "آلشتیا شما ری ترجیحاتتو هنی اماییه نبیه.\nار ای بلگه نه بی یه که ری \"$1\" بپورنیت ول بکیت ترجیحیا شما اماییه نبوئن.",
+       "prefs-tabs-navigation-hint": "نکته: شما می تونید د کلیتیا لادیار کن چپ و راست نه سی رئتن مین تبیا که هان د نوم گه تبیا وه کار بونیت.",
        "email-address-validity-valid": "نشونی ایمیل دیار بیه خوئه",
        "email-address-validity-invalid": "یه گل نشونی ایمیل خو وارد بکید",
        "userrights": "حقوق دیوونداری کاریار",
        "userrights-lookup-user": "دسه یا کاروری نه دیوون داری بکیت",
        "userrights-user-editname": "نوم كاروری ته وارد كو",
        "editusergroup": "ویرایشت گرویا کاروری",
+       "editinguser": "آلشت دئن حقوق کاریاری کاریار'''[[کاریار:$1|$1]]''' $2",
        "userrights-editusergroup": "ویرایشت گرویا کاروری",
        "saveusergroups": "اماییه کردن گرویا کاریاری",
        "userrights-groupsmember": "اندوم:",
+       "userrights-groupsmember-auto": "اندوم ضمنی:",
+       "userrights-groupsmember-type": "$1",
+       "userrights-groups-help": "شما می تونیت دسه یای که ای کاریار ها دشو آلشت بئیتو:\n* جعوه نشودار وه ای مئنیه که کاریار ها د او دسه.\n* جعوه بی نشون وه ای مئنیه که کاریار د او دسه نئ.\n* نشون* د ای مئنیه که ار شما او دسه نه اضاف بکیتو د نهاتر نموئه ؤردارینش یا برعسگش.",
        "userrights-reason": "دليل:",
        "userrights-no-interwiki": "شما سی ویرایشت حقوق کارور د ویکی یا هنی دسرسی ناریت.",
        "userrights-nodatabase": "پاگا دونسمنی $1 یا نیئش یا د ولاتنشین نئ.",
+       "userrights-nologin": "شما باید وا یه گل حساو کاریاری دیووندار [[Special:UserLogin|روئیت وامین ]] تا تونستوییت حقوق کاریاری کاریار نه گماشته کاری بکیت.",
        "userrights-notallowed": "شما سی اضاف کردن  حقوق کارور یا ورداشتنش دسرسی ناریت.",
        "userrights-changeable-col": "گرویایی که شما تونیت ویرایشت بکید",
        "userrights-unchangeable-col": "گرویایی که شما نتونیت ویرایشت بکید",
+       "userrights-irreversible-marker": "$1*",
+       "userrights-conflict": "تعارض دسرسیا کاریاری! لطف بکیت یه گل وارسی انجوم بئیت و آلشتانه پشت راس بکیت.",
+       "userrights-removed-self": "شما د خوئی حقوق خوتونه ؤرداشتیته، چی یه که مثلا شما تر نمی تونیت وه ای بلگه دسرسی داشتویت.",
        "group": "گرو",
        "group-user": "کاروریا",
        "group-autoconfirmed": "کاروریا خودوادار",
        "group-bot": "بتیا",
        "group-sysop": "مدیریا",
        "group-bureaucrat": "بروکراتیا",
+       "group-suppress": "تیه پایا",
        "group-all": "(همه)",
        "group-user-member": "{{جنس:$1|کارور}}",
        "group-autoconfirmed-member": "{{جنس:$1|کاریار خودانجومکار}}",
        "group-bot-member": "{{حنس:$1|بوت}}",
        "group-sysop-member": "{{جنس:$1|مدیر}}",
        "group-bureaucrat-member": "{{جنس:$1|بروکرات}}",
+       "group-suppress-member": "{{جنس:$1|تیه پا}}",
        "grouppage-user": "{{ns:project}}:کاروریا",
        "grouppage-autoconfirmed": "{{ns:project}}:کاریار خودانجومکار",
        "grouppage-bot": "{{ns:project}}:بوت یا",
        "grouppage-sysop": "{{ns:project}}:دیوونداریا",
        "grouppage-bureaucrat": "{{ns:project}}:دیوونداریا",
+       "grouppage-suppress": "{{ns:project}}:تیه پا",
        "right-read": "حنن بلگیا",
        "right-edit": "ویرایشت بلگیا",
        "right-createpage": "بلگه یا نه راس بکیت(ونو که دشو بلگه یا چک چنه نئ)",
        "right-createtalk": "بلگه یا چک چنه نه راس بکید",
        "right-createaccount": "یه گل حساو کاروری تازه راس بکیت",
+       "right-minoredit": "نشودار کردن همه ویرایشتیا چی حیرده",
        "right-move": "بلگه یا جا وه جا کو",
        "right-move-subpages": "بلگه یا و زیر بلگه یا شونه جا وه جا کو",
        "right-move-rootuserpages": "بلگه یا ریشه ای کارور نه جا وه جا کو",
        "right-movefile": "فایلیا نه جا وه جا کو",
        "right-suppressredirect": "اوسه که بلگه یا د بین رئتنه هیچ واگردونی سی بلگه یا سرچشمه دروس نبیه",
        "right-upload": "سوار کردن فايلا",
+       "right-reupload": "سوارکرد هنی جانیایی که دماتر بئیشه",
+       "right-reupload-own": "سوارکرد هنی جانیایی که د دماتر وه دس همو کاریار سوارکرد بیه.",
+       "right-reupload-shared": "باطل‌کردن ولات نشینی جانیایا هومبئر بیه",
        "right-upload_by_url": "سوار کرد فایلیا د یو آر ال",
+       "right-purge": "پاک کردن مینجاگر بلگه بی یه که بلگه پشت راس کردن دیاری بکه",
+       "right-autoconfirmed": "د محدودیتیا سرعت آی پی-پایه کارگرایی ناره",
+       "right-bot": "باور بیه چی یه گل پردازشت خودانجوم",
+       "right-nominornewtalk": "حیرده ویرایشت بلگه یا چک چنه وه شکلی که باعث گوتن پیغوم تازه نبوئه.",
+       "right-apihighlimits": "سخم بالاتر د وه کار بسن API",
        "right-writeapi": "د نیسنن ای پی آی استفاده بکید",
        "right-delete": "بلگیا نه پاکسا کو",
        "right-bigdelete": "بلگه یایی که ویرگار گپی دارن پاکسا بکیت",
+       "right-deletelogentry": "پاکسا کردن و ناپاکسا کردن داده واریایی ویجه ای د پهرستنومه",
+       "right-deleterevision": "پاکساکردن و ناپاکساکردن وانئریا ویجه ای د بلگه یا",
+       "right-deletedhistory": "دیئن چیا پاکسا بیه د ویرگار، بی یه که نیسسه ونونه بؤنیت.",
+       "right-deletedtext": "دیئن نیسسه پاکسا بیه و آلشتیایی که هان مینجا وانئریا پاکسا بیه",
        "right-browsearchive": "بلگه یا پاک بیه نه پی جوری کو",
        "right-undelete": "ای بلگه نه حذف نكيد",
+       "right-suppressrevision": "دیئن و زنه کردن وانئریایی بلگه یایی که د دس کاریاریا نهو بینه",
+       "right-viewsuppressed": "دیئن وانئریایی که د تیه هر کاریاری قام بیه",
        "right-suppressionlog": "دیئن پهرستنومه یا خصوصی",
        "right-block": "کاریاریا هنی د ویرایشت منع بوئن",
        "right-blockemail": "کاریار نه د کل کردن انجومانامه منع کو",
+       "right-hideuser": "قلف کردن یه گل نوم کاریاری،قام کردن وه د ور تیه کل خلک",
+       "right-ipblock-exempt": "کارگرایی نگرتن د قطع دسرسیا آی پی، خودانجوم یا فاصله دار",
+       "right-proxyunbannable": "کارگرایی نگرتن د قطع دسرسی خودکار پروکسیا",
        "right-unblockself": "خوشه قلف نکید",
+       "right-protect": "آلشت دئن انازه پر و پیم کردن بلگه یا و ویرایشت بلگه یا پر و پیم بیه تافی",
+       "right-editprotected": "ویرایشت بلگه یا پر و پیم بیه چی «{{int:protect-level-sysop}}»",
+       "right-editsemiprotected": "ویرایشت بلگه یا پر و پیم بیه چی «{{int:protect-level-autoconfirmed}}»",
        "right-editinterface": "راوط کارور نه ویرایشت کو",
        "right-editusercssjs": "فایلیا جاوا اسکریپت و سی اس اس کاروریا هنی نه ویرایشت کو",
        "right-editusercss": "فایلیا سی اس اس کاروریا هنی نه ویرایشت کو",
        "right-editmyusercss": "فایلیا سی اس اس کارور خوتو نه ویرایشت کو",
        "right-editmyuserjs": "فایلیا جاوا اسکریپت کارور خوتو نه ویرایشت کو",
        "right-viewmywatchlist": "سیل برگ خوتونه بوینیت",
+       "right-editmywatchlist": "سیل برگ خوتونه ویرایشت بکیت. د ویرتو با که پاره ای د انجومکاریا بی دسرسی ئم می تونن ای بلگه یا نه اضافه بکن.",
        "right-viewmyprivateinfo": "دونسمنیا شصقی خوتونه بوینیت(چی نشونی ایمیل،نوم راستکی)",
        "right-editmyprivateinfo": "دونسمنیا شصقی خوتونه ویرایشت بکید(چی نشونی ایمیل،نوم راستکی)",
        "right-editmyoptions": "اولویتیا تونه ویرایشت بکیت",
+       "right-rollback": "چواشه کردن سریع ویرایشتیا آخری کاریاری که یه بلگه ویجه نه ویرایشت دئه",
+       "right-markbotedits": "نشودار کردن ویرایشتیا چواشه بیه چی ویرایشتیا یه گل بات",
+       "right-noratelimit": "کارگرا نبیئن د محدودیت سرعت",
+       "right-import": "بلگه یا نه د ویکی هنی وارد بکید",
        "right-importupload": "دئن بلگه یا د یه گل جانیا سوار بیه",
+       "right-patrol": "سردیاری کردن د ویرایشتیا کسونا تر",
+       "right-autopatrol": "سردیاری کردن خودانجوم د ویرایشتیا خوش",
+       "right-patrolmarks": "دیئن سردیس سردیاری کردن د آلشتیا ایسنی",
        "right-unwatchedpages": "دیئن نوم گه بلگه یا دیئه نبیه",
+       "right-mergehistory": "وه یک شیوسن ویرگار ای بلگه",
        "right-userrights": "حقوق همه کاروریانه ویرایشت بکید",
        "right-userrights-interwiki": "حقوق همه کاروریانه د ویکی یا هنی ویرایشت بکید",
        "right-siteadmin": "پاگا دونسمنی نه قلف بکید یا نکید",
+       "right-override-export-depth": "وه در دئن بلگه یایی که بلگه یا هوم پیوند بیه تا پی یا 5 ها دشو",
        "right-sendemail": "سی کاروریا هنی ایمیل کل بکید",
        "right-passwordreset": "پاسورد ایمیلیا د نو دئه بیه نه بوینیت",
        "newuserlogpage": "راس بیه وا کارور",
        "newuserlogpagetext": "یه پهرستنومه راس بیئن کارور هئ.",
+       "rightslog": "پهرستنومه حقوق کاریار",
        "rightslogtext": "یه پهرستنومه آلشتیا حقوق کارور هئ.",
        "action-read": "ای بلگه نه بحون",
        "action-edit": "ای بلگه نه ويرايشت بكيد",
        "action-move": "لی بلگه جا وه جا کو",
        "action-move-subpages": "ای بلگه و زیر بلگه یاشه جا وه جا بکید",
        "action-move-rootuserpages": "بلگه یا ریشه ای کارور نه جا وه جا بکید",
+       "action-move-categorypages": "جا وه جا کردن دسه بلگه یا",
        "action-movefile": "ای فایل جا وه جا بکید",
        "action-upload": "ای فایل سوار بکید",
+       "action-reupload": "نیسئین ری جانیا ایسنی",
+       "action-reupload-shared": "باطل کردن ای جانیا ری یه گل گنجینه هومبئر",
        "action-upload_by_url": "ای فایله نه د یو آر ال سوار بکید",
        "action-writeapi": "د نیسنن ای پی آی استفاده بکید",
        "action-delete": "ای بلگه نه پاکسا کو",
        "action-deletedhistory": "ویرگار پاکسا بیه ای بلگه نه بوینیت",
        "action-browsearchive": "بلگه یا پاک بیه نه پی جوری بکید",
        "action-undelete": "ای بلگه نه پاک نکو",
+       "action-suppressrevision": "وانئری و زنه کردن وانئریا پاک بیه",
        "action-suppressionlog": "ای پهرستنومه خصوصی نه بوینیت",
        "action-block": "ای کارور نه د ویرایشت کردن منع کو",
        "action-protect": "ریترازیا حفاظت د ای بلگه نه آلشت بکید",
+       "action-rollback": "چواشه کردن سریع ویرایشتیا آخری کاریاری که یه بلگه ویجه نه ویرایشت دئه",
        "action-import": "بلگه یا نه د ویکی هنی وارد بکید",
        "action-importupload": "بلگه یا نه د فایل سوار بیه وارد بکید",
+       "action-patrol": "سردیاری کردن د ویرایشتیا کسونا تر",
+       "action-autopatrol": "سردیاری کردن د ویرایشتیا خوتو",
        "action-unwatchedpages": "دیئن نوم گه بلگه یا دیئه نبیه",
+       "action-mergehistory": "وه یک شیوسن ویرگار ای بلگه",
        "action-userrights": "حقوق همه کاروریانه ویرایشت بکید",
        "action-userrights-interwiki": "حقوق همه کاروریانه د ویکی یا هنی ویرایشت بکید",
        "action-siteadmin": "پاگا دونسمنی نه قلف بکید یا نکید",
        "enhancedrc-history": "ويرگار",
        "recentchanges": "تغيريا تازه",
        "recentchanges-legend": "گزينه يا آلشتيا تازه",
+       "recentchanges-summary": "دو بیشتر آلشتیا تازباو نه د ویکی نه د ای بلگه پیگری کو.",
+       "recentchanges-noresult": "هیژ آلشتی د طیل دوره دیار بیه وا ای معیاریا یکی نبی.",
        "recentchanges-feed-description": "دو بیشتر آلشتیا تازباو نه د ویکی که ها د هوال حون پیگری کو.",
        "recentchanges-label-newpage": "ای ويرايشت يه بلگه تازه راس كرده",
        "recentchanges-label-minor": "يه ويرايشت كؤچكيه",
        "recentchanges-label-plusminus": "انازه بلگه وه شمار ای بایتیا آلشت کرده.",
        "recentchanges-legend-heading": "'''میراث:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "د هار آلشتیا د $2 هیئن(د بال د $1 نشون دئه بیه)",
        "rclistfrom": "آلشتیا تازه ایی که وا $3 $2 شرو بیه نشونش بئه",
        "rcshowhideminor": "ويرايشتيا کؤچک $1",
        "minoreditletter": "م",
        "newpageletter": "ن",
        "boteditletter": "ب",
+       "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 دینه {{جمی:$1|کاریار|کاریاریا}}]",
        "rc_categories": "دسه یا نه محدود کو(وا \"|\" جگا بوئن",
        "rc_categories_any": "هرکوم",
+       "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{جمی:$1|بایت|بایتیا}} نها آلشت",
        "newsectionsummary": "/* $1 */ بخش تازه",
        "rc-enhanced-expand": "جزيات نشون بيئه",
        "upload": "بلم گير كردن فايلا",
        "uploadbtn": "سوار کردن فایل",
        "reuploaddesc": "سوار کردن نه انجوم شیو بکیت و د ورئردیت جابلگ سوارکرد",
+       "upload-tryagain": "کل کردن توضیحیا آلشت دئیه بیه جانیا",
        "uploadnologin": "وارد نبیه",
        "uploadnologintext": "لطفن $1 سی سوارکرد جانیایا.",
+       "upload_directory_missing": "نشونگه سوارکرد ($1) وجود ناره و نبوئه دروسش بکی.",
+       "upload_directory_read_only": "نشونگه سوارکرد($1) د لا سرور قاول نیسنن نئ.",
        "uploaderror": "خطا د سوار کردن",
+       "upload-recreate-warning": "'''زئنار: جانیایی که وه ای نومه یا پاکسا بیه یا جا وه جا بیه.'''\n\nسی رائتی، نومگه پاکساگری و جا وه جا کردن ای بلگه ها د هار:",
+       "uploadtext": "دسی دئین جانیایی که  د دماتر سوار بینه روئیت وه  [[Special:FileList|نوم گه جانیایا]] . د نو سوارکردن  د [[Special:Log/upload|نوم گه سوارکردیا]] و پاکساگری جانیایا د [[Special:Log/delete|deletion log]] جاگئر موئه.\n\nنها یه که یه گل جانیانه سوار کردیت می تونیت د سه شکل هاری وه نه د بلگه یا وه کار بونیت:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' سی به کار بسن نسقه کامل جانیا\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' سی به کار بسن یه گل نسقه 200 پیکسلی  د جانیایی که ها د مینه یه گل جعوه  که ها د لا چپ نیسسه که د وه عبارت alt text چی توضیح وه کار بسه بیه\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' سی دروس کردن یه گل هوم پیوند سرراست وه جانیا بی یه که جانیا دیاری بکه نوم بلگه هاری سی سوارکرد جانیایا تازه استفاده بکیت.",
        "upload-permitted": "جورا جانیا مجاز:$1.",
        "upload-preferred": "جورا جانیا مجاز:$1.",
        "upload-prohibited": "جورا جانیا مجاز:$1.",
        "uploadlogpage": "سوارکرد",
+       "uploadlogpagetext": "نومگه هاری یه گل نومگه د آخری سوارکرد جانیایا هئ.\nسی د نو سیل کردن[[Special:NewFiles|عسگدونی جانیایا تازه نه]] به ونیت.",
        "filename": "نوم فایل",
        "filedesc": "چكسته",
        "fileuploadsummary": "چکسه",
        "filereuploadsummary": "آلشتیا فایل:",
        "filestatus": "حال و بال کپی رایت",
        "filesource": "سرچشمه:",
+       "ignorewarning": "تیه پوشی د زئنار و اماییه کردن جانیا",
        "ignorewarnings": "د هر زنهار تیه پوشی کو",
+       "minlength1": "نوم جانیا باید حداقل یه حرف داشتوئه.",
+       "illegalfilename": "نوم جانیا «$1» د وه گیرنه نیسه یایی که د نوم بلگه یا صاحاو اجاره نیئن.\nلطفن نوم جانیا نه آلشت بئیت و ونه د نو نوم بنیت.",
        "filename-toolong": "نوم جانیا شایت گپتر د 240 بایت نبا.",
        "badfilename": "نوم جانیا د \"$1\" آلشت بیه.",
+       "filetype-mime-mismatch": "دماون جانیا «$1.‎» وا نوع MIME وه($2) یکی نئ.",
+       "filetype-badmime": "جانیایی که نوع MIME ونو $1 بوئه سی سوارکرد اجازه دار نیئن.",
+       "filetype-bad-ie-mime": "نبوئه ای جانیانه سوار بکیت سی یه که اینترنت اکسپلورر ونه چی «$1» میشناسه، سی یه که وه یه گل جانیا ناصلادار و شات خطردار با.",
+       "filetype-unwanted-type": "'''«‎.‎$1»''' یه گل جانیا حاستنی نئ.\n{{PLURAL:$3|جانیا ورتیه گر|جانیایا ورتیه گر}} د ای قرارن: $2 .",
+       "filetype-banned-type": "&lrm;'''\".$1\"''' {{PLURAL:$4|یه گل جانیا ناصلاداره|جانیایایی که صلادار نیئن}}.\n{{PLURAL:$3|جانیا صلادار|جانیایا صلادار}} د ای قرارن: $2.",
+       "filetype-missing": "ای جانیا هیچ اضاف کردی ناره(چی \"جی پی جی\")",
        "empty-file": "فایلی که دئی ته حالی بیه.",
        "file-too-large": "فایلی که دئی ته فره گپ بی.",
        "filename-tooshort": "نوم فایل فره کؤچکه.",
        "filetype-banned": "چنی جانیا قدقه بیه.",
+       "verification-error": "جانیا د ازمایشت پشت راسگری نگوارد.",
+       "hookaborted": "آلشتی که میهاستیت دروس بکیت وا یه گل قلاو اضاف کرد انجوم نگرت.",
        "illegal-filename": "نوم فایل اجاره ندئه بیه.",
+       "overwrite": "نیسنن ری یه گل جانیایی که هیئش صلا ندئه بیه",
        "unknown-error": "یه گل خطا نادیار ری ون کرده.",
        "tmp-create-error": "نبوئه جانیا موقتی نه راس بکیتو.",
        "tmp-write-error": "خطا د نیسنن جانیا موقتی.",
+       "large-file": "د تو میهایم که جانیایا د $1 گپتر نبان؛\nانازه ای جانیا $2 ئه.",
+       "largefileserver": "ای جانیا د انازه ای که د وه سرور میزونکاری بیه تا ونه بیئره گپتره.",
+       "emptyfile": "جانیایی که سوار بیه د نظر میا حالی با.\nای مشگل شایت سی خطا انجومیار نویسی د نوم جانیا با.\nلطف بکید که یه نه وارسی بکیت که میهایت ونه وا ای شرایط سوار بکیت.",
+       "windows-nonascii-filename": "ای ویکی حامین دار نوم جانیایا که نیسه یا خاصی نه دارن نئ.",
+       "fileexists": "جانیایی وا ای نوم ایسه هیئش، ار دل مئکم {{GENDER:|نیئت}} که میهایت او جانیا نه آلشت بکیت، لطفن <strong>[[:$1]]</strong> نه وارسی بکیت.\n[[$1|thumb]]",
+       "filepageexists": "بلگه توضیح سی ای جانیا د دماتر د <strong>[[:$1]]</strong> دروس بیه، اما جانیایی وه ای نوم نیئش.\nچکسه ای که وارد می کیت د بلگه توضیح نشو دئه نبوئه.\nسی یه که چکسه شما نشو دئه بوئه، باید ونه وه شکل دسی ویرایشت بکیت.\n[[$1|thumb]]",
+       "fileexists-extension": "جانیایی وه نوم چی ای نوم هیئش: [[$2|thumb]]\n* نوم جانیایی که سوار می کردیت: <strong>[[:$1]]</strong>\n* نوم جانیایی که د دماتر بیئشه: <strong>[[:$2]]</strong>\nمیهایت د یه گل نوم دیارتر استفاده بکیت؟",
+       "fileexists-thumbnail-yes": "د ویر و باور میا که ای جانیا، یه گل عسگ کؤچک بیه (''بن کلیکی'' یا ''thumbnail'') بوئه.\n[[$1|thumb]]\nلطفن جانیا<strong>[[:$1]]</strong> نه وارسی بکیت.\nار جانیایی که وارسی کردیت، همی عسگ د انازه خوشه، نمیحا یه عسگ بن کلیکی اضاف بکیت.",
+       "file-thumbnail-no": "نوم جانیا وا <strong>$1</strong> شرو موئه.\nد ویر و باور میا که ای جانیا، یه گل عسگ ''بندانگشتی'' ''(thumbnail)'' د عسگ گپتر و اصلی با.\nار عسگ وا انازه اصلی نه داریت، ونه سوار بکیت؛ ونه ، نوم جانیا نه آلشت بئیت.",
+       "fileexists-forbidden": "د ایسنی، جانیایی وه همی نوم هیئش، و نبوئه ری نوشت با.\nار هنی میهایت که جانیا خوتونه سوار بکیت، لطفن ؤرئیردیت و یه گل نوم هنی نه بونیت وه کار.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "د ایسنی، جانیایی وا همی نوم د امماره هومبئری جانیایا هیئش.\nار هنی میهایت جانیاتونه سوار بکیت، لطفن ؤرئردیت و جانیا خوتونه وا نوم هنی سوار بکیت.\n[[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "د ویر و باور میا که ای جانیا یه گل نسقه تکراری د  {{PLURAL:$1|جانیا|جانیایا}} هاری با:",
+       "file-deleted-duplicate": "یه گل جانیا چی ای جانیا([[:$1]]) د دماتر پاکسا بیه.\nشما واس ویرگارچه پاکسا بیین او جانیانه دما یه که میهایت سوارش بکیت به ونیت.",
+       "file-deleted-duplicate-notitle": "یه گل جانیا هومبراور وا ای جانیا د دماتر پاکسا بیه و عنوانش پاکساگری بیه.\nشما باس د کسی که د دیئن جانیا پاکساگری بیه دسرسی داره، بهایت که شرایط نه دما سوارکردن هنی وارسی بکه.",
        "uploadwarning": "هشدار سوارکرد",
+       "uploadwarning-text": "لطف بکیت توضیحات جانیا هاری نه آلشت بئیت و د نو تلاش بکیت.",
        "savefile": "جانیا نه اماییه کو",
        "uploaddisabled": "سوار کردن د کار نئ.",
        "copyuploaddisabled": "سوار کردن وا یو آر ال د کار نئ.",
        "uploaddisabledtext": "سوار کرد فایلیا د کار نئ.",
+       "php-uploaddisabledtext": "سوارکرد جانیایا د پی اچ پی ناکشتگر بیه.\nلطفن میزونکاری سوارکرد جانیا نه وارسی بکیت.",
+       "uploadscripted": "ای بلگه مینونه دار رازینه اچ تی امل یا نیسسه یه که شایت وه ناخوشی وا دوراته نیئر واشکافت با.",
+       "uploadscriptednamespace": "ای جانیا اس‌ وی‌ جی نوم جا غیرقانونی '$1' داره.",
        "uploadinvalidxml": "ایکس ام الی که سوار بیه نبوئه نوتیج با.",
        "uploadvirus": "د ای جانیا ویروس هئ!\nجزیات:$1",
+       "uploadjava": "ای جانیا یه گل جانیا زیپه که مینونه دار جانیایی د نوع کلاس جاوائه.\nسوارکردن جانیایا جاوا قدقن بیه، سی یه که شایت ونو صلا دور زئن محدودیتیا امنیتی نه بی ئن.",
        "upload-source": "سرچشمه فایل",
        "sourcefilename": "سرچشمه نوم جانیا:",
        "sourceurl": "سرچشمه يو آر ال:",
        "destfilename": "نوم فایل مقصد:",
        "upload-maxfilesize": "بیشترونه انازه جانیا:$1",
+       "upload-description": "شرح جانیا",
+       "upload-options": "گزینه یا سوارکرد",
        "watchthisupload": "ای جانیا نه بوینیت",
+       "filewasdeleted": "جانیایی وا همی نوم دماتر سوار بیه و نهاش پاکسا بیه\nشما واس $1 نه دما یه که میهایت سوار بکیت بینیتش.",
+       "filename-bad-prefix": "نوم جانیایی که سوار می کیت وا شرو '''$1''' موئه که دماون ویجه سی عسگیا ثوت بیه وا دیربین یا دیجیتاله.\nلطفن یه گل نوم بی تر سی جانیا انتخاو بکیت.",
        "upload-success-subj": "سوار کرد خوش سرانجوم",
        "upload-success-msg": "سوارکرد شما سی [$2] خوو بی.وه د ایچه هئش:[[:{{ns:file}}:$1]]",
        "upload-failure-subj": "مشگل د سوارکردن",
        "upload-failure-msg": "یه گل مشلگل د سوارکردتو سی [$2] بی:$1",
        "upload-warning-subj": "هشدار سوارکرد",
+       "upload-warning-msg": "د نوم بلگه سوارکرد مشگلی بی [$2]. شما می تونیت د[[Special:Upload/stash/$1|نوم بلگه سوارکرد]] ؤیرذیت تا ای مشگل نه برطرف بکیت.",
        "upload-proto-error": "پروتکل نادروس",
+       "upload-proto-error-text": "سوارکرد د د دیرادیر ائتیاج وه تیرنشونیایی داره که وا <code dir=ltr>http://</code> یا <code dir=ltr>ftp://</code> شرو بان.",
        "upload-file-error": "خطا مینونه",
+       "upload-file-error-text": "گات تلاش سی راس کردن یه گل جانیا موقتی د سرور یه گل خطا مینونه پیش اومائه.\nلطفن وا یه گل [[Special:ListUsers/sysop|دیووندار]] تماس بئریت.",
        "upload-misc-error": "خطا سوار کرد ناشناخته",
+       "upload-misc-error-text": "د گات سوارکرد خطایی نادیاری پیش اومائه.\nلطف بکیت یه دل بایت که تیرنشون اینترنتی خو و د دسرسه و هنی تلاش بکیت.\nار مشگل هنی بیئش وا یه گل [[Special:ListUsers/sysop|دیوونداریا]] تماس بئیریت.",
        "upload-too-many-redirects": "ای یو آر ال د ورگیرنه واگردونیا فرئی هئ",
        "upload-http-error": "یه گل خطا اچ تی تی پی پیش اومائه:$1",
        "upload-copy-upload-invalid-domain": "ورداشتن سوارکردیا د ای پوشگئر د دسرس نئ.",
+       "backend-fail-stream": "نبوئه جانیا\"$1\" کل بوئه.",
+       "backend-fail-backup": "نبوئه سی \"$1\" پشتجا گرت.",
        "backend-fail-notexists": "فایل $1 وجود ناره.",
+       "backend-fail-hashes": "گرتن هش یا جانیا سی ری به ری یک نیاین د خوئی انجوم نگرت.",
+       "backend-fail-notsame": "جانیا ناهمتایی ها د $1 .",
        "backend-fail-invalidpath": "\"$1\" ره خوئی سی امائیه کردن نئ.",
        "backend-fail-delete": "نبوئه جانیا $1 پاکسا بوئه",
        "backend-fail-describe": "نبوئه گپ دونسمنیا سی جانیا\"$1\" آلشت بوئه.",
        "backend-fail-closetemp": "نبوئه جانیا موقتی بسته با.",
        "backend-fail-read": "نبوئه جانیا\"$1\" حنه بوئه.",
        "backend-fail-create": "نبوئه د جانیا\"$1\" نوشته با.",
+       "backend-fail-maxsize": "نبوئه ری جانیا $1 دونسمنیایی نی سن سی یه که گپتر د{{PLURAL:$2|به بایت|$2 بایت}} ئه.",
+       "backend-fail-readonly": "حامین «$1» د ایسنی د حال و بار فقط حننیه.دلیل دئه بیه ینه: «$2»",
+       "backend-fail-synced": "جانیا «$1» ها د حامین داریا اماییه بیه مینونه دار که حال و بارش لیزنگرته یه.",
+       "backend-fail-connect": "وا حامین دار اماییه «$1» ارتواط جاگیری نبی.",
+       "backend-fail-internal": "خطا نادیاری د حامین دار اماییه «$1»  پیش اوما.",
+       "backend-fail-contenttype": "دیارکرد نوع مینونه جانیا سی اماییه «$1» د انجومشیو بی.",
+       "backend-fail-batchsize": "یه گل دسه مینونه دار $1 {{PLURAL:$1|انجومگری|انجومگری}} جانیا وه حامین اماییه دئه بیه؛ بیشترونه مجاز $2 {{PLURAL:$2|انجومگر|انجومگر}} ئه.",
+       "backend-fail-usable": "امکان حنن یا نیسنن جانیا $1 وجود ناشت سی یه که ری تراز دسرسی خو نئ یا لشک/اماییه دار حاستنی نیئش.",
+       "filejournal-fail-dbconnect": "امکان وصل بیئن د رسینه گا نوشتگه سی حامین داری د اماییه کاری «$1» وجود ناشت.",
+       "filejournal-fail-dbquery": "امکان وصل بیئن د رسینه گا نوشتگه سی حامین داری د اماییه کاری «$1» وجود ناشت.",
+       "lockmanager-notlocked": "نبوئه قلف $1 نه وا بکیت؛ سی یه که وه قلف نبیه.",
        "lockmanager-fail-closelock": "نبوئه قلف جانیا سی \"$1\" بسه بوئه.",
+       "lockmanager-fail-deletelock": "نبوئه قلف جانیا سی \"$1\" پاکسا بوئه.",
+       "lockmanager-fail-acquirelock": "نبوئه سی «$1» قلف وه دس اورد.",
        "lockmanager-fail-openlock": "نبوئه قلف جانیا سی \"$1\" وا بوئه.",
+       "lockmanager-fail-releaselock": "نبوئه قلف «$1» نه وا کرد .",
+       "lockmanager-fail-db-bucket": "امکان ارتواط خو وا رسینه گا قلفیا د اماییه دار $1 وجود ناشت.",
+       "lockmanager-fail-db-release": "نبوئه قلفیا سرور $1 نه وا بکیت.",
+       "lockmanager-fail-svr-acquire": "نبوئه سی «$1» قلف وه دس اورد.",
+       "lockmanager-fail-svr-release": "نبوئه قلفیا سرور $1 نه وا بکیت.",
+       "zip-file-open-error": "د گات واکردن جانیا زیپ سی وارسی مینونه ش یه گل خطا پیش اومائه.",
+       "zip-wrong-format": "جانیا تیار بیه جانیا زیپ نئ.",
+       "zip-bad": "جانیا زیپ خرؤ یا حننی نئ.\nنبوئه مینونه شه د لحاظ امنیتی وه خوئی وارسی کرد.",
+       "zip-unsupported": "جانیا زیپ چیایی نه وه کار بسه که ویکی وارسگر حامین دارشو نئ.\nنبوئه مینونه ونه د لحاظ امنیتی وه خوئی وارسی کرد.",
        "uploadstash": "اماییه جا سوارکرد",
+       "uploadstash-summary": "ای بلگه سی دسرسی وه جانیایایی یه  که سوار بینه(یا د حالت سوارکردن) ولی تا ایسه د ویکی درتیچ نبینه.ای جانیایا فقط وا کاریاریایی که ونونه سوارکردنه قاول دیئن هئن.",
        "uploadstash-clear": "پاک کردن جانیایا اماییه بیه",
        "uploadstash-nofiles": "شما هیژ جانیا اماییه بیه ای ناریت.",
+       "uploadstash-badtoken": "انجوم دئن ای کاریا د خوئی صورت نگرت، شایت سی یه با که اعتوار ویرایشت شما تموم بیه. هنی تلاش بکیت.",
+       "uploadstash-errclear": "پاک کردن جانیایا د خوئی شکل نگرت.",
        "uploadstash-refresh": "نومه گه جانیایا نه د نو تازه کو",
        "invalid-chunk-offset": "جا وه جایی نامعتور برشت",
        "img-auth-accessdenied": "دسرسی منع بی",
+       "img-auth-nopathinfo": "PATH_INFO نیئش.\nسرور شما سی گواردن ای انازه میزونکاری نبیه.\n شات د پایه سی جی آی با و حامین دار img_auth نبا.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization سیل بکیت.",
+       "img-auth-notindir": "مسیر حاسته بیه د لشک سوارکرد میزونکاری بیه نئ.",
+       "img-auth-badtitle": "امکان راس کردن یه سرون مجازی د «$1» وجود ناره.",
+       "img-auth-nologinnWL": "شما هنی نیومایته وامین و «$1» د نوم گه اسبئ نیئش.",
        "img-auth-nofile": "فایل $1 وجود ناره.",
+       "img-auth-isdir": "شما سی رسسن وه لشگ «$1» تلاش کردیته.\nتئنا می تونیت وه جانیا دسرسی داشتویت.",
+       "img-auth-streaming": "د حال کل کردن \"$1\".",
+       "img-auth-public": "آلشت ون img_auth.php درده ای د جانیایا یه گل ویکی خصوصیه.\nای ویکی وه عنوان یه گل ویکی خلک من میزونکاری بیه.\nسی امنیت خوتر، img_auth.php ناکنشتگر بیه.",
+       "img-auth-noread": "کاریار وه حنن «$1» دسرسی ناره.",
        "http-invalid-url": "یو آر ال نامعتور:$1",
+       "http-invalid-scheme": "تیرنشونیا اینترنتی وا شمایه «$1» حامین داری نبوئن.",
+       "http-request-error": "درحاست اچ تی تی پی سی یه گل خطا نادیار، انجومشیو بیه.",
        "http-read-error": "خطا د حنن اچ تی تی پی.",
+       "http-timed-out": "گات حاستن اچ تی تی پی وه سر اوما.",
+       "http-curl-error": "خطا د اوردن تیرنشون اینترنتی: $1",
+       "http-bad-status": "د گات حاستن اچ تی تی پی  خطایی پیش اوما: $1 $2",
        "upload-curl-error6": "نبوئه د یو آر ال برسیت",
+       "upload-curl-error6-text": "تیرنشون اینترنتی که دئیته د دسرس نئ.\nلطف بکیت درستیشه و یه نه که تیرنشون اینترنی میزونکاری بیه وارسی بکیت.",
        "upload-curl-error28": "تموم بیئن مئلت سی سوار کرد",
+       "upload-curl-error28-text": "ای دیارگه فره دیر دتو واکنشت نشو دئه.\nلطف بکیت سی یه که دیارگه کنشگتر و ری خطه یه گل وارسی بکیت، اوسه یه گر واستید و هنی تلاش بکیت.\nشایت بیتر با که د گات خلوتری هنی تلاش بکیت.",
        "license": "ليانس دار بيئن",
        "license-header": "د شكل ليسانس دار بيئن",
        "nolicense": "هیچی انتخاو نبیه",
+       "licenses-edit": "گزینه یا مجوز ویرایشت",
        "license-nopreview": "(پیش سیل د دسرس نئ)",
+       "upload_source_url": "(شما یه گل جانیا د یه گل یو آر ال د دسرس خلک و معتور ورچئ کردیته)",
        "upload_source_file": "(یه گل جانیا د انجومیار تو انتخاو بکیت)",
        "listfiles-delete": "پاکسا کردن",
        "listfiles-summary": "ای بلگه یا ویجه همه جانیایا سوار بیه نه نشو می ئین.",
        "listfiles_name": "نوم",
        "listfiles_user": "کاریار",
        "listfiles_size": "انازه",
+       "listfiles_description": "شرح",
        "listfiles_count": "نسقیا",
        "listfiles-show-all": "شومل نسقه یا نهاتری عسگیا",
        "listfiles-latestversion": "نسقه تازه",
        "filehist-comment": "نظر",
        "imagelinks": "استفاده د فايل",
        "linkstoimage": "دمال بيه {{PLURAL:$1|ديس ونيا بلگه|$1 ديس ون بلگيا}} دای فایل:",
+       "linkstoimage-more": "بیشتر د $1 بلگه د ای جانیا هوم پیوند {{PLURAL:$1|بیه|بینه}}.\nنومگه هاری تئنا {{PLURAL:$1|اولین هوم پیوند|اولین $1 هوم پیوند}} د ای بلگه نه نشو می ئه.\n[[Special:WhatLinksHere/$2|نومگه کامل]] ئم هیئش.",
        "nolinkstoimage": "ایچه هیژ بلگه ای سی هوم پیوند بیئن وا ای فایل نی",
        "morelinkstoimage": " [[ویجه:چه هوم پیوندی ها ایچه/$1|هوم پیوندیا هنی]]سی ای جانیا نه بونیت.",
        "linkstoimage-redirect": "$1 (واگردونی جانیا) $2",
+       "duplicatesoffile": "{{PLURAL:$1|جانیا|جانیایا}} هاری نسقه تکراری ای جانیا {{PLURAL:$1|هئ|هئن}} ([[Special:FileDuplicateSearch/$2|دونسمنیا هنی]]):",
        "sharedupload": "ای جانیا که د $1 هئ شایت د پروجه یا هنی استفاده بیه.",
+       "sharedupload-desc-there": "ای جانیا ها د $1و شایت د پروجه یا هنی وه کار گرته بوئه.\nسی دونسمنیا هنی لطفن [$2 بلگه توضیحیا جانیا] نه سیل بکیت.",
        "sharedupload-desc-here": "فایلی که د $1 شایت د مئن پروجیا هنی استفاده بیه.\nتوضی دباره[$2 file description page] د هار نشو دئئه بیه",
+       "sharedupload-desc-edit": "ای جانیا د $1 ئه و می تونه د پروجه یا هنی وه کار گرت بوئه.\nار حاستیت می تونیت توضیحیا حانیا نه د [$2 بلگه توضیحیا خوش] د اوچه ویرایشت بکیت.",
+       "sharedupload-desc-create": "ای جانیا د $1 ئه و می تونه د پروجه یا هنی وه کار گرت بوئه.\nار حاستیت می تونیت توضیحیا حانیا نه د [$2 بلگه توضیحیا خوش] د اوچه ویرایشت بکیت.",
        "filepage-nofile": "چنو فایلی وا ای نوم نئ.",
+       "filepage-nofile-link": "جانیایی د ای نوم نیئش، اما شما تونیت ونه د [$1 سوار بکیت].",
        "uploadnewversion-linktext": "یه گل نسقه تازه د ای جانیا سوار بکید",
        "shared-repo-from": "د $1",
+       "shared-repo": "یه گنجینه هومبئر",
+       "upload-disallowed-here": "شما نمی تونیت ای جانیانه د نو سوار بکیت",
        "filerevert": "د سرگرتن سی $1",
        "filerevert-legend": "د سرگرتن جانیا",
+       "filerevert-intro": "شما د حال و بار لرسن'''[[Media:$1|$1]]''' وه [$4 نسقه ای که ها د ویرگار$2 ساعت $3] هیئت.",
        "filerevert-comment": "دليل:",
+       "filerevert-defaultcomment": "لرسن وه نسقه $1 ساعت $2",
        "filerevert-submit": "ورگنین",
+       "filerevert-success": "''[[Media:$1|$1]]''' وه[$4 نسقه ای که ها د ویرگار$2 ساعت $3] لرسه بی.",
+       "filerevert-badversion": "نسقه دماتری د ای نسقه وجود ناشت.",
        "filedelete": "$1 پاکسا کو",
        "filedelete-legend": "فایل نه پاک کو",
+       "filedelete-intro": "شما د حال و بار پاکسا کردن جانیا'''[[Media:$1|$1]]''' وا تموم ویرگارچه وه هیئت.",
+       "filedelete-intro-old": "شما د حال و بار پاکسا کردن نسقه'''[[Media:$1|$1]]''' که ها د ویرگار[$4 $2 ساعت $3] هیئت.",
        "filedelete-comment": "دليل:",
        "filedelete-submit": "پاكسا كردن",
        "filedelete-success": "$1 پاکسا بیه.",
+       "filedelete-success-old": "نسقه'''[[Media:$1|$1]]''' که ها د ویرگار $2 ساعت $3 پاکسا بیه.",
        "filedelete-nofile": "'''$1''' وجود ناره.",
+       "filedelete-nofile-old": "نسقه مال دیاری  بیه ای د '''$1''' وا چیا دئه بیه، وجود ناره.",
        "filedelete-otherreason": "دلیل هنی:",
        "filedelete-reason-otherlist": "دليل هنی",
+       "filedelete-reason-dropdown": "* دلیلیا جاافتائه سی پاکسا کردن\n** تیه پوشی د کپی رایت\n** جانیا تکراری",
        "filedelete-edit-reasonlist": "دلیلیا پاک کردنه نه ویرایشت بکید",
+       "filedelete-maintenance": "پاکسا کردن و د نو زنه کردن د گات واداشتن تقریبا ناکشتگر بیه.",
        "filedelete-maintenance-title": "نبوئه ای فایل پاکسا بوئه",
        "mimesearch": "پی جوری ام آی ام ای",
+       "mimesearch-summary": "وا هومیاری ای بلگه شما می تونیت جانیایایی که حال و بارMIME ویجه ای دارن نه بجوریت.\nدرینده: وه شکلcontenttype/subtype یا contenttype/*&lrm;، چی <code>image/jpeg</code>.",
+       "mimetype": "نوع MIME:",
        "download": "گرتن",
        "unwatchedpages": "بلگه یا ندئیه بیه",
        "listredirects": "نوم گه واگردونیا",
+       "listduplicatedfiles": "نومگه همه جانیایا واگرد دواره اومائه یا",
+       "listduplicatedfiles-summary": "ای نومگه د جانیایا وا نسقه یا ایسنی ای جانیا تکراریه که نسقه یا ایسنی جانیایا هنیه. فقط جانیایا ولات نشین هان د ویر و باور ایما.",
+       "listduplicatedfiles-entry": "[[:جانیا:$1|$1]][[$3|{{PLURAL:$2|یه گل تکرار|$2 تکرار}}]] داره.",
        "unusedtemplates": "قالویا وه کار نبرده بیه.",
+       "unusedtemplatestext": "ای بلگه همه بلگه یایی که هان د نومجا {{ns:template}}و د هیچ بلگه ای وه کار گرته نبینه، نوم بنی می که.\nد ویرتو با که دما یه که بهایت بلگه یا هوم پیوند هنی نه پاکسا بکیت دشو وارسی ای انجوم بئیت.",
        "unusedtemplateswlh": "هوم پیوندیا هنی",
        "randompage": "بلگه بختكی",
+       "randompage-nopages": "هیچ بلگه ای د ای {{PLURAL:$2|نومجا|نومجایا}}  نئ:$1.",
        "randomincategory": "بلگه بختی د ای دسه",
        "randomincategory-invalidcategory": "\"$1\"  نوم دسه معتوری نئ.",
        "randomincategory-nopages": "هیچ بلگه ای د ای  [[:دسه نئ:$1|$1]] دسه.",
-       "randomincategory-selectcategory-submit": "رو",
+       "randomincategory-category": "دسه:",
+       "randomincategory-legend": "بلگه بختی د ای دسه",
        "randomredirect": "واگردونی بختکی",
+       "randomredirect-nopages": "هیچ واگردونی د نومجا \"$1\" نئ.",
        "statistics": "آماريا",
        "statistics-header-pages": "بلگه آماریا",
        "statistics-header-edits": "آماریا نه ویرایشت بکید",
        "statistics-pages": "بلگیا",
        "statistics-pages-desc": "همه بلگه یا د ویکی،د ور گیرنه بلگه یا چک چنه،واگردونیا و چیا هنیه.",
        "statistics-files": "جانیا یا سوار بیه",
+       "statistics-edits": "ویرایشت بلگه یا د گاتی که  {{SITENAME}} دروس بیه",
        "statistics-edits-average": "میانگین ویرایشت یا سی هر بلگه",
        "statistics-views-total": "همه نه بوینیت",
+       "statistics-views-total-desc": "دیئن بلگه یایی که وجود نارن و بلگه یا ویجه د ور گرته نئ",
        "statistics-views-peredit": "هر ویرایشت نه بوینیت",
        "statistics-users": "ثوت نام بیه [[ویجه:نوم گه کاریاریا|کاریاریا]]",
        "statistics-users-active": "کاروریا کارکو",
+       "statistics-users-active-desc": "کاریاریایی که د {{PLURAL:$1|رو|$1 رو}} دماتر کنشتگر بینه",
        "statistics-mostpopular": "بلگه یایی که بیشتر دیئه بینه",
+       "pageswithprop": "بلگه یایی که خاصیت صفحه ها دشو",
+       "pageswithprop-legend": "بلگه یایی که خاصیت صفحه ها دشو",
+       "pageswithprop-text": "ای بلگه نومگه ای یه د بلگه یایی که یه گل ویجه گی د یه بلگه خاص نه وه کار می بنن.",
+       "pageswithprop-prop": "نوم خاصیت:",
        "pageswithprop-submit": "رو",
+       "pageswithprop-prophidden-long": "جزییات قام بیه یه گل نیسه دراز($1)",
+       "pageswithprop-prophidden-binary": "جزییات انازه قام بیه دوتا دوتایی ($1)",
        "doubleredirects": "واگردونیا دوتایی",
+       "doubleredirectstext": "ای بلگه نومگه ای د بلگه واگردونی نه نشو می یه که وه یه گل بلگه واگردونی هنی هشاره می کن.\nهر خط مینونه دار هوم پیوندیا واگردونی اول و دویم و همچنو مقصد واگردونی دویمه، که معمولند بلگه مقصد راستکی یه و اولین واگردونی واس د وه هشاره بکه.\nچیا <del>خط حرده</del> دروس بینه.",
        "double-redirect-fixed-move": "[[$1]]جا وه جا بیه .\nوه خودکارونه وه روز بیه و ایسه وه د[[$2]] واگردونی بیه.",
+       "double-redirect-fixed-maintenance": "برطرف بیین خودانجوم دوتای د [[$1]] وه [[$2]] د مسیر واداشت.",
        "double-redirect-fixer": "تعمیر کننه واگردونی",
        "brokenredirects": "واگردونیا بی سرانجوم",
        "brokenredirectstext": "واگردونیا نهاتر د بلگه یایی که وجود نارن هوم پیوند بینه.",
        "brokenredirects-edit": "ویرایشت",
        "brokenredirects-delete": "پاكسا كردن",
        "withoutinterwiki": "بلگه یایی که هوم پیوند زون نارن",
+       "withoutinterwiki-summary": "بلگه یا هاری وه زون نسقه یا زونا تر هوم پیوند نبیه.",
        "withoutinterwiki-legend": "پیشون",
        "withoutinterwiki-submit": "نشون دائن",
        "fewestrevisions": "بلگه یایی که کمتری وانئری نه دارن",
        "ntransclusions": "$1 {{جمی:$1|بلگه|بلگيا}} استفاده بیه",
        "specialpage-empty": "نتیجه ای د ای گزارشت نئ.",
        "lonelypages": "بلگه یا تک منه",
+       "lonelypagestext": "د بلگه یا هاری هیچ بلگه هنی د {{SITENAME}} هوم پیوند نبیه و د هیچ بلگه هنی مین چین نبیه.",
        "uncategorizedpages": "بلگه یا دسه بنی نبیه",
        "uncategorizedcategories": "دسه یا دسه بنی نبیه",
        "uncategorizedimages": "فایلیا دسه بنی نبیه",
        "popularpages": "بلگه یا حاستنی",
        "wantedcategories": "بلگه یا حاستنی",
        "wantedpages": "بلگه یا حاستنی",
+       "wantedpages-badtitle": "سرون نامعتور د کومله نتیجه یا:$1",
        "wantedfiles": "فایلیا حاستنی",
+       "wantedfiletext-cat": "جانیایا هاری وه کار گرته بوئن ولی وجود نارن. همچنو شایت جانیایا وه دری وا یه که ایچه هیئشون نومگه کاری بینه.هر گرینج مثبت دورویی  <del>خط مئوره.</del> به اضافه یه، بلگه یایی که که جانیایا بی وجودن نه د خوشو دارن د [[:$1]] نومگه کاری بینه.",
+       "wantedfiletext-cat-noforeign": "جانیایا هاری وه کار گرته بوئن ولی نیئشو. اضافه وه یه بلگه یایی که جانیایا نادیار د خوشو دارن هان د [[:$1]].",
+       "wantedfiletext-nocat": "جانیایا هاری که وه کار گرته بوئن نیئشو. همچنو شایت جانیا اماییه داریا خارجی وه شرطی که بان وه کار گرته بوئن. هر گرینج خو ولی الکی <del> خط مئوره. <del>",
+       "wantedfiletext-nocat-noforeign": "جانیایا هاری وه کار گرته بوئن ولی نیئشو.",
        "wantedtemplates": "قالویا حاستنی",
        "mostlinked": "بلگه یا که بیشتر هوم پیوند بینه",
        "mostlinkedcategories": "دسه یایی که بیشتر هوم پیوند بیه",
        "mostinterwikis": "بلگه یایی که بیشتری مینجا ویکی نه دارن",
        "mostrevisions": "بلگه یایی که بیشتری وانئری نه دارن",
        "prefixindex": "همه بلگيا وا پيشون",
+       "prefixindex-namespace": "تموم بلگه یا وا دماون(نومجا $1)",
+       "prefixindex-strip": "پاکسا کردن دماون د نومگه",
        "shortpages": "بلگه یا کؤچک",
        "longpages": "بلگه یا گپ",
        "deadendpages": "بلگه یا نابود بیئنی",
+       "deadendpagestext": "بلگه یا هاری وه هیچ بلگه هنی د {{SITENAME}} هوم پیوند نبینه.",
        "protectedpages": "بلگه یا حفاظت بيه",
+       "protectedpages-indef": "فقط پر و پیم بیین یا بی زمون",
+       "protectedpages-summary": "د ای بلگه نومگه بلگه یایی هیئن که د ایسنی پر و پیم بینه. سی نومگه سرونیا که نبوئه دروس بان، سیل[[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]  بکیت.",
+       "protectedpages-cascade": "فقط پر و پیم بیین تافنمایی",
        "protectedpages-noredirect": "واگردونیا قام بیه",
+       "protectedpagesempty": "د ایسنی هیچ بلگه ای پر و پیم نبیه.",
        "protectedpages-timestamp": "سردیس گات",
        "protectedpages-page": "بلگه",
        "protectedpages-expiry": "تموم بیه آ",
        "protectedpages-performer": "کارور حفاظت بیه",
+       "protectedpages-params": "پارامتریا پر و پیم کردن",
        "protectedpages-reason": "دلیل",
        "protectedpages-unknown-timestamp": "ناشناس",
        "protectedpages-unknown-performer": "کارور ناشناس",
+       "protectedtitles": "سرونیا پر و پیم بیه",
+       "protectedtitles-summary": "د ای بلگه نومگه بلگه یایی هیئن که د ایسنی پر و پیم بینه. سی نومگه سرونیا که نبوئه دروس بان، سیل[[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]  بکیت.",
+       "protectedtitlesempty": "د ایسنی هیچ سرونی وا ای پارامتریا پر و پیم نبیه",
        "listusers": "نوم گه کارور",
        "listusers-editsonly": "فقط کاروریایی که ویرایشت می کن نشو بیه",
        "listusers-creationsort": "سرجاخودگری د اساس گات دروس بیین",
        "ancientpages": "بلگه یا نهاتر",
        "move": "جاوه جا بوئيت",
        "movethispage": "ای بگله نه جا وه جا كو",
+       "unusedimagestext": "جانیایا هاری هئشو اما د هیچ بلگه ای وه کار گرته نبینه.\nلطفن د ویرتو با که دیارگه یا هنی شایت وا یه گل تیرنشون اینترنتی مستقیم وه یه گل جانیا هوم پیوند بان و وا یه که د وه کار گرتن کنشتگر هیئن د ایچه نومگه بان.",
+       "unusedcategoriestext": "ای دسه یا هیئشو ولی د ایسنی هیچ گوتار یا دسه ای ونونه وه کار نمی بنه.",
+       "notargettitle": "رسینه جایی نئ",
+       "notargettext": "شما بلگه یا کاریاری مقصدی سی انجوم دئن ای کنشت ریش انتخاو نکردیته.",
+       "nopagetitle": "چنی بلگه ای نیئش",
+       "nopagetext": "بلگه حاستنی که شما دیاری کردیته وجود ناره.",
        "pager-newer-n": "{{جمی:$1|وانها تر 1وانها تر $1}}",
        "pager-older-n": "{{جمی:$1|گپسالتر 1|گپسالتر $1}}",
+       "suppress": "پائیئن",
+       "querypage-disabled": "ای بلگه ویجه سی دلیلیا انجومکاری ناکشتگر بیه.",
        "booksources": "سرچشمه يل كتاو",
        "booksources-search-legend": "پی جوری سی سرچشمه یا کتاو",
-       "booksources-go": "رو",
+       "booksources-isbn": "آی اس بی ان:",
+       "booksources-search": "پی جوری",
+       "booksources-text": "د هار نومگه ای د هوم پیوندیا د دیارگه یا هنی اومائه که کتاویا نو و دس دوئم می فروشن، و همچنو شایت دونسمنیا بیشتری راجع وه کتاو حاستنی شما داشتوئن:",
+       "booksources-invalid-isbn": "شازک که دئه بیه معتور نئ؛ وارسی خطایا د گات ؤرداشتن د سرچشمه اولی وه کار گرته بوئه.",
        "specialloguserlabel": "انجومکار:",
+       "speciallogtitlelabel": "حاستنی(موضوع یا کاریار):",
        "log": "نیسنن رخ ونیا",
        "all-logs-page": "همه پهرستنومه یا عمومی",
+       "alllogstext": "نماشت یه جا همه پهرستنومه یا که هان د{{SITENAME}}.\nمی تونید وا انتخاو نوع پهرستنومه، نوم کاریاری(حساس وه کؤچکی و گپی حرفیا) و بلگه یا آلشت کرده(حساس و گپی و کؤچکی حرنیا) نمایشت نه دیر د ویرتر بکیت.\n\n{{SITENAME}}.",
+       "logempty": "او چی ای که شما میهایت د پهرستنومه نیئش.",
+       "log-title-wildcard": "بلگه یایی نه پی جوری کو که وا ای سرون شرو موئن",
+       "showhideselectedlogentries": "آلشت دئن ورتیه گر پهرستنومه یا انتخاو بیه",
        "allpages": "همه بلگيا",
        "nextpage": "بلگه نهایی($1)",
        "prevpage": "بلگه دمایی($1)",
        "allpagesbadtitle": "عنوان بلگه حاسته بیه معتور نی،یا  یه گل مئن زونی یا مئن ویکی عنوان غلطه.\nیه شایت شومل یکی با یا بیشتر کاراکتریا نبوئه که سی ای موضوعیا استفاده بوئن",
        "allpages-bad-ns": "{{نوم دیارگه}} د ای نوم جا نئ \"$1\".",
        "allpages-hide-redirects": "واگردونیا قام بیه",
+       "cachedspecial-viewing-cached-ttl": "شما د حال و بار دیئن یه گل نسقه ای د ای بلگه که ها د مینجاگیر هیئت که شایت سی $1 دماتر با.",
+       "cachedspecial-viewing-cached-ts": "شما داریت یه گل نسقه د ای بلگه نه که ها د مینجاگر سیل می کیت، و ای نسقه شایت کاملند راستکی نبا.",
        "cachedspecial-refresh-now": "دیئن آخری.",
        "categories": "دسه يا",
+       "categoriespagetext": "{{PLURAL:$1|دسه|دسه یا}} هاری دشو جانیایا یا بلگه {{PLURAL:$1|هئ|هیئن}}.\n[[Special:UnusedCategories|دسه یا وه کار نگرته بیه]] د ایچه نیئن.\nهمچنو[[Special:WantedCategories|دسه یا حاستنی نه]] بوینیت.",
+       "categoriesfrom": "دسه یایی که د شرو بینه نشو بیه:",
        "special-categories-sort-count": "سرجاخودگری د اساس شمارشت",
        "special-categories-sort-abc": "سرجاخودگری د اساس الفبا",
        "deletedcontributions": "هومیاریا پاکسا بیه کارور",
        "linksearch-pat": "سازه یار پی جوری:",
        "linksearch-ns": "نوم جا:",
        "linksearch-ok": "پی جوری",
+       "linksearch-text": "نشونه یا چی «‎*.wikipedia.org» نم بوئه وه کار گرت.\nد کمترونه یه گل پوشگر ریتراز وارو، .\"*.org\" میها.<br />\n{{PLURAL:$2|پروتکل|پروتکل یا}} بی حامین: <code>$1</code> (پیش حاست سی http:// د حال وباری که پروتکل میزوکاری نبیه با).",
        "linksearch-line": "$1 داره د $2 هوم پیوند بوئه",
+       "linksearch-error": "نشونه یا فقط د اول نوم مئموندار اینترنتی می تونن وه کار گرته بان.",
        "listusersfrom": "کاریاریایی که د شرو بینه نشو بیه:",
        "listusers-submit": "نشو دئن",
        "listusers-noresult": "هیچ کاروری پیدا نبی",
        "listusers-blocked": "(قلف بيه)",
        "activeusers": "نوم گه کاروریا کارکو",
+       "activeusers-intro": "شما د هار یه گل نومگه د کاریاریایی نه مینیت که د $1 {{PLURAL:$1|رو|رو}} دماتر کنشتگر بینه.",
+       "activeusers-count": "$1 {{PLURAL:$1|کنشت|کنشت}} در {{PLURAL:$3|رو|$3 رو}} دماتر",
        "activeusers-from": "کاریاریایی که د شرو بینه نشو بیه:",
        "activeusers-hidebots": "بوتیا قام کو",
        "activeusers-hidesysops": "دیوون داریا نه قام کو",
        "activeusers-noresult": "هیچ کاروری پیدا نبی",
        "listgrouprights": "حقوق گرو کاریاری",
+       "listgrouprights-summary": "نومگه های گرته د ور گرویا کاریاری تعریف بیه د ای ویکی و اختیارات دئه بیه د ونونه.\nدونسمنیا بیشتر دباره هرکوم د اختیارات نه د   [[{{MediaWiki:Listgrouprights-helppage}}]] پیدا بکیت.",
        "listgrouprights-key": "Legend:\n* <span class=\"listgrouprights-granted\">دئه بیه د سمت راست</span>\n* <span class=\"listgrouprights-revoked\">انجوم شیو بیه د سمت راست</span>",
        "listgrouprights-group": "دسه",
        "listgrouprights-rights": "حقوقیا",
        "listgrouprights-helppage": "هومیاری:حقوق گرو",
        "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": "{{جمی:$2|گرویا|گرویا}} اضاف بکیتو: $1",
        "listgrouprights-removegroup": "{{جمی:$2|گرویا|گرویا}} ورداریت: $1",
        "listgrouprights-addgroup-all": "همه گرویا نه اضاف کو",
        "listgrouprights-removegroup-self": "{{جمی:$2|گرویا|گرویا}} نه د حساو ورداریت: $1",
        "listgrouprights-addgroup-self-all": "همه گرویا نه د حساو خوشو اضاف بکیت",
        "listgrouprights-removegroup-self-all": "همه گرویا نه د حساو خوشو ورداریت",
+       "listgrouprights-namespaceprotection-header": "محدودیت نومجا",
        "listgrouprights-namespaceprotection-namespace": "نوم جا",
+       "listgrouprights-namespaceprotection-restrictedto": "دسرسیا مجاز کاریار سی ویرایشت",
+       "trackingcategories": "دما گری دسه یا",
+       "trackingcategories-summary": "ای بلگه نومگه دسه یایی دماگری بیه ئه که وه شکل خودانجوم وه دس ویکی وارسگر پر بوئن . نومیا ونو نها آلشت کردن پیغومیا سامونه ای مرتوط د نومجا {{ns:8}} آلشت دئه با.",
+       "trackingcategories-msg": "دماگری دسه",
        "trackingcategories-name": "نوم پیغوم",
+       "trackingcategories-desc": "جادیارکنیا گنجایشت دسه",
+       "noindex-category-desc": "ای بلگه وا رباتیا نومگه کاری نبیه و سی یه کلیمه یا جادویی <code><nowiki>__NOINDEX__</nowiki></code> د وه یا د جاگه ای که بیرق مجازه دش هئ.",
+       "index-category-desc": "ای بلگه<code><nowiki>__INDEX__</nowiki></code> که ها دش(و د نومجایی یه که بیرق دش مجازه)،  سی یه وا رباط ما مشگلی ناره که وه شکل عادی نباید با.",
+       "broken-file-category-desc": "بلگه مینونه دار یه گل هوم پیوند جانیا خراوه(هوم پیوندی سی جاسازی کردن یه گل جانیا سی گاتی که او جانیا نئئش).",
+       "trackingcategories-nodesc": "هیچ شرحی د دسرس نئ.",
        "trackingcategories-disabled": "دسه ناکشتگر بیه",
        "mailnologin": "هیپچ نشونی یی کل نبیه",
        "emailuser": "ای كارور نه ايميل كو",
        "emailpage": "ایمیل کارور",
        "defemailsubject": "{{نوم سیل جا}} ایمیل د کارور \"$1\"",
        "usermaildisabled": "ایمیل کارور د کار افتائه",
+       "usermaildisabledtext": "شما نمی تونیت سی کاریار هنی د ای ویکی انجومانامه کل بکیت",
        "noemailtitle": "هیچ نشونی ایمیلی نئ",
+       "noemailtext": "ای کاریار تیرنشون انجومانامه خووی ناره.",
+       "nowikiemailtext": "ای کاریار میها که د کاریاریا هنی انجومانامه نگره.",
+       "emailnotarget": "نوم کاریاری که وجود ناره یا سی گیرنه نامعتوره",
        "emailtarget": "یه گل نوم کاریاری سی پذریشتگر وارد بکیت",
        "emailusername": "نوم كاروری:",
        "emailusernamesubmit": "دئن",
+       "email-legend": "کل کردن یه گل انجومانامه سی یه گل کاریار هنی د {{SITENAME}}",
        "emailfrom": "د:",
        "emailto": "سی:",
        "emailsubject": "سرون:",
        "emailccsubject": " پیغومتو سی $1:$2 ورداشته بی",
        "emailsent": "ایمیل کل بیه",
        "emailsenttext": "پیغوم ایمیلی تو کل بیه.",
+       "emailuserfooter": "ای انجومانامه وا به کار گرتن د خصوصیت \"کل کردن نومه د ای کاریار\"{{SITENAME}} وه دس $1 به $2 کل بی.",
        "usermessage-summary": "رئتن د سامونه پیغوم",
        "usermessage-editor": "پیغوم فرسن سیستم",
+       "usermessage-template": "ویکی وارسگر:پیغوم کاریار",
        "watchlist": "سیل برگ",
        "mywatchlist": "سیل برگ",
        "watchlistfor2": "سي $1 $2",
        "nowatchlist": "شما هیچی د سیل برگ خوتو ناریت",
+       "watchlistanontext": "لطفن بیایت وامین و ویرایشتیا نه د سیل برگتو سیل بکیت.",
        "watchnologin": "وارد نبیه",
        "addwatch": "اضاف کردن د سیل برگ",
+       "addedwatchtext-short": "بلگه \"$1\" وه سیل برگ شما اضاف بیه.",
        "removewatch": "جا وه جا کردن د سیل برگ",
        "removedwatchtext": "بلگه\"[[:$1]]\" د [[Special:سیل برگ|سیل برگ خوتو]] جا وه جا بیه.",
        "removedwatchtext-short": "بلگه \"$1\" د سیل برگ جا وه جا بیه.",
        "unwatchthispage": "واداشتن دیئن",
        "notanarticle": "مینونه هیچ بلگه ای نئ",
        "notvisiblerev": "آخری وانئری که د دس یه کاریار هنی انجوم بیه پاکسا بیه.",
-       "watchlist-details": "{{جمی:$1|$1 بلگه|$1 بلگیا}} د سیل برگتو هیش بلگه قسه کردن نی .",
+       "watchlist-details": "{{جمی:$1|$1 بلگه|$1 بلگیا}} د سیل برگتو هیش بلگه قسه کردن نی.",
        "wlheader-enotif": "وارسیاری ایمیل فعال بیه.",
        "wlheader-showupdated": "بلگه یایی که د آخرین کرتی که شما دشو دیئن کردیته آلشت بینه د <strong>توپر</strong>نشون دئه بینه",
-       "wlshowlast": "آخرین$1 ساعتیا $2و روزیا $3 نشو بیئه",
+       "wlnote": "د هار {{PLURAL:$1|آلشت|<strong>$1</strong> آلشتی}} که د {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} دماتر انجوم بیه هیئش، ویرگار آخرین واجوری انجام شده موجود است، ویرگار آخری واجوری: $3، $4",
+       "wlshowlast": "آخرین$1 ساعتیا $2و روزیا  نشو بیئه",
        "watchlist-options": "گزینیا سیل برگ",
        "watching": "د حال دیئن...",
        "unwatching": "د حال ندیئن...",
+       "watcherrortext": "یه گل اشگال د گات آلشت کردن میزونکاری نومگه سیل برگتو سی «$1» پیش اوما.",
        "enotif_reset": "همه بلگه یا دیئه بینه نشودار بکید",
        "enotif_impersonal_salutation": "{{نوم سیلجا}} کارور",
+       "enotif_subject_deleted": "{{SITENAME}} بلگه$1 وه دس{{gender:$2|$2}} پاکسا بیه.",
+       "enotif_subject_created": "{{SITENAME}} بلگه$1 وه دس{{gender:$2|$2}} دروس بیه.",
+       "enotif_subject_moved": "{{SITENAME}} بلگه$1 وه دس{{gender:$2|$2}} جا وه جا بیه.",
+       "enotif_subject_restored": "{{SITENAME}} بلگه$1 وه دس{{gender:$2|$2}} د نو زنه بیه.",
+       "enotif_subject_changed": "{{SITENAME}} بلگه$1 وه دس{{gender:$2|$2}} آلشت بیه.",
+       "enotif_body_intro_deleted": "بلگه$1 {{SITENAME}} د ویرگار $PAGEEDITDATE  وه دس {{gender:$2|$2}} پاکسا بیه، $3 نه بینیت.",
+       "enotif_body_intro_created": "{{SITENAME}} بلگه $1 د ویرگار $PAGEEDITDATE وه دس {{gender:$2|$2}} دروس بیه، سی وانئری ایسنی سیل $3 بکیت.",
+       "enotif_body_intro_moved": "{{SITENAME}} بلگه $1 د ویرگار $PAGEEDITDATE وه دس {{gender:$2|$2}} جاوه جا بیه، سی وانئری ایسنی سیل $3 بکیت.",
+       "enotif_body_intro_restored": "{{SITENAME}} بلگه $1 د ویرگار $PAGEEDITDATE وه دس {{gender:$2|$2}} د نو زئنه بیه، سی وانئری ایسنی سیل $3 بکیت.",
+       "enotif_body_intro_changed": "{{SITENAME}} بلگه $1 د ویرگار $PAGEEDITDATE وه دس {{gender:$2|$2}} آلشت بیه، سی وانئری ایسنی سیل $3 بکیت.",
        "enotif_lastvisited": "همه آلشتیا$1 د اوسه که شما د آخرین بار دیئته بوینیت.",
+       "enotif_lastdiff": "سی دیئن ای آلشتیا $1 نه سیل بکیت.",
        "enotif_anon_editor": "کارو ناشناس$1",
+       "created": "دروس بیه",
+       "changed": "آلشت بیه",
        "deletepage": "پاک کردن بلگه",
        "confirm": "مئكم كردن",
        "excontent": "مینونه :\"$1\" بی",
+       "excontentauthor": "مینونه بلگه یه بی: «$1» (و تئنا هومیار«[[Special:Contributions/$2|$2]]» بی)",
        "exbeforeblank": "مینونه حالی دمایی:\"$1\" بی",
        "delete-confirm": "پاکسا کردن\"$1\"",
        "delete-legend": "پاك كردن",
        "actioncomplete": "عملكرد كامل بيه",
        "actionfailed": "عملكرد شكست حرده",
+       "deletedtext": "«$1» پاکسا بیه.\nسی نهاتری پاکساگریا ایسنی وه $2 سرکشی بکیت.",
        "dellogpage": "لاگ پاك كردن",
+       "dellogpagetext": "نومگه هاری یه گل نومگه د آخری چیا پاکسا بیه هئ.",
        "deletionlog": "پهرستنومه پاک بیئن",
+       "reverted": "لرسه د نزیکترین وانئری",
        "deletecomment": "دليل:",
        "deleteotherreason": "دليليا هنی:",
        "deletereasonotherlist": "دلیل هنی",
        "deletereason-dropdown": "* دلیلیا پاکسا کردن رسم بیه\n** اسپم\n** خراوکاری\n** رعایت نبین کپی رایت\n** درحاست نیسنه\n** نهاورگشت شکست حرده",
        "delete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
+       "deleteprotected": "شما نمی تونیت ای بلگه نه پاکسا بکیت سی یه که وه پر و پیم بیه.",
+       "rollback": "چواشه کردن ویرایشتیا",
+       "rollback_short": "چواشه کردن",
        "rollbacklink": "ورگشتن",
+       "rollbacklinkcount": "چواشه کردن $1 {{PLURAL:$1|ویرایشت|ویرایشتیا}}",
+       "rollbacklinkcount-morethan": "چواشه کردن بیشتر د$1 {{PLURAL:$1|ویرایشت|ویرایشتیا}}",
+       "rollbackfailed": "چواشه کردن د خوئی انجوم نبی",
+       "cantrollback": "نبوئه ویرایشت نه پاکساگری بکیت:\nآخری هومیار تئنا نیسنه ای گوتاره.",
+       "editcomment": "ویرایشت چکشه وه: \"''$1''\" بی.",
+       "rollback-success": "ویرایشتیا $1 پاکساگری بی؛\nبلگه وه آخری ویرایشت $2 آلشت بیه.",
        "sessionfailure-title": "شکست حردن نشینگه",
        "protectlogpage": "حفاظت کردن",
        "protectedarticle": "حفاظت بيه [[$1]]",
        "modifiedarticleprotection": "ریتراز حفاظت د \"[[$1]]\" آلشت بیه",
+       "unprotectedarticle": "بلگه«[[$1]]» نه د پر و پیم دراورد",
+       "movedarticleprotection": "میزونکاری پر و پیم بیین د «[[$2]]» وه «[[$1]]» جا وه جا بیه",
        "protect-title": "ریتراز حفاظت د \"$1\" آلشت بیه",
+       "protect-title-notallowed": "دیئن ریتراز پر و پیم \"$1\"",
        "prot_1movedto2": "[[$1]] د [[$2]] جا وه جا بی",
+       "protect-badnamespace-title": "نوم جا بی پر و پیم",
+       "protect-badnamespace-text": "بلگه یایی که هان د ای نومجا پر و پیم بیئنی نیئن.",
+       "protect-norestrictiontypes-text": "امکان پر و پیم کردن ای بلگه سی یه که نوع محدودیتی ناره، وجود ناره.",
+       "protect-norestrictiontypes-title": "بلگه بی حامین گر",
+       "protect-legend": "پشت راس کردن حامین گری",
        "protectcomment": "دلیل:",
+       "protectexpiry": "تموم بين:",
+       "protect_expiry_invalid": "گات تموم بیین نامعتوره.",
+       "protect_expiry_old": "گات تموم بیین مال دماتره.",
+       "protect-unchain-permissions": "وا کردن گزینه یا هنی پر و پیم کردن",
        "protect-default": "همه کاروریا اجازه دارن",
+       "protect-fallback": "فقط کاریاریایی که وه «$1» دسرسی دارن، صلادار ای کارن",
+       "protect-level-autoconfirmed": "فقط کاریاریا که خودپشت راس بینه صلادارن",
+       "protect-level-sysop": "فقط دیوونداریا",
+       "protect-summary-desc": "[$1=$2] ($3)",
+       "protect-summary-cascade": "د حال و بال تافنمایی",
+       "protect-expiring": "گات تموم بیین $1 (یو تی سی)",
+       "protect-expiring-local": "گات تموم بیین $1",
+       "protect-expiry-indefinite": "بی زمون",
+       "protect-cascade": "پر و پیم بیین تافنمایی- همه بلگه یایی که هان د ای بلگه پر و پیم بوئن.",
        "protect-othertime": "وخت هنی:",
        "protect-othertime-op": "گات هنی",
+       "protect-existing-expiry": "گات تموم بیین ایسنی: $2، $3",
+       "protect-existing-expiry-infinity": "گات تموم بیین: بی گاته",
+       "protect-otherreason": "دلیل اضافی/هنی:",
        "protect-otherreason-op": "دلیل هنی",
+       "protect-edit-reasonlist": "دلیلا پر و پیم بیین ویرایشت",
        "protect-expiry-options": "1 ساعت:1 ساعت,1 روز:1 روز,1 هفته:1 هفته,2 هفته:2 هفته,1 ما:1 ما,3 ما:3 ما,6 ما:6 ما,1 سال:1 سال,بی حساو:بی حساو",
        "restriction-type": "دسرسی:",
+       "restriction-level": "ریتراز محدودیت:",
        "minimum-size": "انازه کمترونه",
        "maximum-size": "انازه بیشترونه",
        "pagesize": "(بایتیا)",
        "restriction-move": "جاوه جا بوئيت",
        "restriction-create": "راس كردن",
        "restriction-upload": "سوار کرد",
+       "restriction-level-sysop": "کلا پر و پیم بیه",
+       "restriction-level-autoconfirmed": "نصم و نیمه پر و پیم بیه",
        "restriction-level-all": "هر ریترازی",
+       "undelete": "دیئن بلگه یا پاکسا بیه",
+       "undeletepage": "دیئن و  ؤرگشتن بلگه یا پاکسا بیه",
+       "viewdeletedpage": "دیئن بلگه یا پاکسا بیه",
+       "undelete-fieldset-title": "د نو زنه کردن وانئریا",
+       "undeleterevisions": "$1 نسقه مال دیاری{{PLURAL:$1|بیه|بینه}}",
+       "undelete-revision": "نسقه پاکسا بیه $1 (د ویرگار$4 ساعت $5) وه دس $3:",
+       "undelete-nodiff": "وانئری دماتری پیدا نبیه.",
+       "undeletebtn": "د نو زنه کردن",
        "undeletelink": "بوين/دوواره آماده با",
        "undeleteviewlink": "ديئن",
+       "undeleteinvert": "انتخاو برعسك بوئه",
        "undeletecomment": "دليل:",
+       "undeletedrevisions": "وانئری$1 د نو زنه{{PLURAL:$1|بی}}",
+       "undeletedrevisions-files": "{{PLURAL:$1|1 وانئری|$1 وانئریا}} و{{PLURAL:$2|1 جانیا|$2 جانیا}} د نو زئنه بینه.",
+       "undeletedfiles": "{{PLURAL:$1|1 جانیا|$1 جانیایا}} د نو زنه بیه",
        "cannotundelete": "زنه کردن انجوم نبی:$1",
+       "undelete-header": "سی دیئن بلگه یا پاکسا بیه ایسنی [[Special:Log/delete|پهرستونمه پاکسا بیین]] نه سیل بکیت.",
        "undelete-search-title": "بلگه یا پاکسا بیه نه پی جوری کو",
+       "undelete-search-box": "پی جوری بلگه یا پاکسا بیه",
+       "undelete-search-prefix": "بلگه یایی که وا شرو بیه نشو بیه:",
        "undelete-search-submit": "پی جوری",
+       "undelete-no-results": "هیچ بلگه یکی بیینی د مال دیارکن پاکسا بیه یا نئ.",
+       "undelete-cleanup-error": "خطا د پاکسا کردن ویرگارچه وه کار نگرته بیه د«$1».",
+       "undelete-error": "خطا بلگه ای که نبوئه پاکساش بکی",
        "undelete-error-short": "خطا پاک نبیئن جانیا:$1",
+       "undelete-error-long": "د گات زنه کردن جانیا یه گل خطا پیش اوما:\n\n\n$1",
        "undelete-show-file-submit": "هری",
+       "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
        "namespace": "نوم جا:",
        "invert": "انتخاو برعسك بوئه",
+       "namespace_association": "نوم جایا یکاگرته",
        "blanknamespace": "اصلی",
        "contributions": "{{جنس:$1|کارور}} هومیاریا",
        "contributions-title": "هومياري كارور سي $1",
        "mycontris": "هومياری",
        "contribsub2": "سي {{جنسيت:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "کاریار \"$1\" ثوت نام نکرده.",
+       "nocontribs": "هیچ آلشتی وا ای مشقصات دیاری نکرد.",
        "uctop": "(تازه باو)",
        "month": "د ما(یا زیتر)",
        "year": "د سال",
        "sp-contributions-newbies": "فقط هومیاری یایی که د حساو تازه بیه نشون بئه",
+       "sp-contributions-newbies-sub": "سی حساویا تازه",
+       "sp-contributions-newbies-title": "هومیاریا کاریار سی حساویا تازه",
        "sp-contributions-blocklog": "قلف",
+       "sp-contributions-suppresslog": "پاکساگری کردن هومیاریا کاریار",
+       "sp-contributions-deleted": "هومیاریا پاکسا بیه کاریار",
        "sp-contributions-uploads": "سواركرديا",
        "sp-contributions-logs": "نیسنن رخ ونیا",
        "sp-contributions-talk": "چك چنه",
+       "sp-contributions-userrights": "دیوونداری حقوق کاریار",
        "sp-contributions-search": "سی هومیاریا پی جور با",
        "sp-contributions-username": "نوم نشون آی پی يا نوم كاروری:",
        "sp-contributions-toponly": "فقط ویرایشتیایی که جزئه آخرین دوواره دیئن هئین نشو بیه",
+       "sp-contributions-newonly": "فقط ویرایشتیایی که مال دروس کردن بلگه هیئن نشو بیه.",
        "sp-contributions-submit": "پی جوری",
        "whatlinkshere": "كؤم ديس ونيا هان ايچه",
        "whatlinkshere-title": "بلگه ای که د $1 هوم پیوند بیه",
        "whatlinkshere-page": "بلگه",
        "linkshere": "بلگیا نهایی د '''[[:$1]]''' هوم پیوند بیه",
        "nolinkshere": "هیژ بگله ای د  '''[[:$1]]''' هوم پیوند نبیه",
+       "nolinkshere-ns": "هیچ بلگه ای د نومجا انتخاو بیه وه'''[[:$1]]''' هوم پیوند ناره.",
        "isredirect": "بلگه دوباره ورگشتن",
        "istemplate": "نشونی دئن",
        "isimage": "فایل هوم پیوند",
        "whatlinkshere-hidelinks": "هوم پیوندیا $1",
        "whatlinkshere-hideimages": "فایل هوم پیوندیا $1",
        "whatlinkshere-filters": "فيلتريا",
+       "autoblockid": "خود نهاگری #$1",
        "block": "منع کارور",
-       "blockip": "منع کارور",
+       "unblock": "کاریار نهاگری نبیه",
+       "blockip": "نهاگری{{GENDER:$1|کاریار}}",
+       "blockip-legend": "نهاگری کاریار",
        "ipaddressorusername": "نوم نشون آی پی يا نوم كاروری:",
+       "ipbexpiry": "تموم بين:",
        "ipbreason": "دليل:",
+       "ipb-hardblock": "پیشگری د ویرایشت کردن کاریاریی که د طریق ای تیرنشون آی پی وامین اومانه.",
+       "ipbcreateaccount": "نهاگری دروس کردن حساو",
        "ipbemailban": "نهاگرتن کاریار د کل کردن انجومانامه",
+       "ipbenableautoblock": "بستن خودانجوم آخری تیرنشون آی پی وه کار گرته بیه وه دس کاریار و تیرنشونیا هنی که که د ونو سی ویرایشت وه سعی می کن.",
+       "ipbsubmit": "نهاگری ای کاریار",
        "ipbother": "وخت هنی:",
        "ipboptions": "2 ساعتیا:2 ساعت,1 رو:1 رو,3 روزا:3 رو,1 هفته:1 هفته,2 هفته یا:2 هفته,1 ما:1 ما,3 ما:3 میا,6 ما:6 مایا,1 سال:1سال,بی حساو:بی حساو",
        "ipbhidename": "نوم کاروری نه سی ویرایشت یا و نوم گه یا قام کو",
+       "ipbwatchuser": "پی گری بلگه کاریاری و بلگه چک چنه ای کاریار",
        "ipb-disableusertalk": "نها ای کاریار نه اوسه که میها د بلگه چک چنه ش ویرایشت بکه و وه قلف بیه بئر",
+       "ipb-change-block": "بسن دوواره کاریار وا ای میزونکاریا",
+       "ipb-confirm": "پشت راس کردن قلف",
+       "badipaddress": "تیرنشون نامعتور آی پی",
+       "blockipsuccesssub": "قلف کردن د خوئی انجوم بی",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] بسته بیه.<br />\nسی وارسی بسته بیه یا [[Special:BlockList|نوم گه بسته بیه یا ]] نه سیل بکیت.",
+       "ipb-blockingself": "شما د حال نهاگری خوتونیت! آیا دلراس هیئت که میهایت چنی کاری انجوم بیتو؟",
+       "ipb-edit-dropdown": "ویرایشت دلیلیا نهاگرتن",
+       "ipb-unblock-addr": "وا کردن قلف $1",
+       "ipb-unblock": "واز کردن نوم کاریاری یا تیرنشون آی پی",
+       "ipb-blocklist": "دیئن نهاگرتن یا ایسنی",
+       "ipb-blocklist-contribs": "هومیاریا $1",
        "unblockip": "کارور منع نبیه",
+       "ipusubmit": "ای قلف نه ؤردار",
+       "unblocked": "دسرسی [[User:$1|$1]] دوواره برقرار بیه.",
+       "unblocked-range": "$1 وا بیه.",
+       "unblocked-id": "قلف $1 ورداشته بیه.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] رفع نهاگری بیه.",
        "blocklist": "كاروريا منع بيه",
        "ipblocklist": "كاروريا منع بيه",
        "ipblocklist-legend": "یه گل کارور منع بیه بجوریت",
+       "blocklist-userblocks": "قام کردن حساو قلف بیه",
+       "blocklist-tempblocks": "قام کردن نهاگرتنیا موقت",
+       "blocklist-addressblocks": "قام کردن تکی نهاگرتن آی پیا",
+       "blocklist-rangeblocks": "قام کردن پوشینه نهاگرتنیا",
        "blocklist-timestamp": "چسب ون وخت",
+       "blocklist-target": "مقصد",
+       "blocklist-expiry": "تموم بين",
+       "blocklist-by": "دیووندار نهاگیرنه",
+       "blocklist-params": "پارامتریا قلف کردن",
+       "blocklist-reason": "دلیل",
        "ipblocklist-submit": "پی جوری",
+       "ipblocklist-localblock": "نهاگری ولات نشینی",
+       "ipblocklist-otherblocks": "هنی{{PLURAL:$1|نهاگرتن|نهاگرتنیا}}",
+       "infiniteblock": "بی زمون",
+       "expiringblock": "د $1 ساعت $2 تموم موئه",
+       "anononlyblock": "فقط کاریاریا نادیار",
+       "noautoblockblock": "بستن خودانجوم ناکشتگر بیه",
+       "createaccountblock": "حساو راس کردن ناکشتگر بیه.",
+       "emailblock": "انجومانامه ناکشتگر بیه",
        "blocklist-nousertalk": "نبوئه بلگه چک چنه خوتونه ویرایشت بکید",
        "ipblocklist-empty": "جاگه نوم گه حالیه",
+       "ipblocklist-no-results": "دسرسی نوم کاریاری یا تیرنشون آی پی حاسته بیه نهاگری نبیه.",
        "blocklink": "بسته بوئه",
        "unblocklink": "بی قطی",
        "change-blocklink": "اجازه نديئن سی  آلشت",
        "emaillink": "انجومانامه نه کل کو",
        "blocklogpage": "قلف",
        "blocklogentry": " [[$1]] وا یه گل وخت تموم بیئن $2 و $3  قلف بیه",
+       "reblock-logentry": "میزوکاری سی نهاگری[[$1]] آلشت بیه سی آخر نهاگری د $2 $3",
+       "unblocklogentry": "وا کردن قلف $1",
+       "block-log-flags-anononly": "فقط کاریاریایی که نادیارن",
        "block-log-flags-nocreate": "حساو راس کردن عاجز بیه.",
+       "block-log-flags-noautoblock": "بستن خودانجوم ناکشتگر بیه",
+       "block-log-flags-noemail": "انجومانامه ناکشتگر بیه",
        "block-log-flags-nousertalk": "نبوئه بلگه چک چنه خوتونه ویرایشت بکید",
+       "block-log-flags-angry-autoblock": "نهاگری خودانجوم پئشکرده کنشتگر بیه",
+       "block-log-flags-hiddenname": "نوم کاروری قام بیه",
+       "range_block_disabled": "درس کردن بسن یه گل پوشگر وه دس دیوونداریا ناکنشتگر بیه.",
+       "ipb_expiry_invalid": "گات تموم بیین نامعتوره.",
+       "ipb_expiry_temp": "نهاگری نوم کاریاریا قام بیه واس همیشه یی با.",
+       "ipb_already_blocked": "\"$1\" ایسه نهاگری بیه.",
+       "ipb-needreblock": "$1 د دماتر نهاگری بیه. آیا میهایت میزوکاری ونه آلشت بیتو؟",
+       "ipb-otherblocks-header": "هنی{{PLURAL:$1|نهاگرتن|نهاگرتنیا}}",
+       "ip_range_invalid": "پوشگر نامعتور آی پی",
+       "ip_range_toolarge": "نهاگری پوشینه یا گپتر $1/ مجاز نئ.",
        "proxyblocker": "قلف کننه پروکسی",
+       "sorbs": "دی ان اس بی ال",
+       "ipbnounblockself": "شما صلادار وارکدن دسرسی خوتو نییت.",
        "lockdb": "قلف کردن رسینه گا",
+       "unlockdb": "رسینه گا قلف نبیه",
+       "lockconfirm": "هره، مه واقعند میهام که رسینه گا نهاگری با.",
        "unlockconfirm": "هره، مه واقعند میهام که رسینه گا وا بوئه.",
        "lockbtn": "قلف کردن رسینه گا",
        "unlockbtn": "رسینه گا قلف نبیه",
+       "locknoconfirm": "شما کلیت پشت راسکاری نه نشودار نکردیته.",
        "lockdbsuccesssub": "رسینه گا د خوئی قلف بیه",
+       "unlockdbsuccesssub": "قلف رسینه گا ؤرداشته بیه",
+       "unlockdbsuccesstext": "رسینه گا وا بیه.",
+       "databasenotlocked": "رسینه گا وازه.",
+       "lockedbyandtime": "(وا{{GENDER:$1|$1}} د $2 د$3)",
        "move-page": "$1 جا وه جا کو",
        "move-page-legend": "بلگه نه جا وه جا کو",
+       "movearticle": "جا وه جا کردن بلگه:",
        "movenotallowed": "شما وه جا وه جا کردن بلگه دسرسی ناریت",
        "movenotallowedfile": "شما وه جا وه جا کردن جانیایا دسرسی ناریت",
+       "cant-move-category-page": "شما صلا ینه که دسه یا نه ناریت.",
+       "cant-move-to-category-page": "شما صلا ینه که یه بلگه نه بوریت وه بلگه دسه ناریت.",
+       "newtitle": "سی سرون هنی:",
+       "move-watch": "دیئن بلگه سرچشمه و بلگه حاستنی",
        "movepagebtn": "بلگه جا وه جا کو",
        "pagemovedsub": "د خوئی جا وه جا بیه",
+       "movepage-moved": "<strong>\"$1\" جا وه جا بیه سی \"$2\"</strong>",
        "movepage-moved-redirect": "یه گل واگردونی دروس بیه.",
+       "movepage-moved-noredirect": "د دروس کردن واگردونی جلوگری بیه.",
+       "movetalk": "بلگه چک چنه ئم جا وه جا بوئه",
+       "move-subpages": "جا وه جایی بلگه یا(تا $1 بلگه)",
+       "move-talk-subpages": "جا وه جا کردن زیر بلگه یا بلگه چک چنه (تا $1 بلگه)",
+       "movepage-page-moved": "بلگه $1 د $2 جا وه جا بیه",
+       "movepage-page-unmoved": "نبوئه بلگه $1 د $2 جا وه جا بوئه",
        "movelogpage": "جاوه جا کردن",
        "movelogpagetext": "د هار یه گل نوم گه د جا وه جایی یا بلگه هئ",
+       "movesubpage": "{{جمی:$1|زیر بلگه|زیر بلگه یا}}",
+       "movenosubpage": "ای بلگه زیر بلگه نئ.",
        "movereason": "دلیل:",
        "revertmove": "لرستن",
        "delete_and_move": "پاکسا و جا وه جا بوئه",
+       "delete_and_move_confirm": "هری بلگه نه پاکسا کو",
+       "delete_and_move_reason": "پاکساکاری سی ممکن بیین جا وه جایی «[[$1]]»",
+       "immobile-source-namespace": "نبوئه بلگه یا نه وه نومجا \"$1\" جا وه جا با",
+       "immobile-target-namespace": "نبوئه بلگه یا نه وه نومجا \"$1\" جا وه جا با",
+       "immobile-target-namespace-iw": "هوم پیوند مینجاویکی حاستنی مجازی سی جا وه جا کردن بلگه نئ.",
+       "immobile-source-page": "ای بلگه جا وه جا کردنی نئ.",
+       "immobile-target-page": "نبوئه وه ای مقصد چنی سرونی جا وه جا بوئه.",
+       "imagenocrossnamespace": "نبوئه جانیانه وه یه گل نومجا غیرجانیایی جا وه جا بکیت",
+       "nonfile-cannot-move-to-file": "نبوئه جانیانه وه یه گل نومجا غیرجانیایی جا وه جا بکیت",
+       "imagetypemismatch": "دماون جانیا تازه وا نوع وه سازگاری ناره",
+       "imageinvalidfilename": "نوم جانیا هدف معتور نئ",
+       "fix-double-redirects": "وه هنگوم سازی همه واگردونیایی که وه گوتار اصلی هشاره میکن",
+       "move-leave-redirect": "وه جا نیائن یه گل واگردونی",
+       "protectedpagemovewarning": "<strong>زئنار:ای بلگه سی یه پر و پیم بیه که کاریاریایی که دسرسی دیوونداری دارن فقط بتونن دش ویرایشت بکن.</strong>\nآخرین سیائه سی سرچشمه یا د هار اماییه کاری بیه:",
+       "semiprotectedpagemovewarning": "<strong>د ویر داشتویت:</strong> ای بلگه سی یه که فقط کاریاریا ثوت نام کرده تونستون دش ویرایشت بکه ن پر و پیم بیه.\nآخرین پهرستنومه دئه بیه سی سرچشمه هار نها اماییه بیه:",
        "export": "وه صحرا ديئن بلگيا",
+       "exportall": "وه صحرا ديئن همه بلگيا",
+       "exportcuronly": "فقط مینونه دار وانئری ایسنی با،نه همه ویرگار نه",
+       "exportlistauthors": "مینونه دار نومگه کامل هومیاریا سی هر بلگه",
+       "export-submit": "وه در ديئن",
+       "export-addcattext": "اضاف کردن بلگه یا د یه گل دسه:",
        "export-addcat": "اضاف کو",
+       "export-addnstext": "اضاف کردن بلگه یا د یه نومجا:",
        "export-addns": "اضاف كو",
        "export-download": "ذخیره کردن جانیا",
        "export-templates": "شامل چوئه یا",
+       "export-pagelinks": "مینونه دار بیین بلگه یا هوم پیوند تا ای پی یا:",
        "allmessages": "سامونه پیغومیا",
        "allmessagesname": "نوم",
        "allmessagesdefault": "سفارشت متنی پيش فرض",
+       "allmessagescurrent": "نیسسه ایسنی پیغوم",
        "allmessages-filter-legend": "فیلتر",
+       "allmessages-filter": "فیلتر کردن د اساس شخصی کردن:",
+       "allmessages-filter-unmodified": "آلشت نبیه",
        "allmessages-filter-all": "همه",
        "allmessages-filter-modified": "آلشت بیه",
        "allmessages-prefix": "فیلتر بیه وا نهاون:",
        "thumbnail-more": "گپ كردن",
        "filemissing": "گم بیئن جانیا",
        "thumbnail_error": "خطا د راس بیئن بن کلئکی:$1",
+       "thumbnail_error_remote": "پیغوم خطا $1 :\n$2",
+       "djvu_page_error": "بلگه DjVu وه در د حد مجاز",
+       "djvu_no_xml": "امکان پیدا کردن جانیا XML سی وه کار گرتن DjVu وجود ناشت.",
+       "thumbnail-temp-create": "نبوئه جانیا موقت بن کلیکی نه راست بکیت",
+       "thumbnail-dest-create": "نبوئه بن کلیکی نه د مقصدش اماییه بکیت",
+       "thumbnail_invalid_params": "بن کلیکی وا پارامتریا نامعتور",
+       "thumbnail_dest_directory": "نبوئه دایرکتوری مقصد نه درست بکیت",
+       "thumbnail_image-type": "نوع عسگ حامیین داری نبوئه",
+       "thumbnail_image-missing": "وه ویر و باور میا که جانیا گم بیه:$1",
+       "import": "وامین اوردن بلگه یا",
+       "importinterwiki": "وامین اوردن ترانس ویکی",
+       "import-interwiki-sourcewiki": "سرچشمه ویکی:",
+       "import-interwiki-sourcepage": "بلگه سرچشمه:",
+       "import-interwiki-history": "ؤرداشتن ویرگار همه وانئریا سی ای بلگه",
+       "import-interwiki-templates": "همه چوئه یا",
+       "import-interwiki-submit": "وامین اوردن",
+       "import-interwiki-namespace": "نومجا مقصد:",
+       "import-interwiki-rootpage": "ریشه بلگه مقصد(دل به حایی):",
        "import-upload-filename": "نوم جانیا:",
        "import-comment": "ویر و باور:",
+       "importstart": "د حال و بار وامین اوردن",
+       "import-revision-count": "$1 {{جمی:$1|وانئری|وانئریا}}",
+       "importnopages": "هیچ بلگه ای وامین نیومائه.",
+       "imported-log-entries": "$1 {{PLURAL:$1|داده وار پهرستنومه|داده وار پهرستنومه یا}} وامین اومائه.",
+       "importfailed": "وامین اوردن شکست حرده: <nowiki>$1</nowiki>",
+       "importunknownsource": "نوع سرچشمه وامین اوردن نادیاره",
        "importcantopen": "نبوئه جانیا دئه بیه نه وا بکید",
+       "importbadinterwiki": "هوم پیوند مینجاویکی گن",
+       "importsuccess": "وامین اوردن تموم بی!",
        "importnofile": "هیچ جانیا دئه بیه ای سوار نبیه.",
+       "importuploaderrorpartial": "د سوارکرد وامین اوردن جانیا شکستی پیش اومائه.\nانازه جانیا د انازه بیشترونه مجاز گپتره.",
+       "importuploaderrortemp": "د سوارکرد جانیا وامین اوردن مشگلی پیش اومائه.\nتابنده موقت گم بیه.",
+       "import-parse-failure": "خطا د وااشکافت یه گل وامین اوردن ایکس ام ال",
+       "import-noarticle": "هیچ بلگه ای سی وامین اوردن نئ!",
+       "import-nonewrevisions": "وانئرییا وامین اورده نبیه(همه یا د ایسنی هئشو، یا سی پیش اومائن خطا ور نظر نبینه).",
+       "xml-error-string": "$1 د خط$2, ستین $3 (byte $4): $5",
        "import-upload": "سوار کرد دونسمنیا ایکس ام ال",
        "import-token-mismatch": "کمبود د دونسمنیا نشینگه.\nلطفن هنی کوششت بکید.",
+       "import-invalid-interwiki": "نبوئه د ویکی دیارکرده چی یی وامین اورد.",
+       "import-error-edit": "بلگه «$1» وامین نیومائه، سی یه که شما نمی تونیت ونه ویرایشت بکیت.",
+       "import-error-create": "بلگه «$1» وامین نیومائه، سی یه که شما نمی تونیت ونه راست بکیت.",
+       "import-error-interwiki": "بلگه «$1» وامین نیومائه، سی یه که نوم وه سی یه گل هوم پیوندگری خارجی اماییه کاری بیه(مینجا ویکی).",
+       "import-error-special": "بلگه «$1» وامین نیومائه، سی یه که وه مال وه یه گل نومجا خاصه که او بلگه یا صلادار نئین.",
+       "import-error-invalid": "بلگه \"$1\"  سی یه که نامعتور بیین نومش ممکن بی د ویکی وامین اورده نبیه.",
+       "import-error-unserialize": "نبوئه وه دراوردن بلگه $2 د بلگه «$1» د شکل رازینه کاری بیه نه انجوم بییت.چؤ اومائه که نسقه ای د مدل مینونه $3 وه کار گرته که وه د شکل $4 رازینه کاری بیه.",
+       "import-options-wrong": "{{PLURAL:$2|جزئیات|جزئیات}} اشتوا: <nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "ریشه دئه بیه د بلگه یه گل سرون نامعتوره.",
+       "import-rootpage-nosubpage": "نومجا \"$1\" بلگه پایه صلا زیر بلگه نه نمی یه.",
        "importlogpage": "پهرستنومه دئن",
+       "importlogpagetext": "وامین اوردن بلگه یا وا ویرگارچه ویرایشت ونو د ویکی یا هنی",
+       "import-logentry-upload": "[[$1]] نه د طریق سوارکرد جانیا وامین اورد",
+       "import-logentry-upload-detail": "$1 {{جمی:$1|وانئری|وانئریا}} وامین اومانه",
+       "import-logentry-interwiki": "$1 نه تراویکی کرد",
+       "import-logentry-interwiki-detail": "$1 {{جمی:$1|وانئری|وانئریا}} د $2 وامین اومائنه",
+       "javascripttest": "ازمایشت کردن جاوا اسکریپت",
+       "javascripttest-title": "د حال انجوم دئن ازمایشتیا $1",
+       "javascripttest-pagetext-noframework": "ای بلگه سی انجوم دئن ازمایشتیا جاوا اسکریپت اماییه کاری بیه.",
+       "javascripttest-pagetext-unknownframework": "چوئه کار نادیار ازمایشت \"$1\"",
+       "javascripttest-pagetext-frameworks": "لطفن یه گل د چوئه یا ازمایشت هاری نه انتخاو بکیت :$1",
+       "javascripttest-pagetext-skins": "یه گل پوسه نه سی انجوم دئن ازمایشتا انتخاو بکیت:",
+       "javascripttest-qunit-intro": "[$1 مستندیا ازمایشت] نه د mediawiki.org سیل بکیت.",
+       "javascripttest-qunit-heading": "کومله ازمایشت QUnit جاوااسکریپت سی ویکی وارسگر",
        "tooltip-pt-userpage": "بلگه كارورتو",
+       "tooltip-pt-anonuserpage": "بلگه کاریاری تیرنشون آی پی ای که دش ویرایشت می کید",
        "tooltip-pt-mytalk": "بلگه قسه كردن شما",
+       "tooltip-pt-anontalk": "چک چنه دباره ویرایشتیا ای تیرنشون آی پی",
        "tooltip-pt-preferences": "اولويتيا شما",
        "tooltip-pt-watchlist": "نوم نوشت د بلگه يايی كه شما آلشتاشونه پيگئری  ميكيد",
        "tooltip-pt-mycontris": "يه گل د هومياريا شما",
        "tooltip-ca-viewsource": "ای بلگه حفاظت بيه.\nشما تونيت سرچمه ش بئوينيت",
        "tooltip-ca-history": "دوواره ديئن ای بلگه",
        "tooltip-ca-protect": "ای بلگه نه حفاظت بكيد",
+       "tooltip-ca-unprotect": "پر و پیم گیری د ای بلگه نه آلشت بکیت",
        "tooltip-ca-delete": "ای بلگه نه پاکسا کو",
+       "tooltip-ca-undelete": "د نو زنه کردن ویرایشتیا ری ای بلگه دما یه که پاکساگری بان",
        "tooltip-ca-move": "ای بگله نه جا وه جا كو",
        "tooltip-ca-watch": "اضاف کردن ای بلگه وه نوم نوشت پیگئریاتو",
        "tooltip-ca-unwatch": "ورداشتن ای بلگه وه نوم نوشت پیگئریاتو",
        "tooltip-n-help": "جاگه سی فهمسن",
        "tooltip-t-whatlinkshere": "سيائه تمؤم بلگيایی كه ايچه چسب ون دارن",
        "tooltip-t-recentchangeslinked": "تغيريا تازه باو مئن بلگيايي كه د ای بلگه چسب وند بيئنه",
+       "tooltip-feed-rss": "هوال حون آر اس اس سی ای بلگه",
        "tooltip-feed-atom": "تغذيه كؤچك سی ای بلگه",
        "tooltip-t-contributions": "یه نوم گه د هومیاریا ای کارور",
        "tooltip-t-emailuser": "سی ای كارور ايميل كل كو",
        "tooltip-t-permalink": "چسب ون هميشئی د دوواره بينی ای بلگه",
        "tooltip-ca-nstab-main": "ديئن محتوا بلگه",
        "tooltip-ca-nstab-user": "ديئن بلگه كارور",
+       "tooltip-ca-nstab-media": "دیئن بلگه وارسگر",
        "tooltip-ca-nstab-special": "اي بلگه ويجه يه، شما نتونيت خود اي بلگه نه ويرايشت بكيد",
        "tooltip-ca-nstab-project": "ديئن بلگه پروجه",
        "tooltip-ca-nstab-image": "ديئن بلگه فايل",
+       "tooltip-ca-nstab-mediawiki": "دیئن پیغوم سامونه",
        "tooltip-ca-nstab-template": "ديئن قالو",
+       "tooltip-ca-nstab-help": "ديئن بلگه هومیاری",
        "tooltip-ca-nstab-category": "ديئن بلگه دسه بنی",
        "tooltip-minoredit": "یه نه د عنوان حیرده ویرایشت ثوت کو",
        "tooltip-save": "آلشتياتونه اماییه بكيد",
        "tooltip-diff": "آلشتیا نه که شما د ای متن راس کردیته نشو بیئه",
        "tooltip-compareselectedversions": "فرخیا مینجا دو تا د دو بار دیئن ای بلگه نه بوینیت",
        "tooltip-watch": "ای بلگه نه د سیل برگتو اضاف بکید",
+       "tooltip-watchlistedit-normal-submit": "ؤرداشتن سرونیا",
+       "tooltip-watchlistedit-raw-submit": "وه هنگوم سازی سیل برگ",
+       "tooltip-recreate": "د نو راس کردن بلگه بی یه که و پاکساگری دماتر وه سیل بکیم",
        "tooltip-upload": "شرو د سوار کرد",
        "tooltip-rollback": "\"ورگشتن\" لرستن د حالت اول  سی ای بلگه  که سی  يه كه هومياری  نيايی اصلاح بيه وا يه پورنسن",
        "tooltip-undo": "انجوم نگرتن ای ویرایشت ورگن و همه فرمیا ویرایشت تانه که حالت پیش سیل واکو.یه اجازه میئه سی اضاف کردن یه دلیل د چکسته.",
+       "tooltip-preferences-save": "اولويتيا نه ذخيره بكيد",
        "tooltip-summary": "يه چكسته كؤچك وارد بكيد",
        "interlanguage-link-title": "$1-$2",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "anonymous": "ناشناس {{جمی:$1|کارور|کاروریا}}  {{سیل جا}}",
+       "siteuser": "{{نوم سیلجا}} کارور $1",
        "anonuser": "{{سیل جا}}  کارور ناشناس $1",
+       "lastmodifiedatby": "ای بلگه آخری بار د $1,$2 وه دس $2 آلشت دئه بیه.",
+       "othercontribs": "د اساس کار وا $1.",
+       "others": "دیه رون",
        "siteusers": "{{نوم سیل جا}} {{جمی:$2|کارور|کاروریا}} $1",
+       "anonusers": "{{نوم سیل جا}} نادیار {{جمی:$2|کاریار|کاریاریا}} $1",
+       "creditspage": "اعتوار بلگه",
+       "nocredits": "دونسمنیا راس کننه یا ای بلگه د دسرس نئ",
+       "spamprotectiontitle": "فیلتر پر و پیم گری د اسپم",
+       "spamprotectionmatch": "نیسسه هاری چی ای یه که فیلتر اسپم ایما نه ونه د کار: $1",
+       "spambot_username": "اسپم پاک کن ویکی وارسگر",
+       "spam_reverting": "واگردونی وه آخری نسقه ای که هوم پیوندی وه $1 ناره.",
+       "spam_blanking": "همه وانئریایی که مینونه دار هوم پیوند $1 هئن، دارن حالی بوئن",
+       "spam_deleting": "همه وانئریایی که مینونه دار هوم پیوند $1 هئن، دارن پاکساگری بوئن",
+       "simpleantispam-label": "وارسی ضد اسپم.\nای \"جاگه\" نه پر نکیت!",
+       "pageinfo-title": "دونسمنیا سی \"$1\"",
+       "pageinfo-not-current": "د بدبختی،نبوئه که ای دونسمنیا نه سی وانئریا دماتری نهااماییه بکیت.",
+       "pageinfo-header-basic": "دونسمنیا پایه",
+       "pageinfo-header-edits": "ویرایشت ویرگار",
+       "pageinfo-header-restrictions": "پر و پیم کردن بلگه",
+       "pageinfo-header-properties": "چیا بلگه",
+       "pageinfo-display-title": "نشو دئن سرون",
+       "pageinfo-default-sort": "کلیت سرجا یک کن پیش فرض",
+       "pageinfo-length": "انازه بلگه(وه بایت)",
+       "pageinfo-article-id": "نوم دیار کن بلگه",
        "pageinfo-language": "بلگه مینونه زون",
        "pageinfo-content-model": "شلگ مینونه بلگه",
+       "pageinfo-robot-policy": "نومگه کاری وا رباتیا",
+       "pageinfo-robot-index": "صلادار",
+       "pageinfo-robot-noindex": "بی صلا",
+       "pageinfo-views": "شماره دیئن یا",
+       "pageinfo-watchers": "شماره سیل کننه بلگه یا",
+       "pageinfo-few-watchers": "کمتر د $1 {{PLURAL:$1|سیل کننه|سیل کننه یا}}",
        "pageinfo-redirects-name": "شماره واگردونیا ای بلگه",
+       "pageinfo-redirects-value": "$1",
+       "pageinfo-subpages-name": "انازه زیربلگه یا ای بلگه",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|واگردونی|واگردونیا}}; $3 {{PLURAL:$3|بی واگردونی|بی واگردونیا}})",
+       "pageinfo-firstuser": "بلگه راس کن",
+       "pageinfo-firsttime": "گات دروس بیین بلگه",
+       "pageinfo-lastuser": "آخری ویرایشتگر",
+       "pageinfo-lasttime": "گات آخری ویرایشت",
+       "pageinfo-edits": "شماره همه ویرایشتیا",
+       "pageinfo-authors": "شماره کلی نویسنه یا یکونه",
+       "pageinfo-recent-edits": "شماره ویرایشتیا ایسنی (د $1 دماتر)",
+       "pageinfo-recent-authors": "شماره کلی نویسنه یا یکونه",
+       "pageinfo-magic-words": "جادویی{{PLURAL:$1|کلیمه|کلیمه یا}} ($1)",
+       "pageinfo-hidden-categories": "$1{{جمی:$1|دسه|دسه يا}} قام بیه",
+       "pageinfo-templates": "{{PLURAL:$1|چوئه|چوئه یا}} وه کار گرته بیه($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|بلگه|بلگه یا}} وه کار گرته بیه د ($1)",
+       "pageinfo-toolboxlink": "دونسمنیا بلگه",
        "pageinfo-redirectsto": "واگردونی سی",
+       "pageinfo-redirectsto-info": "دونسمنیا",
+       "pageinfo-contentpage": "اشمارده بیه وه عنوان مینونه بلگه",
+       "pageinfo-contentpage-yes": "هری",
+       "pageinfo-protect-cascading": "پر و پیم بیین تافنمایی د ایچه",
+       "pageinfo-protect-cascading-yes": "هری",
+       "pageinfo-protect-cascading-from": "پر و پیم بیین تافنمایی د",
+       "pageinfo-category-info": "دونسمنیا دسه ای",
+       "pageinfo-category-pages": "شماره بلگيا",
+       "pageinfo-category-subcats": "شماره زیر دسه یا",
        "pageinfo-category-files": "شماره جانیایا",
+       "markaspatrolleddiff": "نشو دار کردن چی سردیاری بیه",
+       "markaspatrolledtext": "ای بلگه نه چی بلگه ای که سردیاری کرده با نشودار کو",
+       "markedaspatrolled": "نشو دار کردن چی سردیاری بیه",
+       "rcpatroldisabled": "سردیاری کردن سی آلشتیا ایسنی ناکنشتگر بیه",
+       "rcpatroldisabledtext": "خصوصیت سردیاری کردن د ری آلشتیا ایسنی تازه ای یا ناکشتگر بیه.",
+       "markedaspatrollederror": "نبوئه چی یه گل سردیاری کرده نشودار با",
+       "markedaspatrollederrortext": "شما واس سی نشودار کردن یه گل وانئری چی سردیاری کرده ونه تیار بکیت.",
+       "markedaspatrollederror-noautopatrol": "شما صلا یه نه که آلشتیا خوتونه چی یه که سردیاری کرده بان ناریت.",
+       "markedaspatrollednotify": "آلشتیایی که مال $1 چی یه گل چی سردیاری کرده نشودار بینه.",
+       "markedaspatrollederrornotify": "نشودار کردن چی نشودار بیه شکست حرده",
        "patrol-log-page": "پهرستنومه گشتن",
+       "patrol-log-header": "یه پهرستنومه وانئریا سردیاری کرده هئ.",
+       "log-show-hide-patrol": "$1 پهرستنومه سردیاری کردن",
+       "deletedrevision": "وانئری دماتری پاکسابیه د $1",
        "filedeleteerror-short": "خطا پاک نبیئن جانیا:$1",
+       "filedeleteerror-long": "د گات پاکسا کردن جانیا یه گل خطا پیش اوما:\n\n\n$1",
+       "filedelete-missing": "نبوئه جانیا \"$1\" نه پاکسا بکیت سی یه که وه وجود ناره.",
+       "filedelete-old-unregistered": "وانئری جانیا تیارکرده \"$1\" د رسینه جا وجود ناره.",
+       "filedelete-current-unregistered": "جانیا تیارکرده \"$1\" د رسینه جا نئیش.",
+       "filedelete-archive-read-only": "نشونگه مال دیارکردن ($1) د لا سرور قاول نیسنن نئ.",
        "previousdiff": "← ويرايشت كۈهنه تر",
        "nextdiff": "ويرايشت تازه تر",
+       "imagemaxsize": "انازه عسگ:<br /><em>(سی شرح جانیا بلگه یا)</em>",
+       "thumbsize": "انازه بن کلکی:",
+       "widthheight": "$1 × $2",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|بلگه|بلگه یا}}",
+       "file-info": "انازه جانیا: $1, MIME type: $2",
        "file-info-size": "$1 × $2 پیکسل, انازه فایل: $3, MIME نوع: $4",
+       "file-info-size-pages": "$1 × $2 pixels, انازه جانیا: $3, MIME type: $4, $5 {{PLURAL:$5|بلگه|بلگه یا}}",
        "file-nohires": "عسك ون بالاتري دش ني",
        "svg-long-desc": "اس وی جی فايل.نومنا $1 $2 پيكسل",
+       "svg-long-desc-animated": "جانیا جمشدار اس وی جی .نومنا $1 × $2 پيكسل،انازه جانیا:$3",
+       "svg-long-error": "جانیا اس وی جی نامعتور:$1",
        "show-big-image": "فایل اصلی",
+       "show-big-image-preview": "انازه ای پیش سیل:$1.",
+       "show-big-image-other": "هنی{{PLURAL:$2|گپ نما کردن|گپ نما کردنیا}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
+       "file-info-gif-looped": "حلقه دار",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|فریم|فریمیا}}",
+       "file-info-png-looped": "حلقه دار",
        "file-info-png-repeat": "$1 بازی کرده{{جمی:$1|وخت|وختیا}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|فریم|فریمیا}}",
        "newimages": "عسگدونی جانیایا تازه",
+       "imagelisttext": "د هار نومگه <strong>$1</strong> {{PLURAL:$1|جانیا|جانیایا}} اماییه جا بیه$2.",
        "newimages-summary": "ای بلگه یا ویجه همه جانیایا سوار بیه نه نشو می ئین.",
+       "newimages-legend": "فیلتر",
        "newimages-label": "نوم جانیا(یا بشقی د وه):",
+       "newimages-showbots": "سوارکردیا نه وا بوتیا نشو بیه",
+       "noimages": "هیچی سی دیئن نئ",
        "ilsubmit": "پی جوری",
+       "bydate": "وا گات",
        "sp-newimages-showfrom": "جانیایا تازه نه که $2 ، $2 شرو بینه نشو بیه",
+       "video-dims": "$1, $2 × $3",
+       "seconds-abbrev": "$1 s",
+       "minutes-abbrev": "$1 دیقه",
+       "hours-abbrev": "$1 ساعت",
+       "days-abbrev": "$1 گات",
+       "seconds": "{{PLURAL:$1|$1 ثانیه|$1 ثانیه یا}}",
+       "minutes": "{{PLURAL:$1|$1 دیقه|$1 دیقه یا}}",
+       "hours": "{{PLURAL:$1|$1 ساعت|$1 ساعت یا}}",
        "days": "{{جمی:$1|1$ روز|$1 روز}}",
+       "weeks": "{{PLURAL:$1|$1 هفته|$1 هفته یا}}",
        "months": "{{جمی:$1|$1 ما|$1 مایا}}",
        "years": "{{جمی:$1|$1 سال|$1 سال}}",
+       "ago": "$1 دماتر",
+       "just-now": "فقط ایسه",
+       "hours-ago": "$1 {{PLURAL:$1|ساعت |ساعتیا}} دماتر",
+       "minutes-ago": "$1 {{PLURAL:$1|دیقه|دیقه یا}} دماتر",
+       "seconds-ago": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}} دماتر",
        "monday-at": "دوشمه د $1",
+       "tuesday-at": "سه شمه د $1",
+       "wednesday-at": "چارشمه د $1",
+       "thursday-at": "پن شمه د $1",
+       "friday-at": "جمه د $1",
+       "saturday-at": "شمه د $1",
+       "sunday-at": "یه شمه د $1",
+       "yesterday-at": "دیرو د $1",
        "bad_image_list": "دونسمنديانه وه ای شلگ وارد بكيت:\n\nفقط سرخط يایی که وا * شرو بوئن د وير گرته بوئن. اولی چسب ون مئن هر سرخط، باید چسب ونی وه یک عسگ گن با.\nچسب ونيا نيایی د همو سرخط، وه عنوان چيا استثنادار د وير گرته بوئن",
        "metadata": "داديا  فره گپ",
        "metadata-help": "ای فایل شومل دونسمنیا هنی یه.شایت د دیربین رقم ون یا اسکنری که سی راس کردنشو استفاده بیه،وه ایچه اضاف بیه",
+       "metadata-expand": "نشو دئن جزییات دمادیسگری",
+       "metadata-collapse": "قام کردن جزییات دمادیسگری",
        "metadata-fields": "رشته یا گپ دونسمنیا که د ای پیغوم نوم ون بینه شومل بلگه عسگ ن که وختی که جدول گپ دونسمنیا وا بوئه نشون دئیه بوئن.\nچی یا هنی سی یه که پیش فرضن قام بوئن.\n*راست کو\n*مدل\n*دم وخت اصل\n*وخت آشگار\n*اف ان شماره\n*ایزو نرخ من سرعت\n*فوکالنس\n*هنرمن\n*کپی رایت\n*حالت جی پی اس \n*جی پی اس گپ حالت\n*جی پی اس همه حالت",
+       "metadata-langitem": "<strong>$2:</strong> $1",
+       "metadata-langitem-default": "$1",
+       "exif-imagewidth": "پئنا",
+       "exif-imagelength": "بلنگی",
+       "exif-bitspersample": "نقطه یا سی هر اندوم",
+       "exif-compression": "شیوات جم و جور کردن",
+       "exif-photometricinterpretation": "ترکیو پیکسل",
+       "exif-orientation": "سرچشمه",
+       "exif-samplesperpixel": "شماره اندومیا",
+       "exif-planarconfiguration": "سرجایک کردن رسینه",
+       "exif-ycbcrsubsampling": "نسوت زیرنمونه Y وه C",
+       "exif-ycbcrpositioning": "جاگری کردن Y و C",
+       "exif-xresolution": "گپ نما کردن د آسو",
+       "exif-yresolution": "گپ نما کردن د وارو",
+       "exif-stripoffsets": "جاگه رسینه یا عسگ",
+       "exif-rowsperstrip": "انازه ردیفیا سی هر نوار",
        "exif-datetime": "آلشت دئن وخت و دمون جانیا",
+       "exif-imagedescription": "نوم عسگ",
        "exif-make": "سازنه دیربین",
+       "exif-model": "مدل دیربین",
+       "exif-software": "نرم افزار به کار گرتنی",
+       "exif-artist": "نیسنه",
+       "exif-colorspace": "رئن جا",
+       "exif-pixelydimension": "پئنا عسگ",
+       "exif-pixelxdimension": "درازا عسگ",
        "exif-usercomment": "ویر و باوریا کارور",
        "exif-relatedsoundfile": "جانیا دنگ دار مرتوط",
        "exif-datetimeoriginal": "دمون و وخت راس بیئن دونسمنیا",
+       "exif-fnumber": "ضریب اف",
+       "exif-lightsource": "سرچشمه نور",
+       "exif-flash": "فلش",
+       "exif-flashenergy": "آز فلش",
        "exif-filesource": "سرچشمه جانیا",
+       "exif-sharpness": "گرینج برچ زئن",
        "exif-gpstimestamp": "وخت جی پی اس (ساعت اتمی)",
+       "exif-gpsspeedref": "واحد سرعت",
+       "exif-gpsdatestamp": "گات جی پی اس",
+       "exif-coordinate-format": "$1° $2′ $3″ $4",
        "exif-jpegfilecomment": "ویر و باور فایل پی ان جی",
+       "exif-keywords": "کلیمه یا کلیتی",
+       "exif-countrycodecreated": "رازینه سی ولاتی که عسگ د وه گرته بیه",
        "exif-citycreated": "شهری که عسگ دش گرته بیه",
+       "exif-countrycodedest": "رازینه سی ولات نمائشت دئه بیه",
        "exif-citydest": "شهر دیار بیه",
+       "exif-objectname": "نوم کؤچک",
+       "exif-source": "سرچشمه",
+       "exif-urgency": "فوریت",
        "exif-fixtureidentifier": "نوم ثاوت",
+       "exif-writer": "نیسنه",
        "exif-languagecode": "زون",
+       "exif-iimversion": "نسقه آی آی ام",
+       "exif-iimcategory": "دسه",
        "exif-datetimeexpires": "وا نها دش استفاده نبوئه",
+       "exif-datetimereleased": "ول بیه د",
+       "exif-identifier": "نوم دیارکن",
+       "exif-lens": "لنز وه کار رتنی",
+       "exif-serialnumber": "نوم شماره دیربین",
+       "exif-cameraownername": "مالک دیربین",
+       "exif-label": "ری دیار",
        "exif-pngfilecomment": "ویر و باور فایل جی پی ان جی",
        "exif-giffilecomment": "ویر و باور فایل جی آی اف",
+       "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+       "exif-unknowndate": "گات نادیار",
+       "exif-orientation-1": "عادی",
        "exif-componentsconfiguration-0": "نی یش",
        "exif-exposureprogram-1": "دسی",
+       "exif-subjectdistance-value": "$1 متر",
+       "exif-meteringmode-0": "نادیار",
+       "exif-meteringmode-1": "میانگین",
+       "exif-meteringmode-3": "نقطه جا",
+       "exif-meteringmode-5": "الگو",
+       "exif-meteringmode-255": "هنی",
+       "exif-lightsource-0": "نادیار",
        "exif-lightsource-1": "روشنایی روز",
+       "exif-lightsource-2": "فلورسنت",
+       "exif-lightsource-4": "فلش",
+       "exif-lightsource-11": "سایه",
+       "exif-flash-mode-3": "مد خودانجوم",
+       "exif-focalplaneresolutionunit-2": "ائنج",
        "exif-scenecapturetype-3": "چی شو",
+       "exif-gaincontrol-0": "هیش کوم",
+       "exif-contrast-0": "عادی",
+       "exif-contrast-1": "نرم",
+       "exif-contrast-2": "سفت",
+       "exif-saturation-0": "عادی",
+       "exif-sharpness-0": "عادی",
+       "exif-sharpness-1": "نرم",
+       "exif-sharpness-2": "سفت",
+       "exif-subjectdistancerange-0": "نادیار",
+       "exif-subjectdistancerange-1": "گپ",
        "exif-gpsaltitude-above-sealevel": "$1 {{جمی:$1|متر|متریا}} وارؤ د ریتراز دریا",
        "exif-gpsaltitude-below-sealevel": "$1 {{جمی:$1|متر|متریا}} وارؤ د ریتراز دریا",
+       "exif-gpsspeed-k": "کلومتر سی هر ساعت",
+       "exif-gpsspeed-m": "مایل سی هر ساعت",
+       "exif-gpsdestdistance-k": "کلومتر",
+       "exif-gpsdestdistance-m": "مایل",
        "exif-gpsdop-good": "خو ($1)",
+       "exif-dc-source": "سرچشمه وارسگر",
+       "exif-dc-type": "نوع وارسگر",
+       "exif-rating-rejected": "رد بیه",
        "exif-iimcategory-ace": "هنریا، رهزیشت و زیستگه",
-       "watchlistall2": "همه شو",
+       "exif-iimcategory-clj": "جرم و قانون",
+       "exif-iimcategory-fin": "اموری و کسم کار",
+       "exif-iimcategory-edu": "آموختاری",
+       "exif-iimcategory-evn": "زئشت گه",
+       "exif-iimcategory-hth": "تن آزایی",
+       "exif-iimcategory-lab": "کار",
        "namespacesall": "همه شو",
        "monthsall": "همه",
+       "confirmemail_send": "کل کردن رازینه پشت راس کاری",
+       "recreate": "د نو راس کردن",
+       "confirm_purge_button": "خوئه",
+       "confirm-watch-button": "خوئه",
+       "confirm-watch-top": "ای بلگه نه د سیل برگتو اضاف می کید؟",
+       "confirm-unwatch-button": "خوئه",
+       "confirm-unwatch-top": "ای بلگه نه د سیل برگتو ؤرمیداریت؟",
+       "semicolon-separator": ";&#32;",
+       "comma-separator": ",&#32;",
+       "colon-separator": ":&#32;",
+       "pipe-separator": "&#32;|&#32;",
+       "word-separator": "&#32;",
+       "ellipsis": "...",
+       "percent": "$1%",
+       "parentheses": "($1)",
+       "brackets": "[$1]",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "بلگه دمايی",
+       "imgmultipagenext": "بلگه نهایی",
        "imgmultigo": "رؤ!",
+       "img-lang-opt": "$2 ($1)",
        "img-lang-default": "(زون پیش زمینه)",
        "img-lang-go": "رو",
+       "ascending_abbrev": "ری وه وارو",
+       "descending_abbrev": "ری وه هاری",
+       "table_pager_next": "بلگه نهایی",
+       "table_pager_prev": "بلگه دمايی",
+       "table_pager_first": "سرآسونه",
+       "table_pager_last": "بلگه آخری",
        "table_pager_limit_submit": "رو",
        "autosumm-replace": "مینونه وا \"َ$1\" جاگزین بی",
        "autoredircomment": "بلگه واگردونی بیه سی[[$1]]",
+       "watchlistedit-normal-title": "ویرایشت سیل برگ",
+       "watchlisttools-clear": "پاک کردن سیل برگ",
        "watchlisttools-view": "آلشتیا مرتوط نه بوینیت",
        "watchlisttools-edit": "سیل برگ بوینیتو و ویرایشت بکید",
        "watchlisttools-raw": "سیل برگ نه ردیفی ویرایشت کو",
+       "iranian-calendar-m1": "فروردین",
+       "iranian-calendar-m2": "اردیبهشت",
+       "iranian-calendar-m3": "خرداد",
+       "iranian-calendar-m4": "تیر",
+       "iranian-calendar-m5": "مرداد",
+       "iranian-calendar-m6": "شهریور",
+       "iranian-calendar-m7": "مئر",
+       "iranian-calendar-m8": "آبان",
+       "iranian-calendar-m9": "آذر",
+       "iranian-calendar-m10": "دی",
+       "iranian-calendar-m11": "بئمن",
+       "iranian-calendar-m12": "اسفند",
+       "hijri-calendar-m1": "محرم",
+       "hijri-calendar-m2": "صفر",
+       "hijri-calendar-m3": "ربیع الاول",
+       "hijri-calendar-m4": "رجو",
+       "timezone-utc": "UTC",
        "duplicate-defaultsort": "زنهار کلیت پیش فرض جور بیه $2 تازه ای یا کلید پیش فرض جوربیه $1 رد بیه.",
+       "version": "نسقه",
+       "version-specialpages": "بلگيا ويجه",
+       "version-variables": "آلشت ونا",
        "version-antispam": "نهاگرتن هرزنومه",
+       "version-other": "هنی",
+       "version-no-ext-name": "[بی نوم]",
        "version-ext-license": "ليسانس",
+       "version-skin-colheader-name": "پوسه",
        "version-ext-colheader-version": "نسقه",
        "version-ext-colheader-license": "ليسانس",
+       "version-ext-colheader-description": "شرح",
        "version-ext-colheader-credits": "نیسنه یا",
+       "version-poweredby-others": "دیه رون",
+       "version-software-version": "نسقه",
+       "version-entrypoints-header-url": "يو آر ال",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
        "redirect": "واگردونی وا جانیا،بلگه یا وانیئری نوم دیارکو",
        "redirect-submit": "رو",
+       "redirect-lookup": "پی جوری:",
+       "redirect-value": "ارزایشت:",
+       "redirect-user": "نوم دياركن کاریار:",
+       "redirect-page": "نوم دیار کن بلگه",
+       "redirect-revision": "وانئری بلگه",
        "redirect-file": "نوم جانیا",
        "fileduplicatesearch-filename": "نوم جانیا:",
+       "fileduplicatesearch-submit": "پی جوری",
+       "fileduplicatesearch-info": "$1 × $2 pixel<br />انازه جانیا: $3<br />MIME type: $4",
        "specialpages": "بلگيا ويجه",
        "specialpages-group-changes": "آلشتیا تازه و پهرستنومه یا",
        "specialpages-group-media": "گزارشتیا رسانه و سوارکردیا",
        "specialpages-group-users": "کاروریا و حقوق",
        "specialpages-group-pages": "نوم گه بلگه یا",
+       "specialpages-group-pagetools": "اوزاریا بلگه",
+       "specialpages-group-wiki": "رسینه و اوزاریا",
        "specialpages-group-redirects": "بلگه ویجه واگردونی بیه",
+       "blankpage": "بلگه حالی",
        "external_image_whitelist": "یه خط نه ول بکید چی وه<pre>",
        "tag-filter": "فيلتر [[Special:Tags|Tag]]:",
+       "tag-filter-submit": "فيلتر",
+       "tags-title": "سردیسیا",
+       "tags-tag": "نوم سردیس",
        "tags-display-header": "دیاری کردن د نوم گه آلشتیا",
+       "tags-active-header": "کنشتگره؟",
+       "tags-active-yes": "هری",
+       "tags-active-no": "نه",
+       "tags-edit": "ویرایشت",
+       "tags-hitcount": "$1 {{جمی:$1|آلشت|آلشتیا}}",
+       "comparepages": "کنار یک نیاین بلگه یا",
+       "compare-page1": "بلگه 1",
+       "compare-page2": "بلگه 2",
+       "compare-rev1": "دوواره ديئن1",
+       "compare-submit": "کنار یک نیاین",
        "compare-title-not-exists": "سرون مشقص بیه وجود ناره.",
        "compare-revision-not-exists": "وانئری که شما تی دیار کردیته وجود ناره.",
+       "htmlform-required": "یه دئه واس بوئه.",
+       "htmlform-submit": "دئن",
+       "htmlform-reset": "انجومشیو کردن آلشتیا",
+       "htmlform-selectorother-other": "هنی",
+       "htmlform-no": "نه",
+       "htmlform-yes": "هری",
+       "htmlform-cloner-create": "هنی اضاف بکیت",
+       "htmlform-cloner-delete": "ؤرداشتن",
        "revdelete-content-hid": "مینونه قام بیه",
        "revdelete-uname-hid": "نوم کاروری قام بیه",
        "revdelete-content-unhid": "مینونه قام نبیه",
        "revdelete-uname-unhid": "نوم کاروری قام نبیه",
+       "rightsnone": "(هيش كوم)",
+       "revdelete-summary": "چکسه ویرایشت",
+       "feedback-subject": "سرون:",
+       "feedback-message": "پيغوم:",
+       "feedback-cancel": "انجوم شیوسن",
+       "feedback-submit": "کل کردن نهاهوال حون",
        "feedback-close": "انجوم بی",
        "searchsuggest-search": "پی جوری",
+       "searchsuggest-containing": "د حال و بار مینونه دار...",
        "api-error-badaccess-groups": "شما سی سوار کرد جانیایا د ای ویکی اجازه ناریت.",
        "api-error-copyuploaddisabled": "سوار کردن وا یو آر ال دی ای سرور غیرفعال بیه.",
        "api-error-filename-tooshort": "نوم جانیا فره کؤچکه.",
        "api-error-illegal-filename": "نوم جانیا اجازه دئه نئ.",
        "api-error-mustbeloggedin": "شما سی سوارکردن فایلیا با بیایت وامین",
        "duration-days": "$1{{جمی:$1|روز|روزیا}}",
+       "duration-weeks": "$1 {{جمی:$1|هفته|هفته یا}}",
        "duration-years": "$1{{جمی:$1| سال|سالیا}}",
-       "expand_templates_remove_comments": "جا وه جا بیئن ویر و باوریا"
+       "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes-value": "$1/$2",
+       "limitreport-expansiondepth-value": "$1/$2",
+       "limitreport-expensivefunctioncount-value": "$1/$2",
+       "expand_templates_output": "نتیجه",
+       "expand_templates_ok": "خوئه",
+       "expand_templates_remove_comments": "جا وه جا بیئن ویر و باوریا",
+       "expand_templates_preview": "پيش سيل",
+       "pagelanguage": "بلگه انتخاو زون",
+       "pagelang-name": "بلگه",
+       "pagelang-language": "زون",
+       "pagelang-use-default": "وه کار بسن زون پیش دیه",
+       "pagelang-select-lang": "انتخاو زون",
+       "right-pagelang": "آلشت دئن زون بلگه",
+       "action-pagelang": "آلشت دئن زون بلگه",
+       "log-name-pagelang": "آلشت دئن زون پهرستنومه",
+       "log-description-pagelang": "ای پهرستنومه در بلگه زونا آلشت گرته.",
+       "default-skin-not-found-row-enabled": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')",
+       "default-skin-not-found-row-disabled": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')",
+       "mediastatistics-table-count": "شماره جانیایا",
+       "mediastatistics-header-unknown": "نادیار",
+       "mediastatistics-header-bitmap": "عسگیا بیت مپ",
+       "mediastatistics-header-audio": "دنگ",
+       "mediastatistics-header-video": "عسگ و فیلم",
+       "mediastatistics-header-office": "نوشتگه",
+       "mediastatistics-header-text": "نیسسه دار",
+       "json-error-syntax": "خطا دستوری"
 }
index c16d21f..bfd8856 100644 (file)
        "passwordreset-emailsent-capture": "Slaptažodžio priminimo laiškas bus išsiųstas, toks koks parodytas.",
        "passwordreset-emailerror-capture": "Priminimo e-mail laiškas buvo sugeneruotas, toks koks parodytas, bet pasiuntimas naudotojui buvo nesėkmingas: $1",
        "changeemail": "Pakeisti el. pašto adresą",
-       "changeemail-header": "Keisti paskyros 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-none": "(nėra)",
        "changeemail-password": "Jūsų {{SITENAME}} slaptažodis:",
        "changeemail-submit": "Keisti el. pašto adresą",
-       "changeemail-cancel": "Atšaukti",
        "bold_sample": "Paryškintas tekstas",
        "bold_tip": "Paryškinti tekstą",
        "italic_sample": "Tekstas kursyvu",
        "searchrelated": "susiję",
        "searchall": "visi",
        "showingresults": "Žemiau rodoma iki '''$1''' {{PLURAL:$1|rezultato|rezultatų|rezultatų}} pradedant #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Rezultatas '''$1''' iš '''$3'''|Rezultatai '''$1 - $2''' iš '''$3'''}} pagal užklausą '''$4'''",
        "search-nonefound": "Nėra rezultatų, atitinkančių užklausą.",
        "powersearch-legend": "Išplėstinė paieška",
        "powersearch-ns": "Ieškoti vardų srityse:",
        "unusedtemplateswlh": "kitos nuorodos",
        "randompage": "Atsitiktinis puslapis",
        "randompage-nopages": "{{PLURAL:$2|Šioje vardų srityje|Šiose vardų srityse}} nėra jokių puslapių: $1.",
-       "randomincategory-selectcategory-submit": "Pirmyn",
        "randomredirect": "Atsitiktinis peradresavimas",
        "randomredirect-nopages": "Vardų srityje „$1“ nėra jokių peradresavimų.",
        "statistics": "Statistika",
        "querypage-disabled": "Šiame specialiajame puslapyje yra išjungta dėl neefektyvumo.",
        "booksources": "Knygų šaltiniai",
        "booksources-search-legend": "Knygų šaltinių paieška",
-       "booksources-go": "Rodyti",
        "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:",
        "wlheader-enotif": "El. pašto pranešimai yra įjungti.",
        "wlheader-showupdated": "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
        "wlnote": "{{PLURAL:$1|Rodomas '''$1''' paskutinis pakeitimas, atliktas|Rodomi '''$1''' paskutiniai pakeitimai, atlikti|Rodoma '''$1''' paskutinių pakeitimų, atliktų}} per '''$2''' {{PLURAL:$2|paskutinę valandą|paskutines valandas|paskutinių valandų}}, nuo $3 $4.",
-       "wlshowlast": "Rodyti paskutinių $1 valandų, $2 dienų ar $3 pakeitimus",
+       "wlshowlast": "Rodyti paskutinių $1 valandų, $2 dienų ar  pakeitimus",
        "watchlist-options": "Stebimųjų sąrašo parinktys",
        "watching": "Įtraukiama į stebimųjų sąrašą...",
        "unwatching": "Šalinama iš stebimųjų sąrašo...",
        "import": "Importuoti puslapius",
        "importinterwiki": "Tarpprojektinis importas",
        "import-interwiki-text": "Pasirinkite projektą ir puslapio pavadinimą importavimui.\nVersijų datos ir redaktorių vardai bus išlaikyti.\nVisi tarpprojektiniai importo veiksmai yra registruojami  [[Special:Log/import|importo istorijoje]].",
-       "import-interwiki-source": "Šaltinio wiki projektas/puslapis:",
        "import-interwiki-history": "Kopijuoti visas istorijos versijas šiam puslapiui",
        "import-interwiki-templates": "Įtraukti visus šablonus",
        "import-interwiki-submit": "Importuoti",
        "exif-urgency-low": "Žemas ( $1 )",
        "exif-urgency-high": "Aukštas ( $1 )",
        "exif-urgency-other": "Vartotojo nustatyta pirmenybė ($1)",
-       "watchlistall2": "visus",
        "namespacesall": "visos",
        "monthsall": "visi",
        "confirmemail": "Patvirtinkite el. pašto adresą",
        "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",
        "rightsnone": "(jokių)",
+       "revdelete-summary": "keitimo komentaras",
        "feedback-bugornote": "Jei jūs esate pasirengę aprašyti techninę problemą išsamiau, [$1 praneškite apie programinę klaidą].\nKitu atveju, galite naudotis žemiau esančia paprastesne forma. Jūsų komentaras bus įtrauktas į puslapį „[$3 $2]“, kartu su jūsų naudotojo vardu ir jūsų naudojama naršykle.",
        "feedback-subject": "Tema:",
        "feedback-message": "Pranešimas:",
index 717c2be..b60e023 100644 (file)
        "resetpass-submit-cancel": "Atsaukt",
        "passwordreset-username": "Slāgvuords:",
        "passwordreset-email": "E-posta adress:",
-       "changeemail-cancel": "Atsaukt",
        "bold_sample": "Pamalnais roksts",
        "bold_tip": "Pamalnais roksts",
        "italic_sample": "Sleipais roksts",
        "pager-older-n": "{{PLURAL:$1|vacuoku 1|vacuokys $1}}",
        "booksources": "Gruomotu olūti",
        "booksources-search-legend": "Meklēt gruomotu olūtus",
-       "booksources-go": "Meklēt",
        "log": "Registri",
        "allpages": "Vysys puslopys",
        "prevpage": "Īprīškejuo lopa ($1)",
        "watchthispage": "Puorraudzeit itū lopu",
        "unwatch": "Vairs napuorraudzeit",
        "watchlist-details": "(Tu puorraug $1 {{PLURAL:$1|lopu|lopys}}, naskaitūt sarunu lopys.)",
-       "wlshowlast": "Paruodeit izmainis pādejūs $1 stuņžu laikā voi $2 dīnu laikā, voi ari $3",
+       "wlshowlast": "Paruodeit izmainis pādejūs $1 stuņžu laikā voi $2 dīnu laikā, voi ari",
        "watchlist-options": "Puorraugamū rokstu saroksta īspiejis",
        "watching": "Davīnoj puorraudzeišonai...",
        "unwatching": "Atslādz puorraudzeišonu...",
        "metadata-expand": "Paruodeit papyldu detalis",
        "metadata-collapse": "Nūglobuot papyldu detalis",
        "metadata-fields": "Itymā paziņuojumā asūši metadatu lauki byus radzami attāla lopā ari tod, kod metadatu tabula byus sateita.\nPuorejī lauki, piec nūklusiejuma, byus nūglobuoti.\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",
-       "watchlistall2": "vysys",
        "namespacesall": "vysys",
        "monthsall": "vysi",
        "watchlisttools-view": "Apsavērt atbylstūšuos izmainis",
index c4a82fa..c7c9ba3 100644 (file)
        "passwordreset-emailsent-capture": "Hriat nawntirna e-lehkha thawn a ni, a hnuaia tarlan ang khuan.",
        "passwordreset-emailerror-capture": "Hriat nawntirna e-lehkha siam chhuah a ni a, a hnuaia tarlan ang khuan; mahsé thawn hlawhchham a ni: $1",
        "changeemail": "E-chenhmun thlâk rawh",
-       "changeemail-header": "Siangchan e-chenhmun thlâk rawh",
        "changeemail-text": "I e-chenhmun thlâk tùrin hei hi dahkhat vek rawh. I tihdanglam nemngheh nan i thurûk ziahluh i ngai ang.",
        "changeemail-no-info": "He phêk lut mai tùr chuan i inziahluh a ngai.",
        "changeemail-oldemail": "Tùna i e-chenhmun:",
        "changeemail-none": "(pakhat mah)",
        "changeemail-password": "I {{SITENAME}} thurûk:",
        "changeemail-submit": "E-chenhmun thlâk rawh",
-       "changeemail-cancel": "Sûtna",
        "bold_sample": "Hawrawp thau",
        "bold_tip": "Hawrawp thau",
        "italic_sample": "Hawrawp äwn",
        "search-relatedarticle": "Laichin",
        "searchrelated": "laichin",
        "searchall": "a vaiin",
-       "showingresultsheader": "'''$4'''  tana {{PLURAL:$5|chhuak   '''$3'''  zinga  '''$1'''|chhuak  '''$3'''  zinga   '''$1 - $2'''  }}",
        "search-nonefound": "I zawn mil a awm lo",
        "powersearch-legend": "Zawnna chi sang",
        "powersearch-ns": "Hemi hminghmun chhungah hian zawng rawh:",
        "suppress": "Hmuh hmaih",
        "booksources": "Lehkhabu rawnte",
        "booksources-search-legend": "Lehkhabu hnar zingah zawng rawh",
-       "booksources-go": "Khai le",
        "specialloguserlabel": "Buatsaihtu:",
        "speciallogtitlelabel": "Tumhmun (hming emaw hmangtu):",
        "log": "Chanchin-ziak",
        "watchlist-details": "I ralvèn zing aţanga {{PLURAL:$1| phêk $1 |phêk $1}}, sawihona phêk chhiar lohvin.",
        "wlheader-enotif": "*E-lehkha inhriattirna tihnun a ni.",
        "wlheader-showupdated": "I tlawh hnuhnun ber hnua tihdanglam phêk te chu a '''thau'''va tihlan a ni.",
-       "wlshowlast": "Darkar $1 kalta-a tihdanglam tilang rawh , ni $2 kalta-a tihdanglam tilang rawh, $3 tilang rawh",
+       "wlshowlast": "Darkar $1 kalta-a tihdanglam tilang rawh , ni $2 kalta-a tihdanglam tilang rawh,  tilang rawh",
        "watchlist-options": "Ralvèn duhdàn",
        "enotif_reset": "Phêk zawng zawng tlawh tawh vek angin chhinchhiah rawh.",
        "enotif_impersonal_salutation": "{{SITENAME}} hmangtu",
        "exif-languagecode": "Ţawng",
        "exif-iimversion": "IIM chhuah",
        "exif-iimcategory": "Pawl",
-       "watchlistall2": "a vaiin",
        "namespacesall": "a vaiin",
        "monthsall": "a vaiin",
        "confirm-watch-top": "I ralvèn zingah i telh duh maw?",
index b6813d7..3d590ec 100644 (file)
        "tog-extendwatchlist": "Izvērst uzraugāmo lapu sarakstu, lai parādītu visas veiktās izmaiņas (ne tikai pašas svaigākās)",
        "tog-usenewrc": "Grupēt izmaiņas pēc lapas pēdējās izmaiņās un uzraugāmo lapu sarakstā  (izmanto ''JavaScript'')",
        "tog-numberheadings": "Automātiski numurēt virsrakstus",
-       "tog-showtoolbar": "Rādīt rediģēšanas rīkjoslu",
-       "tog-editondblclick": "Atvērt lapu rediģēšanai ar dubultklikšķi",
-       "tog-editsectiononrightclick": "Atvērt sadaļas rediģēšanas lapu, uzklikšķinot ar labo peles pogu uz sadaļas virsraksta (izmanto ''JavaScript'')",
+       "tog-showtoolbar": "Rādīt labošanas rīkjoslu",
+       "tog-editondblclick": "Atvērt lapu labošanai ar dubultklikšķi",
+       "tog-editsectiononrightclick": "Atvērt sadaļas labošanas lapu, uzklikšķinot ar labo peles pogu uz sadaļas virsraksta (izmanto ''JavaScript'')",
        "tog-watchcreations": "Pievienot manis radītās lapas un manis augšuplādētos failus uzraugāmo lapu sarakstam",
        "tog-watchdefault": "Pievienot manis izmainītās lapas un failus uzraugāmo lapu sarakstam",
        "tog-watchmoves": "Pievienot manis pārvietotās lapas un failus uzraugāmo lapu sarakstam",
        "tog-watchdeletion": "Pievienot manis izdzēstās lapas un failus uzraugāmo lapu sarakstam",
        "tog-minordefault": "Atzīmēt visus labojumus jau sākotnēji par maznozīmīgiem",
-       "tog-previewontop": "Parādīt priekšskatījumu virs rediģēšanas lauka, nevis zem",
+       "tog-previewontop": "Parādīt priekšskatījumu virs labošanas lauka, nevis zem",
        "tog-previewonfirst": "Parādīt priekšskatījumu jau uzsākot rediģēšanu",
        "tog-enotifwatchlistpages": "Paziņot pa e-pastu par izmaiņām uzraugāmo rakstu sarakstā esošos rakstos un failos",
        "tog-enotifusertalkpages": "Paziņot pa e-pastu par izmaiņām manā diskusiju lapā",
@@ -59,7 +59,7 @@
        "tog-diffonly": "Nerādīt lapu saturu zem izmaiņām",
        "tog-showhiddencats": "Rādīt slēptās kategorijas",
        "tog-norollbackdiff": "Neņemt vērā atšķirības, veicot atriti",
-       "tog-useeditwarning": "Brīdināt mani, kad es atstāju lapas rediģēšanu nesaglabājot izmaiņas",
+       "tog-useeditwarning": "Brīdināt mani, kad es atstāju lapas labošanu, nesaglabājot izmaiņas",
        "tog-prefershttps": "Vienmēr izmantot drošu savienojumu pēc pieslēgšanās",
        "underline-always": "vienmēr",
        "underline-never": "Nekad",
        "and": "&#32;un",
        "qbfind": "Meklēšana",
        "qbbrowse": "Navigācija",
-       "qbedit": "Izmainīšana",
+       "qbedit": "Labošana",
        "qbpageoptions": "Šī lapa",
        "qbmyoptions": "Manas lapas",
        "faq": "BUJ",
        "permalink": "Pastāvīgā saite",
        "print": "Drukāt",
        "view": "Skatīt",
-       "edit": "Izmainīt šo lapu",
+       "edit": "Labot šo lapu",
        "create": "Izveidot",
        "editthispage": "Izmainīt šo lapu",
        "create-this-page": "Izveidot šo lapu",
        "otherlanguages": "Citās valodās",
        "redirectedfrom": "(Pāradresēts no $1)",
        "redirectpagesub": "Pāradresācijas lapa",
+       "redirectto": "Pāradresēt uz:",
        "lastmodifiedat": "Šajā lapā pēdējās izmaiņas izdarītas $2, $1.",
        "viewcount": "Šī lapa ir tikusi apskatīta $1 {{PLURAL:$1|reizi|reizes}}.",
        "protectedpage": "Aizsargāta lapa",
        "currentevents-url": "Project:Aktualitātes",
        "disclaimers": "Saistību atrunas",
        "disclaimerpage": "Project:Saistību atrunas",
-       "edithelp": "Rediģēšanas palīdzība",
+       "edithelp": "Labošanas palīdzība",
        "mainpage": "Sākumlapa",
        "mainpage-description": "Sākumlapa",
        "policy-url": "Project:Politika",
        "newmessageslinkplural": "{{PLURAL:$1|jauns vēstījums|999=jauni vēstījumi}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|pēdējā izmaiņa|999=pēdējās izmaiņas}}",
        "youhavenewmessagesmulti": "Tev ir jauns ziņojums: $1",
-       "editsection": "labot",
+       "editsection": "labot šo sadaļu",
        "editold": "labot",
        "viewsourceold": "aplūkot kodu",
        "editlink": "labot",
        "viewsourcelink": "aplūkot kodu",
-       "editsectionhint": "Rediģēt sadaļu: $1",
+       "editsectionhint": "Labot sadaļu: $1",
        "toc": "Satura rādītājs",
        "showtoc": "parādīt",
        "hidetoc": "paslēpt",
        "collapsible-collapse": "paslēpt",
        "collapsible-expand": "rādīt",
+       "confirmable-confirm": "Vai esi {{GENDER:$1|pārliecināts|pārliecināta}}?",
+       "confirmable-yes": "Jā",
+       "confirmable-no": "Nē",
        "thisisdeleted": "Apskatīt vai atjaunot $1?",
        "viewdeleted": "Skatīt $1?",
        "restorelink": "$1 {{PLURAL:$1|dzēsto versiju|dzēstās versijas}}",
        "gotaccount": "Tev jau ir lietotājvārds? '''$1'''!",
        "gotaccountlink": "Pieslēgties",
        "userlogin-resetlink": "Esat aizmirsis savu pieslēgšanās informāciju?",
+       "userlogin-resetpassword-link": "Aizmirsi savu paroli?",
        "userlogin-helplink2": "Palīdzība ar pieslēgšanos",
        "userlogin-loggedin": "Tu esi pieslēdzies ar lietotājvārdu {{GENDER:$1|$1}}.\nLai pieslēgtos ar citu lietotājvārdu, aizpildi šo formu.",
        "userlogin-createanother": "Izveidot citu kontu",
        "passwordreset-emailsent-capture": "Atgādinājuma e-pasta ziņojums ir nosūtīts, tas parādīts zemāk.",
        "passwordreset-emailerror-capture": "Atgādinājuma e-pasta ziņojums tika izveidots, tas parādīts zemāk, bet nosūtīšana lietotājam neizdevās: $1",
        "changeemail": "Mainīt e-pasta adresi",
-       "changeemail-header": "Mainīt konta e-pasta adresi",
        "changeemail-oldemail": "Pašreizējā e-pasta adrese:",
        "changeemail-newemail": "Jaunā e-pasta adrese:",
        "changeemail-none": "(nav)",
        "changeemail-password": "Jūsu {{SITENAME}} parole:",
        "changeemail-submit": "Mainīt e-pastu",
-       "changeemail-cancel": "Atcelt",
        "resettokens-tokens": "Žetoni:",
        "resettokens-token-label": "$1 (šībrīža vērtība: $2)",
        "bold_sample": "Teksts treknrakstā",
        "blockedtext": "'''Tavs lietotāja vārds vai IP adrese ir nobloķēta.'''\n\n$1 nobloķēja tavu lietotāja vārdu vai IP adresi.\nBloķējot norādītais iemesls bija: ''$2''.\n\n*Bloka sākums: $8\n*Bloka beigas: $6\n*Bija domāts nobloķēt: $7\n\nTu vari sazināties ar $1 vai kādu citu [[{{MediaWiki:Grouppage-sysop}}|administratoru]] lai apspriestu šo bloku.\n\nPievērs uzmanību, tam, ka ja tu neesi norādījis derīgu e-pasta adresi ''[[Special:Preferences|savās izvēlēs]]'', tev nedarbosies \"sūtīt e-pastu\" iespēja.\n\nTava IP adrese ir $3 un bloka identifikators ir #$5. Lūdzu iekļauj vienu no tiem, vai abus, visos turpmākajos pieprasījumos.",
        "autoblockedtext": "Tava IP adrese ir tikusi automātiski nobloķēta, tāpēc, ka to (nupat kā) ir lietojis cits lietotājs, kuru nobloķēja $1.\nNorādītais bloķēšanas iemesls bija:\n\n:''$2''\n\n* Bloka sākums: $8\n* Bloka beigas: $6\n* Bija domāts nobloķēt: $7\n\nTu vari sazināties ar $1 vai kādu citu [[{{MediaWiki:Grouppage-sysop}}|adminu]] lai apspriestu šo bloku.\n\nAtceries, ka tu nevari lietot \"sūtīt e-pastu šim lietotājam\" iespēju, ja tu neesi norādījis derīgu e-pasta adresi savās [[Special:Preferences|lietotāja izvelēs]] un bloķējot tev nav aizbloķēta iespēja sūtīt e-pastu.\n\nTava pašreizējā IP adrese ir $3 un  bloka ID ir $5.\nLūdzu iekļauj šos visos ziņojumos, kurus sūti adminiem, apspriežot šo bloku.",
        "blockednoreason": "iemesls nav norādīts",
-       "whitelistedittext": "Tev $1 lai varētu rediģēt lapas.",
+       "whitelistedittext": "Lūdzu $1, lai varētu labot lapas.",
        "confirmedittext": "Lai varētu izmainīt lapas, vispirms jāapstiprina savu e-pasta adresi.\nNorādi un apstiprini e-pasta adresi savos [[Special:Preferences|lietotāja uzstādījumos]].",
        "nosuchsectiontitle": "Nevaru atrast sadaļu",
        "nosuchsectiontext": "Jūs mēģinājāt rediģēt sadaļu, kas neeksistē.\nTā var būt pārvietota vai dzēsta, kamēr jūs apskatījāt lapu.",
        "continue-editing": "Pāriet uz labošanas lauku",
        "session_fail_preview": "'''Neizdevās apstrādāt tavas izmaiņas, jo tika pazaudēti sesijas dati.\nLūdzu mēģini vēlreiz.\nJa tas joprojām nedarbojas, mēģini [[Special:UserLogout|izlogoties ārā]] un ielogoties no jauna.'''",
        "session_fail_preview_html": "'''Neizdevās apstrādāt tavas izmaiņas, jo tika pazaudēti sesijas dati.'''\n\n''Tā, kā {{grammar:ģenitīvs|{{SITENAME}}}} darbojas neapstrādāts HTML, pirmskats ir paslēpts, lai aizsargātos no JavaScripta  uzbrukumiem.''\n\n'''Ja šis bija parasts rediģēšanas mēģinājums, mēģini vēlreiz.\nJa tas joprojām nedarbojas, mēģini [[Special:UserLogout|izlogoties ārā]] un ielogoties no jauna.'''",
-       "editing": "Izmainīt $1",
+       "editing": "Labot $1",
        "creating": "Izveido lapu $1",
-       "editingsection": "Izmainīt $1 (sadaļa)",
-       "editingcomment": "Izmainīt $1 (jauna sadaļa)",
+       "editingsection": "Labot lapas \"$1\" sadaļu",
+       "editingcomment": "Labot $1 (jauna sadaļa)",
        "editconflict": "Izmaiņu konflikts: $1",
        "explainconflict": "Kāds cits ir izmainījis šo lapu pēc tam, kad tu sāki to mainīt.\nAugšējā teksta logā ir lapas teksts tā pašreizējā versijā.\nTevis veiktās izmaiņas ir redzamas apakšējā teksta logā.\nLai saglabātu savas izmaiņas, tev ir jāapvieno savs teksts ar saglabāto pašreizējo variantu.\nKad spiedīsi pogu \"{{int:savearticle}}\", tiks saglabāts '''tikai''' teksts, kas ir augšējā teksta logā.",
        "yourtext": "Tavs teksts",
        "nonunicodebrowser": "'''Brīdinājums: Tavs pārlūks neatbalsta unikodu.\nIr pieejams risinājums, kas ļaus tev droši rediģēt lapas: zīmes, kas nav ASCII, parādīsies izmaiņu logā kā heksadecimāli kodi.'''",
        "editingold": "'''BRĪDINĀJUMS: Saglabājot šo lapu, tu izmainīsi šīs lapas novecojušu versiju, un ar to tiks dzēstas visas izmaiņas, kas izdarītas pēc šīs versijas.'''",
        "yourdiff": "Atšķirības",
-       "copyrightwarning": "Lūdzu, ņem vērā, ka viss ieguldījums, kas veikts {{grammar:lokatīvs|{{SITENAME}}}}, ir uzskatāms par publiskotu saskaņā ar $2 (vairāk info skat. $1).\nJa nevēlies, lai Tevis rakstīto kāds rediģē un izplata tālāk, tad, lūdzu, nepievieno to šeit!<br />\n\nIzvēloties \"Saglabāt lapu\", Tu apliecini, ka šo rakstu esi rakstījis vai papildinājis pats vai izmantojis informāciju no darba, ko neaizsargā autortiesības, vai tamlīdzīga brīvi pieejama resursa.\n'''BEZ ATĻAUJAS NEPIEVIENO DARBU, KO AIZSARGĀ AUTORTIESĪBAS!'''",
+       "copyrightwarning": "Lūdzu, ņem vērā, ka viss ieguldījums, kas veikts {{grammar:lokatīvs|{{SITENAME}}}}, ir uzskatāms par publiskotu saskaņā ar $2 (vairāk info skatīt $1).\nJa nevēlies, lai Tevis rakstīto kāds labo un izplata tālāk, tad, lūdzu, nepievieno to šeit!<br />\n\nIzvēloties \"Saglabāt lapu\", Tu apliecini, ka šo rakstu esi rakstījis vai papildinājis pats vai izmantojis informāciju no darba, ko neaizsargā autortiesības, vai tamlīdzīga brīvi pieejama resursa.\n'''BEZ ATĻAUJAS NEPIEVIENO DARBU, KO AIZSARGĀ AUTORTIESĪBAS!'''",
        "copyrightwarning2": "Lūdz ņem vērā, ka visu ieguldījumu {{grammar:lokatīvs|{{SITENAME}}}} var rediģēt, mainīt vai izdzēst citi lietotāji. Ja negribi lai ar tavu rakstīto tā izrīkojas, nepievieno to šeit.\n\nTu apliecini, ka šo rakstu esi rakstījis vai papildinājis pats vai izmantojis informāciju no darba, ko neaizsargā autortiesības, vai tamlīdzīga brīvi pieejama resursa (sīkāk skatīt $1).\n\n'''BEZ ATĻAUJAS NEPIEVIENO DARBU, KO AIZSARGĀ AUTORTIESĪBAS!'''",
        "longpageerror": "'''Kļūda: Teksts, kuru tu mēģināji saglabāt, ir $1 kilobaitus garš, kas ir vairāk nekā pieļaujamie $2 kilobaiti.\nTas nevar tikt saglabāts.'''",
        "readonlywarning": "'''Brīdinājums: Datubāze ir slēgta apkopei, tāpēc tu tagad nevarēsi saglabāt veiktās izmaiņas.\nTu vari nokopēt tekstu un saglabāt kā teksta failu vēlākam laikam.'''\n\nAdmins, kas slēdza datubāzi, norādīja šādu paskaidrojumu: $1",
        "template-protected": "(aizsargāta)",
        "template-semiprotected": "(daļēji aizsargāta)",
        "hiddencategories": "Šī lapa ietilpst {{PLURAL:$1|1 slēptajā kategorijā|$1 slēptajās kategorijās}}:",
-       "nocreatetext": "{{grammar:lokatīvs|{{SITENAME}}}} ir atslēgta iespēja izveidot jauinas lapas.\nTu vari atgriezties atpakaļ un izmainīt esošu lapu, vai arī [[Special:UserLogin|ielogoties, vai izveidot kontu]].",
+       "nocreatetext": "{{grammar:lokatīvs|{{SITENAME}}}} ir atslēgta iespēja izveidot jaunas lapas.\nTu vari atgriezties atpakaļ un izlabot esošu lapu, vai arī [[Special:UserLogin|ielogoties, vai izveidot kontu]].",
        "nocreate-loggedin": "Tev nav atļaujas veidot jaunas lapas.",
        "sectioneditnotsupported-title": "Sadaļa rediģēšana nav atbalstīta",
        "sectioneditnotsupported-text": "Sadaļu rediģēsana šajā lapā nav atļauta.",
        "searchrelated": "saistītais",
        "searchall": "viss",
        "showingresults": "Šobrīd ir {{PLURAL:$1|redzama|redzamas}} '''$1''' {{PLURAL:$1|lapa|lapas}}, sākot ar #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Šobrīd ir redzama '''$1''' lapa no '''$3'''|Šobrīd ir redzamas '''$1 — $2''' lapas no '''$3'''}}, kas satur '''$4'''",
        "search-nonefound": "Nav atrasti pieprasījumam atbilstoši rezultāti.",
        "powersearch-legend": "Izvērstā meklēšana",
        "powersearch-ns": "Meklēt šajās lapu grupās:",
        "prefs-rendering": "Izskats",
        "saveprefs": "Saglabāt",
        "restoreprefs": "Atjaunot noklusētos uzstādījumus (visās sadaļās)",
-       "prefs-editing": "Rediģēšana",
+       "prefs-editing": "Labošana",
        "rows": "Rindiņu skaits:",
        "columns": "Simbolu skaits rindiņā:",
        "searchresultshead": "Meklēšana",
        "rcnotefrom": "Šobrīd redzamas izmaiņas kopš '''$2''' (parādītas ne vairāk par '''$1''').",
        "rclistfrom": "Parādīt jaunas izmaiņas kopš $3 $2",
        "rcshowhideminor": "$1 maznozīmīgos",
+       "rcshowhideminor-show": "Rādīt",
+       "rcshowhideminor-hide": "Slēpt",
        "rcshowhidebots": "$1 botus",
+       "rcshowhidebots-show": "Rādīt",
+       "rcshowhidebots-hide": "Slēpt",
        "rcshowhideliu": "$1 reģistrētos lietotājus",
+       "rcshowhideliu-show": "Rādīt",
+       "rcshowhideliu-hide": "Slēpt",
        "rcshowhideanons": "$1 anonīmos",
-       "rcshowhidepatr": "$1 pārbaudītie labojumi",
+       "rcshowhideanons-show": "Rādīt",
+       "rcshowhideanons-hide": "Slēpt",
+       "rcshowhidepatr": "$1 pārbaudītos labojumus",
+       "rcshowhidepatr-show": "Rādīt",
+       "rcshowhidepatr-hide": "Slēpt",
        "rcshowhidemine": "$1 manus",
+       "rcshowhidemine-show": "Rādīt",
+       "rcshowhidemine-hide": "Slēpt",
        "rclinks": "Parādīt pēdējās $1 izmaiņas pēdējās $2 dienās.<br />$3",
        "diff": "izmaiņas",
        "hist": "hronoloģija",
        "number_of_watching_users_pageview": "[šo lapu uzrauga $1 {{PLURAL:$1|lietotājs|lietotāji}}]",
        "rc_categories": "Ierobežot uz kategorijām (atdalīt ar \"|\")",
        "rc_categories_any": "Jebkas",
+       "rc-change-size-new": "$1 {{PLURAL:$1|baits|baiti}} pēc izmaiņām",
        "newsectionsummary": "/* $1 */ jauna sadaļa",
        "rc-enhanced-expand": "Skatīt detaļas",
        "rc-enhanced-hide": "Paslēpt detaļas",
        "reuploaddesc": "Atcelt augšupielādi un atgriezties pie augšupielādes veidnes.",
        "upload-tryagain": "Iesniegt izmainīto faila aprakstu",
        "uploadnologin": "Neesi iegājis",
-       "uploadnologintext": "Tev jābūt [[Special:UserLogin|iegājušam]], lai augšuplādētu failus.",
+       "uploadnologintext": "Lūdzu, $1, lai augšupielādētu failus.",
        "upload_directory_missing": "Augšupielādes direktorijs ($1) ir pazudis, un to tīmekļa serveris nevar izveidot.",
        "upload_directory_read_only": "Augšupielādes direktoriju ($1) tīmekļa serveris nevar labot.",
        "uploaderror": "Augšupielādes kļūda",
        "randompage": "Nejauša lapa",
        "randomincategory": "Nejauša lapa kategorijā",
        "randomincategory-invalidcategory": "\"$1\" nav derīgs kategorijas nosaukums.",
-       "randomincategory-selectcategory-submit": "Aiziet",
+       "randomincategory-category": "Kategorija:",
+       "randomincategory-legend": "Nejauša lapa kategorijā",
        "randomredirect": "Nejauša pāradresācijas lapa",
        "statistics": "Statistika",
        "statistics-header-pages": "Lapu statistika",
        "querypage-disabled": "Šī īpašā lapā ir atspējota veiktspējas iemeslu dēļ.",
        "booksources": "Grāmatu avoti",
        "booksources-search-legend": "Meklēt grāmatu avotus",
-       "booksources-go": "Meklēt",
        "specialloguserlabel": "Izpildītājs:",
        "speciallogtitlelabel": "Mērķis (nosaukums vai lietotājs):",
        "log": "Reģistri",
        "mywatchlist": "Uzraugāmie raksti",
        "watchlistfor2": "Priekš $1 ($2)",
        "nowatchlist": "Tavā uzraugāmo rakstu sarakstā nav neviena raksta.",
-       "watchlistanontext": "Lūdzu $1, lai apskatītu vai labotu savu uzraugāmo rakstu saraksta saturu.",
+       "watchlistanontext": "Lūdzu pieslēdzies, lai apskatītu vai labotu savu uzraugāmo rakstu saraksta saturu.",
        "watchnologin": "Neesi iegājis",
        "addwatch": "Pievienot uzraugāmo lapu sarakstam",
        "addedwatchtext": "Lapa \"[[:$1]]\" ir pievienota [[Special:Watchlist|tevis uzraudzītajām lapām]], kur tiks parādītas izmaiņas, kas izdarītas šajā lapā vai šīs lapas diskusiju lapā, kā arī šī lapa tiks iezīmēta '''pustrekna''' [[Special:RecentChanges|pēdējo izmaiņu lapā]], lai to būtu vieglāk pamanīt.\n\nJa vēlāk pārdomāsi un nevēlēsies vairs uzraudzīt šo lapu, klikšķini uz saites '''neuzraudzīt''' rīku joslā.",
        "watchlist-details": "(Tu uzraugi $1 {{PLURAL:$1|lapu|lapas}}, neieskaitot diskusiju lapas.)",
        "wlheader-enotif": "E-pasta paziņojumi ir ieslēgti.",
        "wlheader-showupdated": "Lapas, kuras ir tikušas izmainītas, kopš tu tās pēdējoreiz apskatījies, te rādās ar '''pustrekniem''' burtiem",
-       "wlshowlast": "Parādīt izmaiņas pēdējo $1 stundu laikā vai $2 dienu laikā, vai arī $3.",
+       "wlshowlast": "Parādīt izmaiņas pēdējo $1 stundu laikā vai $2 dienu laikā, vai arī .",
        "watchlist-options": "Uzraugāmo rakstu saraksta opcijas",
        "watching": "Uzrauga...",
        "unwatching": "Neuzrauga...",
        "rollbacklinkcount-morethan": "atcelt vairāk kā $1 {{PLURAL:$1|labojumu|labojumus}}",
        "rollbackfailed": "Novēršana neizdevās",
        "cantrollback": "Nav iespējams novērst labojumu; iepriekšējais labotājs ir vienīgais lapas autors.",
-       "alreadyrolled": "Nav iespējams novērst pēdējās izmaiņas, ko lapā [[:$1]] saglabāja [[User:$2|$2]] ([[User talk:$2|diskusija]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]). Kāds cits jau ir rediģējis šo lapu vai novērsis izmaiņas.\n\nPēdējās izmaiņas saglabāja [[User:$3|$3]] ([[User talk:$3|diskusija]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Nav iespējams novērst pēdējās izmaiņas, ko lapā [[:$1]] saglabāja [[User:$2|$2]] ([[User talk:$2|diskusija]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]). Kāds cits jau ir labojis šo lapu vai novērsis izmaiņas.\n\nPēdējās izmaiņas saglabāja [[User:$3|$3]] ([[User talk:$3|diskusija]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Attiecīgās izmaiņas kopsavilkums bija: \"''$1''\".",
        "revertpage": "Novērsu izmaiņas, ko izdarīja [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusija]]), atjaunoju versiju, ko saglabāja [[User:$1|$1]]",
        "revertpage-nouser": "Novērsu (lietotājvārds slēpts) izmaiņas, atjaunoju [[User:$1|$1]] versiju.",
        "minimum-size": "Mazākais izmērs",
        "maximum-size": "Lielākais izmērs:",
        "pagesize": "(baiti)",
-       "restriction-edit": "Izmainīt",
+       "restriction-edit": "Labot",
        "restriction-move": "Pārvietot",
        "restriction-create": "Izveidot",
        "restriction-upload": "Augšupielādēt",
        "thumbnail_image-missing": "Šķiet, ka fails ir pazudis: $1",
        "import": "Importēt lapas",
        "importinterwiki": "Starpviki importēšana",
-       "import-interwiki-source": "Avota viki/lapa:",
        "import-interwiki-history": "Nokopēt visas šīs lapas hronoloģijā atrodamās versijas",
        "import-interwiki-templates": "Iekļaut visas veidnes",
        "import-interwiki-submit": "Importēt",
        "tooltip-pt-login": "Aicinām tevi ieiet {{grammar:lokatīvs|{{SITENAME}}}}, tomēr tas nav obligāti.",
        "tooltip-pt-logout": "Iziet",
        "tooltip-ca-talk": "Diskusija par šī raksta lapu",
-       "tooltip-ca-edit": "Izmainīt šo lapu. Lūdzam izmantot pirmskatu pirms lapas saglabāšanas.",
+       "tooltip-ca-edit": "Labot šo lapu. Lūdzam izmantot pirmskatu pirms lapas saglabāšanas.",
        "tooltip-ca-addsection": "Sākt jaunu sadaļu",
        "tooltip-ca-viewsource": "Šī lapa ir aizsargāta. Tu vari apskatīties tās izejas kodu.",
        "tooltip-ca-history": "Šīs lapas iepriekšējās versijas.",
        "file-info-png-frames": "$1 {{PLURAL:$1|kadrs|kadri}}",
        "newimages": "Jauno attēlu galerija",
        "imagelisttext": "Šobrīd redzams $1 {{PLURAL:$1|attēla|attēlu}} uzskaitījums, kas sakārtots $2.",
-       "newimages-summary": "Šeit var apskatīties pēdējos šeit augšuplādētos failus.",
+       "newimages-summary": "Šeit var apskatīties pēdējos augšuplādētos failus šajā Vikipēdijā",
        "newimages-legend": "Filtrs",
        "newimages-label": "Faila nosaukums (vai tā daļa):",
+       "newimages-showbots": "Parādīt botu augšupielādētos failus",
        "noimages": "Nav nekā ko redzēt.",
        "ilsubmit": "Meklēt",
        "bydate": "<b>pēc datuma</b>",
        "exif-urgency-low": "Zema ($1)",
        "exif-urgency-high": "Augsta ($1)",
        "exif-urgency-other": "Lietotāja definēta prioritāte ($1)",
-       "watchlistall2": "visas",
        "namespacesall": "visas",
        "monthsall": "visi",
        "confirmemail": "Apstiprini e-pasta adresi",
        "logentry-newusers-create": "Lietotāja konts $1 tika {{GENDER:$2|izveidots}}",
        "logentry-newusers-create2": "$1 {{GENDER:$2|izveidoja}} lietotāja kontu $3",
        "logentry-newusers-autocreate": "Lietotaja konts $1 tika {{GENDER:$2|izveidots}} automātiski",
+       "logentry-upload-overwrite": "$1 augšupielādēja jaunu $3 versiju",
        "rightsnone": "(nav)",
+       "revdelete-summary": "izmaiņu kopsavilkums",
        "feedback-subject": "Temats:",
        "feedback-message": "Ziņojums:",
        "feedback-cancel": "Atcelt",
index e23125f..1047123 100644 (file)
@@ -44,7 +44,7 @@
        "tog-forceeditsummary": "漏概醒之",
        "tog-watchlisthideown": "不哨己文",
        "tog-watchlisthidebots": "不哨僕文",
-       "tog-watchlisthideminor": "不哨纂",
+       "tog-watchlisthideminor": "不哨纂",
        "tog-watchlisthideliu": "不哨有簿",
        "tog-watchlisthideanons": "不哨無簿",
        "tog-watchlisthidepatrolled": "不哨已巡",
        "youhavenewmessages": "有$1書至子書房也。($2)",
        "youhavenewmessagesfromusers": "子有 $1 自 {{PLURAL:$3|一簿戶也|$3 簿戶也}} ($2)。",
        "youhavenewmessagesmanyusers": "子有 $1 自多簿戶 ( $2 )",
-       "newmessageslinkplural": "{{PLURAL:$1|一新訊息|新訊息}}",
-       "newmessagesdifflinkplural": "新{{PLURAL:$1|易|易}}",
+       "newmessageslinkplural": "{{PLURAL:$1|一新訊|999=新訊}}",
+       "newmessagesdifflinkplural": "新",
        "youhavenewmessagesmulti": "新訊於$1",
        "editsection": "纂",
        "editold": "纂",
        "hidetoc": "藏",
        "collapsible-collapse": "摺",
        "collapsible-expand": "展",
+       "confirmable-yes": "是",
+       "confirmable-no": "否",
        "thisisdeleted": "還$1或閱之?",
        "viewdeleted": "閱$1之?",
        "restorelink": "$1已刪",
        "nospecialpagetext": "<strong>無此特查。</strong>\n\n見[[Special:SpecialPages|{{int:specialpages}}]]。",
        "error": "有誤",
        "databaseerror": "庫藏誤然",
+       "databaseerror-query": "尋:$1",
+       "databaseerror-error": "錯:$1",
        "laggedslavemode": "警示,此頁不新",
        "readonly": "鎖庫藏",
        "enterlockreason": "何以鎖之?何日啟之?",
        "changeemail": "更郵址",
        "changeemail-none": "(無)",
        "changeemail-password": "汝 {{SITENAME}} 之符節",
-       "changeemail-cancel": "棄",
        "bold_sample": "粗體",
        "bold_tip": "粗體",
        "italic_sample": "斜體",
        "yourtext": "子也",
        "storedversion": "時也",
        "nonunicodebrowser": "'''警示:覽器不識萬國碼,以十六進位數代之,以保纂可也。'''",
-       "editingold": "''''''警示'''子纂舊然。強儲之,則新易失焉。'''",
+       "editingold": "'''\"警示\"子纂舊然。強儲之,則新易失焉。'''",
        "yourdiff": "異",
        "copyrightwarning": "{{SITENAME}}全文皆循$2,詳見$1。不喜他纂,但去可矣。文務親撰,或謄公本,\n'''萬勿盜版!'''",
        "copyrightwarning2": "{{SITENAME}}全文,允眾人撰、纂、刪、校。不喜他纂,但去可矣。<br />\n文務親撰,或謄公本,如$1。'''萬勿盜版!'''",
        "searchrelated": "關",
        "searchall": "全",
        "showingresults": "見'''$1'''尋,自'''$2'''始:",
-       "showingresultsheader": "見'''$4''',{{PLURAL:$5|'''$1''''''$3'''之尋|'''$1 - $2''',共'''$3'''之尋}}",
        "search-nonefound": "詢中無結。",
        "powersearch-legend": "尋",
        "powersearch-ns": "尋名集:",
        "preferences": "簿註",
        "mypreferences": "簿註",
        "prefs-edits": "數計:",
+       "prefsnologintext2": "登簿以更簿註",
        "prefs-skin": "面版",
        "skin-preview": "草覽",
        "datedefault": "原註",
        "action-userrights-interwiki": "纂他wiki上之權",
        "action-siteadmin": "鎖及解鎖其庫",
        "nchanges": "$1易",
+       "enhancedrc-since-last-visit": "$1未示",
        "enhancedrc-history": "誌",
        "recentchanges": "近易",
        "recentchanges-legend": "近易項",
        "filehist-thumb": "縮",
        "filehist-thumbtext": "於$1之縮",
        "filehist-nothumb": "無縮",
-       "filehist-user": "",
+       "filehist-user": "簿",
        "filehist-dimensions": "度",
        "filehist-filesize": "檔幅",
        "filehist-comment": "註",
        "unusedtemplateswlh": "支鏈",
        "randompage": "清風翻書",
        "randompage-nopages": "下列{{PLURAL:$2|名集}}中無頁也:$1",
-       "randomincategory-selectcategory-submit": "往",
        "randomredirect": "任渡",
        "randomredirect-nopages": "「$1」名冊內無渡也。",
        "statistics": "彙統",
        "double-redirect-fixer": "修渡",
        "brokenredirects": "斷渡",
        "brokenredirectstext": "頁下斷渡。",
-       "brokenredirects-edit": "",
+       "brokenredirects-edit": "",
        "brokenredirects-delete": "刪",
        "withoutinterwiki": "孤語",
        "withoutinterwiki-summary": "頁下無鏈他語。",
        "querypage-disabled": "此奇頁基以效,故停之。",
        "booksources": "書海",
        "booksources-search-legend": "舀書海",
-       "booksources-go": "往",
+       "booksources-search": "尋",
        "booksources-text": "有賈售新舊書,或有助焉。茲列如下:",
        "booksources-invalid-isbn": "供之ISBN無確,查始複之誤。",
        "specialloguserlabel": "簿:",
        "wlheader-enotif": "*准報信。",
        "wlheader-showupdated": "*易者'''粗體'''。",
        "wlnote": "近<b>$2</b>時有$1者易。",
-       "wlshowlast": "見近$1時、$2天、$3時易",
+       "wlshowlast": "見近$1時、$2天、時易",
        "watchlist-options": "哨項",
        "watching": "出陣…",
        "unwatching": "收兵…",
        "exbeforeblank": "清文前乃為:「$1」",
        "delete-confirm": "刪\"$1\"",
        "delete-legend": "刪",
-       "historywarning": "警示,此頁有誌$1:",
+       "historywarning": "警示,此頁有誌$1:",
        "confirmdeletetext": "欲刪此物與誌,知後果、合[[{{MediaWiki:Policy-url}}]]後再為之。",
        "actioncomplete": "成矣",
        "actionfailed": "未竟",
        "import": "圖入匯",
        "importinterwiki": "維基互匯",
        "import-interwiki-text": "欲入匯,擇維基、揀題文,審時、纂者隨記也。互匯錄於[[Special:Log/import|誌入]]。",
-       "import-interwiki-source": "來源wiki/頁:",
+       "import-interwiki-sourcepage": "源頁:",
        "import-interwiki-history": "審、誌同匯",
        "import-interwiki-submit": "入匯",
        "import-interwiki-namespace": "入名集:",
        "exif-gpsdestdistance-k": "千米",
        "exif-gpsdestdistance-m": "哩",
        "exif-gpsdestdistance-n": "浬",
-       "watchlistall2": "全",
        "namespacesall": "全",
        "monthsall": "全",
        "confirmemail": "核郵驛",
        "revdelete-restricted": "應限至有秩",
        "revdelete-unrestricted": "除限自有秩",
        "rightsnone": "(凡)",
-       "searchsuggest-search": "尋"
+       "revdelete-summary": "摘",
+       "searchsuggest-search": "尋",
+       "mediastatistics-header-unknown": "未知",
+       "mediastatistics-header-video": "映像",
+       "json-error-syntax": "語法有誤"
 }
index e6169e6..d955332 100644 (file)
        "invalidtitle-knownnamespace": "\"$2\" नामस्थान आर \"$3\" नाम बला गलत शीर्षक",
        "invalidtitle-unknownnamespace": "अज्ञात नामस्थान संख्या $1 आर नाम \"$2\" वाला गलत शीर्षक",
        "exception-nologin": "सम्प्रवेशित नै",
+       "exception-nologin-text": "इ पन्ना वा काजके सक्षम करवाक लेल कृपया प्रवेश करु।",
        "exception-nologin-text-manual": "इ पन्ना वा काजके सक्षम करवाक लेल कृपया $1 करु।",
        "virus-badscanner": "खराप विन्यास: अज्ञात विषविधि बिम्बक: ''$1''",
        "virus-scanfailed": "बिम्ब विफल (विध्यादेश $1)",
        "resetpass-submit-loggedin": "कूटशब्द बदलू",
        "resetpass-submit-cancel": "खतम करू",
        "resetpass-wrong-oldpass": "अमान्य अस्थायी वा अखुनका कूटशब्द।\nअहाँ पहिनहिये सफलतासँ कूटशब्द बदलि लेने छी वा एकटा नव अस्थायी कूटशब्द लेल आग्रह केने छी।",
+       "resetpass-recycled": "रीसेट करएके लेल नयाँ कूटशब्दमे कृपया अपन वर्तमान कूटशब्द नै द के नयाँ देल जाउ।",
        "resetpass-temp-password": "तात्कालिक कूटशब्द",
+       "resetpass-abort-generic": "कूटशब्दमें बदलाव कोनो एक्सटेंशन द्वारा रोक देल गएल अछि ।",
+       "resetpass-expired": "अहाँके कूटशब्दक वैधता अवधि खत्तम भ गेल अछि । कृपया सम्प्रवेशित करवाक लेल नयाँ कूटशब्द राखु।",
        "passwordreset": "कूटशब्द फेरसँ बनाउ",
        "passwordreset-text-one": "अपन कूटशब्द रीसेट करवाक लेल इ फारम भरु ।",
        "passwordreset-text-many": "{{PLURAL:$1|ई-पत्रके माध्यमसऽ एकटा अस्थायी कूटशब्द पावैलेल कोनो एकटा डिब्बा भरु ।}}",
        "passwordreset-emailsent-capture": "एकटा स्मरण ई-पत्र पठाएल गेल अछि, जे नीचाँ देखाएल अछि।",
        "passwordreset-emailerror-capture": "एकटा स्मरण ई-पत्र बनाएल गेल अछि, जे नीचाँ देखाएल अछि, मुदा प्र्योक्ताकेँ एकरा पठेबाक प्रयास विफल भेल: $1",
        "changeemail": "ई-पत्र संकेत बदलू",
-       "changeemail-header": "ई-पत्र पता खाता बदलू",
        "changeemail-text": "अपन ई-पत्र संकेत बदलबा लेल ऐ आवेदनकेँ भरू। अहाँकेँ ऐ परिवर्तनक अनुमोदन लेल अपन कूटशब्द भरए पड़त।",
        "changeemail-no-info": "अहाँकेँ ऐ पन्नाकेँ सोझे देखबाले सम्प्रवेशित हुअए पड़त।",
        "changeemail-oldemail": "अखुनका ई-पत्र संकेत:",
        "changeemail-none": "(कोनो नै)",
        "changeemail-password": "अहाके {{SITENAME}} कूटशब्द:",
        "changeemail-submit": "ई-पत्र संकेत बदलू",
-       "changeemail-cancel": "खतम",
        "changeemail-throttled": "अहाँ ढ़ेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास करबासँ पहिने कने काल थम्हू।",
        "resettokens": "टोकन रीसेट करी",
        "resettokens-no-tokens": "रीसेट करवाक लेल कोनो टोकन नै अछि।",
        "searchall": "सभटा",
        "showingresults": "नीचाँ एतऽ धरि {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम सभ}}  #'''$2''' सँ प्रारम्भ भऽ कऽ।",
        "showingresultsinrange": "नीचाँ एतऽ धरि {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम सभ}}  #'''$2''' सँ प्रारम्भ भऽ कऽ।",
-       "showingresultsheader": "{{PLURAL:$5|परिणाम '''$1''' एकर '''$3'''|परिणाम सभ '''$1 - $2''' एकर '''$3'''}} ऐ लेल '''$4'''",
        "search-nonefound": "अभ्यर्थनासँ मेल खाइत कोनो परिणाम नै भेटल।",
        "powersearch-legend": "विशेष खोज",
        "powersearch-ns": "निर्धारकमे खोज",
        "booksources": "किताबक सन्दर्भ सभ",
        "booksources-search-legend": "किताबक सन्दर्भक लेल ताकू",
        "booksources-isbn": "आइ.एस.बी.एन.:",
-       "booksources-go": "चलू",
        "booksources-text": "नीचाँ दोसर जालस्थलसँ लागि सभक सूची अछि जे नव आ प्रयोग कएल किताब बेचैए, आ ई पोथी सभक विषयमे ओहो सूचना दऽ सकैए जे अहाँ ताकि रहल छी:",
        "booksources-invalid-isbn": "देल आइ.एस.बी.एन. संख्या मान्य नै बुझाइत अछि; कृपा कऽ मूल स्रोतसँ द्वितीयक बनेबा काल भेल भ्रमकेँ जाँचू।",
        "specialloguserlabel": "कर्ता:",
        "wlheader-enotif": "ई-पत्र सूचना लागू अछि।",
        "wlheader-showupdated": "पन्ना सभ जे अहाँक एतए अन्तिम बेर अएलाक बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
        "wlnote": "नीचाँ {{PLURAL:$1|is the last change|are the last '''$1''' changes}} अन्तिम {{PLURAL:$2|hour|'''$2''' hours}} $3, $4 जेना।",
-       "wlshowlast": "देखाउ अन्तिम $1 घण्टा $2 दिन $3",
+       "wlshowlast": "देखाउ अन्तिम $1 घण्टा $2 दिन",
        "watchlist-options": "साकांक्षसूचीक विकल्प सभ",
        "watching": "ताकिमे...",
        "unwatching": "छोड़ल ...",
        "import": "पन्ना सभकेँ आनू",
        "importinterwiki": "ट्रान्सविकी आनू",
        "import-interwiki-text": "एकटा विकी आ पन्ना शीर्षक अनबाले चुनू।\nसंशोधन तिथि आ सम्पादकक नाम सुरक्षित रहत।\nसभटा ट्रान्सविकी आयात क्रिया सम्प्रवेशित अछि [[Special:Log/import|import log]] पर।",
-       "import-interwiki-source": "मूल विकी/ पन्ना:",
        "import-interwiki-history": "अए पन्नाक सभटा इतिहास संशोधनक द्वितीयक बनाउ",
        "import-interwiki-templates": "सभटा नमूना शामिल करू",
        "import-interwiki-submit": "आनू",
        "exif-urgency-low": "कम ($1)",
        "exif-urgency-high": "बेशी ($1)",
        "exif-urgency-other": "प्रयोक्ता परिभाषित प्राथमिकता ($1)",
-       "watchlistall2": "सभ",
        "namespacesall": "सभटा",
        "monthsall": "सभ",
        "confirmemail": " ई-पत्र सत्यापित करू",
        "logentry-newusers-create2": "$1 {{लिंग:$2|बनाएल}} {{लिंग:$4|एकटा प्रयोक्ता खाता}} $3",
        "logentry-newusers-autocreate": "खाता $1 छल {{लिंग:$2|बनाएल}} स्वतः",
        "rightsnone": "(कोनो नै)",
+       "revdelete-summary": "सम्पादन सारांश",
        "feedback-subject": "विषय:",
        "feedback-message": "संदेश:",
        "feedback-cancel": "रद्द करु",
index 90ac544..50a0650 100644 (file)
        "passwordreset-emailsent-capture": "Imel kanggo nyetel maning tembung sandhi uwis dikirim, kaya sing ditidokna nang ngisor kiye.",
        "passwordreset-emailerror-capture": "Imel nggo nyetel maning tembung sandhi uwis digawe, kaya sing ditidokna nang ngisor kiye, ningen gole ngirim maring {{GENDER:$2|panganggo}} ora teyeng: $1",
        "changeemail": "Ganti alamat imel",
-       "changeemail-header": "Ganti alamat imel-e akun",
        "changeemail-text": "Rampungna formulir kiye kanggo ngganti alamat imel Rika. Rika bakal perlu nglebokna tembung sandhi Rika nggo konfirmasi owahan kiye.",
        "changeemail-no-info": "Rika kudu mlebu log kanggo ngakses kaca kiye sacara langsung.",
        "changeemail-oldemail": "Alamat imel sekiye:",
        "changeemail-none": "(ora ana)",
        "changeemail-password": "Tembung sandhi {{SITENAME}} Rika:",
        "changeemail-submit": "Ganti imel",
-       "changeemail-cancel": "Ora sida",
        "resettokens-no-tokens": "Ora ana token sing arep disetel maning.",
        "resettokens-legend": "Nyetel maning token",
        "resettokens-token-label": "$1 (biji sekiye:$2)",
        "searchrelated": "kagandhèng",
        "searchall": "kabèh",
        "showingresults": "Nang ngisor kiye ditidokna ana {{PLURAL:$1|'''1''' kasil|'''$1''' kasil}}, dimulai sekang #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Asil '''$1''' sekang '''$3'''|Asil '''$1 - $2''' sekang '''$3'''}} kanggo '''$4'''",
        "search-nonefound": "Ora ana kasil sing cocog karo pitakonan (''query'').",
        "powersearch-legend": "Panggoletan lanjut",
        "powersearch-ns": "Goleti nang bilik jeneng:",
        "querypage-disabled": "Kaca astamiwa kiye dinonaktifna kanggo alesan kinerja.",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Nggoleti sumbere buku",
-       "booksources-go": "Goleti",
        "booksources-text": "Nang ngisor kiye daftar pranala ming situs liyane sing ngadol buku anyarlan bekas,lan mbok menawa duwe informasi sebanjure ngenani buku-buku sing lagi Rika goleti:",
        "booksources-invalid-isbn": "ISBN sing diwenehna ketone anu ora valid; priksa mbok salah gole nyalin sekang sumber asline.",
        "specialloguserlabel": "Panganggo:",
        "watch": "Pantau",
        "unwatch": "Batalna pantauan",
        "watchlist-details": "Ana {{PLURAL:$1|$1 kaca|$1 kaca}} nang daftar pangawasané Rika, ora klebu kaca-kaca dhiskusiné.",
-       "wlshowlast": "Tidokna $1 jam $2 dina $3 pungkasan",
+       "wlshowlast": "Tidokna $1 jam $2 dina  pungkasan",
        "watchlist-options": "Opsi daftar pangawasan",
        "delete-confirm": "Busek \"$1\"",
        "delete-legend": "Busek",
        "exif-lightsource-17": "Cahya standar A",
        "exif-lightsource-18": "Cahya standar B",
        "exif-lightsource-19": "Cahya standar C",
-       "watchlistall2": "kabèh",
        "namespacesall": "kabèh",
        "monthsall": "kabèh",
        "watchlisttools-view": "Tidokna owahan sing ana gandhèngané",
index bdd4460..278f236 100644 (file)
        "searchrelated": "мала",
        "searchall": "сембе",
        "showingresults": "Ала няфтеви {{PLURAL:$1|мувсь '''1'''|мувсть '''$1'''}} '''$2'''-ста ушедомс.",
-       "showingresultsheader": "{{PLURAL:$5|'''$1''' сафкс '''$3'''-ста|'''$1 - $2''' сафкст '''$3'''-ста}} '''$4'''нди",
        "search-nonefound": "Аш вешфксонди малады муфкст.",
        "powersearch-legend": "Анцяйняньбес вешендема",
        "powersearch-ns": "Вешендемс лемботмоса:",
        "suppress": "Кяшема",
        "booksources": "Кинигань кучфтемат",
        "booksources-search-legend": "Вешендемс кинигань кучфтемат",
-       "booksources-go": "Аре",
        "booksources-text": "Сюлмафкст ала сотфт иля интернет лопатнень мархта, конат мишендихть од эди сире кинигат, ди тоса, улема, тон мусак поладомань информацие ся кинигатнень колга, конатнень тон вешендить:",
        "booksources-invalid-isbn": "Путф ISBN аф виде эли аф кондясти; ванк кодамкс сон ульсь лисемаса.",
        "specialloguserlabel": "Тиись:",
        "wlheader-enotif": "Электрононь сёрма вельде пачфнема нолдаф тевс.",
        "wlheader-showupdated": "Лопат конань полафтозь тонь мекольце сувсемадот меле няфтевсть '''эчке тяшкса'''.",
        "wlnote": "Ала {{PLURAL:$1|мекольце полафнема|'''$1''' мекольце полафнемат}} ётай {{PLURAL:$2| ойста (часста)|'''$2''' ойста (часста)}}.",
-       "wlshowlast": "Няфтемс мекольце $1 ойхть (част) $2 шит $3",
+       "wlshowlast": "Няфтемс мекольце $1 ойхть (част) $2 шит",
        "watchlist-options": "Мельгеваномать латцемасна",
        "watching": "Ванома...",
        "unwatching": "Аф ванома...",
        "import": "Таргамс лопат",
        "importinterwiki": "Трансвикинь таргама",
        "import-interwiki-text": "Кочкак Вики ди лопань коняксонц эрявихть таргаманди.\nВерзиень шисна ди петнихнень лемсна улихть ванфтфт.\nСембе ётковикинь таргама тефне тяшневихть [[Special:Log/import|таргамань лувомас]].",
-       "import-interwiki-source": "Вики лисьма/лопа:",
        "import-interwiki-history": "Копияфтомс тя лопать сембе историянь верзиенза",
        "import-interwiki-templates": "Сувафтомс сембе шаблотт",
        "import-interwiki-submit": "Таргамс",
        "exif-gpsspeed-n": "Сюлмот",
        "exif-gpsdirection-t": "Виде ён",
        "exif-gpsdirection-m": "Магнитонь ён",
-       "watchlistall2": "сембе",
        "namespacesall": "сембе",
        "monthsall": "сембе",
        "confirmemail": "Кемостамс электрононь адресть",
        "tag-filter": "[[Special:Tags|Tag]] педямась:",
        "revdelete-restricted": "нолдаф тевс кардафксне системонь вятиксненди",
        "revdelete-unrestricted": "системонь вятиксненди кардафксне валхтфт",
-       "rightsnone": "(аш)"
+       "rightsnone": "(аш)",
+       "revdelete-summary": "петнемс нюрьхкяня лихтемать"
 }
index b885a3f..452dc0c 100644 (file)
@@ -24,6 +24,7 @@
        "tog-watchdefault": "Hanaraka ny pejy ary ny rakitra ovaiko",
        "tog-watchmoves": "Hanaraka ny pejy ary ny rakitra ovaiko anarana",
        "tog-watchdeletion": "Hanaraka ny pejy ary ny rakitra voafafako",
+       "tog-watchrollback": "Hanaraka pejy nanaovako famoana",
        "tog-minordefault": "Mariho ho madinika foana aloha ny fanovana rehetra",
        "tog-previewontop": "Asehoy alohan'ny boaty fanovana ny tsipalotra",
        "tog-previewonfirst": "Asehoy ny tsipalotra amin'ny fanovana voalohany",
        "otherlanguages": "Amin'ny tenim-pirenena hafa",
        "redirectedfrom": "(tonga teto avy amin'ny $1)",
        "redirectpagesub": "Pejy fihodinana",
+       "redirectto": "Mihodina mankany:",
        "lastmodifiedat": "Voaova farany tamin'ny $1 amin'ny $2 ity pejy ity<br />",
        "viewcount": "voastsidika in-$1 ity pejy ity.{{PLURAL:}}",
        "protectedpage": "Pejy voaaro",
        "hidetoc": "afeno",
        "collapsible-collapse": "Vonkinina",
        "collapsible-expand": "Itarina",
+       "confirmable-confirm": "Tena tapa-kevitra amin'izany ianao?",
+       "confirmable-yes": "Eny",
+       "confirmable-no": "Tsia",
        "thisisdeleted": "Hojerena sa haverina i $1?",
        "viewdeleted": "Hijery an'i $1?",
        "restorelink": "ny fanovàna voafafa $1{{PLURAL:}}",
        "invalidtitle-knownnamespace": "Lohateny tsy miady amin'ny fepetra miaraka amin'ny anaram-balam-pejy \"$2\" ary soratra \"$3\"",
        "invalidtitle-unknownnamespace": "Lohateny tsy ekena miaraka amin'ny laharana anaran-tsehatra $1 ary soratra \"$2\"",
        "exception-nologin": "Tsy tafiditra",
-       "exception-nologin-text": "[[Special:Userlogin|Midira]]  mba hahafahanao manao ilay asa na hahafahanao mijery ity pejy ity",
+       "exception-nologin-text": "Midira amin'ny kaontinao azafady mba hahafahana manao ilay asa na mitsidika ilay pejy",
        "exception-nologin-text-manual": "$1 ianao mba ho tonga eo amin'ilay pejy na hanatanteraka ilay asa.",
        "virus-badscanner": "Diso : Tsy fantatray ny mpitady virus ''$1''",
        "virus-scanfailed": "Tsy mety alefa ny fitadiavana (kaody $1)",
        "createaccount-text": "Nisy olona nanokatra kaonty ho an'ny adiresy imailakao eo amin'ny {{SITENAME}} ($4) mitondra anarana « $2 » miaraka amin'ny tenimiafina « $3 ».<br />\nTokony miditra na manokatra kaonty ianao, ary ovay ny tenimiafinao dien-izao.\n\nAza mijery ity hafatra ity ianao raha voaforona an-tsifetezana ilay kaonty io.",
        "login-throttled": "Betsaka loatra ny andram-pidirana nataonao.\n\nAndraso $1 alohan'ny mamerina.",
        "login-abort-generic": "Tsy nahomby ny fanandramanao niditra",
+       "login-migrated-generic": "Efa nafindra ny kaontinao, ary efa tsy misy eto amin'ity wiki ity intsony ny anaram-pikamnbanao",
        "loginlanguagelabel": "fiteny : $1",
        "suspicious-userlogout": "Ny fangataham-pialanao dia tsy nekena satria ohatry ny nalfan'ny mpizahan-tsehatra simba izy na kasy ny proxy.",
        "createacct-another-realname-tip": "Azo tsy atsofoka ny tena anarana.\nRaha misafidy ny hanome azy ianao, ho ampiasaina amin'ny fanehoana ny anjara asan'ilay mpikambana ilay izy.",
        "passwordreset-emailsent-capture": "Lasa ilay mailaka famerenana tenimiafina, izay aseho eo ambany.",
        "passwordreset-emailerror-capture": "Nosoratana ilay mailaka famerenana tenimiafina, izay aseho eo ambany, fa tsy tafalefa tany amin'ilay mpikambana ilay izy : $1{{GENDER:$2}}",
        "changeemail": "Hanova ny adiresy imailaka",
-       "changeemail-header": "Hanova ny adiresy imailak'ilay kaonty",
        "changeemail-text": "Fenoy ity pejy fenoina ity mba hanova ny adiresy imailakao. Ilainao atsofoka ny tenimiafinao mba hampihatra ilay fanovana.",
        "changeemail-no-info": "Mila tafiditra ianao vao avaka mijery ity pejy ity.",
        "changeemail-oldemail": "Adiresy imailaka ankehitriny :",
        "changeemail-none": "(tsy misy)",
        "changeemail-password": "Tenimiafinao eo amin'i {{SITENAME}}:",
        "changeemail-submit": "Hanova ny adiresy imailaka",
-       "changeemail-cancel": "Adinoy",
        "changeemail-throttled": "Betsaka loatra ny andrana nidiranao.\nMiandrasa $1 alohan'ny manandrana indray.",
        "resettokens": "Hamerina ny token",
        "resettokens-text": "Azonao averina eto ny token izay hahafahana mitsidika ny fampahalalana tsy sarababem-bahoaka ao amin'ny kaontinao. Tokony ataonao izany raha voazara tsy fanahy iniana na raha nisy nangalatra ny kaontinao.",
        "preview": "Topi-maso",
        "showpreview": "Asehoy aloha",
        "showdiff": "Asehoy ny fiovana",
-       "anoneditwarning": "'''Tandremo''' : Tsy nisoratra tato amin'ny sehtatra ianao. Ho voatahiry ao amin'ny tantaram-pejy ny adiresy IP anao.",
+       "blankarticle": "<strong>Tandremo:</strong> Fotsy ny pejy tianao hoforonina.\nRaha manindry an'i \"{{int:savearticle}}\" indray ianao dia hoforonina tsy hisy vontoatiny na inona na innona ilay pejy.",
+       "anoneditwarning": "<strong>Fampitandremana :</strong> Tsy niditra tamin'ny kaontinao ianao. Ho hitan'ny vahoaka ny adiresy IP-nao raha manova inona na inona ianao. Raha <strong>[$1 miditra amin'ny kaontinao]</strong> ianao dia ho anisan'ny tombontsoa anananao ny fanaovana ny fiovana amin'ny solonanaranao.",
        "anonpreviewwarning": "''Tsy niditra ianao. Hampitahiry ny adiresy IP anao ao amin'ny tantaram-panovan'ity pejy ity ny fitehirizana ny fanovana.''",
        "missingsummary": "'''Hafatra fampantsiahivana''' : tsy mbola nanome ny ambangovangom-panovanao ianao.\nRaha mbola tsindriano fanindroany eo amin'ny bokotra {{int:savearticle}}, ho voatahiry tsy fanambarana ny fanovanao.",
        "missingcommenttext": "Ampidiro ny ambangovangony azafady.",
        "permissionserrorstext-withaction": "{{PLURAL:$1|Tsy manana alalàna ianao|Tsy manana alalàna ianao}} $2. Io ny antony ($2):",
        "recreate-moveddeleted-warn": "'''Tandremo''' : Mamerina pejy efa voafafa ianareo.'''\n\nMarino raha tsara tohizana ny fanovana eto amin'ity pejy ity. Ny laogim-pamafana sy ny famindran-toerana dia eo ambany :",
        "moveddeleted-notice": "Voafafa ity pejy ity.\nEo ambany eo any laogin'ny famindran-toerana sy ny famafana ho an'ny antsipirihany.",
-       "log-fulllog": "Hijery ny tatitr’asa (log)",
+       "log-fulllog": "Hijery ny laogy manontolo",
        "edit-hook-aborted": "Tsy nety ny fanovàna\nTsy nanome antony",
        "edit-gone-missing": "Tsy afaka natao update ilay pejy.\nMety voafafa angamba izy.",
        "edit-conflict": "Adi-panovàna.",
        "parser-template-recursion-depth-warning": "Fetran'ny halalin'ny fiantsoana endrika voahoatra ($1).",
        "language-converter-depth-warning": "Mihoatra ny fetran-kalalin'ny mpamadika teny ($1)",
        "node-count-exceeded-category": "Pejy izay ahitana fihoatran'ny isam-patotra (node)",
-       "node-count-exceeded-category-desc": "Sokajy ho an'ny pejy ahitana isan'ny naody mihoatra.",
+       "node-count-exceeded-category-desc": "Mihoatra ny isam-patotra eto amin'ity pejy ity",
        "node-count-exceeded-warning": "Pejy manana isam-patotra mihoatra",
        "expansion-depth-exceeded-category": "Pejy manana halalim-panitarana mihoatra",
        "expansion-depth-exceeded-category-desc": "Sokajy ho an'ny pejy ahitana halalim-piitarana mihoatra.",
        "last": "farany",
        "page_first": "voalohany",
        "page_last": "farany",
-       "histlegend": "Fisafidianana ny votoatiny hohampitahaina: Mario ny bokotra radiôn'ny fiovana hampitahazay ary tsintrio ny bokotra fanekena amin'ny faram-pejy<br />\nMaribolana: '''(ank)''' = fampitahana amin'ny votoatin'ny pejy ankehitriny,\n'''(farany)''' = fampitahana amin'ny version talohan'ity, M = fanovana madinika",
+       "histlegend": "Safidim-pahasamihafana: Mariho ireo bokotra radiôn'ny versiona mba hampitahàna azy ireo  ary tsindrony ilay bokotra amin'ny faran'ny pejy: <strong>({{int:cur}})</strong> = fampitahana amin'ny versiona farany indrindra, <strong>({{int:last}})</strong> = fahasamihafana amin'ny versiona farany nialoha ity, <strong>{{int:minoreditletter}}</strong> = fiovana madinika.",
        "history-fieldset-title": "Karohy ny tantara",
        "history-show-deleted": "Voafafa ihany",
        "histfirst": "antitra indrindra",
        "rev-deleted-user": "(solonanarana nesorina)",
        "rev-deleted-event": "(nesorina ny fampidirana)",
        "rev-deleted-user-contribs": "[anaram-pikambana na adiresy IP voafafa - fanovana nasitria teo amin'ny fandraisan'anjara modification]",
-       "rev-deleted-text-permission": "'''Voafafa''' ny santiônan'ity pejy ity.\nMety misy ny antsipirihany angamba ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME}}}} laogy momban'ny famafàna pejy].",
+       "rev-deleted-text-permission": "<strong>Voafafa</strong> ny santiônan'ity pejy ity.\nMety misy ny antsipirihany angamba ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME}}}} laogim-pamafàna pejy].",
        "rev-deleted-text-unhide": "Ity versionan'ity pejy ity dia '''voafafa'''.\nHita ao amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogim-pamafana] ny antsipirihany.\nAfaka [$1 mijery ilay versiona] ianao raha tianao.",
        "rev-suppressed-text-unhide": "'''Nofafana''' ity versiom-pejy ity.\nAzo jerena ao amin'ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} laogim-pamafana] ny antsipirihany.\nAzonao [$1 jerena foana ilay santiôna] raha tianao.",
        "rev-deleted-text-view": "'''Nofafana''' ity versiom-pejy ity.\nAzonao jerena ity santiôna voafafa ity ; misy antsipirihany ao amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogim-pamafana].",
        "rev-suppressed-text-view": "'''Nofafana''' ity versiom-pejy ity.\nAzonao jerena ilay versiona voafafa ; ny antsipirihany dia ao amin'ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} laogim-pamafana].",
-       "rev-deleted-no-diff": "Tsy afaka mijery anio diff io ianao satria misy santôna '''voafafa''' ao aminy.\nMety any amin'ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME}}}} laogy momban'ny famafàna pejy] ny antsipirihany.",
+       "rev-deleted-no-diff": "Tsy afaka mijery anio fampitahana (diff) io ianao satria misy versiona '''voafafa''' ao aminy.\nMety any amin'ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME}}}} laogy momban'ny famafàna pejy] ny antsipirihany.",
        "rev-suppressed-no-diff": "Tsy azo jerenao io diff io satria '''voafafa''' ny iraika amin'ny reviziônany.",
        "rev-deleted-unhide-diff": "Nisy '''voafafa''' ny iraika amin'ny reviziôna an'ity diff ity.\nNy antsipirihany dia mety hita ao amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogin'ny famafana].\n[$1 Azonao jerena foana ilay diff] raha tianao.",
        "rev-suppressed-unhide-diff": "Nisy '''voafafa''' ny iraika amin'ny versiona an'ity diff ity.\nNy antsipirihany dia mety hita ao amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogin'ny famafana].\n[$1 Azonao jerena foana ilay diff] raha tianao.",
        "logdelete-selected": "{{PLURAL:$1||}}Laogy voafidy :",
        "revdelete-confirm": "Amafiso eto ny hevitrao raha hanao io ianao, raha azonao sary an-tsaina ny mety ho vokany, ary raha araka ny [[{{MediaWiki:Policy-url}}|fepetra mihatra]] ny zavatra ataonao.",
        "revdelete-suppress-text": "Ny famafàna pejy dia ampiasaina rehefa :\n* Fampahalalana mampiely lainga\n* Misy fampahalalana tsy sarababem-bahoaka tsy metimety\n*: ''Adiresy onenana, laharana antso an-tariby, sns.''",
-       "revdelete-legend": "Ampetraho ny fepetra momban'ny fahitana :",
+       "revdelete-legend": "Hametraka ny fe-pahitana",
        "revdelete-hide-text": "Tahirintsoratry ny versiona",
        "revdelete-hide-image": "asitriho ny votoatin'ilay rakitra",
        "revdelete-hide-name": "Asitriho ny asa sy ny tanjona",
        "revdelete-submit": "Hampiharina amin'ny versiona nofidiana {{PLURAL:$1}}",
        "revdelete-success": "'''Voaova soa aman-tsara ny fahitana ny versiona.'''",
        "revdelete-failure": "'''Ny fisehon'ity versiona ity dia tsy afaka natao update'''\n$1",
-       "logdelete-success": "'''Voaova soa aman-tsara ny fisehon'ny tatitr’asa.'''",
-       "logdelete-failure": "'''Tsy afaka novaina ny fisehon'ny tatitr’asa'''\n$1",
+       "logdelete-success": "<strong>Voaova soa aman-tsara ny fisehon'ny laogy.</strong>",
+       "logdelete-failure": "<strong>Tsy afaka novaina ny fisehon'ny laogy</strong>\n$1",
        "revdel-restore": "Ovay ny fahitàna",
        "pagehist": "Tantaran'ilay pejy",
        "deletedhist": "Tantara voafafa",
        "revdelete-concurrent-change": "Tsi-fetezana teo am-panovana ny zavatra voadaty tamin'ny $1 tamin'ny $2 : ny satany dia voaovan' olon-kafa tamin'ianao nanova azy.\nJereo ny laogy.",
        "revdelete-only-restricted": "Tsi-fetezana teo am-panitrihana ny zavatra voadaty tamin'ny $1 tamin'ny $2 : tsy azonao fafana ireo zavatra ireo amin'ny mpandrindra raha tsy misafidy famafana.",
        "revdelete-reason-dropdown": "* Antom-pamafana matetika :\n** Tsifanajakan ny zom-pamrona;\n** Famoahan-kevitra na fampahalalana ho ann'ny olon-tokana tsy tokony haseho;\n** Fampahalalana mety mifototra amin'ny lainga.",
-       "revdelete-otherreason": "Antony hafa / antony miampy :",
+       "revdelete-otherreason": "Antony hafa/miampy :",
        "revdelete-reasonotherlist": "Antony hafa",
        "revdelete-edit-reasonlist": "Hanova ny anton'ny famafàna",
        "revdelete-offender": "Mpanao ilay reviziôna :",
-       "suppressionlog": "tatitr’asa momban’ny famafana pejy",
+       "suppressionlog": "Laogim-pamafana",
        "suppressionlogtext": "Ity ny lisitry ny famafana ary ny sakana mikasika ny votoatiny asitrika amin'ny mpandrindra. Jereo ny [[Special:BlockList|lisitry ny sakana]] ho an'ny lisitry ny fandroahana ary ny sakana mbola mihatra amin'izao fotoana.",
        "mergehistory": "Atsonika ny tantara ny pejy",
        "mergehistory-header": "Amin'ity pejy ity, afaka manonika santiônan'ny tantara pejy iaviana makany amina pejy vaovao ianao.\nMarino raha manohy ny tantaram-pejy ity asa ity.",
        "mergehistory-comment": "natambatra miarak'amin'ny [[:$2]] ny/i [[:$1]] : $3",
        "mergehistory-same-destination": "Ny pejy iaviana sy ny pejy tanjona dia tsy mahazo mitovy",
        "mergehistory-reason": "Antony :",
-       "mergelog": "Tatitr’asa momban’ny fitambarana",
+       "mergelog": "Laogim-fampitambarana",
        "pagemerge-logentry": "voatambatra tamin'ny [[$2]] [[$1]] (fanovàna hatramin'ny $3)",
        "revertmerge": "Saraho",
        "mergelogpagetext": "Ity ny lisitry ny fanambarana ny tantaram-pejy vao haingana",
        "searchrelated": "voadinika",
        "searchall": "rehetra",
        "showingresults": "Omeo ny valiny{{PLURAL:$1||}} miisa hatramin'ny <b>$1</b> manomboka ny #<b>$2</b>.",
-       "showingresultsheader": "{{PLURAL:$5}}Valim-pikaronhana '''$1x–$2''' an'i '''$3''' ho an'i '''$4'''",
        "search-nonefound": "Tsy nahitana valiny ilay fanontaniana.",
        "powersearch-legend": "Fikarohana havanana",
        "powersearch-ns": "Hitady anatin'ny anaran-tsehatra :",
        "powersearch-togglelabel": "Marihana:",
        "powersearch-toggleall": "Rehetra",
        "powersearch-togglenone": "Tsy misy",
+       "powersearch-remember": "Tadidio ho an'ny karoka manaraka ity safidy ity",
        "search-external": "Hikaroka any ivelany",
        "searchdisabled": "Tsy nalefa ny karoka eto amin'i {{SITENAME}}. Afaka mampiasa an'i Google aloha ianao mandra-paha. Nefa fantaro fa mety ho efa lany daty ny valiny omeny.",
        "search-error": "Hadisoana nitranga tam-pikarohana: $1",
        "preferences": "Ny momba anao",
        "mypreferences": "Safidy",
        "prefs-edits": "isa ny fanovàna :",
-       "prefsnologintext2": "$1 ianao hahafahanao mamaritra ny safidim-pikambana",
+       "prefsnologintext2": "Midira amin'ny kaontinao azafady mba hahafahanao mamaritra ny safidim-pikambana",
        "prefs-skin": "Endrika",
        "skin-preview": "Tsipalotra",
        "datedefault": "Tsy misy safidy",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Diff",
        "prefs-help-prefershttps": "Hihatra amin'ny fidiranao manaraka ity safidy ity.",
+       "prefswarning-warning": "Efa nanova tamin'ny safidinao tsy mbola voatahiry ianao. Raha miala amin'ity pejy ity amin'ny alalan'ny fanindriana an'i \"$1\" ianao dia tsy ho voavao ny safidinao.",
        "email-address-validity-valid": "Adiresy imailaka mameno fepetra",
        "email-address-validity-invalid": "Ilaina ny mametraka adiresy imailaka mameno fepetra",
        "userrights": "Fandrindràna ny fahefahan'ny mpikambana",
        "right-deletedtext": "Mijery ny lahatsoratra voafafa sy ny fampitahana anelanelan'ny versiona voafafa",
        "right-browsearchive": "Mitady pejy voafafa",
        "right-undelete": "Mamerina pejy voafafa",
-       "right-suppressrevision": "Mandinika sy mamerina ny version asitrika amin'ny mpandrindra",
+       "right-suppressrevision": "Mandinika sy mamerina ny version asitrika amin'ny mpikambana rehetra",
+       "right-viewsuppressed": "Fiovana natakona avy amin'ity mpikambana ity",
        "right-suppressionlog": "Mijery ny tao tsy sarababem-bahoaka",
        "right-block": "Manakana ny mpikambana mba tsy hanova",
        "right-blockemail": "Manakana ny mpikambana mba tsy handefa imailaka",
        "right-override-export-depth": "Mamoaka ny pejy miaraka amin'ny zana-pejy hatramin'ny ambaratonga fahadimy",
        "right-sendemail": "Mandefa imailaka any amin'ny mpikambana hafa",
        "right-passwordreset": "Hijery ny imailaka famerenana ny tenimiafina",
-       "newuserlogpage": "Tatitr’asan’ny fanokafana kaontim-pikambana",
+       "newuserlogpage": "Laogim-panokafana kaontim-pikambana",
        "newuserlogpagetext": "Ity pejy ity dia maneho ny tantaran'asan'ny fampidirana mpikambana vaovao.",
-       "rightslog": "Tatitr’asa momban’ny fanovana satam-pikambana",
-       "rightslogtext": "Ity ny laogy momban'ny fanovana ny zom-pikambana.",
+       "rightslog": "Laogim-piovan'ny zom-pikambana",
+       "rightslogtext": "Ity ny laogim-piovan'ny zom-pikambana",
        "action-read": "mamaky ity pejy ity",
        "action-edit": "manova ity pejy ity",
        "action-createpage": "hanao pejy",
        "recentchanges-label-plusminus": "IO ny isan'ny oktety niova tamin'ilay pejy",
        "recentchanges-legend-heading": "'''Maribolana:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (jereo koa ny [[Special:NewPage|lisitry ny pejy vaovao]])",
-       "rcnotefrom": "Ity eto ambany ity ny lisitry ny vao niova manomboka ny <b>$2</b> (hatramin'ny <b>$1</b> no miseho).",
+       "rcnotefrom": "Eo ambany dia ahitana ireo fiovana{{PLURAL:$5}} hatry ny <strong>$3, $4</strong> (naseho hatramin'ny <strong>$1</strong>).",
        "rclistfrom": "Asehoy izay vao niova manomboka ny $3 $2",
        "rcshowhideminor": "$1 ny fanovàna kely",
        "rcshowhideminor-show": "Haneho",
        "http-invalid-url": "URL diso : $1",
        "http-invalid-scheme": "Tsy zaka ny URL miaraka amin'ny sema « $1 »",
        "http-request-error": "Tsi-fetezana tsy fantam-piaviana teo ampandefasana ilay hataka.",
-       "http-read-error": "Tsy fetezana momban'ny famakiana HTTP.",
+       "http-read-error": "Hadisoam-pamakiana HTTP.",
        "http-timed-out": "Ny fangatahana HTTP dia efa lany daty.",
        "http-curl-error": "Tsi-fetezana teo am-pangalana ny URL : $1",
        "http-bad-status": "Nisy tsi-fetezana teo ampandefasana ny hataka HTTP: $1 $2",
        "randomincategory": "Pejy kisendra ao amin'ny sokajy",
        "randomincategory-invalidcategory": "Tsy anaran-tsokajy azo raisina \"$1\"",
        "randomincategory-nopages": "Tsy misy pejy ao amin'i [[:Category:$1]]",
-       "randomincategory-selectcategory": "Haka pejy kisendra ao amin'ny sokajy: $1 $2",
-       "randomincategory-selectcategory-submit": "Alefa",
        "randomredirect": "Pejy fihodinana kisendra",
        "randomredirect-nopages": "Tsy misy pejy fihodinana eo amin'ny anaran-tsehatra «$1»",
        "statistics": "Statistika",
        "querypage-disabled": "Tsy ampiasaina ity pejy manokana ity mba hitsitsy ny solosaina",
        "booksources": "boky tsiahy",
        "booksources-search-legend": "hikaroka anatin'ny boky todika",
-       "booksources-go": "Ataovy lisitra",
-       "booksources-text": "Ity misy lisitra maneho ny rohy makany amin'ny sehatra mivarotra boky vaovao sy efa vaky ary mety ahitanao fampahalalàna momban'ny boky sy soratra notadiavinao :",
+       "booksources-search": "Fikarohana",
+       "booksources-text": "Ity misy lisitra maneho ny rohy makany amin'ny sehatra mivarotra boky vaovao sy efa vaky ary mety ahitanao fampahalalàna momba ny boky sy soratra notadiavinao :",
        "booksources-invalid-isbn": "Ny ISBN nomena dia mety diso ; marino raha diso ianao teo am-pandikanana ny loharano fotony.",
        "specialloguserlabel": "Mpikambana nanao :",
        "speciallogtitlelabel": "Tanjona (lohateny na mpikambana) :",
        "log": "Tatitr’asa",
-       "all-logs-page": "Ny tatitr’asa",
+       "all-logs-page": "Laogy rehetra",
        "alllogstext": "Seho nakambana ho an'ny laogy rehetra azo jerena eto amin'ny {{SITENAME}}.\nAzonao ferana ny fahitana ny tao amin'ny fisafidianana karazana laogy iray, anaram-pikambana iray na pejy iray (samihafa ny sorabaventy sy soramadinika).",
        "logempty": "Tsy nahitana.",
        "log-title-wildcard": "Hitady amin'ny lohateny manomboka amin'io soratra io",
        "allpagesbadtitle": "Tsy mety ny anaram-pejy : misy tovona iraisam-piteny na interwiki natokana, na misy soratra iray na maro tsy azo ampiasaina anaty anaram-pejy.",
        "allpages-bad-ns": "{{SITENAME}} dia tsy manana anaran-tsehatra mitondra anarana « $1 ».",
        "allpages-hide-redirects": "Haneho ny fihodinana",
+       "cachedspecial-viewing-cached-ttl": "Mijery pejy anaty takona ianao, izay namboarina $1 taona lasa.",
        "cachedspecial-refresh-now": "Hijery ny farany indrindra",
        "categories": "Sokajy",
        "categoriespagetext": "{{PLURAL:$1}}Ampiasain'ny rakitra na pejy ireo sokajy manaraka ireo.\nTsy hiseho eto ny [[Special:UnusedCategories|sokajy tsy miasa]].\nVangio koa ny [[Special:WantedCategories|sokajy ilaina]].",
        "wlheader-enotif": "Alefa ny fampilazana amin'ny mailaka.",
        "wlheader-showupdated": "Aseho '''sorabaventy''' ny pejy niova taorian'ny famangianao azy farany.",
        "wlnote": "Eo ambany dia ahitana ny {{PLURAL:$1|fiovana farany indrindra|ny fiovana ''$1'' farany}} natao tanatin'ny adin'ny {{PLURAL:$2|iray|'''$2'''}}, nanomboka ny $3, $4.",
-       "wlshowlast": "Haneho ny $1 ora farany, ny $2 andro farany na $3",
+       "wlshowlast": "Haneho ny $1 ora farany, ny $2 andro farany na",
        "watchlist-options": "Safidy ny lisitry ny pejy arahana",
        "watching": "Fanarahana...",
        "unwatching": "Fanalana ny fanarahana...",
        "rollback-success": "Fanesorana ny fiovana nataon'i $1 ;\nfiverenana amin'ny fiovana farany nataon'i $2.",
        "sessionfailure-title": "Tsi-fetezaka mikasika ny kaonty idirana",
        "sessionfailure": "Ohatry ny misy olana ny fidirana amin'ny kaontinao ; \nnofoanana ilay tao mba tsy hisy fanodinana fotaom-pidirana (session).\nTsindrio \"Mialoha\" ary vaozy ilay pejy niavianao ary andramo fanindroany.",
-       "protectlogpage": "Tatitr’asa momban’ny fiarovana",
+       "protectlogpage": "Laogim-piarovana",
        "protectlogtext": "Eto ambany ny lisitry ny fiarovana/fanalana hidy ny pejy. \nHo ann'y fanazavana fanampiny, jereo [[Special:ProtectedPages|ny lisitry ny pejy voaaro]] ho an'ny pejy fiarovana amin'izao fotoana izao.",
        "protectedarticle": "voaaro ny pejy \"[[$1]]\"",
        "modifiedarticleprotection": "nanova ny haabo ny fiarovana ho an'ny « [[$1]] »",
        "protect-othertime": "Daty hafa :",
        "protect-othertime-op": "daty hafa",
        "protect-existing-expiry": "Datin'ny fanalana ilay sazy : $2 amin'ny $3",
+       "protect-existing-expiry-infinity": "Daty fitsaharana efa misy: tsiefa",
        "protect-otherreason": "Antony hafa miampy :",
        "protect-otherreason-op": "Antony hafa",
        "protect-dropdown": "*Anton'ny fiarovana\n** Misy be mpanimba\n** Misy be mpametraka spam\n** Misy adim-panontana\n** Misy olona maro no mandalo eo",
        "sp-contributions-newbies-sub": "Ao amin'ny kaonty vaovao",
        "sp-contributions-newbies-title": "Fandraisan'anjara ao amin'ny kaonty vaovao",
        "sp-contributions-blocklog": "Laogim-panakanana",
+       "sp-contributions-suppresslog": "Fandraisan'anjara voafafa",
        "sp-contributions-deleted": "fandraisan'anjara voafafa",
        "sp-contributions-uploads": "fampidiram-pejy",
        "sp-contributions-logs": "laogy",
        "sp-contributions-search": "Hikaroka fandraisan'anjara",
        "sp-contributions-username": "Adiresy IP na anaram-pikambana :",
        "sp-contributions-toponly": "Fiovana izay farany ihany no aseho",
+       "sp-contributions-newonly": "Fiovana izay namorom-pejy ihany no aseho",
        "sp-contributions-submit": "Hikaroka",
        "whatlinkshere": "Pejy mirohy eto",
        "whatlinkshere-title": "Pejy mirohy any amin'i « $1 »",
        "autoblockid": "Fanakanana mandeha ho azy #$1",
        "block": "Hanakana ilay mpikambana",
        "unblock": "Hanala ny sakan'ilay mpikambana",
-       "blockip": "Sakano ny mpikambana",
+       "blockip": "Hanakana an'i {{GENDER:$1|mpikambana}}",
        "blockip-legend": "Sakano ny mpikambana",
        "blockiptext": "Ampiasao ity formulaire ity hisakanana ny fahazoan-dàlana hanoratra\nananan'ny adiresy IP iray na solonanarana iray.\nTokony ho antony fisorohana ny fisomparana ihany, ary mifanaraka amin'ny [[{{MediaWiki:Policy-url}}|fepetra]]\nihany no hanaovana ny fisakanana.\nFenoy etsy ambany ny antony manokana (ohatra, mitanisà pejy nosomparana).",
        "ipaddressorusername": "Adiresy IP na solonanarana",
        "blocklogentry": "voasakana i \"[[$1]]\" mandritra ny $2 ; antony : $3",
        "reblock-logentry": "nanova ny parametatry ny sakan'i [[$1]], ary tapitra amin'ny $2. Ny antony dia ''$3''",
        "blocklogtext": "Eto no ahitana ny tantaran'ny hetsika momba ny fisakanana sy ny famoanana ny fisakanana mpandray anjara.\nTsy aseho eto ny adiresy IP voasakana ho azy.\nJereo ao amin'ny [[Special:BlockList|lisitry ny sakana]] hahitana ny lisitry ny sakana mihatra amin'izao fotoana izao",
-       "unblocklogentry": "voaaisotra ny sakana an'i $1",
+       "unblocklogentry": "afa-tsakana i $1",
        "block-log-flags-anononly": "mpikambana tsy nisoratra anarana ihany",
        "block-log-flags-nocreate": "tsy mahazo manokatra kaonty",
        "block-log-flags-noautoblock": "fanakanana ny IP nesorina",
        "import": "Hampidi-pejy",
        "importinterwiki": "fampidirana interwiki",
        "import-interwiki-text": "Safidio wiki loharano iray ary ny lohatenin'ilay pejy ho ampidirina eto.\nHo voatazona ao amin'ny tantara ny datin'ny santiôna sy ny anaran'ny mpandray anjara.\nHo voasoratra ao amin'ny [[Special:Log/import|laogim-pampidirana]] ny tao rehetra mikasika ny fampidirana pejy interwiki",
-       "import-interwiki-source": "Wiki sy pejy fango :",
+       "import-interwiki-sourcewiki": "Wiki niaviana:",
+       "import-interwiki-sourcepage": "Pejy niavana :",
        "import-interwiki-history": "Handika ny santiônan'ny tantaran'ity pejy ity",
        "import-interwiki-templates": "Ataovy ao ny endrika rehetra",
        "import-interwiki-submit": "Hampiditra",
        "tooltip-search": "Karoka amin'ny {{SITENAME}}",
        "tooltip-search-go": "Mandana any amina pejy mitondra n'io anarana io ra misy.",
        "tooltip-search-fulltext": "Tadiavo ny pejy misy an'io lahatsoratra io.",
-       "tooltip-p-logo": "Renpejy",
+       "tooltip-p-logo": "Hitsidika renipejy",
        "tooltip-n-mainpage": "Jereo ny renipejy",
        "tooltip-n-mainpage-description": "hitsidika ny renipejy",
        "tooltip-n-portal": "Ny mombamomba ny tetikasa",
-       "tooltip-n-currentevents": "Hidady ny rohy momban'ny vaovao ankehitriny",
+       "tooltip-n-currentevents": "Hikaroka torohay fototra mikasika ny vaovao",
        "tooltip-n-recentchanges": "Lisitra ny fanovàna farany efa vita eto amin'ity wiki ity",
        "tooltip-n-randompage": "Hjery pejy aki-sendra",
        "tooltip-n-help": "fanoroana",
        "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-project": "Jereo ny pejy momban'ny tetikasa",
+       "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",
        "tooltip-ca-nstab-template": "Jereo ny endrika  (môdely)",
        "tooltip-ca-nstab-help": "Hijery ny pejy fanoroana",
-       "tooltip-ca-nstab-category": "Hijery ny pejy momban'ilay sokajy",
+       "tooltip-ca-nstab-category": "Hijery ny pejin'ilay sokajy",
        "tooltip-minoredit": "Mariho ho fanovana madinika ihany",
        "tooltip-save": "Tehirizo ny fanovana",
        "tooltip-preview": "Topazy maso ny fanovana nataonao, iangaviana ianao mba hijery tsipalotra mialoha ny fitahirizana ny fanovana!",
        "exif-urgency-normal": "Tsotra ($1)",
        "exif-urgency-low": "Ambany ($1)",
        "exif-urgency-high": "Ambony ($1)",
-       "watchlistall2": "rehetra",
        "namespacesall": "rehetra",
        "monthsall": "rehetra",
        "confirmemail": "Fanamarinana adiresy imailaka.",
        "logentry-rights-rights-legacy": "{{GENDER:$2}}$1 nanova ny vonodrom-pikambana isian'i $3",
        "logentry-rights-autopromote": "{{GENDER:$2}}Lasa $5 ho azy i $1 izay $4 taloha",
        "rightsnone": "(tsy misy)",
+       "revdelete-summary": "ambangovangon'ny fanovàna",
        "feedback-subject": "Lohahevitra:",
        "feedback-message": "Hafatra:",
        "feedback-cancel": "Foanana",
index c1e5e2a..7169946 100644 (file)
        "search-interwiki-more": "(эше)",
        "searchrelated": "кылдалтше",
        "searchall": "чыла",
-       "showingresultsheader": "'''$4'''лан {{PLURAL:$5|1='''$3''' гыч '''$1''' результат|'''$3''' гыч '''$1 - $2''' результат}}",
        "search-nonefound": "Тыйын йодышет почеш нимо муалтын огыл",
        "powersearch-legend": "Сайынрак кычалаш",
        "powersearch-ns": "Кычалаш тиде лӱм-влакын кумдыкышт-влакыште:",
        "pager-older-n": "{{PLURAL:$1|1=ончычсо|ончычсо}}",
        "booksources": "Негызым пыштыше кнага-влак",
        "booksources-search-legend": "Негызым пыштыше книгам кычалаш",
-       "booksources-go": "Муаш",
        "specialloguserlabel": "Пайдаланыше:",
        "log": "Журнал-влак",
        "allpages": "Чыла лаштык-влак",
        "unwatch": "Эскерыман огыл",
        "unwatchthispage": "Эскерымым чарнаш",
        "watchlist-details": "Эскерымаш лӱмерыштет $1 {{PLURAL:$1|лаштык}}, каҥашымаш лаштык-влакым шотлыде",
-       "wlshowlast": "Пытартыш $1 шагат $2 кечылан $3 ончыкташ",
+       "wlshowlast": "Пытартыш $1 шагат $2 кечылан  ончыкташ",
        "watchlist-options": "Эскерыме лӱмерын келыштарымаш",
        "watching": "Эскерымаш лӱмерыш ешарымаш...",
        "unwatching": "Эскерымаш лӱмер гыч шӧрымаш...",
        "metadata-expand": "Ешартыш рашлык-влакым ончыкташ",
        "metadata-collapse": "Ешартыш рашлык-влакым шылташ",
        "metadata-fields": "Поля метаданных изображения, перечисленные в этом списке, будут показаны на странице изображения при свёрнутой таблице метаданных. Остальные поля будут по умолчанию скрыты.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
-       "watchlistall2": "чыла",
        "namespacesall": "чыла",
        "monthsall": "чыла",
        "confirm_purge_button": "Йӧра",
        "specialpages-group-pagetools": "Лаштык ӱзгар-влак",
        "specialpages-group-redirects": "Вес вере колтышо спецлаштык-влак",
        "external_image_whitelist": " #Оставьте эту строчку такой, как она есть<pre>\n#Разместите здесь фрагменты регулярных выражений (ту часть, что находится между //)\n#они будут соотнесены с URL внешних изображений.\n#Подходящие будут показаны как изображения, остальные будут показаны как ссылки на изображения.\n#Строки, начинающиеся с # считаются комментариями.\n#Строки не чувствительны к регистру\n\n#Размещайте фрагменты регулярных выражений над этой строчкой. Оставьте эту строчку такой, как она есть.</pre>",
+       "revdelete-summary": "тӧрлатымаш-влакым возен ончыктымаш",
        "expand_templates_ok": "Йӧра",
        "expand_templates_preview": "Ончылгоч ончымаш"
 }
index 2af3d81..6f2613d 100644 (file)
        "passwordreset-emailsent-capture": "Surel parubahan kato sandi alah dikirim, nan nampak di bawah ko.",
        "passwordreset-emailerror-capture": "Surel parubahan kato sandi nan ditampilan di bawah, alah dibuek, tapi pangirimannyo ka {{GENDER:$2|pangguno}} gagal: $1",
        "changeemail": "Tuka alamaik surel.",
-       "changeemail-header": "Ganti alamaik surel.",
        "changeemail-text": "Isi formulir ko untuak mangganti alamaik surel. Sanak musti mamasuakan kato sandi untuak mayakinkan parubahan.",
        "changeemail-no-info": "Sanak harus masuak log untuak mangakses laman ko.",
        "changeemail-oldemail": "Alamat surel kini:",
        "changeemail-none": "(indak ado)",
        "changeemail-password": "Sandi {{SITENAME}} Sanak:",
        "changeemail-submit": "Ganti surel.",
-       "changeemail-cancel": "Batalkan",
        "bold_sample": "Teks taba",
        "bold_tip": "Teks taba",
        "italic_sample": "Teks miriang",
        "searchrelated": "bakaitan",
        "searchall": "sado",
        "showingresults": "Di bawah ko dikaluaan sampai {{PLURAL:$1|'''$1''' hasil}}, dimulai dari #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Hasil '''$1 - $2''' dari '''$3'''}} untuak '''$4'''",
        "search-nonefound": "Indak ado hasil nan cocok sasuai jo parmintaan",
        "powersearch-legend": "Pencarian lanjut",
        "powersearch-ns": "Mancari di ruangnamo:",
        "pager-older-n": "{{PLURAL:$1|$1 labiah lamo}}",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Cari di sumber buku",
-       "booksources-go": "Tuju",
        "specialloguserlabel": "Pangguno:",
        "speciallogtitlelabel": "Target (judul atau pangguno):",
        "log": "Log",
        "watchlist-details": "{{PLURAL:$1|$1 laman}} dalam daftar pantau Sanak, indak tamasuak laman rundiangnyo.",
        "wlheader-showupdated": "Laman nan alah barubah sajak kunjuangan tarakhia Sanak ditunjuakan jo '''hurup taba'''",
        "wlnote": "Di bawah ko ado $1 {{PLURAL:$1|parubahan}} dalam {{PLURAL:$2|'''$2''' jam}} iko, sampai tanggal $3, pukua $4.",
-       "wlshowlast": "Tunjuakan $1 jam parubahan dalam $2 hari tarakhia $3",
+       "wlshowlast": "Tunjuakan $1 jam parubahan dalam $2 hari tarakhia",
        "watchlist-options": "Piliahan daftar pantau",
        "watching": "Mamantau...",
        "unwatching": "indak dipantau le...",
        "exif-pixelxdimension": "Tinggi gamba",
        "exif-usercomment": "Komen pangguno",
        "exif-relatedsoundfile": "Berkas audio nan bahubuangan",
-       "watchlistall2": "kasadonyo",
        "namespacesall": "sadonyo",
        "monthsall": "sadonyo",
        "table_pager_limit_label": "Item per laman:",
index 7423a38..dc1747b 100644 (file)
        "create": "Создај",
        "create-local": "Додај локален опис",
        "editthispage": "Уреди ја страницава",
-       "create-this-page": "Создај ја оваа страница",
+       "create-this-page": "Создај ја страницава",
        "delete": "Избриши",
-       "deletethispage": "Избриши ја оваа страница",
-       "undeletethispage": "обнови ја оваа страница",
+       "deletethispage": "Избриши ја страницава",
+       "undeletethispage": "обнови ја страницава",
        "undelete_short": "Врати {{PLURAL:$1|едно уредување|$1 уредувања}}",
        "viewdeleted_short": "Преглед на {{PLURAL:$1|едно избришано уредување|$1 избришани уредувања}}",
        "protect": "Заштити",
        "protect_change": "промена",
-       "protectthispage": "Заштити ја оваа страница",
+       "protectthispage": "Заштити ја страницава",
        "unprotect": "Измени заштита",
        "unprotectthispage": "Измена на заштитата на страницава",
        "newpage": "Нова страница",
        "talkpage": "Разговор",
        "talkpagelinktext": "Разговор",
-       "specialpage": "СпеÑ\86иÑ\98ална страница",
+       "specialpage": "СлÑ\83жбена страница",
        "personaltools": "Лични алатки",
        "articlepage": "Преглед на содржината",
        "talk": "Разговор",
        "otherlanguages": "На други јазици",
        "redirectedfrom": "(Пренасочено од $1)",
        "redirectpagesub": "Пренасочувачка страница",
+       "redirectto": "Пренасочи кон:",
        "lastmodifiedat": "Последната промена на страницава е извршена на $1 г. во $2 ч.",
        "viewcount": "Оваа страница била посетена {{PLURAL:$1|еднаш|$1 пати}}.",
        "protectedpage": "Заштитена страница",
        "nstab-main": "Страница",
        "nstab-user": "Корисник",
        "nstab-media": "Мултимедијална податотека",
-       "nstab-special": "СпеÑ\86иÑ\98ална страница",
+       "nstab-special": "СлÑ\83жбена страница",
        "nstab-project": "Проектна страница",
        "nstab-image": "Податотека",
        "nstab-mediawiki": "Порака",
        "nstab-category": "Категорија",
        "nosuchaction": "Нема такво дејство",
        "nosuchactiontext": "Дејството укажано во URL-адресата е погрешно.\nМожеби имате грешка во пишувањето на адресата, или пак имате проследено погрешна врска.\nОва може да се должи и на грешка во програмската опрема на {{SITENAME}}.",
-       "nosuchspecialpage": "Ð\9dе Ð¿Ð¾Ñ\81Ñ\82ои Ñ\82аква Ñ\81пеÑ\86иÑ\98ална страница",
-       "nospecialpagetext": "<strong>Ð\9fобаÑ\80авÑ\82е Ð½ÐµÐ¿Ð¾Ñ\81Ñ\82оеÑ\87ка Ñ\81пеÑ\86иÑ\98ална Ñ\81Ñ\82Ñ\80аниÑ\86а.</strong>\n\nСпиÑ\81окоÑ\82 Ð½Ð° Ð¿Ð¾Ñ\81Ñ\82оеÑ\87ки Ñ\81пеÑ\86иÑ\98ални страници: [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nosuchspecialpage": "Ð\9dе Ð¿Ð¾Ñ\81Ñ\82ои Ñ\82аква Ñ\81лÑ\83жбена страница",
+       "nospecialpagetext": "<strong>Ð\9fобаÑ\80авÑ\82е Ð½ÐµÐ¿Ð¾Ñ\81Ñ\82оеÑ\87ка Ñ\81лÑ\83жбена Ñ\81Ñ\82Ñ\80аниÑ\86а.</strong>\n\nСпиÑ\81окоÑ\82 Ð½Ð° Ð¿Ð¾Ñ\81Ñ\82оеÑ\87ки Ñ\81лÑ\83жбени страници: [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Грешка",
        "databaseerror": "Грешка во базата",
        "databaseerror-text": "Се појави грешка во барањето од базата.\nОва може да значи програмска грешка (бубачка).",
        "mycustomjsprotected": "Немате дозвола да ја уредувате оваа страница со JavaScript.",
        "myprivateinfoprotected": "Немате дозвола да ги уредувате вашите лични информации.",
        "mypreferencesprotected": "Немате дозвола да ги уредувате вашите нагодувања.",
-       "ns-specialprotected": "СпеÑ\86иÑ\98ални страници не може да се уредуваат.",
+       "ns-specialprotected": "СлÑ\83жбени страници не може да се уредуваат.",
        "titleprotected": "Овој наслов од страна на [[User:$1|$1]] е заштитен и не може да се создаде.\nПричината за тоа е: ''$2''.",
        "filereadonlyerror": "Не можам да ја изменам податотеката „$1“ бидејќи складиштето „$2“ е во незаписен режим.\n\t\nАдминистраторот што ја заклучи го понуди следново образложение: „''$3''“.",
        "invalidtitle-knownnamespace": "Неважечки наслов со именски простор „$2“ и текст „$3“",
        "password-change-forbidden": "Не можете да ја менувате лозинката на ова вики.",
        "externaldberror": "Настана грешка при надворешното најавување на базата или пак немате дозвола да ја подновите вашата надворешна сметка.",
        "login": "Најава",
-       "nav-login-createaccount": "Најава / регистрација",
-       "userlogin": "Најава / регистрација",
+       "nav-login-createaccount": "Најава / направи сметка",
+       "userlogin": "Најава / направи сметка",
        "userloginnocreate": "Најава",
        "logout": "Одјава",
        "userlogout": "Одјава",
        "createaccount-text": "Некој направил сметка со вашата е-поштенска адреса на {{SITENAME}} ($4) со име „$2“ и  лозинка „$3“.\nБи требало сега да се пријавите и да ја промените вашата лозинка.\n\nМожете да ја занемарите оваа порака ако сметката била направена по грешка.",
        "login-throttled": "Имате премногу обиди за најава за кратко време.\nПочекајте $1 пред да се обидете повторно.",
        "login-abort-generic": "Најавата е неуспешна - Прекинато",
+       "login-migrated-generic": "Вашата сметка е пренесена и корисничкото име веќе не постои на ова вики.",
        "loginlanguagelabel": "Јазик: $1",
        "suspicious-userlogout": "Вашето барање за одјава е одбиено бидејќи се чини дека е испратено од расипан прелистувач или кеширачки застапник (proxy).",
        "createacct-another-realname-tip": "Вистинското име е незадолжително.\nДоколку изберете да го внесете, тоа може да се искористи за оддавање на заслуги за Вашата работа.",
        "passwordreset-emailsent-capture": "Испратено е писмо за измена на лозинката (прикажано подолу).",
        "passwordreset-emailerror-capture": "Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1",
        "changeemail": "Смени е-пошта",
-       "changeemail-header": "Промена на е-пошта за сметката",
        "changeemail-text": "Пополнете го образецов за да ја смените е-поштата. За да ја потврдите промената, ќе треба да ја внесете лозинката.",
        "changeemail-no-info": "Мора да бидете најавени ако сакате да имате директен пристап до оваа страница.",
        "changeemail-oldemail": "Тековна е-пошта:",
        "changeemail-none": "(нема)",
        "changeemail-password": "Вашата лозинка на {{SITENAME}}:",
        "changeemail-submit": "Смени е-пошта",
-       "changeemail-cancel": "Откажи",
        "changeemail-throttled": "Имате премногу обиди за најава за кратко време.\nПочекајте $1 пред да се обидете повторно.",
        "resettokens": "Врати одново шифри",
        "resettokens-text": "Можете шифрите да ги вратите одново што овозможува пристап до извесни лични податоци што се однесуваат на вашата овдешна сметка.\n\nОва треба да се направи ако по грешка сте споделиле нешто со некого или ако сметката ви е изложена на опасност.",
        "showpreview": "Преглед",
        "showdiff": "Прикажи промени",
        "blankarticle": "<strong>Предупредување:</strong> Страницата што ја создавате е празна.\nАко повторно стиснете на „{{int:savearticle}}“, страницата ќе биде создадена без никаква содржина во неа.",
-       "anoneditwarning": "'''Предупредување:''' Не сте најавени.\nВашата IP-адреса ќе биде заведена во историјата на уредување на страницата.",
+       "anoneditwarning": "<strong>Предупредување:</strong> Не сте најавени. Вашата IP-адреса ќе биде јавно видлива ако уредувате. Ако <strong>[$1 се најавите]</strong> или <strong>[$2 направите сметка]</strong>, тогаш уредувањата ќе се припишуваат на вашето корисничко име, покрај другите погодности.",
        "anonpreviewwarning": "''Не сте најавени. Ако ја зачувате, Вашата IP-адреса ќе биде заведена во историјата на уредување на страницата.''",
        "missingsummary": "'''Потсетник:''' Не внесовте опис на измените. Ако притиснете Зачувај повторно, вашите измени ќе се зачуваат без опис.",
        "missingcommenttext": "Ве молиме внесете коментар подолу.",
        "searchall": "сè",
        "showingresults": "Подолу {{PLURAL:$1|е прикажан '''1''' резултат|се прикажани '''$1''' резултати}} почнувајќи од бр. '''$2'''.",
        "showingresultsinrange": "Долу {{PLURAL:$1|е прикажан до <strong>еден</strong> резултат|се прикажани до <strong>$1</strong> резултати}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Резултат '''$1''' од '''$3'''|Резултати '''$1 - $2''' од '''$3'''}} за '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Резултат <strong>$1</strong> од <strong>$3</strong>|Резултати <strong>$1 - $2</strong> од <strong>$3</strong>}}",
        "search-nonefound": "Нема резултати што одговараат на бараното.",
        "powersearch-legend": "Напредно пребарување",
        "powersearch-ns": "Пребарај во следниве именски простори:",
        "powersearch-togglelabel": "Одбери:",
        "powersearch-toggleall": "Сè",
        "powersearch-togglenone": "Ништо",
-       "powersearch-remember": "Запамти го изборот за идни пребарувања",
+       "powersearch-remember": "Запoмни го изборот за идни пребарувања",
        "search-external": "Надворешно пребарување",
        "searchdisabled": "{{SITENAME}} пребарувањето е оневозможено.\nВо меѓувреме, можете да пребарувате преку Google.\nДа напоменеме дека нивното индексирање на {{SITENAME}} содржините може да биде застарено.",
        "search-error": "Се појави грешка при пребарувањето: $1",
        "prefs-tokenwatchlist": "Шифра",
        "prefs-diffs": "Разлики",
        "prefs-help-prefershttps": "Поставката ќе се примени следниот пат кога ќе се најавите.",
+       "prefswarning-warning": "Направивте промени во нагодувањата, но не ги зачувавте.\nИзмената нема да се изврши ако ја напуштите страницава без да стиснете на „$1“.",
        "prefs-tabs-navigation-hint": "Совет: Можете да ги користите стрелките на тастатурата за да преоѓате од едно на друго јазиче во списокот на јазичиња.",
        "email-address-validity-valid": "Исправно",
        "email-address-validity-invalid": "Се бара исправна адреса!",
        "action-deleterevision": "избриши ја ревизијава",
        "action-deletedhistory": "прегледај ја историјата на бришења за оваа страница",
        "action-browsearchive": "барање на избришани страници",
-       "action-undelete": "обнови ја оваа страница",
+       "action-undelete": "обнови ја страницава",
        "action-suppressrevision": "прегледај ја и обнови ја оваа скриена преработка",
        "action-suppressionlog": "преглед на овој li;en дневник",
        "action-block": "оневозможи го овој корисник да уредува",
        "filedesc": "Опис",
        "fileuploadsummary": "Опис:",
        "filereuploadsummary": "Измени во податотеката:",
-       "filestatus": "Copyright статус:",
+       "filestatus": "Авторскоправен статус:",
        "filesource": "Извор:",
        "ignorewarning": "Занемари ги предупредувањата и зачувај ја податотеката",
        "ignorewarnings": "Занемари предупредувања",
        "large-file": "Се препорачува податотеките да не бидат поголеми од $1; оваа податотека е $2.",
        "largefileserver": "Големината на оваа податотека е поголема од максимално дозволената големина од серверот.",
        "emptyfile": "Податотеката што ја подигнавте е празна.\nОва може да се должи на грешка во нејзиното име.\nПроверете дали навистина сакате да ја подигнете ваквата податотека.",
-       "windows-nonascii-filename": "Опслужувачот не поддржува податотечни имиња со специјални знаци.",
+       "windows-nonascii-filename": "Опслужувачот не поддржува податотечни имиња со псоебни знаци.",
        "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Дали можеби би сакале да користите покарактеристично име.",
        "destfilename": "Целно име на податотеката:",
        "upload-maxfilesize": "Максимална големина на податотеката: $1",
        "upload-description": "Опис на податотека",
-       "upload-options": "Ð\9dагодÑ\83ваÑ\9aа Ð·Ð° Ð¿Ð¾Ð´Ð¸Ð³Ð°Ñ\9aе",
+       "upload-options": "Ð\9dагодÑ\83ваÑ\9aа Ð½Ð° Ð¿Ð¾Ð´Ð¸Ð³Ð°Ñ\9aеÑ\82о",
        "watchthisupload": "Набљудувај ја податотекава",
        "filewasdeleted": "Податотека со ова име претходно била подигната и потоа избришана.\nПроверете во $1 пред да продолжите со повтроно подигање.",
        "filename-bad-prefix": "Името на податотеката која ја подигате започнува со '''„$1“''', типично за неописните називи кои дигиталните фотоапарати автоматски ги создаваат, што впрочем е недоволно описно.\nВе молиме одберете подобро описно име за вашата податотека.",
        "license": "Лиценцирање:",
        "license-header": "Лиценцирање",
        "nolicense": "Нема",
-       "licenses-edit": "Ð\98змени Ð»Ð¸Ñ\86енÑ\86ни можности",
+       "licenses-edit": "Ð\98змени Ð³Ð¸ Ð»Ð¸Ñ\86енÑ\86ниÑ\82е можности",
        "license-nopreview": "(Прегледот не е достапен)",
-       "upload_source_url": "(податотеката што се ја одбрале од важечка, јавно достапна URL-адреса)",
-       "upload_source_file": "(подаÑ\82оÑ\82екаÑ\82а Ñ\88Ñ\82о Ñ\81е Ñ\98а Ð¾Ð´Ð±Ñ\80але Ð¾Ð´  вашиот сметач)",
+       "upload_source_url": "(податотеката што сте ја одбрале од важечка, јавно достапна URL-адреса)",
+       "upload_source_file": "(подаÑ\82оÑ\82екаÑ\82а Ñ\88Ñ\82о Ñ\98а Ð¾Ð´Ð±Ð¸Ñ\80аÑ\82е Ð¾Ð´ вашиот сметач)",
        "listfiles-delete": "избриши",
-       "listfiles-summary": "Ð\9eваа Ñ\81пеÑ\86иÑ\98ална страница ги прикажува сите подигнати податотеки.",
+       "listfiles-summary": "Ð\9eваа Ñ\81лÑ\83жбена страница ги прикажува сите подигнати податотеки.",
        "listfiles_search_for": "Побарај име на податотека:",
        "imgfile": "податотека",
        "listfiles": "Список на податотеки",
        "randomincategory": "Случајна страница во категоријата",
        "randomincategory-invalidcategory": "„$1“ не претставува важечка категорија.",
        "randomincategory-nopages": "Нема страници во [[:Category:$1]].",
-       "randomincategory-selectcategory": "Дај случајна страница од категоријата: $1 $2.",
-       "randomincategory-selectcategory-submit": "Оди",
+       "randomincategory-category": "Категорија:",
+       "randomincategory-legend": "Случајна страница во категорија",
        "randomredirect": "Случајно пренасочување",
        "randomredirect-nopages": "Нема пренасочувања во именскиот простор „$1“.",
        "statistics": "Статистики",
        "statistics-edits": "Број на уредувања од започнувањето на {{SITENAME}}",
        "statistics-edits-average": "Просечен број на уредувања по страница",
        "statistics-views-total": "Вкупно посети",
-       "statistics-views-total-desc": "Ð\9dе Ñ\81е Ð²ÐºÐ»Ñ\83Ñ\87ени Ð¿Ñ\80егледÑ\83ваÑ\9aа Ð½Ð° Ð½ÐµÐ¿Ð¾Ñ\81Ñ\82оеÑ\87ки Ð¸ Ñ\81пеÑ\86иÑ\98ални страници",
+       "statistics-views-total-desc": "Ð\9dе Ñ\81е Ð²ÐºÐ»Ñ\83Ñ\87ени Ð¿Ñ\80егледÑ\83ваÑ\9aа Ð½Ð° Ð½ÐµÐ¿Ð¾Ñ\81Ñ\82оеÑ\87ки Ð¸ Ñ\81лÑ\83жбени страници",
        "statistics-views-peredit": "Посети по уредување",
        "statistics-users": "Регистрирани [[Special:ListUsers|корисници]]",
        "statistics-users-active": "Активни корисници",
        "prefixindex-strip": "Отстрани ја претставката во списокот",
        "shortpages": "Кратки страници",
        "longpages": "Долги страници",
-       "deadendpages": "Ð\8cоÑ\80Ñ\81окак страници",
+       "deadendpages": "Слепи страници",
        "deadendpagestext": "Следните страници немаат врски кон ниту една друга страница на ова вики.",
        "protectedpages": "Заштитени страници",
        "protectedpages-indef": "Само бесконечни заштити",
        "newpages-username": "Корисничко име:",
        "ancientpages": "Најстари статии",
        "move": "Премести",
-       "movethispage": "Премести ја оваа страница",
+       "movethispage": "Премести ја страницава",
        "unusedimagestext": "Следниве податотеки постојат, но не се вметнати во ниедна страница.\nИмајте предвид дека други мрежни места може да ставаат врски до неа со директна URL-адреса, и затоа може да е наведена овде и покрај тоа што е во активна употреба.",
        "unusedcategoriestext": "Следните категории постојат и покрај тоа што ниедна статија и категорија не ги користи.",
        "notargettitle": "Нема цел",
        "pager-newer-n": "{{PLURAL:$1|понова 1|понови $1}}",
        "pager-older-n": "{{PLURAL:$1|постара 1|постари $1}}",
        "suppress": "Скривање",
-       "querypage-disabled": "Ð\9eваа Ñ\81пеÑ\86иÑ\98ална страница е оневозможена за да не попречува на делотворноста.",
+       "querypage-disabled": "Ð\9eваа Ñ\81лÑ\83жбена страница е оневозможена за да не попречува на делотворноста.",
        "booksources": "Печатени извори",
        "booksources-search-legend": "Пребарување на извори за книга",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Најди",
+       "booksources-search": "Пребарај",
        "booksources-text": "Ова е список на врски кон други мрежни места кои продаваат нови и користени книги, и тие може\nда имаат повеќе информации за книгите што ги баравте:",
        "booksources-invalid-isbn": "Наведениот ISBN се чини неправилен. Проверете да не настанала некоја грешка при копирањето од изворот.",
        "specialloguserlabel": "Изведувач:",
        "allpagesbadtitle": "Дадениот наслов е неважечки или има меѓујазичен или меѓувики-претставка. Може да содржи повеќе знаци кои не смеат да се користат во наслови.",
        "allpages-bad-ns": "Википедија не содржи именски простор „$1“.",
        "allpages-hide-redirects": "Скриј пренасочувања",
-       "cachedspecial-viewing-cached-ttl": "Ð\93ледаÑ\82е ÐºÐµÑ\88ирана верзија на оваа страница, која може да е стара $1.",
-       "cachedspecial-viewing-cached-ts": "Ð\93ледаÑ\82е ÐºÐµÑ\88ирана верзија на оваа страница, која може да се разликува од тековната.",
+       "cachedspecial-viewing-cached-ttl": "Ð\93ледаÑ\82е Ð¼ÐµÑ\93Ñ\83Ñ\81кладирана верзија на оваа страница, која може да е стара $1.",
+       "cachedspecial-viewing-cached-ts": "Ð\93ледаÑ\82е Ð¼ÐµÑ\93Ñ\83Ñ\81кладирана верзија на оваа страница, која може да се разликува од тековната.",
        "cachedspecial-refresh-now": "Погл. најновата.",
        "categories": "Категории",
        "categoriespagetext": "{{PLURAL:$1|Следната категорија содржи|Следните категории содржат}} страници или мултимедијални податотеки.\n[[Special:UnusedCategories|Неискористените категории]] не се прикажани овде.\nПогледајте ги и [[Special:WantedCategories|потребните категории]].",
        "listgrouprights-namespaceprotection-header": "Ограничувања за именски простори",
        "listgrouprights-namespaceprotection-namespace": "Именски простор",
        "listgrouprights-namespaceprotection-restrictedto": "Права што им овозможуваат на корисниците да уредуваат",
-       "trackingcategories": "Следачки категории",
-       "trackingcategories-summary": "Ð\9dа Ñ\81Ñ\82Ñ\80аниÑ\86ава Ñ\81е Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸ Ñ\81ледачки категории што автоматски се пополнуваат од програмот на МедијаВики. Нивните називи можат да се сменат со измена на соодветните системски пораки во именскиот простор {{ns:8}}.",
-       "trackingcategories-msg": "Следачка категорија",
+       "trackingcategories": "Следечки категории",
+       "trackingcategories-summary": "Ð\9dа Ñ\81Ñ\82Ñ\80аниÑ\86ава Ñ\81е Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸ Ñ\81ледечки категории што автоматски се пополнуваат од програмот на МедијаВики. Нивните називи можат да се сменат со измена на соодветните системски пораки во именскиот простор {{ns:8}}.",
+       "trackingcategories-msg": "Следечка категорија",
        "trackingcategories-name": "Назив на пораката",
        "trackingcategories-desc": "Критериуми за вклучување",
        "noindex-category-desc": "Роботите не ја индексираат страницава бидејќи го содржи волшебниот збор <code><nowiki>__NOINDEX__</nowiki></code> и се наоѓа во именски простор кајшто е дозволен.",
        "wlheader-enotif": "Известувањето по е-пошта е вклучено.",
        "wlheader-showupdated": "Страниците што се изменети од вашата последна посета се прикажани со '''задебелени''' букви",
        "wlnote": "Подолу {{PLURAL:$1|е прикажана последната промена|се прикажани последните <strong>$1</strong> промени}} во {{PLURAL:$2|последниов час|последниве <strong>$2</strong> часа}}, заклучно со $3, $4 ч.",
-       "wlshowlast": "Прикажи ги последните $1 часа, $2 дена, $3",
+       "wlshowlast": "Прикажи ги последните $1 часа, $2 дена,",
        "watchlist-options": "Поставки за список на набљудувања",
        "watching": "Набљудување...",
        "unwatching": "Отстранувам од набљудувани...",
        "exbeforeblank": "содржината пред бришењето беше: '$1'",
        "delete-confirm": "Бришење на „$1“",
        "delete-legend": "Бришење",
-       "historywarning": "'''Предупредување:''' Страницата што сакате да ја избришете има историја со околу $1 {{PLURAL:$1|преработка|преработки}}:",
+       "historywarning": "<strong>Предупредување:</strong> Страницата што сакате да ја избришете има историја со {{PLURAL:$1|една преработка|$1 преработки}}:",
        "confirmdeletetext": "На пат сте трајно да избришете страница заедно со нејзината историја.\nПотврдете дека имате намера да го направите ова, дека ги разбирате последиците од тоа и дека го правите во согласност со [[{{MediaWiki:Policy-url}}|правилата]].",
        "actioncomplete": "Дејството е извршено",
        "actionfailed": "Неуспешно дејство",
        "delete-edit-reasonlist": "Уреди причини за бришење",
        "delete-toobig": "Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|преработка|преработки}}.\nБришењето на ваквии страници е забрането со цел {{SITENAME}} да се заштити од оштетувања.",
        "delete-warning-toobig": "Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|преработка|преработки}}.\nБришењето може да предизвика проблеми при работењето на базата на податоци на {{SITENAME}};\nпродолжете доколку сте сигруни дека треба тоа да го сторите.",
-       "delete-cantedit": "Не можете да ја избришете страницава зошто немате дозвола да ја уредувате.",
+       "deleteprotected": "Не можете да ја избришете страницава бидејќи е заштитена.",
        "deleting-backlinks-warning": "'''Предупредување:''' До страницата што сакате да ја избришете водат [[Special:WhatLinksHere/{{FULLPAGENAME}}|други страници]] или пак се превметнуваат во неа.",
        "rollback": "Отповикај промени",
        "rollback_short": "Отповикај",
        "protect-othertime": "Друго време:",
        "protect-othertime-op": "друго време",
        "protect-existing-expiry": "Постоечки рок на истекување: $3, $2",
+       "protect-existing-expiry-infinity": "Постоечки рок: бесконечен",
        "protect-otherreason": "Друга/дополнителна причина:",
        "protect-otherreason-op": "Друга причина",
        "protect-dropdown": "*Вообичаени причини за заштита\n** Зачестен вандализам\n** Зачестен спам\n** Непродуктивна уредувачка војна\n** Страница со зачестена посета\n** Сеприсутност на шаблонот/превметнувањето\n** Административна постапка",
        "unblocked": "[[User:$1|$1]] беше деблокиран",
        "unblocked-range": "корисникот $1 е одблокиран",
        "unblocked-id": "Блокирањето $1 беше отстрането",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] е одблокирана.",
        "blocklist": "Блокирани корисници",
        "ipblocklist": "Блокирани корисници",
        "ipblocklist-legend": "Најди блокиран корисник",
        "import": "Увезување на страници",
        "importinterwiki": "Меѓувики увоз",
        "import-interwiki-text": "Избери вики и наслов на страница за увоз.\nДатумите и имињата на уредниците ќе бидат зачувани.\nСите постапки при увозот од другото вики се заведуваат во [[Special:Log/import|дневникот на увезувања]].",
-       "import-interwiki-source": "Извор вики/страница:",
+       "import-interwiki-sourcewiki": "Изворно вики:",
+       "import-interwiki-sourcepage": "Изворна страница:",
        "import-interwiki-history": "Копирај ги сите постари верзии за оваа страница",
        "import-interwiki-templates": "Вклучи ги сите шаблони",
        "import-interwiki-submit": "Увези",
        "tooltip-pt-watchlist": "Список на страници кои сте избрале да ги набљудувате.",
        "tooltip-pt-mycontris": "Список на ваши придонеси",
        "tooltip-pt-login": "Ви препорачуваме да се најавите, иако тоа не е задолжително.",
-       "tooltip-pt-logout": "Одјавете се",
+       "tooltip-pt-logout": "Одјавување",
        "tooltip-ca-talk": "Разговор за страницата",
        "tooltip-ca-edit": "Можете да ја уредите оваа страница. Ве молиме користете го копчето за преглед пред зачувување.",
        "tooltip-ca-addsection": "Започни нов пасус",
        "tooltip-ca-viewsource": "Оваа страница е заштитена. Можете да го видите изворниот код.",
        "tooltip-ca-history": "Претходни верзии на оваа страница.",
-       "tooltip-ca-protect": "Ð\97аÑ\88Ñ\82иÑ\82еÑ\82е Ñ\98а Ð¾Ð²Ð°Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а",
+       "tooltip-ca-protect": "Ð\97аÑ\88Ñ\82иÑ\82и Ñ\98а Ñ\81Ñ\82Ñ\80аниÑ\86ава",
        "tooltip-ca-unprotect": "Измени заштита страницава",
-       "tooltip-ca-delete": "Избриши ја оваа страница",
+       "tooltip-ca-delete": "Избриши ја страницава",
        "tooltip-ca-undelete": "Обнови ги уредувањата направени на оваа страница пред да биде избришана",
-       "tooltip-ca-move": "Премести ја оваа страница",
+       "tooltip-ca-move": "Премести ја страницава",
        "tooltip-ca-watch": "Додај ја страницава во списокот на набљудувања",
        "tooltip-ca-unwatch": "Отстрани ја страницава од списокот на набљудувања",
        "tooltip-search": "Пребарај низ {{SITENAME}}",
        "tooltip-t-contributions": "Список на придонеси на овој корисник",
        "tooltip-t-emailuser": "Испрати е-пошта на овој корисник",
        "tooltip-t-upload": "Подигни податотеки",
-       "tooltip-t-specialpages": "СпиÑ\81ок Ð½Ð° Ñ\81иÑ\82е Ñ\81пеÑ\86иÑ\98ални страници",
-       "tooltip-t-print": "Ð\92еÑ\80зиÑ\98а Ð·Ð° Ð¿ÐµÑ\87аÑ\82еÑ\9aе Ð½Ð° Ð¾Ð²Ð°Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а",
+       "tooltip-t-specialpages": "СпиÑ\81ок Ð½Ð° Ñ\81иÑ\82е Ñ\81лÑ\83жбени страници",
+       "tooltip-t-print": "Ð\92еÑ\80зиÑ\98а Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86ава Ð½Ð°Ð¼ÐµÐ½ÐµÑ\82а Ð·Ð° Ð¿ÐµÑ\87аÑ\82еÑ\9aе",
        "tooltip-t-permalink": "Постојана врска до оваа верзија на страницата",
        "tooltip-ca-nstab-main": "Преглед на содржината",
        "tooltip-ca-nstab-user": "Преглед на корисничката страница",
        "tooltip-ca-nstab-media": "Преглед на мултимедијалната податотека",
-       "tooltip-ca-nstab-special": "Ð\9eва Ðµ Ñ\81пеÑ\86иÑ\98ална Ñ\81Ñ\82Ñ\80аниÑ\86а, не можете да ја уредувате",
+       "tooltip-ca-nstab-special": "Ð\9eва Ðµ Ñ\81лÑ\83жбена Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸ Ð·Ð°Ñ\82оа не можете да ја уредувате",
        "tooltip-ca-nstab-project": "Преглед на проектната страница",
        "tooltip-ca-nstab-image": "Преглед на страницата на податотеката",
        "tooltip-ca-nstab-mediawiki": "Преглед на системската порака",
        "file-no-thumb-animation-gif": "'''Напомена: Поради технички ограничувања, минијатурите на GIF-слики со висока разложеност како оваа нема да се анимираат.'''",
        "newimages": "Галерија на нови податотеки",
        "imagelisttext": "Следи список на '''$1''' {{PLURAL:$1|податотека|податотеки}} подредени $2.",
-       "newimages-summary": "Ð\9eваа Ñ\81пеÑ\86иÑ\98ална страница ги покажува скоро подигнатите податотеки.",
+       "newimages-summary": "Ð\9eваа Ñ\81лÑ\83жбена страница ги покажува скоро подигнатите податотеки.",
        "newimages-legend": "Филтрирај",
        "newimages-label": "Име на податотека (или дел од името):",
        "newimages-showbots": "Прикажувај подигања од ботови",
        "exif-nickname": "Неформален назив на сликата",
        "exif-rating": "Оценка (од 5)",
        "exif-rightscertificate": "Уверение за раководство со права",
-       "exif-copyrighted": "Ð\90вÑ\82оÑ\80Ñ\81ки Ð¿Ñ\80авен Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81",
+       "exif-copyrighted": "Ð\90вÑ\82оÑ\80Ñ\81копÑ\80авен Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81:",
        "exif-copyrightowner": "Носител на авторските права",
        "exif-usageterms": "Услови на употреба",
        "exif-webstatement": "Изјава за авторското право",
        "exif-urgency-low": "Мала ($1)",
        "exif-urgency-high": "Голема ($1)",
        "exif-urgency-other": "Кориснички-зададен приоритет ($1)",
-       "watchlistall2": "сите",
        "namespacesall": "сите",
        "monthsall": "сите",
        "confirmemail": "Потврда на е-поштенска адреса",
        "version": "Верзија",
        "version-extensions": "Воспоставени додатоци",
        "version-skins": "Воспоставени рува",
-       "version-specialpages": "СпеÑ\86иÑ\98ални страници",
+       "version-specialpages": "СлÑ\83жбени страници",
        "version-parserhooks": "Расчленувачки куки",
        "version-variables": "Променливи",
        "version-antispam": "Спречување на спам",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath?uselang=mk Скрипта]",
        "redirect": "Пренасочување по податотеки, корисник или назнака на преработка",
        "redirect-legend": "Пренасочување кон податотека или страница",
-       "redirect-summary": "Ð\9eваа Ñ\81пеÑ\86иÑ\98ална страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата) или корисничка странца (се задава бројчената назнака на корисникот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Ð\9eваа Ñ\81лÑ\83жбена страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата) или корисничка странца (се задава бројчената назнака на корисникот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Оди",
        "redirect-lookup": "Пребарај:",
        "redirect-value": "Вредност:",
        "fileduplicatesearch-result-1": "Податотеката „$1“ нема истоветни дупликати.",
        "fileduplicatesearch-result-n": "Податотеката „$1“ има {{PLURAL:$2|еден истоветен дупликат|$2 истоветни дупликати}}.",
        "fileduplicatesearch-noresults": "Не пронајдов податотека со име „$1“.",
-       "specialpages": "СпеÑ\86иÑ\98ални страници",
+       "specialpages": "СлÑ\83жбени страници",
        "specialpages-note-top": "Легенда",
-       "specialpages-note": "* Ð\9dоÑ\80мални Ñ\81пеÑ\86иÑ\98ални Ñ\81Ñ\82Ñ\80аниÑ\86и.\n* <span class=\"mw-specialpagerestricted\">Ð\9eгÑ\80аниÑ\87ени Ñ\81пеÑ\86иÑ\98ални страници.</span>",
+       "specialpages-note": "* Ð\9dоÑ\80мални Ñ\81лÑ\83жбени Ñ\81Ñ\82Ñ\80аниÑ\86и.\n* <span class=\"mw-specialpagerestricted\">Ð\9eгÑ\80аниÑ\87ени Ñ\81лÑ\83жбени страници.</span>",
        "specialpages-group-maintenance": "Извештаи за одржување",
-       "specialpages-group-other": "Ð\94Ñ\80Ñ\83ги Ñ\81пеÑ\86иÑ\98ални страници",
-       "specialpages-group-login": "Најава / регистрација",
+       "specialpages-group-other": "Ð\94Ñ\80Ñ\83ги Ñ\81лÑ\83жбени страници",
+       "specialpages-group-login": "Најава / направи сметка",
        "specialpages-group-changes": "Скорешни промени и дневници",
        "specialpages-group-media": "Извештаи за мултимедијални содржини и подигања",
        "specialpages-group-users": "Корнисници и кориснички права",
        "specialpages-group-pages": "Списоци на страници",
        "specialpages-group-pagetools": "Алатки за страници",
        "specialpages-group-wiki": "Податоци и алатки",
-       "specialpages-group-redirects": "Ð\9fÑ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе Ð½Ð° Ñ\81пеÑ\86иÑ\98ални страници",
+       "specialpages-group-redirects": "Ð\9fÑ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе Ð½Ð° Ñ\81лÑ\83жбени страници",
        "specialpages-group-spam": "Алатки против спам",
        "blankpage": "Празна страница",
        "intentionallyblankpage": "Оваа страница намерно е оставена празна",
        "dberr-info-hidden": "(Не може да се добие опслужувачот на базата на податоци)",
        "dberr-usegoogle": "Во меѓувреме можете да се обидете да пребарувате со Google.",
        "dberr-outofdate": "Да напоменеме дека нивните индекси на нашата содржина можат да бидат застарени.",
-       "dberr-cachederror": "Следнава Ñ\81одÑ\80жина Ðµ ÐºÐµÑ\88иÑ\80ана ÐºÐ¾Ð¿Ð¸Ñ\98а Ð½Ð° Ð±Ð°Ñ\80анаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а, ÐºÐ¾Ñ\98а Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ðµ Ð·Ð°Ñ\81Ñ\82аÑ\80ена.",
+       "dberr-cachederror": "Следнава Ñ\81одÑ\80жина Ðµ Ð¼ÐµÑ\93Ñ\83Ñ\81кладиÑ\80ан Ð¿Ñ\80имеÑ\80ок Ð½Ð° Ð±Ð°Ñ\80анаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а, ÐºÐ¾Ñ\98 Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ðµ Ð·Ð°Ñ\81Ñ\82аÑ\80ен.",
        "htmlform-invalid-input": "Има проблеми со дел од вашиот внос",
        "htmlform-select-badoption": "Укажаната вредност е неважечка како можност.",
        "htmlform-int-invalid": "Вредноста која ја наведовте не е цел број.",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|подигна}} нова верзија на $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|ја подигна}} $3",
        "rightsnone": "(нема)",
+       "revdelete-summary": "опис на уредување",
        "feedback-bugornote": "Ако сте спремни подробно да го опишете техничкиот проблем, тогаш [$1 пријавете грешка]. \nВо спротивно, послужете се со едноставниот образец подолу. Вашиот коментар ќе стои на страницата „[$3 $2]“, заедно со корисничкото име и прелистувачот што го користите.",
        "feedback-subject": "Наслов:",
        "feedback-message": "Порака:",
        "limitreport-expansiondepth": "Најголема длабочина на проширувањето",
        "limitreport-expensivefunctioncount": "Бр. на сложени расчленувачки функции",
        "expandtemplates": "Прошири шаблони",
-       "expand_templates_intro": "Ð\9eваа Ñ\81пеÑ\86иÑ\98ална страница зема еден текст и рекурзивно ги проширува сите шаблони во него.\nИсто така проширува и расчленувачки функции како\n<code><nowiki>{{</nowiki>#language:…}}</code> и променливи како\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nВсушност, го проширува сето она што стои во двојни аглести загради.",
+       "expand_templates_intro": "Ð\9eваа Ñ\81лÑ\83жбена страница зема еден текст и рекурзивно ги проширува сите шаблони во него.\nИсто така проширува и расчленувачки функции како\n<code><nowiki>{{</nowiki>#language:…}}</code> и променливи како\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nВсушност, го проширува сето она што стои во двојни аглести загради.",
        "expand_templates_title": "Наслов на контекстот, за {{FULLPAGENAME}} и тн.:",
        "expand_templates_input": "Влезен текст:",
        "expand_templates_output": "Извод",
        "log-name-pagelang": "Дневник на менување на јазикот",
        "log-description-pagelang": "Ова е дневник на менувања на јазикот на страницата.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|го смени}} јазикот на страницата $3 од $4 на $5.",
-       "default-skin-not-found": "За жал, основното руво на вашето вики (<code>$wgDefaultSkin</code>) — <code>$1</code> —  не е достапно.\n\nВашата воспоставка ги опфаќа следниве рува. Погледајте [https://www.mediawiki.org/wiki/Manual:Skin_configuration Прирачник: Поставување на рува] за да дознаете како да ги вклучите и како да го изберете основното.\n\n$2\n\n; Ако штотуку го имате воспоставено МедијаВики:\n: Веројатно сте го воспоставиле од git, или пак непосредно од изворниот код на некој друг начин. Ова е очекувано. Пробајте да воспоставите некои рува од [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's именикот на рува] вака:\n* Со преземање на [https://www.mediawiki.org/wiki/Download tarball-воспоставувачот], кој самиот содржи неколку рува и додатоци. Можете да ја прекопирате папката <code>skins/</code> од него.\n* Клонирајќи едно од складиштата <code>mediawiki/skins/*</code> преку git во папката <code>skins/</code> на вашата воспоставка на МедијаВики.\n: Ова не би требало да прави пречки на вашето git-складиште ако сте програмер на МедијаВики.\n\n; Ако штотуку го имате надградено МедијаВики:\n: МедијаВики 1.24 и поновите верзии повеќе не ги вклучуваат воспоставените рува автоматски (погл. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Прирачник: Самооткривање на рува]). Можете да ги прекопирате следниве редови во <code>LocalSettings.php</code> за да ги вклучите сите моментално воспоставени рува:\n\n<pre>$3</pre>\n\n; Ако штотуку го имате изменето <code>LocalSettings.php</code>:\n: Проверете дали правилно се напишани називите на рувата.",
-       "default-skin-not-found-no-skins": "За жал, основното руво на вашето вики (<code>$wgDefaultSkin</code>) — <code>$1</code> —  не е достапно.\n\nНемате воспоставено ниедно руво.\n\n; Ако штотуку го имате воспоставено или надградено МедијаВики:\n: Веројатно сте го воспоставиле од git, или пак непосредно од изворниот код на некој друг начин. Ова е очекувано. МедијаВики 1.24 и поновите верзии немаат рува во главното складиште. Пробајте да воспоставите некои рува од [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's именикот на рува] вака:\n:* Со преземање на [https://www.mediawiki.org/wiki/Download tarball-воспоставувачот], кој самиот содржи неколку рува и додатоци. Можете да ја прекопирате папката <code>skins/</code> од него.\n: Ова не би требало да прави пречки на вашето git-складиште ако сте програмер на МедијаВики. Погледајте [https://www.mediawiki.org/wiki/Manual:Skin_configuration Прирачник: Поставување на рува] за да дознаете како да ги вклучите и како да го изберете основното.",
+       "default-skin-not-found": "За жал, основното руво на вашето вики оопределено во <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code> не е достапно.\n\nВашата воспоставка ги опфаќа следниве рува. Погледајте [https://www.mediawiki.org/wiki/Manual:Skin_configuration Прирачник: Поставување на рува] за да дознаете како да ги вклучите и како да го изберете основното.\n\n$2\n\n; Ако штотуку го имате воспоставено МедијаВики:\n: Веројатно сте го воспоставиле од git, или пак непосредно од изворниот код на некој друг начин. Ова е очекувано. Пробајте да воспоставите некои рува од [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's именикот на рува] вака:\n* Со преземање на [https://www.mediawiki.org/wiki/Download tarball-воспоставувачот], кој самиот содржи неколку рува и додатоци. Можете да ја прекопирате папката <code>skins/</code> од него.\n* Клонирајќи едно од складиштата <code>mediawiki/skins/*</code> преку git во папката <code dir=\"ltr\">skins/</code> на вашата воспоставка на МедијаВики.\n: Ова не би требало да прави пречки на вашето git-складиште ако сте програмер на МедијаВики.\n\n; Ако штотуку го имате надградено МедијаВики:\n: МедијаВики 1.24 и поновите верзии повеќе не ги вклучуваат воспоставените рува автоматски (погл. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Прирачник: Самооткривање на рува]). Можете да ги прекопирате следниве редови во <code>LocalSettings.php</code> за да ги вклучите сите моментално воспоставени рува:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Ако штотуку го имате изменето <code>LocalSettings.php</code>:\n: Проверете дали правилно се напишани називите на рувата.",
+       "default-skin-not-found-no-skins": "За жал, основното руво на вашето вики, определено во <code>$wgDefaultSkin</code> како <code>$1</code>, не е достапно.\n\nНемате воспоставено ниедно руво.\n\n; Ако штотуку го имате воспоставено или надградено МедијаВики:\n: Веројатно сте го воспоставиле од git, или пак непосредно од изворниот код на некој друг начин. Ова е очекувано. МедијаВики 1.24 и поновите верзии немаат рува во главното складиште. Пробајте да воспоставите некои рува од [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's именикот на рува] вака:\n:* Со преземање на [https://www.mediawiki.org/wiki/Download tarball-воспоставувачот], кој самиот содржи неколку рува и додатоци. Можете да ја прекопирате папката <code dir=\"ltr\">skins/</code> од него.\n: Ова не би требало да прави пречки на вашето git-складиште ако сте програмер на МедијаВики. Погледајте [https://www.mediawiki.org/wiki/Manual:Skin_configuration Прирачник: Поставување на рува] за да дознаете како да ги вклучите и како да го изберете основното.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (вклучено)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''исклучено''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''исклучено''')",
+       "mediastatistics": "Статистики за слики и снимки",
+       "mediastatistics-summary": "Статистики за подигнати типови податотеки. Се зема предвид само последната верзија на податотеката. Старите и избришаните верзии не се бројат.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|Еден бајт|$1 бајти}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-тип",
+       "mediastatistics-table-extensions": "Можни додатоци",
+       "mediastatistics-table-count": "Број на податотеки",
+       "mediastatistics-table-totalbytes": "Вкупна големина",
+       "mediastatistics-header-unknown": "Непознато",
+       "mediastatistics-header-bitmap": "Bitmap-слика",
+       "mediastatistics-header-drawing": "Цртежи (векторски слики)",
+       "mediastatistics-header-audio": "Аудио",
+       "mediastatistics-header-video": "Видеа",
+       "mediastatistics-header-multimedia": "Збогатени снимки",
+       "mediastatistics-header-office": "Биротехнички",
+       "mediastatistics-header-text": "Текстуални",
+       "mediastatistics-header-executable": "Извршни",
+       "mediastatistics-header-archive": "Збиени формати",
+       "json-warn-trailing-comma": "{{PLURAL:$1|Отстранета е една завршна запирка|Отстранети се $1 завршни запирки}} од JSON",
+       "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": "Зададена е вредност од тип што не може да се кодира"
 }
index bb807ba..1f37f48 100644 (file)
        "otherlanguages": "ഇതരഭാഷകളിൽ",
        "redirectedfrom": "($1 എന്ന താളിൽ നിന്നും തിരിച്ചുവിട്ടതു പ്രകാരം)",
        "redirectpagesub": "തിരിച്ചുവിടൽ താൾ",
+       "redirectto": "തിരിച്ചുവിടുന്നു:",
        "lastmodifiedat": "ഈ താൾ അവസാനം തിരുത്തപ്പെട്ടത്: $2, $1.",
        "viewcount": "ഈ താൾ {{PLURAL:$1|ഒരു തവണ|$1 തവണ}} സന്ദർശിക്കപ്പെട്ടിട്ടുണ്ട്.",
        "protectedpage": "സംരക്ഷിത താൾ",
        "createaccount-text": "{{SITENAME}} സംരംഭത്തിൽ ($4) താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ ആരോ ഒരു അംഗത്വം \"$2\" എന്ന ഉപയോക്തൃനാമത്തിൽ ഉണ്ടാക്കിയിരിക്കുന്നു (രഹസ്യവാക്ക്: \"$3\").  താങ്കൾ ഇപ്പോൾ ലോഗിൻ ചെയ്തു രഹസ്യവാക്ക് മാറ്റേണ്ടതാകുന്നു.\n\nഅംഗത്വം അബദ്ധവശാൽ ഉണ്ടാക്കിയതാണെങ്കിൽ താങ്കൾക്ക് ഈ സന്ദേശം നിരാകരിക്കാവുന്നതാണ്‌.",
        "login-throttled": "താങ്കൾ നിരവധി പ്രാവശ്യം ലോഗിൻ ചെയ്യാൻ ശ്രമിച്ചിരിക്കുന്നു.\nപുതിയതായി ശ്രമിക്കുന്നതിനു മുമ്പ് $1 ദയവായി കാത്തിരിക്കുക.",
        "login-abort-generic": "താങ്കളുടെ പ്രവേശിക്കൽ പരാജയപ്പെട്ടു - റദ്ദാക്കപ്പെട്ടിരിക്കുന്നു",
+       "login-migrated-generic": "താങ്കളുടെ അംഗത്വം പ്രവാസത്തിലാണ്, ഉപയോക്തൃനാമം ഈ വിക്കിയിൽ നിലവിലില്ല.",
        "loginlanguagelabel": "ഭാഷ: $1",
        "suspicious-userlogout": "ലോഗൗട്ട് ചെയ്യാനുള്ള താങ്കളുടെ അഭ്യർത്ഥന നിരസിച്ചിരിക്കുന്നു, കാരണം അത് കേടായ ബ്രൗസറിൽ നിന്നോ കാഷിങ് പ്രോക്സിയിൽ നിന്നോ ഉണ്ടായതുപോലെ അനുഭവപ്പെടുന്നു.",
        "createacct-another-realname-tip": "താങ്കളുടെ യഥാർത്ഥ പേര്‌ നൽകണമെന്നു നിർബന്ധമില്ല.\n\nഎങ്കിലും അങ്ങനെ ചെയ്താൽ, ഉപയോക്താക്കൾക്ക് അവരരവരുടെ പേരിൽ തന്നെ തങ്ങളുടെ സൃഷ്ടിക്ക് കടപ്പാട് ലഭിക്കുന്നതാണ്.",
        "passwordreset-emailsent-capture": "രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്, അത് താഴെക്കൊടുക്കുന്നു.",
        "passwordreset-emailerror-capture": "താഴെക്കൊടുത്തിരിക്കുന്ന, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ സൃഷ്ടിക്കാനായെങ്കിലും, അത് {{GENDER:$2|ഉപയോക്താവിന്}} അയയ്ക്കുന്നത് പരാജയപ്പെട്ടു: $1",
        "changeemail": "ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക",
-       "changeemail-header": "അംഗത്വത്തിന്റെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക",
        "changeemail-text": "താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്താൻ ഈ ഫോം പൂരിപ്പിച്ചു നൽകുക. മാറ്റം സ്ഥിരീകരിക്കാനായി താങ്കളുടെ രഹസ്യവാക്ക് കൂടെ നൽകേണ്ടതാണ്.",
        "changeemail-no-info": "ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.",
        "changeemail-oldemail": "ഇപ്പോഴത്തെ ഇമെയിൽ വിലാസം:",
        "changeemail-none": "(ഒന്നുമില്ല)",
        "changeemail-password": "താങ്കളുടെ {{SITENAME}} രഹസ്യവാക്ക്:",
        "changeemail-submit": "ഇമെയിലിൽ മാറ്റംവരുത്തുക",
-       "changeemail-cancel": "റദ്ദാക്കുക",
        "changeemail-throttled": "താങ്കൾ നിരവധി തവണ പ്രവേശിക്കാൻ ശ്രമിച്ചിരിക്കുന്നു.\nവീണ്ടും ശ്രമിക്കുന്നതിനു മുമ്പ് ദയവായി $1 കാത്തിരിക്കുക.",
        "resettokens": "ചീട്ടുകൾ പുനഃസജ്ജീകരിക്കുക",
        "resettokens-text": "താങ്കളുടെ അംഗത്വവുമായി ബന്ധപ്പെട്ടുള്ള ചില സ്വകാര്യവിവരങ്ങളിലേയ്ക്ക് ഇവിടെ ലഭ്യത സാദ്ധ്യമാക്കുന്ന ചീട്ടുകൾ താങ്കൾക്ക് പുനഃസജ്ജീകരിക്കാവുന്നതാണ്.\n\nതാങ്കളുടെ അംഗത്വവിവരങ്ങൾ മറ്റാർക്കെങ്കിലും അറിയാതെ കൈമാറിയിട്ടുണ്ടെങ്കിലോ താങ്കളുടെ അംഗത്വം അപഹരിക്കപ്പെട്ടുവെങ്കിലോ താങ്കളിത്  ചെയ്യേണ്ടതാണ്.",
        "showpreview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showdiff": "മാറ്റങ്ങൾ കാണിക്കുക",
        "blankarticle": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ സൃഷ്ടിക്കുന്ന താൾ ശൂന്യമാണ്.\n\"{{int:savearticle}}\" ഒന്നുകൂടി അമർത്തിയാൽ, ഉള്ളടക്കമൊന്നുമില്ലാതെ താൾ സൃഷ്ടിക്കപ്പെടും.",
-       "anoneditwarning": "'''മുന്നറിയിപ്പ്:''' താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. താങ്കളുടെ ഐ.പി. വിലാസം താളിന്റെ തിരുത്തൽ ചരിത്രത്തിൽ ചേർക്കുന്നതാണ്.",
+       "anoneditwarning": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. താങ്കൾ തിരുത്തുകളെന്തെങ്കിലും ചെയ്യുകയാണെങ്കിൽ താങ്കളുടെ ഐ.പി. വിലാസം എല്ലാവർക്കും ലഭ്യമായിരിക്കും. താങ്കൾ <strong>[$1 ലോഗിൻ ചെയ്യുകയോ]</strong>  <strong>[$2 അംഗത്വമെടുക്കുകയോ]</strong> ചെയ്യുന്നതുവഴി മറ്റ് ഗുണങ്ങളോടൊപ്പം താങ്കളുടെ തിരുത്തുകൾ ഉപയോക്തൃനാമത്തിലാവും അറിയപ്പെടുക.",
        "anonpreviewwarning": "''താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. സേവ് ചെയ്യുമ്പോൾ താളിന്റെ തിരുത്തൽ ചരിത്രത്തിൽ താങ്കളുടെ ഐ.പി. വിലാസം ചേർത്തു സൂക്ഷിക്കപ്പെടും.''",
        "missingsummary": "'''ഓർമ്മക്കുറിപ്പ്:''' താങ്കൾ തിരുത്തലിന്റെ ചുരുക്കരൂപം നൽകിയിട്ടില്ല. ''സേവ് ചെയ്യുക'' ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ താങ്കൾ വരുത്തിയ മാറ്റം കാത്തുസൂക്ഷിക്കുന്നതാണ്.",
        "missingcommenttext": "താങ്കളുടെ അഭിപ്രായം ദയവായി താഴെ രേഖപ്പെടുത്തുക.",
        "mergehistory-into": "ലക്ഷ്യതാൾ:",
        "mergehistory-list": "സം‌യോജിപ്പിക്കാവുന്ന തിരുത്തൽ നാൾവഴി",
        "mergehistory-merge": "[[:$1]]ന്റെ താഴെ കാണിച്ചിരിക്കുന്ന പതിപ്പുകൾ [[:$2]] ലേക്കു സം‌യോജിപ്പിക്കാവുന്നതാണ്‌‍. റേഡിയോ ബട്ടൺ കോളം ഉപയോഗിച്ച് സം‌യോജിപ്പിക്കാനുള്ള പതിപ്പുകളുടെ സമീപത്തുള്ള സമയം തിരഞ്ഞെടുക്കുക. താങ്കൾ തിരഞ്ഞെടുക്കുന്ന സമയത്തോ അതിനു മുൻപോ സൃഷ്ടിക്കപ്പെട്ട പതിപ്പുകൾ തിരഞ്ഞെടുക്കുക. നാവിഗേഷണൽ കണ്ണികൾ ഉപയോഗിക്കുന്നതു ഈ കോളത്തെ പുനഃക്രമീകരിക്കും.",
-       "mergehistory-go": "à´¸à´\82â\80\8cà´¯àµ\8bà´\9cà´¿à´ªàµ\8dപിà´\95àµ\8dà´\95ാവàµ\81à´¨àµ\8dà´¨ à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95ൾ à´\95à´¾à´\9fàµ\8dà´\9fàµ\81à´\95",
+       "mergehistory-go": "സം‌യോജിപ്പിക്കാവുന്ന തിരുത്തുകൾ കാട്ടുക",
        "mergehistory-submit": "പതിപ്പുകൾ സം‌യോജിപ്പിക്കുക",
        "mergehistory-empty": "സം‌യോജിപ്പിക്കാവുന്ന പതിപ്പുകളൊന്നും ഇല്ല.",
        "mergehistory-success": "[[:$1]]-ന്റെ {{PLURAL:$3|പതിപ്പ്|പതിപ്പുകൾ}} [[:$2]]-ലേക്കു വിജയകരമായി സം‌യോജിപ്പിച്ചിരിക്കുന്നു.",
        "searchall": "എല്ലാം",
        "showingresults": "'''$2''' മുതലുള്ള {{PLURAL:$1|'''ഒരു''' ഫലം|'''$1''' ഫലങ്ങൾ}} താഴെ പ്രദർശിപ്പിക്കുന്നു.",
        "showingresultsinrange": "#<strong>$2</strong> മുതൽ #<strong>$3</strong> വരെയുള്ള പരിധിയിലെ {{PLURAL:$1|<strong>ഒരു</strong> ഫലം|<strong>$1</strong> ഫലങ്ങൾ}} താഴെ പ്രദർശിപിക്കുന്നു.",
-       "showingresultsheader": "'''$4''' എന്ന പദത്തിനു ആകെ ലഭിച്ച {{PLURAL:$5| '''$3''' ഫലത്തിൽ '''$1''' എണ്ണം|'''$3''' ഫലത്തിൽ '''$1 മുതൽ $2''' വരെയുള്ളവ}}",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> ഫലത്തിൽ<strong>$1</strong>|<strong>$3</strong> ഫലത്തിൽ <strong>$1 മുതൽ $2</strong> വരെയുള്ളവ}}",
        "search-nonefound": "താങ്കൾ തിരഞ്ഞ പദത്തിനു യോജിച്ച ഫലങ്ങളൊന്നും ലഭിച്ചില്ല.",
        "powersearch-legend": "വിപുലീകൃത തിരച്ചിൽ",
        "powersearch-ns": "തിരയേണ്ട നാമമേഖലകൾ",
        "prefs-watchlist-days": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ പ്രദർശിപ്പിക്കേണ്ട പരമാവധി ദിവസങ്ങൾ:",
        "prefs-watchlist-days-max": "പരമാവധി {{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസങ്ങൾ}}",
        "prefs-watchlist-edits": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയുടെ വികസിത രൂപത്തിൽ പ്രദർശിപ്പിക്കേണ്ട പരമാവധി മാറ്റങ്ങൾ:",
-       "prefs-watchlist-edits-max": "പരമാവധി 1000 à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95ൾ",
+       "prefs-watchlist-edits-max": "പരമാവധി 1000 തിരുത്തുകൾ",
        "prefs-watchlist-token": "ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയ്ക്കുള്ള അടയാളപദം:",
        "prefs-misc": "പലവക",
        "prefs-resetpass": "രഹസ്യവാക്ക് മാറ്റുക",
        "prefs-tokenwatchlist": "ചീട്ട്",
        "prefs-diffs": "വ്യത്യാസങ്ങൾ",
        "prefs-help-prefershttps": "താങ്കൾ അടുത്ത പ്രാവശ്യം പ്രവേശിക്കുമ്പോൾ ഇവ ഫലത്തിൽ വരുന്നതാണ്.",
+       "prefswarning-warning": "താങ്കളുടെ ക്രമീകരണങ്ങളിൽ താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഇതുവരെ സേവ് ചെയ്തിട്ടില്ല.\n\"$1\" ഞെക്കാതെയാണ് താങ്കൾ ഈ താളിൽ നിന്നും പോകുന്നതെങ്കിൽ താങ്കളുടെ ക്രമീകരണങ്ങൾ സേവ് ചെയ്യപ്പെടുന്നതല്ല.",
        "prefs-tabs-navigation-hint": "സൂചന: ടാബുകളുടെ പട്ടികയിലെ ടാബുകളിലൂടെ നീങ്ങാൻ ഇടത്തും വലത്തും ആരോ കീകൾ ഉപയോഗിക്കാവുന്നതാണ്.",
        "email-address-validity-valid": "സാധുതയുള്ളതെന്ന് തോന്നുന്നു",
        "email-address-validity-invalid": "സാധുതയുള്ള വിലാസം ആവശ്യമാണ്!",
        "right-noratelimit": "പ്രവർത്തനങ്ങൾക്ക് പരിധികൾ ബാധകമല്ല",
        "right-import": "മറ്റുള്ള വിക്കികളിൽ നിന്നും താളുകൾ ഇറക്കുമതി ചെയ്യുക",
        "right-importupload": "അപ്‌‌ലോഡ് ചെയ്ത പ്രമാണത്തിൽ നിന്നും താളുകൾ ഇറക്കുമതി ചെയ്യുക",
-       "right-patrol": "മറàµ\8dà´±àµ\81à´³àµ\8dളവരàµ\81à´\9fàµ\86 à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95ൾ à´±àµ\8bà´¨àµ\8dà´¤àµ\81à´\9aàµ\81à´±àµ\8dറിയതായി à´\85à´\9fയാളപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dà´¤àµ\81à´\95",
-       "right-autopatrol": "à´¸àµ\8dവനàµ\8dà´¤à´\82 à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95ൾ à´±àµ\8bà´¨àµ\8dà´¤àµ\81 à´\9aàµ\81à´±àµ\8dറിയതായി à´\85à´\9fയാളപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dà´¤àµ\81à´\95",
+       "right-patrol": "മറ്റുള്ളവരുടെ തിരുത്തുകൾ റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തുക",
+       "right-autopatrol": "സ്വന്തം തിരുത്തുകൾ റോന്തു ചുറ്റിയതായി അടയാളപ്പെടുത്തുക",
        "right-patrolmarks": "പുതിയ മാറ്റങ്ങളിലെ റോന്തുചുറ്റൽ രേഖകൾ പരിശോധിക്കുക",
        "right-unwatchedpages": "ശ്രദ്ധിക്കാത്ത താളുകളുടെ പട്ടിക കാണുക",
        "right-mergehistory": "താളുകളുടെ നാൾവഴികൾ ലയിപ്പിക്കുക",
        "rcshowhidepatr": "റോന്തു ചുറ്റിയ മാറ്റങ്ങൾ $1",
        "rcshowhidepatr-show": "പ്രദർശിപ്പിക്കുക",
        "rcshowhidepatr-hide": "മറയ്ക്കുക",
-       "rcshowhidemine": "à´\8eà´¨àµ\8dà´±àµ\86 à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95ൾ $1",
+       "rcshowhidemine": "എന്റെ തിരുത്തുകൾ $1",
        "rcshowhidemine-show": "പ്രദർശിപ്പിക്കുക",
        "rcshowhidemine-hide": "മറയ്ക്കുക",
        "rclinks": "കഴിഞ്ഞ $2 ദിവസങ്ങൾക്കുള്ളിലുണ്ടായ $1 മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക<br />$3",
        "listfiles_count": "പതിപ്പുകൾ",
        "listfiles-show-all": "ചിത്രത്തിന്റെ പഴയ പതിപ്പുകളും ഉൾപ്പെടുത്തുക",
        "listfiles-latestversion": "ഇപ്പോഴത്തെ പതിപ്പ്",
-       "listfiles-latestversion-yes": "ശരി",
-       "listfiles-latestversion-no": "à´µàµ\87à´£àµ\8dà´\9f",
+       "listfiles-latestversion-yes": "à´\85à´¤àµ\86",
+       "listfiles-latestversion-no": "à´\85à´²àµ\8dà´²",
        "file-anchor-link": "പ്രമാണം",
        "filehist": "പ്രമാണ നാൾവഴി",
        "filehist-help": "ഏതെങ്കിലും തീയതി/സമയ കണ്ണിയിൽ ഞെക്കിയാൽ പ്രസ്തുതസമയത്ത് ഈ പ്രമാണം എങ്ങനെയായിരുന്നു എന്നു കാണാം.",
        "randomincategory": "വർഗ്ഗത്തിൽ നിന്ന് ക്രമരഹിതമായി എടുക്കുന്ന താൾ",
        "randomincategory-invalidcategory": "\"$1\" സാധുതയുള്ള വർഗ്ഗത്തിന്റെ പേരല്ല.",
        "randomincategory-nopages": "[[:Category:$1|വർഗ്ഗം:$1]] എന്നതിൽ താളുകളൊന്നുമില്ല.",
-       "randomincategory-selectcategory": "ഈ വർഗ്ഗത്തിൽ നിന്നും ഏതെങ്കിലും താൾ എടുക്കുക: $1 $2.",
-       "randomincategory-selectcategory-submit": "പോകൂ",
+       "randomincategory-category": "വർഗ്ഗം:",
+       "randomincategory-legend": "വർഗ്ഗത്തിൽ നിന്ന് ക്രമരഹിതമായി എടുക്കുന്ന താൾ",
        "randomredirect": "ക്രമരഹിതമായ തിരിച്ചുവിടൽ",
        "randomredirect-nopages": "\"$1\" എന്ന നാമമേഖലയിൽ തിരിച്ചുവിടൽ താളുകളൊന്നുമില്ല.",
        "statistics": "സ്ഥിതിവിവരക്കണക്കുകൾ",
        "statistics-pages": "താളുകൾ",
        "statistics-pages-desc": "സം‌വാദത്താളുകൾ, തിരിച്ചുവിടലുകൾ തുടങ്ങിയവയടക്കം വിക്കിയിലെ എല്ലാ താളുകളും.",
        "statistics-files": "അപ്‌ലോഡ് ചെയ്തിട്ടുള്ള പ്രമാണങ്ങൾ",
-       "statistics-edits": "{{SITENAME}} à´¸à´\82â\80\8cà´°à´\82à´­à´¤àµ\8dതിനàµ\8dà´±àµ\86 à´¤àµ\81à´\9fà´\95àµ\8dà´\95à´\82 à´®àµ\81തലàµ\81à´³àµ\8dà´³ à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95ൾ",
-       "statistics-edits-average": "à´\92à´°àµ\81 à´¤à´¾à´³à´¿à´²àµ\86 à´¶à´°à´¾à´¶à´°à´¿ à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95ൾ",
+       "statistics-edits": "{{SITENAME}} സം‌രംഭത്തിന്റെ തുടക്കം മുതലുള്ള തിരുത്തുകൾ",
+       "statistics-edits-average": "ഒരു താളിലെ ശരാശരി തിരുത്തുകൾ",
        "statistics-views-total": "ആകെ സന്ദർശനങ്ങൾ",
        "statistics-views-total-desc": "നിലവില്ലാത്ത താളുകളിലും പ്രത്യേക താളുകളിലും ഉള്ള എടുത്തുനോക്കലുകൾ ഉൾപ്പെടുത്തിയിട്ടില്ല",
        "statistics-views-peredit": "ഓരോ തിരുത്തലിലും ഉള്ള എടുത്തുനോട്ടങ്ങൾ",
        "protectedtitles-summary": "സൃഷ്ടിക്കുന്നതിൽ നിന്നും സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ള താളുകളുടെ പട്ടിക ഇവിടെ കാണാം. സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതും എന്നാൽ നിലവിലുള്ളതുമായ താളുകൾക്കായി [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] കാണുക.",
        "protectedtitlesempty": "ഈ ചരങ്ങൾ ഉപയോഗിച്ചു തലക്കെട്ടുകൾ ഒന്നും തന്നെ സം‌രക്ഷിക്കപ്പെട്ടിട്ടില്ല.",
        "listusers": "ഉപയോക്താക്കളുടെ പട്ടിക",
-       "listusers-editsonly": "തിരàµ\81à´¤àµ\8dതലàµ\81à´\95ൾ à´\9aàµ\86à´¯àµ\8dതിà´\9fàµ\8dà´\9fàµ\81à´³àµ\8dà´³ à´\89പയàµ\8bà´\95àµ\8dതാà´\95àµ\8dà´\95à´³àµ\86 à´®à´¾à´¤àµ\8dà´°à´\82 à´\95ാണിà´\95àµ\8dà´\95àµ\81à´\95",
+       "listusers-editsonly": "തിരുത്തുകൾ ചെയ്തിട്ടുള്ള ഉപയോക്താക്കളെ മാത്രം കാണിക്കുക",
        "listusers-creationsort": "സൃഷ്ടിക്കപ്പെട്ട തീയതി അനുസരിച്ച് ക്രമീകരിക്കുക",
        "listusers-desc": "അവരോഹണക്രമത്തിൽ ആക്കുക",
        "usereditcount": "{{PLURAL:$1|ഒരു തിരുത്തൽ|$1 തിരുത്തലുകൾ}}",
        "booksources": "പുസ്തക സ്രോതസ്സുകൾ",
        "booksources-search-legend": "പുസ്തകസ്രോതസ്സുകൾക്കായി തിരയുക",
        "booksources-isbn": "ഐ.എസ്.ബി.എൻ.:",
-       "booksources-go": "പോകൂ",
+       "booksources-search": "തിരയുക",
        "booksources-text": "പുതിയതും ഉപയോഗിച്ചതുമായ പുസ്തകങ്ങൾ വിൽക്കുന്ന സൈറ്റുകളിലേക്കുള്ള ലിങ്കുകളുടെ പട്ടിക ആണ്‌ താഴെ. താങ്കൾ തിരയുന്ന പുസ്തകത്തെ പറ്റിയുള്ള കൂടുതൽ വിവരങ്ങൾ ഈ പട്ടികയിൽ നിന്നു ലഭിച്ചേക്കാം:",
        "booksources-invalid-isbn": "തന്നിരിക്കുന്ന ഐ.എസ്.ബി.എൻ. സാധുവാണെന്നു തോന്നുന്നില്ല; യഥാർത്ഥ സ്രോതസ്സിൽ നിന്നും പകർത്തിയപ്പോൾ തെറ്റുപറ്റിയോ എന്നു പരിശോധിക്കുക",
        "specialloguserlabel": "നടപ്പിലാക്കിയയാൾ:",
        "wlheader-enotif": "ഇമെയിൽ അറിയിപ്പുകൾ സജ്ജമാക്കിയിരിക്കുന്നു.",
        "wlheader-showupdated": "താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം മാറ്റം വന്ന താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
        "wlnote": "$3, $4-നു കഴിഞ്ഞ {{PLURAL:$2|മണിക്കൂറിൽ|<strong>$2</strong> മണിക്കൂറിൽ}} നടന്ന {{PLURAL:$1|ഒരു പുതിയ മാറ്റം|<strong>$1</strong> പുതിയ മാറ്റങ്ങൾ}} താഴെ പ്രദർശിപ്പിച്ചിരിക്കുന്നു.",
-       "wlshowlast": "ഒടുവിലത്തെ $1 മണിക്കൂറുകൾ $2 ദിനങ്ങൾ, $3 പ്രദർശിപ്പിക്കുക",
+       "wlshowlast": "ഒടുവിലത്തെ $1 മണിക്കൂറുകൾ $2 ദിനങ്ങൾ,  പ്രദർശിപ്പിക്കുക",
        "watchlist-options": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ സജ്ജീകരണങ്ങൾ",
        "watching": "ശ്രദ്ധിക്കുന്നു...",
        "unwatching": "അവഗണിക്കുന്നു...",
        "exbeforeblank": "ശൂന്യമാക്കപ്പെടുന്നതിനു മുമ്പുള്ള ഉള്ളടക്കം: '$1'",
        "delete-confirm": "\"$1\" മായ്ക്കുക",
        "delete-legend": "മായ്ക്കുക",
-       "historywarning": "'''മുന്നറിയിപ്പ്''': താങ്കൾ മായ്ക്കുവാൻ പോകുന്ന താളിനു ഏകദേശം {{PLURAL:$1|ഒരു നാൾപ്പതിപ്പ്|$1 നാൾപ്പതിപ്പുകൾ}} ഉള്ള നാൾവഴി ഉണ്ട്:",
+       "historywarning": "<strong>മുന്നറിയിപ്പ്</strong>: താങ്കൾ മായ്ക്കുവാൻ പോകുന്ന താളിനു {{PLURAL:$1|ഒരു നാൾപ്പതിപ്പ്|$1 നാൾപ്പതിപ്പുകൾ}} ഉള്ള നാൾവഴി ഉണ്ട്:",
        "confirmdeletetext": "താങ്കൾ ഒരു താൾ അതിന്റെ നാൾവഴിയടക്കം മായ്ക്കുവാൻ പോവുകയാണ്. ഈ ചെയ്തിയുടെ പരിണതഫലം താങ്കൾക്കറിയാമെന്നും, ഈ നടപടി [[{{MediaWiki:Policy-url}}|വിക്കിയുടെ നയം]] അനുസരിച്ചാണു ചെയ്യുന്നതെന്നും ഉറപ്പാക്കുക.",
        "actioncomplete": "പ്രവൃത്തി പൂർത്തിയായിരിക്കുന്നു",
        "actionfailed": "പ്രവൃത്തി പരാജയപ്പെട്ടിരിക്കുന്നു",
        "delete-edit-reasonlist": "മായ്ക്കലിന്റെ കാരണം തിരുത്തുക",
        "delete-toobig": "ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ നിലനില്പ്പിനെ തന്നെ ബാധിക്കുമെന്നതിനാൽ ഈ താൾ മായ്ക്കുന്നതിനുള്ള അവകാശം പരിമിതപ്പെടുത്തിയിരിക്കുന്നു.",
        "delete-warning-toobig": "ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. അതായത്, ഇതിനു് $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ ഡാറ്റാബേസ് ഓപ്പറേഷനെ ബാധിച്ചേക്കാം. അതിനാൽ വളരെ ശ്രദ്ധാപൂർവ്വം തുടർനടപടികളിലേക്കു നീങ്ങുക.",
-       "delete-cantedit": "ഈ താൾ തിരുത്തുവാൻ അനുമതി ഇല്ലാത്തതിനാൽ താങ്കൾക്ക് ഈ താൾ മായ്ക്കാനാവില്ല.",
+       "deleteprotected": "ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നതിനാൽ താങ്കൾക്കിത് മായ്ക്കാനാവില്ല.",
        "deleting-backlinks-warning": "'''മുന്നറിയിപ്പ്:''' മറ്റു താളുകളിൽ നിന്നും [[Special:WhatLinksHere/{{FULLPAGENAME}}|താളിലേയ്ക്കുള്ള കണ്ണികൾ]] അല്ലെങ്കിൽ ഉൾപ്പെടുത്തിയിട്ടുള്ള താളുകൾ താങ്കൾ മായ്ക്കാൻ പോവുകയാണ്.",
-       "rollback": "തിരàµ\81à´¤àµ\8dതലàµ\81à´\95ൾ à´±àµ\8bൾബാà´\95àµ\8dà´\95àµ\8d à´\9aàµ\86à´¯àµ\8dà´¯àµ\81à´\95",
+       "rollback": "തിരുത്തുകൾ റോൾബാക്ക് ചെയ്യുക",
        "rollback_short": "റോൾബാക്ക്",
        "rollbacklink": "റോൾബാക്ക്",
        "rollbacklinkcount": "{{PLURAL:$1|ഒരു തിരുത്ത്|$1 തിരുത്തുകൾ}} മുൻപ്രാപനം ചെയ്യുക",
        "protect-othertime": "മറ്റ് കാലാവധി:",
        "protect-othertime-op": "മറ്റു കാലയളവ്",
        "protect-existing-expiry": "നിലവിലെ കാലാവധി: $3, $2",
+       "protect-existing-expiry-infinity": "നിലവിലെ കാലഹരണപ്പെടൽ കാലാവധി: അനന്തം",
        "protect-otherreason": "മറ്റ്/കൂടുതൽ കാരണം:",
        "protect-otherreason-op": "മറ്റ് കാരണം",
        "protect-dropdown": "*സംരക്ഷിക്കാനുള്ള കാരണങ്ങൾ\n** അമിതമായ നശീകരണപ്രവർത്തനങ്ങൾ\n** അമിതമായ പാഴെഴുത്ത് ഉൾപ്പെടുത്തൽ\n** സൃഷ്ടിപരമല്ലാതെ ഭവിക്കുന്ന തിരുത്തൽ യുദ്ധം\n** സന്ദർശകരുടെ എണ്ണം വളരെ കൂടുതലായ താൾ",
        "uctop": "(നിലവിലുള്ളത്)",
        "month": "മാസം:",
        "year": "വർഷം:",
-       "sp-contributions-newbies": "à´ªàµ\81തിയ à´\85à´\82à´\97à´\99àµ\8dà´\99ൾ à´¨à´\9fà´¤àµ\8dതിയ à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95ൾ à´®à´¾à´¤àµ\8dà´°à´\82",
+       "sp-contributions-newbies": "പുതിയ അംഗങ്ങൾ നടത്തിയ തിരുത്തുകൾ മാത്രം",
        "sp-contributions-newbies-sub": "പുതിയ ഉപയോക്താക്കൾ ചെയ്തവ",
        "sp-contributions-newbies-title": "പുതിയ അംഗത്വമെടുത്ത ഉപയോക്താക്കളുടെ സേവനങ്ങൾ",
        "sp-contributions-blocklog": "തടയൽ രേഖ",
        "unblockiptext": "മുൻപ് തടയപ്പെട്ട ഐ.പി.യുടേയും ഉപയോക്താവിന്റേയും തിരുത്തൽ അവകാശം പുനഃസ്ഥാപിക്കാൻ താഴെയുള്ള ഫോം ഉപയോഗിക്കുക.",
        "ipusubmit": "ഈ വിലക്ക് ഒഴിവാക്കുക",
        "unblocked": "[[User:$1|$1]] എന്ന ഉപയോക്താവിനുണ്ടായിരുന്ന തടയൽ നീക്കിയിരിക്കുന്നു",
-       "unblocked-range": "$1 എന്ന പരിധിയുടെ തടയൽ നീക്കപ്പെട്ടിരിക്കുന്നു",
-       "unblocked-id": "$1 എന്ന തടയൽ നീക്കം ചെയ്തിരിക്കുന്നു",
+       "unblocked-range": "$1 എന്ന പരിധിയുടെ തടയൽ നീക്കിയിരിക്കുന്നു.",
+       "unblocked-id": "$1 എന്ന തടയൽ നീക്കിയിരിക്കുന്നു.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] എന്ന വിലാസത്തിനുണ്ടായിരുന്ന തടയൽ നീക്കിയിരിക്കുന്നു.",
        "blocklist": "തടയപ്പെട്ട ഉപയോക്താക്കൾ",
        "ipblocklist": "തടയപ്പെട്ട ഉപയോക്താക്കൾ",
        "ipblocklist-legend": "തടഞ്ഞ ഒരു ഉപയോക്താവിനെ തിരയുക",
        "import": "താളുകൾ ഇറക്കുമതി ചെയ്യുക",
        "importinterwiki": "അന്തർവിക്കി ഇറക്കുമതി",
        "import-interwiki-text": "വിക്കിയും ഇറക്കുമതി ചെയ്യാനുള്ള താളും തിരഞ്ഞെടുക്കുക.\nപുതുക്കൽ തീയതികളും തിരുത്തിയ ആളുകളുടെ പേരും സൂക്ഷിക്കപ്പെടും.\nഅന്തർവിക്കി ഇറക്കുമതിയുടെ എല്ലാ വിവരങ്ങളും [[Special:Log/import|ഇറക്കുമതി പ്രവർത്തനരേഖ]] എന്ന താളിൽ ശേഖരിക്കപ്പെടും.",
-       "import-interwiki-source": "മൂല വിക്കി/താൾ:",
+       "import-interwiki-sourcewiki": "സ്രോതസ്സ് വിക്കി:",
+       "import-interwiki-sourcepage": "സ്രോതസ്സ് താൾ:",
        "import-interwiki-history": "ഈ താളിന്റെ എല്ലാ പൂർവ്വചരിത്രവും പകർത്തുക",
        "import-interwiki-templates": "എല്ലാ ഫലകങ്ങളും ഉൾപ്പെടുത്തുക",
        "import-interwiki-submit": "ഇറക്കുമതി",
        "exif-urgency-low": "താഴ്‌ന്നത് ($1)",
        "exif-urgency-high": "ഉന്നതം ($1)",
        "exif-urgency-other": "ഉപയോക്തൃ-നിർവചിത മുൻഗണന ($1)",
-       "watchlistall2": "എല്ലാം",
        "namespacesall": "എല്ലാം",
        "monthsall": "എല്ലാം",
        "confirmemail": "ഇമെയിൽ വിലാസം സ്ഥിരീകരിക്കൽ",
        "version-parser-function-hooks": "പാഴ്‌സർ ഫങ്ഷൻ കൊളുത്തുകൾ",
        "version-hook-name": "കൊളുത്തിന്റെ പേര്",
        "version-hook-subscribedby": "വരിക്കാരനായത്",
-       "version-version": "(പതിപ്പ് $1)",
+       "version-version": "($1)",
        "version-no-ext-name": "[[പേര് നൽകിയിട്ടില്ല]",
        "version-license": "മീഡിയവിക്കി ഉപയോഗാനുമതി",
        "version-ext-license": "അനുമതി",
        "logentry-upload-overwrite": "$1 ഒരു പുതിയ പതിപ്പ് $3 {{GENDER:$2|അപ്‌ലോഡ് ചെയ്തു}}",
        "logentry-upload-revert": "$1 $3 {{GENDER:$2|അപ്‌ലോഡ് ചെയ്തു}}",
        "rightsnone": "(ഒന്നുമില്ല)",
+       "revdelete-summary": "തിരുത്തലിന്റെ ചുരുക്കം",
        "feedback-bugornote": "സാങ്കേതിക പ്രശ്നം എന്താണെന്ന് വിവരിച്ചെഴുതാൻ താങ്കൾ തയ്യാറാണെങ്കിൽ [$1 ബഗ് അറിയിക്കുക].\nഅല്ലെങ്കിൽ താങ്കൾക്ക് താഴെ എളുപ്പത്തിനായി നൽകിയിരിക്കുന്ന ഫോം ഉപയോഗിക്കാം. താങ്കളുടെ കുറിപ്പ് \"[$3 $2]\" താളിൽ, താങ്കളുടെ ഉപയോക്തൃനാമത്തിന്റെയും ഉപയോഗിക്കുന്ന ബ്രൗസറിന്റെ പേരിന്റെയും ഒപ്പം ചേർക്കുന്നതായിരിക്കും.",
        "feedback-subject": "വിഷയം:",
        "feedback-message": "സന്ദേശം:",
        "log-name-pagelang": "ഭാഷ മാറ്റലിന്റെ രേഖ",
        "log-description-pagelang": "താളുകളുടെ ഭാഷകൾ മാറ്റിയതിന്റെ രേഖകൾ ഇവിടെക്കാണാം.",
        "logentry-pagelang-pagelang": "$3 എന്ന താളിന്റെ ഭാഷയായിരുന്ന $4, $1 $5 ആയി {{GENDER:$2|മാറ്റി}}.",
-       "default-skin-not-found": "അയ്യോ! താങ്കളുടെ വിക്കിയുടെ സ്വതേയുള്ള ദൃശ്യരൂപമായ (<code>$wgDefaultSkin</code>), <code>$1</code>, ലഭ്യമല്ല.\n\nതാങ്കളുടെ ഇൻസ്റ്റലേഷനിൽ താഴെക്കൊടുക്കുന്ന ദൃശ്യരൂപങ്ങൾ ഉണ്ടാകേണ്ടതാണ്. അവ എങ്ങനെ ക്രമീകരിക്കാം എന്നും സ്വതേ വേണ്ടത് എങ്ങനെ സജ്ജമാക്കാം എന്നും [https://www.mediawiki.org/wiki/Manual:Skin_configuration ദൃശ്യരൂപം സജ്ജമാക്കൽ സഹായിയിൽ] കാണുക.\n\n$2\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:* താങ്കളുടെ മീഡിയവിക്കി ഇൻസ്റ്റലേഷന്റെ <code>skins/</code> ഡയറക്ടറിയിലേക്ക് ഗിറ്റ് ഉപയോഗിച്ച് <code>mediawiki/skins/*</code> റെപ്പോസിറ്ററികളിലൊന്ന് ക്ലോൺ ചെയ്യുക.\n: താങ്കളൊരു മീഡിയവിക്കി ഡവലപ്പറാണെങ്കിൽ ഇത് താങ്കളുടെ ഗിറ്റ് ഡെപ്പോസിറ്ററിയെ ബാധിക്കുന്നതല്ല.\n\n; മീഡിയവിക്കി താങ്കൾ അപ്ഗ്രേഡ് ചെയ്തതേ ഉള്ളുവെങ്കിൽ:\n: മീഡിയവിക്കി 1.24 ഒപ്പം അതിനു ശേഷമുള്ളവയും ഇൻസ്റ്റോൾ ചെയ്തിട്ടുള്ള ദൃശ്യരൂപങ്ങൾ സ്വതേ സജ്ജമാക്കുന്നില്ല ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery ദൃശ്യരൂപം ഓട്ടോഡിസ്കവറി സഹായം] കാണുക). ഇൻസ്റ്റോൾ ചെയ്തിട്ടുള്ള ദൃശ്യരൂപങ്ങൾ സജ്ജമാക്കുന്നതിനായി ഇനിക്കൊടുക്കുന്ന വരികൾ <code>LocalSettings.php</code> എന്നതിലോട്ട് പകർത്തുക:\n\n<pre>$3</pre>\n\n; <code>LocalSettings.php</code> താളിൽ മാറ്റം വരുത്തിയതേയുള്ളുവെങ്കിൽ:\n: ദൃശ്യരൂപങ്ങളുടെ പേരിൽ അക്ഷരപിശകുകളുണ്ടോയെന്ന് ആവർത്തിച്ച് പരിശോധിക്കുക.",
-       "default-skin-not-found-no-skins": "അയ്യോ! താങ്കളുടെ വിക്കിയുടെ സ്വതേയുള്ള ദൃശ്യരൂപമായ (<code>$wgDefaultSkin</code>), <code>$1</code>, ലഭ്യമല്ല.\n\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:* താങ്കളുടെ മീഡിയവിക്കി ഇൻസ്റ്റലേഷന്റെ <code>skins/</code> ഡയറക്ടറിയിലേക്ക് ഗിറ്റ് ഉപയോഗിച്ച് <code>mediawiki/skins/*</code> റെപ്പോസിറ്ററികളിലൊന്ന് ക്ലോൺ ചെയ്യുക.\n: താങ്കളൊരു മീഡിയവിക്കി ഡവലപ്പറാണെങ്കിൽ ഇത് താങ്കളുടെ ഗിറ്റ് ഡെപ്പോസിറ്ററിയെ ബാധിക്കുന്നതല്ല. ദൃശ്യരൂപങ്ങൾ എങ്ങനെ ക്രമീകരിക്കാം എന്നും സ്വതേ വേണ്ടത് എങ്ങനെ സജ്ജമാക്കാം എന്നും [https://www.mediawiki.org/wiki/Manual:Skin_configuration ദൃശ്യരൂപം സജ്ജമാക്കൽ സഹായിയിൽ] കാണുക.",
+       "default-skin-not-found": "അയ്യോ! <code dir=\"ltr\"> $wgDefaultSkin</code> നിർവചിക്കപ്പെട്ടതുപ്രകാരമുള്ള താങ്കളുടെ വിക്കിയുടെ സ്വതേയുള്ള ദൃശ്യരൂപമായ <code>$1</code>, ലഭ്യമല്ല.\n\nതാങ്കളുടെ ഇൻസ്റ്റലേഷനിൽ താഴെക്കൊടുക്കുന്ന ദൃശ്യരൂപങ്ങൾ ഉണ്ടാകേണ്ടതാണ്. അവ എങ്ങനെ ക്രമീകരിക്കാം എന്നും സ്വതേ വേണ്ടത് എങ്ങനെ സജ്ജമാക്കാം എന്നും [https://www.mediawiki.org/wiki/Manual:Skin_configuration ദൃശ്യരൂപം സജ്ജമാക്കൽ സഹായിയിൽ] കാണുക.\n\n$2\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:* താങ്കളുടെ മീഡിയവിക്കി ഇൻസ്റ്റലേഷന്റെ <code dir=\"ltr\">skins/</code> ഡയറക്ടറിയിലേക്ക് ഗിറ്റ് ഉപയോഗിച്ച് <code>mediawiki/skins/*</code> റെപ്പോസിറ്ററികളിലൊന്ന് ക്ലോൺ ചെയ്യുക.\n: താങ്കളൊരു മീഡിയവിക്കി ഡവലപ്പറാണെങ്കിൽ ഇത് താങ്കളുടെ ഗിറ്റ് ഡെപ്പോസിറ്ററിയെ ബാധിക്കുന്നതല്ല.\n\n; മീഡിയവിക്കി താങ്കൾ അപ്ഗ്രേഡ് ചെയ്തതേ ഉള്ളുവെങ്കിൽ:\n: മീഡിയവിക്കി 1.24 ഒപ്പം അതിനു ശേഷമുള്ളവയും ഇൻസ്റ്റോൾ ചെയ്തിട്ടുള്ള ദൃശ്യരൂപങ്ങൾ സ്വതേ സജ്ജമാക്കുന്നില്ല ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery ദൃശ്യരൂപം ഓട്ടോഡിസ്കവറി സഹായം] കാണുക). ഇൻസ്റ്റോൾ ചെയ്തിട്ടുള്ള ദൃശ്യരൂപങ്ങൾ സജ്ജമാക്കുന്നതിനായി ഇനിക്കൊടുക്കുന്ന വരികൾ <code>LocalSettings.php</code> എന്നതിലോട്ട് പകർത്തുക:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code> താളിൽ മാറ്റം വരുത്തിയതേയുള്ളുവെങ്കിൽ:\n: ദൃശ്യരൂപങ്ങളുടെ പേരിൽ അക്ഷരപിശകുകളുണ്ടോയെന്ന് ആവർത്തിച്ച് പരിശോധിക്കുക.",
+       "default-skin-not-found-no-skins": "അയ്യോ! <code dir=\"ltr\"> $wgDefaultSkin</code> നിർവചിക്കപ്പെട്ടതുപ്രകാരമുള്ള താങ്കളുടെ വിക്കിയുടെ സ്വതേയുള്ള ദൃശ്യരൂപമായ <code>$1</code>, ലഭ്യമല്ല.\n\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:* താങ്കളുടെ മീഡിയവിക്കി ഇൻസ്റ്റലേഷന്റെ <code dir=\"ltr\">skins/</code> ഡയറക്ടറിയിലേക്ക് ഗിറ്റ് ഉപയോഗിച്ച് <code>mediawiki/skins/*</code> റെപ്പോസിറ്ററികളിലൊന്ന് ക്ലോൺ ചെയ്യുക.\n: താങ്കളൊരു മീഡിയവിക്കി ഡവലപ്പറാണെങ്കിൽ ഇത് താങ്കളുടെ ഗിറ്റ് ഡെപ്പോസിറ്ററിയെ ബാധിക്കുന്നതല്ല. ദൃശ്യരൂപങ്ങൾ എങ്ങനെ ക്രമീകരിക്കാം എന്നും സ്വതേ വേണ്ടത് എങ്ങനെ സജ്ജമാക്കാം എന്നും [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 ('''സജ്ജമല്ല''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''സജ്ജമല്ല''')",
+       "mediastatistics": "മീഡിയ സ്ഥിതിവിവരക്കണക്കുകൾ",
+       "mediastatistics-summary": "അപ്‌ലോഡ് ചെയ്തിട്ടുള്ള പ്രമാണ തരങ്ങളെക്കുറിച്ചുള്ള സ്ഥിതിവിവരക്കണക്കുകൾ. ഇത് പ്രമാണത്തിന്റെ ഏറ്റവും പുതിയ പതിപ്പ് മാത്രമേ ഉൾക്കൊള്ളുന്നുള്ളു. പഴയ അഥവാ മായ്ക്കപ്പെട്ട പ്രമാണപതിപ്പുകൾ ഉൾക്കൊള്ളുന്നില്ല.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|ഒരു ബൈറ്റ്|$1 ബൈറ്റ്}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "മൈം(MIME) തരം",
+       "mediastatistics-table-extensions": "സാദ്ധ്യതയുള്ള എക്സ്റ്റെൻഷനുകൾ",
+       "mediastatistics-table-count": "പ്രമാണങ്ങളുടെ എണ്ണം",
+       "mediastatistics-table-totalbytes": "ആകെ വലിപ്പം",
+       "mediastatistics-header-unknown": "അജ്ഞാതം",
+       "mediastatistics-header-bitmap": "ബിറ്റ്മാപ് ചിത്രങ്ങൾ",
+       "mediastatistics-header-drawing": "വരകൾ (വെക്റ്റർ ചിത്രങ്ങൾ)",
+       "mediastatistics-header-audio": "ശബ്ദം",
+       "mediastatistics-header-video": "ചലച്ചിത്രങ്ങൾ",
+       "mediastatistics-header-multimedia": "റിച്ച് മീഡിയ",
+       "mediastatistics-header-office": "ആപ്പീസ്",
+       "mediastatistics-header-text": "എഴുത്ത്",
+       "mediastatistics-header-executable": "എക്സിക്യൂട്ടബിളുകൾ",
+       "mediastatistics-header-archive": "ചുരുക്കിയ ഫയൽതരങ്ങൾ",
+       "json-warn-trailing-comma": "ജെസണിൽ നിന്നും $1 എന്നതിന്റെ പിന്നാലെയുള്ള {{PLURAL:$1|കോമ|കോമകൾ}} നീക്കി",
+       "json-error-unknown": "ജെസണിൽ ഒരു പ്രശ്നമുണ്ടായി. പിഴവ്: $1",
+       "json-error-depth": "സ്റ്റാക്കിന്റെ പരമാവധി ആഴം അധികരിച്ചിരിക്കുന്നു",
+       "json-error-state-mismatch": "അസാധുവായ അല്ലെങ്കിൽ തെറ്റായവിധത്തിലുള്ള ജെസൺ",
+       "json-error-ctrl-char": "കണ്ട്രോൾ കാരക്ടർ പിഴവ്, മിക്കവാറും തെറ്റായി എൻകോഡ് ചെയ്യപ്പെട്ടത്",
+       "json-error-syntax": "എഴുത്തുരീതിയിൽ പിഴവ്",
+       "json-error-utf8": "തെറ്റായരൂപത്തിലുള്ള UTF-8 അക്ഷരങ്ങൾ, മിക്കവാറും തെറ്റായി എൻകോഡ് ചെയ്യപ്പെട്ടവ"
 }
index 195552a..adf133c 100644 (file)
        "hidetoc": "хумих",
        "collapsible-collapse": "хумих",
        "collapsible-expand": "дэлгэх",
+       "confirmable-confirm": "{{GENDER:$1|Та}} итгэлтэй байна уу?",
+       "confirmable-yes": "Тийм",
+       "confirmable-no": "Үгүй",
        "thisisdeleted": "$1-г харах эсвэл сэргээх үү?",
        "viewdeleted": "$1-г харах уу?",
        "restorelink": "{{PLURAL:$1|арилгасан засвар|арилгасан $1 засварууд}}",
        "passwordreset-emailsent-capture": "Доор харуулснаар цахим шуудангийн сануулгыг явууллаа.",
        "passwordreset-emailerror-capture": "Цахим шуудангийн сануулга доор харуулсны дагуу хийгдсан боловч $1 хэрэглэгчид хүрч чадсангүй, алдаа гарлаа.",
        "changeemail": "Цахим шуудангийн хаяг солих",
-       "changeemail-header": "Цахим шуудангийн бүртгэлийн хаяг солих",
        "changeemail-text": "Энэ маягтийг бөглөж цахим шуудангийн хаягаа солино уу. Өөрчлөлт хийхийн тулд нууц үгээ оруулна уу.",
        "changeemail-no-info": "Энэ хуудсыг үзэхэд хэрэглэгчийн нэрээр орсон байх шаардлагатай.",
        "changeemail-oldemail": "Одоогийн цахим шуудан:",
        "changeemail-none": "(байхгүй)",
        "changeemail-password": "{{SITENAME}} дахь таны нууц үг:",
        "changeemail-submit": "Цахим шуудан солих",
-       "changeemail-cancel": "Цуцал",
        "bold_sample": "Тодруулсан бичиг",
        "bold_tip": "Тодруулсан бичиг",
        "italic_sample": "Налуу бичиг",
        "searchrelated": "холбоотой",
        "searchall": "бүгдийг",
        "showingresults": "Доор #'''$2'''-с эхлэсэн '''$1''' илэрцийг үзүүлж байна.",
-       "showingresultsheader": "'''$4''' хайлтын {{PLURAL:$5|'''$3'''-н '''$1''' үр дүн|'''$3'''-н '''$1 - $2''' үр дүн}}",
        "search-nonefound": "Хайлтад таарсан үр дүн илэрсэнгүй.",
        "powersearch-legend": "Сонгосон хайлт",
        "powersearch-ns": "Дараах нэрний зайнуудад хайх:",
        "preferences": "Хэрэглэгчийн тохиргоо",
        "mypreferences": "Миний тохиргоо",
        "prefs-edits": "Засваруудын тоо:",
+       "prefsnologintext2": "Өөрийн тохиргоогоо өөрчлөхийн тулд логин хийнэ үү.",
        "prefs-skin": "Арьс",
        "skin-preview": "Урьдчилж харах",
        "datedefault": "Анхны байдал",
        "unusedtemplateswlh": "бусад холбоосууд",
        "randompage": "Санамсаргүй хуудас",
        "randompage-nopages": "Дараах {{PLURAL:$2|нэрний зайнд|нэрний зайнд}} хуудас байхгүй байна : $1. \\",
+       "randomincategory-category": "Ангилал:",
+       "randomincategory-legend": "Ангилалд багтсан дурын хуудас",
        "randomredirect": "Санамсаргүй чиглүүлэгч",
        "randomredirect-nopages": "\"$1\" нэрний зайд чиглүүлэгч байхгүй байна.",
        "statistics": "Статистик мэдээлэл",
        "suppress": "Хянан зохицуулагч",
        "booksources": "Номон эх сурвалжууд",
        "booksources-search-legend": "Номын эх сурвалж хайх",
-       "booksources-go": "Үзэх",
        "booksources-text": "Доорх нь шинэ, хуучин ном зардаг өөр сайт руу очих холбоосуудын жагсаалт бөгөөд таны хайж буй номнуудын тухай дэлгэрэнгүй мэдээлэл байх магадлалтай:",
        "booksources-invalid-isbn": "Өгөгдсөн ISBN хүчингүй юм шиг байна; эх сурвалжаас зөв хуулсан эсэхээ шалгана уу.",
        "specialloguserlabel": "Гүйцэтгэсэн:",
        "wlheader-enotif": "И-мэйл мэдэгдэл хүчинтэй боллоо.",
        "wlheader-showupdated": "Таны хамгийн сүүлд айлчилснаас хойш өөрчлөгдсөн хуудсууд '''тодоор''' бичигдсэн байгаа",
        "wlnote": "Энд нь {{PLURAL:$2|цагийн|'''$2''' цагийн}} өмнө хамгийн сүүлд хийсэн {{PLURAL:$1|өөрчлөлт| '''$1''' өөрчлөлтүүд}} байна.",
-       "wlshowlast": "Сүүлийн $1 цагийн $2 өдрийн $3-г харуул",
+       "wlshowlast": "Сүүлийн $1 цагийн $2 өдрийн -г харуул",
        "watchlist-options": "Хянаж буй хуудсуудын жагсаалтны сонголтууд",
        "watching": "Хянаж байна...",
        "unwatching": "Хянахаа больж байна...",
        "delete-edit-reasonlist": "Устгах шалтгаануудыг засварлах",
        "delete-toobig": "Уг хуудасны засварын түүх маш их, $1 {{PLURAL:$1|засвар|гаруй засвартай}} байна.\n{{SITENAME}}-н аюулгүй байдлын үүднээс дээрх хуудсыг устгахыг хорьсон байна.",
        "delete-warning-toobig": "Энэ хуудасны засварын түүх маш том байгаа бөгөөд {{PLURAL:$1| гаруй засвар| гаруй засварууд}} байна.\nУстгавал {{SITENAME}}-н мэдээллийн сангийн үйл ажиллагаанд нөлөөлж магадгүй тул та анхаарна уу.",
+       "deleteprotected": "Энэ хуудас хамгаалалттай тул устгаж болохгүй.",
        "rollback": "Засваруудыг буцаах",
        "rollback_short": "Буцаах",
        "rollbacklink": "буцаах",
        "whatlinkshere-filters": "Шүүлтүүрүүд",
        "block": "Хэрэглэгчийг блок хийх",
        "unblock": "Хэрэглэгчийг блокоос гаргах",
-       "blockip": "Хэрэглэгчийг түгжих",
+       "blockip": "{{GENDER:$1|хэрэглэгчийн}} түгжих",
        "blockip-legend": "Хэрэглэгчийг түгжих",
        "blockiptext": "Доорх маягтыг ашиглан тодорхой IP хаяг эсвэл хэрэглэгчийн нэрийг засвар хийхээс түгжинэ үү.\nЭнэ нь зөвхөн вандализм үйлдэх явдлаас сэргийлэхийн тулд, [[{{MediaWiki:Policy-url}}|бодлого, баримтлалын]] дагуу хийгдэх ёстой.\nДоор тодорхой шалтгаанаа бичнэ үү.",
        "ipaddressorusername": "IP хаяг буюу хэрэглэгчийн нэр",
        "ipb-unblock-addr": "$1-н түгжээг тайлах",
        "ipb-unblock": "Хэрэглэгчийн нэр эсвэл IP хаягийн түгжээг тайлах",
        "ipb-blocklist": "Байгаа түгжээнүүдийг харах",
-       "ipb-blocklist-contribs": "$1-н хувь нэмэр",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}}-н хувь нэмэр",
        "unblockip": "Хэрэглэгчийг идэвхижүүлэх",
        "unblockiptext": "Өмнө нь хориг тавьсан интернет хаяг юм уу хэрэглэгчийн бичих эрхийг сэргээхийн тулд дорх маягтыг ашигла.",
        "ipusubmit": "Энэ түгжээг цуцлах",
        "import": "Хуудаснуудыг импортлох",
        "importinterwiki": "Транс-викигийн импорт",
        "import-interwiki-text": "Импортлох вики болон хуудасны нэрийг сонгоно уу.\nЗасварын огноонууд болон засварлагчдын нэрс хэвээр үлдэнэ.\n[[Special:Log/import|Импортын логоос]] бүх транс-викигийн үйлдлүүд жагсаагдсан байгаа.",
-       "import-interwiki-source": "Эх үүсвэр вики/хуудас:",
+       "import-interwiki-sourcewiki": "wiki -ын эх сурвалж:",
+       "import-interwiki-sourcepage": "Эх хуудас:",
        "import-interwiki-history": "Энэ хуудсын бүх хувилбаруудын түүхийг хуулах",
        "import-interwiki-templates": "Бүх загварыг оруулах",
        "import-interwiki-submit": "Импортлох",
        "exif-iimcategory-spo": "Спорт",
        "exif-iimcategory-war": "Дайн, мөргөлдөөн ба үймээн самуун",
        "exif-iimcategory-wea": "Цаг агаар",
-       "watchlistall2": "бүгдийг",
        "namespacesall": "бүгдийг",
        "monthsall": "бүх сар",
        "confirmemail": "Мэйл хаягийг баталгаажуулах",
        "logentry-rights-rights-legacy": "$1 $3 дэхь грүпийн гишүүнчлэлээ сольсон",
        "logentry-rights-autopromote": "$1 $4 аас $5 руу автоматаар дэвшигдлээ",
        "rightsnone": "(байхгүй)",
+       "revdelete-summary": "засварын товч агуулга",
        "feedback-cancel": "Болих",
        "feedback-close": "Болсон",
        "searchsuggest-search": "Хайх",
index 942ddb7..4b79c23 100644 (file)
        "passwordreset-emailsent-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात आले आहे जे खाली दर्शविण्यात आले आहे.",
        "passwordreset-emailerror-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र निर्माण करण्यात आले, जे खाली दर्शविण्यात आले आहे.परंतु,{{GENDER:$2|सदस्य}}ला पाठविणे असफल झाले: $1",
        "changeemail": "ई-मेल पत्ता बदला",
-       "changeemail-header": "आपल्या खात्याचा ईमेल पत्ता बदला.",
        "changeemail-text": "आपला ई-मेल पत्त बदलण्यासाठी हे आवेदनपत्र भरा. या बदलाची पुष्टी करण्यासाठी तुम्हाला तुमचा परवलीचा शब्द टाकावा लागेल.",
        "changeemail-no-info": "हे पान थेट बघण्यासठी तुम्हाला सनोंद-प्रवेशित असावे लागेल.",
        "changeemail-oldemail": "सध्याचा ईमेल पत्ता :",
        "changeemail-none": "(काहीही नाही)",
        "changeemail-password": "तुमचा {{SITENAME}} संकेतांक:",
        "changeemail-submit": "ईमेल बदला",
-       "changeemail-cancel": "रद्द करा",
        "changeemail-throttled": "तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
        "resettokens": "ओळखचिन्ह(टोकन) पुनर्स्थापित करा",
        "resettokens-text": "येथे आपल्या खात्यात असलेला व्यक्तिगत मजकूरापर्यंत पोचण्यासाठी आपण ओळखचिन्ह(टोकन) पुनर्स्थापित करू शकता.\nआपण जर तो अपघाताने कोणासमवेत सहभागीला असेल किंवा आपले खात्याची आपण तडजोड केली असल्यास, हे करावयास हवे.",
        "searchall": "सर्व",
        "showingresults": "#'''$2'''पासून {{PLURAL:$1|'''1'''पर्यंतचा निकाल|'''$1'''पर्यंतचे निकाल}} खाली दाखवले आहे.",
        "showingresultsinrange": "खाली #<strong>$2</strong> ते #<strong>$3</strong> पर्यंतच्या कक्षेतील {{PLURAL:$1|<strong>१</strong> निकाल दाखविला आहे|<strong>$1</strong> निकाल दाखविले आहेत}}.",
-       "showingresultsheader": "'''$4''' साठी {{PLURAL:$5|'''$3'''पैकी '''$1''' निकाल|'''$3''' पैकी '''$1 - $2''' निकाल}}",
        "search-nonefound": "दिलेल्या पृच्छेशी जुळणारे निकाल नाहीत.",
        "powersearch-legend": "प्रगत शोध",
        "powersearch-ns": "नामविश्वांमध्ये शोधा:",
        "randomincategory": "वर्गातील अनियत पान",
        "randomincategory-invalidcategory": "\"$1\" हे अधिकृत वर्गाचे नाव नाही.",
        "randomincategory-nopages": "[[:Category:$1]] यात काहीच पाने नाहीत.",
-       "randomincategory-selectcategory": "वर्ग: $1 $2 मधून अनियत पान उपलब्ध करा.",
-       "randomincategory-selectcategory-submit": "जा",
        "randomredirect": "अविशिष्ट पुनर्निर्देशन",
        "randomredirect-nopages": "$1 या नामविश्वात कोणतीही पुर्ननिर्देशने नाहीत.",
        "statistics": "सांख्यिकी",
        "querypage-disabled": "हे विषेश पान कार्यमापन (performance) करणांमुळे प्रतिबंधित करण्यात आले आहे.",
        "booksources": "पुस्तक स्रोत",
        "booksources-search-legend": "पुस्तक स्रोत शोधा",
-       "booksources-go": "चला",
        "booksources-text": "खालील यादीत नवी आणिजुनी पुस्तके विकणाऱ्या संकेतस्थळाचे दुवे आहेत,आणि त्यात कदाचित आपण शोधू पहात असलेल्या पुस्तकाची अधिक माहिती असेल:",
        "booksources-invalid-isbn": "दिलेला आयएसबीएन वैध नाही; मूळ स्रोतातून उतरवताना झालेल्या चुकांचे निरसन करा.",
        "specialloguserlabel": "कार्यकर्ता:",
        "wlheader-enotif": "विपत्र अधिसूचना सुविधा शक्य केली.",
        "wlheader-showupdated": "ती पाने, जी आपण दिलेल्या शेवटच्या भेटीनंतर बदललेली आहेत, '''ठळक''' दाखवली आहेत.",
        "wlnote": "खाली $3, $4 पर्यंतचे गेल्या {{PLURAL:$2| '''१''' तासातील|'''$2''' तासातील}} {{PLURAL:$1|शेवटचा बदल दिला आहे|शेवटाचे '''$1'''बदल दिले आहेत}}.",
-       "wlshowlast": "मागील $1 तास $2 दिवस $3 पहा",
+       "wlshowlast": "मागील $1 तास $2 दिवस  पहा",
        "watchlist-options": "पहाऱ्याच्या सूचीचे पर्याय",
        "watching": "पहारा देत आहे...",
        "unwatching": "पहारा काढत आहे...",
        "import": "पाने आयात करा",
        "importinterwiki": "आंतरविकि आयात",
        "import-interwiki-text": "आयात करण्याकरिता एक विकि आणि पानाचा मथळा निवडा.\nआवर्तनांच्या तारखा आणि संपादकांची नावे जतन केली जातील.\nसर्व आंतरविकि आयात क्रिया [[Special:Log/import|आयात नोंदीत]] दाखल केल्या आहेत.",
-       "import-interwiki-source": "स्रोत विकी / पान:",
        "import-interwiki-history": "या पानाकरिताची साऱ्या इतिहास आवर्तनांची नक्कल करा",
        "import-interwiki-templates": "साचे आंतरभूत करा",
        "import-interwiki-submit": "आयात",
        "exif-aperturevalue": "रन्ध्र",
        "exif-brightnessvalue": "झळाळी",
        "exif-exposurebiasvalue": "प्रभावन अभिनत (एक्सपोजर बायस)",
-       "exif-maxaperturevalue": "महतà¥\8dतम à¤\9cमिनà¥\80 à¤°à¤¨à¥\8dधà¥\8dर(लà¥\85à¤\82ड ऍपर्चर)",
+       "exif-maxaperturevalue": "महतà¥\8dतम à¤\9cमिनà¥\80 à¤°à¤¨à¥\8dधà¥\8dर(लà¤\81ड ऍपर्चर)",
        "exif-subjectdistance": "गोष्टीपासूनचे अंतर",
        "exif-meteringmode": "मीटरींग मोड",
        "exif-lightsource": "प्रकाश स्रोत",
        "exif-exposureprogram-5": "क्रियेटीव्ह कार्यक्रम(विषयाच्या खोलीस बायस्ड)",
        "exif-exposureprogram-6": "कृती कार्यक्रम(द्रूत आवर्तद्वार(शटर) वेग कडे बायस्ड)",
        "exif-exposureprogram-7": "व्यक्तिचित्र स्थिती(क्लोजप छायाचित्रांकरिता आऊट ऑफ फोकस बॅकग्राऊंड सहीत)",
-       "exif-exposureprogram-8": "लà¥\85à¤\82डसà¥\8dà¤\95à¥\87प à¤¸à¥\8dथितà¥\80 (लà¥\85à¤\82डस्केप छायाचित्रांकरिता बॅकग्राऊंड इन फोकस सहीत)",
+       "exif-exposureprogram-8": "लà¤\81डसà¥\8dà¤\95à¥\87प à¤¸à¥\8dथितà¥\80 (लà¤\81डस्केप छायाचित्रांकरिता बॅकग्राऊंड इन फोकस सहीत)",
        "exif-subjectdistance-value": "$1 मीटर",
        "exif-meteringmode-0": "अज्ञात",
        "exif-meteringmode-1": "सरासरी",
        "exif-urgency-low": "नीचतम ($1)",
        "exif-urgency-high": "उच्चतम ($1)",
        "exif-urgency-other": "($1) उपयोगकर्ता-निश्चित  प्राधान्य",
-       "watchlistall2": "सर्व",
        "namespacesall": "सर्व",
        "monthsall": "सर्व",
        "confirmemail": "ई-मेल पत्ता पडताळून पहा",
        "version-variables": "चल",
        "version-antispam": "उत्पात प्रतिबंधन",
        "version-other": "इतर",
-       "version-mediahandlers": "मिडिया à¤¹à¥\85à¤\82डलर",
+       "version-mediahandlers": "मिडिया à¤¹à¤\81डलर",
        "version-hooks": "अंकुश",
        "version-parser-extensiontags": "पृथकक विस्तारीत खूणा",
        "version-parser-function-hooks": "पृथकक कार्य अंकुश",
        "logentry-rights-rights-legacy": "$1 ने $3 साठी गट सदस्यता {{GENDER:$2|बदलली}}",
        "logentry-rights-autopromote": "$1 ला स्वयंचलितरित्या $4 वरुन $5 ला {{GENDER:$2|बढती दिल्या गेली}}",
        "rightsnone": "(काहीही नाही)",
+       "revdelete-summary": "संपादन माहिती",
        "feedback-bugornote": "जर आपण तांत्रिक प्रश्न  विस्तृतपणे मांडण्यास तयार असाल तर कृपया [$1 गणकदोष वृतांत] पाठवा. नपेक्षा, खाली देण्यात आलेले सोपे आवेदनपत्र वापरा. आपली टिप्पणी \"[$3 $2]\" या पानास आपले सदस्यनाव व आपण कोणता ब्राउजर वापरता यासह जोडण्यात येईल.",
        "feedback-subject": "विषय:",
        "feedback-message": "संदेश:",
index 5d4677f..88f899c 100644 (file)
@@ -22,8 +22,8 @@
                ]
        },
        "tog-underline": "Garis bawah pautan:",
-       "tog-hideminor": "Sembunyikan suntingan kecil dalam perubahan terkini",
-       "tog-hidepatrolled": "Sorokkan suntingan yang telah dironda daripada perubahan terkini",
+       "tog-hideminor": "Sembunyikan suntingan kecil daripada perubahan terkini",
+       "tog-hidepatrolled": "Sembunyikan suntingan yang telah dironda daripada perubahan terkini",
        "tog-newpageshidepatrolled": "Sorokkan laman yang telah dironda daripada senarai laman baru",
        "tog-extendwatchlist": "Kembangkan senarai pantau untuk memaparkan semua perubahan, bukan hanya yang terkini",
        "tog-usenewrc": "Kumpulkan perubahan mengikut laman dalam perubahan terkini dan senarai pantau",
        "tog-showtoolbar": "Tunjukkan palang alat sunting",
        "tog-editondblclick": "Dwiklik untuk menyunting laman",
        "tog-editsectiononrightclick": "Bolehkan penyuntingan bahagian dengan mengklik kanan pada tajuk bahagian",
-       "tog-watchcreations": "Tambahkan laman-laman yang saya mencipta dan fail-fail yang saya memuat naik ke dalam senarai pantau saya",
-       "tog-watchdefault": "Tambahkan laman-laman dan fail-fail yang saya menyunting ke dalam senarai pantau saya",
-       "tog-watchmoves": "Tambahkan laman-laman dan fail-fail yang saya memindah ke dalam senarai pantau saya",
-       "tog-watchdeletion": "Tambahkan laman-laman dan fail-fail yang saya menghapus ke dalam senarai pantau saya",
-       "tog-watchrollback": "Tambahkan laman-laman di mana saya telah membuat unduran ke senarai pantau saya",
-       "tog-minordefault": "Tandakan semua suntingan sebagai kecil secara asli",
+       "tog-watchcreations": "Tambahkan laman-laman yang saya cipta dan fail-fail yang saya muat naik ke dalam senarai pantau saya",
+       "tog-watchdefault": "Tambahkan laman-laman dan fail-fail yang saya sunting ke dalam senarai pantau saya",
+       "tog-watchmoves": "Tambahkan laman-laman dan fail-fail yang saya pindah ke dalam senarai pantau saya",
+       "tog-watchdeletion": "Tambahkan laman-laman dan fail-fail yang saya hapuskan ke dalam senarai pantau saya",
+       "tog-watchrollback": "Tambahkan laman-laman yang saya undurkan ke dalam senarai pantau saya",
+       "tog-minordefault": "Tandakan semua suntingan sebagai kecil secara lalai",
        "tog-previewontop": "Tunjukkan pralihat di atas kotak sunting",
        "tog-previewonfirst": "Tunjukkan pralihat pada suntingan pertama",
-       "tog-enotifwatchlistpages": "E-melkan saya apabila sebuah laman atau fail dalam senarai pantau saya telah diubahkan",
-       "tog-enotifusertalkpages": "E-melkan saya apabila laman perbincangan saya telah diubahkan",
+       "tog-enotifwatchlistpages": "E-melkan saya apabila sebuah laman atau fail dalam senarai pantau saya diubah",
+       "tog-enotifusertalkpages": "E-melkan saya apabila laman perbincangan saya diubah",
        "tog-enotifminoredits": "Juga e-melkan saya untuk suntingan-suntingan laman dan fail yang kecil",
        "tog-enotifrevealaddr": "Serlahkan alamat e-mel saya dalam e-mel pemberitahuan",
        "tog-shownumberswatching": "Tunjukkan bilangan pemantau",
-       "tog-oldsig": "Tandatangan yang sedia ada:",
+       "tog-oldsig": "Tanda tangan yang sedia ada:",
        "tog-fancysig": "Anggap tandatangan sebagai teks wiki (tanpa pautan automatik)",
        "tog-uselivepreview": "Gunakan pralihat langsung (dalam percubaan)",
        "tog-forceeditsummary": "Tanya saya jika ringkasan suntingan kosong",
        "tog-watchlisthideown": "Sembunyikan suntingan saya daripada senarai pantau",
        "tog-watchlisthidebots": "Sembunyikan suntingan bot daripada senarai pantau",
        "tog-watchlisthideminor": "Sembunyikan suntingan kecil daripada senarai pantau",
-       "tog-watchlisthideliu": "Sembunyikan suntingan oleh pengguna yang dilog masuk daripada senarai pantau",
+       "tog-watchlisthideliu": "Sembunyikan suntingan oleh pengguna yang telah log masuk daripada senarai pantau",
        "tog-watchlisthideanons": "Sembunyikan suntingan oleh pengguna tanpa nama daripada senarai pantau",
        "tog-watchlisthidepatrolled": "Sembunyikan suntingan yang telah dironda daripada senarai pantau",
        "tog-ccmeonemails": "Kirimkan saya salinan e-mel yang saya hantar kepada pengguna lain",
        "tog-diffonly": "Jangan tunjukkan kandungan laman di bawah perbezaan",
        "tog-showhiddencats": "Tunjukkan kategori tersembunyi",
        "tog-norollbackdiff": "Abaikan perbezaan selepas melakukan pengunduran suntingan.",
-       "tog-useeditwarning": "Beri saya amaran apabila saya meninggalkan sesebuah laman penyuntingan tanpa menyimpan perubahan.",
+       "tog-useeditwarning": "Berikan saya amaran apabila saya meninggalkan sesebuah laman penyuntingan tanpa menyimpan perubahan",
        "tog-prefershttps": "Sentiasa gunakan sambungan terlindung apabila log masuk",
        "underline-always": "Sentiasa",
        "underline-never": "Jangan",
        "otherlanguages": "Dalam bahasa lain",
        "redirectedfrom": "(Dilencongkan dari $1)",
        "redirectpagesub": "Laman lencongan",
+       "redirectto": "Lencong ke:",
        "lastmodifiedat": "Laman ini diubah buat kali terakhir pada $2, $1.",
        "viewcount": "Laman ini telah dilihat {{PLURAL:$1|sekali|sebanyak $1 kali}}.",
        "protectedpage": "Laman dilindungi",
        "createaccount-text": "Seseorang telah membuka akaun untuk\nalamat e-mel anda di {{SITENAME}} ($4) dengan nama \"$2\" dan kata laluan \"$3\".\nAnda boleh log masuk dan tukar kata laluan anda sekarang.\n\nSila abaikan mesej ini jika anda tidak meminta untuk membuka akaun tersebut.",
        "login-throttled": "Anda telah mencuba log masuk berulang kali.\nSila tunggu $1 dan cuba lagi.",
        "login-abort-generic": "Log masuk anda tidak berjaya, dan terpaksa dibatalkan",
+       "login-migrated-generic": "Akaun anda telah dipindahkan dan nama pengguna anda tidak lagi wujud di wiki ini.",
        "loginlanguagelabel": "Bahasa: $1",
        "suspicious-userlogout": "Permintaan anda untuk log keluar ditolak kerana ia kelihatan seperti dihantar oleh pelayar rosak atau proksi pengagregatan.",
        "createacct-another-realname-tip": "Nama sebenar adalah tidak wajib.\nJika anda memilih untuk menyatakannya, ini akan digunakan untuk memberikan atribusi kepada pengguna atas sumbangan mereka.",
        "passwordreset-emailsent-capture": "E-mel set semula kata laluan telah dihantar, seperti yang dipaparkan di bawah.",
        "passwordreset-emailerror-capture": "E-mel set semula kata laluan telah dihasilkan, seperti yang dipaparkan di bawah, tetapi tidak berjaya dihantar kepada {{GENDER:$2|pengguna}} berkenaan: $1",
        "changeemail": "Tukar alamat e-mel",
-       "changeemail-header": "Tukar alamat e-mel akaun",
        "changeemail-text": "Lengkapkan borang ini untuk menukar alamat e-mel anda. Anda akan perlu mengisikan kata laluan untuk mengesahkan perubahan ini.",
        "changeemail-no-info": "Anda hendaklah log masuk terlebih dahulu untuk mencapai laman ini secara terus.",
        "changeemail-oldemail": "Alamat e-mel sekarang:",
        "changeemail-none": "(tiada)",
        "changeemail-password": "Kata laluan anda di {{SITENAME}}:",
        "changeemail-submit": "Tukar E-mel",
-       "changeemail-cancel": "Batalkan",
        "changeemail-throttled": "Anda telah melakukan terlalu banyak cubaan log masuk.\nSila tunggu $1 dan cuba lagi.",
        "resettokens": "Set semula token",
        "resettokens-text": "Anda boleh mengeset semula token yang membolehkan akses kepada data peribadi tertentu yang berkaitan dengan akaun anda di sini.\n\nAnda harus melakukannya jika anda tanpa sengaja mengongsinya dengan sesiapa ataupun akaun anda telah dikompromi.",
        "showpreview": "Paparkan pralihat",
        "showdiff": "Lihat perubahan",
        "blankarticle": "<strong>Amaran:</strong> Laman yang anda sedang menciptakan adalah kosong.\nJika akan menklik \"{{int:savearticle}}\" sekali lagi, laman ini akan diciptakan tanpa sebarang kandungan.",
-       "anoneditwarning": "'''Amaran:''' Anda tidak log masuk. Alamat IP anda akan direkodkan dalam sejarah suntingan laman ini.",
+       "anoneditwarning": "<strong>Amaran:</strong> Anda tidak log masuk. Alamat IP anda akan disiarkan kepada umum jika anda membuat sebarang suntingan. Jika anda <strong>[$1 log masuk]</strong> atau <strong>[$2 membuka akaun]</strong>, suntingan anda akan diatribusikan kepada nama pengguna anda di samping manfaat-manfaat lain.",
        "anonpreviewwarning": "''Anda belum log masuk. Jika anda menyimpan laman ini, alamat IP anda akan direkodkan dalam sejarah penyuntingan laman ini.''",
        "missingsummary": "'''Peringatan:''' Anda tidak menyatakan ringkasan suntingan. Klik '''Simpan''' sekali lagi untuk menyimpan suntingan ini tanpa ringkasan.",
        "missingcommenttext": "Sila masukkan komen dalam ruangan di bawah.",
        "searchall": "semua",
        "showingresults": "Yang berikut ialah '''$1''' hasil bermula daripada yang {{PLURAL:$2|pertama|ke-'''$2'''}}.",
        "showingresultsinrange": "Yang berikut adalah {{PLURAL:$1|<strong>satu</strong> hasil|sebanyak <strong>$1</strong> hasil}} dalam julat #<strong>$2</strong> hingga #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Keputusan '''$1''' daripada '''$3'''|Keputusan '''$1 - $2''' daripada '''$3'''}} untuk '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Hasil <strong>$1</strong> / <strong>$3</strong>|Hasil <strong>$1 - $2</strong> / <strong>$3</strong>}}",
        "search-nonefound": "Tiada hasil yang sepadan dengan pertanyaan.",
        "powersearch-legend": "Carian lanjutan",
        "powersearch-ns": "Cari dalam ruang nama:",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Beza",
        "prefs-help-prefershttps": "Keutamaan inu akan berkuatkuasa pada lain kali anda log masuk.",
+       "prefswarning-warning": "Anda telah mengubah suai keutamaan anda yang belum disimpan.\nJika anda meninggalkan laman ini tanpa mengklik \"$1\", keutamaan anda tidak akan disimpan.",
        "prefs-tabs-navigation-hint": "Petua: Anda boleh menggunakan kekunci anak panah kiri atau kanan untuk beralihan dari tab ke tab pada senarai tab.",
        "email-address-validity-valid": "Alamat e-mel adalah sah",
        "email-address-validity-invalid": "Sila masukkan alamat e-mel yang sah",
        "randomincategory": "Laman rawak dalam kategori",
        "randomincategory-invalidcategory": "\"$1\" bukan nama kategori yang sah.",
        "randomincategory-nopages": "Tiada halaman di [[:Category:$1]].",
-       "randomincategory-selectcategory": "Dapatkan halaman pilihan rawak dari kategori: $1 $2.",
-       "randomincategory-selectcategory-submit": "Pergi",
+       "randomincategory-category": "Kategori:",
+       "randomincategory-legend": "Laman rawak dalam kategori",
        "randomredirect": "Lencongan rawak",
        "randomredirect-nopages": "Tiada lencongan dalam ruang nama \"$1\".",
        "statistics": "Statistik",
        "querypage-disabled": "Laman khas ini dilumpuhkan atas sebab-sebab prestasi.",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Cari sumber buku",
-       "booksources-go": "Pergi",
+       "booksources-search": "Cari",
        "booksources-text": "Yang berikut ialah senarai pautan ke tapak web lain yang menjual buku baru dan terpakai,\nserta mungkin mempunyai maklumat lanjut mengenai buku yang anda cari:",
        "booksources-invalid-isbn": "ISBN yang dinyatakan tidak sah. Sila semak sekali lagi.",
        "specialloguserlabel": "Pelaku:",
        "watchlist-details": "$1 laman dipantau ,tidak termasuk laman perbincangan.",
        "wlheader-enotif": "Pemberitahuan melalui e-mel dibolehkan.",
        "wlheader-showupdated": "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.",
-       "wlnote": "Berikut adalah {{PLURAL:$1|perubahan|<strong>$1</strong> perubahan}} yang terkini dalam {{PLURAL:$2|sejam|<strong>$2</strong> jam}} yang lalu, tepat pada $3, $4.",
-       "wlshowlast": "Tunjukkan $1 jam / $2 hari yang lalu / $3.",
+       "wlnote": "Yang berikut ialah <strong>$1</strong> perubahan terakhir sejak $2 jam yang lalu, sehingga $3, $4.",
+       "wlshowlast": "Tunjukkan $2 hari $1 jam yang lalu",
        "watchlist-options": "Pilihan senarai pantau",
        "watching": "Memantau...",
        "unwatching": "Menyahpantau...",
        "exbeforeblank": "kandungan sebelum pengosongan ialah: '$1'",
        "delete-confirm": "Hapus \"$1\"",
        "delete-legend": "Hapuskan",
-       "historywarning": "'''Amaran:''' Laman yang ingin anda hapuskan mengandungi sejarah dengan kira-kira $1 {{PLURAL:$1|semakan|semakan}}:",
+       "historywarning": "<strong>Amaran:</strong> Laman yang ingin anda hapuskan mempunyai sejarah dengan $1 semakan:",
        "confirmdeletetext": "Anda sudah hendak menghapuskan sebuah laman berserta semua sejarahnya.\nSila sahkan bahawa anda memang hendak berbuat demikian, anda faham akan\nakibatnya, dan perbuatan anda mematuhi [[{{MediaWiki:Policy-url}}|dasar kami]].",
        "actioncomplete": "Tindakan berjaya",
        "actionfailed": "Tindakan gagal",
        "delete-edit-reasonlist": "Ubah sebab-sebab hapus",
        "delete-toobig": "Laman ini mempunyai sejarah yang besar, iaitu melebihi $1 jumlah semakan. Oleh itu, laman ini dilindungi daripada dihapuskan untuk mengelak kerosakan di {{SITENAME}} yang tidak disengajakan.",
        "delete-warning-toobig": "Laman ini mempunyai sejarah yang besar, iaitu melebihi $1 jumlah semakan. Menghapuskannya boleh mengganggu perjalanan pangkalan data {{SITENAME}}. Sila berhati-hati.",
-       "delete-cantedit": "Anda tidak boleh menghapuskan laman ini kerana anda tiada kebenaran untuk menyuntingkannya.",
+       "deleteprotected": "Anda tidak boleh menghapuskan laman ini kerana ia telah dilindungi.",
        "deleting-backlinks-warning": "'''Amaran:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Terdapat laman lain]] yang berpaut atau bertransklusi dengan laman yang hendak anda hapus ini.",
        "rollback": "Undurkan suntingan.",
        "rollback_short": "Undur",
        "protect-othertime": "Waktu lain:",
        "protect-othertime-op": "waktu lain",
        "protect-existing-expiry": "Waktu tamat yang telah ditetapkan: $2, $3",
+       "protect-existing-expiry-infinity": "Waktu tamat tempoh sedia ada: tidak terhingga",
        "protect-otherreason": "Sebab lain/tambahan:",
        "protect-otherreason-op": "Sebab lain",
        "protect-dropdown": "*Sebab lazim\n** Laku musnah berlebihan\n** Spam berlebihan\n** Perang sunting yang tidak membina\n** Laman yang terlalu ramai pelawat",
        "unblocked": "[[User:$1|$1]] telah dinyahsekat",
        "unblocked-range": "$1 telah dinyahsekat",
        "unblocked-id": "Sekatan $1 telah dibuang",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] telah dinyahsekat.",
        "blocklist": "Pengguna yang disekat",
        "ipblocklist": "Alamat IP dan nama pengguna yang disekat",
        "ipblocklist-legend": "Cari pengguna yang disekat",
        "import": "Import laman",
        "importinterwiki": "Import transwiki",
        "import-interwiki-text": "Sila pilih wiki dan tajuk laman yang ingin diimport.\nSemua tarikh semakan dan nama penyunting akan dikekalkan.\nSemua tindakan import transwiki dicatatkan dalam [[Special:Log/import|log import]].",
-       "import-interwiki-source": "Sumber wiki/halaman:",
+       "import-interwiki-sourcewiki": "Wiki sumber:",
+       "import-interwiki-sourcepage": "Laman sumber:",
        "import-interwiki-history": "Salin semua versi sejarah bagi laman ini",
        "import-interwiki-templates": "Sertakan semua templat",
        "import-interwiki-submit": "Import",
        "exif-urgency-low": "Rendah ($1)",
        "exif-urgency-high": "Tinggi ($1)",
        "exif-urgency-other": "Keutamaan tentuan pengguna ($1)",
-       "watchlistall2": "semua",
        "namespacesall": "semua",
        "monthsall": "semua",
        "confirmemail": "Sahkan alamat e-mel",
        "tags": "Label perubahan yang sah",
        "tag-filter": "Tapis [[Special:Tags|label]]:",
        "tag-filter-submit": "Tapis",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Teg}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|Label]]: $2)",
        "tags-title": "Label",
        "tags-intro": "Yang berikut ialah senarai label yang digunakan untuk menanda suntingan, berserta maknanya.",
        "tags-tag": "Nama label",
        "logentry-upload-overwrite": "$1 telah {{GENDER:$2|muat naik}} versi baru $3",
        "logentry-upload-revert": "$1 telah {{GENDER:$2|muat naik}} $3",
        "rightsnone": "(tiada)",
+       "revdelete-summary": "ringkasan",
        "feedback-bugornote": "Jika anda bersedia untuk menerangkan masalah teknikal secara terperinci, sila [$1 laporkan pepijat]. \nAtaupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dicatatkan pada laman \"[$3 $2]\", beserta nama pengguna anda dan pelayar yang anda gunakan.",
        "feedback-subject": "Perkara:",
        "feedback-message": "Pesanan:",
        "log-name-pagelang": "Log perubahan bahasa",
        "log-description-pagelang": "Ini adalah log untuk perubahan-perubahan bahasa laman.",
        "logentry-pagelang-pagelang": "$1 telah {{GENDER:$2|mengubahkan}} bahasa untuk laman $3 dari $4 ke $5.",
-       "default-skin-not-found": "Whoops! Rupa asli untuk wiki anda (<code>$wgDefaultSkin</code>), <code>$1</code>, tidak disediakan.\n\nPasangan anda kelihatan untuk mempunyai rupa-rupa berikut. Lihat [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] untuk maklumat cara membolehkan mereka dan memilih yang asli.\n\n$2\n\n; Jika anda baru sahaja memasang MediaWiki:\n: Anda kemungkinan memasang dari git, atau terus dari kod sumber melalui cara lain. Ini adalah dijangka. Cubalah memasang beberapa rupa dari [https://www.mediawiki.org/wiki/Category:All_skins panduan rupa mediawiki.org], dengan:\n:* Memuat turun [https://www.mediawiki.org/wiki/Download pemasang tarball] yang terlengkap dengan beberapa rupa dan sambungan. Anda boleh menyalin dan menampal direktori <code>skins/</code> terus darinya.\n:* Mengeklon salah satu repositori <code>mediawiki/skins/*</code> melalui git ke dalam direktori <code>skins/</code> pasangan MediaWiki anda.\n: Perbuatan ini tidak patut mengganggu repositori git anda jika anda seorang pembangun MediaWiki.\n\n; Jika anda baru sahaja menaik taraf MediaWiki:\n: MediaWiki 1.24 dan ke atas tidak lagi membolehkan rupa-rupa yang dipasang secara automatik (lihat [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual:Skin autodiscovery]). Anda boleh menampalkan baris-baris berikut ke dalam <code>LocalSettings.php</code> untuk membolehkan semua rupa yang semasa dipasang:\n\n<pre>$3</pre>\n\n; Jika anda baru sahaja mengubah <code>LocalSettings.php</code>:\n: Semakkan lagi nama-nama rupa untuk kesalahan ejaan.",
-       "default-skin-not-found-no-skins": "Whoops! Rupa asli untuk wiki anda (<code>$wgDefaultSkin</code>), <code>$1</code>, tidak disediakan.\n\nAnda tidak mempunyai rupa-rupa yang dipasang.\n\n; Jika anda baru sahaja memasang atau menaik taraf MediaWiki:\n: Anda kemungkinan memasang dari git, atau terus dari kod sumber melalui cara lain. Ini adalah dijangka. MediaWiki 1.24 dan ke atas tidak memasuki sebarang rupa dalam repositori utama. Cubalah memasang beberapa rupa dari [https://www.mediawiki.org/wiki/Category:All_skins panduan rupa mediawiki.org], dengan:\n:* Memuat turun [https://www.mediawiki.org/wiki/Download pemasang tarball] yang terlengkap dengan beberapa rupa dan sambungan. Anda boleh menyalin dan menampal direktori <code>skins/</code> terus darinya.\n:* Mengeklon salah satu repositori <code>mediawiki/skins/*</code> melalui git ke dalam direktori <code>skins/</code> pasangan MediaWiki anda.\n: Perbuatan ini tidak patut mengganggu repositori git anda jika anda seorang pembangun MediaWiki. Lihat [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] untuk maklumat cara membolehkan mereka dan memilih yang asli.",
+       "default-skin-not-found": "Whoops! Rupa asli untuk wiki anda yang tertakrif dalam <code dir=\"ltr\">$wgDefaultSkin</code> sebagai <code>$1</code>, tidak disediakan.\n\nPasangan anda kelihatan untuk mempunyai rupa-rupa berikut. Lihat [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] untuk maklumat cara membolehkan mereka dan memilih yang asli.\n\n$2\n\n; Jika anda baru sahaja memasang MediaWiki:\n: Anda kemungkinan memasang dari git, atau terus dari kod sumber melalui cara lain. Ini adalah dijangka. Cubalah memasang beberapa rupa dari [https://www.mediawiki.org/wiki/Category:All_skins panduan rupa mediawiki.org], dengan:\n:* Memuat turun [https://www.mediawiki.org/wiki/Download pemasang tarball] yang terlengkap dengan beberapa rupa dan sambungan. Anda boleh menyalin dan menampal direktori <code>skins/</code> terus darinya.\n:* Mengklonkan salah satu repositori <code>mediawiki/skins/*</code> melalui git ke dalam direktori <code dir=\"ltr\">skins/</code> pasangan MediaWiki anda.\n: Perbuatan ini tidak patut mengganggu repositori git anda jika anda seorang pembangun MediaWiki.\n\n; Jika anda baru sahaja menaik taraf MediaWiki:\n: MediaWiki 1.24 dan ke atas tidak lagi membolehkan rupa-rupa yang dipasang secara automatik (lihat [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual:Skin autodiscovery]). Anda boleh menampalkan baris-baris berikut ke dalam <code>LocalSettings.php</code> untuk membolehkan semua rupa yang semasa dipasang:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Jika anda baru sahaja mengubah <code>LocalSettings.php</code>:\n: Semakkan lagi nama-nama rupa untuk kesalahan ejaan.",
+       "default-skin-not-found-no-skins": "Whoops! Rupa asli untuk wiki anda yang tertakrif dalam <code dir=\"ltr\">$wgDefaultSkin</code> sebagai <code>$1</code>, tidak disediakan.\n\nAnda tidak mempunyai rupa-rupa yang dipasang.\n\n; Jika anda baru sahaja memasang atau menaik taraf MediaWiki:\n: Anda kemungkinan memasang dari git, atau terus dari kod sumber melalui cara lain. Ini adalah dijangka. MediaWiki 1.24 dan ke atas tidak memasuki sebarang rupa dalam repositori utama. Cubalah memasang beberapa rupa dari [https://www.mediawiki.org/wiki/Category:All_skins panduan rupa mediawiki.org], dengan:\n:* Memuat turun [https://www.mediawiki.org/wiki/Download pemasang tarball] yang terlengkap dengan beberapa rupa dan sambungan. Anda boleh menyalin dan menampal direktori <code>skins/</code> terus darinya.\n:* Mengeklon salah satu repositori <code>mediawiki/skins/*</code> melalui git ke dalam direktori <code dir=\"ltr\">skins/</code> pasangan MediaWiki anda.\n: Perbuatan ini tidak patut mengganggu repositori git anda jika anda seorang pembangun MediaWiki. Lihat [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] untuk maklumat cara membolehkan mereka dan memilih yang asli.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (dibolehkan)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''dimatikan''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''dimatikan''')",
+       "mediastatistics": "Statistik media",
+       "mediastatistics-summary": "Statistik mengenai jenis-jenis fail yang dimuat naik. Ini hanya mencakupi versi terbaru setiap fail. Versi-versi fail yang lama atau terpadam tidak disertakan.",
+       "mediastatistics-nbytes": "$1 bait ($2; $3%)",
+       "mediastatistics-table-mimetype": "Jenis MIME",
+       "mediastatistics-table-extensions": "Sambungan yang dibolehkan",
+       "mediastatistics-table-count": "Bilangan fail",
+       "mediastatistics-table-totalbytes": "Jumlah saiz",
+       "mediastatistics-header-unknown": "Tidak dikenali",
+       "mediastatistics-header-bitmap": "Gambar bitmap",
+       "mediastatistics-header-drawing": "Lukisan (gambar vektor)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-multimedia": "Media kaya",
+       "mediastatistics-header-office": "Office",
+       "mediastatistics-header-text": "Tekstual",
+       "mediastatistics-header-executable": "Fail boleh laksana",
+       "mediastatistics-header-archive": "Format mampat",
+       "json-warn-trailing-comma": "$1 koma pengekor telah digugurkan dari JSON",
+       "json-error-unknown": "Terdapat masalah dengan JSON. Ralat: $1",
+       "json-error-depth": "Kedalaman tindakan maksimum telah dicecah",
+       "json-error-state-mismatch": "JSON tidak sah atau cacat",
+       "json-error-ctrl-char": "Ralat aksara kawalan, mungkin salah dikodkan",
+       "json-error-syntax": "Ralat sintaks",
+       "json-error-utf8": "Aksara UTF-8 cacat, mungkin salah dikodkan"
 }
index 3983159..1a65990 100644 (file)
        "hidetoc": "aħbi",
        "collapsible-collapse": "Aħbi",
        "collapsible-expand": "Espandi",
+       "confirmable-confirm": "Inti{{GENDER:$1|żgur|żgura}}?",
+       "confirmable-yes": "Iva",
+       "confirmable-no": "Le",
        "thisisdeleted": "Uri jew ġib lura $1?",
        "viewdeleted": "Ara $1?",
        "restorelink": "{{PLURAL:$1|waħda mill-modifiki mħassra|$1 modifiki mħassra}}",
        "no-null-revision": "Ma setghitx tinħoloq reviżjoni nulla ġdida għall-paġna \"$1\"",
        "badtitle": "Titlu ħażin",
        "badtitletext": "It-titlu tal-paġna rikjesta huwa invalidu, vojt, jew ġej minn żball fil-ħolqa bejn siti wiki differenti jew verżjonijiet ta' lingwi differenti tal-istess sit. Jista' wkoll ikollu wieħed jew aktar karattri li ma jistgħux jintużaw għat-titli.",
-       "perfcached": "L-informazzjoni li jmiss huwa kopja ''cache'' u jista' ma jkunx aġġornat. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-       "perfcachedts": "Id-dati segwenti huma estratt ta' kopja cache tad-database. L-aħħar aġġornament: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "perfcached": "L-informazzjoni li jmiss ġejja minn kopja ''cache'' u tista' ma tkunx aġġornata. Massimu ta'  {{PLURAL:$1|riżultat wieħed hu|$1 riżultati huma}} disponibbli fil-\"cache\".",
+       "perfcachedts": "Id-dejta li jmiss ġejja minn kopja \"cache\" u l-aħħar aġġornament kien: $1. Mhux aktar minn {{PLURAL:$4|riżultat wieħed hu|$4 riżultati huma}} disponibbli fil-\"cache\".",
        "querypage-no-updates": "Aġġornamenti għal din il-paġna huma temporalment sospesi. L-Informazzjoni hawnhekk preżentament mhux qiegħed jiġi aġġornat.",
        "viewsource": "Ara s-sors",
        "viewsource-title": "Ara s-sors ta' $1",
        "actionthrottled": "Azzjoni miżmuma",
        "actionthrottledtext": "Bħala miżura għal kontra l-ispam, inti limitat li tagħmel din l-azzjoni għal ħafna drabi f'spazju ta' ħin żgħir, u inti qbiżt dan il-limitu.\nJekk jogħġbok erġa' prova fi ftit minuti oħra.",
-       "protectedpagetext": "Din il-paġna ġiet protetta sabiex twaqqaf kull tip ta' modifika.",
+       "protectedpagetext": "Din il-paġna ġiet protetta sabiex ma ssirx xi modifika jew xi azzjoni oħra.",
        "viewsourcetext": "Tista' tara u tikkopja s-sors ta' din il-paġna:",
        "viewyourtext": "Tista' tara u tikkopja s-sors tal-'''modifiki tiegħek''' fuq din il-paġna:",
-       "protectedinterface": "Din il-paġna għanda element li tagħmel parti mill-interfaċċa tal-utent tas-software, u għaldaqstant ġiet protetta sabiex ma jkunx hemm abbuż.",
+       "protectedinterface": "Din il-paġna tipprovdi test ta' interfaċċa għas-softwer fuq dan il-wiki, u għaldaqstant ġiet protetta sabiex ma jkunx hemm abbuż.\nBiex iżżid jew tibdel traduzzjonijiet għall-wikijiet kollha uża [//translatewiki.net/ translatewiki.net], il-proġett ta' lokalizzazzjoni ta' MediaWiki.",
        "editinginterface": "'''Avviż:''' Qiegħed tagħmel modifiki lejn paġna li qiegħda tintuża biex tipprovdi interfaċċa għall-messaġġi tas-software. Kull modifika f'din il-paġna se taffetwa l-apparenza tal-faċċata tal-utenti kollha. Għat-traduzzjonijiet, ikkunsidra l-possibilità li tuża  [//translatewiki.net/wiki/Main_Page?setlang=mt translatewiki.net], il-proġett MediaWiki għal-lokalizzazzjoni.",
        "cascadeprotected": "Din il-paġna ġiet protetta mill-modifiki, minħabba li tinkludi {{PLURAL:$1|paġni, li huwa|paġni, li huma}} protetti bil-preferenza tal-\"kaskata\" mixewla:\n$2",
        "namespaceprotected": "Inti m'għandhekx il-permess li timodifika paġni fin-''namespace'' '''$1''.",
        "passwordreset-emailsent-capture": "Intbagħtet ittra-e għall-ssettjar mill-ġdid tal-password u l-kontenut jidher hawn taħt.",
        "passwordreset-emailerror-capture": "Ġiet ġenerata ittra-e ta' tfakkira, li l-kontenut tagħha jidher hawn taħt. Madanakollu, il-posta ma ntbagħtitx lill-utent: $1",
        "changeemail": "Biddel l-indirizz elettroniku",
-       "changeemail-header": "Biddel l-indirizz elettroniku tal-kont",
        "changeemail-text": "Kompli din il-formola sabiex tbiddel l-indirizz elettroniku. Trid iddaħħal il-password biex tikkonferma din il-bidla.",
        "changeemail-no-info": "Trid tkun dħalt fil-kont tiegħek sabiex taċċessa direttament din il-paġna.",
        "changeemail-oldemail": "Indirizz elettroniku attwali:",
        "changeemail-none": "(xejn)",
        "changeemail-password": "Il-password tiegħek fuq {{SITENAME}}:",
        "changeemail-submit": "Biddel l-indirizz elettroniku",
-       "changeemail-cancel": "Annulla",
        "changeemail-throttled": "Ippruvajt tidħol wisq drabi.\nJekk jogħġbok stenna $1 qabel ma terġa' tipprova.",
        "resettokens": "Irrisettja t-tokens",
        "bold_sample": "Tipa ħoxna",
        "preview": "Dehra proviżorja",
        "showpreview": "Dehra proviżorja",
        "showdiff": "Uri t-tibdiliet",
-       "anoneditwarning": "'''Twissija:''' Ma rnexxilekx tidħol.\nL-indirizz tal-IP tiegħek se jiġi reġistrat fil-kronoloġija tal-modifikar ta' din il-paġna.",
+       "anoneditwarning": "'''Attenzjoni:''' Ma dħaltx f'kontok.\nL-indirizz tal-IP tiegħek se jkun jidher pubblikament meta tagħmel xi modifika. Jekk <strong>[$1 tidħol f'kontok]</strong> jew <strong>[$2 toħloq kont]</strong>, il-modifiki li tagħmel jiġu attribwiti lill-ismek ta' utent, flimkien ma benefiċċji oħra.",
        "anonpreviewwarning": "''Bħalissa mintix fil-kont tiegħek. Jekk issalva xi modifiki tiegħek, fil-kronoloġija tal-paġna se jiġi reġistrat l-indirizz IP tiegħek.''",
        "missingsummary": "'''Twissija:''' Ma pprovdejt l-ebda taqsira dwar il-modifika.\nJekk terġa' tagħfas Modifika, l-modifika se tiġi salvata mingħajr waħda.",
        "missingcommenttext": "Jekk jogħġbok ħalli kumment hawn taħt.",
        "searchrelated": "relatati",
        "searchall": "kollha",
        "showingresults": "Hawn taħt ġie inkluż massimu ta' {{PLURAL:$1|riżultat '''1''' li jibda|'''$1''' riżultat li jibdew}} bin-numru '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Riżultat '''$1''' minn '''$3'''|Riżultati '''$1 - $2''' minn '''$3'''}} għal '''$4'''",
        "search-nonefound": "It-tfittxija ma tat l-ebda riżultat.",
        "powersearch-legend": "Tfittxija avvanzata",
        "powersearch-ns": "Fittex fl-ispazju tal-isem:",
        "booksources": "Sorsi tal-kotba",
        "booksources-search-legend": "Fittex għal sorsi tal-kotba",
        "booksources-isbn": "Kodiċi ISBN:",
-       "booksources-go": "Mur",
+       "booksources-search": "Fittex",
        "booksources-text": "Hawn taħt hawn lista ta' ħoloq għal siti oħrajn li jbiegħu kotba ġodda u wżati, u jistgħu jkollhom aktar informazzjoni dwar il-kotba li qiegħed tfittex:",
        "booksources-invalid-isbn": "L-ISBN li ngħata jidher li mhuwiex validu; iċċekkja għal xi żbalji mis-sors oriġinali.",
        "specialloguserlabel": "Azzjoni effettwata minn:",
        "sp-deletedcontributions-contribs": "kontribuzzjonijiet",
        "linksearch": "Fittex ħoloq esterni",
        "linksearch-pat": "Mudell ta' tfittxija:",
-       "linksearch-ns": "Spazju tal-isem:",
+       "linksearch-ns": "Spazju tal-ismijiet:",
        "linksearch-ok": "Fittex",
        "linksearch-text": "Tista' tagħmel użu minn metakarattri, per eżempju \"*.wikipedia.org\".<br />\nHuwa neċessarju minn tal-inqas dominju tal-ewwel livell, per eżempju \"*.org\".<br />\nProtokolli aċċettati: <code>$1</code> (jekk ma jiġi speċifikat l-ebda protokol, dan jiġi awtomatikament definit bħala http://).",
        "linksearch-line": "$1 hija marbuta mill-paġna $2",
        "wlheader-enotif": "In-notifikazzjoni bl-użu tal-posta elettronika hija attivata.",
        "wlheader-showupdated": "Il-paġni li ġew editjati wara l-aħħar żjara tiegħek qed jiġu murija b'tipa '''ħoxna'''",
        "wlnote": "Hawn taħt hawn {{PLURAL:$1|l-aħħar modifika|l-aħħar '''$1''' modifiki}} fl-aħħar {{PLURAL:$2|siegħa|'''$2''' siegħat}}, sal-$3, fil-$4.",
-       "wlshowlast": "Uri l-aħħar $1 siegħat $2 ġranet $3",
+       "wlshowlast": "Uri l-aħħar $1 siegħat $2 ġranet",
        "watchlist-options": "Opzjonijiet tal-lista ta' osservazzjoni",
        "watching": "Imsegwi...",
        "unwatching": "Mhux osservat aktar...",
        "protect-othertime": "Ħin ieħor:",
        "protect-othertime-op": "ħin ieħor",
        "protect-existing-expiry": "Skadenza attwali: $2, $3",
+       "protect-existing-expiry-infinity": "Ħin ta' skadenza eżistenti: infinit",
        "protect-otherreason": "Raġunijiet oħra/addizzjonali:",
        "protect-otherreason-op": "Raġuni oħra",
        "protect-dropdown": "*Raġunijiet komuni għall-protezzjoni\n** Vandaliżmu eċċessiv\n** Spamming eċċessiv\n** Gwerrer tal-editjar kontinwi\n** Paġna wżata ħafna",
        "undelete-error-long": "Kien hemm problemi waqt il-fajl kien qiegħed jiġi rkuprat:\n\n$1",
        "undelete-show-file-confirm": "Inti ċert li trid tara reviżjoni imħassra tal-fajl \"<nowiki>$1</nowiki>\" ta' nhar $2, fil-ħin ta' $3?",
        "undelete-show-file-submit": "Iva",
-       "namespace": "Spazju tal-isem:",
+       "namespace": "Spazju tal-ismijiet:",
        "invert": "Aqleb l-għażla",
        "tooltip-invert": "Agħżel din il-kaxxa biex taħbi l-modifiki lejn paġni li jinsabu fl-ispazji tal-isem magħżula (u l-ispazju tal-isem assoċjat jekk hu magħżul)",
-       "namespace_association": "Spazju tal-isem assoċjat",
+       "namespace_association": "Spazju tal-ismijiet assoċjat",
        "tooltip-namespace_association": "Agħżel din il-kaxxa sabiex tinkludi l-paġna ta' diskussjoni jew l-oġġett tal-ispazju tal-isem assoċjat mal-ispazju tal-isem magħżul",
        "blanknamespace": "(Prinċipali)",
        "contributions": "Kontributi tal-{{GENDER:$1|utent}}",
        "import": "Importa paġni",
        "importinterwiki": "Importazzjoni transwiki",
        "import-interwiki-text": "Agħżel wiki u titlu ta' paġna li se timporta.\nDati ta' reviżjonijiet u ismijiet tal-modifikaturi jiġu preservati.\nKull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special:Log/import|log ta' importazzjoni]].",
-       "import-interwiki-source": "Sors tal-wiki/paġna:",
        "import-interwiki-history": "Kopja l-verżjonijiet tal-kronoloġija kollha għal din il-paġna",
        "import-interwiki-templates": "Inkludi l-mudelli kollha",
        "import-interwiki-submit": "Importa",
        "exif-copyright": "Informazzjoni dwar il-propjetá letterarja",
        "exif-exifversion": "Verżjoni tal-format Exif",
        "exif-flashpixversion": "Verżjoni sapportata ta' Flashpix",
-       "exif-colorspace": "Spazju tal-kulur",
+       "exif-colorspace": "Spazju tal-kuluri",
        "exif-componentsconfiguration": "Tfissira dwar kull komponent",
        "exif-compressedbitsperpixel": "Għamla tal-kompressjoni tal-istampa",
        "exif-pixelydimension": "Wisa' tal-istampa",
        "exif-lightsource": "Sorġent tad-dawl",
        "exif-flash": "Flash",
        "exif-focallength": "Distanza fokali objettiva",
-       "exif-subjectarea": "Spazju tas-suġġett",
+       "exif-subjectarea": "Spazju tas-suġġetti",
        "exif-flashenergy": "Saħħa tal-flash",
        "exif-focalplanexresolution": "Riżoluzzjoni X fuq il-witja fokali",
        "exif-focalplaneyresolution": "Riżoluzzjoni Y fuq il-witja fokali",
        "exif-urgency-low": "Baxx ($1)",
        "exif-urgency-high": "Għoli ($1)",
        "exif-urgency-other": "Prijorità definita mill-utent ($1)",
-       "watchlistall2": "kollha",
        "namespacesall": "kollha",
        "monthsall": "kollha",
        "confirmemail": "Ikkonferma l-indirizz tal-posta elettronika",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|biddel|biddlet}} is-sħubija fil-gruppi ta' $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|ġie|ġiet}} awtomatikament {{GENDER:$2|promoss|promossa}} minn $4 għal $5",
        "rightsnone": "(xejn)",
+       "revdelete-summary": "Taqsira tal-modifika",
        "feedback-bugornote": "Jekk int lest biex tiddeskrivi problema teknika fid-dettall, jekk jogħbok [$1 irraporta l-bug].\nInkella, tista' tuża l-formola sempliċi t'hawn taħt. Il-kumment tiegħek se jiżdied mal-paġna \"[$3 $2]\", flimkien ma' isem l-utent tiegħek.",
        "feedback-subject": "Suġġett:",
        "feedback-message": "Messaġġ:",
        "expand_templates_remove_comments": "Neħħi l-kummenti",
        "expand_templates_remove_nowiki": "Ħassar it-''tags'' <nowiki> fir-riżultat",
        "expand_templates_generate_xml": "Uri siġra sintattika XML",
-       "expand_templates_preview": "Dehra proviżorja"
+       "expand_templates_preview": "Dehra proviżorja",
+       "mediastatistics": "Statistika tal-midja",
+       "mediastatistics-summary": "L-istatistika dwar it-tipi ta' fajls imtellgħin. Din tinkludi biss il-verżjoni l-aktar reċenti t' fajl. Il-verżjonijiet antiki jew imħassrin tal-fajls tħallew barra.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Tip MIME",
+       "mediastatistics-table-extensions": "Estensjonijiet possibbli",
+       "mediastatistics-table-count": "Numru ta' fajls",
+       "mediastatistics-table-totalbytes": "Daqs totali",
+       "mediastatistics-header-unknown": "Mhux magħruf",
+       "mediastatistics-header-bitmap": "Stampi bil-Bitmap",
+       "mediastatistics-header-drawing": "Tpinġijiet (vector images)",
+       "mediastatistics-header-audio": "Awdjo",
+       "mediastatistics-header-video": "Vidjows",
+       "mediastatistics-header-multimedia": "Midja rikka",
+       "mediastatistics-header-office": "Uffiċċju",
+       "mediastatistics-header-text": "Fajls testwali",
+       "mediastatistics-header-executable": "Fajls eżegwitabbli",
+       "mediastatistics-header-archive": "Formats kompressati"
 }
index 3e81d22..0fa1cb5 100644 (file)
        "pager-older-n": "{{PLURAL:$1|1 atrasada|$1 atrasadas}}",
        "booksources": "Fuontes de lhibros",
        "booksources-search-legend": "Percurar por fuontes de libros",
-       "booksources-go": "Bota",
        "specialloguserlabel": "Outelizador:",
        "speciallogtitlelabel": "Títalo:",
        "log": "Registros",
        "watchthispage": "Begiar esta páigina",
        "unwatch": "Zantressar-se",
        "watchlist-details": "{{PLURAL:$1|$1 páigina begiada|$1 páiginas begiadas}}, fuora las páiginas de çcuçon.",
-       "wlshowlast": "Ber redadeiras $1 horas $2 dies $3",
+       "wlshowlast": "Ber redadeiras $1 horas $2 dies",
        "watchlist-options": "Oupçones de la lista de begiados",
        "watching": "A begiar...",
        "unwatching": "A deixar de begiar...",
        "exif-sharpness-1": "Suabe",
        "exif-sharpness-2": "Duro",
        "exif-subjectdistancerange-0": "Çcoincido",
-       "watchlistall2": "todas",
        "namespacesall": "todas",
        "monthsall": "todos",
        "confirm_purge_button": "Stá bien",
index 6620607..685ab87 100644 (file)
        "searchrelated": "ဆက်နွယ်သော",
        "searchall": "အားလုံး",
        "showingresults": "'''$2''' နှင့်စသော ရလဒ် {{PLURAL:$1|'''1''' ခု|'''$1''' ခု}}ထိကို အောက်တွင် ပြထားသည်။",
-       "showingresultsheader": "'''$4''' အတွက် {{PLURAL:$5|ရလဒ် '''$3''' ခု အနက်မှ '''$1'''|ရလဒ် '''$3'''ခု အနက်မှ '''$1 - $2'''}}",
        "search-nonefound": "စုံစမ်းမှုနှင့်ကိုက်ညီသော ရလဒ်မရှိပါ။",
        "powersearch-legend": "အထူးပြု ရှာဖွေရန်",
        "powersearch-ns": "အမည်ညွှန်းတို့တွင် ရှာရန် -",
        "pager-older-n": "{{PLURAL:$1|ပိုဟောင်းသော တစ်ခု|ပိုဟောင်းသော $1 ခု}}",
        "booksources": "မှီငြမ်း စာအုပ်များ",
        "booksources-search-legend": "စာအုပ်ရင်းမြစ်များကို ရှာရန်",
-       "booksources-go": "သွား​ပါ​",
        "specialloguserlabel": "အသုံးပြုသူ -",
        "speciallogtitlelabel": "ခေါင်းစဉ် -",
        "log": "မှတ်​တမ်း​များ​",
        "unwatchthispage": "စောင့်ကြည့်ခြင်းကို ရပ်တန့်ရန်",
        "notanarticle": "မာတိကာစာမျက်နှာတစ်ခု မဟုတ်",
        "watchlist-details": "{{PLURAL:$1|စာမျက်နှာ $1 ခု|စာမျက်နှာ $1 ခု}} သည် သင့်စောင့်ကြည့်စာရင်းတွင် ရှိသည်။ ဆွေးနွေးချက်စာမျက်နှာများကို ထည့်တွက် မထားပါ။",
-       "wlshowlast": "နောက်ဆုံး $1 နာရီ $2 ရက် $3 ကိုပြရန်",
+       "wlshowlast": "နောက်ဆုံး $1 နာရီ $2 ရက်  ကိုပြရန်",
        "watchlist-options": "စောင့်ကြည့်စာရင်းအတွက် ရွေးချယ်စရာများ",
        "watching": "စောင့်ကြည့်လျက်ရှိ...",
        "unwatching": "စောင့်မကြည့်တော့...",
        "exif-subjectdistancerange-1": "မက်ကရို",
        "exif-gpslongitude-w": "အနောက်လောင်ဂျီကျု",
        "exif-gpsspeed-m": "တစ်နာရီလျှင် ရှိသည့် မိုင်နှုန်း",
-       "watchlistall2": "အားလုံး",
        "namespacesall": "အားလုံး",
        "monthsall": "အားလုံး",
        "confirmemail": "အီးမေးကိုအတည်ပြုပါ",
        "revdelete-restricted": "အက်ဒမင်များသို့ ကန့်သတ်ချက်များ သက်ရောက်ရန်",
        "revdelete-unrestricted": "အက်ဒမင်များအတွက် ကန့်သတ်ချက်များကို ဖယ်ရှားရန်",
        "rightsnone": "(ဘာမှမရှိ)",
+       "revdelete-summary": "အကျဉ်းချုပ်ကို တည်းဖြတ်ရန်",
        "api-error-filename-tooshort": "ဖိုင်အမည်သည် တိုလွန်းသည်။",
        "api-error-filetype-banned": "ဤဖိုင်အမျိုးအစားကို တားမြစ်ထားသည်။",
        "api-error-http": "အတွင်းပိုင်းအမှား - ဆာဗာကို မဆက်သွယ်နိုင်ပါ။",
index 70704c7..3cb4da0 100644 (file)
        "returnto": "Велявтомс $1 лопантень.",
        "tagline": "{{SITENAME}} -нь пельде",
        "help": "Лезкс",
-       "search": "Вешнэмс",
-       "searchbutton": "Вешнэк",
+       "search": "Вешнемс",
+       "searchbutton": "Вешнек",
        "go": "Адя",
        "searcharticle": "Адя",
        "history": "Лопань полавтнемат - витнемат",
        "delete": "Нардамс",
        "deletethispage": "Нардамс те лопанть",
        "undeletethispage": "Вельмевтемс мекев те лопанть",
-       "undelete_short": "Велявтомс нардазенть {{PLURAL:$1|1=вейке витнема-петнема|$1 витнемат-петнемат}}",
-       "viewdeleted_short": "Ваномс {{PLURAL:$1|1=нардазь вейке витнема-петнема|нардазь $1 витнемат-петнемат}}",
+       "undelete_short": "Велявтомс нардазенть {{PLURAL:$1|вейке витнема-петнема|$1 витнемат-петнемат}}",
+       "viewdeleted_short": "Ваномс нардазь {{PLURAL:$1|вейке витнема-петнема|$1 витнемат-петнемат}}",
        "protect": "Аравтомс прянь ванстомас",
        "protect_change": "полавтомс",
        "protectthispage": "Аравтомс те лопанть ванстомас",
        "redirectedfrom": "(Ютавтозь $1 вельде)",
        "redirectpagesub": "Лиясто ютавтозь лопа",
        "lastmodifiedat": "Те лопанть меельседе витнезь-петнезь $2, $1.",
-       "viewcount": "Те лопантень совасть {{PLURAL:$1|1=весть|$1-ксть}}.",
+       "viewcount": "Те лопантень совасть {{PLURAL:$1|весть|$1-ксть}}.",
        "protectedpage": "Те лопась ванстомасо",
        "jumpto": "Тёкадемс тей:",
        "jumptonavigation": "Новигациясь-лездамось",
        "collapsible-expand": "Келейгавтомс",
        "thisisdeleted": "$1-нть ваномс эли велявтомс мекев?",
        "viewdeleted": "Ванномс $1?",
-       "restorelink": "{{PLURAL:$1|1=нардазь вейке витнема-петнема|нардазь $1 витнемат-петнемат}}",
+       "restorelink": "{{PLURAL:$1|нардазь вейке витнема-петнема|нардазь $1 витнемат-петнемат}}",
        "feedlinks": "Максовкс:",
        "feed-invalid": "А маштови сёрмадстома каналонть сортозо.",
        "site-rss-feed": "RSS-нть максовкс $1 -нть кисэ",
        "laggedslavemode": "Ванок: Кизды, лопасонть материалось таштомсь.",
        "readonly": "Датабазась панжома экшсэ",
        "enterlockreason": "Сёрмадт мейс сёлгамс эряви, ды ёвтак, зярдо таго арьсят панжови",
-       "missing-article": "Дата йуртсто а муеви эрявикс текстэсь, сонзэ лемезэ \"$1\" $2.\n\nСеде сеедьстэ истя лиси, зярдо таштомозь diff эли историянь сюлмавома песь вети нардань лопас.\n\nЛисиндерясь аволь истя, можок муить программа керьксстэнть (тапавкс тарка) сийне.\nПачтта сёрмине теде [[Special:ListUsers/sysop|системань ветийнень]] URL адресэнть тештязь.",
+       "missing-article": "Дата юртсто а муеви эрявикс текстэсь, сонзэ лемезэ \"$1\" $2.\n\nСеде сеедьстэ истя лиси, зярдо таштомозь diff эли историянь сюлмавома песь вети нардань лопас.\n\nЛисиндерясь аволь истя, можок муить программа керьксстэнть (тапавкс тарка) сийне.\nПачтта сёрмине теде [[Special:ListUsers/sysop|системань ветийнень]] URL адресэнть тештязь.",
        "missingarticle-rev": "(лиякстомтома#: $1)",
        "missingarticle-diff": "(Мейсэ явовить: $1, $2)",
        "internalerror": "Потмоильведькс",
        "createacct-submit": "Шкик совамотаркат",
        "createacct-another-submit": "Шкак од совамотарка",
        "createacct-benefit-heading": "«{{SITENAME}}» сайтэнть теизь тонь кондямо ломанть.",
-       "createacct-benefit-body2": "{{PLURAL:$1|1=лопа|лопат}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|лопа|лопат}}",
        "badretype": "Сёрмадыть салава валот кавксть: сынь аволь вейкеть.",
        "userexists": "Те лемесь уш саезь.\nАрсека эстеть лия, инеськеть.",
        "loginerror": "Совамсто ильведькс",
        "login-userblocked": "Те теицясь аравтозь саймас. Совамонзо а мерить.",
        "wrongpassword": "Аволь истя сёрмадык совамо валот. Варчыка одов.",
        "wrongpasswordempty": "Салавань валот кадовсь апак сёрмадо. Сёрмадыка одов.",
-       "passwordtooshort": "Совамо Ð²Ð°Ð»Ð¾Ð½Ñ\82Ñ\8c ÐºÑ\83валмозо  {{PLURAL:$1|1=улезэ 1 тешкс| улезт $1 тешкст}}, аволь седе аламо.",
+       "passwordtooshort": "СалававалонÑ\82Ñ\8c ÐºÑ\83валмозо  {{PLURAL:$1|улезэ 1 тешкс| улезт $1 тешкст}}, аволь седе аламо.",
        "password-name-match": "Салава валонтень эряви явовомс теицянь леметь эйстэ.",
        "password-login-forbidden": "Те теицянь лемесь ды салававалось а мерить нолдамс тевс.",
        "mailmypassword": "Одов ладямс салававал",
        "passwordremindertitle": "{{SITENAME}} туртов акуватень од совамо вал",
-       "passwordremindertext": "Кие-бути (кода неяви тон IP-тешксстэнть $1) вешсь,<br />\nкедьстэнек кучомс теицянь од совамо вал {{SITENAME}} ($4) сайтс совамга.<br />\nТеицянтень \"$2\" кучозь нурькине шкань совамо вал, конась  ней \"$3\".<br />\nБути те тон ульнить, сави ней совамс ды кочкамс од совамо вал эстеть.<br />\nНурькине шкань совамо валот нолдави тевс {{PLURAL:$5|1=вейке чи|$5 чить}}.\n\nБути аволь тон вешицясь, эли мелезэть ледстик совамо валонть, иля яво мель те пачтямнэнтень. Нолдык тевс мельсэ аштицянть - мельс ледстязенть.",
+       "passwordremindertext": "Кие-бути (кода неяви тон, IP-тешксстэнть $1) вешсь,<br />\nкедьстэнек кучомс теицянь од салававал {{SITENAME}} ($4) сайтс совамга.<br />\nТеицянтень \"$2\" кучозь нурькине шкань салававал, конась  ней \"$3\".<br />\nБути те тон ульнить, сави ней совамс ды кочкамс од салававал эстеть.<br />\nНурькине шкань салававалот нолдави тевс {{PLURAL:$5|вейке чи|$5 чить}}.\n\nБути аволь тон вешицяселить, эли мелезэть ледстик салававалонть, иля яво мель те пачтямнэнтень. Нолдык тевс мельсэ аштицянть - мельс ледстязенть.",
        "noemail": "\"$1\" теицянть арась е-сёрмапаргозо.",
        "noemailcreate": "Эряви максомс е-сёрмапарго, конась маштови",
        "passwordsent": "$1 -нь е-сёрмань адресэнтень кучозь од совамо вал.<br />\nИнеськеть, кодак валось пачкоди, совака одов.",
        "eauthentsent": "Электрононь сёрмапаргозот кучозь кемекстамонь е-сёрмине.<br /> Сонзэ эйсэ сёрмадозь мезе кода теемс. Ансяк седе мейле, зярдо невтик, сёрмапаргось алкукс эсеть, карматано кучомо лия сёрмат.",
        "mailerror": "Е-сёрма кучомсто ильведькс: $1",
-       "acct_creation_throttle_hit": "Те Ð²Ð¸ÐºÐ¸Ñ\81Ñ\8d Ñ\82онÑ\8c IP Ð°Ð´Ñ\80еÑ\81Ñ\81Ñ\82Ñ\8dÑ\82Ñ\8c Ñ\81оваÑ\81Ñ\82Ñ\8c Ñ\82еиÑ\86Ñ\8fÑ\82, ÐºÐ¾Ð½Ð°Ñ\82 Ñ\82еиÑ\81Ñ\82Ñ\8c {{PLURAL:$1|1=1 Ñ\81Ñ\91Ñ\80мадовкÑ\81|$1 Ñ\81Ñ\91Ñ\80мадовкÑ\81Ñ\82}} Ð¼ÐµÐµÐ»Ñ\8cÑ\81е Ñ\87Ñ\8bнÑ\82Ñ\8c Ð¿ÐµÑ\80Ñ\82Ñ\8c, Ñ\81еде Ð»Ð°Ð¼Ð¾ Ð¿Ð¾Ð»Ð°Ð²Ñ\82омаÑ\82 Ð° Ð¼ÐµÑ\80иÑ\82Ñ\8c Ñ\82еемÑ\81 Ð¸Ñ\81Ñ\82Ñ\8f Ð·Ð½Ñ\8fÑ\80онÑ\8c Ñ\88канÑ\8c Ð¿ÐµÑ\80Ñ\82Ñ\8c.\nТенÑ\8c ÐºÐ¸Ñ\81Ñ\8d, Ñ\82е   IP Ð°Ð´Ñ\80еÑ\81Ñ\8dнÑ\82Ñ\8c ÐºÐ¾Ñ\80Ñ\8fÑ\81 Ñ\81еде Ñ\82ов Ð° Ð¼Ð°Ñ\88Ñ\82ови Ñ\82еемÑ\81\88камÑ\81 Ð¾Ð´ Ñ\81Ñ\91Ñ\80мадовкÑ\81т, зярс.",
+       "acct_creation_throttle_hit": "Те Ð²Ð¸ÐºÐ¸Ñ\81Ñ\8d Ñ\82онÑ\8c IP Ð°Ð´Ñ\80еÑ\81Ñ\81Ñ\82Ñ\8dÑ\82Ñ\8c Ñ\81оваÑ\81Ñ\82Ñ\8c Ñ\82еиÑ\86Ñ\8fÑ\82, ÐºÐ¾Ð½Ð°Ñ\82 Ñ\82ейÑ\81Ñ\82Ñ\8c {{PLURAL:$1|1 Ñ\81овамо Ñ\82аÑ\80ка|$1 Ñ\81овамо Ñ\82аÑ\80каÑ\82}} Ð¼ÐµÐµÐ»Ñ\8cÑ\86е Ñ\87инÑ\82Ñ\8c Ð¿ÐµÑ\80Ñ\82Ñ\8c, Ñ\81еде Ð»Ð°Ð¼Ð¾ Ð¿Ð¾Ð»Ð°Ð²Ñ\82омаÑ\82 Ð° Ð¼ÐµÑ\80иÑ\82Ñ\8c Ñ\82еемÑ\81 Ð¸Ñ\81Ñ\82Ñ\8fнÑ\8c Ð·Ð½Ñ\8fÑ\80онÑ\8c Ñ\88канÑ\8c Ð¿ÐµÑ\80Ñ\82Ñ\8c.\nТенÑ\8c ÐºÐ¸Ñ\81Ñ\8d, Ñ\82е   IP Ð°Ð´Ñ\80еÑ\81Ñ\8dнÑ\82Ñ\8c ÐºÐ¾Ñ\80Ñ\8fÑ\81 Ñ\81еде Ñ\82ов Ð° Ð¼Ð°Ñ\88Ñ\82ови Ñ\82еемÑ\81\88камÑ\81 Ð¾Ð´ Ñ\81овамо Ñ\82аÑ\80кат, зярс.",
        "emailauthenticated": "Е-сёрмапаргот кемекстазель $2 чистэ $3 цяссто.",
        "emailconfirmlink": "Кемекстык е-сёрмапаргот",
        "accountcreated": "Совамо таркась теезь",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|кортнема]]) совицянь таркась теевсь-шкавсь.",
        "loginlanguagelabel": "Кель: $1",
+       "pt-login": "Совамс",
+       "pt-userlogout": "Лисемс",
        "user-mail-no-addy": "Терявтыть кучомс е-сёрма е-сёрмапарговтомо.",
        "changepassword": "Салавань валонь полавтома",
-       "resetpass_announce": "СовавиÑ\82Ñ\8c Ð½Ñ\83Ñ\80Ñ\8cка Ñ\88канÑ\8c Ñ\81алававалÑ\81о, ÐºÐ¾Ð½Ð° ÐºÑ\83Ñ\87озелÑ\8c ÐºÑ\83лÑ\8fпаÑ\80гозоÑ\82. Ð¡Ð¾Ð²Ð°Ð¼Ð¾Ñ\82 Ð¿Ñ\80Ñ\8fдомга Ñ\8dÑ\80Ñ\8fви Ð¿Ñ\83Ñ\82омÑ\81 Ð¾Ð´ Ñ\81алававал Ð²Ð°Ð½Ð° Ñ\82езÑ\8dенÑ\8c:",
+       "resetpass_announce": "СовамоÑ\82 Ñ\82опавÑ\82омга Ñ\8dÑ\80Ñ\8fви Ð¿Ñ\83Ñ\82омÑ\81 Ð¾Ð´ Ñ\81алававал.",
        "resetpass_header": "Полавтомс совамо валот",
        "oldpassword": "Ташто совамо валот:",
        "newpassword": "Од совамо валот:",
        "resetpass-submit-loggedin": "Полавтомс совамо валот",
        "resetpass-submit-cancel": "Саемс мекев",
        "resetpass-temp-password": "А куватень совамо валось:",
+       "resetpass-expired": "Салававалот таштомсь. Аравтт од салававал, мейле совават.",
        "passwordreset": "Совамо валонь лиялгавтома",
        "passwordreset-legend": "Полавтык совамо валонть",
        "passwordreset-username": "Теиця леметь:",
        "changeemail-none": "(арась мезе невтемс)",
        "changeemail-password": "«{{SITENAME}}» проектэнь салававалот:",
        "changeemail-submit": "Полавтомс е-сёрмапаргот",
-       "changeemail-cancel": "Саемс мекев",
        "bold_sample": "Эчке текст",
        "bold_tip": "Эчке текст",
        "italic_sample": "Комавтонь текст",
        "copyrightwarning": "Инескеть кирдть мельсэ {{SITENAME}}-сэ весе путовкстнэнь, лововить нолдазекс ало $2  конёвонть коряс (вант $1 педе пес). Арась мелеть витневтемс-петневтемс сёрмадовксот педе пес, иляк сестэ путо сонзэ тезэнь.<br />\nИстяжо тезэнь материалонь максомсот, кемекстат тон тонсь сёрмадык сонзэ, али саик сонзэ вейсэнь ёнксто али олячинь порталсто.\n'''ИЛЯ МАКСО ВАНСТОНЬ ВИДЕЧИСЭ ЛОМАНЕНЬ ВАЖОДЕМАНТЬ АПАК КЕВКСТНЕ!'''",
        "titleprotectedwarning": "'''ВАНОК:  Те лопась сёлгозь, сонзэ шкамга-теемга [[Special:ListGroupRights|башка видечыть]] эрявить.'''\nЖурналонь меельсе сёрмадовксось максозь ало, эрявиндеряй сонзэ ваномс.",
        "templatesused": "Те лопасонть тевс нолдазь {{PLURAL:$1|лопапарцун|лопапарцунт}}:",
-       "templatesusedpreview": "Те икелькс вановкссонть тевс нолдазь  {{PLURAL:$1|1=лопа парцун|лопа парцунт}}:",
-       "templatesusedsection": "Те пелькссэнть тевс нолдазь {{PLURAL:$1|1=лопа парцунось|лопа парцунтнэ}}:",
+       "templatesusedpreview": "Те икелькс вановкссонть тевс нолдазь  {{PLURAL:$1|лопа парцун|лопа парцунт}}:",
+       "templatesusedsection": "Те пелькссэнть тевс нолдазь {{PLURAL:$1|лопа парцунось|лопа парцунтнэ}}:",
        "template-protected": "(ванстозь)",
        "template-semiprotected": "(пельс ванстозь)",
        "hiddencategories": "Те лопась совавтови {{PLURAL:$1|кекшень 1 категорияс|кекшень $1 категорияс}}:",
        "nocreatetext": "Те {{SITENAME}} лопасонть пирязь од лопань теемась. Тонь ули мелеть велявтомс удалов ды  питнемензе-витнемензе улиця лопанть, али [[Special:UserLogin|совамс али теемс од совама]].",
        "nocreate-loggedin": "Тонеть а мерить теемс-шкамс од лопат.",
-       "permissionserrorstext": "ТонеÑ\82Ñ\8c Ð° Ð¼ÐµÑ\80иÑ\82Ñ\8c Ñ\82еемÑ\81 Ñ\82енÑ\8c, Ð²Ð°Ð½Ð° {{PLURAL:$1|1=Ñ\82Ñ\83вÑ\82алоÑ\81Ñ\8c\82Ñ\83вÑ\82алÑ\82нÑ\8d}}:",
-       "permissionserrorstext-withaction": "Тонеть а мерить теемс $2, {{PLURAL:$1|1=тувталось|тувталтнэ}} вана:",
+       "permissionserrorstext": "ТонеÑ\82Ñ\8c Ð° Ð¼ÐµÑ\80еви Ñ\82еемÑ\81 Ñ\82енÑ\8c, Ð²Ð°Ð½Ð° {{PLURAL:$1|Ñ\82Ñ\83вÑ\82алонÑ\82Ñ\8c\82Ñ\83вÑ\82алÑ\82нÑ\8dнÑ\8c}} ÐºÐ¸Ñ\81Ñ\8d:",
+       "permissionserrorstext-withaction": "Тонеть а мерить $2, {{PLURAL:$1|тувталось|тувталтнэ}} вана:",
        "recreate-moveddeleted-warn": "'''Ванок: Вельмевтят лопа, кона нардазель.'''\n\nВасня арьсек, эряви - а эряви полалемс ды витнемс-петнемс те лопанть.\nТе лопанть нардамодо ды печтевтемадо путовкстнэ одов максозь тесэ, улезт шожда ванстнемс:",
        "moveddeleted-notice": "Те лопась нардазь.\nЛопанть нардамодо сёрмадовксось максозь вана ало.",
        "log-fulllog": "Ванномс журналонть весемензэ",
        "currentrev": "Тевате лиякстомтома",
        "currentrev-asof": "Неень верзиясь истямо шкань $1",
        "revisionasof": "$1-це версиясь",
-       "revision-info": "$1 -нь лиякстомтома, конань теизе $2",
+       "revision-info": "$1 -нь лиякстомтома, конань теизе {{GENDER:$6|$2}}$7",
        "previousrevision": "←Седе икелень лиякстомтома",
        "nextrevision": "Седе од вановкс→",
        "currentrevisionlink": "Тевате лиякстомтома",
        "history-show-deleted": "Ансяк нардазь",
        "histfirst": "весемеде умонь",
        "histlast": "Меельце",
-       "historysize": "({{PLURAL:$1|1=1 байт|$1 байтт}})",
+       "historysize": "({{PLURAL:$1|1 байт|$1 байтт}})",
        "historyempty": "(чаво)",
        "history-feed-title": "Лиякстомтомань тевде",
        "history-feed-description": "Викинь тевате лопанть лиякстомтомань тевдензэ",
        "revdelete-show-file-confirm": "Алкукс ули мелеть ваномс «<nowiki>$1</nowiki>» керьмазонть нардазь ревизиянзо, конась саезь $2-нть эйстэ ды ашти тесэ $3?",
        "revdelete-show-file-submit": "Ули",
        "revdelete-legend": "Аравтомс неявомачынь петне",
-       "revdelete-hide-text": "Ð\9aекÑ\88емÑ\81 Ð»Ð¸Ñ\8fкÑ\81Ñ\82омÑ\82оманÑ\8c Ñ\82екÑ\81Ñ\82Ñ\8dнÑ\82ь",
+       "revdelete-hide-text": "Ð\9bиÑ\8fкÑ\81Ñ\82омÑ\82оманÑ\8c Ñ\82екÑ\81Ñ\82Ñ\8dÑ\81ь",
        "revdelete-hide-image": "Кекшемс мезе файлатнесэ",
        "revdelete-hide-name": "Кекшемс тев тееманть ды норовамо тарканзо",
-       "revdelete-hide-comment": "Ð\9aекÑ\88емÑ\81 Ð²Ð¸Ñ\82немадо-пеÑ\82немадо Ð°Ñ\80Ñ\81емаÑ\82ненÑ\8c",
-       "revdelete-hide-user": "Ð\9aекÑ\88емÑ\81 Ð²Ð¸Ñ\82ниÑ\86Ñ\8fнÑ\82Ñ\8c-пеÑ\82ниÑ\86Ñ\8fнÑ\82Ñ\8c Ñ\82еиÑ\86Ñ\8f Ð»ÐµÐ¼ÐµÐ½Ð·Ñ\8d/IP-нзÑ\8d",
+       "revdelete-hide-comment": "Ð\92иÑ\82немÑ\81-пеÑ\82немÑ\81 Ñ\81Ñ\91Ñ\80мадовкÑ\81онÑ\82Ñ\8c Ð·Ñ\8dмензÑ\8d.",
+       "revdelete-hide-user": "Ð\92иÑ\82ниÑ\86Ñ\8fнÑ\82Ñ\8c-пеÑ\82ниÑ\86Ñ\8fнÑ\82Ñ\8c Ñ\81овамолемезÑ\8d/IP Ñ\81Ñ\91Ñ\80мапаÑ\80гозо",
        "revdelete-radio-same": "(иляк лиякстомто)",
        "revdelete-log": "Тувталось:",
-       "revdelete-submit": "Аравтомс кочказь {{PLURAL:$1|1=лиякстомтомантень|лиякстомтоматненень}}",
+       "revdelete-submit": "Аравтомс кочказь {{PLURAL:$1|лиякстомтомантень|лиякстомтоматненень}}",
        "revdel-restore": "Полавтомс неявомачынзэ",
        "pagehist": "Лопанть икелькс умазо",
        "deletedhist": "Нардань икелькс умазо",
        "mergehistory-box": "Совавтомс кавто лопатнень лиякстомтомадо сёрмадовкстнэнь ве лувс:",
        "mergehistory-from": "Лисьмапря лопа:",
        "mergehistory-into": "Совавтома лопа:",
-       "mergehistory-list": "Ð\92ейÑ\82Ñ\8cÑ\81Ñ\8dндÑ\8fвиÑ\86Ñ\8f Ñ\8eÑ\80онзо-пÑ\83Ñ\82овкÑ\81онзо",
+       "mergehistory-list": "Вейсэндявиця юронзо-путовксонзо",
        "mergehistory-go": "Невтемс вейтьс совавтомкс витнемат-петнемат",
        "mergehistory-submit": "Совавтомс лиякстомтоматнень вейтьс",
        "mergehistory-empty": "Вейкеяк лиякстомтома а совавтови вейтьс лия марто.",
        "mergehistory-invalid-destination": "Совавтомкс лопанть улезэ маштовикс лем.",
        "mergehistory-autocomment": "Совавтомс [[:$1]] [[:$2]]-с",
        "mergehistory-reason": "Тувталось:",
-       "mergelog": "Ð\92ейÑ\82Ñ\8cÑ\81Ñ\8dндÑ\8fмÑ\81 Ð»Ð¾Ð³Ð¾Ð½Ñ\82Ñ\8c",
-       "revertmerge": "ЯвомÑ\81 Ð»Ð¾Ð³Ð¾Ð½Ñ\82Ñ\8c Ð¼ÐµÐºÐµÐ², ÐºÐ¾Ð´Ð° Ñ\83лÑ\8cнеÑ\81Ñ\8c Ð²ÐµÐ¹Ñ\82Ñ\8cÑ\81Ñ\8dндÑ\8fмодо Ð¸ÐºÐµÐ»Ðµ",
-       "history-title": "\"$1\"ь полавтнемань историязо",
+       "mergelog": "Вейсэндямс логонть",
+       "revertmerge": "Явомс логонть мекев, кода ульнесь вейсэндямодо икеле",
+       "history-title": "\"$1\" лопанть полавтнемань историязо",
        "difference-multipage": "(Мейсэ лопатне явовить)",
        "lineno": "Киксэсь $1:",
        "compareselectedversions": "Кочказь версиятнень аравтомс карадо-каршо",
        "searchprofile-everything-tooltip": "Вешнемс весе лопатнева (кортнема лопатневаяк)",
        "searchprofile-advanced-tooltip": "Вешнемс башка теезь лемпотмотнестэ",
        "search-result-size": "$1 ({{PLURAL:$2|1 вал|$2 валт}})",
-       "search-result-category-size": "{{PLURAL:$1|1=1 совицязо|$1 совицянзо}} ({{PLURAL:$2|1=1 явкскатегориязо|$2 явкскатегориянзо}}, {{PLURAL:$3|1=1 файла|$3 файлат}})",
+       "search-result-category-size": "{{PLURAL:$1|1 совицязо|$1 совицянзо}} ({{PLURAL:$2|1 явкскатегориязо|$2 явкскатегориянзо}}, {{PLURAL:$3|1 файла|$3 файлат}})",
        "search-redirect": "(йутавтт $1-с)",
        "search-section": "(пелькс $1)",
        "search-suggest": "Истя мерикскелить: $1",
        "search-interwiki-caption": "Дугакс проектт",
-       "search-interwiki-default": "$1 савкс:",
+       "search-interwiki-default": "«$1» викинть эйстэ савкст:",
        "search-interwiki-more": "(седе ламо)",
        "search-relatedarticle": "Малавикс",
        "searchrelated": "малавикс",
        "searchall": "весе",
-       "showingresultsheader": "{{PLURAL:$5|муевсь <strong>$1</strong> вана <strong>$3</strong>-тнень эйстэ|муевсть <strong>$1 - $2</strong> <strong>$3</strong>-тнень эйстэ}} <strong>$4</strong> вешнеманть лангс",
        "search-nonefound": "Те вешнема лангс мезеяк эзь муеве.",
        "powersearch-legend": "Седе келейстэ вешнема",
        "powersearch-ns": "Вешнемс не лемпотмотнестэ:",
        "prefs-personal": "Теицядо",
        "prefs-rc": "Чиень полавтнемат-лиякстомтомат",
        "prefs-watchlist": "Ванома лемрисьме",
-       "prefs-watchlist-days-max": "Весемеде куватьс $1 {{PLURAL:$1|1=чис|чис}}",
+       "prefs-watchlist-days-max": "Весемеде куватьс $1 {{PLURAL:$1|чис|чис}}",
        "prefs-watchlist-edits-max": "Весемеде покш цётось: 1000",
        "prefs-misc": "Минеть-сюнот",
        "prefs-resetpass": "Салавань валонь полавтома",
        "prefs-email": "Е-сёрмат-мезть",
        "prefs-rendering": "Тюсозо-лангозо",
        "saveprefs": "Ванстомс",
-       "restoreprefs": "Велявтомс мекев весе ушодкс ладсематнень",
+       "restoreprefs": "Велявтомс мекев весе ушодкс ладсематнень (весе явкстнэва)",
        "prefs-editing": "Витнема-петнема",
        "rows": "Валчилькстнэ (строкатне):",
        "columns": "Палманть:",
        "searchresultshead": "Вешнема",
        "recentchangesdays": "Зяро чить невтемс чиень полавтнематнесэ-лиякстомтоматнесэ:",
-       "recentchangesdays-max": "Весемеде куватьс $1 {{PLURAL:$1|1=чис|чис}}",
+       "recentchangesdays-max": "Весемеде куватьс $1 {{PLURAL:$1|чис|чис}}",
        "recentchangescount": "Васень аравтоматнень коряс зяро витнемат-петнемат невтемс:",
        "prefs-help-recentchangescount": "Тезэнь совавтозь чиень полавтнемат-лиякстомтомат, лопань лувт-путовкст, журналт.",
        "timezonelegend": "Шкань зонась:",
        "timezoneregion-pacific": "Сэтьме иневедь",
        "prefs-searchoptions": "Вешнем",
        "prefs-namespaces": "Лем потмот",
-       "default": "зярдо лиякс апак йовта",
+       "default": "зярдо лиякс апак ёвта",
        "prefs-files": "Файлат",
        "youremail": "Е-сёрма:",
        "username": "Теицянь леметь:",
        "yourrealname": "Алкуксонь леметь:",
        "yourlanguage": "Келесь:",
        "yournick": "Кедень путома:",
-       "badsiglength": "Кедень путомат пек кувака.\nЭйсэнзэ иляст уле $1 -до ламо {{PLURAL:$1|1=тешкст|тешкст}}.",
-       "yourgender": "СÑ\8bмеÑ\82Ñ\8c (Ñ\86Ñ\91Ñ\80анÑ\8c\82ейÑ\82еÑ\80енÑ\8c):",
+       "badsiglength": "Кедень путомат пек кувака.\nЭйсэнзэ иляст уле $1 -до ламо {{PLURAL:$1|тешкст|тешкст}}.",
+       "yourgender": "ТонÑ\81Ñ\8c ÐºÐ¾Ð´Ð° Ð¼ÐµÑ\80евлиÑ\82Ñ\8c Ñ\8dÑ\81Ñ\8c Ð¿Ñ\80Ñ\8fдоÑ\82?",
        "gender-unknown": "А меревлинь",
        "gender-male": "Сон витни-петни викилопатнесэ",
        "gender-female": "Сон витни-петни викилопатнесэ",
        "right-undelete": "Вельмевтемс нардань лопа",
        "right-block": "Кардамс лия совийтнень-лисийтнень витнемадо-петнемадо",
        "right-blockemail": "Кардамс лия лисийтнень-совийтнень е-сёрмань кучомадо",
-       "right-editinterface": "Витнемс-петнемс теицянь интерчаманть (васодема йожонть)",
+       "right-editinterface": "Витнемс-петнемс теицянь интерчаманть (васодема ёжонть)",
        "right-editusercssjs": "Витнемс-петнемс лия теицятнень CSS ды JS файласт",
        "right-editusercss": "Витнемс-петнемс лия теицятнень CSS файласт",
        "right-edituserjs": "Витнемс-петнемс лия теицятнень JS файласт",
        "right-import": "Ёвкстамс лия Викистэ лопат",
        "right-patrol": "Тешкстамс лиянь витнематнень-петнематнень лувонь кирдиеньсекс",
-       "right-mergehistory": "Ð\92ейÑ\82Ñ\8cÑ\81Ñ\8dндÑ\8fмÑ\81 Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c Ñ\8eÑ\80оÑ\81Ñ\82-пÑ\83Ñ\82овкÑ\81оÑ\81Ñ\82",
+       "right-mergehistory": "Вейсэндямс лопатнень юрост-путовксост",
        "right-userrights": "Витнемс-петнемс совицянь весе видечитнень",
        "right-siteadmin": "Датабазань сёлгомо ды панжомо",
        "right-passwordreset": "Ваномс теицянь салава валонь полавтома е-сёрмат",
        "action-move-subpages": "печтевтемс те лопанть, ды алонзо весе лопатнень",
        "action-move-rootuserpages": "печтевтемс теицянь юрт лопатнень",
        "action-movefile": "печтевтемс те файланть",
-       "action-upload": "йовкстамс те файланть",
+       "action-upload": "ёвкстамс те файланть",
        "action-reupload": "уликс файланть полавтомс одонть марто",
        "action-upload_by_url": "ёвкстамс те файланть URL адресстэ",
        "action-writeapi": "нолдамс тевс сёрмадома API-нть",
        "action-block": "кардамс те совицянть витнемадо-петнемадо",
        "action-import": "совавтомс тезэнь лопат лия Викистэ",
        "action-importupload": "совавтомс тезэнь лопат файлань путома юртсто",
-       "action-mergehistory": "вейÑ\82Ñ\8cÑ\81Ñ\8dндÑ\8fмÑ\81 Ñ\82е Ð»Ð¾Ð¿Ð°Ð½Ñ\82Ñ\8c Ñ\8eÑ\80онзо-пÑ\83Ñ\82овкÑ\81онзо",
+       "action-mergehistory": "вейсэндямс те лопанть юронзо-путовксонзо",
        "action-userrights": "витнемс-петнемс совицянь весе видечитнень",
        "action-userrights-interwiki": "витнемс-петнемс лия викитнесэ теицянь видечитнень",
        "action-sendemail": "кучомс е-сёрмат",
        "recentchanges-label-bot": "Те витнеманть-петнеманть теизе кона-кона бот",
        "recentchanges-label-unpatrolled": "",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (вантаять [[Special:NewPages|од лопань лемрисьме]])",
-       "rcnotefrom": "Ð\90ло Ð½ÐµÐ²Ñ\82езÑ\8c  '''$2''' Ð»Ð¸Ñ\8fкÑ\81Ñ\82омÑ\82омаÑ\81Ñ\82о Ñ\81аезÑ\8c ('''$1''' Ð²Ð¸Ð´Ñ\81).",
+       "rcnotefrom": "Ð\90ло Ð¼Ð°ÐºÑ\81озÑ\8c {{PLURAL:$5|лиÑ\8fкÑ\81Ñ\82омÑ\82омаÑ\81Ñ\8c, ÐºÐ¾Ð½Ð°Ñ\81Ñ\8c|лиÑ\8fкÑ\81Ñ\82омÑ\82омаÑ\82не, ÐºÐ¾Ð½Ð°Ñ\82не}} Ñ\82еезÑ\8c <strong>$3, $4</strong> Ñ\88каÑ\81Ñ\82о Ñ\81аезÑ\8c (веÑ\81емеде Ð»Ð°Ð¼Ð¾ Ð½ÐµÐ²Ñ\82езÑ\8c <strong>$1</strong>).",
        "rclistfrom": "Невтемс од витьнематнень $3 $2-нть эйстэ саезь.",
        "rcshowhideminor": "$1 апокшкэ витнемат-петнемат",
        "rcshowhidebots": "$1 ботт",
        "recentchangeslinked-page": "Лопанть лемезэ:",
        "recentchangeslinked-to": "Тень таркас невтить те лопанть марто сюлмазь лопатнесэ полавтнематнень",
        "upload": "Ёкстамс файла",
-       "uploadbtn": "Ð\99овкÑ\81амÑ\81 Ñ\84айланÑ\82Ñ\8c",
+       "uploadbtn": "Ð\81вкÑ\81Ñ\82амÑ\81 Ñ\84айла",
        "uploadnologin": "Эзить сова",
-       "uploaderror": "Ð\99овкстамсто манявома",
+       "uploaderror": "Ð\81вкстамсто манявома",
        "upload-permitted": "Файлань форматт, конат меревить: $1.",
        "upload-preferred": "Файлань типт, конатне паро мельсэ учовить: $1.",
        "upload-prohibited": "Файлань типт, конатне кардазь: $1.",
-       "uploadlogpage": "Файлань йовкстамодо журнал",
+       "uploadlogpage": "Файлань ёвкстамодо журнал",
        "filename": "Файлань лем",
        "filedesc": "Нурькинестэ",
        "fileuploadsummary": "Нурькинестэ:",
        "filename-tooshort": "Файлань лементь а саты кувалмозо.",
        "unknown-error": "А содавикс манявкс лиссь.",
        "file-thumbnail-no": "Файланть лемезэ ушодови  <strong>$1</strong>.\nСонсь маряви вишкалгавтозь фотокуво, покшолмазо ''(кенжешка)''.\nУлиндеряй файланть покш верзиязо, йовкстыка сонзэ  - арась, полавтыка тетень лемензэ.",
-       "file-exists-duplicate": "Те кавонзавкс файла вана {{PLURAL:$1|1=те файланть|неть файлатнень}} эйстэ:",
+       "file-exists-duplicate": "Те кавонзавкс файла вана {{PLURAL:$1|те файланть|неть файлатнень}} эйстэ:",
        "uploadwarning": "Совавтомадо кардамонь пачтямо",
        "savefile": "Ванстомс файланть",
        "uploaddisabled": "Совавтомась лоткавтозь",
        "license-header": "Лицензиянь теема:",
        "nolicense": "Лицензия арась",
        "license-nopreview": "(Васнянь невтевкс арась)",
-       "upload_source_file": " (арси машинасот файла)",
+       "upload_source_file": " (арсимашинастот файла, конань тонсь кочкик)",
        "listfiles_search_for": "Вешнемс медиа лементь:",
        "imgfile": "файл",
        "listfiles": "Файлат-мезть",
        "filepage-nofile": "Истямо лем марто файла арась.",
        "uploadnewversion-linktext": "Йовкстак од версия те файластонть",
        "shared-repo-from": "вана теньстэ $1",
-       "shared-repo": "вейÑ\82Ñ\8cÑ\81Ñ\8dнÑ\8c Ð²Ð°Ð½Ñ\81Ñ\82ома Ñ\82аÑ\80ка",
+       "shared-repo": "вейсэнь ванстома тарка",
        "filerevert": "Велявтомс $1 мекев",
        "filerevert-legend": "Велявтомс файланть",
        "filerevert-comment": "Тувталось:",
        "suppress": "А ванома",
        "booksources": "Кинигань лисьмапрят",
        "booksources-search-legend": "Вешнемс кинигань лисьмапрят",
-       "booksources-go": "Адя",
        "specialloguserlabel": "Топавтыцясь:",
        "speciallogtitlelabel": "Норавоматарка (коняксозо эли теицязо):",
        "log": "Совамо-лисема тевть (регистрациясь)",
        "linksearch": "Ушо ёндонь сюлмавомапенень вешнема",
        "linksearch-pat": "Вешнемкс парцун:",
        "linksearch-ns": "Лем потмозо:",
-       "linksearch-ok": "Вешнэмс",
+       "linksearch-ok": "Вешнемс",
        "linksearch-line": "$1-в сюлмавома песь моли вана тестэ $2",
        "listusers-submit": "Невтемс",
        "listusers-noresult": "Совицязо а муеви",
        "unwatchthispage": "Лоткамс ванстомадонзо",
        "notvisiblerev": "Лиякстомтомась нардазь",
        "watchlist-details": "Ванома лемрисьмесэть $1 {{PLURAL:$1|лопа|лопат}}, кортнема лопатнень лангс апак вано.",
-       "wlshowlast": "Невтемс мельсе $1 цяст $2 чить $3",
+       "wlshowlast": "Невтемс мельсе $1 цяст $2 чить",
        "watchlist-options": "Ванома потмонь аравтнемат",
        "watching": "Ванома...",
        "unwatching": "Аванома...",
        "protect-default": "Весе теицятненень маштови",
        "protect-fallback": "Вешеви ве мельс прамось «$1»-нть",
        "protect-level-autoconfirmed": "Саймас аравтомс од ды апак сёрмадстово теицятнень",
-       "protect-level-sysop": "Ансяк администраторт",
+       "protect-level-sysop": "Ансяк администратортнэнень мереви",
        "protect-summary-cascade": "каскадонь ладсо",
        "protect-expiring": "прядови $1 (UTC)",
        "protect-expiry-indefinite": "певтема",
        "undeleteviewlink": "ваномс",
        "undeleteinvert": "Кочказень таркас апаконь кочкамо",
        "undeletecomment": "Тувталось:",
-       "undeletedrevisions": "{{PLURAL:$1|1=1 лиякстомтома|$1 лиякстомтомат}} вельмевтезь",
+       "undeletedrevisions": "{{PLURAL:$1|1 лиякстомтома|$1 лиякстомтомат}} вельмевтезь",
        "undeletedrevisions-files": "{{PLURAL:$1|1=1 лиякстомтома|$1 лиякстомтомат}} ды {{PLURAL:$2|1=1 файла|$2 файлат}} вельмевтезь",
        "undeletedfiles": "{{PLURAL:$1|1=1 файла|$1 файлат}} вельмевтезь",
-       "undelete-search-box": "Ð\92еÑ\88немÑ\81 Ð½Ð°Ñ\80данÑ\8c Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c Ð¹Ñ\83тксто",
+       "undelete-search-box": "Ð\92еÑ\88немÑ\81 Ð½Ð°Ñ\80дазÑ\8c Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c Ñ\8eтксто",
        "undelete-search-prefix": "Невтемс лопат тестэ саезь:",
-       "undelete-search-submit": "Вешнэмс",
+       "undelete-search-submit": "Вешнемс",
        "undelete-error-short": "\"$1\" файлань вельмевтемстэ лиссь ильведевкс",
        "undelete-show-file-submit": "Истя",
        "namespace": "Лем потмозо:",
        "sp-contributions-search": "Путовксонь вешнеме",
        "sp-contributions-username": "IP адрес эли теицянь лем:",
        "sp-contributions-toponly": "Невтемс ансяк не витнематнень-петнематнень, конат совавтовить меельце верзиятнень юткс",
-       "sp-contributions-submit": "Вешнэмс",
+       "sp-contributions-submit": "Вешнемс",
        "whatlinkshere": "Мезе тезэнь сюлмави",
        "whatlinkshere-title": "$1 марто сюлмазь лопатне",
        "whatlinkshere-page": "Лопась:",
        "whatlinkshere-prev": "{{PLURAL:$1|1=икеле|седе икелень $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|1=сыця|сы $1}}",
        "whatlinkshere-links": "← сюлмавомапеть",
-       "whatlinkshere-hideredirs": "$1 {{PLURAL:$1|1=тарка йутавты|таркат йутавтыть}} тей",
+       "whatlinkshere-hideredirs": "$1 ютавты козонь-козонь",
        "whatlinkshere-hidetrans": "$1 сюлмавозь пелькстнэнь",
        "whatlinkshere-hidelinks": "$1 сюлмавома петь",
        "whatlinkshere-hideimages": "$1 файланть сюлмавомапензэ",
        "blocklist-target": "Норовамо тарка",
        "blocklist-expiry": "Прядови",
        "blocklist-reason": "Тувтал",
-       "ipblocklist-submit": "Вешнэме",
+       "ipblocklist-submit": "Вешнеме",
        "infiniteblock": "певтеме",
        "expiringblock": "саймас саемась прядови $1 $2 цяссто",
        "anononlyblock": "ансяк лемтеме",
        "filemissing": "Файлась а муеви",
        "thumbnail_error": "Миниатюрань теемстэ ильведькс: $1",
        "import": "Таргамс лопатнень",
-       "import-interwiki-source": "Вики лисьмапрякс/лопась:",
        "import-interwiki-templates": "Совавтомс весе лопа парцунтнэнь",
        "import-interwiki-submit": "Таргамс",
        "import-interwiki-namespace": "Норовазь лемпотмось:",
        "tooltip-ca-edit": "Те лопаськак витневи-петневи. Ансяк, ванстомадо икеле яла васнянь невтевкс повнэнть лепштика.",
        "tooltip-ca-addsection": "Ушодомс од явкс.",
        "tooltip-ca-viewsource": "Те лопась ванстозь. Ули меленк ваномонзо сонзе лисмапрянть.",
-       "tooltip-ca-history": "Те лопанть йутазь версиянзо.",
+       "tooltip-ca-history": "Те лопанть ютазь версиянзо.",
        "tooltip-ca-protect": "Аравтомс те лопанть прянь ванстомас",
        "tooltip-ca-delete": "Нардамс те лопанть, илязо улеяк",
        "tooltip-ca-move": "Ютавтык те лопанть лияв",
        "newimages-legend": "Сувтеме",
        "newimages-label": "Файлалем (эли пельксэзэ):",
        "noimages": "Арась мезе ваномс.",
-       "ilsubmit": "Вешнэмс",
+       "ilsubmit": "Вешнемс",
        "bydate": "чинь коряс",
        "ago": "$1-до икеле",
        "bad_image_list": "Лувось-форматось вана истямо:\n\nТесэ ансяк потмонть пакшкетне (рисьметне, конат ушодовить * тешкстсэ) лововить. Рисьмень васень сюлмавома пентень эряви невтемс амаштовикс файла лангс. Секе рисьминентень понгиндеряйть лия сюлмавома петь, сынь лововить башка, лиякс меремс сынь лопат, косо файлат маштовить невтемс.",
        "exif-urgency-normal": "Куншка видень ($1)",
        "exif-urgency-low": "Аламо ($1)",
        "exif-urgency-high": "Ламо ($1)",
-       "watchlistall2": "весе",
        "namespacesall": "весе",
        "monthsall": "весе",
        "confirmemail": "Кемекстамс е-почтань сёрмапаргот",
        "version-software": "Нолдань программат",
        "version-software-product": "Шкавкс-нолдавкс",
        "version-software-version": "Верзия",
-       "fileduplicatesearch": "Вешнэмс кавтаське файлат",
-       "fileduplicatesearch-legend": "Вешнэмс кавтаське",
+       "fileduplicatesearch": "Вешнемс кавтаське файлат",
+       "fileduplicatesearch-legend": "Вешнемс кавтаське",
        "fileduplicatesearch-filename": "Файла лем:",
-       "fileduplicatesearch-submit": "Вешнэмс",
+       "fileduplicatesearch-submit": "Вешнемс",
        "specialpages": "Башка тевень лопат",
        "specialpages-group-other": "Лия башка тевень лопат",
        "specialpages-group-login": "Совамс / шкамс совамотарка",
        "htmlform-reset": "Саемс мекев полавтоматнень",
        "htmlform-selectorother-other": "Лия",
        "rightsnone": "(арасть)",
+       "revdelete-summary": "витнемадо-петнемадо нурькине йовтавкс",
        "feedback-subject": "Мезде:",
        "feedback-message": "Пачтямнэсь:",
        "feedback-cancel": "А теемс",
index b22d111..b93f287 100644 (file)
@@ -9,7 +9,8 @@
                        "Parthava (on mzn.wikipedia.org)",
                        "Spacebirdy",
                        "محک",
-                       "아라"
+                       "아라",
+                       "Alirezaaa"
                ]
        },
        "tog-underline": "پیوندون زیر خط دکشی بواشه",
@@ -78,7 +79,7 @@
        "june": "ژوئن",
        "july": "ژوئیه",
        "august": "آگوست",
-       "september": "سÙ\80Ù\87â\80\8cÙ¾Ù\80تÙ\80Ù\87â\80\8cÙ\85Ù\80بÙ\80ر",
+       "september": "سپتاÙ\85بر",
        "october": "اکتبر",
        "november": "نـووه‌مـبـر",
        "december": "دسامبر",
@@ -90,7 +91,7 @@
        "june-gen": "جـون",
        "july-gen": "ژوئیه",
        "august-gen": "آگوست",
-       "september-gen": "سÙ\80Ù\87â\80\8cÙ¾Ù\80تÙ\80Ù\87â\80\8cÙ\85Ù\80بÙ\80ر",
+       "september-gen": "سپتاÙ\85بر",
        "october-gen": "اکتبر",
        "november-gen": "نـووه‌مـبـر",
        "december-gen": "دسامبر",
        "revertmove": "واچـیـه‌ن",
        "delete_and_move_confirm": "أره، پاک هاکه‌ن وه ره",
        "export": "دأیابأبه‌رده‌ن ولـگ‌ئون",
-       "exporttext": "شما بتونّی متن و تاریخچهٔ دچی‌یه بیّن اتا صفحهٔ مشخص یا یتـّا مجموعه‌ از صفحه‌ها ره به شکل دپوشنی‌یه اکس‌ام‌ال دله بریم دربَورین.\n\nاین اطلاعات ره بنشنه اتا ویکی دیگه دله که نرم‌افزار «مدیاویکی» ره اجرا کانده از طریق [[Special:Import|صفحهٔ دله‌دشنی‌ین]] وارد هاکردن.\n\nبریم‌دربَوردن صفحه‌ها وسّه، وشون عنوان ره این جعبه دله دشنین (هر سطر فقط اتا عنوان) و معلوم هاکنین که تازه دگاردسته‌ئون صفحه ره همراه نسخه‌ئون قدیمی‌تر و تاریخچهٔ صفحه خوندنّی، یا تازه دگاردسته‌ئون صفحه و اطلاعات آخرین دچی‌یه ره، تیناری اشنّی.\n\nدومین حالت سَره، شما بتونّی اتا لینک جه استفاده هاکنین، مثلاً [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] صفحهٔ «[[{{MediaWiki:Mainpage}}]]» وسّه.",
+       "exporttext": "شما بتونّی متن و تاریخچهٔ دچی‌یه بیّن اتا صفحهٔ مشخص یا یتـّا مجموعه‌ از صفحات ره به شکل دپوشنی‌یه اکس‌ام‌ال دله بریم دربَورین.\n\nاین اطلاعات ره بنشنه اتا ویکی دیگه دله که نرم‌افزار «مدیاویکی» ره اجرا کانده از طریق [[Special:Import|صفحهٔ دله‌دشنی‌ین]] وارد هاکردن.\n\nبریم‌دربَوردن صفحات وسّه، وشون عنوان ره این جعبه دله دشنین (هر سطر فقط اتا عنوان) و معلوم هاکنین که تازه دگاردسته‌ئون صفحه ره همراه نسخه‌ئون قدیمی‌تر و تاریخچهٔ صفحه خوندنّی، یا تازه دگاردسته‌ئون صفحه و اطلاعات آخرین دچی‌یه ره، تیناری اشنّی.\n\nدومین حالت سَره، شما بتونّی اتا لینک جه استفاده هاکنین، مثلاً [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] صفحهٔ «[[{{MediaWiki:Mainpage}}]]» وسّه.",
        "allmessages-filter-all": "همه",
        "thumbnail-more": "گت بوو",
        "import-interwiki-submit": "بیاردن",
index 6426b3a..f94de72 100644 (file)
        "pager-newer-n": "{{PLURAL:$1|1 yancuīc|$1 yancuīc}}",
        "pager-older-n": "{{PLURAL:$1|1 huēhuetl|$1 huēhueh}}",
        "booksources": "āmoxmēyalli",
-       "booksources-go": "Yāuh",
        "specialloguserlabel": "Tlatequitiltilīlli:",
        "speciallogtitlelabel": "Tōcāitl:",
        "log": "Tlahcuilōlloh",
        "watchthispage": "Tictlachiyāz inīn zāzanilli",
        "unwatch": "Ahtictlachiyāz",
        "watchlist-details": "{{PLURAL:$1|$1 zāzanilli|$1 zāzaniltin}} motlachiyaliz, ahmo mopōhua tēixnāmiquiliztli.",
-       "wlshowlast": "Tiquinttāz tlapatlaliztli īhuīcpa achto $1 yēmpohualminuhtli, $2 tōnaltin $3",
+       "wlshowlast": "Tiquinttāz tlapatlaliztli īhuīcpa achto $1 yēmpohualminuhtli, $2 tōnaltin",
        "watching": "Tlachiyacah...",
        "unwatching": "Ahtlachiyacah...",
        "enotif_impersonal_salutation": "tlatequitiltilīlli īpan {{SITENAME}}",
        "exif-gpslatitude-s": "Huiztlān",
        "exif-gpslongitude-e": "Tlāpcopa huehtlatzīncāyōtl",
        "exif-gpslongitude-w": "Cihuātlāmpa huehtlatzīncāyōtl",
-       "watchlistall2": "mochīntīn",
        "namespacesall": "mochīntīn",
        "monthsall": "(mochīntīn)",
        "confirmemail": "Ticchicāhuāz e-mail",
        "blankpage": "Iztāc zāzanilli",
        "htmlform-selectorother-other": "Occē",
        "rightsnone": "ahtlein",
+       "revdelete-summary": "ticpatlāz tlahcuilōltōn",
        "searchsuggest-search": "Tlatēmoliztli",
        "api-error-ok-but-empty": "Tlâtek îtlakawilistli: Âmò tènankilia in tlatèmakani.",
        "api-error-overwrite": "Awel motlâkuilnepanòltis sè èwalli tlèn yi katki.",
index 7a2d8f4..e1b6b58 100644 (file)
        "moredotdotdot": "Iáu-ū",
        "morenotlisted": "這毋是完整的表",
        "mypage": "Ia̍h",
-       "mytalk": "Góa ê thó-lūn",
+       "mytalk": "Thó-lūn",
        "anontalk": "Chit ê IP ê thó-lūn-ia̍h",
        "navigation": "Se̍h chām",
        "and": "&#32;kap",
        "unprotectthispage": "kái chit ia̍h ê pó-hō͘",
        "newpage": "Sin ia̍h",
        "talkpage": "Thó-lūn chit ia̍h",
-       "talkpagelinktext": "thó-lūn",
+       "talkpagelinktext": "Thó-lūn",
        "specialpage": "Te̍k-sû-ia̍h",
        "personaltools": "Kò-jîn kang-khū",
        "articlepage": "Khoàⁿ loē-iông ia̍h",
        "changeemail": "Kái tiān-chú-phoe ê tē-chí",
        "changeemail-oldemail": "Chit-má ê E-mail tē-chí:",
        "changeemail-newemail": "Sin E-mail ê chū-chí:",
-       "changeemail-cancel": "Chhú-siau",
        "bold_sample": "Chho·-thé bûn-jī",
        "bold_tip": "Chho·-thé jī",
        "italic_sample": "Chhú-thé ê bûn-jī",
        "search-section": "(toān-lo̍h $1)",
        "searchall": "choân-pō·",
        "showingresults": "Ē-kha tùi #<b>$2</b> khai-sí hián-sī <b>$1</b> hāng kiat-kó.",
-       "showingresultsheader": "對'''$4'''的{{PLURAL:$5|第 '''$1''' 到第 '''$3''' 項結果|第 '''$1 - $2''' 項,總共 '''$3''' 項結果}}",
        "powersearch-legend": "Kiám-sek",
        "preferences": "Siat-tēng",
        "mypreferences": "Góa ê siat-tēng",
        "unwatch": "Mài kàm-sī",
        "unwatchthispage": "Mài koh kàm-sī",
        "watchlist-details": "Kàm-sī-toaⁿ ū {{PLURAL:$1|$1 ia̍h|$1 ia̍h}}, thó-lūn-ia̍h bô sǹg chāi-lāi.",
-       "wlnote": "Ē-kha sī '''$2''' tiám-cheng í-lāi siōng sin ê $1 ê kái-piàn.",
-       "wlshowlast": "Hián-sī chêng $1 tiám-cheng $2 ji̍t $3",
+       "wlnote": "$3 $4: Ē-kha sī <strong>$2</strong> tiám-cheng í-lāi siōng sin ê <strong>$1</strong> ê kái-piàn.",
+       "wlshowlast": "Hián-sī chêng $1 tiám-cheng $2 ji̍t",
        "deletepage": "Thâi ia̍h",
        "confirm": "Khak-tēng",
        "excontent": "lōe-iông sī: '$1'",
        "bydate": "chiàu ji̍t-kî",
        "metadata-expand": "Hián-sī iù-chiat",
        "metadata-collapse": "Am iù-chiat",
-       "watchlistall2": "choân-pō͘",
        "namespacesall": "choân-pō·",
        "monthsall": "choân-pō͘",
        "confirmemail": "Khak-jīn e-mail chū-chí",
        "watchlistedit-normal-submit": "Mài kàm-sī",
        "watchlistedit-normal-done": "Í-keng ū $1 ia̍h ùi lí ê kám-sī-toaⁿ soá cháu:",
        "watchlisttools-edit": "Khoàⁿ koh kái kàm-sī-toaⁿ",
-       "watchlisttools-raw": "Kái tshing-chheng ê kàm-sī-toaⁿ",
+       "watchlisttools-raw": "Kái chhiⁿ ê kàm-sī-toaⁿ",
        "duplicate-defaultsort": "'''Thê-chhíⁿ lí:'''Siat-piān ê pâi-lia̍t hong-sek \"$2\" thè-oāⁿ chìn-chêng ê siat-piān ê pâi-lia̍t hong-sek \"$1\".",
        "version": "Pán-pún",
        "specialpages": "Te̍k-sû-ia̍h",
index ea9c9dc..33410bd 100644 (file)
@@ -9,7 +9,8 @@
                        "PiRSquared17",
                        "SabineCretella",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Candalua"
                ]
        },
        "tog-underline": "Sottolinia 'e jonte:",
@@ -21,7 +22,7 @@
        "tog-numberheadings": "Annúmmera automatecamente 'e títule",
        "tog-showtoolbar": "Aspone 'a barra d''e stromiente 'e cagno",
        "tog-editondblclick": "Cagna 'e pàggene cliccanno ddoje vote",
-       "tog-editsectiononrightclick": "Permette 'e cangne 'e sezzione cliccanno p''o tasto destro ncopp 'e titule 'e sezzione",
+       "tog-editsectiononrightclick": "Permette 'e cagnà 'e sezzione cliccanno p' 'o tasto dritto ncopp' 'e titule 'e sezzione",
        "tog-watchcreations": "Azzecca 'e ppaggene criate e li files carrecate ncopp'â l'elenco 'e cuntrollo",
        "tog-watchdefault": "Azzecca 'e paggene e li files cagnàte a l'elenco 'e cuntrollo",
        "tog-watchmoves": "Azzecca 'e paggene e li files spustate a l'elenco 'e cuntrollo",
        "permalink": "Jonta permanente",
        "print": "Stampà",
        "view": "Vere",
+       "view-foreign": "Vide ncopp'a $1",
        "edit": "Càgna",
+       "edit-local": "Càgna descrizione lucale",
        "create": "Cria",
+       "create-local": "Azzecca descrizione lucale",
        "editthispage": "Càgna chesta paggena",
        "create-this-page": "Cria sta paggena",
        "delete": "Scancèlla",
        "deletethispage": "Scancèlla chésta paggena",
-       "undeletethispage": "Ripristina chista paggena",
+       "undeletethispage": "Arrepiglia chista paggena",
+       "undelete_short": "Arremedia {{PLURAL:$1|na verziona|$1 vverziune}}",
+       "viewdeleted_short": "Vide {{PLURAL:$1|nu cagnamiénto scancellato|$1 cagnamiénte scancellate}}",
        "protect": "Prutegge",
        "protect_change": "càgna",
        "protectthispage": "Ferma chesta paggena",
        "otherlanguages": "Ate lengue",
        "redirectedfrom": "(Redirect 'a $1)",
        "redirectpagesub": "Paggena 'e redirect",
-       "lastmodifiedat": "Urdema cagnamiénto pe' a paggena: $2, $1.",
-       "viewcount": "Chesta paggena è stata lètta {{PLURAL:$1|una vòta|$1 vòte}}.",
+       "redirectto": "Reindirizza a:",
+       "lastmodifiedat": "Urdemo cagnamiénto pe' a paggena: $2, $1.",
+       "viewcount": "Chesta paggena è stata liggiùta {{PLURAL:$1|una vòta|$1 vòte}}.",
        "protectedpage": "Paggena prutetta",
        "jumpto": "Vaje a:",
        "jumptonavigation": "navigazione",
        "jumptosearch": "truova",
+       "view-pool-error": "Ve cercammo scusa, 'e servers hanno troppo carico mo'.\nTroppe utente stanno cercanno 'e veré sta paggena.\nPe' piacere, aspettate nu poco primma 'e turnà a carrecà sta paggena.\n\n$1",
+       "generic-pool-error": "Ve cercammo scusa, 'e servers hanno troppo carico mo'.\nTroppe utente stanno cercanno 'e veré sta risorsa.\nPe' piacere, aspettate nu poco primma 'e turnà a carrecà sta risorsa.",
+       "pool-timeout": "Tiempo pe' s'aspettà ô blocco",
+       "pool-queuefull": "A córa 'e fatiche è chiena",
        "pool-errorunknown": "Errore scanusciuto",
+       "pool-servererror": "'O servizio contatore d''e fatiche nun è a disposizióne ($1).",
        "aboutsite": "'Nfrummazione ncòpp'a {{SITENAME}}",
        "aboutpage": "Project:'Nfrummazione",
        "copyright": "Cuntenute suggiette a licienza 'e auso $1 se nun fuje ritto atro.",
        "copyrightpage": "{{ns:project}}:Copyrights",
-       "currentevents": "Novità",
+       "currentevents": "Nuvità",
        "currentevents-url": "Project:Novità",
        "disclaimers": "Avvertimiènte",
        "disclaimerpage": "Project:Avvertimiènte generale",
        "privacy": "'Nformazzione ppe a privacy",
        "privacypage": "Project:'Nfrummazione ncopp'â privacy",
        "badaccess": "Nun haje 'e premmesse abbastante.",
+       "badaccess-group0": "Nun v'è permesso 'a ffà l'azione richiesta.",
+       "badaccess-groups": "L'azione ch'ê richiesto è permessa sulamente all'utente ca ce stanno dint'a {{PLURAL:$2|'o gruppo|uno d' 'e gruppe}}: $1.",
+       "versionrequired": "Ce vò 'a verziona $1 'e MediaWiki",
+       "versionrequiredtext": "Pe' usà sta paggena ce vò 'a verziona $1 'e MediaWiki. Vide [[Special:Version|'a paggena 'e verzione]].",
        "ok": "OK",
        "retrievedfrom": "Estratto 'e \"$1\"",
-       "youhavenewmessages": "Haje $1 ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Tenite}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Tiene}} $1 'a {{PLURAL:$3|n'atu utente|$3 utente}} ($2).",
+       "youhavenewmessagesmanyusers": "Tiene $1 'a tant'utente ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|na mmasciata nova|999=mmasciate nnove}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|urdemo cagnamiento|999=urdeme cagnamiente}}",
        "youhavenewmessagesmulti": "Tiene nuove mmasciate $1",
        "editsection": "càgna",
        "editold": "càgna",
        "toc": "Énnece",
        "showtoc": "faje vedé",
        "hidetoc": "annascunne",
+       "collapsible-collapse": "Annascunne",
        "collapsible-expand": "faje vede",
-       "thisisdeleted": "Vere o ripristina $1?",
+       "confirmable-confirm": "Site {{GENDER:$1|sicuro|sicura}}?",
+       "confirmable-yes": "Sì",
+       "confirmable-no": "No",
+       "thisisdeleted": "Vedè o arripiglià $1?",
        "viewdeleted": "Vire $1?",
+       "restorelink": "{{PLURAL:$1|nu cagnamiénto scancellato|$1 cagnamiénte scancellate}}",
        "feedlinks": "Feed:",
+       "feed-invalid": "'O tipo 'e sottoscrizione p' 'o feed nun è buono",
+       "feed-unavailable": "Nun ce stanno 'e feed sinnecaziona",
+       "site-rss-feed": "Feed 'e sinnecaziona RSS 'e $1",
        "site-atom-feed": "Feed Atom 'e $1",
+       "page-rss-feed": "Feed RSS pe' \"$1\"",
        "page-atom-feed": "Feed Atom ppe \"$1\"",
        "red-link-title": "$1 ('a paggena nun esiste)",
+       "sort-descending": "Urdinamento dicriscente",
+       "sort-ascending": "Urdinamento criscente",
        "nstab-main": "Articulo",
        "nstab-user": "Paggena utente",
+       "nstab-media": "File multimediale",
        "nstab-special": "Paggena speciale",
        "nstab-project": "Paggena 'e servizio",
        "nstab-image": "Fiùra",
        "nstab-template": "Modello",
        "nstab-help": "Ajùto",
        "nstab-category": "Categurìa",
+       "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",
+       "nospecialpagetext": "<strong>'A paggena speciale richiesta nun è ricanusciuta.</strong>\n\nL'alenco d' 'e paggene valide spiciale 'o truove int'a [[Special:SpecialPages|l'Elenco d' 'e paggine spiciale]].",
+       "error": "Sbaglio",
+       "databaseerror": "Sbaglio dint'a database",
+       "databaseerror-text": "C'è stato nu sbaglio dint'a na richiesta â database.\nPuò darse ca ce sta nu bug int' 'o software",
+       "databaseerror-textcl": "C'è stato nu sbaglio dint'a na richiesta â database.",
+       "databaseerror-query": "Richiesta: $1",
+       "databaseerror-function": "Funzione: $1",
+       "databaseerror-error": "Sbaglio: $1",
+       "laggedslavemode": "'''Attenzione:''' 'a paggena putesse nun fà vedé ll'aggiornamente cchiù recente.",
+       "readonly": "Database bloccato",
+       "enterlockreason": "Miette 'o mutivo 'e blocco, nzieme a 'o mumento quanno se penza ca 'o blocco se sarrà fernuto",
+       "readonlytext": "Mo' mo' 'o database è bloccato e nun se ponno azzeccà cagnamiente o pàggene. 'O blocco è normalmente azzeccato a n'operazione semprice 'e manutenzione, e quanno s'è fernuta allora 'a paggena addeventa nurmale.\n\nL'ammenistratore d' 'o sistema ch'a fatto 'o blocco ce dà sta spiegazione: $1",
+       "missing-article": "'O database nun trova 'o testo 'e na paggena c'adda stà, c' 'o nomme \"$1\" $2.\n\nNormalmente, chesto succere quanno s'è richiamato, a partire d' 'a cronologgia o pùre a 'o confronto tra verzione, nu cullegamento a na paggena scancellata, a nu confronto tra verziune inesistente o a nu confronto tra verziune re-pulezzate d' 'a cronologgia.\n\n'N caso cuntrario, può darse pure nu sbaglio dint'o software.\nPer piacere, mannate na mmasciata ccà all'[[Special:ListUsers/sysop|amministratore]] annummenanno l'URL 'n quistiona.",
        "missingarticle-rev": "(nummero 'e verzione: $1)",
+       "missingarticle-diff": "(Diff: $1, $2)",
+       "readonly_lag": "'O database s'è bloccato automaticamente pe' tramente ca 'e servers 'e database schiave sincronizzano c' 'o server masto.",
        "internalerror": "Errore 'nterno",
        "internalerror_info": "Errore 'nterno: $1",
+       "filecopyerror": "Nun se può copiare 'o file \"$1\" int'a \"$2\".",
+       "filerenameerror": "Nun se può rinnummenare 'o file \"$1\" into \"$2\".",
        "filedeleteerror": "Nun se pô scancellà 'o file \"$1\"",
+       "directorycreateerror": "Nun se può crià 'a cartella \"$1\".",
+       "filenotfound": "Nun se può truvà 'o file \"$1\".",
+       "unexpected": "Valore imprevisto: \"$1\"=\"$2\".",
+       "formerror": "Sbàglio: nun se può mannà 'o modulo",
+       "badarticleerror": "Chest'azione nun se può fà int'a sta paggena.",
        "cannotdelete": "Nun è possibbele scassà 'a paggena o 'a fiura $1 addamannata. Putria éssere stato già scancellato.",
+       "cannotdelete-title": "Nun se può scancellà 'a paggena \"$1\"",
+       "delete-hook-aborted": "'O scancellamiento è stato annullato 'a 'o «hook».\nNun dette spiegazione nisciuna.",
+       "no-null-revision": "Nun se può crià na nnova revisione nulla p' 'a paggena \"$1\"",
        "badtitle": "'O nnomme nun è jùsto",
+       "badtitletext": "'O titolo d' 'a paggena richiesta è abbacante, sbagliato o pure nun è linkato buono a 'o titolo inter-lengua o inter-wiki.\nPutesse pure tené uno o cchiù carattere ca nun se ponno usà dint'e titule.",
+       "perfcached": "Può darse, ch' 'e ddate ca stanno ccà (\"ncache\") nun song'agghiurnate. Nu massimo 'e {{PLURAL:$1|unu risultato è|$1 risultate songhe}} a disposizione 'n \"cache\".",
+       "perfcachedts": "'E ddate ca stanno ccà songhe asciute 'a na copia \"cache\" d' 'o database, 'o cuale tene l'úrdemo agghiurnamento 'o $1. Nu massimo 'e {{PLURAL:$4|unu risultato è|$4 risultate songhe}} a disposizione dint'a \"cache\".",
+       "querypage-no-updates": "Ll'agghiurnamente pe' sta paggena songo sospese mmo'. 'E ddate cuntenute ccà nun s'agghiurnarranno.",
        "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.",
+       "protectedpagetext": "Sta paggena s'è prutetta pe' ne bloccà 'a mudifeca o n'ata azione.",
+       "viewsourcetext": "Putisse vedé e copià 'o codece surgiva 'e sta paggena:",
+       "viewyourtext": "Putisse vedé e copià 'o codice surgiva d' 'e <strong>cagnamiénte tuoje</strong> a sta paggena:",
+       "protectedinterface": "Sta paggena nce appruviggióna 'e n'interfaccia testo p' 'o software dint'a sta wiki, e s'è prutetta pe' nce scanzà 'e cocch'abbuso.\nSi se buò azzeccà o cagnà traduzzione ncopp'a tutte 'e wiki, pe piacere ausate [//translatewiki.net/ translatewiki.net], 'o pruggetto Mediawiki p'a localizzaziona dint'a l'ate llengue",
+       "editinginterface": "'''Attenziò:''' 'O testo 'e sta paggena ffà parte 'e ll'interfaccia utente d' 'o sito.\nTutt' 'e cagnamiénte fatte a sta paggena cumpareno dint' 'e mmasciate 'e ll'interfaccia veduta 'a tutte ll'utente dint'a sta wiki.\nSi se buò azzeccà o cagnà traduzzione ncopp'a tutte 'e wiki, pe piacere ausate [//translatewiki.net/ translatewiki.net], 'o pruggetto Mediawiki p'a localizzaziona dint'a l'ate llengue",
+       "cascadeprotected": "Sta paggena è stata prutetta 'a 'o cangamento pecché sta dint'a {{PLURAL:$1|sta paggena, che è prutetta|sti paggene, che songo prutette}} quann' 'a l'ozione \"ricurziva\" è attiva:\n$2",
+       "namespaceprotected": "Nun avite permesso a cagnà 'e paggene dint'a stu namespace '''$1'''.",
+       "customcssprotected": "Nun v'è permesso 'a cagnà sta paggena CSS, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
+       "customjsprotected": "Nun v'è permesso 'a cagnà sta paggena JavaScript, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
+       "mycustomcssprotected": "Nun v'è permesso 'a cagnà sta paggena CSS.",
+       "mycustomjsprotected": "Nun v'è permesso 'a cagnà sta paggena JavaScript.",
+       "myprivateinfoprotected": "Nun v'è permesso a cagnà 'a nfurmaziona privata vuosta.",
+       "mypreferencesprotected": "Nun v'è permesso 'a cagnà 'e preferenze tuoje.",
+       "ns-specialprotected": "'E paggene spiciale nun se ponno cagnà.",
+       "titleprotected": "'A criazione 'e stu titolo è stata bloccata 'a ll'utente [[User:$1|$1]].\n'A ragione è chesta: ''$2''.",
+       "filereadonlyerror": "Nun se può cagnà 'o file \"$1\" pecché 'o repository 'e file \"$2\" sta 'n modo sulo-lettura.\n\nL'ammenistratore che l'ha bloccato ha dato sta ragione: \"$3\".",
+       "invalidtitle-knownnamespace": "Titolo nun buono c' 'o namespace \"$2\" e testo \"$3\"",
+       "invalidtitle-unknownnamespace": "Titolo nun buono c' 'o namespace scanusciuto \"$1\" e testo \"$2\"",
        "exception-nologin": "Acciesso nun affettuato",
-       "logouttext": "'''Site asciùte.'''\n\nNota ca arcune paggene potrebbero cuntinuà ad apparire comme se 'o logout nun fosse avvenuto finché nun venne pulita 'a cache d\"o proprio browser.",
+       "exception-nologin-text": "Pe' piacere facite ll'accieso pe putè accedere a sta paggena o azione.",
+       "exception-nologin-text-manual": "Pe' piacere $1 pe putè trasì dint'a sta paggena o azione.",
+       "virus-badscanner": "Sbaglio 'e configurazione: antivirus scanusciuto: ''$1''",
+       "virus-scanfailed": "scanziona fallita (codece $1)",
+       "virus-unknownscanner": "antivirus scanusciuto:",
+       "logouttext": "'''Site asciùte.'''\n\nNota ca arcune paggene putessero cuntinuà ad cumparì comme se 'o logout nun fosse affettuato fin quanno nun sarrà pulezzata 'a cache d\"o proprio browser.",
        "welcomeuser": "Bemmenuto, $1!",
+       "welcomecreation-msg": "'O cunto vuosto è stato criato.\nMo' putite cagnà 'e [[Special:Preferences|preferenze 'e {{SITENAME}}]].",
        "yourname": "Nomme utente",
        "userlogin-yourname": "Nomme utente",
        "userlogin-yourname-ph": "'Nserisce 'o tujo nomme utente",
        "createacct-yourpasswordagain-ph": "'Nserisce 'e novo 'a password",
        "remembermypassword": "Allicuordate d\"a password (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "userlogin-remembermypassword": "Mantienime cullegato",
+       "userlogin-signwithsecure": "Usa na conessione sicura",
        "yourdomainname": "Spiecà 'o dumminio",
+       "password-change-forbidden": "Nun se ponno cagnà 'e password ncopp'a sta wiki.",
+       "externaldberror": "Ce sta n'errore ch' 'e server d'autenticazione esterno, o pure nun v'è permesso accedere all'aghiurnamento d' 'o cunto sterno vuosto.",
        "login": "Tràse",
        "nav-login-createaccount": "Tràse o cria n'acciesso novo",
        "userlogin": "Tràse o cria n'acciesso novo",
        "logout": "Jèsce",
        "userlogout": "Jèsce",
        "notloggedin": "Acciesso nun affettuato",
-       "userlogin-noaccount": "Nun haje ancora n'acciesso?",
-       "nologin": "Nun haje ancora n'acciesso? '''$1'''.",
+       "userlogin-noaccount": "Nun tenite ancora n'acciesso?",
+       "userlogin-joinproject": "Fà 'o riggistro ncopp'a {{SITENAME}}",
+       "nologin": "Nun tenite ancora n'acciesso? '''$1'''.",
        "nologinlink": "Crialo mmo",
        "createaccount": "Cria nu cunto novo",
        "gotaccount": "Tiene già nu cunto? '''$1'''.",
        "gotaccountlink": "Tràse",
-       "userlogin-resetlink": "Haje dimenticato 'e toje date 'e acciesso?",
+       "userlogin-resetlink": "V'avite scurdato 'e dettaglie d'acciesso vuoste?",
+       "userlogin-resetpassword-link": "Te sì scurdat' 'a password?",
+       "userlogin-helplink2": "Aiuto cu l'accieso",
+       "userlogin-loggedin": "Sì già connesso comme {{GENDER:$1|$1}}.\nUsa 'o modulo ccà abbascio pe trasì com'a n'atu utente.",
+       "userlogin-createanother": "Cria n'at'account",
+       "createacct-emailrequired": "Indirizzo email",
+       "createacct-emailoptional": "Indirizzo 'e posta elettronica (ozzionale)",
+       "createacct-email-ph": "Scrive 'o nderizzo mail tuo",
+       "createacct-another-email-ph": "Scrive nderizzo mail",
+       "createaccountmail": "Usa na password qualunque temporanea e manna sta password a l'indirizzo 'e posta e-mail specificato",
+       "createacct-realname": "Nomme riale (ozzionale)",
        "createaccountreason": "Mutivo:",
        "createacct-reason": "Mutivo",
+       "createacct-reason-ph": "Pecché staje crianno n'at'utenza",
+       "createacct-captcha": "Cuntrollo 'e sicurezza",
+       "createacct-imgcaptcha-ph": "Scrive 'o testo ca vire ncoppa",
        "createacct-submit": "Cria 'a toja utenza",
        "createacct-another-submit": "Cria 'n atro account",
        "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}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|contribbutòre recente|contribbuttore recente}}",
+       "badretype": "'E passwords ch'è mis nun songe eguale.",
+       "userexists": "'O nomme utente ch'avete miso è già ausàto.\nPe' piacere sciglite n'atu nomme.",
        "loginerror": "Probblema 'e accièsso",
+       "createacct-error": "Errore 'e criazione 'e cunto",
+       "createaccounterror": "Nun se può crià nu cunto: $1",
+       "nocookiesnew": "'A riggistrazione è stata completata, ma nun se può accedere a {{SITENAME}} pecché 'e cookie songo disattivate. Prova n'ata vota c' 'o nomme e 'a password quanno 'e cookie sarrann'attivate dint'o navigatore stesso.",
+       "nocookieslogin": "{{SITENAME}} usa cookies pe' putè dà accies'a ll'utente.\n'E cookies vuoste songo stutate.\nPe' piacere appicciate 'e cookies dint'o navigatóre e pruvate n'ata vota.",
+       "nocookiesfornew": "'O cunto utente nu s'è criato, pecché nun s'è potuto confirmà d' 'a fonte suja.\nVide si 'e cookies song'appicciate, ricarreca 'a paggena e prova n'ata vota.",
+       "noname": "Nun avite specificato nu nomme valido d'utente.",
        "loginsuccesstitle": "Acciesso affettuato",
        "loginsuccess": "'''Si stato cunnesso ô server 'e {{SITENAME}} cu 'o nomme utente 'e \"$1\".'''",
+       "nosuchuser": "Nun è riggistrato nisciuno utente c' 'o nomme \"$1\".\n'E nomme utente songo sensibbele a 'e maiuscole.\nCuntrolla 'o nomme nzertàto, o [[Special:UserLogin/signup|crìa n'utenza nova]].",
        "nosuchusershort": "Nun ce stanno utente cu o nòmme \"$1\". Cuntrolla si scrivìste buòno.",
        "nouserspecified": "Tiene 'a dìcere nu nomme pricìso.",
+       "login-userblocked": "Chist'utente è bloccato. Nun se può effettuà 'o login.",
+       "wrongpassword": "'A password nzertàta nun è bbona.\nPe' piacere pruvate n'ata vota.",
+       "wrongpasswordempty": "'A password nzertàta è abbacante.\nPe' piacere pruvate n'ata vota.",
+       "passwordtooshort": "'E password hann'avé minimo {{PLURAL:$1|nu carattere|$1 carattere}}.",
+       "password-name-match": "'A password adda essere diverza 'a 'o nomme utente.",
+       "password-login-forbidden": "L'uso 'e stu nomme utente e password è stato proibito.",
+       "mailmypassword": "Riabbìa 'a password",
+       "passwordremindertitle": "Nnova password temporale pe' {{SITENAME}}",
+       "passwordremindertext": "Cocche perzona (pussibbilmente tu, cu n'innerizzo IP $1) ha dimmannato l'invio 'e na password d'accieso nova pe' {{SITENAME}} ($4).\nNa password temporanea e' l'utente \"$2\" s'è abbiata comme \"$3\".\nSi chest'è stata l'intenzione toja, allora hè a trasì dint'o sito e cagnà 'a password mò. 'A password temporanea scade aropp'a {{PLURAL:$5|nu juorno|$5 ghiuorne}}.\n\nSi nun sì stato tu a dimannà 'a password, o pure hè truvat'a password e nun 'a bbuò cagnà cchiù, allora nun fà niente e continua a usare 'a password viecchia.",
+       "noemail": "Nun ce sta indirizzo e-mail pe' l'utente \"$1\".",
+       "noemailcreate": "S'add'appruviggiunà n'indirizzo e-mail buono.",
+       "passwordsent": "Na password nova è stata inviata a l'innerizzo e-mail riggistrato 'a ll'utente \"$1\".\nPe' piacere, trasite appena avite ricevuta sta password.",
+       "blocked-mailpassword": "Ll'IP tuoja è bloccata pe' scrivere, picciò nun se ponno usà 'e ffunzione pe te mannà na password nova.",
+       "eauthentsent": "Na mmasciata 'e conferma t'è stata mannata a l'indirizzo e-mail nzignàto.\nApprimm' 'e te mannà n'atu mail, hè 'a stà 'a ffà 'e struzione dint'a l'e-mail, pe' cunfermà ca 'o cunto fosse d' 'o tujo overo.",
+       "throttled-mailpassword": "S'è mannata na mail pe te' riabbià 'a password 'a meno 'e {{PLURAL:$1|n'ora|$1 ore}}.\nPe' ce sparagnà abbuse, 'a funzione 'e riabbiamento d' 'a password se può usa sulamente na vota ogne {{PLURAL:$1|ora|$1 ore}}.",
+       "mailerror": "Errore pe' tramente ca se mannava na mmasciata: $1",
        "acct_creation_throttle_hit": "{{PLURAL:$1|1 registrazzione è già stata effettuata|$1 registrazzione song già state effettuate}} 'e qualcuno cu 'o tujo stisso innerezzo IP dint'ô urdemo juorno: è 'o massimo cunsentito 'n chisto periodo 'e tiempo.\nPerciò, 'e utente ca ausano chisto innerezzo IP nun possono registrarse ppe 'o mumiento.",
+       "emailauthenticated": "'O ndirizzo email è stato cunfermato 'o $2 a 'e $3.",
+       "emailnotauthenticated": "'O ndirizzo 'e posta elettronica nun è stat'ancora cunfermato.\nNun se mannarranno mmasciate e-mail p' ' funzione ccà abbascio.",
+       "noemailprefs": "Avite 'a specificà nu ndirizzo e-mail pe ll'attivà sti funzione.",
+       "emailconfirmlink": "Cunferma 'o nderizzo mail d' 'o tujo.",
+       "invalidemailaddress": "'O nderizzo e-mail scritto nun se può accettà pecché nun tene nu furmatto buono.\nScrive n'ata vota nu nderizzo bbuono o abbacanta 'a casella.",
+       "cannotchangeemail": "'E ccunte mail nun se ponno cagnà dint'a sta wiki.",
+       "emaildisabled": "Chistu sito nun può mannà mmasciate e-mail.",
        "accountcreated": "Cunto criato",
+       "accountcreatedtext": "È stata criata n'utenza pe' [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|mmasciata]]).",
+       "createaccount-title": "Criazione 'e nu cunto pe' {{SITENAME}}",
+       "createaccount-text": "Coccherun ave fatto nu cunto ncoppa {{SITENAME}} ($4) a nomme 'e $2, associato a st'indirizzo 'e posta elettronica. 'A password pe l'utente \"$2\" è abbiàta a comme \"$3\".\nFosse buono 'e trasì ampressa e cagnà 'a password subbeto.\n\nSi 'a criazione d' 'o cunto è stata nu sbaglio, allora putite lassà perde sta mmasciata.",
+       "login-throttled": "Songo state fatte troppe tentative 'a trasì dint'a nu periodo troppo curto.\nAspetta nu $1 e prova aròppo.",
+       "login-abort-generic": "'O login tujo nun ha avuto succiesso - Annullato",
+       "login-migrated-generic": "'O cunto tuo nun sè mmigrato, e l'username d' 'o tuojo nun esiste cchiù dint'a sta wiki.",
        "loginlanguagelabel": "Lengua: $1",
+       "suspicious-userlogout": "'A richiesta 'e disconnessione d' 'a toja è stata negate pecché pare ca fosse mannata 'a nu navigatóre rutto o nu proxy 'e \"caching\".",
+       "createacct-another-realname-tip": "'O nomme overo vuosto è ozzionale.\nSi sciglite 'e nzertà 'o nomme overo, chesto s'ausarrà pe' dà l'utente l'attribuzione d' 'a fatica fatta.",
+       "pt-login": "Tràse",
+       "pt-login-button": "Tràse",
+       "pt-createaccount": "Cria nu cunto nuovo",
+       "pt-userlogout": "Jèsce",
+       "php-mail-error-unknown": "Errore scanusciuto dint'a funzione PHP mail()",
+       "user-mail-no-addy": "Avite cercato 'e mannà na mmasciata e-mail senza indirizzo.",
+       "user-mail-no-body": "Avite cercato 'e mannà na mmasciata e-mail c' 'o testo abbacante o troppo curto.",
        "changepassword": "Cagna password",
+       "resetpass_announce": "Pe' trasì finalmente, avite 'abbià na password nova.",
+       "resetpass_header": "Cagna 'a password d' 'o cunto",
+       "oldpassword": "Password viecchia:",
+       "newpassword": "Password nova:",
+       "retypenew": "Ripete 'a password:",
+       "resetpass_submit": "Stabbelisce 'a password e tràse",
+       "changepassword-success": "'A password è stata cagnata currettamente!",
+       "changepassword-throttled": "Songo state fatte troppe tentative 'a trasì.\nAspetta nu $1 apprimma 'e pruvà n'ata vota.",
+       "resetpass_forbidden": "'E password nun se ponno cagnà",
+       "resetpass-no-info": "Avite 'a trasì ('o login) pe ffà l'acciesso a sta paggena direttamente.",
+       "resetpass-submit-loggedin": "Cagna password",
        "resetpass-submit-cancel": "Canciella",
+       "resetpass-wrong-oldpass": "'A password temporanea o attuale nun è bbona.\n'A password putesse avé cagnato, o pure s'è addimannata na password temporanea nova.",
+       "resetpass-recycled": "Pe piacere riabbiate 'a password e mettete na password differénte a chella 'e mmò.",
+       "resetpass-temp-emailed": "Sì trasuto cu nu codece temporaneo, mannato via e-mail. Pe' fà cumpleta 'a riggistraziona, avite 'e abbià na password nova ccà:",
+       "resetpass-temp-password": "Password temporanea:",
+       "resetpass-abort-generic": "'O cagnamiento d' 'a password s'è spezzato 'a na stensione.",
+       "resetpass-expired": "'A pasword è ammaturata. Avite 'e ffà na password nova pe putè trasì.",
+       "resetpass-expired-soft": "'A pasword toja è ammaturata e s'adda riabbià. Avite 'e scegliere na password nova mò, o ffà click ncopp'a \"{{int:resetpass-submit-cancel}}\" p' 'a riabbià aroppo.",
+       "resetpass-validity-soft": "'A password toja nun è bbona: $1\n\nAvite 'e scegliere na password nova mò, o ffà click ncopp'a \"{{int:resetpass-submit-cancel}}\" p' 'a riabbià aròppo.",
+       "passwordreset": "Riabbìa 'a password",
+       "passwordreset-text-one": "Ghienche stu modulo pe' ricevere na mmasciata e-mail c' 'a password temporanea.",
+       "passwordreset-text-many": "{{PLURAL:$1|Ghienche uno d' 'e campe pe' ricevere na password temporanea cu na mmasciata e-mail.}}",
+       "passwordreset-legend": "Riabbìa 'a password",
+       "passwordreset-disabled": "'A funzione 'e riabbìo d' 'e password è stata stutata dint'a sta wiki.",
+       "passwordreset-emaildisabled": "'E funzione e-mail songo state stutate dint'a sta wiki.",
        "passwordreset-username": "Nomme utente:",
        "passwordreset-domain": "Duminio:",
+       "passwordreset-capture": "Vulite vedé 'e cuntenute d' 'a mmasciata mail?",
+       "passwordreset-capture-help": "Si se seleziona sta cascia, 'a mmasciata e-mail (c' 'a password temporanea), se mmustarrà a vuje e poi pure se mannarrà a l'utente.",
+       "passwordreset-email": "Indirizzo e-mail:",
+       "passwordreset-emailtitle": "Dettaglie d' 'o cunto pe' {{SITENAME}}",
+       "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: $1\nPassword temporanea: $2",
+       "passwordreset-emailsent": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata.",
+       "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-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-none": "(nisciuno)",
-       "changeemail-cancel": "Canciella",
+       "changeemail-password": "'A password vosta pe' {{SITENAME}}:",
+       "changeemail-submit": "Cagna e-mail",
+       "changeemail-throttled": "Avite fatto troppe tentative 'a trasì.\nAspettate nu $1 apprimma 'e pruvà n'ata vota.",
+       "resettokens": "Riabbìa 'e token",
+       "resettokens-text": "Ccà se ponno riabbià 'e chiave ca permetessero l'acciesso a determinate date private associate a 'o cunto vuosto.\n\nL'aviste 'e ffà quanno l'avete spartuto pe' sbaglio cu cocche perzona o pure quanno 'o cunto d' 'o vuosto è stato compromesso.",
+       "resettokens-no-tokens": "Nun ce stanno token 'a riabbià.",
+       "resettokens-legend": "Riabbìa 'e token",
+       "resettokens-tokens": "Token:",
+       "resettokens-token-label": "$1 (valore 'e mmò: $2)",
+       "resettokens-watchlist-token": "Token p' 'o feed web (Atom/RSS) d' 'e [[Special:Watchlist|cagnamiente a 'e paggene dint'a l'osservate spiciale tuoje]]",
+       "resettokens-done": "Token riabbiate.",
+       "resettokens-resetbutton": "Riabbìa 'e token scigliute",
        "bold_sample": "Grassetto",
        "bold_tip": "Grassetto",
        "italic_sample": "Corsivo",
        "link_sample": "Titulo ddo cullegamente",
        "link_tip": "Jonte nterne",
        "extlink_sample": "http://www.example.com titulo ddo cullegamente",
+       "extlink_tip": "Link esterno (arricuordate 'o prefisso http:// )",
        "headline_sample": "Testate",
        "headline_tip": "Testate 'e 2° livello",
+       "nowiki_sample": "Azzeccà 'o testo nun-furmattato ccà",
+       "nowiki_tip": "Lassa perde' 'a furmattazione wiki",
        "image_sample": "Essempio.jpg",
        "image_tip": "Fiùra ncuorporata",
        "media_tip": "Cullegamente a file multimediale",
+       "sig_tip": "Firma cu data e ora",
+       "hr_tip": "Linea orizzontale (ausà cu gedizzio)",
        "summary": "Énnece",
+       "subject": "Argomiento/titolo:",
        "minoredit": "Chisto è nu cagnamiénto piccerillo",
        "watchthis": "Tiene d'uocchio chesta paggena",
        "savearticle": "Sarva 'a paggena",
        "preview": "Anteprimma",
        "showpreview": "Vere anteprimma",
        "showdiff": "Fa veré 'e cagnamiente",
+       "blankarticle": "<strong>Attenziò:</strong> 'a paggena ca staje crianno è abbacante.\nFà click ncopp'a \"{{int:savearticle}}\" n'ata vota, 'a paggena sarrà criata senza cuntenute.",
+       "anoneditwarning": "'''Attenzione:''' Nun avite fatto l'acciesso. 'A cronologgia d' 'a vosta sarrà visibbele pubbrecamente si facite cocche cagnamiento. Si <strong>[$1 tràse]</strong> o <strong>[$2 crìe nu cunto]</strong>, 'e cagnamiente vuoste ve sarranno attribbuite a vvuje, nzieme a n'ati migliuramente.",
+       "anonpreviewwarning": "''Nun avite fatto 'o login. Sarvann' 'a paggena, l'indirizzo IP d' 'o vuosto sarrà riggistrato dint'a cronologgia.''",
+       "missingsummary": "'''Attenziò:''' nun s'è specificato l'oggetto 'e stu cagnamiento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato cu l'oggetto abbacante.",
+       "missingcommenttext": "Pe' piacere scrivete nu commento ccà abbascio.",
+       "missingcommentheader": "'''Attenziò:''' nun s'è specificato l'oggetto/titolo 'e stu commento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato c' 'o titolo abbacante.",
+       "summary-preview": "Anteprimma'e l'oggetto:",
+       "subject-preview": "Anteprima 'e l'oggetto/intestazione:",
+       "blockedtitle": "Utente bloccato.",
+       "blockedtext": "<strong>'O nomme utente o ll'IP vuosto è stato bloccato.</strong>\n\n'O blocco è stato mpustato 'a $1. 'O mutivo d' 'o blocco è chesto: ''$2''\n\n* Abbiàta d' 'o blocco: $8\n* Ammaturità d' 'o blocco: $6\n* Tiempo 'e blocco: $7\n\nPutite cuntattà $1 o n'atu [[{{MediaWiki:Grouppage-sysop}}|ammenistratore]] pe' discutere 'o blocco.\n\nVedite c' 'a funzione 'Scrivete a ll'utente' nun è attiva si nun s'è riggistrato 'o ndirizzo e-mail buono dint' 'e [[Special:Preferences|preferenze]] o pùre si ll'uso 'e tale funzione è stato bloccato.\n\n'O ndirizzo IP attuale è $3, 'o nummero ID d' 'o blocco è #$5.\nPe' piacere avite 'e specificà tutte sti dettaglie ccà ncoppa quanno facite cocche dumanna.",
+       "autoblockedtext": "Ll'IP vuosto è stato bloccato pecché 'o steva piglianno n'atu utente, ch'è stato bloccato pe' $1.\n\n'O mutivo d' 'o blocco è chesto:\n\n:''$2''\n\n* Abbiàta d' 'o blocco: $8\n* Ammaturità d' 'o blocco: $6\n* Tiempo 'e blocco: $7\n\nPutite cuntattà $1 o n'atu [[{{MediaWiki:Grouppage-sysop}}|ammenistratore]] pe' discutere 'o blocco.\n\nVedite c' 'a funzione 'Scrivete a ll'utente' nun è attiva si nun s'è riggistrato 'o ndirizzo e-mail buono dint' 'e [[Special:Preferences|preferenze]] o pùre si ll'uso 'e tale funzione è stato bloccato.\n\n'O ndirizzo IP attuale è $3, 'o nummero ID d' 'o blocco è #$5.\nPe' piacere avite 'e specificà tutte sti dettaglie ccà ncoppa quanno facite cocche dumanna.",
+       "blockednoreason": "nisciuna ragione è stata indicata",
+       "whitelistedittext": "Pe' cagnà 'e ppaggene è necessario $1.",
+       "confirmedittext": "Pe puté cagnà paggene avite 'a cunfermà l'indirizzo e-mail.\nPe' piacere abbiate e ffà 'a validazione d' 'o ndirizzo e-mail pe' bbìa d' 'e [[Special:Preferences|preferenze d'utente]].",
+       "nosuchsectiontitle": "Nun se può truvà 'a sezziona",
+       "nosuchsectiontext": "Hè pruvat' 'a cagnà na sezziona ca nun ce sta.\nPuò darse ch'è stata spustata o scancellata pe' tramente ca stive vedenno sta paggena.",
        "loginreqtitle": "Pe' cagnà chesta paggena abbesognate aseguì ll'acciesso ô sito.",
        "loginreqlink": "aseguì ll'acciesso",
        "loginreqpagetext": "Pe' veré ate ppaggene abbesognate $1.",
        "accmailtitle": "'O password è stato mannato.",
        "accmailtext": "'Na password gennerata casualmente ppe [[User talk:$1|$1]] è stata mannata a $2. Chista password può essere càgnata dint'â paggena ppe ''[[Special:ChangePassword|càgna 'a password]]'' subbeto doppo l'acciesso.",
        "newarticle": "(Novo)",
+       "newarticletext": "Site ghiuto/a addò nu link 'e na paggena ca nun esiste ancora.\nP' 'a crià sta paggena, accummenciate a scrivere dint'a cascia cà abbascio (vedite 'a [$1 paggena d'aiuto] pe liegge cchiù nfurmazziune).\nSi site venuto/a ccà pe' sbaglio, vedite 'e sprémmere 'o buttòne '''Arreto''' d' 'o navigatóre.",
+       "anontalkpagetext": "----\n''Chest'è 'a paggena 'e discussione 'e n'utente anonimo, ca nun ave criàt' 'ancora n'utenza o ca nun sta ausanno. Pe' l'identificà avite 'e truvà 'o nummero d' 'o ndirizzo IP d' 'o sujo. L'indirizze IP se ponno spartì però a cchiù 'e n'utente. Si sì n'utente anonimo e pienze ca 'e commente ccà dint'a sta paggena nun parlano 'e tte, allora [[Special:UserLogin/signup|crìa n'utenza nnova]] o [[Special:UserLogin|tràse cu chella ca tiene già]] pe' nun sta' mmescato mmiez'a l'ati utente anonime n futuro.''",
+       "noarticletext": "Mo' mo' 'a paggena richiesta è abbacante. Se pò [[Special:Search/{{PAGENAME}}|ascià stu titolo]] dint'a l'ati paggene d' 'o sito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ascià dint'e riggistre azzeccate] o pure [{{fullurl:{{FULLPAGENAME}}|action=edit}} cagnà 'a paggena mo']</span>.",
+       "noarticletext-nopermission": "Mo' mo' 'a paggena richiesta è abbacante. Se pò [[Special:Search/{{PAGENAME}}|ascià stu titolo]] dint'a l'ati paggene d' 'o sito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ascià dint'e riggistre azzeccate]</span>, però nun tenite 'o permesso 'a crià sta paggena.",
+       "missing-revision": "'A verziona #$1 d' 'a paggena \"{{FULLPAGENAME}}\" nun esiste.\n\nChest'è causato quanno se và dint'a nu link a na paggena ch'è stata scancellata.\n'E dettaglie se ponno truvà dint'a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 'o riggistro 'e scancellamiente].",
+       "userpage-userdoesnotexist": "'O cunto utente \"<nowiki>$1</nowiki>\" nun è riggistrato. Cuntrolla ca si buò overo crià o cagnà sta paggena.",
+       "userpage-userdoesnotexist-view": "'O cunto utente \"$1\" nun è riggistrato.",
+       "blocked-notice-logextract": "St'utente è bloccato mò.\nL'urdemo elemento d' 'o riggistro 'e blocche è ripurtato ccà abbascio p'avé nu riferimento:",
+       "clearyourcache": "'''Nota:''' aropo sarvate putisse necessità 'e pulezzà 'a caché d' 'o navigatóre pe' vedé 'e cagnamiente. \n*'''Firefox / Safari''': sprémme 'o buttóne maiuscole e ffà clic ncopp'a ''Recarreca'', o pure spremme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' ncopp'a Mac)\n*'''Google Chrome''': spremme ''Ctrl-Shift-R'' (''⌘-Shift-R'' ncopp'a nu Mac)\n*'''Internet Explorer''': spremme 'o buttóne ''Ctrl'' pe' tramente ca faie click ncopp'a ''Refresh'', o pure spremmere ''Ctrl-F5''\n*'''Opera''': abbacanta tutt' 'a cache addò menu ''Strumiente → Preferenze''",
+       "usercssyoucanpreview": "'''Cunziglio:''' spremme 'o buttone 'Vide anteprimma' pe' pruvà 'o CSS nuovo apprimma d' 'o sarvà.",
+       "userjsyoucanpreview": "'''Cunziglio:''' spremme 'o buttone 'Vide anteprimma' pe' pruvà 'o JavaScript nuovo apprimma d' 'o sarvà.",
+       "usercsspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o CSS perzunale. 'E cagnamiente nun so' state ancora sarvate!'''",
+       "userjspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o JavaScript perzunale. 'E cagnamiente nun so' state ancora sarvate!'''",
+       "sitecsspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o CSS. 'E cagnamiente nun so' state ancora sarvate!'''",
+       "sitejspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o codece JavaScript. 'E cagnamiente nun so' state ancora sarvate!'''",
+       "userinvalidcssjstitle": "'''Attenziò:''' Nun esiste nisciuna skin c' 'o nomme \"$1\". Vide ch' 'e paggene .css e .js personalezzate teneno nu titolo n minucola, p'esempio {{ns:user}}:Esempio/vector.css e nun {{ns:user}}:Esempio/Vector.css.",
+       "updated": "(Agghiurnato)",
+       "note": "'''Nota:'''",
        "previewnote": "'''Chesta è sola n'anteprimma; 'e cagnamiénte â paggena nun songo ancora sarvate!'''",
+       "continue-editing": "Tràse int'a l'area 'e modifica",
+       "previewconflict": "L'anteprimma currisponne a 'o testo presente dint'a cascia 'e modifica ccà ncoppa e rappresentasse 'a paggena comme cumpare si sciglite 'e Sarvà ind'a stu mumento.",
+       "session_fail_preview": "'''Nun è possibbile prucessà 'o cagnamiento pecché se so' sperdut' 'e date d' 'a sessione.\nProva n'ata vota.\nSi nun funziona ancora, può pruvà 'a te [[Special:UserLogout|n'ascì]] e a trasì n'ata vota.'''",
+       "session_fail_preview_html": "'''Nun è possibbile prucessà 'o cagnamiento pecché se so' sperdut' 'e date d' 'a sessione.\nProva n'ata vota.'''\n''Siccome dint' 'o {{SITENAME}} è abilitato l'uso 'e l'HTML cruro, 'o buttone d'anteprimma nun è abbiàto comme misura 'e sicurezza annanza cocch'attacco JavaScript''\n'''Si chest'era nu tentativo legittimo 'e cagnamiento, prova n'ata vota. Si nun funziona ancora, può pruvà 'a te [[Special:UserLogout|n'ascì]] e a trasì n'ata vota.'''",
+       "token_suffix_mismatch": "'''Stu cagnamiento nun è stato sarvato pecché 'o client ave mmustato nu sbaglio dint'o scrivere d' 'e carattere d' 'a punteggiatura token. Pe luvà na possibbile corruzione d' 'o testo dint'a paggena, s'è rifiutat' 'a modifeca.\n\nSta situazione se può truvà, quanno staje ausanno nu servizio 'e proxy anonime via web cu d' 'e bug.'''",
+       "edit_form_incomplete": "'''Cocche parte d' 'o modulo 'e cagnamiento nun ha arrivato a 'o server; cuntrolla ch' 'e cagnamiente songo intatte e prova n'ata vota.'''",
        "editing": "Cagnamiento 'e $1",
+       "creating": "Staje crianno $1",
        "editingsection": "Cagnamiénto 'e $1 (sezzione)",
+       "editingcomment": "Cagnamiénto 'e $1 (nova sezzione)",
+       "editconflict": "Conflitto d'edizzione: $1",
+       "explainconflict": "N'at'utente ave sarvato na nova verziona d' 'a paggena pe' tramente ca stevate a fà 'e cagnamiente.\n'A cascia 'e mudifeca ncoppa cuntene 'o testo d' 'a paggena ca mò sta online, accussì comme è stato agghiurnato a l'at'utente.\n'A verziona ch' 'e cagnamiente vuoste è stata mmece riportata dint'a cascia 'e mudifeca abbascio.\nSi 'e vulite cunfermà avite 'a ripurtà 'e cagnamiente d' 'e vuoste dint'o testo ca esiste (dint'a cascia ncoppa).\nSpremmendo 'o buttón '{{int:savearticle}}', sarrà sarvato '''sulamente''' 'o testo cuntenuto dint'a cascia 'e cagnamiento ncoppa.",
+       "yourtext": "'O testo vuosto",
+       "storedversion": "A verziona 'n memoria",
+       "nonunicodebrowser": "'''Attenziò: state ausanno nu navigatóre ca nun è compatibbele ch' 'e carattere Unicode. Pe' ve permettere 'o cagnamiento d' 'e paggene senza crià ncunveniente, 'e carattere nun ASCII veneno viste dint' 'a cascia 'e cagnamiento sotto forma 'e codece esadecimale.'''",
+       "editingold": "'''Attenziò: staje cagnanno na verziona nun agghiurnata d' 'a paggena. Si 'a sarve accussì, tutte 'e cagnamiente fatte aropp'a sta verziona sarranno sperdute.'''",
+       "yourdiff": "Differenze",
+       "copyrightwarning": "Pe' piacere tenite a mmente ca tutte 'e contribbute a {{SITENAME}} songo cunziderate pubbrecate dint'e térmene d'uso d' 'a licienza $2 (vedite $1 pe n'avé cchiù dettaglie).\nSi nun vulite ca 'e testi vuoste fossero cagnate e distribuite 'a uno qualunque senza lémmeto, nun 'e mannate ccà.<br />\nMannanno stu testo dichiarate pùre, sott'a responsabilità vuosta, ch'è stato scritto 'a vuje perzunalmente o pure ca è stato copiato 'a na fonte n pubblico dominio o similarmente libbera.\n'''Nun mannate materiale prutetto 'a copyright senz'avé autorizzaziona!'''",
+       "copyrightwarning2": "Pe' piacere tenite a mmente ca tutte 'e contribbute a {{SITENAME}} se ponno cagnà, alterà, o distribbuì pe l'ati cuntribbuttòre.\n\nSi nun vulite ca 'e teste vuoste fossero cagnàte spenzieratamente, nun 'e mannate ccà.<br />\nMannanno stu testo dichiarate pùre, sott'a responsabilità vosta, ch'è stato scritto 'a vuje perzunalmente o pure ca è stato copiato 'a na fonte n pubblico dominio o similarmente libbera (vedete $1 pe' n'avé dettaglie).\n'''Nun mannate materiale prutetto 'a copyright senza n'avé autorizzaziona!'''",
+       "longpageerror": "'''Errore: 'o testo mannato è luongo {{PLURAL:$1|1|$1}} kilobyte, ch'è cchiù grosso d' 'a diminziona massima cunzentita ({{PLURAL:$2|1|$2}} kilobyte).'''\n'O testo nun se pò sarvà.",
+       "readonlywarning": "<strong>Attenziò</strong>: 'o database è bloccato pe se ffà 'a manutenzione. P' 'o mumento nun se ponno sarvà 'e cagnamiente fatte.\nPe' nun 'e sperdere, copia sti cuntenute dint'a nu file 'e testo e sarvatillo pe' tramente c'aspiette 'o sblocco d' 'o database.\n\nL'ammenistratore ca mpustaje 'o blocco ave scritto sta spiegazione: $1.",
+       "protectedpagewarning": "'''Attenziò: sta paggena è stata bloccata 'n modo tale ca sulamente l'utente ch' 'e privilegge d'ammenistratore 'a ponno cagnà.'''\nL'urdemo elemento d' 'o riggistro è scritto ccà abbascio pe' n'avé riferimento:",
+       "semiprotectedpagewarning": "'''Nota:''' Sta paggena è stata bloccata 'n modo ca sulamente l'utente riggistrate 'a ponno cagnà.\nL'urdemo elemento d' 'o riggistro è scritto ccà abbascio pe n'avé nfurmazione:",
+       "cascadeprotectedwarning": "'''Attenziò:''' Sta paggena è stata bloccata 'n modo ca sulamente l'utente ch' 'e privilegge d'ammenistratore 'a ponno cagnà. Chesto succiere pecché 'a paggena è dint'a {{PLURAL:$1|la paggena innecata ccà abbascio, ch'è stata prutetta|'e paggene innecate ccà abbascio, che so' state prutette}} sciglienno 'a prutezione \"ricurziva\":",
+       "titleprotectedwarning": "'''Attenziò: sta paggena è stata bloccata 'n modo ca fossero necessarie [[Special:ListGroupRights|deritte specifici]] p' 'a crià.'''\nL'urdemo elemento d' 'o riggistro è riportato ccà abbascio pe nfurmazione:",
        "templatesused": "{{PLURAL:$1|Template|Templates}} ausate 'a chesta paggena:",
+       "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} ausate dint'a st'anteprimma:",
+       "templatesusedsection": "{{PLURAL:$1|Template|Templates}} ausate dint'a sta sezziona:",
        "template-protected": "(prutetto)",
        "template-semiprotected": "(semi-prutetto)",
+       "hiddencategories": "Sta paggena attócca a {{PLURAL:$1|na categurìa annascunnuta|$1 categurìe annascunnute}}:",
+       "nocreatetext": "{{SITENAME}} ha limitato 'a possibilità 'e crià paggene nnove. Putite turnà e cagnà na paggena ch'esiste già, o pure [[Special:UserLogin|trasì o ve riggistrà]].",
+       "nocreate-loggedin": "Nun v'è permesso 'e crià paggene nnove.",
+       "sectioneditnotsupported-title": "Cagnamiento 'e sezziune nun suppurtato",
+       "sectioneditnotsupported-text": "'O cagnamiento d' 'e sezziune nun è suppurtato dint'a sta paggena.",
+       "permissionserrors": "Nun haje 'e premmesse abbastante.",
+       "permissionserrorstext": "Nun haje premmesse pe lle ffà st'azziune, {{PLURAL:$1|'o mutivo è chesto|'e mutive so' chiste}}:",
+       "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'alenco ch' 'e relative scancellamiente e spustamente s'è scritto ccà abbascio pe' ffà comodo:",
+       "moveddeleted-notice": "Sta paggena è stata scancellata.\nL'alenco d' 'e relative scancellamiente e spustamente s'è scritto ccà abbascio pe' n'avé nfurmazione.",
+       "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.",
+       "edit-conflict": "Conflitto d'edizziona.",
+       "edit-no-change": "'O cagnamiento è stato ignorato pecché nun s'è cagnato niente dint' 'o testo.",
+       "postedit-confirmation-created": "'A paggena è stata criata.",
+       "postedit-confirmation-restored": "'A paggena è stata arripigliata.",
+       "postedit-confirmation-saved": "'O cagnamiento è stato sarvato.",
+       "edit-already-exists": "Nun se può crià na paggena nova.\nEsiste già.",
+       "defaultmessagetext": "Mmasciata 'e testo predefinita",
+       "content-failed-to-parse": "Nun se può analizzare $2 p' 'o mudello $1: $3",
+       "invalid-content-data": "Date cuntenute nun buone",
+       "content-not-allowed-here": "'O cuntenuto \"$1\" nun è permesso dint'a paggena [[$2]]",
+       "editwarning-warning": "Ascenno 'e sta paggena putisse ffà sperdere 'e cagnamiente fatte.\nSi sì trasuto, allora può stutà st'avviso dint'a sezziona \"{{int:prefs-editing}}\" d' 'e preferenze.",
+       "editpage-notsupportedcontentformat-title": "Furmatto d' 'o cuntenuto nun suppurtato",
+       "editpage-notsupportedcontentformat-text": "'O furmatto d' 'o cuntenuto $1 nun è suppurtato d' 'o mudello 'e cuntenuto $2.",
+       "content-model-wikitext": "wikitesto",
+       "content-model-text": "testo nurmale",
+       "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "expensive-parserfunction-warning": "'''Attenziò:''' Sta paggena cuntene troppe chiammate a 'e funzione parser.\n\nN'avesse 'a tené meno 'e $2, p' 'o mumento ce ne {{PLURAL:$1|stà $1|stanno $1}}.",
+       "expensive-parserfunction-category": "Paggene cu troppe chiammate a 'e funzione parser",
+       "post-expand-template-inclusion-warning": "'''Attenzione:''' 'a diminsiona d' 'e template ionte ccà è troppo grossa.\nCocche template se lassarrà fore.",
+       "post-expand-template-inclusion-category": "Paggene addò 'a diminsiona d' 'o template è fore 'o lémmeto",
+       "post-expand-template-argument-warning": "'''Attenziò:''' sta paggena cuntene uno o cchiù argumente 'e template troppo gruosse pe' 'a spannere. Sti argumente se lassarranno fore.",
+       "post-expand-template-argument-category": "Paggene ca cunteneno argumente nun cunziderate",
+       "parser-template-loop-warning": "È stato scummigliato n'aniello d' 'o template: [[$1]]",
+       "parser-template-recursion-depth-warning": "È arrivato 'o lemmeto 'e ricurzione d' 'o template ($1)",
+       "language-converter-depth-warning": "'O fùto d' 'o lemmeto d' 'o scagnatòre 'e lengua è appassato ($1)",
+       "node-count-exceeded-category": "Paggene addò 'o nummero 'e núrece è stato appassato",
+       "node-count-exceeded-category-desc": "'A paggena appassa 'o nummero massimo 'e núrece.",
+       "node-count-exceeded-warning": "Sta paggena ave appassato 'o lemmeto 'e cunto 'e núrece",
+       "expansion-depth-exceeded-category": "Paggene addò 'o fùto 'e spansiona è appassato",
+       "expansion-depth-exceeded-category-desc": "Sta paggena appassa 'o lemmeto d'espansione.",
+       "expansion-depth-exceeded-warning": "Sta paggena ha appassato 'o lemmeto 'e futo 'e spansione",
+       "parser-unstrip-loop-warning": "Scummigliato aniello Unstrip",
+       "parser-unstrip-recursion-limit": "Appassato 'o lémmeto 'e ricurzione d' Unstrip ($1)",
+       "converter-manual-rule-error": "È stato scummigliato n'errore dint'a regola manuale 'e converziona 'e lengua",
+       "undo-success": "'O cagnamiento se può annullà.\nPe' piacere vedete 'e differenze mmustate nfra 'e verziune pe' te ffà capace ca 'e cuntenute songo bbuone, e astipate 'e cagnamiente ccà abbascio pe' fernì e accussì turnà arreto.",
+       "undo-failure": "Nun se può fà turnà arreto 'o cagnamiento pecché ce sta nu conflitto ch' 'e cagnamiente intermedie.",
+       "undo-norev": "Nun se può fà turnà arreto 'o cagnamiento pecché nun esiste o s'è scancellato.",
+       "undo-nochange": "Pare c' 'o cagnamiento s'è già fatto turnà arreto.",
        "undo-summary": "Canciella 'o cagnamiento $1 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|Chiàcchiera]])",
+       "undo-summary-username-hidden": "Annullato 'o cagnamiento $1 pe n'utente annascunnuto",
+       "cantcreateaccounttitle": "Nun se può crià cunto",
+       "cantcreateaccount-text": "'A riggistraziona è stata bloccata 'a l'utente [[User:$3|$3]] 'a st'innerizzo IP ('''$1''').\n\n'O mutivo dato 'a $3 è chistu ccà: ''$2''",
+       "cantcreateaccount-range-text": "'A criazione 'e cunte 'a ll'indirizze int'o ntervallo '''$1''', che cummiglia 'o vuosto ('''$4'''), è stata bloccata 'a l'utente [[User:$3|$3]].\n\n'O mutivo dato 'a $3 è chistu ccà: ''$2''",
+       "viewpagelogs": "Vide 'e log azzeccate a sta paggena",
+       "nohistory": "Nun esiste na cronologgia 'e verziune pe' sta paggena.",
        "currentrev": "Verzione 'e mmo",
        "currentrev-asof": "Vversione attuale dde $1",
        "revisionasof": "Vversione delle $1",
+       "revision-info": "Verziona d' 'o $1 fatta 'a {{GENDER:$6|$2}}$7",
        "previousrevision": "← Verzione 'e primma",
        "nextrevision": "Vversione cchiù recente →",
        "currentrevisionlink": "Verzione 'e mmo",
        "cur": "corr",
+       "next": "successiva",
        "last": "prec",
+       "page_first": "primma",
+       "page_last": "úrdema",
+       "histlegend": "Confronto nfra verziune: sciglite 'e casciulelle c'attoccassero a 'e verziune che vulite cunfruntà e spremmite Invio o pure 'o buttóne ccà abbascio.\n\nLiggenda: '''({{int:cur}})''' = differenze c' 'a verzione 'e mmò, '''({{int:last}})''' = differenze c' 'a verzione 'e primma, '''{{int:minoreditletter}}''' = cagnamiento minore",
+       "history-fieldset-title": "Naviga dint' 'a cronologgia",
        "history-show-deleted": "Solo chille canciellate",
        "histfirst": "primma",
        "histlast": "urdema",
+       "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
+       "historyempty": "(abbacante)",
+       "history-feed-title": "Cronologgia",
+       "history-feed-description": "Cronologgia d' 'a paggena ncopp'a stu sito",
        "history-feed-item-nocomment": "$1 'o $2",
+       "history-feed-empty": "'A paggena addimannata nun esiste.\nPuò darsi ca è stata scancellata d' 'a wiki, o s'è cagnato 'o nomme.\nProva a vedé [[Special:Search|dint' 'a wiki]] si ce stanno nnove paggene.",
+       "rev-deleted-comment": "(Oggetto d' 'o cagnamiento luvato)",
+       "rev-deleted-user": "(nomme utente luvato)",
+       "rev-deleted-event": "(azione d' 'o log luvata)",
+       "rev-deleted-user-contribs": "[nomme utente o indirizzo IP luvato - cagnamiento annascunnuto d' 'a cronologgia]",
+       "rev-deleted-text-permission": "Sta verziona d' 'a paggena è stata '''scancellata'''.\nAscìa dint' 'o [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} riggistro d' 'e scancellamiente] pe ne sapé 'e cchiù.",
+       "rev-suppressed-text-permission": "Sta verziona d' 'a paggena è stata '''luvata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.",
+       "rev-deleted-text-unhide": "Sta verziona d' 'a paggena è stata '''scancellata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log d' 'e scancellamiente] pe' ne sapé 'e cchiù.\nA ll'ammenistrature è cunzentito ancora [$1 'e vedé sta paggena] si vonno.",
+       "rev-suppressed-text-unhide": "Sta verziona d' 'a paggena è stata '''luvata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.\nA ll'ammenistrature è cunzentito ancora [$1 'e vedé sta verziona] si vonno.",
+       "rev-deleted-text-view": "Sta verziona d' 'a paggena è stata '''scancellata'''.\nLl'ammenistratore 'a ponno veré ancora; e 'a ponno ascìa dint' 'o [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistro d' 'e scancellaziune] pe ne sapé 'e cchiù.",
+       "rev-suppressed-text-view": "Sta verziona d' 'a paggena è stata '''luvata'''.\nSta verziona 'a può veré ancora, 'e dettaglie 'e può cuntrullà dint' 'o [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.",
+       "rev-deleted-no-diff": "Sta cunfronto d' 'a paggena nun 'o può veré pecché una d' 'e verziune è stata '''scancellata'''.\nAscìa dint' 'o [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistro d' 'e scancellamiente] pe ne sapé 'e cchiù.",
+       "rev-suppressed-no-diff": "Nun se può vedé stu cunfronto nfra verziune pecché una d' 'e verziune è stata '''scancellata'''.",
+       "rev-deleted-unhide-diff": "Una d' 'e verziune 'e sta paggena è stata '''scancellata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistro d' 'e scancellamiente] pe' ne sapé 'e cchiù.\nPuò ancora [$1 vedé sta paggena] si bbuò.",
+       "rev-suppressed-unhide-diff": "Una d' 'e verziune 'e sta paggena è stata '''luvata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.\nPuò ancora [$1 vedé sta verziona] si bbuò.",
+       "rev-deleted-diff-view": "Una d' 'e verziune 'e sta paggena è stata '''scancellata'''.\nPuò vedé sta verziona ancora; 'e dettaglie 'e può vedé dint' 'o [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistro d' 'e scancellaziune] pe ne sapé 'e cchiù.",
+       "rev-suppressed-diff-view": "Una d' 'e verziune 'e sta paggena è stata '''luvata'''.\nSta verziona 'a può veré ancora; 'e dettaglie 'e può cuntrullà dint' 'o [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.",
        "rev-delundel": "faje vedé/annascunne",
        "rev-showdeleted": "faje vedé",
+       "revisiondelete": "Scancella o ripiglia verziune",
+       "revdelete-nooldid-title": "Verziona nun specificata",
+       "revdelete-nooldid-text": "Nun è stata specificata nisciuna verziona d' 'a paggena p' 'a secutà sta funzione, 'a verziona specificata nun esiste o pure staje truvann' 'annascónnere 'a verziona 'e mò.",
+       "revdelete-no-file": "'O file specificato nun esiste.",
+       "revdelete-show-file-confirm": "Sì sicuro/a ca vulite veré 'a verziona scancellata d' 'o file \"<nowiki>$1</nowiki>\" d' 'o $2 a 'e $3?",
        "revdelete-show-file-submit": "Sì",
+       "revdelete-selected-text": "{{PLURAL:$1|Verziona scigliuta|Verziune scigliute}} 'e [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Verzione scigliuta|Verziune scigliute}} d' 'o file 'e [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Fatto scigliuto d' 'o riggistro|Fatte scigliute d' 'o riggistro}}:",
+       "revdelete-text-text": "'E verziune scancellate cumpareno ancora dint' 'a cronologgia d' 'a paggena, ma na parte d' 'o cuntenuto lloro nun sarrà disponibbele a 'o pubbreco.",
+       "revdelete-text-file": "'E verziune 'e file scancellate cumpareno ancora dint' 'a cronologgia d' 'o file, ma parte d' 'o cuntenuto lloro nun sarrà disponibbele a 'o pubbreco.",
+       "logdelete-text": "'E fatte 'e riggistro scancellate cumpareno ancora dint' 'a cronologgia 'e riggistro, ma na parte d' 'o cuntenuto lloro nun sarrà disponibbele a 'o pubbreco.",
+       "revdelete-text-others": "Ll'at'ammenistrature puterranno ancora trasì e arrepiglià 'e cuntenute annascunnute, si nun so' state mpustate cchiù restrizziune.",
+       "revdelete-confirm": "Pe' piacere cunfermate ca overo vulite ffà chesto, ca cunuscete 'e cunseguenze, e ca state facenno chesto rispettanno 'e [[{{MediaWiki:Policy-url}}|linee guida]].",
+       "revdelete-suppress-text": "Sti luvamiente hana essere fatte '''unicamente''' dint' 'e situaziune ccà abbascio:\n* nfurmaziune potenzialmente diffamatorie\n* date perzunale inopportune\n*: ''indirizze, nummeri 'e telefono, codece fiscale, ecc.''",
+       "revdelete-legend": "Miette 'e limmete 'e visibilità",
+       "revdelete-hide-text": "Testo d' 'a verziona",
+       "revdelete-hide-image": "Annascunne 'e cuntenute d' 'o file",
+       "revdelete-hide-name": "Annascunne aziona e l'oggetto 'e cchesta",
+       "revdelete-hide-comment": "Modifeca oggetto",
+       "revdelete-hide-user": "Nomme o indirizzo IP 'e ll'autore",
+       "revdelete-hide-restricted": "Annascunne 'e nfurmaziune 'nnecate pure a l'ammenistrature",
+       "revdelete-radio-same": "(nun cagnà)",
        "revdelete-radio-set": "Nasconde",
        "revdelete-radio-unset": "Faje vedé",
+       "revdelete-suppress": "Annascunne 'e nfurmaziune pure a l'ammenistrature",
+       "revdelete-unsuppress": "Scancella 'e limmete ncopp' 'e verziune arripigliate",
+       "revdelete-log": "Mutivo:",
+       "revdelete-submit": "Applica {{PLURAL:$1|â virziona scigliuta|a 'e virziune scigliute}}",
+       "revdelete-success": "'''Visibbelità d' 'a verziona agghiurnata e apposto.'''",
+       "revdelete-failure": "'''Int'a sta virziona 'a visibbelità nun se può agghiurnà:'''\n$1",
+       "logdelete-success": "'''Int'a stu riggistro 'a visibbelità è stata scigliuta currettamente.'''",
+       "logdelete-failure": "'''Int'a stu riggistro 'a visibbelità nun se può scegliere:'''\n$1",
        "revdel-restore": "càgna visiblità",
+       "pagehist": "Verziune 'e primma",
+       "deletedhist": "Cronologgia scancellata",
+       "revdelete-hide-current": "Nun se ponno annasconnere ll'item  cu data 2, $1: pecché song'a la verziona 'e mmò.",
+       "revdelete-show-no-access": "Errore a mmustà ll'oggetto cu data $2, $1: St'oggetto è stato nzegnàto comme \"riservato\".\nNun tiene acciesso a chesto.",
+       "revdelete-modify-no-access": "Nun se può cagnà l'oggetto cu data $2, $1: pecché st'oggetto è stato nzegnàto comme \"riservato\".\nVuje nun avete acciesso.",
+       "revdelete-modify-missing": "Nun se può cagnà l'oggetto cu l'ID $1 pecché nun è prisente int' 'o database.",
+       "revdelete-no-change": "'''Attenziò:''' l'oggetto cu data $2, $1 teneva già 'e mpustaziune 'e visibbilità addimannate.",
+       "revdelete-concurrent-change": "Nun se può cagnà l'oggetto cu data $2, $1: 'O status 'e chisto pare ch'è stato cagnato pe cocch'utente pe' tramente ca 'o stavate a cagnà.\nPe' piacere cuntrullate 'o riggistro.",
+       "revdelete-only-restricted": "Errore pe' tramente ca s'annasconneva l'oggetto cu data $2, $1: Nun può luvà oggette d' 'a vista 'e ll'ammenistratore senza scegliere manco una 'e l'at'opziune 'e visibbelità.",
+       "revdelete-reason-dropdown": "* Mutive comune pe' ffà scancellamiento\n** Violazione d' 'o copyright\n** Cummente o nfurmaziune perzunale inappropriate\n** Nomme utente inappropriato\n** Nfurmazione potenzialmente diffamatoria",
+       "revdelete-otherreason": "Ati/cchiù ragiune:",
+       "revdelete-reasonotherlist": "Ati ragiune",
+       "revdelete-edit-reasonlist": "Càgna 'e mutive pe' fà 'o scancellamiento",
+       "revdelete-offender": "Autore d' 'a verziona:",
+       "suppressionlog": "Riggistro 'e luvamiente",
+       "suppressionlogtext": "Ccà abbascio ce sta n'alenco ch' 'e scancellamiente e blocche ca teneno cuntenute annascunnuto a l'ammenistrature.\nVide l'[[Special:BlockList|elenco d' 'e blocche]] pe' l'elenco e banne e blocche attive 'e mò.",
+       "mergehistory": "Aunisce 'e cronologgie",
+       "mergehistory-header": "Sta paggena te permette d'aunì 'e verziune d' 'a cronologgia 'e na paggena origgine a na paggena nova.\nVedite ca s'avesse 'a nchiantà stu cagnamiento senza scassà 'a continuità storeca d' 'a paggena.",
+       "mergehistory-box": "Aunisce 'a cronologgia 'e ddoje ppaggene:",
+       "mergehistory-from": "Paggena d'origgene:",
+       "mergehistory-into": "Paggena 'e destinazione:",
+       "mergehistory-list": "Cronologgia 'e paggena ca fosse applicabbele pe' se ffà l'unione",
+       "mergehistory-merge": "Se ponno aunì 'e verziune 'e [[:$1]] nzignata ccà int' 'a cronologgia 'e [[:$2]]. Ausàte 'a colonna ch' 'e buttóne d'opziune pe' ffà l'aunione 'e tutt' 'e verziune nfin' 'a data e ora nzignàte.\nVedite ca si s'ausassero 'e buttóne 'e navigazione, 'a culonna ch' 'e buttóne d' 'ozzione fosse rinnovata.",
+       "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-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.",
+       "mergehistory-no-destination": "'A paggena 'e destinazione $1 nun esiste.",
+       "mergehistory-invalid-source": "'A paggena d'origgine add'avé nu titolo bbuono.",
+       "mergehistory-invalid-destination": "'A paggena 'e destinazione add'avé nu titolo bbuono.",
+       "mergehistory-autocomment": "Aunione 'e [[:$1]] int'a [[:$2]]",
+       "mergehistory-comment": "Aunione 'e [[:$1]] int'a [[:$2]]: $3",
+       "mergehistory-same-destination": "'E paggene d'origgine e destinazione nun ponno essere eguale",
+       "mergehistory-reason": "Mutivo:",
+       "mergelog": "Riggistro d'aunione",
+       "pagemerge-logentry": "song'aunite [[$1]] int'a [[$2]] (verziune nfin'a $3)",
+       "revertmerge": "Annulla aunione",
+       "mergelogpagetext": "Ccà abbascio ce sta na lista cu ll'urdeme aunione int'a cronologgia d' 'e ddoje paggene.",
+       "history-title": "$1: cronologgia d' 'e cagnamiente",
+       "difference-title": "Differenze nfra 'e verziune 'e \"$1\"",
+       "difference-title-multipage": "Differenze nfra 'e verziune \"$1\" e \"$2\"",
+       "difference-multipage": "(Differenze nfra 'e paggene)",
        "lineno": "Riga $1:",
+       "compareselectedversions": "Cunfronta 'e verziune scigliute",
+       "showhideselectedversions": "Cagna visibbelità d' 'e verziune scigliute",
        "editundo": "annulla",
+       "diff-empty": "(Nisciuna differenza)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Na verziona ntermedia|$1 verziune ntermedie}} 'e n'utente stisso nun {{PLURAL:$1|è mmustata|songo mmustate}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Na virzione ntermedia|$1 verziune ntermedie}} 'a {{PLURAL:$2|n'at'utente|$2 n'ati ddoj'utente}} nun è mmustata)",
+       "diff-multi-manyusers": "({{PLURAL:$1|Na virzione ntermedia|$1 verziune ntermedie}} 'a cchiù 'e $2 {{PLURAL:$2|utente|utente}} nun è mmustata)",
+       "difference-missing-revision": "{{PLURAL:$2|Na virziona|$2 verziune}} 'e sta differenza ($1) {{PLURAL:$2|nun è stata truvata|nun so' state truvate}}.\n\nChest'è succiesso quanno s'è secutato nu diff obsoleto a na paggena scancellata.\n'E dettaglie se ponno truvà dint'a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 'o riggistro 'e scancellamiente].",
        "searchresults": "Risultato d''a recerca",
        "searchresults-title": "Ascià risultate ppe \"$1\"",
+       "titlematches": "Currispunnenze d' 'o titolo d' 'e paggene",
+       "textmatches": "Currispunnenze d' 'o testo d' 'e paggene",
        "notextmatches": "Voce addemannata nun truvata dint' 'e teste 'e articulo",
        "prevn": "{{PLURAL:$1|precedente|precedente $1}}",
        "nextn": "{{PLURAL:$1|successivo|successive $1}}",
        "nextn-title": "{{PLURAL:$1|Risultato successivo|$1 risultate successive}}",
        "shown-title": "Fa vere {{PLURAL:$1|'nu risultato|$1 risultate}} ppe paggena",
        "viewprevnext": "Vere($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-new": "<strong>'''Cria a paggena \"[[:$1]]\" ncopp'â chisto wiki!'''</strong> {{PLURAL:$2|0=|Vede anche 'a paggena truovata cu 'a recerca tuja|Vede anche 'e risultate d\"a recerca}}",
+       "searchmenu-exists": "'''Ncopp' 'o sito esiste na paggena c' 'o nomme \"[[:$1]]\"'''\n{{PLURAL:$2|0=|Vedite pure dint'a l'ati risultate 'e cerca.}}",
+       "searchmenu-new": "<strong>'''Cria a paggena \"[[:$1]]\" ncopp'â chisto wiki!'''</strong> {{PLURAL:$2|0=|Vide anche 'a paggena truovata cu 'a recerca vuosta|Vede anche 'e risultate d\"a recerca}}",
        "searchprofile-articles": "Paggene 'e contenute",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tutto",
        "searchprofile-advanced": "Avanzate",
        "searchprofile-articles-tooltip": "Circa dint'ô $1",
        "searchprofile-images-tooltip": "Circa file",
+       "searchprofile-everything-tooltip": "Ascìa int'a tutte 'e cuntenute (pure dint' 'e chiacchiere)",
        "searchprofile-advanced-tooltip": "Circa dint'e namespace perzonalizzate",
        "search-result-size": "$1 ({{PLURAL:$2|'na parola|$2 parole}})",
+       "search-result-category-size": "{{PLURAL:$1|1 utente|$1 utente}} ({{PLURAL:$2|1 sottocategurìa|$2 sottocategurìe}}, {{PLURAL:$3|1 file|$3 files}})",
        "search-redirect": "(redirect $1)",
        "search-section": "(sezzione $1)",
+       "search-file-match": "(currispunnenza dint' 'e cuntenute d' 'o file)",
        "search-suggest": "Prova chisto: $1",
        "search-interwiki-caption": "Prugiette frate",
+       "search-interwiki-default": "Risultate 'a $1:",
+       "search-interwiki-more": "(cchiù)",
+       "search-relatedarticle": "Azzeccato",
+       "searchrelated": "azzeccato",
        "searchall": "Tutte",
+       "showingresults": "Ccà abbascio {{PLURAL:$1|s'apprisentano 'o massimo '''1''' risultato|veneno apprisentate massimo '''$1''' risultate}} aropp' 'o nummero '''$2'''.",
+       "showingresultsinrange": "{{PLURAL:$1|Vene mmustato|Veneno mmustate}} abbascio {{PLURAL:$1|<strong>1</strong> risultato|<strong>$1</strong> risultate}} d' 'o <strong>$2</strong> a 'o <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Risultato <strong>$1</strong> 'e <strong>$3</strong>|Risultate <strong>$1 - $2</strong> 'e <strong>$3</strong>}}",
        "search-nonefound": "'A ricerca nun ha produtto risultate.",
+       "powersearch-legend": "Ricerca avanzata",
+       "powersearch-ns": "Ascìa dint' 'o namespace:",
+       "powersearch-togglelabel": "Cuntrolla:",
+       "powersearch-toggleall": "Tutto",
+       "powersearch-togglenone": "Nisciuno",
+       "powersearch-remember": "Arricuòrdate d' 'a selezziona quanno faje ricerche nfuturo",
+       "search-external": "Ricerca 'a fore",
+       "searchdisabled": "'A ricerca dint'a {{SITENAME}} nun è attiva; pe' tramente se putesse ausà nu mutore 'e cerca sterno comm'a Google. (Avite 'e sapé però, ca sti cuntenute d' 'o {{SITENAME}} dint' 'e mutore, può darse ca nun stanno agghiurnate.)",
+       "search-error": "È succiesso n'errore pe' tramente ca se faceva 'a ricerca: $1",
+       "preferences": "Preferenze d''e mmeje",
        "mypreferences": "Preferenze d''e mmeje",
+       "prefs-edits": "Cagnamiente affettuate:",
+       "prefsnologintext2": "Pe' piacere, trasite pe' cagnà 'e preferenze voste.",
+       "prefs-skin": "Aspetto grafeco (skin)",
+       "skin-preview": "Anteprimma",
+       "datedefault": "Nisciuna preferenza",
+       "prefs-labs": "Funzionalità sperimentale",
+       "prefs-user-pages": "Paggene utente",
+       "prefs-personal": "Profilo utente",
        "prefs-rc": "Urdeme nove",
        "prefs-watchlist": "Asservate speciale",
+       "prefs-watchlist-days": "Nummero 'e juorne 'a mmustà dint'a l'elenco 'e cuntrollo:",
+       "prefs-watchlist-days-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
+       "prefs-watchlist-edits": "Numero massimo 'e cagnamiente 'a mmustà ch' 'e funziune avanzate:",
+       "prefs-watchlist-edits-max": "Nummero massimo: 1000",
+       "prefs-watchlist-token": "Token 'e l'alenco 'e cuntrollo:",
+       "prefs-misc": "Varje",
+       "prefs-resetpass": "Cagna 'a password",
+       "prefs-changeemail": "Cagna l'indirizzo e-mail",
+       "prefs-setemail": "Mpizza nu ndirizzo e-mail",
+       "prefs-email": "Opziune e-mail",
+       "prefs-rendering": "Aspetto",
        "saveprefs": "Sarva",
+       "restoreprefs": "Arripiglia 'e mpustaziune predefinite (inta tutte 'e seziune)",
+       "prefs-editing": "Cascia 'e cagnamiento",
+       "rows": "Righe:",
        "columns": "Culonne:",
        "searchresultshead": "Truova",
+       "stub-threshold": "Valore minimo p' 'e <a href=\"#\" class=\"stub\">cullegamiente a 'e stub</a>, 'n byte:",
+       "stub-threshold-disabled": "Stutato",
+       "recentchangesdays": "Nummero 'e juorne a mmustà dint'a l'urdeme cagnamiente:",
+       "recentchangesdays-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
+       "recentchangescount": "Nummero predefinito 'e cagnamiente 'a mmustà:",
+       "prefs-help-recentchangescount": "Chesto ntenne ll'urdeme cagnamiente, 'e cronologgie 'e paggena, e riggistre.",
+       "prefs-help-watchlist-token2": "Chest'è 'a chiave segreta pe se ffà 'o feed web 'e l'alenco 'e cuntrolo d' 'o vuosto.\nSi coccheruno 'a cunoscesse, allora putesse vedé l'alenco 'e cuntrollo, picciò nun 'a spartite. [[Special:ResetTokens|Cliccate ccà se tenite necessità d' 'a rimpizzà]].",
+       "savedprefs": "'E preferenze songo state sarvate.",
+       "timezonelegend": "Fuso orario:",
+       "localtime": "Ora lucale:",
+       "timezoneuseserverdefault": "Aúsa ora predefinita d' 'o wiki ($1)",
+       "timezoneuseoffset": "Ato (specificà 'a differenza)",
+       "servertime": "Ora d' 'o server:",
+       "guesstimezone": "Aúsa l'ora d' 'o navigatóre",
        "timezoneregion-africa": "Afreca",
+       "timezoneregion-america": "Amereca",
+       "timezoneregion-antarctica": "Antartide",
+       "timezoneregion-arctic": "Arteco",
+       "timezoneregion-asia": "Asia",
+       "timezoneregion-atlantic": "Oceano Atlanteco",
+       "timezoneregion-australia": "Australia",
+       "timezoneregion-europe": "Europa",
+       "timezoneregion-indian": "Oceano Indiano",
+       "timezoneregion-pacific": "Oceano Pacifeco",
+       "allowemail": "Abbìa 'a ricezione 'e mmasciate mannate 'a l'ati utente",
+       "prefs-searchoptions": "Ascìa",
+       "prefs-namespaces": "Namespace",
+       "default": "predefinito",
+       "prefs-files": "File",
+       "prefs-custom-css": "CSS personalizzato",
+       "prefs-custom-js": "JavaScript personalizzato",
+       "prefs-common-css-js": "CSS/JavaScript spartuto pe' tutt' 'e skin:",
+       "prefs-reset-intro": "Putisse ausà sta paggena pe' rimpizzà 'e preferenze proprie comme chille predefinite d' 'o sito.\nL'operazione nun se può annullà.",
+       "prefs-emailconfirm-label": "Cunferma 'e ll'e-mail:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Nomme utente}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|d' 'o gruppo|d' 'e gruppe}}:",
+       "prefs-registration": "Data 'e riggistrazione:",
        "yourrealname": "Nomme vero",
        "yourlanguage": "Lengua:",
+       "yourvariant": "Variante d' 'a llengua:",
+       "prefs-help-variant": "'A variante o grafia ca preferite 'e vedé ncopp' 'e paggene 'e chesta wiki.",
+       "yournick": "Soprannomme (nickname):",
+       "prefs-help-signature": "'E cummente dint' 'e paggene 'e chiacchiera hanna essere firmate cu \"<nowiki>~~~~</nowiki>\" ca s'addeventarrà automatecamente 'a firma propria c' 'a data.",
+       "badsig": "Errore 'e firma nun standard, cuntrullate 'e tag HTML.",
+       "badsiglength": "'A firma c'avite scigliuto è troppo luonga, chesta nun avesse 'a superà $1 {{PLURAL:$1|carattere|carattere}}.",
+       "yourgender": "Comme nce referimmo a vvuje?",
+       "gender-unknown": "Preferisco 'e nun 'o ddicere",
+       "gender-male": "È riggistrato ncopp' 'a {{SITENAME}}",
+       "gender-female": "È riggistrata ncopp' 'a {{SITENAME}}",
+       "prefs-help-gender": "Mpizzà sta preferenza è ozzionale.\n'O software aúsa stu valore pe' se vutà a vuje e v'anummenà a l'ati utente ausanno 'o gennere grammatecale buono.\nCheste nfurmaziune sarranno pubbreche.",
+       "email": "E-mail",
+       "prefs-help-realname": "'O nomme overo vuosto è ozzionale.\nSi sciglite 'e nzertà 'o nomme overo, chesto s'ausarrà pe' dà l'utente l'attribuzione d' 'a fatica fatta.",
+       "prefs-help-email": "L'e-mail vuosto è ozzionale, ma permettesse 'e ricevere 'a password propria quanno v' 'a scurdate.",
+       "prefs-help-email-others": "Putite pure scegliere 'e lassà che l'at'utente ve mannassero mmasciate via e-mail cu nu cullegamiento â paggena d'utente o chiacchiera.\nLl'indirizzo e-mail vuosto nun è scummigliato quanno l'at'utente ve cuntattano.",
+       "prefs-help-email-required": "L'indirizzo e-mail è obbligatorio.",
+       "prefs-info": "Nfurmaziune bbase",
+       "prefs-i18n": "Nternaziunalizzazione",
+       "prefs-signature": "Firma",
+       "prefs-dateformat": "Furmato data",
+       "prefs-timeoffset": "Ore 'e differenza",
+       "prefs-advancedediting": "Opziune generale",
+       "prefs-editor": "Editore",
+       "prefs-preview": "Anteprimma",
+       "prefs-advancedrc": "Opziune avanzate",
+       "prefs-advancedrendering": "Opziune avanzate",
+       "prefs-advancedsearchoptions": "Opziune avanzate",
+       "prefs-advancedwatchlist": "Opziune avanzate",
+       "prefs-displayrc": "Opziune 'e visualizzazione",
+       "prefs-displaywatchlist": "Opziune 'e visualizzazione",
+       "prefs-tokenwatchlist": "Token",
+       "prefs-diffs": "Differenze",
+       "prefs-help-prefershttps": "Sta preferenza averrà affetto 'a 'o prossimo acciesso vuosto.",
+       "prefswarning-warning": "Avite fatto cagnamiente a 'e preferenze d' 'e vuoste ca nun so' stat'ancora sarvate.\nSi ascite 'a sta paggena senza clickà \"$1\" 'e preferenze d' 'e vuoste nun sarranno agghiurnate.",
+       "prefs-tabs-navigation-hint": "Suggerimento: se ponno ausà 'e buttòne 'e freccia a manca e a dritta pe' ve muovere nfra 'e schede dint'a l'alenco d' 'e schede.",
+       "email-address-validity-valid": "L'indirizzo e-mail pare valido",
+       "email-address-validity-invalid": "Nzerta n'indirizzo e-mail valido",
+       "userrights": "Gestione d' 'e permesse 'e l'utente",
+       "userrights-lookup-user": "Gestione 'e gruppe d'utenza",
+       "userrights-user-editname": "Nzertàte nu nomme utente:",
+       "editusergroup": "Cagnate 'e gruppe d'utenze",
+       "editinguser": "Cagnamiento d' 'e deritte d'utente '''[[User:$1|$1]]''' $2",
+       "userrights-editusergroup": "Cagnate 'e gruppe d'utenze",
+       "saveusergroups": "Sarvate 'e gruppe d'utenza",
+       "userrights-groupsmember": "Ffà parte {{PLURAL:$1|d' 'o gruppo|d' 'e gruppe}}:",
+       "userrights-groupsmember-auto": "Membro mplicito 'e:",
+       "userrights-groups-help": "Putite cagnà 'e gruppe assegnate a l'utente:\n* Na cascia 'e spunta scigliuta significasse ca appartenenza 'e l'utente a 'o gruppo\n* Na cascia 'e spunta nun scigliuta significasse 'a nun appartenenza a 'o gruppo.\n* 'O simmolo * significasse ca nun se può scancellà l'appartenenza a 'o gruppo aropp'a ll'avé miso (o viceversa).",
+       "userrights-reason": "Mutivo:",
+       "userrights-no-interwiki": "Nun tenite permesse pe' cagnà 'e deritte 'e l'utente ncopp'a l'ati wiki.",
+       "userrights-nodatabase": "'O database $1 nun esiste o nun è nu database lucale.",
+       "userrights-nologin": "Avite 'a [[Special:UserLogin|trasì]] comme ammenistratore si vulite assegnà 'e deritte 'e l'utente.",
+       "userrights-notallowed": "Nun tenite 'e permesse pe' jognere o luvà 'e permesse utente.",
+       "userrights-changeable-col": "Gruppe ca putite cagnà",
+       "userrights-unchangeable-col": "Gruppe ca nun putite cagnà",
+       "userrights-conflict": "Conflitto 'e cagnamiento 'e deritte utente! Cuntrullate e cunfermate 'e cagnamiente vuoste.",
+       "userrights-removed-self": "Avete rimosso buono 'e deritte vuoste. Picciò nun putite trasì cchiù dint'a sta paggena.",
+       "group": "Gruppo:",
+       "group-user": "Utente",
+       "group-autoconfirmed": "Utente autocunfermate",
+       "group-bot": "Bot",
+       "group-sysop": "Ammenistrature",
+       "group-bureaucrat": "Burocrate",
+       "group-suppress": "Oversight",
+       "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}}",
+       "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",
+       "right-read": "Liegge paggene",
+       "right-edit": "Cagna paggene",
+       "right-createpage": "Crìa paggene (ca nun songo paggene 'e chiacchiera)",
+       "right-createtalk": "Crìa chiacchiere 'e paggena",
+       "right-createaccount": "Crìa utenze nove",
+       "right-minoredit": "Nzigna 'e cagnamiente comme minure",
+       "right-move": "Muove 'e paggene",
+       "right-move-subpages": "Muove 'e paggene nzieme ê sottopaggene suje",
+       "right-move-rootuserpages": "Muove 'e paggene princepale d'utente",
+       "right-move-categorypages": "Muove 'e categurìe",
+       "right-movefile": "Muove 'e file",
+       "right-suppressredirect": "Nun crià 'e redirect automateco quanno se muoveno 'e paggene",
+       "right-upload": "Carreca file",
+       "right-reupload": "Sovrascrive nu file ch'esiste",
+       "right-reupload-own": "Sovrascrive nu file esistente carrecat'a l'utente stesso",
+       "right-reupload-shared": "Sovrascrive lucalmente file prisente dint'a l'archivio spartuto",
+       "right-upload_by_url": "Carreca nu file 'a n'indirizzo URL",
+       "right-purge": "Pulezza 'a cache d' 'o sito senza cunferma",
+       "right-autoconfirmed": "Nun suggetto a 'o lemmeto d'aziune 'a l'IP",
+       "right-bot": "S'avesse 'e trattà comm'a nu prucesso automateco",
+       "right-nominornewtalk": "Fa ch' 'e cagnamiente minore a 'e paggene 'e chiacchiera nun facciano scattà l'avviso 'e mmasciata nnova",
+       "right-apihighlimits": "Usa límmete cchiù aute pe l'interrogaziune a ll'API",
+       "right-writeapi": "Usa l'API 'n scrittura",
+       "right-delete": "Scancella paggene",
+       "right-bigdelete": "Scancella paggene ch' 'e cronologgie luonghe",
+       "right-deletelogentry": "Scancella e arripiglia vvoce 'e riggistro specifiche",
+       "right-deleterevision": "Annascunne verziune specifiche d' 'e paggene",
+       "right-deletedhistory": "Vide 'e verziune d' 'a cronologgia scancellate senza 'o testo suoccio a lloro",
+       "right-deletedtext": "Vide 'o testo scancellato e cagnamiente nfra virziune scancellate",
+       "right-browsearchive": "Ascìa dint' 'e paggene scancellate",
+       "right-undelete": "Arripiglia na paggena",
+       "right-suppressrevision": "Vide, annascunne e ripiglia 'e verziune specifiche d' 'e paggene a cocherun'utente",
+       "right-viewsuppressed": "Vide 'e verziune annascunnute a coccherun'utente",
+       "right-suppressionlog": "Vide 'e riggistre private",
+       "right-block": "Blocca 'e cagnamiente 'a parte 'e l'at'utente",
+       "right-blockemail": "Blocca n'utente a mannà e-mail",
+       "right-hideuser": "Blocca n'utente e fallo sparì 'a 'o pubbreco",
+       "right-ipblock-exempt": "Ignora 'e blocche 'e l'IP, 'e blocche automatece e li blocche 'e range 'e l'IP",
+       "right-proxyunbannable": "Passa 'e blocche automatiche d' 'e proxy",
+       "right-unblockself": "Sblocca se stesso",
+       "right-protect": "Cagna 'e livelle 'e prutezione 'e cagna paggene prutette ricurzivamente",
+       "right-editprotected": "Cagna 'e paggene prutette cu \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Cagna 'e paggene prutette cu \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editinterface": "Modifeca 'a nterfaccia utente",
+       "right-editusercssjs": "Cagna 'e file CSS e JS e l'at'utente",
+       "right-editusercss": "Cagna 'e file CSS 'e l'at'utente",
+       "right-edituserjs": "Cagna 'e file JS e l'at'utente",
+       "right-editmyusercss": "Cagna 'e proprie file CSS",
+       "right-editmyuserjs": "Cagna 'e proprie file JavaScript",
+       "right-viewmywatchlist": "Vide l'alenco 'e cuntrollo proprio",
+       "right-editmywatchlist": "Cagna l'alenco 'e cuntrollo proprio. Vedete ca cocch'azione putesse jògnere ancora paggene senza stu deritto.",
+       "right-viewmyprivateinfo": "Vide 'e proprie date private (e.g. e-mail, nomme overo)",
+       "right-editmyprivateinfo": "Cagna 'e date perzunale proprie (p'esempio: e-mail, nomme overo)",
+       "right-editmyoptions": "Cagna 'e preferenze proprie",
+       "right-rollback": "Annulla ampresso 'e cagnamiente 'e ll'urdem'utente c'avesse cagnato na paggena particolare",
+       "right-markbotedits": "Nzégna 'e cagnamiente suggette a rollback comme affettuate 'a nu bot",
+       "right-noratelimit": "Nun suggetto a lemmeto d'aziune",
+       "right-import": "Carreca paggene 'a n'ati wiki",
+       "right-importupload": "Carreca paggene 'a n'upload 'e file",
+       "right-patrol": "Nzegna 'e cagnamiente 'e l'ati utente comme cuntrullate",
+       "right-autopatrol": "Nzegna automatecamente 'e cagnamiente proprie comme cuntrullate",
+       "right-patrolmarks": "Vide ll'urdeme cagnamiente int' 'a funzione 'e cuntrollo",
+       "right-unwatchedpages": "Vide n'alenco 'e pagene nun cuntrullate",
+       "right-mergehistory": "Aunisce 'a cronologgia d' 'e paggene",
+       "right-userrights": "Cagna 'e deritte 'e ll'utente",
+       "right-userrights-interwiki": "Cagna 'e deritte 'e ll'utente int'a l'ati wiki",
+       "right-siteadmin": "Blocca e sblocca 'o database",
+       "right-override-export-depth": "Esporta 'e paggene azzeccanno 'e paggene cullegate nfin'a na profondità 'e 5",
+       "right-sendemail": "Manna na mail a ll'at'utente",
+       "right-passwordreset": "Vide 'e mmasciate 'e rimpustazione d' 'a password",
+       "newuserlogpage": "Riggistro 'e nuove utente",
+       "newuserlogpagetext": "Chest'è nu riggistro 'e criazione d'utenze.",
+       "rightslog": "Deritte 'e ll'utente",
+       "rightslogtext": "Ccà abbascio sta nu riggistro d' 'e cagnamiente a 'e deritte 'e ll'utente",
+       "action-read": "lieggere sta paggena",
        "action-edit": "càgna chesta paggena",
+       "action-createpage": "crìa paggene",
+       "action-createtalk": "crìa chiacchiere 'e paggena",
+       "action-createaccount": "crìa stu cunto utente",
+       "action-history": "vide 'a cronologgia 'e sta paggena",
+       "action-minoredit": "nzegnà stu cagnamiento comme minore",
+       "action-move": "Spusta chista paggena",
+       "action-move-subpages": "muovere sta paggena, e le sottopaggene relative",
+       "action-move-rootuserpages": "muove 'e paggene princepale d'utente",
+       "action-move-categorypages": "muove 'e categurìe",
+       "action-movefile": "muove stu file",
+       "action-upload": "carreca stu file",
+       "action-reupload": "sovrascrive stu file esistente",
+       "action-reupload-shared": "sovrascrive stu file prisente dint'a ll'archivio condiviso",
+       "action-upload_by_url": "carreca stu file 'a n'indirizzo URL",
+       "action-writeapi": "usa l'API 'n scrittura",
+       "action-delete": "scancèlla chista paggena",
+       "action-deleterevision": "scancellà sta verziona",
+       "action-deletedhistory": "vide 'a cronologgia scancellata 'e sta paggena",
+       "action-browsearchive": "ascìa dint' 'e paggene scancellate",
+       "action-undelete": "arripiglia chista paggena",
+       "action-suppressrevision": "rivedé e arripiglià 'e cagnamiente annascunnute",
+       "action-suppressionlog": "vide stu riggistro privato",
+       "action-block": "blocca 'e cagnamiente 'a parte 'e st'utente",
+       "action-protect": "cagna 'e livelle 'e prutezione pe' sta paggena",
+       "action-rollback": "annulla ampresso 'e cagnamiente 'e ll'urdem'utente c'avesse cagnato na paggena particolare",
+       "action-import": "carreca paggene 'a n'ata wiki",
+       "action-importupload": "carreca paggene 'a n'upload 'e file",
+       "action-patrol": "nzegna 'e cagnamiente 'e l'ati utente comme cuntrullate",
+       "action-autopatrol": "nzignà 'e proprie cagnamiente comme cuntrullate",
+       "action-unwatchedpages": "vide l'alenco 'e pagene nun cuntrullate",
+       "action-mergehistory": "aunisce 'a cronologgia 'e sta paggena",
+       "action-userrights": "cagna 'e deritte 'e ll'utente",
+       "action-userrights-interwiki": "cagna 'e deritte 'e ll'utente int'a l'ati wiki",
+       "action-siteadmin": "blocca o sblocca 'o database",
+       "action-sendemail": "manna e-mail",
+       "action-editmywatchlist": "cagna l'alenco 'e cuntrolo 'o tuojo",
+       "action-viewmywatchlist": "vide l'alenco 'e cuntrollo proprio",
+       "action-viewmyprivateinfo": "vide 'e date perzunale",
+       "action-editmyprivateinfo": "cagnà 'e proprie date perzunale",
+       "nchanges": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|'a ll'urdema visita}}",
+       "enhancedrc-history": "cronologgia",
        "recentchanges": "Urdeme nove",
        "recentchanges-legend": "Opzione urdeme cagnamiénte",
-       "recentchanges-summary": "Ncoppa chesta paggena song' appresentate ll'urdeme cagnamiente fatto ê cuntenute d\"o sito.",
+       "recentchanges-summary": "Ncoppa chesta paggena song' appresentate ll'urdeme cagnamiente fatte ê cuntenute d\"o sito.",
+       "recentchanges-noresult": "Nisciuno cagnamiento dint'o periodo dato ca soddisfà sti criterie.",
+       "recentchanges-feed-description": "Ncoppa chistu feed song' appresentate ll'urdeme cagnamiente fatte ê cuntenute d\"o sito.",
        "recentchanges-label-newpage": "Chista modifica ha criato 'na nova paggena",
        "recentchanges-label-minor": "Chisto è nu cagnamiénto piccerillo",
+       "recentchanges-label-bot": "Cagnamiento affettuato 'a nu bot",
        "recentchanges-label-unpatrolled": "Chista modifica nun è stata 'ncora verificata",
+       "recentchanges-label-plusminus": "'A grannezza d' 'a paggena s'è cagnata pe' bbia 'e stu nummero 'e bytes",
+       "recentchanges-legend-heading": "'''Liggenda:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide [[Special:NewPages|'e paggene nove]])",
+       "rcnotefrom": "Ccà abbascio {{PLURAL:$5|è alencato 'o cagnamiento appurtato|song' alincate 'e cagnamiente appurtate}} 'a <strong>$3, $4</strong> (mmustate nfin'a <strong>$1</strong>).",
        "rclistfrom": "Faje vedé 'e cagnamiénte fatte a partì 'a $3 $2",
        "rcshowhideminor": "$1 'e cagnamiénte piccerille",
+       "rcshowhideminor-show": "Faje vedé",
+       "rcshowhideminor-hide": "Annascunne",
        "rcshowhidebots": "$1 'e bot",
+       "rcshowhidebots-show": "Faje vedé",
+       "rcshowhidebots-hide": "Annascunne",
        "rcshowhideliu": "$1 ll'utente reggìstrate",
+       "rcshowhideliu-show": "Faje vedé",
+       "rcshowhideliu-hide": "Annascunne",
        "rcshowhideanons": "$1 ll'utente anonime",
+       "rcshowhideanons-show": "Faje vedé",
+       "rcshowhideanons-hide": "Annascunne",
+       "rcshowhidepatr": "$1 cagnamiente cuntrullate",
+       "rcshowhidepatr-show": "Faje vedé",
+       "rcshowhidepatr-hide": "Annascunne",
        "rcshowhidemine": "$1 'e ffatiche mmee",
+       "rcshowhidemine-show": "Faje vedé",
+       "rcshowhidemine-hide": "Annascunne",
        "rclinks": "Faje vedé ll'urdeme $1 cagnamiente dint' ll'urdeme $2 juorne<br />$3",
        "diff": "diff",
        "hist": "cron",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "number_of_watching_users_pageview": "[osservata 'a {{PLURAL:$1|n'utente|$1 utente}}]",
+       "rc_categories": "Lemmeta a 'e categurìe (spartute 'a \"|\")",
        "rc_categories_any": "Qualònca",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} aropp'ô cagnamiento",
+       "newsectionsummary": "/* $1 */ sezziona nnova",
        "rc-enhanced-expand": "Fa vede dettaglie",
        "rc-enhanced-hide": "Annascunne dettaglie",
+       "rc-old-title": "origginariamente criata comme \"$1\"",
        "recentchangeslinked": "Cagnamiénte cullegate",
        "recentchangeslinked-feed": "Cagnamiénte cullegate",
        "recentchangeslinked-toolbox": "Cagnamiénte cullegate",
        "recentchangeslinked-title": "Cagnamiénte cullegate a \"$1\"",
+       "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 dda paggena",
+       "recentchangeslinked-to": "Mmusta sulamente 'e cagnamiente a 'e paggene cullegate a chilla specificata",
        "upload": "Careca file",
+       "uploadbtn": "Carreca file",
+       "reuploaddesc": "Torna a 'o modulo pe ffà 'a carreca",
+       "upload-tryagain": "Manna 'a descrizione d' 'o file cagnato",
+       "uploadnologin": "Acciesso nun affettuato",
+       "uploadnologintext": "Pe' carrecà 'o file ce vulesse $1.",
+       "upload_directory_missing": "'A cartella 'e carreche ($1) nun esiste e nun se può crià 'a 'o server web.",
+       "upload_directory_read_only": "'O server web nun può scrivere dint' 'a cartella 'e carreca ($1).",
+       "uploaderror": "Errore a carrecà",
+       "upload-recreate-warning": "'Attenziò'': nu file cu stu nomme è stato scancellato o spustato.'''\n'O riggistro d' 'e scancellamiente e d' 'e spustamiente 'e sta paggena è stato scritto ccà abbascio pe' ffà comodo:",
+       "uploadtext": "Ausà 'o modulo ccà sotto pe' carrecà file nuove. Pe' vedé o ascià 'e file carrecate già, vide 'o [[Special:FileList|riggistro 'e file carrecate]]. Càrreche 'e file e virzione nove d' 'e file songo riggistrate dint' 'o [[Special:Log/upload|riggistro d'upload]], 'e scancellamiente dint' 'o [[Special:Log/delete|riggistro ccà]].\n\nPe' nzertà nu file dint'a na paggena, allora facite nu cullegamento 'e stu tipo:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' p'ausà a verziona cumpleta d' 'o file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></code>''' p'ausà na verziona luonga 200 pixel nzertata dint'a na cascia, allineata a manca e cu nu 'testo alternativo' comme didascalia\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pe' crià nu cullegamento diretto a 'o file senza 'o fà vedé",
+       "upload-permitted": "Tipe 'e file permesse: $1.",
+       "upload-preferred": "Tipe 'e file cunzigliate: $1.",
+       "upload-prohibited": "Tipe 'e file nun permesse: $1.",
+       "uploadlogpage": "Riggistro 'e carreche",
+       "uploadlogpagetext": "Ccà abbascio song'alencate l'urdeme file carrecate.\nCuntrullate 'a [[Special:NewFiles|gallaria d' 'e file nuove]] pe' ve ffà na guardata cchiù visuale 'e tutto.",
+       "filename": "Nomme d' 'o file",
        "filedesc": "Énnece",
+       "fileuploadsummary": "Dettaglie:",
+       "filereuploadsummary": "Cagnamiente a 'o file:",
+       "filestatus": "Stato d' 'o copyright:",
+       "filesource": "Fonte:",
+       "ignorewarning": "Lassa perde l'avviso e sarva 'o file pure",
+       "ignorewarnings": "Lasa perde ogne mmasciata d'attenzione",
+       "minlength1": "'E nomme d' 'e file hann'avé minimo na lettera.",
+       "illegalfilename": "'O nomme \"$1\" cuntene carattere nun permesse dint' 'e titule 'e paggena.\nPe' piacere date n'atu nomme a 'o file e pruvate a 'o carrecà n'ata vota.",
+       "filename-toolong": "'E nomme d' 'e file nun ponno superà 'e 240 byte.",
+       "badfilename": "'O nomme d' 'o file è stato cagnato a \"$1\".",
+       "filetype-mime-mismatch": "'A stensione d' 'o file \".$1\" nun currisponne a 'o tipo MIME scummigliato a 'o file ($2).",
+       "filetype-badmime": "Nun è permesso carrecà file 'e tipo MIME \"$1\".",
+       "filetype-bad-ie-mime": "Nun se ponno carrecà 'e file pecché Internet Explorer 'o scummigliasse comme \"$1\", che è nu tipo 'e file nun permesso e potenzialmente pericoloso.",
+       "filetype-unwanted-type": "Carrecà file 'e tipo '''\".$1\"''' è scunzigliato. {{PLURAL:$3|'O tipo 'e file cunzigliato è|'E tipe 'e file cunzigliate songo}} $2.",
+       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|nun è nu tipo 'e file permesso|nun songo tipe 'e file permesse}}. {{PLURAL:$3|'O tipo 'e file permesso è|'E tipe 'e file permesse songo}} $2.",
+       "filetype-missing": "'O file nun ave stensione (p'esempio \".jpg\").",
+       "empty-file": "'O file ch'avite mannato è abbacante.",
+       "file-too-large": "'O file ch'avite mannato è troppo gruosso.",
+       "filename-tooshort": "'O nomme d' 'o file è troppo curto.",
+       "filetype-banned": "Stu tipo 'e file nun è permesso.",
+       "verification-error": "Stu file nun ha passat' 'o cuntrollo.",
+       "hookaborted": "'O cagnamiento c'avite pruvato 'e fà è stato spezzato 'a na stensione.",
+       "illegal-filename": "'O nomme d' 'o file nun è permesso.",
+       "overwrite": "Sovrascrivere nu file ch'esiste già nun è permesso.",
+       "unknown-error": "È capitato n'errore scanusciuto.",
+       "tmp-create-error": "Nun se può crià nu file temporaneo.",
+       "tmp-write-error": "Errore a scrivere nu file temporaneo.",
+       "large-file": "S'arraccumanna 'e nun appassà 'e diminsione 'e $1 p'ogne file; stu file è gruosso $2.",
+       "largefileserver": "Stu file appassa 'e dimensiune permesse 'a la configurazione d' 'o server",
+       "emptyfile": "'O file carrecato mò mò pare abbacante. Può darse ch'è stato n'errore int' 'o nomme d' 'o file. Cuntrullate ca vulite overamente carrecà stu file.",
+       "windows-nonascii-filename": "Chista wiki nun supporta nomme d' 'e file cu carattere spiciale",
+       "fileexists": "Nu file cu stu nomme esiste già.\nPe' piacere cuntrullate primma <strong>[[:$1]]</strong> si nun site sicure ca 'o vulite cagnà.\n[[$1|thumb]]",
+       "filepageexists": "'A paggena 'e descrizione 'e stu file è stata già criata a l'indirizzo <strong>[[:$1]]</strong>, pùre si nun esiste ancora nu file cu stu nomme. 'A descrizione 'e l'oggetto nzertàta 'n fase 'e carreca nun cumparerrà ncopp' 'a paggena 'e descrizione. Pe' ffà l'oggetto cumparì ncopp' 'a paggena 'e descrizione, l'avisseve 'a cagnà manualmente.\n[[$1|thumb]]",
+       "fileexists-extension": "Nu file esiste cu nu nomme suoccio a chesto: [[$2|thumb]]\n* Nomme d' 'o file carrecato: <strong>[[:$1]]</strong>\n* Nomme d' 'o file esistente: <strong>[[:$2]]</strong>\nPuò darse ca vulite scegliere nu nomme cchiù specifico?.",
+       "fileexists-thumbnail-yes": "Pare ch' 'o file carrecato fosse na miniatura ''(thumbnail)''. [[$1|thumb]]\nCuntrullate, pe' cunfronto, 'o file <strong>[[:$1]]</strong>.\nSi se trattasse d' 'a stessa immaggene, ch' 'e diminsiune origginale, nun è necessario carrecà ati miniature.",
+       "file-thumbnail-no": "Stu filename accummencia pe' <strong>$1</strong>.\nPare ca ce sta n'immaggene piccerilla <em>(thumbnail)</em>.\nSi tiene st'immaggene 'n risoluzione origginale, pe' piacere carrecatela. Si nò, vedite 'e cagnà 'o nomme d' 'o file.",
+       "fileexists-forbidden": "Nu file cu stu nomme esiste già, e nun se può sovrascrivere.<br/>\nPe' piacere turnat'arreto e cagnàte 'o nomme p' 'o turnà a carrecà.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Nu file cu stu nomme esiste già dint'a l'archivio 'e risorse multimediale spartute. Si vulite carrecà 'o file ancora, turnat'arreto e cagnate 'o nomme p' 'o turnà a carrecà.\n[[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "Stu file è nu duplicato {{PLURAL:$1|d' 'o|d' 'e}} file ccà abbascio:",
+       "file-deleted-duplicate": "Nu file identico a chesto ([[:$1]]) è stato scancellato prima. Cuntrullate 'a cronologgia d' 'e scancellamiente apprimma d' 'o carrecà n'ata vota.",
+       "file-deleted-duplicate-notitle": "Nu file eguale a stu file è stato previamente scancellato, e 'o titolo è stato sbaccantato. Chierete a coccheruno ca tenesse 'a posibbelità 'e vedé file luvate e sbaccantate pe' sapé nquale situazione ve truvate apprimma d' 'o ffà carrecà n'ata vota.",
+       "uploadwarning": "Avviso 'e carreca",
+       "uploadwarning-text": "Pe' piacere cagnate ccà abbascio 'a descrizione d' 'o file 'e pruvate n'ata vota.",
+       "savefile": "Sarva file",
+       "uploaddisabled": "'E càrreche so' state stutate.",
+       "copyuploaddisabled": "'E càrreche pe' bbia 'e l'URL so' state stutate.",
+       "uploaddisabledtext": "'E carreche 'e file so' state stutate.",
+       "php-uploaddisabledtext": "'E càrreche 'e file pe' bbia d' 'o PHP so' state stutate. Cuntrullate 'a configurazione d' 'o file_uploads.",
+       "uploadscripted": "Stu file cuntene codece HTML o script, ca se putesse nterpretà erroneamente 'a nu navigatóre web.",
+       "uploadscriptednamespace": "Stu file SVG cuntene nu namespace '$1' nun permesso.",
+       "uploadinvalidxml": "'O códece XML d' 'o file carrecato nun se può passà.",
+       "uploadvirus": "Stu file cuntene nu virus! Dettaglie: $1",
+       "uploadjava": "Stu file è nu file ZIP ca cuntene nu file .class Java.\nCarrecà 'e file Java nun è permesso, pecché ponno appassà 'e restriziune 'e sicurezza.",
+       "upload-source": "File d'origgine",
+       "sourcefilename": "Nomme d' 'o file d'origgine:",
+       "sourceurl": "URL d'origgine:",
+       "destfilename": "Nomme 'e file 'e destinazione:",
+       "upload-maxfilesize": "Diminsione massima d' 'o file: $1",
+       "upload-description": "Descrizione d' 'o file",
+       "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-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ò è disponibbele ccà: [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "Probblema c' 'a carreca",
+       "upload-failure-msg": "Ce steva nu probblema c' 'a carreca 'a [$2]:\n\n$1",
+       "upload-warning-subj": "Avviso 'e carreca",
+       "upload-warning-msg": "Ce steva nu probblema c' 'a carreca 'a [$2]. Putite turnà arreto a 'o [[Special:Upload/stash/$1|module 'e carreche]] pe pruvà d'aggiustà stu prubblema.",
+       "upload-proto-error": "Prutucollo sbagliato",
+       "upload-proto-error-text": "'E carreche remote hann'abbesuogno 'e l'URL c'accummencieno c' 'a parola <code>http://</code> o <code>ftp://</code>.",
+       "upload-file-error": "Errore 'nterno",
+       "upload-file-error-text": "S'è verificato n'errore interno quanno avete pruvat'a crià nu file temporaneo ncopp' 'o server.\nPe' piacere cuntattate n'[[Special:ListUsers/sysop|ammenistratore]].",
+       "upload-misc-error": "Errore 'e carreche scanusciute",
+       "upload-misc-error-text": "N'errore scanusciuto s'è verificato quanno se steva facenno 'a carreca.\nPe' piacere cuntrullate ca l'URL è valida e accessibbele e pruvate n'ata vota.\nSi 'o probblema è presente ancòra, cuntattate n'[[Special:ListUsers/sysop|ammenistratore]].",
+       "upload-too-many-redirects": "L'URL teneva troppe redirect",
+       "upload-http-error": "N'errore HTTP è succiesso: $1",
+       "upload-copy-upload-invalid-domain": "Nun è permessa 'a carreca 'e copie 'a chistu dumminio.",
+       "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.",
+       "backend-fail-hashes": "Nun se ponno attené 'e hash d' 'o file pe' ne ffà 'o cunfronto.",
+       "backend-fail-notsame": "Esiste già nu file nun eguale a $1 .",
+       "backend-fail-invalidpath": "$1 nun è un nu posto d'archiviazione bbuono.",
+       "backend-fail-delete": "Nun se può scancellà 'o file \"$1\"",
+       "backend-fail-describe": "Nun se ponno cagnà 'e metadate d' 'o file \"$1\".",
+       "backend-fail-alreadyexists": "'O file $1 esiste già.",
+       "backend-fail-store": "Nun se può astipà 'o file \"$1\" dint'a \"$2\".",
+       "backend-fail-copy": "Nun se può copiare 'o file \"$1\" dint'a \"$2\".",
+       "backend-fail-move": "Nun se può spustà 'o file \"$1\" into \"$2\".",
+       "backend-fail-opentemp": "Nun se può arapì nu file temporaneo.",
+       "backend-fail-writetemp": "Nun se può scrivere nu file temporaneo.",
+       "backend-fail-closetemp": "Nun se può nchiure nu file temporaneo.",
+       "backend-fail-read": "Nun se può lieggere 'o file \"$1\".",
+       "backend-fail-create": "Nun se può scrivere 'o file \"$1\"",
+       "backend-fail-maxsize": "Nun se può scrivere 'o file \"$1\" pecché chist'è cchiù gruosso 'e {{PLURAL:$2|nu byte|$2 byte}}",
+       "backend-fail-readonly": "L'archivio 'e rezza \"$1\" è mò mò 'n sola-lettura. 'O mutivo è: \"$2\"",
+       "backend-fail-synced": "'O file \"$1\" è int' 'a nu stato ncunzistente dint'a l'archivie nterne.",
+       "backend-fail-connect": "Nun se può cunnettà â memoria 'e rezza \"$1\".",
+       "backend-fail-internal": "N'errore scanusciuto s'è verificato int'a l'archivie 'e rezza \"$1\".",
+       "backend-fail-contenttype": "Nun se ponno determinà 'e tipe 'e cuntenute d' 'o file 'a riggistrà dint'a \"$1\".",
+       "backend-fail-batchsize": "L'archivio 'e rezza prugrammaje na rezza 'e $1 {{PLURAL:$1|prucesso|prucesse}} ncopp' 'o file; 'o lémmeto è $2 {{PLURAL:$2|prucesso|prucesse}}.",
+       "backend-fail-usable": "Nun se può lieggere o scrivere 'o file \"$1\" pecché mancano 'e permesse sufficiente o nun esiste 'a cartella/cuntenitore.",
+       "filejournal-fail-dbconnect": "Nun se può fà connessione a l'archivio d' 'o database pe' puté astipà archivie 'n rezza \"$1\".",
+       "filejournal-fail-dbquery": "Nun se può agghiurnà l'archivio d' 'o database pe' puté astipà l'archivie 'n rezza \"$1\".",
+       "lockmanager-notlocked": "Nun se può sbloccà \"$1\"; nun è bluccato.",
+       "lockmanager-fail-closelock": "Nun se può nchiure 'o file 'e blocco pe' \"$1\".",
+       "lockmanager-fail-deletelock": "Nun se può scancellà 'o file 'e blocco pe' \"$1\".",
+       "lockmanager-fail-acquirelock": "Nun se può piglià 'o blocco pe' \"$1\".",
+       "lockmanager-fail-openlock": "Nun se può arapì 'o file 'e blocco pe' \"$1\".",
+       "lockmanager-fail-releaselock": "Nun se può lanzà 'o blocco pe' \"$1\".",
+       "lockmanager-fail-db-bucket": "Nun se ponno cuntattà 'e database 'e blocco necessarie int'a $1.",
+       "lockmanager-fail-db-release": "Nun se ponno lanzà 'e blocche ncopp' 'o database $1.",
+       "lockmanager-fail-svr-acquire": "Nun se ponno piglià 'e blocche ncopp' 'o server $1.",
+       "lockmanager-fail-svr-release": "Nun se ponno lanzà blocche ncopp' 'o server $1.",
+       "zip-file-open-error": "S'è truvato n'errore quanno se steva arapenno nu file pe' ne fà cuntrolle ZIP.",
+       "zip-wrong-format": "'O file specificato nun era nu file ZIP.",
+       "zip-bad": "'O file è corrotto o pure nun è nu file ZIP ca se putesse lieggere.\nNun se può cuntrullà opportunamente pe' sicurezza.",
+       "zip-unsupported": "'O file è nu file ZIP c'ausa servizie ZIP ca nun songo suppurtate 'a MediaWiki.\nNun se può cuntrullà pe' sicurezza.",
+       "uploadstash": "Carreca stash",
+       "uploadstash-summary": "Sta paggena dà l'accesso a 'e file ca songo carrecate o ca stanno pe' se carrecà, ma nun songo pubbrecat'ancora ncopp'a sta wiki. Sti file nun songo visibbele a nisciuno, sulamente a chill'utente ca l'ha carrecato.",
+       "uploadstash-clear": "Pulezza 'e file annascunnute",
+       "uploadstash-nofiles": "Nun tenite file annascunnute.",
+       "uploadstash-badtoken": "L'esecuzione 'e sta azione nun ha avuto successo, forse pecché 'e credenziale 'e cagnamiento so' mmaturate. Prova n'ata vota.",
+       "uploadstash-errclear": "'A pulezzia d' 'e file nun ha avuto successo.",
+       "uploadstash-refresh": "Agghiuorna l'alenco d' 'e file",
+       "invalid-chunk-offset": "Distanza d' 'a parte nun valida",
+       "img-auth-accessdenied": "Acciesso negato",
+       "img-auth-nopathinfo": "PATH_INFO mancante.\n'O server nun è mpustato pe' passà sta nfurmazione.\nPuò darse ca, essenno basato ncopp'a CGI, nun putesse suppurtà img_auth.\nVide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
+       "img-auth-notindir": "'O percurzo addimannato nun se trova dint' 'e cartelle d'upload configurate.",
+       "img-auth-badtitle": "Nun se può fravecà nu titolo valido 'a \"$1\".",
+       "img-auth-nologinnWL": "Nun site trasuto e \"$1\" nun è dint'a lista janca.",
+       "img-auth-nofile": "File \"$1\" nun esiste.",
+       "img-auth-isdir": "State pruvanno a trasì int' 'a cartella \"$1\".\nSulamente se può trasì a 'e file.",
+       "img-auth-streaming": "\"$1\" 'n streaming.",
+       "img-auth-public": "'A funziona 'e img_auth.php è chella ddà 'e file d'output 'a na wiki privata.\nSta wiki è configurata comm'a na wiki pubbleca.\nPe na sicurezza ottima, img_auth.php è stutato.",
+       "img-auth-noread": "L'utente nun tene acciesso pe lieggere \"$1\".",
+       "http-invalid-url": "URL nun valido: $1",
+       "http-invalid-scheme": "L'URL c' 'o prefisso \"$1\" nun so' suppurtate.",
+       "http-request-error": "Richieste HTTP fallite pe' n'errore scanusciuto.",
+       "http-read-error": "Errore 'e lettura HTTP.",
+       "http-timed-out": "Richieste HTTP fore tiempo.",
+       "http-curl-error": "Errore analizzanno l'URL: $1",
+       "http-bad-status": "C'è stato nu probblema pe' tramente ca se faceva 'a richiesta HTTP: $1, $2",
+       "upload-curl-error6": "Nun se riesce 'arrevà a l'URL",
+       "upload-curl-error6-text": "A l'URL c'avete scritto nun se può arrevà.\nPe' piacere, cuntrullate ca l'URL è curretta e ca 'o sito è appicciato.",
+       "upload-curl-error28": "Fore tiempo p' 'a carreca",
+       "upload-curl-error28-text": "'O sito trica tiempo a risponnere.\nPe piacere, cuntrullate ca 'o sito è appicciato, aspettate nu poco 'e tiempo e pruvate n'ata vota.\nVuje forse vulite aspettà nu poco ca se spiccia 'o traffeco a 'o sito.",
        "license": "Licenze:",
        "license-header": "Licenza",
+       "nolicense": "Nisciuna licienza scigliuta",
        "licenses-edit": "Càgna opzziune 'e licenza",
+       "license-nopreview": "(Anteprimma nun disponibbele)",
+       "upload_source_url": "(nu file 'a n'URL valido e accessibbele pubblecamente)",
+       "upload_source_file": "(nu file d' 'o computer 'o tuojo)",
+       "listfiles-delete": "scancèlla",
+       "listfiles-summary": "Sta paggena speciale fà vedé tuttequante file carrecate.",
+       "listfiles_search_for": "Ascìa 'e media pe' nomme:",
+       "imgfile": "file",
+       "listfiles": "Lista d' 'e file",
+       "listfiles_thumb": "Miniature",
+       "listfiles_date": "Data",
        "listfiles_name": "Nomme",
+       "listfiles_user": "Utente",
+       "listfiles_size": "Dimenzione",
+       "listfiles_description": "Descrizzione",
+       "listfiles_count": "Verziune",
+       "listfiles-show-all": "Nclude 'e verziune viecchie 'e ll'immaggene",
+       "listfiles-latestversion": "Verzione 'e mo",
+       "listfiles-latestversion-yes": "Sì",
+       "listfiles-latestversion-no": "No",
        "file-anchor-link": "Fiùra",
        "filehist": "Cronologgia d\"o file",
-       "filehist-revert": "ripristina",
+       "filehist-help": "Ffà click su nu gruppo data/ora pe' vedé 'o file comme s'apprisentava ind' 'a chillu mumento.",
+       "filehist-deleteall": "scancella tutto",
+       "filehist-deleteone": "scancèlla",
+       "filehist-revert": "arrepiglia",
        "filehist-current": "attuale",
        "filehist-datetime": "Data/Ora",
        "filehist-thumb": "Miniature",
+       "filehist-thumbtext": "Miniatura d' 'a verziona d' 'o $1",
+       "filehist-nothumb": "Nisciuna miniatura",
        "filehist-user": "Utente",
        "filehist-dimensions": "Dimenzione",
+       "filehist-filesize": "Dimenziune d\"o file",
+       "filehist-comment": "Commento",
        "imagelinks": "Jonte ê ffiure",
+       "linkstoimage": "{{PLURAL:$1|Sta paggena cullega|$1 'e sti paggene cullegano}} a stu file:",
+       "linkstoimage-more": "Cchiù 'e $1 {{PLURAL:$1|paggene cullegano|paggene cullegano}} a stu file.<br />\nL'alenco ccà abbascio fà vedé {{PLURAL:$1|'a primma paggena ca cullega|'e primme $1 paggene ca cullegano}} sulamente a stu file.<br />\nNa [[Special:WhatLinksHere/$2|lista completa]] è disponibbele.",
+       "nolinkstoimage": "Nisciuna paggena cullega a stu file.",
+       "morelinkstoimage": "Vide [[Special:WhatLinksHere/$1|cchiù cullegamiente]] a stu file.",
+       "linkstoimage-redirect": "$1 (redirezionamiente d' 'o file) $2",
+       "duplicatesoffile": "{{PLURAL:$1|'O file ccà abbascio è nu duplicato|'E $1 file ccà abbascio songo duplicate}} 'e stu file ([[Special:FileDuplicateSearch/$2|cchiù nfurmaziune]]):",
+       "sharedupload": "Stu file vène 'a $1 e pò essere ausato 'a n'ati pruggette.",
+       "sharedupload-desc-there": "Stu file vène 'a $1 e pò essere ausato pe n'ati pruggette.<br />\nPe' piacere vedite 'a [$2 pàggena 'e descrizione d' 'o file] pe' n'avé cchiù nfurmaziune.",
+       "sharedupload-desc-here": "Stu file vène 'a $1 e pò essere ausato pe n'ati pruggette.<br />\n'A descriziona ncopp' 'a [$2 pàggena 'e descrizione d' 'o file] se può vedé ccà abbascio.",
+       "sharedupload-desc-edit": "Stu file vène 'a $1 e pò essere ausato pe n'ati pruggette.<br />\nPuò darse ca vulite cagnà 'a descrizione d' 'a [$2 paggena 'e descrizione d' 'o file] ccà.",
+       "sharedupload-desc-create": "Stu file vène 'a $1 e pò essere ausato pe n'ati pruggette.<br />\nPuò darse ca vulite cagnà 'a descrizione dint' 'a [$2 paggena 'e descrizione d' 'o file] ccà.",
+       "filepage-nofile": "Nisciuno file cu stu nomme esiste.",
+       "filepage-nofile-link": "Nisciuno file cu stu nomme esiste, ma 'o putite [$1 carrecà].",
+       "uploadnewversion-linktext": "Càrreca na verziona nova 'e stu file",
+       "shared-repo-from": "'a $1",
+       "shared-repo": "n'archivio cundiviso",
+       "upload-disallowed-here": "Nun se può sovrascrivere stu file.",
+       "filerevert": "Arrepiglia $1",
+       "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-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.",
+       "filedelete": "Scancella $1",
+       "filedelete-legend": "Scancella 'o file",
+       "filedelete-intro": "State pe' scancellà 'o file '''[[Media:$1|$1]]''' cu tutta 'a cronologgia 'e chisto.",
+       "filedelete-intro-old": "State a scancellà 'a verziona 'e '''[[Media:$1|$1]]''' d' 'o [$4 $3, $2].",
+       "filedelete-comment": "Mutivo:",
+       "filedelete-submit": "Scancèlla",
+       "filedelete-success": "'O file '''$1''' è stato scancellato.",
+       "filedelete-success-old": "'A verziona d' 'o file '''[[Media:$1|$1]]''' d' 'o  $3, $2  è stata scancellata.",
+       "filedelete-nofile": "Nun esiste nu file '''$1'''.",
+       "filedelete-nofile-old": "Nun ce sta na verziona archiviata 'e '''$1''' cu l'attrebbute specificate.",
+       "filedelete-otherreason": "Ati/cchiù ragiune:",
+       "filedelete-reason-otherlist": "Ati ragiune",
+       "filedelete-reason-dropdown": "*Mutive cchiù comune p' 'o scancellà\n** Violazione d' 'o copyright\n** File duplicato",
+       "filedelete-edit-reasonlist": "Càgna 'e mutive pe' fà 'o scancellamiento",
+       "filedelete-maintenance": "'O scancellamiento e arripiglio 'e file s'è stutato p' 'o mumento, pe' tramente ca se fà 'a manutenzione.",
+       "filedelete-maintenance-title": "Nun se può scancellà 'o file",
+       "mimesearch": "Ascià a sicondo 'o MIME",
+       "mimesearch-summary": "Sta paggena permette filtrà 'e file a sicondo 'o tipo 'e MIME.\nNzertate 'a stringa 'e ricerca comm'a nu tipo/sottotipo o tipo/*, p'esempio: <code>image/jpeg</code>.",
+       "mimetype": "Tipo 'e MIME:",
+       "download": "scarreca",
+       "unwatchedpages": "Paggene fore l'alenco 'e cuntrollo",
+       "listredirects": "Liste 'e ridirezionamiente",
+       "listduplicatedfiles": "Lista d' 'e file duplicate",
+       "listduplicatedfiles-summary": "Chist'è n'alenco 'e file, addò 'a verziona cchiù recente 'e nu file è nu duplicato d' 'a verziona cchiù ricente 'e n'atu file. Songhe cunziderate sulamente 'e file lucale.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] ave [[$3|{{PLURAL:$2|nu duplicato|$2 duplicate}}]].",
+       "unusedtemplates": "Template ca nun se song'ausate",
+       "unusedtemplatestext": "Sta paggena alenca tutt' 'e paggene int'a 'o namespace {{ns:template}} ca nun se songo nzertàte dint'a n'ata paggena.\nArricuòrdete 'e cuntrullà l'ati cullegamiente a 'e template apprimm' 'e scancellà.",
+       "unusedtemplateswlh": "ati cullegamiente",
        "randompage": "Na paggena qualsiase",
        "randompage-nopages": "Nun gè song paggene {{PLURAL:$2|dint'ô seguente namespace|dint'ê seguenti namespace}}: $1.",
+       "randomincategory": "Paggena a uocchio dint' 'a categurìa",
+       "randomincategory-invalidcategory": "\"$1\" nun è nu nomme 'e categurìa bbuono.",
+       "randomincategory-nopages": "Non ce stanno pàggene dint' 'a [[:Category:$1]].",
+       "randomincategory-category": "Categurìa:",
+       "randomincategory-legend": "Paggena a uocchio dint' 'a categurìa",
+       "randomredirect": "Redirezionamiento a uocchio",
+       "randomredirect-nopages": "Nun ce stanno redirezionamiente int' 'o namespace \"$1\".",
        "statistics": "Statistiche",
+       "statistics-header-pages": "Statistiche d' 'e paggene",
+       "statistics-header-edits": "Cagna 'e statistiche",
+       "statistics-header-views": "Vide 'e statistiche",
+       "statistics-header-users": "Statistiche 'e l'utente",
+       "statistics-header-hooks": "Ati statistiche",
+       "statistics-articles": "Paggene 'e cuntenute",
+       "statistics-pages": "Paggene",
+       "statistics-pages-desc": "Tutt' 'e paggene dint'a wiki, mettenno 'e chiacchieriate, redirezionamiente, ecc.",
+       "statistics-files": "File carrecate",
+       "statistics-edits": "Cagnamiente d' 'e paggene 'a che {{SITENAME}} s'è accumminciata",
+       "statistics-edits-average": "Cagnamiente medie pe' paggena",
+       "statistics-views-total": "Visite 'n totale",
+       "statistics-views-total-desc": "'E vviste a paggene ca nun esisteno e paggene speciale nun cuntano",
+       "statistics-views-peredit": "Visite pe' cagnamiento",
+       "statistics-users": "[[Special:ListUsers|Utente riggistrate]]",
+       "statistics-users-active": "Utente attive",
+       "statistics-users-active-desc": "Utente c'hanno fatto coccosa dint' 'a {{PLURAL:$1|l'urdemo juorno|l'urdeme $1 juorne}}",
+       "statistics-mostpopular": "Pàggene cchiù visitate",
+       "pageswithprop": "Paggene cu na prupietà 'e paggena",
+       "pageswithprop-legend": "Paggene cu na prupietà 'e paggena",
+       "pageswithprop-text": "Sta paggena alenca 'e paggene c'ausano na prupietà particolare 'e paggena.",
+       "pageswithprop-prop": "Nomme d' 'a prupietà:",
+       "pageswithprop-submit": "Vàje",
+       "pageswithprop-prophidden-long": "valore d' 'a prupietà d' 'o testo luongo annascunnuto ($1)",
+       "pageswithprop-prophidden-binary": "valore 'e prupietà binaria annascunnuto ($1)",
        "doubleredirects": "Redirect duppie",
+       "doubleredirectstext": "Sta paggena alenca 'e paggene ca se ridirezionano a n'ati paggene.\nOgne riga cuntene nu cullegamente a 'o primmo e a 'o sicondo ridirezionamiento pe' ffà vedé addò arriva 'o sicondo ridirezionamiento, 'o quale è nurmalmente 'a paggena 'e destinaziona \"riale\", addò 'o primmo ridirezionaminento avess'a cullegà.\n'A situazione d' 'e <del>ridireziune scancellate</del> è stat'arricettata.",
+       "double-redirect-fixed-move": "[[$1]] è stato spustato.\nÈ stato automaticamente agghiurnato e ora è nu redirect a [[$2]].",
+       "double-redirect-fixed-maintenance": "Curreggenno automaticamente 'o doppio redirect 'a [[$1]] a [[$2]] pe' tramente ca se fà na fatica 'e manutenzione.",
+       "double-redirect-fixer": "Currettore 'e redirezionamiente",
+       "brokenredirects": "Redirezionamiente scassate",
+       "brokenredirectstext": "'E redirezionamiente ccà abbascio vanno a paggene ca nun esisteno:",
+       "brokenredirects-edit": "càgna",
+       "brokenredirects-delete": "scancèlla",
+       "withoutinterwiki": "Paggene senza cullegamiente interwiki",
+       "withoutinterwiki-summary": "'E paggene ccà abbascio nun songo cullegate a nisciun'ata verzione 'e lengua differente.",
+       "withoutinterwiki-legend": "Prefisse",
+       "withoutinterwiki-submit": "Faje vedé",
+       "fewestrevisions": "Paggene cu meno cagnamiente",
        "nbytes": "$1 {{PLURAL:$1|byte|byte}}",
        "ncategories": "$1 {{PLURAL:$1|categoria|categorie}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki}}",
        "nlinks": "$1 {{PLURAL:$1|cullegamiento|cullegamiente}}",
        "nmembers": "$1 {{PLURAL:$1|elemento|elemente}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|membro|membre}}",
+       "nrevisions": "$1 {{PLURAL:$1|verzione|verziune}}",
+       "nviews": "$1 {{PLURAL:$1|visita|visite}}",
+       "nimagelinks": "Ausate ncopp'a {{PLURAL:$1|na paggena|$1 paggene}}",
+       "ntransclusions": "ausate ncopp'a {{PLURAL:$1|na paggena|$1 paggene}}",
+       "specialpage-empty": "Nun ce stanno risultate pe' stu report.",
+       "lonelypages": "Paggene orfane",
+       "lonelypagestext": "'E paggene ccà abbascio nun so state cullegate o appennute int' 'a n'ati paggene ncopp'a {{SITENAME}}.",
+       "uncategorizedpages": "Paggene senza categurìa",
+       "uncategorizedcategories": "Categurìe senza categurìa",
+       "uncategorizedimages": "File senza categurìa",
+       "uncategorizedtemplates": "Template senza categurìa",
+       "unusedcategories": "Categurìe ca nun s'ausano",
+       "unusedimages": "File ca nun s'ausano",
        "popularpages": "Paggene cchiù 'speziunate",
+       "wantedcategories": "Categurìe addimannate",
        "wantedpages": "Paggene cchiù addemannate",
+       "wantedpages-badtitle": "Titolo invalido mmiez' 'o nzieme 'e risultate: $1",
+       "wantedfiles": "File addimannate",
+       "wantedfiletext-cat": "Chisti file s'ausano ma nun esisteno. 'E file ca veneno 'e n'archivio 'e fore s'alencano ccà senza cuntrullà l'esistenza suja. Sti fauze pusitive sarranno <del>nzignate</del>. 'E paggene ca teneno sti file ca nun esisteno song'alencate dint'a [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Sti file ccà, song'ausate, ma nun esisteno. Anze, 'e paggene c'ausano sti file song'alencate dint'a [[:$1]].",
+       "wantedfiletext-nocat": "'E file ccà abbascio s'ausano ma nun esisteno. 'E file ca veneno 'e n'archivio 'e fore s'alencano ccà senza cuntrullà l'esistenza suja. Sti fauze pusitive sarranno <del>nzignate</del>.",
+       "wantedfiletext-nocat-noforeign": "'E file ccà abbascio s'ausano ma nun esisteno.",
+       "wantedtemplates": "Template addimannate",
+       "mostlinked": "Paggene cchiù addimannate",
+       "mostlinkedcategories": "Categurìe cchiù addimannate",
+       "mostlinkedtemplates": "Paggene cchiù appennute",
+       "mostcategories": "Paggene cu cchiù categurìe",
+       "mostimages": "File cchiù addimannate",
+       "mostinterwikis": "Paggene cu cchiù interwiki",
+       "mostrevisions": "Paggene cu cchiù cagnamiente",
+       "prefixindex": "Tutte 'e paggene cu prefisso",
+       "prefixindex-namespace": "Tutte 'e paggene cu prefisso d' 'o namespace $1",
+       "prefixindex-strip": "Annascunne 'o prefisso int' 'a lista",
        "shortpages": "Paggene curte",
        "longpages": "Paggene cchiú longhe",
+       "deadendpages": "Paggene ca nun spòntano",
+       "deadendpagestext": "'E paggene ccà abbascio nun spontano a n'ati paggene ncopp'a {{SITENAME}}.",
+       "protectedpages": "Paggene prutette",
+       "protectedpages-indef": "Sulamente prutezziune a tiempo nun definito",
+       "protectedpages-summary": "Sta paggena elenca 'e paggene ch'esisteno e ca songo prutette mò. Pe n'avé n'elenco 'e titule prutette â criazione, vedite [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-cascade": "Sulamente prutezziune ricurzive",
+       "protectedpages-noredirect": "Annascunne redirect",
+       "protectedpagesempty": "Nisciuna paggena è prutetta pe mò cu sti parametre.",
+       "protectedpages-timestamp": "Data e ora",
+       "protectedpages-page": "Paggena",
+       "protectedpages-expiry": "Ammatura",
+       "protectedpages-performer": "Prutetta 'a ll'utente",
+       "protectedpages-params": "Parametre 'e prutezione",
+       "protectedpages-reason": "Mutivo",
+       "protectedpages-unknown-timestamp": "Scanusciuto",
+       "protectedpages-unknown-performer": "Utente scanusciuto",
+       "protectedtitles": "Paggene prutette",
+       "protectedtitles-summary": "Sta paggena elenca 'e titule ca song'attualmente prutette 'a criazione. Pe' n'avé n'elenco 'e paggene prutette ch'esisteno, vedite [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitlesempty": "Nisciunu titolo è prutetto pe mò cu sti parametre.",
+       "listusers": "Lista 'e l'utente",
+       "listusers-editsonly": "Fà vedé sulamente l'utente cu cagnamiente fatte",
+       "listusers-creationsort": "Arrecetta pe' data 'e criazione",
+       "listusers-desc": "Arrecetta 'a l'auto a 'o vascio",
+       "usereditcount": "{{PLURAL:$1|nu càgnamiento|$1 càgnamiente}}",
        "usercreated": "{{GENDER:$3|Criato/a}} 'o $1 a $2",
        "newpages": "Paggene cchiù frische",
+       "newpages-username": "Nomme utente:",
+       "ancientpages": "Paggene cchiù viecchie",
        "move": "Spusta",
        "movethispage": "Spusta chesta paggena",
+       "unusedimagestext": "'E file ccà abbascio esisteno, ma nun songo appennute dint' 'a nisciuna paggena.\nPe' piacere vedite ca n'ati site ncopp' 'a ll'Internet putessero cullegà cu nu file direttamente cu l'URL, picciò vedite ca putessero stà dint'a sta lista ancora tenenno nu cullegamiento diretto.",
+       "unusedcategoriestext": "'E categurìe ccà abbascio esisteno, ancora ch' 'e categurìe o l'ati paggene nun l'aùsano.",
+       "notargettitle": "Nisciuna destinazione",
+       "notargettext": "Nun avete specificato na paggena o n'utente 'e destinazione pe' putè fa sta operazione.",
+       "nopagetitle": "Nisciuna paggena 'e destinazione",
+       "nopagetext": "'A paggena 'e destinazione c'avite specificato nun esiste.",
+       "pager-newer-n": "{{PLURAL:$1|1 cchiù viecchio|$1 cchiù viecchie}}",
        "pager-older-n": "{{PLURAL:$1|1 cchiù viecchio|$1 cchiù viecchie}}",
+       "suppress": "Supervisione",
+       "querypage-disabled": "Sta paggena speciale è stutata pe' mutive 'e prestaziune.",
        "booksources": "Funte libbrarie",
-       "booksources-go": "Vàje",
+       "booksources-search-legend": "Ascìa 'e fonte ncopp' 'e libbre",
+       "booksources-search": "Ascìa",
+       "booksources-text": "Ccà abbascio ce sta na lista 'e cullegamiente a l'ati site ca venneno libbre nuove e viecchie, ca putessero pure avé cchiù nfurmaziune ncopp' 'e libbre ca jate ascianno:",
+       "booksources-invalid-isbn": "L'ISBN c'avete miso nun pare bbuono; cuntrolla si ce sta cocch'errore quanno stavate cupianno stu nummero d' 'a fonte origginale.",
+       "specialloguserlabel": "Mplementatore:",
+       "speciallogtitlelabel": "Destinazione (titolo o utente):",
        "log": "Logs",
+       "all-logs-page": "Tutte l'archivie pubbleche",
+       "alllogstext": "Visualizzazione mmescata 'e tutte 'e riggistre disponibbele ncopp'a {{SITENAME}}.\nPutite restringere 'a vista a sicondo 'o tipo 'e riggistro, 'o nomme utente (sensibbele a 'e maiuscole), o 'e paggene coinvolte (pure chiste songo sensibbele a 'e maiuscole).",
+       "logempty": "Nun ce sta n'elemento dint' 'o riggistro azzeccato â ricerca.",
+       "log-title-wildcard": "Ascìa titole c'accummencieno cu stu testo",
+       "showhideselectedlogentries": "Cagna visibbelità d' 'e riggistre scigliute",
        "allpages": "Tutte 'e ppaggene",
+       "nextpage": "Paggena appriesso ($1)",
+       "prevpage": "Paggena apprima ($1)",
+       "allpagesfrom": "Fà vedè 'e paggene partenno 'a:",
+       "allpagesto": "Fà vedè 'e paggene ca fernisceno 'o:",
        "allarticles": "Tutt' 'e vvoce",
        "allinnamespace": "Tutt' 'e ppaggene d''o namespace $1",
        "allpagessubmit": "Vàje",
+       "allpagesprefix": "Fà vedè 'e paggene cu 'o prefisso:",
+       "allpagesbadtitle": "'O titolo d' 'a paggena richiesta è invalido o pure nun è linkato buono a 'o titolo inter-lengua o inter-wiki.\nPutesse pure tené uno o cchiù carattere ca nun se ponno usà dint'e titule.",
+       "allpages-bad-ns": "{{SITENAME}} nun ce tene 'o namespace \"$1\".",
+       "allpages-hide-redirects": "Annascunne redirect",
+       "cachedspecial-viewing-cached-ttl": "State a vedé na verzione int' 'a cache 'e sta paggene, 'a quale pò essere agghiurnata 'a $1 fà.",
+       "cachedspecial-viewing-cached-ts": "State vedenno na verzione 'n cache, ca putesse nun essere agghiurnata.",
+       "cachedspecial-refresh-now": "Vide l'urdeme.",
        "categories": "Categurìe",
        "categoriespagetext": "{{PLURAL:$1|'A categurìa 'nnecata 'e seguito cuntiene|'E categurìe 'nnecate 'e seguito cuntengono}} paggene o file multimediale.\n'E [[Special:UnusedCategories|categurìe vuote]] nun song mostrate ccà.\nVere anche 'e [[Special:WantedCategories|categurìe richieste]].",
+       "categoriesfrom": "Fà vedè 'e categurìe partenno 'a:",
+       "special-categories-sort-count": "arricetta pe' cunteggio",
+       "special-categories-sort-abc": "arricetta arfabbeticamente",
+       "deletedcontributions": "Contribbute utente scancellate",
+       "deletedcontributions-title": "Contribbute utente scancellate",
+       "sp-deletedcontributions-contribs": "contribbute",
+       "linksearch": "Ascìa cullegamiente 'a fore",
+       "linksearch-pat": "Ascìa pe' mudello 'e ricerca:",
+       "linksearch-ns": "Namespace:",
        "linksearch-ok": "Truova",
+       "linksearch-text": "'E wildcard cumm'a \"*.wikipedia.org\" ponno essere ausate.<br />\nCe vulesse minimo nu dominio d'auto livello, p'esempio \"*.org\". <br />\n{{PLURAL:$2|Prutucolle}} suppurtate: <code>$1</code> ('o valore 'e bbase è http:// si 'o protocollo nun è stato specificato).",
        "linksearch-line": "$1 presente dint'â paggena $2",
+       "linksearch-error": "'E wildcard ponno essere ausate sulamente a l'inizio d' 'o hostname.",
+       "listusersfrom": "Fà vedè l'utente partenno 'a:",
+       "listusers-submit": "Faje vedé",
+       "listusers-noresult": "Nisciun'utente truvato.",
+       "listusers-blocked": "(bloccate)",
+       "activeusers": "Lista d'utente attive",
+       "activeusers-intro": "Chest'è n'elenco d'utente c'hanno fatto cierti tipe d'attività nfin'a $1 {{PLURAL:$1|juorno|ghiuorne}} fa.",
+       "activeusers-count": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}} int'a l'urdeme {{PLURAL:$3|ghiuorne}}",
+       "activeusers-from": "Fà vedè l'utente partenno 'a:",
+       "activeusers-hidebots": "Annascunne 'e bot",
+       "activeusers-hidesysops": "Annascunne l'ammenistrature",
+       "activeusers-noresult": "Nisciun'utente truvato.",
+       "listgrouprights": "Deritte d' 'e gruppe utente",
+       "listgrouprights-summary": "'A lista ccà abbascio è na lista d' 'e gruppe utente criate int'a sta wiki, ch' 'e diritte associate.\nPonno esistere [[{{MediaWiki:Listgrouprights-helppage}}|nfurmaziune cchiù ndettaglie]] ncopp' 'e deritte ndividuale.",
+       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Deritto dato</span>\n* <span class=\"listgrouprights-revoked\">Deritto luvato</span>",
+       "listgrouprights-group": "Gruppo",
+       "listgrouprights-rights": "Deritte",
+       "listgrouprights-helppage": "Help:Deritte d' 'o gruppo",
+       "listgrouprights-members": "(lista d' 'e membre)",
+       "listgrouprights-addgroup": "Jogne {{PLURAL:$2|ô gruppo|ê gruppe}}: $1",
+       "listgrouprights-removegroup": "Leva {{PLURAL:$2|d' 'o gruppo|d' 'e gruppe}}: $1",
+       "listgrouprights-addgroup-all": "Jogne tutt' 'e gruppe",
+       "listgrouprights-removegroup-all": "Leva tutt' 'e gruppe",
+       "listgrouprights-addgroup-self": "Jogne {{PLURAL:$2|'o gruppo|'e gruppe}} a 'o cunto utente mio: $1",
+       "listgrouprights-removegroup-self": "Leva {{PLURAL:$2|'o gruppo|'e gruppe}} 'a 'o cunto utente d' 'o mio: $1",
+       "listgrouprights-addgroup-self-all": "Miette tutt' 'e gruppe ncopp' 'o cunto d' 'o mio",
+       "listgrouprights-removegroup-self-all": "Lèva tutt' 'e gruppe 'a 'o cunto utente d' 'o mio",
+       "listgrouprights-namespaceprotection-header": "Restriziune d' 'o namespace",
+       "listgrouprights-namespaceprotection-namespace": "Namespace",
+       "listgrouprights-namespaceprotection-restrictedto": "Diritto 'e cagnamiento 'e l'utente",
+       "trackingcategories": "Categurìe 'e cuntrollo",
+       "trackingcategories-summary": "Sta paggena elenca 'e categurìe ca stann'automaticamente popolate 'a 'o software Mediawiki. 'E nomme 'e lloro se ponno cagnà quanno se cagnano 'e relative mmasciate 'e sistema dint' 'o namespace {{ns:8}}.",
+       "trackingcategories-msg": "Categurìe 'e cuntrollo",
+       "trackingcategories-name": "Nomme d' 'a mmasciata",
+       "trackingcategories-desc": "Criterie p' 'o miettere dint' 'a categurìa",
+       "noindex-category-desc": "'A paggena nun è indicizzata 'a 'e robot pecché cuntene 'a parola maggica <code><nowiki>__NOINDEX__</nowiki></code> e se trova dint'a nu namespace addò chistu flag è permesso.",
+       "index-category-desc": "'A paggena téne 'o codece <code><nowiki>__INDEX__</nowiki></code> dinto (e se trova dint'a nu namespace addò chistu flag è permesso), e picciò è indicizzata 'a 'e robot, pure si normalmente nun fosse accussì.",
+       "post-expand-template-inclusion-category-desc": "'A dimensione d' 'a paggena è cchiù granne 'e <code>$wgMaxArticleSize</code> aropp'a spannere tutt' 'e template, e picciò cocche template nun se so' spannute.",
+       "post-expand-template-argument-category-desc": "'A paggena sarrà cchiù granne 'e <code>$wgMaxArticleSize</code> aropp' 'avé spannuto 'o parametro 'e nu template (coccosa mmiez'a tre parentesi graffe, cumm'a cchesto: <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "'A paggena aúsa troppe funziune parser (comme <code>#ifexist</code>). Vedite [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "'A paggena cuntene nu cullegamiento rutto a nu file (nu link ca spontasse a nu file ancora che chisto nun esiste).",
+       "hidden-category-category-desc": "Chista categurìa cuntene <code><nowiki>__HIDDENCAT__</nowiki></code> dint' 'a paggena suja, 'a quale nun permette ca s'ammustasse, predefinitamente, dint' 'o quadretto d' 'e cullegamiente a 'e categurìe d' 'e paggene.",
+       "trackingcategories-nodesc": "Nisciuna descrizione a disposizione.",
+       "trackingcategories-disabled": "'A categurìa è stutata",
+       "mailnologin": "Nisciuno indirizzo pe' mannà 'e mmasciate",
+       "mailnologintext": "Avite 'a [[Special:UserLogin|trasì]] e avè n'indirizzo e-mail valido int' 'e [[Special:Preferences|preferenze]] d' 'e vuoste pe' mannà na mmasciata e-mail a l'ati utente.",
        "emailuser": "Email chisto utente",
-       "mywatchlist": "osservate speciale",
+       "emailuser-title-target": "Manna n'email a chist'{{GENDER:$1|utente}}",
+       "emailuser-title-notarget": "E-mail 'e l'utente",
+       "emailpage": "E-mail 'e l'utente",
+       "emailpagetext": "Putite ausà 'o modulo ccà abbascio pe' mannà na mmasciata e-mail a st'{{GENDER:$1|utente}}.\nL'indirizzo e-mail ch'avite nzertàto dint' 'e [[Special:Preferences|preferenze vuoste]] accumpararrà dint' 'o campo \"'A\" dint' 'a mmasciata e-mail, accussì chillo ca ricevese 'a mail 'o sape ca v'avess'a risponnere direttamente a vuje.",
+       "defemailsubject": "e-mail 'e {{SITENAME}} 'a l'utente \"$1\"",
+       "usermaildisabled": "L'e-mail utente è stutato",
+       "usermaildisabledtext": "Nun se può mannà n'e-mail a l'at'utente ncopp' 'a sta wiki",
+       "noemailtitle": "Nisciuno indirizzo e-mail",
+       "noemailtext": "St'utente nun ha miso nisciuno indirizzo e-mail valido.",
+       "nowikiemailtext": "St'utente ha scigliuto 'e nun se cuògliere mmasciate e-mail 'a l'at'utente.",
+       "emailnotarget": "Nomme 'e l'utente ca nun esiste o nun è valido.",
+       "emailtarget": "Mettite 'o nomme utente d' 'o destinatario",
+       "emailusername": "Nomme utente:",
+       "emailusernamesubmit": "Manna",
+       "email-legend": "Manna sta mail a n'at'utente 'e {{SITENAME}}",
+       "emailfrom": "'A:",
+       "emailto": "A:",
+       "emailsubject": "Oggetto:",
+       "emailmessage": "Mmasciata:",
+       "emailsend": "Manna",
+       "emailccme": "Manname n'e-mail cu 'na copia d' 'a mmasciata.",
+       "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 \"Mmasciata e-mail a l'utente\" 'e {{SITENAME}}.",
+       "usermessage-summary": "Lassanno na mmasciata 'e sistema.",
+       "usermessage-editor": "Mmasciatore d' 'o sistema",
+       "watchlist": "Paggene cuntrullate",
+       "mywatchlist": "Paggene cuntrullate",
        "watchlistfor2": "Ppe $1 $2",
+       "nowatchlist": "Nun tenite paggene dint' 'a l'elenco 'e paggene cuntrullate.",
+       "watchlistanontext": "Pe' piacere, trasite pe' vedé o cagnà l'elenco 'e paggene cuntrullate.",
+       "watchnologin": "Acciesso nun affettuato",
+       "addwatch": "Miette dint' 'a l'elenco 'e paggene cuntrullate",
+       "addedwatchtext": "'A paggena \"[[:$1]]\" è stata azzeccata dint'a l'elenco 'e [[Special:Watchlist|paggene cuntrullate]].\n'E cagnamiente future a sta paggena e a tutt' 'e paggene 'e chiacchiera azzeccate sarranno elencate llà dinto.",
+       "addedwatchtext-short": "Chista paggena \"$1\" è stata azzeccata a l'elenco 'e paggene cuntrullate.",
+       "removewatch": "Leva 'a l'elenco 'e paggene cuntrullate",
+       "removedwatchtext": "'A paggena \"[[:$1]]\" è stata scancellata 'a l'elenco [[Special:Watchlist|'e paggene cuntrullate]] tuojo.",
+       "removedwatchtext-short": "Chista paggena \"$1\" è stata luvata a l'elenco 'e paggene cuntrullate.",
        "watch": "Secuta",
+       "watchthispage": "Tiene d'uocchio chesta paggena",
        "unwatch": "Nun segui",
+       "unwatchthispage": "Nun cuntrullà cchiù sta paggena",
        "notanarticle": "Chesta paggena nun è na voce",
+       "notvisiblerev": "'A verzione è stata scancellata",
+       "watchlist-details": "L'elenco 'e paggene cuntrullate cuntene {{PLURAL:$1|na paggena (e pure 'a paggena 'e chiacchiera)|$1 paggene (e pure 'e paggene 'e chiacchiera}}.",
+       "wlheader-enotif": "'A funzione 'e notifiche e-mail è appicciata.",
+       "wlheader-showupdated": "* 'E paggene cca so' state cagnate a l'urdema visita avevano so' nzignate ccà 'n '''grassetto'''.",
+       "wlnote": "Ccà abbascio {{PLURAL:$1|è elencato 'o cagnamiento cchiù ricente|songo elencate 'e <strong>$1</strong> cagnamiente cchiù recente}} {{PLURAL:$2|int'a ll'urdema ora|int' 'e ll'urdeme <strong>$2</strong> ore}}; 'e date songo agghiurnate 'o $3, $4.",
+       "wlshowlast": "Mmusta ll'urdeme $1 ore $2 ghiuorne",
+       "watchlist-options": "Opziune 'a l'elenco 'e paggene cuntrullate",
+       "watching": "Cuntrullanno...",
+       "unwatching": "Lassanno 'e cuntrullà...",
+       "watcherrortext": "N'errore s'è verificato quanno se faceva 'o cagnamiento 'e l'elenco 'e paggene cuntrullate pe' \"$1\".",
+       "enotif_reset": "Nzègna tutt' 'e paggene comme visitate",
+       "enotif_impersonal_salutation": "Utente 'e {{SITENAME}}",
+       "enotif_subject_deleted": "'A paggena $1 'e {{SITENAME}} è stata scancellata 'a {{gender:$2|$2}}",
+       "enotif_subject_created": "'A paggena $1 'e {{SITENAME}} è stata criata 'a {{gender:$2|$2}}",
+       "enotif_subject_moved": "'A paggena $1 'e {{SITENAME}} è stata cagnata 'e posto 'a {{gender:$2|$2}}",
+       "enotif_subject_restored": "'A paggena $1 'e {{SITENAME}} è stata arripigliata 'a {{gender:$2|$2}}",
+       "enotif_subject_changed": "'A paggena $1 'e {{SITENAME}} è stata cagnata 'a {{gender:$2|$2}}",
+       "enotif_body_intro_deleted": "'A paggene $1 'e {{SITENAME}} è stata scancellata 'a copp' 'e $PAGEEDITDATE 'a {{gender:$2|$2}}, vedite $3.",
+       "enotif_body_intro_created": "'A paggena $1 'e {{SITENAME}} è stata criata ncopp'a $PAGEEDITDATE 'a {{gender:$2|$2}}, vedite $3 p' 'a verzione 'e mo.",
+       "enotif_body_intro_moved": "'A paggena $1 'e {{SITENAME}} è stata cagnata 'e posto ncopp'a $PAGEEDITDATE 'a {{gender:$2|$2}}, vedite $3 p' 'a verzione 'e mo.",
+       "enotif_body_intro_restored": "'A paggena $1 'e {{SITENAME}} è stata arripigliata ncopp'a $PAGEEDITDATE 'a {{gender:$2|$2}}, vedite $3 p' 'a verzione 'e mo.",
+       "enotif_body_intro_changed": "'A paggena $1 'e {{SITENAME}} è stata cagnata ncopp'a $PAGEEDITDATE 'a {{gender:$2|$2}}, vedite $3 p' 'a verzione 'e mo.",
+       "enotif_lastvisited": "Vedite $1 pe' tutt' 'e cagnamiente 'a ll'urdema visita vuosta.",
+       "enotif_lastdiff": "Vedite $1 pe' vedè stu cagnamiento.",
+       "enotif_anon_editor": "Utente anonimo $1",
+       "enotif_body": "Caro $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRiepilego 'e cagnamiente: $PAGESUMMARY $PAGEMINOREDIT\n\nCuntattate l'autore:\ne-mail: $PAGEEDITOR_EMAIL\nncopp' 'o sito: $PAGEEDITOR_WIKI\n\nNun se mannarranno ati notifiche si facite cocch'at'attività senza venì a sta paggena.\nPutite pure cagnà 'e mpustaziune 'e notifeca pe' tutt' 'e paggene cuntrullate dint' 'a l'elenco.\n\nStatteve Bbuon, 'o sistema 'e notifiche ncopp' 'a {{SITENAME}} vuosto\n\n--\nPe' cagnà 'e mpustaziune d' 'e notifiche 'e mmasciate elettroniche, jate ccà: {{canonicalurl:{{#special:Preferences}}}}\n\nPe' cagnà 'e mpustaziune 'e l'elenco 'e paggene cuntrullate vuoste jate ccà: {{canonicalurl:{{#special:EditWatchlist}}}}\n\nPe' scancellà l'elenco 'e paggene cuntrullate vedite $UNWATCHURL\n\nSegnalaziune e at'assistenze:\n$HELPPAGE",
        "changed": "cagnata",
        "deletepage": "Scancella paggena",
+       "confirm": "Cunferma",
        "excontent": "'o cuntenuto era: '$1'",
        "excontentauthor": "'o cuntenuto era: '$1' (e ll'unneco cuntribbutore era '[[Special:Contributions/$2|$2]]')",
        "exbeforeblank": "'O cuntenuto apprimm' 'a ll'arrevacamento era: '$1'",
+       "delete-confirm": "Scancella \"$1\"",
+       "delete-legend": "Scancella",
+       "historywarning": "'''Attenzione:''' 'A paggena ca state pe' scancellà tene na cronologgia cu $1 {{PLURAL:$1|verzione|verziune}}:",
+       "confirmdeletetext": "Vedite bbuono, vedite ca state a scancellà na paggena nziem' 'a tutt' 'a cronologgia.\nPe' piacere cunfermate si overo vulite fà cchesto, ca ve site fatto/a capace 'e l'effette 'e st'azione e ca chest'azione rispetta 'e [[{{MediaWiki:Policy-url}}|reole 'e scancellamiento]].",
        "actioncomplete": "Azzione fernuta",
+       "actionfailed": "Aziona sfalluta",
        "deletedtext": "Qauccheruno ha scancellata 'a paggena \"$1\".  Addumannà 'o $2 pe na lista d\"e ppaggene scancellate urdemamente.",
        "dellogpage": "Scancellazione",
+       "dellogpagetext": "Ccà abbascio sta na lista ch' 'e cchiù recente scancellamiente.",
        "deletionlog": "Log d\"e scancellazione",
+       "reverted": "Turnà a 'a verziona cchiù recente",
        "deletecomment": "Raggióne",
+       "deleteotherreason": "Ati/cchiù ragiune:",
+       "deletereasonotherlist": "Ati ragiune",
+       "deletereason-dropdown": "*Mutive comune de scancellamiento\n** Spam\n** Vandalisme\n** Violazione d' 'o Copyright\n** Richieste 'e l'autore\n** Redirezionamente scassate",
+       "delete-edit-reasonlist": "Càgna 'e mutive 'e scancellamiento",
+       "delete-toobig": "Sta paggena tene na storia 'e cagnamiente troppo longa, ncopp'a $1 {{PLURAL:$1|verzione|verziune}}.\n'O scancellamiento 'e chiste paggene è stato ristretto pe nce 'e putè astipà si ce sta cocche probblema dint' 'o database 'e {{SITENAME}}.",
+       "delete-warning-toobig": "Sta paggena tene na cronologgia troppo longa, ncopp'a $1 {{PLURAL:$1|verzione|verziune}}.\nScancellannole se putesse crià troppo burdello ncopp' 'e operaziune 'e database dint'a {{SITENAME}};\niate cuoncio cuoncio.",
+       "deleteprotected": "Nun putite scancellà sta paggena pecché è stata prutetta.",
+       "deleting-backlinks-warning": "'''Attenzione:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|ati paggene]] cunteneno cullegamiente o paggene appennute â n'ata paggena ca state pe' scancellà.",
        "rollback": "Ausa na revizione 'e primma",
+       "rollback_short": "Annulla",
        "rollbacklink": "a vascio",
+       "rollbacklinkcount": "annulla {{PLURAL:$1|nu cagnamiento|$1 cagnamiente}}",
+       "rollbacklinkcount-morethan": "annulla cchiù 'e {{PLURAL:$1|nu cagnamiento|$1 cagnamiente}}",
+       "rollbackfailed": "Annullamento fallito",
+       "cantrollback": "Nun se può annullà stu cagnamiento;\nsapite ca l'urdemo autore è stato pure sul'isso a faticà dint'a sta paggena (nun ce sta n'at'autore).",
+       "alreadyrolled": "Nun se può turna arreto a l'urdemo cagnamiento [[:$1]] 'a [[User:$2|$2]] ([[User talk:$2|Chiacchiera]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\ncocch'ato ha cagnato o annullato 'a paggena già.\n\nL'urdemo cangamiento d' 'a paggena fuje 'a [[User:$3|$3]] ([[User talk:$3|Chiacchiera]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "editcomment": "'O riepilego d' 'o cagnamiento era: \"''$1''\".",
        "revertpage": "Cangiaje 'e cagnamiénte 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), cu â verzione 'e pprimma 'e  [[User:$1|$1]]",
+       "revertpage-nouser": "Annullate 'e cagnamiente 'e n'utente annascunnuto, è stata ripigliata ll'urdema verzione 'e {{GENDER:$1|[[User:$1|$1]]}}",
+       "rollback-success": "Cagnamiente annullate 'a $1;\ns'è turnat arreto a l'urdema verzione 'e $2.",
+       "sessionfailure-title": "Sessione fallita",
+       "sessionfailure": "Pare ca stanno probbleme cu 'a sessiona toja;\nst'azione è stata fermata pe' precauzione annanz' 'e cavall' 'e troia;\nPe' piacere turnate arreto, carrecate n'ata vota 'a paggena pe pruvate n'ata vota.",
+       "protectlogpage": "Riggistro 'e prutezzione",
+       "protectlogtext": "Ccà abbascio sta na lista 'e cagnamiente 'e pruteziune d' 'e paggene.\nVedite 'a [[Special:ProtectedPages|liste d' 'e paggene prutette]] pe n'avé na lista 'e l'operaziune 'e mo ncopp' 'a prutezzione d' 'e paggene.",
        "protectedarticle": "ha prutetto \"[[$1]]\"",
+       "modifiedarticleprotection": "'o livello 'e prutezione è stato cagnato pe' \"[[$1]]\"",
+       "unprotectedarticle": "sprutetto 'a \"[[$1]]\"",
+       "movedarticleprotection": "'mpustaziune 'e protezzione spustate 'a \"[[$2]]\" a \"[[$1]]\"",
+       "protect-title": "Cagna 'o livello 'e prutezione pe' \"[[$1]]\"",
+       "protect-title-notallowed": "Fà vedé 'o livello 'e prutezione pe' \"$1\"",
        "prot_1movedto2": "ha spustato [[$1]] a [[$2]]",
+       "protect-badnamespace-title": "Namespace nun pruteggibbele",
+       "protect-badnamespace-text": "'E paggene int'a stu namespace nun se ponno pruteggere.",
+       "protect-norestrictiontypes-text": "Sta paggena nun se può pruteggere pecché nun ce sta nisciunu tipo 'e restrizione.",
+       "protect-norestrictiontypes-title": "Namespace nun pruteggibbele",
+       "protect-legend": "Cunferma 'a prutezione",
+       "protectcomment": "Mutivo:",
+       "protectexpiry": "Ammatura:",
+       "protect_expiry_invalid": "'O tiempo d'ammaturamiento è invalido.",
+       "protect_expiry_old": "'O tiempo d'ammaturamiento è passato già.",
+       "protect-unchain-permissions": "Sblocca cchiù opziune 'e prutezione",
+       "protect-text": "Ccà putite vedé e cagnà 'o livello 'e prutezione p' 'a paggena <strong>$1</strong>.",
+       "protect-locked-blocked": "Nun può cagnà 'e livelle 'e prutezione pe' tramente ca staje bluccato.\nCcà abbascio stanno 'e mpustaziune 'e mo p' 'a paggena '''$1''':",
+       "protect-locked-dblock": "'E livelle 'e prutezzione nun se ponno cagnà pecché ce sta nu blocco attivo d' 'o database.\nCcà abbascio stanno 'e mpustaziune 'e mo p' 'a paggena '''$1''':",
+       "protect-locked-access": "C' 'o cunto vuosto nun avite permesso pe' putè cagnà 'e livelle 'e prutezioen d' 'e paggene.\nChiste songh' 'e mpustaziune 'e mo p' 'a paggena '''$1''':",
+       "protect-cascadeon": "P' 'o mumento sta paggena è bloccata pecché sta appennuta dint'a {{PLURAL:$1|paggena scritta ccà abbascio, p' 'a quale|'e paggene scritte ccà abbascio p' 'e quale}} è attiva 'a prutezione ricurziva.\n'E cagnamiente a livello 'e prutezione individuale a uno a uno d' 'a paggena, nun tenerranno effette ncopp' 'e mpustaziune pigliate d' 'o fatto 'e se fà na prutezione ricurziva.",
+       "protect-default": "Permette tutte l'utente",
+       "protect-fallback": "Permette sulamente a l'utente c' 'o permesso \"$1\"",
+       "protect-level-autoconfirmed": "Permette sulamente a l'utente autocunvalidate",
+       "protect-level-sysop": "Permette sulamente a l'ammenistrature",
+       "protect-summary-cascade": "ricurziva",
+       "protect-expiring": "ammatura 'o $1 (UTC)",
+       "protect-expiring-local": "ammatura 'o $1",
+       "protect-expiry-indefinite": "indefinite",
+       "protect-cascade": "Prutegge paggene appennute dint'a sta paggena (spanne 'a prutezione a tutt' 'e paggene appennute ccà).",
+       "protect-cantedit": "Nun è possibbele cagnà 'e livelle e prutezione 'e sta paggena, pecchè nun tenite deritto o permesse pe' ne fà 'o cagnamiento.",
+       "protect-othertime": "N'ata durata:",
+       "protect-othertime-op": "ati durate",
+       "protect-existing-expiry": "'O tiempo d'ammaturamiento esistente: $3, $2",
+       "protect-existing-expiry-infinity": "Tiempo d'ammaturamiento: infinito",
+       "protect-otherreason": "Ati/cchiù ragiune:",
+       "protect-otherreason-op": "Ati ragiune",
+       "protect-dropdown": "*Mutive 'e prutezione comune\n** Vandalisme eccessive\n** Spam eccessivo\n** 'Uerre 'e cagnamiente controproducente\n** Paggena cu troppo traffeco",
+       "protect-edit-reasonlist": "Càgna 'e mutive 'e prutezione",
        "protect-expiry-options": "1 ore:1 hour,1 juorno:1 day,1 semmana:1 week,2 semmane:2 weeks,1 mese:1 month,3 mise:3 months,6 mise:6 months,1 anno:1 year,infinito:infinite",
+       "restriction-type": "Permesse:",
+       "restriction-level": "Livello 'e restrizione:",
+       "minimum-size": "Diminsiune minime:",
+       "maximum-size": "Diminsiune massime:",
+       "pagesize": "(byte)",
+       "restriction-edit": "Càgna",
+       "restriction-move": "Spusta",
+       "restriction-create": "Cria",
+       "restriction-upload": "Carreca",
+       "restriction-level-sysop": "prutetta",
+       "restriction-level-autoconfirmed": "semi-prutetta",
+       "restriction-level-all": "ogne livello",
+       "undelete": "Fà vedé 'e paggene scancellate",
+       "undeletepage": "Fà vedé e arrepiglia 'e paggene scancellate",
+       "undeletepagetitle": "'''Ccà abbascio ce stanno 'e verziune scancellate 'e [[:$1|$1]]'''.",
        "viewdeletedpage": "Vìre 'e ppàggine scancellate",
+       "undeletepagetext": "{{PLURAL:$1|'A paggena ccà abbascio è stata scancellata però|$1 paggene ccà abbascio so' state scancellate però}} stann'ancora dint' 'a l'archivio e se ponno arrepiglià.<br />\nL'archivie s'hanna pulezzà periodicamente.",
+       "undelete-fieldset-title": "Arrepiglia verziune",
+       "undeleteextrahelp": "P'arrepiglià 'a cronologgia completa d' 'a paggena, lassate 'e cascie abbacante e facite click ncopp'a '''''{{int:undeletebtn}}'''''.\nPe' putè arrepiglià selettivamente, miette nu zegno ncopp' 'e casciulele currispunnente a 'e verziune ca vulite arripiglià e po' facite click ncopp'a '''''{{int:undeletebtn}}'''''.",
+       "undeleterevisions": "$1 {{PLURAL:$1|verzione|verziune}} archiviate",
+       "undeletehistory": "Si arrepiglie 'a paggena, tutte 'e verziune sarrann'arrepigliate nziem'a chista.\nSi na paggena nova c' 'o stesso nomme è stata criata 'a che s'è fatto 'o scancellamiento, 'e verziune arripigliate cumparerranno comme cchiù viecchie dint' 'a cronologgia.",
+       "undeleterevdel": "L'arripiglio nun sarrà affettuato si determina 'o scancellamiento parziale d' 'a verzione 'e mo d' 'a paggena o file.\nInt'a sti case, avite 'e smarcà o annasconnere 'e verziune scancellate cchiù nove.",
+       "undeletehistorynoadmin": "Sta paggena è stata scancellata.\n'O mutivo d' 'o scancellamiento 'o truvate scritto dint' 'a 'o riepilego ccà abbascio, nzieme ch' 'e dettaglie 'e l'utente c'hanno cagnato sta paggena apprimma 'e se fà 'o scancellamiento.\n'O testo 'e mo 'e sti verziune è disponibbele sulamente a l'ammenistrature.",
+       "undelete-revision": "Verziune scancellata 'a $1 (comme 'e $4, a $5) 'a $3:",
+       "undeleterevision-missing": "Verziona invalida o mancante.\nPutisseve avé nu cullegamiento sbagliato o 'a verzione, può darse, ca fosse arrepigliata o scancellata 'e l'archivio.",
+       "undelete-nodiff": "Nun s'è truvata nisciuna verzione 'e primma.",
+       "undeletebtn": "Arrepiglia",
+       "undeletelink": "vide/arrepiglia",
        "undeleteviewlink": "vere",
+       "undeleteinvert": "Abbarruca 'a sceveta",
+       "undeletecomment": "Mutivo:",
+       "undeletedrevisions": "{{PLURAL:$1|1 verzione|$1 verziune}} arrepigliate",
+       "undeletedrevisions-files": "{{PLURAL:$1|1 verzione|$1 verziune}} e {{PLURAL:$2|1 file|$2 file}} arrepigliate",
+       "undeletedfiles": "{{PLURAL:$1|1 file arrepigliato|$1 file arrepigliate}}",
+       "cannotundelete": "Arrepiglio fallito:\n$1",
+       "undeletedpage": "'''$1 è stat'arrepigliato'''\n\nLiggiete 'o [[Special:Log/delete|riggistro 'e scancellamiente]] pe n'avé n'elenco 'e l'urdeme scancellamiente e arrepiglie.",
+       "undelete-header": "Vedite [[Special:Log/delete|'o riggistro 'e scancellamiente]] pe l'urdeme paggene scancellate",
+       "undelete-search-title": "Ascìa dint' 'e paggene scancellate",
+       "undelete-search-box": "Ascìa dint' 'e paggene scancellate",
+       "undelete-search-prefix": "Fà vedè 'e paggene c'accumencieno cu:",
+       "undelete-search-submit": "Truova",
+       "undelete-no-results": "Nun ce stanno paggene asciate ca se truvassero dint' 'o riggistro 'e scancellamiento.",
+       "undelete-filename-mismatch": "Nun se può arrepiglià 'a verzione d' 'o file cu l'orario $1: nomme d' 'o file errato",
+       "undelete-bad-store-key": "Nun se può arrepiglià 'a verzione d' 'o file cu orario $1: 'o file è stato sperduto apprimma d' 'o scancellamiento.",
+       "undelete-cleanup-error": "Errore scancellanno n'archivio 'e file nun ausate \"$1\".",
+       "undelete-missing-filearchive": "Non se può arrepiglià l'archivie cu l'ID $1 pecché nun ce stanno dint' 'o database.\nPò darse ca songo già state arrepigliate.",
+       "undelete-error": "Errore pe' tramente ca s'arrepigliava na paggena",
+       "undelete-error-short": "Errore pe' tramente ca s'arrepigliava na paggena: $1",
+       "undelete-error-long": "Errore pe' tramente ca s'arrepigliava na paggena:\n\n$1",
+       "undelete-show-file-confirm": "Site sicuro/a ca vulite veré 'a verziona scancellata d' 'o file \"<nowiki>$1</nowiki>\" d' 'o $2 a 'e $3?",
+       "undelete-show-file-submit": "Sì",
        "namespace": "Namespace:",
        "invert": "abbarruca 'a sceveta",
+       "tooltip-invert": "Nzegna sta casciulella p'annaconnere 'e cagnamiente a 'e paggene ca stanno dint' 'o namespace c'avite scigliuto (e 'o namespace stesso si l'avite scigliuto)",
+       "namespace_association": "Namespace associate",
+       "tooltip-namespace_association": "Nzegna sta casciulella pe ncludere 'e cchiacchiere o l'oggetto d' 'o namespace associato c' 'o namespace scigliuto",
        "blanknamespace": "(Prencepale)",
        "contributions": "Contribbute {{GENDER:$1|utente}}",
+       "contributions-title": "Cuntribbute 'a l'utente pe' $1",
        "mycontris": "'E ffatiche d''e mmeje",
        "contribsub2": "Ppe {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "'O cunto utente \"$1\" nun è riggistrato.",
+       "nocontribs": "Nisciunu cagnamiento è stato truvato cu sti criterie.",
        "uctop": "(attuale)",
        "month": "D\"o mese (e primma):",
        "year": "'E ll'anno (e primma):",
        "sp-contributions-newbies": "Mosta solo 'e contribbute dde nove utente",
+       "sp-contributions-newbies-sub": "Pe' l'utente nuove",
+       "sp-contributions-newbies-title": "Contribbute 'a l'utente nuove",
        "sp-contributions-blocklog": "blocche",
        "sp-contributions-suppresslog": "contribbute utente scancellate",
-       "sp-contributions-logs": "registre",
+       "sp-contributions-deleted": "contribbute d'utente scancellate",
+       "sp-contributions-uploads": "carreche",
+       "sp-contributions-logs": "riggistre",
        "sp-contributions-talk": "Chiàcchiera",
+       "sp-contributions-userrights": "gestione d' 'e permesse 'e l'utente",
+       "sp-contributions-blocked-notice": "St'utente è bloccato mò.\nL'urdemo elemento d' 'o riggistro 'e blocche è ripurtato ccà abbascio p'avé nu riferimento:",
+       "sp-contributions-blocked-notice-anon": "St'IP è bloccato mò.\nL'urdemo elemento d' 'o riggistro 'e blocche è ripurtato ccà abbascio p'avé nu riferimento:",
+       "sp-contributions-search": "Ascìa 'e contribbute",
        "sp-contributions-username": "Nnerizzo IP o nomme utente",
+       "sp-contributions-toponly": "Facenno vedé sulamente 'e contribbute 'e l'urdeme verziune",
+       "sp-contributions-newonly": "Facenno vedé sulamente 'e contribbute ca songo criazione 'e paggene",
        "sp-contributions-submit": "Truova",
        "whatlinkshere": "Paggene ca cullegano a chesta",
        "whatlinkshere-title": "Paggene ca cullegano a $1",
        "whatlinkshere-page": "Paggena:",
-       "nolinkshere": "Nisciuna paggena cuntene jonte ca mpuntano a '''[[:$1]]'''.",
+       "linkshere": "'E paggene ccà abbascio cunteneno jonte ca spuntano a '''[[:$1]]'''.",
+       "nolinkshere": "Nisciuna paggena cuntene jonte ca spuntasse a <strong>[[:$1]]</strong>.",
+       "nolinkshere-ns": "Nun ce stanno paggene ca spuntassero '''[[:$1]]''' dint' 'o namespace scigliuto.",
        "isredirect": "redirect a paggena",
        "istemplate": "'nclusione",
        "isimage": "Cullegamente a file multimediale",
+       "whatlinkshere-prev": "{{PLURAL:$1|apprima|apprime $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|appriesso|$1 appriesso}}",
        "whatlinkshere-links": "← jonte",
        "whatlinkshere-hideredirs": "$1 redirects",
        "whatlinkshere-hidetrans": "$1 'nclusione",
        "whatlinkshere-hidelinks": "$1 jonte",
        "whatlinkshere-hideimages": "$1 links ddo file",
        "whatlinkshere-filters": "Filtre",
-       "blockip": "Ferma utelizzatóre",
+       "autoblockid": "Autoblocco #$1",
+       "block": "Blocca l'utente",
+       "unblock": "Sblocca l'utente",
+       "blockip": "Blocca {{GENDER:$1|utente}}",
+       "blockip-legend": "Blocca l'utente",
+       "blockiptext": "Ausa 'o modulo ccà abbascio pe' bluccà l'acciesso 'e scrittura a n'indirizzo IP o utente.\nChisto s'avesse 'a ffà sulamente pe' se pruteggere d' 'o vandalismo, d'accordo ch' [[{{MediaWiki:Policy-url}}|'e reole]].\nMettite pure nu mutivo specifico ccà abbascio (p'esempio, facenno 'o nomme 'e paggene addò se so' fatte 'e vandalisme).",
        "ipaddressorusername": "Nnerizzo IP o nomme utente",
+       "ipbexpiry": "Ammatura:",
+       "ipbreason": "Mutivo:",
+       "ipbreason-dropdown": "* Mutive comune pe' ffà 'o blocco\n** Steva nzertanno nfurmaziune fauze\n** Steva a luvà cuntenute d' 'e paggene\n** Steva a fà spam 'e cullegamiente a 'e site 'e fore\n** Steva a nzertà robbe senza senso dint' 'e paggene\n** Minacce e ntimidaziune\n** Abbuso 'e cunte utente multiple\n** Nomme utente inaccettabbele",
+       "ipb-hardblock": "Nun permettere 'o cagnamiento a l'utente riggistrate ca veneno 'a st'indirizzo IP",
+       "ipbcreateaccount": "Nun fà crià 'o cunto",
+       "ipbemailban": "Blocca utente a mannà e-mail",
+       "ipbenableautoblock": "Automaticamende blocca l'urdeme indirizze IP ausate 'a st'utente, e pure tutte l'IP c'ausasse pe' pruvà 'e fà ati cagnamiente",
+       "ipbsubmit": "Blocca st'utente",
+       "ipbother": "N'ata durata:",
        "ipboptions": "2 ore:2 hours,1 juorno:1 day,3 juorne:3 days,1 semmana:1 week,2 semmane:2 weeks,1 mise:1 month,3 mese:3 months,6 mese:6 months,1 anno:1 year,infinito:infinite",
+       "ipbhidename": "Annascunne 'o nomme utente d' 'a lista 'e cagnamiente e l'ati liste",
+       "ipbwatchuser": "Fà vedé 'a paggena utente e le chiacchieriate 'e st'utente",
+       "ipb-disableusertalk": "Nun permettere a st'utente edità 'a paggena 'e chiacchiera d' 'a soja pe' tramente ch'e bloccato",
+       "ipb-change-block": "Blocca n'ata vota l'utente cu sti mpustaziune",
+       "ipb-confirm": "Cunferma 'o blocco",
+       "badipaddress": "Indirizzo IP nun valido",
        "blockipsuccesssub": "Blocco aseguito",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] è stato bloccato.<br />\nVedite [[Special:BlockList|'a lista 'e l'IP bloccate]] pe' fà vedé n'ata vota 'e blocche.",
+       "ipb-blockingself": "Vuje ve state a bluccà da solo! Site sicuro ca 'o vulite fà?",
+       "ipb-confirmhideuser": "State a bluccà n'utente cu l'opzione \"annascunne utente\" appicciata. St'operazione può luvà 'o nomme 'e l'utente a dint' 'a tutte l'elenche e riggistre. Site sicuro/a ca vulite fà chesto?",
+       "ipb-confirmaction": "Si site sicuro 'e fa chesto overo, cuntrullate 'o campo \"{{int:ipb-confirm}}\" ccà abbascio.",
+       "ipb-edit-dropdown": "Cagna 'e mutive d' 'o blocco",
+       "ipb-unblock-addr": "Sblocca $1",
+       "ipb-unblock": "Sblocca nomme utente o indirizzo IP",
+       "ipb-blocklist": "Fà vedé 'e blocche ch'esisteno",
+       "ipb-blocklist-contribs": "Contribbute 'e {{GENDER:$1|$1}}",
+       "unblockip": "Sblocca utente",
+       "unblockiptext": "Ausa 'o modulo ccà abbascio p'arrepiglià 'e deritte 'e scrittura a l'indirizze IP o cunte utente ca primma so state bluccate.",
+       "ipusubmit": "Lèva stu blocco",
+       "unblocked": "[[User:$1|$1]] è stato sbloccato.",
+       "unblocked-range": "$1 è stato sbloccato",
+       "unblocked-id": "'O blocco $1 è stato luvato.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] è stato sbluccato.",
+       "blocklist": "Utente bloccate",
        "ipblocklist": "Utenti bloccate",
+       "ipblocklist-legend": "Ascìa n'utente bloccato",
+       "blocklist-userblocks": "Annascunne 'e blocche 'e l'utente riggistrate",
+       "blocklist-tempblocks": "Annascunne 'e blocche temporanee",
+       "blocklist-addressblocks": "Annascunne 'e blocche 'e n'IP sola",
+       "blocklist-rangeblocks": "Annascunne 'e ntervalle 'e blocche",
+       "blocklist-timestamp": "Data e ora",
+       "blocklist-target": "Destinazione",
+       "blocklist-expiry": "Ammatura",
+       "blocklist-by": "Ammenistratore ca 'o bluccaje",
+       "blocklist-params": "Parametre d' 'o blocco",
+       "blocklist-reason": "Mutivo",
+       "ipblocklist-submit": "Ascìa",
+       "ipblocklist-localblock": "Blocco lucale",
+       "ipblocklist-otherblocks": "Ati {{PLURAL:$1|blocche|blocche}}",
+       "infiniteblock": "indefinito",
+       "expiringblock": "ammatura 'o $1 a 'e $2",
+       "anononlyblock": "sulamente l'anonime",
+       "noautoblockblock": "autoblocco stutato",
+       "createaccountblock": "riggistrazione 'e cunte stutata",
+       "emailblock": "mmasciate e-mail stutate",
+       "blocklist-nousertalk": "nun può cagnà 'a paggena 'e chiacchiera d' 'a soja",
+       "ipblocklist-empty": "'A lista 'e blocche è abbacante.",
+       "ipblocklist-no-results": "L'indirizzo IP o nomme utente c'asciate nun songo bloccate.",
        "blocklink": "ferma",
        "unblocklink": "sblocca",
        "change-blocklink": "càgna blocco",
        "contribslink": "contribuzzione",
+       "emaillink": "manna e-mail",
+       "autoblocker": "Autobloccate pecché l'indirizze IP vuosto è stat'ausato urdemamente 'a \"[[User:$1|$1]]\".\n'O mutivo d' 'o blocco 'e $1 è \"$2\"",
        "blocklogpage": "Blocche",
+       "blocklog-showlog": "St'utente è stato bloccato primma.\n'O riggistro d' 'e blocche se può vedé ccà abbascio pe' riferimento:",
+       "blocklog-showsuppresslog": "St'utente è stato bloccato e annascunuto primma.\n'O riggistro d' 'e luvamiente se può vedé ccà abbascio pe' riferimento:",
        "blocklogentry": "ha fermato \"[[$1]]\" pe' nu mumento 'e $2 $3",
+       "reblock-logentry": "cagnate 'e mpustaziune 'e blocco pe' [[$1]] cu na data d'ammaturamiento 'e $2 $3",
        "blocklogtext": "Chesta è 'a lista d''e azzione 'e blocco e sblocco utente.  'E nnerizze IP bloccate automaticamente nun nce so'. Addumannà 'a [[Special:BlockList|lista bloccate]] pp' 'a lista d''e nnerizze e nomme utente 'o ca blocco nce sta.",
+       "unblocklogentry": "sbluccato $1",
+       "block-log-flags-anononly": "sulamente l'utente anonime",
+       "block-log-flags-nocreate": "riggistrazione 'e cunte stutata",
+       "block-log-flags-noautoblock": "autoblocco stutato",
+       "block-log-flags-noemail": "mmasciate e-mail stutate",
+       "block-log-flags-nousertalk": "nun può cagnà 'a paggena 'e chiacchiera d' 'a toja",
+       "block-log-flags-angry-autoblock": "auto blocco avanzato appicciato",
+       "block-log-flags-hiddenname": "nomme utente annascunnuto",
+       "range_block_disabled": "'A possibbilità 'e bluccà ntervalle 'e indirizze IP nun è appicciata.",
+       "ipb_expiry_invalid": "Tiempo d'ammaturamiento invalido.",
+       "ipb_expiry_temp": "'E blocche d' 'e nomme utente annascunnute hanna essere nfinite.",
+       "ipb_hide_invalid": "Nun se può scancellà stu cunto; tène cchiù 'e {{PLURAL:$1|nu cagnamiento|$1 cagnamiente}}.",
+       "ipb_already_blocked": "\"$1\" è già bloccato.",
+       "ipb-needreblock": "$1 è già bloccato. Vulite cagnà 'e mpustaziune?",
+       "ipb-otherblocks-header": "Ati {{PLURAL:$1|blocche|blocche}}",
+       "unblock-hideuser": "Vuje nun putite sbluccà st'utente, pecché 'o nomme utente 'e chisto è stato già annascunnuto.",
+       "ipb_cant_unblock": "Errore: L'ID $1 d' 'o blocco nun se trova.\nPò essere ca 'o blocco è stato luvato già.",
+       "ipb_blocked_as_range": "Errore: l'IP $1 nun è stato bloccato direttamente e nun se può sbluccà.\n'O blocco, è mmece attivo a livello 'e l'intervallo $2, ca pò essere sbloccato.",
+       "ip_range_invalid": "L'itervallo 'e l'IP nun è valido.",
+       "ip_range_toolarge": "L'intervalle 'e blocche cchiù luonghe 'e /$1 nun songo permesse.",
+       "proxyblocker": "Bloccatore 'e proxy",
+       "proxyblockreason": "L'indirizzo IP d' 'o vuosto è stato bloccato pecché è nu proxy araputo.\nPe' piacere, cuntattate 'o provider 'e l'Internet vuosto o lu suppuorto tecnico d' 'aggenzia vuosta pe' le dà nutizia 'e stu probblema gruosso assaje.",
+       "sorbsreason": "L'indirizzo IP vuosto è elencato comm'a nu proxy araputo dint' 'a lista DNSBL ausata 'a {{SITENAME}}.",
+       "sorbs_create_account_reason": "L'indirizzo IP d' 'o vuosto è elencato comm'a nu proxy araputo dint' 'a DNSBL ausata 'a {{SITENAME}}. Nun putite crià nu cunto.",
+       "xffblockreason": "N'indirizzo IP prisente dint' 'e cap'e paggena X-Forwarded-For, o chillu d' 'o vuosto o chillu 'e n'atu server proxy ca stat'ausann, è stato bloccato. 'O mutivo origgenale 'e blocco era: $1",
+       "cant-see-hidden-user": "L'utente ca state a bluccà è stato già bluccato e annascunnuto. Si nun tenite 'o deritto ''hideuser'', nun putite veré stu blocco d'utente.",
+       "ipbblocked": "Nun putite bloccà o sbluccà utente pecche vuje stesso site bluccato.",
+       "ipbnounblockself": "Nun avite permesso a ve bluccà vuje stesso.",
+       "lockdb": "Blocca 'o database",
+       "unlockdb": "Sblocca 'o database",
+       "lockdbtext": "Bluccanno 'o database se luvarranno l'abbilità 'e tutte l'utente 'e cagnà 'e paggene, cagnà 'e preferenze lloro, cagnà 'a lista 'e paggene cuntrullate e ati cose ca richiedessero cagnamiente ô database.\nPe' piacere cunfermate ca chisto e chello ca vulite fà, e ca luvarrate 'o blocco ô database quanno sta manutenziona sarrà fernuta.",
+       "unlockdbtext": "Sbluccanno 'o database se s'arrepigliarranno l'abbilità 'e tutte l'utente 'e cagnà 'e paggene, cagnà 'e preferenze lloro, cagnà 'a lista 'e paggene cuntrullate e ati cose ca richiedessero cagnamiente ô database.\nPe' piacere cunfermate ca chisto e chello ca vulite fà.",
+       "lockconfirm": "Sì, overo vulesse bluccà 'o database.",
+       "unlockconfirm": "Sì, overo vulesse sbluccà 'o database.",
+       "lockbtn": "Blocca 'o database",
+       "unlockbtn": "Sblocca 'o database",
+       "locknoconfirm": "Nun avite scigliuto 'a casciulella 'e cunferma.",
+       "lockdbsuccesssub": "Blocco d' 'o database secutato",
+       "unlockdbsuccesssub": "'O blocco d' 'o database è stato luvato",
+       "lockdbsuccesstext": "'O database è stato bloccato.<br />\nArricuordateve 'e [[Special:UnlockDB|luvà 'o blocco]] appriesso c' 'a manutenziona sarrà fernuta.",
+       "unlockdbsuccesstext": "'O database è stato sbluccato.",
+       "lockfilenotwritable": "Nun se può scrivere ncopp' 'o file 'e blocco d' 'o database.\nPe' bluccà o sbluccà 'o database abbesuogne 'e scrivere dint' 'o server web.",
+       "databasenotlocked": "'O database nun è bluccato.",
+       "lockedbyandtime": "(pe' {{GENDER:$1|$1}} 'o $2 a 'e $3)",
+       "move-page": "Mòve $1",
+       "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": "Spusta 'a paggena",
+       "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.",
+       "movenotallowed": "Nun tenite 'o permesso pe' spustà paggene.",
+       "movenotallowedfile": "Nun tenite 'o permesso pe' spustà file.",
+       "cant-move-user-page": "Nun tenite 'o permesso pe' spustà 'e paggene utente (staccannole cumme sottopàggene).",
+       "cant-move-to-user-page": "Nun tenite 'o permesso pe' spustà na paggena 'a na paggena utente (sulamente p' 'e sottopaggene utente).",
+       "cant-move-category-page": "Nun tenite 'o permesso pe' muovere paggene 'e categurìa.",
+       "cant-move-to-category-page": "Nun tenite 'o permesso pe' muovere 'a paggena ncopp' 'a na categurìa",
        "newtitle": "Titulo nuovo:",
+       "move-watch": "Cuntrolla sta paggena",
        "movepagebtn": "Spusta 'a paggena",
+       "pagemovedsub": "Spustamento fatto",
+       "movepage-moved": "<strong>\"$1\" è stata spustata int' 'a \"$2\"</strong>",
+       "movepage-moved-redirect": "Nu redirezionamiento è stato criato.",
+       "movepage-moved-noredirect": "'A criazione o lu redirezionamiento è stato luvato.",
        "articleexists": "Na paggena cu chisto nomme asiste già, o pure 'o nomme scegliuto nun è buono.  Scegliere n'ato titulo.",
+       "cantmove-titleprotected": "Nun putite spustà 'a paggena a stu pizzo pecchè 'o titolo nuovo è stato prutetto 'a criazione",
+       "movetalk": "Muove 'a paggena 'e chiacchiera suoccia a chesta",
+       "move-subpages": "Mòve 'e sottopàggene (nfin' 'a $1)",
+       "move-talk-subpages": "Mòve 'e sottopaggene 'e chiacchiera (nfin' 'a $1)",
+       "movepage-page-exists": "'A paggena $1 esiste già e nun se può scrivere ncoppa.",
+       "movepage-page-moved": "'A paggena $1 s'è spustat' 'a $2.",
+       "movepage-page-unmoved": "'A paggena $1 nun se può spustà a $2.",
+       "movepage-max-pages": "'O massimo 'e $1 {{PLURAL:$1|paggena|paggene}} è stato spustato e nun se ne ponno spustà cchiù 'n automatico.",
        "movelogpage": "Spustamente",
+       "movelogpagetext": "Ccà abbascio sta na lista d' 'e paggene spustate.",
+       "movesubpage": "{{PLURAL:$1|Sottopaggena|Sottopaggene}}",
+       "movesubpagetext": "Sta paggena tene $1 {{PLURAL:$1|sottopaggena|sottopaggene}} ccà abbascio.",
+       "movenosubpage": "Sta paggena nun tene sottopaggene.",
        "movereason": "Raggióne",
-       "revertmove": "ripristina",
+       "revertmove": "arrepiglia",
        "delete_and_move": "Scancèlla e spusta",
+       "delete_and_move_text": "== Scancellamiento richiesto ==\n'A paggena 'e destinazione \"[[:$1]]\" esiste già.\n'A vulite scancellà pe' ne putè ffà 'o spazio abbacante necessario?",
        "delete_and_move_confirm": "Sì, suprascrivi 'a paggena asistente",
+       "delete_and_move_reason": "Scancellata pe ne fà spazio abbacante e putè spustà 'a \"[[$1]]\"",
+       "selfmove": "'O titolo 'e sorgente e destinazione songh' 'e stesse;\nnun se può muovere na paggena ncopp' 'a essa stessa.",
+       "immobile-source-namespace": "Nun se ponno muovere 'e paggene dint' 'o namespace \"$1\"",
+       "immobile-target-namespace": "Nun se ponno muovere 'e paggene dint' 'o namespace \"$1\"",
+       "immobile-target-namespace-iw": "'O cullegamiento interwiki nun è na destinazione bona pe spustà na paggena.",
+       "immobile-source-page": "Sta paggena nun se può spustà.",
+       "immobile-target-page": "Nun se può spustà a chillu titolo 'e destinazione.",
+       "bad-target-model": "'A destinazione scigliuta aùsa nu mudello 'e cuntenute differénte. Nun se può cagnà 'a $1 a $2.",
+       "imagenocrossnamespace": "Nun se può muovere stu file dint' 'a nu namespace nun-file",
+       "nonfile-cannot-move-to-file": "Nun se può muovere n'oggetto ca nun è nu file a dint'o namespace d' 'e file",
+       "imagetypemismatch": "L'estenziona nova d' 'o file nun s'accucchia c' 'o tipo suojo",
+       "imageinvalidfilename": "'O nomme d' 'o file 'e destinazione nun è buono",
+       "fix-double-redirects": "Agghiuorna ogne redirezionamiento ca spuntasse ô titolo origginale",
+       "move-leave-redirect": "Lassa nu ridirezionamiento arreto",
+       "protectedpagemovewarning": "<strong>Attenziò:</strong> sta paggena è stata prutetta 'n modo tale ca sulamente l'utente ch' 'e privilegge d'ammenistratore 'a ponno muovere.\nL'urdemo elemento d' 'o riggistro è scritto ccà abbascio pe' n'avé riferimento:",
+       "semiprotectedpagemovewarning": "'''Nota:''' Sta paggena è prutetta 'n modo ca sulamente l'utente riggistrate 'a ponno mòvere.\nL'urdemo elemento d' 'o riggistro è scritto ccà abbascio pe n'avé nfurmazione:",
+       "move-over-sharedrepo": "== 'O file esiste ==\n[[:$1]] esiste ncopp'a l'archivio spartuto. Spustanno 'o file ncopp'a stu titolo sovrascreverrà 'o file spartuto.",
+       "file-exists-sharedrepo": "'O nomme d' 'o file c'avite scigliuto se sta ausanno dint'a l'archivio spartuto.\nPe' piacere, scigliete n'atu nomme.",
        "export": "Spurta 'e ppaggene",
+       "exporttext": "Vuje putite espurtà 'e teste e cagnà 'a cronologgia 'e na paggena particolare o n'inzieme 'e paggena ca stessero dint' 'a cocche XML.\nChisto po' essere 'mpurtato int'a n'ata wiki ausanno [[Special:Import|mporta pàggene]] 'e MediaWiki.\n\nPe' spurtà paggene, mettite 'o titolo dint' 'e casciulelle ccà abbascio, nu titolo pe' linea e sciglite si vulite 'a verziona 'e mò cu tutt' 'e verziun' 'assieme, o pùre sulamente 'a verziona 'e mò c' 'a nfurmaziona ncopp' 'a ll'urdemo cagnamiento.\n\nComme urtema possibbiletà, putite pure ausà nu cullegamento, p'esempio [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] p' 'a pàggena \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exportall": "Spurta tutt' 'e paggene",
+       "exportcuronly": "Appenne sulamente 'a verziona 'e mo, e nun tutt' 'a cronologgia",
+       "exportnohistory": "----\n'''Vedite bbuono:''' 'A funzione 'esportazione d' 'a storia sana d' 'e paggene, ausanno stu modulo, è stata stutata pe' mutive 'e prestaziune.",
+       "exportlistauthors": "Appenne 'a lista sana 'e cuntribbutore p'ogne paggena",
+       "export-submit": "Esporta",
+       "export-addcattext": "Azzecca paggene d' 'a categurìa:",
+       "export-addcat": "Azzecca",
+       "export-addnstext": "Azzecca paggene d' 'o namespace:",
+       "export-addns": "Azzecca",
+       "export-download": "Astipa comm'a nu file",
+       "export-templates": "Include 'e template",
+       "export-pagelinks": "Include 'e paggene cullegate ca spuntassero nfin' 'a na prufunnità 'e:",
        "allmessages": "'Mmasciate d''o sistema",
        "allmessagesname": "Nomme",
+       "allmessagesdefault": "Mmasciata 'e testo predefinita",
        "allmessagescurrent": "Testo 'e mo",
+       "allmessagestext": "Chest'è na lista 'e tutt' 'e mmasciate 'e sistema ca se ponno ascià dint' 'o namespace 'e Mediawiki.\nPe' piacere vedite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Lucalizzazione 'e MediaWiki] e [//translatewiki.net translatewiki.net] si vulite cuntribbuì â lucalizzaziona generica 'e MediaWiki.",
+       "allmessagesnotsupportedDB": "Sta paggena nun se può ausà pecché 'a funziona <strong>$wgUseDatabaseMessages</strong> è stata stutata.",
+       "allmessages-filter-legend": "Filtro",
+       "allmessages-filter": "Filtra cu nu stato personalizzate:",
+       "allmessages-filter-unmodified": "Senza cagnamiente",
+       "allmessages-filter-all": "Tutto",
+       "allmessages-filter-modified": "Cagnate",
+       "allmessages-prefix": "Filtra pe' prefisso:",
+       "allmessages-language": "Lengua:",
+       "allmessages-filter-submit": "Vàje",
+       "allmessages-filter-translate": "Traduce",
        "thumbnail-more": "Ingrandisce",
+       "filemissing": "File perdute",
+       "thumbnail_error": "Errore crianno l'anteprimma 'e miniatura: $1",
+       "thumbnail_error_remote": "Mmasciata d'errore 'a $1:\n$2",
+       "djvu_page_error": "Pàggena DjVu fore 'e lemmeto",
+       "djvu_no_xml": "Nun se può piglià 'o XML p' 'o file DjVu",
+       "thumbnail-temp-create": "Nun se può crià na miniatura temporanea d' 'o file",
+       "thumbnail-dest-create": "Nun se può astipà 'a miniatura dint' 'a destinazione",
+       "thumbnail_invalid_params": "Parametre 'e miniatura invalide",
+       "thumbnail_dest_directory": "Nun se può crià 'a cartella 'e destinazione",
+       "thumbnail_image-type": "'O tipo d'immaggene nun è suppurtato",
+       "thumbnail_gd-library": "Configurazione d' 'a libbreria GD incompleta: funziona perza $1",
+       "thumbnail_image-missing": "'O file pare ca nun se trova: $1",
+       "thumbnail_image-failure-limit": "Se so' fatte troppe tentative senza ngarrata ($1 o cchiù) 'a generà sta miniatura. Pruvate n'ata vota cchiù tarde.",
        "import": "Mpurta paggene",
+       "importinterwiki": "Mpurtazione transkwiki",
+       "import-interwiki-text": "Scigliete na wiki e nu titolo 'e paggena 'a mpurtà.\n'E date e l'editore s'astiparranno.\nTutte l'aziune 'e mpurtaziune nfra 'e wiki songo riggistrate dint' 'e [[Special:Log/import|riggistre 'e mpurtazione]].",
+       "import-interwiki-sourcewiki": "Wiki d'origgene:",
+       "import-interwiki-sourcepage": "Paggena d'origgene:",
+       "import-interwiki-history": "Copia tutt' 'a storia d' 'e verziune 'e sta paggena",
+       "import-interwiki-templates": "Include tutt' 'e template",
        "import-interwiki-submit": "Mpurta",
+       "import-interwiki-namespace": "Namespace 'e destinazione:",
+       "import-interwiki-rootpage": "Paggena princepale 'e destinazione (opzionale):",
+       "import-upload-filename": "Nomme d' 'o file",
+       "import-comment": "Commento:",
+       "importtext": "Pe' piacere spurtate 'o file d' 'a wiki surgente ausanno l'[[Special:Export|utilità 'e sportazione]].\nScarrecatevella dint' 'o computer d' 'o vuosto e carrecate n'ata vota ccà.",
+       "importstart": "Mpurtanno 'e paggene...",
+       "import-revision-count": "$1 {{PLURAL:$1|verzione|verziune}}",
+       "importnopages": "Nisciuna pàggene 'a mpurtà.",
+       "imported-log-entries": "Mpurtate $1 {{PLURAL:$1|evento d' 'o riggistro|evente d' 'o riggistro}}.",
+       "importfailed": "Mpurtaziona fallita: <nowiki>$1</nowiki>",
+       "importunknownsource": "Nun se sape 'o tipo 'e sorgente 'e mpurtaziona",
+       "importcantopen": "Nun se può arapì 'o file 'e mpurtaziona",
+       "importbadinterwiki": "Cullegamiento interwiki errato",
+       "importsuccess": "Mpurtaziona fernuta!",
+       "importnosources": "Nisciuna fonte p' 'a mpurtaziona transwiki è stata definita; 'e carreche dirette 'e cronologgia nun songo attivate.",
+       "importnofile": "Nisciunu file 'e mpurtazione è stato carrecato.",
+       "importuploaderrorsize": "'A carreca d' 'o file 'e mpurtazione nun è riuscita.\n'O file è cchiù gruosso d' 'a dimenziona massima 'e carreca.",
+       "importuploaderrorpartial": "'A carreca d' 'o file mpurtato è fallita.\nNa parta d' 'o file file è stata carrecata ma nun a nu piezzo sano sano.",
+       "importuploaderrortemp": "'A carreca d' 'o file mpurtato nun se facette.\nNa cartella temporanea nun se truova.",
+       "import-parse-failure": "mpurtaziune XML scassata pe' n'errore d'analiso",
+       "import-noarticle": "Nisciuna paggena 'a mpurtà!",
+       "import-nonewrevisions": "Nisciuna verziona mpurtata (Tutt' 'e verziune so' state già mpurtate o pure zumpajeno pe' bbia 'e cocch'errore).",
+       "xml-error-string": "$1 a 'a linea $2, culonne $3 (byte $4): $5",
+       "import-upload": "Carreca 'e date 'e XML",
+       "import-token-mismatch": "Se so' perdut' 'e date d' 'a sessione.\nProva n'ata vota.",
+       "import-invalid-interwiki": "Nun se può mpurtà d' 'a wiki specificata.",
+       "import-error-edit": "'A paggena \"$1\" nun è stata mpurtata pecché nun avite 'o permesso p' 'a putè cagnà.",
+       "import-error-create": "'A paggena \"$1\" nun è stata mpurtata pecché nun avite 'o permesso p' 'a putè crià.",
+       "import-error-interwiki": "'A paggena \"$1\" nun è stata mpurtata pecché 'o nomme suojo stà astipato pe ne ffà 'o cullegamiento a fore (interwiki).",
+       "import-error-special": "'A paggena \"$1\" nun è stata mpurtata pecché appartene a nu namespace specifico ca nun permette sti paggene.",
+       "import-error-invalid": "'A paggena \"$1\" nun è stata mpurtata pecché 'o nomme 'e mpurtazione nun è bbuono ncopp'a sta wiki.",
+       "import-error-unserialize": "'A verzione $2 d' 'a paggena \"$1\" nun se può deserializzà. 'A virziona è stata reportata p'ausà 'o mudello 'e cuntenute $3 serializzate cumme $4.",
+       "import-error-bad-location": "'A verzione $2 aúsa nu mudello 'e cuntenuto $3 ca nun se può memorizzà ncopp'a \"$1\" 'e stu wiki, pecché 'a paggena nun supporta stu mudello.",
+       "import-options-wrong": "{{PLURAL:$2|opzione sbagliata|opziune sbagliate}}: <nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "'A paggena princepale c'avite dato tène nu titolo invalido.",
+       "import-rootpage-nosubpage": "'O namespace \"$1\" d' 'a pàggena princepale nun permette 'e sottopaggene.",
+       "importlogpage": "Riggistro 'e mpurtaziune",
+       "importlogpagetext": "Mpurtaziune ammenistrative 'e paggene c' 'a storia 'e cagnamiente 'e l'ati wiki.",
        "import-logentry-upload": "ha mpurtato [[$1]] trammeto upload",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|verzione|verziune}} mpurtate",
+       "import-logentry-interwiki": "trasferito 'a n'ata wiki 'a paggena $1",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|verzione|verziune}} mpurtate 'a $2",
+       "javascripttest": "Test JavaScript",
+       "javascripttest-title": "Secutanno test pe' $1",
+       "javascripttest-pagetext-noframework": "Sta paggena è riservata pe' l'esecuziune d' 'e test 'e Javascript.",
+       "javascripttest-pagetext-unknownframework": "Ambiente 'e test scanusciuto \"$1\".",
+       "javascripttest-pagetext-frameworks": "Pe' piacere sciglite uno 'e ll'ambiente 'e test ccà abbascio: $1",
+       "javascripttest-pagetext-skins": "Sciglite nu skin pe' ne fà 'e test:",
+       "javascripttest-qunit-intro": "Vedite 'a [$1 documentaziona d' 'o test] ncopp'a mediawiki.org.",
+       "javascripttest-qunit-heading": "Ambiente 'e test MediaWiki JavaScript QUnit",
        "tooltip-pt-userpage": "A toja paggena utente",
+       "tooltip-pt-anonuserpage": "'A paggena utente pe l'IP ca vuje state cagnanno cumme",
        "tooltip-pt-mytalk": "A toja paggena 'e discussione",
+       "tooltip-pt-anontalk": "Chiacchieria ncopp' 'e cagnamiente 'a st'indirizzo IP",
        "tooltip-pt-preferences": "Preferenze d''e mmeje",
+       "tooltip-pt-watchlist": "'A lista d' 'e paggene ca state a cuntrullà",
        "tooltip-pt-mycontris": "Elenco dde tuje contributte",
        "tooltip-pt-login": "A reggistrazione è cunsigliata",
        "tooltip-pt-logout": "Jésce (logout)",
        "tooltip-ca-viewsource": "Chista paggena è prutetta, ma puo vere 'o codice sorgente",
        "tooltip-ca-history": "Vversione precedente 'e chista paggena",
        "tooltip-ca-protect": "Prutegge chesta paggena",
+       "tooltip-ca-unprotect": "Càgna 'a prutezzione 'e chesta paggena",
        "tooltip-ca-delete": "Scancèlla chista paggena",
+       "tooltip-ca-undelete": "Arrepiglia 'e cagnamiente fatte 'a sta paggena apprimma ca fuieno scancellate",
        "tooltip-ca-move": "Spusta chista paggena",
+       "tooltip-ca-watch": "Azzecca sta paggena int' 'a lista 'e paggene cuntrullate vuosta",
+       "tooltip-ca-unwatch": "Lèva sta paggena d' 'a lista 'e paggene cuntrullate vuosta",
        "tooltip-search": "Truova dint'ô {{SITENAME}}",
+       "tooltip-search-go": "Vaje â paggena cu stu nomme si esiste",
        "tooltip-search-fulltext": "Ascià 'o testo indicato dint'e paggene",
        "tooltip-p-logo": "Visita a paggena prencepale",
        "tooltip-n-mainpage": "Visita a paggena prencepale",
        "tooltip-n-mainpage-description": "Visita a paggena prencepale",
        "tooltip-n-portal": "Descrizione d&#39;'o prugietto, che po' ffa, addò truvà 'e ccose",
+       "tooltip-n-currentevents": "Ascìa 'e nfurmaziune ncopp' 'e fatte succiesse mò mò",
        "tooltip-n-recentchanges": "Ennece dde urdeme cagnamiénte ddo sito",
        "tooltip-n-randompage": "Na paggena qualsiase",
        "tooltip-n-help": "Paggena 'e ajùto",
        "tooltip-t-whatlinkshere": "'Na lista 'e tutte e paggene ca song cullegate a chista",
        "tooltip-t-recentchangeslinked": "Urdeme cagnamiénte dde paggene ca cullegano a chesta",
+       "tooltip-feed-rss": "RSS feed pe sta pàggena",
+       "tooltip-feed-atom": "Atom feed pe sta pàggena",
        "tooltip-t-contributions": "Lista dde contributte 'e chisto utente",
        "tooltip-t-emailuser": "Manna 'nu email a chisto utente",
        "tooltip-t-upload": "Careca file",
        "tooltip-t-permalink": "Jonta permanente a chista vversione dda paggena",
        "tooltip-ca-nstab-main": "Vere a paggena e contenuto",
        "tooltip-ca-nstab-user": "Vere a paggena utente",
+       "tooltip-ca-nstab-media": "Vide 'a pàggena d' 'e media",
        "tooltip-ca-nstab-special": "Chista è 'na paggena speciale, nun può essere càgnata",
        "tooltip-ca-nstab-project": "Vere a paggena 'e servizio",
        "tooltip-ca-nstab-image": "Vere a paggena ddo file",
+       "tooltip-ca-nstab-mediawiki": "Vide 'a mmasciata d' 'o sistema",
        "tooltip-ca-nstab-template": "Vere 'o modello",
+       "tooltip-ca-nstab-help": "Vide 'a paggena d'aiuto",
        "tooltip-ca-nstab-category": "Vere a paggena d\"a categurìa",
        "tooltip-minoredit": "Rénne chìsto cagnamiénto cchiù ppiccirìllo.",
        "tooltip-save": "Sàrva 'e cagnamiénte.",
        "tooltip-preview": "Primma 'e sarvà, vìre primma chille ca hê cagnàte!",
+       "tooltip-diff": "Fà vedé 'e cagnamiente c'avite fatto ô testo",
+       "tooltip-compareselectedversions": "Fà vedé 'e differenze nfra tutt' 'e dduje verziune scigliute 'e sta paggena",
+       "tooltip-watch": "Azzecca sta paggena int' 'a lista 'e paggene cuntrullate vuosta",
+       "tooltip-watchlistedit-normal-submit": "Lèva 'e titule",
+       "tooltip-watchlistedit-raw-submit": "Agghiurna l'elenco 'e paggene cuntrullate",
+       "tooltip-recreate": "Arricrèa 'e paggene pure si so state scancellate",
+       "tooltip-upload": "Accummencia 'a carreca",
        "tooltip-rollback": "\"A vascio\" annulla 'e modefeche 'e chista paggena ell'ultimo contributore cu n' uneco click",
+       "tooltip-undo": "\"Annulla\" annulla stu cagnamiento e arape 'u form 'e cagnamiento facenno vedé l'anteprimma.\nPermette azzeccà nu mutivo dint' 'o riepilego.",
+       "tooltip-preferences-save": "Riggistra 'e preferenze",
+       "tooltip-summary": "Miette nu riepilego piccerillo",
+       "anonymous": "{{PLURAL:$1|utente|utente}} anonime 'e {{SITENAME}}",
+       "siteuser": "Utente 'e {{SITENAME}} $1",
+       "anonuser": "Utente anonime 'e {{SITENAME}} $1",
+       "lastmodifiedatby": "Sta paggena è stata cagnata l'urdema vota 'e $2, d' 'o $1 da $3.",
+       "othercontribs": "Basata ncopp' 'a fatica 'e $1.",
        "others": "ate",
+       "siteusers": "{{PLURAL:$2|utente|utente}} 'e {{SITENAME}} $1",
+       "anonusers": "{{PLURAL:$2|utente|utente}} anonime 'e {{SITENAME}} $1",
+       "creditspage": "Auture d' 'a paggena",
+       "nocredits": "Nun ce stanno nfurmaziune ncopp'a l'auture 'e sta paggena.",
+       "spamprotectiontitle": "Filtro 'e prutezione anti-spam",
+       "spamprotectiontext": "'A paggena ca vulite astipà è stata bloccata p' 'o filtro anti-spam.\nChesto è succiesso pecché avite miso nu link 'e chille ca stanno dint' 'a lista nira 'e site 'e fore.",
+       "spamprotectionmatch": "'O testo ccà abbascio è stato nzignato p' 'o filtro anti-spam: $1",
+       "spambot_username": "Sistema MediaWiki 'e pulezzia anti-spam",
+       "spam_reverting": "Arrepiglianno l'urdema verziona ca nun cuntene 'e link a $1",
+       "spam_blanking": "Tutt' 'e verziune cuntenenno cullegamiente a $1, pulezzate e sbacantate",
+       "spam_deleting": "Tutt' 'e verziune cuntenenno cullegamiente a $1, scancellanno",
+       "simpleantispam-label": "Cuntrollo anti-spam.\n<strong>NUN</strong> ghienchere!",
+       "pageinfo-title": "Nfurmaziune pe' \"$1\"",
+       "pageinfo-not-current": "Scusate, nun se ponno piglià sti nfurmaziune p' 'e verziune viecchie.",
+       "pageinfo-header-basic": "Nfurmaziune bbase",
+       "pageinfo-header-edits": "Cronologgia d' 'e cagnamiente",
+       "pageinfo-header-restrictions": "Càgna prutezione",
+       "pageinfo-header-properties": "Proprietà d' 'a paggena",
+       "pageinfo-display-title": "Fà vedé 'o titolo",
+       "pageinfo-default-sort": "Chiave d'ordinamento 'e bbase",
+       "pageinfo-length": "Llonghezza d' 'a paggena ('n byte)",
+       "pageinfo-article-id": "ID d' 'a paggena",
+       "pageinfo-language": "Lengua d' 'a paggena 'e cuntenute",
+       "pageinfo-content-model": "Mudello 'e cuntenute d' 'a paggena",
+       "pageinfo-robot-policy": "Indicizzate 'a 'e robbot",
+       "pageinfo-robot-index": "Permesso",
+       "pageinfo-robot-noindex": "Nun permesso",
+       "pageinfo-views": "Nummero 'e visite",
+       "pageinfo-watchers": "Nummero 'e visite â paggena",
+       "pageinfo-few-watchers": "Meno 'e $1 {{PLURAL:$1|visita|visite}}",
+       "pageinfo-redirects-name": "Nummero 'e redirect a sta paggena",
+       "pageinfo-subpages-name": "Nummero 'e sottopaggene 'e sta paggena",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect}}; $3 {{PLURAL:$3|nun redirect}})",
+       "pageinfo-firstuser": "Criatore d' 'a paggena",
+       "pageinfo-firsttime": "Data 'e criazione d' 'a paggena",
+       "pageinfo-lastuser": "Urdemo cuntribbutore",
+       "pageinfo-lasttime": "Data 'e ll'urdemo cagnamiento",
+       "pageinfo-edits": "Nummero totale 'e cagnamiente",
+       "pageinfo-authors": "Nummero totale d'auture differénte",
+       "pageinfo-recent-edits": "Nummero 'e cagnamiente 'e poco tempo fà (ind'a ll'urdeme $1)",
+       "pageinfo-recent-authors": "Nummero d'auture differénte pe' cagnamiente fatte poco tempo fà",
+       "pageinfo-magic-words": "{{PLURAL:$1|Parola maggica|Parole maggiche}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Categurìa annascunnuta|Categurìe annascunnute}} ($1)",
+       "pageinfo-templates": "Template {{PLURAL:$1|appennuto|appennute}} ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Paggena appennuta|Paggene appennute}} ncopp'a ($1)",
+       "pageinfo-toolboxlink": "Nfurmaziune d' 'a paggena",
+       "pageinfo-redirectsto": "Reindirizza a",
+       "pageinfo-redirectsto-info": "nfurmaziune",
+       "pageinfo-contentpage": "Cuntata comme na paggena 'e cuntenute",
+       "pageinfo-contentpage-yes": "Sì",
+       "pageinfo-protect-cascading": "Prutezione 'n cascata 'a ccà",
+       "pageinfo-protect-cascading-yes": "Sì",
+       "pageinfo-protect-cascading-from": "'E pruteziune veneno 'n cascata 'a",
+       "pageinfo-category-info": "Nfurmaziune ncopp' 'a categurìa",
+       "pageinfo-category-pages": "Nummero 'e paggene",
+       "pageinfo-category-subcats": "Nummero 'e sottocategurìe",
+       "pageinfo-category-files": "Nummero 'e file",
+       "markaspatrolleddiff": "Nzègna comme cuntrullata",
+       "markaspatrolledtext": "Nzegna sta paggena comme cuntrullata",
+       "markedaspatrolled": "Nzegnata comme cuntrullata",
+       "markedaspatrolledtext": "'A verziona scigliuta 'e [[:$1]] è stata nzegnata comme cuntrullata.",
+       "rcpatroldisabled": "Funzione cuntrollo 'e ll'urdeme cagnamiente stutata",
+       "rcpatroldisabledtext": "'A funzione 'e cuntrolle 'e ll'urdeme cagnamiente è stutata mo.",
+       "markedaspatrollederror": "Nun se può nzignà comme cuntrullata",
+       "markedaspatrollederrortext": "Avite 'a specificà na verziona a nzegnà comme cuntrullata.",
+       "markedaspatrollederror-noautopatrol": "Nun avite permesso 'a nzegnà 'e cagnamiente vuoste comme cuntrullate.",
+       "markedaspatrollednotify": "Stu cagnamiento a $1 è stato nzegnato comme cuntrullato.",
+       "markedaspatrollederrornotify": "Errore pe' tramente ca se nzegnava comme cuntrullata.",
+       "patrol-log-page": "Riggistro 'e cuntrolle",
+       "patrol-log-header": "Chest'è nu riggistro ch' 'e verziune cuntrullate.",
+       "log-show-hide-patrol": "$1 riggistro 'e cuntrolle",
+       "deletedrevision": "Viecchia verziona scancellata $1",
+       "filedeleteerror-short": "Errore pe' tramente ca se scancellava nu file: $1",
+       "filedeleteerror-long": "N'errore s'è apprisentato pe' tramente ca se scancellava 'o file:\n\n$1",
+       "filedelete-missing": "'O file \"$1\" nun se può scancellà pecche nun esiste proprio.",
+       "filedelete-old-unregistered": "'A verziona d' 'o file specificato \"$1\" nun se trova dint' 'o database.",
+       "filedelete-current-unregistered": "'O file specificato \"$1\" nun ce sta dint' 'o database.",
+       "filedelete-archive-read-only": "'A cartella d'archiviazione \"$1\" nun se può scrivere dint' 'o server.",
        "previousdiff": "← Càgnamiento cchiù viecchio",
        "nextdiff": "Cagnamiénte successivo →",
+       "mediawarning": "<strong>Attenziò:</strong> Stu file putesse cuntenè codece malegno.\nSi 'o secutate, 'o sistema vuosto se putesse scassà.",
+       "imagemaxsize": "Lemmeto â dimenzione 'e l'immaggene:<br /><em>(p' 'e paggene 'e descrizione d' 'o file)</em>",
+       "thumbsize": "Dimenziona d' 'a miniatura:",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|paggena|paggene}}",
+       "file-info": "dimenziona d' 'o file: $1, tipo MIME: $2",
        "file-info-size": "$1 × $2 pixel, dimenzione ddo file: $3, tipo MIME: $4",
+       "file-info-size-pages": "$1 × $2 pixel, dimenzione d' 'o file: $3, tipe 'e MIME: $4, $5 {{PLURAL:$5|paggena|paggene}}",
+       "file-nohires": "Nun ce sta na risoluzione cchiù auta.",
+       "svg-long-desc": "File SVG, dimenziune nommenale $1 × $2 pixel, dimenzione d' 'o file: $3",
+       "svg-long-desc-animated": "File SVG animato, dimenziune nommenale $1 × $2 pixel, dimenzione d' 'o file: $3",
+       "svg-long-error": "File SVG invalido: $1",
        "show-big-image": "File 'e origgine",
+       "show-big-image-preview": "Dimenziune 'e sta anteprimma: $1.",
+       "show-big-image-other": "{{PLURAL:$2|N'ata resoluzione|Ati resoluziune}}: $1.",
+       "show-big-image-size": "$1 x $2 pixel",
+       "file-info-gif-looped": "ciclico",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|frame|frame}}",
+       "file-info-png-looped": "ciclico",
+       "file-info-png-repeat": "curruto $1 {{PLURAL:$1|vota|vote}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|frame|frame}}",
+       "file-no-thumb-animation": "<strong>Vedite bbuono: Pe' bbia 'e lemmetaziune tecniche, 'e miniature 'e stu file nun sarrann'animate.</strong>",
+       "file-no-thumb-animation-gif": "<strong>Vedite bbuono: Pe' bbia 'e lemmetaziune tecniche, 'e miniature 'e auta resoluzione 'e nu file GIF comm'a chesta nun sarrann'animate.</strong>",
+       "newimages": "Galleria 'e file nuove",
+       "imagelisttext": "Ccà abbascio ce sta na lista 'e '''$1''' {{PLURAL:$1|file|file}} arrecetate $2.",
+       "newimages-summary": "Sta paggena speciale fà vedé tuttequante l'urdeme file carrecate.",
+       "newimages-legend": "Filtro",
+       "newimages-label": "Nomme d' 'o file (o nu piezz' 'e chesto):",
+       "newimages-showbots": "Mmusta cárreche 'e robbot",
        "noimages": "Nun nc'è nind' 'a veré.",
        "ilsubmit": "Truova",
+       "bydate": "pe' data",
+       "sp-newimages-showfrom": "Faje vedé 'e file nuove fatte a partì 'a $3 $2",
+       "seconds": "{{PLURAL:$1|secondo|seconde}}",
+       "minutes": "{{PLURAL:$1|$1 minuto|$1 minute}}",
+       "hours": "{{PLURAL:$1|n'ora|$1 ore}}",
+       "days": "{{PLURAL:$1|$1 juorno|$1 ghiuorne}}",
+       "weeks": "{{PLURAL:$1|$1 semmana|$1 semmane}}",
+       "months": "{{PLURAL:$1|$1 mese|$1 mese}}",
+       "years": "{{PLURAL:$1|$1 anno|$1 anne}}",
+       "ago": "$1 fà",
+       "just-now": "mò mò",
+       "hours-ago": "$1 {{PLURAL:$1|ora|ore}} fà",
+       "minutes-ago": "$1 {{PLURAL:$1|minuto|minute}} fà",
+       "seconds-ago": "$1 {{PLURAL:$1|secondo|seconde}} fà",
+       "monday-at": "Lunnerì a 'e $1",
+       "tuesday-at": "Marterì a 'e $1",
+       "wednesday-at": "Miercurì a 'e $1",
+       "thursday-at": "Gioverì a 'e $1",
+       "friday-at": "Viernarì a 'e $1",
+       "saturday-at": "Sàbbato a 'e $1",
+       "sunday-at": "Dummeneca a 'e $1",
+       "yesterday-at": "Aiere a 'e $1",
+       "bad_image_list": "'O formato è chesto:\n\nSulamente l'elemente d' 'a lista ('e righe c'accummenciano cu *) songhe cunziderate.\n'O primmo cullegamiento ncopp'a na linea qualunque adda essere nu cullegamiento a nu file ca nun è bbuono.\nTutte l'ati link ca spuntano â stessa riga songhe cunziderate eccezziune, p.e. 'e paggene addò 'o file se putesse richiamà normalmente.",
        "metadata": "Metadate",
+       "metadata-help": "Stu file cuntene nfurmaziune agghiunte, probabilmente 'a na fotocamera o nu scanner ausate pe' crià o digitalizà.\nSi 'o file è stato cagnato 'a 'o stato origginale suojo, certi dettaglie può darse ca nun se vedeno ncopp' 'o file già cagnato.",
+       "metadata-expand": "Fa vedè 'e dettaglie spannute",
+       "metadata-collapse": "Annascunne 'e dettaglie spannute",
+       "metadata-fields": "'E metadata 'e l'immaggene ccà mmustate sarranno azzeccate dint' 'a mmosta d' 'a paggena quanno 'a tabbella 'e metadata è collassata.\nL'ati sarranno normalmente annascunnute.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-imagewidth": "Larghezza",
+       "exif-imagelength": "Autezza",
+       "exif-bitspersample": "Bit pe' componente",
+       "exif-compression": "Schema 'e compressione",
+       "exif-photometricinterpretation": "Composizione d' 'e pixel",
+       "exif-orientation": "Orientamento",
+       "exif-samplesperpixel": "Nummero 'e componente",
+       "exif-planarconfiguration": "Arricietto 'e date",
+       "exif-ycbcrsubsampling": "Rapporto 'e campiunamiento Y / C",
+       "exif-ycbcrpositioning": "Mpizzamento d' Y e C",
+       "exif-xresolution": "Resoluzione orizzontale",
+       "exif-yresolution": "Resoluzione verticale",
+       "exif-stripoffsets": "Pizzo addò sta l'immaggine",
+       "exif-rowsperstrip": "Nummero 'e righe pe' striscia",
+       "exif-stripbytecounts": "Byte pe' striscia compressa",
+       "exif-jpeginterchangeformat": "Distanza 'a SOI JPEG",
+       "exif-jpeginterchangeformatlength": "Byte 'e date JPEG",
+       "exif-whitepoint": "Cromaticetà d' 'o punto janco",
+       "exif-primarychromaticities": "Cromaticetà d' 'e culore primmarie",
+       "exif-ycbcrcoefficients": "Coefficiente d' 'a matrice 'e trasformazione d' 'o spazio 'e culore",
+       "exif-referenceblackwhite": "Paro 'e riferimento 'e valore janche e nire",
+       "exif-datetime": "Data e ora 'e cagnamiento d' 'o file",
+       "exif-imagedescription": "Titulo 'e l'immaggene",
+       "exif-make": "Frabbeca ca muntaje 'a camera",
+       "exif-model": "Mudello d' 'a camera",
+       "exif-software": "Software ausàto",
+       "exif-artist": "Autore",
+       "exif-copyright": "Titolare d' 'o Copyright",
+       "exif-exifversion": "Verzione d'Exif",
+       "exif-flashpixversion": "Verziona Flashpix suppurtata",
+       "exif-colorspace": "Spazio d' 'e culore",
+       "exif-componentsconfiguration": "Significato d'ogne componente",
+       "exif-compressedbitsperpixel": "Modo 'e compressione 'e l'immaggene",
+       "exif-pixelydimension": "Larghezza 'e l'immaggene",
+       "exif-pixelxdimension": "Autezza 'e l'immaggene",
+       "exif-usercomment": "Note 'e ll'utente",
+       "exif-relatedsoundfile": "File audio cullegato",
+       "exif-datetimeoriginal": "Data e ora d' 'a criazione d' 'e date",
+       "exif-datetimedigitized": "Data e ora 'e digitalizzazziona",
+       "exif-subsectime": "DateTime centeseme",
+       "exif-subsectimeoriginal": "DateTimeOriginal centeseme",
+       "exif-subsectimedigitized": "DateTimeDigitized centeseme",
+       "exif-exposuretime": "Tiempo d'esposizione",
+       "exif-exposuretime-format": "$1 sec ($2)",
+       "exif-fnumber": "Nummero p' 'o F",
+       "exif-exposureprogram": "Prugramma d'esposizione",
+       "exif-spectralsensitivity": "Senzitività spettrale",
+       "exif-isospeedratings": "Senzibbiletà ISO",
+       "exif-shutterspeedvalue": "Velocità d' 'o nchiuretore APEX",
+       "exif-aperturevalue": "Apertura APEX",
+       "exif-brightnessvalue": "Lumenosetà APEX",
+       "exif-exposurebiasvalue": "Correzzione d'esposizione APEX",
+       "exif-maxaperturevalue": "Apiertura massima",
+       "exif-subjectdistance": "Distanza d' 'o soggetto",
+       "exif-meteringmode": "Metodo 'e mmisura",
+       "exif-lightsource": "Sorgente 'e luce",
+       "exif-flash": "Flash",
+       "exif-focallength": "Distanza focale d' 'a lente",
+       "exif-subjectarea": "Area d' 'o soggetto",
+       "exif-flashenergy": "Putenza d' 'o flash",
+       "exif-focalplanexresolution": "Resoluzione X ncopp' 'o piano focale",
+       "exif-focalplaneyresolution": "Resoluzione Y ncopp' 'o piano focale",
+       "exif-focalplaneresolutionunit": "Unità 'e resoluzione d' 'o piano focale",
+       "exif-subjectlocation": "Pizzo addò stà 'o soggetto",
+       "exif-exposureindex": "Innece d'esposizione",
+       "exif-sensingmethod": "Sistema 'e rilevazione",
+       "exif-filesource": "Origgene d' 'o file",
+       "exif-scenetype": "Tipo 'e scena",
+       "exif-customrendered": "Prucesso d' 'a immaggene",
+       "exif-exposuremode": "Modo d'esposizione",
+       "exif-whitebalance": "Valanza 'e janco",
+       "exif-digitalzoomratio": "Rapporto zoom diggitale",
+       "exif-focallengthin35mmfilm": "Focale eguale a 35 mm",
+       "exif-scenecapturetype": "Tipo d'acquisizziona",
+       "exif-gaincontrol": "Cuntrollo d' 'a scena",
+       "exif-contrast": "Contrasto",
+       "exif-saturation": "Saturazione",
+       "exif-sharpness": "Nitidezza",
+       "exif-devicesettingdescription": "Descrizione d' 'e mpustaziune d' 'o dispositivo",
+       "exif-subjectdistancerange": "Scala distanza soggetto",
+       "exif-imageuniqueid": "ID 'e l'immaggine univoco",
+       "exif-gpsversionid": "Verzione d' 'e tag GPS",
+       "exif-gpslatituderef": "Latitudine nord o sud",
+       "exif-gpslatitude": "Latitudine",
+       "exif-gpslongituderef": "Longitudine est o ovest",
+       "exif-gpslongitude": "Longitudine",
+       "exif-gpsaltituderef": "Riferimento pe' l'autezza",
+       "exif-gpsaltitude": "Autezza",
+       "exif-gpstimestamp": "orario d' 'o GPS (rilorgio atomico)",
+       "exif-gpssatellites": "Satellite ausate p' 'e mmisure",
+       "exif-gpsstatus": "Stato d' 'o ricevitore",
+       "exif-gpsmeasuremode": "Modo 'e mmisura",
+       "exif-gpsdop": "Precisione d' 'a mmisura",
+       "exif-gpsspeedref": "Unità 'e mmisura",
+       "exif-gpsspeed": "Velocità d' 'o ricevitore GPS",
+       "exif-gpstrackref": "Riferimento p' 'a direzzione d' 'o movimento",
+       "exif-gpstrack": "Direzzione d' 'o movimento",
+       "exif-gpsimgdirectionref": "Riferimento p' 'a direzzione 'e ll'immaggene",
+       "exif-gpsimgdirection": "Direzzione 'e ll'immaggene",
+       "exif-gpsmapdatum": "Rilevamento geodetico ausato",
+       "exif-gpsdestlatituderef": "Riferimento p' 'a latitudine 'e destinazione",
+       "exif-gpsdestlatitude": "Latitudine 'e destinazione",
+       "exif-gpsdestlongituderef": "Riferimento p' 'a longitudine 'e destinazione",
+       "exif-gpsdestlongitude": "Longitudine 'e destinazione",
+       "exif-gpsdestbearingref": "Riferimento p' 'a direzzione 'e destinazione",
+       "exif-gpsdestbearing": "Direzione 'e destinazzione",
+       "exif-gpsdestdistanceref": "Riferimento p' 'a latitudine 'e destinazione",
+       "exif-gpsdestdistance": "Distanza d' 'a destinazione",
+       "exif-gpsprocessingmethod": "Nomme d' 'o metodo 'e prucesso GPS",
+       "exif-gpsareainformation": "Nomme 'e ll'area GPS",
+       "exif-gpsdatestamp": "Data d' 'o GPS",
+       "exif-gpsdifferential": "Currezzione differenziale d' 'o GPS",
+       "exif-jpegfilecomment": "Commento d' 'o file JPEG",
+       "exif-keywords": "Parole chiave",
+       "exif-worldregioncreated": "Reggione d' 'o munno addò è stata scattata sta foto",
+       "exif-countrycreated": "Paese d' 'o munno addò è stata scattata sta foto",
+       "exif-countrycodecreated": "Codece p' 'o paese addò è stata scattata sta foto",
+       "exif-provinceorstatecreated": "Pruvincia o Stato addò è stata scattata sta foto",
+       "exif-citycreated": "Città addò è stata scattata sta foto",
+       "exif-sublocationcreated": "Sottolocazione d' 'a cettà addò è stata scattata sta foto",
+       "exif-worldregiondest": "Reggiune d' 'o munno ca se sta mmustanno",
+       "exif-countrydest": "Paise ca se stanno mmustanno",
+       "exif-countrycodedest": "Codece p' 'e paise ca se stanno mmustanno",
+       "exif-provinceorstatedest": "Pruvince o state ca se stanno mustanno",
+       "exif-citydest": "Città ca se stà mustanno",
+       "exif-sublocationdest": "Sottolocazione d' 'a città ca se stà mmustanno",
+       "exif-objectname": "Titolo curto",
+       "exif-specialinstructions": "Struziune speciale",
+       "exif-headline": "Ntestazzione",
+       "exif-credit": "Credite/Fornitore",
+       "exif-source": "Funte",
+       "exif-editstatus": "Stato editoriale 'e ll'immaggene",
+       "exif-urgency": "Priorità",
+       "exif-fixtureidentifier": "Nomme d' 'accunciamiento",
+       "exif-locationdest": "Locazione raffigurata",
+       "exif-locationdestcode": "Codece 'e lloco raffigurato",
+       "exif-objectcycle": "Orario d' 'o juorno p' 'o quale è stato pruggettato stu media",
+       "exif-contact": "Nfurmaziune 'e cuntatto",
+       "exif-writer": "Scrittore",
+       "exif-languagecode": "Lengua",
+       "exif-iimversion": "Verziona IIM",
+       "exif-iimcategory": "Categurìa",
+       "exif-iimsupplementalcategory": "Categurìe supplementarie",
+       "exif-datetimeexpires": "Nun ausà aroppo",
+       "exif-datetimereleased": "Relassato 'o",
+       "exif-originaltransmissionref": "Codece d' 'a locazione d' 'a trasmissione origgenale",
+       "exif-identifier": "Identificatore",
+       "exif-lens": "Lunghezze ausate",
+       "exif-serialnumber": "Nummero seriale d' 'a fotocamera",
+       "exif-cameraownername": "Titolare d' 'a fotocamera",
+       "exif-label": "Etichetta",
+       "exif-datetimemetadata": "Data de l'urdemo cagnamiento a 'e metadata",
+       "exif-nickname": "Nomme nfurmale 'e ll'immaggene",
+       "exif-rating": "Punteggio ('e 5)",
+       "exif-rightscertificate": "Certificato 'e gestione d' 'e deritte",
+       "exif-copyrighted": "Stato d' 'o copyright",
+       "exif-copyrightowner": "Titolare d' 'o Copyright",
+       "exif-usageterms": "Termine d'auso",
+       "exif-webstatement": "Affermazione d' 'o copyright on line",
+       "exif-originaldocumentid": "ID unico d' 'o documento origgenale",
+       "exif-licenseurl": "URL p' 'a licienza d' 'o copyright",
+       "exif-morepermissionsurl": "Nfurmaziune 'e licienza alternative",
+       "exif-attributionurl": "Quanno s'ausasse n'ata vota sta fatica, pe' piaccere falla spunta cu nu link ccà a",
+       "exif-preferredattributionname": "Quanno s'ausasse n'ata vota sta fatica, pe' piacere dincette chi l'ha fatta",
+       "exif-pngfilecomment": "Commento d' 'o file PNG",
+       "exif-disclaimer": "Avvertimiènto",
+       "exif-contentwarning": "Avvertimiènto ncopp' 'e cuntenute",
+       "exif-giffilecomment": "Commento d' 'o file GIF",
+       "exif-intellectualgenre": "Tipo d'elemento",
+       "exif-subjectnewscode": "Codece d' 'o suggetto",
+       "exif-scenecode": "Codece 'e scena IPTC",
+       "exif-event": "Fatto raffigurato",
+       "exif-organisationinimage": "Organizzazione raffigurata",
+       "exif-personinimage": "Perzona raffigurata",
+       "exif-originalimageheight": "Autezza 'e ll'immaggene apprimma ca fosse rintagliata",
+       "exif-originalimagewidth": "Larghezza 'e ll'immaggene apprimma ca fosse rintagliata",
+       "exif-compression-1": "Senza cumprimì",
+       "exif-compression-2": "Gruppe CCITT 3 Decodifeche 'Esecuzione d' 'a lunghezza 1-Dimenzionale Cagnate 'a Huffman",
+       "exif-compression-3": "Gruppe CCITT 3 'e decodifeche d' 'o fax",
+       "exif-compression-4": "Codifeca fax CCITT gruppo 4",
+       "exif-copyrighted-true": "Prutetto 'a copyright",
+       "exif-copyrighted-false": "Status d' 'o copyright nun mpustato",
+       "exif-unknowndate": "Data scanusciuta",
+       "exif-orientation-1": "Nurmale",
+       "exif-orientation-2": "Revutato orizzontalmente",
+       "exif-orientation-3": "Votato a 180°",
+       "exif-orientation-4": "Revutato verticalmente",
+       "exif-orientation-5": "Votato a 90º 'n senzo cuntrario a l'aco d' 'o rilorgio e revutato verticalmente",
+       "exif-orientation-6": "Votato a 90° 'n senzo cuntrario a l'aco d' 'o rilorgio",
+       "exif-orientation-7": "Votato a 90º 'n senzo 'e l'aco d' 'o rilorgio e revutato verticalmente",
+       "exif-orientation-8": "Votato a 90° 'n senzo 'e l'aco d' 'o rilorgio",
+       "exif-planarconfiguration-1": "furmato 'e blocche",
+       "exif-planarconfiguration-2": "furmato lineare",
        "exif-xyresolution-i": "$1 punte pe pollice (dpi)",
+       "exif-colorspace-65535": "Nun calibbrato",
+       "exif-componentsconfiguration-0": "nun esiste",
+       "exif-exposureprogram-0": "Nun definito",
+       "exif-exposureprogram-1": "Manuale",
+       "exif-exposureprogram-2": "Programma nurmale",
+       "exif-exposureprogram-3": "Priorità d'apertura",
+       "exif-exposureprogram-4": "Priorità 'e sposizione",
+       "exif-exposureprogram-5": "Programma ccreativo (basato ncopp' 'o profunno d' 'o campo)",
+       "exif-exposureprogram-6": "Prugramma d'azione (basato ncopp' 'a velocità 'e riprese)",
+       "exif-exposureprogram-7": "Modo ritratto (soggette vicine c' 'o sfondo fore 'o foco)",
+       "exif-exposureprogram-8": "Panurama (soggette luntane c' 'o sfondo int' 'o foco)",
+       "exif-subjectdistance-value": "$1 metre",
        "exif-meteringmode-0": "Scanusciuto",
+       "exif-meteringmode-1": "Medio",
+       "exif-meteringmode-2": "Medie Pesate Centrate",
+       "exif-meteringmode-3": "Spot",
+       "exif-meteringmode-4": "Multi Spot",
+       "exif-meteringmode-5": "Pattern",
+       "exif-meteringmode-6": "Parziale",
        "exif-meteringmode-255": "Ato",
        "exif-lightsource-0": "Scanusciuta",
+       "exif-lightsource-1": "Luce d' 'o ghiuorno",
+       "exif-lightsource-2": "Fluorescente",
+       "exif-lightsource-3": "Tungsteno (luce cavera cavera)",
+       "exif-lightsource-4": "Flash",
+       "exif-lightsource-9": "Tiempi belle",
        "exif-lightsource-10": "'Ntruvulato",
        "exif-lightsource-11": "Aumbruso",
+       "exif-lightsource-12": "Florescenza a 'a luce d' 'o juorno (D 5700 - 7100K)",
+       "exif-lightsource-13": "Florescenza a 'o janco d' 'o juorno (N 4600 - 5400K)",
+       "exif-lightsource-14": "Florescenza a 'o janco friddo (W 3900 - 4500K)",
+       "exif-lightsource-15": "Florescenza janca (WW 3200 - 3700K)",
+       "exif-lightsource-17": "Luce standàrd A",
+       "exif-lightsource-18": "Luce standàrd B",
+       "exif-lightsource-19": "Luce standàrd C",
+       "exif-lightsource-24": "Luce 'e studio ISO ô tungsteno",
+       "exif-lightsource-255": "N'ata sorgente 'e luce",
+       "exif-flash-fired-0": "'O flash nun è scattato",
+       "exif-flash-fired-1": "Flash scattato",
+       "exif-flash-return-0": "nisciuna funzione ncopp' 'o ritorno d' 'a luce stroboscopeca",
+       "exif-flash-return-2": "luce stroboscopeca 'e ritorno nun scummigliata",
+       "exif-flash-return-3": "luce stroboscopeca 'e ritorno scummigliata",
+       "exif-flash-mode-1": "flash forzato apicciato",
+       "exif-flash-mode-2": "flash forzato stutato",
+       "exif-flash-mode-3": "modo automateco",
+       "exif-flash-function-1": "Nisciuna funzione flash",
+       "exif-flash-redeye-1": "modalità pe' luvà ll'uocchie russe",
+       "exif-focalplaneresolutionunit-2": "pollece",
+       "exif-sensingmethod-1": "Indefinite",
+       "exif-sensingmethod-2": "Sensore d'area 'e culore a unu-chip",
+       "exif-sensingmethod-3": "Sensore d'area 'e culore a ddoje-chip",
+       "exif-sensingmethod-4": "Sensore d'area 'e culore a tre-chip",
+       "exif-sensingmethod-5": "Sensore 'e culore sequenziale",
+       "exif-sensingmethod-7": "Sensore trilineare",
+       "exif-sensingmethod-8": "Sensore 'e culore sequenziale e lineare",
+       "exif-filesource-3": "Camera diggitale",
+       "exif-scenetype-1": "Fotografia diretta",
+       "exif-customrendered-0": "Prucesso normale",
+       "exif-customrendered-1": "Prucesso personalizzato",
+       "exif-exposuremode-0": "Auto esposizione",
+       "exif-exposuremode-1": "Esposizione a mmano",
+       "exif-exposuremode-2": "Bracketing automateco",
+       "exif-whitebalance-0": "Valanzamiento d' 'e janche automateco",
+       "exif-whitebalance-1": "Valanzamiento d' 'e janche manuale",
+       "exif-scenecapturetype-0": "Standard",
+       "exif-scenecapturetype-1": "Panorama",
+       "exif-scenecapturetype-2": "Ritratto",
+       "exif-scenecapturetype-3": "Scena 'e notte",
        "exif-gaincontrol-0": "Nisciuno",
+       "exif-gaincontrol-1": "Vascio aumento d' 'o guadagno",
+       "exif-gaincontrol-2": "Aveto aumento d' 'o guadagno",
+       "exif-gaincontrol-3": "Vascio acalamento d' 'o guadagno",
+       "exif-gaincontrol-4": "Aveto acalamento d' 'o guadagno",
+       "exif-contrast-0": "Nurmale",
+       "exif-contrast-1": "Muscio",
+       "exif-contrast-2": "Tuosto",
+       "exif-saturation-0": "Nurmale",
+       "exif-saturation-1": "Saturazione vascia",
+       "exif-saturation-2": "Saturazione aveta",
+       "exif-sharpness-0": "Nurmale",
+       "exif-sharpness-1": "Muscio",
+       "exif-sharpness-2": "Tuosto",
        "exif-subjectdistancerange-0": "Scanusciuta",
-       "watchlistall2": "tutte",
+       "exif-subjectdistancerange-1": "Macro",
+       "exif-subjectdistancerange-2": "Vista 'e vicino",
+       "exif-subjectdistancerange-3": "Vista 'e luntano",
+       "exif-gpslatitude-n": "Latitudine nord",
+       "exif-gpslatitude-s": "Latitudine sud",
+       "exif-gpslongitude-e": "Longitudine est",
+       "exif-gpslongitude-w": "Longitudine ovest",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|metro|metre}} 'a copp' 'o livello d' 'o mare",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|metro|metre}} abbascio 'o livello d' 'o mare",
+       "exif-gpsstatus-a": "Mmisure ncurzo",
+       "exif-gpsstatus-v": "Mmisure nteroperabbele",
+       "exif-gpsmeasuremode-2": "Mmisure a ddoje-dimenziune",
+       "exif-gpsmeasuremode-3": "Mmisure a tre-dimenziune",
+       "exif-gpsspeed-k": "Chilometre a l'ora",
+       "exif-gpsspeed-m": "Miglie pe' ora",
+       "exif-gpsspeed-n": "Nurece",
+       "exif-gpsdestdistance-k": "Chilometre",
+       "exif-gpsdestdistance-m": "Miglie",
+       "exif-gpsdestdistance-n": "Miglie nauteche",
+       "exif-gpsdop-excellent": "Eccellente ($1)",
+       "exif-gpsdop-good": "Bbuono ($1)",
+       "exif-gpsdop-moderate": "Apposto ($1)",
+       "exif-gpsdop-fair": "Discreto ($1)",
+       "exif-gpsdop-poor": "Puveriello ($1)",
+       "exif-objectcycle-a": "Sulamente 'a matina",
+       "exif-objectcycle-p": "Sulamente 'a sera",
+       "exif-objectcycle-b": "Tutt' 'e dduje matina e sera",
+       "exif-gpsdirection-t": "Direziona overa",
+       "exif-gpsdirection-m": "Direziona magnetica",
+       "exif-ycbcrpositioning-1": "Centrato",
+       "exif-ycbcrpositioning-2": "Co-mpizzato",
+       "exif-dc-contributor": "Contribbuture",
+       "exif-dc-coverage": "Scopo spaziale o temporale d' 'o media",
+       "exif-dc-date": "Data (e)",
+       "exif-dc-publisher": "Editore",
+       "exif-dc-relation": "Media cullegate",
+       "exif-dc-rights": "Deritte",
+       "exif-dc-source": "Media sorgente",
+       "exif-dc-type": "Tipe 'e media",
+       "exif-rating-rejected": "Scartate",
+       "exif-isospeedratings-overflow": "Cchiù granne 'e 65535",
+       "exif-iimcategory-ace": "Arte, cultura e spassatiempe",
+       "exif-iimcategory-clj": "Crimine e legge",
+       "exif-iimcategory-dis": "Guaie e brutte fatte",
+       "exif-iimcategory-fin": "Economia e affare",
+       "exif-iimcategory-edu": "Studie",
+       "exif-iimcategory-evn": "Ambiente",
+       "exif-iimcategory-hth": "Salute",
+       "exif-iimcategory-hum": "Nteresse umano",
+       "exif-iimcategory-lab": "Fatica",
+       "exif-iimcategory-lif": "Stile 'e vita e tiempo libbero",
+       "exif-iimcategory-pol": "Puliteca",
+       "exif-iimcategory-rel": "Religgione e crerenze",
+       "exif-iimcategory-sci": "Scienze e tecnologgie",
+       "exif-iimcategory-soi": "Teme suggiale",
+       "exif-iimcategory-spo": "Sport",
+       "exif-iimcategory-war": "Uerra, cunflitte e arrevuòte",
+       "exif-iimcategory-wea": "Meteo",
+       "exif-urgency-normal": "Normale ($1)",
+       "exif-urgency-low": "Vascia  ($1)",
+       "exif-urgency-high": "Aveta ($1)",
+       "exif-urgency-other": "Priorità definite 'a l'utente ($1)",
        "namespacesall": "Tutte",
        "monthsall": "tutte",
+       "confirmemail": "Cunfermate 'o nderizzo mail",
+       "confirmemail_noemail": "Nun tenite nu nderizzo e-mail bbuono pe' ve putè configurà ncopp' 'e [[Special:Preferences|preferenze vuoste]].",
+       "confirmemail_text": "{{SITENAME}} bbuò ca vuje validasseve 'o nderizzo e-mail vuosto apprimm' 'e putè ausà 'e ffunziune 'e-mail.\nSpremmete 'o buttone 'e sotto pe' mannà na mmasciata e-mail 'e cunferma a l'indirizzo vuosto.\n'A mmasciata e-mail ca v'arreverrà tenesse nu cullegamento cu nu codece; carrecate 'o cullegamiento dint' 'a nu navigatóre web pe' ve putè cunfermà cu stu ndirizzo e nce ffà assapé 'o sito ch' 'è bbuono.",
+       "confirmemail_pending": "Nu codece 'e cunferma è stato gia mannato a l'email vuosto;\nSi mò mò nu cunto utente avite criato, allora putite aspettà cocche minuto ca chist'arriva, apprimm' 'e pruvà n'ata vota 'addimannà nu codece nuovo.",
+       "confirmemail_send": "Manna nu codece 'e cunferma",
+       "confirmemail_sent": "Mmasciata e-mail 'e cunferma mannata.",
+       "confirmemail_oncreate": "'O codece 'e cunferma è stato mannato al'indirizzo e-mail d' 'o vuosto.\nStu codece nun è addimannato pe' ve putè fà trasì, ma vuje n'avite abbesuogno 'e l'avé apprimm' 'e putè ausà cocche funziune 'e chille ca facessero l'uso d' 'o cunto e-mail ncopp'a sta wiki.",
+       "confirmemail_sendfailed": "{{SITENAME}} nun può mannà 'a mmasciata e-mail d' 'a vuosta 'e cunferma.\nPe' piacere cuntrullate si 'o nderizzo e-mail c'avite scritto tenesse cocche carattere nvalido.\n\nMmasciata d'errore a 'o mailer: $1",
+       "confirmemail_invalid": "'O codece 'e cunferma nun è bbuono.\n'O codece fosse ammaturato.",
        "confirmemail_needlogin": "Abbesognate $1 pe cunfirmà 'o nnerizzo 'e e-mail d''o vuosto.",
+       "confirmemail_success": "'O ndirizzo e-mail d' 'o vuosto è stato cunfermato.\nVuje mò ne putite [[Special:UserLogin|trasì]] e ve putite spassà ncopp' 'a wiki.",
        "confirmemail_loggedin": "'O nnerizzo 'e e-mail è vàleto",
+       "confirmemail_subject": "Indirizzo e-mail 'e cunferma pe' {{SITENAME}}",
+       "confirmemail_body": "Coccheruno, può darse ca site vuje, 'a l'indirizzo IP $1,\nha riggistrato nu cunto utente \"$2\" cu st'indirizzo e-mail ncopp'a {{SITENAME}}.\n\nPe' putè cunfermà ca stu cunto è stato overo criato e vuje e ve putè apiccià 'a funziona e-mail 'e {{SITENAME}}, arapite stu cullegamento dint' 'o navigatóre web d' 'o vuosto:\n\n$3\n\nSi vuje *NUN* avite riggistrato 'o cunto utente, secutate stu cullegamento pe' ve scancellà st'indirizzo e-mail utente:\n\n$5\n\nStu codece 'e cunferma murarrà 'o $4.",
+       "confirmemail_body_changed": "Coccheruno, può darse ca site vuje, 'a l'indirizzo IP $1,\nha cagnato l'indirizzo e-mail d' 'o cunto utente \"$2\" cu st'indirizzo e-mail ncopp'a {{SITENAME}}.\n\nPe' putè cunfermà ca stu cunto è stato overo criato e vuje e ve putè apiccià n'ata vota 'a funziona e-mail 'e {{SITENAME}}, arapite stu cullegamento dint' 'o navigatóre web d' 'o vuosto:\n\n$3\n\nSi vuje *NUN* avite riggistrato 'o cunto utente, secutate stu cullegamento pe' ve scancellà st'indirizzo e-mail utente:\n\n$5\n\nStu codece 'e cunferma murarrà 'o $4.",
+       "confirmemail_body_set": "Coccheruno, può darse ca site vuje, 'a l'indirizzo IP $1,\nha mpustato nu cunto utente \"$2\" cu st'indirizzo e-mail ncopp'a {{SITENAME}}.\n\nPe' putè cunfermà ca stu cunto è stato overo criato e vuje e ve putè apiccià 'a funziona e-mail 'e {{SITENAME}}, arapite stu cullegamento dint' 'o navigatóre web d' 'o vuosto:\n\n$3\n\nSi vuje *NUN* avite riggistrato 'o cunto utente, secutate stu cullegamento pe' ve scancellà st'indirizzo e-mail utente:\n\n$5\n\nStu codece 'e cunferma murarrà 'o $4.",
+       "confirmemail_invalidated": "Cunferma 'e l'indirizze e-mail scangelleta",
+       "invalidateemail": "Scancella 'a cunferma 'e l'e-mail",
+       "scarytranscludedisabled": "['A funziona cullegamiento nfra site wiki è stata stutata]",
+       "scarytranscludefailed": "[L'analisi d' 'o template s'è scassato pe' $1]",
+       "scarytranscludefailed-httpstatus": "[L'analisi d' 'o template s'è scassato pe' $1: HTTP $2]",
+       "scarytranscludetoolong": "[URL è troppo luonga]",
        "deletedwhileediting": "Attenziòne: quaccherùno have scancellàto chesta pàggena doppo ca tu accuminciàste â scrìvere!",
+       "confirmrecreate": "L'utente [[User:$1|$1]] ([[User talk:$1|Chiacchiera]]) ha scancellato sta paggena aroppo ca l'avite accumminciato a cagnà, cu stu mutivo:\n: <em>$2</em>\nPe' piacere cunfermate ca vulite overamente crià sta paggena n'ata vota.",
+       "confirmrecreate-noreason": "L'utente [[User:$1|$1]] ([[User talk:$1|Chiacchiera]]) ha scancellato sta paggena aroppo ca l'avite accumminciato a cagnà. Pe' piacere cunfermate ca vulite overamente crià sta paggena n'ata vota.",
+       "recreate": "Crìa n'ata vota",
+       "confirm_purge_button": "OK",
+       "confirm-purge-top": "Pulezza 'a cache 'e sta paggena?",
+       "confirm-purge-bottom": "Pulezzanno 'a cache d' 'a paggena se può vedè 'a verziona cchiù agghiurnata d' 'a paggena.",
+       "confirm-watch-button": "OK",
+       "confirm-watch-top": "Vulite azzeccà sta paggena int' 'a lista 'e paggene cuntrullate vuosta?",
+       "confirm-unwatch-button": "OK",
+       "confirm-unwatch-top": "Vulite luvà sta paggena d' 'a lista 'e paggene cuntrullate vuosta?",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← paggena 'e primma",
+       "imgmultipagenext": "paggena successiva →",
+       "imgmultigo": "Vaje!",
+       "imgmultigoto": "Vaje ncopp' 'a paggena $1",
+       "img-lang-default": "(lengua predefinita)",
+       "img-lang-info": "Fà addeventà sta paggena comm'a $1. $2",
+       "img-lang-go": "Vaje",
+       "ascending_abbrev": "crisc",
+       "descending_abbrev": "dicrisc",
+       "table_pager_next": "Paggena successiva",
+       "table_pager_prev": "Paggena 'e primma",
+       "table_pager_first": "Primma paggena",
+       "table_pager_last": "Urdema paggena",
+       "table_pager_limit": "Mmusta $1 elemente pe' paggena",
+       "table_pager_limit_label": "Elemente pe' paggena:",
+       "table_pager_limit_submit": "Vaje",
+       "table_pager_empty": "Nisciuno resultato",
+       "autosumm-blank": "Pulezza 'a paggena",
+       "autosumm-replace": "Cuntenute scagnate cu '$1'",
        "autoredircomment": "Redirect â paggena [[$1]]",
        "autosumm-new": "Paggena criate ch''o: $1",
+       "autosumm-newblank": "Criata na paggena abbacante",
+       "lag-warn-normal": "'E cagnamiente cchiù nuove 'e $1 {{PLURAL:$1|secondo|seconde}} può darse ca nun se ponno vedé int'a sta lista.",
+       "lag-warn-high": "Pe' bbìa ca 'o server d' 'o database trica, 'e cagnamiente cchiù nuove 'e $1 {{PLURAL:$1|secondo|seconde}} può darse ca nun se ponno vedé dint'a sta lista.",
+       "watchlistedit-normal-title": "Cagna l'elenco 'e paggene cuntrullate",
+       "watchlistedit-normal-legend": "Lèva titule 'a l'elenco 'e paggene cuntrullate",
+       "watchlistedit-normal-explain": "'E titule ncopp'a l'elenco 'e paggene cuntrullate se mmustano ccà abbascio.\nPe' ne luvà nu titolo, ghienchite 'a casciulella ca se trova annanz' 'a cchesto, e fà click \"{{int:Watchlistedit-normal-submit}}\".\nPutite pure [[Special:EditWatchlist/raw|cagnà 'a lista a mmano]].",
+       "watchlistedit-normal-submit": "Lèva 'e titule",
+       "watchlistedit-normal-done": "{{PLURAL:$1|1 titolo è stato|$1 titule so' state}} luvate 'a l'elenco 'e paggene cuntrullate d' 'o vuosto:",
+       "watchlistedit-raw-title": "Cagna l'elenco 'e paggene cuntrullate ncruro",
+       "watchlistedit-raw-legend": "Cagna l'elenco 'e paggene cuntrullate ncruro",
+       "watchlistedit-raw-explain": "'E titule ncopp'a l'elenco 'e paggene cuntrullate se ponno cagnà si se lèvano 'a l'elenco;\nnu titolo ogne linea.\nQuanno è fernuto, clickate ncopp'a \"{{int:Watchlistedit-raw-submit}}\".<br />\nPutite pure [[Special:EditWatchlist|ausà 'o cagnatore standard]].",
+       "watchlistedit-raw-titles": "Titule:",
+       "watchlistedit-raw-submit": "Agghiurna l'elenco 'e paggene cuntrullate",
+       "watchlistedit-raw-done": "L'elenco 'e paggene cuntrullate è stato agghiurnato.",
+       "watchlistedit-raw-added": "{{PLURAL:$1|nu titolo è|$1 titule so'}} stat'azzeccate:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|nu titolo è stato luvato|$1 titule so' state luvate}}:",
+       "watchlistedit-clear-title": "Elenco 'e cuntrollo pulezzato",
+       "watchlistedit-clear-legend": "Pulezza l'elenco 'e paggene cuntrullate",
+       "watchlistedit-clear-explain": "Tutte sti titule se luvarranno 'a l'elenco 'e paggene cuntrullate vuosto",
+       "watchlistedit-clear-titles": "Titule:",
+       "watchlistedit-clear-submit": "Pulezza l'elenco 'e paggene cuntrullate (Chesto è pe' sempe!)",
+       "watchlistedit-clear-done": "L'elenco 'e paggene cuntrullate vuosto è stat'abbacantato.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|nu titolo è stato luvato|$1 titule so' state luvate}}:",
+       "watchlistedit-too-many": "Ce stanno troppe paggene 'a veré ccà.",
+       "watchlisttools-clear": "Abbacanta l'elenco 'e paggene cuntrullate",
+       "watchlisttools-view": "Vide 'e cagnamiente mpurtante",
+       "watchlisttools-edit": "Vide e cagna l'elenco 'e paggene cuntrullate",
+       "watchlisttools-raw": "Cagna l'elenco 'e paggene cuntrullate ncruro",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|chiacchiere]])",
+       "unknown_extension_tag": "Tag 'e stensione scanusciuto \"$1\"",
+       "duplicate-defaultsort": "<strong>Attenziò:</strong> A chiave d'arricetto \"$2\" se miette ncuollo a nu valore 'e primma \"$1\".",
+       "duplicate-displaytitle": "<strong>Attenziò:</strong> A chiave d'arricetto \"$2\" se scagna p' 'o valore 'e primma \"$1\".",
+       "version": "Verziona",
+       "version-extensions": "Estenziune installate",
+       "version-skins": "Skin installate",
+       "version-specialpages": "Paggene speciale",
+       "version-parserhooks": "Hook analizzature",
+       "version-variables": "Variabbele",
+       "version-antispam": "Funziune pe' se scanzà 'o spam",
+       "version-other": "Ato",
+       "version-mediahandlers": "Gestore d' 'e cuntenute multimediale",
+       "version-hooks": "Hook",
+       "version-parser-extensiontags": "Tag pe' l'estenziune 'e l'analizzatore",
+       "version-parser-function-hooks": "Funziune hook 'e l'analizzatore",
+       "version-hook-name": "Nomme d' 'o hook",
+       "version-hook-subscribedby": "Sottoscritto 'a",
+       "version-no-ext-name": "[nisciuno nomme]",
+       "version-license": "Licienza MediaWiki",
+       "version-ext-license": "Licienza",
+       "version-ext-colheader-name": "Stenzione",
+       "version-skin-colheader-name": "Aspetto grafeco (skin)",
+       "version-ext-colheader-version": "Verzione",
+       "version-ext-colheader-license": "Licienza",
+       "version-ext-colheader-description": "Descrizzione",
+       "version-ext-colheader-credits": "Auture",
+       "version-license-title": "Licienza pe' $1",
+       "version-license-not-found": "Pe' cheste stenziune nun ce sta nisciuna nfurmazione ndettaglio ncopp' 'a licienza.",
+       "version-credits-title": "Credite pe' $1",
+       "version-credits-not-found": "Pe' cheste stenziune nun ce sta nisciuna nfurmazione ndettaglio ncopp' 'e credite.",
+       "version-poweredby-credits": "Sta wiki funziona pe' bbìa 'e <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
+       "version-poweredby-others": "ati",
+       "version-poweredby-translators": "tradutture 'e translatewiki.net",
+       "version-credits-summary": "Nuje vulessemo tené a mmente 'e perzune ccà abbascio pe' purtà rispetto a 'e cuntribbute 'e lloro ncopp'a [[Special:Version|MediaWiki]].",
+       "version-license-info": "MediaWiki è nu software libbero; vuje 'o putite redestribbuì e/o cagnà sott' 'e termine d' 'a licienza GNU GPL ('a Licienza Pubbreca Generale) comme pubbrecata d' 'a Free Software Foundation; o pure 'a verziona 2 d' 'a Licienza, o pure (comme vulite vuje) 'a n'ata verziona cchiù nnova.\n\nMediaWiki è destribbuita c' 'a speranza d'essere utile, ma SENZA NISCIUNA GARANZIA; senza manco 'a garanzia p' 'a CUMMERCIABBELETÀ O IDONIETÀ PE' NU SCOPO PARTICOLARE. Iate a vedé 'a GNU GPL pe' n'avé cchiù nfurmaziune.\n\nAvísseve 'a ricevere [{{SERVER}}{{SCRIPTPATH}}/COPYING na copia d' 'a Licienza GNU GPL] cu stu prugramma; si nò, scrivete â 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 liggete sta paggena ncopp' 'a l'Internet].",
+       "version-software": "Software installato",
+       "version-software-product": "Prodotto",
+       "version-software-version": "Verziona",
+       "version-entrypoints": "Punte 'e trasuta 'e l'URL",
+       "version-entrypoints-header-entrypoint": "Punto 'e trasuta",
+       "version-entrypoints-header-url": "URL",
+       "redirect": "Rediretto 'a nu file, n'utente, na paggena o n'ID 'e na verziona",
+       "redirect-legend": "Rediretto ca spuntasse a nu file o na paggena",
+       "redirect-summary": "Sta pàggena speciale redireziona a nu file (dato 'o nomme d' 'o file), na pàggene (dato n'ID 'e verziona), o 'na pàggene utente (dato n'ID nummereca 'e l'utende). Ause: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
+       "redirect-submit": "Vaje",
+       "redirect-lookup": "Ascìa:",
+       "redirect-value": "Valore:",
+       "redirect-user": "ID utenza",
+       "redirect-page": "ID d' 'a paggena",
+       "redirect-revision": "Sarva revisione",
+       "redirect-file": "Nomme d\"o file",
+       "redirect-not-exists": "Valore nun accucchiato",
+       "fileduplicatesearch": "Ascìa 'e file duprecate",
+       "fileduplicatesearch-summary": "Circa pe' file duprecate cu bbase 'o valore hash.",
+       "fileduplicatesearch-legend": "Circa pe' nu duprecato",
+       "fileduplicatesearch-filename": "Nomme d' 'o file",
+       "fileduplicatesearch-submit": "Truova",
+       "fileduplicatesearch-info": "$1 × $2 pixel, dimenzione d' 'o file: $3<br />tipo MIME: $4",
+       "fileduplicatesearch-result-1": "'O file \"$1\" non ce tene nu duprecato eguale eguale.",
+       "fileduplicatesearch-result-n": "'O file \"$1\" tène {{PLURAL:$2|1 dupricazione|$2 dupricaziune}} eguale eguale.",
+       "fileduplicatesearch-noresults": "Nisciuno file chiamato \"$1\" è stato accucchiato.",
        "specialpages": "Paggene speciale",
+       "specialpages-note-top": "Liggenda",
+       "specialpages-note": "* Paggene speciale normale.\n* <span class=\"mw-specialpagerestricted\">Paggene speciale ch' 'e restriziune.</span>",
+       "specialpages-group-maintenance": "Report 'e manutenzione",
+       "specialpages-group-other": "Ati paggene speciale",
+       "specialpages-group-login": "Tràse o cria n'acciesso novo",
+       "specialpages-group-changes": "Cagnamiente 'e mò mò e riggistre",
+       "specialpages-group-media": "Riepileghe 'e media e carreche",
+       "specialpages-group-users": "Utente e deritte",
+       "specialpages-group-highuse": "Pàggene ausate assaje proprio",
+       "specialpages-group-pages": "Lista d' 'e paggene",
+       "specialpages-group-pagetools": "Strumiente p' 'e paggene",
+       "specialpages-group-wiki": "Data e strumiente",
+       "specialpages-group-redirects": "Redirezionamiente d' 'e paggene speciale",
+       "specialpages-group-spam": "Strumiente p' 'o spam",
+       "blankpage": "Paggene abbacante",
+       "intentionallyblankpage": "Sta paggena s'è lassata abbacante apposta",
+       "external_image_whitelist": "  #Lassate sta linea accussì accussì comme sta<pre>\n#Mettete piezze 'espressione regolare (chilla parta nfra 'e //) sotto\n#Chille s'azzeccano ch' 'e ndirizze URL 'e l'immaggine 'e fore (collegamiente cavere)\n#Chille cu nu cunfronto positivo sarranno mmustate comme immaggene, o pure comme a nu link a l'immaggine ca mmustano\n#Linee c'accumenciano pe' # songo trattate comme commente\n#Chist'è insenzitivo p' 'e maiuscole e minuscole\n\n#Mettete tutt' 'e piezze regex ncopp' 'a stalinea. Lassate sta linea eguale eguale comme 'a verite</pre>",
+       "tags": "Tag 'e cagnamiento valide",
        "tag-filter": "Filtra ppe [[Special:Tags|etichetta]]:",
-       "rightsnone": "(nisciuno)"
+       "tag-filter-submit": "Filtra",
+       "tags-title": "Etichette",
+       "tags-tag": "Nomme 'e ll'etichetta",
+       "tags-active-header": "Attivo?",
+       "tags-active-yes": "Sì",
+       "tags-active-no": "No",
+       "tags-edit": "càgna",
+       "tags-hitcount": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}",
+       "compare-page1": "Paggena 1",
+       "compare-page2": "Paggena 2",
+       "compare-rev1": "Vversione 1",
+       "compare-rev2": "Vversione 2",
+       "htmlform-submit": "Manna",
+       "htmlform-no": "No",
+       "htmlform-yes": "Sì",
+       "htmlform-cloner-delete": "Rimuove",
+       "rightsnone": "(nisciuno)",
+       "feedback-message": "Mmasciata:",
+       "feedback-cancel": "Canciella",
+       "feedback-close": "Fatto",
+       "searchsuggest-search": "Truova",
+       "api-error-filename-tooshort": "'O nomme d' 'o file è troppo curto.",
+       "api-error-filetype-banned": "Stu tipo 'e file nun è permesso.",
+       "duration-seconds": "$1 {{PLURAL:$1|secondo|seconde}}",
+       "duration-minutes": "$1 {{PLURAL:$1|minuto|minute}}",
+       "duration-hours": "$1 {{PLURAL:$1|ora|ore}}",
+       "duration-days": "$1 {{PLURAL:$1|juorno|juorne}}",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|secondo|seconde}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|secondo|seconde}}",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|byte}}",
+       "expand_templates_ok": "OK",
+       "expand_templates_preview": "Anteprimma",
+       "pagelang-name": "Paggena",
+       "pagelang-language": "Lengua",
+       "pagelang-select-lang": "Selezziona lengua",
+       "mediastatistics-header-unknown": "Scanusciuto",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-office": "Ufficio",
+       "mediastatistics-header-text": "Testuale",
+       "json-error-unknown": "Ce sta nu probblema c' 'o JSON. Errore: $1",
+       "json-error-state-mismatch": "Valore malamente furmato o nun buono p' 'o JSON",
+       "json-error-syntax": "Errore 'e sintasse",
+       "json-error-utf8": "'E carattere UTF-8 furmate malamente, probbabilmente nun se songhe ncodifecate bbuone",
+       "json-error-unsupported-type": "S'è dato nu valore pe' nu tipo ca nun se può ncodifecà"
 }
index 2efb817..8b72bad 100644 (file)
        "otherlanguages": "På andre språk",
        "redirectedfrom": "(Omdirigert fra $1)",
        "redirectpagesub": "Omdirigeringsside",
+       "redirectto": "Omdirigering til:",
        "lastmodifiedat": "Denne siden ble sist endret $1 kl. $2.",
        "viewcount": "Denne siden er vist {{PLURAL:$1|én gang|$1 ganger}}.",
        "protectedpage": "Låst side",
        "invalidtitle-knownnamespace": "Ugyldig tittel med navnerommet «$2» og teksten «$3»",
        "invalidtitle-unknownnamespace": "Ugyldig tittel med ukjent navneromsnummer $1 og teksten «$2»",
        "exception-nologin": "Ikke innlogget",
-       "exception-nologin-text": "[[Special:Userlogin|Logg inn]] for å kunne se siden eller utføre denne handlingen.",
+       "exception-nologin-text": "Logg inn for å kunne se siden eller utføre denne handlingen.",
        "exception-nologin-text-manual": "Du må $1 for å få tilgang til denne siden eller handlingen.",
        "virus-badscanner": "Feilkonfigurasjon: Ukjent virusskanner: ''$1''",
        "virus-scanfailed": "skanning mislyktes (kode $1)",
        "createaccount-text": "Noen opprettet en konto for din e-postadresse på {{SITENAME}} ($4) med navnet «$2», med «$3» som passord. Du burde logge inn og endre passordet nå.\n\nDu kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.",
        "login-throttled": "Du har prøvd å logge inn for mange ganger.\nVent $1 før du prøver på nytt.",
        "login-abort-generic": "Innleggingen ble avbrutt.",
+       "login-migrated-generic": "Kontoen din har blitt globalisert, og brukernavnet ditt finnes ikke lenger på denne wikien.",
        "loginlanguagelabel": "Språk: $1",
        "suspicious-userlogout": "Din forespørsel om å logge ut ble nektet fordi den så ut til å ha bli sendt av en ødelagt nettleser eller en mellomtjener.",
        "createacct-another-realname-tip": "Det er frivillig å oppgi ditt egentlige navn.\nHvis du velger å oppgi det, vil det blir anvendt for å gi deg som bruker anerkjennelse",
        "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-header": "Endre kontoens e-postadresse",
        "changeemail-text": "Fyll ut dette skjemaet for å endre din e-postadresse. Du må oppgi ditt passord for å bekrefte endringen.",
        "changeemail-no-info": "Du må være innlogget for å få direkte tilgang til denne siden.",
        "changeemail-oldemail": "Nåværende e-postadresse:",
        "changeemail-none": "(ingen)",
        "changeemail-password": "Ditt passord på {{SITENAME}}:",
        "changeemail-submit": "Endre e-post",
-       "changeemail-cancel": "Avbryt",
        "changeemail-throttled": "Du har foretatt for mange innloggingsforsøk. Vær vennlig å vente $1 før du prøver igjen.",
        "resettokens": "Nullstill merker",
        "resettokens-text": "Du kan nullstille nøklene som gir adgang til visse private data knyttet til din konto.\n\nOg du burde gjøre det hvis du har avslørt nøklene for noen.",
        "showpreview": "Forhåndsvisning",
        "showdiff": "Vis endringer",
        "blankarticle": "<strong>Advarsel:</strong> Siden du er i ferd med å opprette er tom.\nHvis du trykker \"{{int:savearticle}}\" en gang til, vil siden opprettes uten innhold.",
-       "anoneditwarning": "'''Advarsel:''' Du er ikke logget inn.\nIP-adressen din blir bevart i sidens redigeringshistorikk.",
-       "anonpreviewwarning": "''Du er ikke logget inn. Lagring vil registrere din IP-adresse i sidens redigeringshistorikk.''",
+       "anoneditwarning": "<strong>Advarsel:</strong> Du er ikke innlogget. IP-adressen din vil bli vist offentlig om du redigerer. Hvis du <strong>[$1 logger inn]</strong> eller <strong>[$2 oppretter en konto]</strong> vil redigeringene dine tilskrives brukernavnet ditt, og du vil få flere andre fordeler.",
+       "anonpreviewwarning": "<em>Du er ikke logget inn. Ved lagring vil IP-adressen din lagres i sidens redigeringshistorikk.</em>",
        "missingsummary": "'''Påminnelse:''' Du har ikke lagt inn en redigeringsforklaring.\nVelger du ''Lagre siden'' en gang til blir endringene lagret uten forklaring.",
        "missingcommenttext": "Vennligst legg inn en kommentar under.",
        "missingcommentheader": "'''Påminnelse:''' Du har ikke angitt et emne/overskrift for denne kommentaren.\nOm du trykker «{{int:savearticle}}» igjen vil redigeringen din bli lagret uten forklaring.",
        "parser-template-recursion-depth-warning": "Mal er brukt for mange ganger ($1)",
        "language-converter-depth-warning": "Dybdegrense for språkkonvertering overskredet ($1)",
        "node-count-exceeded-category": "Sider hvor antallet noder er overskredet",
-       "node-count-exceeded-category-desc": "En kategori for sider der antallet noder er overskredet.",
-       "node-count-exceeded-warning": "Siden har overskredet antallet noder",
+       "node-count-exceeded-category-desc": "Siden overskriver maksimalt nodeantall.",
+       "node-count-exceeded-warning": "Siden overskred nodeantallet",
        "expansion-depth-exceeded-category": "Sider hvor ekspansjonsdybden er overskredet",
-       "expansion-depth-exceeded-category-desc": "Dette er en kategori for sider hvor ekspansjonsdybden er overskredet.",
+       "expansion-depth-exceeded-category-desc": "Siden overskrider maksimal utvidingsdybde.",
        "expansion-depth-exceeded-warning": "Sida har overskredet ekspansjonsdybden",
        "parser-unstrip-loop-warning": "«Unstrip»-loop påvist",
        "parser-unstrip-recursion-limit": "Rekursjonsgrense for taggfjerning overskredet ($1)",
        "showhideselectedversions": "Vis/skjul valgte versjoner",
        "editundo": "fjern",
        "diff-empty": "(Ingen forskjell)",
-       "diff-multi-sameuser": "({{PLURAL:$1|En midlertidig revisjon|$1 midlertidige revisjoner}} av samme bruker vises ikke)",
-       "diff-multi-otherusers": "({{PLURAL:$1|En midlertidig revisjon|$1 midlertidige revisjoner}} av {{PLURAL:$2|en annen bruker|$2 brukere}} er ikke vist)",
+       "diff-multi-sameuser": "({{PLURAL:$1|En mellomliggende revisjon|$1 mellomliggende revisjoner}} av samme bruker vises ikke)",
+       "diff-multi-otherusers": "({{PLURAL:$1|En mellomliggende revisjon|$1 mellomliggende revisjoner}} av {{PLURAL:$2|en annen bruker|$2 brukere}} er ikke vist)",
        "diff-multi-manyusers": "({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av mer enn $2 {{PLURAL:$2|bruker|brukere}} vises ikke)",
        "difference-missing-revision": "{{PLURAL:$2|En revisjon|$2 revisjoner}} av denne forskjellen ($1) {{PLURAL:$2|ble|ble}} ikke funnet.\n\nDette skyldes som regel at en gammel forskjell-lenke er fulgt til en side som er slettet.\nDetaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
        "searchresults": "Søkeresultater",
        "searchrelated": "relatert",
        "searchall": "alle",
        "showingresults": "Nedenfor vises opptil {{PLURAL:$1|'''ett''' resultat|'''$1''' resultater}} fra og med nummer <b>$2</b>.",
-       "showingresultsinrange": "Nedenfor vises opptil {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resulter}} i området #<strong>$2</strong> til #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} for '''$4'''",
+       "showingresultsinrange": "Nedenfor vises opptil {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resulter}} i mellom nummer <strong>$2</strong> og nummer <strong>$3</strong>.",
+       "search-showingresults": "Resultat <strong>{{PLURAL:$4|$1|$1–$2}}</strong> av <strong>$3</strong>",
        "search-nonefound": "Ingen resultater passet til søket.",
        "powersearch-legend": "Avansert søk",
        "powersearch-ns": "Søk i navnerom:",
        "preferences": "Innstillinger",
        "mypreferences": "Innstillinger",
        "prefs-edits": "Antall redigeringer:",
-       "prefsnologintext2": "Vennligst $1 å endre dine preferanser.",
+       "prefsnologintext2": "Logg inn for å endre innstillingene dine.",
        "prefs-skin": "Utseende",
        "skin-preview": "Forhåndsvisning",
        "datedefault": "Ingen foretrukket",
        "youremail": "E-post:",
        "username": "{{GENDER:$1|Brukernavn}}:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} i følgende {{PLURAL:$1|gruppe|grupper}}:",
-       "prefs-registration": "Registreringstid:",
+       "prefs-registration": "Registreringstidspunkt:",
        "yourrealname": "Virkelig navn:",
        "yourlanguage": "Språk:",
        "yourvariant": "Språkvariant for innhold:",
        "reuploaddesc": "Avbryt opplasting og gå tilbake til opplastingsskjemaet",
        "upload-tryagain": "Send inn endret filbeskrivelse",
        "uploadnologin": "Ikke logget inn",
-       "uploadnologintext": "Du må $1 for å laste opp filer.",
+       "uploadnologintext": "Du må $1 for å kunne laste opp filer.",
        "upload_directory_missing": "Oppplastingsmappen ($1) mangler og kunne ikke opprettes av tjeneren.",
        "upload_directory_read_only": "Opplastingsmappa ($1) er ikke skrivbar for tjeneren.",
        "uploaderror": "Feil under opplasting av fil",
        "randomincategory": "Tilfeldig side innenfor kategorien",
        "randomincategory-invalidcategory": "«$1» er ikke et gyldig kategorinavn.",
        "randomincategory-nopages": "Det finnes ingen sider i [[:Category:$1|$1]]-kategorien.",
-       "randomincategory-selectcategory": "Hent en tilfeldig side fra kategori: $1 $2.",
-       "randomincategory-selectcategory-submit": "Start",
+       "randomincategory-category": "Kategori:",
+       "randomincategory-legend": "Tilfeldig side i kategori",
        "randomredirect": "Tilfeldig omdirigering",
        "randomredirect-nopages": "Det er ingen omdirigeringer i navnerommet $1.",
        "statistics": "Statistikk",
        "querypage-disabled": "Denne spesialsiden er deaktivert av ytelsesårsaker.",
        "booksources": "Bokkilder",
        "booksources-search-legend": "Søk etter bokkilder",
-       "booksources-go": "Søk",
+       "booksources-search": "Søk",
        "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:",
        "trackingcategories-desc": "Kategori-inklusjonskriterium",
        "noindex-category-desc": "Denne siden indekseres ikke av roboter fordi den er merket med det magiske ordet <code><nowiki>__NOINDEX__</nowiki></code> og er i navnerom der dette flagget tillates.",
        "index-category-desc": "Denne siden er påført det magiske ordet <code><nowiki>__INDEX__</nowiki></code> (og er i et navnerom hvor flagget er tillatt), og vil derfor bli indeksert av roboter selv når det normalt ikke ville skjedd.",
-       "post-expand-template-inclusion-category-desc": "Etter ekspandering av alle malene ble siden større enn <code>$wgMaxArticleSize</code>, så noen maler kunne ikke ekspanderes.",
-       "post-expand-template-argument-category-desc": "Etter ekspandering av et malargument (noe i trippel krøllparentes, slik som <code>{{{Foo}}})</code>, så er siden større en <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "For mange kostbare parserfunksjoner (som <code>#ifexist</code>) er inkludert på en side. Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Kategorien blir lagt til hvis siden inneholder en brutt fil-lenke (en lenke for å bygge inn en fil når filen selv ikke eksisterer).",
-       "hidden-category-category-desc": "Dette er en kategori merket med <code><nowiki>__HIDDENCAT__</nowiki></code>, som hindrer den fra å vises i siders kategorioversikt som standard.",
+       "post-expand-template-inclusion-category-desc": "Sidestørrelsen er større enn <code>$wgMaxArticleSize</code> etter at alle maler er utvidet, så noen maler ble ikke utvidet.",
+       "post-expand-template-argument-category-desc": "Siden er større enn <code>$wgMaxArticleSize</code> etter utvidelse av et malargument (noe i tre krøllparenteser, som <code>{{{foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Siden bruker for mange dyre parserfunksjoner (som <code>#ifexist</code>). Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Siden inneholder en ødelagt lenkefil (en lenke for å bygge inn en fil når filen ikke eksisterer).",
+       "hidden-category-category-desc": "Kategorien inneholder <code><nowiki>__HIDDENCAT__</code></nowiki> i sideinnholdet, hvilket gjør at den som standard ikke vises i kategorilisten på sider.",
        "trackingcategories-nodesc": "Ingen beskrivelse er tilgjengelig",
        "trackingcategories-disabled": "Kategorien er deaktivert",
        "mailnologin": "Ingen avsenderadresse",
        "mywatchlist": "Overvåkningsliste",
        "watchlistfor2": "For $1 $2",
        "nowatchlist": "Du har ingenting i overvåkningslisten.",
-       "watchlistanontext": "Vennligst $1 for å vise eller redigere sider på overvåkningslisten din.",
+       "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.",
        "unwatchthispage": "Fjerner overvåkning",
        "notanarticle": "Ikke en artikkel",
        "notvisiblerev": "Revisjonen er slettet",
-       "watchlist-details": "{{PLURAL:$1|Én side|$1 sider}} på din overvåkningsliste, teller ikke diskusjonssider.",
+       "watchlist-details": "Du har {{PLURAL:$1|én side|'''$1''' sider}} på [[Hjelp:Overvåke sider|overvåkningslisten]] din (pluss tilhørende [[Hjelp:Diskusjonsside|diskusjonssider]]).",
        "wlheader-enotif": "E-postvarsling er slått på.",
-       "wlheader-showupdated": "Sider som har blitt forandret siden du sist besøkte dem vises i '''fet tekst'''",
+       "wlheader-showupdated": "Sider som har blitt endret siden du besøkte dem sist vises med '''fet skrift'''.",
        "wlnote": "Nedenfor er {{PLURAL:$1|den siste endringen|de siste <strong>$1</strong> endringene}} {{PLURAL:$2|den siste timen|de siste <strong>$2</strong> timene}}, per $3 kl. $4",
-       "wlshowlast": "Vis siste $1 timer $2 dager $3",
+       "wlshowlast": "Vis siste $1 timer $2 dager",
        "watchlist-options": "Alternativ for overvåkningslisten",
        "watching": "Overvåker…",
        "unwatching": "Fjerner fra overvåkningsliste…",
        "exbeforeblank": "innholdet før siden ble tømt var: «$1»",
        "delete-confirm": "Slett «$1»",
        "delete-legend": "Slett",
-       "historywarning": "Advarsel: Siden du er i ferd med å slette har en historikk med omtrent {{PLURAL:$1|én revisjon|$1 revisjoner}}:",
+       "historywarning": "<strong>Advarsel:</strong> Siden du er i ferd med å slete har en historikk med $1 {{PLURAL:$1|revisjon|revisjoner}}:",
        "confirmdeletetext": "Du holder på å slette en side sammen med historikken.\nBekreft at du virkelig vil slette denne siden, at du forstår konsekvensene og at du gjør det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinjene]].",
        "actioncomplete": "Gjennomført",
        "actionfailed": "Handling mislyktes",
        "delete-edit-reasonlist": "Rediger begrunnelser for sletting",
        "delete-toobig": "Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Muligheten til å slette slike sider er begrenset for å unngå utilsiktet forstyrring av {{SITENAME}}.",
        "delete-warning-toobig": "Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Sletting av denne siden kan forstyrre databasen til {{SITENAME}}; vær varsom.",
+       "deleteprotected": "Du kan ikke slette denne siden fordi den er beskyttet.",
        "deleting-backlinks-warning": "'''Advarsel:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Andre sider]] lenker til eller inkluderer siden du er i ferd med å slette.",
        "rollback": "Fjern redigeringer",
        "rollback_short": "Tilbakestill",
        "autoblockid": "Autoblokker #$1",
        "block": "Blokker bruker",
        "unblock": "Fjern blokkering av bruker",
-       "blockip": "Blokker bruker",
+       "blockip": "Blokker {{GENDER:$1|bruker}}",
        "blockip-legend": "Blokker bruker",
        "blockiptext": "Bruk skjemaet under for å blokkere en IP-adresses tilgang til å redigere artikler. Dette må kun gjøres for å forhindre hærverk, og i overensstemmelse med [[{{MediaWiki:Policy-url}}|retningslinjene]]. Fyll ut en spesiell begrunnelse under.",
        "ipaddressorusername": "IP-adresse eller brukernavn",
        "ipb-unblock-addr": "Avblokker $1",
        "ipb-unblock": "Avblokker et brukernavn eller en IP-adresse",
        "ipb-blocklist": "Vis gjeldende blokkeringer",
-       "ipb-blocklist-contribs": "Bidrag fra $1",
+       "ipb-blocklist-contribs": "Bidrag fra {{GENDER:$1|$1}}",
        "unblockip": "Opphev blokkering",
        "unblockiptext": "Bruk skjemaet under for å gjenopprette skriveadgangen for en tidligere blokkert adresse eller bruker.",
        "ipusubmit": "Opphev blokkering",
        "unblocked": "[[User:$1|$1]] ble avblokkert",
        "unblocked-range": "$1 har fått løftet blokkeringen",
        "unblocked-id": "Blokkering $1 ble fjernet",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] har blitt avblokkert.",
        "blocklist": "Blokkerte brukere",
        "ipblocklist": "Blokkerte IP-adresser og brukernavn",
        "ipblocklist-legend": "Finn en blokkert bruker",
        "change-blocklink": "endre blokkering",
        "contribslink": "bidrag",
        "emaillink": "send e-post",
-       "autoblocker": "Du ble automatisk blokkert fordi din IP-adresse nylig ble brukt av «[[User:$1|$1]]». Grunnen som ble gitt til at «$1» ble blokkert var: «$2».",
+       "autoblocker": "Du ble automatisk blokkert fordi IP-adressen din nylig ble brukt av «[[User:$1|$1]]». Grunnen som ble gitt til at «$1» ble blokkert var: «$2».",
        "blocklogpage": "Blokkeringslogg",
        "blocklog-showlog": "Denne brukeren har blitt blokkert før.\nBlokkeringsloggen vises nedenfor.",
        "blocklog-showsuppresslog": "Denne brukeren har tidligere blitt blokkert og skjult.\nSkjulingsloggen vises nedenfor.",
        "ip_range_toolarge": "Blokkering av IP-serier større enn /$1 er ikke tillatt.",
        "proxyblocker": "Proxyblokker",
        "proxyblockreason": "IP-adressen din ble blokkert fordi den er en åpen proxy. Kontakt internettleverandøren din eller teknisk støtte og informer dem om dette alvorlige sikkerhetsproblemet.",
-       "sorbsreason": "Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}.",
+       "sorbsreason": "IP-adressen din er listet som en åpen proxy i DNSBL-en brukt av {{SITENAME}}.",
        "sorbs_create_account_reason": "Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}. Du kan ikke opprette en konto",
        "xffblockreason": "En IP-adresse som er tilstede i X-Forwarded-For-headeren, enten din eller en som tilhører en proxyserver du bruker, har blitt blokkert. Den opprinnelige blokkeringsgrunnen var: $1",
        "cant-see-hidden-user": "Brukeren du prøver å blokkere har allerede blitt blokkert og skjult. Ettersom du ikke har rett til å skjule brukere (hideuser), kan du ikke se eller endre brukerens blokkering.",
        "import": "Importer sider",
        "importinterwiki": "Transwiki-importering",
        "import-interwiki-text": "Velg en wiki og en side å importere. Revisjonsdatoer og bidragsyteres navn blir bevart. Alle transwiki-importeringer listes i [[Special:Log/import|importloggen]].",
-       "import-interwiki-source": "Kildewiki/side:",
+       "import-interwiki-sourcewiki": "Kildewiki:",
+       "import-interwiki-sourcepage": "Kildeside:",
        "import-interwiki-history": "Kopier all historikk for denne siden",
        "import-interwiki-templates": "Inkluder alle maler",
        "import-interwiki-submit": "Importer",
        "exif-urgency-low": "Lav ($1)",
        "exif-urgency-high": "Høy ($1)",
        "exif-urgency-other": "Brukerdefinert prioritet ($1)",
-       "watchlistall2": "alle",
        "namespacesall": "alle",
        "monthsall": "alle",
        "confirmemail": "Bekreft e-postadresse",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|lastet opp}} en ny versjon av $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|lastet opp}} $3",
        "rightsnone": "(ingen)",
+       "revdelete-summary": "redigeringssammendrag",
        "feedback-bugornote": "Hvis du er klar til å sende inn en detaljert feilrapport, vennligst [$1 rapporter en feil].\nOm det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. Kommentaren din vil bli lagt til siden \"[$3 $2]\", sammen med brukernavnet ditt og informasjon om hvilken nettleser du bruker.",
        "feedback-subject": "Emne:",
        "feedback-message": "Melding:",
        "log-name-pagelang": "Endre språklogg",
        "log-description-pagelang": "Dette er en logg som viser endringer i sidespråk",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|endret}} sidespråk for $3 fra $4 til $5.",
-       "default-skin-not-found": "Ops! Standarddrakten for wikien din (<code>$wgDefaultSkin</code>), <code>$1</code>, er ikke tilgjengelig.\n\nInstallasjonen din inkluderer følgende drakter. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for informasjon om hvordan du an slå det på og velge en standarddrakt.\n\n$2\n\n; Om du nettopp har installert MediaWiki:\n: Du har trolig installert fra git, eller direkte fra kildekoden med en annen metode. Dette er forventet.\n:* Prøv å installere flere drakter fra [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.orgs draktbase]\n:* Last ned [https://www.mediawiki.org/wiki/Download tarball-installereren], som kommer med flere drakter og utvidelser. Du kan kopiere og lime inn <code>skins/</code>-mappen fra denne.\n: Å gjøre dette skal ikke forstyrre git-mappen din om du er en MediaWiki-utvikler.\n\n; Om du nettopp har oppgradert MediaWiki:\n: MediaWiki 1.24 og nyere slår ikke lenger automatisk på installerte drakter (se [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). du kan lime inn følgende linjer i <code>LocalSettings.php</code> for å slå på alle installerte drakter:\n\n<pre>$3</pre>\n\n; Om du nettopp har endret <code>LocalSettings.php</code>:\n: Dobbeltsjekk draktnavnene for skrivefeil.",
+       "default-skin-not-found": "Ops! Standarddrakten for wikien din (<code>$wgDefaultSkin</code>), <code>$1</code>, er ikke tilgjengelig.\n\nInstallasjonen din ser ut til å inneholde følgende drakter. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for informasjon om hvordan du kan slå disse på eller heller velge en standarddrakt.\n\n$2\n\n; Om du nettopp har installert MediaWiki:\n: Du har trolig installert fra git, eller direkte fra kildekoden med en annen metode. Dette er forventet. Prøv å installere noen drakter fra [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org sin draktbase] ved å\n:* laste ned [https://www.mediawiki.org/wiki/Download tarball-installereren], som kommer med flere drakter og utvidelser. Du kan kopiere og lime inn <code>skins/</code>-mappen fra denne.\n:* klone en av <code>mediawiki/skins/*</code>-lagrene via git inn i <code>skins/</code> -mappen av din MediaWiki-installasjon.\n: Å gjøre dette skal ikke forstyrre git-mappen din om du er en MediaWiki-utvikler.\n\n; Om du nettopp har oppgradert MediaWiki:\n: MediaWiki 1.24 og nyere slår ikke lenger på automatisk installerte drakter (se [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Du kan lime inn følgende linjer i <code>LocalSettings.php</code> for å slå på alle installerte drakter:\n\n<pre>$3</pre>\n\n; Om du nettopp har endret <code>LocalSettings.php</code>:\n: Dobbelsjekk draktnavnene for skrivefeil.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (slått på)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''slått av''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''slått av''')",
+       "mediastatistics": "Mediestatistikk",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3 %)",
+       "mediastatistics-table-mimetype": "MIME-type",
+       "mediastatistics-table-extensions": "Mulige filtyper",
+       "mediastatistics-table-count": "Antall filer",
+       "mediastatistics-table-totalbytes": "Kombinert størrelse",
+       "mediastatistics-header-unknown": "Ukjent",
+       "mediastatistics-header-bitmap": "Bitmap-bilder",
+       "mediastatistics-header-drawing": "Tegninger (vektor-bilder)",
+       "mediastatistics-header-audio": "Lyd",
+       "mediastatistics-header-video": "Videoer",
+       "mediastatistics-header-executable": "Kjørbare filer",
+       "mediastatistics-header-archive": "Komprimerte formater",
+       "json-warn-trailing-comma": "$1 etterfølgende {{PLURAL:$1|komma|kommaer}} ble fjernet fra JSON",
+       "json-error-state-mismatch": "Ugyldig JSON",
+       "json-error-syntax": "Syntaksfeil"
 }
index 63be861..c8b20c9 100644 (file)
        "passwordreset-emailsent-capture": "Der is n bericht verstuurd um joew wachtwoord opniej in te stellen. Dit ku'j hieronder lezen.",
        "passwordreset-emailerror-capture": "Der is n bericht veur t opniej opstellen van joew wachwoord an-emaakt, dit ku'j hieronder lezen. t Versturen naor de {{GENDER:$2|gebruker}} is mislokt um de volgende reden: $1",
        "changeemail": "Wiezig netpostadres",
-       "changeemail-header": "Netpostadres wiezigen",
        "changeemail-text": "Vul dit formulier in um joew netpostadres te wiezigen. Um disse wieziging te bevestigen mu'j je wachtwoord invoeren.",
        "changeemail-no-info": "Je mutten an-emeld ween um drekt toegang te hebben tot disse zied.",
        "changeemail-oldemail": "t Ouwe netpostadres:",
        "changeemail-none": "(gien)",
        "changeemail-password": "Joew wachtwoord veur {{SITENAME}}:",
        "changeemail-submit": "Netpostadres wiezigen",
-       "changeemail-cancel": "Aofbreken",
        "resettokens": "Tokens ongedaonmaken",
        "resettokens-text": "Je kunnen hier tokens opniej instellen die toegang geven tot bepaolde persoonlike gegevens die ekoppeld bin an joew gebruker.\n\nDo dit a'j ze per ongelok mit ene edeeld hebben of as onbevoegden toegang ekregen hebben tot joew gebruker.",
        "resettokens-no-tokens": "Der bin gien tokens um ongedaon te maken.",
        "searchrelated": "verwaant",
        "searchall": "alles",
        "showingresults": "Hieronder {{PLURAL:$1|steet '''1''' resultaot|staon '''$1''' resultaoten}}  <b>$1</b> vanaof nummer <b>$2</b>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultaot '''$1''' van '''$3'''|Resultaoten '''$1 - $2''' van '''$3'''}} veur '''$4'''",
        "search-nonefound": "Der bin gien resultaoten veur de zeukopdrachte.",
        "powersearch-legend": "Uutebreid zeuken",
        "powersearch-ns": "Zeuken in naamruumten:",
        "randomincategory": "Netzelde welke zied in n kategorie",
        "randomincategory-invalidcategory": "\"$1\" is gien geldige kategorienaam.",
        "randomincategory-nopages": "Der bin gien ziejen in [[:Category:$1]].",
-       "randomincategory-selectcategory": "Netzelde welke zied uut de kategorie: $1 $2",
-       "randomincategory-selectcategory-submit": "Laot kulen",
        "randomredirect": "Netzelde welke deurverwiezing",
        "randomredirect-nopages": "Der staon gien deurverwiezingen in de naamruumte \"$1\".",
        "statistics": "Staotistieken",
        "querypage-disabled": "Disse spesiale zied is uutezet um prestasieredens.",
        "booksources": "Boekinformasie",
        "booksources-search-legend": "Zeuk informasie over n boek",
-       "booksources-go": "Zeuk",
        "booksources-text": "Hieronder steet n lieste mit verwiezingen naor aandere websteeën die nieje of wat ouwere boeken verkopen, en daor hebben ze warschienlik meer informasie over t boek da'j zeuken:",
        "booksources-invalid-isbn": "De op-egeven ISBN klop niet; kiek effen nao o'j gien fout emaakt hebben bie de invoer.",
        "specialloguserlabel": "Uutvoerende gebruker:",
        "wlheader-enotif": "Je kriegen bericht per netpost",
        "wlheader-showupdated": "Ziejen die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
        "wlnote": "Hieronder {{PLURAL:$1|steet de leste wieziging|staon de leste $1 wiezigingen}} in {{PLURAL:$2|t aofgeleupen ure|de leste $2 uren}} vanaof $3 um $4.",
-       "wlshowlast": "Laot de veurbieje $1 uur $2 dagen $3 zien",
+       "wlshowlast": "Laot de veurbieje $1 uur $2 dagen  zien",
        "watchlist-options": "Opsies veur de volglieste",
        "watching": "Volg...",
        "unwatching": "Niet volgen...",
        "import": "Ziejen invoeren",
        "importinterwiki": "Transwiki-invoer",
        "import-interwiki-text": "Kies n wiki en ziednaam um in te voeren.\nVersie- en auteursgegevens blieven hierbie beweerd.\nAlle transwiki-invoerhaandelingen wörden op-esleugen in t [[Special:Log/import|invoerlogboek]].",
-       "import-interwiki-source": "Bronwiki/zied:",
        "import-interwiki-history": "Kopieer de hele geschiedenisse veur disse zied",
        "import-interwiki-templates": "Alle mallen opnemen",
        "import-interwiki-submit": "Invoeren",
        "exif-urgency-low": "Leeg ($1)",
        "exif-urgency-high": "Hoog ($1)",
        "exif-urgency-other": "Deur gebruker in-estelde prioriteit ($1)",
-       "watchlistall2": "alles",
        "namespacesall": "alles",
        "monthsall": "alles",
        "confirmemail": "Bevestig netpostadres",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|hef}} t groepslidmaotschap ewiezigd veur $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automaties bevorderd van $4 tot $5",
        "rightsnone": "(gien)",
+       "revdelete-summary": "samenvatting bewarken",
        "feedback-bugornote": "A'j zovere bin um n technies probleem nauwkeurig te beschrieven, [$1 meld dan n programmafout].\nAanders ku'j oek t eenvoudige formulier hieronder gebruken. Joew kommentaar zal op de zied \"[$3 $2]\" ezet wörden, samen mit joew gebrukersnaam en de webkieker die'j gebruken.",
        "feedback-subject": "Onderwarp:",
        "feedback-message": "Bericht:",
index 109f0ff..fa1a84d 100644 (file)
        "passwordreset-email": "E-Mail-Adress:",
        "changeemail": "E-Mail-Adress ännern",
        "changeemail-newemail": "Nee E-Mail-Adress:",
-       "changeemail-cancel": "Afbreken",
        "bold_sample": "Fetten Text",
        "bold_tip": "Fetten Text",
        "italic_sample": "Kursiven Text",
        "searchrelated": "verwandt",
        "searchall": "all",
        "showingresults": "Hier {{PLURAL:$1|is een Resultat|sünd '''$1''' Resultaten}}, anfungen mit #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resultaat '''$1''' vun '''$3'''|Resultaten '''$1 - $2''' vun '''$3'''}} för '''$4'''",
        "search-nonefound": "För de Söökanfraag geev dat keen Resultaten.",
        "powersearch-legend": "Betere Söök",
        "powersearch-ns": "Söök in Naamrüüm:",
        "suppress": "Oversight",
        "booksources": "Bookhannel",
        "booksources-search-legend": "Na Böker bi Bookhökers söken",
-       "booksources-go": "Los",
        "booksources-text": "Hier staht Lenken na Websteden, woneem dat Böker to köpen gifft, de mitünner ok mehr Informatschonen to dat Book anbeden doot:",
        "booksources-invalid-isbn": "Süht ut, as wenn de angeven ISBN ungüllig is. Villicht hett dat en Fehler bi’t Afschrieven oder Koperen geven.",
        "specialloguserlabel": "Bruker:",
        "wlheader-enotif": "Benarichtigen per E-Mail is anstellt.",
        "wlheader-showupdated": "Sieden, de siet dien letzten Besöök ännert worrn sünd, warrt '''fett''' wiest.",
        "wlnote": "Ünnen {{PLURAL:$1|steiht de letzte Ännern|staht de letzten $1 Ännern}} vun de {{PLURAL:$2|letzte Stünn|letzten '''$2''' Stünnen}}.",
-       "wlshowlast": "Wies de letzten $1 Stünnen $2 Daag $3",
+       "wlshowlast": "Wies de letzten $1 Stünnen $2 Daag",
        "watchlist-options": "Optionen för de Oppasslist",
        "watching": "warrt op de Oppasslist ropsett...",
        "unwatching": "warrt vun de Oppasslist rünnernahmen...",
        "import": "Import vun Sieden",
        "importinterwiki": "Transwiki-Import",
        "import-interwiki-text": "Wähl en Wiki un en Siet för dat Importeren ut.\nDe Versionsdaten un Brukernaams blievt dor bi vörhannen.\nAll Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import-Logbook]].",
-       "import-interwiki-source": "Bornwiki/sied:",
        "import-interwiki-history": "Importeer all Versionen vun disse Siet",
        "import-interwiki-templates": "All Vörlagen inslaten",
        "import-interwiki-submit": "Rinhalen",
        "exif-iimcategory-sci": "Wetenschap un Technologie",
        "exif-iimcategory-spo": "Sport",
        "exif-iimcategory-wea": "Wedder",
-       "watchlistall2": "alle",
        "namespacesall": "alle",
        "monthsall": "alle",
        "confirmemail": "Nettbreefadress bestätigen",
        "revdelete-restricted": "Inschränkungen för Administraters instellt",
        "revdelete-unrestricted": "Inschränkungen för Administraters rutnahmen",
        "rightsnone": "(kene)",
+       "revdelete-summary": "Tosamenfaten",
        "expandtemplates": "Vörlagen oplösen",
        "expand_templates_intro": "Mit disse Spezialsied köönt Vörlagen in ingeven Text in Wikitext ümwannelt warrn.\nOk Parserfunkschonen so as\n<nowiki>{{</nowiki>#language:…}}, un Variabeln so as\n<nowiki>{{</nowiki>CURRENTDAY}} warrt ümwannelt. Also so temlich allens, wat twischen swiefte Klammern steit.\nDorto warrt de nödigen Parser-Phasen in MediaWiki direkt opropen.",
        "expand_templates_title": "Kontexttitel, för {{FULLPAGENAME}} etc.:",
index 80dca86..33d401d 100644 (file)
        "passwordreset-emailsent": "पासवर्ड परिवर्तनको लागि इमेल पठाइएको छ।",
        "passwordreset-emailsent-capture": "पासवर्ड परिवर्तनको लागि इमेल पठाइयो, जुन तल देखाइएकोछ।",
        "changeemail": "इमेल ठेगाना परिवर्तन गर्नुहोस",
-       "changeemail-header": "खाताको इमेल ठेगाना परिवर्तन गर्नुहोस",
        "changeemail-text": "आफ्नो इमेल ठेगाना परिवर्तन गर्न यो फारम भर्नुहोस। यसलाई पुष्टि गर्न तपाईले आफ्नो पासवर्ड हाल्नु पर्नेछ।",
        "changeemail-no-info": "यस पृष्ठमा सिधै जानको लागि प्रवेश गर्नु पर्ने हुन्छ ।",
        "changeemail-oldemail": "हालको इमेल-ठेगाना:",
        "changeemail-newemail": "नयाँ इमेल-ठेगाना:",
        "changeemail-none": "(कुनै पनि हैन)",
        "changeemail-submit": "इमेल परिवर्तन गर्ने",
-       "changeemail-cancel": "रद्द गर्ने",
        "resettokens": "टोकन पूर्वरुपमा फर्काउने",
        "resettokens-no-tokens": "पूर्वरुपमा फर्काउन कुनै पनि टोकन छैन ।",
        "resettokens-legend": "टोकनहरू पूर्वरुपमा फर्काउने",
        "searchrelated": "सम्बन्धित",
        "searchall": "सबै",
        "showingresults": "देखाउँदै  {{PLURAL:$1|'''१''' नतिजा|'''$1''' नतिजाहरू }} , #'''$2''' बाट सुरुहुने ।",
-       "showingresultsheader": "{{PLURAL:$5|नतिजा '''$1''' को '''$3'''|नतिजाहरु '''$1 - $2''' को'''$3'''}}  ,'''$4''' को लागि",
        "search-nonefound": "तपाईँको क्वेरीसँग मेल खाने नतिजाहरू भेटिएनन्",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "नेमस्पेसेजहरुमा खोज्ने :",
        "unusedtemplateswlh": "अन्य कड़ीहरु",
        "randompage": "कुनै एक लेख",
        "randompage-nopages": "{{PLURAL:$2| $1 नाम भएको कुनै पृष्ट छैन|$1 नाम भएका कुनै पृष्टहरु छैनन्}}",
-       "randomincategory-selectcategory-submit": "जाने",
        "randomredirect": "कुनै एउटा अनुप्रेषितमा जाने",
        "randomredirect-nopages": "\"$1\" नामस्थानमा अनुप्रेषित छैन।",
        "statistics": "तथ्यांक",
        "suppress": "अतिदृष्टि",
        "booksources": "किताबका श्रोतहरु",
        "booksources-search-legend": "किताबका श्रोतहरु खोज्ने",
-       "booksources-go": "जाउ",
        "specialloguserlabel": "निष्पादक:",
        "speciallogtitlelabel": "लक्ष्य (शीर्षक वा प्रयोगकर्ता)",
        "log": "लगहरु",
        "wlheader-enotif": "ईमेल जानकारी सक्रिय गरियो ।",
        "wlheader-showupdated": "तपाईँले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई <strong>गाढा<strong> गरेर देखाइएको छ ।",
        "wlnote": "$3 र $4 अनुसार विगत {{PLURAL:$2|घण्टामा|'''$2''' घण्टाहरुमा}} {{PLURAL:$1|गरिएको अन्तिम परिवर्तन तल दिइएकोछ|गरिएका अन्तिम  '''$1''' परिवर्तनहरु तल दिइएका छन्}}।",
-       "wlshowlast": "पछिल्ला $2 दिनहरूका $3 $1 घण्टाहरूका देखाउनुहोस्",
+       "wlshowlast": "पछिल्ला $2 दिनहरूका  $1 घण्टाहरूका देखाउनुहोस्",
        "watchlist-options": "निगरानि सूची विकल्प",
        "watching": "निगरानी गर्दै...",
        "unwatching": "निगरानीबाट हटाउँदै...",
        "thumbnail_image-missing": "फाइल हराएको भान भइरहेछ: $1",
        "import": "पृष्ठहरू आयात गर्नुहोस्",
        "importinterwiki": "Transwiki आयात",
-       "import-interwiki-source": "स्रोत विकि/ पृष्ठ :",
        "import-interwiki-history": "यो पृष्ठकोलागि सबै इतिहास संशोधनहरु प्रतिलिपि गर्ने",
        "import-interwiki-templates": "सबै टेम्प्लेटहरु(नमुना) समेट्ने",
        "import-interwiki-submit": "आयात",
        "exif-urgency-low": "न्युन ($1)",
        "exif-urgency-high": "उच्च ($1)",
        "exif-urgency-other": "प्रयोगकर्ताले निर्धारण गरेको प्राथमिकता ($1)",
-       "watchlistall2": "सबै",
        "namespacesall": "सबै",
        "monthsall": "सबै",
        "confirmemail": "इमेल ठेगाना पक्का गर्नुहोस्",
        "revdelete-unrestricted": "प्रवन्धककोलागि निषेधहरु हटाइयो ।",
        "logentry-move-move": "$1 द्वारा $3 पृष्ठलाई $4 मा सारियो",
        "rightsnone": "(कुनैपनि होइन)",
+       "revdelete-summary": "सम्पादन सारांश",
        "feedback-subject": "विषय:",
        "feedback-message": "सन्देश:",
        "feedback-cancel": "रद्द गर्ने",
index c36559c..affc51a 100644 (file)
@@ -59,7 +59,8 @@
                        "Mar(c)",
                        "Calak",
                        "Arg",
-                       "NCoppens"
+                       "NCoppens",
+                       "Josse.Cottenier"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "otherlanguages": "In andere talen",
        "redirectedfrom": "(Doorverwezen vanaf $1)",
        "redirectpagesub": "Doorverwijspagina",
+       "redirectto": "Doorverwijzen naar:",
        "lastmodifiedat": "Deze pagina is het laatst bewerkt op $1 om $2.",
        "viewcount": "Deze pagina is {{PLURAL:$1|één keer|$1 keer}} bekeken.",
        "protectedpage": "Beveiligde pagina",
        "createaccount-text": "Iemand heeft een gebruiker op {{SITENAME}} ($4) aangemaakt met de naam \"$2\" en uw e-mailadres.\nHet wachtwoord voor \"$2\" is \"$3\".\nMeld u aan en wijzig uw wachtwoord.\n\nNegeer dit bericht als deze gebruiker zonder uw medeweten is aangemaakt.",
        "login-throttled": "U heeft recentelijk te veel mislukte aanmeldpogingen gedaan.\nWacht alstublieft $1 voordat u het opnieuw probeert.",
        "login-abort-generic": "U bent niet aangemeld. De procedure is afgebroken.",
+       "login-migrated-generic": "Uw account is verplaatst, en uw gebruikersnaam bestaat niet langer op deze wiki.",
        "loginlanguagelabel": "Taal: $1",
        "suspicious-userlogout": "Uw verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.",
        "createacct-another-realname-tip": "Echte naam is optioneel.\nAls u deze opgeeft, wordt deze naam gebruikt worden om u erkenning te geven voor uw werk.",
        "passwordreset-emailsent-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden. Deze wordt hieronder weergegeven.",
        "passwordreset-emailerror-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de {{GENDER:$2|gebruiker}} is mislukt om de volgende reden: $1",
        "changeemail": "E-mailadres wijzigen",
-       "changeemail-header": "Het e-mailadres van mijn gebruiker wijzigen",
        "changeemail-text": "Vul dit formulier in om uw e-mailadres te wijzigen. U moet uw wachtwoord invoeren om deze wijziging te bevestigen.",
        "changeemail-no-info": "U moet aangemeld zijn om rechtstreeks toegang te hebben tot deze pagina.",
        "changeemail-oldemail": "Huidig e-mailadres:",
        "changeemail-none": "(geen)",
        "changeemail-password": "Uw wachtwoord voor {{SITENAME}}:",
        "changeemail-submit": "E-mailadres wijzigen",
-       "changeemail-cancel": "Annuleren",
        "changeemail-throttled": "U heeft recentelijk te veel mislukte aanmeldpogingen gedaan.\nWacht alstublieft $1 voordat u het opnieuw probeert.",
        "resettokens": "Tokens opnieuw instellen",
        "resettokens-text": "U kunt hier tokens opnieuw instellen die toegang tot bepaalde persoonlijke gegevens die zijn gekoppeld aan uw gebruiker.\n\nDoe dit als u ze per ongeluk met iemand hebt gedeeld of als uw onbevoegden toegang hebben gekregen tot uw gebruiker.",
        "showpreview": "Bewerking ter controle bekijken",
        "showdiff": "Wijzigingen bekijken",
        "blankarticle": "<strong>Waarschuwing:</strong> de pagina die u wilt aanmaken is leeg.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt de pagina aangemaakt zonder enige inhoud.",
-       "anoneditwarning": "'''Waarschuwing:''' u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt.",
+       "anoneditwarning": "<strong>Waarschuwing:</strong> u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt. Wanneer u <strong>[$1 inlogt]</strong> of <strong>[$2 een account maakt]</strong zullen uw bewerkingen verschijnen onder u gebruikersnaam, met ook andere voordelen.",
        "anonpreviewwarning": "''U bent niet aangemeld.''\n''Door uw bewerking op te slaan wordt uw IP-adres opgeslagen in de paginageschiedenis.''",
        "missingsummary": "'''Let op:''' u hebt geen bewerkingssamenvatting opgegeven.\nAls u nogmaals op \"{{int:savearticle}}\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
        "missingcommenttext": "Plaats uw reactie hieronder.",
        "rev-deleted-event": "(logboekregel verwijderd)",
        "rev-deleted-user-contribs": "[gebruikersnaam of IP-adres verwijderd - bewerking verborgen in bijdragen]",
        "rev-deleted-text-permission": "Deze bewerking is '''verwijderd'''.\nEr kunnen details aanwezig zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
+       "rev-suppressed-text-permission": "Deze paginaversie is <strong>verwijderd</strong>. Details kunnen gevonden worden in [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verwijderlogboek].",
        "rev-deleted-text-unhide": "Deze paginaversie is '''verwijderd'''.\nEr kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].\nAls u wilt kunt u [$1 deze versie bekijken].",
        "rev-suppressed-text-unhide": "Deze paginaversie is '''onderdrukt'''.\nEr kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].\nAls u wilt kunt u [$1 deze versie bekijken].",
        "rev-deleted-text-view": "Deze paginaversie is '''verwijderd'''.\nU kunt deze bekijken; er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "searchall": "alle",
        "showingresults": "Hieronder {{PLURAL:$1|staat '''1''' resultaat|staan '''$1''' resultaten}} vanaf #'''$2'''.",
        "showingresultsinrange": "Hieronder {{PLURAL:$1|wordt|worden}} maximaal {{PLURAL:$1|<strong>1</strong> resultaat|<strong>$1 </strong>resultaten}} weergegeven in het bereik #<strong>$2</strong> tot #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultaat '''$1''' van '''$3'''|Resultaten '''$1 - $2''' van '''$3'''}} voor '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Resultaat <strong>$1</strong> van <strong>$2</strong>|Resultaten <strong>$1 - $2</strong> van de <strong>$3</strong>}}",
        "search-nonefound": "Er zijn geen resultaten voor uw zoekopdracht.",
        "powersearch-legend": "Uitgebreid zoeken",
        "powersearch-ns": "Zoeken in naamruimten:",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Verschillen",
        "prefs-help-prefershttps": "Deze voorkeur wordt toegepast bij de volgende keer aanmelden.",
+       "prefswarning-warning": "U heeft deze wijzigingen gemaakt in uw voorkeuren die nog niet opgeslagen zijn. Wanneer u de pagina verlaat zonder op \"$1\" te klikken zullen uw voorkeuren niet geüpdated worden.",
        "prefs-tabs-navigation-hint": "Tip: U kunt de pijltjestoetsen naar links en naar rechts gebruiken om te navigeren tussen de tabbladen in de lijst.",
        "email-address-validity-valid": "Het e-mailadres lijkt geldig",
        "email-address-validity-invalid": "Geef een geldig e-mailadres op",
        "randomincategory": "Willekeurige pagina in de categorie",
        "randomincategory-invalidcategory": "\"$1\" is geen geldige categorienaam.",
        "randomincategory-nopages": "Er zijn geen pagina's in de categorie [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Geef een willekeurige pagina uit de categorie $1 weer. $2",
-       "randomincategory-selectcategory-submit": "OK",
+       "randomincategory-category": "Categorie:",
+       "randomincategory-legend": "Willekeurige pagina in een categorie",
        "randomredirect": "Willekeurige doorverwijzing",
        "randomredirect-nopages": "Er zijn geen doorverwijzingen in de naamruimte \"$1\".",
        "statistics": "Statistieken",
        "wantedpages-badtitle": "Ongeldige paginanaam in resultaat: $1",
        "wantedfiles": "Niet-bestaande bestanden met koppelingen",
        "wantedfiletext-cat": "De volgende bestanden worden gebruikt maar bestaan niet. Bestanden van externe repositories kunnen zijn opgenomen in de lijst, ondanks dat ze bestaan. Dergelijke vals positieven worden <del>doorgehaald weergegeven</del>. Pagina's die niet-bestaande bestanden insluiten staan op de pagina [[:$1]].",
+       "wantedfiletext-cat-noforeign": "De volgende bestanden zijn in gebruik maar bestaan niet. Daarnaast staan pagina's met niet-bestaande bestanden op [[:$1]].",
        "wantedfiletext-nocat": "De volgende bestanden worden gebruikt maar bestaan niet. Bestanden van externe repositories kunnen zijn opgenomen in de lijst, ondanks dat ze bestaan. Dergelijke vals positieven worden <del>doorgehaald weergegeven</del>.",
        "wantedfiletext-nocat-noforeign": "De volgende bestanden zijn in gebruik maar bestaan niet.",
        "wantedtemplates": "Niet-bestaande sjablonen met koppelingen",
        "querypage-disabled": "Deze speciale pagina is uitgeschakeld om performanceredenen.",
        "booksources": "Boekinformatie",
        "booksources-search-legend": "Bronnen en gegevens over een boek zoeken",
-       "booksources-go": "OK",
+       "booksources-search": "Zoeken",
        "booksources-text": "Hieronder staat een lijst met koppelingen naar andere websites die nieuwe of gebruikte boeken verkopen, en die wellicht meer informatie over het boek dat u zoekt hebben:",
        "booksources-invalid-isbn": "Het opgegeven ISBN lijkt niet geldig te zijn.\nControleer of u wellicht een fout hebt gemaakt bij de invoer.",
        "specialloguserlabel": "Uitvoerende gebruiker:",
        "linksearch-pat": "Zoekpatroon:",
        "linksearch-ns": "Naamruimte:",
        "linksearch-ok": "Zoeken",
-       "linksearch-text": "Wildcards zoals \"*.wikipedia.org\" of \"*.org\" zijn toegestaan.\nHeeft tenminste een topleveldomein nodig, zoals bijvoorbeeld \"*.org\".<br />\n{{PLURAL:$2|Ondersteund protocol|Ondersteunde protocollen}}: <code>$1</code> (wordt \"http://\"als er geen protocol wordt opgegeven).",
+       "linksearch-text": "Wildcards zoals \"*.wikipedia.org\" of \"*.org\" zijn toegestaan.\nHeeft tenminste een topleveldomein nodig, zoals bijvoorbeeld \"*.org\".<br />\n{{PLURAL:$2|Ondersteund protocol|Ondersteunde protocollen}}: <code>$1</code> (wordt \"http://\" als er geen protocol wordt opgegeven).",
        "linksearch-line": "$1 heeft een koppeling in $2",
        "linksearch-error": "Wildcards zijn alleen toegestaan aan het begin van een hostnaam.",
        "listusersfrom": "Gebruikers bekijken vanaf:",
        "wlheader-enotif": "U wordt per e-mail gewaarschuwd.",
        "wlheader-showupdated": "Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven.",
        "wlnote": "Hieronder {{PLURAL:$1|staat de laaste wijziging|staan de laatste $1 wijzigingen}} in {{PLURAL:$2|het laatste uur|de laatste $2 uur}} per $3 om $4.",
-       "wlshowlast": "Laatste $1 uur, $2 dagen bekijken ($3)",
+       "wlshowlast": "Laatste $1 uur, $2 dagen bekijken",
        "watchlist-options": "Opties voor volglijst",
        "watching": "Bezig met plaatsen op volglijst…",
        "unwatching": "Bezig met verwijderen van volglijst…",
        "exbeforeblank": "De inhoud was: \"$1\"",
        "delete-confirm": "\"$1\" verwijderen",
        "delete-legend": "Verwijderen",
-       "historywarning": "'''Waarschuwing:''' de pagina die u wilt verwijderen heeft ongeveer $1 {{PLURAL:$1|versie|versies}}:",
+       "historywarning": "<strong>Waarschuwing:</strong> de pagina die u wilt verwijderen heeft ongeveer $1 {{PLURAL:$1|versie|versies}}:",
        "confirmdeletetext": "U staat op het punt een pagina te verwijderen, inclusief de geschiedenis.\nBevestig hieronder dat dit inderdaad uw bedoeling is, dat u de gevolgen begrijpt en dat de verwijdering overeenstemt met het [[{{MediaWiki:Policy-url}}|beleid]].",
        "actioncomplete": "Handeling voltooid",
        "actionfailed": "De handeling is mislukt.",
        "delete-edit-reasonlist": "Redenen voor verwijderen bewerken",
        "delete-toobig": "Deze pagina heeft een lange bewerkingsgeschiedenis, meer dan $1 {{PLURAL:$1|versie|versies}}.\nHet verwijderen van dit soort pagina's is met rechten beperkt om het per ongeluk verstoren van de werking van {{SITENAME}} te voorkomen.",
        "delete-warning-toobig": "Deze pagina heeft een lange bewerkingsgeschiedenis, meer dan $1 {{PLURAL:$1|versie|versies}}.\nHet verwijderen van deze pagina kan de werking van de database van {{SITENAME}} verstoren.\nWees voorzichtig.",
+       "deleteprotected": "U kunt deze pagina niet verwijderen omdat hij is beveiligd.",
        "deleting-backlinks-warning": "'''Waarschuwing:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere pagina's]] gebruiken of verwijzen naar de pagina die u wilt verwijderen.",
        "rollback": "Wijzigingen ongedaan maken",
        "rollback_short": "Terugdraaien",
        "unblocked": "Blokkade van [[User:$1|$1]] is opgeheven",
        "unblocked-range": "$1 is gedeblokkeerd",
        "unblocked-id": "Blokkade $1 is opgeheven",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] is gedeblokkeerd.",
        "blocklist": "Geblokkeerde gebruikers",
        "ipblocklist": "Geblokkeerde gebruikers",
        "ipblocklist-legend": "Een geblokkeerde gebruiker zoeken",
        "import": "Pagina's importeren",
        "importinterwiki": "Transwiki-import",
        "import-interwiki-text": "Selecteer een wiki en paginanaam om te importeren.\nVersie- en auteursgegevens blijven hierbij bewaard.\nAlle transwiki-importhandelingen worden opgeslagen in het [[Special:Log/import|importlogboek]].",
-       "import-interwiki-source": "Bronwiki/pagina:",
+       "import-interwiki-sourcewiki": "Bronwiki:",
+       "import-interwiki-sourcepage": "Bronpagina:",
        "import-interwiki-history": "Volledige geschiedenis van deze pagina ook kopiëren",
        "import-interwiki-templates": "Alle sjablonen opnemen",
        "import-interwiki-submit": "Importeren",
        "exif-urgency-low": "Laag ($1)",
        "exif-urgency-high": "Hoog ($1)",
        "exif-urgency-other": "Door gebruiker gedefinieerde prioriteit ($1)",
-       "watchlistall2": "alles",
        "namespacesall": "alle",
        "monthsall": "alle",
        "confirmemail": "E-mailadres bevestigen",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|heeft}} het groepslidmaatschap gewijzigd voor $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automatisch gepromoveerd van $4 naar $5",
        "logentry-upload-upload": "$1 heeft $3 {{GENDER:$2|geupload}}",
-       "logentry-upload-overwrite": "$1 heeft een nieuwe versie van $3 {{GENDER:$2|geupload}}",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|heeft}} een nieuwe versie van $3 geüpload",
        "logentry-upload-revert": "$1 heeft $3 {{GENDER:$2|geupload}}",
        "rightsnone": "(geen)",
+       "revdelete-summary": "bewerkingssamenvatting",
        "feedback-bugornote": "Als u zover bent om een technisch probleem in detail te beschrijven, [$1 rapporteer dan een bug].\nAnders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt dan toegevoegd aan de pagina \"[$3 $2]\", samen met uw gebruikersnaam en de browser die u gebruikt.",
        "feedback-subject": "Onderwerp:",
        "feedback-message": "Bericht:",
        "log-description-pagelang": "Dit is een logboek van wijzigingen van de taal van pagina's.",
        "logentry-pagelang-pagelang": "$1 wijzigde de taal van de pagina '$3' van $4 naar $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ingeschakeld)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>uitgeschakeld</strong>)"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>uitgeschakeld</strong>)",
+       "mediastatistics": "Mediastatistieken",
+       "mediastatistics-summary": "Statistieken over geüploade bestandstypen. Dit overzicht bevat alleen de meest recente versie van een bestand. Oude of verwijderde versies worden niet meegenomen.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-type",
+       "mediastatistics-table-extensions": "Mogelijke extensies",
+       "mediastatistics-table-count": "Aantal bestanden",
+       "mediastatistics-table-totalbytes": "Gecombineerde grootte",
+       "mediastatistics-header-unknown": "Onbekend",
+       "mediastatistics-header-bitmap": "Bitmapafbeeldingen",
+       "mediastatistics-header-drawing": "Tekeningen (vectorbestanden)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video's",
+       "mediastatistics-header-office": "Kantoorbestanden",
+       "mediastatistics-header-text": "Tekstbestanden",
+       "mediastatistics-header-executable": "Uitvoerbare bestanden",
+       "mediastatistics-header-archive": "Gecomprimeerde bestanden",
+       "json-error-unknown": "Er is een fout opgetreden met de JSON. Foutmelding: $1",
+       "json-error-syntax": "Syntaxfoutmelding"
 }
index 91a323d..1d464d2 100644 (file)
        "passwordreset-emailsent-capture": "Eposten under er sendt ut som ei påminning.",
        "passwordreset-emailerror-capture": "Ein påminnings-e-post vart oppretta, og er vist nedanfor; men det lukkast ikkje å senda han til brukaren: $1",
        "changeemail": "↓Endre e-postadresse",
-       "changeemail-header": "↓Endre kontoen si e-postadresse",
        "changeemail-text": "↓Fyll ut dette skjemaet for å endra di e-postadresse. Du må oppgje passordet ditt for å stadfesta endringa.",
        "changeemail-no-info": "↓Du må vera pålogga for å få tilgang direkte til denne sida.",
        "changeemail-oldemail": "↓Noverande e-postadresse:",
        "changeemail-none": "↓(ingen)",
        "changeemail-password": "{{SITENAME}}-passordet ditt:",
        "changeemail-submit": "↓Endre e-post",
-       "changeemail-cancel": "↓Avbryt",
        "bold_sample": "Halvfeit skrift",
        "bold_tip": "Halvfeit skrift",
        "italic_sample": "Kursivskrift",
        "searchrelated": "relatert",
        "searchall": "alle",
        "showingresults": "Nedanfor er opp til {{PLURAL:$1|'''eitt'''|'''$1'''}} resultat som byrjar med nummer '''$2''' vist{{PLURAL:$1||e}}.",
-       "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} for '''$4'''",
        "search-nonefound": "Ingen resultat svarte til førespurnaden.",
        "powersearch-legend": "Avansert søk",
        "powersearch-ns": "Søk i namnerom:",
        "randomincategory": "Tilfeldig side frå kategori",
        "randomincategory-invalidcategory": "«$1» er ikkje eit gildt kategorinamn.",
        "randomincategory-nopages": "Det er ingen sider i kategorien [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Hent tilfeldig side frå kategori: $1 $2.",
-       "randomincategory-selectcategory-submit": "Hent",
        "randomredirect": "Tilfeldig omdirigering",
        "randomredirect-nopages": "Det finst ingen omdirigeringar i namnerommet «$1».",
        "statistics": "Statistikk",
        "querypage-disabled": "Spesialsida er slegen av for skuld yting.",
        "booksources": "Bokkjelder",
        "booksources-search-legend": "Søk etter bokkjelder",
-       "booksources-go": "Gå",
        "booksources-text": "Nedanfor finn du ei liste over lenkjer til andre nettstader som sel nye og brukte bøker, og desse kan ha meir informasjon om bøker du leitar etter:",
        "booksources-invalid-isbn": "Det oppgjevne ISBN-nummeret er ugyldig; sjekk med kjelda di om du har oppgjeve det rett.",
        "specialloguserlabel": "Utøvar:",
        "wlheader-enotif": "Funksjonen for endringsmeldingar per e-post er på.",
        "wlheader-showupdated": "Sider som har vorte endra sidan du sist såg på dei er '''utheva'''",
        "wlnote": "Nedanfor er {{PLURAL:$1|den siste endringa|dei siste '''$1''' endringane}} {{PLURAL:$2|den siste timen|dei siste '''$2''' timane}}, for $3, kl. $4.",
-       "wlshowlast": "Vis siste $1 timane $2 dagane $3",
+       "wlshowlast": "Vis siste $1 timane $2 dagane",
        "watchlist-options": "Alternativ for overvakingslista",
        "watching": "Overvakar...",
        "unwatching": "Fjernar frå overvakinglista...",
        "sp-contributions-search": "Søk etter bidrag",
        "sp-contributions-username": "IP-adresse eller brukarnamn:",
        "sp-contributions-toponly": "Vis berre endringar som er gjeldande versjonar",
+       "sp-contributions-newonly": "Berre vis endringar som oppretta ei side",
        "sp-contributions-submit": "Søk",
        "whatlinkshere": "Lenkjer hit",
        "whatlinkshere-title": "Sider som har lenkje til «$1»",
        "whatlinkshere-filters": "Filter",
        "autoblockid": "Autoblokker #$1",
        "block": "Blokker brukar",
-       "unblock": "Opphev blokkeringa av brukaren",
+       "unblock": "Opphev blokkering av brukar",
        "blockip": "Blokker brukar",
        "blockip-legend": "Blokker brukar",
        "blockiptext": "Bruk skjemaet nedanfor for å blokkere skrivetilgangen frå ei spesifikk IP-adresse eller brukarnamn. Dette bør berre gjerast for å hindre hærverk, og i samsvar med [[{{MediaWiki:Policy-url}}|retningslinene]].",
        "import": "Importer sider",
        "importinterwiki": "Transwikiimport",
        "import-interwiki-text": "Vel ei wiki og ei side å importere. Endringssdatoer og brukarar som har medverka vert bevart. Alle transwiki-importeringar vert vist i [[Special:Log/import|importloggen]].",
-       "import-interwiki-source": "Kjeldewiki/sida:",
        "import-interwiki-history": "Kopier all historikken for denne sida",
        "import-interwiki-templates": "Inkluder alle malar",
        "import-interwiki-submit": "Importer",
        "exif-urgency-low": "Låg ($1)",
        "exif-urgency-high": "Høg ($1)",
        "exif-urgency-other": "Brukardefinert prioritet ($1)",
-       "watchlistall2": "alle",
        "namespacesall": "alle",
        "monthsall": "alle",
        "confirmemail": "Stadfest e-postadresse",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|endra}} gruppemedlemskap for $3",
        "logentry-rights-autopromote": "$1 vart automatisk {{GENDER:$2|forfremja}} frå $4 til $5",
        "rightsnone": "(ingen)",
+       "revdelete-summary": "Samandrag",
        "feedback-bugornote": "Er du klar til å skildra ein teknisk vanske i detalj, gjer vel å [$1 rapportera inn ein feil].\nOm ikkje kan du nytta det enkle skjemaet under. Merknaden din vert lagd til på sida «[$3 $2]», i lag med brukarnamnet ditt og kva for nettlesar du nyttar.",
        "feedback-subject": "Emne:",
        "feedback-message": "Melding:",
index fa563b2..083cc2c 100644 (file)
@@ -9,9 +9,9 @@
        },
        "tog-underline": "Tsenya mothalafase go dihlomaganyo:",
        "tog-hideminor": "Fihla diphetogo tše nnyenyane",
-       "tog-showtoolbar": "Bontšha ''toolbar'' yago fetola (JavaScript)",
-       "tog-editondblclick": "Fetola matlakala ka go thathapa gabedi (JavaScript)",
-       "tog-editsectiononrightclick": "Dumella go fetola sekgao ka thathapa ka lagoja thaetlele ya sekgao (JavaScript)",
+       "tog-showtoolbar": "Bontšha ''toolbar'' yago fetola",
+       "tog-editondblclick": "Fetola matlakala ka go thathapa gabedi",
+       "tog-editsectiononrightclick": "Dumella go fetola sekgao ka thathapa ka lagoja thaetlele ya sekgao",
        "tog-watchcreations": "Tsenya matlaka a mafsa ao ke a ngwalago go lenano laka la ditlhapetšo",
        "tog-watchdefault": "Tsenya matlaka ao ke a fetolago go lenano laka la ditlhapetšo",
        "tog-watchmoves": "Tsenya matlaka ao ke a hudušago go lenano laka la ditlhapetšo",
@@ -97,8 +97,8 @@
        "newwindow": "(e bula lefastere le lempsha)",
        "cancel": "Khansela",
        "moredotdotdot": "Tše dingwe...",
-       "mypage": "Letlakala la ka",
-       "mytalk": "Dipolelo tša ka",
+       "mypage": "Letlakala",
+       "mytalk": "Bolela",
        "anontalk": "Poledišano ya IP ye",
        "navigation": "Tšwelotšo",
        "and": "&#32;le",
        "articlepage": "Nyakoretša letlakala la mateng",
        "talk": "Poledišano",
        "views": "Dinyakorêtšo",
-       "toolbox": "Lepokisi la dithulusu",
+       "toolbox": "Dithulusu",
        "userpage": "Nyakorela letlakala la mošomiši",
        "projectpage": "Nyakoretša letlakala la tirotherwa",
        "imagepage": "Nyakoretša letlakala la ''file''",
        "versionrequiredtext": "Version $1 ya MediaWiki ea hlokega go šomiša letlakala le. Lebelela [[Special:Version|letlakala la version]].",
        "retrievedfrom": "Le tšwa go \"$1\"",
        "youhavenewmessages": "O na le $1 ($2).",
-       "newmessagesdifflinkplural": "l{{PLURAL:$1|Phetogo tša|Diphetogo ya}}go feta",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|Phetogo tša|Diphetogo ya}} go feta",
        "youhavenewmessagesmulti": "O nale melaetša ye mefsa go $1",
        "editsection": "lokiša",
        "editold": "fetola",
        "gotaccount": "O šetše o nale tšhupaleloko? '''$1'''.",
        "gotaccountlink": "Tsena",
        "userlogin-resetlink": "O lebetše dintlha tšago tsena?",
-       "createaccountmail": "ka e-mail",
+       "createaccountmail": "Re šomiše ditlhaka-tša-siphiri tša sebakanyana tšeo re di kgethilego re di romele ka e-mail",
        "createaccountreason": "Lebaka:",
        "badretype": "Ditlhaka-tša-siphiri tše o di šomišitšego ga di swane.",
        "noname": "Gawa fana ka leina la mošomiši la go loka.",
        "wrongpassword": "O loketše ditlhaka-tša-siphiri tšeo e sego tšona. Ka kgopelo, leka gape.",
        "wrongpasswordempty": "Ga wa lokela ditlhaka-tša-siphiri. Ka kgopelo, leka gape.",
        "passwordtooshort": "Ditlhaka-tša-siphiri tša gago ga tša dumelega goba di kopana.\nGo nyakega gore e be le {{PLURAL:$1|tlhaka ye tee|$1 ya ditlhaka}} gape  e seke ya swana le leina la gago (''username'').",
-       "mailmypassword": "Romela ditlhaka-tša-siphiri tše mpšha ka e-mail",
+       "mailmypassword": "Fetola ditlhaka-tša-siphiri",
        "passwordremindertitle": "''Password'' ye mphsa ya nakonyana go {{SITENAME}}",
-       "passwordremindertext": "Motho yo mongwe (goba wena, gotšwa IP atrese $1) o\nkgopetše gore re moromele Ditlhaka-tša-siphiri tše mfsa tša {{SITENAME}} ($4).\n\nDitlhaka-tša-siphiri tša  mošomiši \"$2\" go tloga bjale ke  \"$3\".\nEya go {{SITENAME}} o e fetole.\n\nGa eba motho yo mongwe esego wena o dirile kgopelo ye, goba o gopola Ditlhaka-tša-siphiri gomme ga o sa\nhloka gore e fetolwe, hlokomologa molaetša wo, o tšwele pele o šumiše Ditlhaka-tša-siphiri tša kgale.",
+       "passwordremindertext": "Motho yo mongwe (goba wena, gotšwa IP atrese $1) o\nkgopetše gore re moromele Ditlhaka-tša-siphiri tše mfsa tša {{SITENAME}} ($4).\n\nDitlhaka-tša-siphiri tša  mošomiši \"$2\" go tloga bjale ke  \"$3\".\n\nDitlhaka-tša-siphiri di tla šoma {{PLURAL:$5|letšatši|matšatši a $5}}.\n\nGa eba motho yo mongwe esego wena o dirile kgopelo ye, goba o gopola Ditlhaka-tša-siphiri gomme ga o sa\nhloka gore e fetolwe, hlokomologa molaetša wo, o tšwele pele o šumiše Ditlhaka-tša-siphiri tša kgale.",
        "noemail": "Ga gona e-mail atrese ya mošomiši \"$1\".",
        "passwordsent": "\nDihlaka tša siphiri (''password'') tše mphsa di rometšwe go e-mail atrese ya \"$1\".\nRe kgopela gore o tsene ge fetša go e hwetša.",
        "blocked-mailpassword": "IP atrese ya gago e thibetšwe go dira diphetogo, ka fao ga wa dumellwa\ngo šomiša thulusu ya go hwetša Ditlhaka-tša-siphiri go thibela go hlapanya.",
        "eauthentsent": "Molaetša wa go tiišetša o  rometšwe go e-mail atrese.\n\nPele re romela melaetša ye mengwe go atrese ye, o kgopelwa go latela ditaelo tšeo dilego molaetšeng go tiišetša gore atrese ke ya gago.",
-       "throttled-mailpassword": "Kgopotšo ya ditlhaka-tša-siphiri e rometšwe {{PLURAL:$1|iring|diiring tše $1}} tša gofeta.\nGo thibela go hlapanya/kgobošo, kgopotšo e tee ka {{PLURAL:$1|iri|diiri tše $1}} e tla romellwa.",
+       "throttled-mailpassword": "Kgopelo ya go fetola ditlhaka-tša-siphiri e rometšwe {{PLURAL:$1|iring|diiring tše $1}} tša gofeta.\nGo thibela go hlapanya/kgobošo, kgopotšo e tee ka {{PLURAL:$1|iri|diiri tše $1}} e tla romellwa.",
        "mailerror": "Gobile le phošo go romeleng molaetša  : $1",
-       "acct_creation_throttle_hit": "Ka maswabi, o tlhomile {{PLURAL:$1|tšhupaleloko|$1 tša ditšhupaleloko}}.\nGa wa dumelwa go tlhoma tše dingwe.",
-       "emailauthenticated": "E-mail atrese ya gago e kgonthišitšwe ka $2, $3.",
+       "acct_creation_throttle_hit": "Ka maswabi, IP Aterese ya gago e tlhomile {{PLURAL:$1|tšhupaleloko|$1 tša ditšhupaleloko}} e se kgale.\nGa wa dumelwa go tlhoma tše dingwe ka se sebaka.",
+       "emailauthenticated": "E-mail atrese ya gago e kgonthišitšwe ka $2  $3.",
        "accountcreated": "Tšhupaleloko (Account) e tlhodilwe",
-       "accountcreatedtext": "Tšhupaleloko (account) ya modiri $1 e tlhodilwe.",
+       "accountcreatedtext": "Tšhupaleloko (account) ya modiri [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) e tlhodilwe.",
        "loginlanguagelabel": "Polelo: $1",
        "changepassword": "Fetola ditlhaka-tša-siphiri",
        "resetpass_text": "<!-- Tsenya ditlhaka mo -->",
        "oldpassword": "Ditlhaka-tša-siphiri tša kgale:",
        "newpassword": "Ditlhaka-tša-siphiri tše mpsha:",
        "retypenew": "Tlanya ditlhaka tše mphsa tša siphiri gape:",
-       "changepassword-success": "Ditlhaka tša siphiri di fetotšwe ka katlego! Bjale o kgona go tsena...",
+       "changepassword-success": "Ditlhaka tša siphiri di fetotšwe ka katlego!",
        "bold_sample": "Mongwalo wa '''Bold'''",
        "bold_tip": "Ditlhaka tše Bold",
        "italic_sample": "Ditlhaka tše Italic",
        "preview": "Lebelela",
        "showpreview": "Laetša sebopego sa letlaka",
        "showdiff": "Laetša diphetogo",
-       "anoneditwarning": "'''Temošo''' Gawa ''tsena'', IP ya gago e tla šumišwa go histori ya diphetogo tša letlakala",
+       "anoneditwarning": "<strong>Temošo:</strong> Gawa ''tsena'', IP ya gago e tla šumišwa go histori ya diphetogo tša letlakala. Ge o ka <strong>[$1 tsena]</strong> goba wa  <strong>[$2 tlhoma tšhupaleloko</strong>,diphetogo tša gago di tla šumiša leina la gago.",
        "summary-preview": "Lebelela kakaretšo:",
        "blockedtitle": "Mošomiši o thibilwe",
        "blockedtext": "'''Leina la gago la mošomiši goba IP atrese e thibilwe.'''\n\nO thibilwe ke $1. Makaba a go thiba ke ''$2''.\n\n* Go thoma gago thiba: $8\n* Fetatšatši yago thiba: $6\n* Mothibiwa: $7\n\nO ka leka go boledišana le $1 goba [[{{MediaWiki:Grouppage-sysop}}|molaudi]] ka go thibiwa go.\nO ka se kgone go šumiša thulusu ya 'romela mošomiši molaetša' ka ntle gage o loketše e-mail ya gago go\n[[Special:Preferences|dikgatlhegelo]] gape ge o sa thibelwa go e šomiša.\nIP atrese ya gago ke $3, ge ID ya go thiba ele #$5. Ka kgopelo šumiša ID le IP go dipoledišano ka moka tšeo dilego mabapi le go go thiba.",
        "loginreqlink": "tsena",
        "loginreqpagetext": "O swanela ke go  $1 go nyakorela matlakala a mangwe.",
        "accmailtitle": "Ditlhaka tša siphiri di rometšwe.",
-       "accmailtext": "Ditlhaka-tša-siphiri tša \"$1\"  di rometšwe go $2.",
+       "accmailtext": "Ditlhaka-tša-siphiri tša  [[User talk:$1|$1]]  di rometšwe go $2. Di ka fetolwa go letlaka la <em>[[Special:ChangePassword|go fetola ditlhaka-tša-siphiri ]]</em> ge o tsena.",
        "newarticle": "(mpsha)",
        "newarticletext": "O latetše hlomaganyo go letlakala leo le sego gona ka se sebaka.\nGo tlhola letlakala, thoma go ngwalo lepokising le letelago\n(lebelela [$1 letlakala la thušo] go hwetša šedi).\nGa eba o le fa ka phošo, o ka boela morago ka go šumiša konopo ya '''back''' go ''browser'' ya gago.",
        "noarticletext": "Ga gona ditlhaka letlakaleng le, oka [[Special:Search/{{PAGENAME}}|fetleka leina la letlakala]] matlakaleng a mangwe, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} fetleka \"logs\"], goba [{{fullurl:{{FULLPAGENAME}}|action=edit}} wa fetola letlakala le]</span>.",
        "currentrev": "Poeletšo tša bjale",
        "currentrev-asof": "Thumeletšo tša seswa go tloga ka $1",
        "revisionasof": "Thumeletšo go tloga ka $1",
-       "revision-info": "Poeletšo go tloga $1 ka $2",
+       "revision-info": "Poeletšo go tloga $1 ka {{GENDER:$6|$2}}$7",
        "previousrevision": "←Poeletšo tša kgalenyana",
        "nextrevision": "Peletšo tše dimphsanyana→",
        "currentrevisionlink": "Poeletšo ya bjale",
        "histlegend": "Tlhaolo ya diphapano: swaya lepokisi la phetogo go bapetša ke moka o thwanye ''enter'' tlase-tlase<br />\nNane: (bjale) = phapang le diphetogo tša bjale,\n(mafelelo) = phapang le diphetogo tša pele, M = diphetogo tše nyenyane.",
        "history-fieldset-title": "Laotša histori",
        "history-show-deleted": "Tša go phumulwa fela",
-       "histfirst": "Pelepele",
+       "histfirst": "Pelepeleng",
        "histlast": "Ntshwantshwa",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "history-feed-title": "Histori ya poeletšo",
        "history-feed-item-nocomment": "$1 go $2",
        "history-feed-empty": "Letlakala lewe ga le gona.\nMohlomongwe le phumutšwe go wiki, goba le fetotšwe leina.\nLeka [[Special:Search|go fetleka wikii]] go humana matlakala a mapsha.",
        "rev-delundel": "Bontšha/Fihla",
-       "revdelete-hide-text": "Fihla dihlaka tša poeletšo",
+       "revdelete-hide-text": "Dihlaka tša poeletšo",
        "revdelete-log": "Lebaka:",
        "revdel-restore": "\nfetola tshenolo",
        "pagehist": "Histori ya letlakala",
        "shown-title": "Laetša $1 {{PLURAL:$1|sepheto| tša dipheto}} ka letlakala",
        "viewprevnext": "Lebelela ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Go ena le letlaka la leina la \"[[:$1]]\" go wiki ye.'''",
-       "searchmenu-new": "'''Hlola letlakala \"[[:$1]]\" go wiki ye!'''",
+       "searchmenu-new": "<strong>Hlola letlakala \"[[:$1]]\" go wiki ye!</strong>",
        "searchprofile-articles": "Matlakala a diteng",
        "searchprofile-images": "Diphatlalatši tša \"multi\"",
        "searchprofile-everything": "Ka moka",
        "search-section": "(sekga $1)",
        "search-suggest": "O be o nyaka gore: $1",
        "search-interwiki-caption": "Diprojeke tša moloko",
-       "search-interwiki-default": "$1 diphetho:",
+       "search-interwiki-default": "Dipheto gotšwa $1:",
        "search-interwiki-more": "(gape)",
        "searchrelated": "tswalana",
        "searchall": "tšohle",
-       "showingresultsheader": "{{PLURAL:$5|Sepheto '''$1''' tša '''$3'''|Dipheto '''$1 - $2''' tša '''$3'''}} tša '''$4'''",
        "search-nonefound": "Gago dipheto tšago sepelelana le \"query\".",
        "powersearch-legend": "Fetleka ya tšwetše",
        "powersearch-ns": "Fetleka go di \"namespace\"",
        "preferences": "Dikgatlhegelo",
-       "mypreferences": "Dikgatlhegelo tša ka",
+       "mypreferences": "Dikgatlhegelo",
        "prefs-edits": "Palo ya diphetogo:",
        "skin-preview": "Ponopele",
        "prefs-rc": "Diphetogo tša bjale",
        "allowemail": "Dumella melaetša ya e-mail go tšwa go bašomiši ba bangwe",
        "prefs-files": "Difaele",
        "youremail": "E-Poso",
-       "username": "Mošomiši:",
-       "prefs-memberingroups": "Leloko la {{PLURAL:$1|ya sehlopha|ya dihlopha}}:",
+       "username": "{{GENDER:$1|Mošomiši}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Leloko}} la {{PLURAL:$1|ya sehlopha|ya dihlopha}}:",
        "yourrealname": "Leina la mmakgonthe:",
        "yourlanguage": "Polelo:",
        "yournick": "Tshaeno:",
        "recentchanges-label-minor": "Ye ke phetogo ye nnyenyane",
        "recentchanges-label-bot": "Phetogo ye e dirilwe ke \"bot\"",
        "recentchanges-label-unpatrolled": "Phetogo ye ga ese e \"patrollwe\"",
-       "rcnotefrom": "Tlase ke diphetogo go tloga ka '''$2''' (go  fihla ka '''$1''').",
+       "rcnotefrom": "Tlase ke diphetogo go tloga ka <strong>$3, $4</strong> (go  fihla ka <strong>$1</strong>).",
        "rclistfrom": "Laêtša dipheto tše mfsa go thoma go $3 $2",
        "rcshowhideminor": "$1 ya diphetogo tše nnyenyane",
        "rcshowhidebots": "$1 bots",
-       "rcshowhideliu": "$1 bašumiši bao batsenego",
+       "rcshowhideliu": "$1 bašumiši bao batsebjawago",
        "rcshowhideanons": "$1 bašumiši bago se tsebege",
        "rcshowhidepatr": "$1 diphetogo tše ''patrolled''",
        "rcshowhidemine": "$1 diphetogo tsa ka",
        "newpageletter": "N",
        "boteditletter": "b",
        "newsectionsummary": "/* $1 */ sekgao se sempsha",
-       "rc-enhanced-expand": "Laetša ka bophara (e nyaka \"JavaScript\")",
+       "rc-enhanced-expand": "Laetša ka bophara",
        "rc-enhanced-hide": "Fihla bophara bja sedi",
        "recentchangeslinked": "Diphetogo tša go tswalana",
        "recentchangeslinked-feed": "Diphetogo tša go tswalana",
        "license": "Laesense/Tumello:",
        "license-header": "Laesense",
        "license-nopreview": "(Ponopele ga e gona)",
-       "upload_source_file": "(faele go khomphuthara ya gago)",
+       "upload_source_file": "(faele yeo o kgethilego go khomphuthara ya gago)",
        "imgfile": "faele",
        "listfiles": "Lenano la difaele",
        "listfiles_date": "Letšatšikgwedi",
        "filerevert-defaultcomment": "Boela go poeletšo ya go tloga go $2, $1",
        "filedelete": "Phumula $1",
        "filedelete-legend": "Phumula faele",
-       "filedelete-intro": "O phumula '''[[Media:$1|$1]]'''.",
+       "filedelete-intro": "O phumula <strong>[[Media:$1|$1]]</strong> le histori ya yona.",
        "filedelete-comment": "Lebaka:",
        "filedelete-submit": "Phumula",
        "filedelete-success": "'''$1''' e phumutšwe.",
        "wantedpages": "Matlakala ago nyakega",
        "mostlinked": "Matlakala a go hlomaganya go feta a mangwe",
        "mostlinkedcategories": "Dihlopha tša go hlomaganya go feta tše dingwe",
-       "mostlinkedtemplates": "''templates'' tša go hlomaganya go feta tše dingwe",
+       "mostlinkedtemplates": "Matlakala a go hlomaganya go feta a mangwe",
        "mostcategories": "Matlakala a goba le dihlopha tše dintšhi",
        "mostimages": "Faele tša go hlomaganya go feta tše dingwe",
        "mostrevisions": "Matlakala a goba le diphetogo tše dintšhi",
        "pager-older-n": "{{PLURAL:$1|1 ya kgale|$1 tša kgale}}",
        "booksources": "Dipuku tša mothopo",
        "booksources-search-legend": "Fetleka mothopo wa dipuku",
-       "booksources-go": "Sepela",
        "specialloguserlabel": "Modiri:",
        "speciallogtitlelabel": "Thaetlele (goba mošumiši):",
        "log": "Di-''log''",
        "emailccsubject": "Kopi ya molaetša wa gago goya go $1: $2",
        "emailsent": "E-mail e rometšwe",
        "emailsenttext": "Molaetša wa gago wa email gawa romelwa.",
-       "watchlist": "Lenano la ditlhapetšo tša ka",
-       "mywatchlist": "Lenano la ditlhapetšo tša ka",
+       "watchlist": "Lenano la ditlhapetšo",
+       "mywatchlist": "Lenano la ditlhapetšo",
        "watchlistfor2": "Ya $1 $2",
        "addedwatchtext": "Letlakala \"[[:$1]]\" le tsene go [[Special:Watchlist|watchlist]] ya gago.\nGo tloga bjale, diphetogo letlakaleng le, le letlakaleng la dipoledišano la gona, di tla bontšhwa ka mongalo wa '''bold''' gare ga [[Special:RecentChanges|list of recent changes]] gore go be bonolo gore oa bone.\n\nGa eba o nyaka go hloša letlaka le go lenano la ditlhapetšo tša gago, šomiša \"Tloša tlhapetšo\" go sidebar.",
        "removedwatchtext": "Letlakala \"[[:$1]]\" letlošitšwe go [[Special:Watchlist|lenano la gago la ditlhapetšo]].",
        "watchthispage": "Tlhapetša letlakala le",
        "unwatch": "Tloša tlhapešo",
        "watchlist-details": "{{PLURAL:$1|$1 ya letlakala|$1 ya matlakala}} a lenano la ditlhapetšo tša gago, re sa bale matlakala a dipoledišano (dipolelo).",
-       "wlshowlast": "Laetša  $1 diiri $2 matšatši $3 tša gofeta",
+       "wlshowlast": "Laetša  $1 diiri $2 matšatši  tša gofeta",
        "watchlist-options": "Dikgatlego tša lenano la ditlhapetšo",
        "watching": "Tlhapeditše...",
        "unwatching": "Tlhapetšo eya tlošwa ...",
        "deletepage": "Phumula letlakala",
        "excontent": "mateng ebe e le: '$1'",
        "delete-legend": "Phumula",
-       "historywarning": "'''Temošo:''' Letlakala leo o lekago go lephumula le nale histori le {{:$1|phetogo|diphetogo}}:",
+       "historywarning": "<strong>Temošo:</strong> Letlakala leo o lekago go lephumula le nale histori le {{PLURAL:$1|phetogo|diphetogo tše $1}}:",
        "confirmdeletetext": "O phumula letlakala le histori ka moka ya lona.\nKa kgopela sitlediša gore ke se o nyakago  go sedira, le gore o kwešiša ditla morago tša se, le gore seo o se dirago se latela melawana le ditaelo go ya ka [[{{MediaWiki:Policy-url}}|polisi]].",
        "actioncomplete": "Kgopelo e phetilwe ka katlego",
        "actionfailed": "Tiro e padile",
        "exif-componentsconfiguration-0": "Ga e gona",
        "exif-subjectdistance-value": "$1 metara",
        "exif-meteringmode-1": "Palogare",
-       "watchlistall2": "ka moka",
        "namespacesall": "ka moka",
        "monthsall": "ka moka",
        "imgmultipageprev": "← letlakala la go feta",
index 771ad10..2c20f13 100644 (file)
@@ -29,6 +29,7 @@
        "tog-watchdefault": "Apondre las paginas que modifiqui e los fichièrs qu'impòrti a ma lista de seguiment",
        "tog-watchmoves": "Apondre las paginas e los fichièrs que tòrni nomenar a ma lista de seguiment",
        "tog-watchdeletion": "Apondre las paginas e los fichièrs que suprimissi de ma lista de seguiment",
+       "tog-watchrollback": "Apondre a ma lista de seguiment las paginas sus las qualas ai efectuat una revocacion",
        "tog-minordefault": "Considerar mas modificacions coma menoras per defaut",
        "tog-previewontop": "Far veire la previsualizacion al dessús de la zòna de modificacion",
        "tog-previewonfirst": "Far veire la previsualizacion al moment de la primièra edicion",
@@ -94,7 +95,7 @@
        "may-gen": "Mai",
        "june-gen": "Junh",
        "july-gen": "Julhet",
-       "august-gen": "Agost",
+       "august-gen": "d'agost",
        "september-gen": "Setembre",
        "october-gen": "Octobre",
        "november-gen": "Novembre",
        "otherlanguages": "Autras lengas",
        "redirectedfrom": "(Redirigit dempuèi $1)",
        "redirectpagesub": "Pagina de redireccion",
+       "redirectto": "Redirigir cap a :",
        "lastmodifiedat": "Darrièr cambiament d'aquesta pagina lo $1, a $2.",
        "viewcount": "Aquesta pagina es estada consultada {{PLURAL:$1|un còp|$1 còps}}.",
        "protectedpage": "Pagina protegida",
        "jumptonavigation": "navigacion",
        "jumptosearch": "Recercar",
        "view-pool-error": "O planhèm, los servidors son subrecargats pel moment.\nTròp d’utilizaires cercan a accedir a aquesta pagina.\nEsperatz un moment abans d'ensajar d’accedir a aquesta pagina.\n\n$1",
+       "generic-pool-error": "O planhèm, los servidors son subrecargats pel moment.\nTròp d’utilizaires ensajan de consultar aquesta ressorsa.\nEsperatz un moment abans d'ensajar d’accedir a aquesta pagina.",
        "pool-timeout": "Relambi depassat pendent l'espèra del varrolh",
        "pool-queuefull": "La fila de trabalh es plena",
        "pool-errorunknown": "Error desconeguda",
+       "pool-servererror": "Lo servici de comptatge de la reserva es pas disponible ($1).",
        "aboutsite": "A prepaus de {{SITENAME}}",
        "aboutpage": "Project:A prepaus",
        "copyright": "Lo contengut es disponible jos licéncia $1 levat mencion contrària.",
        "hidetoc": "amagar",
        "collapsible-collapse": "Rebatre",
        "collapsible-expand": "Desplegar",
+       "confirmable-confirm": "Sètz segur{{GENDER:||a|(a)}} ?",
+       "confirmable-yes": "Òc",
+       "confirmable-no": "Non",
        "thisisdeleted": "Desiratz afichar o restablir $1?",
        "viewdeleted": "Veire $1?",
        "restorelink": "{{PLURAL:$1|una edicion escafada|$1 edicions escafadas}}",
        "resetpass-submit-cancel": "Anullar",
        "resetpass-wrong-oldpass": "Senhal actual o temporari invalid.\nBenlèu ja avètz modificat vòstre senhal o demandat un senhal temporari novèl.",
        "resetpass-recycled": "Reïnicializatz vòstre senhal a quicòm mai que l’actual.",
+       "resetpass-temp-emailed": "Sètz connect{{GENDER:|at|ada}} amb un còde temporari provesit per corrièr electronic.\nPer acabar la connexion, vos cal provesir un senhal novèl aicí :",
        "resetpass-temp-password": "Senhal temporari :",
        "resetpass-abort-generic": "La modificacion del senhal es estada anulada per una extension.",
        "resetpass-expired": "Vòstre senhal a expirat. Provesissètz-ne un novèl per vos connectar.",
+       "resetpass-expired-soft": "Vòstre senhal a expirat, e deu èsser reïnicializat. Causissètz-ne un novèl ara, o clicatz sus « {{int:resetpass-submit-cancel}} » per o far mai tard.",
+       "resetpass-validity-soft": "Vòstre senhal es pas valid : $1\n\nCausissètz un senhal novèl ara, o clicatz sus « {{int:resetpass-submit-cancel}} » per lo reïnicializar mai tard.",
        "passwordreset": "Remesa a zèro del senhal",
        "passwordreset-text-one": "Emplenatz aqueste formulari per reïnicializar vòstre senhal.",
        "passwordreset-text-many": "{{PLURAL:$1|Completatz un d'aqueles camps per recebre un senhal temporari per corrièr electronic.}}",
        "passwordreset-emailsent-capture": "Un corrièr electronic de reïnicializacion senhal es estat mandat, qu'es afichat çaijós.",
        "passwordreset-emailerror-capture": "Un corrièr electronic de reïnicializacion de senhal es estat generat, qu'es afichat çaijós, mas lo mandadís a l'{{GENDER:$2|utilizaire}} a fracassat : $1",
        "changeemail": "Cambiar l'adreça electronica:",
-       "changeemail-header": "Cambiar l'adreça electronica del compte",
        "changeemail-text": "Emplenatz aqueste formulari per cambiar vòstra adreça de corrièr electronic. Vos cal entrar vòstre senhal per confirmar aqueste cambiament.",
        "changeemail-no-info": "Vos cal èsser connectat per aver accès a aquesta pagina.",
        "changeemail-oldemail": "Adreça electronica actuala:",
        "changeemail-none": "(pas cap)",
        "changeemail-password": "Vòstre senhal sus {{SITENAME}} :",
        "changeemail-submit": "Cambiar l'adreça electronica:",
-       "changeemail-cancel": "Anullar",
        "changeemail-throttled": "Avètz fach tròp de temptativas de connexion.\nEsperatz $1 abans d’ensajar tornarmai.",
        "resettokens": "Reïnicializar los getons",
        "resettokens-text": "Aici, podètz reïnicializar los getons que permeton d’accedir a d'unas donadas privadas associadas a vòstre compte.\n\nLo vos caldriá far se las avètz partejats accidentalament amb qualqu'un o se vòstre compte es estat compromés.",
        "preview": "Previsualizar",
        "showpreview": "Previsualizacion",
        "showdiff": "Veire los cambiaments",
+       "blankarticle": "<strong>Atencion :</strong> La pagina que creatz es voida.\nSe clicatz tornarmai sus « {{int:savearticle}} », la pagina serà creada sens cap de contengut.",
        "anoneditwarning": "'''Atencion :''' sètz pas identificat(ada).\nVòstra adreça IP serà enregistrada dins l’istoric d'aquesta pagina.",
        "anonpreviewwarning": "''Sètz pas identificat. Salvar enregistrarà vòstra adreça IP dins l’istoric de las modificacions de la pagina.''",
        "missingsummary": "'''Atencion :''' avètz pas modificat lo resumit de vòstra modificacion. Se clicatz tornarmai sul boton « Salvar », lo salvament serà fach sens avertiment mai.",
        "parser-template-recursion-depth-warning": "Limit de longor de la recursion del modèl depassat ($1)",
        "language-converter-depth-warning": "Limit de prigondor del convertissor de lenga depassada ($1)",
        "node-count-exceeded-category": "Paginas ont nombre de nosèls es depassat",
-       "node-count-exceeded-warning": "Pagina depassant lo nombre de nosèls",
+       "node-count-exceeded-category-desc": "Aquesta pagina depassa lo nombre maximal de nosèls.",
+       "node-count-exceeded-warning": "Pagina que depassa lo nombre de nosèls",
        "expansion-depth-exceeded-category": "Paginas ont la prigondor d'espandiment es depassada",
+       "expansion-depth-exceeded-category-desc": "La pagina depassa la prigondor d’espandiment maximala.",
        "expansion-depth-exceeded-warning": "Pagina depassant la prigondor d'espandiment",
        "parser-unstrip-loop-warning": "Bocla pas desmontabla detectada",
        "parser-unstrip-recursion-limit": "Limit de recursion pas desmontable depassat ($1)",
        "rev-deleted-event": "(entrada suprimida)",
        "rev-deleted-user-contribs": "[nom d'utilizaire o adreça IP suprimida - modificacion amagada sus las contribucions]",
        "rev-deleted-text-permission": "Aquesta version de la pagina es estada '''escafada'''.\nI pòt aver de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal dels escafaments].",
+       "rev-suppressed-text-permission": "Aquesta version de la page es estada <strong>suprimida</strong>.\nLos detalhs se tròban dins lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "rev-deleted-text-unhide": "Aquesta version de la pagina es estada '''escafada'''.\nI pòt aver mai de detalhs dins [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lo jornal dels escafaments].\nComa administrator, podètz encara [$1 veire aquesta version] s'o volètz.",
        "rev-suppressed-text-unhide": "Aquesta version de la pagina es estada '''suprimida'''.\nI pòt aver mai de detalhs dins [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} lo jornal de las supressions].\nComa administrator, podètz encara [$1 veire aquesta version] s'o volètz.",
        "rev-deleted-text-view": "Aquesta version de la pagina es estada '''escafada'''.\nLa podètz visualizar ; de detalhs son disponibles dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal dels escafaments].",
        "revdelete-selected-text": "{{PLURAL:$1|Revision seleccionada|Revisions seleccionadas}} de [[:$2]] :",
        "revdelete-selected-file": "{{PLURAL:$1|Version de fichièr seleccionada|Versions de fichièr seleccionadas}} de [[:$2]] :",
        "logdelete-selected": "{{PLURAL:$1|Eveniment d'istoric seleccionat|Eveniments d'istoric seleccionats}} :",
+       "revdelete-text-text": "Las revisions suprimidas contunharàn d'aparéisser dins l’istoric de la pagina, mas una partida de lor contengut serà inaccessibla al public.",
+       "revdelete-text-file": "Las versions de fichièr suprimidas contunharàn d'aparéisser dins l’istoric dels fichièrs, mas una partida de lor contengut serà indisponibla al public.",
+       "logdelete-text": "Los eveniments del jornal suprimits contunharàn d'aparéisser dins los jornals, mas una partida de lor contengut serà indisponibla al public.",
+       "revdelete-text-others": "Los autres administrators seràn totjorn en mesura d'accedir al contengut amagat e de lo restablir, levat se de restriccions suplementàrias son fixadas.",
        "revdelete-confirm": "Confirmatz que volètz efectuar aquesta accion, que ne comprenètz las consequéncias, e qu'o fasètz en acòrd amb [[{{MediaWiki:Policy-url}}|las règlas]].",
        "revdelete-suppress-text": "La supression deu èsser utilizada '''sonque''' dins los cases seguents :\n* Informacions potencialament difamatòrias\n* Informacions personalas inapropriadas\n*: ''adreça, numèro de telefòn, numèro de seguretat sociala, ...''",
        "revdelete-legend": "Metre en plaça de restriccions de version :",
        "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-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.",
        "mergehistory-no-destination": "La pagina de destinacion $1 existís pas.",
        "mergehistory-invalid-source": "La pagina d’origina deu aver un títol valid.",
        "editundo": "desfar",
        "diff-empty": "(Pas cap de diferéncia)",
        "diff-multi-sameuser": "({{PLURAL:$1|Una revision intermediària pel meteis utilizaire pas afichada|$1 revisions intermediàrias pel meteis utilizaire pas afichadas}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Una revision intermediària|$1 revisions intermediàrias}} per {{PLURAL:$2|un autre utilizaire|$2 utilizaires}} pas {{PLURAL:$1|afichada|afichadas}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Una revision intermediària amagada|$1 revisions intermediàrias amagadas}}) per ({{PLURAL:$2|un utilizaire pas afichada|$2 utilizaires pas afichadas}})",
        "difference-missing-revision": "{{PLURAL:$2|Una revision|$2 revisions}} d'aquesta diferéncia ($1) {{PLURAL:$2|es pas estada trobada|son pas estadas trobadas}}.\n\nAquò se produtz en general en seguent un ligam de diferéncia obsolèta cap a una pagina qu'es estada suprimada.\nPodètz trobar de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "searchresults": "Resultats de la recèrca",
        "searchall": "Totes",
        "showingresults": "Afichatge de <b>$1</b> resultat{{PLURAL:$1||s}} a partir del n°<b>$2</b>.",
        "showingresultsinrange": "Afichar çaijós fins a {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resultats}} dins la seria #<strong>$2</strong> a #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultat '''$1'''|Resultats '''$1 - $2'''}} de '''$3''' per '''$4'''",
        "search-nonefound": "I a pas cap de resultat correspondent a la requèsta.",
        "powersearch-legend": "Recèrca avançada",
        "powersearch-ns": "Recercar dins los espacis de nom :",
        "powersearch-togglelabel": "Marcar :",
        "powersearch-toggleall": "Tot",
        "powersearch-togglenone": "Pas cap",
+       "powersearch-remember": "Se remembrar de la seleccion per las recèrcas venentas",
        "search-external": "Recèrca extèrna",
        "searchdisabled": "La recèrca sus {{SITENAME}} es desactivada.\nEn esperant la reactivacion, podètz efectuar una recèrca via Google.\nAtencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.",
        "search-error": "Una error s'es producha en recercant : $1",
        "preferences": "Preferéncias",
        "mypreferences": "Preferéncias",
        "prefs-edits": "Nombre d’edicions :",
-       "prefsnologintext2": "$1 per definir las preferéncias d'utilizaire.",
+       "prefsnologintext2": "Connectatz-vos per modificar vòstras preferéncias.",
        "prefs-skin": "Aparéncia",
        "skin-preview": "Previsualizar",
        "datedefault": "Pas cap de preferéncia",
        "prefs-tokenwatchlist": "Geton",
        "prefs-diffs": "Diferéncias",
        "prefs-help-prefershttps": "Aquesta preferéncia serà efectiva al moment de vòstra connexion que ven.",
+       "prefs-tabs-navigation-hint": "Astúcia : Podètz utilizar las flèchas d'esquèrra e de drecha per navigar entre los onglets.",
        "email-address-validity-valid": "L'adreça electronica sembla bona",
        "email-address-validity-invalid": "entrar una adreça electronica valida",
        "userrights": "Gestion dels dreches d'utilizaire",
        "right-move": "Tornar nomenar de paginas",
        "right-move-subpages": "Desplaçar de paginas amb lor sospaginas",
        "right-move-rootuserpages": "Tornar nomenar las paginas de l’utilizaire de banca.",
+       "right-move-categorypages": "Renomenar de paginas de categoria",
        "right-movefile": "Desplaçar los fichièrs",
        "right-suppressredirect": "Crear pas de redireccion dempuèi la pagina anciana en renomenant la pagina",
        "right-upload": "Telecargar de fichièrs",
        "right-deletedtext": "Veire lo tèxte suprimit e las diferéncias entre las versions suprimidas",
        "right-browsearchive": "Recercar de paginas suprimidas",
        "right-undelete": "Restablir una pagina",
-       "right-suppressrevision": "Examinar e restablir las revisions amagadas als administrators",
+       "right-suppressrevision": "Afichar, amagar e desamagar de revisions especificas de paginas per quin utilizaire que siá.",
+       "right-viewsuppressed": "Afichar las revisions amagadas per quin utilizaire que siá",
        "right-suppressionlog": "Veire los jornals privats",
        "right-block": "Blocar d'autres utilizaires en escritura",
        "right-blockemail": "Empachar un utilizaire de mandar de corrièrs electronics",
        "action-createpage": "crear de paginas",
        "action-createtalk": "crear de paginas de discussion",
        "action-createaccount": "crear aqueste compte d'utilizaire",
+       "action-history": "afichar l’istoric d'aquesta pagina",
        "action-minoredit": "marcar aqueste cambiament coma menor",
        "action-move": "tornar nomenar aquesta pagina",
        "action-move-subpages": "tornar nomenar aquesta pagina e sas sospaginas",
        "action-move-rootuserpages": "tornar nomenar las paginas de l’utilizaire de banca.",
+       "action-move-categorypages": "Renomenar de paginas de categoria",
        "action-movefile": "tornar nomenar aqueste fichièr",
        "action-upload": "importar aqueste fichièr",
        "action-reupload": "espotir aqueste fichièr existent",
        "recentchanges-label-plusminus": "La talha de la pagina a cambiat d'aqueste nombre d’octets.",
        "recentchanges-legend-heading": "'''Legenda :'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).",
-       "rcnotefrom": "Çaijós las modificacions efectuadas dempuèi lo <strong>$2</strong> (fins a <strong>$1</strong> afichats).",
+       "rcnotefrom": "Çaijós {{PLURAL:$5|la modificacion efectuada|las modificacions efectuadas}} dempuèi lo <strong>$3, $4</strong> (afichadas fins a <strong>$1</strong>).",
        "rclistfrom": "Afichar las modificacions novèlas dempuèi lo $3 $2",
        "rcshowhideminor": "$1 los cambiaments menors",
        "rcshowhideminor-show": "Afichar",
        "fileexists-shared-forbidden": "Un fichièr amb lo meteis nom existís ja dins la banca de donadas comuna.\nS'o volètz importar tornamai, tornatz en rèire e importatz-lo jos un autre nom. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Aqueste fichièr es un doble {{PLURAL:$1|del fichièr seguent|dels fichièrs seguents}} :",
        "file-deleted-duplicate": "Un fichièr identic a aqueste ([[:$1]]) ja es estat suprimit. Vos caldriá verificar lo jornal de las supressions d'aqueste fichièr abans de la tornar telecargar.",
+       "file-deleted-duplicate-notitle": "Un fichièr identic a aqueste fichièr es ja estat suprimit amai lo títol. \nVos caldriá demandar a qualqu'un la possibilitat de verificar lo jornal d'aqueste fichièr suprimit per tal d'examinar la situacion  abans de l'importar tornarmai.",
        "uploadwarning": "Atencion !",
        "uploadwarning-text": "Modificatz la descripcion del fichièr e ensajatz tornarmai.",
        "savefile": "Salvar lo fichièr",
        "license": "Licéncia&nbsp;:",
        "license-header": "Publicat jos licéncia(s)",
        "nolicense": "Cap de licéncia seleccionada",
+       "licenses-edit": "Modificar las opcions de licéncia",
        "license-nopreview": "(Previsualizacion impossibla)",
-       "upload_source_url": " (una URL valida e accessibla publicament)",
-       "upload_source_file": " (un fichièr sus vòstre ordenador)",
+       "upload_source_url": "(lo fichièr qu'avètz causit dempuèi una URL valida e accessibla publicament)",
+       "upload_source_file": "(vòstre fichièr causit dempuèi vòstre ordenador)",
+       "listfiles-delete": "suprimir",
        "listfiles-summary": "Aquesta pagina especiala permet de far la lista de totes los fichièrs importats.",
        "listfiles_search_for": "Recèrca del mèdia nomenat :",
        "imgfile": "fichièr",
        "randomincategory": "Pagina a l'azard dins la categoria",
        "randomincategory-invalidcategory": "« $1 » es pas un nom de categoria valid.",
        "randomincategory-nopages": "I a pas cap de pagina dins [[:Category:$1]].",
-       "randomincategory-selectcategory": "Prene una pagina a l'azard dins la categoria : $1 $2.",
-       "randomincategory-selectcategory-submit": "Anar",
+       "randomincategory-category": "Categoria :",
+       "randomincategory-legend": "Pagina a l'azard dins la categoria",
        "randomredirect": "Una pagina de redireccion a l'azard",
        "randomredirect-nopages": "I a pas cap de redireccion dins l'espaci de nom « $1 ».",
        "statistics": "Estatisticas",
        "wantedpages-badtitle": "Títol invalid dins los resultats : $1",
        "wantedfiles": "Fichièrs desirats",
        "wantedfiletext-cat": "Los fichièrs seguents son utilizats, mas existisson pas localament. Se se tròban sus un depaus partejat, pòdon èsser listats aicí, mentre que sián, de fach, ja disponibles. Totes aqueles falses positius seràn <del>raiats</del>. Amai, las paginas qu'intègran de fichièrs qu'existisson pas son repertoriadas dins [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Los fichièrs seguents son utilizats mas existisson pas. Amai, las paginas qu'intègran los fichièrs qu'existisson pas son listats dins [[:$1]].",
        "wantedfiletext-nocat": "Los fichièrs seguents son utilizats, mas existisson pas localament. Se se tròban sus un depaus partejat, pòdon èsser listats aicí, mentre que sián, de fach, ja disponibles. Totes aqueles falses positius seràn <del>raiats</del>.",
+       "wantedfiletext-nocat-noforeign": "Los fichièrs seguents son utilizats mas existisson pas.",
        "wantedtemplates": "Modèls demandats",
        "mostlinked": "Paginas mai ligadas",
        "mostlinkedcategories": "Categorias mai utilizadas",
        "booksources": "Obratges de referéncia",
        "booksources-search-legend": "Recercar demest d'obratges de referéncia",
        "booksources-isbn": "ISBN :",
-       "booksources-go": "Validar",
+       "booksources-search": "Recercar",
        "booksources-text": "Vaquí una lista de ligams cap a d’autres sites que vendon de libres nòus e d’ocasion e suls quals trobaretz benlèu d'entresenhas suls obratges que cercatz. {{SITENAME}} es pas ligada a cap d'aquestas societats, a pas l’intencion de ne far la promocion.",
        "booksources-invalid-isbn": "Lo numèro ISBN balhat sembla pas èsser valid ; verificatz s'avètz fach una error al moment de la còpia dempuèi la font.",
        "specialloguserlabel": "Autor :",
        "emailpagetext": "Podètz utilizar lo formulari çaijós per mandar un corrièr electronic a {{GENDER:$1|aqueste utilizaire|aquesta utilizaira}}.\nL'adreça electronica qu'avètz indicada dins [[Special:Preferences|vòstras preferéncias]] apareisserà dins lo camp « Expeditor » de vòstre messatge. E mai, lo destinatari vos poirà respondre dirèctament.",
        "defemailsubject": "{{SITENAME}} Corrièl de l'utilizaire « $1 »",
        "usermaildisabled": "Lo mandadís de corrièrs electronics entre utilizairers es desactivat",
-       "usermaildisabledtext": "Podètz pas mandar de corrièrs electronics a d'autres utilizaires sur aquel wiki",
+       "usermaildisabledtext": "Podètz pas mandar de corrièrs electronics a d'autres utilizaires sus aquel wiki",
        "noemailtitle": "Pas d'adreça electronica",
        "noemailtext": "Aqueste utilizaire a pas especificat d'adreça electronica valida.",
        "nowikiemailtext": "Aqueste utilizaire a causit de recebre pas de corrièr electronic de la part d'autres utilizaires.",
        "mywatchlist": "Lista de seguiment",
        "watchlistfor2": "Per $1 ($2)",
        "nowatchlist": "Vòstra lista de seguiment conten pas cap d'article.",
-       "watchlistanontext": "Per poder afichar o editar los elements de vòstra lista de seguiment, vos cal vos $1.",
+       "watchlistanontext": "Connectatz-vos per visualizar o modificar los elements de vòstra lista de seguiment.",
        "watchnologin": "Vos sètz pas identificat(ada)",
        "addwatch": "Apondre a la lista de seguiment",
        "addedwatchtext": "La pagina « [[:$1]] » es estada aponduda a vòstra [[Special:Watchlist|lista de seguiment]]. Las modificacions venentas d'aquesta pagina e de la pagina de discussion associada i seràn repertoriadas.",
+       "addedwatchtext-short": "La pagina « $1 » es estada aponduda a vòstra lista de seguiment.",
        "removewatch": "Suprimir de la lista de seguiment",
        "removedwatchtext": "La pagina « [[:$1]] » es estada levada de vòstra [[Special:Watchlist|lista de seguiment]].",
+       "removedwatchtext-short": "La pagina « $1 » es estada suprimida de vòstra lista de seguiment.",
        "watch": "Seguir",
        "watchthispage": "Seguir aquesta pagina",
        "unwatch": "Arrestar de seguir",
        "watchlist-details": "I a {{PLURAL:$1|$1 pagina|$1 paginas}} dins vòstra lista de seguiment, sens comptar las paginas de discussion.",
        "wlheader-enotif": "La notificacion per corrièr electronic es activada.",
        "wlheader-showupdated": "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
-       "wlnote": "Çaijós {{PLURAL:$1|se tròba la darrièra modificacion efectuada|se tròban las $1 darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las '''$2''' darrièras oras}} dempuèi $3, $4.",
-       "wlshowlast": "Far veire las darrièras $1 oras, los darrièrs $2 jorns, o $3.",
+       "wlnote": "Çaijós {{PLURAL:$1|figura la darrièra modificacion efectuada|figuran las <strong>$1</strong> darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las <strong>$2</strong> darrièras oras}}, dempuèi $3, $4.",
+       "wlshowlast": "Far veire las darrièras $1 oras, los darrièrs $2 jorns, o .",
        "watchlist-options": "Opcions de la lista de seguiment",
        "watching": "Seguit...",
        "unwatching": "Fin del seguit...",
        "exbeforeblank": "lo contengut abans blanquiment èra :'$1'",
        "delete-confirm": "Escafar «$1»",
        "delete-legend": "Escafar",
-       "historywarning": "'''Atencion :''' La pagina que s�tz a mand de suprimir a un istoric que conten aproximadament $1 {{PLURAL:$1|revision|revisions}} :",
+       "historywarning": "<strong>Atencion :</strong> la pagina que sètz a mand de suprimir a un istoric amb $1 {{PLURAL:$1|version|versions}} :",
        "confirmdeletetext": "Sètz a mand de suprimir una pagina o un fichièr, e mai totas sas versions anterioras istorizadas.\nConfirmatz qu'es plan çò que volètz far, que ne comprenètz las consequéncias e que fasètz aquò en acòrdi amb las [[{{MediaWiki:Policy-url}}|règlas intèrnas]].",
        "actioncomplete": "Accion efectuada",
        "actionfailed": "L’accion a fracassat",
        "delete-edit-reasonlist": "Modifica los motius de la supression",
        "delete-toobig": "Aquesta pagina dispausa d'un istoric important, depassant {{PLURAL:$1|revision|revisions}}.\nLa supression de talas paginas es estada limitada per evitar de perturbacions accidentalas de {{SITENAME}}.",
        "delete-warning-toobig": "Aquesta pagina dispausa d'un istoric important, depassant {{PLURAL:$1|revision|revisions}}.\nLa suprimir pòt perturbar lo foncionament de la banca de donada de {{SITENAME}}.\nD'efectuar amb prudéncia.",
+       "deleteprotected": "Podètz pas suprimir aquesta pagina perque es estada protegida.",
        "rollback": "Anullar las modificacions",
        "rollback_short": "Anullar",
        "rollbacklink": "anullar",
        "protect-othertime": "Autra expiracion :",
        "protect-othertime-op": "Autra expiracion",
        "protect-existing-expiry": "Durada d’expiracion existenta : $2 a $3",
+       "protect-existing-expiry-infinity": "Relambi d’expiracion existent : infinit",
        "protect-otherreason": "Motiu suplementari o autre :",
        "protect-otherreason-op": "Autra rason",
        "protect-dropdown": "*Motius de proteccion mai corrents\n** Vandalisme excessiu\n** Spam excessiu\n** Guèrra d'edicion\n** Pagina de trafic fòrt",
        "autoblockid": "Blocatge automatic #$1",
        "block": "Blocar un utilizaire",
        "unblock": "Desblocar un utilizaire",
-       "blockip": "Blocar en escritura",
+       "blockip": "Blocar l’{{GENDER:$1|utilizaire|utilizaira}}",
        "blockip-legend": "Blocar en escritura",
        "blockiptext": "Utilizatz lo formulari çaijós per blocar l'accès a las modificacions a partir d'una adreça IP especifica o d'un nom d'utilizaire.\nUna tala mesura deu pas èsser presa pas que per empachar lo vandalisme e en acòrdi amb las [[{{MediaWiki:Policy-url}}|règlas intèrnas]].\nDonatz çaijós un motiu precís (per exemple en citant las paginas que son estadas vandalizadas).",
        "ipaddressorusername": "Adreça IP o nom d’utilizaire :",
        "ipb-unblock-addr": "Desblocar $1",
        "ipb-unblock": "Desblocar un compte d'utilizaire o una adreça IP",
        "ipb-blocklist": "Vejatz los blocatges existents",
-       "ipb-blocklist-contribs": "Contribucions per $1",
+       "ipb-blocklist-contribs": "Contribucions per {{GENDER:$1|$1}}",
        "unblockip": "Desblocar un utilizaire o una adreça IP",
        "unblockiptext": "Utilizatz lo formulari çaijós per restablir l'accès en escritura\na partir d'una adreça IP precedentament blocada.",
        "ipusubmit": "Suprimir aqueste blocatge",
        "movenotallowedfile": "Avètz pas la permission de desplaçar los fichièrs.",
        "cant-move-user-page": "Avètz pas la permission de tornar nomenar de paginas d'utilizaires raices sus aqueste wiki.",
        "cant-move-to-user-page": "Avètz pas la permission de tornar nomenar una pagina cap a una pagina d'utilizaire (a l'excepcion d'una sospagina).",
+       "cant-move-category-page": "Avètz pas la permission de renomenar las paginas de categorias.",
        "newtitle": "Títol novèl",
        "move-watch": "Seguir aquesta pagina",
        "movepagebtn": "Tornar nomenar l'article",
        "import": "Importar de paginas",
        "importinterwiki": "Impòrt interwiki",
        "import-interwiki-text": "Seleccionatz un wiki e un títol de pagina d'importar.\nLas datas de las versions e los noms dels editors seràn preservats.\nTotas las accions d’importacion interwiki son conservadas dins lo [[Special:Log/import|jornal d’impòrt]].",
-       "import-interwiki-source": "Wiki e pagina font :",
+       "import-interwiki-sourcewiki": "Wiki font :",
+       "import-interwiki-sourcepage": "Pagina font :",
        "import-interwiki-history": "Copiar totas las versions de l'istoric d'aquesta pagina",
        "import-interwiki-templates": "Enclure totes los modèls",
        "import-interwiki-submit": "Importar",
        "import-invalid-interwiki": "Impossible d'importar dempuèi lo wiki especificat.",
        "import-error-edit": "La pagina « $1 » es pas estada importada perque sètz pas autorizat a la modificar.",
        "import-error-create": "La pagina « $1 » es pas estada importada perque sètz pas autorizat a la crear.",
-       "import-error-invalid": "Pagina « $1 » es pas importada perque son nom es pas valid.",
+       "import-error-invalid": "Pagina « $1 » es pas importada perque lo nom amb lo qual seriá estada importada es pas valid sus aqueste wiki.",
        "import-options-wrong": "{{PLURAL:$2|Marrida opcion|Marridas opcions}} : <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "La pagina raiç provesida es un títol invalid.",
        "import-rootpage-nosubpage": "L'espaci de noms « $1 » de la pagina raiç autoriza pas las sospaginas.",
        "importlogpage": "Istoric de las importacions de paginas",
        "importlogpagetext": "Impòrts administratius de paginas amb l’istoric a partir dels autres wikis.",
        "import-logentry-upload": "a importat (telecargament) [[$1]]",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versions}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision importada|revisions importadas}}",
        "import-logentry-interwiki": "a importat (transwiki) $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versions}} dempuèi $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision importada|revisions importadas}} dempuèi $2",
        "javascripttest": "Tèst de JavaScript",
        "javascripttest-title": "Execucion dels tèsts $1",
        "javascripttest-pagetext-noframework": "Aquesta pagina es reservada per l'execucion dels tèsts JavaScript.",
        "newimages-summary": "Aquesta pagina especiala aficha los darrièrs fichièrs importats.",
        "newimages-legend": "Filtre",
        "newimages-label": "Nom del fichièr (o una partida d'aqueste) :",
+       "newimages-showbots": "Afichar los impòrts per de robòts",
        "noimages": "Cap d'imatge d'afichar pas.",
        "ilsubmit": "Cercar",
        "bydate": "per data",
        "exif-urgency-low": "Febla ($1)",
        "exif-urgency-high": "Nauta ($1)",
        "exif-urgency-other": "Urgéncia definida per l'utilizaire ($1)",
-       "watchlistall2": "tot",
        "namespacesall": "Totes",
        "monthsall": "totes",
        "confirmemail": "Confirmar l'adreça de corrièr electronic",
        "scarytranscludetoolong": "[L’URL es tròp longa]",
        "deletedwhileediting": "'''Atencion''' : aquesta pagina es estada suprimida aprèp qu'avètz començat de la modificar !",
        "confirmrecreate": "L'utilizaire [[User:$1|$1]] ([[User talk:$1|talk]]) a suprimit aquesta pagina, alara que l'aviatz començat d'editar, pel motiu seguent:\n: ''$2''\nConfirmatz que desiratz tornar crear aqueste article.",
+       "confirmrecreate-noreason": "L'utilizaire [[User:$1|$1]] ([[User talk:$1|Discussion]]) a suprimit aquesta pagina, mentre qu'aviatz començat de la modificar. Confirmatz que desiratz tornar crear aquesta pagina.",
        "recreate": "Tornar crear",
        "confirm_purge_button": "Confirmar",
        "confirm-purge-top": "Volètz refrescar aquesta pagina (purgar l'escondedor) ?",
        "autosumm-replace": "Resumit automatic : contengut remplaçat per « $1 ».",
        "autoredircomment": "Redireccion cap a [[$1]]",
        "autosumm-new": "Creacion de la pagina amb « $1 »",
+       "autosumm-newblank": "Pagina voida creada",
        "size-bytes": "$1 o",
        "size-kilobytes": "$1 Ko",
        "size-megabytes": "$1 Mo",
        "watchlistedit-raw-done": "Vòstra lista de seguiment es estada mesa a jorn.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Una pagina es estada aponduda|$1 paginas son estadas apondudas}} :",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Una pagina es estada levada|$1 paginas son estadas levadas}} :",
+       "watchlistedit-clear-title": "Lista de seguiment voidada",
+       "watchlistedit-clear-legend": "Escafar la lista de seguiment",
+       "watchlistedit-clear-explain": "Totes los títols seràn suprimits de vòstra lista de seguiment",
+       "watchlistedit-clear-titles": "Títols :",
+       "watchlistedit-clear-submit": "Escafar la lista de seguiment (aquò es permanent !)",
+       "watchlistedit-clear-done": "Vòstra lista de seguiment es estada escafada.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Un títol es estat levat|$1 títols son estats levats}} :",
+       "watchlistedit-too-many": "I a tròp de paginas d'afichar aicí.",
+       "watchlisttools-clear": "Escafar la lista de seguiment",
        "watchlisttools-view": "Lista de seguiment",
        "watchlisttools-edit": "Veire e modificar la lista de seguiment",
        "watchlisttools-raw": "Modificar la lista (mòde brut)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
        "unknown_extension_tag": "Balisa d'extension « $1 » desconeguda",
        "duplicate-defaultsort": "Atencion : La clau de triada per defaut « $2 » espotís la mai recenta « $1 ».",
+       "duplicate-displaytitle": "<strong>Atencion :</strong> Lo títol d'afichatge «$2» remplaça l'ancian títol d'afichatge «$1».",
        "version": "Version",
        "version-extensions": "Extensions installadas",
        "version-skins": "Abilhatges installats",
        "version-hook-name": "Nom del croquet",
        "version-hook-subscribedby": "Definit per",
        "version-version": "(Version $1)",
+       "version-no-ext-name": "[sens nom]",
        "version-license": "Licéncia de MediaWiki",
        "version-ext-license": "Licéncia",
        "version-ext-colheader-name": "Extensions",
+       "version-skin-colheader-name": "Aparéncia",
+       "version-ext-colheader-version": "Version",
        "version-ext-colheader-license": "Licéncia",
        "version-ext-colheader-description": "Descripcion",
        "version-ext-colheader-credits": "Autors",
        "htmlform-no": "Non",
        "htmlform-yes": "Òc",
        "htmlform-chosen-placeholder": "Causir una opcion",
+       "htmlform-cloner-create": "Apondre encara",
+       "htmlform-cloner-delete": "Suprimir",
+       "htmlform-cloner-required": "Una valor al mens es obligatòria.",
        "sqlite-has-fts": "$1 amb recèrca en tèxte integral suportada",
        "sqlite-no-fts": "$1 sens recèrca en tèxte integral suportada",
        "logentry-delete-delete": "$1 {{GENDER:$2|a suprimit}} la pagina $3",
        "logentry-rights-rights": "$1 {{GENDER:$2|a modificat}} l'apartenéncia al grop per $3 de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a modificat}} l'apartenéncia al grop per $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|es estat promolgut}} automaticament de $4 a $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|a mandat}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|a telecargat}} una novèla version de $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|a telecargat}} $3",
        "rightsnone": "(cap)",
+       "revdelete-summary": "modificar lo somari",
        "feedback-subject": "Subjècte :",
        "feedback-message": "Messatge :",
        "feedback-cancel": "Anullar",
        "expand_templates_remove_nowiki": "Suprimís los marcadors <nowiki> dins lo resultat",
        "expand_templates_generate_xml": "Veire l'arborescéncia XML",
        "expand_templates_generate_rawhtml": "Afichar lo HTML brut",
-       "expand_templates_preview": "Previsualizacion"
+       "expand_templates_preview": "Previsualizacion",
+       "pagelanguage": "Selector de lenga de la pagina",
+       "pagelang-name": "Pagina",
+       "pagelang-language": "Lenga",
+       "pagelang-use-default": "Utilizar la lenga per defaut",
+       "pagelang-select-lang": "Seleccionar la lenga",
+       "right-pagelang": "Cambiar la lenga de la pagina",
+       "action-pagelang": "cambiar la lenga de la pagina",
+       "log-name-pagelang": "Traçar los cambiaments de lenga",
+       "log-description-pagelang": "Aquò es un jornal dels cambiaments dins las lengas de las paginas.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a cambiat}} la lenga de la pagina $3 de $4 a $5.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activat)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desactivat''')",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 octet|$1 octets}} ($2 ; $3%)",
+       "mediastatistics-table-mimetype": "Tipe MIME",
+       "mediastatistics-table-extensions": "Extensions possiblas",
+       "mediastatistics-table-count": "Nombre de fichièrs",
+       "mediastatistics-table-totalbytes": "Talha combinada",
+       "mediastatistics-header-unknown": "Desconegut",
+       "mediastatistics-header-bitmap": "Imatges Bitmap",
+       "mediastatistics-header-drawing": "Dessenhs (imatges vectorials)",
+       "mediastatistics-header-audio": "Àudio",
+       "mediastatistics-header-video": "Vidèos",
+       "mediastatistics-header-multimedia": "Mèdia ric",
+       "mediastatistics-header-office": "Burotica",
+       "mediastatistics-header-text": "Textual",
+       "mediastatistics-header-executable": "Executables",
+       "mediastatistics-header-archive": "Formats compressats",
+       "json-error-syntax": "Error de sintaxi"
 }
index a9dcc46..c3eaea2 100644 (file)
@@ -28,6 +28,7 @@
        "tog-watchdefault": "ମୁଁ ବଦଳେଇଥିବା ପୃଷ୍ଠା ଏବଂ ଫାଇଲଗୁଡ଼ିକୁ ମୋର ଦେଖଣାତାଲିକାରେ ଯୋଡ଼ନ୍ତୁ",
        "tog-watchmoves": "ମୁଁ ଘୁଞ୍ଚାଇଥିବା ପୃଷ୍ଠା ଏବଂ ଫାଇଲଗୁଡ଼ିକୁ ମୋର ଦେଖଣାତାଲିକାରେ ଯୋଡ଼ନ୍ତୁ",
        "tog-watchdeletion": "ମୁଁ ଲିଭାଇଥିବା ପୃଷ୍ଠା ଏବଂ ଫାଇଲଗୁଡ଼ିକୁ ମୋର ଦେଖଣାତାଲିକାରେ ଯୋଡ଼ନ୍ତୁ",
+       "tog-watchrollback": "ମୁଁ ପଛକୁ ଫେରାଇଦେଇଥିବା ମୋ ଦେଖଣାତାଲିକାର ପୃଷ୍ଠାସବୁକୁ ଯୋଡ଼ନ୍ତୁ",
        "tog-minordefault": "ସବୁଯାକ ସମ୍ପାଦନାକୁ ଛାଏଁ ଛୋଟ ବଦଳ ଭାବରେ ସୂଚିତ କରିବେ",
        "tog-previewontop": "ଏଡ଼ିଟ ବାକ୍ସ ଆଗରୁ ଦେଖଣା ଦେଖାଇବେ",
        "tog-previewonfirst": "ପ୍ରଥମ ବଦଳର ଦେଖଣା ଦେଖାଇବେ",
        "otherlanguages": "ଅଲଗା ଭାଷାରେ",
        "redirectedfrom": "($1 ରୁ ଲେଉଟି ଆସିଛି)",
        "redirectpagesub": "ଆଉଥରେ ଫେରିବା ପୃଷ୍ଠା",
+       "redirectto": "କେଉଁଠାକୁ ଲେଉଟାଣି:",
        "lastmodifiedat": "ଏହି ପୃଷ୍ଠାଟି $1 ତାରିଖ $2 ବେଳେ ବଦଳାଯାଇଥିଲା ।",
        "viewcount": "ଏହି ପୃଷ୍ଠାଟି {{PLURAL:$1|ଥରେ|$1 ଥର}} ଖୋଲାଯାଇଛି ।",
        "protectedpage": "କିଳାଯାଇଥିବା ପୃଷ୍ଠା",
        "jumptonavigation": "ଦିଗବାରେଣିକୁ",
        "jumptosearch": "ଖୋଜିବେ",
        "view-pool-error": "କ୍ଷମା କରିବେ, ସର୍ଭରସବୁ ଏବେ ମନ୍ଦ ହୋଇଯାଇଅଛନ୍ତି ।\nଅନେକ ସଭ୍ୟ ଏହି ଏକା ପୃଷ୍ଠାଟି ଦେଖିବାକୁ ଚେଷ୍ଟାକରୁଅଛନ୍ତି ।\nଏହି ପୃଷ୍ଠାକୁ ଆଉଥରେ ଖୋଲିବା ଆଗରୁ ଦୟାକରି କିଛି କ୍ଷଣ ଅପେକ୍ଷା କରନ୍ତୁ ।\n$1",
+       "generic-pool-error": "କ୍ଷମା କରିବେ, ସର୍ଭରସବୁ ଏବେ ଓଭରଲୋଡ଼ ଯାଇଛନ୍ତି ।\nଅନେକ ସଭ୍ୟ ଏହି ଏକା ପୃଷ୍ଠାଟି ଦେଖିବାକୁ ଚେଷ୍ଟା କରୁଛନ୍ତି ।\nଏହି ପୃଷ୍ଠାକୁ ଆଉଥରେ ଖୋଲିବା ଆଗରୁ ଦୟାକରି କିଛି କ୍ଷଣ ଅପେକ୍ଷା କରନ୍ତୁ ।",
        "pool-timeout": "ତାଲା ଖୋଲାଯିବା ପାଇଁ ଅପେକ୍ଷା କରୁକରୁ ସମୟ ସରିଗଲା",
        "pool-queuefull": "ପୁଲ ଧାଡ଼ିଟି ଭରିଯାଇଅଛି",
        "pool-errorunknown": "ଅଜଣା ଅସୁବିଧା",
+       "pool-servererror": "ଏହି ପୁଲ କାଉଣ୍ଟର ସର୍ଭିସ ଉପଲବ୍ଧ ($1) ନାହିଁ ।",
        "aboutsite": "{{SITENAME}} ବାବଦରେ",
        "aboutpage": "Project:ବାବଦରେ",
        "copyright": "ଯଦି ଉଲ୍ଲେଖ ହୋଇନାହିଁ ଏହା $1 ଅଧୀନରେ ବିତରିତ ।",
        "hidetoc": "ଲୁଚାନ୍ତୁ",
        "collapsible-collapse": "ଲୁଚାଇବେ",
        "collapsible-expand": "ଦେଖାଇବେ",
+       "confirmable-confirm": "{{GENDER:$1|ଆପଣ}} ନିଶ୍ଚିତ କି?",
+       "confirmable-yes": "ହଁ",
+       "confirmable-no": "ନାଁ",
        "thisisdeleted": "$1 କୁ ଦେଖିବେ ଅବା ପୁନସ୍ଥାପନ କରିବେ?",
        "viewdeleted": "ଦେଖିବା $1?",
        "restorelink": "{{PLURAL:$1|ଗୋଟିଏ ଲିଭାଯାଇଥିବା ବଦଳ|$1ଟି ଲିଭାଯାଇଥିବା ବଦଳ}}",
        "site-atom-feed": "$1 ଆଟମ ଫିଡ଼",
        "page-rss-feed": "$1 ଟି ଆରେସେସ ଫିଡ଼",
        "page-atom-feed": "$1 ଟି ଆଟମ ଫିଡ଼",
-       "red-link-title": " $1 (ପୃଷ୍ଠାଟି ନାହିଁ)",
+       "red-link-title": "$1 (ପୃଷ୍ଠାଟି ନାହିଁ)",
        "sort-descending": "ବଡ଼ରୁ ସାନ କ୍ରମେ ସଜାନ୍ତୁ",
        "sort-ascending": "ସାନରୁ ବଡ଼ କ୍ରମେ ସଜାନ୍ତୁ",
        "nstab-main": "ପୃଷ୍ଠା",
        "cannotdelete": "\"$1\" ପୃଷ୍ଠା ବା ଫାଇଲଟି ଲିଭାଯାଇପାରିବ ନାହିଁ । ଏହା ଆଗରୁ କାହା ଦେଇ ବୋଧେ ଲିଭାଇ ଦିଆଯାଇଛି ।",
        "cannotdelete-title": "\"$1\" ପୃଷ୍ଠାଟି ଲିଭଯାଇପାରିବ ନାହିଁ",
        "delete-hook-aborted": "ସମ୍ପାଦନା ଏକ ହୁକ (hook) ଦେଇ ବାରଣ କରାଗଲା ।\nଏହା କିଛି ବି କାରଣ ଦେଇନାହିଁ ।",
+       "no-null-revision": "\"$1\" ପୃଷ୍ଠାଟି ପାଇଁ ଫାଙ୍କା ସଂସ୍କରଣଟିଏ ତିଆରି କରିପାରିଲୁ ନାହିଁ",
        "badtitle": "ଖରାପ ନାଆଁ",
        "badtitletext": "ଆପଣ ଅନୁରୋଧ କରିଥିବା ପୃଷ୍ଠାଟି ଭୁଲ, ଖାଲି ଅଛି ବା ବାକି ଭାଷା ସାଙ୍ଗରେ ଭୁଲରେ ଯୋଡ଼ା ଯାଇଛି ବା ଭୁଲ ଇଣ୍ଟର ଉଇକି ନାମ ଦିଆଯାଇଛି ।\nଏଥିରେ ଥିବା ଗୋଟିଏ ବା ଦୁଇଟି ଅକ୍ଷର ଶିରୋନାମା ଭାବରେ ବ୍ୟବହାର କରାଯାଇ ପାରିବ ନାହିଁ ।",
        "perfcached": "ତଳଲିଖିତ ତଥ୍ୟଗୁଡିକୁ ଅସ୍ଥାୟୀ ଭାବେ ରଖାଗଲା ଏବଂ ଏହା ଅପଡେଟ ନ ହୋଇପାରେ । ଅତିବେଶିରେ {{PLURAL:$1|ଫଳ|$1ଫଳଗୁଡିକ }} ଅସ୍ଥାୟୀ ରୂପେ ରହି ପାରିବ ।",
        "namespaceprotected": "ଆପଣଙ୍କୁ ଏହି '''$1''' ନେମସ୍ପେସ ଥିବା ପୃଷ୍ଠାରେ ସମ୍ପାଦନା କରିବା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ ।",
        "customcssprotected": "ଆପଣଙ୍କୁ ଏହି CSS ପୃଷ୍ଠାର ସମ୍ପାଦନା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ, କାରଣ ଏଥିରେ ଆଉଜଣେ ସଭ୍ୟଙ୍କର ବ୍ୟକ୍ତିଗତ ସଜାଣି ରହିଅଛି ।",
        "customjsprotected": "ଆପଣଙ୍କୁ ଏହି ଜାଭାସ୍କ୍ରିପ୍ଟ ପୃଷ୍ଠାର ସମ୍ପାଦନା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ, କାରଣ ଏଥିରେ ଆଉଜଣେ ସଭ୍ୟଙ୍କର ବ୍ୟକ୍ତିଗତ ସଜାଣି ରହିଅଛି ।",
+       "mycustomcssprotected": "ଏହି CSS ପୃଷ୍ଠାଟି ସମ୍ପାଦନା ପାଇଁ ଆପଣଙ୍କୁ ଅନୁମତି ମିଳିନାହିଁ ।",
+       "mycustomjsprotected": "ଏହି JavaScript ପୃଷ୍ଠାଟି ସମ୍ପାଦନା କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଅନୁମତି ମିଳିନାହିଁ ।",
+       "myprivateinfoprotected": "ନିଜର ଗୋପନୀୟ ସୂଚନା ସମ୍ପାଦନା କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଅନୁମତି ମିଳିନାହିଁ ।",
+       "mypreferencesprotected": "ନିଜର ପସନ୍ଦ ସମ୍ପାଦନା କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଅନୁମତି ମିଳିନାହିଁ ।",
        "ns-specialprotected": "ବିଶେଷ ପୃଷ୍ଠାସବୁକୁ ବଦଳାଯାଇପାରିବ ନାହିଁ ।",
        "titleprotected": "ଏହି ନାମଟି [[User:$1|$1]]ଙ୍କ ଦେଇ ନୂଆ ତିଆରିହେବାରୁ କିଳାଯାଇଅଛି ।\nଏହାର କାରଣ ହେଲା \"''$2''\" ।",
        "filereadonlyerror": "ଫାଇଲ ଧାରକ \"$2\"ଟି ଖାଲି ପଢିବା ହେବାଭଳି ରହିଥିବା ହେତୁ ଏଥିରେ ଥିବା $1 ପାଇଲଟିକୁ ବଦଳା ଯାଇପାରିବ ନାହିଁ ।\n\nଯେଉଁ ପରିଚ୍ଛା ଏହାକୁ ବନ୍ଦ କରିଛନ୍ତି ସେ ଏହି ବିବରଣୀ ଦେଇଛନ୍ତି: \"$3\"",
        "invalidtitle-knownnamespace": "\"$2\" ନେମସ୍ପେସ ଏବଂ \"$3\" ଲେଖାଥିବା ଅବୈଧ ଶୀର୍ଷକ ।",
        "invalidtitle-unknownnamespace": "\"$1\" ନେମ୍ସ୍ପେସ ଏବଂ \"$2\" ଲେଖାଥିବା ଅବୈଧ ଶୀର୍ଷକ ।",
        "exception-nologin": "ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି",
-       "exception-nologin-text": "ଏହି ପୃଷ୍ଠା ପଢ଼ିବା ପାଇଁ ଦୟାକରି [[Special:Userlogin|ଲଗ ଇନ]] କରନ୍ତୁ ।",
+       "exception-nologin-text": "ଏହି ପୃଷ୍ଠା ପଢ଼ିବା ପାଇଁ ଦୟାକରି ଲଗ ଇନ କରନ୍ତୁ ।",
        "exception-nologin-text-manual": "ଏହି ପୃଷ୍ଠା ଦେଖିବା ନିମନ୍ତେ $1 କରନ୍ତୁ ।",
        "virus-badscanner": "ମନ୍ଦ ସଂରଚନା: ଅଜଣା ଭାଇରସ ସ୍କାନର: ''$1''",
        "virus-scanfailed": "ସ୍କାନ କରିବା ବିଫଳ ହେଲା (କୋଡ଼ $1)",
        "createaccount-text": "କେହି ଜଣେ ଆପଣଙ୍କ ଇ-ମେଲ ଠିକଣାରେ {{SITENAME}} ($4) ରେ \"$2\" ନାମରେ, \"$3\" ପାସୱାର୍ଡ଼ରେ ଖାତାଟିଏ ତିଆରି କରିଅଛି ।\nଆପଣ ଏବେ ଲଗ ଇନ କରି ନିଜର ପାସବାର୍ଡ଼ଟିକୁ ବଦଳାଇଦିଅନ୍ତୁ ।\n\nଯଦି ଭୁଲରେ ଏହି ଖାତାଟି ତିଆରି କରାଯାଇଥାଏ, ତେବେ ଏହି ସୂଚନାଟିକୁ ଅଣଦେଖା କରିବେ ।",
        "login-throttled": "ଆପଣ ନିକଟରେ ଖୁବ ଅଧିକ ଥର ଲଗ ଇନ କରିବାକୁ ଚେଷ୍ଟା କରିଛନ୍ତି ।\nଆଉ ଅଧିକ ଥର ଚେଷ୍ଟା କରିବା ଆଗରୁ ଦୟାକରି $1 ପାଇଁ ଅପେକ୍ଷା କରନ୍ତୁ ।",
        "login-abort-generic": "ଆପଣଙ୍କ ଲଗ ଇନ ଅସଫଳ ହେଲା - ନାକଚ କରିଦିଆଗଲା",
+       "login-migrated-generic": "ଆପନଙ୍କ ଖାତା ଘୁଞ୍ଚାଯାଇଛି ଏବଂ ଏହି ଉଇକିରେ ଏହା ଆଉ ନାହିଁ ।",
        "loginlanguagelabel": "ଭାଷା: $1",
        "suspicious-userlogout": "ଲଗ ଆଉଟ କରିବା ନିମନ୍ତେ ଆପଣ କରିଥିବା ଆବେଦନ ନାକଚ କରିଦିଆଗଲା କାରଣ ଲାଗୁଅଛି ଯେ ଏହା ଏକ ଅସ୍ଥିର ବ୍ରାଉଜରରୁ ପଠାଯାଇଅଛି ଅବା ପ୍ରକ୍ସି ଧରାଯାଇଅଛି ।",
        "createacct-another-realname-tip": "ପ୍ରକୃତ ନାମ ଦେବା ଆପଣଙ୍କ ଉପରେ ନିର୍ଭର କରେ ।\nଯଦି ଆପଣ ଏହା ଦିଅନ୍ତି, ତେବେ ଏହା ଆପଣଙ୍କ କାମ ପାଇଁ ଶ୍ରେୟ ଦେବାରେ ବ୍ୟବହାର କରାଯାଇପାରିବ ।",
        "resetpass-temp-password": "ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼:",
        "resetpass-abort-generic": "ଏକ ଏକ୍ସଟେନସନ ଦ୍ୱାରା ପାସୱାର୍ଡ଼ ବଦଳ କରିବା ରଦ୍ଦ କରାଯାଇଛି ।",
        "resetpass-expired": "ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ ଅଚଳ ହୋଇଯାଇଛି । ଦୟାକରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ଦିଅନ୍ତୁ ।",
+       "resetpass-expired-soft": "ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ର ଅବଧି ସରିଯାଇଛି ଓ ଆଉଥରେ ବଦଳାଇବାକୁ ପଡ଼ିବ । ଦୟାକରି ଏବେ ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ କିମ୍ବା \"{{int:resetpass-submit-cancel}}\"ରେ କ୍ଲିକ କରି ପରେ ରିସେଟ କରନ୍ତୁ ।",
+       "resetpass-validity-soft": "ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ ବୈଧ ନୁହେଁ: $1\n\nଦୟାକରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ତିଆରି କରନ୍ତୁ, କିମ୍ବା ପରେ ରିସେଟ କରିବା ପାଇଁ \"{{int:resetpass-submit-cancel}}\"ରେ କ୍ଲିକ କରନ୍ତୁ ।",
        "passwordreset": "ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ",
        "passwordreset-text-one": "ଏକ ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ ପାଇବା ପାଇଁ ଏହି ଫର୍ମଟି ସମ୍ପୂର୍ଣ୍ଣ ଭାବେ ପୂରଣ କରନ୍ତୁ ।",
+       "passwordreset-text-many": "{{PLURAL:$1|ଇମେଲ ଯୋଗେ ଏକ ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ ପାଇବା ପାଇଁ ତଳ ଘର ମଧ୍ୟରୁ ଗୋଟେ ଭରନ୍ତୁ ।}}",
        "passwordreset-legend": "ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ",
        "passwordreset-disabled": "ପାସୱାର୍ଡ଼କୁ ପୁରାପୁରି ମୂଳକୁ ଫେରାଇବା ଏହି ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।",
        "passwordreset-emaildisabled": "ଏହି ଉଇକିରେ ଇମେଲ ସୁବିଧା ଅଚଳ କରାଯାଇଅଛି ।",
        "passwordreset-emailsent-capture": "ତଳେ ଦେଖାଯାଉଥିବା ଭଳି, ପାସୱାର୍ଡ଼ ପୁନଃସ୍ଥାପନ ଇମେଲଟିଏ ପଠାଇଦିଆଯାଇଛି ।",
        "passwordreset-emailerror-capture": "ପାସୱାର୍ଡ଼ ବଦଳାଇବା ସୂଚନା ସହ ଇମେଲଟିଏ ତିଆରି ହୋଇଛି, ଯାହା ତଳେ ଦେଖିପାରିବେ । କିନ୍ତୁ ଏହାକୁ {{GENDER:$2|ସଭ୍ୟ}}ଙ୍କୁ ପଠାଇବାରେ ବିଫଳ ହେଲୁ, କାରଣ: $1",
        "changeemail": "ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ",
-       "changeemail-header": "ଖାତା ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ",
        "changeemail-text": "ଆପଣା ଇ-ମେଲ ଠିକଣା ବଦଳାଇବା ନିମନ୍ତେ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ । ଆପଣଙ୍କୁ ଏହି ବଦଳ ଥୟ କରିବା ପାଇଁ ନିଜର ପାସୱାର୍ଡ଼ ଦେବାକୁ ପଡ଼ିବ ।",
        "changeemail-no-info": "ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।",
        "changeemail-oldemail": "ଏବେକାର ଇ-ମେଲ ଠିକଣା:",
        "changeemail-none": "(କିଛି ନାହିଁ)",
        "changeemail-password": "ଆପଣଙ୍କ {{SITENAME}} ପାସୱାର୍ଡ",
        "changeemail-submit": "ଇ-ମେଲ ପରିର୍ବତ୍ତନ କରନ୍ତୁ",
-       "changeemail-cancel": "ନାକଚ",
        "changeemail-throttled": "ଆପଣ ଏକାଧିକ ଥର ଲଗ ଇନ କରିବାକୁ ଚେଷ୍ଟା କରିଥାଇପାରନ୍ତି ।\nଆଉଥରେ ଚେଷ୍ଟା କରିବା ଆଗରୁ ଦୟାକରି $1 ଅପେକ୍ଷା କରନ୍ତୁ ।",
        "resettokens": "ଟୋକନ ରିସେଟ କରନ୍ତୁ",
+       "resettokens-text": "ଏଠାରେ, ନିଜର ଖାତା ସହ ଯୋଡ଼ା କେତେକ ଗୋପନୀୟ ତଥ୍ୟ ଜାଣିବାକୁ ଲୋଡ଼ା ପଡ଼ୁଥିବା ଟୋକନ ରିସେଟ କରିପାରିବେ ।\n\nଆପଣ ଯଦି ଦୈବାତ କେବେ ନିଜର ଟୋକନ ଆଉ କାହାକୁ ଜଣାଇଥାନ୍ତି କିମ୍ବା ଆପଣଙ୍କ ଖାତା ଆଉ କାହା ଦେଇ ଖୋଲାଯାଇଥିଲେ ନିଶ୍ଚିତ ରିସେଟ କରନ୍ତୁ ।",
        "resettokens-no-tokens": "ରିସେଟ କରିବା ପାଇଁ ଆଉ ଟୋକନ ନାହିଁ ।",
        "resettokens-legend": "ଟୋକନ ରିସେଟ କରନ୍ତୁ",
        "resettokens-tokens": "ଟୋକନମାନ:",
        "resettokens-token-label": "$1 (ବର୍ତ୍ତମାନ: $2)",
+       "resettokens-watchlist-token": "[[Special:Watchlist|ନିଜର ଦେଖଣାତାଲିକରେ ହେଉଥିବା ବଦଳ}}ର ୱେବ ଫିଡ଼ ପାଇଁ ଟୋକନ (ଆଟମ/RSS)",
        "resettokens-done": "ଟୋକନ ରିସେଟ ହେଲା ।",
        "resettokens-resetbutton": "ବଛାଯାଇଥିବା ଟୋକନ ରିସେଟ କରନ୍ତୁ",
        "bold_sample": "ମୋଟା ଲେଖା",
        "preview": "ସାଇତିବା ଆଗରୁ ଦେଖନ୍ତୁ",
        "showpreview": "ଦେଖଣା [Preview]",
        "showdiff": "ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
-       "anoneditwarning": "'''ସାବଧାନ:''' ଆପଣ ଲଗ-ଇନ କରିନାହାନ୍ତି ।\nଏହି ପୃଷ୍ଠାର ଇତିହାସରେ ଆପଣଙ୍କ IP Address ଟି ସାଇତା ହୋଇଯିବ ।",
+       "blankarticle": "<strong>ଚେତାବନୀ:</strong> ଆପଣ ସମ୍ପାଦନା କରୁଥିବା ଏହି ପୃଷ୍ଠାଟି ଫାଙ୍କା ଅଛି ।\nଯଦି ଆପଣ \"{{int:savearticle}}\" ଉପରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ପୃଷ୍ଠାଟି କୌଣସି ବିଷୟବସ୍ତୁ ନଥାଇ ତିଆରି ହୋଇଯିବ ।",
+       "anoneditwarning": "<strong>ସାବଧାନ:</strong> ଆପଣ ଲଗ-ଇନ କରିନାହାନ୍ତି । ଅଧିକ ସମ୍ପାଦନା କଲେ ଆପଣଙ୍କ IP Address ଟି ସମସ୍ତଙ୍କୁ ଦେଖାଯିବ । <strong>[$1ଲଗ ଇନ କଲେ]</strong> କିମ୍ବା <strong>[$2 ନୂଆ ଖାତାଟିଏ ତିଆରି କଲେ]</strong>, ଆପଣଙ୍କ ସମ୍ପାଦନାର ଶ୍ରେୟ ଅନ୍ୟାନ୍ୟ ସୁବିଧା ସହିତ ଆପଣଙ୍କ ଇଉଜର ନାମରେ ଦିଆହେବ ।",
        "anonpreviewwarning": "''ଆପଣ ଲଗ ଇନ କରି ନାହାନ୍ତି । ବଦଳକରି ସାଇତିଲେ ଆପଣଙ୍କର IP ଠିକଣା ଏହି ପୃଷ୍ଠାର ଇତିହାସରେ ସାଇତା ହୋଇଯିବ ।''",
        "missingsummary": "'''ଚେତାବନୀ:''' ଆପଣ ଏକ ସମ୍ପାଦନା ସାରକଥା ଦେଇନାହାନ୍ତି ।\nଯଦି ଆପଣ \"{{int:savearticle}}\"ରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ତେବେ ଆପଣଙ୍କ ବଦଳ ସାରକଥା ବିନା ସାଇତା ହୋଇଯିବ ।",
        "missingcommenttext": "ଦୟାକରି ତଳେ ଏକ ମତାମତ ଦିଅନ୍ତୁ ।",
        "content-not-allowed-here": "\"$1\" ବିଷୟଗୁଡିକ [[$2]]ପୃଷ୍ଠାରେ ରହିପାରିବ ନାହିଁ",
        "editwarning-warning": "ଏହି ପୃଷ୍ଠାଟି ଛାଡ଼ି ଚାଲିଗଲେ ଆପଣ ଆଗରୁ କରିଥିବା ସମ୍ପାଦନା ହରାଇବେ । ଯଦି ଆପଣ ଲଗ ଇନ କରିଥାନ୍ତି ନିଜ ପସନ୍ଦ ପୃଷ୍ଠାର \"{{int:prefs-editing}}\" ବିଭାଗରେ ଏହି ଚେତାବନୀଟି ନିଷ୍କ୍ରିୟ କରିପାରିବେ ।",
        "editpage-notsupportedcontentformat-title": "କଣ୍ଟେଣ୍ଟର ସଂରଚନା ସମର୍ଥିତ ନୁହେଁ",
+       "editpage-notsupportedcontentformat-text": "$1ର ବିଷୟବସ୍ତୁର ସଜାଣି $2ର ବିଷୟବସ୍ତୁ ମଡ଼େଲ ସହିତ ମେଳ ଖାଉନାହିଁ ।",
        "content-model-wikitext": "ଉଇକିଟେକ୍ସଟ",
        "content-model-text": "ଖାଲି ଲେଖା",
        "content-model-javascript": "ଜାଭାସ୍କ୍ରିପ୍ଟ",
        "parser-template-recursion-depth-warning": "ଛାଞ୍ଚର ବାରମ୍ବାର ପ୍ରତୀତ ହେବା କ୍ଷମତା ପାର ହୋଇଅଛି ($1)",
        "language-converter-depth-warning": "ଭାଷା ରୂପାନ୍ତରଣ କ୍ଷମତା ସରିଯାଇଅଛି ($1)",
        "node-count-exceeded-category": "ପୃଷ୍ଠାଗୁଡିକ ଯେଉଁଠି ନୋଡ-ଗଣନା ଅତ୍ୟଧିକ ହୋଇଯାଇଛି",
+       "node-count-exceeded-category-desc": "ଏହି ପୃଷ୍ଠା ସର୍ବାଧିକ ନୋଡ଼ ଗଣନାରୁ ବଳିଗଲା ।",
        "node-count-exceeded-warning": "ପୃଷ୍ଠାଟି ନୋଡ-ଗଣନାରୁ ଅଧିକ ହୋଇଗଲା",
        "expansion-depth-exceeded-category": "ଯେଉଁ ପୃଷ୍ଠାଗୁଡିକରେ ବିସ୍ତ୍ରୁତ ଗଭୀରତା ଅତ୍ୟଧିକ ହୋଇଯାଇଛି",
+       "expansion-depth-exceeded-category-desc": "ଏହି ପୃଷ୍ଠାର ସର୍ବାଧିକ ଲମ୍ବା ହେବା ଠାରୁ ବଳିଗଲାଣି",
        "expansion-depth-exceeded-warning": "ପୃଷ୍ଠାଟି ବିସ୍ତ୍ରୁତ ଗଭୀରତାରୁ ଅଧିକ ହୋଇଗଲା",
        "parser-unstrip-loop-warning": "ଅଜଣା ଲୁପ ଜଣାପଡିଲା",
        "parser-unstrip-recursion-limit": "ଅଜଣା ଚକ୍ରର ସୀମା ଅତ୍ୟଧିକ ହୋଇଗଲା ($1)",
        "undo-summary-username-hidden": "ଜଣେ ଅଜଣା ସଭ୍ୟଙ୍କ ଦେଇ ହୋଇଥିବା $1 ସଂସ୍କରଣଟି ପଛକୁ ଫେରାନ୍ତୁ",
        "cantcreateaccounttitle": "ଖାତାଟିଏ ତିଆରି କରାଯାଇପାରିବ ନାହିଁ",
        "cantcreateaccount-text": "[[User:$3|$3]]ଙ୍କ ଦେଇ ('''$1''') IP ଠିକଣାରୁ ଖାତା ଖୋଲିବାକୁ ବାରଣ କରାଯାଇଅଛି ।\n\n$3ଙ୍କ ଦେଇ ଦିଆଯାଇଥିବା କାରଣ ହେଲା ''$2''",
+       "cantcreateaccount-range-text": "ଆପଣଙ୍କ IP Address ('''$4''') ସମେତ '''$1''' ସୀମା ଭିତରେ ଥିବା IP Address ରୁ [[User:$3|$3]]ଙ୍କ ଦ୍ୱାରା ନୂଆ ଖାତା ତିଆରିକୁ ଅଟକାଯାଇଛି ।\n\n$3ଙ୍କ ଦ୍ୱାରା ଏହାର କାରଣ ଦିଆଯାଇଛି: ''$2''",
        "viewpagelogs": "ଏହି ପୃଷ୍ଠା ପାଇଁ ଲଗଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ ।",
        "nohistory": "ଏହି ପୃଷ୍ଠା ନିମନ୍ତେ କିଛି ବି ସମ୍ପାଦନା ଇତିହାସ ନାହିଁ ।",
        "currentrev": "ନଗଦ ସଙ୍କଳନ",
        "currentrev-asof": "$1 ହୋଇଥିବା ରିଭିଜନ",
        "revisionasof": "$1 ଅନୁସାରେ କରାଯାଇଥିବା ବଦଳ",
-       "revision-info": "$2ଙ୍କ ଦେଇ $1 ସୁଦ୍ଧା ହୋଇଥିବା ସଙ୍କଳନ",
+       "revision-info": "$1 ବେଳେ {{GENDER:$6|$2}}$7 ଙ୍କ ଦେଇ ହୋଇଥିବା ସଂସ୍କରଣ",
        "previousrevision": "ପୁରୁଣା ସଙ୍କଳନ",
        "nextrevision": "ନୂଆ ସଙ୍କଳନ",
        "currentrevisionlink": "ନଗଦ ସଙ୍କଳନ",
        "rev-deleted-event": "(ଲଗ କାମ ବାହାର କରିଦିଆଗଲା)",
        "rev-deleted-user-contribs": "[ଇଉଜର ନାମ ବା IP ଠିକଣା ବାହାର କରିଦିଆଗଲା - ଅବଦାନସମୂହରୁ ଲୁଚାଯାଇଥିବା ସମ୍ପାଦନା]",
        "rev-deleted-text-permission": "ଏହି ପୃଷ୍ଠାର ସଂସ୍କରଣ '''ଲିଭାଇଦିଆଯାଇଛି'''।\nସବିଶେଷ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ଲିଭାଯିବା ଇତିହାସ]ରୁ ମିଳିପାରିବ ।",
+       "rev-suppressed-text-permission": "ଏହି ପୃଷ୍ଠାର ସଂସ୍କରଣକୁ <strong>ଦବାଇଦିଆଯାଇଛି</strong> ।\nଅଧିକ ବିବରଣୀ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ଦବାଯାଇଥିବା ଇତିହାସ]ରୁ ପଢ଼ିପାରିବେ ।",
        "rev-deleted-text-unhide": "ଏହି ପୃଷ୍ଠାର ସଂସ୍କରଣ '''ଲିଭାଇଦିଆଯାଇଛି''' ।\nସବିଶେଷ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ଲିଭାଇବା ଇତିହାସ]ରୁ ମିଳିପାରିବ ।\nତଥାପି ଆଗକୁ ବଢ଼ିବାକୁ ଚାହୁଁଥିଲେ ଆପଣ [$1 ଏହି ସଂସ୍କରଣଟି] ଦେଖିପାରିବେ ।",
        "rev-suppressed-text-unhide": "ଏହି ପୃଷ୍ଠାର ସଂସ୍କରଣ '''ଦବାଇଦିଆଯାଇଛି''' ।\nସବିଶେଷ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ଦବାଯାଇଥିବା ଇତିହାସ]ରୁ ମିଳିପାରିବ ।\nତଥାପି ଆଗକୁ ବଢ଼ିବାକୁ ଚାହୁଁଥିଲେ ଆପଣ [$1 ଏହି ସଂସ୍କରଣଟି] ଦେଖିପାରିବେ ।",
        "rev-deleted-text-view": "ଏହି ପୃଷ୍ଠାର ସଂସ୍କରଣ '''ଲିଭାଇଦିଆଯାଇଛି'''।\nଆପଣ ଏହାକୁ ଦେଖିପାରିବେ; ସବିଶେଷ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ଲିଭାଯିବା ଇତିହାସ]ରୁ ମିଳିପାରିବ ।",
        "revdelete-no-file": "ଆପଣ ସୂଚିତ କରିଥିବା ଫାଇଲଟି ନାହିଁ ।",
        "revdelete-show-file-confirm": "$2 ତାରିଖ $3 ବେଳେ \"<nowiki>$1</nowiki>\" ଫାଇଲର ଏକ ଲିଭାଯାଇଥିବା ସଙ୍କଳନକୁ ଦେଖିବାକୁ ଚାହାନ୍ତି ବୋଲି ଆପଣ ନିଶ୍ଚିତ କି ?",
        "revdelete-show-file-submit": "ହଁ",
+       "revdelete-selected-text": "[[:$2]]ର {{PLURAL:$1|Selected revision|ବଛାଯାଇଥିବା ସଂସ୍କରଣ}}:",
+       "revdelete-selected-file": "[[:$2]]ର {{PLURAL:$1|Selected file version|ବଛାଯାଇଥିବା ଫାଇଲ ସଂସ୍କରଣ}}:",
        "logdelete-selected": "{{PLURAL:$1|ବଛା ଲଗ ଘଟଣା|ବଛା ଲଗ ଘଟଣାବଳୀ}}:",
+       "revdelete-text-text": "ଲିଭାଯାଇଥିବା ସଂସ୍କରଣ ପୃଷ୍ଠାର ଇତିହାସରେ ଦେଖାଯାଇପାରିବ, କିନ୍ତୁ ଏହାର କିଛି ଭାଗ ଜନସାଧାରଣଙ୍କ ପାଇଁ ଉପଲବ୍ଧ ହେବନାହିଁ ।",
+       "revdelete-text-file": "ଲିଭାଯାଇଥିବା ଫାଇଲର ସଂସ୍କରଣ ପୃଷ୍ଠାର ଇତିହାସରେ ଦେଖାଯାଇପାରିବ, କିନ୍ତୁ ଏହାର କିଛି ଭାଗ ଜନସାଧାରଣଙ୍କ ପାଇଁ ଉପଲବ୍ଧ ହେବନାହିଁ ।",
+       "logdelete-text": "ଲିଭାଯାଇଥିବା ଘଟଣାବଳୀ ଇତିହାସରେ ଦେଖାଯାଇପାରିବ, କିନ୍ତୁ ଏହାର କିଛି ଭାଗ ଜନସାଧାରଣଙ୍କ ପାଇଁ ଉପଲବ୍ଧ ହେବନାହିଁ ।",
+       "revdelete-text-others": "କିଛି ଅଧିକ କଟକଣା ନଥିଲେ ବାକି ପରିଚାଳକମାନେ ଲୁଚାଯାଇଥିବା ବିଷୟବସ୍ତୁ ଦେଖିପାରିବେ ଏବଂ ଲିଭାଯାଇଥିବା ବିଷୟବସ୍ତୁକୁ ପଛକୁ ଫେରାଇ ପାରିବେ ।",
        "revdelete-confirm": "ଦୟାକରି ଥୟ କରନ୍ତୁ ଯେ ଆପଣ ଏହା କରିବାକୁ ଚାହୁଁଛନ୍ତି, ଆପଣ ଏହାର ପରିଣାମ ଜାଣନ୍ତି ଓ ଆପଣ [[{{MediaWiki:Policy-url}}|ନୀତି]] ଅନୁସାରେ ଏହା କରୁଛନ୍ତି ।",
-       "revdelete-suppress-text": "ଦବାଇ ରଖିବା '''କେବଳ''' ଏହି ତଳଲିଖିତ କ୍ଷେତ୍ରରେ ବ୍ୟବହାର କରାଯିବ:\n* ସମ୍ଭାବିତ ଅପମାନଜଣକ ତଥ୍ୟ\n* ଭୁଲ ବ୍ୟକ୍ତିଗତ ତଥ୍ୟ\n*: ''ଘର ଠିକଣା ଓ ଟେଲିଫୋନ ନମ୍ବର, ଭୋଟର ପରିଚୟ ନମ୍ବର, ଆଦି''",
+       "revdelete-suppress-text": "ଦବାଇ ରଖିବା <strong>କେବଳ</strong>ଏହି ତଳଲିଖିତ କ୍ଷେତ୍ରରେ ବ୍ୟବହାର କରାଯିବ:\n* ସମ୍ଭାବିତ ଅପମାନଜଣକ ତଥ୍ୟ\n* ଭୁଲ ବ୍ୟକ୍ତିଗତ ତଥ୍ୟ\n*: <em>ଘର ଠିକଣା ଓ ଟେଲିଫୋନ ନମ୍ବର, ଭୋଟର ପରିଚୟ ନମ୍ବର, ଆଦି</em>",
        "revdelete-legend": "ଦେଖଣା ବାରଣ ସବୁ ଥୟ କରନ୍ତୁ",
        "revdelete-hide-text": "ସଂସ୍କରଣ ଲେଖା",
        "revdelete-hide-image": "ଫାଇଲ ଭିତର ପଦାର୍ଥସବୁ ଲୁଚାଇଦିଅନ୍ତୁ",
        "mergehistory-empty": "କୌଣସିଟି ବି ସଙ୍କଳାନ ମିଶାଯାଇପାରିବ ନାହିଁ ।",
        "mergehistory-success": "[[:$1]]ର $3 {{PLURAL:$3|ଟି ସଙ୍କଳନ|ଟି ସଙ୍କଳନ}} [[:$2]] ସାଙ୍ଗରେ ଠିକଭାବେ ମିଶାଇ ଦିଆଗଲା ।",
        "mergehistory-fail": "ଇତିହାସ ମିଶାଇବାରେ ବିଫଳ ହେଲୁ, ଦୟାକରି ପୃଷ୍ଠା ଓ  ସମୟ ନିର୍ଣ୍ଣାୟକ ଦେଖନ୍ତୁ ।",
+       "mergehistory-fail-toobig": "$1 ଗୋଟି {{PLURAL:$1|ସଂସ୍କରଣ|ସଂସ୍କରଣ}} ଘୁଞ୍ଚାଇଦିଆଯିବା ହେତୁ  ଅଧିକ ପୃଷ୍ଠାର ଇତିହାସ ମିଶାଇବାରେ ବିଫଳ ହେଲୁ ।",
        "mergehistory-no-source": "ମୂଳ ପୃଷ୍ଠା $1ଟି ନାହିଁ ।",
        "mergehistory-no-destination": "ଅନ୍ତ ପୃଷ୍ଠା $1 ଟି ନାହିଁ ।",
        "mergehistory-invalid-source": "ମୂଳ ପୃଷ୍ଠାଟି ଏକ ଠିକ ନାମ ହୋଇଥିବା ଉଚିତ ।",
        "showhideselectedversions": "ବଛା ହୋଇଥିବା ସଙ୍କଳନ ଗୁଡ଼ିକୁ ଦେଖାଇବେ/ଲୁଚାଇବେ",
        "editundo": "ପଛକୁ ଫେରିବା",
        "diff-empty": "(କିଛି ବି ଫରକ ନାହିଁ)",
+       "diff-multi-sameuser": "ସେହି ସମାନ ବ୍ୟବହାରକାରୀଙ୍କ ({{PLURAL:$1|ମଝି ସଂସ୍କରଣ|$1ଟି ସଂସ୍କରଣ}} ଦେଖାଉ ନାହିଁ)",
+       "diff-multi-otherusers": "({{PLURAL:$2|ଆଉ ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କ|$2 ଜଣ ବ୍ୟବହାରକାରୀଙ୍କ}} ଦ୍ୱାରା ହୋଇଥିବା {{PLURAL:$1|ମଝି ସଂସ୍କରଣଟିଏ|$1ଟି ମଝି ସଂସ୍କରଣ}} ଦେଖା ଯାଉନାହିଁ)",
        "diff-multi-manyusers": "($2 {{PLURAL:$2|ଜଣ|ଜଣ}} ସଭ୍ୟଙ୍କ ଦେଇ କରାଯାଇଥିବା {{PLURAL:$1|ଗୋଟିଏ ମଝି ସଂସ୍କରଣ|$1 ଗୋଟି ମଝି ସଂସ୍କରଣମାନ}} ଦେଖାଯାଉ ନାହିଁ)",
        "difference-missing-revision": "($1) {{PLURAL:$2|was|were}}ର ଭିନ୍ନତା {{PLURAL:$2|One revision|$2 revisions}} ମିଳିଲା ନାହିଁ ।\n\nପୁରୁଣା ହୋଇଯାଇଥିବା ଇତିହାସ ଲିଙ୍କ ଯାହା ଏକ ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାକୁ ଦିଆଯାଇଥିବାରୁ ଏହା ସାଧାରଣତଃ ହୋଇଥାଏ ।\nଅଧିକ ବିବରଣୀ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]ରେ ମିଳିପାରିବ ।",
        "searchresults": "ଖୋଜା ଫଳାଫଳ",
        "shown-title": "$1 ପ୍ରତି ପୃଷ୍ଠାର {{PLURAL:$1|ଫଳାଫଳ|ଫଳାଫଳ}} ଦେଖାଇବେ ।",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) ଟି ଦେଖିବେ",
        "searchmenu-exists": "'''ଏହି ଉଇକିରେ \"[[:$1]]\" ନାଆଁରେ ପୃଷ୍ଠାଟିଏ ଅଛି ।'''",
-       "searchmenu-new": "'''ଏହି ପ୍ରସଙ୍ଗଟି ଆଗରୁ ନାହିଁ, ତେଣୁ ''[[:$1]]'' ନାମରେ ପ୍ରସଙ୍ଗଟିଏ ଏଠାରେ ଗଢ଼ନ୍ତୁ!'''",
+       "searchmenu-new": "<strong>\"[[:$1]]\" ନାମରେ ପ୍ରସଙ୍ଗଟିଏ ଏହି ଉଇକିରେ ଗଢ଼ନ୍ତୁ!</strong> {{PLURAL:$2|0=|ଆପଣଙ୍କ ଖୋଜା ସମ୍ବନ୍ଧିତ ବାକି ପୃଷ୍ଠା ଦେଖନ୍ତୁ ।|ମିଳିଥିବା ଖୋଜା ଫଳାଫଳ ଦେଖନ୍ତୁ ।}}",
        "searchprofile-articles": "ସୂଚୀ ପୃଷ୍ଠା",
        "searchprofile-images": "ମଲ୍ଟିମିଡ଼ିଆ",
        "searchprofile-everything": "ସବୁକିଛି",
        "searchprofile-images-tooltip": "ଫାଇଲ ସବୁ ପାଇଁ ଖୋଜିବେ",
        "searchprofile-everything-tooltip": "ପ୍ରସଙ୍ଗ ସବୁକୁ ଖୋଜିବେ (ଆଲୋଚନା ସହ)",
        "searchprofile-advanced-tooltip": "ନିଜେ ତିଆରିକରିହେବା ଭଳି ନେମସ୍ପେସରେ ଖୋଜିବେ",
-       "search-result-size": "$1 ({{PLURAL:$2|1 ଶବ୍ଦ|$2 ଶବ୍ଦ}})",
+       "search-result-size": "$1 ({{PLURAL:$2|ଗୋଟେ ଶବ୍ଦ|$2 ଟି ଶବ୍ଦ}})",
        "search-result-category-size": "{{PLURAL:$1|ଜଣେ ସଭ୍ୟ|$1 ଜଣ ସଭ୍ୟ}} ({{PLURAL:$2|ଗୋଟିଏ ଶ୍ରେଣୀy|$2ଟି ଶ୍ରେଣୀ ସମୂହ}}, {{PLURAL:$3|ଗୋଟିଏ ଫାଇଲ|$3ଟି ଫାଇଲ}})",
        "search-redirect": "($1 କୁ ଆଗକୁ ବଢେଇନିଅ )",
        "search-section": "(ଭାଗ $1)",
+       "search-file-match": "(ଫାଇଲରେ ଥିବା ବିଷୟବସ୍ତୁ ସାଙ୍ଗେ ମେଳ)",
        "search-suggest": "ଆପଣ $1 ଭାବି ଖୋଜିଥିଲେ କି?",
        "search-interwiki-caption": "ସାଙ୍ଗରେ ଚାଲିଥିବା ବାକି ପ୍ରକଳ୍ପସବୁ",
        "search-interwiki-default": "$1 ରୁ ଫଳାଫଳ:",
        "searchrelated": "ଯୋଡ଼ା",
        "searchall": "ସବୁ",
        "showingresults": "ତଳେ {{PLURAL:$1|'''ଗୋଟିଏ'''  ଫଳାଫଳ|'''$1'''ଟି ଫଳାଫଳ}} ଦେଖାଉଛୁ ଯାହା #'''$2'''ରେ ଆରମ୍ଭ ହୋଇଅଛି ।",
-       "showingresultsheader": "'''$4''' ପାଇଁ {{PLURAL:$5|'''$3'''ର '''$1''' ଫଳ |'''$3'''ର '''$1 - $2''' ଫଳ }}",
+       "showingresultsinrange": "#<strong>$2</strong> ରୁ #<strong>$3</strong> ଭିତରେ ଥିବା ପାଖାପାଖି {{PLURAL:$1|<strong>ଗୋଟେ</strong> ଫଳାଫଳ|<strong>$1</strong>ଟି ଫଳାଫଳ}} ତଳେ ଦେଖାଉଛୁ ।",
+       "search-showingresults": "{{PLURAL:$4|ଫଳାଫଳ (<strong>$3</strong>ର <strong>$1</strong>) |ଫଳାଫଳ (<strong>$3</strong>ର <strong>$1 - $2</strong>}}",
        "search-nonefound": "ଆପଣ ଖୋଜିଥିବା ପ୍ରଶ୍ନ ପାଇଁ କିଛି ଫଳ ମିଳିଲା ନାହିଁ ।",
        "powersearch-legend": "ଗହିର ଖୋଜା",
        "powersearch-ns": "ନେମସ୍ପେସରେ ଖୋଜିବେ",
        "powersearch-togglelabel": "ଯାଞ୍ଚ କରିବା:",
        "powersearch-toggleall": "ସବୁ",
        "powersearch-togglenone": "କିଛି ନାହିଁ",
+       "powersearch-remember": "ନିଜର ଆଗାମୀ ଖୋଜିବା ମନେରଖନ୍ତୁ",
        "search-external": "ବାହାରେ ଖୋଜା",
        "searchdisabled": "{{SITENAME}} ଖୋଜା ଅଚଳ କରାଗଲା ।\nଆପଣ ଏହି ଭିତରେ ଗୁଗଲ ଦେଖିପାରନ୍ତି ।\nଜାଣିରଖନ୍ତୁ ଯେ {{SITENAME}}ର ବିଷୟ ସୂଚି ପୁରାତନ ହୋଇଥାଇପାରେ ।",
+       "search-error": "ଖୋଜିଲା ବେଳେ ଅସୁବିଧାଟିଏ ଘଟିଲା: $1",
        "preferences": "ପସନ୍ଦ",
        "mypreferences": "ପସନ୍ଦ",
        "prefs-edits": "ସମ୍ପାଦନା ସଂଖ୍ୟା:",
+       "prefsnologintext2": "ନିଜର ପସନ୍ଦ ବଦଲାଇବା ପାଇଁ ଲଗ ଇନ କରନ୍ତୁ ।",
        "prefs-skin": "ବହିରାବରଣ",
        "skin-preview": "ସାଇତା ଆଗରୁ ଦେଖଣା",
        "datedefault": "କୌଣସି ପସନ୍ଦ ନାହିଁ",
        "recentchangesdays-max": "ସବୁଠାରୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|ଦିନ|ଦିନ}}",
        "recentchangescount": "ଆପେଆପେ ଦେଖାଯାଉଥିବା ବଦଳର ସଂଖ୍ୟା:",
        "prefs-help-recentchangescount": "ଏଥିରେ ନଗଦ ବଦଳ, ପୃଷ୍ଠାର ଇତିହାସ ଓ ଲଗ ଇତିହାସ ରହିଅଛି ।",
+       "prefs-help-watchlist-token2": "ଆପଣଙ୍କ ଦେଖଣାତାଲିକାର ୱେବ ଫିଡ଼ ପାଇଁ ଏହା ଏକ ଗୋପନ ଚାବି ।\nଏହା ଜାଣିପାରିଲେ ଯେ କୌଣସି ବ୍ୟକ୍ତି ଆପଣଙ୍କ ଦେଖଣାତାଲିକା ପଢ଼ିପାରିବ, ତେଣୁ ଏହାକୁ କାହାକୁ ଜଣାନ୍ତୁ ନାହିଁ ।\nଚାହିଁଲେ ଏହାକୁ [[Special:ResetTokens|ରିସେଟ ମଧ୍ୟ କରିପାରିବେ]] ।",
        "savedprefs": "ଆପଣଙ୍କ ପସନ୍ଦସବୁ ସାଇତାଗଲା ।",
        "timezonelegend": "ସମୟ ମଣ୍ଡଳ:",
        "localtime": "ସ୍ଥାନୀୟ ସମୟ:",
        "prefs-help-signature": "ଆଲୋଚନା ପୃଷ୍ଠାରେ ଦିଆଯାଉଥିବା ମତାମତରେ \"<nowiki>~~~~</nowiki>\" ଦେଇଦେଲେ ତାହା ସେଠାରେ ଆପେ ଆପେ ଆପଣଙ୍କ ନାମ ଓ ସମୟକୁ ବଦଳିଯିବ ।",
        "badsig": "ମୂଳ ସନ୍ତକଟି ଅଚଳ ଅଟେ ।\nHTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।",
        "badsiglength": "ଆପଣଙ୍କ ସନ୍ତକଟି ଖୁବ ଲମ୍ବା ।\nଏହା ବୋଧ ହୁଏ $1 {{PLURAL:$1|ଗୋଟି ଅକ୍ଷର|ଗୋଟି ଅକ୍ଷର}}ରୁ ଅଧିକ ।",
-       "yourgender": "ଲିà¬\99à­\8dà¬\97:",
+       "yourgender": "à¬\86ପଣ à¬\95à­\87à¬\89à¬\81ଭଳି à¬¬à¬\96ଣାହà­\87ବାà¬\95à­\81 à¬\9aାହାà¬\81ନà­\8dତି?",
        "gender-unknown": "ଜଣାଇବାକୁ ଚାହେଁ ନାହିଁ",
        "gender-male": "ସେ (ପୁରୁଷ) ଉଇକିପୃଷ୍ଠା ସମ୍ପାଦନା କରନ୍ତି",
        "gender-female": "ସେ (ନାରୀ) ଉଇକିପୃଷ୍ଠା ସମ୍ପାଦନା କରନ୍ତି",
        "prefs-tokenwatchlist": "ଟୋକନ୍‌",
        "prefs-diffs": "ତଫାତସବୁ",
        "prefs-help-prefershttps": "ଏହି ପସନ୍ଦ ଆପଣଙ୍କ ଲଗ୍ଇନ୍ କରିବାପରେ କାର୍ଯ୍ୟକ୍ଷମ ହେବ ।",
+       "prefswarning-warning": "ଆପଣ ନିଜ \"ପସନ୍ଦ\"ରେ କରିଥିବା ବଦଳ ଏଯାଏ ସାଇତା ଯାଇନାହିଁ ।\nଯଦି ଆପଣ \"$1\"ରେ କ୍ଲିକ ନ କରି ଏହି ପୃଷ୍ଠା ଛାଡ଼ି ଚାଲିଗଲେ ଆପଣଙ୍କର ପସନ୍ଦ ଅପଡେଟ ହେବ ନାହିଁ ।",
+       "prefs-tabs-navigation-hint": "ସୂଚନା: ବାମ ଓ ଡାହାଣ ଆରୋ କି ବ୍ୟବହାର କରି ଆପଣ ଗୋଟେ ଟ୍ୟାବରୁ ଆଉ ଗୋଟେ ଟ୍ୟାବକୁ ଯାଇପାରିବ ।",
        "email-address-validity-valid": "ଇ-ମେଲ ଠିକଣା ବୈଧ ଭଳି ଲାଗୁଅଛି",
        "email-address-validity-invalid": "ଏକ ସଠିକ ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ",
        "userrights": "ସଭ୍ୟ ଅଧିକାର ପରିଚାଳନା",
        "userrights-notallowed": "ଆପଣଙ୍କ ଖାତାରେ ସଭ୍ୟ ଅଧିକାର ଯୋଡ଼ିବା ବା କାଢ଼ିବାର ଅନୁମତି ନାହିଁ ।",
        "userrights-changeable-col": "ଆପଣ ବଦଳାଇପାରିବା ଗୋଠସମୂହ",
        "userrights-unchangeable-col": "ଯେଉଁ ଗୋଠସବୁ ଆପଣ ବଦଳାଇପାରିବେ ନାହିଁ",
+       "userrights-conflict": "ସଭ୍ୟଙ୍କ ଅଧିକାର ବଦଳାଇବାରେ ମତଭେଦ! କରିଥିବା ବଦଳକୁ ପରଖି ନିଶ୍ଚିତ କରନ୍ତୁ ।",
+       "userrights-removed-self": "ଆପଣ ସଫଳ ଭାବେ ନିଜର ଅଧିକାର କାଢ଼ିଦେଲେ । ଆଗକୁ ଆପଣ ଆଉ ଏହା ଦେଖିପାରିବେ ନାହିଁ ।",
        "group": "ଗୋଠ:",
        "group-user": "ବ୍ୟବହାରକାରୀଗଣ",
        "group-autoconfirmed": "ଆପେଆପେ ଥୟ କରା ସଭ୍ୟ",
        "right-deletedtext": "ଲିଭାଇ ଦିଆଯାଇଥିବା ଲେଖା ଓ ଲିଭାଇ ଦିଆଯାଇଥିବା ଲେଖା ଭିତରର ସଙ୍କଳନର ବଦଳ ଦେଖିବେ",
        "right-browsearchive": "ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାସବୁକୁ ଖୋଜିବେ",
        "right-undelete": "ଲିଭାଇ ଦିଆଯାଇଥିବା ପୃଷ୍ଠାଟିଏକୁ ଫେରାଇ ଆଣିବେ",
-       "right-suppressrevision": "ପରିଚାଳକମାନଙ୍କଠାରୁ ଲୁଚାଯାଇଥିବା ସଙ୍କଳନ ପରଖିବେ ଓ ଲେଉଟାଇବେ",
+       "right-suppressrevision": "କୌଣସି ସଭ୍ୟଙ୍କୁ ନିର୍ଦ୍ଦିଷ୍ଟ ସଂସ୍କରଣ ଦେଖନ୍ତୁ, ଲୁଚାନ୍ତୁ ଓ ଲୁଚାଯାଇଥିବା ସଂସ୍କରଣ ଦେଖାନ୍ତୁ",
+       "right-viewsuppressed": "କୌଣସି ସଭ୍ୟଙ୍କଠାରୁ ଲୁଚାଯାଇଥିବା ସଂସ୍କରଣମାନ ଲୁଚାନ୍ତୁ",
        "right-suppressionlog": "ବ୍ୟକ୍ତିଗତ ଲଗ ଦେଖାଇବେ",
        "right-block": "ବାକି ସଭ୍ୟମାନଙ୍କୁ ସମ୍ପାଦନାରୁ ବାରଣ କରିବେ",
        "right-blockemail": "ଇ-ମେଲ ପଠାଇବାରୁ ଜଣେ ସଭ୍ୟଙ୍କୁ ବାରଣ କରିବେ",
        "right-unblockself": "ଜଣଙ୍କୁ ଅଟକରୁ ଚାଡ଼କରିବେ",
        "right-protect": "ନିରାପତ୍ତା ବଢ଼ାଇ କ୍ୟାସକେଡ଼-ନିରାପତ୍ତା ପୃଷ୍ଠାମାନଙ୍କୁ ବଦଳାନ୍ତୁ",
        "right-editprotected": "କିଳାଯାଇଥିବା ପୃଷ୍ଠାମାନଙ୍କର ସମ୍ପାଦନା କରିବେ (କ୍ୟାସକେଡ଼କରା କିଳଣା ବିନା)",
+       "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" ଭାବେ ଲୁଚାଯାଇଥିବା ପୃଷ୍ଠାସବୁ ସମ୍ପାଦନା କରନ୍ତୁ",
        "right-editinterface": "ସଭ୍ୟଙ୍କ ଇଣ୍ଟରଫେସ ବଦଳାଇବେ",
        "right-editusercssjs": "ବାକି ସଭ୍ୟମାନଙ୍କର CSS ଓ ଜାଭାସ୍କ୍ରିପ୍ଟ ଫାଇଲ ସବୁକୁ ବଦଳାଇବେ",
        "right-editusercss": "ବାକି ସଭ୍ୟମାନଙ୍କ CSS ଫାଇଲସବୁ ବଦଳାଇବେ",
        "right-edituserjs": "ବାକି ସଭ୍ୟମାନଙ୍କର ଜାଭାସ୍କ୍ରିପ୍ଟ ଫାଇଲ ସବୁକୁ ବଦଳାଇବେ",
+       "right-editmyusercss": "ନିଜ ସଭ୍ୟ CSS ଫାଇଲସବୁ ସମ୍ପାଦନା କରନ୍ତୁ",
+       "right-editmyuserjs": "ନିଜର ସଭ୍ୟ JavaScript ଫାଇଲ ସମ୍ପାଦନା କରନ୍ତୁ",
+       "right-viewmywatchlist": "ନିଜର ଦେଖଣାତାଲିକା ଦେଖନ୍ତୁ",
+       "right-editmywatchlist": "ନିଜ ଦେଖଣାତାଲିକା ଦେଖନ୍ତୁ । ଜାଣିରଖନ୍ତୁ ଯେ ଏହି ଅଧିକାର ବିନା ମଧ୍ୟ କିଛି କାମ ଅଧିକ ପୃଷ୍ଠା ଯୋଡ଼ୁଥିବ ।",
+       "right-viewmyprivateinfo": "ନିଜର ଗୋପନୀୟ ତଥ୍ୟ ଦେଖନ୍ତୁ (ଯଥା ଇମେଲ ଠିକଣା, ପ୍ରକୃତ ନାମ)",
+       "right-editmyprivateinfo": "ନିଜର ଗୋପନୀୟ ତଥ୍ୟ ସମ୍ପାଦନ କରନ୍ତୁ (ଯଥା ଇମେଲ ଠିକଣା, ପ୍ରକୃତ ନାମ)",
+       "right-editmyoptions": "ନିଜର ପସନ୍ଦ ସମ୍ପାଦନା କରନ୍ତୁ",
        "right-rollback": "ଏକ ନିର୍ଦ୍ଦିଷ୍ଟ ପୃଷ୍ଠାକୁ ବଦଳାଇଥିବା ଶେଷ ସଭ୍ୟଙ୍କ ସମ୍ପାଦନାକୁ ସଙ୍ଗେସଙ୍ଗେ ପୁରାପୁରି ପଛକୁ ଫେରାଇଦେବେ",
        "right-markbotedits": "ପୁରାପୁରି ପଛକୁ ଫେରାଇବା ବଦଳଗୁଡ଼ିକ ଆପେ ଆପେ କରା ବଦଳ ବୋଲି ଗଣିବେ",
        "right-noratelimit": "ବିରଳ ସୀମା ଦେଇ ପ୍ରଭାବିତ ହୋଇ ନଥିବା",
        "action-createpage": "ପୃଷ୍ଠାଟିଏ ତିଆରିବା",
        "action-createtalk": "ଆଲୋଚନା ପୃଷ୍ଠାସବୁ ଗଢ଼ିବେ",
        "action-createaccount": "ଏହି ନୂଆ ସଭ୍ୟ ଖାତାଟିଏ ଗଢ଼ିବେ",
+       "action-history": "ଏହି ପୃଷ୍ଠାର ଇତିହାସ ଦେଖାନ୍ତୁ",
        "action-minoredit": "ଏହି ବଦଳଟିକୁ ଟିକେ ବଦଳ ଭାବରେ ଚିହ୍ନିତ କରନ୍ତୁ",
        "action-move": "ଏହି ପୃଷ୍ଠାଟିକୁ ଘୁଞ୍ଚାଇବେ",
        "action-move-subpages": "ଏହି ପୃଷ୍ଠାଟିକୁ ତାହାର ଉପପୃଷ୍ଠା ସହିତ ଘୁଞ୍ଚାଇବେ ।",
        "action-move-rootuserpages": "ମୂଳ ସଭ୍ୟ ପୃଷ୍ଠାସବୁକୁ ଘୁଞ୍ଚାଇଦେବେ",
+       "action-move-categorypages": "ଶ୍ରେଣୀ ପୃଷ୍ଠାସବୁକୁ ଘୁଞ୍ଚାନ୍ତୁ",
        "action-movefile": "ଏହି ପୃଷ୍ଠାଟିକୁ ଘୁଞ୍ଚାଇବେ",
        "action-upload": "ଏହି ଫାଇଲଟି ଅପଲୋଡ଼ କରିବେ",
        "action-reupload": "ଆଗରୁ ଥିବା ଫାଇଲ ଉପରେ ମଡ଼ାଇ ଦେବେ",
        "action-userrights-interwiki": "ବାକି ଉଇକିର ସଭ୍ୟମାନଙ୍କ ସଭ୍ୟ ଅଧିକାର ବଦଳାଇବେ",
        "action-siteadmin": "ଡାଟାବେସକୁ କିଳିବେ ଓ ଖୋଲିବେ",
        "action-sendemail": "ଇ-ମେଲ ପଠାଇବେ",
+       "action-editmywatchlist": "ନିଜର ଦେଖଣାତାଲିକା ସମ୍ପାଦନା କରନ୍ତୁ",
+       "action-viewmywatchlist": "ନିଜ ଦେଖଣାତାଲିକା ଦେଖନ୍ତୁ",
+       "action-viewmyprivateinfo": "ନିଜର ଗୋପନୀୟ ତଥ୍ୟ ଦେଖନ୍ତୁ",
+       "action-editmyprivateinfo": "ନିଜର ଗୋପନୀୟ ତଥ୍ୟ ସମ୍ପାଦନ କରନ୍ତୁ",
        "nchanges": "$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବୁ}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ଶେଷଥର ଦେଖିବା ପରଠାରୁ}}",
        "enhancedrc-history": "ଇତିହାସ",
        "recentchanges": "ନଗଦ ବଦଳ",
        "recentchanges-legend": "ଏବେ କରାଯାଇଥିବା ଅଦଳବଦଳ",
        "recentchanges-summary": "ଏହି ପୃଷ୍ଠାରେ ଏହି ଉଇକିରେ ନଗଦ ବଦଳର ନିଘା ରଖିବେ",
+       "recentchanges-noresult": "ଏହି ସମୟକାଳ ଭିତରେ ଏହି ମାନଦଣ୍ଡ ସହ ଖାପ ଖାଇବା ଭଳି କିଛି ବଦଳ ହୋଇନାହିଁ ।",
        "recentchanges-feed-description": "ଏହି ଉଇକିରେ ଏହି ଫିଡ଼ଟିର ନଗଦ ବଦଳ ଦେଖାଇବେ ।",
        "recentchanges-label-newpage": "ଏହି ସମ୍ପାଦନା ଯୋଗୁଁ ନୂଆ ପୃଷ୍ଠାଟିଏ ତିଆରି ହେଲା",
        "recentchanges-label-minor": "ଏହା ଏକ ସାମାନ୍ୟ ସମ୍ପାଦନା",
        "recentchanges-label-bot": "ଏହି ବଦଳଟି ଜଣେ '''ବଟ'''ଙ୍କ ଦେଇ କରାଯାଇଥିଲା",
        "recentchanges-label-unpatrolled": "ଏହି ବଦଳଟିକୁ ଏ ଯାଏଁ ପରଖା ଯାଇନାହିଁ",
-       "rcnotefrom": "<strong>$2</strong> ପର ଠାରୁ (<strong>$1</strong> ଯାଏଁ ଏଠାରେ ଅଛି) ସମସ୍ତ ବଦଳ ତଳେ ଦେଖିପାରିବେ:",
+       "recentchanges-label-plusminus": "ଏହି ବାଇଟ ତଥ୍ୟରୁ ଏଇ ପୃଷ୍ଠାର ଆକାର ବଦଳ",
+       "recentchanges-legend-heading": "'''ଆକଳନ:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}  (ଆହୁରି ଦେଖନ୍ତୁ: [[Special:NewPages|ନୂଆ ପୃଷ୍ଠାମାନଙ୍କ ତାଲିକା]])",
+       "rcnotefrom": "<strong>$3, $4</strong> ପରଠାରୁ {{PLURAL:$5|ବଦଳଟି|ବଦଳଗୁଡ଼ିକ}} ତଳେ ଦିଆଗଲା (<strong>$1</strong> ଯାଏ ଦିଆଗଲା) ।",
        "rclistfrom": "$3 $2ରୁ ଆରମ୍ଭ କରି ନୂଆ ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
        "rcshowhideminor": "ଛୋଟମୋଟ ବଦଳ $1",
        "rcshowhideminor-show": "ଦେଖାଇବେ",
        "rcshowhideminor-hide": "ଲୁଚାଇବେ",
-       "rcshowhidebots": "ସà­\8dà­±à­\9fà¬\82à¬\9aାଳà¬\95&nbsp;(Bot)&nbsp;ଦà­\8dୱାରା&nbsp;ସମ୍ପାଦନା $1",
+       "rcshowhidebots": "ସà­\8dà­±à­\9fà¬\82à¬\9aାଳà¬\95&nbsp;(Bot)&nbsp;ର&nbsp;ସମ୍ପାଦନା $1",
        "rcshowhidebots-show": "ଦେଖାଇବେ",
        "rcshowhidebots-hide": "ଲୁଚାଇବେ",
        "rcshowhideliu": "ପଞ୍ଜୀକୃତ ସଭ୍ୟ $1",
        "largefileserver": "ଏହି ସର୍ଭରର ଅନୁମୋଦିତ ସଂରଚନା ଠାରୁ ଏହି ଫାଇଲଟି ବଡ଼ ।",
        "emptyfile": "ଆପଣ ଅପଲୋଡ଼ କରିଥିବା ଫାଇଲଟି ଫାଙ୍କା ବୋଲି ବୋଧ ହୁଏ ।\nଏହା ହୁଏତ ଫାଇଲ ନାମରେ କିଛି ଭୁଲ ଜନିତ ହୋଇଥାଇପାରେ ।\nସତରେ ଆପଣ ଏହି ଫାଇଲଟି ଅପଲୋଡ଼ କରିବାକୁ ଚାହାନ୍ତି କି ନାଁ ଠାରେ ପରଖି ନିଅନ୍ତୁ ।",
        "windows-nonascii-filename": "ଏହି ଉଇକି ବିଶେଷ ସଂକେତ ଥିବା ଫାଇଲ ନାମକୁ ଅନୁମତି ଦିଏ ନାହିଁ ।",
-       "fileexists": "à¬\8fହି à¬\8fà¬\95ା à¬¨à¬¾à¬\86à¬\81ରà­\87 à¬\86à¬\97ରà­\81 à¬«à¬¾à¬\87ଲà¬\9fିà¬\8f à¬\85à¬\9bି , à¬¸à¬¤à¬°à­\87 à¬\86ପଣ à¬\8fହାà¬\95à­\81 à¬\85ପଲà­\8bଡ଼ à¬\95ରିବାà¬\95à­\81 à¬\9aାହାନà­\8dତି à¬\95ି à¬¨à¬¾à¬\81 à¬¦à­\9fାà¬\95ରି <strong>[[:$1]]</strong> à¬ªà¬°à¬\96ି à¬¨à¬¿à¬\85ନà­\8dତà­\81 à¥¤\n[[$1|thumb]]",
+       "fileexists": "à¬\8fହି à¬\8fà¬\95ା à¬¨à¬¾à¬®à¬°à­\87 à¬\86à¬\97ରà­\81 à¬«à¬¾à¬\87ଲà¬\9fିà¬\8f à¬\85à¬\9bି, à¬¯à¬¦à¬¿ {{GENDER:|à¬\86ପଣ}} à¬¨à¬¿à¬¶à­\8dà¬\9aିତ à¬¨à­\81ହà¬\81ନà­\8dତି à¬¤à­\87ବà­\87 <strong>[[:$1]]</strong> à¬«à¬¾à¬\87ଲà¬\9fି à¬ªà¬°à¬\96ିନିà¬\85ନà­\8dତି à¥¤ [[$1|ଥମà­\8dବ]]",
        "filepageexists": "ଏହି ଫାଇଲର ବିବରଣୀ ପୃଷ୍ଠାଟି <strong>[[:$1]]</strong> ଠାରେ ତିଆରି କରାଯାଇଅଛି, କିନ୍ତୁ ଏହି ନାମରେ ଗୋଟିଏ ବି ଫାଇଲ ନାହିଁ ।\nବିବରଣୀ ପୃଷ୍ଠାରେ ଆପଣ ଦେଇଥିବା ସାରକଥା ଦେଖାଯିବ ନାହିଁ ।\nଆପଣଙ୍କ ବିବରଣୀ ସେଠାରେ ଦେଖାଇବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ନିଜେ ଏହା ବଦଳାଇବାକୁ ପଡ଼ିବ ।\n[[$1|thumb]]",
-       "fileexists-extension": "à¬\8fà¬\95ାପରି à¬¨à¬¾à¬\86à¬\81 à¬¥à¬¿à¬¬à¬¾ à¬«à¬¾à¬\87ଲà¬\9fିà¬\8f à¬\86à¬\97ରà­\81 à¬\85à¬\9bି: [[$2|thumb]]\n* à¬\85ପଲà­\8bଡ଼ à¬\95ରାଯାà¬\89ଥିବା à¬«à¬¾à¬\87ଲର à¬¨à¬¾à¬®: <strong>[[:$1]]</strong>\n* à¬\86à¬\97ରà­\81 à¬¥à¬¿à¬¬à¬¾ à¬«à¬¾à¬\87ଲର à¬¨à¬¾à¬®: <strong>[[:$2]]</strong>\nଦà­\9fାà¬\95ରି à¬\85ଲà¬\97ା à¬¨à¬¾à¬®à¬\9fିà¬\8f à¬¬à¬¾à¬\9bନà­\8dତà­\81 à¥¤",
+       "fileexists-extension": "à¬\8fà¬\95ାପରି à¬¨à¬¾à¬® à¬¥à¬¿à¬¬à¬¾ à¬«à¬¾à¬\87ଲà¬\9fିà¬\8f à¬\86à¬\97ରà­\81 à¬\85à¬\9bି: [[$2|thumb]]\n* à¬\85ପଲà­\8bଡ଼ à¬\95ରାଯାà¬\89ଥିବା à¬«à¬¾à¬\87ଲର à¬¨à¬¾à¬®: <strong>[[:$1]]</strong>\n* à¬\86à¬\97ରà­\81 à¬¥à¬¿à¬¬à¬¾ à¬«à¬¾à¬\87ଲର à¬¨à¬¾à¬®: <strong>[[:$2]]</strong>\nà¬\86ପଣ à¬\86à¬\89 à¬\9fିà¬\95à­\87 à¬¨à¬¿à¬°à­\8dଦà­\8dଦିଷà­\8dà¬\9f à¬¨à¬¾à¬® à¬¬à¬¾à¬\9bିବà­\87 à¬\95ି?",
        "fileexists-thumbnail-yes": "ଫାଇଲଟି ଏକ ସାନ ଆକାରର ଛବି ବୋଲି ବୋଧ ହୁଏ ''(ନଖଦେଖଣା)''.\n[[$1|thumb]]\nଦୟାକରି <strong>[[:$1]]</strong> ଫାଇଲଟି ପରଖି ନିଅନ୍ତୁ ।\nଯଦି ବଛା ଫାଇଲଟି ମୂଳ ଫାଇଲ ଆକାରର ହୋଇଥାଏ ତେବେ ଆଉ ଗୋଟିଏ ନଖଦେଖଣା ସାନ ଛବି ଅପଲୋଡ଼ କରିବାକୁ ପଡ଼ିବ ।",
        "file-thumbnail-no": "ଫାଇଲ ନାମ <strong>$1</strong>ରେ ଆରମ୍ଭ ହୋଇଥାଏ ।\nଏହା ଏକ ଛୋଟ ଆକାରର ଛବି ଭଳି ବୋଧ ହୁଏ ''(ଛୋଟଦେଖଣା)'' ।\nଯଦି ଆପଣଙ୍କ ପାଖରେ ପୁରା ରେଜୋଲୁସନର ଛବିଟିଏ ଅଛି ତେବେ ତାହା ଅପଲୋଡ଼ କରନ୍ତୁ କିମ୍ବା ଫାଇଲ ନାମ ବଦଳାଇ ଦିଅନ୍ତୁ ।",
        "fileexists-forbidden": "ଏହି ନାମରେ ଫାଇଲଟିଏ ଆଗରୁ ଅଛି ଯାହା ଉପରେ ଆଉଥରେ ମଡ଼ାଯାଇପାରିବ ନାହିଁ ।\nତଥାପି ଯଦି ଆପଣ ଫାଇଲ ଅପଲୋଡ଼ କରିବାକୁ ଚାହୁଁଥାନ୍ତି ତେବେ ପଛକୁ ଯାଇ ନୂଆ ନାମଟିଏ ଦିଅନ୍ତୁ ।\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "ଏହି ନାମରେ ଫାଇଲଟିଏ ଆଗରୁ ବଣ୍ଟାଯାଇଥିବା ଫାଇଲ ଭଣ୍ଡାରରେ ଅଛି ।\nଯଦି ଆପଣ ନିଜର ଫାଇଲଟିଏ ଅପଲୋଡ କରିବାକୁ ଚାହୁଁଥିବେ ତାହାହେଲେ ପଛକୁ ଫେରି ନୂଆ ନାମଟିଏ ଦିଅନ୍ତୁ ।\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "ଏହି ଫାଇଲଟି ଏହି {{PLURAL:$1|ଫାଇଲଟି|ଫାଇଲ ମାନଙ୍କ}}ର ଏକ ନକଲ ଅଟେ:",
        "file-deleted-duplicate": "([[:$1]]) ସଙ୍ଗେ ସମାନ ଫାଇଲଟି ଆଗରୁ ଲିଭାଇଦିଆଗଲା ।\nଆପଣ ଫାଇଲଟିକୁ ଆଉଥରେ ଅପଲୋଡ଼ କରିବା ଆଗରୁ ତାହାର ଲିଭାଇବା ଇତିହାସ ଦେଖିନିଅନ୍ତୁ ।",
+       "file-deleted-duplicate-notitle": "ଏହି ଫାଇଲ ଭଳି ଆଉ ଏକ ଫାଇଲ ଲିଭାଇ ଦିଆଯାଇଛି ଓ ନାମଟିକୁ ଦବାଇଦିଆଯାଇଛି । ଆଉଥରେ ଅପଲୋଡ଼ କରିବା ପାଇଁ ଆଗକୁ ବଢ଼ିବା ଆଗରୁ ଏ ପରିସ୍ଥିତର ସମୀକ୍ଷା କରିବା ପାଇଁ ଦବାଯାଇଥିବା ଫାଇଲ ନାମକୁ ଦେଖାଇବା କ୍ଷମତା ଥିବା ଆଉ କାହାକୁ ପଚାରନ୍ତୁ ।",
        "uploadwarning": "ଅପଲୋଡ଼ ଚେତାବନୀ",
        "uploadwarning-text": "ତଳେ ଥିବା ଫାଇଲର ବିବରଣୀ ବଦଳାଇ ଆଉ ଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।",
        "savefile": "ଫାଇଲ ସାଇତିବା",
        "uploaddisabledtext": "ଫାଇଲ ଅପଲୋଡ଼  ଅଚଳ କରାଯାଇଅଛି ।",
        "php-uploaddisabledtext": "PHPରେ ଫାଇଲ ଅପଲୋଡ଼କୁ ଅଚଳ କରାଯାଇଅଛି ।\nଦୟାକରି ଫାଇଲ_ଅପଲୋଡ଼ ସଜାଣିକୁ ପରଖି ନିଅନ୍ତୁ ।",
        "uploadscripted": "ଏହି ଫାଇଲଟିରେ HTML ବା ସ୍କ୍ରିପ୍ଟ କୋଡ଼ ଥିବାରୁ ଏକ ବେବ ବ୍ରାଉଜରରେ ଅଲଗା ରଖିବେ ।",
+       "uploadscriptednamespace": "ଏହି SVG ଫାଇଲରେ ଏକ ଅନୀତିକର ନେମସ୍ପେସ \"$1\" ରହିଛି ।",
+       "uploadinvalidxml": "ଅପଲୋଡ଼ ହୋଇଥିବା ଫାଇଲରେ XML ପାର୍ସ ହୋଇପାରିବ ନାହିଁ ।",
        "uploadvirus": "ଏହି ଫାଇଲଟିରେ ଏକ ଭାଇରସ ରହିଅଛି!\nସବିଶେଷ: $1",
        "uploadjava": "ଏହି ଫାଇଲଟି ଏକ ZIP ଫାଇଲ ଯେଉଁଥିରେ Java .class ଫାଇଲ ଅଛି ।\nJava ଫାଇଲ ଅପଲୋଡ଼ କରିବା ଅନୁମୋଦିତ ନୁହେଁ କାରଣ ସେସବୁ ସୁରକ୍ଷା ବଳୟକୁ ନଷ୍ଟ କରିଦିଅନ୍ତି ।",
        "upload-source": "ଉତ୍ସ ଫାଇଲ",
        "license": "ସତ୍ଵ:",
        "license-header": "ସତ୍ଵ",
        "nolicense": "ଗୋଟିଏ ବି ବଛାଯାଇନାହିଁ",
+       "licenses-edit": "ଲାଇସେନ୍ସ ଅପସନ ସମ୍ପାଦନା କରନ୍ତୁ",
        "license-nopreview": "(ସାଇତିବା ଆଗଦେଖଣା ମିଳୁନାହିଁ)",
-       "upload_source_url": "(ଏକ ବୈଧ ସାଧାରଣରେ ଖୋଲାଯାଇପାରୁଥିବା URL)",
-       "upload_source_file": "(ଆପଣଙ୍କ କମ୍ପୁଟରରେ ଥିବା ଏକ ଫାଇଲ)‌",
+       "upload_source_url": "(ଏକ ବୈଧ ସର୍ବସାଧାରଣରେ ଖୋଲାଯାଇ ପାରୁଥିବା ଆପଣଙ୍କ ବଛା URL)",
+       "upload_source_file": "(ନିଜ କମ୍ପ୍ୟୁଟରରୁ ଆପଣ ବାଛିଥିବା ଫାଇଲ)",
+       "listfiles-delete": "ଲିଭାନ୍ତୁ",
        "listfiles-summary": "ଏହି ବିଶେଷ ପୃଷ୍ଠାଟି ଅପଲୋଡ଼ ହୋଇଥିବା ସମସ୍ତ ଫାଇଲ ଦେଖାଇଥାଏ ।",
        "listfiles_search_for": "ମାଧ୍ୟମ ନାମଟି ଖୋଜିବେ:",
        "imgfile": "ଫାଇଲ",
        "listfiles_size": "ଆକାର",
        "listfiles_description": "ବିବରଣୀ",
        "listfiles_count": "ସଂସ୍କରଣ",
+       "listfiles-show-all": "ଛବିର ପୁରୁଣା ସଂସ୍କରଣ ରଖନ୍ତୁ",
        "listfiles-latestversion": "ବର୍ତ୍ତମାନର ସଂସ୍କରଣ",
        "listfiles-latestversion-yes": "ହଁ",
        "listfiles-latestversion-no": "ନାଁ",
        "filedelete-maintenance": "ରକ୍ଷଣାବେକ୍ଷଣ ନିମନ୍ତେ ଫାଇଲ ଲିଭାଇବା ଓ ପୁନସ୍ଥାପନ କିଛି କାଳ ପାଇଁ ଅଚଳ କରିଦିଆଯାଇଛି ।",
        "filedelete-maintenance-title": "ଏହି ଫାଇଲକୁ ଲିଭାଯାଇପାରିବ ନାହି",
        "mimesearch": "MIME ଖୋଜା",
-       "mimesearch-summary": "ଏହି ପୃଷ୍ଠାଟି ଫାଇଲ ମାନଙ୍କର MIME ପ୍ରକାରକୁ ଛଣିବାରେ ସହଯୋଗ କରିଥାଏ ।\nଇନପୁଟ: ବିଷୟ ଶ୍ରେଣୀ/ଉପ ଶ୍ରେଣ, ଯଥା: <code>image/jpeg</code> ।",
+       "mimesearch-summary": "ଏହି ପୃଷ୍ଠାଟି ଫାଇଲମାନଙ୍କର MIME ଅନୁସାରେ ସେମାନଙ୍କୁ ବାଛିଥାଏ ।\nଇନପୁଟ: contenttype/subtype କିମ୍ବା contenttype/*, ଯଥା: <code>image/jpeg</code> ।",
        "mimetype": "MIME ପ୍ରକାର:",
        "download": "ଡାଉନଲୋଡ଼",
        "unwatchedpages": "ଦେଖାହୋଇନଥିବା ପୃଷ୍ଠା",
        "listredirects": "ପୁନପ୍ରେରଣ ପୃଷ୍ଠାସମୂହର ତାଲିକା",
+       "listduplicatedfiles": "ଦୁଇଟି ଲେଖାଏ ବା ଅଧିକ ପ୍ରତିରୂପ ଥିବା ଫାଇଲ ତାଲିକା",
+       "listduplicatedfiles-summary": "ଏକ ଫାଇଲର ନଗଦ ସଂସ୍କରଣ ଆଉ ଏକ ଫାଇଲର ନଗଦ ସଂସ୍କରଣ ସହ ପୂରା ସମାନଥିବା ଫାଇଲମାନଙ୍କର ଏହା ଏକ ତାଲିକା । କେବଳ ସ୍ଥାନୀୟ ଫାଇଲକୁ ଏଥିରେ ଅନ୍ତର୍ଭୁକ୍ତ କରାଯାଇଛି ।",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]]ର [[$3|{{PLURAL:$2|ଏକ ନକଲ|$2ଟି ନକଲ}} ଆଗରୁ ଅଛି]] ।",
        "unusedtemplates": "ବ୍ୟବହାର ହୋଇନଥିବା ଛାଞ୍ଚ",
        "unusedtemplatestext": "ଏହି ପୃଷ୍ଠାରେ {{ns:template}} ନେମସ୍ପେସରେ ଥିବା ସବୁ ପୃଷ୍ଠାର ତାଲିକା ତିଆରି କରିଥାଏ ଯାହା ଆଉ ଏକ ପୃଷ୍ଠା ଭିତରେ ନାହିଁ ।\nଲିଭାଇବା ଆଗରୁ ଛାଞ୍ଚ ପାଇଁ ଥିବା ବାକି ଲିଙ୍କ ସବୁ ପରଖି ନିଅନ୍ତୁ ।",
        "unusedtemplateswlh": "ଅନ୍ୟ ସଂଯୋଗ",
        "randompage": "ଯାହିତାହି ପୃଷ୍ଠା",
        "randompage-nopages": "ତଳେ ଥିବା {{PLURAL:$2|ନେମସ୍ପେସ|ନେମସ୍ପେସ}}: $1ରେ ଗୋଟିଏ ବି ପୃଷ୍ଠା ନାହିଁ ।",
-       "randomincategory-selectcategory-submit": "ଯାଆନ୍ତୁ",
+       "randomincategory": "ଶ୍ରେଣୀରେ ଥିବା ଯାହିତାହି ପୃଷ୍ଠା",
+       "randomincategory-invalidcategory": "\"$1\" ଏକ ବୈଧ ଶ୍ରେଣୀର ନାମ ନୁହେଁ ।",
+       "randomincategory-nopages": "[[:Category:$1|$1]] ଶ୍ରେଣୀରେ କୌଣସିଟି ପୃଷ୍ଠା ନାହିଁ ।",
+       "randomincategory-category": "ଶ୍ରେଣୀ:",
+       "randomincategory-legend": "ଶ୍ରେଣୀରେ ଥିବା ଯାହିତାହି ପୃଷ୍ଠା",
        "randomredirect": "ଯାହିତାହି ପୁନପ୍ରେରଣ",
        "randomredirect-nopages": "\"$1\" ନାମରେ ଗୋଟିଏ ବି ପୁନପ୍ରେରଣ ନାହିଁ ।",
        "statistics": "ହିସାବ",
        "statistics-users-active": "ସଚଳ ସଭ୍ୟ",
        "statistics-users-active-desc": "ବିଗତ {{PLURAL:$1|ଦିନରେ|$1 ଦିନରେ}} କିଛି କାମ କରିଥିବା ସଭ୍ୟଗଣ",
        "statistics-mostpopular": "ସବୁଠାରୁ ଅଧିକ ଦେଖାଯାଇଥିବା ପୃଷ୍ଠା",
+       "pageswithprop": "ପୃଷ୍ଠା ବିବରଣୀ ଥିବା ପୃଷ୍ଠାମାନ",
+       "pageswithprop-legend": "ପୃଷ୍ଠା ବିବରଣୀଟିଏ ଥିବା ପୃଷ୍ଠାମାନ",
+       "pageswithprop-text": "ଏହୁ ପୃଷ୍ଠାରେ ଏକ ନିର୍ଦ୍ଦିଷ୍ଟ ପୃଷ୍ଠାର ଗୁଣଥିବା ପୃଷ୍ଠାମାନଙ୍କର ତାଲିକା ରହିଛି ।",
+       "pageswithprop-prop": "ଗୁଣ ନାମ:",
        "pageswithprop-submit": "ଯିବା",
+       "pageswithprop-prophidden-long": "ଲମ୍ବା ଟେକ୍ସଟର ଗୁଣର ମୂଲ୍ୟ ଅଧିକ କାଳ ଧରି ଲୁଚିରହିଥିବା ($1)",
+       "pageswithprop-prophidden-binary": "ବାଇନାରି ଗୁଣ ମୂଲ୍ୟ ଲୁଚାଯାଇଛି ($1)",
        "doubleredirects": "ଯୋଡ଼ା ପୁନପ୍ରେରଣ",
        "doubleredirectstext": "ଏହି ପୃଷ୍ଠା ବାକି ବହୁବିକଳ୍ପ ପୃଷ୍ଠାମାନଙ୍କ ସହ ଯୋଡ଼ିଥାଏ ।\nପ୍ରତ୍ୟେକ ଧାଡ଼ିରେ ପ୍ରଥମ ଓ ଶେଷ ପୁନପ୍ରେରଣ ସହ ଯୋଡ଼ିବା ଲିଙ୍କ ରହିଥାଏ, ଆହୁରି ମଧ୍ୟ ଏଥିରେ ଦ୍ଵିତୀୟ ପୁନପ୍ରେରଣର ଲକ୍ଷ ସହ ଯୋଡ଼ିବାର ଲିଙ୍କ ଥାଏ , ଯାହାକି ସାଧାରଣତ \"ପ୍ରକୃତ\" ଲକ୍ଷ ପୃଷ୍ଠା ହୋଇଥାଏ, ଯାହାକୁ ପ୍ରଥମ ପୁନପ୍ରେରଣ ପୃଷ୍ଠା ଯୋଡ଼ିଥାଏ ।\n<del>କଟାହୋଇଥିବା</del> ନିବେଶସବୁ ସଜଡ଼ାଗଲା ।",
        "double-redirect-fixed-move": "[[$1]]କୁ ଘୁଞ୍ଚାଯାଇଅଛି ।\nଏବେ ଆପେ ଆପେ ଅପଡେଟ ହୋଇଥାଏ ଏବଂ ଏବେ [[$2]]କୁ ପୁନପ୍ରେରିତ ହୋଇଛି ।",
        "ninterwikis": "{{PLURAL:$1|interwiki|interwikis}} $1",
        "nlinks": "$1 ଟି {{PLURAL:$1|ଲିଙ୍କ|ଲିଙ୍କ}}",
        "nmembers": "$1 {{PLURAL:$1|member|ସଭ୍ୟ}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|ସଭ୍ୟ|ସଭ୍ୟଗଣ}}",
        "nrevisions": "$1 ଗୋଟି {{PLURAL:$1|ସଂସ୍କରଣ|ସଂସ୍କରଣ}}",
        "nviews": "$1 ଟି {{PLURAL:$1|ଦେଖଣା|ଦେଖଣା}}",
        "nimagelinks": "$1 ଟି {{PLURAL:$1|ପୃଷ୍ଠା|ପୃଷ୍ଠା}}ରେ ବ୍ୟବହାର କରାଯାଇଅଛି",
        "wantedpages-badtitle": "$1 ଉତ୍ତରସବୁରେ ଥିବା ଭୁଲ ଟାଇଟଲ",
        "wantedfiles": "ଦରକାରି ଫାଇଲ",
        "wantedfiletext-cat": "ନିମ୍ନଲିଖିତ ଫାଇଲଗୁଡିକ ବ୍ୟବହୃତ ହେଇଛି ହଲେ ନାହିଁ । ରହିଥିବା ଫାଇଲ ବଦଳରେ ବାହାରେ ଥିବା ଫାଇଲଗୁଡିକ ତାଲିକାଭୁକ୍ତ ହେଇଛି । ଏହିଭଳି ଭୁଲ ସତ୍ୟଗୁଡିକ <del>struck out</del> ହେଇଯିବ । ଅଧିକନ୍ତୁ, ପ୍ରକୃତରେ ନଥିବା ଫାଇଲଗୁଡିକର ପୃଷ୍ଠାଗୁଡିକ [[:$1]]ରେ ତାଲିକାଭୁକ୍ତ ହୋଇଛି ।",
+       "wantedfiletext-cat-noforeign": "ଏହି ଫାଇଲସବୁ ତିଆରି ନ କରାଯାଇ ବ୍ୟବହାର କରାଯାଇଛି । ଏଥି ସହିତ, ତିଆରି ହୋଇନଥିବା ଫାଇଲକୁ ଏମବେଡ଼ କରିଥିବା ପୃଷ୍ଠାସବୁର ତାଲିକା [[:$1]]ରେ ରହିଛି ।",
        "wantedfiletext-nocat": "ନିମ୍ନଲିଖିତ ଫାଇଲଗୁଡିକ ବ୍ୟବହୃତ ହେଇଛି ହଲେ ନାହିଁ । ରହିଥିବା ଫାଇଲ ବଦଳରେ ବାହାରେ ଥିବା ଫାଇଲଗୁଡିକ ତାଲିକାଭୁକ୍ତ ହେଇଛି । ଏହିଭଳି ଭୁଲ ସତ୍ୟଗୁଡିକ <del>struck out</del> ହେଇଯିବ ।",
+       "wantedfiletext-nocat-noforeign": "ଏହି ଫାଇଲସବୁ ବ୍ୟବହୃତ ହୋଇଥିଲେ ମଧ୍ୟ ତିଆରି କରାଯାଇନାହିଁ ।",
        "wantedtemplates": "ଦରକାରୀ ଛାଞ୍ଚ",
        "mostlinked": "ଅଧିକ ଯୋଡ଼ାଯାଇଥିବା ପୃଷ୍ଠା",
        "mostlinkedcategories": "ବେଶି ଯୋଡ଼ାଯାଇଥିବା ଶ୍ରେଣୀ",
-       "mostlinkedtemplates": "ବà­\87ଶà­\80 à¬¯à­\8bଡ଼ାଯାà¬\87ଥିବା à¬\9bାà¬\9eà­\8dà¬\9a",
+       "mostlinkedtemplates": "ବà­\87ଶି à¬¯à­\8bଡ଼ାଯାà¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା",
        "mostcategories": "ଅଧିକ ଶ୍ରେଣୀ ଥିବା ପୃଷ୍ଠା",
        "mostimages": "ଫାଇଲରେ ବେଶି ଯୋଡ଼ାଯାଇଥିବା ଥିବା",
        "mostinterwikis": "ସବୁଠାରୁ ଅଧିକ ଉଇକିଥିବା ପୃଷ୍ଠାଗୁଡିକ",
        "mostrevisions": "ସବୁଠାରୁ ଅଧିକ ସଙ୍କଳନ ଥିବା ପୃଷ୍ଠାସମୂହ",
        "prefixindex": "ଆଗରୁ କିଛି ଯୋଡ଼ା ସହ ଥିବା ସବୁ ଫରଦସବୁ",
        "prefixindex-namespace": "ଉପସର୍ଗ ଲାଗିଥିବା ସବୁଯାକ ପୃଷ୍ଠା ($1 ଗୋଟି ନେମସ୍ପେସ)",
+       "prefixindex-strip": "ତାଲିକାରୁ ନାମ ଆଗରୁ ଲାଗୁଥିବା ଶବ୍ଦ ହଟାନ୍ତୁ",
        "shortpages": "ଛୋଟ ପୃଷ୍ଠାସମୂହ",
        "longpages": "ଲମ୍ବା ପୃଷ୍ଠା",
        "deadendpages": "ଆଗକୁ ଯାଇପାରୁନଥିବା ପୃଷ୍ଠା",
        "deadendpagestext": "ଏହି ପୃଷ୍ଠାସବୁ {{SITENAME}}ର ବାକି ପୃଷ୍ଠାମାନଙ୍କ ସଙ୍ଗେ ଯୋଡ଼ା ହୋଇ ନାହାନ୍ତି ।",
        "protectedpages": "କିଳାଯାଇଥିବା ପୃଷ୍ଠାମାନ",
        "protectedpages-indef": "କେବଳ ଆସିମୀତ କାଳ ପାଇଁ କିଳିବା",
+       "protectedpages-summary": "ଏହି ପୃଷ୍ଠାରେ କିଳା ହୋଇଥିବା ଆଗରୁ ତିଆରି ହୋଇ ରହିଥିବା ପୃଷ୍ଠାସବୁର ତାଲିକା ଅଛି । ତିଆରି ହେବାରୁ ରୋକାଯାଇଥିବା ନାମମାନଙ୍କର ତାଲିକା ପାଇଁ [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] ଦେଖନ୍ତୁ ।",
        "protectedpages-cascade": "କିଲାଯାଇଥିବା ପୃଷ୍ଠାସବୁକୁ ଏକାଠି ସଜାଇ ରଖୁଅଛୁଁ",
+       "protectedpages-noredirect": "ଲେଉଟାଣି ଲୁଚାନ୍ତୁ",
        "protectedpagesempty": "ଏହି ସବୁ ସଜାଣି ସହ ଗୋଟିଏ ବି ପୃଷ୍ଠା ଏବେ କିଳାଯାଇ ନାହିଁ ।",
        "protectedpages-timestamp": "ସମୟ",
        "protectedpages-page": "ପୃଷ୍ଠା",
        "protectedpages-expiry": "ଅଚଳ ହେବ",
+       "protectedpages-performer": "ସଭ୍ୟଙ୍କୁ କିଳିବେ",
+       "protectedpages-params": "ଅଟକ ଗୁଣାବଳୀ",
+       "protectedpages-reason": "କାରଣ",
+       "protectedpages-unknown-timestamp": "ଅଜଣା",
        "protectedpages-unknown-performer": "ଅଜଣା ସଭ୍ୟ",
        "protectedtitles": "କିଳାଯାଇଥିବା ଶିରୋନାମାମାନ",
+       "protectedtitles-summary": "ଏହି ପୃଷ୍ଠାରେ ତିଆରି କରିବାରୁ ଅଟକାଯାଇଥିବା ନାମସବୁର ତାଲିକା ରହିଛି । ଉପଲବ୍ଧ ଥିବା ଓ କିଳାଯାଇଥିବା ପୃଷ୍ଠାର ତାଲିକା ପାଇଁ [[{{#special:ProtectedPages}}|{{int:protectedpages}} ଦେଖନ୍ତୁ]] ।",
        "protectedtitlesempty": "ଏହି ସବୁ ସଜାଣି ସହ ଗୋଟିଏ ବି ପୃଷ୍ଠା ଏବେ କିଳାଯାଇ ନାହିଁ ।",
        "listusers": "ବ୍ୟବହାରକାରୀଙ୍କ ତାଲିକା",
        "listusers-editsonly": "କେବଳ କିଛି ସମ୍ପାଦନା କରିଥିବା ସଭ୍ୟମାନଙ୍କୁ ଦେଖାଇବେ",
        "listusers-creationsort": "ତିଆରି ତାରିଖ ଅନୁସାରେ ସଜାଇବେ",
+       "listusers-desc": "ଅବରୋହୀ କ୍ରମରେ ସଜାନ୍ତୁ",
        "usereditcount": "$1 ଗୋଟି {{PLURAL:$1|ସମ୍ପାଦନା|ସମ୍ପାଦନା}}",
        "usercreated": "$1 ତାରିଖ ଦିନ $2 ବେଳେ {{GENDER:$3|ତିଆରି କରାଗଲା}}",
        "newpages": "ନୂଆ ପୃଷ୍ଠା",
        "querypage-disabled": "ଏହି ବିଶେଷ ପୃଷ୍ଠାଟି ଦେଖଣା କାରଣରୁ ଅଚଳ କରାଯାଇଅଛି ।",
        "booksources": "ବହିର ମୁଳାଧାର",
        "booksources-search-legend": "ବହିର ସ୍ରୋତସବୁକୁ ଖୋଜିବେ",
-       "booksources-go": "ଯିବା",
+       "booksources-search": "ଖୋଜିବେ",
        "booksources-text": "ତଳଲିଖିତ ତାଲିକାଟିରେ ନୂଆ ଓ ପୁରୁଣା ବହି ବିକୁଥିବା ସାଇଟମାନଙ୍କର ତାଲିକା ରହିଅଛି, ଆଉ ଆପଣ ଖୋଜୁଥିବା ବହିର ତଥ୍ୟ ବି ଏଥିରେ ଥାଇପାରେ ।",
        "booksources-invalid-isbn": "ଏହି ISBN ଟି ବୈଧ ବୋଲି ବୋଧ ହେଉନାହିଁ; ନକଲ କରିଥିବା ମୂଳ ସ୍ଥାନରେ ଆଉଥରେ ପରଖିନିଅନ୍ତୁ ।",
        "specialloguserlabel": "ଯୋଗଦାନକାରୀ:",
        "listgrouprights-removegroup-self": "{{PLURAL:$2|ଗୋଠଟିଏ|ଗୋଟି ଗୋଠ}} ନିଜ ଖାତାରୁ ହଟାଇବେ: $1",
        "listgrouprights-addgroup-self-all": "ନିଜ ଖାତାରେ ସବୁଯାକ ଗୋଠ ଯୋଡ଼ିବେ",
        "listgrouprights-removegroup-self-all": "ନିଜ ଖାତାରୁ ସବୁଯାକ ଗୋଠ ହଟାଇଦେବେ",
+       "listgrouprights-namespaceprotection-header": "ନେମସ୍ପେସ ଅଟକା",
        "listgrouprights-namespaceprotection-namespace": "ନେମସ୍ପେସ",
        "listgrouprights-namespaceprotection-restrictedto": "ସଭ୍ୟଙ୍କୁ ସମ୍ପାଦନା ପାଇଁ ଦିଆଯାଇଥିବା ଅଧିକାର",
        "trackingcategories": "ଶ୍ରେଣୀମାନ ତଦାରଖ କରାଯାଉଛି",
+       "trackingcategories-summary": "MediaWiki ସଫ୍ଟଓଏର ଦ୍ୱାରା ଆପେ ଆପେ ତିଆରି ହେଉଥିବା ଶ୍ରେଣୀସବୁର ତାଲିକା ଏହି ପୃଷ୍ଠାରେ ରହିଛି । {{ns:8}} ନେମସ୍ପେସରେ ସିଷ୍ଟମ ମେସେଜସବୁ ବଦଳାଇ ସେମାନଙ୍କ ନାମ ବଦଳା ଯାଇପାରିବ ।",
+       "trackingcategories-msg": "ଶ୍ରେଣୀ ଉପରେ ନିଘା",
        "trackingcategories-name": "ନାମ ମେସେଜ କରନ୍ତୁ",
+       "trackingcategories-desc": "ଶ୍ରେଣୀ ଅନ୍ତର୍ଗତ କରିବା ଗୁଣ",
+       "noindex-category-desc": "<code><nowiki>__NOINDEX__</nowiki></code> ମ୍ୟାଜିକ ୱାର୍ଡ଼ ଥିବାରୁ ଏହି ପୃଷ୍ଠାଟି ରୋବଟମାନଙ୍କ ଦ୍ୱାରା ସୂଚୀକରଣ କରାଯାଇନାହିଁ । ପୃଷ୍ଠାଟି ଏକ ରୋବଟ ସୂଚକ ଅନୁମୋଦିତ ଥିବା ନେମସ୍ପେସରେ ରହିଛି ।",
+       "index-category-desc": "ଏହି ପୃଷ୍ଠାରେ ଏକ <code><nowiki>__INDEX__</nowiki></code> ରହିଛି (ଏବଂ ଏହା ସୂଚକଟି ଅନୁମୋଦିତ ଥିବା ଏକ ନେମସ୍ପେସରେ ରହିଛି), ଏବଂ ଏଣୁ ଏହା ରୋବଟମାନଙ୍କ ସହିତ ଶ୍ରେଣୀଭୁକ୍ତ ହୋଇଛି, ସାଧାରଣତଃ ଏହା ସେଠାରେ ରହେ ନାହିଁ ।",
+       "post-expand-template-inclusion-category-desc": "ସବୁ ଛାଞ୍ଚ ବଢ଼ାଇଲା ପରେ ଏହି ପୃଷ୍ଠାର ଆକାର <code>$wgMaxArticleSize</code>ରୁ ବଡ଼, ତେଣୁ କିଛି ଛାଞ୍ଚଙ୍କ ବାବଦରେ ବତାଯାଇନଥିଲା ।",
+       "post-expand-template-argument-category-desc": "ଛାଞ୍ଚର ଯୁକ୍ତିଟିଏ ବଢ଼ାଇଲା ପରେ ଏହି ପୃଷ୍ଠାର ଆକାର <code>$wgMaxArticleSize</code>ରୁ ବଡ଼ ହୋଇଗଲା (ବେଳେବେଳେ <code>{{{Foo}}}</code> ଭଳି ତିନୋଟି କୁଟିଳ ବନ୍ଧନୀରେ ଦେଖହିବାକୁ ମିଳେ) ।",
+       "expensive-parserfunction-category-desc": "ଏହି ପୃଷ୍ଠାଟି କିଛି ଜଟିଳ ପାର୍ସ ଫଙ୍କସନ ବ୍ୟବହାର କରେ (ଯଥା <code>#ifexist</code>) । [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] ଦେଖନ୍ତୁ ।",
+       "broken-file-category-desc": "ଏହି ପୃଷ୍ଠାରେ ଏକ ଅକାମୀ ଫାଇଲର ଲିଙ୍କ ରହିଛି (ଫାଇଲ ନଥାଇ ତାହାକୁ ଏମବେଡ଼ କରିବା ପାଇଁ ଲିଙ୍କ ଦିଆଯାଇଛି) ।",
+       "hidden-category-category-desc": "ବିଷୟବସ୍ତୁରେ ଶ୍ରେଣୀଟିରେ <code><nowiki>__HIDDENCAT__</nowiki></code> ରହିଛି, ଯାହା ତାହାକୁ  ଆପେଆପେ ଶ୍ରେଣୀ ଲିଙ୍କ ଘରେ ଦେଖାଇବାରୁ ରୋକେ ।",
        "trackingcategories-nodesc": "କୌଣସି ବିବରଣ ନାହିଁ ।",
        "trackingcategories-disabled": "ଶ୍ରେଣୀ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି",
        "mailnologin": "ଗୋଟିଏ ବି ପଠାଇବା ଠିକଣା ନାହିଁ",
        "mywatchlist": "ଦେଖଣାତାଲିକା",
        "watchlistfor2": "$1 $2 ପାଇଁ",
        "nowatchlist": "ଆପଣଙ୍କ ଦେଖଣା ତାଲିକାରେ କିଛି ବି ଜିନିଷ ନାହିଁ ।",
-       "watchlistanontext": "à¬\86ପଣା à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬\95ିà¬\9bି à¬¸à¬®à­\8dପାଦନା à¬\95ରିବା à¬¨à¬¿à¬®à¬¨à­\8dତà­\87 à¬¦à­\9fାà¬\95ରି  $1 କରନ୍ତୁ ।",
+       "watchlistanontext": "ନିà¬\9c à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାà¬\95à­\81 à¬¦à­\87à¬\96ିବା à¬\95ିମà­\8dବା à¬¸à¬®à­\8dପାଦନା à¬\95ରିବା à¬ªà¬¾à¬\87à¬\81  à¬²à¬\97 à¬\87ନ କରନ୍ତୁ ।",
        "watchnologin": "ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି",
        "addwatch": "ଦେଖଣାତାଲିକାରେ ଯୋଡ଼ିବେ",
        "addedwatchtext": "\"[[:$1]]\" ପୃଷ୍ଠାଟି ଆପଣଙ୍କ [[Special:Watchlist|ଦେଖଣାତାଲିକା]]ରେ ଯୋଡ଼ିଦିଆଗଲା ।\nଏହି ପୃଷ୍ଠାରେ ଭବିଷ୍ୟତର ଅଦଳ ବଦଳ ଓ ତାହା ସହ ଯୋଡ଼ା ଆଲୋଚନା ପୃଷ୍ଠା ସେଠାରେ ଦିଆଯିବ ।",
        "watchlist-details": "ଆପଣଙ୍କ ଦେଖଣା ତାଲିକାରେ {{PLURAL:$1|$1 ଟି ପୃଷ୍ଠା|$1 ଟି ପୃଷ୍ଠା}} ଅଛି, ଆଲୋଚନା ପୃଷ୍ଠାମାନଙ୍କୁ ଅଲଗା ଗଣାଯାଇନାହିଁ ।",
        "wlheader-enotif": "ଇମେଲ ସୂଚନା ସଚଳ କରାଗଲା ।",
        "wlheader-showupdated": "ଆପଣ ଶେଷଥର ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ '''ମୋଟା ଅକ୍ଷର'''ରେ ଦେଖାଯାଉଅଛି ।",
-       "wlnote": "$3, $4 à¬¸à­\81ଦà­\8dଧା à¬¬à¬¿à¬\97ତ {{PLURAL:$2|à¬\98ଣà­\8dà¬\9fà­\87 à¬­à¬¿à¬¤à¬°à­\87|'''$2''' à¬\98ଣà­\8dà¬\9fା à¬­à¬¿à¬¤à¬°à­\87}} à¬\98à¬\9fିଥିବା {{PLURAL:$1|ଶà­\87ଷ à¬¬à¬¦à¬³à¬\9fି à¬\85à¬\9bି|ଶà­\87ଷ '''$1''' à¬\9fି à¬¬à¬¦à¬³}} à¬¤à¬³à­\87 à¬¦à¬¿à¬\86ଯାà¬\87à¬\9bି ।",
-       "wlshowlast": "ଶà­\87ଷ $1 à¬\98ଣà­\8dà¬\9fା $2 à¬¦à¬¿à¬¨ $3 à¬¦à­\87à¬\96ାà¬\87ବà­\87",
+       "wlnote": "$3, $4 à¬\85ନà­\81ସାରà­\87 à¬¬à¬¿à¬\97ତ {{PLURAL:$2|à¬\98ଣà­\8dà¬\9fାà¬\95ରà­\87|<strong>$2</strong> à¬\98ଣà­\8dà¬\9fାରà­\87}}{{PLURAL:$1|ଶà­\87ଷ à¬¬à¬¦à¬³|ଶà­\87ଷ <strong>$1</strong> à¬¬à¬¦à¬³ à¬¤à¬³à­\87 à¬¦à¬¿à¬\86à¬\97ଲା}} ।",
+       "wlshowlast": "à¬\97ତ $1 à¬\98ଣà­\8dà¬\9fା $2 à¬¦à¬¿à¬¨ à¬¦à­\87à¬\96ାନà­\8dତà­\81",
        "watchlist-options": "ଦେଖଣା ବିକଳ୍ପସବୁ",
        "watching": "ଦେଖୁଛି...",
        "unwatching": "ଦେଖୁନାହିଁ...",
        "enotif_lastvisited": "ଆପଣଙ୍କ ଶେଷ ଦେଖଣା ପରେ ହୋଇଥିବା ବଦଳସବୁକୁ  ଦେଖିବା ନିମନ୍ତେ $1 ଦେଖନ୍ତୁ ।",
        "enotif_lastdiff": "ଏହି ବଦଳ ଦେଖିବା ପାଇଁ $1 ଦେଖନ୍ତୁ ।",
        "enotif_anon_editor": "ବେନାମି ସଭ୍ୟ $1",
-       "enotif_body": "ପ୍ରିୟ $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nଏହି {{SITENAME}} $PAGETITLE ପୃଷ୍ଠାଟି $PAGEEDITOR ଙ୍କ ଦେଇ $PAGEEDITDATE ବେଳେ $CHANGEDORCREATE, ନଗଦ ସଂସ୍କରଣ ପାଇଁ $PAGETITLE_URL  ଦେଖନ୍ତୁ ।\n\n$NEWPAGE\n\nସମ୍ପାଦକଙ୍କ ସାରକଥା: $PAGESUMMARY $PAGEMINOREDIT\n\nସମ୍ପାଦକଙ୍କ ସହିତ ଯୋଗାଯୋଗ:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nଭବିଷ୍ୟତରେ ଆପଣ ପୃଷ୍ଠାଟିକୁ ନ ଦେଖିବା ଯାଏ ଆଉ କିଛି ବି ସୂଚନା ରହିବ ନାହିଁ ।ଆପଣା ଦେଖଣାତାଲିକାରୁ ଆପଣ ସବୁଯାକ ସୂଚନା ଫଳକକୁ ମୂଳ ଅବସ୍ଥାକୁ ଫେରାଇ ଦେଇପାରିବେ ।\n\n\t\t\t ଆପଣଙ୍କର ହିତକାରୀ {{SITENAME}} ସୂଚନା ପ୍ରଣାଳୀ\n\n--\nଆପଣା ଇ-ମେଲ ସୂଚନା ସଜାଣି ଦେଖିବା ନିମନ୍ତେ\n{{canonicalurl:{{#special:Preferences}}}} ଦେଖନ୍ତୁ",
+       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nଉଇକିଆଳିଙ୍କ ସୂଚନା: $PAGESUMMARY $PAGEMINOREDIT\n\nଉଇକିଆଳିଙ୍କୁ ଜଣାନ୍ତୁ:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nକିଛି କାମ ହେଲେ ମଧ୍ୟ ଭବିଷ୍ୟତରେ ଆପଣ ଲଗ ଇନ କରି ପୃଷ୍ଠାଟିକୁ ନ ଦେଖିବା ଯାଏ ଆଉ କିଛି ବି ସୂଚନା ରହିବ ନାହିଁ  । ଆପଣ ନିଜର ଦେଖଣାତାଲିକାରେ ଥିବା ସବୁ ପୃଷ୍ଠାମାନଙ୍କ  ସୂଚନା ସୂଚକମାନଙ୍କୁ ରିସେଟ କରିପାରିବେ।\n\nଆପଣଙ୍କ ହିତକାରୀ {{SITENAME}} ସୂଚନା ବ୍ୟବସ୍ଥା\n\n--\nନିଜର ଇମେଲ ସୂଚନା ସଂରଚନା ବଦଳାଇବା ପାଇଁ\n{{canonicalurl:{{#special:Preferences}}}} ଦେଖନ୍ତୁ\n\nନିଜର ଦେଖଣାତାଲିକା ସୂଚନା ସଂରଚନା ବଦଳାଇବା ପାଇଁ\n{{canonicalurl:{{#special:EditWatchlist}}}} ଦେଖନ୍ତୁ\n\nଏହି ପୃଷ୍ଠାଟିକୁ ନିଜର ଦେଖଣାତାଲିକାରୁ ହଟାଇବା ପାଇଁ\n$UNWATCHURL\n\nମତାମତ ଓ ଅଧିକ ସହଯୋଗ:\n$HELPPAGE",
        "created": "ତିଆରି କରାଗଲା",
        "changed": "ବଦଳାଗଲା",
        "deletepage": "ପୃଷ୍ଠାଟି ଲିଭାଇଦେବେ",
        "exbeforeblank": "ଖାଲିକରିବା ଆଗରୁ ଭିତରେ \"$1\" ଥିଲା",
        "delete-confirm": "ଲିଭେଇବେ \"$1\"",
        "delete-legend": "ଲିଭାଇବେ",
-       "historywarning": "'''ଚେତାବନୀ:''' ଆପଣ ଲିଭାଇବାକୁ ଯାଉଥିବା ଏହି ପୃଷ୍ଠାଟିର ପାଖାପାଖି $1 {{PLURAL:$1|ଟି ସଙ୍କଳନ|ଗୋଟି ସଙ୍କଳନ}} ରହିଅଛି:",
+       "historywarning": "<strong>ଚେତାବନୀ:</strong> ଆପଣ ଲିଭାଇବାକୁ ଯାଉଥିବା ପୃଷ୍ଠାଟିରେ $1 {{PLURAL:$1|ଗୋଟି ସଂସ୍କରଣ|ଗୋଟି ସଂସ୍କରଣ}}ର ଇତିହାସ ରହିଛି:",
        "confirmdeletetext": "ଆପଣ ଗୋଟିଏ ପୃଷ୍ଠାର ଇତିହାସ ସହ ତାହାକୁ ଲିଭାଇବାକୁ ଯାଉଛନ୍ତି ।\nଏହା ଥୟ କରନ୍ତୁ ଯେ ଆପଣ ଏହାର ପରିଣତି ଜାଣିଛନ୍ତି ଓ ଏହା [[{{MediaWiki:Policy-url}}|ମିଡ଼ିଆଉଇକିର ନିୟମ]] ଅନୁସାରେ କରୁଛନ୍ତି ।",
        "actioncomplete": "କାମଟି ପୁରା ହେଲା",
        "actionfailed": "କାମଟି ଅସଫଳ ହୋଇଗଲା",
        "deletecomment": "କାରଣ:",
        "deleteotherreason": "ବାକି/ଅଧିକ କାରଣ:",
        "deletereasonotherlist": "ଅଲଗା କାରଣ",
-       "deletereason-dropdown": "*ସାଧାରଣ ଲିଭାଇବା କାରଣ\n** ଲେଖକ ଅନୁରୋଧ\n** ସତ୍ଵାଧିକାର ଉଲଂଘନ\n** ଅନୀତିକର କାମ",
+       "deletereason-dropdown": "* *ସାଧାରଣ ଲିଭାଇବା କାରଣ\n** ସ୍ପାମ\n** ଅନୀତିକର କାମ\n** ସତ୍ଵାଧିକାର ଉଲଂଘନ\n** ଲେଖକ ଅନୁରୋଧ\n** ଅକାମୀ ଲେଉଟାଣି",
        "delete-edit-reasonlist": "ଲିଭାଇବା କାରଣମାନ ବଦଳାଇବେ",
        "delete-toobig": "ଏହି ପୃଷ୍ଠାର ଏକ ଲମ୍ବା ସମ୍ପାଦନା ଇତିହାସ ଅଛି, ଯେଉଁଥିରେ $1  {{PLURAL:$1|ଟି ସଂସ୍କରଣ|ଗୋଟି ସଂସ୍କରଣ}} ରହିଛି ।\n{{SITENAME}}ରେ ଦୁର୍ଘଟଣାବଶତ ଅସୁବିଧାକୁ ଏଡ଼ାଇବା ପାଇଁ ଏହାକୁ ଲିଭାଇବାରୁ ବାରଣ କରାଯାଇଛି ।",
        "delete-warning-toobig": "ଏହି ପୃଷ୍ଠାର ଏକ ଲମ୍ବ ସମ୍ପାଦନ ଇତିହାସ ରହିଛି, ଯେଉଁଥିରେ $1 {{PLURAL:$1|ଗୋଟି ସଂସ୍କରଣ|ଗୋଟି ସଂସ୍କରଣ}} ରହିଛି ।\nଏହାକୁ ଲିଭାଇଲେ {{SITENAME}}ରେ ଅସୁବିଧା ହୋଇପାରେ ।\nସାବଧାନତାର ସହ ଆଗକୁ ବଢ଼ନ୍ତୁ ।",
+       "deleteprotected": "ଏହି ପୃଷ୍ଠାଟି କିଳାଯାଇଥିବାରୁ ଆପଣ ଏହାକୁ ଲିଭାଇପାରିବେ ନାହିଁ ।",
+       "deleting-backlinks-warning": "''' ଚେତାବନୀ:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|ବାକି ପୃଷ୍ଠା]] ଆପଣ ଲିଭାଇବାକୁ ଯାଉଥିବା ପୃଷ୍ଠାଟି ସହିତ ଲିଙ୍କ କରନ୍ତୁ କିମ୍ବା ତାହାକୁ କାଢ଼ନ୍ତୁ ।",
        "rollback": "ପୁରାପୁରି ପଛକୁ ଫେରିବା ବଦଳ",
        "rollback_short": "ପୂରାପୂରି ପଛକୁ ଫେରିଯିବେ",
        "rollbacklink": "ପୂରାପୂରି ପଛକୁ ଫେରିଯିବେ",
        "alreadyrolled": "[[User:$2|$2]]([[User talk:$2|talk]] {{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])ଙ୍କ ଦେଇ [[:$1]]ରେ ହୋଇଥିବା ଶେଷ ବଦଳକୁ ପଛକୁ ଫେରାଯାଇପାରିବ ନାହିଁ ;\nଏହାକୁ ଆଉ କେହି ସମ୍ପାଦନା କରିଛି ବା ପୁରାପୁରି ପଛକୁ ଫେରାଇଦେଇଛି ।\n\nଏହି ପୃଷ୍ଠାର ଶେଷ  ସମ୍ପାଦନା  [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ଙ୍କ ଦେଇ ହୋଇଥିଲା ।",
        "editcomment": "ସମ୍ପାଦନାର ସାରକଥା ଥିଲା: \"''$1''\" ।",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ଆଲୋଚନା]])ଙ୍କ ଦେଇ କରାଯାଇଥିବା ବଦଳକୁ [[User:$1|$1]]ଙ୍କ ଦେଇ କରାଯାଇଥିବା ଶେଷ ବଦଳକୁ ଫେରାଇ ଦିଆଗଲା",
-       "revertpage-nouser": "(ଇଉଜର ନାମ ବାହାର କରିଦିଆଯାଇଅଛି)ଙ୍କ ଦେଇ କରାଯାଇଥିବା ବଦଳକୁ [[User:$1|$1]]ଙ୍କ ଦେଇ କରାଯାଇଥିବା ଶେଷ ବଦଳକୁ ଲେଉଟାଇଦିଆଗଲା",
+       "revertpage-nouser": "{{GENDER:$1|[[User:$1|$1]]}}ଙ୍କ ଦେଇ ଜଣେ ଅଜଣା ସଭ୍ୟଙ୍କ ସମ୍ପାଦନାକୁ ପଛକୁ ଫେରଗଲା",
        "rollback-success": "$1ଙ୍କ ଦେଇ ହୋଇଥିବା ସମ୍ପାଦନାକୁ ପୁରାପୁରି ପଛକୁ ଲେଉଟାଇ ଦିଆଗଲା;\n$2ଙ୍କ ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସ୍କରଣକୁ ବଦଳାଇ ଦିଆଗଲା ।",
        "sessionfailure-title": "ଅବଧି ବିଫଳ",
        "sessionfailure": "ଆପଣଙ୍କ ଲଗଇନ ଅବଧିରେ କିଛି ଅସୁବିଧା ହୋଇଛି;\nଅବଶ୍ୟ ଚୋରା ବିରୋଧରେ ଏହି କାମଟି ନାକଚ କରିଦିଆଗଲା ।\nଆଗ ପୃଷ୍ଠାକୁ ଲେଉଟିଯାଇ ପୃଷ୍ଠାଟି ଆଉଥରେ ଲୋଡ଼ କରନ୍ତୁ ।",
        "protect-locked-blocked": "ଆପଣଙ୍କୁ ଅଟକାଯାଇଥିବାରୁ ଆପଣ ପ୍ରତିରକ୍ଷା ସ୍ତରକୁ ବଦଳାଇ ପାରିବେ ନାହିଁ ।\n'''$1''' ପୃଷ୍ଠା ପାଇଁ ଏବେକାର ସଜାଣି ଦେଖନ୍ତୁ:",
        "protect-locked-dblock": "ଏକ ସଚଳ ଡାଟାବେସ କିଳାଯାଇଥିବା ହେତୁ ପ୍ରତିରକ୍ଷା ସ୍ତରକୁ ବଦଳଯାଇପାରିବ ନାହିଁ ।\n'''$1''' ପୃଷ୍ଠା ପାଇଁ ଏବେକାର ସଜାଣି ଏଠାରେ ଦିଆଗଲା:",
        "protect-locked-access": "ଆପଣଙ୍କ ଖାତାରେ ପ୍ରତିରକ୍ଷା ସ୍ତରକୁ ବଦଳାଇବା ନିମନ୍ତେ ଅନୁମତି ନାହିଁ ।\n'''$1''' ପୃଷ୍ଠା ପାଇଁ ଏବେକାର ସଜାଣି ଏଠାରେ ଦିଆଗଲା:",
-       "protect-cascadeon": "ଏହି ପୃଷ୍ଠାଟି ଏବେ ପାଇଁ କିଳାଯାଇଛି {{PLURAL:$1|ପୃଷ୍ଠା, ଯେଉଁଥିରେ|ପୃଷ୍ଠମାନ, ଯେଉଁସବୁରେ}} କାସକେଡ଼କରା ସୁରକ୍ଷା ସଚଳ ଥିଲା ।\nଆପଣ ପୃଷ୍ଠାଟିର ପ୍ରତିରକ୍ଷା ସ୍ତର ବଦଳାଇ ପାରିବେ, କିନ୍ତୁ ଏହା କାସକେଡ଼ ପ୍ରତିରକ୍ଷାକୁ ପ୍ରଭାବିତ କରିନଥାଏ ।",
+       "protect-cascadeon": "ଏହି {{PLURAL:$1|ପୃଷ୍ଠାଟିରେ|ପୃଷ୍ଠାମାନଙ୍କରେ}} କ୍ୟାସକେଡ଼ କିଳିବା ସକ୍ରିୟ ହୋଇଥିବାରୁ ଏହି ପୃଷ୍ଠାଟି ଏବେ କିଳାଯାଇଛି ।\nଏହି ପୃଷ୍ଠାର କିଳାଯିବା ଅବସ୍ଥା ବଦଳିଲେ ଏହାର କ୍ୟାସକେଡ଼ କିଳିବା ବଦଳିବ ନାହିଁ ।",
        "protect-default": "ସବୁ ଇଉଜରଙ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ",
        "protect-fallback": "କେବଳ \"$1\" ଅନୁମତି ଥିବା ବ୍ୟବହାରକାରୀ ମାନଙ୍କୁ ଛାଡିବେ",
        "protect-level-autoconfirmed": "କେବଳ ଆପେ ଆପେ ସହମତ ହୋଇଥିବା ବ୍ୟବହାରକାରୀ ମାନଙ୍କୁ ଛାଡିବେ",
        "protect-othertime": "ବାକି ସମୟ:",
        "protect-othertime-op": "ବାକି ସମୟ",
        "protect-existing-expiry": "ମିଆଦ ପୁରିବା କାଳ: $3, $2",
+       "protect-existing-expiry-infinity": "ଏବେକାର ଅବଧି: ଅସୀମିତ କାଳ",
        "protect-otherreason": "ବାକି/ଅଧିକ କାରଣ:",
        "protect-otherreason-op": "ଅଲଗା କାରଣ",
        "protect-dropdown": "*ସାଧାରଣ ପ୍ରତିରକ୍ଷା କାରଣ\n** ଅତି ଅଧିକ ଅପବ୍ୟବହାର\n** ଅତି ଅଧିକ ଅଦରକାରୀ ଚିଜ ପୁରାଇବା\n** ନକାରାତ୍ମକ ସମ୍ପାଦନା ତାଗିଦା\n** ଅଧିକ ଦେଖାଯାଉଥିବା ପୃଷ୍ଠା",
        "contributions": "{{GENDER:$1|User}}ଙ୍କ ଅବଦାନ",
        "contributions-title": "$1 ପାଇଁ ବ୍ୟବହାରକାରୀଙ୍କ ଦାନ",
        "mycontris": "ଅବଦାନ",
-       "contribsub2": "$1 ($2) ପାଇଁ",
+       "contribsub2": "{{GENDER:$3|$1}} ପାଇଁ  ($2)",
        "contributions-userdoesnotexist": "ଇଉଜର ନାମ \"$1\" ତିଆରି କରାଯାଇ ନାହିଁ ।",
        "nocontribs": "ଏହି ନିର୍ଣ୍ଣାୟକବଳୀ ନିମନ୍ତେ କିଛି ବି ବଦଳ ମେଳ ଖାଇଲା ନାହିଁ ।",
        "uctop": "(ଏବେକାର)",
        "sp-contributions-search": "ଅବଦାନ ପାଇଁ ଖୋଜନ୍ତୁ",
        "sp-contributions-username": "ବ୍ୟବହାରକାରୀଙ୍କର IP ଠିକଣା ବା ଇଉଜର ନାମ:",
        "sp-contributions-toponly": "ନଗଦ ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
+       "sp-contributions-newonly": "କେବଳ ନୂଆ ପୃଷ୍ଠା ତିଆରିର ସମ୍ପାଦନା ଦେଖାନ୍ତୁ",
        "sp-contributions-submit": "ଖୋଜନ୍ତୁ",
        "whatlinkshere": "ଏଠାରେ ଥିବା ଲିଙ୍କ",
        "whatlinkshere-title": "\"$1\" କୁ ପୃଷ୍ଠା ଲିଙ୍କ",
        "autoblockid": "#$1ଙ୍କୁ ଆପେଆପେ ଅଟକାଇଦେବେ",
        "block": "ସଭ୍ୟଙ୍କୁ ଅଟକାଇବେ",
        "unblock": "ବାସନ୍ଦ ହୋଇଥିବା ସଭ୍ୟଙ୍କୁ ମୁକୁଳାଇବେ",
-       "blockip": "ସଭ୍ୟଙ୍କୁ ଅଟକାଇବେ",
+       "blockip": "{{GENDER:$1|ଜଣ ସଭ୍ୟଙ୍କୁ}} ଅଟକାନ୍ତୁ",
        "blockip-legend": "ସଭ୍ୟଙ୍କୁ ବାସନ୍ଦ କରିବେ",
        "blockiptext": "ଏକ ନିର୍ଦିଷ୍ଟ IP ଠିକଣା ବା ବ୍ୟବହାରକାରୀଙ୍କ ଲେଖିବା ସୁବିଧାକୁ ବାରାଁ କରିବା ନିମନ୍ତେ ଏହି ତଳ ଫର୍ମଟି ବ୍ୟବହାର କରନ୍ତୁ ।\nଏହା କେବଳ ଅପବ୍ୟବହାରକୁ ରୋକିବା ନିମନ୍ତେ କରାଯାଇଥାଏ, ଏହା [[{{MediaWiki:Policy-url}}|ନୀତି]] ଅନୁସାରେ କରାଯାଇଥାଏ ।\nଏହା ତଳେ ଏକ ନିର୍ଦିଷ୍ଟ କାରଣ ଦିଅନ୍ତୁ (ଯଥା, ଯେଉଁସବୁ ପୃଷ୍ଠାରେ କିଛି ପ୍ରକାରର ଅପବ୍ୟବହାର କରାଯାଇଛି) ।",
        "ipaddressorusername": "ବ୍ୟବହାରକାରୀଙ୍କର IP ଠିକଣା ବା ଇଉଜର ନାମ:",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] ଅଟକାଯାଯାଇଛି.<br />\nଅଟକ ବାବଦରେ ଟିପ୍ପଣୀ ଦେବା ନିମନ୍ତେ [[Special:BlockList|block list]] ଦେଖନ୍ତୁ ।",
        "ipb-blockingself": "ଆପଣ ନିଜକୁ ଅଟକାଇବାକୁ ଯାଉଛନ୍ତି ! ଆପଣ ପୁରାପୁରି ନିଶ୍ଚିତ ତ?",
        "ipb-confirmhideuser": "ଆପଣ \"ବ୍ୟବହାରକାରୀଙ୍କୁ ଲୁଚାନ୍ତୁ\" ସଚଳ କରି ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କୁ ଅଟକାଇବାକୁ ଯାଉଛନ୍ତି । ଏହା ବ୍ୟବହାରକାରୀଙ୍କ ନାମକୁ ସବୁଯାକ ତାଲିକାୟ ଇତିହାସରେ ଲୁଚାଇଦେବ । ତଥାପି ବି ଆପଣ ଏହା କରିବାକୁ ଚାହୁଁଛନ୍ତି କି?",
+       "ipb-confirmaction": "ଯଦି ଆପଣ ଏହା କରିବା ବାବଦରେ ପୂରା ନିଶ୍ଚିତ ତେବେ ଦୟାକରି ତଳେ {{PLURAL:$1|page, which has|pages, which have}} ଦେଖିନିଅନ୍ତୁ ।",
        "ipb-edit-dropdown": "ସମ୍ପାଦନା ଅଟକ କାରଣମାନ",
        "ipb-unblock-addr": "$1ଙ୍କୁ କିଳିବେ ନାହି",
        "ipb-unblock": "ଏକ ଇଉଜର ନାମ ବା IP ଠିକଣାକୁ ବାସନ୍ଦରୁ ମୁକୁଳାଇବେ",
        "ipb-blocklist": "ଏବେ ଥିବା ଅଟକମାନ ଦେଖାନ୍ତୁ",
-       "ipb-blocklist-contribs": "$1 ପାଇଁ ଅବଦାନ",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} ପାଇଁ ଅବଦାନ",
        "unblockip": "ବାସନ୍ଦ ହୋଇଥିବା ସଭ୍ୟଙ୍କୁ ମୁକୁଳାଇବେ",
        "unblockiptext": "ଆଗରୁ ବାସନ୍ଦ କରାଯାଇଥିବା ଇଉଜର ନାମ ବା IP ଠିକଣା ମୁକୁଳାଇବା ନିମନ୍ତେ ତଳେ ଥିବା ଫର୍ମ ବ୍ୟବହାର କରନ୍ତୁ ।",
        "ipusubmit": "ଏହି ବାସନ୍ଦଟିକୁ ଉଠାଇଦେବେ",
        "unblocked": "[[User:$1|$1]] ନାମକ ସଭ୍ୟଜଣକ ବାସନ୍ଦରୁ ମୁକୁଳିଗଲେ",
        "unblocked-range": "$1 ଅଟକରୁ ବାହାର କରିଦିଆଗଲା",
        "unblocked-id": "$1 ଅଟକଟି ହଟାଇଦିଆଗଲା",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]]ଙ୍କୁ ଅଟକରୁ ମୁକୁଳାଗଲା ।",
        "blocklist": "ବାସନ୍ଦ କରାଯାଇଥିବା ସଭ୍ୟ",
        "ipblocklist": "ଅଟକାଯାଇଥିବା ସଭ୍ୟସମୂହ",
        "ipblocklist-legend": "ଜଣେ ଅଟକାଯାଇଥିବା ସଭ୍ୟ ଖୋଜିବେ",
        "change-blocklink": "ଓଗଳାକୁ ବଦଳାଇବେ",
        "contribslink": "ଅବଦାନ",
        "emaillink": "ଇ-ମେଲ ପଠାଇବେ",
-       "autoblocker": "\"[[User:$1|$1]]\"à¬\99à­\8dà¬\95 à¬¦à­\87à¬\87 à¬\8fହି à¬®à¬¾à¬¤à­\8dର à¬\86ପଣà¬\99à­\8dà¬\95 IP à¬ à¬¿à¬\95ଣାà¬\9fି à¬\86ପà­\87à¬\86ପà­\87 à¬\85à¬\9fà¬\95ାଯାà¬\87à¬\85à¬\9bି à¥¤\n$1ର à¬\85à¬\9fà¬\95 à¬ªà¬¾à¬\87à¬\81 à¬¦à¬¿à¬\86ଯାà¬\87ଥିବା à¬\95ାରଣà¬\9fି à¬¹à­\87ଲା: \"$2\"",
+       "autoblocker": "\"[[User:$1|$1]]\"à¬\99à­\8dà¬\95 à¬¦à­\87à¬\87 à¬¬à­\8dà­\9fବହାର à¬¹à­\87à¬\89ଥିବାରà­\81 à¬\86ପଣà¬\99à­\8dà¬\95 IP à¬ à¬¿à¬\95ଣାà¬\9fି à¬\86ପà­\87à¬\86ପà­\87 à¬\85à¬\9fà¬\95ାଯାà¬\87à¬\85à¬\9bି à¥¤\n$1ର à¬\95ାରଣ à¬¹à­\87ଲା \"$2\"",
        "blocklogpage": "ଲଗଟିକୁ ଅଟକାଇଦେବେ",
        "blocklog-showlog": "ଏହି ସଭ୍ୟଜଣଙ୍କୁକ ଆଗରୁ ଅଟକାଯାଇଛି ।\nତଳେ ଅଟକ ଇତିହାସଟି ଅବଗତି ନିମନ୍ତେ ଦିଆଗଲା:",
        "blocklog-showsuppresslog": "ଏହି ସଭ୍ୟଜଣଙ୍କୁ ଆଗରୁ ଅଟକାଯାଇଛି ବା ଲୁଚାଯାଇଛି ।\nତଳେ ଲୁଚାଇବା ଇତିହାସ ଅବଗତି ନିମନ୍ତେ ଦିଆଗଲା:",
        "range_block_disabled": "ଏକାଧିକ ଅଟକ ପାଇଁ ପରିଛା ସୁବିଧାଟି ଅଚଳ କରାଯାଇଛି ।",
        "ipb_expiry_invalid": "ଅଚଳ ହେବାର ବେଳା ଭୁଲ ।",
        "ipb_expiry_temp": "ଲୁଚାଯାଇଥିବା ବ୍ୟବହାରକାରୀ ନାମ ଅଟକ ସବୁ ସ୍ଥାୟୀ ହେବ ଉଚିତ ।",
-       "ipb_hide_invalid": "ଏହି ଖାତାଟିକୁ ଦବାଇବାରେ ବିଫଳ ହେଲୁ; ଏଥିରେ ଅନେକଗୁଡ଼ିଏ ସମ୍ପାଦନା ଥାଇପାରେ ।",
+       "ipb_hide_invalid": "ଏହି ଖାତାଟିକୁ ଦବାଇବାରେ ବିଫଳ ହେଲୁ; ଏଥିରେ {{PLURAL:$1|ଗୋଟେ ସମ୍ପାଦନା|$1ଟି ସମ୍ପାଦନା}}  ରହିଛି ।",
        "ipb_already_blocked": "\"$1\" ଆଗରୁ ଅଟକାଯାଇଅଛି",
        "ipb-needreblock": "\"$1\" ଆଗରୁ ଅଟକାଯାଇଅଛି । ଆପଣ ସଜାଣିସବୁ ବଦଳାଇବାକୁ ଚାହାନ୍ତି କି?",
        "ipb-otherblocks-header": "ବାକି {{PLURAL:$1|ଗୋଟି ଅଟକ|ଗୋଟି ଅଟକ}}",
        "proxyblockreason": "ଏକ ଖୋଲା ପ୍ରକ୍ସି ହୋଇଥିବାରୁ ଆପଣଙ୍କ IP ଠିକଣାଟିକୁ ଅଟକାଇଦିଆଗଲା ।\nଦୟାକରି ଆପଣଙ୍କ ଇଣ୍ଟରନେଟ ସେବାପ୍ରଦାନକାରୀ, କାରିଗରି ସହଯୋଗ କିମ୍ବା ସଙ୍ଗଠନ ସହିତ କଥା ହୋଇ ଏହି ବିରାଟ ଅସୁବିଧା ବାବଦରେ ବତାଇଦିଅନ୍ତୁ ।",
        "sorbsreason": "{{SITENAME}} ଦେଇ ଆପଣଙ୍କ IP ଠିକଣାଟି DNSBL ଭିତରେ ଏକ ଖୋଲା ପ୍ରକ୍ସି ଭାବରେ ନଥିଭୁକ୍ତ ହୋଇଅଛି ।",
        "sorbs_create_account_reason": "{{SITENAME}} ଦେଇ ଆପଣଙ୍କ IP ଠିକଣାଟି DNSBL ଭିତରେ ଏକ ଖୋଲା ପ୍ରକ୍ସି ଭାବରେ ନଥିଭୁକ୍ତ ହୋଇଅଛି ।\nଆପଣ ନୂଆ ଖାତାଟିଏ ଖୋଲି ପାରିବେ ନାହିଁ",
+       "xffblockreason": "ଆପଣଙ୍କର କିମ୍ବା ଆପଣ ବ୍ୟବହାର କରୁଥିବା ପ୍ରକ୍ସି ସର୍ଭରର X-Forwarded-For ହେଡ଼ରରେ ଥିବାଏକ IP ଠିକଣାକୁ ଅଟକାଯାଇଛି । ଅଟକାଇବାର କାରଣ ହେଲା: $1",
        "cant-see-hidden-user": "ଆପଣ ଅଟକାଇବାକୁ ଚାହୁଁଥିବା ସଭ୍ୟଜଣକ ଆଗରୁ ଅଟକାଯାଇଛନ୍ତି ଓ ଲୁଚାଯାଇଛନ୍ତି ।\nଯେହେତୁ ଆପଣଙ୍କ ପାଖରେ ସଭ୍ୟଙ୍କୁ ଲୁଚାଇବା ଅଧିକାର ନାହୀଁ, ଆପଣ ସଭ୍ୟଙ୍କର ଅଟକକୁ ଦେଖିପାରିବେ ବା ବଦଳାଇପାରିବେ ନାହିଁ ।",
        "ipbblocked": "ଯେହେତୁ ଆପଣଙ୍କୁ ଅଟକାଯାଇଛି ଆପଣ ବାକି ସଭ୍ୟମାନଙ୍କୁ ଅଟକାଇ ବା ଅଟକରୁ ଛାଡ଼ କରିପାରିବେ ନାହିଁ ।",
        "ipbnounblockself": "ଆପଣ ନିଜକୁ ଅଟକାଇପାରିବେ ନାହିଁ",
        "movepagetalktext": "ଯଦି:\n*ଗୋଟିଏ ଖାଲି ଆଲୋଚନା ପୃଷ୍ଠା ସେହି ନାଆଁରେ ଥାଏ\n*ଆପଣ ତଳ ବାକ୍ସକୁ ନ ବାଛନ୍ତି\nତେବେ ଏହି ପ୍ରୁଷ୍ଠା ସହ ଯୋଡାଯାଇଥିବା ଆଲୋଚନା ପ୍ରୁଷ୍ଠାକୁ ଆପେ ଆପେ ଘୁଞ୍ଚାଇଦିଆଯିବ ।\nସେହି ଯାଗାରେ, ଆପଣଙ୍କୁ ପ୍ରୁଷ୍ଠାଟିକୁ ଘୁଞ୍ଚାଇବାକୁ/ମିଶାଇବାକୁ ପଡ଼ିବ ।",
        "movearticle": "ପୃଷ୍ଠା ଘୁଞ୍ଚେଇବା:",
        "moveuserpage-warning": "'''ସୂଚନା:''' ଆପଣ ଏକ ବ୍ୟବହାରକାରୀ ପୃଷ୍ଠାକୁ ଘୁଞ୍ଚାଇବାକୁ ଯାଉଛନ୍ତି । ଦୟାକରି ଜାଣିରଖନ୍ତୁ ଯେ ପୃଷ୍ଠାଟି କେବଳ ଘୁଞ୍ଚିଯିବ ଓ ବ୍ୟବହାରକାରୀ ''ଘୁଞ୍ଚିବେ ନାହିଁ'' ।",
+       "movecategorypage-warning": "<strong>ଚେତାବନୀ:</strong> ଆପଣ ଏକ ଶ୍ରେଣୀ ପୃଷ୍ଠାକୁ ଘୁଞ୍ଚାଇବାକୁ ଯାଉଛନ୍ତି । କେବଳ ପୃଷ୍ଠାଟି ଘୁଞ୍ଚିଯିବ ଏବଂ ପୁରୁଣା ଶ୍ରେଣୀର କୌଣସି ପୃଷ୍ଠା ନୂଆ ଶ୍ରେଣୀଭୁକ୍ତ ହେବନାହିଁ <em>ଜାଣିରଖନ୍ତୁ</em> ।",
        "movenologintext": "ଏହି ପୃଷ୍ଠାଟିକୁ ଘୁଞ୍ଚାଇବା ପାଇଁ ଆପଣ ନିହାତି ଜଣେ ପଞ୍ଜୀକୃତ ସଭ୍ୟ ହୋଇଥିବେ ଏବଂ [[Special:UserLogin|logged in]]",
        "movenotallowed": "ଆପଣଙ୍କର ପୃଷ୍ଠାଗୁଡିକୁ ଘୁଞ୍ଚାଇବା ଅଧିକାର ନହିଁ ।",
        "movenotallowedfile": "ଆପଣଙ୍କର ଫାଇଲ ଘୁଞ୍ଚାଇବାର ଅଧିକାର ନହିଁ ।",
        "cant-move-user-page": "ଆପଣଙ୍କୁ ଏହି ସଭ୍ୟ ପୃଷ୍ଠାଟିକୁ ଘୁଞ୍ଚାଇବା ଲାଗି ଅନୁମତି ମିଳିନାହିଁ, କିନ୍ତୁ ନିଜର ଉପପୃଷ୍ଠା ସବୁ ଘୁଞ୍ଚାଇ ପାରିବେ ।",
        "cant-move-to-user-page": "ଆପଣଙ୍କର ଗୋଟିଏ ପୃଷ୍ଠାକୁ ବ୍ୟବହାରକାରୀ ପୃଷ୍ଠାକୁ ଘୁଞ୍ଚାଇବାର ଅଧିକାର ନହିଁ ।",
+       "cant-move-category-page": "ଆପଣଙ୍କୁ ଶ୍ରେଣୀ ପୃଷ୍ଠାଟିଏ ଘୁଞ୍ଚାଇବା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ ।",
+       "cant-move-to-category-page": "ପୃଷ୍ଠାଟିଏକୁ ଶ୍ରେଣୀ ପୃଷ୍ଠାକୁ ଘୁଞ୍ଚାଇବା ଲାଗି ଆପଣଙ୍କୁ ଅନୁମତି ମିଳିନାହିଁ ।",
        "newtitle": "ନୂଆ ନାଆଁକୁ:",
        "move-watch": "ମୂଳ ପୃଷ୍ଠା ଓ ବଦଳାଇବାକୁ ଚାହୁଁଥିବା ପୃଷ୍ଠା ଦେଖାଇବେ",
        "movepagebtn": "ପୃଷ୍ଠା ଘୁଞ୍ଚେଇବେ",
        "thumbnail-more": "ବିସ୍ତାର",
        "filemissing": "ଫାଇଲ ମିଳୁନାହିଁ",
        "thumbnail_error": "ନଖଦେଖଣା ତିଆରିବାରେ ଅସୁବିଧା: $1",
+       "thumbnail_error_remote": "$1ରୁ ତ୍ରୁଟି ମେସେଜ:\n$2",
        "djvu_page_error": "DjVu ପୃଷ୍ଠା ସୀମା ବାହାରେ ରହିଅଛି",
        "djvu_no_xml": "DjVu ଫାଇଲ ନିମନ୍ତେ XML ଆଣିବାରେ ବିଫଳ ହେଲୁଁ",
        "thumbnail-temp-create": "ଏକ ଅସ୍ଥାୟୀ ଛୋଟଦେଖଣା ଫାଇଲ ତିଆରି କରିବାରେ ବିଫଳ ହେଲୁ",
        "thumbnail_image-type": "ଛବିର ପ୍ରକାର ଅନୁମୋଦିତ ନୁହେଁ",
        "thumbnail_gd-library": "ଅଧାଗଢ଼ା GD ପାଠାଗାର ସଜାଣି: $1 ମିଳୁନାହିଁ",
        "thumbnail_image-missing": "ଫାଇଲଟି ନଥିଲା ଭଳି ଲାଗୁଛି : $1",
+       "thumbnail_image-failure-limit": "ଏହି ଥମ୍ବନେଲ ରେଣ୍ଡର କରିବା ପାଇଁ ନିକଟରେ ଅନେକ ($1 କିମ୍ବା ଅଧିକ) ବିଫଳ ଚେଷ୍ଟା କରାଯାଇଛି । ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।",
        "import": "ପୃଷ୍ଠା ଆମଦାନି କରିବେ",
        "importinterwiki": "ଟ୍ରାନ୍ସଉଇକି ଈମ୍ପୋର୍ଟ",
        "import-interwiki-text": "ଏକ ଉଇକି ଓ ପୃଷ୍ଠା ନାମ ଆମଦାନି କରିବା ନିମନ୍ତେ ଦିଅନ୍ତୁ ।\nସଂସ୍କରଣ ତାରିଖ ଓ ସମ୍ପାଦକଙ୍କ ନାମ ସାଇତା ହୋଇ ରହିବ ।\nଅନ୍ତଉଇକି ଆମଦାନି କାମସବୁ [[Special:Log/import|ଆମଦାନି ଇତିହାସ]]ରେ ସାଇଟ ହୋଇ ରହିଛି ।",
-       "import-interwiki-source": "ମୂଳ ଉଇକି/ପୃଷ୍ଠା",
+       "import-interwiki-sourcewiki": "ମୂଳ ଉଇକି:",
+       "import-interwiki-sourcepage": "ମୂଳ ପୃଷ୍ଠା:",
        "import-interwiki-history": "ଏହି ପୃଷ୍ଠା ନିମନ୍ତେ ସବୁଯାକ ସଂସ୍କରଣ ଇତିହାସ ନକଲ କରିନିଅନ୍ତୁ",
        "import-interwiki-templates": "ସବୁଯାକ ଛାଞ୍ଚ ଏହା ଭିତରେ ରଖିବେ",
        "import-interwiki-submit": "ଆମଦାନୀ",
        "importuploaderrortemp": "ଫାଇଲ ଆମଦାନି ବିଫଳ ହେଲା ।\nଅସ୍ଥାୟୀ ଫୋଲଡରଟିଏ ନାହିଁ ।",
        "import-parse-failure": "XML ଆମଦାନି ପାର୍ସ ବିଫଳ",
        "import-noarticle": "ଆମଦାନି କରିବା ନିମନ୍ତେ ପୃଷ୍ଠା ନାହିଁ !",
-       "import-nonewrevisions": "ସବà­\81ଯାà¬\95 à¬¸à¬\82ସà­\8dà¬\95ରଣ à¬\86à¬\97ରà­\81 à¬\86ମଦାନି à¬\95ରାସରିà¬\9bି à¥¤",
+       "import-nonewrevisions": "à¬\97à­\8bà¬\9fାà¬\8f à¬¬à¬¿ à¬¸à¬\82ସà­\8dà¬\95ରଣ à¬\86ମଦାନି à¬\95ରା à¬¹à­\8bà¬\87ନାହିà¬\81 à¥¤ (ସବà­\81ଯାà¬\95 à¬\86à¬\97ରà­\81 à¬\85à¬\9bି, à¬\95ିମà­\8dବା à¬­à­\81ଲà¬\95à­\81 à¬\8fଡ଼ାà¬\87ବା à¬ªà¬¾à¬\87à¬\81 à¬¨à¬¿à¬\86ଯାà¬\87ନାହିà¬\81 à¥¤)",
        "xml-error-string": "$1 $2 ଧାଡ଼ିରେ ଅଛି, $3 ସ୍ତମ୍ଭ ($4 ବାଇଟ): $5",
        "import-upload": "XML ତଥ୍ୟ ଅପଲୋଡ଼",
        "import-token-mismatch": "ଅବଧି ତଥ୍ୟ ଲୋପପାଇଗଲାଣି ।\nଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।",
        "import-invalid-interwiki": "ଦିଆଯାଇଥିବା ଉଇକିରୁ ଆହରଣ କରାଯାଇପାରିବ ନାହିଁ ।",
-       "import-error-edit": "\"$1\" ପୃଷ୍ଠାଟି ଅଣାଯାଇନାହିଁ କାରଣ ଆପଣଙ୍କର ଏହାକୁ ବଦଳାଇବା ଅଧିକାର ନାହିଁ ।",
-       "import-error-create": "\"$1\" ପୃଷ୍ଠାଟି ଅଣାଯାଇନାହିଁ କାରଣ ଆପଣଙ୍କର ଏହାକୁ ତିଆରିକରିବା ଅଧିକାର ନାହିଁ ।",
-       "import-error-interwiki": "\"$1\"ପୃଷ୍ଠାକୁ ଆମଦାନୀ କରିହେଲାନି କାରଣ ଏହାର ନାମ ବାହାରଲିଙ୍କରେ ଆଗରୁ ଅଛି(ଉଇକିଗୁଡିକ ମଧ୍ୟରେ) ।",
-       "import-error-special": "\"$1\"ପୃଷ୍ଠାକୁ ଆମଦାନୀ କରିହେଲାନି କାରଣ ଏହା ଏକ ବିଶେଷ ନେମସ୍ପେସରେ ଅଛି ଯାହା ପୃଷ୍ଠାଗୁଡିକୁ ଅନୁମତି ଦିଏ ନାହିଁ ।",
-       "import-error-invalid": "\"$1\"ପୃଷ୍ଠାକୁ ଆମଦାନୀ କରିହେଲାନି କାରଣ ଏହାର ନାମଟି ଅବୈଧ ।",
+       "import-error-edit": "ଆପଣଙ୍କର ଏହାକୁ ବଦଳାଇବା ଅଧିକାର ନ ଥିବାରୁ \"$1\" ପୃଷ୍ଠାଟି ଆଣିହେଲା ନାହିଁ ।",
+       "import-error-create": "ଆପଣଙ୍କର ଏହାକୁ ଗଢ଼ିବା ଅଧିକାର ନ ଥିବାରୁ \"$1\" ପୃଷ୍ଠାଟି ଅଣାଯାଇନାହିଁ ।",
+       "import-error-interwiki": "ଏହାର ନାମ ବାହାର ଲିଙ୍କ ପାଇଁ ସାଇତାଯାଇ ଥିବାରୁ \"$1\"ପୃଷ୍ଠାଟିକୁ ଆଣିହେଲା ନାହିଁ (ଇଣ୍ଟର ଉଇକି)",
+       "import-error-special": "ଅନୁମତି ନ ଥିବା ଏକ ବିଶେଷ ନେମସ୍ପେସରେ ଥିବାରୁ \"$1\"ପୃଷ୍ଠାକୁ ଆଣି ହେଲାନାହିଁ ।",
+       "import-error-invalid": "ଏହି ଉଇକିରେ ଅଣାଯିବା ନୂଆ ନାମଟି ଅବୈଧ ଥିବାରୁ \"$1\" ପୃଷ୍ଠାଟିକୁ ଆଣିହେଲା ନାହିଁ ।",
        "import-error-unserialize": "\"$1\"ପୃଷ୍ଠାର $2 ପୁନରାବୃତିଟି ଅଣତାଲିକାଭୁକ୍ତ କରାଯାଇପାରିବ ନାହିଁ । ପୁନରାବୃତିଟି $3 ପ୍ରକାର ବ୍ୟବାହର କରିବା ପାଇଁ $4ରେ ତାଲିକାଭୁକ୍ତ ହୋଇଛି ।",
+       "import-error-bad-location": "ଏହି ମଡ଼େଲଟି ପୃଷ୍ଠାରେ $3 କଣ୍ଟେଣ୍ଟ ମଡ଼େଲ ବ୍ୟବହାର କରି $2 ସଂସ୍କରଣଟି ଏହି ଉଇକିରେ ସାଇତାଯାଇପାରିବ ନାହିଁ ।",
        "import-options-wrong": "ଭୁଲ {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "ଦିଆଯାଇଥିବା ମୂଳ ପୃଷ୍ଠାର ଶୀର୍ଷକଟି ଅବୈଧ ଅଟେ ।",
        "import-rootpage-nosubpage": "ମୂଳ ପୃଷ୍ଠାର \"$1\" ନେମସ୍ପେସ ଉପପୃଷ୍ଠାର ଅନୁମତି ଦିଏନାହିଁ ।",
        "importlogpage": "ଇତିହାସ ଆହରଣ",
        "importlogpagetext": "ଅନ୍ୟ ଉଇକିରୁ ପରିଛାଙ୍କ ଦେଇ ସମ୍ପାଦନା ଇତିହାସ ସହ କରାହୋଇଥିବା ପୃଷ୍ଠା ଆମଦାନି ।",
        "import-logentry-upload": "ଫାଇଲ ଅପଲୋଡ଼ ଦେଇ [[$1]] ଆମଦାନି କରାଯାଇଛି",
-       "import-logentry-upload-detail": "$1 ଗୋଟି {{PLURAL:$1|ସଂସ୍କରଣ|ସଂସ୍କରଣ}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|ଗୋଟି ସଂସ୍କରଣ|ଗୋଟି ସଂସ୍କରଣ}} ଅଣାଗଲା",
        "import-logentry-interwiki": "$1 କୁ ଟ୍ରାନ୍ସଉଇକି କରାଗଲା",
-       "import-logentry-interwiki-detail": "$2 ଭିତରୁ $1 ଗୋଟି {{PLURAL:$1|ସଂସ୍କରଣ|ସଂସ୍କରଣ}}",
+       "import-logentry-interwiki-detail": "$2ରୁ $1 {{PLURAL:$1|ଗୋଟି ସଂସ୍କରଣ|ଗୋଟି ସଂସ୍କରଣ}} ଅଣାଗଲା",
        "javascripttest": "ଜାଭାସ୍କ୍ରିପ୍ଟ ପରଖ",
        "javascripttest-title": "ଚାଲୁଥିବା $1 ପରଖଗୁଡିକ",
        "javascripttest-pagetext-noframework": "ଏହି ପୃଷ୍ଠାଟି ଜାଭାସ୍କ୍ରିପ୍ଟ ପରଖ ପାଇଁ ସଂରକ୍ଷଣ କରି ରଖାଯାଇଛି ।",
        "spam_reverting": "$1 ସହ ଯୋଡ଼ା ନଥିବା ଶେଷ ସଂସ୍କରଣକୁ ଲେଉଟାଇ ଦେଉଅଛୁଁ",
        "spam_blanking": "$1 ସହ ଯୋଡ଼ାଥିବା ସବୁଯାକ ସଂସ୍କରଣ ଖାଲି କରିଦିଆଗଲା",
        "spam_deleting": "$1 ସହ ଯୋଡ଼ାଥିବା ସବୁଯାକ ସଂସ୍କରଣ ଖାଲି କରିଦିଆଗଲା",
-       "simpleantispam-label": "ସà­\8dପାମ-ବିରà­\8bଧି à¬ªà¬°à¬\96 à¥¤\nà¬\8fହାà¬\95à­\81 à¬­à¬°à¬¨à­\8dତà­\81 '''ନାହିà¬\81''' !",
+       "simpleantispam-label": "à¬\86ଣà­\8dà¬\9fି-ସà­\8dପାମ à¬ªà¬°à¬\96 à¥¤\nà¬\8fହାà¬\95à­\81 à¬­à¬°à¬¨à­\8dତà­\81 <strong>ନାହିà¬\81</strong>!",
        "pageinfo-title": "\"$1\"ର ବିବରଣୀ",
        "pageinfo-not-current": "ଦୁଖିତଃ, ପୁରୁଣା ସଂସ୍କରଣଗୁଡିକର ଏହି ତଥ୍ୟ ଦେବା ସମ୍ଭବ ନୁହେଁ ।",
        "pageinfo-header-basic": "ସାଧାରଣ ଜାଣିବା କଥା",
        "pageinfo-length": "ପୃଷ୍ଠା ଲମ୍ବ(ବାଇଟରେ)",
        "pageinfo-article-id": "ପୃଷ୍ଠା ଆଇଡ଼ି",
        "pageinfo-language": "ପୃଷ୍ଠା ବିଷୟବସ୍ତୁର ଭାଷା",
-       "pageinfo-robot-policy": "ସ୍ୱୟଂଚାଳକ (bot) ଦ୍ୱାରା ସୂଚୀ ନିର୍ମିତ",
+       "pageinfo-content-model": "ପୃଷ୍ଠା ବିଷୟବସ୍ତୁ ମଡ଼େଲ",
+       "pageinfo-robot-policy": "ସ୍ୱୟଂଚାଳକ&nbsp;(Bot) ଦ୍ୱାରା ସୂଚୀ ନିର୍ମାଣ",
        "pageinfo-robot-index": "ଅନୁମୋଦିତ",
        "pageinfo-robot-noindex": "ଅନୁନମୋଦିତ",
        "pageinfo-views": "ଦେଖଣା ସଂଖ୍ୟା",
        "newimages-summary": "ଏହି ବିଶେଷ ପୃଷ୍ଠାଟି ଶେଷ ଅପଲୋଡ଼ ହୋଇଥିବା ଫାଇଲମାନ ଦେଖାଇଥାଏ ।",
        "newimages-legend": "ଛାଣିବା",
        "newimages-label": "ଫାଇଲ ନାମ (କିମ୍ବା ତାହାର ଏକ ଭାଗ):",
+       "newimages-showbots": "ବଟ ଦ୍ୱାରା ଅପଡେଟ",
        "noimages": "ଦେଖିବାକୁ କିଛି ନାହିଁ ।",
        "ilsubmit": "ଖୋଜନ୍ତୁ",
        "bydate": "ତାରିଖ ଅନୁସାରେ",
        "minutes": "{{PLURAL:$1|$1 ମିନିଟ|$1 ମିନିଟ}}",
        "hours": "{{PLURAL:$1|$1 ଘଣ୍ଟା|$1 ଘଣ୍ଟା}}",
        "days": "{{PLURAL:$1|$1 ଦିନ|$1 ଦିନ}}",
+       "weeks": "{{PLURAL:$1|$1 ସପ୍ତାହ|$1 ସପ୍ତାହ}}",
        "months": "{{PLURAL:$1|$1 month|$1 months}}",
        "years": "{{PLURAL:$1|$1 year|$1 years}}",
        "ago": "$1 ଆଗରୁ",
        "exif-urgency-low": "ଉଣା ($1)",
        "exif-urgency-high": "ଅଧିକ ($1)",
        "exif-urgency-other": "ବ୍ୟବହାରକାରୀ ଦେଇ ଦିଆହୋଇଥିବା ଗୁରୁତ୍ଵ ($1)",
-       "watchlistall2": "ସବୁ",
        "namespacesall": "ସବୁ",
        "monthsall": "ସବୁ",
        "confirmemail": "ଆପଣଙ୍କ ଇମେଲ ଠିକଣା ଟି ଠିକ ବୋଲି ଥୟ କରନ୍ତୁ",
        "confirmemail_subject": "{{SITENAME}} ଇମେଲ ଠିକଣା ନିଶ୍ଚିତ କରିବା",
        "confirmemail_body": "କେହିଜଣେ, ବୋଧହୁଏ ଆପଣ ହିଁ $1 ଆଇ.ପି. ଠିକଣାରୁ,\nଏହି ଇ-ମେଲ ଆଇ.ଡି.ରେ \"$2\" ନାଆଁରେ {{SITENAME}} ଠାରେ ଖାତାଟିଏ ଖୋଲିଛନ୍ତି ।\n\nଏହି ଖାତାଟି ସତରେ ଆପଣଙ୍କର ବୋଲି ଥୟ କରିବା ପାଇଁ ଓ {{SITENAME}}ରେ ଇ-ମେଲ ସୁବିଧାସବୁ ସଚଳ କରିବାପାଇଁ, ଏହି ଲିଙ୍କ୍ଟିକୁ ଆପଣଙ୍କ ବ୍ରାଉଜରରେ ଖୋଲନ୍ତୁ:\n\n$3\n\nଯଦି ଆପଣ ଖାତାଟିଏ ଆଗରୁ ଖୋଲି *ନାହାନ୍ତି* ତେବେ ଏହି ଲିଙ୍କକୁ ଯାଇ ଇ-ମେଲ ଆ.ଡି. ଥୟ କରିବାକୁ ନାକଚ କରିଦିଅନ୍ତୁ:\n\n$5\n\nଏହି କନଫର୍ମେସନ କୋଡ଼ $4 ବେଳେ ଅଚଳ ହୋଇଯିବ ।",
        "confirmemail_body_changed": "କେହିଜଣେ, ବୋଧହୁଏ ଆପଣ ହିଁ $1 ଆଇ.ପି. ଠିକଣାରୁ,\nଏହି ଇ-ମେଲ ଆଇ.ଡି.ରେ \"$2\" ନାଆଁରେ {{SITENAME}} ଠାରେ ଖାତାଟିଏ ଖୋଲିଛନ୍ତି ।\n\nଏହି ଖାତାଟି ସତରେ ଆପଣଙ୍କର ବୋଲି ଥୟ କରିବା ପାଇଁ ଓ {{SITENAME}}ରେ ଇ-ମେଲ ସୁବିଧାସବୁ ସଚଳ କରିବାପାଇଁ, ଏହି ଲିଙ୍କ୍ଟିକୁ ଆପଣଙ୍କ ବ୍ରାଉଜରରେ ଖୋଲନ୍ତୁ:\n\n$3\n\nଯଦି ଆପଣ ଖାତାଟିଏ ଆଗରୁ ଖୋଲି *ନାହାନ୍ତି* ତେବେ ଏହି ଲିଙ୍କକୁ ଯାଇ ଇ-ମେଲ ଆ.ଡି. ଥୟ କରିବାକୁ ନାକଚ କରିଦିଅନ୍ତୁ:\n\n$5\n\nଏହି କନଫର୍ମେସନ କୋଡ଼ $4 ବେଳେ ଅଚଳ ହୋଇଯିବ ।",
-       "confirmemail_body_set": "କେହିଜଣେ, ବୋଧହୁଏ ଆପଣ ହିଁ $1 ଆଇ.ପି. ଠିକଣାରୁ,\nଏହି ଇ-ମେଲ ଆଇ.ଡି.ରେ \"$2\" ନାଆଁରେ {{SITENAME}} ଠାରେ ଖାତାଟିଏ ଖୋଲିଛନ୍ତି ।\n\nଏହି ଖାତାଟି ସତରେ ଆପଣଙ୍କର ବୋଲି ଥୟ କରିବା ପାଇଁ ଓ {{SITENAME}}ରେ ଇ-ମେଲ ସୁବିଧାସବୁ ସଚଳ କରିବାପାଇଁ, ଏହି ଲିଙ୍କ୍ଟିକୁ ଆପଣଙ୍କ ବ୍ରାଉଜରରେ ଖୋଲନ୍ତୁ:\n\n$3\n\nଯଦି ଆପଣ ଖାତାଟିଏ ଆଗରୁ ଖୋଲି *ନାହାନ୍ତି* ତେବେ ଏହି ଲିଙ୍କକୁ ଯାଇ ଇ-ମେଲ ଆ.ଡି. ଥୟ କରିବାକୁ ନାକଚ କରିଦିଅନ୍ତୁ:\n\n$5\n\nଏହି କନଫର୍ମେସନ କୋଡ଼ $4 ବେଳେ ଅଚଳ ହୋଇଯିବ ।",
+       "confirmemail_body_set": "କେହିଜଣେ, ବୋଧହୁଏ ଆପଣ ହିଁ $1 IP ଠିକଣାରୁ,\n\"$2\" ଖାତା ପାଇଁ {{SITENAME}}ରେ ଇମେଲ ଦେଇଛନ୍ତି ।\n\nଏହି ଖାତାଟି ଆପଣଙ୍କର ବୋଲି ଥୟ କରି {{SITENAME}}ରେ ଇମେଲ ସୁବିଧାସବୁ ସକ୍ରିୟ କରିବାପାଇଁ, ଏହି ଲିଙ୍କଟି ଆପଣଙ୍କ ବ୍ରାଉଜରରେ ଖୋଲନ୍ତୁ:\n\n$3\n\nଯଦି ଖାତାଟିଏ ଆପଣଙ୍କର ନୁହେଁ ତେବେ ଏହି ଲିଙ୍କକୁ ଯାଇ ଇମେଲ ଥୟ କରିବା ନାକଚ କରିଦିଅନ୍ତୁ:\n\n$5\n\nକନଫର୍ମେସନ କୋଡ଼ଟି $4ରେ ଅକାମୀ ହୋଇଯିବ ।",
        "confirmemail_invalidated": "ଇମେଲ ଠିକଣା ଥୟ କରିବା ନାକଚ କରିଦଗଲା",
        "invalidateemail": "ଇ-ମେଲ ଠିକଣା ଥୟ କରିବା",
        "scarytranscludedisabled": "[ଉଇକି-ଉଇକି ଭିତରେ ଟ୍ରାନ୍ସକ୍ଲୁଡ଼ିଙ୍ଗ ଅଚଳ କରାଯାଇଛି]",
        "confirm-watch-top": "ଏହି ପୃଷ୍ଠାଟିକୁ ଆପଣଙ୍କ ଦେଖିଥିବା ତାଲିକାରେ ଯୋଡନ୍ତୁ ?",
        "confirm-unwatch-button": "ଠିକ ଅଛି",
        "confirm-unwatch-top": "ନିଜ ଦେଖଣାତାଲିକାରୁ ଏହି ପୃଷ୍ଠାଟି ବାହାର କରିଦେବେ କି?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "ଆଗ ପୃଷ୍ଠା",
        "imgmultipagenext": "ପର ପୃଷ୍ଠା →",
        "imgmultigo": "ଯିବା!",
        "imgmultigoto": "$1 ପୃଷ୍ଠାକୁ ଯିବେ",
        "img-lang-default": "(ଡିଫଲ୍ଟ ଭାଷା)",
+       "img-lang-info": "$1ରେ ଏହି ଛବିଟି ରେଣ୍ଡର କରନ୍ତୁ । $2",
+       "img-lang-go": "ଯାଆନ୍ତୁ",
        "ascending_abbrev": "ସାନରୁ ବଡ କ୍ରମରେ",
        "descending_abbrev": "ବଖାଣ",
        "table_pager_next": "ପର ପୃଷ୍ଠା",
        "autosumm-replace": "ବିଷୟବସ୍ତୁକୁ \"$1\" ଦେଇ ପ୍ରତିବଦଳ କଲେ",
        "autoredircomment": "[[$1]]କୁ ପୃଷ୍ଠାଟି ଘୁଞ୍ଚାଇଦିଆଗଲା",
        "autosumm-new": "\"$1\" ନାଆଁରେ ପୃଷ୍ଠାଟିଏ ତିଆରିକଲେ",
+       "autosumm-newblank": "ଫାଙ୍କା ପୃଷ୍ଠାଟିଏ ତିଆରି କରାଗଲା",
        "lag-warn-normal": "$1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}}ରୁ ନୂଆ ବଦଳ ଏହି ତାଲିକାରେ ଦେଖାଯାଉ ନାହିଁ ।",
        "lag-warn-high": "ଅଧିକ ଡାଟାବେସ ସର୍ଭର ପଛୁଆ ଅବସ୍ଥା ହେତୁ $1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}}ରୁ ନୂଆ ବଦଳସବୁ ଏହି ତାଲିକାରେ ଦେଖାଯିବ ନାହିଁ ।",
        "watchlistedit-normal-title": "ଦେଖଣାତାଲିକା ସମ୍ପାଦନା କରିବେ",
        "watchlistedit-raw-done": "ଆପଣଙ୍କ ଦେଖଣା ତାଲିକାଟି ଅପଡେଟ ହେଇଯାଇଛି ।",
        "watchlistedit-raw-added": "{{PLURAL:$1|ନାମଟିଏ|$1 ଗୋଟି ନାମ}} ଯୋଗ କରାଗଲା:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|ନାମଟିଏ|$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 ନାମଟି|$1 ନାମସବୁ}} ହଟାଇ ଦିଆଗଲା:",
+       "watchlistedit-too-many": "ଏଠାରେ ଦେଖାଇବା ପାଇଁ ଅନେକ ଗୁଡ଼ିଏ ପୃଷ୍ଠା ରହିଛି ।",
+       "watchlisttools-clear": "ଦେଖଣାତାଲିକା ସଫାକରନ୍ତୁ",
        "watchlisttools-view": "ଦରକାରୀ ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
        "watchlisttools-edit": "ଦେଖିବା ତାଲିକାଟିକୁ ଦେଖିବେ ଓ ବଦଳାଇବେ",
        "watchlisttools-raw": "ଫାଙ୍କା ଦେଖଣା ତାଲିକାଟିର ସମ୍ପାଦନା କରିବେ",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ମୋ ଆଲୋଚନା]])",
        "unknown_extension_tag": "ଅଜଣା ଏକ୍ସଟେନସନ ଚିହ୍ନ \"$1\"",
        "duplicate-defaultsort": "'''ସୂଚନା:''' ଆପେଆପେ କାମକରୁଥିବା \"$2\" ଆଗରୁ ଆପେ ଆପେ ସଜାଡୁଥିବା \"$1\"କୁ ବନ୍ଦ କରିଦେଇଛି ।",
+       "duplicate-displaytitle": "<strong>ଚେତାବନୀ:</strong> \"$2\" ନାମଟି \"$1\" ନାମ ଉପରେ ଚଢ଼ାଇ ଦେଖାନ୍ତୁ ।",
        "version": "ସଂସ୍କରଣ",
        "version-extensions": "ଇନଷ୍ଟଲ କରାହୋଇଥିବା ଏକ୍ସଟେନସନସବୁ",
-       "version-skins": "ବହିରାବରଣ",
+       "version-skins": "à¬\87ନଷà­\8dà¬\9fଲ à¬¹à­\8bà¬\87ଥିବା à¬¸à­\8dà¬\95ିନ",
        "version-specialpages": "ବିଶେଷ ପୃଷ୍ଠା",
        "version-parserhooks": "ପାର୍ସର ହୁକ",
        "version-variables": "ଚଳ",
        "version-hook-name": "ହୁକ ନାମ",
        "version-hook-subscribedby": "କାହା ଦେଇ ମଗାଯାଇଛି",
        "version-version": "(ଭାଗ $1)",
+       "version-no-ext-name": "[କୌଣସି ନାମ ନାହିଁ]",
        "version-license": "ମିଡ଼ିଆଉଇକି ସ୍ୱତ୍ୱ",
        "version-ext-license": "ଲାଇସେନ୍ସ",
        "version-ext-colheader-name": "ଏକ୍ସଟେନସନ",
+       "version-skin-colheader-name": "ସ୍କିନ",
        "version-ext-colheader-version": "ସଂସ୍କରଣ",
        "version-ext-colheader-license": "ଲାଇସେନ୍ସ",
        "version-ext-colheader-description": "ବର୍ଣନା",
        "version-ext-colheader-credits": "ଲେଖକମାନେ",
+       "version-license-title": "$1 ପାଇଁ ଲାଇସେନ୍ସ",
+       "version-license-not-found": "ଏହି ଏକ୍ସଟେନସନରେ କୌଣସି ସବିଶେଷ ସୂଚନା ନାହିଁ ।",
+       "version-credits-title": "$1 ପାଇଁ ଶ୍ରେୟ",
+       "version-credits-not-found": "ଏହି ଏକ୍ସଟେନସନରୁ କୌଣସି କ୍ରେଡ଼ିଟ ସୂଚନା ମିଳିଲା ନାହିଁ ।",
        "version-poweredby-credits": "ଏହି ଉଇକିଟି '''[https://www.mediawiki.org/ ମିଡ଼ିଆଉଇକି]''' ଦେଇ ପରିଚାଳିତ, ସତ୍ଵାଧିକାର © ୨୦୦୧-$1 $2 ।",
        "version-poweredby-others": "ବାକିସବୁ",
+       "version-poweredby-translators": "translatewiki.net ଅନୁବାଦକଗଣ",
        "version-credits-summary": "ଆମେ ଏହି ଲୋକମାନଙ୍କୁ [[Special:Version|MediaWiki]]ରେ ସେମାନକର ଅବଦାନ ପାଇଁ ଚିହ୍ନିବାକୁ ଚାହୁଁଛୁ ।",
        "version-license-info": "MediaWiki ଏକ ମାଗଣା ସଫ୍ଟୱାର; ଆପଣ ଏହାକୁ ପୁନବଣ୍ଟନ କରିପାରିବେ ବା GNU ଜେନେରାଲ ପବ୍ଲିକ ଲାଇସେନ୍ସ ଅଧିନରେ ବଦଳାଇପାରିବେ ଯାହା ଫ୍ରି ସଫ୍ଟୱାର ଫାଉଣ୍ଡେସନ ଦେଇ ପ୍ରକାଶିତ ହୋଇଥିବ।\n\nMediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯାଇଥାଏ, କିନ୍ତୁ ଏହା କୌଣସି ଲିଖିତ ପଟା ସହ ଆସିନଥାଏ; ଏହା ବିକ୍ରୟଯୋଗ୍ୟତା ବା ଏକ ନିର୍ଦିଷ୍ଟ କାମପାଇଁ ବାଧ୍ୟତାମୂଳକ ପଟା ସହ ଆସିନଥାଏ । ଅଧିକ ଜାଣିବା ନିମନ୍ତେ ଦୟାକରି GNU ଜେନେରାଲ ପବ୍ଲିକ ଲାଇସେନ୍ସ ଦେଖନ୍ତୁ ।\n\nଆପଣ [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU ଜେନେରାଲ ପବ୍ଲିକ ଲାଇସେନ୍ସର ନକଲଟିଏ] ଏହି ସଫ୍ଟୱାର ସହିତ ପାଇଥିବା ଜରୁରି; ଯଦି ପାଇନଥିବେ, ଫ୍ରି ସଫ୍ଟୱାର ଫାଉଣ୍ଡେସନ, Inc., ୫୧ ଫ୍ରାଙ୍କଲୀନ ଷ୍ଟ୍ରିଟ, ୫ମ ମହଲା, ବଷ୍ଟନ, ମାସାଚୁସେଟସ ୦୨୧୧୦-୧୩୦୧, ଯୁକ୍ତରାଷ୍ଟ୍ର ଆମେରିକା କିମ୍ବା [//www.gnu.org/licenses/old-licenses/gpl-2.0.html ଅନଲାଇନ] ପଢ଼ିନିଅନ୍ତୁ ।",
        "version-software": "ଇନଷ୍ଟଲ ହୋଇଥିବା ସଫ୍ଟୱାର",
        "version-entrypoints": "ନିବେଶ ହେଉଥିବା ସ୍ଥାନର URLଗୁଡିକ",
        "version-entrypoints-header-entrypoint": "ପ୍ରବେଶ ବିନ୍ଦୁ",
        "version-entrypoints-header-url": "ଇଉଆରଏଲ",
+       "redirect": "ଫାଇଲ, ସଭ୍ୟ, ପୃଷ୍ଠା କିମ୍ବା ସଂସ୍କରଣ ID ଅନୁସାରେ ପୁନପ୍ରେରଣ",
+       "redirect-legend": "ଏକ ଫାଇଲ କିମ୍ବା ପୃଷ୍ଠାକୁ ପୁନପ୍ରେରଣ କରନ୍ତୁ",
+       "redirect-summary": "(ଫାଇଲ ନାମ ଥିଲେ), (ଏକ ସଂସ୍କରଣ ID କିମ୍ବା ପୃଷ୍ଠା ID ଥିଲେ) କିମ୍ବା ଏକ ସଭ୍ୟ ଖାତା ଥିଲେ (ଏକ ସାଂଖିକ ସଭ୍ୟ ID)ଏହି ବିଶେଷ ପୃଷ୍ଠାଟି ଏକ ଫାଇଲକୁ ଲେଉଟାଇ ଦେଇଥାଏ । ବ୍ୟବହାର: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], କିମ୍ବା [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "ଯାଆନ୍ତୁ",
        "redirect-lookup": "ଖୋଜନ୍ତୁ:",
        "redirect-value": "ମୂଲ୍ୟ:",
        "tags": "ବୈଧ ସମ୍ପାଦନା ଚିହ୍ନ",
        "tag-filter": "[[Special:Tags|ଟାଗ]] ଛଣା:",
        "tag-filter-submit": "ଛାଣିବା",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ଗୋଟି ଟ୍ୟାଗ|ଗୋଟି ଟ୍ୟାଗ}}]]: $2)",
        "tags-title": "ସୂଚକ",
        "tags-intro": "ଏହି ପୃଷ୍ଠା ସଫ୍ଟୱାର ଏକ ବଦଳ ଭାବେ ଚିହ୍ନିତ କରୁଥିବା ଚିହ୍ନସବୁର ମାନେ ସହ ତାଲିକା ତିଆରି କରିଥାଏ ।",
        "tags-tag": "ଚିହ୍ନ ନାମ",
        "sqlite-no-fts": "ପୁରା ଟେକ୍ସ୍ଟ ଖୋଜା ସହଯୋଗ ବିନା $1",
        "logentry-delete-delete": "$1, $3 ପୃଷ୍ଠାଟି {{GENDER:$2|ଲିଭାଇଦେଲେ}}",
        "logentry-delete-restore": "$1, $3 ପୃଷ୍ଠାଟି {{GENDER:$2|ପୁନସ୍ଥାପନ କଲେ}}",
-       "logentry-delete-event": "$1 $3 ବେଳେ {{PLURAL:$5|ଏକ ଇତିହାସର ଘଟଣାର|$5 ଇତିହାସର ଘଟଣାମାନଙ୍କର}} ଦେଖଣା ବଦଳାଇ ଦେଲେ: $4",
-       "logentry-delete-revision": "$1 $3 ପୃଷ୍ଠାରେ {{PLURAL:$5|ସଙ୍କଳନଟିଏର|$5 ସଙ୍କଳନମାନଙ୍କର}} ଦେଖଣା ବଦଳାଇ ଦେଲେ: $4",
-       "logentry-delete-event-legacy": "$1 $3 à¬°à­\87 à¬\87ତିହାସର à¬\98à¬\9fଣାସବà­\81ର à¬¦à­\87à¬\96ଣା à¬¬à¬¦à¬³à¬¾à¬\87ଦà­\87ଲà­\87",
-       "logentry-delete-revision-legacy": "$1 $3 à¬ªà­\83ଷà­\8dଠାରà­\87 à¬\87ତିହାସର à¬\98à¬\9fଣାସବà­\81ର à¬¦à­\87à¬\96ଣା à¬¬à¬¦à¬³à¬¾à¬\87ଦà­\87ଲà­\87",
-       "logentry-suppress-delete": "$1 $3 ପୃଷ୍ଠାଟିକୁ ଚପାଇଦେଲେ",
-       "logentry-suppress-event": "$3 ବେଳେ $1 ଗୋପନ ଭାବରେ {{PLURAL:$5|ଇତିହାସର ଘଟଣାଟିଏର|$5 ଇତିହାସର ଘଟଣାବଳୀର}} ଦେଖଣା ବଦଳାଇଦେଲେ: $4",
-       "logentry-suppress-revision": "$1 à¬\97à­\8bପନ à¬­à¬¾à¬¬à¬°à­\87 $3 à¬ªà­\83ଷà­\8dଠାରà­\87 {{PLURAL:$5|à¬\87ତିହାସର à¬\98à¬\9fଣାà¬\9fିà¬\8fର|$5 à¬\87ତିହାସର à¬\98à¬\9fଣାବଳà­\80ର}} à¬¦à­\87à¬\96ଣା à¬¬à¬¦à¬³à¬¾à¬\87ଦà­\87ଲà­\87: $4",
-       "logentry-suppress-event-legacy": "$1 à¬\97à­\8bପନ à¬­à¬¾à¬¬à¬°à­\87 à¬¬à¬¦à¬³à¬¾à¬\87ଦà­\87ଲà­\87 $3ରà­\87 à¬¥à¬¿à¬¬à¬¾ à¬\87ତିହାସ à¬\98à¬\9fଣାମାନà¬\99à­\8dà¬\95ର à¬¦à­\87à¬\96ଣା à¬¬à¬¦à¬³à¬¾à¬\87ଦà­\87ଲà­\87",
-       "logentry-suppress-revision-legacy": "$1 à¬\97à­\8bପନ à¬­à¬¾à¬¬à¬°à­\87 à¬¬à¬¦à¬³à¬¾à¬\87ଦà­\87ଲà­\87 $3 à¬ªà­\83ଷà­\8dଠାରà­\87 à¬¥à¬¿à¬¬à¬¾ à¬\87ତିହାସ à¬\98à¬\9fଣାମାନà¬\99à­\8dà¬\95ର à¬¦à­\87à¬\96ଣା à¬¬à¬¦à¬³à¬¾à¬\87ଦà­\87ଲà­\87",
+       "logentry-delete-event": "$1 {{PLURAL:$5|ଲଗ ଘଟଣାଟିଏ|$5 ଗୋଟି ଲଗ ଘଟଣା}}ର ଦେଖଣା $3 ପୃଷ୍ଠାରେ {{GENDER:$2|ବଦଳାଇଲେ}}: $4",
+       "logentry-delete-revision": "$1 {{PLURAL:$5|ସଂସ୍କରଣଟିଏ|$5 ଗୋଟି ସଂସ୍କରଣ}}ର ଦେଖଣା $3 ପୃଷ୍ଠାରେ {{GENDER:$2|ବଦଲାଇଲେ}}: $4",
+       "logentry-delete-event-legacy": "$1 $3 à¬ªà­\83ଷà­\8dଠାର à¬²à¬\97 à¬\98à¬\9fଣାà¬\97à­\81ଡ଼ିà¬\95ର à¬¦à­\87à¬\96ଣା {{GENDER:$2|ବଦଳାà¬\87ଲà­\87}}",
+       "logentry-delete-revision-legacy": "$1 $3 à¬ªà­\83ଷà­\8dଠାରà­\87 à¬¥à¬¿à¬¬à¬¾ à¬²à¬\97 à¬\98à¬\9fଣାà¬\97à­\81ଡ଼ିà¬\95ର à¬¦à­\87à¬\96ଣା à¬¸à¬\82ସà­\8dà¬\95ରଣମାନ {{GENDER:$2|ବଦଳାà¬\87ଲà­\87}}",
+       "logentry-suppress-delete": "$1 $3 ପୃଷ୍ଠାଟିକୁ {{GENDER:$2|ଦବାଇଦେଲେ}}",
+       "logentry-suppress-event": "$1 $3 ପୃଷ୍ଠାରେ ଗୋପନୀୟ ଭାବରେ {{PLURAL:$5|ଲଗ ଇଭେଣ୍ଟଟିଏର|$5 ଗୋଟି ଲଗ ଇଭେଣ୍ଟର}} ଦେଖଣା {{GENDER:$2|ବଦଳାଇଦେଲେ}}: $4",
+       "logentry-suppress-revision": "$1 à¬\97à­\8bପନ à¬­à¬¾à¬¬à­\87 $3 à¬ªà­\83ଷà­\8dଠାରà­\87 {{PLURAL:$5|ସà¬\82ସà­\8dà¬\95ରଣà¬\9fିà¬\8fର|$5 à¬\97à­\8bà¬\9fି à¬¸à¬\82ସà­\8dà¬\95ରଣର}} à¬¦à­\87à¬\96ଣା {{GENDER:$2|ବଦଳାà¬\87ଦà­\87ଲà­\87}}: $4",
+       "logentry-suppress-event-legacy": "$1 à¬\97à­\8bପନ à¬­à¬¾à¬¬à­\87 $3ରà­\87 à¬¥à¬¿à¬¬à¬¾ à¬²à¬\97 à¬\87ଭà­\87ଣà­\8dà¬\9fମାନà¬\99à­\8dà¬\95ର à¬¦à­\87à¬\96ଣା  {{GENDER:$2|ବଦଳାà¬\87ଦà­\87ଲà­\87}}",
+       "logentry-suppress-revision-legacy": "$1 à¬\97à­\8bପନ à¬­à¬¾à¬¬à­\87 $3 à¬ªà­\83ଷà­\8dଠାରà­\87 à¬¥à¬¿à¬¬à¬¾ à¬¸à¬\82ସà­\8dà¬\95ରଣମାନà¬\99à­\8dà¬\95ର à¬¦à­\87à¬\96ଣା {{GENDER:$2|ବଦଳାà¬\87ଦà­\87ଲà­\87}}",
        "revdelete-content-hid": "ଭିତର ଭାଗ ଲୁଚାଯାଇଅଛି",
        "revdelete-summary-hid": "ସମ୍ପାଦନା ସାରକଥା ଲୁଚାଯାଇଅଛି",
        "revdelete-uname-hid": "ଇଉଜର ନାମ ଲୁଚାଯାଇଅଛି",
        "revdelete-uname-unhid": "ଲୁଚାଯାଇଥିବା ଇଉଜର ନାମ ଦେଖାଇବେ",
        "revdelete-restricted": "ପରିଛାମାନଙ୍କ ନିମନ୍ତେ ଥିବା ବାରଣ",
        "revdelete-unrestricted": "ପରିଛାମାନଙ୍କ ନିମନ୍ତେ ଥିବା ବାରଣ ବାହାର କରିଦିଆଗଲା",
-       "logentry-move-move": "$1 $3 ପୃଷ୍ଠାଟି $4କୁ ଘୁଞ୍ଚାଇଲେ",
-       "logentry-move-move-noredirect": "$1 $3 ପୃଷ୍ଠାଟି $4କୁ ପୁନପ୍ରେରଣ ବିନା ଘୁଞ୍ଚାଇଲେ",
-       "logentry-move-move_redir": "$1 $3 ପୃଷ୍ଠାଟି $4କୁ ପୁନପ୍ରେରଣ ଛାଡ଼ି ଘୁଞ୍ଚାଇଲେ",
-       "logentry-move-move_redir-noredirect": "$1 $3 ପୃଷ୍ଠାଟି $4କୁ ପୁନପ୍ରେରଣକୁ ଛାଡ଼ି ପୁନପ୍ରେରଣ ବିନା ଘୁଞ୍ଚାଇଲେ",
-       "logentry-patrol-patrol": "$1 $3 à¬ªà­\83ଷà­\8dଠାର $4 à¬¤à¬® à¬¸à¬\99à­\8dà¬\95ଳନà¬\95à­\81 à¬\9cà¬\97ାଯାà¬\87à¬\85à¬\9bି à¬¬à­\8bଲି à¬\9aିହà­\8dନିତ à¬\95ଲà­\87",
-       "logentry-patrol-patrol-auto": "$1 à¬\86ପà­\87à¬\86ପà­\87 $3 à¬ªà­\83ଷà­\8dଠାର $4 à¬¤à¬® à¬¸à¬\99à­\8dà¬\95ଳନà¬\95à­\81 à¬\9cà¬\97ାଯାà¬\87à¬\85à¬\9bି à¬¬à­\8bଲି à¬\9aିହà­\8dନିତ à¬\95ଲà­\87",
+       "logentry-move-move": "$1 ପୃଷ୍ଠାଟିକୁ $3ରୁ $4କୁ {{GENDER:$2|ଘୁଞ୍ଚାଇଲେ}}",
+       "logentry-move-move-noredirect": "$1 $3 ପୃଷ୍ଠାଟି $4କୁ ପୁନପ୍ରେରଣ ବିନା {{GENDER:$2|ଘୁଞ୍ଚାଇଲେ}}",
+       "logentry-move-move_redir": "$1 $3 ପୃଷ୍ଠାଟି $4କୁ {{GENDER:$2|ଲେଉଟାଇଲେ}}",
+       "logentry-move-move_redir-noredirect": "$1 ପୁନପ୍ରେରଣ ବିନା $3 ପୃଷ୍ଠାଟି $4କୁ {{GENDER:$2|ଘୁଞ୍ଚାଇଲେ}}",
+       "logentry-patrol-patrol": "$1 $3 à¬ªà­\83ଷà­\8dଠାର $4 à¬¤à¬® à¬¸à¬\82ସà­\8dà¬\95ରଣ à¬\9cà¬\97ାଯାà¬\87à¬\85à¬\9bି à¬¬à­\8bଲି {{GENDER:$2|à¬\9aିହà­\8dନିତ à¬\95ଲà­\87}}",
+       "logentry-patrol-patrol-auto": "$1 à¬\86ପà­\87à¬\86ପà­\87 $3 à¬ªà­\83ଷà­\8dଠାର $4 à¬¤à¬® à¬¸à¬\82ସà­\8dà¬\95ରଣ à¬\9cà¬\97ାଯାà¬\87à¬\85à¬\9bି à¬¬à­\8bଲି {{GENDER:$2|à¬\9aିହà­\8dନିତ à¬\95ଲà­\87}}",
        "logentry-newusers-newusers": "ସଭ୍ୟ ଖାତା $1 {{GENDER:$2|ତିଆରି}} କରାଗଲା",
        "logentry-newusers-create": "ସଭ୍ୟ ଖାତା $1 {{GENDER:$2|ତିଆରି}} କରାଗଲା",
-       "logentry-newusers-create2": "ସଭ୍ୟ ଖାତା $3ଟି $1 ଦ୍ଵାରା ତିଆରି କରାଗଲା",
-       "logentry-newusers-byemail": "$1ଙ୍କ ଦ୍ଵାରା $3 ବ୍ୟବହାରକାରୀ ଖାତାଟି ଖୋଳାଗଲା ଏବଂ ପାସୱାର୍ଡଟି ଇ-ମେଲ ଦ୍ଵାରା ପଠାଗଲା",
+       "logentry-newusers-create2": "$3 ସଭ୍ୟ ଖାତାଟି $1ଙ୍କ ଦ୍ଵାରା {{GENDER:$2|ଗଢ଼ାଗଲା}}",
+       "logentry-newusers-byemail": "ସଭ୍ୟ ଖାତା $3, $1ଙ୍କ ଦ୍ଵାରା {{GENDER:$2|ଖୋଲାଗଲା}} ଏବଂ ପାସୱାର୍ଡଟି ଇମେଲ ଦ୍ଵାରା ପଠାଗଲା",
        "logentry-newusers-autocreate": "ବ୍ୟବହାରକାରୀ ଖାତା $1 ଆପେଆପେ {{GENDER:$2|ତିଆରିହେଲା}}",
-       "logentry-rights-rights": "$1, $3 à¬ªà¬¾à¬\87à¬\81 $4ରà­\81 $5à¬\95à­\81 à¬¸à¬­à­\8dà­\9fପଦ à¬¬à¬¦à¬³à¬¾à¬\87ଲà­\87",
+       "logentry-rights-rights": "$1, $3 à¬ªà¬¾à¬\87à¬\81 $4ରà­\81 $5à¬\95à­\81 à¬\95à­\8bଠ à¬¸à¬­à­\8dà­\9fପଦ {{GENDER:$2|ବଦଳାà¬\87ଲà­\87}}",
        "logentry-rights-rights-legacy": "$1 ଗୋଷ୍ଠୀ ସଭ୍ୟପଦ $3 ପାଇଁ {{GENDER:$2|ବଦଳିଗଲା}}",
-       "logentry-rights-autopromote": "$1 ଆପେ ଆପେ $4ରୁ $5କୁ ଗଲେ",
+       "logentry-rights-autopromote": "$1 ଆପେ ଆପେ $4ରୁ $5କୁ {{GENDER:$2|ପଦୋନ୍ନତ କରାଗଲା}}",
+       "logentry-upload-upload": "$1, $3 {{GENDER:$2|ଅପଲୋଡ଼ କଲେ}}",
+       "logentry-upload-overwrite": "$1, $3ର ଏକ ନୂଆ ସଂସ୍କରଣ {{GENDER:$2|ଅପଲୋଡ଼ କଲେ}}",
+       "logentry-upload-revert": "$1, $3 {{GENDER:$2|ଅପଲୋଡ଼ କଲେ}}",
        "rightsnone": "(କିଛି ନାହିଁ)",
+       "revdelete-summary": "ସାରକଥା ସମ୍ପାଦନା",
        "feedback-bugornote": "ଦୟାକରି ଆପଣ ଏକ କାରିଗରି ଅସୁବିଧାଟିଏ ଜଣାଇବା ପାଇଁ ଚାହୁଁଥିଲେ ଦୟାକରି [$1 ଏଠାରେ ଅସୁବିଧାଟି ଜଣାନ୍ତୁ] । \nଅଥବା, ଆପଣ ତଳେ ଠିଆ ସହଜ ଆବେଦନ ପତ୍ରଟି ପୁରଣ କରିପାରିବେ ।  ଆପଣଙ୍କ ବ୍ୟବହାରକାରୀ ନାମ ଓ ଆପଣ ବ୍ୟବହାର କରୁଥିବା ବ୍ରାଉଜର ଅନୁସାରେ ଆପଣଙ୍କ ମତାମତ \"[$3 $2]\"ରେ ଯୋଡ଼ାଯିବ ।",
        "feedback-subject": "ବିଷୟ:",
        "feedback-message": "ଖବର:",
        "api-error-overwrite": "ଆଗରୁଥିବା ଏକ ଫାଇଲ ଉପରେ ମଡ଼ାଇବା ଅନୁମୋଦିତ ନୁହେଁ ।",
        "api-error-stashfailed": "ଭିତର ଅସୁବିଧା: ସର୍ଭର ଅସ୍ଥାୟୀ ଫାଇଲକୁ ସାଇତି ପାରିଲା ନାହିଁ ।",
        "api-error-publishfailed": "ଭିତର ଅସୁବିଧା: ସର୍ଭର ଅସ୍ଥାୟୀ ଫାଇଲକୁ ପ୍ରକାଶ କରିପାରିଲା ନାହିଁ ।",
+       "api-error-stasherror": "ଫାଇଲଟିକୁ ଷ୍ଟାସରେ ଅପଲୋଡ଼ କଲାବେଳେ ତ୍ରୁଟିଟିଏ ପରିଲକ୍ଷିତ ହେଲା ।",
        "api-error-timeout": "ସର୍ଭର ଏକ ସୀମିତ କାଳ ଭିତରେ ଉତ୍ତର ଦେଲାନାହିଁ ।",
        "api-error-unclassified": "ଏକ ଅଜଣା ଅସୁବିଧା ଘଟିଲା ।",
        "api-error-unknown-code": "ଅଜଣା ତୃଟି: \"$1\"",
        "duration-decades": "$1 {{PLURAL:$1|decade|decades}}",
        "duration-centuries": "$1 {{PLURAL:$1|century|centuries}}",
        "duration-millennia": "$1 {{PLURAL:$1|millennium|millennia}}",
+       "rotate-comment": "$1ଙ୍କ ଦ୍ୱାରା ଛବିଟିକୁ ଘଣ୍ଟା କଣ୍ଟାର ସମାନ ଦିଗରେ {{PLURAL:$1|ଡିଗ୍ରି|ଡିଗ୍ରି}} ବୁଲାଇଦିଆଗଲା",
+       "limitreport-title": "ପାର୍ସର ପ୍ରୋଫାଇଲିଙ୍ଗ ଡାଟା:",
+       "limitreport-cputime": "CPU ସମୟ ବ୍ୟବହାର",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}}",
+       "limitreport-walltime": "ରିଏଲ ଟାଇମ ବ୍ୟବହାର",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}}",
+       "limitreport-ppvisitednodes": "ପ୍ରିପୋସେସର ନୋଡ଼ କାଉଣ୍ଟ ଦେଖିଲେ",
+       "limitreport-ppgeneratednodes": "ପ୍ରିପୋସେସର ନୋଡ଼ କାଉଣ୍ଟ ତିଆରି କଲେ",
+       "limitreport-postexpandincludesize": "ବଢ଼ାଇବା ପରେ ଆକାର ରଖନ୍ତୁ",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|ବାଇଟ|ବାଇଟ}}",
+       "limitreport-templateargumentsize": "ଛାଞ୍ଚ ଆର୍ଗୁମେଣ୍ଟ ଆକାର",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|ବାଇଟ|ବାଇଟ}}",
+       "limitreport-expansiondepth": "ସର୍ବୋଚ୍ଚ ବଢ଼ାଇବା ଗଭୀରତା",
+       "limitreport-expensivefunctioncount": "ଭାରୀ ପାର୍ସର ଫଙ୍କସନ ଆକଳନ",
+       "expandtemplates": "ଛାଞ୍ଚ ବଢ଼ାଇବା",
+       "expand_templates_intro": "ଏହି ବିଶେଷ ପୃଷ୍ଠାଟି ସବୁ ଲେଖା ନେଇ ଛାଞ୍ଚକୁ ବାରମ୍ବାର ବଢ଼ାଇଦିଏ ।\nଏହା <code><nowiki>{{</nowiki>#language:…}}</code> ଭଳି ପାର୍ସର ଫଙ୍କସନମାନଙ୍କୁ\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code> ଭଳି ଭେରିଏବଲମାନଙ୍କୁ ବଢ଼ାଏ ।\nଅଧିକନ୍ତୁ, ଏହା <code><nowiki>{{ }} }}</code>ରେ ଥିବା ସବୁ କିଛି ବଢ଼ାଇଥାଏ ।",
+       "expand_templates_title": "{{FULLPAGENAME}} ଆଦି ପାଇଁ ପ୍ରସଙ୍ଗ ନାମ:",
        "expand_templates_input": "ଇନପୁଟ ବିଷୟ:",
        "expand_templates_output": "ପରିଣାମ",
+       "expand_templates_xml_output": "XML ଫଳାଫଳ",
+       "expand_templates_html_output": "ଖାଲି HTML ଫଳାଫଳ",
        "expand_templates_ok": "ଠିକ ଅଛି",
        "expand_templates_remove_comments": "ମତାମତ ହଟାନ୍ତୁ",
-       "expand_templates_preview": "ଦେଖଣା"
+       "expand_templates_remove_nowiki": "ଫଳାଫଳରେ <nowiki> ଟ୍ୟାଗମାନଙ୍କୁ ଦବାଇଦିଅନ୍ତୁ",
+       "expand_templates_generate_xml": "XML ପାର୍ସ ସଂରଚନା ଦେଖାନ୍ତୁ",
+       "expand_templates_generate_rawhtml": "କେବଳ HTML କୋଡ଼ ଦେଖାନ୍ତୁ",
+       "expand_templates_preview": "ଦେଖଣା",
+       "pagelanguage": "ପୃଷ୍ଠା ଭାଷା ବଛା",
+       "pagelang-name": "ପୃଷ୍ଠା",
+       "pagelang-language": "ଭାଷା",
+       "pagelang-use-default": "ଡିଫଲ୍ଟ ଭାଷା ବ୍ୟବହାର କରନ୍ତୁ",
+       "pagelang-select-lang": "ଭାଷା ବାଛନ୍ତୁ",
+       "right-pagelang": "ପୃଷ୍ଠାର ଭାଷା ବାଛନ୍ତୁ",
+       "action-pagelang": "ପୃଷ୍ଠାର ଭାଷା ବଦଳାନ୍ତୁ",
+       "log-name-pagelang": "ଭାଷା ଇତିହାସ ବଦଳାନ୍ତୁ",
+       "log-description-pagelang": "ପୃଷ୍ଠା ଭାଷା ବଦଳର ଏ ଏକ ଇତିହାସ",
+       "logentry-pagelang-pagelang": "$1 $3 ପୃଷ୍ଠାର ଭାଷା $4 ରୁ $5କୁ {{GENDER:$2|ବଦଳାଇଦେଲେ}} ।",
+       "default-skin-not-found": "<code dir=\"ltr\">$wgDefaultSkin</code>ରେ ଦିଆଯାଇଥିବା <code>$1</code>ଏହି ଉଇକିର ଡିଫଲ୍ଟ ସ୍କିନ ମିଳିଲାନାହିଁ ।\n\nଆପଣଙ୍କ ଇନଷ୍ଟଲେସନରେ ତଳଲିଖିତ ସ୍କିନ ରହିଛି । ସେମାନଙ୍କୁ କିପରି ସକ୍ରିୟ କରିବେ ଓ ଡିଫଲ୍ଟ ଭାବେ ବାଛିବେ ଜାଣିବା ପାଇଁ [https://www.mediawiki.org/wiki/Manual:Skin_configuration ମାନୁଆଲ: ସ୍କିନ ସଂରଚନା] ଦେଖନ୍ତୁ ।\n\n$2\n\n; ଯଦି ଆପଣ ଏହି ଏବେ MediaWiki ଇନଷ୍ଟଲ କରିଥାନ୍ତି:\n: ଆପଣ ବୋଧେ git ରୁ ସିଧା, କିମ୍ବା ସୋର୍ସ କୋଡ଼ରୁ କିମ୍ବା ଆଉ କେଉଁଠାରୁ ଇନଷ୍ଟଲ କରିଛନ୍ତି । ଏହା ଆଶାନୁରୂପ । [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.orgର ]ରୁ ଆଉ କିଛି ସ୍କିନ ଇନଷ୍ଟଲ କରିପାରିବେ:\n:* ବିଭିନ୍ନ ସ୍କିନ ଓ ଏକ୍ସଟେନସନ ସହିତ ଆସୁଥିବା [https://www.mediawiki.org/wiki/Download ଟାରବଲ ଇନଷ୍ଟଲର] ଡାଉନଲୋଡ଼ କରାଯାଉଛି । ଆପଣ  <code>skins/</code> ଡାଇରେକ୍ଟରି ଏଠାରୁ କପି କରି ପେଷ୍ଟ କରିପାରିବେ । \n:* git ଦେଇ <code>mediawiki/skins/*</code> ରେପୋଜିଟରିରୁ ଗୋଟେ ସ୍କିନ ଆପଣଙ୍କର MediaWiki ଇନଷ୍ଟଲେସନର <code dir=\"ltr\">skins/</code> ଡାଇରେକ୍ଟରିକୁ କପି କରାଯାଉଛି ।\n: ଆପଣ ଯଦି ଜଣେ MediaWiki ଡେଭେଲପର ହୋଇଥାନ୍ତି ତାହେଲେ ଏହା କରିବା ଦ୍ୱାରା ଆପଣଙ୍କର git ରେପୋଜିଟୋରିରେ କିଛି ବାଧା ଉପୁଜିବା ଅନୁଚିତ ।\n\n; ଆପଣ ଯଦି ଏହି ମାତ୍ର MediaWiki ଅପଗ୍ରେଡ଼ କରିଥାନ୍ତି ତେବେ:\n: MediaWiki 1.24 ଏବଂ ନୂଆ ସଂସ୍କରଣମାନ ଆପେଆପେ ଇନଷ୍ଟଲ ହୋଇଥିବା ସ୍କିନ ସକ୍ରିୟ କରି ନଥାନ୍ତି ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]) ଦେଖନ୍ତୁ । ଏବେ ଇନଷ୍ଟଲ ହୋଇଥିବା ସମସ୍ତ ସ୍କିନ ପାଇଁ ଆପଣ ଏହି ଧାଡ଼ିଟି <code>LocalSettings.php</code>ରେ ପେଷ୍ଟ କରିପାରିବେ:\n\n<pre dir=\"ltr\">$3</pre>\n\n; ଯଦି ଆପଣ ଏହି ମାତ୍ର <code>LocalSettings.php</code> ବଦଳାଇ ଦେଇଥାନ୍ତି:\n: ବନାନ ପରଖିବା ପାଇଁ ସ୍କିନର ନାମ ଆଉଥରେ ପରଖିନିଅନ୍ତୁ ।",
+       "default-skin-not-found-no-skins": "<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 ଟାରବଲ ଇନଷ୍ଟଲର] ଡାଉନଲୋଡ଼ କରାଯାଉଛି । ଆପଣ  <code>skins/</code> ଡାଇରେକ୍ଟରି ଏଠାରୁ କପି କରି ପେଷ୍ଟ କରି । \n:* git ଦେଇ <code>mediawiki/skins/*</code> ରେପୋଜିଟରିରୁ ଗୋଟେ ସ୍କିନ ଆପଣଙ୍କର MediaWiki ଇନଷ୍ଟଲେସନର <code dir=\"ltr\">skins/</code> ଡାଇରେକ୍ଟରିକୁ କପି କରି ।\n: ଆପଣ ଯଦି ଜଣେ MediaWiki ଡେଭେଲପର ହୋଇଥାନ୍ତି ତାହେଲେ ଏହା କରିବା ଦ୍ୱାରା ଆପଣଙ୍କର git ରେପୋଜିଟୋରିରେ କିଛି ବାଧା ଉପୁଜିବା ଅନୁଚିତ । ସ୍କିନ ସକ୍ରିୟ କରିବା ଓ ଡିଫଲ୍ଟ ଭାବେ ବାଛିବା ବାବଦରେ ଅଧିକ ସୂଚନା ପାଇଁ [https://www.mediawiki.org/wiki/Manual:Skin_configuration 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-summary": "ଅପଲୋଡ଼ ହୋଇଥିବା ଫାଇଲର ପ୍ରକାର ବାବଦରେ ଆକଳନ । ଏଥିରେ ଏକ ଫାଇଲର ନିକଟତମ ସଂସ୍କରଣ ରହିଛି । ପୁରୁଣା କିମ୍ବା ଅପସାରିତ ସଂସ୍କରଣ ଏଥିରେ ରଖାଯାଇନାହିଁ ।",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 ବାଇଟ|$1 ବାଇଟ}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME ପ୍ରକାର",
+       "mediastatistics-table-extensions": "ସମ୍ଭାବିତ ଏକ୍ସଟେନସନ",
+       "mediastatistics-table-count": "ଫାଇଲ ସଂଖ୍ୟା",
+       "mediastatistics-table-totalbytes": "ସମ୍ମିଳିତ ଆକାର",
+       "mediastatistics-header-unknown": "ଅଜଣା",
+       "mediastatistics-header-bitmap": "ବିଟମ୍ୟାପ ଛବି",
+       "mediastatistics-header-drawing": "ଅଙ୍କନ (ଭେକ୍ଟର ଛବି)",
+       "mediastatistics-header-audio": "ଅଡ଼ିଓ",
+       "mediastatistics-header-video": "ଭିଡ଼ିଓ",
+       "mediastatistics-header-multimedia": "ରିଚ ମିଡ଼ିଆ",
+       "mediastatistics-header-office": "ଅଫିସ",
+       "mediastatistics-header-text": "ଲେଖା",
+       "mediastatistics-header-executable": "ଏକ୍ସକିଉଟ କରିହେବା ଭଳି",
+       "mediastatistics-header-archive": "କମ୍ପ୍ରେସ ହୋଇଥିବା ଫର୍ମାଟ",
+       "json-warn-trailing-comma": "$1 ପରର {{PLURAL:$1|କମାଟି|କମା ସବୁ}} JSONରୁ ହଟାଇ ଦିଆଯାଇଛି",
+       "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": "ଏନକୋଡ଼ ହୋଇନପାରିବା ଭଳି ଏକ ପ୍ରକାରର ମୂଲ୍ୟ ଦିଆଗଲା"
 }
index 9ff15c2..8a256d5 100644 (file)
        "passwordreset-emailsent-capture": "Ног пароль сæвæрыны фыстæг æрвыст æрцыд æмæ бындæр æвдыст у.",
        "passwordreset-emailerror-capture": "Ног пароль сæвæрыны фыстæг арæзт æрцыд æмæ бындæр æвдыст у. Фæлæ йæ {{grammar:allative|{{GENDER:$2|user}}}} арвитын нæ бантыстис: $1",
        "changeemail": "E-mail адрис фæивын",
-       "changeemail-header": "Аккаунты e-mail адрис фæивын",
        "changeemail-text": "Байдзаг кæн ацы формæ, цæмæй дæ e-mail адрис фæивай. Уый тыххæй дын хъæудзæн дæ пароль бафыссын.",
        "changeemail-no-info": "Ды хъуамæ системæмæ хызт уай, цæмæй ацы фарсмæ комкоммæ бавналай.",
        "changeemail-oldemail": "Нырыккон e-mail адрис:",
        "changeemail-none": "(нæй)",
        "changeemail-password": "Дæ {{grammar:genitive|{{SITENAME}}}} пароль:",
        "changeemail-submit": "E-mail фæивын",
-       "changeemail-cancel": "Ныууадзын",
        "bold_sample": "Бæзджын текст",
        "bold_tip": "Бæзджын текст",
        "italic_sample": "Курсив",
        "search-relatedarticle": "Хæстæг",
        "searchrelated": "хæстæг",
        "searchall": "иууылдæр",
-       "showingresultsheader": "{{PLURAL:$5|Фæстиуæг '''$1''' '''$3'''-йæ|Фæстиуджытæ '''$1 - $2''' '''$3'''-йæ}} '''{{grammar:dative|$4}}'''",
        "search-nonefound": "Ницы разындис домæнæн",
        "powersearch-legend": "Сæрмагонд агуырд",
        "powersearch-toggleall": "Иууылдæр",
        "pager-older-n": "{{PLURAL:$1|раздæр иу|раздæр $1}}",
        "booksources": "Чиныгисæнтæ",
        "booksources-search-legend": "Агурын чингуыты равзæрæнтæ",
-       "booksources-go": "Агурын",
        "specialloguserlabel": "Гæнæг:",
        "speciallogtitlelabel": "Мил (ном кæнæ архайæг):",
        "log": "Логтæ",
        "unwatch": "Нал дарын цæст",
        "watchlist-details": "{{PLURAL:$1|$1 фарсмæ|$1 фарсмæ}} дæ цæст дарыс, тæрхоны фæрстæ нæ нымайгæйæ.",
        "wlnote": "Дæлæ афæстаг '''$2 сахаты дæргъы''' цы $1 {{PLURAL:$1|ивддзинад|ивддзинады}} æрцыди.",
-       "wlshowlast": "Фæстæг $1 сахаты, $2 боны дæргъы; $3.",
+       "wlshowlast": "Фæстæг $1 сахаты, $2 боны дæргъы; .",
        "watchlist-options": "Цæстдард рæгъы фадæттæ",
        "watching": "Цæстдард фæрсты номхыгъдмæ афтауын...",
        "unwatching": "Цæстдард фæрсты номхыгъдæй аиуварс кæнын...",
        "exif-datetimereleased": "Рауагъды датæ",
        "exif-identifier": "Бæрæггæнæн",
        "exif-gaincontrol-0": "Нæй",
-       "watchlistall2": "иууылдæр",
        "namespacesall": "иууылдæр",
        "monthsall": "иууылдæр",
        "confirm_purge_button": "Афтæ уæд!",
        "logentry-delete-delete": "$1 схафта фарс $3",
        "logentry-delete-restore": "$1 рацарæзта фарс $3",
        "rightsnone": "(нæй)",
+       "revdelete-summary": "ивддзинады мидис",
        "feedback-subject": "Сæр:",
        "feedback-message": "Фыстæг:",
        "feedback-cancel": "Ныууадзын",
index 9822644..b031bdc 100644 (file)
        "history": "ਸਫ਼ੇ ਦਾ ਅਤੀਤ",
        "history_short": "ਅਤੀਤ",
        "updatedmarker": "ਮੇਰੀ ਆਖਰੀ ਫੇਰੀ ਤੋਂ ਬਾਅਦ ਦੇ ਅੱਪਡੇਟ",
-       "printableversion": "à¨\9bਪਣਯà©\8bà¨\97 à¨µà¨°à¨\9cਨ",
+       "printableversion": "à¨\9bਪਣਯà©\8bà¨\97 à¨°à©\82ਪ",
        "permalink": "ਪੱਕੀ ਲਿੰਕ",
        "print": "ਛਾਪੋ",
        "view": "ਵੇਖੋ",
        "edit": "ਸੋਧੋ",
        "edit-local": "ਲੋਕਲ ਵੇਰਵਾ ਸੋਧੋ",
        "create": "ਬਣਾਓ",
+       "create-local": "ਕੋਈ ਸਥਾਨੀ ਵੇਰਵਾ ਜੋੜੋ",
        "editthispage": "ਇਹ ਸਫ਼ਾ ਸੋਧੋ",
        "create-this-page": "ਇਹ ਸਫ਼ਾ ਬਣਾਓ",
        "delete": "ਹਟਾਓ",
        "viewhelppage": "ਮਦਦ ਸਫ਼ਾ ਵੇਖੋ",
        "categorypage": "ਸ਼੍ਰੇਣੀ ਸਫ਼ਾ ਵੇਖੋ",
        "viewtalkpage": "ਚਰਚਾ ਵੇਖੋ",
-       "otherlanguages": "ਹà©\8bਰ à¨­à¨¾à¨¸à¨¼à¨¾à¨µà¨¾ਂ ਵਿਚ",
+       "otherlanguages": "ਹà©\8bਰ à¨¬à©\8bਲà©\80à¨\86ਂ ਵਿਚ",
        "redirectedfrom": "($1 ਤੋਂ ਰੀਡਿਰੈਕਟ)",
        "redirectpagesub": "ਰੀਡਿਰੈਕਟ ਸਫ਼ਾ",
+       "redirectto": "ਇਸ ਵੱਲ ਮੋੜੋ:",
        "lastmodifiedat": "ਇਸ ਸਫ਼ੇ ਵਿੱਚ ਆਖ਼ਰੀ ਸੋਧ $1 ਨੂੰ $2 ਵਜੇ ਹੋਈ।",
        "viewcount": "ਇਹ ਸਫ਼ਾ {{PLURAL:$1|ਇੱਕ ਵਾਰ|$1 ਵਾਰ}} ਵੇਖਿਆ ਗਿਆ।",
        "protectedpage": "ਸੁਰੱਖਿਅਤ ਸਫ਼ਾ",
        "pool-errorunknown": "ਅਣਜਾਣ ਗਲਤੀ",
        "aboutsite": "{{SITENAME}} ਬਾਰੇ",
        "aboutpage": "Project:ਬਾਰੇ",
-       "copyright": "ਸਮੱà¨\97ਰà©\80 $1 à¨¹à©\87ਠ à¨\89ਪਲੱਬਧ ਹੈ।",
+       "copyright": "à¨\95à©\81à¨\9d à¨¹à©\8bਰ à¨¨à¨¾ à¨²à¨¿à¨\96à©\87 à¨\9cਾਣ 'ਤà©\87 à¨¸à¨®à©±à¨\97ਰà©\80 $1 à¨¹à©\87ਠ à¨®à©\8cà¨\9cà©\82ਦ ਹੈ।",
        "copyrightpage": "{{ns:project}}:ਕਾਪੀਰਾਈਟ",
        "currentevents": "ਹਾਲ ਦੀਆਂ ਘਟਨਾਵਾਂ",
        "currentevents-url": "Project:ਹਾਲ ਦੀਆਂ ਘਟਨਾਵਾਂ",
        "policy-url": "Project:ਨੀਤੀ",
        "portal": "ਭਾਈਚਾਰਕ ਸੱਥ",
        "portal-url": "Project:ਸੱਥ",
-       "privacy": "ਪਰਾà¨\88ਵà©\87ਸà©\80 à¨ªà¨¾à¨²à¨¸ੀ",
-       "privacypage": "Project:ਪਰਾà¨\88ਵà©\87ਸà©\80 à¨ªà¨¾à¨²à¨¸ੀ",
+       "privacy": "ਪਰਦਾ à¨¨à©\80ਤੀ",
+       "privacypage": "Project:ਪਰਦਾ à¨¨à©\80ਤੀ",
        "badaccess": "ਮਨਜ਼ੂਰੀ ਗਲਤੀ",
        "badaccess-group0": "ਤੁਹਾਨੂੰ ਉਹ ਕਾਰਵਾਈ ਕਰਨ ਦੀ ਮਨਜ਼ੂਰੀ ਨਹੀਂ ਜਿਹਦੀ ਤੁਸੀਂ ਮੰਗ ਕੀਤੀ ਹੈ।",
        "badaccess-groups": "ਜੋ ਕਾਰਵਾਈ ਤੁਸੀਂ ਕਰਨੀ ਚਾਹੀ ਹੈ ਓਹ {{PLURAL:$2|ਇਸ ਸਮੂਹ|ਇਹਨਾਂ ਸਮੂਹਾਂ}} ਦੇ ਮੈਂਬਰ ਹੀ ਕਰ ਸਕਦੇ ਹਨ: $1",
        "youhavenewmessages": "ਤੁਹਾਡੇ ਲਈ $1। ($2)",
        "youhavenewmessagesfromusers": "{{PLURAL:$3|ਇੱਕ ਵਰਤੋਂਕਾਰ|$3 ਵਰਤੋਂਕਾਰਾਂ}} ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)।",
        "youhavenewmessagesmanyusers": "ਕਈ ਯੂਜ਼ਰ ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)।",
-       "newmessageslinkplural": "{{PLURAL:$1|ਇੱਕ ਨਵਾਂ ਸੁਨੇਹਾ|ਨਵੇਂ ਸੁਨੇਹੇ}} {{PLURAL:$1|ਹੈ|ਹਨ}}",
-       "newmessagesdifflinkplural": "ਆਖ਼ਰੀ {{PLURAL:$1|ਤਬਦੀਲੀ|ਤਬਦੀਲੀਆਂ}}",
+       "newmessageslinkplural": "{{PLURAL:$1|ਇੱਕ ਨਵਾਂ ਸੁਨੇਹਾ|999=ਨਵੇਂ ਸੁਨੇਹੇ}}",
+       "newmessagesdifflinkplural": "ਆਖ਼ਰੀ {{PLURAL:$1|ਤਬਦੀਲੀ|999=ਤਬਦੀਲੀਆਂ}}",
        "youhavenewmessagesmulti": "$1 ’ਤੇ ਤੁਹਾਡੇ ਲਈ ਨਵੇਂ ਸੁਨੇਹੇ ਹਨ",
        "editsection": "ਸੋਧੋ",
        "editold": "ਸੋਧ",
        "hidetoc": "ਓਹਲੇ",
        "collapsible-collapse": "ਸਮੇਟੋ",
        "collapsible-expand": "ਫੈਲਾਓ",
+       "confirmable-confirm": "ਕੀ {{GENDER:$1|ਤੁਹਾਨੂੰ}} ਪੂਰਾ ਵਿਸ਼ਵਾਸ ਹੈ?",
        "confirmable-yes": "ਹਾਂ",
        "confirmable-no": "ਨਹੀਂ",
        "thisisdeleted": "$1 ਵੇਖੋ ਜਾਂ ਮੁੜ ਸਟੋਰ ਕਰੋ",
        "sort-descending": "ਘਟਦਾ ਕ੍ਰਮ",
        "sort-ascending": "ਵਧਦਾ ਕ੍ਰਮ",
        "nstab-main": "ਸਫ਼ਾ",
-       "nstab-user": "ਯà©\82à¨\9c਼ਰ à¨¸à¨«à¨¼ਾ",
+       "nstab-user": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨µà¨°à¨\95ਾ",
        "nstab-media": "ਮੀਡੀਆ ਸਫ਼ਾ",
        "nstab-special": "ਖ਼ਾਸ ਸਫ਼ਾ",
        "nstab-project": "ਪਰੋਜੈਕਟ ਸਫ਼ਾ",
        "nospecialpagetext": "<strong>ਤੁਸੀਂ ਇੱਕ ਗ਼ਲਤ ਖ਼ਾਸ ਸਫ਼ੇ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਹੈ।</strong>\nਸਹੀ ਖ਼ਾਸ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ [[Special:SpecialPages|{{int:specialpages}}]] ’ਤੇ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।",
        "error": "ਗ਼ਲਤੀ",
        "databaseerror": "ਡਾਟਾਬੇਸ ਗਲਤੀ",
+       "databaseerror-text": "ਡਾਟਾਬੇਸ ਦੀ ਪੁੱਛ ਸਬੰਧੀ ਕੋਈ ਦੋਸ਼ ਵਾਪਰਿਆ ਹੈ।\nਇਹ ਸਾਫ਼ਟਵੇਅਰ ਵਿਚਲੇ ਕਿਸੇ ਮਾਂਙਣੂ ਵੱਲ ਇਸ਼ਾਰਾ ਹੋ ਸਕਦਾ ਹੈ।",
+       "databaseerror-textcl": "ਡਾਟਾਬੇਸ ਦੀ ਪੁੱਛ ਸਬੰਧੀ ਕੋਈ ਦੋਸ਼ ਵਾਪਰਿਆ ਹੈ।",
        "databaseerror-query": "ਪੁੱਛ-ਗਿੱਛ: $1",
        "databaseerror-function": "ਕਰਤੱਵ: $1",
        "databaseerror-error": "ਦੋਸ਼: $1",
        "invalidtitle-knownnamespace": "ਥਾਂ-ਨਾਮ \"$2\" ਅਤੇ ਲਿਖਤ \"$3\" ਵਾਲ਼ਾ ਗ਼ਲਤ ਸਿਰਲੇਖ",
        "invalidtitle-unknownnamespace": "ਅਣਜਾਣ ਨਾਂ-ਸਥਾਨ ਗਿਣਤੀ $1 ਅਤੇ ਲਿਖਤ $2 ਵਾਲ਼ਾ ਗ਼ਲਤ ਸਿਰਲੇਖ",
        "exception-nologin": "ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ",
-       "exception-nologin-text": "à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨\9cਾà¨\82 à¨\95ਾਰਵਾà¨\88 à¨¤à©\81ਹਾਡਾ à¨\87ਸ à¨µà¨¿à¨\95à©\80 â\80\99ਤà©\87 à¨²à¨¾à¨\97à¨\87ਨ à¨\95à©\80ਤਾ à¨¹à©\8bਣਾ à¨²à©\8bà©\9cਦà©\80 à¨¹à©\88।",
+       "exception-nologin-text": "à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨\9cਾà¨\82 à¨\95ਾਰਵਾà¨\88 à¨¤à©\81ੱà¨\95 à¨ªà©\81ੱà¨\9cਣ à¨µà¨¾à¨¸à¨¤à©\87 à¨®à¨¿à¨¹à¨°à¨¬à¨¾à¨¨à©\80 à¨\95ਰà¨\95à©\87 à¨¦à¨¾à¨\96਼ਲ à¨¹à©\8bਵà©\8b।",
        "virus-badscanner": "ਮੰਦਾ ਪ੍ਰਬੰਧ: ਅਣਜਾਣ ਵਾਇਰਸ ਸਕੈਨਰ: ''$1''",
        "virus-scanfailed": "ਸਕੈਨ ਫੇਲ੍ਹ ਹੈ (ਕੋਡ $1)",
        "virus-unknownscanner": "ਅਣਪਛਾਤਾ ਐਂਟੀਵਾਇਰਸ:",
        "welcomeuser": "$1 ਜੀ ਆਇਆਂ ਨੂੰ!",
        "welcomecreation-msg": "ਤੁਹਾਡਾ ਖਾਤਾ ਬਣ ਚੁੱਕਾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦ]] ਬਦਲਣੀ ਨਾ ਭੁੱਲੋ।",
        "yourname": "ਵਰਤੋਂਕਾਰ-ਨਾਂ:",
-       "userlogin-yourname": "ਯà©\82à¨\9c਼ਰ-ਨਾਂ",
-       "userlogin-yourname-ph": "à¨\86ਪਣਾ à¨¯à©\82à¨\9c਼ਰ-ਨਾਂ ਭਰੋ",
-       "createacct-another-username-ph": "ਯà©\82à¨\9c਼ਰ à¨¨à¨¾à¨\82 à¨¦à¨¿à¨\93",
+       "userlogin-yourname": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ ਨਾਂ",
+       "userlogin-yourname-ph": "à¨\86ਪਣਾ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ-ਨਾਂ ਭਰੋ",
+       "createacct-another-username-ph": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ-ਨਾà¨\82 à¨­à¨°à©\8b",
        "yourpassword": "ਪਾਸਵਰਡ:",
        "userlogin-yourpassword": "ਪਾਸਵਰਡ",
        "userlogin-yourpassword-ph": "ਆਪਣਾ ਪਾਸਵਰਡ ਦਿਉ",
        "nav-login-createaccount": "ਲਾਗਇਨ/ਖਾਤਾ ਬਣਾਓ",
        "userlogin": "ਲਾਗਇਨ/ਖਾਤਾ ਬਣਾਓ",
        "userloginnocreate": "ਲਾਗਇਨ",
-       "logout": "ਲਾà¨\97 à¨\86à¨\89à¨\9f",
-       "userlogout": "ਲਾà¨\97 à¨\86à¨\89à¨\9f",
+       "logout": "ਵਿਦਾà¨\88 à¨²à¨\89",
+       "userlogout": "ਵਿਦਾà¨\88 à¨²à¨\89",
        "notloggedin": "ਲਾਗਇਨ ਨਹੀਂ ਹੋ",
        "userlogin-noaccount": "ਖਾਤਾ ਨਹੀਂ ਹੈ?",
        "userlogin-joinproject": "{{SITENAME}} ਦਾ ਹਿੱਸਾ ਬਣੋ",
        "gotaccountlink": "ਲਾਗਇਨ",
        "userlogin-resetlink": "ਆਪਣੀ ਲਾਗਇਨ ਜਾਣਕਾਰੀ ਭੁੱਲ ਗਏ ਹੋ?",
        "userlogin-resetpassword-link": "ਆਪਣਾ ਪਾਸਵਰਡ ਭੁੱਲ ਗਏ ਹੋ?",
+       "userlogin-helplink2": "ਦਾਖ਼ਲ ਹੋਣ ਵਿਚ ਮਦਦ",
+       "userlogin-loggedin": "ਤੁਸੀਂ ਪਹਿਲੋਂ ਹੀ {{GENDER:$1|$1}} ਵਜੋਂ ਦਾਖ਼ਲ ਹੋ ਚੁੱਕੇ ਹੋਂ।\nਕਿਸੇ ਹੋਰ ਵਰਤੋਂਕਾਰ ਵਜੋਂ ਦਾਖ਼ਲ ਹੋਣ ਵਾਸਤੇ ਹੇਠ ਦਿੱਤਾ ਫਾਰਮ ਭਰੋ।",
        "userlogin-createanother": "ਹੋਰ ਖਾਤਾ ਬਣਾਓ",
        "createacct-emailrequired": "ਈਮੇਲ ਪਤਾ",
        "createacct-emailoptional": "ਈਮੇਲ ਪਤਾ (ਚੋਣਵਾਂ)",
        "createacct-benefit-body2": "{{PLURAL:$1|ਸਫ਼ਾ|ਸਫ਼ੇ}}",
        "createacct-benefit-body3": "ਹਾਲੀਆ {{PLURAL:$1|ਯੋਗਦਾਨੀ}}",
        "badretype": "ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੇ ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।",
-       "userexists": "ਯà©\82à¨\9c਼ਰ-ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ।",
+       "userexists": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ-ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ।",
        "loginerror": "ਲਾਗਇਨ ਗ਼ਲਤੀ",
        "createacct-error": "ਖਾਤਾ ਬਣਾਉਣ ਵਿਚ ਗਲਤੀ",
        "createaccounterror": "ਖਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: $1",
-       "nocookiesnew": "ਯà©\82à¨\9c਼ਰ à¨\85à¨\95ਾà¨\8aà¨\82à¨\9f à¨¬à¨£à¨¾à¨\87à¨\86 à¨\97ਿà¨\86 à¨¹à©\88, à¨ªà¨° à¨¤à©\81ਸà©\80à¨\82 à¨²à¨¾à¨\97à¨\87ਨ à¨¨à¨¹à©\80à¨\82 à¨\95à©\80ਤਾ à¨¹à©\88।{{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.",
+       "nocookiesnew": "ਵਰਤà©\8bà¨\82Kà¨\86ਰ à¨\96ਾਤਾ à¨¬à¨£à¨¾à¨\87à¨\86 à¨\97ਿà¨\86 à¨¸à©\80 à¨ªà¨° à¨¤à©\81ਸà©\80à¨\82 à¨¦à¨¾à¨\96਼ਲ à¨¨à¨¹à©\80à¨\82 à¨¹à©\8bà¨\8f।{{SITENAME}} à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰਾà¨\82 à¨¨à©\82à©° à¨¦à¨¾à¨\96਼ਲ à¨\95ਰਨ à¨µà¨¾à¨¸à¨¤à©\87 à¨\95à©\81ੱà¨\95à©\80à¨\86à¨\82 à¨µà¨°à¨¤à¨¦à©\80 à¨¹à©\88। à¨¤à©\81ਸà©\80à¨\82 à¨\95à©\81ੱà¨\95à©\80à¨\86à¨\82 à¨¬à©°à¨¦ à¨\95à©\80ਤà©\80à¨\86à¨\82 à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¹à¨¨à¥¤ à¨®à¨¿à¨¹à¨°à¨¬à¨¾à¨¨à©\80 à¨\95ਰà¨\95à©\87 à¨\87ਹਨਾà¨\82 à¨¨à©\82à©° à¨\9aਲਾà¨\89, à¨«à©\87ਰ à¨\86ਪਣà©\87 à¨¨à¨µà©\87à¨\82 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ-ਨਾà¨\82 à¨ªà¨\9bਾਣ-ਸ਼ਬਦ à¨¨à¨¾à¨²à¨¼ à¨¦à¨¾à¨\96਼ਲ à¨¹à©\8bਵà©\8b।",
        "nocookieslogin": "{{SITENAME}} ਯੂਜ਼ਰਾਂ ਨੂੰ ਲਾਗਇਨ ਕਰਨ ਲਈ ਕੂਕੀਜ਼ ਵਰਤਦੀ ਹੈ। ਤੁਹਾਡੇ ਕੂਕੀਜ਼ ਆਯੋਗ ਕੀਤੇ ਹੋਏ ਹਨ। ਉਨ੍ਹਾਂ ਨੂੰ ਯੋਗ ਕਰਕੇ ਮੁੜ ਟਰਾਈ ਕਰੋ।",
        "nocookiesfornew": "ਵਰਤੋਂਕਾਰ ਖਾਤਾ ਨਹੀਂ ਬਣਾਇਆ ਗਿਆ ਕਿਉਂਕਿ ਅਸੀਂ ਇਹਦੇ ਸਰੋਤ ਨੂੰ ਤਸਦੀਕ ਨਹੀਂ ਕਰ ਸਕੇ।\nਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡੀਆਂ ਕੁਕੀਆਂ ਕੰਮ ਕਰ ਰਹੀਆਂ ਹਨ, ਸਫ਼ਾ ਫੇਰ ਲੋਡ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
        "noname": "ਤੁਸੀਂ ਇੱਕ ਸਹੀ ਯੂਜ਼ਰ-ਨਾਂ ਨਹੀਂ ਦਿੱਤਾ।",
        "wrongpassword": "ਗ਼ਲਤ ਪਾਸਵਰਡ ਦਿੱਤਾ ਹੈ। ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।",
        "wrongpasswordempty": "ਖ਼ਾਲੀ ਪਾਸਵਰਡ ਦਿੱਤਾ ਹੈ। ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।",
        "passwordtooshort": "ਪਾਸਵਰਡ {{PLURAL:$1|1 ਅੱਖਰ|$1 ਅੱਖਰਾਂ}} ਦਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ।",
-       "password-name-match": "ਤà©\81ਹਾਡਾ à¨ªà¨¾à¨¸à¨µà¨°à¨¡ à¨¤à©\81ਹਾਡà©\87 à¨¯à©\82à¨\9c਼ਰ ਨਾਂ ਤੋਂ ਵੱਖਰਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
+       "password-name-match": "ਤà©\81ਹਾਡਾ à¨ªà¨\9bਾਣ-ਸ਼ਬਦ à¨¤à©\81ਹਾਡà©\87 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਨਾਂ ਤੋਂ ਵੱਖਰਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
        "password-login-forbidden": "ਇਹ ਯੂਜ਼ਰ-ਨਾਂ ਅਤੇ ਪਾਸਵਰਡ ਵਰਤਣ ਦੀ ਮਨਾਹੀ ਹੈ।",
        "mailmypassword": "ਨਵਾਂ ਪਾਸਵਰਡ ਈ-ਮੇਲ ਕਰੋ",
        "passwordremindertitle": "{{SITENAME}} ਲਈ ਪਾਸਵਰਡ ਯਾਦ ਰੱਖੋ",
        "createaccount-text": "ਕਿਸੇ ਨੇ \"$2\" ਮੈਂਬਰ-ਨਾਮ ਅਤੇ \"$3\" ਪਾਸਵਰਡ ਨਾਲ਼ {{SITENAME}} ($4) ਤੇ, ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਵਰਤਦੇ ਹੋਏ, ਖਾਤਾ ਬਣਾਇਆ ਹੈ।\nਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਣਾ ਚਾਹੀਦਾ ਹੈ।\n\nਜੇ ਇਹ ਖਾਤਾ ਗ਼ਲਤੀ ਨਾਲ਼ ਬਣ ਗਿਆ ਹੈ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਸਕਦੇ ਹੋ।",
        "login-throttled": "ਤੁਸੀਂ ਬਹੁਤ ਸਾਰੀਆਂ ਤਾਜ਼ਾ ਲਾਗਇਨ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਹਨ।\nਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ $1 ਉਡੀਕ ਕਰੋ ਜੀ।",
        "login-abort-generic": "ਤੁਹਾਡਾ ਦਾਖ਼ਲਾ ਨਾਕਾਮ ਸੀ - ਅਧੂਰਾ ਛੱਡਿਆ",
+       "login-migrated-generic": "ਤੁਹਾਡੇ ਖਾਤੇ ਦੀ ਥਾਂ ਬਦਲ ਦਿੱਤੀ ਗਈ ਹੈ ਅਤੇ ਤੁਹਾਡਾ ਵਰਤੋਂਕਾਰ-ਨਾਂ ਹੁਣ ਇਸ ਵਿਕੀ 'ਤੇ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "loginlanguagelabel": "ਭਾਸ਼ਾ: $1",
        "suspicious-userlogout": "ਤੁਹਾਡੀ ਵਿਦਾਇਗੀ ਦੀ ਬੇਨਤੀ ਨਕਾਰ ਦਿੱਤੀ ਗਈ ਕਿਉਂਕਿ ਲੱਗਦਾ ਹੈ ਕਿ ਇਹ ਕਿਸੇ ਟੁੱਟੇ ਹੋਏ ਬਰਾਊਜ਼ਰ ਜਾਂ ਕੈਸ਼ ਹੋਈ ਪ੍ਰਾਕਸੀ ਤੋਂ ਭੇਜੀ ਗਈ ਸੀ।",
        "createacct-another-realname-tip": "ਅਸਲੀ ਨਾਂ ਚੋਣਵਾਂ ਹੈ।\nਜੇਕਰ ਤੁਸੀਂ ਇਹ ਦਿੱਤਾ ਹੈ ਤਾਂ ਤੁਹਾਡੇ ਕੰਮ ਵਾਸਤੇ ਗੁਣ ਦੇ ਤੌਰ ਉੱਤੇ ਵਰਤਿਆ ਜਾਵੇਗਾ।",
        "pt-login": "ਲਾਗ ਇਨ",
        "pt-login-button": "ਲਾਗ ਇਨ",
        "pt-createaccount": "ਖਾਤਾ ਬਣਾਓ",
-       "pt-userlogout": "ਲਾà¨\97 à¨\86à¨\89à¨\9f",
+       "pt-userlogout": "ਬਾਹਰ à¨\86à¨\89",
        "php-mail-error-unknown": "PHP ਦੇ ਮੇਲ() ਕਰਜ ਵਿੱਚ ਅਣਜਾਣ ਦੋਸ਼",
        "user-mail-no-addy": "ਬਿਨਾਂ ਈ-ਮੇਲ ਪਤਾ ਦਿੱਤੇ ਈ-ਮੇਲ ਭੇਜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ।",
        "user-mail-no-body": "ਖ਼ਾਲੀ ਜਾਂ ਬਹੁਤੀ ਛੋਟੀ ਸਮੱਗਰੀ ਨਾਲ਼ ਈਮੇਲ ਭੇਜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਗਈ",
-       "changepassword": "ਪਾਸਵਰਡ ਬਦਲੋ",
+       "changepassword": "ਪà¨\9bਾਣ-ਸ਼ਬਦ ਬਦਲੋ",
        "resetpass_announce": "ਲਾਗਇਨ ਪੂਰਾ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ ਨਵਾਂ ਪਾਸਵਰਡ ਬਣਾਉਣਾ ਪਵੇਗਾ।",
-       "resetpass_header": "à¨\85à¨\95ਾà¨\8aà¨\82à¨\9f à¨ªà¨¾à¨¸à¨µà¨°à¨¡ ਬਦਲੋ",
-       "oldpassword": "ਪà©\81ਰਾਣਾ à¨ªà¨¾à¨¸à¨µà¨°à¨¡:",
+       "resetpass_header": "à¨\96ਾਤà©\87 à¨¦à¨¾ à¨ªà¨\9bਾਣ-ਸ਼ਬਦ ਬਦਲੋ",
+       "oldpassword": "ਪà©\81ਰਾਣਾ à¨ªà¨\9bਾਣ-ਸ਼ਬਦ:",
        "newpassword": "ਨਵਾਂ ਪਾਸਵਰਡ:",
        "retypenew": "ਨਵਾਂ ਪਾਸਵਰਡ ਮੁੜ-ਲਿਖੋ:",
        "resetpass_submit": "ਪਾਸਵਰਡ ਸੈੱਟ ਕਰੋ ਅਤੇ ਲਾਗਇਨ ਕਰੋ",
        "changepassword-success": "ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਠੀਕ ਤਰ੍ਹਾਂ ਬਦਲਿਆ ਜਾ ਚੁੱਕਾ ਹੈ!",
+       "changepassword-throttled": "ਤੁਸੀਂ ਦਾਖ਼ਲ ਹੋਣ ਦੀਆਂ ਬਹੁਤ ਸਾਰੀਆਂ ਤਾਜ਼ਾ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਹਨ।\nਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ $1 ਉਡੀਕ ਕਰੋ ਜੀ।",
        "resetpass_forbidden": "ਪਾਸਵਰਡ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ",
        "resetpass-no-info": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।",
-       "resetpass-submit-loggedin": "ਪਾਸਵਰਡ ਬਦਲੋ",
+       "resetpass-submit-loggedin": "ਪà¨\9bਾਣ-ਸ਼ਬਦ ਬਦਲੋ",
        "resetpass-submit-cancel": "ਰੱਦ ਕਰੋ",
        "resetpass-wrong-oldpass": "ਗ਼ਲਤ ਆਰਜ਼ੀ ਜਾਂ ਚਾਲੂ ਪਾਸਵਰਡ।\nਸ਼ਾਇਦ ਤੁਸੀਂ ਕਾਮਯਾਬੀ ਨਾਲ਼ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲ ਚੁੱਕੇ ਹੋ ਜਾਂ ਆਰਜ਼ੀ ਪਾਸਵਰਡ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਸੀ।",
+       "resetpass-recycled": "ਆਪਣਾ ਨਵਾਂ ਪਛਾਣ-ਸ਼ਬਦ ਮੌਜੂਦਾ ਪਛਾਣ-ਸ਼ਬਦ ਤੋਂ ਵੱਖਰਾ ਬਣਾਉ ਜੀ।",
+       "resetpass-temp-emailed": "ਤੁਸੀਂ ਈਮੇਲ ਕੀਤੇ ਇੱਕ ਆਰਜ਼ੀ ਕੋਡ ਨਾਲ਼ ਦਾਖ਼ਲ ਹੋਏ।\nਦਾਖ਼ਲਾ ਕਾਰਵਾਈ ਮੁਕਾਉਣ ਵਾਸਤੇ ਤੁਹਾਨੂੰ ਇੱਥੇ ਇੱਕ ਨਵਾਂ ਪਛਾਣ-ਸ਼ਬਦ ਬਣਾਉਣਾ ਪਵੇਗਾ:",
        "resetpass-temp-password": "ਆਰਜ਼ੀ ਪਾਸਵਰਡ:",
        "resetpass-abort-generic": "ਇੱਕ ਐਕਸਟੈਂਸ਼ਨ ਵੱਲੋਂ ਪਾਸਵਰਡ ਦੀ ਤਬਦੀਲੀ ਰੱਦ ਕੀਤੀ ਗਈ",
+       "resetpass-expired": "ਤੁਹਾਡੇ ਪਛਾਣ-ਸ਼ਬਦ ਦੀ ਮਿਆਦ ਮੁੱਕ ਗਈ ਹੈ। ਦਾਖ਼ਲ ਹੋਣ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਨਵਾਂ ਪਛਾਣ-ਸ਼ਬਦ ਬਣਾਉ।",
+       "resetpass-expired-soft": "ਤੁਹਾਡੇ ਪਛਾਣ-ਸ਼ਬਦ ਦੀ ਮਿਆਦ ਮੁੱਕ ਗਈ ਹੈ ਅਤੇ ਨਵਾਂ ਬਣਾਉਣਾ ਪਵੇਗਾ। ਕੋਈ ਨਵਾਂ ਪਛਾਣ-ਸ਼ਬਦ ਚੁਣੋ ਜੀ ਜਾਂ ਬਾਅਦ 'ਚ ਬਣਾਉਣ ਵਾਸਤੇ \"{{int:resetpass-submit-cancel}}\" ਦੱਬੋ।",
+       "resetpass-validity-soft": "ਤੁਹਾਡਾ ਪਛਾਣ-ਸ਼ਬਦ ਸਹੀ ਨਹੀਂ ਹੈ: $1\n\nਮਿਹਰਬਾਨੀ ਕਰਕੇ ਕੋਈ ਨਵਾਂ ਪਛਾਣ-ਸ਼ਬਦ ਚੁਣੋ ਜਾਂ ਬਾਅਦ 'ਚ ਬਣਾਉਣ ਵਾਸਤੇ \"{{int:resetpass-submit-cancel}}\" ਦੱਬੋ।",
        "passwordreset": "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ",
        "passwordreset-text-one": "ਪਾਸਵਰਡ ਦੁਬਾਰਾ ਬਣਾਉਣ ਲਈ ਇਹ ਫ਼ਾਰਮ ਭਰੋ।",
        "passwordreset-text-many": "{{PLURAL:$1|ਈ-ਮੇਲ ਜ਼ਰੀਏ ਆਪਣਾ ਆਰਜ਼ੀ ਪਾਸਵਰਡ ਹਾਸਲ ਕਰਨ ਲਈ ਕੋਈ ਇੱਕ ਥਾਂ ਭਰੋ।}}",
        "passwordreset-legend": "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ",
        "passwordreset-disabled": "ਇਸ ਵਿਕੀ ਤੇ ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਬੰਦ ਕੀਤੇ ਗਏ ਹਨ।",
        "passwordreset-emaildisabled": "ਇਹ ਵਿਕਿ ਉੱਤੇ ਈਮੇਲ ਫੀਚਰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।",
-       "passwordreset-username": "ਯà©\82à¨\9c਼ਰ-ਨਾਂ:",
+       "passwordreset-username": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ ਨਾਂ:",
        "passwordreset-domain": "ਡੋਮੇਨ:",
        "passwordreset-capture": "ਨਤੀਜੇ ਵਜੋਂ ਬਣਦੀ ਈਮੇਲ ਵੇਖੋ?",
        "passwordreset-capture-help": "ਜੇਕਰ ਤੁਸੀਂ ਇਹ ਬਕਸਾ ਸਹੀ ਕਰਦੇ ਹੋ ਤਾਂ ਇਹ ਈਮੇਲ (ਅਸਥਾਈ ਪਾਸਵਰਡ ਸਮੇਤ) ਤੁਹਾਨੂੰ ਵਿਖਾਈ ਜਾਵੇਗੀ ਅਤੇ ਵਰਤੋਂਕਾਰ ਨੂੰ ਵੀ ਭੇਜੀ ਜਾਵੇਗੀ।",
        "passwordreset-email": "ਈਮੇਲ ਐਡਰੈੱਸ:",
        "passwordreset-emailtitle": "{{SITENAME}} ਤੇ ਖਾਤੇ ਦੀ ਜਾਣਕਾਰੀ",
        "passwordreset-emailtext-ip": "ਕਿਸੇ ਨੇ (ਸ਼ਾਇਦ ਤੁਸੀਂ, IP ਪਤਾ $1 ਤੋਂ) {{SITENAME}}\n($4) ਲਈ ਖਾਤਾ ਤਫ਼ਸੀਲ ਯਾਦ-ਦਹਾਨੀ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਇਹ {{PLURAL:\n$3|ਖਾਤਾ ਇਸ ਈ-ਮੇਲ ਪਤੇ ਨਾਲ਼ ਜੁੜਿਆ ਹੈ|ਖਾਤੇ ਇਸ ਈ-ਮੇਲ ਪਤੇ ਨਾਲ਼ ਜੁੜੇ ਹਨ}}:\n$2\n\nਇਹ ਆਰਜ਼ੀ ਪਾਸਵਰਡ\n{{PLURAL:$5|ਇੱਕ ਦਿਨ|$5 ਦਿਨਾਂ}} ਵਿਚ ਖ਼ਤਮ ਹੋ {{PLURAL:$3|ਜਾਵੇਗਾ|ਜਾਣਗੇ}}।\nਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਨਵਾਂ ਪਾਸਵਰਡ ਬਣਾਉਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਸੀ ਜਾਂ ਜੇ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਯਾਦ ਹੈ ਅਤੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਦਲਣਾ ਨਹੀਂ ਚਾਹੁੰਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖ ਸਕਦੇ ਹੋ।",
+       "passwordreset-emailtext-user": "{{SITENAME}} 'ਤੇ User $1 ਨੇ ਤੁਹਾਡੇ {{SITENAME}} ($4) ਉਤਲੇ ਪਛਾਣ-ਸ਼ਬਦ ਨੂੰ ਮੁੜ-ਬਣਾਉਣ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਇਸ ਈਮੇਲ ਪਤੇ ਨਾਲ਼ ਹੇਠ ਲਿਖੇ {{PLURAL:$3|ਖਾਤੇ|ਖਾਤਿਆਂ}} ਦਾ ਵਾਸਤਾ ਹੈ:\n\n$2\n\n{{PLURAL:$3|ਇਸ ਆਰਜ਼ੀ ਪਛਾਣ-ਸ਼ਬਦ|ਇਹਨਾਂ ਆਰਜ਼ੀ ਪਛਾਣ-ਸ਼ਬਦਾਂ}} ਦੀ ਮਿਆਦ {{PLURAL:$5|ਇੱਕ ਦਿਨ|$5 ਦਿਨਾਂ}} 'ਚ ਮੁੱਕ ਜਾਵੇਗੀ।\nਤੁਹਾਨੂੰ ਹੁਣੇ ਦਾਖ਼ਲ ਹੋ ਕੇ ਕੋਈ ਨਵਾਂ ਪਛਾਣ-ਸ਼ਬਦ ਬਣਾ ਲੈਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇਕਰ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਹੈ ਜਾਂ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਹਿਲਾ ਪਛਾਣ-ਸ਼ਬਦ ਯਾਦ ਆ ਗਿਆ ਹੈ ਅਤੇ ਹੁਣ ਤੁਸੀਂ ਉਹਨੂੰ ਬਦਲ਼ਨਾ ਨਹੀਂ ਲੋਚਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਅਣਡਿੱਠਾ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਛਾਣ-ਸ਼ਬਦ ਵਰਤਦੇ ਰਹਿ ਸਕਦੇ ਹੋ।",
        "passwordreset-emailelement": "ਯੂਜ਼ਰ-ਨਾਂ: $1\nਆਰਜ਼ੀ ਪਾਸਵਰਡ: $2",
        "passwordreset-emailsent": "ਇੱਕ ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਈ-ਮੇਲ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।",
        "passwordreset-emailsent-capture": "ਇੱਕ ਯਾਦ-ਦਹਾਨੀ ਈ-ਮੇਲ, ਜਿਹੜੀ ਕਿ ਹੇਠਾਂ ਦਿੱਸ ਰਹੀ ਹੈ, ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।",
+       "passwordreset-emailerror-capture": "ਪਛਾਣ-ਸ਼ਬਦ ਮੁੜ ਬਣਾਉਣ ਵਾਸਤੇ ਈਮੇਲ ਤਿਆਰ ਹੋ ਗਈ ਸੀ, ਜੋ ਹੇਠਾਂ ਵਿਖਾਈ ਗਈ ਹੈ, ਪਰ ਇਹਨੂੰ {{GENDER:$2|ਵਰਤੋਂਕਾਰ}} ਵੱਲ ਨਹੀਂ ਘੱਲਿਆ ਜਾ ਸਕਿਆ: $1",
        "changeemail": "ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ ਬਦਲੋ",
-       "changeemail-header": "ਖਾਤੇ ਵਾਲਾ ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ ਬਦਲੋ",
        "changeemail-text": "ਆਪਣਾ ਈ-ਮੇਲ ਪਤਾ ਬਦਲਣ ਲਈ ਇਹ ਫ਼ਾਰਮ ਮੁਕੰਮਲ ਕਰੋ। ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਤਸਦੀਕ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖ਼ਲ ਕਰਨਾ ਪਵੇਗਾ।",
        "changeemail-no-info": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।",
        "changeemail-oldemail": "ਮੌਜੂਦਾ ਈਮੇਲ ਸਿਰਨਾਵਾਂ:",
        "changeemail-none": "(ਕੋਈ ਨਹੀਂ)",
        "changeemail-password": "ਤੁਹਾਡਾ {{SITENAME}} ਪਾਸਵਰਡ:",
        "changeemail-submit": "ਈ-ਮੇਲ ਬਦਲੋ",
-       "changeemail-cancel": "ਰੱਦ ਕਰੋ",
+       "changeemail-throttled": "ਤੁਸੀਂ ਦਾਖ਼ਲ ਹੋਣ ਦੀਆਂ ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਹਨ।\nਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ $1 ਉਡੀਕ ਕਰੋ ਜੀ।",
        "resettokens": "ਟੋਕਨ ਮੁੜ-ਸੈੱਟ ਕਰੋ",
+       "resettokens-text": "ਤੁਸੀਂ ਆਪਣੀਆਂ ਨਿਸ਼ਾਨੀਆਂ, ਜੋ ਤੁਹਾਡੇ ਖਾਤੇ ਨਾਲ਼ ਜੁੜੇ ਖ਼ਾਸ ਨਿੱਜੀ ਅੰਕੜਿਆਂ ਤੱਕ ਪੁੱਜਣ ਵਾਸਤੇ ਇਜਾਜ਼ਤ ਦਿੰਦੀਆਂ ਹਨ, ਨੂੰ ਇੱਥੇ ਮੁੜ-ਬਣਾ ਸਕਦੇ ਹੋ।\n\nਤੁਹਾਨੂੰ ਇਹ ਤਾਂ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ ਜੇਕਰ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਰੱਬ-ਸਬੱਬੀ ਕਿਸੇ ਨਾਲ਼ ਸਾਂਝਾ ਕਰ ਦਿੱਤਾ ਜਾਂ ਤੁਹਾਡਾ ਖਾਤਾ ਖ਼ਤਰੇ ਵਿੱਚ ਆ ਗਿਆ ਹੈ।",
+       "resettokens-no-tokens": "ਨਵੀਆਂ ਬਣਾਉਣ ਵਾਸਤੇ ਕੋਈ ਨਿਸ਼ਾਨੀਆਂ ਨਹੀਂ ਹਨ।",
+       "resettokens-legend": "ਨਿਸ਼ਾਨੀਆਂ ਮੁੜ ਬਣਾਉ",
        "resettokens-tokens": "ਟੋਕਨ:",
        "resettokens-token-label": "$1 (ਚਾਲੂ ਮੁੱਲ: $2)",
+       "resettokens-done": "ਨਿਸ਼ਾਨੀਆਂ ਮੁੜ ਬਣਾਈਆਂ ਗਈਆਂ।",
        "resettokens-resetbutton": "ਚੁਣੇ ਹੋਏ ਟੋਕਨ ਮੁੜ ਸੈੱਟ ਕਰੋ",
        "bold_sample": "ਗੂੜੀ ਲਿਖਤ",
        "bold_tip": "ਗੂੜੇ ਅੱਖਰ",
        "subject": "ਵਿਸ਼ਾ/ਹੈੱਡਲਾਈਨ:",
        "minoredit": "ਇਹ ਇੱਕ ਛੋਟੀ ਸੋਧ ਹੈ",
        "watchthis": "ਇਸ ਸਫ਼ੇ ’ਤੇ ਨਜ਼ਰ ਰੱਖੋ",
-       "savearticle": "ਸਫ਼ਾ à¨¸à©°à¨­à¨¾à¨²ੋ",
+       "savearticle": "ਸਫ਼ਾ à¨¸à¨¾à¨\82ਭੋ",
        "preview": "ਝਲਕ",
        "showpreview": "ਝਲਕ ਵਿਖਾਓ",
-       "showdiff": "ਤਬਦà©\80ਲà©\80à¨\86à¨\82 à¨µà¨\96ਾà¨\93",
-       "anoneditwarning": "'''à¨\96਼ਬਰਦਾਰ:''' à¨¤à©\81ਸà©\80à¨\82 à¨²à¨¾à¨\97à¨\87ਨ à¨¨à¨¹à©\80à¨\82 à¨\95à©\80ਤਾ à¨¹à©\8bà¨\87à¨\86। à¨¤à©\81ਹਾਡਾ IP à¨ªà¨¤à¨¾ à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¦à©\87 à¨\85ਤà©\80ਤ à¨µà¨¿à©±à¨\9a à¨°à¨¿à¨\95ਾਰਡ à¨\95à©\80ਤਾ ਜਾਵੇਗਾ।",
+       "showdiff": "ਤਬਦà©\80ਲà©\80à¨\86à¨\82 à¨µà¨¿à¨\96ਾà¨\89",
+       "anoneditwarning": "'''à¨\96਼ਬਰਦਾਰ:''' à¨¤à©\81ਸà©\80à¨\82 à¨¦à¨¾à¨\96਼ਲ à¨¨à¨¹à©\80à¨\82 à¨¹à©\8b। à¨\95à©\8bà¨\88 à¨µà©\80 à¨¸à©\8bਧ à¨\95ਰਨ 'ਤà©\87 à¨¤à©\81ਹਾਡਾ à¨\86à¨\88.ਪà©\80. à¨ªà¨¤à¨¾ à¨²à©\8bà¨\95ਾà¨\82 à¨¨à©\82à©° à¨µà¨¿à¨\96ਾà¨\88 à¨¦à©\87ਵà©\87à¨\97ਾ। à¨\9cà©\87à¨\95ਰ à¨¤à©\81ਸà©\80à¨\82 <strong>[$1 à¨¦à¨¾à¨\96਼ਲ à¨¹à©\81ੰਦà©\87 à¨¹à©\8b]</strong> à¨\9cਾà¨\82 <strong>[$2 à¨\96ਾਤਾ à¨¬à¨£à¨¾à¨\89à¨\82ਦà©\87 à¨¹à©\8b]</strong> à¨¤à¨¾à¨\82 à¨¤à©\81ਹਾਡà©\80à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨¦à¨¾ à¨¸à¨¿à¨¹à¨°à¨¾, à¨¹à©\8bਰ à¨«à¨¼à¨¾à¨\87ਦਿà¨\86à¨\82 à¨¸à¨®à©\87ਤ, à¨¤à©\81ਹਾਡà©\87 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ-ਨਾà¨\82 à¨¸à¨¿à¨° à¨¦à¨¿à©±ਤਾ ਜਾਵੇਗਾ।",
        "anonpreviewwarning": "''ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ। ਤਬਦੀਲੀ ਸਾਂਭਣ ਨਾਲ਼ ਤੁਹਾਡਾ IP ਪਤਾ ਸਫ਼ੇ ਦੇ ਸੋਧ ਅਤੀਤ ਵਿਚ ਰਿਕਾਰਡ ਹੋ ਜਾਵੇਗਾ।''",
        "missingsummary": "'''ਯਾਦ-ਦਹਾਨੀ:''' ਤੁਸੀਂ ਸੋਧ ਸਾਰ ਮੁਹੱਈਆ ਨਹੀਂ ਕਰਵਾਇਆ। ਜੇ ਤੁਸੀਂ \"{{int:savearticle}}\" ਤੇ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕੀਤਾ ਤਾਂ ਤੁਹਾਡਾ ਸਫ਼ਾ ਇਸਦੇ ਬਿਨਾਂ ਹੀ ਸਾਂਭਿਆ ਜਾਵੇਗਾ।",
        "missingcommenttext": "ਹੇਠਾਂ ਇੱਕ ਟਿੱਪਣੀ ਦਿਓ।",
        "pagehist": "ਸਫ਼ਾ ਅਤੀਤ",
        "deletedhist": "ਹਟਾਇਆ ਗਿਆ ਅਤੀਤ",
        "revdelete-hide-current": "ਤਾਰੀਖ $2, $1 ਦੀ ਚੀਜ਼ ਲੁਕਾਉਣ ਵਿਚ ਗ਼ਲਤੀ: ਇਹ ਮੌਜੂਦਾ ਦੁਹਰਾਈ ਹੈ।\nਇਹ ਲੁਕਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ।",
+       "revdelete-modify-missing": "$1 ਸ਼ਨਾਖ਼ਤ ਵਾਲ਼ੀ ਚੀਜ਼ ਬਦਲਦਿਆਂ ਦੋਸ਼ ਆਇਆ: ਇਹ ਤੱਥ-ਅਧਾਰ 'ਚ ਹੈ ਹੀ ਨਹੀਂ!",
        "revdelete-otherreason": "ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:",
        "revdelete-reasonotherlist": "ਹੋਰ ਕਾਰਨ",
        "revdelete-edit-reasonlist": "ਮਿਟਾਏ ਜਾਣ ਦੇ ਕਾਰਨ ਸੋਧੋ",
        "mergehistory-empty": "ਕੋਈ ਰੀਵਿਜ਼ਨ ਰਲ਼ਾਈ ਨਹੀ ਜਾ ਸਕਦੀ।",
        "mergehistory-success": "[[:$1]] {{PLURAL:|ਦੀ|ਦੀਆਂ}} $3 {{PLURAL:$3|ਰੀਵਿਜ਼ਨ|ਰੀਵਿਜ਼ਨਾਂ}} ਕਾਮਯਾਬੀ ਨਾਲ਼ [[:$2]] ਵਿਚ {{PLURAL:$3|ਰਲ਼ਾਈ|ਰਲ਼ਾਈਆਂ}}।",
        "mergehistory-no-source": "ਸਰੋਤ ਸਫ਼ਾ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
+       "mergehistory-no-destination": "ਨੀਯਤ ਸਫ਼ਾ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "mergehistory-invalid-source": "ਸਰੋਤ ਸਫ਼ਾ ਇੱਕ ਸਹੀ ਸਿਰਲੇਖ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
        "mergehistory-invalid-destination": "ਮੰਜ਼ਿਲ ਸਫ਼ਾ ਇੱਕ ਸਹੀ ਸਿਰਲੇਖ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
        "mergehistory-autocomment": "[[:$1]] ਨੂੰ [[:$2]] ਵਿੱਚ ਰਲ਼ਾਇਆ",
        "difference-multipage": "(ਦੋ ਸਫ਼ਿਆਂ ਵਿਚਕਾਰ ਫ਼ਰਕ)",
        "lineno": "ਲਾਈਨ $1:",
        "compareselectedversions": "ਚੁਣੇ ਵਰਜਨਾਂ ਦੀ ਤੁਲਨਾ",
-       "showhideselectedversions": "à¨\9aà©\81ਣà©\87 à¨°à©\80ਵਿà¨\9c਼ਨ à¨µà¨\96ਾà¨\93/ਲà©\81à¨\95ਾà¨\93",
+       "showhideselectedversions": "à¨\9aà©\81ਣà©\80à¨\86à¨\82 à¨¸à©\81ਧਾà¨\88à¨\86à¨\82 à¨¦à©\80 à¨¦à¨¿à¨¸à¨£à¨¯à©\8bà¨\97ਤਾ à¨¬à¨¦à¨²à©\8b",
        "editundo": "ਰੱਦ ਕਰੋ",
        "diff-empty": "(ਕੋਈ ਫ਼ਰਕ ਨਹੀਂ)",
        "searchresults": "ਖੋਜ ਨਤੀਜੇ",
        "search-result-category-size": "{{PLURAL:$1|1 ਮੈਂਬਰ|$1 ਮੈਂਬਰ}} ({{PLURAL:$2|1 ਉਪਸ਼੍ਰੇਣੀ|$2 ਉਪਸ਼੍ਰੇਣੀਆਂ}}, {{PLURAL:$3|1 ਫ਼ਾਈਲ|$3 ਫ਼ਾਈਲਾਂ}})",
        "search-redirect": "($1 ਰੀਡਿਰੈਕਟ)",
        "search-section": "(ਹਿੱਸਾ $1)",
+       "search-file-match": "(ਫ਼ਾਈਲ ਦੀ ਸਮੱਗਰੀ ਨਾਲ਼ ਰਲ਼ਦਾ-ਮਿਲ਼ਦਾ)",
        "search-suggest": "ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਸੀ: $1",
        "search-interwiki-caption": "ਸਾਥੀ ਪ੍ਰੋਜੈਕਟ",
-       "search-interwiki-default": "$1 ਨਤੀਜੇ:",
+       "search-interwiki-default": "$1 à¨¤à©\8bà¨\82 à¨¨à¨¤à©\80à¨\9cà©\87:",
        "search-interwiki-more": "(ਹੋਰ)",
        "search-relatedarticle": "ਸਬੰਧਤ",
        "searchrelated": "ਸਬੰਧਤ",
        "searchall": "ਸਭ",
        "showingresults": "ਹੇਠਾਂ #'''$2''' ਨਾਲ਼ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ {{PLURAL:\n$1|'''1''' ਨਤੀਜਾ|'''$1''' ਤੱਕ ਨਤੀਜੇ}} ਵਖਾਓ।",
-       "showingresultsheader": "'''$4''' ਵਾਸਤੇ {{PLURAL:$5|'''$3''' ਵਿੱਚੋਂ '''$1''' ਨਤੀਜੇ|'''$3''' ਵਿੱਚੋਂ '''$1 - $2''' ਨਤੀਜੇ}}",
        "search-nonefound": "ਤੁਹਾਡੀ ਖੋਜ ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਮਿਲੇ।",
        "powersearch-legend": "ਤਕਨੀਕੀ ਖੋਜ",
        "powersearch-ns": "ਨੇਮ-ਸਪੇਸ ਵਿੱਚ ਖੋਜ:",
        "powersearch-togglelabel": "ਜਾਂਚੋ:",
        "powersearch-toggleall": "ਸਭ",
        "powersearch-togglenone": "ਕੋਈ ਨਹੀਂ",
+       "powersearch-remember": "ਇਸ ਚੋਣ ਨੂੰ ਅੱਗੋਂ ਦੀਆਂ ਭਾਲ਼ਾਂ ਵਾਸਤੇ ਯਾਦ ਰੱਖੋ",
        "search-external": "ਬਾਹਰੀ ਖੋਜ",
        "search-error": "ਖੋਜ ਕਰਦੇ ਵਕਤ ਇੱਕ ਦੋਸ਼ ਮਿਲਿਆ:$1",
-       "preferences": "ਪਸੰਦਾਂ",
-       "mypreferences": "ਪਸੰਦਾਂ",
+       "preferences": "ਤਰà¨\9cà©\80ਹਾਂ",
+       "mypreferences": "ਤਰà¨\9cà©\80ਹਾਂ",
        "prefs-edits": "ਸੋਧਾਂ ਦੀ ਗਿਣਤੀ:",
+       "prefsnologintext2": "ਆਪਣੀਆਂ ਤਰਜੀਹਾਂ ਬਦਲਣ ਵਾਸਤੇ ਦਾਖ਼ਲ ਹੋਵੋ।",
        "prefs-skin": "ਸਕਿਨ",
        "skin-preview": "ਝਲਕ",
        "datedefault": "ਕੋਈ ਪਸੰਦ ਨਹੀਂ",
        "prefs-labs": "ਲੈਬ ਫੀਚਰ",
        "prefs-user-pages": "ਵਰਤੋਂਕਾਰ ਸਫ਼ੇ",
-       "prefs-personal": "ਯà©\82à¨\9c਼ਰ à¨ªà¨°à©\8bਫਾà¨\87ਲ",
-       "prefs-rc": "ਤਾà¨\9c਼ਾ à¨¬à¨¦à¨²à¨¾à¨\85",
+       "prefs-personal": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨ªà©\8dਰà©\8bਫ਼ਾà¨\88ਲ",
+       "prefs-rc": "ਹਾਲà©\80à¨\86 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82",
        "prefs-watchlist": "ਨਿਗਰਾਨ-ਸੂਚੀ",
        "prefs-watchlist-days": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਦਿਨ:",
        "prefs-watchlist-days-max": "ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨ}}",
        "prefs-watchlist-edits-max": "ਵੱਧ ਤੋਂ ਵੱਧ ਨੰਬਰ: ੧੦੦੦",
        "prefs-watchlist-token": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਟੋਕਨ:",
        "prefs-misc": "ਫੁਟਕਲ",
-       "prefs-resetpass": "ਪਾਸਵਰਡ ਬਦਲੋ",
+       "prefs-resetpass": "ਪà¨\9bਾਣ-ਸ਼ਬਦ ਬਦਲੋ",
        "prefs-changeemail": "ਈ-ਮੇਲ ਪਤਾ ਬਦਲੋ",
        "prefs-setemail": "ਈ-ਮੇਲ ਪਤਾ ਸੈੱਟ ਕਰੋ",
        "prefs-email": "ਈਮੇਲ ਚੋਣਾਂ",
        "prefs-rendering": "ਦਿੱਖ",
        "saveprefs": "ਸੰਭਾਲੋ",
-       "restoreprefs": "ਸਭ à¨®à©\82ਲ à¨¸à©\88à¨\9fਿੰà¨\97ਾà¨\82 à¨®à©\8bà©\9c à¨²à¨¿à¨\86à¨\93",
+       "restoreprefs": "ਸਾਰà©\80à¨\86à¨\82 à¨®à©\82ਲ à¨¸à©\88à¨\9fਿੰà¨\97ਾà¨\82 à¨¬à¨¹à¨¾à¨² à¨\95ਰà©\8b (ਸਾਰà©\87 à¨¹à¨¿à©±à¨¸à¨¿à¨\86à¨\82 à¨µà¨¿à©±à¨\9a)",
        "prefs-editing": "ਸੋਧ ਜਾਰੀ",
        "rows": "ਕਤਾਰਾਂ:",
        "columns": "ਕਾਲਮ:",
        "recentchangesdays-max": "ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨ}}",
        "recentchangescount": "ਮੂਲ ਤੌਰ 'ਤੇ ਵਿਖਾਈਆਂ ਸੋਧਾਂ ਦੀ ਗਿਣਤੀ:",
        "prefs-help-recentchangescount": "ਇਸ ਵਿਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ, ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤ ਅਤੇ ਚਿੱਠੇ ਸ਼ਾਮਲ ਹਨ।",
-       "savedprefs": "ਤà©\81ਹਾਡà©\80à¨\86à¨\82 à¨ªà¨¸à©°à¨¦ਾਂ ਸਾਂਭੀਆਂ ਗਈਆਂ ਹੈ।",
+       "savedprefs": "ਤà©\81ਹਾਡà©\80à¨\86à¨\82 à¨¤à¨°à¨\9cà©\80ਹਾਂ ਸਾਂਭੀਆਂ ਗਈਆਂ ਹੈ।",
        "timezonelegend": "ਸਮਾਂ ਜੋਨ:",
        "localtime": "ਸਥਾਨਕ ਸਮਾਂ:",
        "timezoneuseserverdefault": "ਵਿਕੀ ਮੂਲ ($1) ਵਰਤੋ",
        "prefs-common-css-js": "ਸਾਰੀਆਂ ਸਕਿਨਾਂ ਲਈ ਸਾਂਝਾ CSS/ਜਾਵਾਸਕਰਿਪਟ:",
        "prefs-emailconfirm-label": "ਈ-ਮੇਲ ਪੁਸ਼ਟੀ:",
        "youremail": "ਈ-ਮੇਲ:",
-       "username": "{{GENDER:$1|ਯà©\82à¨\9c਼ਰਨਾਂ}}:",
-       "prefs-memberingroups": "{{PLURAL:$1|à¨\97ਰà©\81ੱਪ|à¨\97ਰà©\81ੱਪਾà¨\82}} à¨¦à¨¾ à¨®à©\88à¨\82ਬਰ:",
+       "username": "{{GENDER:$1|ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¦à¨¾ ਨਾਂ}}:",
+       "prefs-memberingroups": "{{PLURAL:$1|ਢਾਣà©\80|ਢਾਣà©\80à¨\86à¨\82}} à¨¦à¨¾ {{GENDER:$2|ਮà©\88à¨\82ਬਰ}}:",
        "prefs-registration": "ਰਜਿਸਟਰੇਸ਼ਨ ਸਮਾਂ:",
        "yourrealname": "ਅਸਲੀ ਨਾਂ:",
        "yourlanguage": "ਭਾਸ਼ਾ:",
        "prefs-help-email-others": "ਤੁਸੀਂ ਇਹ ਵੀ ਚੁਣ ਸਕਦੇ ਹੋ ਕਿ ਤੁਹਾਡੇ ਵਰਤੋਂਕਾਰ ਜਾਂ ਚਰਚਾ ਪੰਨੇ ਤੋਂ ਹੋਰ ਵਰਤੋਂਕਾਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜ ਸਕਣ?\nਜਦੋਂ ਹੋਰ ਵਰਤੋਂਕਾਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜਦੇ ਹਨ ਤਾਂ ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਜ਼ਾਹਰ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ।",
        "prefs-help-email-required": "ਈ-ਮੇਲ ਪਤਾ ਚਾਹੀਦਾ ਹੈ।",
        "prefs-info": "ਮੁਢਲੀ ਜਾਣਕਾਰੀ",
-       "prefs-i18n": "à¨\85ੰਤਰਰਾਸ਼à¨\9fਰੀਕਰਨ",
+       "prefs-i18n": "à¨\95à©\8cਮਾà¨\82ਤਰੀਕਰਨ",
        "prefs-signature": "ਦਸਤਖ਼ਤ",
        "prefs-dateformat": "ਮਿਤੀ ਦਾ ਅੰਦਾਜ਼",
        "prefs-timeoffset": "ਸਮੇਂ ਦਾ ਆਫ਼ਸੈੱਟ",
        "prefs-help-prefershttps": "ਇਹ ਪਸੰਦ ਤੁਹਾਡੇ ਅਗਲੇ ਦਾਖ਼ਲੇ ਤੋਂ ਚਾਲੂ ਹੋ ਜਾਵੇਗੀ।",
        "email-address-validity-valid": "ਈ-ਮੇਲ ਪਤਾ ਸਹੀ ਲਗਦਾ ਹੈ",
        "email-address-validity-invalid": "ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦਾਖ਼ਲ ਕਰੋ",
-       "userrights": "ਵਰਤੋਂਕਾਰ ਦੇ ਅਧਿਕਾਰਾਂ ਦਾ ਰੱਖ-ਰਖਾਓ",
+       "userrights": "ਵਰਤੋਂਕਾਰੀ ਹੱਕਾਂ ਦਾ ਪ੍ਰਬੰਧ",
        "userrights-lookup-user": "ਵਰਤੋਂਕਾਰ ਸਮੂਹਾਂ ਦੀ ਦੇਖਭਾਲ",
        "userrights-user-editname": "ਇੱਕ ਵਰਤੋਂਕਾਰ ਨਾਂ ਭਰੋ:",
        "editusergroup": "ਵਰਤੋਂਕਾਰ ਸਮੂਹਾਂ ਦੀ ਸੋਧ",
        "userrights-reason": "ਕਾਰਨ:",
        "userrights-no-interwiki": "ਤੁਹਾਨੂੰ ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਹੱਕਾਂ ਵਿਚ ਤਬਦੀਲੀ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "userrights-nodatabase": "ਡੈਟਾਬੇਸ $1 ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਮਕਾਮੀ ਨਹੀਂ ਹੈ।",
-       "userrights-notallowed": "ਤà©\81ਹਾਨà©\82à©° à¨¨à©\82à©° à¨¯à©\82à¨\9c਼ਰ ਹੱਕ ਦੇਣ ਜਾਂ ਖੋਹਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
+       "userrights-notallowed": "ਤà©\81ਹਾਡà©\87 à¨\95à©\8bਲ਼ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਹੱਕ ਦੇਣ ਜਾਂ ਖੋਹਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "userrights-changeable-col": "ਉਹ ਸਮੂਹ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਬਦਲ ਸਕਦੇ ਹੋ",
        "userrights-unchangeable-col": "ਉਹ ਸਮੂਹ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਬਦਲ ਨਹੀਂ ਸਕਦੇ",
-       "group": "ਸਮà©\82ਹ:",
+       "group": "à¨\9fà©\8bਲà©\80:",
        "group-user": "ਵਰਤੋਂਕਾਰ",
        "group-autoconfirmed": "ਖ਼ੁਦ-ਤਸਦੀਕਸ਼ੁਦਾ ਮੈਂਬਰ",
        "group-bot": "ਬੌਟ",
        "group-all": "(ਸਭ)",
        "group-user-member": "{{GENDER:$1|ਵਰਤੋਂਕਾਰ}}",
        "group-bot-member": "ਬੌਟ",
+       "group-sysop-member": "{{GENDER:$1|ਪ੍ਰਬੰਧਕ}}",
+       "group-bureaucrat-member": "{{GENDER:$1|ਅਫ਼ਸਰਸ਼ਾਹ}}",
+       "group-suppress-member": "{{GENDER:$1|ਨਿਗਰਾਨ}}",
        "grouppage-user": "{{ns:project}}:ਵਰਤੋਂਕਾਰ",
        "grouppage-autoconfirmed": "{{ns:project}}:ਸਵੈ-ਤਸਦੀਕੀ ਵਰਤੋਂਕਾਰ",
        "grouppage-bot": "{{ns:project}}:ਬੌਟ",
        "right-minoredit": "ਸੋਧਾਂ ਦੇ ਛੋਟਾ ਹੋਣ ਲਈ ਨਿਸ਼ਾਨ ਲਾਉਣਾ",
        "right-move": "ਸਫ਼ੇ ਭੇਜਣਾ",
        "right-move-subpages": "ਉਪ-ਸਫ਼ਿਆਂ ਸਮੇਤ ਸਫ਼ੇ ਭੇਜੋ",
+       "right-move-categorypages": "ਵਰਗਾਂ ਦੇ ਸਫ਼ੇ ਭੇਜੋ",
        "right-movefile": "ਫਾਇਲਾਂ ਭੇਜਣੀਆਂ",
        "right-upload": "ਫਾਇਲਾਂ ਅੱਪਲੋਡ",
+       "right-reupload": "ਮੌਜੂਦਾ ਫ਼ਾਈਲਾਂ ਉੱਤੇ ਲਿਖੋ",
+       "right-reupload-own": "ਆਪ ਚੜ੍ਹਾਈਆਂ ਮੌਜੂਦਾ ਫ਼ਾਈਲਾਂ ਉੱਤੇ ਲਿਖੋ",
        "right-upload_by_url": "URL ਤੋਂ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ",
        "right-autoconfirmed": "ਨੀਮ-ਸੁਰੱਖਿਅਤ ਸਫ਼ਿਆਂ ਨੂੰ ਸੋਧਣਾ",
+       "right-bot": "ਇੱਕ ਸਵੈ-ਚਾਲਤ ਅਮਲ ਵਜੋਂ ਗਿਣਿਆ ਜਾਣਾ",
        "right-delete": "ਸਫ਼ੇ ਹਟਾਓ",
        "right-bigdelete": "ਵੱਡੇ ਅਤੀਤ ਵਾਲੇ ਪੰਨੇ ਮਿਟਾਉਣੇ",
        "right-browsearchive": "ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ",
        "right-editmyuserjs": "ਆਪਣੀਆਂ ਵਰਤੋਂਕਾਰ ਜਾਵਾਸਕਰਿਪਟ ਫ਼ਾਈਲਾਂ ਸੋਧੋ",
        "right-viewmywatchlist": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵੇਖੋ",
        "right-editmywatchlist": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ। ਧਿਆਨ ਦਿਓ ਕਿ ਕੁਝ ਸਫ਼ੇ ਇਸ ਹੱਕ ਤੋਂ ਬਿਨਾਂ ਵੀ ਜੁੜਨਗੇ।",
-       "right-editmyoptions": "à¨\86ਪਣà©\80à¨\86à¨\82 à¨ªà¨¸à©°à¨¦ਾਂ ਸੋਧੋ",
+       "right-editmyoptions": "à¨\86ਪਣà©\80à¨\86à¨\82 à¨¤à¨°à¨\9cà©\80ਹਾਂ ਸੋਧੋ",
        "right-unwatchedpages": "ਨਜ਼ਰ ਨਾ ਰੱਖੇ ਜਾ ਰਹੇ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ ਵੇਖਣੀ",
        "right-mergehistory": "ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤਾਂ ਨੂੰ ਰਲ਼ਾਉਣਾ",
        "right-userrights": "ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੇ ਹੱਕ ਬਦਲਣੇ",
        "action-createpage": "ਸਫ਼ੇ ਬਣਾਓ",
        "action-createtalk": "ਚਰਚਾ ਸਫ਼ੇ ਬਣਾਉਣ",
        "action-createaccount": "ਇਹ ਵਰਤੋਂਕਾਰ ਖਾਤਾ ਬਣਾਓ",
+       "action-history": "ਇਸ ਸਫ਼ੇ ਦਾ ਅਤੀਤ ਵੇਖੋ",
        "action-minoredit": "ਇਹ ਸੋਧ ਨੂੰ ਛੋਟੀ ਤੌਰ ਉੱਤੇ ਮੰਨੋ",
        "action-move": "ਇਹ ਸਫ਼ਾ ਭੇਜੋ",
        "action-move-subpages": "ਇਹ ਸਫ਼ਾ ਤੇ ਇਸ ਦੇ ਅਧੀਨ-ਸਫ਼ਿਆਂ ਨੂੰ ਭੇਜੋ",
+       "action-move-categorypages": "ਵਰਗਾਂ ਦੇ ਸਫ਼ੇ ਭੇਜੋ",
        "action-movefile": "ਇਹ ਫ਼ਾਈਲ ਭੇਜੋ",
-       "action-upload": "à¨\87ਹ à¨«à¨¼à¨¾à¨\88ਲ à¨\85ੱਪਲà©\8bਡ à¨\95ਰà©\8b",
+       "action-upload": "à¨\87ਹ à¨«à¨¼à¨¾à¨\88ਲ à¨\9aà©\9cà©\8dਹਾà¨\89",
        "action-reupload": "ਇਹ ਮੌਜੂਦਾ ਫ਼ਾਈਲ ਉੱਤੇ ਲਿਖੋ",
        "action-reupload-shared": "ਇਸ ਫ਼ਾਈਲ ਨੂੰ ਸਾਂਝੀ ਕੀਤੀ ਰਿਪੋਜ਼ਟਰੀ ਉੱਤੇ ਧਰੋ",
        "action-upload_by_url": "ਇਹ ਫ਼ਾਈਲ ਨੂੰ ਇੱਕ URL ਤੋਂ ਅੱਪਲੋਡ ਕਰੋ",
        "recentchanges-label-minor": "ਇਹ ਇੱਕ ਛੋਟੀ ਸੋਧ ਹੈ",
        "recentchanges-label-bot": "ਇਹ ਸੋਧ ਇੱਕ ਬੋਟ ਦੁਆਰਾ ਕੀਤੀ ਗਈ ਸੀ",
        "recentchanges-label-unpatrolled": "ਇਹ ਫੇਰ-ਬਦਲ ਹਾਲੇ ਵੇਖਿਆ ਨਹੀਂ ਗਿਆ",
-       "recentchanges-legend-newpage": "$1 - ਨਵਾਂ ਸਫ਼ਾ",
+       "recentchanges-legend-heading": "'''ਟੀਕਾ:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|ਨਵੇਂ ਸਫ਼ਿਆਂ ਦੀ ਸੂਚੀ]] ਵੀ ਵੇਖੋ)",
        "recentchanges-legend-plusminus": "(''±੧੨੩'')",
        "rcnotefrom": "'''$2''' ਤੱਕ ('''$1''' ਤੱਕ ਦਿੱਸਦੇ) ਬਦਲਾਵ ਹੇਠ ਦਿੱਤੀਆਂ ਹਨ।",
        "rclistfrom": "$3 $2 ਤੋਂ ਸ਼ੁਰੂ ਕਰਕੇ ਨਵੀਆਂ ਸੋਧਾਂ ਵਖਾਓ",
        "diff": "ਫ਼ਰਕ",
        "hist": "ਅਤੀਤ",
        "hide": "ਲੁਕਾਓ",
-       "show": "ਵà¨\96ਾà¨\93",
+       "show": "ਵਿà¨\96ਾà¨\89",
        "minoreditletter": "ਛੋ",
        "newpageletter": "ਨ",
        "boteditletter": "ਬੋਟ",
        "recentchangeslinked-summary": "ਇਹ ਕਿਸੇ ਖ਼ਾਸ ਸਫ਼ੇ ਤੋਂ ਲਿੰਕ ਕੀਤੇ ਸਫ਼ਿਆਂ (ਜਾਂ ਕਿਸੇ ਖ਼ਾਸ ਸ਼੍ਰੇਣੀ ਦੇ ਮੈਂਬਰਾਂ) ਵਿੱਚ ਹੋਈਆਂ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਦੀ ਲਿਸਟ ਹੈ। [[Special:Watchlist|ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ]] ਵਿੱਚ ਮੌਜੂਦ ਸਫ਼ੇ ਮੋਟੇ ਅੱਖਰਾਂ ਵਿੱਚ ਵਖਾਈ ਦੇਣਗੇ।",
        "recentchangeslinked-page": "ਸਫ਼ੇ ਦਾ ਨਾਂ:",
        "recentchangeslinked-to": "ਇਹਦੇ ਬਦਲੇ ਇਸ ਸਫ਼ੇ ਨਾਲ ਜੁੜੇ ਸਫ਼ਿਆਂ ਵਿੱਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਵਿਖਾਓ",
-       "upload": "ਫ਼ਾà¨\88ਲ à¨\85ੱਪਲà©\8bਡ à¨\95ਰà©\8b",
-       "uploadbtn": "ਫ਼ਾà¨\88ਲ à¨\85ੱਪਲà©\8bਡ à¨\95ਰà©\8b",
+       "upload": "ਫ਼ਾà¨\88ਲ à¨\9aà©\9cà©\8dਹਾà¨\89",
+       "uploadbtn": "ਫ਼ਾà¨\88ਲ à¨\9aà©\9cà©\8dਹਾà¨\89",
        "reuploaddesc": "ਅੱਪਲੋਡ ਫਾਰਮ ਉੱਤੇ ਜਾਓ।",
        "upload-tryagain": "ਬਦਲਿਆ ਹੋਇਆ ਫ਼ਾਈਲ ਵੇਰਵਾ ਪੇਸ਼ ਕਰੋ",
        "uploadnologin": "ਦਾਖ਼ਲ ਨਹੀਂ ਹੋ",
        "uploadnologintext": "ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ $1 ਕਰਨਾ ਪਵੇਗਾ।",
        "uploaderror": "ਅੱਪਲੋਡ ਗਲਤੀ",
        "upload-recreate-warning": "'''ਖ਼ਬਰਦਾਰ: ਇਸ ਨਾਮ ਦੀ ਫ਼ਾਈਲ ਮਿਟਾਈ ਜਾਂ ਹੋਰ ਨਾਮ ਤੇ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।'''\nਮਿਟਾਉਣ ਅਤੇ ਭੇਜੇ ਜਾਣ ਦਾ ਚਿੱਠਾ ਸਹੂਲਤ ਲਈ ਇੱਥੇ ਦਿੱਤਾ ਗਿਆ ਹੈ:",
+       "upload-permitted": "ਫ਼ਾਈਲਾਂ ਦੀਆਂ ਮਨਜ਼ੂਰ ਕਿਸਮਾਂ: $1।",
+       "upload-preferred": "ਫ਼ਾਈਲਾਂ ਦੀਆਂ ਤਰਜੀਹੀ ਕਿਸਮਾਂ :$1।",
+       "upload-prohibited": "ਫ਼ਾਈਲਾਂ ਦੀਆਂ ਨਾ-ਮਨਜ਼ੂਰ ਕਿਸਮਾਂ: $1।",
        "uploadlogpage": "ਅਪਲੋਡਾਂ ਦਾ ਚਿੱਠਾ",
        "filename": "ਫ਼ਾਈਲ ਦਾ ਨਾਂ:",
        "filedesc": "ਸਾਰ",
        "filetype-banned": "ਇਸ ਕਿਸਮ ਦੀ ਫ਼ਾਈਲ ਦੀ ਮਨਾਹੀ ਹੈ।",
        "verification-error": "ਇਹ ਫ਼ਾਈਲ ਫ਼ਾਈਲ-ਜਾਂਚ 'ਤੇ ਖ਼ਰੀ ਨਾ ਉੱਤਰ ਸਕੀ।",
        "illegal-filename": "ਇਸ ਫ਼ਾਈਲ-ਨਾਂ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
+       "overwrite": "ਮੌਜੂਦਾ ਫ਼ਾਈਲ ਉੱਤੇ ਲਿਖਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "unknown-error": "ਅਣਜਾਣ ਗ਼ਲਤੀ ਆਈ ਹੈ।",
        "tmp-create-error": "ਆਰਜ਼ੀ ਫ਼ਾਈਲ ਬਣਾਈ ਨਾ ਜਾ ਸਕੀ।",
        "tmp-write-error": "ਆਰਜ਼ੀ ਫ਼ਾਈਲ ਲਿਖਣ ਲਈ ਗ਼ਲਤੀ ਆਈ।",
+       "large-file": "ਫ਼ਾਈਲਾਂ $1 ਤੋਂ ਵੱਡੀਆਂ ਨਾ ਹੋਣ ਦੀ ਸਲਾਹ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ;\nਇਹ ਫ਼ਾਈਲ $2 ਦੀ ਹੈ।",
        "windows-nonascii-filename": "ਵਿਕੀ ਖ਼ਾਸ ਚਿੰਨ੍ਹਾਂ ਵਾਲੇ ਫ਼ਾਈਲ ਨਾਮਾਂ ਨੂੰ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦਾ।",
        "fileexists": "ਇਹ ਫ਼ਾਈਲ ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਜੇ ਤੁਸੀਂ ਇਹਨੂੰ ਬਦਲਣ ਬਾਰੇ ਦ੍ਰਿੜ ਨਹੀਂ ਹੋ ਤਾਂ  <strong>[[:$1]]</strong> ਵੇਖੋ ਜੀ। [[$1|thumb]]",
        "fileexists-extension": "ਇਸ ਨਾਂ ਨਾਲ਼ ਰਲਦੀ ਫ਼ਾਈਲ ਮੌਜੂਦ ਹੈ: [[$2|thumb]]\n* ਅੱਪਲੋਡ ਕੀਤੀ ਜਾਂਦੀ ਫ਼ਾਈਲ ਦਾ ਨਾਂ: <strong>[[:$1]]</strong>\n* ਮੌਜੂਦ ਫ਼ਾਈਲ ਦਾ ਨਾਂ: <strong>[[:$2]]</strong>\nਕੋਈ ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ।",
        "uploaddisabled": "ਅੱਪਲੋਡ ਆਯੋਗ ਹੈ",
        "copyuploaddisabled": "URL ਰਾਹੀਂ ਅੱਪਲੋਡ ਰੋਕੇ ਹੋਏ ਹਨ।",
        "uploaddisabledtext": "ਫ਼ਾਈਲਾਂ ਦੇ ਅੱਪਲੋਡ ਰੋਕੇ ਹੋਏ ਹਨ।",
+       "uploadscriptednamespace": "ਇਸ ਐੱਸ.ਵੀ.ਜੀ. ਫ਼ਾਈਲ ਵਿੱਚ ਇੱਕ ਗ਼ੈਰ-ਕਨੂੰਨੀ ਨਾਂ-ਥਾਂ \"$1\" ਹੈ।",
        "uploadvirus": "ਇਹ ਫਾਇਲ ਵਿੱਚ ਵਾਇਰਸ ਹੈ! ਵੇਰਵੇ ਲਈ ਵੇਖੋ: $1",
        "upload-source": "ਸਰੋਤ ਫਾਇਲ",
        "sourcefilename": "ਸੋਰਸ ਫਾਇਲ ਨਾਂ:",
        "license": "ਲਸੰਸ:",
        "license-header": "ਲਸੰਸ",
        "nolicense": "ਕੁਝ ਵੀ ਚੁਣਿਆ",
+       "licenses-edit": "ਲਸੰਸ ਦੀਆਂ ਚੋਣਾਂ ਸੋਧੋ",
        "license-nopreview": "(ਝਲਕ ਉਪਲੱਬਧ ਨਹੀਂ)",
        "upload_source_file": " (ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਉੱਤੇ ਇੱਕ ਫਾਇਲ)",
        "listfiles-delete": "ਹਟਾਓ",
        "listfiles_size": "ਆਕਾਰ",
        "listfiles_description": "ਵੇਰਵਾ",
        "listfiles_count": "ਵਰਜਨ",
+       "listfiles-show-all": "ਤਸਵੀਰਾਂ ਦੇ ਪੁਰਾਣੇ ਰੂਪ ਸ਼ਾਮਲ ਕਰੋ",
        "listfiles-latestversion": "ਮੌਜੂਦਾ ਵਰਜਨ",
        "listfiles-latestversion-yes": "ਹਾਂ",
        "listfiles-latestversion-no": "ਨਹੀਂ",
        "filepage-nofile-link": "ਇਸ ਨਾਮ ਦੀ ਕੋਈ ਫ਼ਾਈਲ ਮੌਜੂਦ ਨਹੀਂ ਹੈ ਪਰ ਤੁਸੀਂ [$1 ਇਸਨੂੰ ਅੱਪਲੋਡ ਕਰ] ਸਕਦੇ ਹੋ।",
        "uploadnewversion-linktext": "ਇਸ ਫਾਇਲ ਦਾ ਇੱਕ ਨਵਾਂ ਵਰਜਨ ਅੱਪਲੋਡ ਕਰੋ",
        "shared-repo-from": "$1 ਤੋਂ",
+       "shared-repo": "ਕੋਈ ਸਾਂਝਾ ਕੀਤਾ ਭੰਡਾਰ",
+       "upload-disallowed-here": "ਤੁਸੀਂ ਇਸ ਫ਼ਾਈਲ ਉੱਤੇ ਨਹੀਂ ਨਹੀਂ ਲਿਖ ਸਕਦੇ।",
        "filerevert": "$1 ਰੀਵਰਟ",
        "filerevert-legend": "ਫਾਇਲ ਰੀਵਰਟ",
        "filerevert-comment": "ਕਾਰਨ:",
        "download": "ਡਾਊਨਲੋਡ",
        "unwatchedpages": "ਨਜ਼ਰ ਹੇਠ ਨਾ ਰੱਖੇ ਗਏ ਸਫ਼ੇ",
        "listredirects": "ਰੀਡਾਇਰੈਕਟਾਂ ਦੀ ਲਿਸਟ",
+       "listduplicatedfiles": "ਨਕਲ ਵਾਲ਼ੀਆਂ ਫ਼ਾਈਲਾਂ ਦੀ ਸੂਚੀ",
        "unusedtemplates": "ਅਣ-ਵਰਤੇ ਫਰਮੇ",
        "unusedtemplateswlh": "ਹੋਰ ਕੜੀਆਂ",
        "randompage": "ਰਲ਼ਵਾਂ ਸਫ਼ਾ",
        "randomincategory": "ਸ਼੍ਰੇਣੀ ਵਿਚਲਾ ਰਲ਼ਵਾਂ ਸਫ਼ਾ",
        "randomincategory-invalidcategory": "\"$1\" ਕੋਈ ਸਹੀ ਸ਼੍ਰੇਣੀ ਦਾ ਨਾਂ ਨਹੀਂ ਹੈ।",
        "randomincategory-nopages": "[[:Category:$1|$1]] ਸ਼੍ਰੇਣੀ ਵਿਚ ਕੋਈ ਸਫ਼ਾ ਨਹੀਂ ਹੈ।",
-       "randomincategory-selectcategory-submit": "ਜਾਓ",
+       "randomincategory-category": "ਵਰਗ:",
+       "randomincategory-legend": "ਵਰਗ ਵਿਚਲਾ ਰਲ਼ਵਾਂ ਸਫ਼ਾ",
        "randomredirect": "ਰਲ਼ਵਾਂ ਰੀਡਿਰੈਕਟ",
        "statistics": "ਅੰਕੜੇ",
        "statistics-header-pages": "ਸਫ਼ਾ ਅੰਕੜੇ",
        "statistics-users-active": "ਸਰਗਰਮ ਵਰਤੋਂਕਾਰ",
        "statistics-users-active-desc": "ਮੈਂਬਰ, ਜਿੰਨ੍ਹਾ ਨੇ ਆਖ਼ਰੀ {{PLURAL:$1|ਦਿਨ|$1 ਦਿਨਾਂ}} ਵਿਚ ਕੋਈ ਕੰਮ ਕੀਤਾ ਹੈ।",
        "statistics-mostpopular": "ਸਭ ਤੋਂ ਵੱਧ ਵੇਖੇ ਸਫ਼ੇ",
+       "pageswithprop-prop": "ਗੁਣ ਦਾ ਨਾਂ:",
        "pageswithprop-submit": "ਜਾਉ",
        "doubleredirects": "ਦੋਹਰੇ ਰੀਡਿਰੈਕਟ",
        "brokenredirects": "ਟੁੱਟੇ ਹੋਏ ਰੀਡਿਰੈਕਟ",
        "prefixindex": "ਇਸ ਅਗੇਤਰ ਵਾਲੇ ਸਾਰੇ ਸਫ਼ੇ",
        "shortpages": "ਛੋਟੇ ਸਫ਼ੇ",
        "longpages": "ਲੰਮੇ ਸਫ਼ੇ",
+       "deadendpages": "ਬੰਦ ਗਲ਼ੀ ਵਾਲ਼ੇ ਸਫ਼ੇ",
        "protectedpages": "ਸੁਰੱਖਿਅਤ ਸਫ਼ੇ",
+       "protectedpages-noredirect": "ਮੋੜ ਲੁਕਾਉ",
+       "protectedpages-timestamp": "ਵਕਤ ਦੀ ਮੋਹਰ",
        "protectedpages-page": "ਸਫ਼ਾ",
        "protectedpages-expiry": "ਮਿਆਦ",
        "protectedpages-reason": "ਕਾਰਨ",
        "protectedpages-unknown-timestamp": "ਅਣਜਾਣ",
-       "protectedpages-unknown-performer": "à¨\85ਣà¨\9cਾਣ à¨¯à©\82à¨\9c਼ਰ",
+       "protectedpages-unknown-performer": "à¨\85ਣਪà¨\9bਾਤà©\87 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ",
        "protectedtitles": "ਸੁਰੱਖਿਅਤ ਸਿਰਲੇਖ",
-       "listusers": "ਯà©\82à¨\9c਼ਰ à¨²à¨¿à¨¸à¨\9f",
+       "listusers": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¸à©\82à¨\9aà©\80",
        "listusers-editsonly": "ਸਿਰਫ਼ ਸੋਧਾਂ ਵਾਲੇ ਵਰਤੋਂਕਾਰ ਵਿਖਾਓ",
        "listusers-creationsort": "ਬਣਾਉਣ ਦੀ ਮਿਤੀ ਮੁਤਾਬਕ ਤਰਤੀਬ ਵਿਚ ਕਰੋ",
+       "listusers-desc": "ਲਹਿੰਦੀ ਤਰਤੀਬ 'ਚ ਰੱਖੋ",
+       "usereditcount": "$1 {{PLURAL:$1|ਸੋਧ|ਸੋਧਾਂ}}",
        "usercreated": "$1 ਨੂੰ $2 ’ਤੇ {{GENDER:$3|ਬਣਾਇਆ}}",
        "newpages": "ਨਵੇਂ ਸਫ਼ੇ",
        "newpages-username": "ਵਰਤੋਂਕਾਰ ਨਾਂ:",
        "nopagetitle": "ਕੋਈ ਅਜਿਹਾ ਨਿਸ਼ਾਨਾ ਸਫ਼ਾ ਨਹੀਂ ਹੈ",
        "pager-newer-n": "{{PLURAL:$1|1 ਨਵਾਂ|$1 ਨਵੇਂ}}",
        "pager-older-n": "{{PLURAL:$1|1 ਪੁਰਾਣਾ|$1 ਪੁਰਾਣੇ}}",
+       "suppress": "ਨਿਗਰਾਨ",
        "booksources": "ਪੁਸਤਕਾਂ ਦੇ ਸਰੋਤ",
        "booksources-search-legend": "ਕਿਤਾਬਾਂ ਦੇ ਸਰੋਤ ਖੋਜੋ",
-       "booksources-go": "ਜਾਓ",
+       "booksources-search": "ਭਾਲ਼",
        "booksources-invalid-isbn": "ਦਿੱਤਾ ਗਿਆ ISBN ਸਹੀ ਨਹੀਂ ਲਗਦਾ, ਅਸਲੀ ਸਰੋਤ ਤੋਂ ਨਕਲ ਕਰਦੇ ਵਕਤ ਹੋਈਆਂ ਗ਼ਲਤੀਆਂ ਜਾਂਚੋ।",
        "specialloguserlabel": "ਕਰਤਾ:",
        "speciallogtitlelabel": "ਸਿਰਲੇਖ:",
        "listgrouprights-removegroup-all": "ਸਾਰੇ ਸਮੂਹ ਹਟਾਓ",
        "listgrouprights-addgroup-self-all": "ਆਪਣੇ ਖਾਤੇ ਵਿਚ ਸਾਰੇ ਸਮੂਹ ਜੋੜੋ",
        "listgrouprights-removegroup-self-all": "ਆਪਣੇ ਖਾਤੇ ਤੋਂ ਸਾਰੇ ਸਮੂਹ ਹਟਾਓ",
+       "listgrouprights-namespaceprotection-namespace": "ਨਾਂ-ਥਾਂ",
+       "trackingcategories": "ਵਰਗਾਂ ਦੀ ਪੈੜ",
+       "trackingcategories-msg": "ਵਰਗ ਦੀ ਪੈੜ",
+       "trackingcategories-name": "ਸੁਨੇਹੇ ਦਾ ਨਾਂ",
+       "trackingcategories-desc": "ਵਰਗ ਮਿਲਾਉਣ ਦੇ ਮਾਪਦੰਡ",
        "trackingcategories-nodesc": "ਕੋਈ  ਵੇਰਵਾ ਉਪਲੱਬਧ ਨਹੀਂ।",
+       "trackingcategories-disabled": "ਵਰਗ ਬੰਦ ਹੈ",
        "mailnologin": "ਭੇਜਣ ਲਈ ਕੋਈ ਪਤਾ ਨਹੀਂ",
        "mailnologintext": "ਦੂਜੇ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ [[Special:UserLogin|ਦਾਖ਼ਲ]] ਹੋਣਾ ਪਵੇਗਾ ਅਤੇ ਆਪਣੀਆਂ [[Special:Preferences|ਪਸੰਦਾਂ]] ਵਿਚ ਇੱਕ ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦੇਣਾ ਪਵੇਗਾ।",
        "emailuser": "ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ",
        "emailuser-title-target": "ਇਹ {{GENDER:$1|ਯੂਜ਼ਰ}} ਨੂੰ ਈਮੇਲ ਭੇਜੋ",
-       "emailuser-title-notarget": "ਯà©\82à¨\9c਼ਰ à¨¨à©\82à©° à¨\88ਮà©\87ਲ",
-       "emailpage": "ਯà©\82à¨\9c਼ਰ ਨੂੰ ਈਮੇਲ ਕਰੋ",
+       "emailuser-title-notarget": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¨à©\82à©° à¨\88ਮà©\87ਲ à¨\95ਰà©\8b",
+       "emailpage": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ ਨੂੰ ਈਮੇਲ ਕਰੋ",
        "defemailsubject": "{{SITENAME}} ਈਮੇਲ",
        "usermaildisabled": "ਵਰਤੋਂਕਾਰ ਦੀ ਈ-ਮੇਲ ਬੰਦ ਹੈ",
        "usermaildisabledtext": "ਇਸ ਵਿਕੀ ’ਤੇ ਤੁਸੀਂ ਦੂਜੇ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਨਹੀਂ ਭੇਜ ਸਕਦੇ",
        "mywatchlist": "ਨਿਗਰਾਨੀ-ਲਿਸਟ",
        "watchlistfor2": "$1 $2 ਲਈ",
        "nowatchlist": "ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਕੋਈ ਚੀਜ਼ ਨਹੀਂ ਹੈ।",
-       "watchlistanontext": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲੀਆਂ ਚੀਜ਼ਾਂ ਵੇਖਣ ਜਾਂ ਸੋਧਣ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ $1।",
+       "watchlistanontext": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲੀਆਂ ਚੀਜ਼ਾਂ ਵੇਖਣ ਜਾਂ ਸੋਧਣ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਦਾਖ਼ਲ ਹੋਵੋ।",
        "watchnologin": "ਲਾਗਇਨ ਨਹੀਂ",
        "addwatch": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ’ਚ ਜੋੜੋ",
        "addedwatchtext": "ਪੰਨਾ \"[[:$1]]\" ਤੁਹਾਡੀ [[Special:Watchlist|ਧਿਆਨਸੂਚੀ]] ’ਚ ਜੁੜ ਚੁੱਕਾ ਹੈ।\nਇਸ ਅਤੇ ਇਸਦੇ ਚਰਚਾ ਪੰਨੇ ’ਚ ਹੋਈਆਂ ਬਦਲੀਆਂ ਓਥੇ ਵਖਾਈ ਦੇਣਗੀਆਂ ਅਤੇ ਵੇਖਣ ਦੀ ਸੌਖ ਲਈ [[Special:RecentChanges|ਹਾਲ ਹੀ ’ਚ ਹੋਈਆਂ ਬਦਲੀਆਂ]] ਵਿੱਚ ਇਹ ਪੰਨਾ '''ਗੂੜ੍ਹਾ''' ਦਿਖਾਈ ਦੇਵੇਗਾ।",
        "notanarticle": "ਕੋਈ ਸਮੱਗਰੀ ਸਫ਼ਾ ਨਹੀਂ ਹੈ",
        "notvisiblerev": "ਇੱਕ ਵੱਖਰੇ ਮੈਂਬਰ ਦੀ ਬਣਾਈ ਆਖ਼ਰੀ ਰੀਵਿਜ਼ਨ ਮਿਟਾਈ ਜਾ ਚੁੱਕੀ ਹੈ",
        "watchlist-details": "ਗੱਲ-ਬਾਤ ਸਫ਼ੇ ਨਾ ਗਿਣਦੇ ਹੋਏ, ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵਿਚ{{PLURAL:$1|$1 ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ ਹਨ}}।",
+       "wlheader-enotif": "ਈਮੇਲ ਸੂਚਨਾ ਚਾਲੂ ਹੈ।",
        "wlnote": "$3, $4 ਮੁਤਾਬਕ ਆਖ਼ਰੀ {{PLURAL:$2|ਘੰਟੇ|'''$2''' ਘੰਟਿਆਂ}} ਵਿਚ {{PLURAL:\n$1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆਂ}}, ਹੇਠਾਂ ਵੇਖੋ।",
-       "wlshowlast": "ਪਿਛਲੇ $1 ਘੰਟੇ $2 ਦਿਨ $3 ਵਖਾਓ",
+       "wlshowlast": "ਪਿਛਲੇ $1 ਘੰਟੇ $2 ਦਿਨ  ਵਖਾਓ",
        "watchlist-options": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਦੀਆਂ ਚੋਣਾਂ",
        "watching": "ਨਿਗ੍ਹਾ (ਵਾਚ) ਰੱਖੀ ਜਾ ਰਹੀ ਹੈ...",
        "unwatching": "ਨਿਗ੍ਹਾ ਰੱਖਣੀ (ਵਾਚ) ਬੰਦ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..",
-       "enotif_impersonal_salutation": "{{SITENAME}} ਯੂਜ਼ਰ",
+       "enotif_reset": "ਫੇਰੀ ਪਾਏ ਸਾਰੇ ਸਫ਼ਿਆਂ ਨੂੰ ਨਿਸ਼ਾਨੀ ਲਾਉ",
+       "enotif_impersonal_salutation": "{{SITENAME}} ਵਰਤੋਂਕਾਰ",
        "enotif_lastvisited": "ਤੁਹਾਡੀ ਆਖ਼ਰੀ ਆਮਦ ਤੋਂ ਲੈ ਕੇ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਵੇਖਣ ਲਈ $1 ਵੇਖੋ।",
        "enotif_lastdiff": "ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਵੇਖਣ ਲਈ $1 ਵੇਖੋ।",
        "enotif_anon_editor": "ਗੁਮਨਾਮ ਵਰਤੋਂਕਾਰ $1",
        "deletepage": "ਸਫ਼ਾ ਹਟਾਓ",
        "confirm": "ਪੁਸ਼ਟੀ",
        "excontent": "ਸਮੱਗਰੀ ਸੀ: '$1'",
+       "excontentauthor": "ਲਿਖਤ ਸੀ: \"$1\" (ਅਤੇ ਇੱਕੋ-ਇੱਕ ਯੋਗਦਾਨੀ \"[[Special:Contributions/$2|$2]]\" ਸੀ)",
        "exbeforeblank": "ਖ਼ਾਲੀ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਸਮੱਗਰੀ ਸੀ: \"$1\"",
        "delete-confirm": "\"$1\" ਹਟਾਓ",
        "delete-legend": "ਹਟਾਓ",
-       "historywarning": "'''ਖ਼ਬਰਦਾਰ:''' ਜੋ ਸਫ਼ਾ ਤੁਸੀਂ ਮਿਟਾਉਣ ਜਾ ਰਹੇ ਹੋ ਉਸਦਾ ਅਤੀਤ ਤਕਰੀਬਨ $1 {{PLURAL:$1|ਰੀਵਿਜ਼ਨ|ਰੀਵਿਜ਼ਨਾਂ}} ਦਾ ਹੈ:",
+       "historywarning": "<strong>ਖ਼ਬਰਦਾਰ:</strong> ਜੋ ਸਫ਼ਾ ਤੁਸੀਂ ਮਿਟਾਉਣ ਜਾ ਰਹੇ ਹੋ ਉਹਦਾ ਅਤੀਤ $1 {{PLURAL:$1|ਸੁਧਾਈ|ਸੁਧਾਈਆਂ}} ਦਾ ਹੈ:",
        "actioncomplete": "ਕਾਰਵਾਈ ਪੂਰੀ ਹੋਈ",
        "actionfailed": "ਕਾਰਵਾਈ ਨਾਕਾਮ",
        "deletedtext": "\"$1\" ਮਿਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।\nਤਾਜ਼ੀਆਂ ਮਿਟਾਉਣਾਂ ਦੇ ਰਿਕਾਰਡ ਲਈ $2 ਵੇਖੋ।",
        "prot_1movedto2": "[[$1]] ਨੂੰ [[$2]] ’ਤੇ ਭੇਜਿਆ",
        "protect-badnamespace-title": "ਗ਼ੈਰ-ਸੁਰੱਖਿਆਯੋਗ ਨਾਂ-ਥਾਂ",
        "protect-badnamespace-text": "ਇਸ ਥਾਂ-ਨਾਮ ਵਿਚਲੇ ਸਫ਼ੇ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ।",
+       "protect-norestrictiontypes-title": "ਨਾ-ਬਚਾਉਣਯੋਗ ਸਫ਼ਾ",
        "protect-legend": "ਸੁਰੱਖਿਆ ਤਸਦੀਕੀ",
        "protectcomment": "ਕਾਰਨ:",
        "protectexpiry": "ਮਿਆਦ:",
        "sp-contributions-search": "ਯੋਗਦਾਨ ਖੋਜੋ",
        "sp-contributions-username": "IP ਪਤਾ ਜਾਂ ਵਰਤੋਂਕਾਰਨਾਮ:",
        "sp-contributions-toponly": "ਸਿਰਫ ਉਹ ਸੋਧਾਂ ਵਿਖਾਓ ਜੋ ਸਭ ਤੋਂ ਤਾਜ਼ੀਆਂ ਰਿਵੀਜਨਾਂ ਹਨ",
+       "sp-contributions-newonly": "ਸਿਰਫ਼ ਉਹ ਸੋਧਾਂ ਵਿਖਾਉ ਜਿਹਨਾਂ ਨਾਲ਼ ਨਵੇਂ ਸਫ਼ੇ ਬਣੇ ਹਨ",
        "sp-contributions-submit": "ਖੋਜ",
        "whatlinkshere": "ਇੱਥੇ ਕੀ ਆ ਕੇ ਜੁੜਦਾ ਹੈ",
        "whatlinkshere-title": "$1 ਨਾਲ ਜੋੜਨ ਵਾਲੇ ਸਫ਼ੇ",
        "whatlinkshere-filters": "ਫਿਲਟਰ",
        "block": "ਵਰਤੋਂਕਾਰ 'ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
        "unblock": "ਵਰਤੋਂਕਾਰ 'ਤੇ ਲੱਗੀ ਪਾਬੰਦੀ ਹਟਾਓ",
-       "blockip": "ਵਰਤੋਂਕਾਰ ’ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
+       "blockip": "{{GENDER:$1|ਵਰਤੋਂਕਾਰ}} 'ਤੇ ਰੋਕ ਲਾਉ",
        "blockip-legend": "ਵਰਤੋਂਕਾਰ 'ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
        "ipaddressorusername": "IP ਐਡਰੈਸ ਜਾਂ ਯੂਜ਼ਰ ਨਾਂ:",
        "ipbexpiry": "ਮਿਆਦ:",
        "ipbreason": "ਕਾਰਨ:",
        "ipbcreateaccount": "ਖਾਤਾ ਬਣਾਉਣ 'ਤੇ ਰੋਕ ਲਾਓ",
        "ipbemailban": "ਵਰਤੋਂਕਾਰ ਉੱਤੇ ਈਮੇਲ ਭੇਜਣ ਦੀ ਰੋਕ ਲਾਓ",
-       "ipbsubmit": "à¨\87ਹ à¨¯à©\82à¨\9c਼ਰ à¨²à¨\88 à¨ªà¨¾à¨¬à©°à¨¦à©\80",
+       "ipbsubmit": "à¨\87ਸ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ 'ਤà©\87 à¨°à©\8bà¨\95 à¨²à¨¾à¨\89",
        "ipbother": "ਹੋਰ ਟਾਈਮ:",
        "ipboptions": "2 ਘੰਟੇ:2 hours, 1 ਦਿਨ:1 day, 3 ਦਿਨ:3 days, 1 ਹਫ਼ਤਾ:1 week, 2 ਹਫ਼ਤੇ:2 weeks, 2 ਮਹੀਨਾ:1 month, 3 ਮਹੀਨੇ:3 months, 6 ਮਹੀਨੇ:6 months, 1 ਸਾਲ:1 year, ਹਮੇਸ਼ਾਂ ਲਈ:infinite",
        "ipbhidename": "ਸੋਧਾਂ ਅਤੇ ਕੜੀਆਂ ਤੋਂ ਵਰਤੋਂਕਾਰ ਦਾ ਨਾਂ ਲੁਕਾਓ",
        "ipb-unblock": "ਇੱਕ ਯੂਜ਼ਰ ਨਾਂ ਜਾਂ IP ਐਡਰੈੱਸ ਅਣ-ਬਲਾਕ ਕਰੋ",
        "ipb-blocklist": "ਮੌਜੂਦਾ ਪਾਬੰਦੀਆਂ ਵੇਖੋ",
        "ipb-blocklist-contribs": "$1 ਦੇ ਯੋਗਦਾਨ",
-       "unblockip": "ਯà©\82à¨\9c਼ਰ à¨\85ਣ-ਬਲਾà¨\95 à¨\95ਰà©\8b",
+       "unblockip": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¤à©\8bà¨\82 à¨°à©\8bà¨\95 à¨¹à¨\9fਾà¨\89",
        "ipusubmit": "ਇਹ ਪਾਬੰਦੀ ਹਟਾਓ",
        "unblocked": "[[User:$1|$1]] ਪਾਬੰਦੀ ਮੁਕਤ ਹੋ ਚੁੱਕਾ ਹੈ",
        "unblocked-range": "$1 ਪਾਬੰਦੀ ਮੁਕਤ ਹੋ ਚੁੱਕੀ ਹੈ",
        "unblocklogentry": "$1 ਤੋਂ ਪਾਬੰਦੀ ਹਟਾਈ",
        "block-log-flags-anononly": "ਸਿਰਫ਼ ਗੁੰਮਨਾਮ ਮੈਂਬਰ",
        "block-log-flags-nocreate": "ਖਾਤਾ ਬਣਾਉਣ ’ਤੇ ਪਾਬੰਦੀ ਹੈ",
+       "block-log-flags-noemail": "ਈਮੇਲ ਬੰਦ ਹੈ",
        "block-log-flags-nousertalk": "ਆਪਣਾ ਗੱਲ-ਬਾਤ ਸਫ਼ਾ ਨਹੀਂ ਸੋਧ ਸਕਦਾ",
        "block-log-flags-hiddenname": "ਵਰਤੋਂਕਾਰ ਨਾਂ ਲੁਕਾਇਆ ਹੋਇਆ",
        "ipb_expiry_invalid": "ਖ਼ਤਮ ਹੋਣ ਦਾ ਸਮਾਂ ਗ਼ਲਤ।",
        "ipbblocked": "ਤੁਸੀਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਪਾਬੰਦੀਸ਼ੁਦਾ ਜਾਂ ਪਾਬੰਦੀ-ਮੁਕਤ ਨਹੀਂ ਕਰ ਸਕਦੇ ਕਿਉਂਕਿ ਤੁਸੀਂ ਖ਼ੁਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੋ",
        "ipbnounblockself": "ਤੁਹਾਨੂੰ ਖ਼ੁਦ ਨੂੰ ਪਾਬੰਦੀ-ਮੁਕਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ",
        "lockdb": "ਡਾਟਾਬੇਸ ਲਾਕ",
+       "unlockdb": "ਤੱਥ-ਅਧਾਰ ਖੋਲ੍ਹੋ",
+       "unlockconfirm": "ਹਾਂ, ਮੈਂ ਸੱਚੀਂ ਤੱਥ-ਅਧਾਰ ਖੋਲ੍ਹਣਾ ਹੈ।",
        "move-page": "$1 ਭੇਜੋ",
        "move-page-legend": "ਸਫ਼ਾ ਭੇਜੋ",
        "movearticle": "ਸਫ਼ਾ ਭੇਜੋ:",
        "movenologintext": "ਇਕ ਸਫ਼ੇ ਦਾ ਸਿਰਲੇਖ ਬਦਲਣ ਲਈ ਤੁਸੀਂ ਰਜਿਸਟਰਡ ਮੈਂਬਰ ਹੋਣੇ ਚਾਹੀਦੇ ਹੋ ਅਤੇ [[Special:UserLogin|ਲਾਗਇਨ]] ਕੀਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
+       "movenotallowed": "ਤੁਹਾਡੇ ਕੋਲ਼ ਸਫ਼ੇ ਹਿਲਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "movenotallowedfile": "ਤੁਹਾਨੂੰ ਫ਼ਾਈਲਾਂ ਭੇਜਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "cant-move-user-page": "ਤੁਹਾਨੂੰ ਵਰਤੋਂਕਾਰ ਸਫ਼ਿਆਂ (ਉਪ-ਸਫ਼ਿਆਂ ਤੋਂ ਛੁੱਟ) ਨੂੰ ਭੇਜਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "newtitle": "ਨਵੇਂ ਟਾਈਟਲ ਲਈ:",
        "delete_and_move_confirm": "ਹਾਂ, ਸਫ਼ਾ ਮਿਟਾ ਦੇਵੋ",
        "immobile-source-page": "ਇਹ ਸਫ਼ਾ ਭੇਜਣ ਯੋਗ ਨਹੀਂ ਹੈ।",
        "move-leave-redirect": "ਪਿੱਛੇ ਇਕ ਰੀਡਿਰੈਕਟ ਛੱਡੋ",
-       "export": "ਸਫ਼à©\87 à¨¨à¨¿à¨°à¨¯à¨¾à¨¤ à¨\95ਰà©\8b",
-       "exportall": "ਸਾਰà©\87 à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨¦à¨¾ à¨¨à¨¿à¨°à¨¯à¨¾à¨¤ à¨\95ਰà©\8b",
+       "export": "à¨\9cà©\81à¨\97ਤਾà¨\82 à¨¦à©\80 à¨¬à¨°à¨¾à¨®à¨¦",
+       "exportall": "ਸਾਰà©\87 à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨¦à©\80 à¨¬à¨°à¨¾à¨®à¨¦",
        "exportcuronly": "ਸਿਰਫ਼ ਮੌਜੂਦਾ ਰੀਵਿਜ਼ਨ ਸ਼ਾਮਲ ਕਰੋ, ਸਾਰਾ ਅਤੀਤ ਨਹੀਂ",
        "export-submit": "ਐਕਸਪੋਰਟ",
        "export-addcattext": "ਇਸ ਸ਼੍ਰੇਣੀ ਤੋਂ ਸਫ਼ੇ ਜੋੜੋ",
        "allmessages-filter-all": "ਸਭ",
        "allmessages-filter-modified": "ਬਦਲਿਆ ਗਿਆ",
        "allmessages-prefix": "ਇਸ ਅਗੇਤਰ ਨਾਲ਼ ਛਾਣੋ:",
-       "allmessages-language": "ਭਾਸ਼ਾ:",
+       "allmessages-language": "ਬà©\8bਲà©\80:",
        "allmessages-filter-submit": "ਜਾਓ",
        "allmessages-filter-translate": "ਤਰਜਮਾ ਕਰੋ",
        "thumbnail-more": "ਵਧਾਓ",
        "thumbnail_error": "ਨਮੂਨਾ ਬਣਾਉਣ ਵਿੱਚ ਗਲਤੀ ਹੋਈ ਹੈ: $1",
        "import": "ਸਫ਼ੇ ਮੰਗਾਓ",
        "importinterwiki": "ਅੰਤਰ-ਵਿਕੀ ਮੰਗ",
-       "import-interwiki-source": "ਸਰੋਤ ਵਿਕੀ/ਸਫ਼ਾ:",
+       "import-interwiki-sourcewiki": "ਮੁੱਢਲਾ ਵਿਕੀ:",
+       "import-interwiki-sourcepage": "ਮੁੱਢਲਾ ਸਫ਼ਾ:",
        "import-interwiki-templates": "ਸਾਰੇ ਫਰਮੇ ਸ਼ਾਮਲ ਕਰੋ",
        "import-interwiki-submit": "ਮੰਗਾਓ",
+       "import-interwiki-namespace": "ਨੀਯਤ ਨਾਂ-ਥਾਂ:",
        "import-upload-filename": "ਫ਼ਾਈਲ ਦਾ ਨਾਂ:",
        "import-comment": "ਟਿੱਪਣੀ:",
        "importstart": "ਪੇਜ ਇੰਪੋਰਟ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ...",
        "import-token-mismatch": "ਇਸ ਇਜਲਾਸ ਦਾ ਡਾਟਾ ਉੱਡ ਗਿਆ।\nਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।",
        "import-invalid-interwiki": "ਦੱਸੇ ਹੋਏ ਵਿਕੀ ਤੋਂ ਮੰਗਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।",
        "importlogpage": "ਮੰਗਾਉਣ ਦਾ ਚਿੱਠਾ",
-       "import-logentry-upload-detail": "$1 ਰੀਵਿਜਨ",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|ਸੁਧਾਈ|ਸੁਧਾਈਆਂ}} ਦੀ ਦਰਾਮਦ ਹੋਈ",
+       "import-logentry-interwiki": "$1 ਦੀ ਵਿਕੀ-ਪਾਰ ਘੱਲਿਆ",
        "tooltip-pt-userpage": "ਤੁਹਾਡਾ ਵਰਤੋਂਕਾਰ ਸਫ਼ਾ",
        "tooltip-pt-mytalk": "ਤੁਹਾਡਾ ਗੱਲ-ਬਾਤ ਸਫ਼ਾ",
        "tooltip-pt-anontalk": "ਇਸ IP ਪਤੇ ਤੋਂ ਹੋਈਆਂ ਸੋਧਾਂ ਬਾਰੇ ਚਰਚਾ",
-       "tooltip-pt-preferences": "ਤà©\81ਹਾਡà©\80à¨\86à¨\82 à¨ªà¨¸à©°à¨¦ਾਂ",
+       "tooltip-pt-preferences": "ਤà©\81ਹਾਡà©\80à¨\86à¨\82 à¨¤à¨°à¨\9cà©\80ਹਾਂ",
        "tooltip-pt-watchlist": "ਉਹਨਾਂ ਸਫ਼ਿਆਂ ਦੀ ਸੂਚੀ ਜਿਹਨਾਂ ਦੀਆਂ ਤਬਦੀਲੀਆਂ 'ਤੇ ਤੁਸੀਂ ਅੱਖ ਰੱਖ ਰਹੇ ਹੋ",
        "tooltip-pt-mycontris": "ਤੁਹਾਡੇ ਯੋਗਦਾਨਾਂ ਦੀ ਸੂਚੀ",
        "tooltip-pt-login": "ਤੁਹਾਨੂੰ ਦਾਖ਼ਲ ਹੋਣ ਲਈ ਪ੍ਰੇਰਿਆ ਜਾਂਦਾ ਹੈ; ਪਰ ਇਹ ਕੋਈ ਲਾਜ਼ਮੀ ਨਹੀਂ",
-       "tooltip-pt-logout": "ਸਾà¨\88à¨\9f à¨¤à©\8bà¨\82 à¨µà¨¿à¨¦à¨¾à¨\88 à¨²à¨\93",
+       "tooltip-pt-logout": "ਸਾà¨\88à¨\9f à¨¤à©\8bà¨\82 à¨¬à¨¾à¨¹à¨° à¨\86à¨\89",
        "tooltip-ca-talk": "ਸਮਗੱਰੀ ਸਫ਼ੇ ਬਾਰੇ ਚਰਚਾ",
        "tooltip-ca-edit": "ਤੁਸੀਂ ਇਹ ਸਫ਼ਾ ਸੋਧ ਸਕਦੇ ਹੋ। ਕਿਰਪਾ ਕਰਕੇ ਤਬਦੀਲੀ ਸਾਂਭਣ ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਵੇਖੋ।",
        "tooltip-ca-addsection": "ਨਵਾਂ ਭਾਗ ਸ਼ੁਰੂ ਕਰੋ",
        "tooltip-t-emailuser": "ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ",
        "tooltip-t-upload": "ਫ਼ਾਈਲਾਂ ਅਪਲੋਡ ਕਰੋ",
        "tooltip-t-specialpages": "ਸਾਰੇ ਖ਼ਾਸ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ",
-       "tooltip-t-print": "à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¦à¨¾ à¨\9bਪਣਯà©\8bà¨\97 à¨µà¨°à¨\9cਨ",
+       "tooltip-t-print": "à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¦à¨¾ à¨\9bਪਣਯà©\8bà¨\97 à¨°à©\82ਪ",
        "tooltip-t-permalink": "ਸਫ਼ੇ ਦੇ ਇਸ ਰੀਵਿਜਨ ਲਈ ਪੱਕੀ ਕੜੀ",
        "tooltip-ca-nstab-main": "ਸਮੱਗਰੀ ਸਫ਼ਾ ਵੇਖੋ",
        "tooltip-ca-nstab-user": "ਵਰਤੋਂਕਾਰ ਸਫ਼ਾ ਵੇਖੋ",
        "tooltip-undo": "\"ਉਧੇੜਨਾ\" ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਰੱਦ ਕਰਕੇ ਸੋਧ ਫਾਰਮ ਨੂੰ ਝਲਕ ਦੇ ਅੰਦਾਜ਼ ਵਿੱਚ ਦਿਖਾਉਂਦਾ ਹੈ।\nਇੰਝ \"ਸਾਰ\" ਵਿੱਚ ਤਬਦੀਲੀ ਨਕਾਰਨ ਦਾ ਕਾਰਨ ਲਿਖਿਆ ਜਾ ਸਕਦਾ ਹੈ।",
        "tooltip-preferences-save": "ਪਸੰਦ ਸੰਭਾਲੋ",
        "tooltip-summary": "ਸੰਖੇਪ ਸਾਰ ਦਰਜ ਕਰੋ",
+       "siteuser": "{{SITENAME}} ਵਰਤੋਂਕਾਰ $1",
+       "anonuser": "{{SITENAME}} ਬੇਨਾਮ ਵਰਤੋਂਕਾਰ $1",
        "lastmodifiedatby": "ਇਹ ਸਫ਼ਾ ਆਖ਼ਰੀ ਵਾਰ $1 ਨੂੰ $2 ’ਤੇ $3 ਨੇ ਸੋਧਿਆ ਸੀ।",
+       "othercontribs": "$1 ਦੇ ਕਾਰਜ 'ਤੇ ਅਧਾਰਤ।",
        "others": "ਹੋਰ",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|ਵਰਤੋਂਕਾਰ|ਵਰਤੋਂਕਾਰਾਂ}} $1",
+       "anonusers": "{{SITENAME}} ਬੇਨਾਮ {{PLURAL:$2|ਵਰਤੋਂਕਾਰ|ਵਰਤੋਂਕਾਰ}} $1",
        "creditspage": "ਸਫ਼ੇ ਬਾਬਤ ਕਰਜ਼",
        "spamprotectiontitle": "Spam ਸੁਰੱਖਿਆ ਫਿਲਟਰ",
+       "pageinfo-title": "\"$1\" ਵਾਸਤੇ ਜਾਣਕਾਰੀ",
+       "pageinfo-not-current": "ਅਫ਼ਸੋਸ, ਪੁਰਾਣੀਆਂ ਸੁਧਾਈਆਂ ਵਾਸਤੇ ਇਹ ਜਾਣਕਾਰੀ ਦੇਣੀ ਅਸੰਭਵ ਹੈ।",
        "pageinfo-header-basic": "ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ",
        "pageinfo-header-edits": "ਸੋਧਾਂ ਦਾ ਅਤੀਤ",
        "pageinfo-header-restrictions": "ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ",
        "pageinfo-header-properties": "ਸਫ਼ਾ ਵਿਸ਼ੇਸ਼ਤਾ",
+       "pageinfo-display-title": "ਨੁਮਾਇਸ਼ੀ ਸਿਰਲੇਖ",
        "pageinfo-length": "ਸਫ਼ੇ ਦੀ ਲੰਬਾਈ (ਬਾਈਟਾਂ ਵਿਚ)",
        "pageinfo-article-id": "ਸਫ਼ੇ ਦੀ ਸ਼ਨਾਖ਼ਤ",
        "pageinfo-language": "ਸਫ਼ੇ ਦੀ ਸਮੱਗਰੀ ਦੀ ਭਾਸ਼ਾ",
        "pageinfo-views": "ਵਖਾਵਿਆਂ ਦੀ ਗਿਣਤੀ",
        "pageinfo-watchers": "ਸਫ਼ੇ ’ਤੇ ਨਜ਼ਰ ਰੱਖਣ ਵਾਲਿਆਂ ਦੀ ਗਿਣਤੀ",
        "pageinfo-subpages-name": "ਇਸ ਸਫ਼ੇ ਦੇ ਉਪ-ਸਫ਼ੇ",
+       "pageinfo-firstuser": "ਸਫ਼ੇ ਦਾ ਉਸਰਈਆ",
+       "pageinfo-firsttime": "ਸਫ਼ਾ ਬਣਨ ਦੀ ਮਿਤੀ",
        "pageinfo-lastuser": "ਸਭ ਤੋਂ ਨਵਾਂ ਸੰਪਾਦਕ",
        "pageinfo-lasttime": "ਸਭ ਤੋਂ ਨਵੀਂ ਸੋਧ ਦੀ ਮਿਤੀ",
        "pageinfo-edits": "ਕੁੱਲ ਸੋਧਾਂ",
+       "pageinfo-authors": "ਨਿਵੇਕਲੇ ਲੇਖਕਾਂ ਦੀ ਕੁੱਲ ਗਿਣਤੀ",
+       "pageinfo-recent-edits": "ਸੋਧਾਂ ਦੀ ਹਾਲੀਆ ਗਿਣਤੀ (ਪਿਛਲੇ $1 ਵਿੱਚ)",
+       "pageinfo-recent-authors": "ਨਿਵੇਕਲੇ ਲੇਖਕਾਂ ਦੀ ਹਾਲੀਆ ਗਿਣਤੀ",
+       "pageinfo-magic-words": "ਜਾਦੂਈ {{PLURAL:$1|ਸ਼ਬਦ|ਸ਼ਬਦ}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|ਲੁਕੀ ਸ਼੍ਰੇਣੀ|ਲੁਕੀਆਂ ਸ਼੍ਰੇਣੀਆਂ}} ($1)",
        "pageinfo-toolboxlink": "ਸਫ਼ੇ ਬਾਬਤ ਜਾਣਕਾਰੀ",
        "pageinfo-redirectsto-info": "ਜਾਣਕਾਰੀ",
        "pageinfo-contentpage": "ਸਮੱਗਰੀ ਸਫ਼ੇ ਵਜੋਂ ਗਿਣਿਆ ਗਿਆ",
        "pageinfo-category-pages": "ਸਫ਼ਿਆਂ ਦੀ ਗਿਣਤੀ",
        "pageinfo-category-subcats": "ਉਪ-ਸ਼੍ਰੇਣੀਆਂ ਦੀ ਗਿਣਤੀ",
        "pageinfo-category-files": "ਫ਼ਾਈਲਾਂ ਦੀ ਗਿਣਤੀ",
+       "markaspatrolleddiff": "ਗਸ਼ਤ ਕੀਤੇ ਵਜੋਂ ਨਿਸ਼ਾਨ ਲਾਉ",
+       "markaspatrolledtext": "ਇਸ ਸਫ਼ੇ ਉੱਤੇ ਗਸ਼ਤ ਕੀਤੇ ਵਜੋਂ ਨਿਸ਼ਾਨ ਲਾਉ",
+       "markedaspatrolled": "ਗਸ਼ਤ ਕੀਤੇ ਵਜੋਂ ਨਿਸ਼ਾਨ ਲਾਇਆ",
+       "markedaspatrollederror": "ਗਸ਼ਤ ਕੀਤੇ ਵਜੋਂ ਨਿਸ਼ਾਨ ਨਹੀਂ ਲਾਇਆ ਜਾ ਸਕਦਾ",
+       "patrol-log-page": "ਗਸ਼ਤ ਦਾ ਇੰਦਰਾਜ",
+       "patrol-log-header": "ਇਹ ਗਸ਼ਤ ਕੀਤੀਆਂ ਸੁਧਾਈਆਂ ਦਾ ਇੰਦਰਾਜ ਹੈ।",
+       "deletedrevision": "ਪੁਰਾਣੀ ਸੁਧਾਈ $1 ਮਿਟਾਈ ਗਈ",
+       "filedeleteerror-short": "ਇਹ ਫ਼ਾਈਲ ਮਿਟਾਉਣ 'ਚ ਦੋਸ਼: $1",
        "previousdiff": "← ਪੁਰਾਣੀ ਤਬਦੀਲੀ",
        "nextdiff": "ਨਵੀਂ ਤਬਦੀਲੀ →",
        "thumbsize": "ਥੰਮਨੇਲ ਆਕਾਰ:",
        "file-nohires": "ਇਸ ਤੋਂ ਵੱਡੀ ਤਸਵੀਰ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "svg-long-desc": "SVG ਫ਼ਾਈਲ, ਆਮ ਤੌਰ ’ਤੇ $1 × $2 ਪਿਕਸਲ, ਫ਼ਾਈਲ ਦਾ ਅਕਾਰ: $3",
        "show-big-image": "ਅਸਲ ਫਾਈਲ",
+       "show-big-image-preview": "ਇਸ ਝਾਤ ਦਾ ਅਕਾਰ: $1.",
        "show-big-image-size": "$1 × $2 ਪਿਕਸਲ",
        "newimages": "ਨਵੀਆਂ ਫ਼ਾਈਲਾਂ ਦੀ ਗੈਲਰੀ",
        "newimages-legend": "ਫਿਲਟਰ",
+       "newimages-label": "ਫ਼ਾਈਲ ਦਾ ਨਾਂ (ਜਾਂ ਉਹਦਾ ਕੋਈ ਹਿੱਸਾ):",
+       "newimages-showbots": "ਮਸ਼ੀਨਾਂ ਦੇ ਚੜ੍ਹਾਵੇ ਵਿਖਾਉ",
        "noimages": "ਵੇਖਣ ਲਈ ਕੁਝ ਨਹੀਂ",
        "ilsubmit": "ਖੋਜ",
        "bydate": "ਮਿਤੀ ਨਾਲ",
        "metadata-fields": "ਇਸ ਸੁਨੇਹੇ ਵਿੱਚ ਸੂਚੀਬੱਧ ਖੇਤਰ ਚਿੱਤਰ ਪੰਨੇ ’ਚ ਸ਼ਾਮਲ ਕੀਤੇ ਜਾਣਗੇ ਜੋ ਉਦੋਂ ਦਿੱਸਦੇ ਹਨ ਜਦੋ ਮੈਟਾਡੈਟਾ ਖਾਕਾ ਬੰਦ ਹੋਵੇ। ਬਾਕੀ ਉਂਞ ਹੀ ਲੁਕੇ ਹੋਣਗੇ।",
        "exif-imagewidth": "ਚੌੜਾਈ",
        "exif-imagelength": "ਉਚਾਈ",
+       "exif-compression": "ਨਪੀੜਨ ਦੀ ਜੁਗਤ",
+       "exif-photometricinterpretation": "ਪਿਕਸਲਾਂ ਦੀ ਬਣਤਰ",
+       "exif-orientation": "ਦਿਸ਼ਾਮਾਨ",
        "exif-samplesperpixel": "ਭਾਗਾਂ ਦੀ ਗਿਣਤੀ",
+       "exif-planarconfiguration": "ਅੰਕੜਿਆਂ ਦਾ ਇੰਤਜ਼ਾਮ",
+       "exif-ycbcrpositioning": "Y ਅਤੇ C ਦਾ ਟਿਕਾਣਾ",
+       "exif-xresolution": "ਲੇਟਵੀਂ ਨੁਕਤਾ-ਗਿਣਤੀ",
+       "exif-yresolution": "ਖੜ੍ਹਵੀਂ ਨੁਕਤਾ-ਗਿਣਤੀ",
+       "exif-stripoffsets": "ਤਸਵੀਰੀ ਅੰਕੜਿਆਂ ਦਾ ਟਿਕਾਣਾ",
        "exif-rowsperstrip": "ਪ੍ਰਤੀ ਪੱਟੀ ਕਤਾਰਾਂ ਦੀ ਗਿਣਤੀ",
+       "exif-stripbytecounts": "ਹਰੇਕ ਨਪੀੜੀ ਪੱਟੀ 'ਚ ਬਾਈਟ",
        "exif-jpeginterchangeformatlength": "JPEG ਸਮੱਗਰੀ ਦੇ ਬਾਈਟ",
+       "exif-whitepoint": "ਚਿੱਟੀ ਬਿੰਦੀ ਦੀ ਰੰਗਤ",
+       "exif-primarychromaticities": "ਮੁੱਢਲਿਆਂ ਦੀ ਰੰਗਤ",
+       "exif-datetime": "ਫ਼ਾਈਲ ਤਬਦੀਲੀ ਦੀ ਮਿਤੀ ਅਤੇ ਸਮਾਂ",
        "exif-imagedescription": "ਚਿੱਤਰ ਟਾਇਟਲ",
        "exif-make": "ਕੈਮਰਾ ਨਿਰਮਾਤਾ",
        "exif-model": "ਕੈਮਰਾ ਮਾਡਲ",
        "exif-software": "ਵਰਤਿਆ ਸਾਫਟਵੇਅਰ",
        "exif-artist": "ਲੇਖਕ",
        "exif-copyright": "ਕਾਪੀਰਾਈਟ ਟਾਇਟਲ",
+       "exif-exifversion": "ਐਗਜ਼ਿਫ਼ ਦਾ ਰੂਪ",
        "exif-pixelydimension": "ਤਸਵੀਰ ਦੀ ਚੌੜਾਈ",
        "exif-pixelxdimension": "ਤਸਵੀਰ ਦੀ ਲੰਬਾਈ",
        "exif-usercomment": "ਵਰਤੋਂਕਾਰ ਦੀਆਂ ਟਿੱਪਣੀਆਂ",
        "exif-relatedsoundfile": "ਮਿਲਦੀ-ਜੁਲਦੀ ਆਡੀਓ ਫ਼ਾਈਲ",
+       "exif-datetimedigitized": "ਅੰਕਰੂਪ ਕਰਨ ਦੀ ਮਿਤੀ ਅਤੇ ਸਮਾਂ",
        "exif-fnumber": "ਐੱਫ਼ ਨੰਬਰ",
        "exif-subjectdistance": "ਵਿਸ਼ੇ ਦੀ ਵਿੱਥ",
        "exif-lightsource": "ਚਾਨਣ ਦਾ ਸਰੋਤ",
        "exif-focallength": "ਲੈਨਜ਼ ਦੀ ਫੋਕਲ-ਲੰਬਾਈ",
        "exif-subjectarea": "ਵਿਸ਼ਾ ਖੇਤਰ",
        "exif-flashenergy": "ਫ਼ਲੈਸ਼ ਦੀ ਊਰਜਾ",
+       "exif-subjectlocation": "ਵਿਸ਼ੇ ਦਾ ਟਿਕਾਣਾ",
+       "exif-exposureindex": "ਉਘਾੜ ਸੂਚਕ",
        "exif-filesource": "ਫ਼ਾਈਲ ਦਾ ਸਰੋਤ",
        "exif-scenetype": "ਸੀਨ ਦੀ ਕਿਸਮ",
+       "exif-whitebalance": "ਚਿੱਟਾ ਸੰਤੁਲਨ",
+       "exif-contrast": "ਵਖਰੇਵਾਂ",
+       "exif-saturation": "ਰਜਾਓ",
+       "exif-sharpness": "ਤਿੱਖਾਪਣ",
+       "exif-devicesettingdescription": "ਜੰਤਰ ਦੀਆਂ ਸੈਟਿੰਗਾਂ ਦਾ ਵੇਰਵਾ",
        "exif-gpslatituderef": "ਉੱਤਰੀ ਜਾਂ ਦੱਖਣੀ ਅਕਸ਼ਾਂਸ਼",
        "exif-gpslatitude": "ਅਕਸ਼ਾਂਸ਼",
        "exif-gpslongituderef": "ਪੂਰਬੀ ਜਾਂ ਪੱਛਮੀ ਰੇਖਾਂਸ਼",
        "exif-gpsaltitude": "ਉਚਾਈ",
        "exif-gpstimestamp": "ਜੀ੦ਪੀ੦ਐੱਸ ਸਮਾਂ (ਪ੍ਰਮਾਣੂ ਘੜੀ)",
        "exif-gpssatellites": "ਮਿਣਨ ਲਈ ਵਰਤੇ ਗਏ ਉਪਗ੍ਰਹਿ",
+       "exif-gpsstatus": "ਵਸੂਲੀਏ ਦੀ ਹਾਲਤ",
+       "exif-gpsmeasuremode": "ਨਾਪ ਦਾ ਤਰੀਕਾ",
+       "exif-gpsdop": "ਨਾਪ ਦਾ ਸਹੀਪੁਣਾ",
        "exif-gpsspeedref": "ਗਤੀ ਦੀ ਇਕਾਈ",
+       "exif-gpsspeed": "ਜੀ.ਪੀ.ਐੱਸ. ਵਸੂਲੀਏ ਦੀ ਰਫ਼ਤਾਰ",
        "exif-gpstrack": "ਚਾਲ ਦੀ ਦਿਸ਼ਾ",
        "exif-gpsimgdirection": "ਤਸਵੀਰ ਦੀ ਦਿਸ਼ਾ",
+       "exif-gpsdestdistance": "ਮੰਜ਼ਲ ਤੱਕ ਦੂਰੀ",
+       "exif-gpsprocessingmethod": "ਜੀ.ਪੀ.ਐੱਸ. ਕਾਰਵਾਈ ਦੇ ਤਰੀਕੇ ਦਾ ਨਾਂ",
        "exif-gpsareainformation": "ਜੀਪੀਐੱਸ ਖੇਤਰ ਦਾ ਨਾਂ",
        "exif-gpsdatestamp": "GPS ਮਿਤੀ",
+       "exif-keywords": "ਖ਼ਾਸ ਲਫ਼ਜ਼",
+       "exif-worldregioncreated": "ਦੁਨੀਆਂ ਦਾ ਉਹ ਇਲਾਕਾ ਜਿੱਥੇ ਇਹ ਤਸਵੀਰ ਲਈ ਗਈ ਸੀ",
        "exif-countrycreated": "ਉਹ ਦੇਸ਼ ਜਿਸ ਵਿਚ ਇਹ ਤਸਵੀਰ ਲਈ ਗਈ ਸੀ",
        "exif-countrycodecreated": "ਉਸ ਦੇਸ਼ ਦਾ ਕੋਡ ਜਿਸ ਵਿਚ ਇਹ ਤਸਵੀਰ ਲਈ ਗਈ ਸੀ",
        "exif-provinceorstatecreated": "ਸੂਬਾ ਜਾਂ ਰਾਜ ਜਿਸ ਵਿਚ ਇਹ ਤਸਵੀਰ ਲਈ ਗਈ ਸੀ",
        "exif-citycreated": "ਸ਼ਹਿਰ ਜਿਸ ਵਿਚ ਇਹ ਤਸਵੀਰ ਲਈ ਗਈ ਸੀ",
+       "exif-sublocationcreated": "ਸ਼ਹਿਰ ਦਾ ਉਹ ਟਿਕਾਣਾ ਜਿੱਥੇ ਇਹ ਤਸਵੀਰ ਲਈ ਗਈ ਸੀ",
        "exif-worldregiondest": "ਦਰਸਾਇਆ ਗਿਆ ਦੁਨਿਆਵੀ ਖੇਤਰ",
        "exif-countrydest": "ਦਰਸਾਇਆ ਗਿਆ ਦੇਸ਼",
        "exif-countrycodedest": "ਦਰਸਾਏ ਗਏ ਦੇਸ਼ ਲਈ ਕੋਡ",
        "exif-provinceorstatedest": "ਦਰਸਾਇਆ ਗਿਆ ਸੂਬਾ ਜਾਂ ਰਾਜ",
        "exif-citydest": "ਦਰਸਾਇਆ ਗਿਆ ਸ਼ਹਿਰ",
+       "exif-sublocationdest": "ਵਿਖਾਏ ਗਏ ਸ਼ਹਿਰ ਦਾ ਟਿਕਾਣਾ",
        "exif-objectname": "ਛੋਟਾ ਸਿਰਲੇਖ",
        "exif-specialinstructions": "ਖ਼ਾਸ ਹਦਾਇਤਾਂ",
        "exif-headline": "ਸਿਰਨਾਵਾਂ",
        "exif-source": "ਸਰੋਤ",
        "exif-editstatus": "ਤਸਵੀਰ ਦਾ ਸੰਪਾਦਕੀ ਰੁਤਬਾ",
+       "exif-urgency": "ਲੋੜਵੰਦੀ",
+       "exif-fixtureidentifier": "ਜੜਤ ਦਾ ਨਾਂ",
        "exif-locationdest": "ਦਰਸਾਈ ਗਈ ਥਾਂ",
        "exif-locationdestcode": "ਦਰਸਾਈ ਥਾਂ ਦਾ ਕੋਡ",
        "exif-contact": "ਰਾਬਤੇ ਦੀ ਜਾਣਕਾਰੀ",
        "exif-writer": "ਲੇਖਕ",
-       "exif-languagecode": "ਭਾਸ਼ਾ",
+       "exif-languagecode": "ਬà©\8bਲà©\80",
        "exif-iimversion": "IIM ਵਰਜ਼ਨ",
        "exif-iimcategory": "ਸ਼੍ਰੇਣੀ",
+       "exif-iimsupplementalcategory": "ਪੂਰਕ ਸ਼੍ਰੇਣੀਆਂ",
+       "exif-datetimeexpires": "ਇਸ ਮਗਰੋਂ ਨ ਵਰਤੋ",
+       "exif-identifier": "ਸ਼ਨਾਖ਼ਤਕਾਰ",
        "exif-lens": "ਵਰਤਿਆ ਗਿਆ ਲੈਨਜ਼",
        "exif-serialnumber": "ਕੈਮਰੇ ਦਾ ਸੀਰੀਅਲ ਨੰਬਰ",
        "exif-cameraownername": "ਕੈਮਰੇ ਦਾ ਮਾਲਕ",
        "exif-label": "ਲੇਬਲ",
        "exif-datetimemetadata": "ਮੈਟਾਡਾਟਾ ਦੀ ਆਖ਼ਰੀ ਤਬਦੀਲੀ ਦੀ ਮਿਤੀ",
        "exif-nickname": "ਤਸਵੀਰ ਦਾ ਗ਼ੈਰ-ਰਸਮੀ ਨਾਂ",
+       "exif-rating": "ਦਰਜਾ (੫ ਵਿੱਚੋਂ)",
        "exif-rightscertificate": "ਹੱਕਾਂ ਦੇ ਪ੍ਰਬੰਧ ਦਾ ਪ੍ਰਮਾਣ-ਪੱਤਰ",
        "exif-copyrighted": "ਕਾਪੀਰਾਈਟ ਦਰਜਾ",
        "exif-copyrightowner": "ਕਾਪੀਰਾਈਟ ਦਾ ਮਾਲਕ",
        "exif-usageterms": "ਵਰਤੋਂ ਦੀਆਂ ਸ਼ਰਤਾਂ",
        "exif-webstatement": "ਕਾਪੀਰਾਈਟ ਦਾ ਆਨਲਾਈਨ ਬਿਆਨ",
+       "exif-originaldocumentid": "ਮੂਲ ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਲੱਖਣ ਸ਼ਨਾਖ਼ਤ",
+       "exif-licenseurl": "ਨਕਲ-ਹੱਕ ਲਸੰਸ ਵਾਸਤੇ ਯੂ.ਆਰ.ਐੱਲ.",
        "exif-pngfilecomment": "PNG ਫ਼ਾਈਲ ਦੀ ਟਿੱਪਣੀ",
        "exif-disclaimer": "ਦਾਅਵੇ",
        "exif-contentwarning": "ਸਮੱਗਰੀ ਸਬੰਧੀ ਚਿਤਾਵਨੀ",
        "exif-personinimage": "ਦਰਸਾਇਆ ਗਿਆ ਇਨਸਾਨ",
        "exif-originalimageheight": "ਕੱਟਣ ਤੋਂ ਪਹਿਲਾਂ ਤਸਵੀਰ ਦੀ ਉਚਾਈ",
        "exif-originalimagewidth": "ਕੱਟਣ ਤੋਂ ਪਹਿਲਾਂ ਤਸਵੀਰ ਦੀ ਚੌੜਾਈ",
+       "exif-compression-1": "ਬੇਨਪੀੜਿਆ",
+       "exif-copyrighted-true": "ਨਕਲ-ਹੱਕ ਹੇਠ",
        "exif-unknowndate": "ਅਣਪਛਾਤੀ ਮਿਤੀ",
        "exif-orientation-1": "ਸਧਾਰਨ",
+       "exif-orientation-2": "ਲੇਟਵੇਂ ਲੋਟ ਤੁਣਕਿਆ",
        "exif-orientation-3": "੧੮੦° ਘੁਮਾਇਆ ਗਿਆ",
+       "exif-orientation-4": "ਖੜ੍ਹੇ ਲੋਟ ਤੁਣਕਿਆ",
        "exif-orientation-6": "90° ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਇਆ",
        "exif-orientation-7": "90° ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਇਆ ਅਤੇ ਖੜ੍ਹਵੇਂ ਰੂਪ ਵਿੱਚ ਪਲਟਿਆ",
        "exif-orientation-8": "90° ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਇਆ",
        "exif-subjectdistance-value": "$1 ਮੀਟਰ",
        "exif-meteringmode-0": "ਅਣਪਛਾਤਾ",
        "exif-meteringmode-1": "ਔਸਤ",
+       "exif-meteringmode-3": "ਡੱਬ",
+       "exif-meteringmode-4": "ਬਹੁ-ਡੱਬ",
        "exif-meteringmode-5": "ਪੈਟਰਨ",
+       "exif-meteringmode-6": "ਅਧੂਰਾ",
        "exif-meteringmode-255": "ਹੋਰ",
        "exif-lightsource-0": "ਅਣਜਾਣ",
+       "exif-lightsource-1": "ਦਿਨ ਦਾ ਚਾਨਣ",
+       "exif-lightsource-2": "ਫ਼ਲੋਰਚਾਨਣ",
+       "exif-lightsource-3": "ਟੰਗਸਟੱਨ (ਭਖਦਾ ਚਾਨਣ)",
        "exif-lightsource-4": "ਫ਼ਲੈਸ਼",
        "exif-lightsource-9": "ਵਧੀਆ ਮੌਸਮ",
        "exif-lightsource-10": "ਬੱਦਲ ਵਾਲਾ ਮੌਸਮ",
+       "exif-lightsource-11": "ਛਾਂ",
        "exif-lightsource-17": "ਮਿਆਰੀ ਚਾਨਣ A",
        "exif-lightsource-18": "ਮਿਆਰੀ ਚਾਨਣ B",
        "exif-lightsource-19": "ਮਿਆਰੀ ਚਾਨਣ C",
        "exif-lightsource-255": "ਚਾਨਣ ਦਾ ਹੋਰ ਸਰੋਤ",
+       "exif-flash-fired-0": "ਲਿਸ਼ਕ ਨਹੀਂ ਵੱਜੀ",
+       "exif-flash-fired-1": "ਲਿਸ਼ਕ ਵੱਜੀ",
+       "exif-flash-mode-1": "ਲਿਸ਼ਕ ਦਾ ਲਾਜ਼ਮੀ ਵੱਜਣਾ",
+       "exif-flash-mode-2": "ਲਿਸ਼ਕ ਲਾਜ਼ਮੀ ਬੰਦ ਹੋਣੀ",
+       "exif-flash-mode-3": "ਆਪ-ਮੁਹਾਰਾ ਢੰਗ",
        "exif-focalplaneresolutionunit-2": "ਇੰਚ",
+       "exif-sensingmethod-1": "ਬੇਪਰਿਭਾਸ਼ਤ",
+       "exif-customrendered-0": "ਆਮ ਕਾਰਵਾਈ",
+       "exif-customrendered-1": "ਲੋੜ ਮੁਤਾਬਕ ਕਾਰਵਾਈ",
+       "exif-exposuremode-0": "ਸਵੈ-ਉਘਾੜ",
+       "exif-exposuremode-1": "ਹੱਥੀਂ ਉਘਾੜ",
        "exif-scenecapturetype-0": "ਸਟੈਂਡਰਡ",
        "exif-scenecapturetype-1": "ਲੈਂਡਸਕੇਪ",
        "exif-scenecapturetype-2": "ਪੋਰਟਰੇਟ",
        "exif-contrast-1": "ਕੂਲ਼ਾ",
        "exif-contrast-2": "ਕਰੜਾ",
        "exif-saturation-0": "ਸਧਾਰਨ",
+       "exif-saturation-1": "ਘੱਟ ਰਜਾਓ",
+       "exif-saturation-2": "ਭਾਰੀ ਰਜਾਓ",
        "exif-sharpness-0": "ਸਧਾਰਨ",
        "exif-sharpness-1": "ਕੂਲਾ",
        "exif-sharpness-2": "ਕਰੜਾ",
        "exif-gpsdestdistance-k": "ਕਿਲੋਮੀਟਰ",
        "exif-gpsdestdistance-m": "ਮੀਲ",
        "exif-gpsdestdistance-n": "ਸਮੁੰਦਰੀ ਮੀਲ",
+       "exif-gpsdop-excellent": "ਉੱਤਮ ($1)",
        "exif-gpsdop-good": "ਵਧੀਆ ($1)",
        "exif-gpsdop-moderate": "ਠੀਕ-ਠਾਕ ($1)",
+       "exif-gpsdop-fair": "ਠੀਕ-ਠਾਕ ($1)",
        "exif-gpsdop-poor": "ਘਟੀਆ ($1)",
        "exif-objectcycle-a": "ਸਿਰਫ਼ ਸਵੇਰ",
        "exif-objectcycle-p": "ਸਿਰਫ਼ ਸ਼ਾਮ",
        "exif-urgency-normal": "ਸਧਾਰਨ ($1)",
        "exif-urgency-low": "ਨੀਵਾਂ ($1)",
        "exif-urgency-high": "ਉੱਚਾ ($1)",
-       "watchlistall2": "ਸਭ",
        "namespacesall": "ਸਭ",
        "monthsall": "ਸਭ",
        "confirmemail": "ਈ-ਮੇਲ ਪਤਾ ਤਸਦੀਕ ਕਰੋ",
        "confirmemail_send": "ਇੱਕ ਤਸਦੀਕੀ ਕੋਡ ਭੇਜੋ",
        "confirmemail_sent": "ਤਸਦੀਕੀ ਈਮੇਲ ਭੇਜੀ ਗਈ।",
        "confirmemail_invalid": "ਗਲਤ ਪੁਸ਼ਟੀ ਕੋਡ ਹੈ। ਕੋਡ ਦੀ ਮਿਆਦ ਪੁੱਗੀ ਹੋ ਸਕਦੀ ਹੈ।",
+       "confirmemail_needlogin": "ਆਪਣਾ ਈਮੇਲ ਪਤਾ ਤਸਦੀਕ ਕਰਾਉਣ ਵਾਸਤੇ $1 ਜੀ।",
        "confirmemail_success": "ਤੁਹਾਡਾ ਈਮੇਲ ਪਤਾ ਤਸਦੀਕ ਹੋ ਚੁੱਕਾ ਹੈ।\nਤੁਸੀਂ ਹੁਣ [[Special:UserLogin|ਲਾਗਇਨ]] ਕਰ ਕੇ ਵਿਕੀ ਦਾ ਮਜ਼ਾ ਸਕਦੇ ਹੋ।",
        "confirmemail_loggedin": "ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਹੁਣ ਤਸਦੀਕ ਹੋ ਚੁੱਕਾ ਹੈ।",
        "confirmemail_subject": "{{SITENAME}} ਈ-ਮੇਲ ਪਤਾ ਤਸਦੀਕ",
        "table_pager_empty": "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ",
        "autosumm-blank": "ਸਫ਼ੇ ਨੂੰ ਖ਼ਾਲੀ ਕੀਤਾ",
        "autosumm-new": "\"$1\" ਨਾਲ਼ ਸਫ਼ਾ ਬਣਾਇਆ",
+       "autosumm-newblank": "ਖ਼ਾਲੀ ਸਫ਼ਾ ਬਣਾਇਆ",
        "watchlistedit-normal-title": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ",
        "watchlistedit-normal-legend": "ਸਿਰਲੇਖਾਂ ਨੂੰ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚੋਂ ਹਟਾਓ",
        "watchlistedit-normal-submit": "ਸਿਰਲੇਖ ਹਟਾਓ",
        "watchlistedit-raw-done": "ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਅੱਪਡੇਟ ਹੋ ਗਈ ਹੈ।",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕੀਤਾ|$1 ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕੀਤੇ}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 ਸਿਰਲੇਖ ਹਟਾਇਆ|$1 ਸਿਰਲੇਖ ਹਟਾਏ}}:",
+       "watchlistedit-clear-titles": "ਸਿਰਲੇਖ:",
+       "watchlistedit-clear-submit": "ਨਿਗਰਾਨ-ਸੂਚੀ ਸਾਫ਼ ਕਰੋ (ਇਹ ਪੱਕੇ ਤੌਰ 'ਤੇ ਹੈ!)",
+       "watchlistedit-clear-done": "ਤੁਹਾਡੀ ਨਿਗਰਾਨ-ਸੂਚੀ ਸਾਫ਼ ਕਰ ਦਿੱਤੀ ਗਈ ਹੈ।",
+       "watchlistedit-too-many": "ਇੱਥੇ ਵਿਖਾਉਣ ਵਾਸਤੇ ਬਾਹਲੇ ਸਫ਼ੇ ਹਨ।",
+       "watchlisttools-clear": "ਨਿਗਰਾਨ-ਸੂਚੀ ਸਾਫ਼ ਕਰੋ।",
        "watchlisttools-view": "ਸਬੰਧਤ ਤਬਦੀਲੀਆਂ ਵੇਖੋ",
        "watchlisttools-edit": "ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵੇਖੋ ’ਤੇ ਸੋਧੋ",
        "watchlisttools-raw": "ਕੱਚੀ ਨਿਗਰਾਨ-ਸੂਚੀ ਸੋਧੋ",
        "duplicate-defaultsort": "ਪੁਰਾਣੀ ਮੂਲ ਕਰਮਾਂਕਨ ਕੁੰਜੀ $1 ਦੇ ਬਜਾਏ ਹੁਣ ਮੂਲ ਕਰਮਾਂਕਨ ਕੁੰਜੀ $2 ਹੋਵੇਗੀ।",
        "version": "ਵਰਜਨ",
-       "version-skins": "ਸà¨\95ਿਨਾਂ",
+       "version-skins": "ਥਾਪà©\80à¨\86à¨\82 à¨\96ੱਲਾਂ",
        "version-specialpages": "ਖ਼ਾਸ ਸਫ਼ੇ",
+       "version-variables": "ਬਦਲਣਹਾਰ",
+       "version-antispam": "ਫ਼ਜ਼ੂਲ ਮਨਾਹੀ",
        "version-other": "ਹੋਰ",
        "version-hooks": "ਹੁੱਕਾਂ",
        "version-hook-name": "ਹੁੱਕ ਦਾ ਨਾਂ",
-       "version-license": "ਲਸੰਸ",
+       "version-no-ext-name": "[ਕੋਈ ਨਾਂ ਨਹੀਂ]",
+       "version-license": "ਮੀਡੀਆਵਿਕੀ ਲਸੰਸ",
        "version-ext-license": "ਲਸੰਸ",
        "version-ext-colheader-name": "ਇਕਸਟੈਨਸ਼ਨ",
        "version-skin-colheader-name": "ਸਕਿਨ",
        "redirect-lookup": "ਲੱਭੋ:",
        "redirect-value": "ਮੁੱਲ:",
        "redirect-user": "ਵਰਤੋਂਕਾਰ ਦੀ ਆਈ.ਡੀ.",
+       "redirect-page": "ਸਫ਼ੇ ਦੀ ਸ਼ਨਾਖ਼ਤ",
        "redirect-revision": "ਸਫ਼ੇ ਦੀ ਦੁਹਰਾਈ",
        "redirect-file": "ਫ਼ਾਈਲ ਦਾ ਨਾਂ",
        "redirect-not-exists": "ਮੁੱਲ ਲੱਭਿਆ ਨਹੀਂ",
        "blankpage": "ਖ਼ਾਲੀ ਸਫ਼ਾ",
        "intentionallyblankpage": "ਇਹ ਸਫ਼ਾ ਜਾਣ-ਬੁੱਝ ਕੇ ਖ਼ਾਲੀ ਛੱਡਿਆ ਗਿਆ ਹੈ।",
        "external_image_whitelist": " #ਇਸ ਲਾਈਨ ਨੂੰ ਇੰਝ ਹੀ ਰਹਿਣ ਦਿਓ <pre>\n#ਹੇਠਾਂ ਓਹੀ ਐਕਸਪ੍ਰੈਸ਼ਨ ਪਾਓ (ਜਿਹੜਾ ਹਿੱਸਾ // ਦੇ ਵਿਚਾਲੇ ਹੈ)\n#ਇਹ ਬਾਹਰੀ ਤਸਵੀਰਾਂ ਦੇ URLs (ਹੌਟਲਿੰਕਡ) ਨਾਲ ਮਿਲਣਗੀਆਂ\n#ਜਿਹੜੀਆਂ ਮਿਲਣਗੀਆਂ ਓਹ ਬਤੌਰ ਤਸਵੀਰਾਂ ਦਿੱਸਣਗੀਆਂ ਨਹੀਂ ਤਾਂ ਤਸਵੀਰ ਦਾ ਸਿਰਫ਼ ਲਿੰਕ ਨਜ਼ਰ ਆਵੇਗਾ\n#'#' ਨਾਲ਼ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੀਆਂ ਲਾਈਨਾਂ ਟਿੱਪਣੀਆਂ ਵਾਂਗ ਲਈਆਂ ਜਾਂਦੀਆਂ ਹਨ\n#ਇਹ ਕੇਸ-ਇਨਸੈਂਸਟਿਵ ਹੈ\n\n#ਸਾਰੇ ਰੈਜੈਕਸ ਫ਼ਰੈਗਮੈਂਟ ਇਸ ਲਾਈਨ ਤੋਂ ਉੱਪਰ ਪਾਓ। ਇਸ ਲਾਈਨ ਨੂੰ ਇੰਝ ਹੀ ਰਹਿਣ ਦਿਓ </pre>",
-       "tag-filter": "[[Special:Tags|à¨\9fà©\88à¨\97]] à¨«à¨¿à¨²à¨\9fਰ:",
+       "tag-filter": "[[Special:Tags|ਨਿਸ਼ਾਨ]] à¨ªà©\8cਣà©\80:",
        "tag-filter-submit": "ਛਾਨਣੀ",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ਟੈਗ}}]]: $2)",
        "tags-title": "ਟੈਗ",
        "tags-tag": "ਟੈਗ ਦਾ ਨਾਮ",
        "tags-description-header": "ਅਰਥ ਦਾ ਪੂਰਾ ਬਿਓਰਾ",
        "tags-active-header": "ਸਰਗਰਮ?",
-       "tags-hitcount-header": "à¨\9fà©\88à¨\97 à¨\95à©\80ਤà©\80à¨\86à¨\82 ਤਬਦੀਲੀਆਂ",
+       "tags-hitcount-header": "ਨਿਸ਼ਾਨਦà©\87ਹ ਤਬਦੀਲੀਆਂ",
        "tags-active-yes": "ਹਾਂ",
        "tags-active-no": "ਨਹੀਂ",
        "tags-edit": "ਸੋਧੋ",
        "htmlform-chosen-placeholder": "ਕੋਈ ਚੋਣ ਚੁਣੋ",
        "htmlform-cloner-create": "ਹੋਰ ਜੋੜੋ",
        "htmlform-cloner-delete": "ਹਟਾਓ",
+       "htmlform-cloner-required": "ਘੱਟੋ-ਘੱਟ ਇੱਕ ਮੁੱਲ ਚਾਹੀਦਾ ਹੈ।",
        "logentry-delete-delete": "$1 ਨੇ ਸਫ਼ਾ $3 ਮਿਟਾਇਆ",
        "revdelete-content-hid": "ਸਮੱਗਰੀ ਲੁਕਾਈ ਹੋਈ",
        "revdelete-summary-hid": "ਸੋਧ ਸਾਰ ਲੁਕਾਈ ਹੋਈ",
        "logentry-newusers-create": "ਵਰਤੋਂਕਾਰ ਖਾਤਾ $1 ਬਣਾਇਆ ਗਿਆ",
        "logentry-newusers-create2": "ਵਰਤੋਂਕਾਰ ਖਾਤਾ $3, $1 ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ ਸੀ",
        "rightsnone": "(ਕੋਈ ਨਹੀਂ)",
+       "revdelete-summary": "ਸੰਖੇਪ ਸੋਧ",
        "feedback-subject": "ਵਿਸ਼ਾ:",
        "feedback-message": "ਸੁਨੇਹਾ:",
        "feedback-cancel": "ਰੱਦ ਕਰੋ",
        "duration-centuries": "$1 {{PLURAL:$1|ਸਦੀ|ਸਦੀਆਂ}}",
        "duration-millennia": "$1 {{PLURAL:$1|ਸਾਹਸ਼ਤਾਬਦੀ|ਸਾਹਸ਼ਤਾਬਦੀਆਂ}}",
        "rotate-comment": "ਤਸਵੀਰ ਨੂੰ ਘੜੀ ਦੇ ਰੁਖ ਵਿਚ $1 {{PLURAL:$1|ਡਿਗਰੀ|ਡਿਗਰੀਆਂ}} ਨਾਲ਼ ਘੁਮਾਇਆ ਗਿਆ",
+       "limitreport-walltime": "ਹਕੀਕੀ ਸਮੇਂ ਦੀ ਵਰਤੋਂ",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|ਸਕਿੰਟ|ਸਕਿੰਟ}}",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|ਬਾਈਟ|ਬਾਈਟ}}",
+       "expand_templates_output": "ਨਤੀਜਾ",
        "expand_templates_ok": "ਠੀਕ ਹੈ",
        "expand_templates_remove_comments": "ਟਿੱਪਣੀਆਂ ਹਟਾਓ",
        "expand_templates_preview": "ਝਲਕ",
        "pagelang-name": "ਸਫ਼ਾ",
        "pagelang-language": "ਭਾਸ਼ਾ",
        "pagelang-use-default": "ਮੂਲ ਭਾਸ਼ਾ ਵਰਤੋਂ",
-       "pagelang-select-lang": "ਭਾਸ਼ਾ ਚੁਣੋ"
+       "pagelang-select-lang": "ਭਾਸ਼ਾ ਚੁਣੋ",
+       "right-pagelang": "ਸਫ਼ੇ ਦੀ ਭਾਸ਼ਾ ਬਦਲੋ",
+       "action-pagelang": "ਸਫ਼ੇ ਦੀ ਭਾਸ਼ਾ ਬਦਲੋ",
+       "mediastatistics-table-count": "ਫ਼ਾਈਲਾਂ ਦੀ ਗਿਣਤੀ",
+       "mediastatistics-table-totalbytes": "ਮਿਲ਼ਵਾਂ ਅਕਾਰ",
+       "mediastatistics-header-unknown": "ਅਣਪਛਾਤਾ",
+       "mediastatistics-header-audio": "ਆਡੀਓ",
+       "mediastatistics-header-video": "ਵੀਡੀਓਆਂ",
+       "mediastatistics-header-office": "ਦਫ਼ਤਰ",
+       "mediastatistics-header-text": "ਲਿਖਤੀ",
+       "json-error-syntax": "ਵਾਕ-ਵਿਉਂਤ 'ਚ ਦੋਸ਼"
 }
index 010179a..1aeb589 100644 (file)
        "suppress": "Alakton (oversight)",
        "booksources": "Aklat a pikuanan",
        "booksources-search-legend": "Panintunan la reng aklat penibatan",
-       "booksources-go": "Sige",
        "booksources-text": "Makabili la king lalam deng suglung kareng aliwang karinan o site a mamisaling librung bayu at megamit na, at mapalyaring atin la muring aliwang informaciun kareng librung paintunan mu.",
        "specialloguserlabel": "Talagamit:",
        "speciallogtitlelabel": "Bansag:",
        "wlheader-enotif": "Makasalangi (enabled) ing pamipabalu kapamilatan ning e-mail.",
        "wlheader-showupdated": "'''Makapal''' la pangasulat deng bulung a miyalilan manibat aniang tauli mu lang pintalan.",
        "wlnote": "{{PLURAL:$1|Ing makatuki ing tauling|Ding makatuki ring tauling '''$1''' miyalilan}} kilub {{PLURAL:$2|ning tauling metung a oras|ding tauling '''$2''' oras}}.",
-       "wlshowlast": "Pakit la reng tauling $1 oras $2 aldo $3",
+       "wlshowlast": "Pakit la reng tauling $1 oras $2 aldo",
        "watchlist-options": "Deng maliaring gawan kareng listaan da reng babanten (''watchlist'')",
        "watching": "Babanten...",
        "unwatching": "E ne babanten...",
        "exif-gpsspeed-k": "Kilometru balang oras",
        "exif-gpsspeed-m": "Milla balang oras",
        "exif-gpsdirection-t": "Tutung direksiun",
-       "watchlistall2": "eganagana",
        "namespacesall": "ila ngan",
        "monthsall": "eganagana",
        "confirmemail": "Patutwan mung keka ya itang e-mail address",
        "specialpages-group-highuse": "Deng bulung a magamitan",
        "revdelete-restricted": "ipairal la reng limitasiun kareng sysop",
        "revdelete-unrestricted": "ilako la reng makabawal kareng sysops",
-       "rightsnone": "(ala)"
+       "rightsnone": "(ala)",
+       "revdelete-summary": "sampulung da reng mibayu (edit summary)"
 }
index 2c50096..a229310 100644 (file)
        "search-interwiki-more": "(pus)",
        "searchrelated": "relaté",
        "searchall": "tout",
-       "showingresultsheader": "{{PLURAL:$5|Résultat '''$1'''|Résultats '''$1–$2'''}} éd '''$3''' pour '''$4'''",
        "search-nonefound": "Y a autchun résultat pour chol dmanne.",
        "powersearch-legend": "Érvue avanchée",
        "powersearch-ns": "Tracher din chés éspaches éd chés noms:",
        "pager-older-n": "{{PLURAL:$1|pus viu 1|pus vius $1}}",
        "booksources": "Sources dech live",
        "booksources-search-legend": "Tracher chés référinches d'chés lives",
-       "booksources-go": "Aler",
        "log": "Gasètes",
        "allpages": "Tertous chés paches",
        "prevpage": "Pache édvant ($1)",
        "watchthispage": "Suire l'pache-lo",
        "unwatch": "N'poin suire",
        "watchlist-details": "{{PLURAL:$1|$1 pache|$1 paches}} din vote lisse à suire, chés paches éd disqhuchon n'sont poin conptées.",
-       "wlshowlast": "Montrer darin $1 eûres $2 jours $3",
+       "wlshowlast": "Montrer darin $1 eûres $2 jours",
        "watchlist-options": "Opchons del lisse à suire",
        "watching": "Suire…",
        "unwatching": "n'poin suire…",
        "metadata-expand": "Montrer chés métadatas del imache",
        "metadata-collapse": "Mucher chés métadatas del imache",
        "metadata-fields": "Chés cans d'chés métadonnées EXIF afiqués din ch'messache-lo is s'ront mis din l'pache d'édvisse éd l'image quant el tabe d'chés métadonnées ale s'ro rapetichée.<br />\nChés eutes cans is s'ront muchés pèr défeut.\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",
-       "watchlistall2": "tertous",
        "namespacesall": "tous",
        "monthsall": "tertous",
        "imgmultipageprev": "← pache édvant",
index caf85e5..5157220 100644 (file)
        "movethispage": "Blatt ziehe",
        "pager-newer-n": "{{PLURAL:$1|neegscht|neegscht $1}}",
        "pager-older-n": "{{PLURAL:$1|letscht|letscht $1}}",
-       "booksources-go": "Uffgucke",
        "specialloguserlabel": "Yuuser:",
        "speciallogtitlelabel": "Titel:",
        "log": "Logbicher",
        "unwatchthispage": "Nimmi watsche",
        "notanarticle": "Ken Blatt",
        "watchlist-details": "{{PLURAL:$1|$1 Blatt|$1 Bledder}} uff dei Watch-Lischt, ohne Gschwetz-Bledder",
-       "wlshowlast": "Zeig die Enneringe vun de letscht $1 Schtund, $2 Daag odder $3.",
+       "wlshowlast": "Zeig die Enneringe vun de letscht $1 Schtund, $2 Daag odder .",
        "watching": "Watsche…",
        "unwatching": "Nimmi watsche...",
        "enotif_impersonal_salutation": "{{SITENAME}}-Yuuser",
        "exif-meteringmode-255": "Naett bekannt",
        "exif-gaincontrol-0": "Ken",
        "exif-iimcategory-sci": "Wisseschaft unn Waerkzeichheet‎",
-       "watchlistall2": "all",
        "namespacesall": "all",
        "monthsall": "all",
        "scarytranscludetoolong": "[URL iss zu lang]",
index f60e1dc..444c9aa 100644 (file)
        "passwordreset-username": "Middawaida:",
        "passwordreset-capture": "E-Mail õgugge?",
        "changeemail-none": "(käni)",
-       "changeemail-cancel": "Uffhere",
        "bold_sample": "Feddi Schrifd",
        "bold_tip": "Feddi Schrifd",
        "italic_sample": "Schebbi Schrifd",
        "search-relatedarticle": "Vawond",
        "searchrelated": "vawond",
        "searchall": "alle",
-       "showingresultsheader": "{{PLURAL:$5|Eagewnis '''$1''' vun '''$3'''|Eagewnis '''$1–$2''' vun '''$3'''}} fa '''$4'''",
        "search-nonefound": "Kä Eagewnis vunde Õfroch.",
        "powersearch-legend": "Erwaiterte Such",
        "powersearch-ns": "In de Namensraim suche:",
        "pager-older-n": "{{PLURAL:$1|vorisch 1|vorische $1}}",
        "booksources": "Buchgwelle",
        "booksources-search-legend": "Noch Buchgwelle gugge",
-       "booksources-go": "Geh",
        "log": "Logbischa",
        "allpages": "Alle Saide",
        "prevpage": "Voriche Said ($1)",
        "watchthispage": "Die Said beowachde",
        "unwatch": "Nemme beowachde",
        "watchlist-details": "S hodd {{PLURAL:$1|$1 Said|$1 Saide}} uff doina Beowachdungslischd, Dischbediersaide zeeln nedd gdrennd.",
-       "wlshowlast": "Die ledschde $1 Schdunnd $2 Daach $3 zaische",
+       "wlshowlast": "Die ledschde $1 Schdunnd $2 Daach  zaische",
        "watchlist-options": "Meschlischkaide vunde Beowachdungslischd",
        "watching": "Beowachde ...",
        "unwatching": "Nimmi beowachde ...",
        "exif-iimcategory": "Sachgrubb",
        "exif-iimsupplementalcategory": "Ergenzndi Sachgrubbe",
        "exif-gaincontrol-0": "Kään",
-       "watchlistall2": "alle",
        "namespacesall": "alle",
        "monthsall": "alle",
        "watchlisttools-view": "Die wischdische Ännarunge õgugge",
index 582b330..613dcfb 100644 (file)
@@ -66,7 +66,8 @@
                        "Wedkarski",
                        "아라",
                        "Matik7",
-                       "Vengir"
+                       "Vengir",
+                       "Darellur"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "otherlanguages": "W innych językach",
        "redirectedfrom": "(Przekierowano z $1)",
        "redirectpagesub": "Strona przekierowująca",
+       "redirectto": "Przekierowanie do:",
        "lastmodifiedat": "Tę stronę ostatnio zmodyfikowano o $2, $1.",
        "viewcount": "Tę stronę obejrzano {{PLURAL:$1|tylko raz|$1 razy}}.",
        "protectedpage": "Strona zabezpieczona",
        "createaccount-text": "Ktoś utworzył w {{GRAMMAR:MS.lp|{{SITENAME}}}} ($4), podając Twój adres e‐mail, konto „$2”. Aktualnym hasłem jest „$3”.\nZaloguj się teraz i je zmień.\n\nMożesz zignorować tę wiadomość, jeśli konto zostało utworzone przez pomyłkę.",
        "login-throttled": "Zbyt wiele razy próbowałeś zalogować się na to konto.\nOdczekaj $1 zanim ponowisz próbę.",
        "login-abort-generic": "Logowanie nieudane – przerwano",
+       "login-migrated-generic": "Twoje konto zostało poddane migracji i twoja nazwa użytkownika już nie istnieje na tej wiki.",
        "loginlanguagelabel": "Język: $1",
        "suspicious-userlogout": "Żądanie wylogowania zostało odrzucone ponieważ wygląda na to, że zostało wysłane przez uszkodzoną przeglądarkę lub buforujący serwer proxy.",
        "createacct-another-realname-tip": "Wpisanie imienia i nazwiska nie jest obowiązkowe.\nJeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje autorstwo.",
        "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-header": "Zmiana 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:",
        "changeemail-none": "(brak)",
        "changeemail-password": "Twoje hasło:",
        "changeemail-submit": "Zapisz nowy",
-       "changeemail-cancel": "Anuluj",
        "changeemail-throttled": "Zbyt wiele razy próbowałeś zalogować się na to konto.\nOdczekaj $1, zanim ponowisz próbę.",
        "resettokens": "Resetowanie tokenów",
        "resettokens-text": "Na tej stronie możesz zresetować tokeny, które umożliwiają dostęp do pewnych prywatnych danych związanych z Twoim kontem.\n\nNależy to zrobić, jeśli ktoś je poznał lub zdobył hasło do Twojego konta.",
        "media_tip": "Link do pliku",
        "sig_tip": "Twój podpis wraz z datą i czasem",
        "hr_tip": "Linia pozioma (nie nadużywaj)",
-       "summary": "Opis zmian ",
+       "summary": "Opis zmian:",
        "subject": "Temat/nagłówek:",
        "minoredit": "To jest drobna zmiana",
        "watchthis": "Obserwuj",
        "searchall": "wszystkie",
        "showingresults": "Poniżej znajduje się lista {{PLURAL:$1|z '''1''' wynikiem|'''$1''' wyników}}, rozpoczynając od wyniku numer '''$2'''.",
        "showingresultsinrange": "Poniżej wyświetlono co najwyżej {{PLURAL:$1|<strong>1</strong> wynik|<strong>$1</strong> wyniki|<strong>$1</strong> wyników}} w zakresie od <strong>$2</strong> do <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Wynik '''$1''' z '''$3'''|Wyniki '''$1 – $2''' z '''$3'''}} dla '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Wynik <strong>$1</strong> z <strong>$3</strong>|Wyniki <strong>$1 - $2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Brak wyników spełniających kryteria podane w zapytaniu.",
        "powersearch-legend": "Wyszukiwanie zaawansowane",
        "powersearch-ns": "Przeszukaj przestrzenie nazw:",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Zmiany",
        "prefs-help-prefershttps": "Ta opcja zacznie działać przy twoim następnym zalogowaniu.",
+       "prefswarning-warning": "Niektóre z dokonanych zmian w preferencjach nie zostały jeszcze zapisane. Jeśli wyjdziesz bez wciśnięcia „$1”, Twoje zmiany zostaną utracone.",
        "prefs-tabs-navigation-hint": "Wskazówka: do poruszania się między zakładkami możesz użyć klawiszy strzałek w lewo i w prawo",
        "email-address-validity-valid": "Wygląda na prawidłowy",
        "email-address-validity-invalid": "Wymagany jest prawidłowy adres!",
-       "userrights": "Zarządzaj uprawnieniami użytkowników",
+       "userrights": "Zarządzanie uprawnieniami użytkowników",
        "userrights-lookup-user": "Zarządzaj grupami użytkownika",
        "userrights-user-editname": "Wprowadź nazwę użytkownika",
        "editusergroup": "Edytuj grupy użytkownika",
        "right-deletedtext": "Podgląd usuniętego tekstu i zmian pomiędzy usuniętymi wersjami",
        "right-browsearchive": "Przeszukiwanie usuniętych stron",
        "right-undelete": "Odtwarzanie usuniętych stron",
-       "right-suppressrevision": "Podgląd i odtwarzanie wersji ukrytych przed administratorami",
+       "right-suppressrevision": "Podgląd, ukrywanie i odkrywanie wersji ukrytych przed wszystkimi",
        "right-viewsuppressed": "Umożliwia zobaczenie wersji ukrytych przed każdym użytkownikiem",
        "right-suppressionlog": "Podgląd rejestru ukrywania",
        "right-block": "Blokowanie użytkownikom możliwości edycji",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zobacz też [[Special:NewPages|listę nowych stron]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} wykonane po <strong>$3, $4</strong> (nie więcej niż '''$1''' pozycji).",
+       "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} {{PLURAL:$5|wykonaną|wykonane}} po <strong>$3, $4</strong> (nie więcej niż '''$1''' pozycji).",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "rcshowhideminor": "$1 drobne zmiany",
        "rcshowhideminor-show": "Pokaż",
        "randomincategory": "Losowa strona w kategorii",
        "randomincategory-invalidcategory": "\"$1\" nie jest prawidłową nazwą kategorii.",
        "randomincategory-nopages": "Nie ma żadnych stron w [[:Category:$1]].",
-       "randomincategory-selectcategory": "Pobierz losową stronę z kategorii: $1 $2.",
-       "randomincategory-selectcategory-submit": "Dalej",
+       "randomincategory-category": "Kategoria:",
+       "randomincategory-legend": "Losowa strona w kategorii",
        "randomredirect": "Losowe przekierowanie",
        "randomredirect-nopages": "Brak jakichkolwiek przekierowań w przestrzeni nazw „$1”.",
        "statistics": "Statystyki",
        "querypage-disabled": "Ta strona specjalna została wyłączona ze względu na ograniczenia wydajności.",
        "booksources": "Książki",
        "booksources-search-legend": "Szukaj informacji o książkach",
-       "booksources-go": "Pokaż",
+       "booksources-search": "Szukaj",
        "booksources-text": "Poniżej znajduje się lista odnośników do innych witryn, które pośredniczą w sprzedaży nowych i używanych książek, a także mogą posiadać dalsze informacje na temat poszukiwanej przez Ciebie książki.",
        "booksources-invalid-isbn": "Podany numer ISBN został rozpoznany jako nieprawidłowy. Sprawdź czy podany numer zgadza się z numerem zaczerpniętym ze źródła.",
        "specialloguserlabel": "Kto",
        "wlheader-enotif": "Wysyłanie powiadomień na adres e‐mail jest włączone.",
        "wlheader-showupdated": "'''Wytłuszczone''' zostały strony, które zostały zmodyfikowane od Twojej ostatniej wizyty na nich.",
        "wlnote": "Poniżej pokazano {{PLURAL:$1|zmianę wykonaną|<strong>$1</strong> zmiany wykonane|<strong>$1</strong> zmian wykonanych}} w ciągu {{PLURAL:$2|ostatniej godziny|ostatnich <strong>$2</strong> godzin}}, licząc od $4 dnia $3.",
-       "wlshowlast": "Pokaż ostatnie $1 godzin, $2 dni ($3)",
+       "wlshowlast": "Pokaż ostatnie $1 godzin, $2 dni",
        "watchlist-options": "Opcje obserwowanych",
        "watching": "Dodaję do obserwowanych...",
        "unwatching": "Przestaję obserwować...",
        "exbeforeblank": "poprzednia zawartość, obecnie pustej strony: „$1”",
        "delete-confirm": "Usuwanie „$1”",
        "delete-legend": "Usuń",
-       "historywarning": "'''Uwaga!''' Strona, którą chcesz usunąć, ma w przybliżeniu {{PLURAL:$1|jedną starszą wersję|$1 starsze wersje|$1 starszych wersji}}:",
+       "historywarning": "<strong>Uwaga:</strong> Strona, którą chcesz usunąć, ma {{PLURAL:$1|jedną starszą wersję|$1 starsze wersje|$1 starszych wersji}}:",
        "confirmdeletetext": "Zamierzasz usunąć stronę razem z całą dotyczącą jej historią.\nUpewnij się, czy na pewno chcesz to zrobić, że rozumiesz konsekwencje i że robisz to w zgodzie z [[{{MediaWiki:Policy-url}}|zasadami]].",
        "actioncomplete": "Operacja wykonana",
        "actionfailed": "Działanie nie powiodło się",
        "delete-edit-reasonlist": "Edytuj listę przyczyn usunięcia",
        "delete-toobig": "Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />\nUsuwanie jej zostało ograniczone ze względu na możliwość zakłócenia pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.",
        "delete-warning-toobig": "Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />\nBądź ostrożny, ponieważ usunięcie jej może spowodować zakłócenia w pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.",
-       "delete-cantedit": "Nie możesz usunąć tej strony, ponieważ nie masz uprawnienia do jej edycji.",
+       "deleteprotected": "Nie możesz usunąć tej strony, ponieważ została zabezpieczona.",
        "deleting-backlinks-warning": "''' Uwaga:''' Do strony, którą masz zamiar usunąć, odwołują się [[Special:WhatLinksHere/{{FULLPAGENAME}}|inne strony]].",
        "rollback": "Cofnij edycję",
        "rollback_short": "Cofnij",
        "protect-othertime": "Inny okres",
        "protect-othertime-op": "inny okres",
        "protect-existing-expiry": "Obecny czas wygaśnięcia: $2 o $3",
+       "protect-existing-expiry-infinity": "Obecny czas wygaśnięcia: nieskończony",
        "protect-otherreason": "Inny lub dodatkowy powód",
        "protect-otherreason-op": "Inny powód",
        "protect-dropdown": "*Najczęstsze powody zabezpieczenia\n** Częste wandalizmy\n** Częste spamowanie\n** Wojna edycyjna\n** Wygłupy",
        "unblocked": "[[User:$1|$1]] {{GENDER:$1|został odblokowany|została odblokowana|został odblokowany}}.",
        "unblocked-range": "$1 został odblokowany",
        "unblocked-id": "Blokada $1 została zdjęta",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] został odblokowany.",
        "blocklist": "Zablokowani użytkownicy",
        "ipblocklist": "Zablokowani użytkownicy",
        "ipblocklist-legend": "Znajdź zablokowanego użytkownika",
        "import": "Import stron",
        "importinterwiki": "Import transwiki",
        "import-interwiki-text": "Wybierz wiki i nazwę strony do importowania.\nDaty oraz nazwy autorów zostaną zachowane.\nWszystkie operacje importu transwiki są odnotowywane w [[Special:Log/import|rejestrze importu]].",
-       "import-interwiki-source": "Źródło wiki/strony:",
+       "import-interwiki-sourcewiki": "Źródłowa wiki:",
+       "import-interwiki-sourcepage": "Strona źródłowa:",
        "import-interwiki-history": "Kopiuj całą historię edycji tej strony",
        "import-interwiki-templates": "Załącz wszystkie szablony",
        "import-interwiki-submit": "Importuj",
        "exif-urgency-low": "Niski ($1)",
        "exif-urgency-high": "Wysoki ($1)",
        "exif-urgency-other": "Priorytet zdefiniowany przez użytkownika ($1)",
-       "watchlistall2": "wszystkie",
        "namespacesall": "wszystkie",
        "monthsall": "wszystkie",
        "confirmemail": "Potwierdzanie adresu e‐mail",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|przesłał|przesłała}} nową wersję $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|przesłał|przesłała}} $3",
        "rightsnone": "brak",
+       "revdelete-summary": "opis zmian",
        "feedback-bugornote": "Jeśli jesteś w stanie szczegółowo opisać problem techniczny, proszę [$1 zgłoś błąd].\nW przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zostanie dodany do strony \"[$3  $2]\", wraz z nazwą użytkownika.",
        "feedback-subject": "Temat",
        "feedback-message": "Wiadomość:",
        "api-error-invalid-file-key": "Błąd wewnętrzny – nie można odnaleźć pliku w wśród plików tymczasowych.",
        "api-error-missingparam": "Błąd wewnętrzny –  brak jest niektórych wymaganych informacji do realizacji przesłania.",
        "api-error-missingresult": "Błąd wewnętrzny – nie można określić czy kopiowanie się udało.",
-       "api-error-mustbeloggedin": "Musisz się zalogować aby przesyłać pliki.",
+       "api-error-mustbeloggedin": "Aby przesyłać pliki, musisz się zalogować.",
        "api-error-mustbeposted": "Wystąpił błąd w oprogramowaniu. Nie użyto właściwej metody HTTP.",
        "api-error-noimageinfo": "Plik przesłano, ale serwer nie zwrócił informacji na jego temat.",
        "api-error-nomodule": "Błąd wewnętrzny – nie określono modułu przesyłania plików.",
        "log-description-pagelang": "Rejestr zmian języków przypisanych do poszczególnych stron",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|zmienił|zmieniła}} język strony $3 z „$4” na „$5”.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (włączone)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''wyłączone''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''wyłączone''')",
+       "mediastatistics": "Statystyki mediów",
+       "mediastatistics-summary": "Statystyki dotyczące przesłanych typów plików. Dotyczą one tylko najnowszej wersji pliku. Starsze lub usunięte wersje plików nie są uwzględniane.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajty/ów}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Typ MIME",
+       "mediastatistics-table-extensions": "Możliwe rozszerzenia",
+       "mediastatistics-table-count": "Liczba plików",
+       "mediastatistics-table-totalbytes": "Łączny rozmiar",
+       "mediastatistics-header-unknown": "Nieznane",
+       "mediastatistics-header-bitmap": "Obrazy bitmapowe",
+       "mediastatistics-header-drawing": "Rysunki (obrazy wektorowe)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Filmy",
+       "mediastatistics-header-multimedia": "Mieszane multimedia",
+       "mediastatistics-header-office": "Biuro",
+       "mediastatistics-header-text": "Tekstowe",
+       "mediastatistics-header-executable": "Pliki wykonywalne",
+       "mediastatistics-header-archive": "Formaty skompresowane",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|końcowy przecinek został usunięty|końcowe przecinki zostały usunięte}} z JSON",
+       "json-error-unknown": "Wystąpił problem z JSON. Błąd: $1",
+       "json-error-depth": "Została przekroczona maksymalna głębokość stosu",
+       "json-error-state-mismatch": "Niewłaściwy lub nieprawidłowo sformułowany JSON",
+       "json-error-ctrl-char": "Błąd znaku control, ewentualnie błędnie zakodowane.",
+       "json-error-syntax": "Błąd składni",
+       "json-error-utf8": "Nieprawidłowe znaki UTF-8, prawdopodobnie niepoprawnie zakodowane",
+       "json-error-recursion": "Jedno lub więcej rekurencyjnych odniesień musi być zakodowane.",
+       "json-error-unsupported-type": "Podano wartość typu, która nie mogła być kodowana"
 }
index 6e4bcf4..2fae44f 100644 (file)
        "otherlanguages": "Àutre lenghe",
        "redirectedfrom": "(Ridiression da $1)",
        "redirectpagesub": "Pàgina ëd ridiression",
+       "redirectto": "Ridiression a:",
        "lastmodifiedat": "Modificà l'ùltima vira ai $1 a $2.",
        "viewcount": "St'artìcol-sì a l'é stàit lesù {{PLURAL:$1|na vira|$1 vire}}.",
        "protectedpage": "Pàgina proteta",
        "hidetoc": "stërmé",
        "collapsible-collapse": "Saré",
        "collapsible-expand": "deurbe",
+       "confirmable-confirm": "{{GENDER:$1|É-lo}} sigur?",
+       "confirmable-yes": "É",
+       "confirmable-no": "Nò",
        "thisisdeleted": "Veul-lo vardé ò ripristiné $1?",
        "viewdeleted": "Veul-lo vardé $1?",
        "restorelink": "{{PLURAL:$1|na modìfica scancelà|$1 modìfiche scancelà}}",
        "invalidtitle-knownnamespace": "Tìtol ch'a va nen bin con lë spassi nominal «$2» e ël test «$3»",
        "invalidtitle-unknownnamespace": "Tìtol pa bon con nùmer dë spassi nominal $1 e test «$2» sconossù",
        "exception-nologin": "Nen rintrà ant ël sistema",
-       "exception-nologin-text": "Për piasì, [[Special:Userlogin|ch'a rintra ant ël sistema]] për podèj acede a costa pàgina o a costa assion.",
+       "exception-nologin-text": "Për piasì, ch'a rintra ant ël sistema për podèj acede a costa pàgina o a costa assion.",
        "exception-nologin-text-manual": "Për piasì, ch'a $1 për podèj acede a costa pàgina o costa assion.",
        "virus-badscanner": "Configurassion falà: antivìrus nen conossù: ''$1''",
        "virus-scanfailed": "scansion falìa (còdes $1)",
        "createaccount-text": "Cheidun a l'ha duvertà un cont për soa adrëssa ëd pòsta eletrònica ansima a {{SITENAME}} ($4) butand da stranòm «$2» e da ciav «$3». A dovrìa rintré ant ël sistema e cambiesse soa ciav pì ampressa ch'a peul.\n\nSe sòn a l'é rivà për eror, a peul lassé perde e fé gnente sensa problema.",
        "login-throttled": "A l'ha fàit tròpi tentativ recent d'intré ant ël sistema.\nPër piasì, ch'a speta $1 prima ëd prové torna.",
        "login-abort-generic": "Sò tentitiv d'intré ant ël sistema a l'é falì - Abortì",
+       "login-migrated-generic": "Sò cont a l'ha emigrà, e sò stranòm a esist pi nen su costa wiki.",
        "loginlanguagelabel": "Lenga: $1",
        "suspicious-userlogout": "Soa arcesta ëd seurte dal sistema a l'é stàita arfudà përchè a smija com s'a fussa stàita mandà da 'n navigador rot o da l'archiviassion an local d'un prëstanòm.",
        "createacct-another-realname-tip": "Ël nòm ver a l'é opsional.\nS'a decid ëd butelo, a sarà dovrà për dé a l'utent ël mérit ëd sò travaj.",
        "passwordreset-emailsent-capture": "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit mandà, e a l'é mostrà sì-sota.",
        "passwordreset-emailerror-capture": "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit generà, e a l'é smonù sì-sota, ma la spedission a {{GENDER:$2|l'utent}} a l'é falìa: $1",
        "changeemail": "Cangé l'adrëssa ëd pòsta eletrònica",
-       "changeemail-header": "Cangé l'adrëssa ëd pòsta eletrònica dël cont",
        "changeemail-text": "Ch'a completa 's formolari për cangé soa adrëssa eletrònica. A dev anserì soa ciav për confirmé costa modìfica.",
        "changeemail-no-info": "A dev esse intrà ant ël sistema për andé diretament a costa pàgina.",
        "changeemail-oldemail": "Adrëssa ëd pòsta eletrònica atual:",
        "changeemail-none": "(gnun-a)",
        "changeemail-password": "Soa ciav su {{SITENAME}}:",
        "changeemail-submit": "Cangé l'adrëssa ëd pòsta eletrònica",
-       "changeemail-cancel": "Anulé",
        "changeemail-throttled": "A l'ha fàit tròpi tentativ ëd rintré ant ël sistema.\nPër piasì, ch'a speta $1 prima ëd prové torna.",
        "resettokens": "Riamposté ij geton",
        "resettokens-text": "Ambelessì a peul riamposté ij geton ch'a permëtto d'acede a chèich dàit privà associà a sò cont.\n\nA dovrìa felo si për asar chiel a l'ha partagiaje con cheidun o si sò cont a l'é stàit compromëttù.",
        "showpreview": "Mostré na preuva",
        "showdiff": "Smon-me le modìfiche",
        "blankarticle": "<strong>Atension:</strong> La pàgina ch'a l'ha creà a l'é veuida. S'a sgnaca torna «{{int:savearticle}}», la pàgina a sarà creà sensa contnù.",
-       "anoneditwarning": "'''Atension:''' A l'é nen rintrà ant ël sistema. Soa adrëssa IP a sarà registrà ant la stòria dle modìfiche ëd sa pàgina.",
+       "anoneditwarning": "<strong>Atension:<strong> A l'é nen rintrà ant ël sistema. Soa adrëssa IP a së sc-iairërà s'a fà dle modìfiche. Si chiel a <strong>[$1 rintra ant ël sistema]</strong> o <strong>[$2 a crea an cont]</strong>, soe modìfiche a saran atribuìe a sò stranòm, ansema a d'àutri vantagg.",
        "anonpreviewwarning": "''A l'é nen rintrà ant ël sistema. An salvand a sarà memorisà soa adrëssa IP ant la stòria dle modìfiche ëd sa pàgina.''",
        "missingsummary": "'''Nòta:''' a l'ha butà gnun resumé dla modìfica. Se a sgnaca «{{int:savearticle}}» n'àutra vira, soa modìfica a resterà salvà sensa resumé.",
        "missingcommenttext": "Për piasì, che a buta un coment sì-sota.",
        "parser-template-recursion-depth-warning": "Passà ël lìmit ëd ricorsion dlë stamp ($1)",
        "language-converter-depth-warning": "Lìmit ëd profondità dël convertidor ëd lenga sorpassà ($1)",
        "node-count-exceeded-category": "Pàgine anté che ël nùmer ëd neu a l'é sorpassà",
-       "node-count-exceeded-category-desc": "Na categorìa për le pàgine andoa ël nùmer dij neud a l'é tròp grand.",
+       "node-count-exceeded-category-desc": "La pàgina a sorpassa ël nùmer màssim dij neu.",
        "node-count-exceeded-warning": "La pàgina a l'ha sorpassà ël nùmer ëd neu",
        "expansion-depth-exceeded-category": "Pàgine anté che la profondeur d'espansion a l'é sorpassà",
-       "expansion-depth-exceeded-category-desc": "Costa-sì a l'é na categorìa për le pàgine andoa la profondità d'espansion a l'é tròpa.",
+       "expansion-depth-exceeded-category-desc": "La pàgina a l'ha passà la profondità d'espansion.",
        "expansion-depth-exceeded-warning": "La pàgina a l'ha sorpassà la profondità d'espansion",
        "parser-unstrip-loop-warning": "Trovà un sicl nen dësmontàbil",
        "parser-unstrip-recursion-limit": "Sorpassà ël lìmit d'arcorensa nen dësmontàbil: $1",
        "searchall": "tuti",
        "showingresults": "Ambelessì-sota a treuva fin a {{PLURAL:$1|'''1'''|'''$1'''}} arzultà, a parte dal nùmer #'''$2'''.",
        "showingresultsinrange": "Smon-e sì-sota fin-a a {{PLURAL:$1|<strong>1</strong>|<strong>$1</strong>}} arzultà ant la serie da #<strong>$2</strong> a #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Arzultà '''$1''' ëd '''$3'''|Arzultà '''$1 - $2''' ëd '''$3'''}} për '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Arzultà <strong>$1</strong> ëd <strong>$3</strong>|Arzultà <strong>da $1 a $2</strong> ëd <strong>$3</strong>}}",
        "search-nonefound": "A-i é gnun arzultà për l'arserca.",
        "powersearch-legend": "Arserca avansà",
        "powersearch-ns": "Sërché ant jë spassi nominaj:",
        "preferences": "Mè gust",
        "mypreferences": "Gust",
        "prefs-edits": "Nùmer ëd modìfiche fàite:",
-       "prefsnologintext2": "Për piasì, ch'a $1 për definì ij gust d'utent.",
+       "prefsnologintext2": "Për piasì, ch'a rintra ant ël sistema për modifiché ij sò gust d'utent.",
        "prefs-skin": "Facia",
        "skin-preview": "Preuva",
        "datedefault": "Franch l'istess",
        "prefs-tokenwatchlist": "Geton",
        "prefs-diffs": "Diferense",
        "prefs-help-prefershttps": "Costa preferensa a ancaminrà a marcé a soa pròssima conession.",
+       "prefswarning-warning": "A l'ha fàit dle modìfiche ai sò gust ch'a son ancor nen ëstàire argistrà.\nS'a chita sa pàgina sensa sgnaché «$1» ij sò gust a saran pa agiorné.",
        "prefs-tabs-navigation-hint": "Astussia: A peul dovré le flece a snistra e a drita për navighé antra le schede ant la lista dle schede.",
        "email-address-validity-valid": "A smija bon",
        "email-address-validity-invalid": "A-i é da manca ëd n'adrëssa bon-a!",
        "windows-nonascii-filename": "Sta wiki-sì a manten pa ij nòm d'archivi con caràter speciaj.",
        "fileexists": "N'archivi con ës nòm-sì a-i é già, për piasì che a contròla <strong>[[:$1]]</strong> se {{GENDER|a}} l'é pa sigur dë vorèj cangelo.\n[[$1|thumb]]",
        "filepageexists": "La pàgina ëd descrission për st'archivi-sì a l'é già stàita creà an <strong>[[:$1]]</strong>, mach ch'a-i é gnun archivi ch'as ciama parèj.\nLòn ch'a buta për somari as ës-ciairerà nen ant la pàgina ëd descrission.\nPër podèj buté sò somari a l'ha da modifichesse la pàgina a man.\n[[$1|thumb]]",
-       "fileexists-extension": "N'archivi con ës nòm-sì a-i é già: [[$2|thumb]]\n* Nòm dl'archivi ch'as carìa: <strong>[[:$1]]</strong>\n* Nòm dl'archivi ch'a-i é già: <strong>[[:$2]]</strong>\nPër piasì, ch'a serna un nòm diferent.",
+       "fileexists-extension": "N'archivi con ës nòm-sì a-i é già: [[$2|thumb]]\n* Nòm dl'archivi ch'as carìa: <strong>[[:$1]]</strong>\n* Nòm dl'archivi ch'a-i é già: <strong>[[:$2]]</strong>\nVeul-lo dle vire dovré un nòm pi esplìssit?",
        "fileexists-thumbnail-yes": "L'archivi a jë smija a na ''figurin-a''. [[$1|thumb]]\nPër piasì, ch'a contròla l'archivi <strong>[[:$1]]</strong>.\nS'a l'é la midema figura a amzura pijn-a, a veul dì ch'a fa nen dë manca dë carié na figurin-a.",
        "file-thumbnail-no": "Ël nòm dl'archivi as anandia con <strong>$1</strong>.\nA jë smija a na ''figurin-a''.\nSe a l'ha na figura a amzura pijn-a a l'é mej ch'a carìa cola-lì, dësnò ch'a-j cangia nòm a l'archivi, për piasì.",
        "fileexists-forbidden": "Belavans n'archivi con ës nòm-sì a-i é già, donca ël nòm as peul pa pì dovresse.\nSe a veul ancó cariè sò archivi, për piasì ch'a torna andré e ch'a deuvra n'àutr nòm. [[File:$1|thumb|center|$1]]",
        "license": "Licensa:",
        "license-header": "Licensa",
        "nolicense": "Gnun-a selession fàita",
+       "licenses-edit": "Modifiché j'opsion Ëd licensa",
        "license-nopreview": "(Gnun-a preuva ch'as peula smon-se)",
-       "upload_source_url": "(n'anliura bon-a e che as peula dovresse)",
-       "upload_source_file": "(n'archivi da sò ordinator)",
+       "upload_source_url": "(l'archivi ch'a l'ha sernù da n'adrëssa an s'Aragnà bon-a e ch'as peula acede ëd fasson pùblica)",
+       "upload_source_file": "(sò archivi sernù da sò ordinator)",
+       "listfiles-delete": "scancelé",
        "listfiles-summary": "Sta pàgina special-sì a smon tuti j'archivi ch'a son ëstàit carià.",
        "listfiles_search_for": "Arserché un nòm d'archivi multimojen:",
        "imgfile": "archivi",
        "filedelete-maintenance": "Lë scancelament e la restaurassion d'archivi a l'é al moment disabilità durant la manutension.",
        "filedelete-maintenance-title": "As peul pa scancelesse l'archivi",
        "mimesearch": "Arserca për sòrt MIME",
-       "mimesearch-summary": "Sta pàgina-sì a lassa filtré j'archivi për sòrt MIME. Buté: sòrt/sotasòrt, pr'es. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Sta pàgina-sì a lassa filtré j'archivi për sòrt MIME. Buté: sòrt/sotasòrt o sòrt/*, pr'es. <code>image/jpeg</code>.",
        "mimetype": "Sòrt MIME:",
        "download": "dëscarié",
        "unwatchedpages": "Pàgine che gnun a ten sot-euj",
        "randomincategory": "Pàgina a l'ancàpit ant la categorìa",
        "randomincategory-invalidcategory": "«$1» a l'é pa un nòm ëd categorìa bon.",
        "randomincategory-nopages": "A-i é gnun-e pàgine ant la categorìa [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Pijé na pàgina a l'ancàpit da 'nt la categorìa: $1 $2.",
-       "randomincategory-selectcategory-submit": "Andé",
+       "randomincategory-category": "Categorìa:",
+       "randomincategory-legend": "Pàgina a l'ancàpit ant la categorìa",
        "randomredirect": "Na ridiression qualsëssìa",
        "randomredirect-nopages": "A-i é pa gnun-a ridiression ant lë spassi nominal \"$1\".",
        "statistics": "Statìstiche",
        "doubleredirects": "Ridiression dobie",
        "doubleredirectstext": "Sta pàgina-sì a a lista dle pàgine ch'a armando a d'àutre pàgine ëd ridiression.\nVira riga a l'ha andrinta j'anliure a la prima e a la sconda ridiression, ant sël pat ëd la prima riga ëd test dla seconda ridiression, che për sòlit a l'ha andrinta l'artìcol ëd destinassion vèir, col andoa che a dovrìa ëmné ëdcò la prima ridiression.\nLe ridiression <del>sganfà</del> a son stàite arzolvùe.",
        "double-redirect-fixed-move": "[[$1]] a l'é stàit spostà.\nA l'é stàit agiornà an automàtich e adess a l'é na ridiression a [[$2]].",
-       "double-redirect-fixed-maintenance": "Rangé le ridiression dobie da [[$1]] a [[$2]].",
+       "double-redirect-fixed-maintenance": "Coression automàtica dle ridiression dobie da [[$1]] a [[$2]] ant un travaj ëd manutension.",
        "double-redirect-fixer": "Coretor ëd ridiression",
        "brokenredirects": "Ridiression nen giuste",
        "brokenredirectstext": "Coste ridiression-sì a men-o a d'artìcoj ch'a-i son pa:",
        "wantedpages-badtitle": "Tìtol nen vàlid ant l'ansema dj'arzultà: $1",
        "wantedfiles": "Archivi pì ciamà",
        "wantedfiletext-cat": "J'archivi ch'a ven-o a son dovrà ma a esisto pa. J'archivi dai sò depòsit estern a peulo esse listà sensa consideré l'esistensa. Chèich fàuss positiv a saran <del>sganfà</del>. An pi, le pàgine ch'a conten-o dj'archivi ch'a esisto pa a son listà an [[:$1]].",
+       "wantedfiletext-cat-noforeign": "J'archivi sì-dapress a son dovrà ma a esisto nen. An dzorpì, le pàgina ch'a conten-o d'archivi ch'a esisto nen a son listà an [[:$1]].",
        "wantedfiletext-nocat": "J'archivi sì-dapress a son dovrà ma a esisto pa. J'archivi da depòsit estern a peulo esse listà sensa considerene l'esistensa. Tùit costi fàuss positiv a saran <del>ësganfà</del>.",
+       "wantedfiletext-nocat-noforeign": "J'archivi sì-dapress a son dovrà ma a esisto pa.",
        "wantedtemplates": "Stamp ciamà",
        "mostlinked": "Pàgine che a l'han pì d'anliure che a-i men-o la gent ansima",
        "mostlinkedcategories": "Categorìe che a l'han pì d'anliure che a-i men-o la gent ansima",
-       "mostlinkedtemplates": "Stamp pì dovrà",
+       "mostlinkedtemplates": "Pàgine pi ancludùe",
        "mostcategories": "Artìcoj che a son marcà an pì categorìe",
        "mostimages": "Figure pì dovrà",
        "mostinterwikis": "Pàgine con pi 'd liure antërwiki",
        "querypage-disabled": "Sta pàgina special a l'é disabilità për dle rason ëd prestassion.",
        "booksources": "Andoa trové dij lìber",
        "booksources-search-legend": "Sërché antra ij lìber d'arferiment",
-       "booksources-go": "Andé",
+       "booksources-search": "Arserché",
        "booksources-text": "Ambelessì sota a-i é na lista d'àotri sit che a vendo dij lìber neuv e dë sconda man, e che a peulo ëdcò smon-e dj'anformassion rësgoard ai test che a l'é antramentr che a sërca:",
        "booksources-invalid-isbn": "L'ISBN dàit a smija che a sia pa vàlid; ch'a contròla s'a-i é n'eror an copiand da la sorgiss original.",
        "specialloguserlabel": "Esecutor:",
        "trackingcategories-desc": "Criteri d'anclusion dla categorìa",
        "noindex-category-desc": "La pàgina a l'é pa trassà dai robò përchè a conten la paròla màgica <code><nowiki>__NOINDEX__</nowiki></code> andrinta e a l'é an në spassi nominal anté che cost marcagi a l'é autorisà.",
        "index-category-desc": "La pàgina a conten un <code><nowiki>__INDEX__</nowiki></code> (e a l'é an në spassi nominal anté che ëd marcagi a l'é autorisà); a l'é donca trassà dai robò antant che ëd sòlit a lo sarìa nen.",
-       "post-expand-template-inclusion-category-desc": "Apress avèj dësvlupà tuti jë stamp, la taja dla pàgina a sorpassa <code>$wgMaxArticleSize</code>, donca chèich ëstamp a son nen ëstàit dësvlupà.",
-       "post-expand-template-argument-category-desc": "Apress avèj dësvlupà l'argoment ëd në stamp (cheicòs antra tripl agraf, tanme <code>{{{Foo}}}</code>), la pàgina a l'é pi gròssa che <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Tròpe fonsion care ëd l'analisator (parèj ëd <code>#ifexist</code>) contnùe an na pàgina. Ch'a vëdda [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "post-expand-template-inclusion-category-desc": "La taja dla pàgina a sorpassa <code>$wgMaxArticleSize</code> apress avèj dësvlupà tuti jë stamp, donca chèich ëstamp a son nen ëstàit dësvlupà.",
+       "post-expand-template-argument-category-desc": "La pàgina a l'é pi gròssa che <code>$wgMaxArticleSize</code>, apress avèj dësvlupà l'argoment ëd në stamp (cheicòs antra tripl agraf, tanme <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Costa pàgina a deuvra tròpe fonsion care ëd l'analisator (parèj ëd <code>#ifexist</code>). Ch'a vëdda [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "La pàgina a conten na liura d'archivi cioca (na liura për anclude n'archivi cand l'archivi a esist nen).",
+       "hidden-category-category-desc": "La categorìa a conten <code><nowiki>__HIDDENCAT__</nowiki></code> an sò sontnù, lòn ch'a j'ampediss d'esse smonùa ant la casela dle liure ëd categorìa an sle pàgine, 'me stàndard.",
+       "trackingcategories-nodesc": "Gnun-a descrission disponìbil.",
+       "trackingcategories-disabled": "La categorìa a l'é disabilità",
        "mailnologin": "A-i é pa l'adrëssa për mandé ël mëssagi",
        "mailnologintext": "A dev [[Special:UserLogin|rintré ant ël sistema]]\ne avèj registrà n'adrëssa ëd pòsta eletrònica vàlida ant ij [[Special:Preferences|sò gust]] për podèj mandé dij mëssagi ëd pòsta eletrònica a j'àutri Utent.",
        "emailuser": "Mandeje un mëssagi eletrònich a st'utent-sì",
        "mywatchlist": "Ròba che as ten sot euj",
        "watchlistfor2": "Për $1 $2",
        "nowatchlist": "A l'ha ancó pa marcà dj'artìcoj coma ròba da tnì sot-euj.",
-       "watchlistanontext": "Për piasì, $1 për ës-ciairé ò pura modifiché j'element ëd soa lista dla ròba che as ten sot-euj.",
+       "watchlistanontext": "Për piasì, ch'a rintra ant ël sistema për ës-ciairé ò pura modifiché j'element ëd soa lista dla ròba che as ten sot-euj.",
        "watchnologin": "A l'é ancó nen rintrà ant ël sistema",
        "addwatch": "Gionté a la lista ëd lòn ch'as ten sot-euj",
        "addedwatchtext": "La pàgina «[[:$1]]» a l'é staita giontà a soa [[Special:Watchlist|lista dla ròba da tnì sot-euj]].\nLe modìfiche che a-i saran ant costa pàgina-sì e ant soa pàgina ëd discussion a saran listà ambelessì.",
+       "addedwatchtext-short": "La pàgina «$1» a l'é stàita giontà a la lista ëd lòn ch'as ten sot-euj.",
        "removewatch": "Gavé da la lista ëd lòn ch'as ten sot-euj",
        "removedwatchtext": "La pàgina «[[:$1]]» a l'è staita gavà via da [[Special:Watchlist|soa lista dla ròba da tnì sot-euj]].",
+       "removedwatchtext-short": "La paàgina «$1» a l'é stàita gavà da la lista ëd lòn ch'as ten sot-euj.",
        "watch": "ten-e sot-euj",
        "watchthispage": "Ten-e sot-euj cost artìcol-sì",
        "unwatch": "Chité-lì ëd ten-e sossì sot-euj",
        "unwatchthispage": "Chité-lì ëd ten-e sossì sot-euj",
        "notanarticle": "Sòn a l'é pa n'artìcol",
        "notvisiblerev": "La revision a l'é stàita scancelà",
-       "watchlist-details": "A l'é dëmentrè ch'as ten sot-euj {{PLURAL:$1|$1 pàgina|$1 pàgine}}, nen contand cole ëd discussion.",
+       "watchlist-details": "A l'é dëmentrè ch'as ten sot-euj {{PLURAL:$1|$1 pàgina|$1 pàgine}}, nen contand an manera separà cole ëd discussion.",
        "wlheader-enotif": "La notìfica për pòsta eletrònica a l'é abilità.",
        "wlheader-showupdated": "Le pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
-       "wlnote": "Ambelessì sota a-i {{PLURAL:$1|é l'ùltima modìfica|son j'ùltime '''$1''' modìfiche}} ant {{PLURAL:$2|l'ùltima ora|j'ùltime '''$2''' ore}}, a parte da $3, $4.",
-       "wlshowlast": "Smon-e j'ùltime $1 ore $2 dì $3",
+       "wlnote": "Ambelessì sota a-i {{PLURAL:$1|é l'ùltima modìfica|son j'ùltime <strong>$1</strong> modìfiche}} ant {{PLURAL:$2|l'ùltima ora|j'ùltime <strong>$2</strong> ore}}, a parte da $3, $4.",
+       "wlshowlast": "Smon-e j'ùltime $1 ore $2 di",
        "watchlist-options": "Opsion ëd la lista dla ròba ch'as ten sot-euj",
        "watching": "Sot-euj...",
        "unwatching": "Ën gavand da lòn ch'as ten sot-euj...",
        "exbeforeblank": "anans d'esse dësvujdà ël contnù a l'era: «$1»",
        "delete-confirm": "Scancelé «$1»",
        "delete-legend": "Scancelé",
-       "historywarning": "'''Avis:''' La pàgina che a l'é antramentr che a scancela a l'ha na stòria con pi o men $1 {{PLURAL:$1|revision|revision}}:",
+       "historywarning": "<strong>Avis:</strong> La pàgina che a l'é antramentr che a scancela a l'ha na stòria con $1 {{PLURAL:$1|revision}}:",
        "confirmdeletetext": "A sta për scancelé d'autut da 'nt la base dat na pàgina ò pura na figura, ansema a tuta soa cronologìa.<p>\nPër piasì, che an conferma che sòn a l'é da bon sò but, che a as rend cont ëd le conseguense ëd lòn che a fa, e che sòn a resta an pien an régola con lòn che a l'é stabilì ant la [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Travaj fait e finì",
        "actionfailed": "Assion falìa",
        "delete-edit-reasonlist": "Modifiché la rason dlë scancelament",
        "delete-toobig": "Sta pàgina-sì a l'ha na stòria motobin longa, bele pì che $1 {{PLURAL:$1|revision|revision}}.\nLë scancelassion ëd pàgine parèj a l'é stàita limità për evité ch'as fasa darmagi për eror a {{SITENAME}}.",
        "delete-warning-toobig": "Sta pàgina-sì a l'ha na stòria motobin longa, bele pì che $1 {{PLURAL:$1|revision|revision}}.\nA scancelela as peul fesse darmagi a j'operassion dla base ëd dat ëd {{SITENAME}};\nch'a daga da ment a lòn ch'a fa.",
+       "deleteprotected": "A peul nen ëscancelé costa pàgina përchè a l'é proteta.",
        "deleting-backlinks-warning": "'''Avis:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|D'àutre pàgine]] a l'han na liura o a transcludo la pàgina che chiel a veul ëscancelé.",
        "rollback": "Gavé via le modìfiche",
        "rollback_short": "Ripristiné",
        "protect-othertime": "N'àutra durà:",
        "protect-othertime-op": "N'àutra durà",
        "protect-existing-expiry": "Scadensa esistenta:$3, $2",
+       "protect-existing-expiry-infinity": "Durà: infinìa",
        "protect-otherreason": "Rason àutra/adissional:",
        "protect-otherreason-op": "Àutra rason",
        "protect-dropdown": "*Rason comun-e ëd protession\n** Tròp vandalism\n** Tròpa rumenta\n** Guère ëd modìfiche danose\n** Pàgina con motobin ëd tràfich",
        "contributions-title": "Contribussion ëd $1",
        "mycontris": "Contribussion",
        "contribsub2": "Për {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Ël cont utent «$1» a l'é pa argistrà.",
        "nocontribs": "A l'é pa trovasse gnun-a modìfica che a fussa conforma a costi criteri-sì",
        "uctop": "(corenta)",
        "month": "Mèis:",
        "sp-contributions-newbies-sub": "Për j'utent neuv",
        "sp-contributions-newbies-title": "Contribussion ëd j'utent për ij neuv cont",
        "sp-contributions-blocklog": "argistr dij blocagi",
+       "sp-contributions-suppresslog": "contribussion eliminà",
        "sp-contributions-deleted": "Modìfiche d'utent scancelà",
        "sp-contributions-uploads": "cariagi",
        "sp-contributions-logs": "registr",
        "autoblockid": "Blocagi automàtich #$1",
        "block": "Bloché l'utent",
        "unblock": "Dësbloché l'utent",
-       "blockip": "Bloché l'utent",
+       "blockip": "Bloché l'{{GENDER:$1|utent}}",
        "blockip-legend": "Bloché l'utent",
        "blockiptext": "Che a deuvra ël mòdulo ëd domanda 'd blocagi ambelessì sota për bloché l'acess con drit dë scritura da chèich adrëssa IP o stranòm.<br />\nËs blocagi-sì as dev dovresse MACH për evité dij comportament vandàlich, ën strèita osservansa ëd tùit ij prinsipi dle [[{{MediaWiki:Policy-url}}|régole ëd {{SITENAME}}]].<br />\nËl blocagi a peul ën gnun-a manera esse dovrà për dle question d'ideologìa.\n\nChe a scriva codì che st'adrëssa IP o së stranòm a dev second chiel esse blocà (pr'esempi, che a buta ij tìtoj ëd pàgine che a l'abio già patì dj'at vandàlich da cost'adrëssa IP o së stranòm).",
        "ipaddressorusername": "Adrëssa IP ò stranòm",
        "ipb-unblock-addr": "Dësbloché $1",
        "ipb-unblock": "Dësbloché n'utent ò n'adrëssa IP",
        "ipb-blocklist": "Vardé ij blocagi ativ",
-       "ipb-blocklist-contribs": "Contribussion për $1",
+       "ipb-blocklist-contribs": "Contribussion për {{GENDER:$1|$1}}",
        "unblockip": "Dësbloché n'utent",
        "unblockiptext": "Che a deuvra ël formolari ambelessì-sota për deje andré ël drit dë scritura a n'adrëssa IP o në stranòm che a l'era stàit blocà.",
        "ipusubmit": "Gavé ës blocagi",
        "unblocked": "[[User:$1|$1]] a l'é stait dësblocà",
        "unblocked-range": "$1 a l'é stàit dësblocà",
        "unblocked-id": "Ël blocagi $1 a l'é stait gavà via",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] a l'é stàit dësblocà.",
        "blocklist": "Utent blocà",
        "ipblocklist": "Utent blocà",
        "ipblocklist-legend": "Trové n'utent blocà",
        "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.",
        "movenotallowed": "A l'ha pa ij përmess dont a fa da manca për tramudé le pàgine.",
        "movenotallowedfile": "A l'ha pa ij përmess për tramudé j'archivi.",
        "cant-move-user-page": "A l'ha pa ij përmess për tramudé le pàgine d'utent (gavà le sot-pàgine).",
        "cant-move-to-user-page": "A l'ha pa ël përmess për tramudé na pàgina a na pàgina utent (gavà a na sot-pàgina utent).",
+       "cant-move-category-page": "A l'ha nen ël përmess ëd tramudé le pàgine ëd categorìa.",
+       "cant-move-to-category-page": "A l'ha nen ël përmess ëd tramudé na pàgina a na pàgina ëd categorìa.",
        "newtitle": "Neuv tìtol ëd",
        "move-watch": "Ten-e sot-euj la pàgina sorgiss e la pàgina selessionà",
        "movepagebtn": "Tramudé la pàgina",
        "import": "Amportassion ëd pàgine",
        "importinterwiki": "Amportassion da wiki diferente",
        "import-interwiki-text": "Che a selession-a na wiki e ël tìtol dla pàgina da amporté.\nDate dle revision e stranòm dj'editor a resteran piàjit sù 'cò lor.\nTute j'amportassion antra wiki diferente a resto marcà ant ël [[Special:Log/import|Registr dj'amportassion]].",
-       "import-interwiki-source": "Wiki e pàgina sorgiss:",
+       "import-interwiki-sourcewiki": "Wiki sorgiss:",
+       "import-interwiki-sourcepage": "Pàgina sorgiss:",
        "import-interwiki-history": "Copié tute le revision ëd la stòria ëd costa pàgina",
        "import-interwiki-templates": "Anserì tùit jë stamp",
        "import-interwiki-submit": "Amporté",
        "import-upload": "Cariament ëd dat XML",
        "import-token-mismatch": "Pèrdita dij dat ëd session.\nPër piasì, ch'a preuva torna.",
        "import-invalid-interwiki": "As peul pa amportesse da la wiki spessificà.",
-       "import-error-edit": "La pàgina «$1» a l'é pa stàita amportà përchè chiel a peul pa modifichela.",
-       "import-error-create": "La pàgina «$1» a l'é pa stàita amportà përchè chiel a peul pa creela.",
-       "import-error-interwiki": "La pàgina «$1» a l'é pa amportà përchè sò nòm a l'é arzervà për na liura esterna (antërwiki).",
-       "import-error-special": "La pàgina «$1» a l'é pa amportà përchè a ponta a në spassi nominal ch'a përmët pa dle pàgine.",
-       "import-error-invalid": "La pàgina «$1» a l'é pa amportà përchè sò nòm a l'é pa bon.",
+       "import-error-edit": "La pàgina «$1» a l'era pa stàita amportà përchè chiel a peul pa modifichela.",
+       "import-error-create": "La pàgina «$1» a l'era pa stàita amportà përchè chiel a peul pa creela.",
+       "import-error-interwiki": "La pàgina «$1» a l'era pa stàita amportà përchè sò nòm a l'é arzervà për na liura esterna (antërwiki).",
+       "import-error-special": "La pàgina «$1» a l'era pa amportà përchè a aparten a në spassi nominal ch'a përmët pa dle pàgine.",
+       "import-error-invalid": "La pàgina «$1» a l'é pa stàita amportà përchè ël nòm sota 'l qual a sarìa stàita amportà a va nen bin su costa wiki.",
        "import-error-unserialize": "La revision $2 dla pagina «$1» a peul pa esse desserialisà. La revision a l'era arportà përchè a deuvra ël model ëd contnù $3 serialisà com $4.",
        "import-error-bad-location": "La revision $2, ch'a deuvra ël model ëd contnù $3 a peul nen esse guernà su «$1» su costa wiki, dagià che col model a l'é nen mantnù su cola pàgina.",
        "import-options-wrong": "{{PLURAL:$2|Opsion|Opsion}} sbalià: <nowiki>$1</nowiki>",
        "importlogpage": "Registr dj'amportassion",
        "importlogpagetext": "Amportassion aministrative ëd pàgine e ëd soa stòria da dj'àutre wiki.",
        "import-logentry-upload": "a l'ha amportà [[$1]] con un càrich d'archivi",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|revision}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision}} amportà",
        "import-logentry-interwiki": "Amportà da n'àutra wiki $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revision}} da $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision}} amportà da $2",
        "javascripttest": "Preuva ëd JavaScript",
        "javascripttest-title": "Fé dle preuve $1",
        "javascripttest-pagetext-noframework": "Costa pàgina a l'é arservà për fé dle preuve JavaScript.",
        "newimages-summary": "Sta pàgina special-sì a la smon j'ùltim archivi carià.",
        "newimages-legend": "Filtror",
        "newimages-label": "Nòm ëd l'archivi (o na soa part):",
+       "newimages-showbots": "Smon-e j'amportassion dij trigomiro",
        "noimages": "Pa gnente da vëdde.",
        "ilsubmit": "Arserché",
        "bydate": "për data",
        "exif-urgency-low": "Bassa ($1)",
        "exif-urgency-high": "Àuta ($1)",
        "exif-urgency-other": "Priorità definìa da l'utent ($1)",
-       "watchlistall2": "tute",
        "namespacesall": "tùit",
        "monthsall": "tuti",
        "confirmemail": "Confermé l'adrëssa postal",
        "autosumm-replace": "Pàgina cambià con '$1'",
        "autoredircomment": "Ridiression anvers a [[$1]]",
        "autosumm-new": "Creà la pàgina con '$1'",
+       "autosumm-newblank": "Pàgina veuida creà",
        "size-bytes": "$1 Byte",
        "size-kilobytes": "$1 KByte",
        "size-megabytes": "$1 MByte",
        "watchlistedit-raw-done": "La lista ëd lòn ch'as ten sot-euj a l'é stàita agiornà.",
        "watchlistedit-raw-added": "{{PLURAL:$1|A l'é|As son}} giontasse {{PLURAL:$1|1 tìtol|$1 tìtoj}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|A l'é|As son}} gavasse via {{PLURAL:$1|1 tìtol|$1 tìtoj}}:",
+       "watchlistedit-clear-title": "Lista dla ròba ch'as ten sot-euj dësvujdà.",
+       "watchlistedit-clear-legend": "Scancelé la lista dla ròba ch'as ten sot-euj",
+       "watchlistedit-clear-explain": "Tuti ij tìtoj a saran ësganfà da la lista dla ròba che as ten sot-euj",
+       "watchlistedit-clear-titles": "Tìtoj:",
+       "watchlistedit-clear-submit": "Scancelé la lista dla ròba ch'as ten sot-euj (sossì a l'é definitiv!)",
+       "watchlistedit-clear-done": "La lista ëd lòn ch'as ten sot-euj a l'é stàita scancelà.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|A l'é|As son}} gavasse via {{PLURAL:$1|1 tìtol|$1 tìtoj}}:",
+       "watchlistedit-too-many": "A-i é tròpe pàgine da smon-e ambelessì.",
+       "watchlisttools-clear": "Scancelé la lista dla ròba ch'as ten sot-euj",
        "watchlisttools-view": "S-ciairé le modifiché amportante",
        "watchlisttools-edit": "Vardé e modifiché la lista ëd lòn ch'as ten sot-euj",
        "watchlisttools-raw": "Modifiché ampressa la lista ëd lòn ch'as ten sot-euj",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ciaciarade]])",
        "unknown_extension_tag": "Tichëtta d'estension «$1» pa conossùa",
        "duplicate-defaultsort": "'''Atension:''' La ciav d'ordinament ëstàndard «$2» a pija ël pòst ëd cola ëd prima «$1».",
+       "duplicate-displaytitle": "<strong>Warning:</strong> ël tìtol ëd visualisassion «$2» a rampiassa ëd vej tìtol ëd visualisassion «$1».",
        "version": "Version",
        "version-extensions": "Estension anstalà",
-       "version-skins": "Pej",
+       "version-skins": "Pel anstalà",
        "version-specialpages": "Pàgine speciaj",
        "version-parserhooks": "Gancio dël dëscompositor",
        "version-variables": "Variàbij",
        "version-hook-name": "Nòm dël gancio",
        "version-hook-subscribedby": "A son scrivusse",
        "version-version": "($1)",
+       "version-no-ext-name": "[gnun nòm]",
        "version-license": "Licensa MediaWiki",
        "version-ext-license": "Licensa",
        "version-ext-colheader-name": "Estension",
+       "version-skin-colheader-name": "Pel",
        "version-ext-colheader-version": "Version",
        "version-ext-colheader-license": "Licensa",
        "version-ext-colheader-description": "Descrission",
        "htmlform-no": "Nò",
        "htmlform-yes": "É",
        "htmlform-chosen-placeholder": "Serne n'opsion",
+       "htmlform-cloner-create": "Gionté 'd pi",
+       "htmlform-cloner-delete": "Gavé",
+       "htmlform-cloner-required": "A-i é damanca d'almanch un valor.",
        "sqlite-has-fts": "$1 con arserca an test pien mantnùa",
        "sqlite-no-fts": "$1 sensa arserca an test pien mantnùa",
        "logentry-delete-delete": "$1 a l'ha {{GENDER:$2|scancelà}} la pàgina $3",
        "logentry-rights-rights": "$1 {{GENDER:$2|a l'ha modificà}} l'apartenensa a la partìa për $3 da $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a l'ha modificà}} l'apartenensa a la partìa për $3",
        "logentry-rights-autopromote": "$1 a l'é {{GENDER:$2|stàit promovù}} an automàtich da $4 a $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|a l'ha carià}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|a l'ha carià}} na neuva version ëd $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|a l'ha carià}} $3",
        "rightsnone": "(gnun)",
+       "revdelete-summary": "resumé dla modìfica",
        "feedback-bugornote": "S'a l'é pront a descrive un problema técnich an detaj, për piasì ch'a [$1 signala un bigat]. \nDësnò, a peul dovré ël formolari semplificà sì-sota. Sò coment a sarà giontà a la pàgina «[$3 $2]», con sò stranòm.",
        "feedback-subject": "Soget:",
        "feedback-message": "Mëssagi:",
        "expand_templates_remove_nowiki": "Gava ij tag <nowiki> ant l'arzultà",
        "expand_templates_generate_xml": "Mosta l'erbo ëd parse XML",
        "expand_templates_generate_rawhtml": "Smon-e l'HTML sempi",
-       "expand_templates_preview": "Preuva"
+       "expand_templates_preview": "Preuva",
+       "pagelanguage": "Seletor ëd lenga dla pàgina",
+       "pagelang-name": "Pàgina",
+       "pagelang-language": "Lenga",
+       "pagelang-use-default": "Dovré la lenga predefinìa",
+       "pagelang-select-lang": "Serne la lenga",
+       "right-pagelang": "Cangé la lenga dla pàgina",
+       "action-pagelang": "cangé la lenga dla pàgina",
+       "log-name-pagelang": "Argistr dij cangiament ëd lenga",
+       "log-description-pagelang": "Cost-sì a l'é n'argistr dij cangiament ant le lenghe dle pàgine.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a l'ha cangià}} la lenga dla pàgina $3 da $4 a $5.",
+       "default-skin-not-found": "Tension! La pel predeterminà për soa wiki, definìa an <code dir=\"ltr\">$wgDefaultSkin</code> tanme <code>$1</code>, a l'é nen disponìbil.\n\nSoa anstalassion a smija anclude le pel sì-dapress. Ch'a vëdda [https://www.mediawiki.org/wiki/Manual:Skin_configuration ël manual ëd configurassion dle pel] për d'anformassion su coma abiliteje e serne col apredefinìa.\n\n$2\n\n; S'a l'ha pen-a anstalà MediaWiki:\n: A l'é probàbil che a l'abia anstalalo da git, o diretaman dal còdes sorgiss an n'àutra manera. A l'é normal. Ch'a preuva a anstalé dle pej da [https://www.mediawiki.org/wiki/Category:All_skins la lista dle pel Ëd mediawiki.org], parèj:\n:* Dëscariand l' [https://www.mediawiki.org/wiki/Download archivi tar ëd l'anstalador], ch'a comprend vàire pel e estension. A peul copié e ancolé la lista dle <code>pel/</code> d'ambelelà.\n:* Clonand un dij depòsit <code>mediawiki/skins/*</code> via git ant la lista <code dir=\"ltr\">skins/</code> ëd soa anstalassion ëd MediaWiki.\n: Sòn a dovrìa nen antërferì con sò depòsit git si chiel a l'é un dësvlupador ëd MediaWiki.\n\n; S'a l'ha pen-a agiornà MediaWiki:\n: MediaWiki 1.24 e pi neuv a përmet pi nen an automàtich le pel anstalà (ch'a vëdda [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery manual an sla dëscuverta automàtica dle pel). A peul copié le linie sì-dapress an <code>LocalSettings.php</code> për abilité tute le pel ch'a son anstalà al moment:\n\n<pre dir=\"ltr\">$3</pre>\n\n; S'a l'ha pen-a modifivà <code>LocalSettings.php</code>:\n: Ch'a verìfica torna ël nòm ëd dle pej për evité ij boro."
 }
index edf2a8e..e7e535a 100644 (file)
        "history": "پچھلے کم",
        "history_short": "ریکارڈ",
        "updatedmarker": "میرے پچھلی وار آن توں مگروں دیاں تبدیلیاں",
-       "printableversion": "Ú\86Ú¾Ù¾Ù\86 Ø¢Ù\84ا ØµÙ\81Ø­ہ",
-       "permalink": "پکا ØªØ¹Ù\84Ù\82",
+       "printableversion": "Ú\86Ú¾Ù¾Ù\86 Ø¬Ù\88گا ØµÙ\81ہ",
+       "permalink": "پکا Ø¬Ù\88Ú\91",
        "print": "چھاپو",
        "view": "وکھالہ",
        "edit": "لکھو",
        "lastmodifiedat": "This page was last modified on $1, at $2.\nاس صفحے نوں آخری آری $1 تریخ نوں $2 وجے بدلیا گیا۔",
        "viewcount": "اس صفحے نوں {{PLURAL:$1|اک واری|$1 واری}} کھولیا گیا اے۔",
        "protectedpage": "بجایا صفحہ",
-       "jumpto": "جاو:",
-       "jumptonavigation": "Ù\85دد",
+       "jumpto": "جاؤ:",
+       "jumptonavigation": "پاÙ\86دھ",
        "jumptosearch": "کھوج",
        "view-pool-error": "$1",
        "pool-timeout": "تالے لئی انتظار",
        "mainpage-description": "پہلا صفہ",
        "policy-url": "Project:پالیسی",
        "portal": "بیٹھک",
-       "portal-url": "Project:بیٹھک",
-       "privacy": "Ø­Ù\81اظتÛ\8c پالیسی",
-       "privacypage": "Project:Ø­Ù\81اظتÛ\8c پالیسی",
+       "portal-url": "ویونت:بیٹھک",
+       "privacy": "بÚ\86اؤ پالیسی",
+       "privacypage": "Project:بÚ\86اؤ پالیسی",
        "badaccess": "اجازت دے وچ غلطی اے",
        "badaccess-group0": "تھاونوں ایس کم دی اجازت نیں جیہڑا تسیں آکھیا اے۔",
        "badaccess-groups": "جیڑا کم تسی کرنا چا رۓ او اوہ صرف {{PLURAL:$2|اس گروپ|ایناں گروپاں}} دے ورتن آلے کر سکدے نیں: $1۔",
        "viewsourcelink": "لکھائی وکھاؤ",
        "editsectionhint": "حصہ لکھو: $1",
        "toc": "حصے",
-       "showtoc": "کھولو",
+       "showtoc": "وکھاؤ",
        "hidetoc": "چھپاؤ",
        "collapsible-collapse": "ڈگنا",
        "collapsible-expand": "ودھاؤ",
        "passwordreset-emailsent-capture": "اک یاد کران والی ای-میل پیج دتی گئی اے، جیہڑی تھلے دسی گئی اے۔",
        "passwordreset-emailerror-capture": "اک یادکراؤ ای-میل بنائی گئی اے، جیہڑی کہ تھلے دسی گئی اے، پر ورتن والے تک پیجنا نئیں ہوسکیا:$1",
        "changeemail": "ای-میل پتہ بدلو",
-       "changeemail-header": "کھاتے دا ای-میل پتہ بدلو",
        "changeemail-text": "اس فارم نوں پورا کر کے ای-میل پتہ بدلو۔ اس کم نوں پورا کرن واسطے توانوں اپنی کنجی لکھنی پۓ گی۔",
        "changeemail-no-info": "تسی لاگ ان ہوکے ای اس صفحے نوں ویکھ سکدے او۔",
        "changeemail-oldemail": "ہلے دا ای-میل پتہ:",
        "changeemail-newemail": "نواں ای-میل پتہ:",
        "changeemail-none": "(کوئی نئیں)",
        "changeemail-submit": "ای-میل بدلو",
-       "changeemail-cancel": "ختم",
        "bold_sample": "موٹی لکھائی",
        "bold_tip": "موٹی لکھائی",
        "italic_sample": "ترچھی لکھائی",
        "media_tip": "فائل دا جوڑ",
        "sig_tip": "تواڈے دستخط ویلے دے نال",
        "hr_tip": "سدھی لکیر",
-       "summary": "خلاصہ:",
+       "summary": "ویروا:",
        "subject": "موضوع/شہ سرخی:",
        "minoredit": "اے نکا جیا کم اے",
        "watchthis": "اس صفحے تے نظر رکھو",
        "previousrevision": "← اوس توں پچھلا کم",
        "nextrevision": "نویں تبدیلی →",
        "currentrevisionlink": "موجودہ حالت",
-       "cur": "موجودہ",
+       "cur": "ہنوالا",
        "next": "اگلا",
        "last": "آخری",
        "page_first": "پہلا",
        "searchrelated": "جڑیا",
        "searchall": "سارے",
        "showingresults": "تھلیوں دسے گۓ  {{PLURAL:$1|'''1''' نتیجہ|'''$1''' نتیجے}}  شروع #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|نتیجہ '''$1''' دا '''$3'''|نتیجے '''$1 - $2''' دے '''$3'''}} لئی '''$4'''",
        "search-nonefound": "سوال نال رلدے کوئی نتارے نئیں سن۔",
        "powersearch-legend": "ہور کھوج",
        "powersearch-ns": "ناں الیاں جگہاں چ لبو:",
        "listfiles_description": "تفصیل",
        "listfiles_count": "ورژن",
        "file-anchor-link": "فائل",
-       "filehist": "Ù¾Ú\86Ú¾Ù\84Û\8c Ø­Ø§Ù\84ت",
+       "filehist": "Ù\81ائÙ\84 Ù\88رتÙ\86",
        "filehist-help": "فائل نو اس ویلے دی حالت وچ ویکھن واسطے تاریخ/ویلے تے کلک کرو۔",
        "filehist-deleteall": "سب نوں مٹاؤ",
        "filehist-deleteone": "مٹاؤ",
        "querypage-disabled": "اے صفہ ناکارہ کیتا گیا پرفارمنس وجہ توں۔",
        "booksources": "کتاب توں اتہ پتہ",
        "booksources-search-legend": "اس مضمون تے کتاباں لبو",
-       "booksources-go": "جاؤ",
        "booksources-text": "تھلے اوناں جوڑاں دی لسٹ اے جتھے نویاں تے پرانیاں کتاباں وکدیاں نیں، تے ہور وی جانکاری ہوسکدی اے  کتاباں بارے تسیں ویکھدے او:",
        "booksources-invalid-isbn": "دتی گئی آئی ایس بی این چلدی نئیں لکدی ؛ اصل سورس نوں چیک کرو کاپی کرن توں پہلے۔",
        "specialloguserlabel": "کرن والا:",
        "addedwatchtext": "اے صفحہ \"[[:$1]] تواڈیاں اکھاں تھلے آگیا اے۔<br />\nمستقبل وچ اس صفحہ تے ایدے بارے چ گل بات نویاں تبدیلیاں وچ موٹے نظر آن گے تا کہ آسانی نال کھوجیا جا سکے۔",
        "removewatch": "اکھ تھلیوں ہٹاؤ",
        "removedwatchtext": "ایہ صفہ \"[[:$1]]\" [[Special:Watchlist|تہاڈی اکھ ]]تھلوں ہٹا لیتا گیا اے۔",
-       "watch": "نظر رکھو",
+       "watch": "اکھ تھلے رکھو",
        "watchthispage": "اس صفے تے اکھ رکھو",
-       "unwatch": "نظر ھٹاؤ",
+       "unwatch": "اکھ تھلے توں ھٹاؤ",
        "unwatchthispage": "اکھ رکھنا چھڈو",
        "notanarticle": "لکھن صفہ نئیں۔",
        "notvisiblerev": "آخری ریوین کسے ہور ورتن والے دی مٹادتی گئی اے۔",
        "wlheader-enotif": "ای-میل نوٹیفیکیشن قابل",
        "wlheader-showupdated": " صفے جیہڑے بدلے کۓ تھواڈے آخری وار آن مکرون  اونان نوں موٹا کرکے دسیا گیا اے۔",
        "wlnote": "تھلے {{PLURAL:$1|آخری تبدیلی|آخری تبدیلیاں '''1$''' }} آخر تے {{PLURAL:$2|کینٹہ|'''2$''' کینٹے}} 3$، 4$.",
-       "wlshowlast": "آخری $1 گھنٹے $2 دن $3 وکھاؤ",
+       "wlshowlast": "آخری $1 گھنٹے $2 دن  وکھاؤ",
        "watchlist-options": "نظر تھلے رکھن دیاں راہواں",
-       "watching": "نظر تھلے۔۔۔۔",
-       "unwatching": "نظروں اولے",
+       "watching": "اکھ تھلے۔۔۔۔",
+       "unwatching": "اولے",
        "watcherrortext": "\"$1\" دی سیٹنگ بد دیاں اک غلطی ہوئی جے",
        "enotif_reset": "سارے ویکھے گۓ صفحیاں تے نشان لاؤ",
        "enotif_impersonal_salutation": "{{SITENAME}} ورتن والا",
        "blanknamespace": "(خاص)",
        "contributions": "ورتن آلے دا حصہ",
        "contributions-title": "$1 دے کم",
-       "mycontris": "میرا کم",
+       "mycontris": "میرے کم",
        "contribsub2": "$1 آستے ($2)",
        "nocontribs": "ایناں ناپاں نال رلدیاں کوئی تبدیلیاں نئیں لبیاں۔",
        "uctop": "(اتے)",
        "sp-contributions-username": "آئی پی پتہ یا ورتن آلا ناں:",
        "sp-contributions-toponly": "صرف اوہ تبدیلیاں وکھاؤ جیہڑیاں سب توں نیڑے ویلے ہویاں نیں۔",
        "sp-contributions-submit": "کھوجو",
-       "whatlinkshere": "اÛ\8cتھÛ\92 Ú©Û\8cدا ØªØ¹Ù\84Ù\82 اے",
+       "whatlinkshere": "اÛ\8cتھÛ\92 Ú©Û\8cدا Ø¬Ù\88Ú\91 اے",
        "whatlinkshere-title": "او صفحات جیڑے \"$1\" نال جڑے نے",
        "whatlinkshere-page": "صفہ:",
        "linkshere": "تھلے دتے گۓ صفے اس دے نال جڑدے نے '''[[:$1]]''':",
        "import": "صفحے لیاؤ",
        "importinterwiki": "ٹرانسوکی امپورٹ",
        "import-interwiki-text": "اک وکی تے صفہ سرناواں لیاں لئی چنو۔\nریوین تریخاں تے لکھاری ناں بچا لۓ جان گۓ۔\nسارے وکیاں وشکار لیان کم [[Special:Log/import|لیان لاگ]] تے لاگڈ نیں۔",
-       "import-interwiki-source": "سورس وکی/صفہ:",
        "import-interwiki-history": "ایس صفے لئی سارا ریرین ریکارڈ کاپی کرو۔",
        "import-interwiki-templates": "سارے سچے رلاؤ",
        "import-interwiki-submit": "لے آؤ",
        "tooltip-pt-preferences": "میریاں تانگاں",
        "tooltip-pt-watchlist": "او صفحے جنہاں وچ تبدیلیاں تسی ویکھ رہے او",
        "tooltip-pt-mycontris": "میرے کم",
-       "tooltip-pt-login": "اÛ\92 Ø¨Û\81تر Ø§Û\92 Ú©Û\81 Ù\84اگ Ø§Ù\86 Û\81Ù\88 Ø¬Ø§Ø¤Ø\8c Ù\84Û\8cÚ©Ù\86 Ù\81Û\8cر Ù\88Û\8c Ø§Û\92 لازمی نئیں۔",
+       "tooltip-pt-login": "اÛ\8cÛ\81 Ø¨Û\81تر Ø§Û\92 Ú©Û\81 Ù\84اگ Ø§Ù\86 Û\81Ù\88 Ø¬Ø§Ø¤Ø\8c Ù\81Û\8cر Ù\88Û\8c Ø§Û\8cÛ\81 لازمی نئیں۔",
        "tooltip-pt-logout": "باہر آؤ",
-       "tooltip-ca-talk": "اس صفحے دے بار وچ گل بات",
-       "tooltip-ca-edit": "تسیں اس صفے تے لکھ سکدے او۔\nمحفوظ کرن توں پہلاں کچے کم نوں ویکھ لو۔",
+       "tooltip-ca-talk": "اس صفے بارے گل بات",
+       "tooltip-ca-edit": "تسیں اس صفے تے لکھ سکدے او۔\nبچان توں پہلاں کچے کم نوں ویکھ لو۔",
        "tooltip-ca-addsection": "اس گل بات وچ حصہ لے لو۔",
        "tooltip-ca-viewsource": "اے صفحہ بچایا گیا اے۔\nتسی اینو صرف ویکھ سکدے او۔",
        "tooltip-ca-history": "اس صفحے دا پرانہ ورژن۔",
        "tooltip-search-go": "اس ناں دے صفحے تے چلو، اگر اے ہے گا اے",
        "tooltip-search-fulltext": "اس لفظ نوں صفحیاں چ لبو",
        "tooltip-p-logo": "پہلا صفہ",
-       "tooltip-n-mainpage": "پہلے صفحے دی سیر",
+       "tooltip-n-mainpage": "پہلے صفے نوں ویکھو",
        "tooltip-n-mainpage-description": "پہلے ورقے تے جاؤ",
-       "tooltip-n-portal": "Ù\85Ù\86صÙ\88بÛ\92 Ø¯Û\92 Ø¨Ø§Ø±Û\92 Ù\88Ú\86Ø\8c ØªÙ\88سÛ\8c کی کر سکدے او تے کنج کھوج سکدے او",
+       "tooltip-n-portal": "پربÙ\86دھ Ø¨Ø§Ø±Û\92 Ø\8c ØªØ³Û\8cÚº کی کر سکدے او تے کنج کھوج سکدے او",
        "tooltip-n-currentevents": "موجودہ حالات تے پچھلیاں معلومات دیکھو",
        "tooltip-n-recentchanges": "وکی تے نویاں تبدیلیاں۔",
-       "tooltip-n-randompage": "بیترتیب صفے کھولو۔",
+       "tooltip-n-randompage": "کوئی صفہ کھولو۔",
        "tooltip-n-help": "مدد لینے آلی جگہ۔",
-       "tooltip-t-whatlinkshere": "اس نال جڑے سارے وکی صفحے۔",
+       "tooltip-t-whatlinkshere": "اس نال جڑے سارے وکی صفے۔",
        "tooltip-t-recentchangeslinked": "اس صفحے توں جڑے صفحیاں چ نویاں تبدیلیاں",
        "tooltip-feed-rss": "RSS feed for this page",
        "tooltip-feed-atom": "Atom feed for this page",
        "tooltip-t-contributions": "اس ورتن والے دے کم ویکھو",
        "tooltip-t-emailuser": "اس ورتن والے نو ای میل کرو",
        "tooltip-t-upload": "فائل چڑھاؤ",
-       "tooltip-t-specialpages": "سارے خاص صفحے",
+       "tooltip-t-specialpages": "سارے خاص صفیاں دی اک لسٹ",
        "tooltip-t-print": "اس صفے دا چھپنے آلا ورژن ویکھو",
        "tooltip-t-permalink": "اس صفحے دے اس ورژن نال پرماننٹ لنک",
        "tooltip-ca-nstab-main": "مواد آلا صفحہ ویکھو",
        "exif-urgency-low": "تھلے کرکے ($1)",
        "exif-urgency-high": "اچا ($1)",
        "exif-urgency-other": "($1)  ورتن ڈیفائینڈ پراورٹی",
-       "watchlistall2": "سارے",
        "namespacesall": "سارے",
        "monthsall": "سارے",
        "confirmemail": "ای میل پتہ پکا کرو",
        "logentry-newusers-create2": "$1 {{جنس:$2|بنایا}} {{جنس:$4|اک ورتن کھاتہ}} $3",
        "logentry-newusers-autocreate": "کھاتہ $1 اپنے آپ ای {{جنس:$2|بنایا گیا}} بنایا گیا۔",
        "rightsnone": "(کوئی وی نئیں)",
+       "revdelete-summary": "لکھائی دا خلاصہ",
        "feedback-bugornote": "اگر تسیں اک تکنیکی مسلے نوں  پوری طراں دسن لئی تیار او تے فیر مہربانی کرکے [$1 بگ بارے دسو]۔  ںئیں تے تسیں تھلے دتا گیا فارم ورتو۔ تواڈی گل صفہ \"[$3 $2]\" تے جڑے گی،  تواڈے ورتن والے ناں تے براؤزر جیہڑا تسیں ورت رۓ او۔",
        "feedback-subject": "آرٹیکل",
        "feedback-message": "سنیعہ:",
index b51b871..bf6af7a 100644 (file)
        "suppress": "Επόπτες",
        "booksources": "Βιβλιογραφικά πηγάς",
        "booksources-search-legend": "Αράεμαν τη βιβλίων",
-       "booksources-go": "Δέβα",
        "specialloguserlabel": "Χρήστες:",
        "speciallogtitlelabel": "Τίτλος:",
        "log": "Αρχεία",
        "unwatch": "Τέλεμαν τ' ωριαγματί",
        "unwatchthispage": "Τέλεμαν ωριαγματί",
        "watchlist-details": "{{PLURAL:$1|$1 σελίδα|$1 σελίδας}} ωριάσκουνταν, θέγα τα σελίδας καλατσεματί.",
-       "wlshowlast": "Φανέρωμαν τ' υστερναίων $1 ωρίων $2 ημερίων $3",
+       "wlshowlast": "Φανέρωμαν τ' υστερναίων $1 ωρίων $2 ημερίων",
        "watchlist-options": "Επιλογάς ωριαγματί",
        "watching": "Ωριάζω...",
        "unwatching": "'κ ωριάζω...",
        "exif-gpsstatus-v": "Διαλειτουργικότητα μετρησίων",
        "exif-gpsspeed-m": "Μίλιαν την ώραν",
        "exif-gpsspeed-n": "Κορδίλαι",
-       "watchlistall2": "ούλαι",
        "namespacesall": "ούλαι",
        "monthsall": "ούλαι",
        "recreate": "Ποίσον αξάν",
        "htmlform-reset": "Κλώσον τ'αλλαγάς",
        "htmlform-selectorother-other": "Άλλον",
        "rightsnone": "(τιδέν)",
+       "revdelete-summary": "σύνοψην",
        "searchsuggest-search": "Αράεμαν"
 }
index f4f403e..66df5cc 100644 (file)
        "pager-older-n": "{{PLURAL:$1|wūraisis 1|wūraišai $1}}",
        "booksources": "Lāiskai",
        "booksources-search-legend": "Laukīs lāiskiskans appuns",
-       "booksources-go": "Waidinnais",
        "booksources-text": "Zemmais ast listi stēisan autengīnsenin prei kittans pāusans, kawīdai perdāst nāunans be tērpautans lāiskans be mazzi turītun talāisins infōrmaciōnins ezze lāiskan laukītan pra tin:",
        "booksources-invalid-isbn": "Padatā ISBN nummeri ast erzinātan kāigi nitikrōmiska. Izbandais, anga padatā nummeri preitāra prei nummerin īmtan iz appun.",
        "specialloguserlabel": "Tērpautajs:",
        "wlheader-enotif": "E-mail pawakīsenei ast enklaūtan.",
        "wlheader-showupdated": "Pastāi '''pastarīntan''' pāusai,  kawīdai bēi kitawīdintan ezze Twajjai panzdauman tenēisan kāimalukisnan..",
        "wlnote": "Zemmais pawaidinnā di {{PLURAL:$1|panzdauman kitawīdinsnan|panzdaumans '''$1''' kitawīdinsnans}} en {{PLURAL:$2|panzdauman stundin|'''$2''' panzdaumans stundins}}.",
-       "wlshowlast": "Waidinnais panzdaumans $1 stūndins, $2 dēinans ($3)",
+       "wlshowlast": "Waidinnais panzdaumans $1 stūndins, $2 dēinans ()",
        "watchlist-options": "Nadirītan listis mazīngiskwas",
        "watching": "As nadirēi...",
        "unwatching": "As wanginna nadirītwei...",
        "import": "Impōrtis pāusans",
        "importinterwiki": "Transwiki impōrts",
        "import-interwiki-text": "Etrīnkais wiki be pāusas tītelin per impōrtisnan.\nWeriōnin dātai be autōras pabilīsnas wīrst būwušas erlaikātan.\nWisāi transwikis impōrtas dīlasenei ast enpeisātan en [[Special:Log/import|impōrtas registeŗu]].",
-       "import-interwiki-source": "Aps šisses wiki/pāusan:",
        "import-interwiki-history": "Kōpis wissans šisse pāusas redigīsnas istōrijan",
        "import-interwiki-templates": "Ebimmais wissans šablōnins",
        "import-interwiki-submit": "Impōrtis",
        "exif-gpsspeed-n": "Winzalai",
        "exif-gpsdirection-t": "Arwis līnkis",
        "exif-gpsdirection-m": "Magnetiskas līnkis",
-       "watchlistall2": "wisāi",
        "namespacesall": "wisāi",
        "monthsall": "wisāi",
        "confirmemail": "Padrūktinais e-mail adressin",
        "htmlform-selectorother-other": "Kitā",
        "revdelete-restricted": "ensadinnais arāikinsenins per perwaldītajans",
        "revdelete-unrestricted": "āupausinais arāikinsenins per perwaldītajans",
-       "rightsnone": "(nisātausna)"
+       "rightsnone": "(nisātausna)",
+       "revdelete-summary": "kitawīdisnan ebpeisāsenis"
 }
index dc00401..b214e7b 100644 (file)
        "hidetoc": "پټول",
        "collapsible-collapse": "پرځول",
        "collapsible-expand": "غځول",
+       "confirmable-yes": "هو",
+       "confirmable-no": "نه",
        "thisisdeleted": "$1 کتل او يا بيازېرمل؟",
        "viewdeleted": "$1 کتل؟",
        "restorelink": "{{PLURAL:$1|يو ړنگ شوی سمون|$1 ړنگ شوي سمونونه}}",
        "passwordreset-emailsent": "د پټنوم بيا پرځای کېدنې لپاره برېښليک درولېږل شو.",
        "passwordreset-emailsent-capture": "د پټنوم بياپرځای کېدنې لپار مو يو برېښليک درولېږه، برېښليک په لاندې توگه ښودل شوی.",
        "changeemail": "برېښليک پته بدلول",
-       "changeemail-header": "د گڼون برېښليک پته بدلول",
        "changeemail-text": "د برېښليک پتې بدلولو لپاره مو همدا فورمه ډکه کړۍ. د دې بدلون د تاييد لپاره بايد پټنوم مو ورکړۍ.",
        "changeemail-no-info": "دې مخ ته د لاسرسي لپاره بايد غونډال کې ورننوځۍ.",
        "changeemail-oldemail": "اوسنۍ برېښليک پته:",
        "changeemail-none": "(هېڅ)",
        "changeemail-password": "ستاسې د{{SITENAME}} پټنوم:",
        "changeemail-submit": "برېښليک بدلول",
-       "changeemail-cancel": "ناگارل",
+       "changeemail-throttled": "تاسې څو واره هڅه کړې چې غونډال ته ورننوځۍ.\nلطفاً د بيا هڅې نه مخکې $1 شېبې تم شۍ.",
        "bold_sample": "زغرد متن",
        "bold_tip": "زغرد متن",
        "italic_sample": "رېوند متن",
        "searchrelated": "اړونده",
        "searchall": "ټول",
        "showingresults": "دلته لاندې تر {{PLURAL:$1|'''1''' پايله|'''$1''' پايلې}} ښکاره شوي پيل له #'''$2''' شوی.",
-       "showingresultsheader": "د «'''$4'''» لپاره {{PLURAL:$5|له '''$1''' نه تر '''$3''' پايله|له '''$1 نه تر $2''' پايلې، ټولې پايلې '''$3''' }}",
        "search-nonefound": "ستاسې دغوښتنې اړونده پايلې و نه موندل شوې.",
        "powersearch-legend": "ژوره پلټنه",
        "powersearch-ns": "په نوم-تشيالونو کې پلټنه:",
        "randompage": "ناټاکلی مخ",
        "randompage-nopages": "په لانديني {{PLURAL:$2|نوم-تشيال|نوم-تشيالونو}} کې هېڅ کوم مخ نشته: $1.",
        "randomincategory": "په وېشنيزه کې ناټاکلی مخ",
-       "randomincategory-selectcategory": "يو ناټاکلی مخ له وېشنيزې موندل: $1 $2.",
-       "randomincategory-selectcategory-submit": "ورځه",
        "randomredirect": "ناټاکلی ورگرځېدنه",
        "statistics": "شمار",
        "statistics-header-pages": "د مخونو شمار",
        "suppress": "څارن",
        "booksources": "د کتاب سرچينې",
        "booksources-search-legend": "د کتابي سرچينو پلټنه",
-       "booksources-go": "ورځه",
        "booksources-text": "دا لاندې د هغه وېبځايونو د تړنو لړليک دی چېرته چې نوي او زاړه کتابونه پلورل کېږي، او يا هم کېدای شي چې د هغه کتاب په هکله مالومات ولري کوم چې تاسو ورپسې لټېږۍ:",
        "specialloguserlabel": "ترسره کوونکی:",
        "speciallogtitlelabel": "موخه (سرليک يا کارن):",
        "wlheader-enotif": "برېښليک خبرونه چارنه شوې.",
        "wlheader-showupdated": "هغه مخونه چې ستاسې د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک په نښه شوي.",
        "wlnote": "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر ساعت|تېرو '''$2''' ساعتونو}} کې تر $3 نېټې او $4 بجو پېښ شوي.",
-       "wlshowlast": "وروستي $1 ساعتونه $2 ورځې $3 ښکاره کړه",
+       "wlshowlast": "وروستي $1 ساعتونه $2 ورځې  ښکاره کړه",
        "watchlist-options": "د کتنلړ خوښنې",
        "watching": "د کتلو په حال کې...",
        "unwatching": "د نه کتلو په حال کې...",
        "thumbnail-more": "لويول",
        "filemissing": "دوتنه ورکه ده",
        "thumbnail_error": "د  بټنوک د جوړېدنې ستونزه: $1",
-       "import-interwiki-source": "سرچينيز ويکي/مخ:",
        "import-interwiki-history": "د دې مخ د پېښليک ټولې بڼې لمېسل",
        "import-interwiki-templates": "ټولې کينډۍ نغاړل",
        "import-interwiki-namespace": "د موخې نوم-تشيال:",
        "exif-urgency-normal": "نورمال ($1)",
        "exif-urgency-low": "لږ ($1)",
        "exif-urgency-high": "ډېر ($1)",
-       "watchlistall2": "ټول",
        "namespacesall": "ټول",
        "monthsall": "ټول",
        "confirmemail": "برېښليک پته تاييدول",
        "logentry-newusers-create": "د $1 کارن گڼون {{GENDER:$2|جوړ شو}}",
        "logentry-newusers-autocreate": "د $1 گڼون په اتوماتيک ډول {{GENDER:$2|جوړ شو}}",
        "rightsnone": "(هېڅ)",
+       "revdelete-summary": "لنډيز سمول",
        "feedback-subject": "سکالو:",
        "feedback-message": "پيغام:",
        "feedback-cancel": "ناگارل",
index 57dad83..b6f8dfe 100644 (file)
                        "לערי ריינהארט",
                        "555",
                        "Fabsouza1",
-                       "아라"
+                       "아라",
+                       "Jefersonmoraes",
+                       "Marcos dias de oliveira",
+                       "He7d3r"
                ]
        },
        "tog-underline": "Sublinhar links:",
@@ -88,6 +91,7 @@
        "tog-watchdefault": "Adicionar as páginas e arquivos que eu editar à minha lista de páginas vigiadas",
        "tog-watchmoves": "Adicionar as páginas e arquivos que eu mover à minha lista de páginas vigiadas",
        "tog-watchdeletion": "Adicionar as páginas e arquivos que eu eliminar à minha lista de páginas vigiadas",
+       "tog-watchrollback": "Adicionar páginas onde fiz uma reversão às minhas páginas vigiadas",
        "tog-minordefault": "Marcar todas as edições como menores por padrão",
        "tog-previewontop": "Mostrar previsão antes da caixa de edição",
        "tog-previewonfirst": "Mostrar previsão na primeira edição",
        "otherlanguages": "Em outros idiomas",
        "redirectedfrom": "(Redirecionado de $1)",
        "redirectpagesub": "Página de redirecionamento",
+       "redirectto": "Redirecionar para:",
        "lastmodifiedat": "Esta página foi modificada pela última vez à(s) $2 de $1.",
        "viewcount": "Esta página foi acessada {{PLURAL:$1|uma vez|$1 vezes}}.",
        "protectedpage": "Página protegida",
        "hidetoc": "ocultar",
        "collapsible-collapse": "Ocultar",
        "collapsible-expand": "Expandir",
+       "confirmable-confirm": "{{GENDER:$1|Tem}} a certeza?",
+       "confirmable-yes": "Sim",
+       "confirmable-no": "Não",
        "thisisdeleted": "Ver ou restaurar $1?",
        "viewdeleted": "Ver $1?",
        "restorelink": "{{PLURAL:$1|uma edição eliminada|$1 edições eliminadas}}",
        "createaccount-text": "Alguém criou uma conta de nome $2 para o seu endereço de email no wiki {{SITENAME}} ($4), tendo como senha \"$3\".\nVocê deve se autenticar e alterar sua senha.\n\nIgnore esta mensagem caso a conta tenha sido criada por engano.",
        "login-throttled": "Você recentemente tentou iniciar sessão muitas vezes.\nPor favor aguarde $1 antes de tentar novamente.",
        "login-abort-generic": "A sua autenticação não teve êxito - Abortada",
+       "login-migrated-generic": "A sua conta foi migrada e o seu nome de usuário já não existe nesta wiki.",
        "loginlanguagelabel": "Idioma: $1",
        "suspicious-userlogout": "Sua solicitação para sair foi negada porque aparentemente foi enviada por um navegador danificado ou por um servidor proxy com cache.",
        "createacct-another-realname-tip": "O nome verdadeiro é opcional.\nSe você optar por fornecê-lo, este nome será utilizado para dar ao usuário a atribuição de seu trabalho.",
        "pt-login": "Entrar",
        "pt-login-button": "Entrar",
        "pt-createaccount": "Crie uma conta",
+       "pt-userlogout": "Sair",
        "php-mail-error-unknown": "Erro desconhecido na função mail() do PHP",
        "user-mail-no-addy": "Tentou enviar uma mensagem sem um endereço de e-mail.",
        "user-mail-no-body": "Você tentou enviar com o campo de e-mail vazio ou com poucos caracteres.",
        "passwordreset-emailsent-capture": "Foi enviado um e-mail de lembrete, que é mostrado abaixo.",
        "passwordreset-emailerror-capture": "Foi gerado um e-mail de recuperação da senha, conforme mostrado abaixo, mas o envio {{GENDER:$2|ao usuário|à usuária}} falhou. $1",
        "changeemail": "Alterar o endereço de e-mail",
-       "changeemail-header": "Alterar o endereço de e-mail da conta",
        "changeemail-text": "Preencha este formulário para alterar o endereço de e-mail. Para confirmar esta alteração terá de introduzir a sua senha.",
        "changeemail-no-info": "Para acessar diretamente esta página você tem de estar autenticado.",
        "changeemail-oldemail": "Endereço de e-mail atual:",
        "changeemail-none": "(nenhum)",
        "changeemail-password": "Sua senha para o wiki {{SITENAME}}:",
        "changeemail-submit": "Alterar e-mail",
-       "changeemail-cancel": "Cancelar",
        "changeemail-throttled": "Você realizou demasiadas tentativas de se registrar.\nPor favor, aguarde $1 antes de tentar novamente.",
        "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.",
        "preview": "Pré-visualização",
        "showpreview": "Mostrar previsão",
        "showdiff": "Mostrar alterações",
+       "blankarticle": "<strong>Aviso:</strong> A página que está prestes a criar está em branco.  \nSe clicar \"{{int:savearticle}}\" outra vez, a página será criada sem qualquer conteúdo.",
        "anoneditwarning": "'''Atenção''': Você não se encontra autenticado.\nO seu endereço de IP será registrado no histórico de edições desta página.",
        "anonpreviewwarning": "''Você não está logado. Gravar registará o seu endereço IP no histórico de edições desta página.''",
        "missingsummary": "'''Lembrete:''' Você não introduziu um sumário de edição. Se clicar novamente em Salvar, a sua edição será salva sem um sumário.",
        "edit-gone-missing": "Não foi possível atualizar a página.\nEla parece ter sido eliminada.",
        "edit-conflict": "Conflito de edição.",
        "edit-no-change": "A sua edição foi ignorada, uma vez que o texto não sofreu alterações.",
+       "postedit-confirmation-created": "A página foi criada.",
        "postedit-confirmation-restored": "Esta página foi restaurada.",
        "postedit-confirmation-saved": "Sua edição foi salva",
        "edit-already-exists": "Não foi possível criar uma nova página.\nEla já existia.",
        "rev-deleted-event": "(entrada removida)",
        "rev-deleted-user-contribs": "[nome de usuário ou endereço de IP eliminado - edição ocultada das contribuições]",
        "rev-deleted-text-permission": "Esta revisão desta página foi '''eliminada'''.\nPodem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminações].",
+       "rev-suppressed-text-permission": "A revisão desta página foi '''eliminada'''.\nVocê pode visualizá-la; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "rev-deleted-text-unhide": "Esta revisão desta página foi '''removida'''.\nPoderá haver detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].\nVocê ainda pode [$1 ver esta revisão] se deseja prosseguir.",
        "rev-suppressed-text-unhide": "Esta revisão desta página foi '''removida'''.\nPoderá haver detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de eliminação].\nVocê ainda pode [$1 ver esta revisão] se deseja prosseguir.",
        "rev-deleted-text-view": "A revisão desta página foi '''eliminada'''.\nVocê pode visualizá-la; pode haver detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "searchrelated": "relacionados",
        "searchall": "todos",
        "showingresults": "A seguir {{PLURAL:$1|é mostrado '''um''' resultado|são mostrados até '''$1''' resultados}}, iniciando no '''$2'''º.",
-       "showingresultsheader": "{{PLURAL:$5|Resulado '''$1''' de '''$3'''|Resultados '''$1 - $2''' de '''$3'''}} para '''$4'''",
        "search-nonefound": "Não há resultados que correspondam à consulta.",
        "powersearch-legend": "Pesquisa avançada",
        "powersearch-ns": "Pesquisar nos espaços nominais:",
        "prefs-dateformat": "Formato de data",
        "prefs-timeoffset": "Desvio horário",
        "prefs-advancedediting": "Opções gerais",
+       "prefs-editor": "Editor",
        "prefs-preview": "Pré-visualizar",
        "prefs-advancedrc": "Opções avançadas",
        "prefs-advancedrendering": "Opções avançadas",
        "prefs-tokenwatchlist": "Senha",
        "prefs-diffs": "Diferenças",
        "prefs-help-prefershttps": "Esta preferência terá efeito no seu próximo início de sessão.",
+       "prefswarning-warning": "Você fez alterações em suas preferências, que não foram salvas ainda. \nSe você sair desta página sem clicar em \"$1\" suas preferências não serão atualizado.",
        "prefs-tabs-navigation-hint": "Dica: Você pode usar as teclas de seta esquerda e direita para navegar entre as abas da lista de abas.",
        "email-address-validity-valid": "Parece válido",
        "email-address-validity-invalid": "Forneça um endereço de e-mail válido",
        "license": "Licenciamento:",
        "license-header": "Licenciamento",
        "nolicense": "Nenhuma selecionada",
+       "licenses-edit": "Editar opções de licença",
        "license-nopreview": "(Previsão não disponível)",
        "upload_source_url": " (um URL válido, publicamente acessível)",
        "upload_source_file": " (um arquivo no seu computador)",
+       "listfiles-delete": "apagar",
        "listfiles-summary": "Esta página especial mostra todos os arquivos carregados.",
        "listfiles_search_for": "Pesquisar por nome de mídia:",
        "imgfile": "arquivo",
        "randomincategory": "Página aleatória na categoria",
        "randomincategory-invalidcategory": "\"$1\" não é um nome de categoria válido.",
        "randomincategory-nopages": "Não há paginas em [[:Category:$1]].",
-       "randomincategory-selectcategory": "Obter página aleatória da categoria: $1 $2.",
-       "randomincategory-selectcategory-submit": "Avançar",
+       "randomincategory-category": "Categoria:",
+       "randomincategory-legend": "Página aleatória na categoria",
        "randomredirect": "Redirecionamento aleatório",
        "randomredirect-nopages": "Não há redirecionamentos no espaço nominal \"$1\".",
        "statistics": "Estatísticas",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
-       "booksources-go": "Ir",
+       "booksources-search": "Pesquisar",
        "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:",
        "trackingcategories": "Categorias de rastreamento",
        "trackingcategories-summary": "Esta página lista categorias de monitoramento que são preenchidas automaticamente pelo software MediaWiki. Seus nomes podem ser alterados através da alteração das mensagens de sistema relevantes no namespace {{ns: 8}}.",
        "trackingcategories-msg": "Categoria de monitoramento",
+       "trackingcategories-name": "Nome da mensagem",
        "trackingcategories-desc": "Critérios de inclusão de categoria",
        "noindex-category-desc": "A página não é indexada por robôs, porque possui a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está em um namespace onde a flag é permitida.",
        "post-expand-template-inclusion-category-desc": "O tamanho da página é superior a <code>$wgMaxArticleSize</code>, após a expansão de todas as predefinições, pelo que algumas predefinições não foram expandidas.",
+       "trackingcategories-nodesc": "Nenhuma descrição disponível.",
        "trackingcategories-disabled": "A categoria está desabilitada",
        "mailnologin": "Nenhum endereço de envio",
        "mailnologintext": "Necessita de estar [[Special:UserLogin|autenticado]] e de possuir um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] para poder enviar um e-mail a outros usuários.",
        "mywatchlist": "Páginas vigiadas",
        "watchlistfor2": "Para $1 $2",
        "nowatchlist": "A sua lista de páginas vigiadas não possui títulos.",
-       "watchlistanontext": "Por favor $1 para ver ou editar os itens na sua lista de páginas vigiadas.",
+       "watchlistanontext": "Por favor, faça login para ver ou editar os itens na sua lista de páginas vigiadas.",
        "watchnologin": "Não está autenticado",
        "addwatch": "Adicionar às páginas vigiadas",
        "addedwatchtext": "A página \"[[:$1]]\" foi adicionada à sua [[Special:Watchlist|lista de páginas vigiadas]].\nFuturas modificações em tal página e páginas de discussão relacionadas serão listadas lá.",
        "wlheader-enotif": "A notificação por email encontra-se ativada.",
        "wlheader-showupdated": "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
        "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas '''$1''' alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas '''$2''' horas}} a partir de $3, $4.",
-       "wlshowlast": "Ver últimas $1 horas $2 dias $3",
+       "wlshowlast": "Ver últimas $1 horas $2 dias",
        "watchlist-options": "Opções da lista de páginas vigiadas",
        "watching": "Vigiando...",
        "unwatching": "Deixando de vigiar...",
        "delete-edit-reasonlist": "Editar motivos de eliminação",
        "delete-toobig": "Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.\nA eliminação de tais páginas foi restrita, a fim de se evitarem problemas acidentais em {{SITENAME}}.",
        "delete-warning-toobig": "Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.\nEliminá-la poderá causar problemas na base de dados de {{SITENAME}};\nprossiga com cuidado.",
-       "delete-cantedit": "Você não pode deletar essa paginá por que você não tem permissão de edita-la",
        "deleting-backlinks-warning": "'''Cuidado:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Outras páginas]] se ligam ou redirecionam para a página que você está prestes a deletar.",
        "rollback": "Reverter edições",
        "rollback_short": "Reverter",
        "import": "Importar páginas",
        "importinterwiki": "Importação transwiki",
        "import-interwiki-text": "Selecione um wiki e um título de página para importar.\nAs datas das edições e os seus editores serão mantidos.\nTodas as ações de importação transwiki são registradas no [[Special:Log/import|Registro de importações]].",
-       "import-interwiki-source": "Wiki/página fonte:",
+       "import-interwiki-sourcewiki": "Fonte wiki:",
+       "import-interwiki-sourcepage": "Página de origem:",
        "import-interwiki-history": "Copiar todas as edições para esta página",
        "import-interwiki-templates": "Incluir todas as predefinições",
        "import-interwiki-submit": "Importar",
        "importfailed": "A importação falhou: $1",
        "importunknownsource": "Tipo de fonte de importação desconhecida",
        "importcantopen": "Não foi possível abrir o arquivo de importação",
-       "importbadinterwiki": "Ligação de interwiki incorreta",
+       "importbadinterwiki": "Link de interwiki incorreto",
        "importsuccess": "Importação completa!",
        "importnosources": "Não foram definidas fontes de importação transwiki e o carregamento direto de históricos encontra-se desativado.",
        "importnofile": "Nenhum arquivo de importação foi carregado.",
        "exif-urgency-low": "Baixa ($1)",
        "exif-urgency-high": "Alta ($1)",
        "exif-urgency-other": "Prioridade definida pelo usuário ($1)",
-       "watchlistall2": "todas",
        "namespacesall": "todos",
        "monthsall": "todos",
        "confirmemail": "Confirmar endereço de E-mail",
        "autosumm-replace": "Página substituída por '$1'",
        "autoredircomment": "Redirecionando para [[$1]]",
        "autosumm-new": "Criou página com '$1'",
+       "autosumm-newblank": "Criar página em branco",
        "lag-warn-normal": "É possível que as alterações que sejam mais recentes do que $1 {{PLURAL:$1|segundo|segundos}} não sejam exibidas nesta lista.",
        "lag-warn-high": "Devido a sérios problemas de latência no servidor do banco de dados, as alterações mais recentes que $1 {{PLURAL:$1|segundo|segundos}} poderão não ser exibidas nesta lista.",
        "watchlistedit-normal-title": "Editar lista de páginas vigiadas",
        "watchlistedit-raw-done": "Sua lista de páginas vigiadas foi atualizada.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Foi adicionado um título|Foram adicionados $1 títulos}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Foi removido um título|Foram removidos $1 títulos}}:",
+       "watchlistedit-clear-title": "Lista de páginas vigiadas limpa",
        "watchlistedit-clear-legend": "Limpar a lista de páginas vigiadas",
        "watchlistedit-clear-explain": "Todos os títulos serão removidos da sua lista de páginas vigiadas",
        "watchlistedit-clear-titles": "Títulos:",
        "version-license": "Licença do MediaWiki",
        "version-ext-license": "Licença",
        "version-ext-colheader-name": "Extensão",
+       "version-skin-colheader-name": "Skin",
        "version-ext-colheader-version": "Versão",
        "version-ext-colheader-license": "Licença",
        "version-ext-colheader-description": "Descrição",
        "htmlform-no": "Não",
        "htmlform-yes": "Sim",
        "htmlform-chosen-placeholder": "Selecione uma opção",
+       "htmlform-cloner-create": "Adicionar mais",
+       "htmlform-cloner-delete": "Remover",
        "htmlform-cloner-required": "Pelo menos um valor é requerido",
        "sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
        "sqlite-no-fts": "$1 sem suporte de pesquisa de texto completo",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "logentry-rights-autopromote": "$1 foi promovido automaticamente de $4 para $5",
        "rightsnone": "(nenhum)",
+       "revdelete-summary": "sumário de edição",
        "feedback-bugornote": "Se você está preparado para descrever detalhadamente um problema técnico, [$1 relate um bug].\nCaso contrário, você poderá usar o formulário simplificado a seguir. Seu comentário será adicionado à página \"[$3 $2]\", junto com o seu nome de usuário e o navegador que estiver usando neste momento.",
        "feedback-subject": "Assunto:",
        "feedback-message": "Mensagem:",
        "expand_templates_generate_xml": "Mostrar árvore de análise (parse) do XML",
        "expand_templates_generate_rawhtml": "Mostrar HTML puro",
        "expand_templates_preview": "Pré-visualização",
+       "pagelang-name": "Página",
+       "pagelang-language": "Idioma",
+       "pagelang-use-default": "Idioma padrão de uso",
        "pagelang-select-lang": "Selecionar idioma",
        "right-pagelang": "Mudar idioma da página",
        "action-pagelang": "mudar idioma da página",
-       "log-name-pagelang": "Mudar idioma do log"
+       "log-name-pagelang": "Mudar idioma do log",
+       "mediastatistics": "Estatísticas de mídia",
+       "mediastatistics-summary": "Estatísticas sobre os tipos de arquivos carregados. Inclui apenas a versão mais recente do arquivo. Versões antigas ou apagadas são excluídas.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Tipo MIME",
+       "mediastatistics-table-extensions": "Possíveis extensões",
+       "mediastatistics-table-count": "Número de arquivos",
+       "mediastatistics-table-totalbytes": "Tamanho combinado",
+       "mediastatistics-header-unknown": "Desconhecido",
+       "mediastatistics-header-bitmap": "Imagens de bitmap",
+       "mediastatistics-header-drawing": "Desenhos (imagens vetoriais)",
+       "mediastatistics-header-audio": "Áudio",
+       "mediastatistics-header-video": "Vídeos",
+       "mediastatistics-header-multimedia": "Mídia enriquecida",
+       "mediastatistics-header-office": "Documento",
+       "mediastatistics-header-text": "Textuais",
+       "mediastatistics-header-executable": "Executáveis",
+       "mediastatistics-header-archive": "Formatos compactados",
+       "json-error-state-mismatch": "JSON inválido ou malformado",
+       "json-error-ctrl-char": "Erro de caractere de controle, possivelmente codificada incorretamente",
+       "json-error-syntax": "Erro de sintaxe",
+       "json-error-utf8": "Caracteres UTF-8 malformados, possivelmente a codificação está incorreta.",
+       "json-error-recursion": "Uma ou mais referências recursivas no valor a ser codificado",
+       "json-error-unsupported-type": "Um valor de um tipo que não pode ser codificado foi dado"
 }
index b41e159..a734e03 100644 (file)
@@ -62,7 +62,8 @@
                        "555",
                        "아라",
                        "Leon saudanha",
-                       "Macofe"
+                       "Macofe",
+                       "He7d3r"
                ]
        },
        "tog-underline": "Sublinhar ligações:",
        "otherlanguages": "Noutros idiomas",
        "redirectedfrom": "(Redireccionado de $1)",
        "redirectpagesub": "Página de redirecionamento",
+       "redirectto": "Redireciona para:",
        "lastmodifiedat": "Esta página foi modificada pela última vez à(s) $2 de $1.",
        "viewcount": "Esta página foi acedida {{PLURAL:$1|uma vez|$1 vezes}}.",
        "protectedpage": "Página protegida",
        "userlogin-remembermypassword": "Manter-me autenticado",
        "userlogin-signwithsecure": "Usar uma ligação segura",
        "yourdomainname": "O seu domínio:",
-       "password-change-forbidden": "Não pode alterar palavras-chave nesta wiki.",
+       "password-change-forbidden": "Não pode alterar palavras-passe nesta wiki.",
        "externaldberror": "Ocorreu um erro externo à base de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.",
        "login": "Entrar",
        "nav-login-createaccount": "Entrar / criar conta",
        "createaccount-text": "Alguém criou uma conta com o nome $2 para o seu endereço de correio eletrónico, na wiki {{SITENAME}} ($4), com a palavra-passe \"$3\".\nDeve agora iniciar sessão e alterar a sua palavra-passe.\n\nSe a conta foi criada por engano, pode ignorar esta mensagem.",
        "login-throttled": "Realizou demasiadas tentativas de início de sessão com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
        "login-abort-generic": "O início de sessão não teve êxito - Cancelado",
+       "login-migrated-generic": "A sua conta foi migrada e o seu nome de utilizador já não existe nesta wiki.",
        "loginlanguagelabel": "Língua: $1",
        "suspicious-userlogout": "O seu pedido para sair foi negado porque parece ter sido enviado por um navegador danificado ou por um proxy com cache.",
        "createacct-another-realname-tip": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.",
        "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-header": "Alterar o endereço de correio eletrónico da conta",
        "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-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
        "changeemail-oldemail": "Correio eletrónico atual:",
        "changeemail-none": "(nenhum)",
        "changeemail-password": "A sua palavra-passe em {{SITENAME}}:",
        "changeemail-submit": "Alterar correio eletrónico",
-       "changeemail-cancel": "Cancelar",
        "changeemail-throttled": "Realizou demasiadas tentativas de início de sessão.\nAguarde $1 antes de tentar novamente, por favor.",
        "resettokens": "Redefinir chaves",
        "resettokens-text": "Pode redefinir as chaves de acesso a certos dados privados associados à sua conta aqui.\n\nDeve fazê-lo se as divulgou acidentalmente a alguém ou se a sua conta tiver sido comprometida.",
        "showpreview": "Antever resultado",
        "showdiff": "Mostrar alterações",
        "blankarticle": "<strong>Aviso:</strong> A página que está prestes a criar está em branco.  \nSe clicar \"{{int:savearticle}}\" outra vez, a página será criada sem qualquer conteúdo.",
-       "anoneditwarning": "'''Aviso''': Não iniciou sessão.\nO seu endereço IP será registado no histórico de edições desta página.",
+       "anoneditwarning": "<strong>Aviso</strong>: Não iniciou sessão. O seu endereço IP será registado no histórico de edições desta página. Se <strong>[$1 iniciar sessão]</strong> ou <strong>[$2 criar uma conta]</strong>, as suas edições serão registadas com o seu nome de utilizador(a), bem como usufruir de outros benefícios.",
        "anonpreviewwarning": "''Não iniciou sessão. Ao gravar, registará o seu endereço IP no histórico de edições da página.''",
        "missingsummary": "'''Atenção:''' Não introduziu um resumo da edição.\nSe clicar novamente \"Gravar página\" a sua edição será gravada sem resumo.",
        "missingcommenttext": "Introduza um comentário abaixo, por favor.",
        "searchall": "todos",
        "showingresults": "{{PLURAL:$1|É apresentado '''um''' resultado|São apresentados até '''$1''' resultados}} abaixo{{PLURAL:$1||, começando pelo '''$2'''º}}.",
        "showingresultsinrange": "Apresenta-se abaixo {{PLURAL:$1|<strong>1</strong> resultado|até <strong>$1</strong> resultados}} no intervalo #<strong>$2</strong> a #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1–$2''' de '''$3'''}} para '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Resultado <strong>$1</strong> de <strong>$3</strong>|Resultados <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "A pesquisa não produziu resultados.",
        "powersearch-legend": "Pesquisa avançada",
        "powersearch-ns": "Pesquisar nos domínios:",
        "prefs-tokenwatchlist": "Chave",
        "prefs-diffs": "Diferenças",
        "prefs-help-prefershttps": "Esta preferência terá efeito no seu próximo início de sessão.",
+       "prefswarning-warning": "Fez alterações às suas preferências que não foram gravadas ainda.\nSe abandonar esta página sem clicar em \"$1\", as suas preferências não serão atualizadas.",
        "prefs-tabs-navigation-hint": "Dica: Pode usar as setas direita e esquerda do teclado para navegar entre os separadores.",
        "email-address-validity-valid": "O endereço de correio eletrónico parece válido",
        "email-address-validity-invalid": "É necessário um endereço de correio eletrónico válido!",
        "randomincategory": "Página aleatória na categoria",
        "randomincategory-invalidcategory": "\"$1\" não é um nome de categoria válido",
        "randomincategory-nopages": "Não há páginas na categoria [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Obter página aleatória da categoria: $1 $2",
-       "randomincategory-selectcategory-submit": "Ir",
+       "randomincategory-category": "Categoria:",
+       "randomincategory-legend": "Página aleatória na categoria",
        "randomredirect": "Redirecionamento aleatório",
        "randomredirect-nopages": "Não há redirecionamentos no domínio \"$1\".",
        "statistics": "Estatísticas",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
-       "booksources-go": "Ir",
+       "booksources-search": "Pesquisar",
        "booksources-text": "É apresentada abaixo uma lista de ligações para outros sítios na Internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique a existência de erros ao copiar da fonte original.",
        "specialloguserlabel": "Executante:",
        "listgrouprights-namespaceprotection-header": "Restrições do domínio",
        "listgrouprights-namespaceprotection-namespace": "Domínio",
        "listgrouprights-namespaceprotection-restrictedto": "Direito(s) do utilizador para editar",
-       "trackingcategories": "Monitoramento de categorias",
+       "trackingcategories": "Categorias de monitoramento",
        "trackingcategories-summary": "Esta página lista as categorias monitoradas que foram geradas automaticamente pelo software MediaWiki. Os seus nomes podem ser alterados ao editar sua mensagem correspondente no domínio {{ns:8}}.",
        "trackingcategories-msg": "Categoria monitorada",
        "trackingcategories-name": "Nome da mensagem",
        "wlheader-enotif": "A notificação por correio eletrónico está ativa.",
        "wlheader-showupdated": "As páginas modificadas desde a última vez que as visitou aparecem destacadas a '''negrito'''.",
        "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas <strong>$1</strong> alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} até $3, $4.",
-       "wlshowlast": "Ver últimas $1 horas $2 dias $3",
+       "wlshowlast": "Ver últimas $1 horas $2 dias",
        "watchlist-options": "Opções da lista de páginas vigiadas",
        "watching": "A vigiar...",
        "unwatching": "A deixar de vigiar...",
        "exbeforeblank": "o conteúdo antes de esvaziar era: \"$1\"",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
-       "historywarning": "'''Aviso:''' A página que está prestes a eliminar tem um histórico com aproximadamente $1 {{PLURAL:$1|revisão|revisões}}:",
+       "historywarning": "<strong>Aviso:</strong> A página que está prestes a eliminar tem um histórico com aproximadamente $1 {{PLURAL:$1|revisão|revisões}}:",
        "confirmdeletetext": "Está prestes a eliminar permanentemente uma página ou uma imagem e todo o seu histórico.\nConfirme que é realmente esta a sua intenção, que compreende as consequências e que o faz de acordo com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]] do projeto, por favor.",
        "actioncomplete": "Operação executada",
        "actionfailed": "Operação falhou",
        "delete-edit-reasonlist": "Editar motivos de eliminação",
        "delete-toobig": "Esta página tem um histórico longo, com mais de $1 {{PLURAL:$1|edição|edições}}.\nA eliminação de páginas como esta foi restringida na {{SITENAME}}, para evitar problemas acidentais.",
        "delete-warning-toobig": "Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.\nEliminá-la poderá causar problemas na base de dados da {{SITENAME}};\nprossiga com precaução.",
-       "delete-cantedit": "Não é possível eliminar esta página porque não possui os privilégios necessários para a editar.",
+       "deleteprotected": "Não é possível eliminar esta página porque foi protegida.",
        "deleting-backlinks-warning": "'''Aviso:''' Existem [[Special:WhatLinksHere/{{FULLPAGENAME}}|páginas]] que contêm ligações para a página que está prestes a eliminar ou que a transcluem.",
        "rollback": "Reverter edições",
        "rollback_short": "Reverter",
        "unblocked": "[[User:$1|$1]] foi desbloqueado",
        "unblocked-range": "A gama $1 foi desbloqueada",
        "unblocked-id": "O bloqueio de $1 foi removido com sucesso",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] foi desbloqueado.",
        "blocklist": "Utilizadores bloqueados",
        "ipblocklist": "Utilizadores bloqueados",
        "ipblocklist-legend": "Procurar um utilizador bloqueado",
        "import": "Importar páginas",
        "importinterwiki": "Importação transwikis",
        "import-interwiki-text": "Selecione uma wiki e um título de página a importar.\nAs datas das edições e os seus editores serão mantidos.\nTodas as ações de importação transwikis são registadas no [[Special:Log/import|Registo de importações]].",
-       "import-interwiki-source": "Wiki ou página de origem:",
+       "import-interwiki-sourcewiki": "Wiki de origem:",
+       "import-interwiki-sourcepage": "Página de origem:",
        "import-interwiki-history": "Copiar todo o histórico de revisões desta página",
        "import-interwiki-templates": "Incluir todas as predefinições",
        "import-interwiki-submit": "Importar",
        "exif-urgency-low": "Baixa ($1)",
        "exif-urgency-high": "Alta ($1)",
        "exif-urgency-other": "Prioridade definida pelo utilizador ($1)",
-       "watchlistall2": "todas",
        "namespacesall": "todos",
        "monthsall": "todos",
        "confirmemail": "Confirmar endereço de correio eletrónico",
        "specialpages-group-pages": "Listas de páginas",
        "specialpages-group-pagetools": "Ferramentas de páginas",
        "specialpages-group-wiki": "Dados e ferramentas",
-       "specialpages-group-redirects": "Pesquisas e aleatoriedade",
+       "specialpages-group-redirects": "Redirecionar páginas especiais",
        "specialpages-group-spam": "Ferramentas anti-spam",
        "blankpage": "Página em branco",
        "intentionallyblankpage": "Esta página foi intencionalmente deixada em branco",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|carregou}} uma nova versão de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|carregou}} $3",
        "rightsnone": "(nenhum)",
+       "revdelete-summary": "editar resumo",
        "feedback-bugornote": "Se está pronto para descrever um problema técnico em detalhe, por favor, [$1 comunique o defeito].\nCaso contrário, pode facilmente usar o formulário abaixo. O seu comentário será adicionado à página \"[$3 $2]\", junto com o seu nome de utilizador e o navegador que está a usar.",
        "feedback-subject": "Assunto:",
        "feedback-message": "Mensagem:",
        "log-description-pagelang": "Este é um registo de alterações aos idiomas das páginas.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|alterou}} o idioma da página $3 de $4 para $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ativado)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desativado''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desativado''')",
+       "mediastatistics": "Estatísticas multimédia",
+       "mediastatistics-summary": "Estatísticas sobre os tipos de ficheiros carregados. Inclui apenas a versão mais recente do ficheiro. Versões antigas ou eliminadas são excluídas.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Tipo MIME",
+       "mediastatistics-table-extensions": "Extensões possíveis",
+       "mediastatistics-table-count": "Número de ficheiros",
+       "mediastatistics-table-totalbytes": "Tamanho combinado",
+       "mediastatistics-header-unknown": "Desconhecido",
+       "mediastatistics-header-bitmap": "Imagens de mapa de bits",
+       "mediastatistics-header-drawing": "Desenhos (imagens vetoriais)",
+       "mediastatistics-header-audio": "Áudio",
+       "mediastatistics-header-video": "Vídeo",
+       "mediastatistics-header-office": "Documentos",
+       "mediastatistics-header-text": "Textuais",
+       "mediastatistics-header-executable": "Executáveis",
+       "mediastatistics-header-archive": "Formatos compactados",
+       "json-error-unknown": "Houve um problema com o JSON. Erro: $1",
+       "json-error-depth": "A profundidade máxima da pilha foi excedida",
+       "json-error-state-mismatch": "Código JSON inválido ou mal formatado",
+       "json-error-syntax": "Erro de sintaxe",
+       "json-error-unsupported-type": "Foi dado um valor de um tipo que não pode ser codificado"
 }
index 74e2954..4d526d4 100644 (file)
                        "פוילישער",
                        "គីមស៊្រុន",
                        "아라",
-                       "Jdforrester"
+                       "Jdforrester",
+                       "Mar(c)"
                ]
        },
        "sidebar": "{{notranslate}}",
        "october-date": "A date in the Gregorian month of October. $1 is the numerical date, for example \"23\".",
        "november-date": "A date in the Gregorian month of November. $1 is the numerical date, for example \"23\".\n{{Identical|November}}",
        "december-date": "A date in the Gregorian month of December. $1 is the numerical date, for example \"23\".",
-       "pagecategories": "Used in the categories section of pages.\n\nFollowed by a colon and a list of categories.\n\nParameters:\n* $1 - number of categories",
+       "pagecategories": "Used in the categories section of pages.\n\nFollowed by a colon and a list of categories.\n\nParameters:\n* $1 - number of categories\n{{Identical|Category}}",
        "pagecategorieslink": "{{notranslate}}",
        "category_header": "In category description page. Parameters:\n* $1 - category name\nSee also:\n* {{msg-mw|Category-media-header}}",
        "subcategories": "Used as a header on category pages that have subcategories.\n{{Identical|Subcategory}}",
        "otherlanguages": "This message is shown under the toolbox. It is used if there are interwiki links added to the page, like <code><nowiki>[[</nowiki>en:Interwiki article]]</code>.\n{{Identical|Otherlanguages}}",
        "redirectedfrom": "The text displayed when a certain page is redirected to another page. Parameters:\n* $1 - the name of the page user came from",
        "redirectpagesub": "Displayed under the page title of a page which is a redirect to another page, see [{{fullurl:Project:Translators|redirect=no}} Project:Translators] for example.\n\n{{Identical|Redirect page}}",
+       "redirectto": "Alt text of the arrow icon shown on redirect pages ([[commons:File:Sample redirect page.jpg]]).\n\n{{Identical|Redirect to}}",
        "talkpageheader": "{{notranslate}}",
        "lastmodifiedat": "This message is shown below each page, in the footer with the logos and links.\n\nParameters:\n* $1 - date\n* $2 - time\nSee also:\n* {{msg-mw|Lastmodifiedatby}}",
        "viewcount": "Used as page-view counter. Parameters:\n* $1 - number of pageviews",
        "hidetoc": "This is the link used to hide the table of contents\n\n{{Identical|Hide}}",
        "collapsible-collapse": "{{Doc-actionlink}}\nThis is the link used to collapse a collapsible element. (used as plaintext. No wikitext or html is parsed.)\n\nSee also:\n* {{msg-mw|Collapsible-expand}}\n{{Identical|Collapse}}",
        "collapsible-expand": "{{Doc-actionlink}}\nThis is the link used to expand a collapsible element (used as plaintext. No wikitext or html is parsed.)\n\nSee also:\n* {{msg-mw|Collapsible-collapse}}\n\nSee the following example:\n{{Identical|Expand}}",
-       "confirmable-confirm": "Question asking the user to confirm a potentially uncancellable action.\n\"Yes\" and \"No\" buttons are displayed beside it.\n\nSee also:\n* {{msg-mw|confirmable-yes}}\n* {{msg-mw|confirmable-no}}",
+       "confirmable-confirm": "Question asking the user to confirm a potentially uncancellable action.\n\"Yes\" and \"No\" buttons are displayed beside it.\n\nSee also:\n* {{msg-mw|confirmable-yes}}\n* {{msg-mw|confirmable-no}}\n{{Identical|Are you sure?}}",
        "confirmable-yes": "{{Doc-actionlink}}\nText of a button that will confirm triggering of a potentially uncancellable action.\n\nSee also:\n* {{msg-mw|confirmable-confirm}}\n* {{msg-mw|confirmable-no}}\n{{Identical|Yes}}",
        "confirmable-no": "{{Doc-actionlink}}\nText of a button that will cancel triggering of a potentially uncancellable action.\n\nSee also:\n* {{msg-mw|confirmable-confirm}}\n* {{msg-mw|confirmable-yes}}\n{{Identical|No}}",
        "thisisdeleted": "Message shown on a deleted page when the user has the undelete right. Parameters:\n* $1 - a link to [[Special:Undelete]], with {{msg-mw|restorelink}} as the text\nSee also:\n* {{msg-mw|viewdeleted}}",
        "userlogin-resetpassword-link": "Used as link text in the login form.\n\nThe link points to the local page [[Special:PasswordReset]].\n\nSee example: [[Special:UserLogin]]\n\nuserlogin-resetpassword-link may have to be shorter than the old {{msg-mw|userlogin-resetlink}}.\n{{Identical|Forgot your password}}",
        "helplogin-url": "{{doc-important|Do not translate the namespace name <code>Help</code>.}}\nUsed as name of the page that provides information about logging into the wiki.\n\nUsed as a link target in the message {{msg-mw|Userlogin-helplink}}.",
        "userlogin-helplink2": "Label for a link to login help.\n\nSee example: [[Special:UserLogin]]\n\nSee also:\n* {{msg-mw|Helplogin-url}}",
-       "userlogin-loggedin": "Used as warning on [[Special:UserLogin]] when the current user is already logged in.\n\nFollowed by the Login form.\n\nSee example: [[Special:UserLogin]].\n\nParameters:\n* $1 - user name (used for display and for gender support)",
+       "userlogin-loggedin": "Used as warning on [[Special:UserLogin]] when the current user is already logged in.\n\nFollowed by the Login form.\n\nSee example: [[Special:UserLogin]].\n\nParameters:\n* $1 - user name (used for display and for gender support)\nSee also:\n* {{msg-mw|Mobile-frontend-userlogin-loggedin-register}}",
        "userlogin-createanother": "Used as label for the button on [[Special:UserLogin]] shown when the current user is already logged in.\n{{Identical|Create another account}}",
        "createacct-emailrequired": "Label in create account form for email field when it is required.\n\nSee also:\n* {{msg-mw|Createacct-emailoptional}}\n{{Identical|E-mail address}}",
        "createacct-emailoptional": "Label in vertical-layout create account form for email field when it is optional.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nSee also:\n* {{msg-mw|Createacct-emailrequired}}",
        "blocked-mailpassword": "Used as error message in password recovery.",
        "eauthentsent": "This message appears after entering an email address in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}, then clicking on \"{{int:saveprefs}}\".",
        "throttled-mailpassword": "Used in [[Special:PasswordReset]]. Parameters:\n* $1 - password reset email resend time (in hours)",
-       "loginstart": "{{notranslate}}",
-       "loginend": "{{notranslate}}",
-       "loginend-https": "{{notranslate}}",
-       "signupstart": "{{notranslate}}\nDefault:\n* {{msg-mw|Loginstart}}",
-       "signupend": "{{notranslate}}\nDefault:\n* {{msg-mw|Loginend}}",
+       "signupstart": "{{notranslate}}",
+       "signupend": "{{notranslate}}",
        "signupend-https": "{{notranslate}}",
        "mailerror": "Used as error message in sending confirmation mail to user. Parameters:\n* $1 - new mail address",
        "acct_creation_throttle_hit": "Error message at [[Special:CreateAccount]].\n\n\"in the last day\" precisely means: during the lasts 86400 seconds (24 hours) ending right now.\n\nParameters:\n* $1 - number of accounts",
        "createaccount-text": "Body of the email sent to the email address entered at [[Special:CreateAccount]] when one user creates an account for another and clicks the checkbox labelled:\n* {{msg-mw|Createaccountmail}}\n\nParameters:\n* $1 - (Unused) IP address\n* $2 - the name entered as username\n* $3 - a password (randomly generated)\n* $4 - a URL to the wiki ('<' + server name + script name + '>')\n* $5 - (Unused) number of days to password expiry date",
        "login-throttled": "Error message shown at [[Special:UserLogin]] after the user has tried to login with incorrect password too many times.\n\nThe user has to wait a certain time before trying to log in again.\n\nParameters:\n* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:\n** {{msg-mw|Duration-millennia}}\n** {{msg-mw|Duration-centuries}}\n** {{msg-mw|Duration-decades}}\n** {{msg-mw|Duration-years}}\n** {{msg-mw|Duration-weeks}}\n** {{msg-mw|Duration-days}}\n** {{msg-mw|Duration-hours}}\n** {{msg-mw|Duration-minutes}}\n** {{msg-mw|Duration-seconds}}\n\nThis is a protection against robots trying to find the password by trying lots of them.\nThe number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].\nThis message is used in html.\n{{identical|Login throttled}}",
        "login-abort-generic": "The generic unsuccessful login message is used unless otherwise specified by hook writers",
+       "login-migrated-generic": "The generic unsuccessful login message when the user's account has been updated, and their username no longer exist",
        "loginlanguagelabel": "Used on [[Special:UserLogin]] if $wgLoginLanguageSelector is true. Parameters:\n* $1 - a pipe-separated list built from the names that appear in the message {{msg-mw|Loginlanguagelinks}}.\n{{Identical|Language}}",
        "loginlanguagelinks": "{{notranslate}}",
        "suspicious-userlogout": "Used when the logout request looks suspicious, in Special:UserLogout.",
        "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-summary": "{{ignored}}",
-       "changeemail-header": "Header on [[Special:ChangeEmail]].",
        "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-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]]",
-       "changeemail-cancel": "Cancel button on [[Special:ChangeEmail]]\n\n{{Identical|Cancel}}",
        "changeemail-throttled": "Error message shown at [[Special:ChangeEmail]] after the user has tried to login with incorrect password too many times.\n\nThe user has to wait a certain time before trying to log in again.\n\nParameters:\n* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:\n** {{msg-mw|Duration-millennia}}\n** {{msg-mw|Duration-centuries}}\n** {{msg-mw|Duration-decades}}\n** {{msg-mw|Duration-years}}\n** {{msg-mw|Duration-weeks}}\n** {{msg-mw|Duration-days}}\n** {{msg-mw|Duration-hours}}\n** {{msg-mw|Duration-minutes}}\n** {{msg-mw|Duration-seconds}}\n\nThis is a protection against robots trying to find the password by trying lots of them.\nThe number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].\nThis message is used in html.\n\nSee also:\n* {{msg-mw|Changepassword-throttled}}",
        "resettokens": "{{doc-special|ResetTokens}}\nIn this case \"token\" may be translated as \"key\", or similar.\n{{Identical|Reset token}}",
        "resettokens-summary": "{{ignored}}",
        "showpreview": "The text of the button to preview the page you are editing. See also {{msg-mw|showdiff}} and {{msg-mw|savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}\n{{Identical|Show preview}}",
        "showdiff": "Button below the edit page. See also {{msg-mw|Showpreview}} and {{msg-mw|Savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}\n{{Identical|Show change}}",
        "blankarticle": "Notice displayed once after the user tries to save an empty page.",
-       "anoneditwarning": "Shown when editing a page anonymously.\nSee also:\n* {{msg-mw|Sf autoedit anoneditwarning}}\n* {{msg-mw|Wikibase-anonymouseditwarning-property}}\n* {{msg-mw|Wikibase-anonymouseditwarning-item}}\n* {{msg-mw|Anonpreviewwarning}}",
+       "anoneditwarning": "Shown when editing a page anonymously.\n\nParameters:\n* $1 – A link to log in, <nowiki>{{fullurl:Special:UserLogin|returnto={{FULLPAGENAMEE}}}}</nowiki>\n* $2 – A link to sign up, <nowiki>{{fullurl:Special:UserLogin/signup|returnto={{FULLPAGENAMEE}}}}</nowiki>\n\nSee also:\n* {{msg-mw|mobile-frontend-editor-anoneditwarning}}",
        "anonpreviewwarning": "See also:\n* {{msg-mw|Anoneditwarning}}",
        "missingsummary": "The text \"edit summary\" is in {{msg-mw|Summary}}.\n\nSee also:\n* {{msg-mw|Missingcommentheader}}\n* {{msg-mw|Savearticle}}",
        "missingcommenttext": "This message is shown, when the textbox by a new-section is empty.",
        "session_fail_preview_html": "Used as error message in Preview page.",
        "token_suffix_mismatch": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}",
        "edit_form_incomplete": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}",
-       "editing": "Shown as page title when editing a page. Parameters:\n* $1 - the name of the page that is being edited. e.g. \"Editing Main Page\"\n{{Related|Editing}}",
-       "creating": "Shown as page title when creating a page. Parameters:\n* $1 - the name of the page that is being created. Example: \"Creating Main Page\".\n{{Related|Editing}}",
+       "editing": "Shown as page title when editing a page. Parameters:\n* $1 - the name of the page that is being edited. e.g. \"Editing Main Page\"\n{{Related|Editing}}\n{{Identical|Editing}}",
+       "creating": "Shown as page title when creating a page. Parameters:\n* $1 - the name of the page that is being created. Example: \"Creating Main Page\".\n{{Related|Editing}}\n{{Identical|Creating}}",
        "editingsection": "This message displays at the top of the page when a user is editing a page section. Parameters:\n* $1 - page name\n{{Related|Editing}}",
        "editingcomment": "This message displays at the top of the page when a user is creating a new section. Parameters:\n* $1 - page name\n{{Related|Editing}}",
        "editconflict": "Used as title of error message. Parameters:\n* $1 - page title",
        "searchall": "{{Identical|All}}",
        "showingresults": "This message is used on some special pages such as [[Special:WantedCategories]]. Parameters:\n* $1 - the total number of results in the batch shown\n* $2 - the number of the first item listed\nSee also:\n* {{msg-mw|Showingresultsnum}}",
        "showingresultsinrange": "Used in pagination of [[Special:MostLinkedCategories]]. Parameters:\n* $1 - the total number of results in the batch shown\n* $2 - the number of the first item listed\n* $3 - the number of last item in the batch shown\n\nSee also {{msg-mw|Showingresults}}",
-       "showingresultsheader": "Used in search results of [[Special:Search]]. Parameters:\n* $1 - minimum offset\n* $2 - maximum offset\n* $3 - total number of results\n* $4 - the search term\n* $5 - number of results",
+       "search-showingresults": "Used in search results of [[Special:Search]]. Parameters:\n* $1 - minimum offset\n* $2 - maximum offset\n* $3 - total number of results\n* $4 - number of results",
        "search-nonefound": "Message shown when a search returned no results (when using the default MediaWiki search engine).",
        "powersearch-legend": "Advanced search\n\n{{Identical|Advanced search}}",
        "powersearch-ns": "Used in the extended search form at [[Special:Search]]",
        "preferences": "Title of the [[Special:Preferences]] page.\n{{Identical|Preferences}}",
        "preferences-summary": "{{doc-specialpagesummary|preferences}}",
        "mypreferences": "Action link label that leads to [[Special:Preferences]]; appears in the top menu (e.g. \"Username Talk Preferences Watchlist Contributions Log out\").\n\nSee also:\n* {{msg-mw|Mypreferences}}\n* {{msg-mw|Accesskey-pt-preferences}}\n* {{msg-mw|Tooltip-pt-preferences}}\n{{Identical|Preferences}}",
-       "prefs-edits": "In user preferences.",
+       "prefs-edits": "In user preferences.\n{{Identical|Number of edits}}",
        "prefsnologintext2": "Showed on Special:Userlogin when user tries to access their preferences before logging in",
        "prefs-skin": "Used in user preferences.\n{{Identical|Skin}}",
        "skin-preview": "{{doc-actionlink}}\nThe link beside each skin name in [[Special:Preferences|your user preferences]], tab \"skin\".\n{{Identical|Preview}}",
        "timezoneregion-pacific": "Used in \"Time zone\" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], \"date and time\" tab.\n{{Related|Timezoneregion}}",
        "allowemail": "Used in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.",
        "prefs-searchoptions": "{{Identical|Search}}",
-       "prefs-namespaces": "Shown as legend of the second fieldset of the tab 'Search' in [[Special:Preferences]]\n{{Identical|Namespaces}}",
+       "prefs-namespaces": "Shown as legend of the second fieldset of the tab 'Search' in [[Special:Preferences]]\n{{Identical|Namespace}}",
        "default": "{{Identical|Default}}",
        "prefs-files": "Title of a tab in [[Special:Preferences]].\n{{Identical|File}}",
        "prefs-custom-css": "visible on [[Special:Preferences]] -[Skins].\n{{Identical|Custom CSS}}",
        "prefs-custom-js": "visible on [[Special:Preferences]] -[Skins].\n{{Identical|Custom JavaScript}}",
-       "prefs-common-css-js": "Used as label in [[Special:Preferences#mw-prefsection-rendering|preferences]], tab \"Appearance\", section \"Skin\".",
+       "prefs-common-css-js": "Used as label in [[Special:Preferences#mw-prefsection-rendering|preferences]], tab \"Appearance\", section \"Skin\".\n\nSee also:\n* {{msg-mw|Globalcssjs-custom-css-js}}",
        "prefs-reset-intro": "Used in [[Special:Preferences/reset]].",
        "prefs-emailconfirm-label": "Sub-heading in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.",
        "youremail": "Label of the e-mail text box of the \"E-mail options\" section of [[Special:Preferences]].\nAlso used on create account form.\n\n{{Identical|E-mail}}",
        "prefs-tokenwatchlist": "Section heading.\nUsed in [[Special:Preferences]], tab \"Watchlist\".\n{{Identical|Token}}",
        "prefs-diffs": "Used in [[Special:Preferences]], tab \"Misc\".",
        "prefs-help-prefershttps": "Used as help text for the checkbox in [[Special:Preferences]].\n\nThe checkbox has the label {{msg-mw|Tog-prefershttps}}.\n\nSee example: [[mw:Special:Preferences]].",
+       "prefswarning-warning": "Warning shown (except in Firefox) when attempting to leave [[Special:Preferences]] with unsaved changes.\n\nParameters:\n* $1 - Text of {{msg-mw|saveprefs}}, as <nowiki>{{int:saveprefs}}</nowiki> cannot be used directly.",
        "prefs-tabs-navigation-hint": "Hint message that explains the arrow key navigation for the tabs on [[Special:Preferences]] to screenreader users.",
        "email-address-validity-valid": "Used as hint for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is valid.",
        "email-address-validity-invalid": "Used as warning for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is invalid.",
        "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-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}}",
+       "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}}",
+       "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}}",
-       "grouppage-user": "{{doc-group|user|page}}",
+       "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}}",
        "randompage": "{{doc-special|RandomPage}}\nSee also:\n* {{msg-mw|Randompage}}\n* {{msg-mw|Accesskey-n-randompage}}\n* {{msg-mw|Tooltip-n-randompage}}\n{{Identical|Random page}}",
        "randompage-nopages": "Parameters:\n* $1 - list of namespaces\n* $2 - number of namespaces, for PLURAL support\nSee also:\n* {{msg-mw|Randomredirect-nopages}}",
        "randompage-url": "{{notranslate}}",
-       "randomincategory": "{{doc-special|RandomInCategory}}",
+       "randomincategory": "{{doc-special|RandomInCategory}}\n{{Identical|Random page in category}}",
        "randomincategory-invalidcategory": "Message shown if an invalid category is specified.\n\nParameters:\n* $1 - the invalid category name given\n\n(Note, if the category is simply empty, but could possibly exist, {{msg-mw|randomincategory-nopages}} is shown instead)",
        "randomincategory-nopages": "Message shown from [[Special:RandomInCategory]] if the category is empty.\n\nParameters:\n* $1 - the category name (without the namespace prefix)",
-       "randomincategory-selectcategory": "Shown on [[Special:RandomInCategory]] if no category is selected.\n\nDisplays a form allowing the user to input a category name.\n\nParameters:\n* $1 - the text field input box\n* $2 - the go button which has the label {{msg-mw|randomincategory-selectcategory-submit}}.",
-       "randomincategory-selectcategory-submit": "Used as label for the Submit button which is used as <code>$2</code> in {{msg-mw|Randomincategory-selectcategory}}.\n{{Identical|Go}}",
+       "randomincategory-category": "Shown on [[Special:RandomInCategory]] as a label for a text box allowing the user to input a category name.\n{{Identical|Category}}",
+       "randomincategory-legend": "Used as fieldset label for the form on [[Special:RandomInCategory]].",
        "randomredirect": "{{doc-special|RandomRedirect}}",
        "randomredirect-nopages": "Parameters:\n* $1 - list of namespaces\n* $2 - (Unused) number of namespaces\nSee also:\n* {{msg-mw|Randompage-nopages}}",
        "statistics": "{{doc-special|Statistics}}\n{{Identical|Statistics}}",
        "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}}",
        "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}}",
+       "apihelp-no-such-module": "Used as an error message if the requested API module is not found.\n\nParameters:\n* $1 - Requested module name",
+       "apihelp-link": "{{notranslate}} Used to construct a link to [[Special:ApiHelp]]\n\nParameters:\n* $1 - module to link\n* $2 - link text",
        "booksources": "{{doc-special|BookSources}}\n\n'''This message shouldn't be changed unless it has serious mistakes.'''\n\nIt's used as the page name of the configuration page of [[Special:BookSources]]. Changing it breaks existing sites using the default version of this message.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
        "booksources-summary": "{{doc-specialpagesummary|booksources}}",
        "booksources-search-legend": "Box heading on [[Special:BookSources|book sources]] special page. The box is for searching for places where a particular book can be bought or viewed.",
        "booksources-isbn": "{{optional}}\nThis is a label that appears before a text input field on the Special:BookSources page.\n{{Identical|ISBN}}",
-       "booksources-go": "Name of button in [[Special:BookSources]]\n\n{{Identical|Go}}",
+       "booksources-search": "Search button in [[Special:BookSources]]\n\n{{Identical|Go}}",
        "booksources-text": "Used in [[Special:BookSources/1]].\n\nThis message is followed by a list of links to other sites.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
        "booksources-invalid-isbn": "This message is displayed after an invalid ISBN is entered on [[Special:Booksources]].",
        "rfcurl": "{{notranslate}}\nParameters:\n* $1 - RFC number\nSee also:\n* {{msg-mw|Pubmedurl}}",
        "wlheader-enotif": "Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.\n\nSee also:\n* {{msg-mw|Watchlist-options|fieldset}}\n* {{msg-mw|enotif reset|Submit button text}}",
        "wlheader-showupdated": "Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.",
        "wlnote": "Used on [[Special:Watchlist]] when a maximum number of hours or days is specified.\n\nParameters:\n* $1 - the number of changes shown\n* $2 - the number of hours for which the changes are shown\n* $3 - a date alone\n* $4 - a time alone",
-       "wlshowlast": "Appears on [[Special:Watchlist]]. Parameters:\n* $1 - a choice of different numbers of hours (\"1 | 2 | 6 | 12\")\n* $2 - a choice of different numbers of days (\"1 | 3 | 7\")\n* $3 - {{msg-mw|watchlistall2}}\nClicking on your choice changes the list of changes you see (without changing the default in my preferences).",
+       "wlshowlast": "Appears on [[Special:Watchlist]]. Parameters:\n* $1 - a choice of different numbers of hours (\"1 | 2 | 6 | 12\")\n* $2 - a choice of different numbers of days (\"1 | 3 | 7\" and the maximum number of days available)\nClicking on your choice changes the list of changes you see (without changing the default in my preferences).",
        "watchlist-options": "Legend of the fieldset of [[Special:Watchlist]]\n\nSee also:\n* {{msg-mw|Watchlist-details|watchlist header}}\n* {{msg-mw|Wlheader-enotif|watchlist header}}\n* {{msg-mw|enotif reset|Submit button text}}",
        "watching": "Text displayed when clicked on the watch tab: {{msg-mw|Watch}}. It means the wiki is adding that page to your watchlist.",
        "unwatching": "Text displayed when clicked on the unwatch tab: {{msg-mw|Unwatch}}. It means the wiki is removing that page from your watchlist.",
        "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}}",
-       "historywarning": "Warning when about to delete a page that has history.\n\nFollowed by a link which points to the history page.\n\nParameters:\n* $1 - the <b>approximate</b> number of revisions that the page has, the message should not claim to give an exact count",
+       "historywarning": "Warning when about to delete a page that has history.\n\nFollowed by a link which points to the history page.\n\nParameters:\n* $1 - the number of revisions that the page has",
        "confirmdeletetext": "Introduction shown when deleting a page.\n\nRefers to {{msg-mw|Policy-url}}.",
        "actioncomplete": "Used in several situations, for example when a page has been deleted.\n\nSee also:\n* {{msg-mw|Actionfailed|page title}}",
        "actionfailed": "Used as page title when the submit operation failed, in [[Special:RevisionDelete]].\n\nSee also:\n* {{msg-mw|Actioncomplete|page title}}",
        "delete-edit-reasonlist": "Shown beneath the page deletion form on the right side. It is a link to {{msg-mw|Deletereason-dropdown|notext=1}}.\n\nSee also:\n* {{msg-mw|Ipb-edit-dropdown}}\n* {{msg-mw|Protect-edit-reasonlist}}.\n{{Identical|Edit delete reasons}}",
        "delete-toobig": "Parameters:\n* $1 - the upper limit of number of revisions\nSee also:\n* {{msg-mw|Delete-warning-toobig}}",
        "delete-warning-toobig": "Parameters:\n* $1 - the upper limit of number of revisions\nSee also:\n* {{msg-mw|Delete-toobig}}",
-       "delete-cantedit": "Used as error message when deleting the page.",
+       "deleteprotected": "Used as error message when deleting the page.\n\n\"If protection keeps them from editing, they shouldn't be able to delete.\"",
        "deleting-backlinks-warning": "A warning shown when a page that is being deleted has at least one link to it or is transcluded in at least one page.",
        "rollback": "{{Identical|Rollback}}",
        "rollback_short": "{{Identical|Rollback}}",
        "protect-cantedit": "Used as error message when changing the protection levels of the page.",
        "protect-othertime": "Used on the page protection form as label for the following input field (text)\n{{Identical|Other time}}",
        "protect-othertime-op": "Used on the page protection form in the drop down menu\n{{Identical|Other time}}",
-       "protect-existing-expiry": "Shows the existing expiry time in the drop down menu of the protection form ([{{canonicalurl:User:Raymond/test|action=unprotect}} example])\n\nParameters:\n* $1 - (Unused) date and time of the existing expiry time (kept for backward compatibility purposes)\n* $2 - date of the existing expiry time\n* $3 - time of the existing expiry time",
+       "protect-existing-expiry": "Shows the existing expiry time in the drop down menu of the protection form ([{{canonicalurl:User:Raymond/test|action=unprotect}} example])\n\nParameters:\n* $1 - (Unused) date and time of the existing expiry time (kept for backward compatibility purposes)\n* $2 - date of the existing expiry time\n* $3 - time of the existing expiry time\n\nSee also:\n* {{msg-mw|protect-existing-expiry-infinity}}",
+       "protect-existing-expiry-infinity": "Shows the existing expiry time in the drop down menu of the protection form, in the special case that it is infinity\n\nSee also:\n* {{msg-mw|protect-existing-expiry}}",
        "protect-otherreason": "Shown on the page protection form as label for the following input field (text)\n{{Identical|Other/additional reason}}",
        "protect-otherreason-op": "Shown on the page protection form in the drop down menu\n{{Identical|Other reason}}",
        "protect-dropdown": "Shown on the page protection form as drop down menu for protection reasons.\n\n* <code><nowiki>* Groupname</nowiki></code> - defines a new group\n* <code><nowiki>** Reason</nowiki></code> - defines a reason in this group",
        "contribsub2": "Contributions for \"user\" (links). Parameters:\n* $1 is an IP address or a username, with a link which points to the user page (if registered user).\n* $2 is list of tool links. The list contains a link which has text {{msg-mw|Sp-contributions-talk}}.\n* $3 is a plain text username used for GENDER.\n{{Identical|For $1}}",
        "contributions-userdoesnotexist": "This message is used in [[Special:Contributions]]. It is used to tell the user that the name he searched for doesn't exists.\n\nParameters:\n* $1 - a username\n\n{{identical|userdoesnotexist}}",
        "nocontribs": "Used in [[Special:Contributions]] and [[Special:DeletedContributions]].\n\nSee examples: [[Special:Contributions/x]] and [[Special:DeletedContributions/x]].\n\nParameters:\n* $1 - (Unused) the user name",
-       "uctop": "This message is used in [[Special:Contributions]]. It is used to show that a particular edit was the last made to a page. Example: 09:57, 11 February 2008 (hist) (diff) Pagename‎ (edit summary) (current)\n{{Identical|Top}}",
+       "uctop": "This message is used in [[Special:Contributions]]. It is used to show that a particular edit was the last made to a page. Example: 09:57, 11 February 2008 (hist) (diff) Pagename‎ (edit summary) (current)\n{{Identical|Current}}",
        "month": "Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a dropdown box to select a specific month to view the edits made in that month, and the earlier months. See also {{msg-mw|year}}.",
        "year": "Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for an input box to select a specific year to view the edits made in that year, and the earlier years.\n\nSee also:\n* {{msg-mw|month}}",
        "sp-contributions-newbies": "Text of radio button on special page [[Special:Contributions]].",
        "sp-contributions-suppresslog": "Used as a display name for a link to log entries of suppressed edits made by that user.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also {{msg-mw|sp-contributions-deleted}}, {{msg-mw|sp-deletedcontributions-contribs}}, {{msg-mw|contributions}}, {{msg-mw|deletedcontributions-title}}.",
        "sp-contributions-deleted": "This is a link anchor used in [[Special:Contributions]]/''name'', when user viewing the page has the right to delete pages, or to restore deleted pages.\n\nUsed as link title in [[Special:Contributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-userrights}}",
        "sp-contributions-uploads": "Used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Upload}}",
-       "sp-contributions-logs": "Appears as an action link in the header of the Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}",
+       "sp-contributions-logs": "Appears as an action link in the header of the Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Log}}",
        "sp-contributions-talk": "This is a link anchor used in the [[Special:Contributions]]/''usernamename'' pages.\nThe link appears in a list of similar ones separated by {{msg-mw|pipe-separator}}, e.g. like this:<br />\n( talk | block log | logs | deleted contributions | rights management )\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|change-blocklink}}\n* {{msg-mw|unblocklink}}\n* {{msg-mw|blocklink}}\n* {{msg-mw|sp-contributions-blocklog}}\n* {{msg-mw|sp-contributions-uploads}}\n* {{msg-mw|sp-contributions-logs}}\n* {{msg-mw|sp-contributions-deleted}}\n* {{msg-mw|sp-contributions-userrights}}\n{{Identical|Talk}}",
        "sp-contributions-userrights": "This is a link anchor used in [[Special:Contributions]]/''name'', if the user viewing the page has the right to set or alter user rights.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}",
        "sp-contributions-blocked-notice": "Shown on top of contributions special page of currently blocked users.\n\nParameters:\n* $1 - (Optional) the blocked user. Can be used for GENDER\nAnon version:\n* {{msg-mw|Sp-contributions-blocked-notice-anon}}",
        "whatlinkshere-prev": "This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the first argument of {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\nSpecial pages use {{msg-mw|Prevn}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\nSee also:\n* {{msg-mw|Whatlinkshere-next}}\n{{Identical|Previous}}",
        "whatlinkshere-next": "This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the second argument of {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\nSpecial pages use {{msg-mw|Nextn}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\nSee also:\n* {{msg-mw|Whatlinkshere-prev}}\n{{Identical|Next}}",
        "whatlinkshere-links": "Used on [[Special:WhatLinksHere]]. It is a link to the WhatLinksHere page of that page.\n\nExample line:\n* [[Main Page]] ([[Special:WhatLinksHere/Main Page|{{int:whatlinkshere-links}}]])\n{{Identical|Link}}",
-       "whatlinkshere-hideredirs": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}",
-       "whatlinkshere-hidetrans": "First filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}",
-       "whatlinkshere-hidelinks": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}",
+       "whatlinkshere-hideredirs": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}\n{{Identical|Redirect}}",
+       "whatlinkshere-hidetrans": "First filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}\n{{Identical|Transclusion}}",
+       "whatlinkshere-hidelinks": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}\n{{Identical|Link}}",
        "whatlinkshere-hideimages": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 - the {{msg-mw|Hide}} or {{msg-mw|Show}}\n\nSee also:\n*{{msg-mw|Isimage}}\n*{{msg-mw|Media tip}}",
        "whatlinkshere-filters": "{{Identical|Filter}}",
        "autoblockid": "Used as name of autoblock, instead of autoblocked IPs. Parameters:\n* $1 - autoblock ID",
        "ipb-confirmhideuser": "Used as confirmation message in [[Special:Block]].\n\nSee also:\n* {{msg-mw|Ipb-blockingself}}",
        "ipb-confirmaction": "Confirmation message displayed to users asking them to think again before really blocking someone.",
        "ipb-edit-dropdown": "Shown beneath the user block form on the right side. It is a link to {{msg-mw|Ipbreason-dropdown|notext=1}}.\n\nSee also:\n* {{msg-mw|Delete-edit-reasonlist}}\n* {{msg-mw|Protect-edit-reasonlist}}",
-       "ipb-unblock-addr": "Used as page title in [[Special:Block]], if the target user is specified.\n\nParameters:\n* $1 - target username\n\nSee also:\n* {{msg-mw|Ipb-unblock}}",
+       "ipb-unblock-addr": "Used as page title in [[Special:Block]], if the target user is specified.\n\nParameters:\n* $1 - target username\n\nSee also:\n* {{msg-mw|Ipb-unblock}}\n{{Identical|Unblock}}",
        "ipb-unblock": "Used as page title in [[Special:Block]], if the target user is not specified.\n\nSee also:\n* {{msg-mw|Ipb-unblock-addr}}",
        "ipb-blocklist": "Used as link text in [[Special:Block]].\n\nThe link points to Specil:BlockList.",
        "ipb-blocklist-contribs": "Used in [[Special:Block]].\n* $1 - target username",
        "unblockip": "Used as legend for the form in [[Special:Unblock]].",
        "unblockiptext": "Used in the {{msg-mw|Unblockip}} form on [[Special:Unblock]].",
        "ipusubmit": "Used as button text on [{{canonicalurl:Special:BlockList|action=unblock}} Special:BlockList?action=unblock]. To see the message:\n* Go to [[Special:BlockList]]\n* Click \"unblock\" for any block (but you can only see \"unblock\" if you have administrator rights)\n* It is now the button below the form",
-       "unblocked": "{{doc-important|Do not translate the namespace \"User:\".}}\nParameters:\n* $1 - the IP address or username that was unblocked\nSee also:\n* {{msg-mw|Unblocked-range}}\n* {{msg-mw|Unblocked-id}}",
-       "unblocked-range": "Shown when successfully lifting a rangeblock, so do not link to contributions. Parameters:\n* $1 - the range that was unblocked\nSee also:\n* {{msg-mw|Unblocked}}\n* {{msg-mw|Unblocked-id}}",
+       "unblocked": "{{doc-important|Do not translate the namespace \"User:\".}}\nParameters:\n* $1 - the username that was unblocked\nSee also:\n* {{msg-mw|Unblocked-range}}\n* {{msg-mw|Unblocked-id}}\n*{{msg-mw|Unblocked-ip}}",
+       "unblocked-range": "Shown when successfully lifting a rangeblock, so do not link to contributions. Parameters:\n* $1 - the range that was unblocked\nSee also:\n* {{msg-mw|Unblocked}}\n* {{msg-mw|Unblocked-id}}\n*{{msg-mw|Unblocked-ip}}",
        "unblocked-id": "Used in [[Special:Unblock]]. Parameters:\n* $1 - autoblock ID\nSee also:\n* {{msg-mw|Unblocked}}\n* {{msg-mw|Unblocked-range}}",
+       "unblocked-ip": "{{doc-important|Do not translate the title \"Special:Contributions\".}}\nParameters:\n* $1 - the IP address that was unblocked\nSee also:\n* {{msg-mw|Unblocked-range}}\n* {{msg-mw|Unblocked-id}}\n*{{msg-mw|Unblocked}}",
        "blocklist": "{{doc-special|BlockList}}",
        "ipblocklist": "Title of [[Special:Ipblocklist]].",
        "ipblocklist-legend": "Used as legend of the form in [[Special:BlockList]].\n\nSee also:\n* {{msg-mw|Ipblocklist-legend}}\n* {{msg-mw|Ipblocklist-submit}}",
        "blocklist-addressblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
        "blocklist-rangeblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n\nFor an explanation of \"range blocks\", see [[mw:Help:Range_blocks]]\n{{Related|Blocklist-blocks}}",
        "blocklist-timestamp": "This is a column header for dates and times in the table on the page [[Special:BlockList]].\n{{Identical|Timestamp}}",
-       "blocklist-target": "The table header for the column containing the block targets, that is user names or IP-addresses linked to their respective user pages, in the table on the page [[Special:BlockList]].",
+       "blocklist-target": "The table header for the column containing the block targets, that is user names or IP-addresses linked to their respective user pages, in the table on the page [[Special:BlockList]].\n{{Identical|Target}}",
        "blocklist-expiry": "This is a column header in the table on the page [[Special:BlockList]].\n{{Identical|Expire}}",
        "blocklist-by": "This is a column header in the table on the page [[Special:BlockList]].",
        "blocklist-params": "This is a column header in the table on the page [[Special:BlockList]].",
        "lockfilenotwritable": "'No longer needed' on wikipedia.",
        "databasenotlocked": "Used as error message in [[Special:UnlockDB]].\nThe title of this error message is {{msg-mw|Lockdb}}.\n\nSee also:\n* {{msg-mw|Lockdb|title}}\n* {{msg-mw|Databasenotlocked|message}}",
        "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)",
+       "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}}",
        "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}}",
        "import-summary": "{{doc-specialpagesummary|import}}",
        "importinterwiki": "Used as legend for the Import form in [[Special:Import]].",
        "import-interwiki-text": "Used as summary for the Import form in [[Special:Import]].",
-       "import-interwiki-source": "Used as label for input box in [[Special:Import]].",
+       "import-interwiki-sourcewiki": "Used as label for dropdown box in [[Special:Import]].\n\nSee also:\n* {{msg-mw|Import-interwiki-sourcepage}}",
+       "import-interwiki-sourcepage": "Used as label for input box in [[Special:Import]].\n\nSee also:\n* {{msg-mw|Import-interwiki-sourcewiki}}",
        "import-interwiki-history": "This is an option on [[Special:Import]]. Usually, when unchecked, only the first version of a page is imported. When you check the option, all versions are imported. This is important often to check for licensing reasons.\n\nSee also:\n* {{msg-mw|Import-interwiki-templates}}\n* {{msg-mw|Import-interwiki-namespace}}\n* {{msg-mw|Import-comment}}\n* {{msg-mw|Import-interwiki-rootpage}}\n* {{msg-mw|Import-interwiki-submit}}",
        "import-interwiki-templates": "Used as label for the checkbox in [[Special:Import]].\n\nSee also:\n* {{msg-mw|Import-interwiki-history}}\n* {{msg-mw|Import-interwiki-namespace}}\n* {{msg-mw|Import-comment}}\n* {{msg-mw|Import-interwiki-rootpage}}\n* {{msg-mw|Import-interwiki-submit}}",
        "import-interwiki-submit": "Used as Submit button text in [[Special:Import]].\n\nSee also:\n* {{msg-mw|Import-interwiki-history}}\n* {{msg-mw|Import-interwiki-templates}}\n* {{msg-mw|Import-interwiki-namespace}}\n* {{msg-mw|Import-comment}}\n* {{msg-mw|Import-interwiki-rootpage}}\n{{Identical|Import}}",
        "accesskey-pt-mycontris": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mycontris}}\n* {{msg-mw|Accesskey-pt-mycontris}}\n* {{msg-mw|Tooltip-pt-mycontris}}",
        "accesskey-pt-login": "{{doc-accesskey}}",
        "accesskey-pt-logout": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Logout}}\n* {{msg-mw|Accesskey-pt-logout}}\n* {{msg-mw|Tooltip-pt-logout}}",
+       "accesskey-pt-createaccount": "{{doc-accesskey}}",
        "accesskey-ca-talk": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Talk}}\n* {{msg-mw|Accesskey-ca-talk}}\n* {{msg-mw|Tooltip-ca-talk}}",
        "accesskey-ca-edit": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Edit}}\n* {{msg-mw|Accesskey-ca-edit}}\n* {{msg-mw|Tooltip-ca-edit}}",
        "accesskey-ca-addsection": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Addsection}}\n* {{msg-mw|Accesskey-ca-addsection}}\n* {{msg-mw|Tooltip-ca-addsection}}",
        "tooltip-pt-preferences": "Tooltip shown when hovering over the {{msg-mw|Mypreferences}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Mypreferences}}\n* {{msg-mw|Accesskey-pt-preferences}}\n* {{msg-mw|Tooltip-pt-preferences}}\n{{Identical|Preferences}}",
        "tooltip-pt-watchlist": "Tooltip shown when hovering over the {{msg-mw|Mywatchlist}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Mywatchlist}}\n* {{msg-mw|Accesskey-pt-watchlist}}\n* {{msg-mw|Tooltip-pt-watchlist}}",
        "tooltip-pt-mycontris": "Tooltip shown when hovering over the {{msg-mw|Mycontris}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Mycontris}}\n* {{msg-mw|Accesskey-pt-mycontris}}\n* {{msg-mw|Tooltip-pt-mycontris}}",
-       "tooltip-pt-login": "Tooltip shown when hovering over the link 'Log in / create account' in the upper right corner show on all pages while not logged in.",
+       "tooltip-pt-login": "Tooltip shown when hovering over the link 'Log in' in the upper right corner show on all pages while not logged in.",
        "tooltip-pt-logout": "Tooltip shown when hovering over the {{msg-mw|Logout}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Logout}}\n* {{msg-mw|Accesskey-pt-logout}}\n* {{msg-mw|Tooltip-pt-logout}}\n{{Identical|Log out}}",
+       "tooltip-pt-createaccount": "Tooltip shown when hovering over the link 'Create account' in the upper right corner show on all pages while not logged in.",
        "tooltip-ca-talk": "Tooltip shown when hovering over the {{msg-mw|Talk}} tab.\n\nA 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For a technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\nSee also:\n* {{msg-mw|Talk}}\n* {{msg-mw|Accesskey-ca-talk}}\n* {{msg-mw|Tooltip-ca-talk}}\n{{Identical|Content page}}",
        "tooltip-ca-edit": "The tooltip when hovering over the {{msg-mw|Edit}} tab.\n\nSee also:\n* {{msg-mw|Edit}}\n* {{msg-mw|Accesskey-ca-edit}}\n* {{msg-mw|Tooltip-ca-edit}}",
        "tooltip-ca-addsection": "Tooltip shown when hovering over the \"addsection\" tab (shown on talk pages).\n\nSee also:\n* {{msg-mw|Addsection}}\n* {{msg-mw|Accesskey-ca-addsection}}\n* {{msg-mw|Tooltip-ca-addsection}}",
        "pageinfo-protect-cascading-yes": "Yes, protections are cascading from here\n*{{msg-mw|Pageinfo-protect-cascading}}\n*{{msg-mw|Pageinfo-protect-cascading-yes}}\n{{Identical|Yes}}",
        "pageinfo-protect-cascading-from": "Key for a list of pages where protections are cascading from",
        "pageinfo-category-info": "Showed on the page displaying information about the current page (add \"?action=info\" to the URL)",
-       "pageinfo-category-pages": "See also:\n* {{msg-mw|Pageinfo-category-subcats}}\n* {{msg-mw|Pageinfo-category-files}}",
+       "pageinfo-category-pages": "See also:\n* {{msg-mw|Pageinfo-category-subcats}}\n* {{msg-mw|Pageinfo-category-files}}\n{{Identical|Number of pages}}",
        "pageinfo-category-subcats": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-files}}",
        "pageinfo-category-files": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-subcats}}",
        "markaspatrolleddiff": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolledtext}}\n{{Identical|Mark as patrolled}}",
        "exif-urgency-low": "Parameters:\n* $1 - numeric priority (6-8 for low)\n{{Related|Exif-urgency}}",
        "exif-urgency-high": "Parameters:\n* $1 - numeric priority (1-4 for high)\n{{Related|Exif-urgency}}",
        "exif-urgency-other": "Parameters:\n* $1 - numeric priority. Most specs define 0 and 9 to either be reserved or not allowed. However the exiftool documentation defines 0 to be reserved and 9 to be user-defined priority.\n{{Related|Exif-urgency}}",
-       "watchlistall2": "Appears on [[Special:Watchlist]].\n\nUsed as <code>$3</code> in the message {{msg-mw|Wlshowlast}}.\n{{Identical|All}}",
        "namespacesall": "In special page [[Special:WhatLinksHere]]. Drop-down box option for namespace.\n\n{{Identical|All}}",
        "monthsall": "Used in a drop-down box on [[Special:Contributions]] as an option for \"all months\". See also {{msg-mw|Month}}.\n{{Identical|All}}",
        "confirmemail": "Title of [[Special:ConfirmEmail]] page.",
        "revdelete-unhid": "This message is used as <code>$1</code>:\n* in {{msg-mw|Revdelete-log-message}} when unhiding revisions\n* in {{msg-mw|Logdelete-log-message}} when unhiding information in the log entry about unhiding revisions\nParameters:\n* $1 - any one of the following:\n** {{msg-mw|Revdelete-content}} (when unhiding the page content)\n** {{msg-mw|Revdelete-summary}} (when unhiding the edit summary)\n** {{msg-mw|Revdelete-uname}} (when unhiding the user name)\n** a combination of these three messages\nSee also:\n* {{msg-mw|Revdelete-hid}}",
        "revdelete-log-message": "This log message is used together with {{msg-mw|revdelete-logentry}} in the deletion or suppression logs when changing visibility restrictions for page revisions.\n\nParameters:\n* $1 - any one of the following\n** {{msg-mw|revdelete-hid}} (when hiding data)\n** {{msg-mw|revdelete-unhid}} (when unhiding data)\n** {{msg-mw|revdelete-restricted}} (when applying restrictions for sysops)\n** {{msg-mw|revdelete-unrestricted}} (when removing restrictions for sysops)\n** a combination of those messages\n* $2 - the number of revisions for which the restrictions are changed\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.\n\nSee also:\n* {{msg-mw|Logdelete-log-message}}",
        "logdelete-log-message": "This log message appears in brackets after the message {{msg-mw|logdelete-logentry}} in the deletion or suppression logs when changing the visibility of a log entry for events. For a brief description of the process of changing the visibility of events and their log entries see this [http://www.mediawiki.org/wiki/RevisionDelete mediawiki explanation].\n\nParameters:\n* $1 - any one of the following\n** {{msg-mw|revdelete-hid}} (when hiding data)\n** {{msg-mw|revdelete-unhid}} (when unhiding data)\n** {{msg-mw|revdelete-restricted}} (when applying restrictions for sysops)\n** {{msg-mw|revdelete-unrestricted}} (when removing restrictions for sysops)\n** a combination of those messages\n* $2 - the number of events for which the restrictions are changed\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.\n\nSee also:\n* {{msg-mw|Revdelete-log-message}}",
-       "deletedarticle": "This is a ''logentry'' message. Parameters:\n* $1 - deleted page name",
+       "deletedarticle": "This is a ''logentry'' message. Parameters:\n* $1 - deleted page name\n{{Identical|Deleted}}",
        "suppressedarticle": "Part of a [[mw:Manual:RevisionDelete|RevisionDelete]] log entry. Parameters:\n* $1 - suppressed page name\n{{Identical|Suppressed}}",
        "undeletedarticle": "This is a ''logentry'' message. Parameters:\n* $1 - restored (undeleted) page name",
        "patrol-log-line": "Text of notes on entries in the [http://translatewiki.net/w/i.php?title=Special%3ALog&type=patrol&user=&page=&year=&month=-1 patrol log].\nParameters:\n* $1 - the link whose text is {{msg-mw|patrol-log-diff}}\n* $2 - the name of the page\n* $3 - appears to be {{msg-mw|Patrol-log-auto}} (at least sometimes)\n\nThe message appears after the name of the patroller.",
        "logentry-pagelang-pagelang": "{{Logentry}}\nAdditional parameters:\n* $4 - old language code, or \"[def]\" (hard-coded)\n* $5 - new language code, or \"[def]\" (hard-coded)",
        "default-skin-not-found": "Message shown when the default skin for this MediaWiki installation can not be found.\n\nParameters:\n* $1: skin identifier for the default skin\n* $2: list of installed skins, composed using {{msg-mw|default-skin-not-found-row-enabled}} and {{msg-mw|default-skin-not-found-row-disabled}}\n* $3: code snippet to use to enable installed skins",
        "default-skin-not-found-no-skins": "Message shown when the default skin for this MediaWiki installation can not be found and the installation has no skins at all.\n\nParameters:\n* $1: name of the default skin",
-       "default-skin-not-found-row-enabled": "One row of the list of installed skins shown as a part of {{msg-mw|default-skin-not-found}}, for an enabled skin.\n\nParameters:\n* $1: skin identifier\n* $2: human-readable skin name",
-       "default-skin-not-found-row-disabled": "One row of the list of installed skins shown as a part of {{msg-mw|default-skin-not-found}}, for a disabled skin.\n\nParameters:\n* $1: skin identifier\n$2: human-readable skin name"
+       "default-skin-not-found-row-enabled": "One row of the list of installed skins shown as a part of the following message (for an enabled skin):\n* {{msg-mw|default-skin-not-found}}\n----\nParameters:\n* $1 - skin identifier\n* $2 - human-readable skin name\nSee also:\n* {{msg-mw|Default-skin-not-found-row-disabled}}",
+       "default-skin-not-found-row-disabled": "One row of the list of installed skins shown as a part of the following message (for a disabled skin):\n* {{msg-mw|default-skin-not-found}}\n----\nParameters:\n* $1 - skin identifier\n* $2 - human-readable skin name\nSee also:\n* {{msg-mw|Default-skin-not-found-row-enabled}}",
+       "mediastatistics": "{{doc-special|MediaStatistics}}",
+       "mediastatistics-summary": "Used to explain that this page only does statistics over current versions of files. \"Old\" versions of files and deleted files are not counted.",
+       "mediastatistics-nfiles": "{{optional}}\nEntry in table on [[Special:MediaStatistics]] that gives total number of files. $1 - number of files. $2 - percentage of total files that is this type (percent will be formatted to have about 3 interesting digits. e.g. 0.121 or 10.2)",
+       "mediastatistics-nbytes": "Combined space of this type of file. Bytes and \"human units\" are shown so that users can better get a sense of magnitude when making comparisons.\n*$1 - total space in bytes.\n*$2 - total space in \"human units\" (i.e. KB, MB, GB, etc)\n*$3 - What percentage of the space all uploads take up does this file take up.",
+       "mediastatistics-table-mimetype": "Header for table on Special:MediaStatistics. Column that lists MIME types (The values in this column will look like 'image/jpeg', and be linked to Special:MIMESearch).",
+       "mediastatistics-table-extensions": "Header for column in tables on [[Special:MediaStatistics]] that lists possible extensions for a given file type. (The values in this column will be a comma separated list of file extensions, such as '.webm' or '.png, .apng').",
+       "mediastatistics-table-count": "Column header on Special:MediaStatistics for the number of files column. The headers in this column use {{msg-mw|mediastatistics-nfiles}}.",
+       "mediastatistics-table-totalbytes": "Column header on Special:MediaStatistics for the number of bytes that this file type takes up. Values for this column use {{msg-mw|mediastatistics-nbytes}}",
+       "mediastatistics-header-unknown": "Header on Special:MediaStatistics for file types that are in the unknown category\n{{Identical|Unknown}}",
+       "mediastatistics-header-bitmap": "Header on [[Special:MediaStatistics]] for file types that are in the bitmap category. This includes raster graphics like PNG, JPEG, XCF, GIF etc. Vector graphics like SVG are considered \"drawings\" ({{msg-mw|mediastatistics-header-drawing}})",
+       "mediastatistics-header-drawing": "Header on [[Special:MediaStatistics]] for file types that are in the drawing category. This includes vector images like SVGs. Some chemical markup formats may also be included here.",
+       "mediastatistics-header-audio": "Header on [[Special:MediaStatistics]] for file types that are in the audio category\n{{Identical|Audio}}",
+       "mediastatistics-header-video": "Header on [[Special:MediaStatistics]] for file types that are in the video category\n{{Identical|Video}}",
+       "mediastatistics-header-multimedia": "Header on [[Special:MediaStatistics]] for file types that are in the multimedia category. This does not include plain audio or video files, but more complex multimedia such as flash or vrml. This especially includes scripted multimedia. Ogg files in which MediaWiki cannot determine if it is an audio or video file (or something else) are included here.",
+       "mediastatistics-header-office": "Header on [[Special:MediaStatistics]] for file types that are in the Office category. This includes PDFs, OpenDocument files, Microsoft Word files, etc.",
+       "mediastatistics-header-text": "Header on [[Special:MediaStatistics]] for file types that are in the text category. This includes simple text formats, including plain text formats, json, csv, and xml. Source code of compiled programming languages may be included here in the future, but isn't currently.",
+       "mediastatistics-header-executable": "Header on [[Special:MediaStatistics]] for file types that are in the executable category. This includes things like source files for interpreted programming language (Shell scripts, javascript, etc).",
+       "mediastatistics-header-archive": "Header on [[Special:MediaStatistics]] for file types that are in the archive category. Includes things like tar, zip, gzip etc.",
+       "json-warn-trailing-comma": "A warning message notifying that JSON text was automatically corrected by removing erroneous commas.\n\nParameters:\n* $1 - number of commas that were removed\n{{Related|Json-error}}",
+       "json-error-unknown": "User error message when there’s an unknown error.\n\nThis error is shown if we received an unexpected value from PHP. See http://php.net/manual/en/function.json-last-error.php\n\nParameters:\n* $1 - integer error code\n{{Related|Json-error}}\n{{Identical|Unknown error}}",
+       "json-error-depth": "User error message when the maximum stack depth is exceeded.\nSee http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}",
+       "json-error-state-mismatch": "User error message when underflow or the modes mismatch.\n\n'''Underflow''': A data-processing error arising when the absolute value of a computed quantity is smaller than the limits of precision of the computing device, retaining at least one significant digit.\n\nSee http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}",
+       "json-error-ctrl-char": "User error message when an unexpected control character has been found.\nSee http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}",
+       "json-error-syntax": "User error message when there is a syntax error; a malformed JSON.\nSee http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}\n{{Identical|Syntax error}}",
+       "json-error-utf8": "User error message when there are malformed UTF-8 characters, possibly incorrectly encoded.\nSee http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}",
+       "json-error-recursion": "PHP JSON encoding/decoding error. See http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}",
+       "json-error-inf-or-nan": "PHP JSON encoding/decoding error. See http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}",
+       "json-error-unsupported-type": "PHP JSON encoding/decoding error. See http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}"
 }
index b55a995..4f8eb37 100644 (file)
        "passwordreset-emailsent-capture": "Yaykuna rimata kutichina e-chaskiqa kachasqañam, kay qatiqpi rikunki.",
        "passwordreset-emailerror-capture": "{{GENDER:$2|}}Yaykuna rimata kutichina e-chaskiqa rurasqa karqan, imatachus kay qatiqpi rikunki, ichataq kachasqa kaptin pantasqam tukurqan: $1",
        "changeemail": "E-chaski imamaytata wakinchay",
-       "changeemail-header": "Rakiqunap e-chaski imamaytanta wakinchay",
        "changeemail-text": "Kay hunt'ana p'anqata hunt'ay e-chaski imamaytaykita hukchanaykipaq. Yaykuna rimaykita yaykuchinaykim tiyan kay hukchanata takyachinaykipaq.",
        "changeemail-no-info": "Yaykunaykim tiyan kay p'anqata chiqalla aypanaykipaq.",
        "changeemail-oldemail": "Kunan kachkaq e-chaski imamayta:",
        "changeemail-none": "(mana ima)",
        "changeemail-password": "{{SITENAME}} yaykuna rimayki:",
        "changeemail-submit": "E-chaskita wakinchay",
-       "changeemail-cancel": "Ama niy",
        "changeemail-throttled": "Nisyu kutiñam yaykuykacharqunki.\nAma hina kaspa, $1 suyay manaraq musuqmanta yaykuykachaspayki.",
        "resettokens": "Llawikunata kutichiy",
        "resettokens-no-tokens": "Manam kanchu kutichina llawikuna.",
        "searchall": "tukuy",
        "showingresults": "Qhipanpiqa rikuchkanki {{PLURAL:$1|'''1''' tarisqatam|'''$1'''-kama tarisqakunatam}}, '''$2''' huchhawan qallarispa.",
        "showingresultsinrange": "Qhipanpiqa rikuchkanki {{PLURAL:$1|<strong>1</strong>-kama tarisqatam|<strong>$1</strong>-kama tarisqakunatam}}, #<strong>$2</strong> huchhamanta #<strong>$3</strong> huchhakama.",
-       "showingresultsheader": "{{PLURAL:$5|Taripasqa: '''$1''', '''$3'''-manta|Taripasqa: '''$1 - $2''', '''$3'''-manta}}, '''$4'''-paq",
        "search-nonefound": "Maskaypaq kay hina kachun nisqakamaqa manam kanchu taripasqakuna.",
        "powersearch-legend": "Ñawparikusqa maskay",
        "powersearch-ns": "Kay suti k'itikunapi maskay:",
        "randomincategory": "Katiguriyapi kikinmanta p'anqa",
        "randomincategory-invalidcategory": "\"$1\" nisqaqa katiguriyapaq manam allin sutinchu.",
        "randomincategory-nopages": "[[:Category:$1|$1]] katiguriyapiqa manam p'anqakuna kanchu.",
-       "randomincategory-selectcategory": "Katiguriyamanta kikinmanta p'anqata chaskiy: $1 $2.",
-       "randomincategory-selectcategory-submit": "Riy",
        "randomredirect": "Mayninpi pusapuna p'anqa",
        "randomredirect-nopages": "Manam kanchu \"$1\" nisqa suti k'itipi pusapuna p'anqakuna.",
        "statistics": "Ranuy (kanchachani)",
        "querypage-disabled": "Kay sapaq p'anqamanqa ama nisqam allinta llamk'anapaq.",
        "booksources": "Liwrukunapi pukyukuna",
        "booksources-search-legend": "Liwrukunapi pukyukunata maskay",
-       "booksources-go": "Riy",
        "booksources-text": "Kay qatiqpiqa huk llika tiyaykunaman t'inkikunatam rikunki, musuq icha mawk'a liwrukunata qhatuq, maskasqayki liwrukunamantachá astawan willaq:",
        "booksources-invalid-isbn": "ISBN huchhaqa manachá allinchu; pantasqata llanchiriy qallariy qillqamanta iskaychamuspa.",
        "specialloguserlabel": "Rurapuq:",
        "wlheader-enotif": "E-chaskimanta musyachinaman arí nisqañam.",
        "wlheader-showupdated": "Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
        "wlnote": "Kay qatiqpiqa {{PLURAL:$1|qhipaq hukchasqam|'''$1''' qhipaq hukchasqakunam}} qhipaq {{PLURAL:$2|urapim|'''$2''' urakunapim}}, musuqchasqa $3, $4.",
-       "wlshowlast": "$1 ura, $2 p'unchaw $3-mantapacha hukchasqakunata rikuchiy",
+       "wlshowlast": "$1 ura, $2 p'unchaw -mantapacha hukchasqakunata rikuchiy",
        "watchlist-options": "Watiqana sutisuyupaq allinkachinakuna",
        "watching": "Watiqasqakunaman yapaspa...",
        "unwatching": "Watiqasqakunamanta qulluspa...",
        "import": "P'anqakunata hawamanta chaskiy",
        "importinterwiki": "Huk wikimanta p'anqakunata chaskiy",
        "import-interwiki-text": "Huk wikita p'anqap sutintapas akllay hawamanta chaskinapaq.\nLlamk'apusqap pachankunaqa ruraqpa sutinkunapas kakuspa hallch'asqam kanqa.\nTukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hallch'api]] hallch'asqam kanqa.",
-       "import-interwiki-source": "Qallariy wiki icha p'anqa:",
        "import-interwiki-history": "Kay p'anqapaq tukuy wiñay kawsaynintinta iskaychay",
        "import-interwiki-templates": "Tukuy plantillakunapas",
        "import-interwiki-submit": "Hawamanta chaskiy",
        "exif-urgency-low": "Aslla ($1)",
        "exif-urgency-high": "Hatun ($1)",
        "exif-urgency-other": "Ruraqpa churasqan ñawpaqchay ($1)",
-       "watchlistall2": "lliw",
        "namespacesall": "tukuy",
        "monthsall": "(tukuy)",
        "confirmemail": "E-chaski imamaytaykita takyachiy",
        "logentry-rights-rights-legacy": "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3-pa huñuman kapuyninta hukchan",
        "logentry-rights-autopromote": "{{GENDER:$2|}}$1 sutiyuq ruraqqa kikinmantam ñawparikun $4-manta $5-man",
        "rightsnone": "(-)",
+       "revdelete-summary": "yuyarinata llamk'apuy",
        "feedback-bugornote": "Allwiyapi sasachakuymanta imaymanachanta willayta munaspaykiqa, [$1 pantasqamanta willay].\nMana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyniykiqa \"[$3 $2]\" sutiyuq p'anqamanmi yapasqa kanqa, hinallataqmi ruraqpa sutiykipas qampa llamk'achisqayki llika wamp'unapas.",
        "feedback-subject": "Yuyancha:",
        "feedback-message": "Willay:",
index 6c78c09..2256026 100644 (file)
        "search-interwiki-more": "(ashtawan)",
        "searchrelated": "tinkishka",
        "searchall": "tukuy",
-       "showingresultsheader": "{{PLURAL:$5|Maskashka panka: '''$1''', '''$3'''-manta|Maskashka pankakuna: '''$1 - $2''', '''$3'''-manta}}, '''$4''' maskashpaka",
        "search-nonefound": "Kikinka maskashka rimaykunaka mana tiyanchu.",
        "powersearch-legend": "Ashtawan alli maskana",
        "powersearch-ns": "Chay shutipak kitikunapi maskana :",
        "pager-older-n": "{{PLURAL:$1|ashtawan ñawpak 1|ashtawan ñawpak $1}}",
        "booksources": "Kamukunapi pukyukuna",
        "booksources-search-legend": "Kamukunapi pukyukunata maskana",
-       "booksources-go": "Rina",
        "log": "Kamukuna",
        "allpages": "Tukuy pankakuna",
        "prevpage": "Ñawpak panka ($1)",
        "watchthispage": "Kay pankata rikukuna",
        "unwatch": "Ñamana rikuna",
        "watchlist-details": "{{PLURAL:$1|$1 pankata|$1 pankakunata}} rikukunki (rimanakuy pankakunata mana yupakpika).",
-       "wlshowlast": "$1 pachapi, $2 punchapi rurashka $3 mushuk killkaykunata rikuna",
+       "wlshowlast": "$1 pachapi, $2 punchapi rurashka  mushuk killkaykunata rikuna",
        "watchlist-options": "rikukushka pankakuna pankapa akllaykuna",
        "watching": "Ñami chay pankata rikukukripanki...",
        "unwatching": "Ñamana rikukuchishpa...",
        "metadata-expand": "Uchilla willaykunata rikuchiy",
        "metadata-collapse": "Uchilla willaykunata pakay",
        "metadata-fields": "Kaypi killkashka rikchamanta willaykunaka wiñay paypa rikchawan rikuchishkami kanka. Shuk willaykunata pakashkami kanka. Shinapash shuk rurakka munakpika paykunaya rikunata ushanka.\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",
-       "watchlistall2": "tukuy",
        "namespacesall": "tukuy",
        "monthsall": "tukuy",
        "watchlisttools-view": "Mushuk killkaykunata rikuna",
index 42deb69..000cb9c 100644 (file)
        "category-empty": "''Questa categoria cuntegna actualmain nagins artitgels e naginas datotecas.''",
        "hidden-categories": "{{PLURAL:$1|Categoria zuppentada|Categorias zuppentadas}}",
        "hidden-category-category": "Categorias zuppentadas",
-       "category-subcat-count": "{{PLURAL:$2|Questa categoria cuntegna be suandanta sutcategoria.|Questa categoria cuntegna {{PLURAL:$1|la suandanta sutcategoria|las $1 suandantas sutcategorias}} da totalmain $2 sutcategoria.}}",
+       "category-subcat-count": "{{PLURAL:$2|Questa categoria cuntegna be suandanta sutcategoria.|Questa categoria cuntegna {{PLURAL:$1|la suandanta sutcategoria|las $1 suandantas sutcategorias}} da totalmain $2 sutcategorias.}}",
        "category-subcat-count-limited": "Questa categoria cuntegna {{PLURAL:$1|suandanta subcategoria|suandantas $1 subcategorias}}:",
        "category-article-count": "{{PLURAL:$2|Questa categoria cuntegna be la suandanta pagina.|{{PLURAL:$1|La suandanta pagina è|Las $1 suandantas paginas èn}} en questa categoria che cuntegna totalmain $2 paginas.}}",
        "category-article-count-limited": "{{PLURAL:$1|La suandanta pagina è|Las suandantas $1 paginas èn}} actualmain en la categoria.",
        "passwordreset-emailsent-capture": "In e-mail (sco mussà sutvart) per redefinir il pled-clav è vegnì tramess.",
        "passwordreset-emailerror-capture": "In e-mail (sco mussà sutvart) per redefinir il pled-clav è vegnì generà ma n'ha betg pudì envià a l'{{GENDER:$2|utilisader|utilisadra}}: $1",
        "changeemail": "Midar l'adressa dad e-mail",
-       "changeemail-header": "Midar l'adressa dad e-mail dal conto",
        "changeemail-text": "Cumpletescha quest formular per midar tia adressa dad e-mail. Ti stos endatar tes pled-clav per confermar questa midada.",
        "changeemail-no-info": "Ti stos t'annunziar per acceder directamain questa pagina.",
        "changeemail-oldemail": "Adressa dad e-mail actuala:",
        "changeemail-none": "(nagina)",
        "changeemail-password": "Tes pled-clav da {{SITENAME}}:",
        "changeemail-submit": "Midar l'adressa dad e-mail",
-       "changeemail-cancel": "Interrumper",
        "bold_sample": "Text grass",
        "bold_tip": "Text grass",
        "italic_sample": "Text cursiv",
        "searchrelated": "sumegliant",
        "searchall": "tuts",
        "showingresults": "Sutvart èn enfin {{PLURAL:$1|'''in''' resultat|'''$1''' resultats}} cumenzond cun il numer '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' da '''$3'''|Resultats '''$1-$2''' da '''$3'''}} per '''$4'''",
        "search-nonefound": "Per il term tschertgà èn nagins resultats vegnids chattads.",
        "powersearch-legend": "Tschertga extendida",
        "powersearch-ns": "Tschertgar en tips da pagina:",
        "querypage-disabled": "Questa pagina speciala è deactivada ord motivs da prestaziun.",
        "booksources": "Tschertga da ISBN",
        "booksources-search-legend": "Tschertgar pussaivladad da cumpra per cudeschs",
-       "booksources-go": "Leger",
        "booksources-text": "Sutvart è ina glista da las colliaziuns ad autras paginas che vendan cudeschs novs ed utilisads e che pudessan avair dapli infurmaziuns davart ils cudeschs che ti tschertgas:",
        "booksources-invalid-isbn": "Il numer ISBN na para betg dad esser valid; controllescha che ti n'has betg fatg errurs cun la scriver.",
        "specialloguserlabel": "Acziun exequida da:",
        "wlheader-enotif": "Il servetsch d'infurmaziun per e-mail è activà.",
        "wlheader-showupdated": "Paginas ch'èn vegnidas modifitgadas suenter che ti has vis els la davosa giada èn mussads '''grass'''",
        "wlnote": "Sutvart {{PLURAL:$1|è l'ultima midada|èn las ultimas '''$1''' midadas}} entaifer {{PLURAL:$2|l'ultima ura|las ultimas '''$2''' uras}}. Actualisà ils $3 las $4.",
-       "wlshowlast": "Mussar: las ultimas $1 uras, ils ultims $2 dis u $3.",
+       "wlshowlast": "Mussar: las ultimas $1 uras, ils ultims $2 dis u .",
        "watchlist-options": "Opziuns per la glista d'observaziun",
        "watching": "observ...",
        "unwatching": "observ betg pli...",
        "import": "Impurtar paginas",
        "importinterwiki": "Import transwiki",
        "import-interwiki-text": "Tscherna in wiki ed in titel da pagina per importar.\nLas datas da las versiuns ed ils nums dals contribuents vegnan mantegnids.\nTut ils imports transwiki vegnan registrads en il [[Special:Log/import|protocol d'imports]].",
-       "import-interwiki-source": "Wiki/pagina da funtauna:",
        "import-interwiki-history": "Copiar l'entira cronologia da questa pagina",
        "import-interwiki-templates": "Includer tut ils models",
        "import-interwiki-submit": "Importar",
        "exif-urgency-low": "Bass ($1)",
        "exif-urgency-high": "Aut ($1)",
        "exif-urgency-other": "Prioritad definida da l'utilisader ($1)",
-       "watchlistall2": "tut",
        "namespacesall": "tuts",
        "monthsall": "tuts",
        "confirmemail": "Confermar l'adressa dad e-mail",
        "logentry-rights-rights-legacy": "$1 ha {{GENDER:$2|midà}} la commembranza da gruppas per $3",
        "logentry-rights-autopromote": "$1 è vegnì {{GENDER:$2|promovì|promovida}} automaticamain da $4 a $5",
        "rightsnone": "(nagins)",
+       "revdelete-summary": "resumaziun da la midada",
        "feedback-bugornote": "Sche ti vuls descriver detagliadamain in problem techic, lura [$1 rapporta in bug].\nUschiglio pos ti utilisar il formular simpel sutvart. Tes commentari vegn agiuntà a la pagina \"[$3 $2]\" ensemen cun tes num d'utilisader.",
        "feedback-subject": "Object:",
        "feedback-message": "Messadi:",
index a668d7d..8e10c40 100644 (file)
        "category_header": "Pagini din categoria „$1”",
        "subcategories": "Subcategorii",
        "category-media-header": "Fișiere media din categoria „$1”",
-       "category-empty": "''Această categorie nu conține în acest moment niciun articol sau fișier media.''",
+       "category-empty": "''Această categorie nu conține momentan nici o pagină sau fișier media.''",
        "hidden-categories": "{{PLURAL:$1|Categorie ascunsă|Categorii ascunse}}",
        "hidden-category-category": "Categorii ascunse",
        "category-subcat-count": "{{PLURAL:$2|Această categorie conține doar următoarea subcategorie.|Această categorie conține {{PLURAL:$1|următoarea subcategorie|următoarele $1 subcategorii|următoarele $1 de subcategorii}}, dintr-un total de $2.}}",
        "otherlanguages": "În alte limbi",
        "redirectedfrom": "(Redirecționat de la $1)",
        "redirectpagesub": "Pagină de redirecționare",
+       "redirectto": "Redirecționare către:",
        "lastmodifiedat": "Ultima modificare efectuată la $2, $1.",
        "viewcount": "Pagina a fost vizitată {{PLURAL:$1|o dată|de $1 ori|de $1 de ori}}.",
        "protectedpage": "Pagină protejată",
        "createaccount-text": "Cineva a creat un cont asociat adresei dumneavoastră de e-mail pe {{SITENAME}} ($4) numit „$2” și având parola „$3”.\nEste de dorit să vă autentificați și să schimbați parola cât mai repede.\n\nIgnorați acest mesaj dacă crearea contului s-a produs în urma unei greșeli.",
        "login-throttled": "Ați avut prea multe încercări recente de a vă autentifica.\nVă rugăm să așteptați $1 până să reîncercați.",
        "login-abort-generic": "Procesul de autentificare a eșuat și a fost abandonat",
+       "login-migrated-generic": "Contul dumneavoastră a fost migrat, iar numele de utilizator nu mai există pe acest wiki.",
        "loginlanguagelabel": "Limba: $1",
        "suspicious-userlogout": "Cererea dumneavoastră de a închide sesiunea a fost refuzată întrucât pare că a fost trimisă printr-o eroare a navigatorului sau de un proxy memorat în cache.",
        "createacct-another-realname-tip": "Numele real este opțional.\nDacă decideți furnizarea sa, acesta va fi folosit pentru a atribui utilizatorului munca sa.",
        "passwordreset-emailsent-capture": "Un mesaj de resetare a parolei a fost trimis, fiind afișat mai jos.",
        "passwordreset-emailerror-capture": "Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către {{GENDER:$2|utilizator}} a eșuat: $1",
        "changeemail": "Modificare adresă de e-mail",
-       "changeemail-header": "Modificare adresă de e-mail asociată contului",
        "changeemail-text": "Completați acest formular pentru a vă modifica adresa de e-mail. Va trebui să introduceți și parola pentru a confirma această modificare.",
        "changeemail-no-info": "Trebuie să fiți autentificat pentru a accesa această pagină direct.",
        "changeemail-oldemail": "Adresa de e-mail actuală:",
        "changeemail-none": "(niciuna)",
        "changeemail-password": "Parola dumneavoastră la {{SITENAME}}:",
        "changeemail-submit": "Modifică adresa de e-mail",
-       "changeemail-cancel": "Revocare",
        "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.",
        "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.",
        "showpreview": "Previzualizare",
        "showdiff": "Afișare diferențe",
        "blankarticle": "<strong>Atenție:</strong> Pagina pe care o creați este goală.\nDacă faceți din nou clic pe „{{int:savearticle}}”, pagina va fi creată fără niciun conținut.",
-       "anoneditwarning": "'''Atenție:''' Nu v-ați autentificat. Adresa IP vă va fi înregistrată în istoricul acestei pagini.",
+       "anoneditwarning": "<strong>Atenție:</strong> Nu v-ați autentificat. Adresa dumneavoastră IP va fi vizibilă în mod public dacă efectuați modificări. Dacă vă <strong>[$1 autentificați]</strong> sau vă <strong>[$2 creați un cont]</strong>, modificările dumneavoastră vor fi asociate numelui de utilizator, pe lângă alte beneficii.",
        "anonpreviewwarning": "''Nu v-ați autentificat. Dacă salvați pagina adresa dumneavoastră IP va fi înregistrată în istoric.''",
        "missingsummary": "'''Atenție:''' Nu ați completat caseta „descriere modificări”. Dacă apăsați din nou butonul „salvează pagina” modificările vor fi salvate fără descriere.",
        "missingcommenttext": "Vă rugăm să introduceți un comentariu.",
        "editingsection": "modificare $1 (secțiune)",
        "editingcomment": "Modificare $1 (secțiune nouă)",
        "editconflict": "Conflict de modificare: $1",
-       "explainconflict": "Altcineva a modificat această pagină de când ați început editarea.\nCaseta de text de sus conține pagina așa cum este ea acum (după editarea celeilalte persoane).\nPagina cu modificările dumneavoastră (așa cum ați încercat să o salvați) se află în caseta de jos.\nVa trebui să editați manual caseta de sus pentru a reflecta modificările pe care tocmai le-ați făcut în cea de jos.\n'''Numai''' textul din caseta de sus va fi salvat atunci când veți apăsa pe „{{int:savearticle}}”.",
+       "explainconflict": "Altcineva a modificat această pagină de când ați început editarea.\nZona de text din partea de sus conține pagina așa cum este ea acum (după editarea celeilalte persoane).\nModificările dumneavoastră sunt afișate în zona de text inferioară.\nVa trebui să vă uniți modificările cu textul deja existent.\n<strong>Doar</strong> textul din zona de text superioară va fi salvat atunci când veți apăsa „{{int:savearticle}}”.",
        "yourtext": "Textul dumneavoastră",
        "storedversion": "Versiunea curentă",
        "nonunicodebrowser": "'''Atenție: Navigatorul dumneavoastră nu este compatibil cu Unicode.'''\nÎn schimb, există o soluție care vă permite să modificați paginile în siguranță: caracterele non-ASCII vor fi afișate în caseta de editare drept coduri hexazecimale.",
        "mergehistory-box": "Combină reviziile a două pagini:",
        "mergehistory-from": "Pagina sursă:",
        "mergehistory-into": "Pagina destinație:",
-       "mergehistory-list": "Istoricul la care se aplică combinarea",
-       "mergehistory-merge": "Următoarele versiuni ale [[:$1]] pot fi combinate în [[:$2]].\nFolosiți coloana butonului radio pentru a combina doar versiunile create la și înainte de momentul specificat.\nFolosirea linkurilor de navigare va reseta această coloană.",
+       "mergehistory-list": "Istoricul la care se aplică unificarea",
+       "mergehistory-merge": "Următoarele versiuni ale paginii [[:$1]] pot fi unite în [[:$2]].\nFolosiți coloana butonului radio pentru a uni doar versiunile create la și înainte de momentul specificat.\nFolosirea legăturilor de navigare va reseta această coloană.",
        "mergehistory-go": "Vezi modificările care pot fi combinate",
-       "mergehistory-submit": "Unește reviziile",
-       "mergehistory-empty": "Reviziile nu 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-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-destination": "Pagina de destinație $1 nu există.",
        "mergehistory-invalid-source": "Pagina sursă trebuie să aibă un titlu valid.",
        "mergehistory-invalid-destination": "Pagina de destinație trebuie să aibă un titlu valid.",
-       "mergehistory-autocomment": "Combinat [[:$1]] în [[:$2]]",
+       "mergehistory-autocomment": "Unit [[:$1]] în [[:$2]]",
        "mergehistory-comment": "Combinat [[:$1]] în [[:$2]]: $3",
        "mergehistory-same-destination": "Paginile sursă și destinație nu pot fi identice",
        "mergehistory-reason": "Motiv:",
        "searchall": "toate",
        "showingresults": "Mai jos {{PLURAL:$1|apare '''1''' rezultat|apar '''$1''' rezultate|apar '''$1''' de rezultate}} începând cu nr. <b>$2</b>.",
        "showingresultsinrange": "Mai jos se afișează un număr de până la {{PLURAL:$1|<strong>1</strong> rezultat|<strong>$1</strong> rezultate|<strong>$1</strong> de rezultate}} din intervalul #<strong>$2</strong> la #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Rezultatul '''$1''' din '''$3'''|Rezultatele '''$1 - $2''' din '''$3'''}} pentru '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Rezultatul <strong>$1</strong> din <strong>$3</strong>|Rezultatele <strong>$1 - $2</strong> din <strong>$3</strong>}}",
        "search-nonefound": "Nu sunt rezultate conforme interogării.",
        "powersearch-legend": "Căutare avansată",
        "powersearch-ns": "Căutare în spațiile de nume:",
        "prefs-tokenwatchlist": "Jeton",
        "prefs-diffs": "Diferențe",
        "prefs-help-prefershttps": "Această preferință va avea efect la următoarea autentificare.",
+       "prefswarning-warning": "Ați efectuat modificări asupra preferințelor dumneavoastră, care nu au fost încă salvate.\nDacă părăsiți această pagină fără a apăsa butonul „$1”, preferințele dumnevoastră nu se vor actualiza.",
        "prefs-tabs-navigation-hint": "Sfat: Puteți folosi tastele săgeată stânga și dreapta pentru a naviga între filele din cadrul listei de file.",
        "email-address-validity-valid": "Adresa de e-mail pare validă",
        "email-address-validity-invalid": "Introduceți o adresă de e-mail validă",
        "randomincategory": "Pagină aleatorie din categorie",
        "randomincategory-invalidcategory": "„$1” nu este un nume de categorie valid.",
        "randomincategory-nopages": "Nu există pagini în [[:Category:$1]].",
-       "randomincategory-selectcategory": "Obțineți, aleatoriu, o pagină din categoria: $1 $2.",
-       "randomincategory-selectcategory-submit": "Du-te",
+       "randomincategory-category": "Categorie:",
+       "randomincategory-legend": "Pagină aleatorie din categoria",
        "randomredirect": "Redirecționare aleatorie",
        "randomredirect-nopages": "Nu există redirecționări în spațiul de nume \"$1\".",
        "statistics": "Statistici",
        "querypage-disabled": "Această pagină specială este dezactivată din motive de performanță.",
        "booksources": "Surse de cărți",
        "booksources-search-legend": "Căutare surse pentru cărți",
-       "booksources-go": "Salt",
+       "booksources-search": "Caută",
        "booksources-text": "Mai jos se află o listă de legături înspre alte situri care vând cărți noi sau vechi și care pot oferi informații suplimentare despre cărțile pe care le căutați:",
        "booksources-invalid-isbn": "Codul ISBN oferit nu este valid; verificați dacă a fost copiat corect de la sursa originală.",
        "specialloguserlabel": "Executant:",
        "wlheader-enotif": "Notificarea prin e-mail este activată.",
        "wlheader-showupdated": "Paginile care au fost modificate după ultima dumneavoastră vizită sunt afișate '''îngroșat'''.",
        "wlnote": "Mai jos se află {{PLURAL:$1|ultima schimbare|ultimele <strong>$1</strong> schimbări|ultimele <strong>$1</strong> de schimbări}} din {{PLURAL:$2|ultima oră|ultimele <strong>$2</strong> ore|ultimele <strong>$2</strong> de ore}}, așa cum era situația la $3, $4.",
-       "wlshowlast": "Arată ultimele $1 ore $2 zile $3",
+       "wlshowlast": "Arată ultimele $1 ore $2 zile",
        "watchlist-options": "Opțiuni listă de pagini urmărite",
        "watching": "Se urmărește...",
        "unwatching": "Așteptați...",
        "exbeforeblank": "conținutul înainte de golire era: '$1'",
        "delete-confirm": "Şterge \"$1\"",
        "delete-legend": "Şterge",
-       "historywarning": "'''Atenție:''' istoricul paginii pe care o ștergeți conține aproximativ $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}:",
+       "historywarning": "<strong>Atenție:</strong> istoricul paginii pe care o ștergeți conține $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}:",
        "confirmdeletetext": "Sunteți pe cale să ștergeți permanent o pagină sau imagine din baza de date, împreună cu istoria asociată acesteia. Vă rugăm să confirmați alegerea făcută de dvs., faptul că înțelegeți consecințele acestei acțiuni și faptul că o faceți în conformitate cu [[{{MediaWiki:Policy-url}}|Politica oficială]].",
        "actioncomplete": "Acțiune completă",
        "actionfailed": "Acțiunea a eșuat",
        "delete-edit-reasonlist": "Modifică motivele ștergerii",
        "delete-toobig": "Această pagină are un istoric al modificărilor important, cu mai mult de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}.\nȘtergerea unei astfel de pagini a fost restricționată pentru a preveni apariția unor erori în {{SITENAME}}.",
        "delete-warning-toobig": "Această pagină are un istoric al modificărilor mult prea mare, cu mai mult de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}.\nȘtergerea sa poate afecta baza de date a sitului {{SITENAME}};\nacționați cu precauție.",
-       "delete-cantedit": "Nu puteți șterge această pagină, deoarece nu aveți permisiunea de a o modifica.",
+       "deleteprotected": "Nu puteți șterge această pagină, deoarece este protejată.",
        "deleting-backlinks-warning": "'''Atenție:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Alte pagini]] se leagă sau transclud pagina pe care doriți să o ștergeți.",
        "rollback": "Editări de revenire",
        "rollback_short": "Revenire",
        "protect-othertime": "Alt termen:",
        "protect-othertime-op": "alt termen",
        "protect-existing-expiry": "Data expirării: $3, $2",
+       "protect-existing-expiry-infinity": "Data expirării: nelimitat",
        "protect-otherreason": "Motiv diferit/adițional:",
        "protect-otherreason-op": "Alt motiv",
        "protect-dropdown": "*Motive uzuale de protejare\n** Vandalism excesiv\n** SPAM excesiv\n** Modificări neproductive\n** Pagină cu trafic mare",
        "unblocked": "[[User:$1|$1]] a fost deblocat",
        "unblocked-range": "$1 a fost deblocat",
        "unblocked-id": "Blocarea $1 a fost eliminată",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] a fost deblocat.",
        "blocklist": "Utilizatori blocați",
        "ipblocklist": "Utilizatori blocați",
        "ipblocklist-legend": "Găsire utilizator blocat",
        "import": "Importare pagini",
        "importinterwiki": "Import transwiki",
        "import-interwiki-text": "Selectează un wiki și titlul paginii care trebuie importate. Datele reviziilor și numele editorilor vor fi salvate. Toate acțiunile de import transwiki pot fi găsite la [[Special:Log/import|log import]]",
-       "import-interwiki-source": "Wiki/pagină sursă:",
+       "import-interwiki-sourcewiki": "Wikiul sursă:",
+       "import-interwiki-sourcepage": "Pagina sursă:",
        "import-interwiki-history": "Copiază toate versiunile istoricului acestei pagini",
        "import-interwiki-templates": "Includeți toate formatele",
        "import-interwiki-submit": "Importă",
        "exif-urgency-low": "Scăzut ($1)",
        "exif-urgency-high": "Ridicat ($1)",
        "exif-urgency-other": "Prioritate definită de utilizator ($1)",
-       "watchlistall2": "toate",
        "namespacesall": "toate",
        "monthsall": "toate",
        "confirmemail": "Confirmare adresă e-mail",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|a încărcat}} o nouă versiune pentru $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|a încărcat}} $3",
        "rightsnone": "(niciunul)",
+       "revdelete-summary": "descrierea modificărilor",
        "feedback-bugornote": "Dacă sunteți pregătit să descrieți o problemă tehnică în detaliu vă rugăm să [$1 raportați un bug].\nÎn caz contrar, puteți utiliza formularul de mai jos. Comentariul dumneavoastră va fi adăugat pe pagina „[$3 $2]”, împreună cu numele de utilizator și numele navigatorului pe care îl folosiți.",
        "feedback-subject": "Subiect:",
        "feedback-message": "Mesaj:",
        "log-description-pagelang": "Acesta este un jurnal cu modificări ale limbii paginilor.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a modificat}} limba paginii pentru $3 din $4 în $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activat)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''dezactivat''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''dezactivat''')",
+       "mediastatistics": "Statistici multimedia",
+       "mediastatistics-summary": "Statistici despre tipurile fișierelor încărcate. Sunt incluse doar cele mai recente versiuni ale fișierelor. Versiunile mai vechi sau șterse ale fișierelor sunt excluse.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 octet|$1 octeți|$1 de octeți}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Tip MIME",
+       "mediastatistics-table-extensions": "Extensii posibile",
+       "mediastatistics-table-count": "Număr de fișiere",
+       "mediastatistics-table-totalbytes": "Dimensiune combinată",
+       "mediastatistics-header-unknown": "Necunoscut",
+       "mediastatistics-header-bitmap": "Imagini bitmap",
+       "mediastatistics-header-drawing": "Desene (imagini vectoriale)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videoclipuri",
+       "mediastatistics-header-multimedia": "Multimedia complexe",
+       "mediastatistics-header-office": "Documente",
+       "mediastatistics-header-text": "Text",
+       "mediastatistics-header-executable": "Executabile",
+       "mediastatistics-header-archive": "Formate comprimate",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|virgulă|virgule|de virgule}} în exces înlăturat{{PLURAL:$1|ă|e}} din JSON",
+       "json-error-unknown": "A apărut o problemă cu JSON. Eroare: $1",
+       "json-error-depth": "S-a depășit adâncimea maximă a stivei",
+       "json-error-state-mismatch": "JSON deformat sau incorect",
+       "json-error-ctrl-char": "Eroare în caracterul de control, posibil incorect codificat",
+       "json-error-syntax": "Eroare de sintaxă",
+       "json-error-utf8": "Caractere UTF-8 deformate, posibil incorect codificate",
+       "json-error-recursion": "Una sau mai multe referințe recursive în valoarea pentru codificat",
+       "json-error-inf-or-nan": "Una sau mai valori NAN sau INF în valoarea pentru codificat",
+       "json-error-unsupported-type": "A fost furnizată o valoare de un tip care nu poate fi codificat"
 }
index 6bdaff5..bc6135f 100644 (file)
@@ -5,7 +5,8 @@
                        "Kaganer",
                        "McDutchie",
                        "Reder",
-                       "아라"
+                       "아라",
+                       "C.R."
                ]
        },
        "tog-underline": "Collegaminde sottolinèate:",
        "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",
-       "changeemail-header": "Cange 'u 'ndirizze e-mail d'u cunde",
        "changeemail-text": "Comblete stu module pe cangià 'u 'ndirizze mail tune. Tu è abbesogne de sckaffà 'a passuord toje pe confermà 'u cangiamende.",
        "changeemail-no-info": "Tu a essere collegate pe accedere a sta pàgene direttamende.",
        "changeemail-oldemail": "Indirizze e-mail de mò:",
        "changeemail-none": "(ninde)",
        "changeemail-password": "'A passuord tue de {{SITENAME}}:",
        "changeemail-submit": "Cange e-mail",
-       "changeemail-cancel": "Annulle",
        "resettokens": "Azzere le gettone",
        "resettokens-text": "Tu puè azzerà le gettone le quale te donne l'accesse a certe date private collegate cu 'u cunde tune aqquà.\n\nTu avissa farle ce pe sbaglie l'è condivise cu otre o ce 'u cunde tune ha state combromesse.",
        "resettokens-no-tokens": "Non ge stonne gettone de azzerà.",
        "searchrelated": "colleghete",
        "searchall": "tutte",
        "showingresults": "Stoche a fazze vedè aqquà sotte {{PLURAL:$1|'''1''' resultete|'''$1''' resultete}} ca accumenzene cu #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resultate '''$1''' de '''$3'''|Resultate '''$1 - $2''' de '''$3'''}} pe '''$4'''",
        "search-nonefound": "Non ge stonne resultete ca soddisfecene l'inderrogazione.",
        "powersearch-legend": "Ricerche avanzete",
        "powersearch-ns": "Cirche jndr'à le namespace:",
        "randomincategory": "Pàggene a uecchije jndr'à categorije",
        "randomincategory-invalidcategory": "\"$1\" non g'è 'nu nome d'a categorije valide.",
        "randomincategory-nopages": "Non ge stonne pàggene jndr'à [[:Category:$1]].",
-       "randomincategory-selectcategory": "Pigghie pàggene a uecchije da 'a categorije: $1 $2.",
-       "randomincategory-selectcategory-submit": "Véje",
        "randomredirect": "Redirezionamende a uecchie",
        "randomredirect-nopages": "Non ge stonne redirezionaminde jndr'à 'u namespace \"$1\".",
        "statistics": "Statisteche",
        "booksources": "Sorgende de le libbre",
        "booksources-search-legend": "Cirche pe le fonde de le libbre",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Veje",
+       "booksources-search": "Cirche",
        "booksources-text": "Sotte stè 'na liste de collegaminde a otre site ca vennene libbre nuève e ausete e puà pure acchià cchiù 'mbormaziune sus a le libbre ca tu ste cirche:",
        "booksources-invalid-isbn": "L'ISBN ca è mise non ge pare ca ète corrette; verifiche ce è commesse quacche errore quanne ste cupiave quidde origginale.",
        "specialloguserlabel": "'Mblemendatore:",
        "mywatchlist": "Pàggene condrollate",
        "watchlistfor2": "Pe $1 $2",
        "nowatchlist": "Non ge tine pàggene jndr'à liste de le pàggene condrollete.",
-       "watchlistanontext": "Pe piacere $1 pe vedè o cangià le vosce sus a liste de le pàggene condrollete.",
+       "watchlistanontext": "Pe piacere tràse pe 'ndrucà o cangià le vosce sus l'elenghe de le pàggene condrollate.",
        "watchnologin": "Non ge sinde colleghete",
        "addwatch": "Mitte jndr'à le pàggene condrollate",
        "addedwatchtext": "'A pàgene \"[[:$1]]\" ha state aggiunde jndr'à le [[Special:Watchlist|pàggene condrollate]].\nLe cangiaminde future a sta pàgene e 'a pàgene de le 'ngazzaminde associete le puè acchià aqquà.",
        "wlheader-enotif": "* Notifiche pe email abbilitate.",
        "wlheader-showupdated": "* Le pàggene ca onne state cangiate da l'urtema visite avènene fatte vedè in '''grascette'''",
        "wlnote": "Aqquà sotte {{PLURAL:$1|ste l'urteme cangiamende|stonne l'urteme '''$1''' cangiaminde}} jndr'à {{PLURAL:$2|l'urtema ore|l'urteme '''$2''' ore}}, jndr'à $3, $4.",
-       "wlshowlast": "Vide l'urteme $1 ore $2 sciurne $3",
+       "wlshowlast": "Vide l'urteme $1 ore $2 sciurne",
        "watchlist-options": "Opzione d'a liste de le pàggene condrollete",
        "watching": "Fà vedè...",
        "unwatching": "No fà vedè...",
        "undelete-search-submit": "Cirche",
        "undelete-no-results": "Non ge stonne pàggene acchiate jndr'à l'archivije de le scangellaminde.",
        "undelete-filename-mismatch": "Non ge pozze repristinà 'a revisione d'u file cu orarie $1: nome d'u file errate",
-       "undelete-bad-store-key": "Cannot undelete file revision with timestamp $1: file was missing before deletion.\nNon ge pozze repristinà 'a revisione d'u file cu orarie $1: 'u file ha state perdute apprime da scangellazione.",
+       "undelete-bad-store-key": "Non ge pozze repristinà 'a revisione d'u file cu orarie $1: 'u file ha state perdute apprime da scangellazione.",
        "undelete-cleanup-error": "Errore scangellanne 'n'archivije de file non ausate \"$1\".",
-       "undelete-missing-filearchive": "Non ge pozze repristinà 'u file archiviate cu ID $1 purcè non ge stè jndr'à 'u database.\nPò essere ca già ha state scangellate.",
+       "undelete-missing-filearchive": "Non ge pozze repristinà 'u file archiviate cu ID $1 purcè non ge stè jndr'à 'u database.\nPò essere ca già ha state repristinate.",
        "undelete-error": "Errore pàgene none scangellate",
        "undelete-error-short": "Errore file non recuperate: $1",
        "undelete-error-long": "Errore ca s'onne acchiate quanne amme pruvate a reprisitinà 'u file:\n\n$1",
        "import": "Pàggene 'mbortete",
        "importinterwiki": "'Mborte da Transuicchi",
        "import-interwiki-text": "Schacchie 'na Uicchi e 'nu titele de pàgene da 'mbortà.\nLe date d'a revisione e 'u nome de le cangiature avènene preservate.\nTutte le aziune de 'mbortaziune 'mbrà le Uicchi sonde reggistrate jndr'à l'[[Special:Log/import|archivije de le 'mbortaziune]].",
-       "import-interwiki-source": "Sorgende Uicchi/vosce:",
        "import-interwiki-history": "Copie tutte 'a sotrie de le versiune de sta pàgene",
        "import-interwiki-templates": "Inglude tutte le template",
        "import-interwiki-submit": "'Mborte",
        "exif-urgency-low": "Vasce  ($1)",
        "exif-urgency-high": "Ierte ($1)",
        "exif-urgency-other": "Priorità definite da l'utende ($1)",
-       "watchlistall2": "tutte",
        "namespacesall": "tutte",
        "monthsall": "tutte",
        "confirmemail": "Conferme l'indirizze e-mail",
        "confirmemail_success": "L'indirizze e-mail tue ha state confermate.\nTu, mò te puè [[Special:UserLogin|collegà]] e te puè devertì sus 'a Uicchipèdie.",
        "confirmemail_loggedin": "L'indirizze e-mail tue ha state confermate.",
        "confirmemail_subject": "Indirizze email de conferme pe {{SITENAME}}",
-       "confirmemail_body": "Quacchedune, pò essere tu, fa l'indirizze IP $1,\nha reggistrate 'nu cunde utende \"$2\" cu st'indirizze email sus a {{SITENAME}}.\n\nPe confermà ca stu cunde ète avveramende 'u tue e pe attivà 'a funzione email de {{SITENAME}}, iapre stu collegamende jndr'à 'u borwser tue:\n\n$3\n\nCe tu *NON* g'è reggistrate 'u cunde utende, segue stu collegamende pe scangellà l'indirizze email de conferme:\n\n$5\n\nStu codece de conferme more 'u $4.",
-       "confirmemail_body_changed": "Quacchedune, pò essere tu, da l'indirizze IP $1,\nha cangiate l'indirizze e-mail d'u cunde utende \"$2\" cu st'indirizze e-mail sus a {{SITENAME}}.\n\nPe confermà ca stu cunde ète avveramende 'u tune e pe reattivà 'a funzione email de {{SITENAME}}, iapre stu collegamende jndr'à 'u borwser tune:\n\n$3\n\nCe tu *NON* g'è reggistrate 'u cunde utende, segue stu collegamende pe scangellà l'indirizze email de conferme:\n\n$5\n\nStu codece de conferme scade 'u $4.",
+       "confirmemail_body": "Quacchedune, pò essere tu, fa l'indirizze IP $1,\nha reggistrate 'nu cunde utende \"$2\" cu st'indirizze email sus a {{SITENAME}}.\n\nPe confermà ca stu cunde ète avveramende 'u tue e pe attivà 'a funzione email de {{SITENAME}}, iapre stu collegamende jndr'à 'u browser tue:\n\n$3\n\nCe tu *NON* g'è reggistrate 'u cunde utende, segue stu collegamende pe scangellà l'indirizze email de conferme:\n\n$5\n\nStu codece de conferme more 'u $4.",
+       "confirmemail_body_changed": "Quacchedune, pò essere tu, da l'indirizze IP $1,\nha cangiate l'indirizze e-mail d'u cunde utende \"$2\" cu st'indirizze e-mail sus a {{SITENAME}}.\n\nPe confermà ca stu cunde ète avveramende 'u tune e pe reattivà 'a funzione email de {{SITENAME}}, iapre stu collegamende jndr'à 'u browser tune:\n\n$3\n\nCe tu *NON* g'è reggistrate 'u cunde utende, segue stu collegamende pe scangellà l'indirizze email de conferme:\n\n$5\n\nStu codece de conferme scade 'u $4.",
        "confirmemail_body_set": "Quacchedune, pò essere tu, da l'indirizze IP $1,\nha cangiate l'indirizze e-mail d'u cunde utende \"$2\" cu st'indirizze e-mail sus a {{SITENAME}}.\n\nPe confermà ca stu cunde ète avveramende 'u tune e pe attivà 'a funzione email de {{SITENAME}}, iapre stu collegamende jndr'à 'u browser tune:\n\n$3\n\nCe tu *NON* g'è reggistrate 'u cunde utende, segue stu collegamende pe scangellà l'indirizze email de conferme:\n\n$5\n\nStu codece de conferme scade 'u $4.",
        "confirmemail_invalidated": "Conferme de l'indirizze e-mail scangellete",
        "invalidateemail": "Scangille 'a conferme de l'e-mail",
        "logentry-rights-rights-legacy": "$1 ave {{GENDER:$2|cangiate}} 'u membre d'u gruppe pe $3",
        "logentry-rights-autopromote": "$1 ha state {{GENDER:$2|promosse}} automaticamende da $4 a $5",
        "rightsnone": "(ninde)",
+       "revdelete-summary": "cange 'u riepileghe",
        "feedback-bugornote": "Ce tu si pronde a descrivere 'nu probbleme tecniche cu le dettaglie pe piacere [$1 manne 'nu bug].\nCe nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène aggiunde a 'a pàgene [$3 $2]\", seguenne 'u nome utende tune e ce browser tu ste ause.",
        "feedback-subject": "Oggette:",
        "feedback-message": "Messàgge:",
index b2a7d4d..901f38c 100644 (file)
                        "Eroha",
                        "Niklem",
                        "Agilight",
-                       "Oleg3280"
+                       "Oleg3280",
+                       "Nirovulf",
+                       "Striking Blue",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "broken-file-category": "Страницы с неработающими файловыми ссылками",
        "about": "Описание",
        "article": "Статья",
-       "newwindow": "(в новом окне)",
+       "newwindow": "&nbsp;(в новом окне)",
        "cancel": "Отменить",
        "moredotdotdot": "Далее…",
        "morenotlisted": "Этот список не является полным.",
        "otherlanguages": "На других языках",
        "redirectedfrom": "(перенаправлено с «$1»)",
        "redirectpagesub": "Страница-перенаправление",
+       "redirectto": "Перенаправление на:",
        "lastmodifiedat": "Последнее изменение этой страницы: $2, $1.",
        "viewcount": "К этой странице обращались $1 {{PLURAL:$1|раз|раз|раза}}.",
        "protectedpage": "Защищённая страница",
        "noemailcreate": "Вам необходимо указать корректный адрес электронной почты",
        "passwordsent": "Новый пароль был выслан на адрес электронной почты, указанный для участника $1.\n\nПожалуйста, представьтесь системе заново после получения пароля.",
        "blocked-mailpassword": "Редактирование с вашего IP-адреса запрещено, поэтому заблокирована и функция восстановления пароля.",
-       "eauthentsent": "На указанный адрес электронной почты отправлено письмо. \nЧтоб получать письма в дальнейшем, следуйте изложенным там инструкциям для подтверждения того, что этот адрес действительно принадлежит вам.",
+       "eauthentsent": "На указанный адрес электронной почты отправлено письмо. \nЧтобы получать письма в дальнейшем, следуйте изложенным там инструкциям для подтверждения, что этот адрес действительно принадлежит вам.",
        "throttled-mailpassword": "Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|1=последнего часа|последних $1 часов}}.\nДля предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания {{PLURAL:$1|за $1 час|за $1 часов|за $1 часа|1=в час}}.",
        "mailerror": "Ошибка при отправке почты: $1",
        "acct_creation_throttle_hit": "За сутки с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись участника|было создано $1 учётных записей участников|1=уже была создана учётная запись участника}}, что является пределом для данного отрезка времени.\nТаким образом, пользователи, обладающие данным IP-адресом, в данный момент больше не могут создавать новых учётных записей.",
        "createaccount-text": "Кто-то создал учётную запись «$2» на сервере проекта {{SITENAME}} ($4), указав ваш адрес электронной почты. \n\nПароль учётной записи — «$3». Вам следует авторизоваться на сайте и изменить пароль.\n\nПроигнорируйте данное сообщение, если учётная запись была создана по ошибке.",
        "login-throttled": "Вы сделали слишком много попыток представиться системе.\nПожалуйста, подождите $1 перед тем, как попробовать снова.",
        "login-abort-generic": "Неудачная попытка представиться системе",
+       "login-migrated-generic": "Ваша учётная запись была перенесена, и ваше имя участника больше не существует в этой вики.",
        "loginlanguagelabel": "Язык: $1",
        "suspicious-userlogout": "Ваш запрос на завершение сеанса отклонён, так как он похож на запрос, отправленный некорректным браузером или кэширующим прокси.",
        "createacct-another-realname-tip": "Настоящее имя (необязательное поле).\nЕсли вы укажете его, то оно будет использовано для того, чтобы показать, кем была внесена правка страницы.",
        "passwordreset-emailsent-capture": "Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.",
        "passwordreset-emailerror-capture": "Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1",
        "changeemail": "Изменить адрес электронной почты",
-       "changeemail-header": "Изменение адреса электронной почты",
        "changeemail-text": "Заполните эту форму, чтобы изменить свой адрес электронной почты. Вам нужно будет ввести пароль, чтобы подтвердить изменение.",
        "changeemail-no-info": "Чтобы обращаться непосредственно к этой странице, вам следует представиться системе.",
        "changeemail-oldemail": "Текущий адрес электронной почты:",
        "changeemail-none": "(нет)",
        "changeemail-password": "Ваш пароль для проекта «{{SITENAME}}»:",
        "changeemail-submit": "Изменить адрес",
-       "changeemail-cancel": "Отмена",
        "changeemail-throttled": "Вы сделали слишком много попыток представиться системе.\nПожалуйста, подождите $1 перед тем, как попробовать снова.",
        "resettokens": "Сбросить токены",
        "resettokens-text": "Вы можете сбросить токены, позволяющие получить доступ к некоторым личным данным, связанным с вашей учётной записью на этом сайте.\n\nВам необходимо сделать это, если вы случайно поделились ими с кем-то, или если ваша учётная запись была взломана.",
        "showpreview": "Предварительный просмотр",
        "showdiff": "Внесённые изменения",
        "blankarticle": "<strong>Предупреждение:</strong> Страница, которую вы создаёте, пуста.\nЕсли снова нажмёте кнопку «{{int:savearticle}}», страница будет создана без какого-либо содержания.",
-       "anoneditwarning": "'''Внимание!''' Вы не авторизовались на сайте.\nВ истории изменений этой страницы будет записан ваш IP-адрес.",
+       "anoneditwarning": "<strong>Внимание!</strong> Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы <strong>[$1 войдёте]</strong> или <strong>[$2 создадите учётную запись]</strong>, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.",
        "anonpreviewwarning": "''Вы не представились системе. Сохранение приведёт к записи вашего IP-адреса в историю изменений страницы.''",
        "missingsummary": "'''Напоминание.''' Вы не дали краткого описания изменений. При повторном нажатии на кнопку «{{int:savearticle}}», ваши изменения будут сохранены без комментария.",
        "missingcommenttext": "Пожалуйста, введите ниже ваше сообщение.",
        "searchall": "все",
        "showingresults": "Ниже {{PLURAL:$1|1=показан результат|показаны  результаты}} с № '''$2''' и вплоть до № '''$1'''.",
        "showingresultsinrange": "Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результатов|<strong>$1</strong> результата}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|1=Результат '''$1''' из '''$3'''|Результаты '''$1—$2''' из '''$3'''}} для «'''$4'''»",
+       "search-showingresults": "{{PLURAL:$4|Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1 — $2</strong> из <strong>$3</strong>}}",
        "search-nonefound": "Соответствий запросу не найдено.",
        "powersearch-legend": "Расширенный поиск",
        "powersearch-ns": "Поиск в пространствах имён:",
        "gender-unknown": "Я предпочитаю не указывать",
        "gender-male": "Он редактирует страницы вики",
        "gender-female": "Онa редактирует страницы вики",
-       "prefs-help-gender": "Установка этой настройки необязательна.\nПрограммное обеспечение использует эту информацию чтобы обращаться к вам и упоминать вас в правильном грамматическом роде.\nЭта информация будет общедоступной.",
+       "prefs-help-gender": "Установка этой настройки необязательна.\nПО использует это значение, чтобы обращаться к вам и упоминать вас в правильном грамматическом роде.\nЭта информация будет общедоступной.",
        "email": "Электронная почта",
        "prefs-help-realname": "Настоящее имя (необязательное поле).\nЕсли вы укажете его, то оно будет использовано для того, чтобы показать, кем была внесена правка страницы.",
        "prefs-help-email": "Адрес электронной почты указывать необязательно, но он будет необходим в том случае, если вы забудете пароль.",
        "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Разница версий",
        "prefs-help-prefershttps": "Эта настройка будет применена после следующего представления системе.",
+       "prefswarning-warning": "Вы внесли в свои настройки изменения, которые ещё не были сохранены.\nЕсли вы покинете эту страницу, не нажав «$1», настройки не будут обновлены.",
        "prefs-tabs-navigation-hint": "Совет: Вы можете использовать клавиши стрелок влево и вправо для перехода между вкладками в списке вкладок.",
        "email-address-validity-valid": "Выглядит корректно",
        "email-address-validity-invalid": "Введите корректный адрес электронной почты!",
        "right-deletedtext": "просмотр удалённого текста и изменений между удалёнными версиями страниц",
        "right-browsearchive": "поиск удалённых страниц",
        "right-undelete": "восстановление страниц",
-       "right-suppressrevision": "Ð\9fÑ\80оÑ\81моÑ\82Ñ\80, Ñ\81крытие и восстановление скрытых версий страниц",
+       "right-suppressrevision": "пÑ\80оÑ\81моÑ\82Ñ\80, Ñ\81окрытие и восстановление скрытых версий страниц",
        "right-viewsuppressed": "Просмотр версий, скрытых от всех участников",
        "right-suppressionlog": "просмотр частных журналов",
        "right-block": "установка ограничений на редактирование для других участников",
        "randomincategory": "Случайная страница в категории",
        "randomincategory-invalidcategory": "Категории «$1» не существует.",
        "randomincategory-nopages": "Нет страниц в категории [[:Category:$1]].",
-       "randomincategory-selectcategory": "Перейти на случайную страницу из категории: $1 $2.",
-       "randomincategory-selectcategory-submit": "Перейти",
+       "randomincategory-category": "Категория:",
+       "randomincategory-legend": "Случайная страница в категории",
        "randomredirect": "Случайное перенаправление",
        "randomredirect-nopages": "Пространство имён «$1» не содержит перенаправлений.",
        "statistics": "Статистика",
        "booksources": "Источники книг",
        "booksources-search-legend": "Поиск информации о книге",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Найти",
+       "booksources-search": "Найти",
        "booksources-text": "На этой странице приведён список ссылок на сайты, где вы, возможно, найдёте дополнительную информацию о книге. Это интернет-магазины и системы поиска в библиотечных каталогах.",
        "booksources-invalid-isbn": "Указанный номер ISBN, судя по всему, содержит ошибку. Пожалуйста, проверьте, что при переносе номера из первоисточника не возникло искажений.",
        "specialloguserlabel": "Исполнитель:",
        "mywatchlist": "Список наблюдения",
        "watchlistfor2": "Для $1 $2",
        "nowatchlist": "Ваш список наблюдения пуст.",
-       "watchlistanontext": "Ð\92Ñ\8b Ð´Ð¾Ð»Ð¶Ð½Ñ\8b Ð²Ð¾Ð¹Ñ\82и, чтобы просмотреть или отредактировать элементы в списке наблюдения.",
+       "watchlistanontext": "Ð\9fожалÑ\83йÑ\81Ñ\82а, Ð²Ð¾Ð¹Ð´Ð¸Ñ\82е, чтобы просмотреть или отредактировать элементы в списке наблюдения.",
        "watchnologin": "Нужно представиться системе",
        "addwatch": "Добавить в список наблюдения",
        "addedwatchtext": "Страница «[[:$1]]» была добавлена в ваш [[Special:Watchlist|список наблюдения]].\nТам будут отмечаться последующие изменения этой страницы, а также связанной с ней страницы обсуждения.",
        "wlheader-enotif": "Уведомления по эл. почте включены.",
        "wlheader-showupdated": "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
        "wlnote": "Ниже {{PLURAL:$1|показано последнее изменение|показаны <strong>$1</strong> последних изменений|показаны <strong>$1</strong> последние изменения}} за {{PLURAL:$2|последний час|последние <strong>$2</strong> часов|последние <strong>$2</strong> часа}}, по состоянию на $3 $4.",
-       "wlshowlast": "Показать за последние $1 часов $2 дней $3",
+       "wlshowlast": "Показать за последние $1 часов $2 дней",
        "watchlist-options": "Настройки списка наблюдения",
        "watching": "Добавление в список наблюдения…",
        "unwatching": "Удаление из списка наблюдения…",
        "exbeforeblank": "содержимое до очистки: «$1»",
        "delete-confirm": "$1 — удаление",
        "delete-legend": "Удаление",
-       "historywarning": "'''Внимание:''' эта страница имеет историю изменений приблизительно из $1 {{PLURAL:$1|версии|версий}}:",
+       "historywarning": "<strong>Внимание:</strong> У страницы, которую вы собираетесь удалить, есть история правок, содержащая $1 {{PLURAL:$1|версию|версий}}:",
        "confirmdeletetext": "Вы запросили полное удаление страницы (или изображения) и всей её истории изменений. Пожалуйста, подтвердите, что вы действительно желаете это сделать, понимаете последствия своих действий, и делаете это в соответствии [[{{MediaWiki:Policy-url}}|с правилами]].",
        "actioncomplete": "Действие выполнено",
        "actionfailed": "Действие не выполнено",
        "delete-edit-reasonlist": "Править список причин",
        "delete-toobig": "У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.\nУдаление таких страниц было запрещено во избежание нарушений в работе сайта «{{SITENAME}}».",
        "delete-warning-toobig": "У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.\nЕё удаление может привести к нарушению нормальной работы базы данных сайта «{{SITENAME}}»;\nдействуйте с осторожностью.",
-       "delete-cantedit": "Вы не можете удалить эту страницу, так как у вас нет разрешения на её редактирование.",
+       "deleteprotected": "Вы не можете удалить эту страницу, поскольку она защищена.",
        "deleting-backlinks-warning": "'''Предупреждение.''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Другие страницы]] ссылаются на страницу, которую вы собираетесь удалить, или содержат её.",
        "rollback": "Откатить изменения",
        "rollback_short": "Откат",
        "protect-othertime": "Другое время:",
        "protect-othertime-op": "другое время",
        "protect-existing-expiry": "Текущее время окончания: $2, $3",
+       "protect-existing-expiry-infinity": "Текущее время окончания: бесконечно",
        "protect-otherreason": "Другая причина/дополнение:",
        "protect-otherreason-op": "Другая причина",
        "protect-dropdown": "* Типовые причины защиты\n** частый вандализм\n** чрезмерный спам\n** непродуктивная война правок\n** популярная страница",
        "unblocked": "[[User:$1|$1]] {{GENDER:$1|разблокирован|разблокирована}}",
        "unblocked-range": "$1 был разблокирован",
        "unblocked-id": "Блокировка $1 была снята",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] был разблокирован.",
        "blocklist": "Заблокированные участники",
        "ipblocklist": "Заблокированные участники",
        "ipblocklist-legend": "Поиск заблокированного участника",
        "change-blocklink": "изменить блокировку",
        "contribslink": "вклад",
        "emaillink": "отправить письмо",
-       "autoblocker": "Автоблокировка из-за того, что ваш IP-адрес недавно использовал «[[User:$1|$1]]».\nПричина блокировки $1ː «$2»",
+       "autoblocker": "Автоблокировка из-за того, что ваш IP-адрес недавно использовал «[[User:$1|$1]]».\nПричина блокировки $1: «$2»",
        "blocklogpage": "Журнал блокировок",
        "blocklog-showlog": "{{GENDER:$1|Этот участник уже блокировался|Эта участница уже блокировалась}} ранее.\nНиже приведён журнал блокировок:",
        "blocklog-showsuppresslog": "{{GENDER:$1|Этот участник уже заблокирован и скрыт|Эта участница уже заблокирована и скрыта}}. Журнал сокрытий приведён ниже:",
        "import": "Импортирование страниц",
        "importinterwiki": "Межвики импорт",
        "import-interwiki-text": "Укажите вики и название импортируемой страницы.\nДаты изменений и имена авторов будут сохранены.\nВсе операции межвики импорта регистрируются в [[Special:Log/import|соответствующем журнале]].",
-       "import-interwiki-source": "Вики-источник/страница:",
+       "import-interwiki-sourcewiki": "Исходный вики-проект:",
+       "import-interwiki-sourcepage": "Исходная страница:",
        "import-interwiki-history": "Копировать всю историю изменений этой страницы",
        "import-interwiki-templates": "Включить все шаблоны",
        "import-interwiki-submit": "Импортировать",
        "pageinfo-hidden-categories": "{{PLURAL:$1|1=Скрытая категория|Скрытых категорий}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|1=Шаблон|Шаблонов}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|1=Включаемая страница|Включаемых страниц}} ($1)",
-       "pageinfo-toolboxlink": "Сведения о странице",
+       "pageinfo-toolboxlink": "Сведения о странице",
        "pageinfo-redirectsto": "Перенаправление",
        "pageinfo-redirectsto-info": "сведения",
        "pageinfo-contentpage": "Учитывается счётчиком как содержательная страница",
        "exif-urgency-low": "Низкая ($1)",
        "exif-urgency-high": "Высокая ($1)",
        "exif-urgency-other": "Определённый пользователем приоритет ($1)",
-       "watchlistall2": "все",
        "namespacesall": "все",
        "monthsall": "все",
        "confirmemail": "Подтверждение адреса электронной почты",
        "logentry-upload-overwrite": "$1 загрузил{{GENDER:$2||а}} новую версию $3",
        "logentry-upload-revert": "$1 загрузил{{GENDER:$2||а}} $3",
        "rightsnone": "(нет)",
+       "revdelete-summary": "описание изменений",
        "feedback-bugornote": "Если вы готовы подробно описать техническую проблему, пожалуйста, [$1 сообщите об ошибке].\nВ противном случае вы можете использовать данную простую форму. Ваш комментарий будет добавлен на страницу «[$3 $2]» вместе с вашим именем участника и используемым браузером.",
        "feedback-subject": "Тема:",
        "feedback-message": "Сообщение:",
        "log-name-pagelang": "Журнал изменения языка",
        "log-description-pagelang": "Это журнал изменений в языках страницы.",
        "logentry-pagelang-pagelang": "$1 изменил{{GENDER:$2||а}} язык страницы для $3 с $4 на $5.",
-       "default-skin-not-found": "Упс! Тема оформления по умолчанию для вашей вики (<code>$wgDefaultSkin</code>), <code>$1</code> недоступна.\n\nВаша установка, похоже, содержит следующие темы оформления. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.\n\n\n$ 2\n\n\n; Если вы только что установили MediaWiki:\n: Вы, видимо, сделали это с Git или непосредственно из исходного кода с использованием другого способа. Тогда такое возможно. Попробуйте установить некоторые темы из [https://www.mediawiki.org/wiki/Category:All_skins каталога тем оформления сайта mediawiki.org]:\n:* Скачав [https://www.mediawiki.org/wiki/Download архив установочных файлов], который содержит несколько тем оформления и расширений. Вы можете скопировать папку <code>skins/</code> из него.\n:* Склонировав один из репозиториев <code>mediawiki/skins/*</code> через git в подпапку <code>skins/</code> папки, куда установлена MediaWiki.\n: Это не должно навредить вашему репозиторию, если вы MediaWiki-разработчик. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.\n; Если вы только что обновили MediaWiki:\n: MediaWiki версии 1.24 и более новых больше не включает автоматически установленные темы (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\nВы можете вставить следующие строчки в <code>LocalSettings.php</code>, чтобы включить все установленные темы оформления: \n\n\n<pre>$3</pre>\n\n\n; Если вы только что изменили <code>LocalSettings.php</code>:\n: Перепроверьте названия тем на наличие опечаток.",
-       "default-skin-not-found-no-skins": "Упс! Тема оформления по умолчанию для вашей вики (<code>$wgDefaultSkin</code>), <code>$1</code> недоступна.\n\n\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 архив установочных файлов], который содержит несколько тем оформления и расширений. Вы можете скопировать папку <code>skins/</code> из него.\n:* Склонировав один из репозиториев <code>mediawiki/skins/*</code> через git в подпапку <code>skins/</code> папки, куда установлена MediaWiki.\n: Это не должно навредить вашему репозиторию, если вы MediaWiki-разработчик. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.",
+       "default-skin-not-found": "Упс! Тема оформления по умолчанию для вашей вики <code>$wgDefaultSkin</code>, <code>$1</code> недоступна.\n\nВаша установка, похоже, содержит следующие темы оформления. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.\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 архив установочных файлов], который содержит несколько тем оформления и расширений. Вы можете скопировать папку <code>skins/</code> из него.\n:* Клонировав один из репозиториев <code>mediawiki/skins/*</code> через git в подпапку <code  dir=\"ltr\">skins/</code> папки, куда установлена MediaWiki.\n: Это не должно навредить вашему репозиторию, если вы MediaWiki-разработчик. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.\n; Если вы только что обновили MediaWiki:\n: MediaWiki версии 1.24 и новее больше не включает автоматически установленные темы (см. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\nВы можете вставить следующие строки в <code>LocalSettings.php</code>, чтобы включить все установленные темы оформления: \n\n\n<pre dir=\"ltr\">$3</pre>\n\n\n; Если вы только что изменили <code>LocalSettings.php</code>:\n: Перепроверьте названия тем на наличие опечаток.",
+       "default-skin-not-found-no-skins": "Упс! Тема оформления по умолчанию для вашей вики <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 архив установочных файлов], который содержит несколько тем оформления и расширений. Вы можете скопировать папку <code>skins/</code> из него.\n:* Клонировав один из репозиториев <code>mediawiki/skins/*</code> через git в подпапку <code dir=\"ltr\">skins/</code> папки, куда установлена MediaWiki.\n: Это не должно навредить вашему репозиторию, если вы MediaWiki-разработчик. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (включено)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''отключено''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''отключено''')",
+       "mediastatistics": "Медиа-статистика",
+       "mediastatistics-summary": "Статистические данные о типах загруженных файлов. Она включает информацию только о последних версиях файлов. Более старые или удалённые версии файлов не учитываются.",
+       "mediastatistics-nbytes": "$1 байт{{PLURAL:$1||ов|а}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-тип",
+       "mediastatistics-table-extensions": "Возможные расширения",
+       "mediastatistics-table-count": "Количество файлов",
+       "mediastatistics-table-totalbytes": "Общий размер",
+       "mediastatistics-header-unknown": "Неизвестные",
+       "mediastatistics-header-bitmap": "Растровые изображения",
+       "mediastatistics-header-drawing": "Рисунки (векторные изображения)",
+       "mediastatistics-header-audio": "Аудио",
+       "mediastatistics-header-video": "Видео",
+       "mediastatistics-header-multimedia": "Мультимедиа",
+       "mediastatistics-header-office": "Офисные",
+       "mediastatistics-header-text": "Текстовые",
+       "mediastatistics-header-executable": "Исполняемые",
+       "mediastatistics-header-archive": "Сжатые форматы",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|лишняя запятая в конце была удалена|лишних запятых в конце были удалены|лишние запятые в конце были удалены}} из JSON",
+       "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": "Было указано значение типа, который не может быть закодирован"
 }
index 84d0b22..06d214f 100644 (file)
        "passwordreset-capture-help": "Кідь означіте тото поличко, буде імейл (з дочасным геслом) оркем посланя хоснователёви указаный і вам.",
        "passwordreset-email": "Адреса електронічной пошты:",
        "passwordreset-emailtitle": "Детайлы конта на {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Дахто (може Вы, з IP адресы $1) попросив о наставлїня нового гесла до вашого конта на {{grammar:6sg|{{SITENAME}}}} ($4). З тов адресов {{PLURAL:$3|є повязане наступне конто|суть повазяны слїдуючі конта}}:\n\n$2\n\n{{PLURAL:$3|Тото дочасне гесло|Тоты дочасны гесла}} стануть неплатныма {{PLURAL:$5|за день|за $5 днї|за $5 днїв}}.\nТеперь бы хотїло, бы сьте ся приголосили та зволлил нове гесло. Кідь тоту просьбу післав хтось другый або сьте ся на старе гесло роспамнятали і не хочете го змінити, можете тото повідомлїня іґноровати та дале хосновати старе гесло.",
-       "passwordreset-emailtext-user": "{{gender:$1|ХоÑ\81новаÑ\82елÑ\8c|ХоÑ\81новаÑ\82елÑ\8cка|ХоÑ\81новаÑ\82елÑ\8c}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|попÑ\80оÑ\81ив|попÑ\80оÑ\81ила|попÑ\80оÑ\81ив}} Ð¾ Ð½Ð°Ñ\81Ñ\82авлÑ\97нÑ\8f Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð³ÐµÑ\81ла Ðº Ð²Ð°Ñ\88омÑ\83\nконÑ\82Ñ\83 Ð½Ð° {{grammar:6sg|{{SITENAME}}}} ($4). Ð\9a Ñ\82Ñ\96й Ð°Ð´Ñ\80еÑ\81Ñ\97 {{PLURAL:$3|Ñ\94 Ñ\81пÑ\80Ñ\8fжене Ð½Ð°Ñ\81Ñ\82Ñ\83пне ÐºÐ¾Ð½Ñ\82о|Ñ\81Ñ\83Ñ\82Ñ\8c Ñ\81пÑ\80Ñ\8fженÑ\8b Ð½Ð°Ñ\81Ñ\82Ñ\83пнÑ\83 ÐºÐ¾Ð½Ñ\82а}}:\n\n$2\n\n{{PLURAL:$3|ТоÑ\82о Ð´Ð¾Ñ\87аÑ\81не Ð³ÐµÑ\81ло|ТоÑ\82Ñ\8b Ð´Ð¾Ñ\87аÑ\81нÑ\8b Ð³ÐµÑ\81ла}} ÐºÑ\96нÑ\87аÑ\82Ñ\8c {{PLURAL:$5|о Ñ\94ден Ð´ÐµÐ½Ñ\8c|о $5 Ð´Ð½Ñ\97|о $5 Ð´Ð½Ñ\97в}}.\nÐ\9dÑ\8bнÑ\97 Ð±Ñ\8b Ñ\81Ñ\8cÑ\82е Ñ\81Ñ\8f Ð¼Ð°Ð²(а) Ð¿Ñ\80иголоÑ\81иÑ\82и Ñ\83 Ð·Ð²Ð¾Ð»Ð¸Ñ\82и Ñ\81обÑ\96 Ð½Ð¾Ð²Ðµ Ð³ÐµÑ\81ло. Ð\9aÑ\96дÑ\8c Ñ\82оÑ\82Ñ\83 Ð¿Ð¾Ð¶Ð°Ð´Ð°Ð²ÐºÑ\83\nпоÑ\81лав Ð´Ð°Ñ\85Ñ\82о Ð´Ñ\80Ñ\83гÑ\8bй Ð°Ð±Ð¾ Ñ\81Ñ\8cÑ\82е Ñ\81обÑ\96 Ð½Ð° Ñ\81воÑ\94 Ñ\81Ñ\82аÑ\80е Ð³ÐµÑ\81ло Ñ\81помÑ\8fнÑ\83в(а),і не хочете го\nзмінити, можете тото повідомлїня іґноровати і надале хосновати старе гесло.",
+       "passwordreset-emailtext-ip": "Дахто (може Вы, з IP адресы $1) попросив о наставлїня нового гесла до вашого конта на {{grammar:6sg|{{SITENAME}}}} ($4). З тов адресов {{PLURAL:$3|є повязане слїдуюче конто|суть повязаны слїдуючі конта}}:\n\n$2\n\n{{PLURAL:$3|Тото дочасне гесло стане неплатным|Тоты дочасны гесла стануть неплатныма}} {{PLURAL:$5|за день|за $5 днї|за $5 днїв}}.\nТеперь бы сьте ся мали приголосити і зволити собі нове гесло. Кідь тоту просьбу послав хтось другый або сьте собі на своє старе гесло спомянули і не хочете го змінити, можете тото повідомлїня іґноровати і дале хосновати старе гесло.",
+       "passwordreset-emailtext-user": "{{gender:$1|ХоÑ\81новаÑ\82елÑ\8c|ХоÑ\81новаÑ\82елÑ\8cка|ХоÑ\81новаÑ\82елÑ\8c}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|попÑ\80оÑ\81ив|попÑ\80оÑ\81ила|попÑ\80оÑ\81ив}} Ð¾ Ð½Ð°Ñ\81Ñ\82авлÑ\97нÑ\8f Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð³ÐµÑ\81ла Ð´Ð¾ Ð²Ð°Ñ\88ого\nконÑ\82а Ð½Ð° {{grammar:6sg|{{SITENAME}}}} ($4). Ð\97 Ñ\82ов Ð°Ð´Ñ\80еÑ\81ов {{PLURAL:$3|Ñ\94 Ð¿Ð¾Ð²Ñ\8fзане Ð½Ð°Ñ\81Ñ\82Ñ\83пне ÐºÐ¾Ð½Ñ\82о|Ñ\81Ñ\83Ñ\82Ñ\8c Ð¿Ð¾Ð²Ñ\8fзанÑ\8b Ð½Ð°Ñ\81Ñ\82Ñ\83пнÑ\8b ÐºÐ¾Ð½Ñ\82а}}:\n\n$2\n\n{{PLURAL:$3|ТоÑ\82о Ð´Ð¾Ñ\87аÑ\81не Ð³ÐµÑ\81ло ÐºÑ\96нÑ\87иÑ\82Ñ\8c|ТоÑ\82Ñ\8b Ð´Ð¾Ñ\87аÑ\81нÑ\8b Ð³ÐµÑ\81ла ÐºÑ\96нÑ\87аÑ\82Ñ\8c}} {{PLURAL:$5|о Ñ\94ден Ð´ÐµÐ½Ñ\8c|о $5 Ð´Ð½Ñ\97|о $5 Ð´Ð½Ñ\97в}}.\nТепеÑ\80Ñ\8c Ð±Ñ\8b Ñ\81Ñ\8cÑ\82е Ñ\81Ñ\8f Ð¼Ð°Ð»Ð¸ Ð¿Ñ\80иголоÑ\81иÑ\82и Ñ\96 Ð·Ð²Ð¾Ð»Ð¸Ñ\82и Ñ\81обÑ\96 Ð½Ð¾Ð²Ðµ Ð³ÐµÑ\81ло. Ð\9aÑ\96дÑ\8c Ñ\82оÑ\82Ñ\83 Ð¿Ð¾Ð¶Ð°Ð´Ð°Ð²ÐºÑ\83 \nпоÑ\81лав Ð´Ð°Ñ\85Ñ\82о Ð´Ñ\80Ñ\83гÑ\8bй Ð°Ð±Ð¾ Ñ\81Ñ\8cÑ\82е Ñ\81обÑ\96 Ð½Ð° Ñ\81воÑ\94 Ñ\81Ñ\82аÑ\80е Ð³ÐµÑ\81ло Ñ\81помÑ\8fнÑ\83ли і не хочете го\nзмінити, можете тото повідомлїня іґноровати і надале хосновати старе гесло.",
        "passwordreset-emailelement": "Імя хоснователя: $1\nДочасне гесло: $2",
        "passwordreset-emailsent": "Імейл з геслом быв посланый.",
        "passwordreset-emailsent-capture": "Быв выґенерованый імейл з геслом, што є вказаный ниже.",
        "passwordreset-emailerror-capture": "Быв выґенерованый імейл з геслом, котрый є указаный ниже, але ся го не вдало загнати {{GENDER:$2|хоснователёви|хосновательцї}}: $1",
        "changeemail": "Зміна імейловой адресы",
-       "changeemail-header": "Зміна імейловой адресу ку конту",
        "changeemail-text": "Выповнїнём того формуларя собі зміните імейлову адресу. Про потверджіня зміны будете мусити знову задати своє гесло.",
        "changeemail-no-info": "Ку тій сторінцї мають прямый приступ лем приголошены хоснователї.",
        "changeemail-oldemail": "Теперїшня імейлова адреса:",
        "changeemail-none": "(жадне)",
        "changeemail-password": "Ваше гесло на портал {{SITENAME}}:",
        "changeemail-submit": "Змінити імейл",
-       "changeemail-cancel": "Сторно",
        "changeemail-throttled": "Зробили сьте дуже много спроб о приголошіня.\nПросиме Вас, почекайте $1 перед далшов спробов.",
        "resettokens": "Реініціалізація клічів",
        "resettokens-text": "На тій сторінцї можете реініціалізовати клічі, якы уможнюють приступ к даякым пріватным даным звязаным з вашым контом.\n\n{{GENDER:|Мав|Мала|Мали}} бы сьте то учінити тогды, колы сьте помылково дакому {{GENDER:|прозрадив|прозрадила|прозрадили}}, або ваше конто было зрушене.",
        "searchrelated": "звязаный",
        "searchall": "вшыткы",
        "showingresults": "Ниже {{PLURAL:$1|вказане|вказаны|вказаных}} '''$1''' {{PLURAL:$1|резултат|резултаты|резултатів}}, почінаючіх з №&nbsp;'''$2'''",
-       "showingresultsheader": "{{PLURAL:$5|Резултат '''$1''' з '''$3'''|Резултаты '''$1 — $2''' з '''$3'''}}  про '''$4'''",
        "search-nonefound": "На вашу пожадавку не были найджены жадны резултаты.",
        "powersearch-legend": "Росшырене гляданя",
        "powersearch-ns": "Глядати у просторах назв:",
        "powersearch-togglelabel": "Позначіти:",
        "powersearch-toggleall": "Вшыткы",
        "powersearch-togglenone": "Жадный",
+       "powersearch-remember": "Запамятати выбір про будучі гляданя",
        "search-external": "Екстерне гляданя",
        "searchdisabled": "<p>Перебачте. Повнотекстове гляданя є дочасно недоступне. Затля можете спробовати гляданя Google; є але можне, же ёго резултаты не мусять быти актуалны.</p>",
        "search-error": "Як ся глядало трафіла ся хыба: $1",
        "randomincategory": "Трафункова сторінка в катеґорії",
        "randomincategory-invalidcategory": "\" $1 \" не є платна назва катеґорії.",
        "randomincategory-nopages": "В [[:Category:$1|катеґорії $1]] не суть ниякы сторінкы.",
-       "randomincategory-selectcategory": "Дістати трафункову сторінку з катеґорії: $1 $2.",
        "randomredirect": "Трафункове напрямлїня",
        "randomredirect-nopages": "Простор назв „$1“ не обсягує жадны напрямлїня.",
        "statistics": "Штатістіка",
        "querypage-disabled": "Тота шпеціална сторінка є  заблокована про проблемы з выконом.",
        "booksources": "Жрідла книг",
        "booksources-search-legend": "Гляданя інформації про книгы",
-       "booksources-go": "Выконати",
        "booksources-text": "Ниже є список одказів на серверы продаваючі книгы, або котры можуть мати далшы інформації о книгах, котры глядате.",
        "booksources-invalid-isbn": "Дане ISBN ся здасть быти неплатне. Перевірте го з оріґіналным жрідлом.",
        "specialloguserlabel": "Супроводник:",
        "wlheader-enotif": "Упозорнїня  ел. поштов є запнуте.",
        "wlheader-showupdated": "Сторінкы, котры ся змінили од вашой послїднёй навщівы суть вказаны '''грубо'''",
        "wlnote": "Ниже є {{PLURAL:$1|остатня зміна|остатнї $1 зміны|остатнїх $1 змін}} за {{PLURAL:$2|остатнїй|остатнї|остатнїх}} <b>$2</b> {{PLURAL:$2|годину|годины|годин}} до do $4, $3.",
-       "wlshowlast": "Вказати зміны за послїднїх $1 годин $2 днїв $3",
+       "wlshowlast": "Вказати зміны за послїднїх $1 годин $2 днїв",
        "watchlist-options": "Наставлїна списку слїдованых",
        "watching": "Придаваня до списку слїдованя...",
        "unwatching": "Одобратя зо списку слїдованя...",
        "import": "Імпорт сторінок",
        "importinterwiki": "Імпорт міджі вікі",
        "import-interwiki-text": "Про імпорт звольте жрідлову вікі і назву сторінкы. Дата ревізій і мена авторів будуть захованы. Вшыткы імпорты ся зазначують до [[Special:Log/import|книгы імпортів]].",
-       "import-interwiki-source": "Вікі/сторінка-жрідло",
        "import-interwiki-history": "Копіровати вшыткы історічны верзії той сторінкы",
        "import-interwiki-templates": "Загорнути вшыткы шаблоны",
        "import-interwiki-submit": "Імпортовати",
        "exif-urgency-low": "Низка ($1)",
        "exif-urgency-high": "Высока ($1)",
        "exif-urgency-other": "Хоснователём дефінована пріоріта ($1)",
-       "watchlistall2": "вшыткы",
        "namespacesall": "вшыткы",
        "monthsall": "вшыткы",
        "confirmemail": "Потверджіня адресы ел. пошты",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$1|змінив|змінила}} членство в ґрупах про $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|быв автоматічно переведеный|была автоматічно переведана}} з $4 на $5",
        "rightsnone": "(жадне)",
+       "revdelete-summary": "коментарь едітованя",
        "feedback-bugornote": "Кідь сьте прирыхтованый подробно описати технічный проблем, можете [$1 наголосити хыбу].\nІнакше можете схносновати простый формулать ниже. Ваш коментарь буде приданый на сторінку „[$3 $2]“ разом з вашым іменом хоснователя тай інформаціов о тім, якый бровсер хоснуєте.",
        "feedback-subject": "Предмет:",
        "feedback-message": "Повідомлїня:",
index 9711798..bbcc1a0 100644 (file)
        "passwordreset-emailsent-capture": "परिवर्तितकूटशब्दस्य ई-पत्रं प्रेषितम् अस्ति । तत् अधः द्रष्टुं शक्यते ।",
        "passwordreset-emailerror-capture": "परिवर्तितकूटशब्दस्य ई-पत्रं निर्मितम् अस्ति । तत् अधः द्रष्टुं शक्यते । परन्तु {{GENDER:$2|योजकाय}} प्रेषणकाले तत् निरस्तम् अभवत् : $1",
        "changeemail": "ई-पत्रसङ्केतः परिवर्त्यताम्",
-       "changeemail-header": "प्रयोक्तृनाम्नः ई-पत्रसङ्केतः परिवर्त्यताम्",
        "changeemail-text": "स्वस्य ई-पत्रसङ्केतं परिवर्तयितुम् अधः दत्तं प्रपत्रं पूरयतु । एतस्यै प्रक्रियायै कूटशब्दः आवश्यकः ।",
        "changeemail-no-info": "एतत् पृष्ठं सम्पादयितुं प्रवेशः अनिवार्यः ।",
        "changeemail-oldemail": "वर्तमानः ई-पत्रसङ्केतः",
        "changeemail-none": "(न कोऽपि)",
        "changeemail-password": "भवतः/भवत्याः {{SITENAME}} कूटशब्दः:",
        "changeemail-submit": "ई-पत्रं परिवर्त्यताम्",
-       "changeemail-cancel": "निरस्यताम्",
        "changeemail-throttled": "भवता/भवत्या अत्यधिकाः प्रवेशप्रयासाः कृताः । \nकृपया $1 कालं यावत् प्रतिक्षां करोतु ।",
        "resettokens": "चिह्नानि (tokens) परिवर्त्यताम्",
        "resettokens-text": "भवतः/भवत्याः सदस्यतया सह सल्लग्नानि चिह्नानि () उपयोक्तुं शक्यन्ते । येन अनया सदस्यतया सह सल्लग्नाः काश्चन गुप्तसूचनाः ज्ञातुं शक्यन्ते ।",
        "searchall": "सर्वाणि",
        "showingresults": "#'''$2''' क्रमाङ्कात् आरभ्य {{PLURAL:$1|'''$1''' परिणामः अधः प्रदर्शितः|'''$1''' परिणामाः अधः प्रदर्शिताः}}।",
        "showingresultsinrange": "#'''$2''' क्रमाङ्कात् आरभ्य #'''$3''' क्रमाङ्कपर्यन्तं {{PLURAL:$1|'''$1''' परिणामः अधः प्रदर्शितः|'''$1''' परिणामाः अधः प्रदर्शिताः}}।",
-       "showingresultsheader": "'''$4''' इत्येतस्मै {{PLURAL:$5|'''$1''' परिणामः '''$3''' इत्येषु|'''$1 - $2''' परिणामाः '''$3''' इत्येषु}}",
        "search-nonefound": "भवतः/भवत्याः अपेक्षानुगुणं परिणामः न विद्यते ।",
        "powersearch-legend": "प्रगतम् अन्वेषणम्",
        "powersearch-ns": "नामाकाशेषु अन्विष्यताम् :",
        "querypage-disabled": "समाचरणकारणेन एतद्विशेषपुटं निष्क्रियम् ।",
        "booksources": "ग्रन्थस्रोतः",
        "booksources-search-legend": "ग्रन्थस्रोतः अन्विष्यताम्",
-       "booksources-go": "गम्यताम्",
        "booksources-text": "अधस्था आवली नूतनप्राचीनपुस्तकानां विक्रयकेन्द्रस्य अनुबन्धान् सूचयति । यत्र ते  आवश्यकाः अन्यविषयाः अपि उपलभ्याः ।",
        "booksources-invalid-isbn": "दत्तं ISBN मान्यम् इति  न भाति । मूलस्रोततः प्रतिकृतीः कर्तुं परिशीलयतु ।",
        "specialloguserlabel": "आचारी :",
        "wlheader-enotif": "विद्युन्मानपत्रस्य सूचनाः सक्रियाः ।",
        "wlheader-showupdated": "भवतः सन्दर्शनस्य पश्चात् परिवर्तितानि पुटानि स्थूलाक्षरैः निर्दिष्टानि ।",
        "wlnote": "अधस्तात् {{PLURAL:$1|'''1''' परिवर्तनमस्ति|अन्तिमानि '''$1''' परिवर्तनानि सन्ति}},{{PLURAL:$2|गते दिवसे|'''$2''' गतेषु दिवसेषु}}, , $3, $4. इति",
-       "wlshowlast": "अन्तिमाः $1 होराः, अन्तिमानि $2 दिनानि $3 दृश्यन्ताम्",
+       "wlshowlast": "अन्तिमाः $1 होराः, अन्तिमानि $2 दिनानि  दृश्यन्ताम्",
        "watchlist-options": "अवेक्षणाऽऽवलेः विकल्पाः",
        "watching": "निरीक्षते...",
        "unwatching": "निरीक्षाम् अपाकरोति...",
        "import": "पृष्ठानां निर्यातं करोतु",
        "importinterwiki": "ट्रान्स् विकि आयातकाः",
        "import-interwiki-text": "आयातं कर्तुं एकां विकिं एकं पुटं चिनोतु ।  \nपुनरावृत्तीनां दिनाङ्कानि, सम्पादनानि च सुरक्षितानि भविष्यन्ति। \nसर्वाः ट्रान्सविक्यायातक्रियाः नामाभिलेखिताः [[Special:Log/import|आयातसूचिकासु]] स्थापिताः ।",
-       "import-interwiki-source": "स्रोतविकि/पुटम्",
        "import-interwiki-history": "एतत्पुटार्थं सर्वेतिहासान् पुनरावृत्तीः च प्रकृतीः करोतु ।",
        "import-interwiki-templates": "प्राकृतीः अनर्भावयतु ।",
        "import-interwiki-submit": "आयातं करोतु ।",
        "exif-urgency-low": "मन्दम् ।$1",
        "exif-urgency-high": "उन्नतम् ($1)",
        "exif-urgency-other": "योजकनिरूपिता आद्यता : $1",
-       "watchlistall2": "सर्वाणि",
        "namespacesall": "सर्वाणि",
        "monthsall": "सर्वाणि",
        "confirmemail": "ईपत्रसङ्केतः प्रमाणीक्रियताम्",
        "watchlisttools-view": "योग्यपरिवर्तनानि दृश्यन्ताम्",
        "watchlisttools-edit": "अवेक्षणाऽऽवलिः दृश्यतां, सम्पाद्यतां च",
        "watchlisttools-raw": "विवरणरहिता अवलोकनावलिः सम्पाद्यताम्",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|à¤\85म्भाषणम्]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|सम्भाषणम्]])",
        "unknown_extension_tag": "अज्ञातं वर्तमानसूत्रम् $1",
        "duplicate-defaultsort": "'''पूर्वसूचना''' \"$1\" इति पुरातनं मूलक्रमाङ्कनकुड्मलं विहाय  \"$2\" इति नवीनं मूलक्रमाङ्कनकुण्डलत्वेन स्वयमेव नयति एतत् ।",
        "version": "आवृत्तिः",
        "logentry-rights-rights-legacy": "$1, $3 इत्यस्मै समूहसदस्यतां पर्यवर्तयत्",
        "logentry-rights-autopromote": "$1 इत्ययं स्वचालितरूपेण $4 इत्यतः $5 इति यावत् पदोन्नतः",
        "rightsnone": "(कतम)",
+       "revdelete-summary": "सम्पादनसांक्षेपिक",
        "feedback-bugornote": "यदि भवान् कस्याश्चित् तान्त्रिकसमस्यायाः विषये विशदीकर्तुम् इच्छति तर्हि [$1 मत्कुणसञ्चिकां करोतु ।]\nअन्यथा चेत् भवान् सरलप्रपत्रम् उपयोक्तुं शक्नोति । भवतः टीका योजकनाम्ना सह भवतः जालगवाक्षेन सह  \"[$3 $2]\" इत्यस्मिन् पुटे योज्यते ।",
        "feedback-subject": "विषय:",
        "feedback-message": "संदेश:",
index 415c1c6..0c888be 100644 (file)
@@ -26,6 +26,7 @@
        "tog-watchdefault": "Уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
        "tog-watchmoves": "Аатын уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
        "tog-watchdeletion": "Соппут сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
+       "tog-watchrollback": "Төннөрбүт сирэйдэрбин кэтэбилим тиһигэр киллэрэн ис",
        "tog-minordefault": "Уларытыылары атын этиллибэтэҕинэ кыра уларытыы курдук бэлиэтээ",
        "tog-previewontop": "Хайдах буоларын уларытар түннүк үрдүнэн (иннигэр) көрдөр",
        "tog-previewonfirst": "Хайдах буоларын тута көрдөр",
        "hidetoc": "көрдөрүмэ",
        "collapsible-collapse": "Сабыы",
        "collapsible-expand": "Тэнитии",
+       "confirmable-confirm": "{{GENDER:$1|Бигэргэтэҕин}} дуо?",
+       "confirmable-yes": "Сөп",
+       "confirmable-no": "Суох",
        "thisisdeleted": "$1 көрдөрөбүн эбэтэр хостуубун дуу?",
        "viewdeleted": "$1 көрдөрөбүн?",
        "restorelink": "{{PLURAL:$1|биир сотторуллубут көннөрүү|$1 сотторуллубут көннөрүүлэр}}",
        "databaseerror-text": "Билии олоҕор алҕас таҕыста.\nБырагыраамма алҕаһа буолуон сөп.",
        "databaseerror-textcl": "Билии олоҕор алҕас таҕыста.",
        "databaseerror-query": "Ыйытык: $1",
+       "databaseerror-function": "Функция: $1",
        "databaseerror-error": "Алҕас: $1",
        "laggedslavemode": "Болҕой: Бу сирэй бүтэһик уларытыылара суох буолуон сөп",
        "readonly": "Билии олоҕун уларытар бобуллубут",
        "invalidtitle-knownnamespace": "«$2» аат далыгар маннык тиэкистээх «$3» сатаммат аат",
        "invalidtitle-unknownnamespace": "Биллибэт аат дала $1 нүөмэрдээх, \"$2\" тиэкистээх сатаммат аат",
        "exception-nologin": "Ааккын билиһиннэрбэтэххин",
-       "exception-nologin-text": "Маны көрөргө эбэтэр оҥорорго [[Special:Userlogin|ааккын билиһиннэриэхтээххин]].",
+       "exception-nologin-text": "Маны көрөргө эбэтэр оҥорорго ааккын билиһиннэриэхтээххин.",
        "exception-nologin-text-manual": "Көрөргө эбэтэр оҥорорго маны гыныахтааххын: $1.",
        "virus-badscanner": "Сатаммата. Вирус сканера биллибэтэ: ''$1''",
        "virus-scanfailed": "скан сыыһата (куода $1)",
        "passwordreset-emailsent-capture": "Киирии тылы уларытар туһунан сурук аллара эмиэ көрдөрүлүннэ.",
        "passwordreset-emailerror-capture": "Манна киирии тылы уларытар туһунан сурук көрдөрүлүннэ. Ол эрэн сурук бу төрүөттэн $2 кыттааччыга сатаан барбата: $1",
        "changeemail": "Ааадырыһын уларыт",
-       "changeemail-header": "Аадырыһын уларытыы",
        "changeemail-text": "Бу форманы толорон аадырыскын уларыт. Уларытыыны бигэргэтэргэ киирии тылгын киллэриэхтээххин.",
        "changeemail-no-info": "Бу сирэйгэ чопчу тиийэргэ, тиһиликкэ бэлиэтэммит ааккын этиэхтиэххин.",
        "changeemail-oldemail": "Билиҥҥи аадырыс:",
        "changeemail-none": "(суох)",
        "changeemail-password": "{{SITENAME}} ситим-сиргэ киирэр тылыҥ:",
        "changeemail-submit": "Аадырыһы уларыт",
-       "changeemail-cancel": "Тохтот",
        "changeemail-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
        "resettokens": "Токеннары бырах",
        "resettokens-text": "Бу ситим-сиргэ бэлиэтэммит ааккын кытта ситимнээх токеннары сотуоххун сөп.\n\nАлҕас кимиэхэ эрэ биэрэн кэбиспит буоллаххына эбэтэр ким эрэ эн ааккынан алдьатан киирбит буоллаҕына маны туһаныахха сөп.",
        "preview": "Холоон көрүү",
        "showpreview": "Уларытыах иннинэ көрүү",
        "showdiff": "Уларытыылар",
+       "blankarticle": "<strong>Сэрэтии:</strong> Оҥорор сирэйиҥ кураанах.\nБу тимэҕи «{{int:savearticle}}» хос баттаатаххына кураанах сирэй оҥоһуллуо.",
        "anoneditwarning": "'''Болҕой:''' Системаҕа киирбэтэххин. Онон аатыҥ оннугар IP аадаырыһыҥ бу сирэй историятыгар киириэ.",
        "anonpreviewwarning": "''Эн тиһиккэ ааккын эппэттэххин. Уларытыыгын бигэргэттэххинэ IP-аадырыһыҥ сирэй устуоруйатыгар суруллуо.''",
        "missingsummary": "'''Санатыы:''' Уларыппытыҥ кылгас быһаарыытын суруйбатаххын. Уларытыыны бигэргэттэххинэ улартытыыҥ хос быһаарыыта суох барыа.",
        "parser-template-recursion-depth-warning": "($1) халыып рекурсиятын муҥура бүппүт (Превышен предел глубины рекурсии)",
        "language-converter-depth-warning": "Тыл конвертерын дириҥин хааччаҕа куоһарыллыбыт ($1)",
        "node-count-exceeded-category": "Түмүктэрин ахсаана аһара барбыт сирэйдэр",
+       "node-count-exceeded-category-desc": "Сирэй түмүгүн ахсаана сиэри таһынан барбыт.",
        "node-count-exceeded-warning": "Сирэй түмүгүн ахсаана таһынан барбыт",
        "expansion-depth-exceeded-category": "Аһыллыытын дириҥэ куоһарыллыбыт сирэйдэр",
+       "expansion-depth-exceeded-category-desc": "Сирэй аһыллыытын дириҥэ куоһарыллыбыт.",
        "expansion-depth-exceeded-warning": "Сирэйгэ угуллубут билэлэр аһара элбээбиттэр",
        "parser-unstrip-loop-warning": "Сабыллыбатах pre көһүннэ",
        "parser-unstrip-recursion-limit": "Рекурсия ахсаана таһынан барбыт ($1)",
        "cantcreateaccounttitle": "Саҥа ааты киллэрэр сатаммат",
        "cantcreateaccount-text": "[[User:$3|$3]] кыттааччы бу IP-ттан ('''$1''') саҥа бэлиэтэниини бопто.\n\nБыһаарыыта: $3 - ''$2''",
        "cantcreateaccount-range-text": "Бу IP-диапазонтан '''$1''' ааты бэлиэтиири [[User:$3|$3]] боппут. Эн IP-аадырыһыҥ ('''$4''') онно киирсэр эбит. \n\nЫйыллыбыт төрүөтэ: $2.",
-       "viewpagelogs": "Бу сирэй историятын көрдөр",
+       "viewpagelogs": "Бу сирэй сурунаалларын көрүү",
        "nohistory": "Бу сирэй историята суох эбит.",
        "currentrev": "Билиҥҥи барыл",
        "currentrev-asof": "Билиҥҥи торум манна: $1",
        "revisionasof": "$1 барыл",
-       "revision-info": "Ð\92еÑ\80Ñ\81иÑ\8f Ð¾Ñ\82 $1; $2",
+       "revision-info": "Ð\91аÑ\80Ñ\8bл $1; {{GENDER:$6|$2}}$7",
        "previousrevision": "←Инники барыл",
        "nextrevision": "Аныгыскы барыл→",
        "currentrevisionlink": "Билиҥҥи барыл",
        "rev-deleted-event": "(бэлиэтээһин дьайыыта сотулунна)",
        "rev-deleted-user-contribs": "[кыттааччы аата эбэтэр IP-аадырыһа сотуллубуттар — уларытыы көстүбэт оҥоһуллубут]",
        "rev-deleted-text-permission": "Сирэй бу барыла '''сотуллубут'''.\nБыһаарыыта  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} манна] баар буолуон сөп.",
+       "rev-suppressed-text-permission": "Сирэй бу барыла <strong>кистэммит</strong>.\nБыһаарыы [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} кистээһин сурунаалыгар] баар.",
        "rev-deleted-text-unhide": "Сирэй ити барыла '''сотуллубут'''.\nБаҕар ол туһунан [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} сотуу сурунаалыгар] баара буолуо.\nОл да буоллар эн дьаһабыл буоларыҥ быһыытынан [$1 барылы көрүөххүн сөп].",
        "rev-suppressed-text-unhide": "Сирэй бу барыла '''кистэммит'''.\nБыһаарыы баҕара [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} кистээһин сурунаалыгар] баара буолуо.\nЭн дьаһабыл буоларыҥ быһыытынан [ол барылы көрүөххүн $1] сөп.",
        "rev-deleted-text-view": "Ыстатыйа бу барыла '''сотуллубут'''.\nОл эрэн ону көрүөххүн сөп.\nТоҕо сотуллубутун быһаарыыта [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} манна] баар буолуон сөп.",
        "revdelete-text-text": "Сотуллубут барыллар уруккутун курдук сирэй устуоруйатыгар көстүөхтэрэ, ол эрэн иһинээҕитэ сорҕото киэҥ эйгэҕэ көрдөрүллүө суоҕа.",
        "revdelete-text-file": "Билэ сотуллубут барыллара уруккутун курдук сирэй устуоруйатыгар көстүөхтэрэ, ол эрэн иһинээҕитэ сорҕото киэҥ эйгэҕэ көрдөрүллүө суоҕа.",
        "logdelete-text": "Сурунаалтан сотуллубут уруккутун курдук сурунаал устуоруйатыгар көстүөҕэ, ол эрэн иһинээҕитин сорҕото киэҥ эйгэҕэ көрдөрүллүө суоҕа.",
-       "revdelete-text-others": "Өскөтүн эбии хааччах турбатах буоллаҕына, {{grammar:genitive|{{SITENAME}}}} атын дьаһабыллара урукку курдук кистэммити көрөр уонна чөлүгэр түһэрэр кыахтаахтар.",
+       "revdelete-text-others": "Өскөтүн эбии хааччах турбатах буоллаҕына, атын дьаһабыллар урукку курдук кистэммити көрөр уонна чөлүгэр түһэрэр кыахтаахтар.",
        "revdelete-confirm": "Бука диэн кырдьык бу дьайыыны онороргун, содула туох буоларын өйдүүргүн уонна [[{{MediaWiki:Policy-url}}|сиэри]] тутуһаргын бигэргэт.",
        "revdelete-suppress-text": "Кистээһин маннык түбэлтэлэргэ '''эрэ''' оҥоһуллар:\n* Баһааҕырдар буолуон сөптөөҕү суруйуу\n* Киһи бэйэтин туһунан тоҕооһо суохтук суруллубут буоллаҕына\n*: <em>дьиэтин аадырыһа, төлөппүөннэрин нүөмэрэ, пааспарын нүөмэрэ уо.д.а.</em>",
        "revdelete-legend": "Хааччахтары туруоруу:",
        "searchall": "бары",
        "showingresults": "Манна {{PLURAL:$1|түмүк|түмүктэр}} {{PLURAL:$1|көрдөрүлүннэ|көрдөрүлүннүлэр}} <strong>$1</strong> , мантан саҕалаан №&nbsp;<strong>$2</strong>.",
        "showingresultsinrange": "Манна {{PLURAL:$1|<strong>1</strong> түмүк|<strong>$1</strong> түмүк}} мантан саҕалаан <strong>$2</strong> маныаха дылы <strong>$3</strong> көрдөрүлүннэ.",
-       "showingresultsheader": "'''$4''' анаммыт {{PLURAL:$5|мантан '''$3''' түмүгэ - '''$1'''|мантан '''$3''' түмүктэрэ '''$1 - $2'''}}",
        "search-nonefound": "Көрдөбүлгэ эппиэттиир билэлэр көстүбэтилэр.",
        "powersearch-legend": "Дириҥэтэн көрдөөһүн",
        "powersearch-ns": "Аат далыгар көрдөө:",
        "randomincategory": "Категория түбэспиччэ ыстатыйата",
        "randomincategory-invalidcategory": "\"$1\" диэн категория суох эбит.",
        "randomincategory-nopages": "Бу категорияҕа [[:Category:$1]] киирэр ыстатыйалар суохтар.",
-       "randomincategory-selectcategory": "Категория түбэспиччэ сирэйигэр көс: $1 $2.",
-       "randomincategory-selectcategory-submit": "Көс",
        "randomredirect": "Түбэспиччэ утаарыы",
        "randomredirect-nopages": "Бу аат далыгар($1) көһөрөр ыйынньыктар суохтар.",
        "statistics": "Статистика",
        "querypage-disabled": "Бу анал сирэй тиһилик үлэтин түргэтэтээри араарыллыбыт.",
        "booksources": "Кинигэлэр источниктара",
        "booksources-search-legend": "Кинигэ туһунан көрдөө",
-       "booksources-go": "Бул",
        "booksources-text": "Манна кинигэ туһунан атын саайтарга ыйынньыктар хомулуннулар, онно баҕар эбии информация көстүөҕэ.",
        "booksources-invalid-isbn": "ISBN, арааһа, сыыһалаах. Нүөмэр көһөрөргө алҕас тахсыбатаҕын хат көр эрэ.",
        "specialloguserlabel": "Толорооччу:",
        "wlheader-enotif": "Эл. почтанан биллэрии холбоммут.",
        "wlheader-showupdated": "Бүтэһик киирииҥ кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр.",
        "wlnote": "Манна кэлиҥҥи {{PLURAL:$2|чаас|'''$2''' чаас}} иһигэр оҥоһуллубут бүтэһик $1 уларытыы көрдөрүлүннэ, бу кэмҥэ туругунан $3 $4.",
-       "wlshowlast": "бүтэһик $1 чааска $2 күҥҥэ $3 көрдөр",
+       "wlshowlast": "бүтэһик $1 чааска $2 күҥҥэ  көрдөр",
        "watchlist-options": "Кэтээн көрүү туруоруутун уларытыы",
        "watching": "Кэтээ...",
        "unwatching": "Кэтээмэ...",
        "import": "Сирэйдэри импортааһын",
        "importinterwiki": "Биики ыккардынааҕы импорт",
        "import-interwiki-text": "Биикини уонна импортанар сирэй аатын киллэр.\nУларытыылар күннэрэ-ыйдара уонна аапптардар ааттара оннуларынан хаалыахтара.\nБиики ыккардынааҕы импорт дьайыылара [[Special:Log/import|аналлаах сурунаалга]] суруллаллар.",
-       "import-interwiki-source": "Ылыллыбыт биикитэ/сирэйэ:",
        "import-interwiki-history": "Сирэй туох баар историятын көһөрөргө",
        "import-interwiki-templates": "Бары халыыптары киллэр",
        "import-interwiki-submit": "Импортаа",
        "exif-urgency-low": "Намыһах ($1)",
        "exif-urgency-high": "Үрдүк ($1)",
        "exif-urgency-other": "Кыттааччы эппит приоритета ($1)",
-       "watchlistall2": "бары",
        "namespacesall": "бары",
        "monthsall": "бары",
        "confirmemail": "Электроннай аадырыһы бигэргэтии",
        "logentry-rights-rights-legacy": "$3 бөлөхтөргө киириитин $1 уларыппыт",
        "logentry-rights-autopromote": "$1 мантан $4 манна $5 көһөрүллүбүт",
        "rightsnone": "(суох)",
+       "revdelete-summary": "уларытыылар туһунан",
        "feedback-bugornote": "Туох кыһалҕаны көрсүбүккүн сиһилии суруйар кыахтаах буоллаххына, бука диэн [$1 алҕас туһунан биллэр].\nОл сатаммат буоллаҕына бу судургу форманы толор. Эн этииҥ ааккын уонна туһанар браузерыҥ аатын кытта манна «[$3 $2]» бэчээттэниэ.",
        "feedback-subject": "Тиэмэ:",
        "feedback-message": "Сурук:",
index 0811190..f3d1606 100644 (file)
        "passwordreset-emailsent-capture": "Mit́ṭen disạ ruaṛaḱ e-mail dokulena, oka do latarre ńeloḱ kana.",
        "passwordreset-emailerror-capture": "Disạ ruạṛ oco lạgit́te mit́ṭen e-mail tear hoelena, oka do latarre udugoḱkana, menkhan $1 beoharić ṭhen  ṭhen baṅ kul hoe akana.",
        "changeemail": "E-mail ṭhikạna do bodolme",
-       "changeemail-header": "Ekaunṭ e-mail ṭhikạna do bodolme",
        "changeemail-text": "Amaḱ e-mail ṭhikạna bodol lạgit́te noa forom purao me. Am do noa sariyaḱ lạgit́te amaḱ oku nambar em jạruṛtama.",
        "changeemail-no-info": "Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.",
        "changeemail-oldemail": "Nitaḱ e-mail ṭhikạna:",
        "changeemail-newemail": "Nãwã e-mail ṭhikạna:",
        "changeemail-none": "(Okaṭaḱ hõ baṅ)",
        "changeemail-submit": "E-mail bodolme",
-       "changeemail-cancel": "Badme",
        "bold_sample": "Moṭa onol",
        "bold_tip": "Moṭa onol",
        "italic_sample": "Beka onol",
        "search-interwiki-more": "(Arhõ)",
        "searchrelated": "songenko",
        "searchall": "Sanam",
-       "showingresultsheader": "'''$4'''  lạgit́ {{PLURAL:$5|Pho̠l ńamoḱ́akan - '''$1''' of '''$3'''|Pho̠l ńamoḱ́akan '''$1 - $2''' of '''$3'''}}",
        "search-nonefound": "Kupuli leka roṛruạṛ bạnuḱa",
        "powersearch-togglelabel": "Sendra",
        "powersearch-toggleall": "Sanamaḱ",
        "pager-older-n": "{{PLURAL:$1 arhõ mare 1ṭen arhõ mare $1ṭen}}",
        "booksources": "Puthi ńamoḱ ṭhại/jayga",
        "booksources-search-legend": "Puthi reak ṭhai sendrayme",
-       "booksources-go": "Calaḱme",
        "log": "Cạbiko",
        "allpages": "joto sakam",
        "allarticles": "Sanam sakam",
        "watch": "Ńelme",
        "unwatch": "bang nelok' a",
        "watchlist-details": "Baṅ purạo tạlikare {{PLURAL:$1ṭen sakam $1 ṭen sakam}} menaḱa (roṛ sakamko lekhare baṅ sapkate)",
-       "wlshowlast": "Mucạtet́ udukmẽ $1 baje $2 maha $3",
+       "wlshowlast": "Mucạtet́ udukmẽ $1 baje $2 maha",
        "watchlist-options": "Ńelok tạlika reak sonketko",
        "watching": "Ńeloḱ kana...",
        "changed": "Bodolena",
        "exif-imagelength": "Usul",
        "exif-datetime": "Rẽt bodol reaḱ tạrikh ar okte",
        "exif-artist": "Onoliạ",
-       "watchlistall2": "Sanam, sanamak, sanamko",
        "namespacesall": "sanam",
        "monthsall": "Sanamak",
        "watchlisttools-view": "Jońgṛao bodolaḱko ńel",
index 12e911f..5e41676 100644 (file)
                        "Taxandru"
                ]
        },
-       "tog-underline": "Sutalìnia sos ligàmenes",
+       "tog-underline": "Sutalìnia sos ligòngios",
        "tog-hideminor": "Cua is acontzos minores in sa pàgina de is ùrtimas mudàntzias",
-       "tog-hidepatrolled": "Cua sos càmbios verificados in sos ùrtimos càmbios",
+       "tog-hidepatrolled": "Cua is mudas verificadas in is ùrtimos càmbios",
        "tog-newpageshidepatrolled": "Cua sas pàginas verificadas dae sa lista de sas pàginas noas",
-       "tog-extendwatchlist": "Ammània sa watchlist pro ammustrare totu sos càmbios, non sos prus reghentes ebbia",
+       "tog-extendwatchlist": "Ammània sa watchlist pro ammustrare totus sos càmbios, non sos prus reghentes ebbia",
        "tog-usenewrc": "Pone in pare sos càmbios de cada pàgina in sos ùrtimos càmbios e in sa watchlist",
        "tog-numberheadings": "Auto-numeratzione de sos tìtulos",
        "tog-showtoolbar": "Ammustra sa mustra de sa barra de sas ainas",
        "tog-editondblclick": "Càmbia pàginas cun duos click",
        "tog-editsectiononrightclick": "Abìlita su càmbiu de sas setziones cun click de dereta in sos tìtulos de sas setziones",
-       "tog-watchcreations": "Agiunghe sas pàginas chi apo creadu e sos documentos chi apo carrigadu in sa watchlist mea",
-       "tog-watchdefault": "Agiunghe pàginas e documentos chi apo cambiadu in sa watchlist mea",
-       "tog-watchmoves": "Agiunghe pàginas e documentos chi apo mòvidu in sa watchlist mea",
-       "tog-watchdeletion": "Agiunghe pàginas e documentos chi apo fuliadu in sa watchlist mea",
-       "tog-minordefault": "Marca comente minores pro difetu totu sos càmbios",
+       "tog-watchcreations": "Annanghe is pàginas chi apo creadu e is documentos chi apo carrigadu in sa lista de pàginas annotadas mea",
+       "tog-watchdefault": "Annanghe pàginas e documentos chi apo cambiadu in sa lista de pàginas annotadas mea",
+       "tog-watchmoves": "Annanghe pàginas e documentos chi apo mòvidu in sa lista de pàginas annotadas mea",
+       "tog-watchdeletion": "Annanghe pàginas e documentos chi apo burradu in sa lista de pàginas annotadas mea",
+       "tog-watchrollback": "Pone is pàginas innue apo fatu su rollback in is pàginas annotadas",
+       "tog-minordefault": "Marca comente minores pro difetu totus sos càmbios",
        "tog-previewontop": "Ammustra s'anteprima in subra de sa casella de càmbiu e no in suta",
-       "tog-previewonfirst": "Ammustra s'anteprima pro su primu càmbiu",
+       "tog-previewonfirst": "Ammustra s'anteprima pro sa prima muda",
        "tog-enotifwatchlistpages": "Imbia·mi una post.el. cando b'at àpidu unu càmbiu in una pàgina o in unu documentu de sa watchlist mea",
        "tog-enotifusertalkpages": "Imbia·mi una post.el. cando sa pàgina de sas cuntierras meas est cambiada",
        "tog-enotifminoredits": "Imbia·mi una post.el. fintzas pro sos càmbios minores de sas pàginas e documentos",
        "tog-enotifrevealaddr": "Faghe ischire s'indiritzu de sa post.el. mea in sas notìficas de sa post.els",
-       "tog-shownumberswatching": "Ammustra su nùmeru de sos utentes chi sunt castiende sa pàgina",
+       "tog-shownumberswatching": "Ammustra su nùmeru de is impitadores chi ant annotadu sa pàgina",
        "tog-oldsig": "Firma atuale:",
-       "tog-fancysig": "Trata sa firma comente unu testu wiki (sena ligàmenes automàticos)",
+       "tog-fancysig": "Trata sa firma comente unu testu wiki (sena ligòngios automàticos)",
        "tog-uselivepreview": "Imprea sa funtzione \"anteprima bia\" (isperimentale)",
        "tog-forceeditsummary": "Averte·mi si su campu ogetu est bòidu",
-       "tog-watchlisthideown": "Cua sos càmbios meos dae sa watclist",
-       "tog-watchlisthidebots": "Cua sos càmbios de sos bots dae sa watchlist",
+       "tog-watchlisthideown": "Cua sas mudas meas dae sa watclist",
+       "tog-watchlisthidebots": "Cua sas mudas de sos bots dae sa watchlist",
        "tog-watchlisthideminor": "Cua sos càmbios minores dae sa watchlist",
-       "tog-watchlisthideliu": "Cua sos càmbios de sos utentes intrados dae sa watchlist",
-       "tog-watchlisthideanons": "Cua sos càmbios de sos utentes anònimos dae sa watchlist",
-       "tog-watchlisthidepatrolled": "Cua càmbios verificados dae sa watchlist",
-       "tog-ccmeonemails": "Imbia·mi sas còpias de sas post.els chi imbio a sos àteros utentes",
+       "tog-watchlisthideliu": "Cua is càmbios de is impitadores identificados dae sa lista de pàginas annotadas",
+       "tog-watchlisthideanons": "Cua is càmbios de is impitadores anònimos dae sa lista de pàginas annotadas",
+       "tog-watchlisthidepatrolled": "Cua mudas verificadas dae sa watchlist",
+       "tog-ccmeonemails": "Imbia·mi sas còpias de is emails chi imbio a is àteros impitadores",
+       "tog-diffonly": "No ammustras su cuntènnidu de sa pàgina a pustis de sa bisura de is diferèntzias",
        "tog-showhiddencats": "Ammustra sas categorias cuadas",
-       "tog-useeditwarning": "Amonestamì si lassu una pagina cun mudantzias chena de sarvai.",
+       "tog-norollbackdiff": "Cua sa bisura de is diferèntzias a pustis de su rollback",
+       "tog-useeditwarning": "Averte·mi si lassu una pàgina cun càmbios sena de sarbare",
        "tog-prefershttps": "Imprea semper una lìnia segura candu fatzo s'intrada.",
        "underline-always": "Semper",
        "underline-never": "Mai",
        "december-date": "Nadale $1",
        "pagecategories": "{{PLURAL:$1|Categoria|Categorias}}",
        "category_header": "Pàginas in sa categoria \"$1\"",
-       "subcategories": "Subcategorias",
+       "subcategories": "Sutacategorias",
        "category-media-header": "Mèdios in sa categoria \"$1\"",
-       "category-empty": "''In custa categoria non b't peruna pàgina o mèdiu.''",
+       "category-empty": "''In custa categoria non ddu at peruna pàgina o documentu multimediale.''",
        "hidden-categories": "{{PLURAL:$1|Categoria cuada|Categorias cuadas}}",
        "hidden-category-category": "Categorias cuadas",
-       "category-subcat-count": "{{PLURAL:$2|Custa categoria cuntenet un'ùnica subcategoria ammustrada in suta.|Custa categoria cuntenet {{PLURAL:$1|sa subcategoria inditada|$1 subcategorias inditadas}} in suta, de $2 totales.}}",
-       "category-subcat-count-limited": "Custa categoria tenet {{PLURAL:$1|una subcategoria, ammustrada|$1 subcategorias, ammustradas}} in suta.",
-       "category-article-count": "{{PLURAL:$2|Custa categoria cuntenet feti sa pàgina chi sighit.|Custa categoria cuntenet {{PLURAL:$1|sa pàgina inditada|is $1 pàginas inditadas}} in suta, dae unu totale de $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|Custa categoria cuntennet un'ùnica sutacategoria ammustrada in suta.|Custa categoria cuntenet {{PLURAL:$1|sa sutacategoria indicada|$1 sutacategorias indicadas}} in suta, dae $2 in totu.}}",
+       "category-subcat-count-limited": "Custa categoria tenet {{PLURAL:$1|una sutacategoria, ammustrada|$1 sutacategorias, ammustradas}} in suta.",
+       "category-article-count": "{{PLURAL:$2|Custa categoria cuntenet feti sa pàgina chi sighit.|Custa categoria cuntenet {{PLURAL:$1|sa pàgina indicada|is $1 pàginas indicadas}} in suta, dae unu totale de $2.}}",
        "category-article-count-limited": "{{PLURAL:$1|Sa pàgina chi sighit est|Is $1 pàginas chi sighint sunt}} in custa categoria.",
        "category-file-count": "{{PLURAL:$2|Custa categoria cuntenet feti su documentu chi sighit.|{{PLURAL:$1|Su documentu chi sighit est|Is $1 documentos chi sighint sunt}} in custa categoria, dae $2 totales.}}",
        "category-file-count-limited": "{{PLURAL:$1|Su documentu chi sighit est|Is $1 documentos chi sighint sunt}} in sa categoria currente.",
        "listingcontinuesabbrev": "sighit",
        "index-category": "Pàginas inditzizadas",
        "noindex-category": "Pàginas no inditzitzadas",
-       "broken-file-category": "Pàginas cun ligàmenes a sos documentos non funtzionantes",
+       "broken-file-category": "Pàginas chi ligant a documentos chi no esistint",
        "about": "A propòsitu de",
        "article": "Artìculu",
-       "newwindow": "(aberit in una ventana noa)",
+       "newwindow": "(aberret in una bentana noa)",
        "cancel": "Burra",
        "moredotdotdot": "Àteru…",
        "morenotlisted": "Sa lista no est cumpreta",
        "mypage": "Pàgina",
-       "mytalk": "Cuntierras meas",
+       "mytalk": "Cuntierras mias",
        "anontalk": "Cuntierras pro custu indiritzu IP",
        "navigation": "Navigatzione",
        "and": "&#32;e",
        "qbedit": "Càmbia",
        "qbpageoptions": "Possibilidades de sa pàgina",
        "qbmyoptions": "Sas preferèntzias meas",
-       "faq": "Pregontas/Rispostas (FAQ)",
+       "faq": "Pregontas fitianas",
        "faqpage": "Project:FAQ",
        "actions": "Atziones",
        "namespaces": "Nùmene-logos",
        "history_short": "Istòria",
        "updatedmarker": "atualizada dae s'ùrtima vìsita mea",
        "printableversion": "Versione de imprenta",
-       "permalink": "Ligàmene permanente",
+       "permalink": "Ligòngiu permanente",
        "print": "Imprenta",
        "view": "Ammustra",
        "view-foreign": "Ammustra in $1",
        "edit": "Càmbia",
        "edit-local": "Càmbia sa descritzione locale",
        "create": "Crea",
-       "create-local": "Agiunghe descritzione locale",
+       "create-local": "Annanghe descritzione locale",
        "editthispage": "Càmbia custa pàgina",
        "create-this-page": "Crea custa pàgina",
        "delete": "Burra",
        "undeletethispage": "Non burres custa pàgina",
        "undelete_short": "Non burres {{PLURAL:$1|unu càmbiu|$1 càmbios}}",
        "viewdeleted_short": "Ammustra {{PLURAL:$1|unu càmbiu burradu|$1 càmbios burrados}}",
-       "protect": "Ampara",
-       "protect_change": "càmbiu",
+       "protect": "Barda",
+       "protect_change": "càmbia",
        "protectthispage": "Ampara custa pàgina",
        "unprotect": "Muda amparu",
        "unprotectthispage": "Muda amparu de custa pàgina",
        "personaltools": "Ainas personales",
        "articlepage": "Càstia s'artìculu",
        "talk": "Cuntierras",
-       "views": "Vistas",
+       "views": "Bìsitas",
        "toolbox": "Ainas",
-       "userpage": "Càstia sa pàgina utente",
+       "userpage": "Càstia sa pàgina impitadore",
        "projectpage": "Càstia sa pàgina meta",
        "imagepage": "Càstia sa pàgina de su documentu",
        "mediawikipage": "Càstia su messàgiu",
        "otherlanguages": "Àteras limbas",
        "redirectedfrom": "(Reindiritzadu dae $1)",
        "redirectpagesub": "Pàgina de reindiritzamentu",
+       "redirectto": "Reindiritzat a:",
        "lastmodifiedat": "Ùrtimu càmbiu su $1, a is $2.",
        "viewcount": "Custu artìculu l'ant lèghidu {{PLURAL:$1|borta|$1 bortas}}.",
        "protectedpage": "Pàgina amparada",
        "jumpto": "Bae a:",
        "jumptonavigation": "navigatzione",
        "jumptosearch": "chirca",
-       "view-pool-error": "Tene passèntzia, sos servidores sunt càrrigos de traballu.\nIn medas chircant de castiare custa pàgina.\nPro praghere, torra a provare luego.\n\n$1",
+       "view-pool-error": "Tene passèntzia, sos servidores sunt càrrigos de traballu.\nIn medas chircant de castiare custa pàgina.\nPro praghere, torra a tenteare posca.\n\n$1",
        "generic-pool-error": "Tene passèntzia, sos servidores sunt càrrigos de traballu.\nIn medas chircant de castiare custa risorsa.\nPro praghere, torra a provare luego.",
+       "pool-timeout": "Timeout abetende pro s'arreu",
+       "pool-queuefull": "Sa coa pro su traballu de su protzessu est prena",
        "pool-errorunknown": "Faddina disconnota",
+       "pool-servererror": "Su servìtziu de contadore de su protzessu no est disponìbile ($1).",
        "aboutsite": "A propòsitu de {{SITENAME}}",
        "aboutpage": "Project:Informatziones",
        "copyright": "Cuntenutu suta de lissèntzia $1.",
        "mainpage-description": "Pàgina Base",
        "policy-url": "Project:Polìticas",
        "portal": "Portale comunidade",
-       "portal-url": "Project:Portale Comunidade",
-       "privacy": "Polìtica pro sos datos privados",
-       "privacypage": "Project:Polìtica pro sos datos privados",
+       "portal-url": "Project:Portale comunidade",
+       "privacy": "Polìtica pro is datos privados",
+       "privacypage": "Project:Polìtica pro is datos privados",
        "badaccess": "Permissu non bastante",
        "badaccess-group0": "Non ses autorizadu a fàghere s'atzione chi boles",
-       "badaccess-groups": "S'atzione chi boles est limitada a utentes in {{PLURAL:$2|su grupu|unu de sos grupos}}: $1.",
+       "badaccess-groups": "S'atzione chi as rechestu est limitada a impitadores in {{PLURAL:$2|su grupu|unu de is grupos}}: $1.",
        "versionrequired": "Bi bolet sa version $1 de MediaWiki",
        "versionrequiredtext": "Bi bolet sa versione $1 de MediaWiki pro impreare custa pàgina.\nCàstia [[Special:Version|version page]].",
        "ok": "Andat bene",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "retrievedfrom": "Bogadu dae  \"$1\"",
        "youhavenewmessages": "Tenes $1 ($2).",
-       "youhavenewmessagesmanyusers": "Tenes $1 dae utentes ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Tenes}} $1 dae {{PLURAL:$3|un'àteru impitadore|$3 impitadores}} ($2).",
+       "youhavenewmessagesmanyusers": "Tenes $1 dae unos cantos impitadores ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|unu messàggiu nou|999=messàggios noos}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|ùrtima muda|999=ùrtimas mudàntzias}}",
        "youhavenewmessagesmulti": "Tenes messàgios noos in $1",
        "editsection": "càmbia",
        "editold": "càmbia",
        "editlink": "càmbia",
        "viewsourcelink": "càstia testu codificadu",
        "editsectionhint": "Càmbia sa setzione: $1",
-       "toc": "Cuntenutu",
+       "toc": "Cuntènnidu",
        "showtoc": "ammustra",
        "hidetoc": "cua",
        "collapsible-collapse": "Serra e istringhe",
        "collapsible-expand": "Aberi",
+       "confirmable-confirm": "Ses {{GENDER:$1|seguru|segura}}?",
        "confirmable-yes": "Eja",
        "confirmable-no": "No",
        "thisisdeleted": "Càstiare o recuperare $1?",
        "viewdeleted": "Vista $1?",
        "restorelink": "{{PLURAL:$1|unu càmbiu burradu|$1 càmbios burrados}}",
        "feedlinks": "Alimentatzione:",
+       "feed-invalid": "Tipu de canale de sutiscritzione invàlida.",
+       "feed-unavailable": "Non sunt disponìbiles feeds",
        "site-rss-feed": "Feed Atom de $1",
        "site-atom-feed": "Feed Atom de $1",
        "page-rss-feed": "Feed RSS pro \"$1\"",
        "sort-descending": "Òrdine in falada",
        "sort-ascending": "Òrdine in artziada",
        "nstab-main": "Pàgina",
-       "nstab-user": "Pàgina utente",
+       "nstab-user": "Pàgina impitadore",
        "nstab-media": "Documentu multimediale",
        "nstab-special": "Pàgina ispetziale",
        "nstab-project": "Pàgina de servìtziu",
        "nstab-image": "Documentu",
        "nstab-mediawiki": "Messàgiu",
-       "nstab-template": "Modellu",
+       "nstab-template": "Template",
        "nstab-help": "Agiudu",
        "nstab-category": "Categoria",
        "nosuchaction": "No esistit custa atzione",
-       "nosuchactiontext": "S'atzione ispetzificada in sa URL no est vàlida.\nEst possìbile chi sa URL siat istada carcada male, o si siat sighidu unu ligàmene non vàlidu.\nCustu diat pòdere èssere unu \"bug\" de {{SITENAME}}.",
+       "nosuchactiontext": "S'atzione ispetzificada in sa URL no est vàlida.\nEst possìbile chi sa URL siat istada carcada male, o si siat sighidu unu ligòngiu non vàlidu.\nCustu diat pòdere èssere unu \"bug\" de {{SITENAME}}.",
        "nosuchspecialpage": "Custa pàgina ispetziale no esistit",
-       "nospecialpagetext": "<strong>As pedidu una pàgina ispetziale non vàlida.</strong>\n\nUna lista de pàginas ispetziales vàlidas l'agatas in [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>As pedidu una pàgina ispetziale non vàlida.</strong>\n\nUna lista de pàginas ispetziales vàlidas dd'agatas in [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Faddina",
-       "databaseerror": "Faddina de sa base de datos",
+       "databaseerror": "Faddina de su database",
+       "databaseerror-text": "B'est istadu un'errore cun una rechesta a sa base de sos datos.\nCustu podet indicare unu problema in su programma.",
+       "databaseerror-textcl": "B'est istadu un'errore cun una rechesta a sa base de sos datos.",
+       "databaseerror-query": "Rechesta: $1",
        "databaseerror-function": "Funtzione: $1",
-       "readonly": "Base de datos blocada",
-       "enterlockreason": "Inserta su motivu de su blocu, ispetzifichende su momentu probàbile chi su blocu at a agabbare",
-       "readonlytext": "In custu momentu su database est bloccadu dae aciunturas e àteras modificas, probabilmente pro ordinaria manutentzione a su database, a pustis de custas at a èssere normale torra.\n\nS'aministradore chi dd'at bloccadu at donadu custa ispiegatzione: $1",
-       "missing-article": "Su database no at agatadu su testu de una pàgina ki diat àer agatadu a suta de su nùmene \"$1\" $2.\n\nCustu a su sòlitu si verìficat cando bi est unu ligàmine in sa stòria o in unu cunfrontu intre revisiones de una pàgina ki est stada fuliada.\n\nSi no est custu su casu, s'est agatada una faddina de su software.\nPro praxere signa s'acuntèssidu a unu [[Special:ListUsers/sysop|amministradore]] spetzifichende su URL de sa faddina.",
+       "databaseerror-error": "Faddina: $1",
+       "laggedslavemode": "<strong>Atentzione:</strong> Sa pàgina podet non cuntènnere sos agiornamentos prus novos.",
+       "readonly": "Database bloccadu",
+       "enterlockreason": "Inserta su motivu de su blocu, ispetzifichende su momentu probàbile chi su blocu at a acabbare",
+       "readonlytext": "In custu momentu su database est bloccadu dae aciunturas e àteras modificas, probabilmente pro ordinaria manutentzione a su database, a pustis de custas at a èssere normale torra.\n\nS'amministradore chi dd'at bloccadu at donadu custa ispiegatzione: $1",
+       "missing-article": "Su database no at agatadu su testu de una pàgina chi diat àere agatadu a suta de su nùmene \"$1\" $2.\n\nCustu a su sòlitu si verìficat cando bi est unu ligòngiu in s'istòria o in unu cunfrontu intre revisiones de una pàgina chi est istada fuliada.\n\nSi no est custu su casu, s'est agatada una faddina de su software.\nPro praghere signa s'acontèssidu a unu [[Special:ListUsers/sysop|amministradore]] ispetzifichende su URL de sa faddina.",
        "missingarticle-rev": "(revisione nùmeru: $1)",
        "missingarticle-diff": "(Dif: $1, $2)",
+       "readonly_lag": "Sa base de sos datos (database) est istada arreada automaticamente in su mentres chi sos servidores iscraos si sincronizzana cun su printzipale.",
        "internalerror": "Faddina interna",
        "internalerror_info": "Faddina interna: $1",
        "filecopyerror": "No est stadu possìbile copiare su file \"$1\" comente \"$2\".",
        "filerenameerror": "No est stadu possìbile re-numenare su file \"$1\" in \"$2\".",
        "filedeleteerror": "No est stadu possìbile cantzellare su file \"$1\".",
+       "directorycreateerror": "Non si podet creare sa directory \"$1\".",
        "filenotfound": "No est stadu possìbile agatare \"$1\".",
        "unexpected": "Valore non previstu: \"$1\"=\"$2\".",
        "formerror": "Errore: impossìbile imbiare su modellu",
        "badarticleerror": "Operatzione non cunsentida pro custa pàgina.",
        "cannotdelete": "No est stadu possìbile burrare sa pàgina o su file \"$1\".\nPodet èsser stadu burradu dae calicunu àteru.",
+       "cannotdelete-title": "Impossìbile burrare sa pàgina \"$1\"",
+       "delete-hook-aborted": "Sa burradura est istada annuddada dae su hook de s'estensione.\nNo est istadu datu acrarimentu.",
+       "no-null-revision": "Non si podet creare una versione lulla pro sa pàgina \"$1\"",
        "badtitle": "Tìtulu malu",
-       "badtitletext": "Su tìtulu de sa pàgina ch'as pediu est bùidu, isballiau, o iscritu in is cullegamentus inter-wiki in manera non currègia o cun caràteres no amìtius.",
-       "viewsource": "Càstia testu codificadu",
+       "badtitletext": "Su tìtulu de sa pàgina chi as pregontadu est bùidu, isballiadu, o iscritu in is cullegamentus inter-wiki a manera non currègia.\nPodet cuntènnere uno o unos cantos caràteres no ammìtidos pro is tìtulos.",
+       "perfcached": "Is datos chi sighint sunt in sa memòria \"cache\" e podent èessere no agiornados. Unu màssimu de {{PLURAL:$1|unu resurtu est disponìbile|$1 resurtos sunt disponìbiles}} in sa memòria",
+       "perfcachedts": "Is datos chi sighint sunt in sa memòria \"cache\", s'ùrtimu agiornamentu est de su $2 a is $3. Unu màssimu de {{PLURAL:$4|unu resurtu est disponìbile|$4 resurtos sunt disponìbiles}} in sa memòria",
+       "querypage-no-updates": "Sos agiornamentos pro custa pàgina sunt temporaneamente sessadas.\nSos datos suos no ant a èssere agiornados.",
+       "viewsource": "Càstia mitza",
        "viewsource-title": "Càstia sa mitza de $1",
        "actionthrottled": "Atzione rimandada",
-       "namespaceprotected": "Non tenes su permissu de acontzare is pàginas in su nùmene-lugu '''$1'''.",
+       "actionthrottledtext": "Comente mesura de seguràntzia contra a s'ispam, non podes torrare a fàghere custa atzione tropu ispissu in unu tempus tropu curtzu, e tue as cabuladu custu lìmide.\nPro piaghere torra a proare a pustis de carchi minutos.",
+       "protectedpagetext": "Custa pàgina est istada amparada pro nde prevenner su càmbiu o àteras fatas.",
+       "viewsourcetext": "Podes bìere o copiare su còdighe mitza de custa pàgina:",
+       "viewyourtext": "Càstia e còpia su còdighe mitza de is <strong>mudàntzias tuas</strong> in custa pàgina:",
+       "protectedinterface": "Custa pàgina frunit testu pro s'interfàtzie de su programma de custa wiki, ed est amparada pro prevènnere abusos.\nPro annànghere o cambiare tradutziones pro totus sas wikis, pro piaghere imprea [//translatewiki.net/ translatewiki.net], su progetu MediaWiki de localizatzione.",
+       "editinginterface": "<strong>Atentzione:</strong> Ses modificande una pàgina chi est impreada pro frunire testu de s'interfàtzie pro su programma.\nCàmbios a custa pàgina ant a influentzare sa bisura de s'interfàtzie impitadore pro àteros impitadores in custa wiki.\nPro annànghere o cambiare tradutziones pro totus sas wikis, pro piaghere imprea [//translatewiki.net/ translatewiki.net], su progetu MediaWiki de localizatzione.",
+       "cascadeprotected": "Custa pàgina est istada amparada dae sas modìficas proite est incluida in {{PLURAL:$1|custa pàgina, chi est amparada|custas pàginas, chi sunt amparadas}} cun s'optzione \"a tzurru\" ativada:\n$2",
+       "namespaceprotected": "Non tenes su permissu de cambiare is pàginas in su nùmene-lugu '''$1'''.",
+       "customcssprotected": "Non tenes sos permissos pro cambiare custa pàgina CSS proite cuntènnidi sas impostaduras pessonales de un'àteru impitadore.",
+       "customjsprotected": "Non tenes sos permissos pro cambiare custa pàgina JavaScript proite cuntènnidi sas impostaduras pessonales de un'àteru impitadore.",
+       "mycustomcssprotected": "Non tenes sos permissos pro cambiare custa pàgina CSS.",
+       "mycustomjsprotected": "Non tenes sos permissos pro cambiare custa pàgina JavaScript.",
+       "myprivateinfoprotected": "Non tenes su permissu de cambiare is informatziones privadas tuas.",
+       "mypreferencesprotected": "Non tenes su permissu de cambiare is preferèntzias tuas.",
        "ns-specialprotected": "Is pàginas ispetziales non podent èssere acontzadas.",
+       "titleprotected": "Sa creatzione de una pàgina cun custu tìtulu est istada arreada dae [[User:$1|$1]].\nSa motivatzione est \"<em>$2</em>\".",
+       "invalidtitle-knownnamespace": "Su tìtulu cun nùmene-logu \"$2\" e testu \"$3\" no est bàlidu",
+       "invalidtitle-unknownnamespace": "Su tìtulu cun nùmene-logu disconnotu de nùmeru $1 e testu \"$2\" no est bàlidu",
        "exception-nologin": "Non ses intrau",
+       "exception-nologin-text": "Pro atzèdere a custa pàgina o atzione est netzessàriu a ti identificare.",
+       "exception-nologin-text-manual": "Pro piaghere $1 pro pòder'atzèdere a custa pàgina o atzione.",
+       "virus-badscanner": "Faddina de configuratzione: antivirus disconnotu: <em>$1</em>",
        "virus-scanfailed": "scansione faddida (còdixe $1)",
        "virus-unknownscanner": "antivirus disconnotu:",
        "logouttext": "<strong>As acabadu sa sessione.</strong>\n\nTene contu ca is pàginas ki sunt giai abertas in àteras bentanas podent sighire a pàrrer comente cando fias identificadu, fintzas a cando non ddas renfriscas dae su browser tuo.",
-       "yourname": "Nùmene utente",
-       "userlogin-yourname": "Nùmene usuàriu",
-       "userlogin-yourname-ph": "Inserta su nùmene usuàriu tuo",
-       "createacct-another-username-ph": "Inserta su nùmene usuàriu:",
-       "yourpassword": "Paràula de òrdine:",
+       "welcomeuser": "Benénnidu, $1!",
+       "welcomecreation-msg": "Su contu tuo est istadu creadu.\nSi boles podes cambiare is [[Special:Preferences|prefèntzias tuas]] pro {{SITENAME}}",
+       "yourname": "Nùmene impitadore:",
+       "userlogin-yourname": "Nùmene impitadore",
+       "userlogin-yourname-ph": "Inserta su nùmene impitadore tuo",
+       "createacct-another-username-ph": "Inserta su nùmene impitadore:",
+       "yourpassword": "Password:",
        "userlogin-yourpassword": "Password",
        "userlogin-yourpassword-ph": "Inserta sa password tua",
        "createacct-yourpassword-ph": "Inserta una password",
-       "yourpasswordagain": "Repiti sa paràula de òrdine:",
+       "yourpasswordagain": "Repite sa password:",
        "createacct-yourpasswordagain": "Cunfirma sa password",
        "createacct-yourpasswordagain-ph": "Inserta sa password torra",
-       "remembermypassword": "Ammenta sa paràula de òrdine in custu carculadore (pro unu màssimu de $1 {{PLURAL:$1|die|dies}})",
+       "remembermypassword": "Ammenta sa password in custu navigadore (pro unu màssimu de $1 {{PLURAL:$1|die|dies}})",
+       "userlogin-remembermypassword": "Mantènnemi cullegadu",
+       "userlogin-signwithsecure": "Imprea una cunnessione segura",
        "yourdomainname": "Ispetzìfica su domìniu",
+       "password-change-forbidden": "Non podes cambiare sa password in custa wiki.",
        "login": "Intra",
        "nav-login-createaccount": "Intra / crea contu",
        "userlogin": "Intra / crea contu",
        "logout": "Serra sessione",
        "userlogout": "Essida",
        "notloggedin": "Non ses intradu",
+       "userlogin-noaccount": "Non tenes unu contu?",
+       "userlogin-joinproject": "Registra⋅ti a {{SITENAME}}",
        "nologin": "Non tenes unu contu? '''$1'''.",
        "nologinlink": "Crea unu contu",
        "createaccount": "Crea contu",
        "gotaccount": "Tenes giai unu contu? $1.",
        "gotaccountlink": "Identìfica·ti",
+       "userlogin-resetlink": "As ismentigadu is datos pro s'atzessu?",
+       "userlogin-resetpassword-link": "As ismentigadu sa password?",
+       "userlogin-helplink2": "Agiudu pro s'atzessu",
+       "userlogin-createanother": "Crea un àteru contu",
        "createacct-emailrequired": "Indirutzu Email",
+       "createacct-emailoptional": "Indiritzu email (optzionale)",
+       "createacct-email-ph": "Inserta s'indiritzu email tuo",
+       "createacct-another-email-ph": "Inserta s'indiritzu email",
        "createaccountmail": "Imprea una password a sorte e ispedidda a su indiritzu email ispetzificadu",
+       "createacct-realname": "Nùmene beru (optzionale)",
        "createaccountreason": "Motivu:",
        "createacct-reason": "Motivu",
+       "createacct-reason-ph": "Proite ses creande un àteru contu",
+       "createacct-captcha": "Còmpudu de siguresa",
+       "createacct-imgcaptcha-ph": "Inserta su testu chi bides aissusu",
+       "createacct-submit": "Crea su contu tuo",
+       "createacct-another-submit": "Crea un àteru contu",
+       "createacct-benefit-heading": "{{SITENAME}} est òpera de gente che tue.",
        "createacct-benefit-body1": "{{PLURAL:$1|acontzu|acontzos}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàgina|pàginas}}",
-       "badretype": "Sas paràulas de òrdine chi as insertadu non currispondent.",
-       "userexists": "Su nùmene usuàriu insertadu est giai impreadu.\nSèbera unu nùmene diferente.",
+       "createacct-benefit-body3": "{{PLURAL:$1|contribudore retzente|contribudores retzentes}}",
+       "badretype": "Is passwords chi as insertadu non currispondent.",
+       "userexists": "Su nùmene impitadore insertadu est giai impreadu.\nSèbera unu nùmene diferente.",
        "loginerror": "Faddina de identificatzione",
-       "noname": "Su nùmene utente insertadu no est vàlidu.",
+       "createacct-error": "Faddina in sa creatzione de su contu",
+       "createaccounterror": "Impossìbile creare su contu: $1",
+       "nocookiesnew": "Su contu de s'impitadore est istadu creadu, ma no est istadu possìbile fàghere s'atzessu a {{SITENAME}} proite sos \"cookies\" sunt deativados.\nTorra a proare a pustis de los àere ativados.",
+       "nocookieslogin": "{{SITENAME}} imprea is cookies pro identificare is impitadores.\nTue tenes is cookies disativados.\nAtivaddos e prova torra.",
+       "noname": "Su nùmene impitadore insertadu no est vàlidu.",
        "loginsuccesstitle": "Ti ses identificadu",
-       "loginsuccess": "'''Immoe ses intradu in {{SITENAME}} cun su nùmene utente \"$1\".'''",
-       "nosuchuser": "Non b'at un'utente cun su nùmene \"$1\".\nSos nùmenes utente sunt sensìbiles a sas lìteras mannas.\nVerìfica su nùmene insertadu o [[Special:UserLogin/signup|crea unu contu nou]].",
-       "nouserspecified": "Deves ispetzificare unu nùmene utente.",
+       "loginsuccess": "'''Immoe ses intradu in {{SITENAME}} cun su nùmene impitadore \"$1\".'''",
+       "nosuchuser": "Non b'at impitadore cun su nùmene \"$1\".\nIs nùmenes impitadore sunt sensìbiles a is lìteras mannas.\nVerìfica su nùmene insertadu o [[Special:UserLogin/signup|crea unu contu nou]].",
+       "nosuchusershort": "Non b'est perunu impitadore chi tenet \"$1\" comente nùmene.\nCòmpida su nùmene insertadu.",
+       "nouserspecified": "Depes ispetzificare unu nùmene impitadore.",
+       "login-userblocked": "{{GENDER:$1|Custu impitadore est arreadu|Custa impidadora est arreada}}. Atzessu no adduidu.",
        "wrongpassword": "Sa paràula de òrdine insertada no est bona. Prova torra.",
        "wrongpasswordempty": "No as iscritu sa paràula de òrdine.\nProva torra.",
-       "passwordtooshort": "Sas paràulas de òrdine devent tènnere a su mancu {{PLURAL:$1|1 caràtere|$1 caràteres}}.",
-       "password-name-match": "Sa paràula de òrdine tua devet èssere diferente dae su nùmene utente tuo.",
-       "mailmypassword": "Resetta sa password",
-       "passwordremindertitle": "Servìtziu Password Reminder di {{SITENAME}}",
-       "passwordremindertext": "Calicunu (probabilmenti tue, cun s'indiritzu IP $1) at pediu de arritziri una password noa pro intrare a {{SITENAME}} ($4).\nUna password temporanea pro s'usuàriu \"$2\" est istada impostada a \"$3\".\nChi custu fiat ne is intentziones tuas, depis intrare (log in) e scioberari una password noa.\nSa password temporanea tua at a iscadiri in {{PLURAL:$5|una die|$5 dies}}.\n\nChi non ses istadu a pediri sa password, o chi as torrau a agatare sa password torra e non da depis cambiari prus, non cunsideras custu messagiu e sighi a impreare sa password beccia.",
-       "noemail": "Peruna post.el. resurtat registrada pro s'utente \"$1\".",
-       "passwordsent": "Una paràula de òrdine noa est istada imbiada a s'indiritzu post.el. de s'utente \"$1\".\nPro praghere, cando la retzis identìfica·ti torra.",
+       "passwordtooshort": "Is passwords depent tènner a su mancu {{PLURAL:$1|1 caràtere|$1 caràteres}}.",
+       "password-name-match": "Sa password tua depet èsser diferente dae su nùmene impitadore tuo.",
+       "password-login-forbidden": "S'impreau de custu nùmene impitadore e de custa password est istadu proibidu.",
+       "mailmypassword": "Reseta sa password",
+       "passwordremindertitle": "Servìtziu Password Reminder de {{SITENAME}}",
+       "passwordremindertext": "Calicunu (probabilmenti tue, cun s'indiritzu IP $1) at pediu de arritziri una password noa pro intrare a {{SITENAME}} ($4).\nUna password temporanea pro s'impitadore \"$2\" est istada impostada a \"$3\".\nChi custu fiat ne is intentziones tuas, depis intrare (log in) e scioberari una password noa.\nSa password temporanea tua at a iscadiri in {{PLURAL:$5|una die|$5 dies}}.\n\nChi non ses istadu a pediri sa password, o chi as torrau a agatare sa password torra e non da depis cambiari prus, non cunsideras custu messagiu e sighi a impreare sa password beccia.",
+       "noemail": "Peruna email resurtat registrada pro s'impitadore \"$1\".",
+       "noemailcreate": "Bisòngiat a frunire un'indiritzu email vàlidu.",
+       "passwordsent": "Una password noa est stada mandada a s'indiritzu email de s'impitadore \"$1\".\nPro praxere, cando dda retzis identìfica·ti torra.",
+       "blocked-mailpassword": "Sos càmbios dae s'indiritzu IP tuo sunt arreados, e no est adduidu impreare sa funtzionalidade \"imbia password noa\".",
        "mailerror": "Faddina imbiende su messàgiu: $1",
        "emailauthenticated": "S'indiritzu e-mail tuo est istadu autenticau su $2 a is $3.",
        "emailconfirmlink": "Cunfirma s'indiritzu e-mail tuo",
+       "emaildisabled": "Custu giassu non podet imbiare emails.",
        "accountcreated": "Contu creadu",
-       "accountcreatedtext": "S'account usuàriu pro [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) est stadu creadu.",
+       "accountcreatedtext": "Su contu de s'impitadore [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) est stadu creadu.",
        "createaccount-title": "Creatzione de unu contu pro {{SITENAME}}",
+       "login-abort-generic": "S'identificatzione tua est andada male - Iscontzada",
        "loginlanguagelabel": "Limba: $1",
        "createacct-another-realname-tip": "Su nomini beru pois fai de mancu de ddu ponni.\nSi sceberas de du ponni, at a essi imperau po arreconnosci a tui su traballu tuu.",
        "pt-login": "Intra",
        "pt-login-button": "Intra",
        "pt-createaccount": "Registra·ti",
        "pt-userlogout": "Essida",
+       "php-mail-error-unknown": "Errore disconnottu in sa funtzione mail() de PHP.",
+       "user-mail-no-addy": "As provadu a imbiare una email sena un indiritzu.",
        "changepassword": "Càmbia password",
-       "resetpass_header": "Càmbia sa paràula de òrdine de su contu",
-       "oldpassword": "Paràula de òrdine betza:",
-       "newpassword": "Paràula de òrdine noa:",
-       "retypenew": "Torra a iscrìere sa paràula de òrdine noa:",
-       "resetpass_submit": "Càmbia sa paràula de òrdine e identìfica·ti",
+       "resetpass_announce": "Pro cumprire s'intrada, depes insertare una password noa.",
+       "resetpass_header": "Càmbia sa password de su contu",
+       "oldpassword": "Password betza:",
+       "newpassword": "Password noa:",
+       "retypenew": "Torra a iscrìere sa password noa:",
+       "resetpass_submit": "Càmbia sa password e identifica·ti",
+       "changepassword-success": "Sa password tua est istada cambiada in manera currègida!",
        "resetpass_forbidden": "Non faghet a cambiare sa password",
        "resetpass-no-info": "Depes èsser identificadu pro abèrrer custa pàgina deretu.",
        "resetpass-submit-loggedin": "Càmbia password",
        "resetpass-submit-cancel": "Burra",
+       "resetpass-recycled": "Pro piaghere inserta una password noa chi siat diferente dae sa password tua de como.",
        "resetpass-temp-password": "Password temporànea:",
+       "resetpass-abort-generic": "Su càmbiu de sa password est istadu arreadu dae un'estensione.",
+       "resetpass-expired": "Sa password tua est iscadida. Pro piaghere inserta una password noa pro intrare.",
+       "resetpass-validity-soft": "Sa password password tua no est bàlida: $1\n\nPro piaghere issèbera una password noa como, o carca \"{{int:resetpass-submit-cancel}}\" pro lu fàghere prus a tardu.",
        "passwordreset": "Reseta sa password",
        "passwordreset-legend": "Reseta sa password",
-       "passwordreset-username": "Nùmene usuàriu",
+       "passwordreset-disabled": "Non si podent cambiare sas passwords in custa wiki.",
+       "passwordreset-emaildisabled": "Is funtzionalidades de email sunt istadas disabilitadas in custa wiki.",
+       "passwordreset-username": "Nùmene impitadore:",
+       "passwordreset-domain": "Domìniu:",
+       "passwordreset-capture": "Ammustrare su cuntènnidu de sa email?",
        "passwordreset-email": "Indiritzu email:",
-       "passwordreset-emailtitle": "Particulares de s'usuàriu in {{SITENAME}}",
+       "passwordreset-emailtitle": "Particulares de s'impitadore in {{SITENAME}}",
+       "passwordreset-emailelement": "Nùmene impitadore: $1\nPassword temporànea: $2",
        "changeemail": "Càmbia indiritzu email",
        "changeemail-oldemail": "Indiritzu email atuale:",
        "changeemail-newemail": "Indiritzu email nou:",
        "changeemail-none": "(nudda)",
        "changeemail-password": "Sa password tua pro {{SITENAME}}:",
        "changeemail-submit": "Càmbia email",
-       "changeemail-cancel": "Annudda",
        "resettokens": "Reseta tokens",
-       "bold_sample": "Testu Grassu",
-       "bold_tip": "Testu Grassu",
-       "italic_sample": "Testu Cursivu",
-       "italic_tip": "Testu Cursivu",
-       "link_sample": "Tìtulu ligàmene",
-       "link_tip": "Ligàmene internu",
-       "extlink_sample": "http://www.example.com tìtulu de su ligàmene",
-       "extlink_tip": "Ligàmene a foras (amenta su prefissu http://)",
+       "resettokens-token-label": "$1 (valore atuale: $2)",
+       "bold_sample": "Testu grassu",
+       "bold_tip": "Testu grassu",
+       "italic_sample": "Testu cursivu",
+       "italic_tip": "Testu cursivu",
+       "link_sample": "Tìtulu ligòngiu",
+       "link_tip": "Ligòngiu internu",
+       "extlink_sample": "http://www.example.com tìtulu de su ligòngiu",
+       "extlink_tip": "Ligòngiu a foras (regorda su prefissu http://)",
        "headline_sample": "Testu de su tìtulu",
-       "headline_tip": "Tìtulu de su segundu livellu",
+       "headline_tip": "Tìtulu de su de duos livellu",
        "nowiki_sample": "Inserta su testu non-formatadu inoghe",
        "nowiki_tip": "Ignora sa formatatzione wiki",
        "image_sample": "Esèmpiu.jpg",
        "image_tip": "Incòrpora una pintura",
        "media_sample": "Esèmpiu.ogg",
-       "media_tip": "Ligàmene a unu file multimediale",
-       "sig_tip": "Firma cun data e ora",
+       "media_tip": "Ligòngiu a unu file multimediale",
+       "sig_tip": "Firma·ti cun data e ora",
        "hr_tip": "Lìnia orizontale (de impreare cun critèriu)",
        "summary": "Ogetu:",
        "subject": "Tema/tìtulu:",
        "minoredit": "Custu est unu càmbiu minore",
-       "watchthis": "Pone custa pàgina in sa watchlist mea",
-       "savearticle": "Sarva sa pàgina",
+       "watchthis": "Annota custa pàgina",
+       "savearticle": "Sarba sa pàgina",
        "preview": "Antiprima",
-       "showpreview": "Amosta s'antiprima",
-       "showdiff": "Amosta is càmbios",
-       "anoneditwarning": "'''Dae cara:''' Non ses identificadu (log in).\nS'indiritzu IP tuo at a èssere registradu in s'istòria de custa pàgina.",
+       "showpreview": "Ammustra s'antiprima",
+       "showdiff": "Ammustra is càmbios",
+       "anoneditwarning": "<strong>Atentzione:</strong> Non ses identificadu.\nS'indiritzu IP tuo at a èssere annòtidu si faghes unos cantos càmbios. Si <strong>idendificas</strong> tibe o <strong>[$2 creas unu contu]</strong>, is càmbios tuos ant a esser marcados cun su nùmene impitadore tuo, paris a àteros giuamentos.",
        "anonpreviewwarning": "''Non ses identificadu. Sarvende s'indiritzu IP tuo at a èssere registradu in s'istòria de sa pàgina.''",
        "missingcommenttext": "Inserta unu cummentu inoghe suta.",
        "summary-preview": "Antiprima ogetu:",
        "subject-preview": "Antiprima tema/tìtulu:",
-       "blockedtitle": "S'usuàriu est istadu bloccadu",
-       "blockedtext": "'''Custu nùmene usuàriu o indiritzu IP est stadu bloccadu.'''\n\nSu bloccu est stadu postu dae $1. Su motivu de su bloccu est: ''$2''\n\n* Su bloccu incumentzat: $8\n* Su bloccu scadit: $6\n* Intervallu de bloccu: $7\n\nSi boles, podes tzerriare $1 o un'àteru [[{{MediaWiki:Grouppage-sysop}}|amministradore]] pro faeddare de su bloccu.\n\nNota ca sa funtzione 'Ispedi un'e-mail a custu usuàriu' no est ativa ki no est stadu registradu un'indiritzu e-mail vàlidu in is [[Special:Preferences|preferèntzias]] tuas o ki s'usu de custa funtzione est stadu bloccadu.\n\nS'indiritzu IP atuale est $3, su nùmeru ID de su bloccu est #$5.\nPro praxere spetzìfica totu is particulares in antis in carche siat pregunta de acrarimentu.",
+       "blockedtitle": "S'impitadore est istadu bloccadu",
+       "blockedtext": "<strong>Custu nùmene impitadore o indiritzu IP est stadu bloccadu.</strong>\n\nSu bloccu est stadu postu dae $1.\nSu motivu de su bloccu est: <em>$2</em>.\n\n* Su bloccu incumentzat: $8\n* Su bloccu scadit: $6\n* Intervallu de bloccu: $7\n\nSi boles, podes tzerriare $1 o un'àteru [[{{MediaWiki:Grouppage-sysop}}|amministradore]] pro faeddare de su bloccu.\nNota ca sa funtzione 'Ispedi un'email a custu impitadore' no est ativa si no est istadu registradu un'indiritzu email vàlidu in is [[Special:Preferences|preferèntzias]] tuas o si s'impreu de custa funtzione est istadu arreadu.\nS'indiritzu IP atuale est $3, su nùmeru ID de su bloccu est #$5.\nPro praghere ispetzìfica totus is particulares in antis in cale siat pregonta de acrarimentu.",
        "blockednoreason": "perunu motivu inditadu",
+       "whitelistedittext": "Pro cambiare is pàginas $1.",
+       "nosuchsectiontitle": "Impossìbile agatare sa setzione",
+       "nosuchsectiontext": "Ses proande a modificare una setzione chi non esistit.\nDiat poder'èssere istada iscostiada o burrada cando che fias bidende sa pàgina.",
        "loginreqtitle": "Identificatzione rechesta",
        "loginreqlink": "identìfica·ti",
        "loginreqpagetext": "Depes èsser $1 pro bìer àteras pàginas.",
        "accmailtitle": "Password ispedida.",
+       "accmailtext": "Una password ingendrada a manera casuale pro [[User talk:$1|$1]] est istada imbiada a $2. Podet èssere cambiada in sa pàgina de <em>[[Special:ChangePassword|càmbiu password]]</em> a pustis de èssere intradu in su contu tuo.",
        "newarticle": "(Nou)",
-       "newarticletext": "Custa pàgina no esistit galu.\nPro creare sa pàgina, scrie in su box inoghe in bàsciu (abbàida sa [$1 pàgina de agiudu] pro àteras informatziones).\nSi ses intradu inoghe pro sbàlliu, carca in su browser tuo su butone '''back/indietro'''.",
-       "anontalkpagetext": "----''Custa est sa pàgina de cuntierra de unu usuàriu anònimu ki no at creadu unu account galu, o ki non dd'usat. Pro custu impreamus su nùmeru de indiritzos IP pro ddu identificare. Is indiritzos IP podent però èsser cundivìdidos dae unos cantos usuàrios. Si ses unu usuàriu anònimu e ritenes ki custos cummentos non sunt diretos a tue, pro praxere [[Special:UserLogin/signup|crea unu account]] o [[Special:UserLogin|identifica·ti (log in)]] pro evitare cunfusione cun àteros usuàrios anònimos.''",
-       "noarticletext": "In custu momentu sa pàgina est bùida.\nPodes [[Special:Search/{{PAGENAME}}|chircare custu tìtulu]] in àteras pàginas, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} chircare in is registros ligados] oppuru [{{fullurl:{{FULLPAGENAME}}|action=edit}} acontzare sa pàgina]</span>.",
-       "userpage-userdoesnotexist": "S'account de s'usuàriu \"<nowiki>$1</nowiki>\" no est stadu registradu.\nPro praxere abbàida si boles creare/acontzare custa pàgina.",
-       "userpage-userdoesnotexist-view": "S'account de s'usuàriu \"$1\" no est stadu registradu.",
+       "newarticletext": "Custa pàgina no esistit galu.\nPro creare sa pàgina, iscrie in sa casella a suta (càstia sa [$1 pàgina de agiudu] pro àteras informatziones).\nSi ses intradu inoghe pro isbàlliu, carca su butone <strong>back/indietro</strong> in su navigadore tuo.",
+       "anontalkpagetext": "----\n<em>Custa est sa pàgina de cuntierra de unu impitadore anònimu ki no at creadu unu contu galu, o ki non dd'usat.</em>\nPro custu impreamus su nùmeru de indiritzos IP pro ddu identificare. Is indiritzos IP podent perou èsser cundivìdidos dae unos cantos impitadores. Si ses unu impitadore anònimu e ritenes ki custos cummentos non sunt diretos a tue, pro praxere [[Special:UserLogin/signup|crea unu contu]] o [[Special:UserLogin|identifica·ti (log in)]] pro evitare cunfusione cun àteros impitadore anònimos.''",
+       "noarticletext": "In custu momentu sa pàgina est bùida.\nPodes [[Special:Search/{{PAGENAME}}|chircare custu tìtulu]] in àteras pàginas, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} chircare in is registros ligados] o puru [{{fullurl:{{FULLPAGENAME}}|action=edit}} modificare sa pàgina]</span>.",
+       "noarticletext-nopermission": "In custu tempu sa pàgina rechesta est bùida.\nPodes [[Special:Search/{{PAGENAME}}|chircare custu tìtulu]] in is àteras pàginas, o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} chircare in is regìstros ligados]</span>, ma non tenes su permissu de creare custa pàgina.",
+       "userpage-userdoesnotexist": "Su contu de s'impitadore \"<nowiki>$1</nowiki>\" no est stadu registradu.\nPro praxere abbàida si boles a sèriu creare/cambiare custa pàgina.",
+       "userpage-userdoesnotexist-view": "Su contu de s'impitadore \"$1\" no est stadu registradu.",
+       "blocked-notice-logextract": "{{GENDER:.|Custu impitadore|Custa impitadora}} est {{GENDER:.|arreadu|arreada}}.\nS'ùrtimu elementu de su registru de sos arreamentos est marcadu inoghe in suta pro referèntzia:",
+       "usercssyoucanpreview": "<strong>Consìgiu:</strong> Imprea su butone \"{{int:showpreview}}\" pro testare su CSS nou in antis de sarvare.",
+       "userjsyoucanpreview": "<strong>Consìgiu:</strong> Imprea su butone \"{{int:showpreview}}\" pro testare su tuo JavaScript nou in antis de sarvare.",
+       "usercsspreview": "<strong>Ammentadi chi ses petzi bidende s'antiprima de su CSS impitadore tuo.\nNo est istadu galu sarbadu!</strong>",
+       "userjspreview": "<strong>Ammentadi chi ses petzi collaudande/bidende s'antiprima de su CSS impitadore tuo.\nNo est istadu galu sarbadu!</strong>",
+       "sitecsspreview": "<strong>Ammentadi chi ses petzi bidende s'antiprima de custu CSS.\nNo est istadu galu sarbadu!</strong>",
+       "sitejspreview": "<strong>Ammentadi chi ses petzi bidende s'antiprima de custu còdighe JavaScript.\nNo est istadu galu sarbadu!</strong>",
        "updated": "(Atualizadu)",
        "note": "'''Nota:'''",
        "previewnote": "<strong>Regorda·ti ca custa est feti una ANTIPRIMA.</strong>\nIs mudàntzias tuas non sunt galu sarbadas!",
-       "continue-editing": "Bae a s'àrea de acontzu",
+       "continue-editing": "Bae a s'àrea de modìfica",
        "previewconflict": "Custa antiprima rapresentat su testu in s'àrea acontzu testu de susu comente at a pàrrer si dda sarbas.",
        "editing": "Cambiende $1",
        "creating": "Creande $1",
        "editingsection": "Cambiende $1 (setzione)",
-       "editingcomment": "Acontzu de $1 (setzione noa)",
+       "editingcomment": "Modìfica de $1 (setzione noa)",
        "editconflict": "Cunflitu de editzione: $1",
-       "explainconflict": "Calicunu àteru at acontzadu custa pàgina in su tempus ki dda fias acontzende tue.\nS'àrea de testu de susu cuntènnet su testu de sa pàgina in sa forma atuale.\nIs mudàntzias tuas sunt ammustradas in s'àrea de testu de bàsciu.\nAs a dèper insertare is mudàntzias tuas in su testu atuale, e pro custu a ddas scrìer in s'àrea de susu.\n'''Solu''' su testu in s'àrea de susu at a èsser sarbadu si carcas su butone \"{{int:savearticle}}\".",
+       "explainconflict": "Calicunu àteru at cambiadu custa pàgina in su tempus chi dda fias cambiende tue.\nS'àrea de testu de susu cuntènnet su testu de sa pàgina in sa forma atuale.\nIs mudàntzias tuas sunt ammustradas in s'àrea de testu in suta.\nAs a dèper insertare is mudàntzias tuas in su testu atuale, e pro custu a ddas iscrìer in s'àrea de susu.\n<strong>Solu</strong> su testu in s'àrea de susu at a èsser sarbadu si carcas su butone \"{{int:savearticle}}\".",
        "yourtext": "Su testu tuo",
        "storedversion": "Revisione in archìviu",
-       "editingold": "'''ATENTZIONE: Ses acontzende una revisione non-agiornada de sa pàgina.'''\nSi dda sarbas de aici, totu is acontzos fatos a pustis de custa revisione ant a bènner pèrdidos pro semper.",
+       "editingold": "<strong>Atentzione: Ses cambiende una versione non-agiornada de sa pàgina.</strong>\nSi dda sarbas de aici, totus is càmbios fatos a pustis de custa versione ant a bènnere pèrdidos pro semper.",
        "yourdiff": "Diferèntzias",
-       "copyrightwarning": "Abbàida, pro praxere, ki totu is contributziones a {{SITENAME}} sunt cunsideradas lassadas a suta permissu de tipu $2 (càstia $1 pro nde schire de prus). Si non keris ki su scritu tuo potzat èsser acontzadu e re-distribuidu dae kie si siat sena piedade e sena àteros lìmites, non ddu imbies a {{SITENAME}}.<br />\nCun s'imbiu de custu scritu ses garantende, a responsabilidade tua, si su scritu ddu as cumpostu tue de persona e in originale, o puru si est stadu copiadu dae una fonte de domìniu pùblicu, o una fonte de gasi, o puru si as otentu permissu craru de impreare custu scritu e si ddu podes dimustrare. '''NO IMPREARE MATERIALE COBERTU DAE DERETU DE AUTORE SENA PERMISSU CRARU!'''",
+       "copyrightwarning": "Abbàida, pro praghere, chi totus is contributos a {{SITENAME}} sunt cunsideradas lassadas a suta permissu de tipu $2 (càstia $1 pro nde ischire de prus). Si non boles chi s'iscritu tuo potzat èssere cambiadu e re-distribuidu dae chie si siat sena piedade e sena àteros lìmites, non ddu insartas inoghe.<br />\nCun s'imbiu de custu iscritu ses garantende, a responsabilidade tua, si su iscritu ddu as cumpostu tue de persone e in originale, o puru si est istadu copiadu dae una fonte de domìniu pùblicu, o una fonte de gasi, o puru si as otentu permissu craru de impreare custu iscritu e si ddu podes dimustrare. <strong>No impreare materiale cobertu dae deretu de autore sena permissu craru!</strong>",
+       "titleprotectedwarning": "<strong>Atentzione: Custa pàgina est istada amparada pro fàghere in modu chi ant a serbire [[Special:ListGroupRights|deretos dislindados]] pro la creare.</strong>\nS'ùrtimu elementu de su registru est marcadu inoghe in suta pro referèntzia:",
        "templatesused": "{{PLURAL:$1|Template impreadu|Templates impreados}} in custa pàgina:",
        "templatesusedpreview": "{{PLURAL:$1|Template impreadu|Templates impreados}} in custa antiprima:",
        "templatesusedsection": "{{PLURAL:$1|Template impreadu|Templates impreados}} in custa setzione:",
-       "template-protected": "(amparadu)",
-       "template-semiprotected": "(mesu-amparadu)",
+       "template-protected": "(bardadu)",
+       "template-semiprotected": "(mesu-bardadu)",
        "hiddencategories": "Custa pàgina faghet parte de {{PLURAL:$1|1 categoria cuada|$1 categorias cuadas}}:",
+       "nocreatetext": "{{SITENAME}} at limitadu sa possibilidade de creare pàginas noas a sos impitadores registrados.\nPodes torrare in segus e modificare una pàgina esistente, o puru [[Special:UserLogin|intrare in su contu tuo o creare unu contu nou]].",
        "nocreate-loggedin": "Non tenes su permissu de creare pàginas noas.",
+       "sectioneditnotsupported-title": "Modìfica de sas setziones non suportada",
+       "sectioneditnotsupported-text": "Modìfica de sas setziones non suportada in custa pàgina.",
        "permissionserrors": "Faddina de permissos",
-       "permissionserrorstext-withaction": "Non tenes su permissu de $2, pro {{PLURAL:$1|custu motivu|custus motivus}}:",
-       "moveddeleted-notice": "Custa pàgina est istada fuliada.\nSu registru de is fuliaduras e moviduras de sa pàgina est ammustradu pro informatzione.",
+       "permissionserrorstext": "Non tenes su permissu pro lu fàghere, pro {{PLURAL:$1|custa resone|custas resones}}:",
+       "permissionserrorstext-withaction": "Non tenes su permissu de $2, pro {{PLURAL:$1|custu motivu|custos motivos}}:",
+       "recreate-moveddeleted-warn": "<strong>Atentzione: Ses torrende a creare una pàgina chi est istada giai burrada.</strong>\n\nSinchera·ti chi siat pretzisu a sighire cambiende custa pàgina.\nSu registru de is burraduras e moviduras pro custa pàgina benit giùghedu inoghe:",
+       "moveddeleted-notice": "Custa pàgina est istada burrada.\nSu registru de is burraduras e moviduras de sa pàgina est ammustradu pro informatzione.",
        "log-fulllog": "Abbista su registru intreu",
+       "edit-hook-aborted": "Sa modìfica est istada annuddada dae su hook de s'estensione.\nNo est istadu datu acrarimentu.",
+       "edit-gone-missing": "Impossìbile agiornare sa pàgina.\nParet chi siat istada burrada.",
        "edit-conflict": "Cunflitu de editzione.",
+       "edit-no-change": "Su càmbiu tuo est istadu innoradu proite non b'est istada modìfica peruna a su testu.",
        "postedit-confirmation-created": "Sa pàgina est stada creada",
        "postedit-confirmation-restored": "Sa pàgina est stada restaurada",
-       "postedit-confirmation-saved": "S'acontzu tuo est stadu sarbadu",
+       "postedit-confirmation-saved": "Su càmbiu tuo est istadu sarbadu.",
+       "edit-already-exists": "No est possìbile creare una pàgina noa.\nEsistit giai.",
+       "defaultmessagetext": "Testu de su messàgiu predeterminadu",
+       "invalid-content-data": "Datos de cuntènnidu invàlidos",
+       "content-not-allowed-here": "Cuntènnidu a manera \"$1\" no adduidu in sa pàgina [[$2]]",
+       "editwarning-warning": "S'essida dae custa pàgina diat pòdere cajonare sa pèrdida de totus sos càmbios chi as fatu.\nSi ses autentificadu, podes disabilitare custu avisu in sa setzione \"{{int:prefs-editing}}\" de sas preferèntzias tuas.",
+       "editpage-notsupportedcontentformat-title": "Formadu de càbidu non suportadu",
        "content-model-wikitext": "wikitestu",
+       "content-model-text": "testu normale",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "viewpagelogs": "Càstia sos registros de custa pàgina",
+       "post-expand-template-inclusion-category": "Pàginas in is cale sa dimensione templates inclùdidos propassat su lìmite cunsentidu",
+       "post-expand-template-argument-category": "Pàginas cuntenentes templates cun argumentos fartados",
+       "cantcreateaccounttitle": "Non si podet creare unu contu",
+       "viewpagelogs": "Càstia is registros de custa pàgina",
        "nohistory": "Non b'est sa stòria de is acontzos pro custa pàgina.",
        "currentrev": "Revisione currente",
        "currentrev-asof": "Versione currente de is $1",
        "revisionasof": "Revisione de is $1",
        "revision-info": "Revisione de su $4 a is $5 de {{GENDER:$6|$2}}$7",
-       "previousrevision": "← Acontzu in antis",
-       "nextrevision": "Acontzu in fatu →",
-       "currentrevisionlink": "Revisione currente",
+       "previousrevision": "← Versione in segus",
+       "nextrevision": "Versione in antis →",
+       "currentrevisionlink": "Revisione atuale",
        "cur": "curr",
        "next": "in fatu",
-       "last": "ant",
+       "last": "pre",
        "page_first": "prima",
        "page_last": "ùrtima",
-       "histlegend": "Cunfrontu intre versiones: sebera sa casella de sa versione ki boles e carca \"Invio\" o su butone in bàsciu.<br />\nCosas de ammentare: '''({{int:cur}})''' = diferèntzias cun sa versione currente,\n'''({{int:last}})''' = diferèntzias cun sa versione in antis, '''{{int:minoreditletter}}''' = acontzu minore.",
-       "history-fieldset-title": "Sfògia sa stòria",
-       "history-show-deleted": "Petzi borrados",
+       "histlegend": "Cunfrontu intre versiones: Marca sa casella de sa versione chi boles e carca \"Invio\" o su butone in bàsciu.<br />\nCosas de ammentare: <strong>({{int:cur}})</strong> = diferèntzias cun sa versione atuale,\n<strong>({{int:last}})</strong> = diferèntzias cun sa versione pretzedente, <strong>{{int:minoreditletter}}</strong> = càmbiu minore.",
+       "history-fieldset-title": "Isfògia s'istòria",
+       "history-show-deleted": "Feti is burrados",
        "histfirst": "prima",
        "histlast": "ùrtima",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "historyempty": "(bùida)",
+       "history-feed-title": "Istòria de is revisiones",
+       "history-feed-description": "Istòria de is revisiones de sa pàgina in custa wiki",
        "history-feed-item-nocomment": "$1 su $2",
+       "rev-deleted-user": "(nùmene impitadore bogadu)",
+       "rev-deleted-unhide-diff": "Una de is versiones de custa cumparàntzia tra versiones est istada <strong>burrada</strong>.\nConsulta su [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} registru de is burraduras] pro àteros particulares.\nIs amministradores podent galu [$1 bìdere sa cumparàntzia] si est netzessàriu.",
        "rev-delundel": "ammustra/cua",
        "rev-showdeleted": "ammustra",
+       "revisiondelete": "Burra o reimprea versiones",
+       "revdelete-no-file": "Su documentu ispetzuficadu no esistit",
        "revdelete-show-file-submit": "Eja",
+       "revdelete-selected-text": "{{PLURAL:$1|Versione seletzionada|Versiones seletzionadas}} de [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Versione seletzionada|Versiones seletzionadas}} de su documentu [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Acadessimentu de su registru seletzionadu|Acadessimentos de su registru seletzionadu}}:",
+       "revdelete-hide-text": "Testu de sa versione",
+       "revdelete-hide-image": "Cua su cuntènnidu de su documentu",
+       "revdelete-hide-comment": "Modìfica s'ogetu",
+       "revdelete-radio-same": "(non cambiare)",
        "revdelete-radio-set": "Cua",
+       "revdelete-radio-unset": "Ammustra",
        "revdelete-log": "Motivu:",
-       "revdel-restore": "Muda sa visibilidade",
+       "revdelete-submit": "Àplica a {{PLURAL:$1|sa versione seletzionada|is versiones seletzionadas}}",
+       "revdel-restore": "càmbia sa visibilidade",
        "pagehist": "Istòria de sa pàgina",
        "deletedhist": "Istòria fuliada",
+       "revdelete-otherreason": "Motivu diversu o agiuntivu:",
        "revdelete-reasonotherlist": "Àteru motivu",
+       "revdelete-edit-reasonlist": "Càmbia su motivu de sa burradura",
+       "revdelete-offender": "Autore de sa versione:",
        "mergehistory-from": "Pàgina de orìgine:",
        "mergehistory-into": "Pàgina de destinatzione:",
        "mergehistory-no-source": "Sa pàgina de orìgine $1 no esistit.",
        "mergehistory-reason": "Motivu:",
        "revertmerge": "Iscontza s'unione",
        "history-title": "$1: Istòria de is revisiones",
+       "difference-title": "$1: diferèntzias tra is versiones",
+       "difference-title-multipage": "\"$1\" e \"$2\": diferèntzias tra is pàginas",
+       "difference-multipage": "(Diferèntzias intre pàginas)",
        "lineno": "Lìnia $1:",
        "compareselectedversions": "Cumpara versiones scioberadas",
-       "editundo": "annulla",
+       "editundo": "annudda",
+       "diff-empty": "(Diferèntzia peruna)",
        "searchresults": "Resurtados de sa chirca",
        "searchresults-title": "Resurtados pro sa chirca de \"$1\"",
        "titlematches": "Currispondèntzias in su tìtulu de s'artìculu",
        "textmatches": "Currispondèntzias in su testu de s'artìculu",
        "notextmatches": "Peruna currispondèntzia in su testu de s'artìculu",
-       "prevn": "{{PLURAL:$1|cabudianu|cabudianos $1}}",
+       "prevn": "{{PLURAL:$1|pretzedente|pretzedentes $1}}",
        "nextn": "{{PLURAL:$1|imbeniente|imbenientes $1}}",
+       "prevn-title": "{{PLURAL:$1|Resurtadu pretzedente|$1 resurtados pretzedentes}}",
+       "nextn-title": "{{PLURAL:$1|Resurtadu imbeniente|$1 resurtados imbenientes}}",
        "shown-title": "Ammustra $1 {{PLURAL:$1|resurtadu|resurtados}} pro pàgina",
        "viewprevnext": "Càstia ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchprofile-articles": "Pàginas de càbidu",
+       "searchmenu-exists": "<strong>Ddu est una pàgina tzerriada \"[[:$1]]\" in custa wiki.</strong> {{PLURAL:$2|0=|Càstia puru is àteros resurtados de sa chirca.}}",
+       "searchmenu-new": "<strong>Crea sa pàgina \"[[:$1]]\" in custa wiki!</strong> {{PLURAL:$2|0=|Càstia fintzas sa pàgina agatada cun sa chirca tua|Càstia fintzas is resurtados de sa chirca}}",
+       "searchprofile-articles": "Pàginas de càbidos",
        "searchprofile-images": "Multimèdia",
-       "searchprofile-everything": "Totu",
+       "searchprofile-everything": "Totue",
        "searchprofile-advanced": "Avantzada",
        "searchprofile-articles-tooltip": "Chirca in $1",
        "searchprofile-images-tooltip": "Chirca files",
-       "search-result-size": "$1 ({{PLURAL:$2|1 faeddu|$2 faeddos}})",
-       "search-redirect": "(redirect $1)",
+       "searchprofile-everything-tooltip": "Chirca in totue (inclùdidas is pàginas de cuntierra)",
+       "searchprofile-advanced-tooltip": "Chirca in nùmene-logos personalizados",
+       "search-result-size": "$1 ({{PLURAL:$2|1 paràula|$2 paràulas}})",
+       "search-result-category-size": "{{PLURAL:$1|1 membru|$1 membros}} ({{PLURAL:$2|1 sutacategoria|$2 sutacategorias}}, {{PLURAL:$3|1 documentu|$3 documentos}})",
+       "search-redirect": "(reindiritzadu $1)",
        "search-section": "(setzione $1)",
        "search-suggest": "Fortzis fias chirchende: $1",
        "search-interwiki-caption": "Progetos frades",
        "search-interwiki-more": "(àteru)",
        "searchall": "totu",
        "showingresults": "Inoghe sighende {{PLURAL:$1|benit ammustradu '''1''' resurtadu|benint ammustrados '''$1''' resurtados}} incumentzende dae su nùmeru '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resultadu '''$1''' de '''$3'''|Resultadus '''$1 - $2''' de '''$3'''}} pro '''$4'''",
+       "search-nonefound": "Sa chirca no at prodùidu resurtados.",
        "powersearch-legend": "Chirca delantada",
        "powersearch-ns": "Chirca in su nùmene-logu:",
        "powersearch-togglelabel": "Seletziona:",
        "powersearch-toggleall": "Totu",
        "powersearch-togglenone": "Nudda",
        "preferences": "Preferèntzias",
-       "mypreferences": "Preferèntzias meas",
+       "mypreferences": "Preferèntzias mias",
        "prefs-edits": "Nùmeru de acontzos:",
        "prefs-skin": "Bisura",
        "skin-preview": "Antiprima",
+       "datedefault": "Peruna preferèntzia",
+       "prefs-user-pages": "Paginas impitadore",
        "prefs-personal": "Datos personales",
        "prefs-rc": "Ùrtimas mudàntzias",
        "prefs-watchlist": "Watchlist",
+       "prefs-watchlist-days-max": "Màssimu $1 {{PLURAL:$1|die|dies}}",
+       "prefs-watchlist-edits-max": "Cantidade màssima: 1000",
        "prefs-misc": "Àteras preferèntzias",
        "prefs-resetpass": "Càmbia password",
-       "saveprefs": "Sarva preferèntzias",
-       "prefs-editing": "Box de acontzadura",
+       "prefs-changeemail": "Càmbia indiritzu email",
+       "prefs-setemail": "Imposta un'indiritzu email",
+       "prefs-email": "Sèberos pro sa email",
+       "prefs-rendering": "Aparèntzia",
+       "saveprefs": "Sarba",
+       "restoreprefs": "Restàura totus is sèberos predefinidos (in totus is setziones)",
+       "prefs-editing": "Casella de modìfica",
        "rows": "Lìnias:",
        "columns": "Colunnas:",
        "searchresultshead": "Chirca",
+       "stub-threshold": "Valore mìnimu pro is <a href=\"#\" class=\"stub\">ligòngios a is abotzos</a>, in bytes:",
        "stub-threshold-disabled": "Disativadu",
+       "recentchangesdays": "Dies de ammustrare in ùrtimas mudàntzias:",
+       "recentchangesdays-max": "Màssimu $1 {{PLURAL:$1|die|dies}}",
        "recentchangescount": "Nùmeru de acontzos de amostare pro definidura:",
        "savedprefs": "Is preferèntzias tuas sunt stadas sarbadas.",
        "timezonelegend": "Zona de oràriu:",
        "timezoneregion-antarctica": "Antàrtide",
        "timezoneregion-arctic": "Àrtide",
        "timezoneregion-asia": "Àsia",
+       "timezoneregion-atlantic": "Otzèanu Atlànticu",
        "timezoneregion-australia": "Austràlia",
        "timezoneregion-europe": "Europa",
+       "timezoneregion-indian": "Otzèanu Indianu",
+       "timezoneregion-pacific": "Otzèanu Patzìficu",
        "prefs-searchoptions": "Chirca",
        "prefs-namespaces": "Nùmene-logos",
+       "default": "predefinidu",
        "prefs-files": "Files",
-       "youremail": "E-mail:",
-       "username": "{{GENDER:$1|Nùmene usuàriu}}:Nùmene usuàriu",
+       "prefs-emailconfirm-label": "Cunfirma de sa email:",
+       "youremail": "Email:",
+       "username": "{{GENDER:$1|Nùmene impitadore}}:",
        "prefs-registration": "Ora de registratzione:",
        "yourrealname": "Nùmene beru:",
        "yourlanguage": "Limba:",
        "yournick": "Sa firma tua:",
-       "yourgender": "Natura:",
-       "gender-unknown": "Non spetzificadu",
-       "gender-male": "Mascu",
-       "gender-female": "Fèmina",
+       "yourgender": "Comente preferes a ti descrir?",
+       "gender-unknown": "Preferu a no ddu narrer",
+       "gender-male": "Issu càmbiat pàginas wiki",
+       "gender-female": "Issa càmbiat pàginas wiki",
        "email": "E-mail",
-       "prefs-info": "Informatzione bàsica",
+       "prefs-info": "Informatziones de base",
        "prefs-signature": "Firma",
        "prefs-dateformat": "Formadu data",
        "prefs-advancedediting": "Sèberos generales",
        "prefs-advancedwatchlist": "Sèberos avantzados",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Diferèntzias",
-       "userrights-user-editname": "Inserta unu nùmene usuàriu:",
-       "editinguser": "Cambiamentu de is deretos usuàriu de s'usuàriu <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-user-editname": "Inserta unu nùmene impitadore:",
+       "editinguser": "Cambiamentu de is deretos impitadore de s'impitadore <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Cambiare is grupos de impitadores",
+       "userrights-groupsmember": "Membru de:",
        "userrights-reason": "Motivu:",
        "userrights-irreversible-marker": "$1*",
        "group": "Grupu:",
-       "group-user": "Usuàrios",
-       "group-autoconfirmed": "Usuàrios autocunfirmadus",
+       "group-user": "Impitadores",
+       "group-autoconfirmed": "Impitadores autocunfirmadus",
        "group-bot": "Bots",
        "group-sysop": "Amministradores",
        "group-bureaucrat": "Buròcrates",
+       "group-suppress": "Tzensores",
        "group-all": "(totus)",
-       "group-user-member": "{{GENDER:$1|usuàriu}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|usuàrios autocunfirmados}}",
+       "group-user-member": "{{GENDER:$1|impitadore}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|impitadores autocunfirmados}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
-       "group-sysop-member": "{{GENDER:$1|aministradore}}",
+       "group-sysop-member": "{{GENDER:$1|amministradore}}",
        "group-bureaucrat-member": "{{GENDER:$1|buròcrate}}",
+       "group-suppress-member": "{{GENDER:$1|tzensore}}",
        "grouppage-user": "{{ns:project}}:Usuàrios",
        "grouppage-autoconfirmed": "{{ns:project}}:Usuàrios autocunfirmadus",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Amministradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burocrates",
+       "grouppage-suppress": "{{ns:project}}:Tzensore",
        "right-read": "Lègere pàginas",
-       "right-edit": "Acontzare pàginas",
+       "right-edit": "Cambiare pàginas",
+       "right-createpage": "Creare pàginas (chi non siant pàgina de cuntierra)",
+       "right-createtalk": "Creare pàginas de cuntierra",
+       "right-createaccount": "Creare contos de impitadores noos",
+       "right-minoredit": "Marcare su càmbiu che minore",
        "right-move": "Mòver pàginas",
        "right-move-subpages": "Mòvere pàginas cun is suta-pàginas issoru",
-       "right-move-rootuserpages": "Mòvere is pàginas base de is usuàrios",
+       "right-move-rootuserpages": "Mòvere is pàginas base de is impitadores",
+       "right-move-categorypages": "Mòvere pàginas de categorias",
        "right-movefile": "Mòvere files",
        "right-upload": "Carrigare files",
        "right-reupload": "Subra-iscrìere files esistentes",
        "right-delete": "Fuliare pàginas",
        "right-browsearchive": "Chircare pàginas fuliadas",
        "right-undelete": "Restaurare una pàgina",
+       "right-suppressionlog": "Càstia is registros privados",
        "right-siteadmin": "Bloccare e sbloccare su database",
-       "newuserlogpage": "Usuàrios nous",
-       "rightslog": "Deretos de is usuàrios",
+       "newuserlogpage": "Impitadores nous",
+       "rightslog": "Deretos de is impitadores",
        "action-read": "lègher custa pàgina",
-       "action-edit": "acontzare custa pàgina",
+       "action-edit": "cambiare custa pàgina",
        "action-createpage": "creare pàginas",
        "action-move": "mòvere custa pàgina",
        "action-movefile": "mòvere custu file",
+       "action-upload": "carriga custu archìviu",
        "action-delete": "burrare custa pàgina",
        "action-browsearchive": "chircare pàginas fuliadas",
+       "action-sendemail": "imbiare emails",
+       "action-editmywatchlist": "cambiare sa lista de is pàginas annotadas tua",
+       "action-viewmywatchlist": "castiare sa lista de pàginas annotadas tua",
+       "action-viewmyprivateinfo": "castiare is informatzione privadas tuas",
+       "action-editmyprivateinfo": "cambiare is informatziones privadas tuas",
        "nchanges": "$1 {{PLURAL:$1|mudàntzia|mudàntzias}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dae s'ùrtima bisita}}",
+       "enhancedrc-history": "istòria",
        "recentchanges": "Ùrtimas mudàntzias",
-       "recentchanges-legend": "Possibilidades subra ùrtimas mudàntzias",
-       "recentchanges-feed-description": "Custu feed riportada is ùrtimas mudàntzias a is cuntènnidos de su giassu.",
-       "recentchanges-label-newpage": "Custu acontzu at creadu una pàgina noa",
-       "recentchanges-label-minor": "Custu est unu acontzu minore",
-       "recentchanges-label-bot": "Custu acontzu est stadu fatu dae unu bot",
+       "recentchanges-legend": "Optziones subra ùrtimas mudàntzias",
+       "recentchanges-summary": "Sighi is ùrtimas mudàntzias a sa wiki in custa pàgina.",
+       "recentchanges-feed-description": "Sighi is ùrtimas mudàntzias a sa wiki cun custu feed.",
+       "recentchanges-label-newpage": "Custu càmbiu at creadu una pàgina noa",
+       "recentchanges-label-minor": "Custu est unu càmbiu minore",
+       "recentchanges-label-bot": "Custu càmbiu est istadu fatu dae unu bot",
+       "recentchanges-label-unpatrolled": "Custu càmbiu no est istadu cumprobadu",
+       "recentchanges-label-plusminus": "Sa muda de sa mannesa de sa pàgina dae su nùmeru de bytes",
+       "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (càstia [[Special:NewPages|is pàginas noas]])",
-       "rcnotefrom": "{{PLURAL:$5|Sa chi sighit est sa mudàntzia|Sas chi sighint sunt sas mudàntzias}} dae <strong>$3, $4</strong> (amostadas fintzas a <strong>$1</strong>).",
+       "rcnotefrom": "{{PLURAL:$5|Sa chi sighit est sa mudàntzia|Is chi sighint sunt is mudàntzias}} dae <strong>$3, $4</strong> (ammustradas fintzas a <strong>$1</strong>).",
        "rclistfrom": "Ammustra mudàntzias dae $3 $2",
-       "rcshowhideminor": "$1 acontzos minores",
-       "rcshowhideminor-show": "Amosta",
+       "rcshowhideminor": "$1 is càmbios minores",
+       "rcshowhideminor-show": "Ammustra",
        "rcshowhideminor-hide": "Cua",
-       "rcshowhidebots": "$1 bots",
-       "rcshowhidebots-show": "Amosta",
+       "rcshowhidebots": "$1 is bots",
+       "rcshowhidebots-show": "Ammustra",
        "rcshowhidebots-hide": "Cua",
-       "rcshowhideliu": "$1 usuàrios registrados",
-       "rcshowhideliu-show": "Amosta",
+       "rcshowhideliu": "$1 is impitadores identificados",
+       "rcshowhideliu-show": "Ammustra",
        "rcshowhideliu-hide": "Cua",
-       "rcshowhideanons": "$1 usuàrios anònimos",
-       "rcshowhideanons-show": "Amosta",
+       "rcshowhideanons": "$1 is impitadores anònimos",
+       "rcshowhideanons-show": "Ammustra",
        "rcshowhideanons-hide": "Cua",
-       "rcshowhidepatr-show": "Amosta",
+       "rcshowhidepatr": "$1 càmbios cumprobados",
+       "rcshowhidepatr-show": "Ammustra",
        "rcshowhidepatr-hide": "Cua",
-       "rcshowhidemine": "$1 acontzos meos",
-       "rcshowhidemine-show": "Amosta",
+       "rcshowhidemine": "$1 is càmbios mios",
+       "rcshowhidemine-show": "Ammustra",
        "rcshowhidemine-hide": "Cua",
        "rclinks": "Ammustra is ùrtimas $1 mudàntzias fatas in is ùrtimas $2 dies<br />$3",
        "diff": "dif",
        "rc_categories_any": "Calesisiat",
        "rc-change-size": "$1",
        "newsectionsummary": "/* $1 */ setzione noa",
-       "rc-enhanced-expand": "Amosta particulares",
+       "rc-enhanced-expand": "Ammustra particulares",
        "rc-enhanced-hide": "Cua particulares",
        "recentchangeslinked": "Mudàntzias ligadas",
        "recentchangeslinked-feed": "Mudàntzias ligadas",
        "recentchangeslinked-toolbox": "Mudàntzias ligadas",
        "recentchangeslinked-title": "Mudàntzias ligadas a \"$1\"",
-       "recentchangeslinked-summary": "Custa est una lista de is mudàntzias fatas dae pagu a is pàginas ligadas a cussa spetzificada.\nIs pàginas de sa [[Special:Watchlist|watchlist tua]] sunt in '''grassu'''.",
+       "recentchangeslinked-summary": "Custa est una lista de is mudàntzias fatas dae pagu a is pàginas ligadas a cussa spetzificada.\nIs pàginas [[Special:Watchlist|annotadas dae tue]] sunt in <strong>grassu</strong>.",
        "recentchangeslinked-page": "Nùmene pàgina:",
        "recentchangeslinked-to": "Ammustra feti mudàntzias a pàginas ligadas a cussa spetzificada",
-       "upload": "Càrriga file",
-       "uploadbtn": "Càrriga file",
+       "upload": "Càrriga documentu",
+       "uploadbtn": "Càrriga documentu",
        "reuploaddesc": "Torra a su mòdulu pro su carrigamentu.",
        "uploadnologin": "Non ses intrau",
        "uploadnologintext": "Depes èsser $1 pro carrigare files.",
        "filereuploadsummary": "Mudàntzias a su file:",
        "filesource": "Orìgine:",
        "badfilename": "Su nùmene de su file est stadu cunvertidu in \"$1\".",
+       "illegal-filename": "Su nùmene de su documentu no est adduidu.",
+       "overwrite": "Remplasare unu documentu esistente no est adduidu.",
        "uploadwarning": "Avvisu de carrigamentu",
-       "savefile": "Sarva file",
+       "savefile": "Sarba documentu",
        "upload-source": "File de orìgine",
        "sourcefilename": "Nùmene de su file de orìgine:",
        "sourceurl": "Diretzione originària:",
        "destfilename": "Nùmene de su file de destinatzione:",
        "upload-description": "Descritzione de su file",
+       "upload-options": "Optziones de carrigamentu",
+       "watchthisupload": "Annota custu documentu",
        "upload-success-subj": "Carrigamentu acabau",
+       "upload-failure-subj": "Problema de carrimentu",
+       "upload-warning-subj": "Avisu de carrigamentu",
        "upload-file-error": "Faddina a intru",
-       "license": "Licèntzia:",
-       "license-header": "Licèntzia",
+       "backend-fail-notexists": "Su documentu $1 no esistit.",
+       "backend-fail-alreadyexists": "Su documentu \"$1\" esistit giai.",
+       "uploadstash": "Càrriga stash",
+       "img-auth-nofile": "Su File \"$1\" no esistit.",
+       "img-auth-streaming": "Letura currente de \"$1\".",
+       "license": "Litzèntzia:",
+       "license-header": "Litzèntzia",
+       "nolicense": "Nisciuna litzèntzia indicada",
+       "licenses-edit": "Càmbia su sèberu de sa licèntzia",
        "upload_source_file": "(su file seberadu in su computer tuo)",
+       "listfiles-delete": "Cantzella",
+       "listfiles_search_for": "Chirca figuras pro nùmene:",
        "imgfile": "file",
        "listfiles": "Lista de is files",
+       "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "listfiles_name": "Nùmene",
-       "listfiles_user": "Usuàriu",
+       "listfiles_user": "Impitadore",
        "listfiles_size": "Mannesa in byte",
        "listfiles_description": "Descritzione",
        "listfiles_count": "Versiones",
+       "listfiles-latestversion": "Versione atuale",
+       "listfiles-latestversion-yes": "Eja",
+       "listfiles-latestversion-no": "No",
        "file-anchor-link": "File",
        "filehist": "Stòria de su file",
        "filehist-help": "Carca unu grupu data/ora pro castiare su file comente si presentada in su tempus indicadu.",
        "filehist-deleteall": "fùlia totu",
        "filehist-deleteone": "cantzella",
        "filehist-revert": "fùrria",
-       "filehist-current": "currente",
+       "filehist-current": "atuale",
        "filehist-datetime": "Data/Ora",
        "filehist-thumb": "Miniatura",
        "filehist-thumbtext": "Miniatura de sa versione de is $1",
        "filehist-nothumb": "Peruna miniatura",
-       "filehist-user": "Usuàriu",
+       "filehist-user": "Impitadore",
        "filehist-dimensions": "Dimensiones",
        "filehist-filesize": "Mannesa de su file",
        "filehist-comment": "Cummentu",
        "imagelinks": "Ligant a custu file",
-       "linkstoimage": "{{PLURAL:$1|Sa pàgina ki sighit ligat|Is $1 pàginas ki sighint ligant}} a custu file:",
+       "linkstoimage": "{{PLURAL:$1|Sa pàgina chi sighit ligat|Is $1 pàginas chi sighint ligant}} a custu file:",
        "nolinkstoimage": "Peruna pàgina ligat a custu file.",
-       "sharedupload": "Custu file benit dae $1 e podet èssere impreau in àteros progetos.",
+       "linkstoimage-redirect": "$1 (reindiritzamentu file) $2",
+       "sharedupload": "Custu file benit dae $1 e podet èssere impreadu in àteros progetos.",
+       "sharedupload-desc-here": "Custu documentu benit dae $1 e podet èssere impreadu in àteros progetos.\nA sighire est ammustrada sa descritzione in sa sua [$2 pàgina de descritzione de su documentu].",
        "uploadnewversion-linktext": "Carriga una versione noa de custu file",
        "shared-repo-from": "dae $1",
        "filerevert-comment": "Motivu:",
        "filedelete": "Cantzella $1",
        "filedelete-legend": "Cantzella su file",
+       "filedelete-comment": "Motivu:",
        "filedelete-submit": "Cantzella",
        "filedelete-success": "Su file '''$1''' est istadu fuliau.",
+       "filedelete-otherreason": "Motivu diversu o agiuntivu:",
        "filedelete-reason-otherlist": "Àteru motivu",
+       "filedelete-edit-reasonlist": "Càmbia is motivos de sa burradura",
+       "mimesearch": "Chirca MIME",
+       "mimetype": "Genia MIME:",
        "download": "scàrriga",
-       "listredirects": "Lista de totu is redirects",
+       "unwatchedpages": "Pàginas no annotadas",
+       "listredirects": "Lista de totus is reindiritzamentos",
+       "listduplicatedfiles": "Lista de documentos dopios",
+       "unusedtemplates": "Templates no impreados",
+       "unusedtemplateswlh": "àteros ligòngios",
        "randompage": "Pàgina a sa tzurpa",
+       "randomincategory-category": "Categoria:",
        "statistics": "Statìsticas",
-       "statistics-header-users": "Statìsticas subra is usuàrios",
+       "statistics-header-pages": "Statìsticas subra is pàginas",
+       "statistics-header-edits": "Càmbia is statìsticas",
+       "statistics-header-views": "Càstia is statìsticas",
+       "statistics-header-users": "Statìsticas subra is impitadores",
+       "statistics-header-hooks": "Àteras statìsticas",
+       "statistics-articles": "Pàginas de càbidos",
        "statistics-pages": "Pàginas",
+       "statistics-files": "Documentos carrigados",
+       "pageswithprop-submit": "Bae",
        "doubleredirects": "Redirects dòpios",
        "doubleredirectstext": "Custa pàgina cuntenet una lista de pàginas ki re-indiritzant a àteras pàginas de re-indiritzamentu.\nOgni lìnia cuntenet ligàmines a su primu e a su de duos re-indiritzamentu, aici comente sa prima lìnia de sa de duos re-indiritzamentos, chi de sòlitu adòbiat s'artìculu \"beru\", a sa cale fintzas su primu re-indiritzamentu dia depet puntare.\nIs re-indiritzamentos <del>cantzellados</del> sunt stados curretos.",
        "brokenredirects": "Redirects isballiaus",
-       "brokenredirectstext": "Custus redirects ligant cun pàginas chi no esistint.",
-       "brokenredirects-edit": "acontza",
+       "brokenredirectstext": "Custos redirects ligant cun pàginas chi no esistint.",
+       "brokenredirects-edit": "càmbia",
        "brokenredirects-delete": "cantzella",
        "withoutinterwiki-legend": "Prefissu",
        "withoutinterwiki-submit": "Ammustra",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "ncategories": "$1 {{PLURAL:$1|categoria|categorias}}",
-       "nlinks": "$1 {{PLURAL:$1|ligàmene|ligàmenes}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
+       "nlinks": "$1 {{PLURAL:$1|ligòngiu|ligòngios}}",
        "nmembers": "$1 {{PLURAL:$1|cumponente|cumponentes}}",
        "nrevisions": "$1 {{PLURAL:$1|revisione|revisiones}}",
        "nviews": "$1 {{PLURAL:$1|bisura|bisuras}}",
        "lonelypages": "Pàginas burdas",
+       "uncategorizedpages": "Pàginas chentza categoria",
+       "uncategorizedcategories": "Categorias chentza categoria",
+       "uncategorizedimages": "Documentos chentza categoria",
+       "uncategorizedtemplates": "Templates chentza categoria",
+       "unusedcategories": "Categorias no impreadas",
        "unusedimages": "Files no impreaus",
        "popularpages": "Pàginas populares",
+       "wantedcategories": "Categorias chircadas",
        "wantedpages": "Artìculos prus chircados",
+       "wantedfiles": "Documentos chircados",
+       "wantedtemplates": "Templates chircados",
+       "mostlinked": "Pàginas su prus ligadas",
+       "mostlinkedcategories": "Categorias su prus ligadas",
+       "mostimages": "Documentos su prus ligados",
        "mostrevisions": "Pàginas cun prus revisiones",
        "prefixindex": "Ìndighe de is pàginas pro initziales",
        "shortpages": "Pàginas crutzas",
        "longpages": "Pàginas longas",
        "deadendpages": "Pàginas chentza bessida",
        "protectedpages": "Pàginas amparadas",
+       "protectedpages-page": "Pàgina",
+       "protectedpages-expiry": "Iscadit",
+       "protectedpages-reason": "Motivu",
+       "protectedpages-unknown-timestamp": "Isconnottu",
        "protectedtitles": "Tìtulus amparadus",
-       "listusers": "Lista usuàrios",
+       "listusers": "Lista impitadores",
        "usereditcount": "$1 {{PLURAL:$1|acontzu|acontzos}}",
        "usercreated": "{{GENDER:$3|Creadu}} su $1 a is $2",
        "newpages": "Pàginas noas",
-       "newpages-username": "Nùmene usuàriu:",
-       "move": "Movi",
+       "newpages-username": "Nùmene impitadore:",
+       "move": "Move",
        "movethispage": "Move custa pàgina (càmbia su tìtulu)",
-       "unusedimagestext": "Is files ki sighint sunt stados carrigados ma non sunt impreados.\nDia podent essere immàgines impreadas dae àteros giassos cun unu ligàmine diretu, e tando podent essere listados inoghe comente usu ativu.",
+       "unusedimagestext": "Is documentos chi sighint sunt istados carrigados ma non sunt impreados.\nDia podent èssere immàgines impreadas dae àteros giassos cun unu ligòngiu diretu, e tando podent èssere listados inoghe comente usu ativu.",
        "notargettitle": "Perunu obietivu",
-       "notargettext": "Non hai specificato una pagina o un Utente in relazione al quale eseguire l'operazione richiesta.",
+       "notargettext": "Non as ispetzificadu una pàgina o unu impitadore pro issucutare custa funtzione.",
        "pager-newer-n": "{{PLURAL:$1|1 prus nou|$1 prus nous}}",
        "pager-older-n": "{{PLURAL:$1|1 prus betzu|$1 prus betzos}}",
        "booksources": "Fontes libràrias",
        "booksources-search-legend": "Chirca fontes libràrias",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Bae",
        "specialloguserlabel": "Atzione fata dae:",
        "speciallogtitlelabel": "Atzione fata subra:",
        "log": "Registros",
-       "allpages": "Totu is pàginas",
+       "allpages": "Totus is pàginas",
        "prevpage": "Pàgina in antis ($1)",
        "allpagesfrom": "Ammustra pàginas a partire dae:",
        "allpagesto": "Ammustra pàginas fintzas a:",
-       "allarticles": "Totu is pàginas",
-       "allinnamespace": "Totu is pàginas (nùmene-logu $1)",
+       "allarticles": "Totus is pàginas",
+       "allinnamespace": "Totus is pàginas (nùmene-logu $1)",
        "allpagessubmit": "Bae",
        "allpages-bad-ns": "Su nùmene-logu \"$1\" non esistit in {{SITENAME}}.",
        "categories": "Categorias",
        "linksearch": "Chirca acàpios de foras",
        "linksearch-ns": "Nùmene-logu:",
        "linksearch-ok": "Chirca",
+       "linksearch-line": "$1 est ligadu in sa pàgina $2",
        "listusers-submit": "Ammustra",
+       "listusers-blocked": "(blocadu)",
        "activeusers-hidebots": "Cua bots",
        "activeusers-hidesysops": "Cua amministradores",
        "listgrouprights-group": "Grupu",
+       "listgrouprights-rights": "Deretos",
        "listgrouprights-members": "(lista de is cumponentes)",
-       "mailnologintext": "Depes èsser [[Special:UserLogin|identificadu (login)]] e àer registradu un'indiritzu e-mail vàlidu in is [[Special:Preferences|preferèntzias tuas]] pro imbiare e-mail a àteros usuàrios.",
-       "emailuser": "E-mail a custu usuàriu",
-       "emailpage": "Ispedi una missada a s'usuàriu",
-       "emailpagetext": "Imprea su mòdulu a suta pro ispedire una missada eletrònica a custu usuàriu.\nS'indiritzu chi as insertadu in is [[Special:Preferences|preferèntzias usuàriu tuas]] at a pàrrere comente su chi at ispedidu sa e-mail, pro fàghere sa manera chi su destinatàriu ti respundat deretu.",
-       "defemailsubject": "Missada dae s'usuàriu \"$1\" de {{SITENAME}}",
+       "listgrouprights-namespaceprotection-namespace": "Nùmene-logu",
+       "mailnologintext": "Depes èsser [[Special:UserLogin|identificadu (login)]] e àere registradu un'indiritzu email vàlidu in is [[Special:Preferences|preferèntzias tuas]] pro imbiare email a àteros impitadores.",
+       "emailuser": "Imbia una email a custu impitadore",
+       "emailuser-title-notarget": "Ispedi una email a s'impitadore",
+       "emailpage": "Ispedi una email a s'impitadore",
+       "emailpagetext": "Imprea su mòdulu a suta pro ispedire una email a custu impitadore.\nS'indiritzu chi as insertadu in is [[Special:Preferences|preferèntzias impitadore tuas]] at a pàrrere comente su chi at ispedidu sa e-mail, pro fàghere sa manera chi su destinatàriu ti respundat deretu.",
+       "defemailsubject": "Missada dae \"$1\", impitadore de {{SITENAME}}",
        "noemailtitle": "Perunu indiritzu e-mail",
-       "noemailtext": "Custu usuàriu no at ispetzificadu un indiritzu e-mail vàlidu.",
-       "email-legend": "Imbia una missada e-mail a un àteru usuàriu de {{SITENAME}}",
+       "noemailtext": "Custu impitadore no at ispetzificadu unu indiritzu email vàlidu.",
+       "emailusername": "Nùmene impitadore:",
+       "email-legend": "Imbia una missada e-mail a un àteru impitadore de {{SITENAME}}",
        "emailfrom": "Dae:",
        "emailto": "A:",
        "emailsubject": "Ogetu:",
        "emailsent": "E-mail ispedia",
        "emailsenttext": "Sa e-mail tua est istada imbiada.",
        "usermessage-editor": "Missu de su sistema",
-       "watchlist": "Sa watchlist mea",
+       "watchlist": "Pàginas annotadas",
        "mywatchlist": "Pàginas annotadas",
+       "watchlistfor2": "Pro $1 $2",
        "nowatchlist": "No as indicadu pàginas in sa watchlist tua.",
        "watchnologin": "No intrau (log in)",
        "addedwatchtext": "Sa pàgina \"[[:$1]]\" est istada aciunta a sa [[Special:Watchlist|watchlist]] tua.\nIs mudàntzias de custa pàgina e de sa pàgina de cuntierras sua ant a benner elencadas inoe.",
        "removedwatchtext": "Sa pàgina  \"[[:$1]]\" est istada tirada dae sa [[Special:Watchlist|watchlist tua]].",
-       "watch": "Pone in sa watchlist",
+       "watch": "Annota",
        "watchthispage": "Pone ogru a custu artìculu",
-       "unwatch": "Tira dae sa watchlist",
+       "unwatch": "Tira dae is pàginas annotadas",
        "unwatchthispage": "Boga custa pàgina dae sa watchlist tua",
        "notanarticle": "Custa pàgina no est unu artìculu",
-       "watchlist-details": "Sa watchlist tua cuntènnit {{PLURAL:$1|$1 pàgina|$1 pàginas}}, chentza contare is pàginas de cuntierras.",
-       "wlshowlast": "Ammustra is ùrtimas $1 oras $2 dies $3",
-       "watchlist-options": "Possibilidades subra sa watchlist",
+       "watchlist-details": "Tenes {{PLURAL:$1|$1 pàgina annotada paris a sa pagina de cuntierra sua|$1 pàginas annotadas paris a is pàginas de cuntierra issoro}}.",
+       "wlshowlast": "Ammustra is ùrtimas $1 oras, $2 dies",
+       "watchlist-options": "Optziones subra sa lista de pàginas annotadas",
        "watching": "Giunghende a sa watchlist...",
        "unwatching": "Boghende dae sa watchlist...",
-       "enotif_impersonal_salutation": "Usuàriu de {{SITENAME}}",
+       "enotif_impersonal_salutation": "Impitadore de {{SITENAME}}",
+       "enotif_anon_editor": "impitadore anònimu $1",
        "created": "creada",
        "deletepage": "Fùlia pàgina",
        "confirm": "Cunfima",
        "excontent": "su cuntènnidu fiat: '$1'",
-       "excontentauthor": "su cuntènnidu fiat: '$1' (e s'ùnicu contribudori fiat '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "su cuntènnidu fiat: '$1' (e s'ùnicu contribudore fiat '[[Special:Contributions/$2|$2]]')",
        "delete-confirm": "Fùlia \"$1\"",
        "delete-legend": "Fuliare",
        "confirmdeletetext": "Ses acanta de burrare una pàgina cun totu su stòria sua.\nPro praxere, cunfirma ca est intentzione tua fàgher custu, ca connosches is cosseguèntzias de s'atzione tua, a ca custa est cunforma a is [[{{MediaWiki:Policy-url}}|lìnias polìticas]].",
        "rollback": "Annudda is acontzos",
        "rollbacklink": "rollback",
        "rollbackfailed": "Rollback faddidu",
-       "cantrollback": "Non si podet furriare s'acontzu;\ns'ùrtimu contribuidore est s'ùnicu autore de custa pàgina.",
+       "cantrollback": "Non si podet furriare sa modìfica;\ns'ùrtimu contribuidore est s'ùnicu autore de custa pàgina.",
        "revertpage": "Burradas is mudàntzias de [[Special:Contributions/$2|$2]] ([[User talk:$2|cuntierras]]), torrada a sa versione cabudiana de [[User:$1|$1]]",
-       "protectlogpage": "Amparaduras",
-       "protectedarticle": "at amparau \"[[$1]]\"",
+       "protectlogpage": "Bardaduras",
+       "protectedarticle": "at bardadu \"[[$1]]\"",
        "modifiedarticleprotection": "at cambiau su livellu de amparadura pro \"[[$1]]\"",
+       "prot_1movedto2": "[[$1]] est istada mòvida a [[$2]]",
+       "protect-legend": "Cunfirma amparadura",
        "protectcomment": "Motivu:",
        "protectexpiry": "Iscadèntzia:",
        "protect_expiry_invalid": "S'iscadèntzia est imbàlida.",
        "protect_expiry_old": "Iscadentzia giai passada.",
        "protect-text": "Custu modulu serbit pro castiari e cambiari su livellu de amparadura de sa pàgina '''$1'''.",
        "protect-locked-access": "Non tenes su permissu pro cambiare is livellus de amparadura de sa pàgina.\nIs impostatziones atuales pro sa pàgina '''$1''':",
-       "protect-cascadeon": "A su momentu custa pàgina est bloccada pro ite est inclùdia {{PLURAL:$1|in sa pàgina indicada a suta, pro sa cali|in is pàginas indicadas a suta, pro is calis}} est ativa s'amparadura ricorsiva. Est possìbile cambiare su livellu de amparadura de custa pàgina, ma is impostatziones derivadas dae s'amparadura ricorsiva non ant a èssere mudadas.",
-       "protect-default": "Autoritza totu is usuàrios",
-       "protect-fallback": "Esigit su permissu \"$1\"",
-       "protect-level-autoconfirmed": "Blocca is usuàrios nobos o non registrados",
-       "protect-level-sysop": "Isceti aministradores",
+       "protect-cascadeon": "A su momentu custa pàgina est bardada pro ite est inclùdida {{PLURAL:$1|in sa pàgina indicada a suta, pro sa cale|in is pàginas indicadas a suta, pro is cales}} est ativa sa bardadura ricorsiva.\nEst possìbile cambiare su livellu de bardadura de custa pàgina, ma is efetos derivados dae sa bardadura ricorsiva non ant a èssere mudados.",
+       "protect-default": "Autoriza totus is impitadores",
+       "protect-fallback": "Permìtidu feti a is impitadores cun su permissu \"$1\"",
+       "protect-level-autoconfirmed": "Permìtidu feti a is impitadores autocunfimados",
+       "protect-level-sysop": "Permìtidu feti a is amministradores",
        "protect-summary-cascade": "ricorsiva",
        "protect-expiring": "iscadèntzia: $1 (UTC)",
+       "protect-expiring-local": "iscadit su $1",
        "protect-cascade": "Ampara totu is pàginas inclùdias in custa (amparadura ricorsiva)",
-       "protect-cantedit": "Non podes cambiare is livellus de amparadura pro sa pàgina, pro ite non tenes su permissu de acontzare sa pàgina etotu.",
+       "protect-cantedit": "Non podes cambiare is livellus de amparadura pro sa pàgina, pro ite non tenes su permissu de cambiare sa pàgina etotu.",
        "protect-othertime": "Àteru perìodu:",
+       "protect-othertime-op": "àteru perìodu",
+       "protect-otherreason": "Motivu diversu o agiuntivu:",
+       "protect-otherreason-op": "Àteru motivu",
        "protect-expiry-options": "1 ora:1 hour,1 die:1 day,1 chida:1 week,2 chidas:2 weeks,1 mese:1 month,3 meses:3 months,6 meses:6 months,1 annu:1 year,infinidu:infinite",
        "restriction-type": "Permissu:",
        "restriction-level": "Livellu de restritzioni:",
        "pagesize": "(bytes)",
-       "restriction-edit": "Acontzadura",
+       "restriction-edit": "Modìfica",
        "restriction-move": "Movimentu",
        "restriction-create": "Creatzione",
        "restriction-upload": "Carrigadroxiu",
        "undeleterevisions": "$1 {{PLURAL:$1|revisione|revisiones}} in archìviu",
        "undeletehistory": "Restaurende custa pàgina, totu is revisiones ant a torrare in sa istòria sua.\nChi est istada creada una pàgina cun su matessi tìtulu, is revisiones recuperadas ant a insertare in sa istoria in antis.",
        "undeletebtn": "Ripristina",
-       "undeletelink": "càstia/riprìstina",
-       "undeleteviewlink": "abbista",
+       "undeletelink": "càstia/torra che prima",
+       "undeleteviewlink": "ammustra",
        "undeleteinvert": "Fùrria sa seletzione",
        "undeletecomment": "Motivu:",
        "undeletedrevisions": "{{PLURAL:$1|1 revisione restaurada|$1 revisiones restauradas}}",
        "undeletedrevisions-files": "{{PLURAL:$1|1 revisione|$1 revisiones}} e {{PLURAL:$2|1 file|$2 files}} restaurados",
        "undeletedfiles": "{{PLURAL:$1|1 file restauradu|$1 files restaurados}}",
+       "undelete-search-title": "Chirca pàginas burradas",
        "undelete-search-box": "Chirca pàginas fuliadas",
        "undelete-search-prefix": "Ammustra is pàginas ca su tìtulu cumentzat cun:",
        "undelete-search-submit": "Chirca",
        "undelete-show-file-submit": "Eja",
        "namespace": "Nùmene-logu:",
        "invert": "Fùrria sa seletzione",
+       "namespace_association": "Nùmene-logu assotziadu",
        "blanknamespace": "(Printzipale)",
-       "contributions": "Contributziones {{GENDER:$1|usuàriu}}",
+       "contributions": "Contributos {{GENDER:$1|impitadore}}",
        "contributions-title": "Contributziones de $1",
-       "mycontris": "Contributziones meas",
+       "mycontris": "Contributos mios",
        "contribsub2": "Pro {{GENDER:$3|$1}} ($2)",
        "nocontribs": "Nessuna modifica trovata conformemente a questi criteri.",
        "uctop": "(atuale)",
-       "month": "Dae su mese (e in antis):",
-       "year": "Dae s'annu (e in antis):",
-       "sp-contributions-newbies": "Ammustra feti is contributziones de is accounts noos",
+       "month": "Dae su mese (e in segus):",
+       "year": "Dae s'annu (e in segus):",
+       "sp-contributions-newbies": "Ammustra feti is contributziones de is contos noos",
+       "sp-contributions-newbies-sub": "Pro is contos noos",
        "sp-contributions-blocklog": "registru de is bloccos",
+       "sp-contributions-uploads": "carrigamentos",
+       "sp-contributions-logs": "registros",
        "sp-contributions-talk": "cuntierra",
-       "sp-contributions-search": "Chirca contributziones",
-       "sp-contributions-username": "Indiritzu IP o nùmene usuàriu:",
+       "sp-contributions-search": "Chirca contributos",
+       "sp-contributions-username": "Indiritzu IP o nùmene impitadore:",
+       "sp-contributions-toponly": "Ammustra feti is contributos chi sunt is ùrtimas versiones pro sa pàgina",
+       "sp-contributions-newonly": "Ammustra feti is càmbios chi ant creadu pàginas noas",
        "sp-contributions-submit": "Chirca",
        "whatlinkshere": "Pàginas chi ligant a custa",
        "whatlinkshere-title": "Pàginas chi ligant a \"$1\"",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere": "Sas pàginas chi sighint ligant a '''[[:$1]]''':",
+       "linkshere": "Is pàginas chi sighint ligant a '''[[:$1]]''':",
        "nolinkshere": "Peruna pàgina ligat a '''[[:$1]]'''.",
        "nolinkshere-ns": "Peruna pàgina ligat a '''[[:$1]]''' in su nùmene-logu seberadu.",
-       "isredirect": "redirect",
+       "isredirect": "pàgina de reindiritzamentu",
        "istemplate": "inclusione",
-       "isimage": "acàpiu a file",
-       "whatlinkshere-prev": "{{PLURAL:$1|cabudianu|cabudianos $1}}",
+       "isimage": "ligòngiu a documentu",
+       "whatlinkshere-prev": "{{PLURAL:$1|pretzedente|pretzedentes $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|imbeniente|imbenientes $1}}",
-       "whatlinkshere-links": "← acàpius",
-       "whatlinkshere-hideredirs": "$1 redirects",
-       "whatlinkshere-hidetrans": "$1 inclusionis",
-       "whatlinkshere-hidelinks": "$1 acàpius",
+       "whatlinkshere-links": "← ligòngios",
+       "whatlinkshere-hideredirs": "$1 is reindiritzamentos",
+       "whatlinkshere-hidetrans": "$1 inclusiones",
+       "whatlinkshere-hidelinks": "$1 ligòngios",
+       "whatlinkshere-hideimages": "$1 is ligòngios a documentu",
        "whatlinkshere-filters": "Filtros",
-       "blockip": "Blocca {{GENDER:$1|usuàriu}}",
-       "blockip-legend": "Blocca usuàriu",
+       "blockip": "Blocca {{GENDER:$1|impitadore}}",
+       "blockip-legend": "Blocca impitadore",
        "blockiptext": "Usa il modulo sottostante per bloccare l'accesso con diritto di scrittura da uno specifico indirizzo IP. Questo blocco deve essere operato SOLO per prevenire atti di vandalismo, ed in stretta osservanza dei principi tutti della [[{{MediaWiki:Policy-url}}|policy di {{SITENAME}}]]. Il blocco non può in nessun caso essere applicato per motivi ideologici.\nScrivi un motivo specifico per il quale questo indirizzo IP dovrebbe a tuo avviso essere bloccato (per esempio, cita i titoli di pagine eventualmente già oggetto di vandalismo editoriale).",
-       "ipaddressorusername": "Indiritzu IP o nùmene usuàriu:",
+       "ipaddressorusername": "Indiritzu IP o nùmene impitadore:",
        "ipbexpiry": "Scadèntzia:",
        "ipbreason": "Motivu:",
-       "ipbsubmit": "Blocca custu usuàriu",
+       "ipbsubmit": "Blocca custu impitadore",
        "ipbother": "Àteru perìodu:",
        "ipboptions": "2 oras:2 hours,1 die:1 day,3 dies:3 days,1 chida:1 week,2 chidas:2 weeks,1 mese:1 month,3 meses:3 months,6 meses:6 months,1 annu:1 year,infinidu:infinite",
        "badipaddress": "S'indiritzu IP indicadu non est currègidu.",
        "blockipsuccesssub": "Bloccu esecutivu",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] è stadu bloccadu. <br />\nCàstia sa [[Special:BlockList|lista de bloccados]] pro bìder sas bloccaduras.",
-       "ipb-edit-dropdown": "Acontza su motivu de su bloccu",
+       "ipb-edit-dropdown": "Càmbia su motivu de su bloccu",
        "ipb-unblock-addr": "Sblocca $1",
        "ipb-blocklist-contribs": "Contributziones de {{GENDER:$1|$1}}",
-       "unblockip": "Sblocca s'usuàriu",
+       "unblockip": "Sblocca s'impitadore",
        "unblockiptext": "Usa il modulo sottostante per restituire il diritto di scrittura ad un indirizzo IP precedentemente bloccato.",
        "ipusubmit": "Boga custu bloccu",
-       "ipblocklist": "Usuàrios bloccados",
+       "ipblocklist": "Impitadores bloccados",
+       "blocklist-expiry": "Iscadit",
+       "blocklist-reason": "Motivu",
        "ipblocklist-submit": "Chirca",
        "infiniteblock": "infinitu",
        "expiringblock": "scadit su $1 a is $2",
-       "blocklink": "blocca",
+       "blocklink": "arrea",
        "unblocklink": "sblocca",
-       "change-blocklink": "tramuda su bloccu",
-       "contribslink": "contributziones",
-       "blocklogpage": "Bloccos de usuàrios",
+       "change-blocklink": "tramuda s'arreu",
+       "contribslink": "contributos",
+       "emaillink": "imbia email",
+       "blocklogpage": "Bloccos de impitadores",
        "blocklogentry": "bloccau [[$1]] pro unu tempu de $2 $3",
        "unblocklogentry": "at sbloccau $1",
-       "block-log-flags-nocreate": "creatzione account bloccada",
+       "block-log-flags-nocreate": "registrazione bloccada",
        "sorbs": "DNSBL",
        "lockdb": "Blocca su database",
        "unlockdb": "Sblocca su database",
        "movepagetext": "Cun custu mòdellu podes renumenare una pàgina, movende totu sa stòria sua a sa pàgina noa.\nSu tìtulu bèciu at a diventare una pàgina de reindiritzamentu a su tìtulu nou.\nPodes agiornare automaticamente is redirects ca ligant a su tìtulu originàriu.\nSi sèberas de no, assicura·ti de controllare pro [[Special:DoubleRedirects| reindiritzaduras dòpias]] o [[Special:BrokenRedirects|sballiadas]].\nSes responsàbile de t'assigurare ca is cullegamentos sighint a puntare  a ue depent puntare.\n\nAnnota ca sa pàgina <strong>non</strong> s'at a mòver si nde esistit giai un'àtera a su tìtulu nou, si no est ki siat bùida o cun sceti unu reindiritzamentu a sa bècia e siat chentza acontzos in antis. In casu de movimentu sballiadu, duncas, si podet torrare a su tìtulu bèciu, ma non podes subrascrìer una pàgina chi giai esistit.\n\n<strong>ATENTZIONE!</strong>\nUnu cambiamentu dràsticu podet creare problemas, mescamente a is pàginas prus populares;\npro praxere depes èsser seguru de àer cumpresu is cunsighèntzias prima de sighire a in antis.",
        "movepagetalktext": "Sa pàgina cuntierras asotziada, chi esistit, at a èssere movida automaticamenti impare a sa pàgina base, '''a parte in custos casos''':\n* su movimentu de sa pàgina est intre namespaces diversos;\n* in currispondèntzia de su tìtulu nou esistit giai una pàgina de cuntierras (non bùida);\n* sa casella inoe in bàsciu no est istata sceberada.\n\nIn custos casos, si cheres, depes mòvere a manu su cuntènnidu de sa pàgina.",
        "movearticle": "Move sa pàgina",
-       "movenologintext": "Depes èsser unu usuàriu registradu e [[Special:UserLogin|identificadu]] pro pòder mòver una pàgina",
+       "movenologintext": "Depes èsser unu impitadore registradu e [[Special:UserLogin|identificadu]] pro pòder mòver una pàgina",
        "newtitle": "Tìtulu nou:",
        "move-watch": "Pone ogru a custa pàgina",
        "movepagebtn": "Move sa pàgina",
        "pagemovedsub": "Movimentu andadu bene",
        "movepage-moved": "'''\"$1\" est istada mòvida a \"$2\"'''",
+       "movepage-moved-redirect": "Unu reindiritzamentu est istadu creadu.",
        "articleexists": "Una pàgina cun custu nùmene esistit giai, o su nùmene ki as seberadu no est bàlidu.\nPro praxere sèbera un'àteru nùmene.",
        "movetalk": "Move sa pàgina de cuntierra galu",
        "movelogpage": "Moviduras",
        "immobile-source-page": "Non si podet mòver custa pàgina.",
        "move-leave-redirect": "Lassa unu reindiritzamentu a palas",
        "export": "Esporta pàginas",
+       "export-submit": "Esporta",
+       "export-addcat": "Annanghe",
+       "export-addns": "Annanghe",
        "export-download": "Sarba comente file",
        "allmessagesname": "Nùmene",
+       "allmessagesdefault": "Testu predefinidu",
        "allmessages-filter-legend": "Filtru",
        "allmessages-filter-all": "Totu",
        "allmessages-language": "Limba:",
        "allmessages-filter-submit": "Bae",
        "allmessages-filter-translate": "Tradui",
        "thumbnail-more": "Amannia",
+       "thumbnail_error": "Faddina creande sa miniatura: $1",
+       "import-interwiki-sourcewiki": "Wiki de orìgine:",
+       "import-interwiki-sourcepage": "Pàgina de orìgine:",
+       "import-interwiki-submit": "Importa",
        "import-interwiki-namespace": "Nùmene-logu de destinatzione:",
        "import-upload-filename": "Nùmene file:",
        "import-comment": "Cummentu:",
-       "tooltip-pt-userpage": "Sa pàgina usuàriu tua",
+       "importstart": "Importande is pàginas...",
+       "import-revision-count": "$1 {{PLURAL:$1|revisione|revisiones}}",
+       "importlogpage": "Importatziones",
+       "tooltip-pt-userpage": "Sa pàgina impitadore tua",
        "tooltip-pt-mytalk": "Sa pàgina de is cuntierras tuas",
-       "tooltip-pt-preferences": "Is preferèntzias chi podes scioberai",
-       "tooltip-pt-watchlist": "Sa lista de is pàginas chi tue ses ponende ogru",
-       "tooltip-pt-mycontris": "Sa lista de is contributziones meas",
-       "tooltip-pt-login": "Si cunsìgiat sa registratzione; mancari non siat obligatoria",
+       "tooltip-pt-preferences": "Is preferèntzias chi podes seberare",
+       "tooltip-pt-watchlist": "Lista de is pàginas annotadas dae tue pro is mudàntzias",
+       "tooltip-pt-mycontris": "Sa lista de is contributos mios",
+       "tooltip-pt-login": "Sa registratzione est cussigiada; mancari chi non siat obligatoria",
        "tooltip-pt-logout": "Essida (log out)",
-       "tooltip-ca-talk": "Cuntierras a propositu de su cuntestu de sa pàgina",
-       "tooltip-ca-edit": "Podes acontzare custa pàgina.\nPro praxere, prima de sarbare càstia s'antiprima",
-       "tooltip-ca-addsection": "Incumintza una setzione noa",
-       "tooltip-ca-viewsource": "Sa pàgina est amparada.\nPodes castiare sa mitza sua",
+       "tooltip-ca-talk": "Cuntierras a propòsitu de su cuntestu de sa pàgina",
+       "tooltip-ca-edit": "Podes modificare custa pàgina.\nPro praghere, prima de sarbare càstia s'antiprima",
+       "tooltip-ca-addsection": "Incumentza una setzione noa",
+       "tooltip-ca-viewsource": "Sa pàgina est bardada.\nPodes castiare sa mitza sua",
        "tooltip-ca-history": "Versiones coladas de custa pàgina",
-       "tooltip-ca-protect": "Ampara custa pàgina",
-       "tooltip-ca-delete": "Fùlia custa pàgina",
+       "tooltip-ca-protect": "Barda custa pàgina",
+       "tooltip-ca-delete": "Burra custa pàgina",
        "tooltip-ca-move": "Move custa pàgina (càmbia su tìtulu)",
-       "tooltip-ca-watch": "Giunghe custa pàgina a sa ''watchlist'' tua",
-       "tooltip-ca-unwatch": "Tira custa pàgina da sa watchlist tua",
-       "tooltip-search": "Chirca a intru de {{SITENAME}}",
-       "tooltip-search-go": "Anda a una pàgina cun custu nùmene, si esistit",
-       "tooltip-search-fulltext": "Chirca custu testu in sas pàginas",
+       "tooltip-ca-watch": "Annota custa pàgina pro is mudàntzias",
+       "tooltip-ca-unwatch": "Rimove custa pàgina dae sa lista de pàginas annotadas tua",
+       "tooltip-search": "Chirca in intru de {{SITENAME}}",
+       "tooltip-search-go": "Bae a una pàgina cun su nùmene indicadu, si esistit",
+       "tooltip-search-fulltext": "Chirca custu testu in is pàginas",
        "tooltip-p-logo": "Bìsita sa pàgina base",
        "tooltip-n-mainpage": "Bìsita sa pàgina base",
        "tooltip-n-mainpage-description": "Bìsita sa pàgina base",
        "tooltip-n-portal": "Descritzione de su progetu, ite podes fàgher, a innue agatas is cosas",
-       "tooltip-n-currentevents": "Informatziones subra acuntèssias atuales",
-       "tooltip-n-recentchanges": "Sa lista de is ùrtimas mudàntzias de su giassu",
+       "tooltip-n-currentevents": "Informatziones subra acadessimentos atuales",
+       "tooltip-n-recentchanges": "Lista de is ùrtimas mudàntzias in su giassu",
        "tooltip-n-randompage": "Càrriga una pàgina a sorte",
        "tooltip-n-help": "Pàginas de agiudu",
        "tooltip-t-whatlinkshere": "Lista de totu is pàginas chi ligant a custa",
        "tooltip-t-recentchangeslinked": "Lista de is ùrtimas mudàntzias de is pàginas ki ligant a custa",
        "tooltip-feed-rss": "RSS feed pro custa pàgina",
        "tooltip-feed-atom": "Atom feed pro custa pàgina",
-       "tooltip-t-contributions": "Càstia sa lista de is contributziones de custu usuàriu",
-       "tooltip-t-emailuser": "Ispedi una missada eletronica a custu usuàriu",
-       "tooltip-t-upload": "Càrriga file multimediale",
+       "tooltip-t-contributions": "Càstia sa lista de is contributos de custu impitadore",
+       "tooltip-t-emailuser": "Ispedi una email a custu impitadore",
+       "tooltip-t-upload": "Càrriga documentu multimediale",
        "tooltip-t-specialpages": "Lista de is pàginas ispetziales",
        "tooltip-t-print": "Versione de custa pàgina pro s'imprenta",
-       "tooltip-t-permalink": "Cullegamentu permanente a custa versione de sa pàgina",
+       "tooltip-t-permalink": "Ligòngiu permanente a custa versione de sa pàgina",
        "tooltip-ca-nstab-main": "Càstia su cuntènnidu de sa pàgina",
-       "tooltip-ca-nstab-user": "Càstia sa pàgina usuàriu",
-       "tooltip-ca-nstab-special": "Custa est una pàgina ispetziale, non dda podes acontzare",
+       "tooltip-ca-nstab-user": "Càstia sa pàgina impitadore",
+       "tooltip-ca-nstab-special": "Custa est una pàgina ispetziale, non si podet modificare",
        "tooltip-ca-nstab-project": "Càstia sa pàgina de servìtziu",
        "tooltip-ca-nstab-image": "Càstia sa pàgina de su file",
        "tooltip-ca-nstab-template": "Càstia su template",
        "tooltip-ca-nstab-category": "Càstia sa pàgina de sa categoria",
-       "tooltip-minoredit": "Signa comente acontzu minore",
-       "tooltip-save": "Sarva is mudàntzias tuas",
-       "tooltip-preview": "Antiprima de is mudàntzias, pro pregeri usa custu prima de sarvari!",
-       "tooltip-diff": "Ammustra is mudàntzias ki as fatu a su testu",
+       "tooltip-minoredit": "Marca custa muda comente càmbiu minore",
+       "tooltip-save": "Sarba is càmbios tuos",
+       "tooltip-preview": "Antiprima de is mudas fatas, pro praghere usa custu prima de sarvare!",
+       "tooltip-diff": "Ammustra is mudàntzias chi as fatu a su testu",
        "tooltip-compareselectedversions": "Càstia is diferèntzias de is duas versiones seberadas de custa pàgina",
-       "tooltip-watch": "Aciungi custa pàgina a sa watchlist tua",
+       "tooltip-watch": "Annota custa pàgina pro is mudàntzias",
        "tooltip-recreate": "Torra a creare sa pàgina mancari siat stada fuliada",
        "tooltip-upload": "Cumentza a carrigare",
-       "tooltip-rollback": "\"Rollback\" annudda is mudàntzias de custa pàgina fatas dae s'ùrtimu contribudori",
-       "tooltip-undo": "\"Annudda\" fùrriat custu acontzu e aberit su mòdulu de acontzu comente antiprima.\nPodes agiùnger unu motivu in s'ogetu de s'acontzu.",
-       "siteuser": "$1, {{GENDER:$1|usuàriu|usuària}} de {{SITENAME}}",
-       "anonuser": " $1, usuàriu anònimu de {{SITENAME}}",
+       "tooltip-rollback": "\"Rollback\" annudda is mudàntzias de custa pàgina fatas dae s'ùrtimu contribudore",
+       "tooltip-undo": "\"Annudda\" fùrriat custu càmbiu e aberit su mòdulu de càmbiu comente antiprima.\nPodes annànghere unu motivu in s'ogetu.",
+       "tooltip-preferences-save": "Sarba preferèntzias",
+       "tooltip-summary": "Inserta unu resumu curtzu",
+       "siteuser": "$1, impitadore de {{SITENAME}}",
+       "anonuser": "$1, impitadore anònimu de {{SITENAME}}",
        "others": "àteros",
-       "siteusers": "$1, {{PLURAL:$2|usuàriu|usuàrios}} de {{SITENAME}}",
-       "anonusers": "$1, {{PLURAL:$2|usuàriu anònimu|usuàrios anònimos}} de {{SITENAME}}",
+       "siteusers": "$1, {{PLURAL:$2|impitadore|impitadores}} de {{SITENAME}}",
+       "anonusers": "$1, {{PLURAL:$2|impitadore anònimu|impitadores anònimos}} de {{SITENAME}}",
        "creditspage": "Autores de sa pàgina",
-       "previousdiff": "← Acontzu in antis",
-       "nextdiff": "Acontzu in fatu →",
+       "pageinfo-title": "Informatziones pro \"$1\"",
+       "pageinfo-header-basic": "Informatziones de base",
+       "pageinfo-header-edits": "Istòria de is mudàntzias",
+       "pageinfo-header-restrictions": "Protetzione de sa pàgina",
+       "pageinfo-display-title": "Tìtulu visadu",
+       "pageinfo-default-sort": "Critèriu de ordinamentu predefinidu",
+       "pageinfo-length": "Longària de sa pàgina (in bytes)",
+       "pageinfo-article-id": "ID pàgina",
+       "pageinfo-language": "Limba de su cuntènnidu de sa pàgina",
+       "pageinfo-content-model": "Modellu de su cuntènnidu de sa pàgina",
+       "pageinfo-robot-policy": "Inditzizatzione pro is robots",
+       "pageinfo-robot-index": "Adduida",
+       "pageinfo-firstuser": "Creadore de sa pàgina",
+       "pageinfo-firsttime": "Data de creatzione de sa pàgina",
+       "pageinfo-lastuser": "Ùrtimu contribudore",
+       "pageinfo-lasttime": "Data de s'ùrtimu càmbiu",
+       "pageinfo-edits": "Nùmeru totale de càmbios",
+       "pageinfo-authors": "Nùmeru totale de autores dislindados",
+       "pageinfo-toolboxlink": "Informatziones pro sa pàgina",
+       "pageinfo-redirectsto-info": "info",
+       "pageinfo-contentpage-yes": "Eja",
+       "pageinfo-protect-cascading-yes": "Eja",
+       "pageinfo-category-pages": "Nùmeru de pàginas",
+       "pageinfo-category-subcats": "Nùmeru de sutacategorias",
+       "pageinfo-category-files": "Nùmeru de documentos",
+       "markaspatrolleddiff": "Marca comente cumprobadu",
+       "markaspatrolledtext": "Marca custa pàgina comente cumprobada",
+       "markedaspatrolled": "Marcada comente cumprobada",
+       "previousdiff": "← Càmbiu in segus",
+       "nextdiff": "Càmbiu in antis →",
+       "thumbsize": "Mannesa de is miniaturas:",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pàgina|pàginas}}",
+       "file-info": "mannesa de su documentu: $1, casta de MIME: $2",
        "file-info-size": "$1 × $2 pixels, mannesa de su file: $3, tipu de MIME: $4",
        "file-nohires": "Non si tenent risolutziones prus artas.",
        "svg-long-desc": "file in formadu SVG, mannesa nominale $1 × $2 pixel, mannesa de su file: $3",
        "show-big-image": "Versione a risolutzione arta",
        "imagelisttext": "Innoe sighendi du est una lista de '''$1''' {{PLURAL:$1|file|files}} ordinada $2.",
+       "newimages-legend": "Filtru",
        "ilsubmit": "Chirca",
        "bydate": "data",
        "video-dims": "$1, $2×$3",
        "seconds-abbrev": "$1s",
        "minutes-abbrev": "$1m",
        "hours-abbrev": "$1h",
-       "bad_image_list": "Su formau est su chi sighit:\n\nBenint consideraus isceti is listas putadas (lìnias chi incumentzant cun *).\nSu primu cullegamentu depit èssere unu acàpiu a unu file malu (o indesiderau).\nIs acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetziones (ossiat, pàginas innui si podet usare su file).",
+       "seconds": "{{PLURAL:$1|$1 segundu|$1 segundos}}",
+       "minutes": "{{PLURAL:$1|$1 minutu|$1 minutos}}",
+       "hours": "{{PLURAL:$1|$1 ora|$1 oras}}",
+       "days": "{{PLURAL:$1|$1 die|$1 dies}}",
+       "weeks": "{{PLURAL:$1|$1 chida|$1 chidas}}",
+       "months": "{{PLURAL:$1|$1 mese|$1 meses}}",
+       "years": "{{PLURAL:$1|$1 annu|$1 annos}}",
+       "ago": "como $1",
+       "just-now": "immoe-immoe",
+       "hours-ago": "como $1 {{PLURAL:$1|ora|oras}}",
+       "minutes-ago": "$1 {{PLURAL:$1|minutu|minutos}} a como",
+       "seconds-ago": "como $1 {{PLURAL:$1|segundu|segundos}}",
+       "monday-at": "Lunis a is $1",
+       "tuesday-at": "Martis a is $1",
+       "wednesday-at": "Mèrcuris a is $1",
+       "thursday-at": "Gioja a is $1",
+       "friday-at": "Chenàbura a is $1",
+       "saturday-at": "Sàbadu a is $1",
+       "sunday-at": "Domìnigu a is $1",
+       "yesterday-at": "Eris a is $1",
+       "bad_image_list": "Su formadu est su chi sighit:\n\nBenint consideradas isceti is listas punnadas (lìnias chi incumentzant cun *).\nSu primu ligòngiu in cada una lìnia depet èssere unu ligòngiu a unu documentu malu (o indesideradu).\nIs ligòngios chi sighint in sa matessi lìnia sunt cunsiderados comente etzetziones (est a nàrrere, pàginas in ue si podet usare su documentu).",
        "metadata": "Metadatos",
-       "metadata-help": "Custu file cuntènnit informatziones aciuntivas, probabilmente aciuntas dae sa fotocamera o dae su scannerizadori impreaus pro ddu creare o ddu digitalizare. Si su file est istadu acontzau, unos particolares podent non currispundere a sa realtade.",
+       "metadata-help": "Custu file cuntènnit informatziones annuntiles, probabilmente annúnghedas dae sa fotocamera o dae su scannerizadore impreadu pro ddu creare o ddu digitalizare. Si su file est istadu mudadu, unos cantos particulares podent non currispòndere a sa realidade.",
        "metadata-expand": "Ammustra particulares",
        "metadata-collapse": "Cua particulares",
-       "metadata-fields": "Is campus de is metadatos de imàgine listadus in custu messàgiu ant a èssere amostadus in sa pàgina de s'immàgine candu sa tabella de is metadatos est presentada in forma breve. Pro impostatzione predefinia, is àteros campus ant a èssere cuaus.\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": "Is campus de is metadatos de imàgine listados in custu messàgiu ant a èssere ammustrados in sa pàgina de s'immàgine candu sa tabella de is metadatos est presentada in forma breve. Pro impostatzione predefinida, is àteros campos ant a èssere cuaos.\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-artist": "Autore",
        "exif-exposuretime-format": "$1 s ($2)",
        "exif-fnumber-format": "f/$1",
        "exif-flash": "Flash",
        "exif-focallength-format": "$1 mm",
+       "exif-contrast": "Cuntrastu",
+       "exif-saturation": "Saturassione",
+       "exif-gpslatituderef": "Latitùdine nord o sud",
+       "exif-gpslatitude": "Latitùdine",
+       "exif-gpslongituderef": "Longitùdine est o ovest",
+       "exif-gpslongitude": "Longitùdine",
+       "exif-source": "Orìgine",
+       "exif-languagecode": "Limba",
+       "exif-iimcategory": "Categoria",
        "exif-compression-6": "JPEG",
        "exif-photometricinterpretation-2": "RGB",
        "exif-photometricinterpretation-6": "YCbCr",
        "exif-componentsconfiguration-1": "Y",
        "exif-componentsconfiguration-2": "Cb",
        "exif-componentsconfiguration-3": "Cr",
+       "exif-exposureprogram-1": "Ghia",
        "exif-subjectdistance-value": "$1 metros",
+       "exif-meteringmode-255": "Àteru",
+       "exif-lightsource-0": "Isconnottu",
        "exif-lightsource-4": "Lampu",
        "exif-gaincontrol-0": "Nudda",
        "exif-contrast-0": "Normale",
+       "exif-saturation-0": "Normale",
        "exif-sharpness-0": "Normale",
-       "watchlistall2": "totu",
-       "namespacesall": "totu",
-       "monthsall": "totu",
+       "namespacesall": "totus",
+       "monthsall": "totus",
        "confirmemail": "Cunfirma s'indiritzu e-mail",
        "confirm_purge_button": "OK",
+       "confirm-watch-button": "OK",
+       "confirm-unwatch-button": "OK",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "word-separator": "&#32;",
        "ellipsis": "…",
        "percent": "$1%",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← pàgina in antis",
        "imgmultipagenext": "pàgina in fatu →",
        "imgmultigo": "Bae!",
        "imgmultigoto": "Bae a sa pàgina $1",
+       "img-lang-go": "Bae",
        "table_pager_first": "Primu pàgina",
        "table_pager_last": "Ùrtima pàgina",
        "table_pager_limit_submit": "Bae",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
-       "watchlistedit-normal-title": "Acontza sa watchlist",
+       "watchlistedit-normal-title": "Càmbia sa lista de annotadas",
        "watchlistedit-raw-titles": "Tìtulos:",
+       "watchlistedit-clear-titles": "Tìtulos:",
        "watchlisttools-view": "Càstia mudàntzias de importu",
-       "watchlisttools-edit": "Càstia e acontza sa watchlist",
+       "watchlisttools-edit": "Càstia e càmbia sa lista de pàginas annotadas",
        "watchlisttools-raw": "Acontza sa watchlist dae su testu",
        "timezone-utc": "UTC",
+       "duplicate-displaytitle": "<strong>Atentzione:</strong> Su tìtulu visadu \"$2\" remplasat su tìtulu antepostu \"$1\".",
        "version": "Versione",
        "version-specialpages": "Pàginas ispetziales",
        "version-other": "Àteru",
        "version-version": "(Versione $1)",
        "version-license": "Licèntzia MediaWiki",
+       "version-ext-license": "Licèntzia",
+       "version-ext-colheader-version": "Versione",
+       "version-ext-colheader-license": "Licèntzia",
+       "version-ext-colheader-description": "Descritzione",
+       "version-ext-colheader-credits": "Autores",
+       "version-license-title": "Litzèntzia pro $1",
+       "version-poweredby-others": "àteros",
        "version-software-version": "Versione",
+       "version-entrypoints-header-url": "URL",
+       "redirect-submit": "Bae",
+       "redirect-user": "ID impitadore",
+       "redirect-page": "ID pàgina",
        "fileduplicatesearch-submit": "Chirca",
        "specialpages": "Pàginas ispetziales",
+       "specialpages-note-top": "Legenda",
+       "specialpages-group-login": "Intra / crea contu",
        "specialpages-group-pages": "Listas de is pàginas",
-       "tags-edit": "acontza",
+       "tag-filter": "Filtra pro [[Special:Tags|etichetta]]:",
+       "tag-filter-submit": "Filtru",
+       "tags-active-yes": "Eja",
+       "tags-active-no": "No",
+       "tags-edit": "càmbia",
+       "tags-hitcount": "$1 {{PLURAL:$1|càmbiu|càmbios}}",
+       "compare-page1": "Pàgina 1",
+       "compare-page2": "Pàgina 2",
+       "compare-rev1": "Revisione 1",
+       "compare-rev2": "Revisione 2",
        "htmlform-selectorother-other": "Àteru",
+       "htmlform-no": "No",
+       "htmlform-yes": "Eja",
+       "logentry-upload-upload": "$1 {{GENDER:$2|carrigadu}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|carrigadu}} una versione noa de $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|carrigadu}} $3",
        "rightsnone": "(nisciunu)",
+       "revdelete-summary": "ogetu de sa modìfica",
+       "feedback-subject": "Ogetu:",
+       "feedback-message": "Messàgiu:",
+       "feedback-cancel": "Annudda",
+       "feedback-close": "Fatu",
        "searchsuggest-search": "Chirca",
-       "expand_templates_preview": "Antiprima"
+       "expand_templates_ok": "OK",
+       "expand_templates_preview": "Antiprima",
+       "pagelang-name": "Pàgina",
+       "pagelang-language": "Limba",
+       "pagelang-select-lang": "Sèbera limba"
 }
index 052335e..672e151 100644 (file)
        "edit-conflict": "Cunflittu di edizzioni.",
        "edit-no-change": "La mudifica fu ignurata pirchì nu foru appurtati canci ntô testu.",
        "postedit-confirmation-saved": "Lu canciamentu fu sarbatu.",
-       "edit-already-exists": "Mpussìbbili criari na nova pàggina.\nEsisti ggià.",
+       "edit-already-exists": "Mpussìbbili criari na pàggina nova.\nEsisti ggià.",
        "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.",
        "searchrelated": "currilati",
        "searchall": "tutti",
        "showingresults": "Ammustra nzinu a {{PLURAL:$1|'''1''' risurtatu|'''$1''' risurtati}} a pàrtiri dô nùmmuru '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Risultatu '''$1''' di '''$3'''|Risultati '''$1 - $2''' di '''$3'''}} pi '''$4'''",
        "search-nonefound": "La circata nun desi nuddu risurtatu.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Cerca ntê namespace:",
        "recentchanges-label-bot": "Stu canciamentu fu fattu dû bot",
        "recentchanges-label-unpatrolled": "Stu canciamentu nun havi ancora statu virificatu",
        "recentchanges-label-plusminus": "La diminsioni dâ pàggina canciau di stu nùmmuru di bytes",
-       "recentchanges-legend-newpage": "$1 - pàggina nova",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (talìa [[Special:NewPages|li pàggini novi]])",
        "rcnotefrom": "Ccà sutta cci sunnu li canciamenti a pàrtiri dû <b>$2</b> (ammustrati nzinu ô <b>$1</b>).",
        "rclistfrom": "Ammustra li canciamenti novi a pàrtiri di $3 $2",
        "rcshowhideminor": "$1 li canciamenti nichi",
        "booksources": "Libbra secunnu lu còdici ISBN",
        "booksources-search-legend": "Ricerca di fonti libbrari",
        "booksources-isbn": "Còdici ISBN:",
-       "booksources-go": "Vai",
        "booksources-text": "Di sèquitu veni prisintatu n'alencu di culligamenti versu siti sterni ca vìnninu libbra novi e usati, attraversu li quali è pussìbbili ottèniri maiuri nfurmazzioni supra lu testu circatu:",
        "booksources-invalid-isbn": "L'ISBN datu pari ca nun è vàlidu; cuntrolla l'erruri di ricupiatura dâ surgenti urigginali.",
        "specialloguserlabel": "Utenti:",
        "wlheader-enotif": "La nutìfica via e-mail è attivata.",
        "wlheader-showupdated": "Li pàggini ca hannu statu canciati dâ tò ùrtima vìsita sunnu evidinziati 'n '''grassettu'''",
        "wlnote": "Sutta attrovi l'ùrtim{{PLURAL:$1|u canciamentu|i $1 canciamenti}}, nta l'ùrtim{{PLURAL:$1|a ura|i '''$2''' uri}}.",
-       "wlshowlast": "Ammustra l'ùrtimi $1 uri $2 jorna $3",
+       "wlshowlast": "Ammustra l'ùrtimi $1 uri $2 jorna",
        "watchlist-options": "Opzioni ussirvati spiciali",
        "watching": "Junta a l'ussirvati spiciali...",
        "unwatching": "Scancillazzioni di l'ussirvati spiciali...",
        "import": "Mporta pàggini",
        "importinterwiki": "Mpurtazzioni transwiki",
        "import-interwiki-text": "Silizziunari un pruggettu wiki e lu tìtulu dâ pàggina a mpurtari. Li dati di pubbricazzioni e li noma di l'autura dî vari virsioni sunnu sarvati. Tutti l'opirazzioni di mpurtazzioni trans-wiki sunnu riggistrati ntô [[Special:Log/import|log di mpurtazzioni]].",
-       "import-interwiki-source": "Surgenti wiki/pàggina:",
        "import-interwiki-history": "Copia la ntera cronoluggìa di sta pàggina",
        "import-interwiki-templates": "Includi tutti li template",
        "import-interwiki-submit": "Mporta",
        "exif-gpsspeed-n": "Gruppa",
        "exif-gpsdirection-t": "Direzzioni riali",
        "exif-gpsdirection-m": "Direzzioni magnètica",
-       "watchlistall2": "tutti",
        "namespacesall": "Tutti",
        "monthsall": "tutti",
        "confirmemail": "Cunferma ndirizzu e-mail",
        "logentry-delete-delete": "$1 cancillau la pàggina $3",
        "revdelete-restricted": "ristrizzioni ai suli amministratura attivate",
        "revdelete-unrestricted": "ristrizzioni pi suli amministraturi rimossi",
-       "logentry-move-move": "$1 spustau la pàggina $3 a $4",
+       "logentry-move-move": "$1 {{GENDER:$2|spustau}} la pàggina $3 nti $4",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|spustau}} la pàggina $3 nti $4 cu nu rinnirizzamentu",
        "logentry-newusers-create": "$1 criau na utenza",
        "rightsnone": "(nuddu)",
+       "revdelete-summary": "riassuntu dô canciamentu",
        "searchsuggest-search": "Risciduta",
        "api-error-nomodule": "Erruri nternu: nun fu mpustatu lu mòdulu di carricamentu",
        "api-error-ok-but-empty": "Erruri ntenru: nudda risposta dû server",
index caf7d13..ac6176d 100644 (file)
        "invalidtitle-knownnamespace": "Onvalit title wi namespace \"$2\" n tex \"$3\"",
        "invalidtitle-unknownnamespace": "Onvalit title wi onkent namespace nummer $1 n tex \"$2\"",
        "exception-nologin": "No loggit in",
-       "exception-nologin-text": "Please [[Special:Userlogin|log in]] tae be able tae access this page or action.",
+       "exception-nologin-text": "Please log in tae be able tae access this page or action.",
        "exception-nologin-text-manual": "Please $1 tae be able tae access this page or action.",
        "virus-badscanner": "Bad confeeguration: Onken't virus scanner: <em>$1</em>",
        "virus-scanfailed": "the scan failed (code $1)",
        "passwordreset-emailsent-capture": "Ae passwaird reset wab-mail haas been sent, this is shawn ablow.",
        "passwordreset-emailerror-capture": "Ae passwaird reset wab-mail wis generated, (this is shawn ablow), but sendin it til the {{GENDER:$2|uiser}} failed: $1",
        "changeemail": "Chynge wab-mail address",
-       "changeemail-header": "Chynge accoont wab-mail address",
        "changeemail-text": "Compleate this form tae chynge yer wab-mail address. Ye will need tae enter yer passwaird tae confirm this chynge.",
        "changeemail-no-info": "Ye maun be loggit in tae access this page directly.",
        "changeemail-oldemail": "Current wab-mail address:",
        "changeemail-none": "(nane)",
        "changeemail-password": "Yer {{SITENAME}} passwaird:",
        "changeemail-submit": "Chynge wab-mail",
-       "changeemail-cancel": "Cancel.",
        "changeemail-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.",
        "resettokens": "Reset tokens.",
        "resettokens-text": "Ye can reset tokens that permit ye access til certain private data associated wi yer accoont here.\n\nYe shid dae it gif ye accidentally shaired theim wi somebodie or gif yer accoont haes been compromised.",
        "preview": "Luikower",
        "showpreview": "Shaw luikower",
        "showdiff": "Shaw chynges",
-       "anoneditwarning": "<strong>Warnishment:</strong>Ye'r naw loggit in. Yer IP address will be recordit in this page's eedit histerie.",
+       "anoneditwarning": "<strong>Warnishment:</strong> Ye'r no loggit in. Yer IP address will be publeeclie veesible gif ye mak onie eedits. Gif ye <strong>[$1 log in]</strong> or <strong>[$2 creaute aen accoont]</strong>, yer eedits will be attreebutit tae yer uisername, aes weel aes ither benefits.",
        "anonpreviewwarning": "<em>Ye'r no loggit in. Hainin will record yer IP address in this page's eedit histerie.</em>",
        "missingsummary": "<strong>Mynd:</strong> Ye'v naw gien aen eedit owerview. Gif ye clap oan \"{{int:savearticle}}\" again, yer eedit will be haint wioot ane.",
        "missingcommenttext": "Please enter ae comment ablo.",
        "parser-template-recursion-depth-warning": "Template recursion depth limit owershote ($1)",
        "language-converter-depth-warning": "Leid converter depth limit owershote ($1)",
        "node-count-exceeded-category": "Pages whaur node-coont is owershote",
-       "node-count-exceeded-warning": "Page owershote the node-coont",
+       "node-count-exceeded-warning": "Page owershot the node coont",
        "expansion-depth-exceeded-category": "Pages whaur expansion depth is owershote",
        "expansion-depth-exceeded-warning": "Page owershote the expansion depth",
        "parser-unstrip-loop-warning": "Unstrip luip detected",
        "searchall": "aw",
        "showingresults": "Shawin ablo up tae {{PLURAL:$1|'''1''' ootcome|'''$1''' ootcomes}} stertin wi #'''$2'''.",
        "showingresultsinrange": "Shawin ablo up til {{PLURAL:$1|<strong>1</strong> ootcome|<strong>$1</strong> ootcome}} in range #<strong>$2</strong> til #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Ootcome <strong>$1</strong> o <strong>$3</strong>|Ootcomes <strong>$1 - $2</strong> o <strong>$3</strong>}} fer <strong>$4</strong>",
        "search-nonefound": "Thaur were naw ootcomes matchin the speiring.",
        "powersearch-legend": "Advanced rake",
        "powersearch-ns": "Rake in namespaces:",
        "preferences": "Ma preferences",
        "mypreferences": "Ma preferences",
        "prefs-edits": "Nummer o eidits:",
-       "prefsnologintext2": "Please $1 tae chynge yer preferences.",
+       "prefsnologintext2": "Please log in tae chynge yer preferences.",
        "prefs-skin": "Skin",
        "skin-preview": "First Leuk",
        "datedefault": "Nae preferance",
        "nolicense": "Nane selectit",
        "licenses-edit": "Eedit license options",
        "license-nopreview": "(Luikower naw available)",
-       "upload_source_url": "(ae valid, publeeclie accessible URL)",
-       "upload_source_file": "(ae file oan yer computer)",
+       "upload_source_url": "(yer chosen file fae ae valid, publeeclie accessible URL)",
+       "upload_source_file": "(yer chosen file fae yer computer)",
        "listfiles-summary": "This speecial page shaws aw uplaided files.",
        "listfiles_search_for": "Rake fer media name:",
        "imgfile": "file",
        "randomincategory": "Random page in categerie",
        "randomincategory-invalidcategory": "\"$1\" isna ae valid categerie name.",
        "randomincategory-nopages": "Thaur's naw pages in the [[:Category:$1|$1]] categerie.",
-       "randomincategory-selectcategory": "Get random page fae categerie: $1 $2.",
-       "randomincategory-selectcategory-submit": "Gae",
        "randomredirect": "Random reguidal",
        "randomredirect-nopages": "Thaur's naw reguidals in the namespace \"$1\".",
        "statistics": "Stateestics",
        "querypage-disabled": "This speecial page is disablit fer performance raisons.",
        "booksources": "Buik soorces",
        "booksources-search-legend": "Rake fer buik soorces",
-       "booksources-go": "Gang",
        "booksources-text": "Ablo is ae leet o airtins til ither steids that sell new n uised buiks, n micht hae further information aneat buiks that ye'r seekin ava:",
        "booksources-invalid-isbn": "The gien ISBN disna seem tae be valid; check fer mistaks copiein fae the oreeginal soorce.",
        "specialloguserlabel": "Performer:",
        "trackingcategories-desc": "Categerie inclusion criteria",
        "noindex-category-desc": "The page haes ae <code><nowiki>__NOINDEX__</nowiki></code> mageec waird oan it (n is in ae namespace whaur that flag is alloud), n sae it's no indext bi the robots.",
        "index-category-desc": "The page haes ae <code><nowiki>__INDEX__</nowiki></code> oan it (n is in ae namespace whaur that flag is alloud), n sae it's indext bi the robots whaur it widna normallie be.",
-       "post-expand-template-inclusion-category-desc": "Efter makin aw o the templates muckler, the page size is muckler than <code>$wgMaxArticleSize</code>, sae some templates were no makit muckler.",
-       "post-expand-template-argument-category-desc": "Efter makin ae template argument muckler (sommit in triple braces, lik <code>{{{Foo}}})</code>, the page is muckler than <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Ower monie expenseeve parser functions (lik <code>#ifexist</code>) incluidit oan ae page. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Categerie eikit gif the page contains ae broken file airtin (aen airtin tae embed ae file whan the file disna exeest).",
-       "hidden-category-category-desc": "This is ae categerie wi <code><nowiki>__HIDDENCAT__</nowiki></code> oan it, This prevents it fae shawin up in the categerie airtins kist oan pages, bi defaut.",
+       "post-expand-template-inclusion-category-desc": "The page size is muckler than <code>$wgMaxArticleSize</code>, efter makin aw o the templates muckler, sae some templates were no makit muckler.",
+       "post-expand-template-argument-category-desc": "The page is muckler than <code>$wgMaxArticleSize</code> efter makin ae template argument muckler (sommit in triple braces, lik <code>{{{Foo}}})</code>.",
+       "expensive-parserfunction-category-desc": "The page uises ower monie expenseeve parser functions (lik <code>#ifexist</code>). See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "The page contains ae broken file airtin (aen airtin tae embed ae file whan the file disna exeest).",
+       "hidden-category-category-desc": "The categerie contains <code><nowiki>__HIDDENCAT__</nowiki></code> in its page content, this hinders it fae shawin up in the categerie airtins kist oan pages, bi defaut.",
        "trackingcategories-nodesc": "Nae descreeption is available.",
        "trackingcategories-disabled": "The categerie is disabled",
        "mailnologin": "Nae send address",
        "mywatchlist": "Ma watchleet",
        "watchlistfor2": "Fer $1 $2",
        "nowatchlist": "Ye'v nae eitems oan yer watchleet.",
-       "watchlistanontext": "Please $1 tae see or eedit eetems oan yer watchlet.",
+       "watchlistanontext": "Please login tae see or eedit eetems oan yer watchlet.",
        "watchnologin": "Nae loggit in",
        "addwatch": "Eik til watchleet",
        "addedwatchtext": "The page \"[[:$1]]\" haes been added til yer [[Special:Watchlist|watchleet]].\nFutur chynges til this page n its associated tauk page will be leeted thaur.",
        "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} oan yer watchleet, no coontin tauk pages seperatlie.",
        "wlheader-enotif": "Wab-mail annooncemant is enabled.",
        "wlheader-showupdated": "Pages that hae been chynged sin ye last veesitit thaim ar shawn in '''baud'''.",
-       "wlnote": "Ablo {{PLURAL:$1|is the laist chynge|ae the laist '''$1''' chynges}} in the laist {{PLURAL:$2|hoor|'''$2''' hoors}}, aes o $3, $4.",
-       "wlshowlast": "Shaw hainmaist $1 hoors $2 days $3",
+       "wlnote": "Ablo {{PLURAL:$1|is the laist chynge|ae the laist <strong>$1</strong> chynges}} in the laist {{PLURAL:$2|hoor|<strong>$2</strong> hoors}}, aes o $3, $4.",
+       "wlshowlast": "Shaw hainmaist $1 hoors $2 days",
        "watchlist-options": "Watchleet opties",
        "watching": "Watchin...",
        "unwatching": "Onwatchin...",
        "exbeforeblank": "content afore blankin wis: '$1'",
        "delete-confirm": "Delyte \"$1\"",
        "delete-legend": "Delyte",
-       "historywarning": "<strong>Warnishment:</strong> The page that ye'r aboot tae delyte haes ae histerie wi approximatelie $1 {{PLURAL:$1|reveesion|reveesions}}:",
+       "historywarning": "<strong>Warnishment:</strong> The page that ye'r aboot tae delyte haes ae histerie wi $1 {{PLURAL:$1|reveesion|reveesions}}:",
        "confirmdeletetext": "Ye'r aboot tae delyte ae page or eemage alang wi aw its histerie fae the database.\nPlease confirm that ye intend tae dae this, that ye unnerstaun the consequences,\nn that ye'r daein this in accord wi [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Action duin",
        "actionfailed": "Action failed",
        "autoblockid": "Autæblock #$1",
        "block": "Block uiser",
        "unblock": "Onblock uiser",
-       "blockip": "Block uiser",
+       "blockip": "Block {{GENDER:$1|uiser}}",
        "blockip-legend": "Block uiser",
        "blockiptext": "Uise the form ablo tae block write access fae ae speceefic IP address or uisername. This shid be dun juist tae hinder vandaleesm, n in accord wi [[{{MediaWiki:Policy-url}}|policie]]. Fil in ae speceefic raison ablo (fer exemplar, citin parteecular pages that were vandalised).",
        "ipaddressorusername": "IP address or uisername:",
        "ipb-unblock-addr": "Onblock $1",
        "ipb-unblock": "Onblock ae uisername or IP address",
        "ipb-blocklist": "See exeestin blocks",
-       "ipb-blocklist-contribs": "Contreebutions fer $1",
+       "ipb-blocklist-contribs": "Contreebutions fer {{GENDER:$1|$1}}",
        "unblockip": "Onblock uiser",
        "unblockiptext": "Uise the form ablo tae restore screevin richts\ntil aen afore-blockit IP address or uisername.",
        "ipusubmit": "Remuive this block",
        "thumbnail_image-missing": "File seems tae be missin: $1",
        "thumbnail_image-failure-limit": "Thaur hae been ower monie recynt failed attempts ($1 or mair) tae render this thummnail. Please ettle again later.",
        "import-interwiki-text": "Select ae wiki n page title tae import.\nReveesion dates n eediters' names will be preserved.\nAw transwiki import actions ar loggit at the [[Special:Log/import|import log]].",
-       "import-interwiki-source": "Soorce wiki/page:",
        "import-interwiki-history": "Copie aw histerie reveesions fer this page",
        "import-interwiki-templates": "Incluid aw templates",
        "import-interwiki-namespace": "Desteenation namespace:",
        "tooltip-recreate": "Recræft the page even thoogh it's been delytit",
        "tooltip-upload": "Stairt uplaid",
        "tooltip-rollback": "\"Rowback\" reverts eedit(s) til this page o the laist contreebuter in yin clap",
-       "tooltip-undo": "\"Ondae\" reverts this eedit n apens the eedit form in luikower mode. It permits addin ae raison in the owerview.",
+       "tooltip-undo": "\"Ondae\" reverts this eedit n apens the eedit form in luikower mode. It allous eikin ae raison in the owerview.",
        "tooltip-preferences-save": "Hain preeferances",
        "tooltip-summary": "Enter ae short owerview",
        "anonymous": "Nameless {{PLURAL:$1|uiser|uisers}} o {{SITENAME}}",
        "exif-urgency-low": "Law ($1)",
        "exif-urgency-high": "Hei ($1)",
        "exif-urgency-other": "Uiser-defined prioritie ($1)",
-       "watchlistall2": "aw",
        "namespacesall": "aw",
        "monthsall": "aw",
        "confirmemail": "Confirm wab-mail address",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 title wis|$1 titles were}} remuived fae yer watchleet:",
        "watchlistedit-raw-title": "Eedit raw watchleet",
        "watchlistedit-raw-legend": "Eedit raw watchleet",
-       "watchlistedit-raw-explain": "Titles oan yer watchleet ar shawn ablo, n can be eeditit bi addin til n remuivin fae the leet;\nyin title per line.\nWhan dun, clap \"{{int:Watchlistedit-raw-submit}}\".\nYe can [[Special:EditWatchlist|uise the staundairt eediter]] ava.",
+       "watchlistedit-raw-explain": "Titles oan yer watchleet ar shawn ablo, n can be eeditit bi eikin til n remuivin fae the leet;\nyin title per line.\nWhan dun, clap \"{{int:Watchlistedit-raw-submit}}\".\nYe can [[Special:EditWatchlist|uise the staundairt eediter]] n aw.",
        "watchlistedit-raw-submit": "Update watchleet",
        "watchlistedit-raw-done": "Yer watchleet haes been updated.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 title wis|$1 titles were}} added:",
        "logentry-rights-autopromote": "$1 wis autæmateeclie {{GENDER:$2|promoted}} fae $4 til $5",
        "rightsnone": "(nane)",
        "feedback-bugornote": "Gif yer readie tae describe ae techneecal proablem in detail please [$1 report ae bug].\nItherwise, ye can uiss the easie form ablo. Yer comment will be eikit til the page \"[$3 $2]\", alang wi yer uisername.",
-       "feedback-adding": "Addin feedback til page...",
+       "feedback-adding": "Eikin feedback til page...",
        "feedback-error1": "Mistak: Onrecognised ootcome fae API",
        "feedback-error2": "Mistak: Eedit failed",
        "feedback-error3": "Mistak: Naw response fae API",
index 57e7818..90f1a63 100644 (file)
        "searchrelated": "curriraddi",
        "searchall": "tutti",
        "showingresults": "Accó {{PLURAL:$1|màssimu '''1''' risulthaddu|màssimu li '''$1''' risulthaddi}} à partì da lu nùmaru #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Risulthaddu '''$1''' of '''$3'''|Risulthaddi '''$1 - $2''' di '''$3'''}} pa '''$4'''",
        "search-nonefound": "Nisciuni risulthaddi pa la to' zercha",
        "powersearch-legend": "Zercha abanzadda",
        "powersearch-ns": "Zercha i' li tipi di pàgina:",
        "pager-older-n": "{{PLURAL:$1|1 mancu rizzenti|$1 mancu rizzenti}}",
        "booksources": "Rifirimenti di libri",
        "booksources-search-legend": "Zercha rifirimenti di libri",
-       "booksources-go": "Vai",
        "booksources-text": "Inogghi v'è una listha di cullegamenti bessu siti estherni chi vindani libri nobi e usaddi, attrabessu li quari è pussìbiri uttinì maggiori infuimmazioni i' lu testhu zirchaddu.",
        "specialloguserlabel": "Utenti:",
        "speciallogtitlelabel": "Tìturu:",
        "wlheader-enotif": "La nutìfica via postha erettrònica è attiba.",
        "wlheader-showupdated": "Li pàgini chi so isthaddi mudìfiggaddi daboi l'ulthima vìsita so evidenziaddi in '''grasseddu'''",
        "wlnote": "Inogghi {{PLURAL:$1|è erencadda la mudìfigga più rizzenti arriggadda|so erencaddi li '''$1''' mudìfigghi più rizzenti arriggaddi}} {{PLURAL:$2|i' la ulthima ora|i' li ulthimi '''$2''' ori}}.",
-       "wlshowlast": "Musthra li ulthimi $1 ori $2 dì $3",
+       "wlshowlast": "Musthra li ulthimi $1 ori $2 dì",
        "watchlist-options": "Opzioni abbaidaddi ippiziari",
        "watching": "Aggiunta a l'abbaidaddi ippiziari...",
        "unwatching": "Eliminazioni da l'abbaidaddi ippiziari...",
        "exif-sharpness-2": "Maggiori nitiddèzia",
        "exif-subjectdistancerange-0": "Ischuniscidda",
        "exif-gpsspeed-n": "Nodi",
-       "watchlistall2": "tutti",
        "namespacesall": "tutti",
        "monthsall": "tutti",
        "confirmemail": "Cunfèimma indirizzu di postha erettrònica",
index 85bf781..d3a3b24 100644 (file)
        "notargettext": "It leat meroštallan mearresiiddu dahje -geavaheaddji, masa dahku laktása.",
        "booksources": "Girjegáldut",
        "booksources-search-legend": "Oza girjegálduid",
-       "booksources-go": "Oza",
        "booksources-text": "Vuolábealde leat liŋkkat olggobeal siidduide, main vuvdojuvvot ođđa ja boares girjjid. Siiddui sáhttá maid leat lassedieđut girjjiin.",
        "specialloguserlabel": "Geavaheaddji:",
        "speciallogtitlelabel": "Mearri",
        "wlheader-enotif": "E-poastaalmmuhusat leat anus.",
        "wlheader-showupdated": "Siiddut, mat leat rievdaduvvon du maŋimus geavahangearddi maŋŋá leat merkojuvvon '''buoiddes teavsttain'''",
        "wlnote": "Vuolábealde lea '''$1''' {{PLURAL:$1|rievdadus|rievdadusa}} maŋimus {{PLURAL:$2||'''$2'''}} diimma siste.",
-       "wlshowlast": "Čájet maŋimus $1 diimmu dahje $2 beaivvi $3",
+       "wlshowlast": "Čájet maŋimus $1 diimmu dahje $2 beaivvi",
        "watching": "Lasihuvvo čuovvunlistui...",
        "unwatching": "Sihkojuvvo čuovvunlisttus...",
        "enotif_reset": "Merke buot siidduid gehččojuvvon",
        "exif-gpsspeed-k": "km/h",
        "exif-gpsspeed-m": "miilla diimmus",
        "exif-gpsspeed-n": "čuolmma",
-       "watchlistall2": ", olles historjjá",
        "namespacesall": "buot",
        "monthsall": "buot",
        "confirmemail": "Sihkaraste e-poastačujuhusa",
index 813f64b..d3a576f 100644 (file)
        "ancientpages": "Xeperesistant páhinám",
        "move": "Yacom",
        "movethispage": "Yacom jan páhina",
-       "booksources-go": "Caátemöx",
        "specialloguserlabel": "Caitom:",
        "speciallogtitlelabel": "Titlenam:",
        "log": "Logám",
        "watchthispage": "Cáminot jan páhina",
        "unwatch": "Diicáminot",
        "unwatchthispage": "Diicáminot jan páhina",
-       "wlshowlast": "Cohuatlöx hun $1 ixáap quij iitax $2 ixáap $3",
+       "wlshowlast": "Cohuatlöx hun $1 ixáap quij iitax $2 ixáap",
        "watching": "Cáminot...",
        "unwatching": "Necáminot...",
        "enotif_impersonal_salutation": "{{SITENAME}} caitom",
        "exif-gpsaltitude": "Altitudam",
        "exif-subjectdistance-value": "$1 miitrenám",
        "exif-focalplaneresolutionunit-2": "inchám",
-       "watchlistall2": "jöxdem",
        "namespacesall": "jöxdem",
        "monthsall": "jöxdem",
        "confirm_purge_button": "ton",
index ba7af45..e42b2e3 100644 (file)
        "searchrelated": "sosėjėn",
        "searchall": "vėsė",
        "showingresults": "Žemiau ruodoma lėgė '''$1''' {{PLURAL:$1|rezoltata|rezoltatu|rezoltatu}} pradedont #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Rezoltats '''$1''' ėš '''$3'''|Rezoltatā '''$1 - $2''' ėš '''$3'''}} vagol paklausėma '''$4'''",
        "search-nonefound": "Nier rezoltatu, katrėi atitėktu ožklausėma.",
        "powersearch-legend": "Prapliesta paėiška",
        "powersearch-ns": "Ėiškoutė vardū srėtīsė:",
        "pager-older-n": "{{PLURAL:$1|senesnis|senesni|senesniū}}",
        "booksources": "Knīngu šaltinē",
        "booksources-search-legend": "Knīngu šaltiniu paėiška",
-       "booksources-go": "Ēk!",
        "specialloguserlabel": "Nauduotuos:",
        "speciallogtitlelabel": "Pavadėnims:",
        "log": "Specēliūju veiksmū istuorėjė",
        "wlheader-enotif": "El. pašta primėnėmā ijongtė īr.",
        "wlheader-showupdated": "Poslapē, katrėi pakeistė nu Tamstas paskotėnė apsėlonkėma čiesa anūs, īr pažīmietė '''pastuorintā'''",
        "wlnote": "Ruoduoma '''$1''' paskotėniu pakeitėmu, atlėktū par '''$2''' paskotėniu adīnu.",
-       "wlshowlast": "Ruodītė paskotėniu $1 adīnu, $2 dėinū a $3 pakeitėmus",
+       "wlshowlast": "Ruodītė paskotėniu $1 adīnu, $2 dėinū a  pakeitėmus",
        "watchlist-options": "Keravuojamu sāroša pasėrinkėmā",
        "watching": "Itraukiama i keravuojamu sāraša...",
        "unwatching": "Šalėnama ėš keravuojamu sāraša...",
        "exif-contrast-0": "Paprasts",
        "exif-contrast-1": "Mažos",
        "exif-contrast-2": "Dėdlis",
-       "watchlistall2": "vėsos",
        "namespacesall": "vėsas",
        "monthsall": "vėsė",
        "confirmemail": "Patvirtėnkėt el. pašta adresa",
index 5f637fd..3000ed3 100644 (file)
        "passwordreset-emailsent-capture": "E-mail za resetiranje lozinke/zaporke je poslan (prikazan dolje).",
        "passwordreset-emailerror-capture": "E-mail za resetiranje lozinke/zaporke, prikazan dolje, je poslan, ali slanje {{GENDER:$2|korisniku|korisnici|korisniku}} nije uspjelo: $1",
        "changeemail": "Promijeni e-mail adresu",
-       "changeemail-header": "Promijeni e-mail adresu korisničkog računa",
        "changeemail-text": "Ispunite ovaj formular da biste promijenili svoju e-mail adresu. Morat ćete upisati svoju lozinku da potvrdite ovu promjenu.",
        "changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
        "changeemail-oldemail": "Trenutna e-mail adresa:",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Tvoja šifra/lozinka za {{SITENAME}}:",
        "changeemail-submit": "Promijeni e-mail",
-       "changeemail-cancel": "Odustani",
        "changeemail-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
        "resettokens": "Resetirajte tokene",
        "resettokens-text": "Možete resetirati tokene koji dozvoljavaju pristup određenim privatnim podacima povezanim sa vašim računom ovdje.\n\nTo možete učiniti ako ste ih slučajno podijelili sa nekim ili ako je vaš račun kompromitiran.",
        "searchall": "sve",
        "showingresults": "Dole {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Rezultat '''$1''' od '''$3'''|Rezultati '''$1 - $2''' od '''$3'''}} za '''$4'''",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Pretraga u imenskim prostorima:",
        "randomincategory": "Slučajna stranica u kategoriji",
        "randomincategory-invalidcategory": "\"$1\" nije valjano ime kategorije.",
        "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
-       "randomincategory-selectcategory": "Dobij slučajnu stranicu iz kategorije: $1 $2.",
-       "randomincategory-selectcategory-submit": "Idi",
        "randomredirect": "Slučajno preusmjerenje / Случајно преусмјерење",
        "randomredirect-nopages": "Nema preusmjerenja u imenskom prostoru \"$1\".",
        "statistics": "Statistike / Статистике",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
        "booksources": "Književni izvori",
        "booksources-search-legend": "Traži književne izvore",
-       "booksources-go": "Idi",
        "booksources-text": "Ispod se nalazi spisak vanjskih linkova na ostale stranice koje prodaju nove ili korištene knjige kao i stranice koje mogu da imaju važnije podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije validan; molimo da provjerite da li je došlo do greške pri kopiranju iz prvobitnog izvora.",
        "specialloguserlabel": "Izvršilac:",
        "wlheader-enotif": "* Obavještavanje e-poštom je omogućeno.",
        "wlheader-showupdated": "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
        "wlnote": "Ispod {{PLURAL:$1|je posljednja izmjena|su posljednje '''$1''' izmjene|je posljednjih '''$1''' izmjena}} u {{PLURAL:$2|prethodnom satu|prethodna '''$2''' sata|prethodnih '''$2''' sati}}, zaključno sa $3, $4.",
-       "wlshowlast": "Prikaži posljednjih $1 sati $2 dana $3",
+       "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-options": "Opcije liste praćenja",
        "watching": "Pratim... / Додавање на списак надгледања...",
        "unwatching": "Ne pratim…",
        "import": "Uvoz stranica",
        "importinterwiki": "Transwiki uvoz",
        "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi revizije i imena urednika će biti sačuvana.\nSve akcije vezane uz transwiki uvoz su zabilježene u [[Special:Log/import|registru uvoza]].",
-       "import-interwiki-source": "Izvorna wiki/stranica:",
        "import-interwiki-history": "Kopiraj sve verzije historije za ovu stranicu",
        "import-interwiki-templates": "Uključi sve šablone",
        "import-interwiki-submit": "Uvezi - Увези",
        "exif-urgency-low": "Nisko ($1)",
        "exif-urgency-high": "Visoko ($1)",
        "exif-urgency-other": "Priorite definiran od korisnika ($1)",
-       "watchlistall2": "sve",
        "namespacesall": "sve",
        "monthsall": "sve",
        "confirmemail": "Potvrdite adresu e-pošte",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|je promijenio|je promijenila|je promijenio}} članstvo grupe za $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|je automatski unaprijeđen|je automatski unaprijeđena}} iz $4 u $5",
        "rightsnone": "(nema)",
+       "revdelete-summary": "sažetak izmjene",
        "feedback-bugornote": "Ako ste spremni da detaljno opišete tehnički problem, onda [$1 prijavite grešku].\nU suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajati na stranici „[$3 $2]“, zajedno s korisničkim imenom i pregledačem koji koristite.",
        "feedback-subject": "Tema:",
        "feedback-message": "Poruka:",
index 6b4ac69..4ae6b85 100644 (file)
        "searchrelated": "Tuyzday",
        "searchall": "Kullu",
        "showingresults": "Ẓr azddar  {{PLURAL:$1|'''1''' May tuykfan|'''$1''' Mad kfan}} Bdu s #'''$2'''",
-       "showingresultsheader": "{{PLURAL:$5|May kfa '''$1''' ar '''$3'''|Mad kfan '''$1 - $2''' ar '''$3'''}} i '''$4'''",
        "search-nonefound": "Ur ittuykfa walu maygan zund ɣayli trit",
        "powersearch-legend": "Amsigl imzwarn",
        "powersearch-ns": "Icnubbucn ɣ tɣulin",
        "booksources": "Iɣbula n udlis",
        "booksources-search-legend": "Acnubc s iɣbula n idlisn",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Ftu",
        "specialloguserlabel": "Amsqdac",
        "speciallogtitlelabel": "Azwl",
        "log": "Immussutn ittyuran",
        "watchthispage": "Ṭfr tasna yad",
        "unwatch": "Ur rast tsaggaɣ",
        "watchlist-details": "Umuɣ nk n imttfura ar  ittawi $1 tasna {{PLURAL:$1||s}}, bla dis tsmunt tisniwin n imdiwiln.",
-       "wlshowlast": "Ml ikudan imggura $1 , ussan imggura $2 niɣd $3",
+       "wlshowlast": "Ml ikudan imggura $1 , ussan imggura $2 niɣd",
        "watchlist-options": "Tixtiṛiyin n umuɣ lli ntfar",
        "watching": "Ar itt sagga",
        "unwatching": "Ur at sul ntsagga",
        "exif-subjectdistancerange-2": "tannayt iqrbn",
        "exif-gpslatitude-n": "dairat lard chamaliya",
        "exif-gpsspeed-n": "Knots",
-       "watchlistall2": "kraygat (kullu)",
        "namespacesall": "kullu",
        "monthsall": "kullu",
        "recreate": "awd skr",
        "htmlform-selectorother-other": "wayya",
        "revdelete-restricted": "iskr aqn i indbaln",
        "revdelete-unrestricted": "Aqn iḥiyd i indbaln",
-       "rightsnone": "(ḥtta yan)"
+       "rightsnone": "(ḥtta yan)",
+       "revdelete-summary": "Awal uflla n imbddln"
 }
index 2a980fe..a473e1a 100644 (file)
@@ -23,7 +23,8 @@
                        "ශ්වෙත",
                        "සුරනිමල",
                        "아라",
-                       "හරිත"
+                       "හරිත",
+                       "Indunil Chamara"
                ]
        },
        "tog-underline": "සබැඳි යටීර කිරීම:",
        "thursday": "බ්‍රහස්පතින්දා",
        "friday": "සිකුරාදා",
        "saturday": "සෙනසුරාදා",
-       "sun": "ඉරිදා",
-       "mon": "සඳුදා",
-       "tue": "අඟ",
-       "wed": "බදාදා",
-       "thu": "බ්‍රහස්",
-       "fri": "සිකු",
-       "sat": "සෙන",
+       "sun": "ඉරි:",
+       "mon": "සඳු:",
+       "tue": "අඟ:",
+       "wed": "බදා:",
+       "thu": "බ්‍රහ:",
+       "fri": "සිකු:",
+       "sat": "සෙන:",
        "january": "ජනවාරි",
        "february": "පෙබරවාරි",
        "march": "මාර්තු",
        "december-gen": "දෙසැම්බර්",
        "jan": "ජන",
        "feb": "පෙබ",
-       "mar": "මාර්තු",
-       "apr": "අප්‍රේල්",
+       "mar": "මාර්",
+       "apr": "අප්‍රේ",
        "may": "මැයි",
        "jun": "ජූනි",
        "jul": "ජූලි",
        "otherlanguages": "වෙනත් භාෂා වලින්",
        "redirectedfrom": "($1 වෙතින් යළි-යොමු කරන ලදි)",
        "redirectpagesub": "පිටුව යළි-යොමු කරන්න",
+       "redirectto": "යළියොමුව:",
        "lastmodifiedat": "මෙම පිටුව අවසන් වරට වෙනස් කරන ලද්දේ $1 දිනදී, $2 වේලාවෙහිදීය.",
        "viewcount": "මෙම පිටුවට {{PLURAL:$1|එක් වරක්|$1 වරක්}} පිවිස ඇත.",
        "protectedpage": "ආරක්ෂිත පිටුව",
        "passwordreset-emailsent-capture": "මුර-පදය වෙනස් කිරීම පිළිබඳව විද්‍යුත් තැපෑලක් යවන ලදී, එය පහත දැක්වේ.",
        "passwordreset-emailerror-capture": "සිහිකැඳවුම් ඊ-තැපෑල ජනිත කරනු ලැබූ අතර, එය පහත දැක්වේ, නමුත් එය {{GENDER:$2|}}පරිශීලකයාට යැවීම අසාර්ථක වුනි: $1",
        "changeemail": "විද්‍යුත් තැපැල් ලිපිනය වෙනස් කරන්න",
-       "changeemail-header": "ගිණුම් විද්‍යුත් තැපැල් ලිපිනය වෙනස් කරන්න",
        "changeemail-text": "ඔබගේ විද්‍යුත් තැපැල් ලිපිනය වෙනස් කිරීම සඳහා මෙම ෆෝරමය සම්පූර්ණ කරන්න . මෙම වෙනස් කිරීම තහවුරු කිරීම සඳහා ඔබගේ මුරපදය යෙදීමට ඔබට සිදු වේ.",
        "changeemail-no-info": "මෙම පිටුව සෘජු ලෙස සම්ප්‍රවේශය කෙරුමට පළමුව ඔබ ප්‍රවිෂ්ටව සිටිය යුතුය.",
        "changeemail-oldemail": "වත්මන් විද්‍යුත් තැපැල් ලිපිනය:",
        "changeemail-none": "(කිසිවක් නොමැත)",
        "changeemail-password": "ඔබේ {{SITENAME}} මුරපදය:",
        "changeemail-submit": "විද්‍යුත් තැපෑල  වෙනස් කරන්න",
-       "changeemail-cancel": "අවලංගු කරන්න",
        "changeemail-throttled": "ඔබ විසින් මෑතදී  පමණට වඩා වාර ගණනක් පිවිසීමෙහි උත්සාහයන් දරා ඇත.\nයළි උත්සාහ කිරීමට පෙර $1 වේලාවක් රැඳී සිටින්න.",
        "resettokens": "සංකේත නැවත සකසන්න",
        "resettokens-legend": "සංකේත නැවත සකසන්න",
        "searchrelated": "ආශ්‍රිත",
        "searchall": "සියල්ල",
        "showingresults": "#'''$2''' ගෙන් ආරම්භ කොට, {{PLURAL:$1|ප්‍රතිඵල '''1'''  ක් |ප්‍රතිඵල '''$1''' ක්}} දක්වා පහත පෙන්වා ඇත.",
-       "showingresultsheader": "'''$4''' සඳහා {{PLURAL:$5| '''$3''' අතුරින් '''$1''' ප්‍රතිඵලය| '''$3''' අතුරින් '''$1 - $2''' ප්‍රතිඵලයන්}}",
        "search-nonefound": "විමසුම හා ගැලපෙන ප්‍රතිඵල කිසිවක් නොමැත.",
        "powersearch-legend": "වැඩිමනත් ගවේෂණය",
        "powersearch-ns": "නාමඅවකාශයන්හි ගවේෂණය කරන්න:",
        "randomincategory": "ප්‍රවර්ගයේ අහඹු පිටු",
        "randomincategory-invalidcategory": "\"$1\" වලංගු ප්‍රවර්ග නාමයක් නොවේ.",
        "randomincategory-nopages": " [[:ප්‍රවර්ගය:$1|$1]] ප්‍රවර්ගයේ පිටු නොමැත.",
-       "randomincategory-selectcategory-submit": "යන්න",
+       "randomincategory-legend": "ප්‍රවර්ගයේ අහඹු පිටු",
        "randomredirect": "අහුඹු යළි-යොමුකිරීම",
        "randomredirect-nopages": "\"$1\" නාම-අවකාශයෙහි යළි-යොමුවීම් නොමැත.",
        "statistics": "සංඛ්‍යාන දත්ත",
        "booksources": "මූලාශ්‍ර පොත්",
        "booksources-search-legend": "ග්‍රන්ථ මූලාශ්‍ර සඳහා ගවේෂණය කරන්න",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "යන්න",
        "booksources-text": "පහත දැක්වෙන්නේ අළුත් හා පරණ පොත් විකුණන අනෙකුත් අඩවි වලට සබැඳි ලැයිස්තුවක් වන අතර,  ඔබ විසින් සොයන පොත් පිළිබඳ වැඩිමනත් විස්තර ඒවා‍යේ අඩංගු වීමට ඉඩ ඇත:",
        "booksources-invalid-isbn": "සපයන ලද ISBN අංකය නීතික බවක් නොපෙන්වයි; මුල් මුලාශ්‍රය වෙතින් පිටපත් කිරීමේදී සිදුවූ දෝෂ සඳහා පරික්ෂා කරන්න.",
        "specialloguserlabel": "ඉටුකරන්නා:",
        "wlheader-enotif": "විද්‍යුත් තැපැල් දැනුම්දීම සක්‍රීයයි.",
        "wlheader-showupdated": "ඔබ විසින් ඒවාට අවසන් වරට පිවිසුනු පසුව වෙනස්ව තිබෙන පිටු <strong>තදකුරු</strong> වලින් පෙන්වා ඇත.",
        "wlnote": "පහත දැක්වෙන්නේ $3, $4 මෙන්, අවසන් {{PLURAL:$2|පැය|පැය '''$2''' }} තුලදී සිදු කෙරී ඇති {{PLURAL:$1|අවසන් වෙනස්වීම්යි |අවසන් වෙනස්වීම්  '''$1''' යි}}.",
-       "wlshowlast": "පසුගිය පැය $1 දින $2 $3 පෙන්වන්න",
+       "wlshowlast": "පසුගිය පැය $1 දින $2  පෙන්වන්න",
        "watchlist-options": "තෝරාගතහැකි මුර ලැයිස්තු සැකසුම්",
        "watching": "මුර කරමින්...",
        "unwatching": "මුර නොකරමින්...",
        "import": "පිටු ආයාත කරන්න",
        "importinterwiki": "අන්තර්විකී ආයාතය",
        "import-interwiki-text": "ආයාත කිරීම සඳහා විකියක් හා පිටු ශීර්ෂයක් තෝරාගන්න.\nසංශෝධන දිනයන් හා සංස්කාරකවරුන්ගේ නම් සංරක්‍ෂණය කෙරෙනු ඇත.\nසියළු අන්තර්විකි ආ‍යාත ක්‍රියාවන් [[Special:Log/import|ආයාත ලඝු-සටහනෙහි]] සටහන් වනු ඇත.",
-       "import-interwiki-source": "මූලාශ්‍ර විකිය/පිටුව:",
+       "import-interwiki-sourcepage": "මූලාශ්‍ර පිටුව:",
        "import-interwiki-history": "මෙම පිටුව සඳහා සියළු ඉතිහාස අනුවාදයන් පිටපත් කරන්න",
        "import-interwiki-templates": "සියළු සැකිලි අන්තර්ගත කරන්න",
        "import-interwiki-submit": "ආයාත කරන්න",
        "exif-urgency-low": "අඩුයි ($1)",
        "exif-urgency-high": "ඉහළයි ($1)",
        "exif-urgency-other": "පරිශීලක-අර්ථ දැක්වූ ප්‍රමුඛත්වය ($1)",
-       "watchlistall2": "සියල්ල",
        "namespacesall": "සියල්ල",
        "monthsall": "සියළු",
        "confirmemail": "විද්‍යුත්-තැපැල් ලිපිනය තහවුරු කරන්න",
        "logentry-newusers-create2": "$1 විසින් $3 පරිශීලක ගිණුම තනන ලදී",
        "logentry-newusers-autocreate": "$1 ගිණුම ස්වංක්‍රීයව නිර්මිතය",
        "rightsnone": "(කිසිවක් නොමැත)",
+       "revdelete-summary": "සංස්කරණ සාරාංශය",
        "feedback-subject": "විෂයය:",
        "feedback-message": "පණිවුඩය:",
        "feedback-cancel": "අවලංගු කරන්න",
index 4bacc61..18d96fd 100644 (file)
@@ -26,7 +26,8 @@
                        "Valasek",
                        "Wizzard",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Matthew Greg"
                ]
        },
        "tog-underline": "Podčiarkovať odkazy:",
        "otherlanguages": "V iných jazykoch",
        "redirectedfrom": "(Presmerované z $1)",
        "redirectpagesub": "Presmerovacia stránka",
+       "redirectto": "Presmerovať na:",
        "lastmodifiedat": "Čas poslednej úpravy tejto stránky je $2, $1.",
        "viewcount": "Táto stránka bola navštívená {{PLURAL:$1|raz|$1-krát|$1-krát}}.",
        "protectedpage": "Zamknutá stránka",
        "jumptonavigation": "navigácia",
        "jumptosearch": "hľadanie",
        "view-pool-error": "Ľutujeme, servery sú momentálne preťažené.\nPríliš veľa používateľov sa pokúša zobraziť túto stránku.\nProsím, počkajte chvíľu predtým, než sa pokúsite na túto stránku dostať znova.\n\n$1",
+       "generic-pool-error": "Ľutujeme, servery sú momentálne preťažené.\nPríliš veľa používateľov sa pokúša zobraziť tento zdroj.\nProsím, pred ďalším pokusom o prístup chvíľu počkajte.",
        "pool-timeout": "Bol prekročený vyhradený čas čakania na zámok",
        "pool-queuefull": "Front je plný",
        "pool-errorunknown": "Neznáma chyba",
        "hidetoc": "skryť",
        "collapsible-collapse": "zbaliť",
        "collapsible-expand": "rozbaliť",
+       "confirmable-confirm": "Ste si {{GENDER:$1|istý|istá|istí}}?",
+       "confirmable-yes": "Áno",
+       "confirmable-no": "Nie",
        "thisisdeleted": "Zobraziť alebo obnoviť $1?",
        "viewdeleted": "Zobraziť $1?",
        "restorelink": "{{PLURAL:$1|jednu zmazanú úpravu|$1 zmazané úpravy|$1 zmazaných úprav}}",
        "invalidtitle-knownnamespace": "Neplatný názov s menným priestorom „$2“ a textom „$3“",
        "invalidtitle-unknownnamespace": "Neplatný názov s neznámym číslom menného priestoru „$1“ a textom „$2“",
        "exception-nologin": "Nie ste prihlásený",
-       "exception-nologin-text": "Táto stránka alebo operácia vyžaduje, aby ste [[Special:Userlogin|boli prihlásený]].",
+       "exception-nologin-text": "Táto stránka alebo operácia vyžaduje, aby ste boli prihlásený.",
        "exception-nologin-text-manual": "Pre prístup na túto stránku alebo k tejto akcii sa musíte $1.",
        "virus-badscanner": "Chybná konfigurácia: neznámy antivírus: ''$1''",
        "virus-scanfailed": "kontrola zlyhala (kód $1)",
        "createaccount-text": "Niekto vytvoril účet pre vašu emailovú adresu na {{GRAMMAR:lokál|{{SITENAME}}}}\n($4) s názvom „$2“, s heslom „$3“. Mali by ste sa prihlásiť a svoje heslo teraz zmeniť.\n\nAk bol účet vytvorený omylom, túto správu môžete ignorovať.",
        "login-throttled": "Uskutočnili ste príliš mnoho neúspešných pokusov o prihlásenie.\nProsím, počkajte $1 predtým, než to skúsite znova.",
        "login-abort-generic": "Vaše prihlásenie nebolo úspešné - zrušené",
+       "login-migrated-generic": "Váš účet bol presťahovaný a vaše používateľské meno už viac na tejto wiki neexistuje.",
        "loginlanguagelabel": "Jazyk: $1",
        "suspicious-userlogout": "Vaša požiadavka odhlásiť sa bola zamietnutá, pretože to vyzerá, že ju poslal pokazený prehliadač alebo proxy server.",
        "createacct-another-realname-tip": "Skutočné meno je nepovinné.\nAk sa rozhodnete ho poskytnúť, použije sa na označenie vašej práce.",
        "resetpass-temp-password": "Dočasné heslo:",
        "resetpass-abort-generic": "Zmena hesla bola zablokovaná rozšírením.",
        "resetpass-expired": "Platnosť vášho hesla vypršala. Pre prihlásenie si nastavte nové heslo.",
+       "resetpass-expired-soft": "Platnosť vášho hesla vypršala, musíte si nastaviť nové. Zvoľte si nové heslo nebo kliknite na „{{int:resetpass-submit-cancel}}“ a nastavte si ho neskôr.",
+       "resetpass-validity-soft": "Vaše heslo je neplatné: $1\n\nVyberte si nové heslo, alebo kliknite na „{{int:resetpass-submit-cancel}}“ a nastavte si ho neskôr.",
        "passwordreset": "Reset hesla",
        "passwordreset-text-one": "Pre získanie nového hesla vyplňte tento formulár.",
-       "passwordreset-text-many": "{{PLURAL:$1|Pre získanie nového hesla zadajte jeden z údajov.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Pre získanie nového hesla emailom, zadajte jeden z údajov.}}",
        "passwordreset-legend": "Obnoviť heslo",
        "passwordreset-disabled": "Obnovenie hesla bolo na tejto wiki zakázané.",
        "passwordreset-emaildisabled": "E-mailové funkcie boli na tejto wiki vypnuté.",
        "passwordreset-emailsent-capture": "Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie.",
        "passwordreset-emailerror-capture": "Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať {{GENDER:$2|používateľovi}}: $1",
        "changeemail": "Zmeniť emailovú adresu",
-       "changeemail-header": "Zmena e-mailovej adresy pre účet",
        "changeemail-text": "Vyplňte tento formulár na zmenu e-mailovej adresy. Zmenu budete musieť potvrdiť zadaním svojho hesla.",
        "changeemail-no-info": "Na prístup k tejto stránke musíte byť prihlásený.",
        "changeemail-oldemail": "Súčasná e-mailová adresa:",
        "changeemail-none": "(žiadna)",
        "changeemail-password": "Vaše heslo k {{GRAMMAR:lokál|{{SITENAME}}}}:",
        "changeemail-submit": "Zmeniť e-mail",
-       "changeemail-cancel": "Zrušiť",
        "changeemail-throttled": "Uskutočnili ste príliš mnoho neúspešných pokusov o prihlásenie. Prosím, počkajte $1 predtým, než to skúsite znova.",
        "resettokens": "Obnoviť tokeny",
        "resettokens-text": "Tu môžete obnoviť tokeny, ktoré umožňujú prístup k určitým súkromným údajom spojeným s vaším účtom.\n\nMali by ste to urobiť, ak ste ich omylom niekomu poskytli alebo ak bolo vaše konto zneužité.",
        "preview": "Náhľad",
        "showpreview": "Zobraziť náhľad",
        "showdiff": "Zobraziť rozdiely",
-       "anoneditwarning": "'''Upozornenie:''' Nie ste prihlásený.\nVaša IP adresa bude zaznamenaná v histórii úprav tejto stránky.",
+       "blankarticle": "<strong>Upozornenie:</strong> Stránka, ktorú sa chystáte založiť, je prázdna. Pokiaľ ešte raz kliknete na „{{int:savearticle}}“, bude založená úplne bez obsahu.",
+       "anoneditwarning": "<strong>Upozornenie:</strong> Nie ste prihlásený.\nAk uložíte akúkoľvek úpravu vaša IP adresa bude zverejnená v histórii tejto stránky. Ak sa <strong>[$1 prihlásite]</strong> alebo si <strong>[$2 vytvoríte účet]</strong>, budú vaše úpravy priradené k vášmu používateľskému menu a získate i ďalšie výhody.",
        "anonpreviewwarning": "''Nie ste prihlásený. Uložením zaznamenáte svoju IP adresu do histórie úprav tejto stránky.''",
        "missingsummary": "'''Pripomienka:''' Neposkytli ste zhrnutie úprav. Ak kliknete znova na Uložiť, vaše úpravy sa uložia bez zhrnutia úprav.",
        "missingcommenttext": "Prosím, dolu napíšte komentár.",
        "edit-gone-missing": "Nebolo možné aktualizovať stránku.\nZdá sa, že bola zmazaná.",
        "edit-conflict": "Konflikt pri upravovaní.",
        "edit-no-change": "Vaša úprava bola ignorovaná, pretože ste v texte nič nezmenili.",
+       "postedit-confirmation-created": "Stránka bola vytvorená.",
+       "postedit-confirmation-restored": "Stránka bola obnovená.",
        "postedit-confirmation-saved": "Vaša úprava bola uložená.",
        "edit-already-exists": "Nebolo možné vytvoriť novú stránku.\nUž existuje.",
        "defaultmessagetext": "Predvolený text správy",
        "parser-template-recursion-depth-warning": "Bol prekročený limit rekurzie šablón ($1)",
        "language-converter-depth-warning": "Bolo prekročené obmedzenie hĺbky ($1) jazykového konvertora",
        "node-count-exceeded-category": "Stránky s priveľkým počtom uzlov",
-       "node-count-exceeded-warning": "Stránka prekročila povolený počet uzlov",
+       "node-count-exceeded-category-desc": "Tato stránka prekračuje maximálny počet uzlov.",
+       "node-count-exceeded-warning": "Stránka prekročila počet uzlov",
        "expansion-depth-exceeded-category": "Stránky s priveľkou hĺbkou expanzie",
+       "expansion-depth-exceeded-category-desc": "Stránka prekročila maximálnu hĺbku expanzie.",
        "expansion-depth-exceeded-warning": "Stránka prekročila povolenú hĺbku expanzie",
        "parser-unstrip-loop-warning": "Zistené zacyklenie volania rozširovacej značky",
        "parser-unstrip-recursion-limit": "Prektočený limit rekurzie volania rozširovacej značky ($1)",
        "undo-success": "Úpravu je možné vrátiť. Prosím skontrolujte tento rozdiel, čím overíte, že táto úprava je tá, ktorú chcete, a následne uložte zmeny, čím ukončíte vrátenie.",
        "undo-failure": "Úpravu nie je možné vrátiť kvôli konfliktným medziľahlým úpravám.",
        "undo-norev": "Túto úpravu nie je možné vrátiť, pretože neexistuje alebo bola zmazaná.",
+       "undo-nochange": "Zdá se, že úprava už bola zrušená.",
        "undo-summary": "Revízia $1 používateľa [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusia]]) bola vrátená",
        "undo-summary-username-hidden": "Vrátiť revíziu $1, ktorú vykonal skrytý používateľ",
        "cantcreateaccounttitle": "Nie je možné vytvoriť účet",
        "searchrelated": "súvisiace",
        "searchall": "všetko",
        "showingresults": "Nižšie {{PLURAL:$1|je zobrazený jeden výsledok|sú zobrazené '''1''' výsledky|je zobrazených '''$1''' výsledkov}}, počnúc od  #<b>$2</b>.",
-       "showingresultsheader": "{{PLURAL:$5|Výsledok '''$1''' z '''$3'''|Výsledky '''$1 - $2''' z '''$3'''}} pre '''$4'''",
        "search-nonefound": "Vyhľadávanie nenašlo žiadne výsledky.",
        "powersearch-legend": "Pokročilé hľadanie",
        "powersearch-ns": "Hľadať v menných priestoroch:",
        "right-move": "Presúvať stránky",
        "right-move-subpages": "Presunúť stránky aj s podstránkami",
        "right-move-rootuserpages": "Presunúť koreňové stránky používateľa",
+       "right-move-categorypages": "Premiestňovanie stránok kategórií",
        "right-movefile": "Presunúť súbory",
        "right-suppressredirect": "Nevytvoriť presmerovanie zo starého názvu pri presúvaní stránky",
        "right-upload": "Nahrávať súbory",
        "action-createpage": "vytvárať stránky",
        "action-createtalk": "vytvárať diskusné stránky",
        "action-createaccount": "vytvoriť tento používateľský účet",
+       "action-history": "zobraziť históriu tejto stránky",
        "action-minoredit": "označiť túto úpravu ako drobnú",
        "action-move": "presunúť túto stránku",
        "action-move-subpages": "presunúť túto stránku a jej podtránky",
        "action-move-rootuserpages": "presunúť koreňové stránky používateľa",
+       "action-move-categorypages": "premiestňovať stránky kategórií",
        "action-movefile": "presunúť tento súbor",
        "action-upload": "nahrať tento súbor",
        "action-reupload": "prepísať tento existujúci súbor",
        "recentchanges-label-plusminus": "Veľkosť stránky sa zmenila o toľkoto bajtov",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (pozri tiež [[Special:NewPages|zoznam nových stránok]])",
-       "rcnotefrom": "Nižšie sú zobrazené úpravy od <strong>$2</strong> (do <strong>$1</strong>).",
+       "rcnotefrom": "Nižšie {{PLURAL:$5|je zobrazená úprava|sú zobrazené úpravy}} od <strong>$2</strong> (do <strong>$1</strong>).",
        "rclistfrom": "Zobraziť nové úpravy počnúc od $3 $2",
        "rcshowhideminor": "$1 drobné úpravy",
        "rcshowhideminor-show": "Zobraziť",
        "license-nopreview": "(Náhľad nie je dostupný)",
        "upload_source_url": " (platný, verejne prístupný URL)",
        "upload_source_file": " (súbor na vašom počítači)",
+       "listfiles-delete": "zmazať",
        "listfiles-summary": "Táto špeciálna stránka zobrazuje všetky nahrané súbory.",
        "listfiles_search_for": "Hľadať názov súboru:",
        "imgfile": "súbor",
        "randomincategory": "Náhodná stránka v kategórii",
        "randomincategory-invalidcategory": "\"$1\" nie je platný názov kategórie.",
        "randomincategory-nopages": "V [[:Category:$1|kategórii $1]] nie sú žiadne stránky.",
-       "randomincategory-selectcategory": "Získať náhodnú stránku z kategórie: $1 $2",
-       "randomincategory-selectcategory-submit": "Ísť na",
+       "randomincategory-category": "Kategória:",
+       "randomincategory-legend": "Náhodná stránka v kategórii",
        "randomredirect": "Náhodná presmerovacia stránka",
        "randomredirect-nopages": "V mennom „$1“ priestore nie sú žiadne presmerovania.",
        "statistics": "Štatistiky",
        "pageswithprop-prophidden-binary": "hodnota binárnej vlastnosti bola skrytá ($1)",
        "doubleredirects": "Dvojité presmerovania",
        "doubleredirectstext": "Táto stránka obsahuje zoznam stránok, ktoré presmerovávajú na iné presmerovacie stránky.\nKaždý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riadok z textu na ktorý odkazuje druhé presmerovanie, ktoré zvyčajne odkazuje na „skutočný“ cieľ, na ktorý má odkazovať prvé presmerovanie.\n<del>Prečiarknuté</del> položky boli vyriešené.",
-       "double-redirect-fixed-move": "Stránka [[$1]] bola presunutá, teraz je presmerovaním na [[$2]]",
+       "double-redirect-fixed-move": "Stránka [[$1]] bola presunutá.\nBola automaticky aktualizovaná a teraz presmerováva na [[$2]]",
        "double-redirect-fixed-maintenance": "Opravuje sa dvojité presmerovanie z [[$1]] na [[$2]].",
        "double-redirect-fixer": "Korektor presmerovaní",
        "brokenredirects": "Pokazené presmerovania",
        "querypage-disabled": "Táto špeciálna stránka bola zakázaná z výkonnostných dôvodov.",
        "booksources": "Knižné zdroje",
        "booksources-search-legend": "Vyhľadávať knižné zdroje",
-       "booksources-go": "Vykonať",
+       "booksources-search": "Hľadať",
        "booksources-text": "Nižšie je zoznam odkazov na iné stránky, ktoré predávajú nové a použité knihy a tiež môžu obsahovať ďalšie informácie o knihách, ktoré hľadáte:",
        "booksources-invalid-isbn": "Zdá sa, že dané ISBN nie je platné. Skontrolujte, či ste neurobili chybu pri kopírovaní z pôvodného zdroja.",
        "specialloguserlabel": "Pôvodca:",
        "wlheader-enotif": "Upozorňovanie e-mailom je zapnuté.",
        "wlheader-showupdated": "Stránky, ktoré boli zmenené od vašej poslednej návštevy sú zobrazené '''tučne'''.",
        "wlnote": "Nižšie {{PLURAL:$1|je posledná jedna zmena|sú posledné '''$1''' zmeny|je posledných '''$1''' zmien}} za {{PLURAL:$2|poslednú hodinu|posledné '''$2''' hodiny|posledných '''$2''' hodín}} do $4, $3.",
-       "wlshowlast": "Zobraziť posledných $1 hodín $2 dní $3",
+       "wlshowlast": "Zobraziť posledných $1 hodín $2 dní",
        "watchlist-options": "Nastavenia zoznamu sledovaných",
        "watching": "Pridávam do zoznamu sledovaných...",
        "unwatching": "Odoberám zo zoznamu sledovaných...",
        "import": "Import stránok",
        "importinterwiki": "Transwiki import",
        "import-interwiki-text": "Zvoľte wiki a názov stránky, ktorá sa má importovať.\nDátumy revízií a mená používateľov budú zachované.\nVšetky transwiki importy sa zaznamenávajú v [[Special:Log/import|Zázname importov]].",
-       "import-interwiki-source": "Zdrojová wiki/stránka:",
+       "import-interwiki-sourcewiki": "Zdrojová wiki:",
+       "import-interwiki-sourcepage": "Zdrojová stránka:",
        "import-interwiki-history": "Skopírovať všetky historické revízie tejto stránky",
        "import-interwiki-templates": "Vložiť všetky šablóny",
        "import-interwiki-submit": "Importovať",
        "importuploaderrortemp": "Nahranie alebo import súboru zlyhal. Dočasný adresár chýba.",
        "import-parse-failure": "Chyba syntaktickej analýzy pri XML importe",
        "import-noarticle": "Žiadny článok na import!",
-       "import-nonewrevisions": "Všetky revízie boli predtým importované.",
+       "import-nonewrevisions": "Žiadne revízie neboli importované (buď už boli všetky  importované skôr, alebo boli preskočené kvôli chybám).",
        "xml-error-string": "$1 na riadku $2, stĺpec $3 (bajt $4): $5",
        "import-upload": "Nahrať XML údaje",
        "import-token-mismatch": "Strata údajov relácie. Prosím, skúste to znova.",
        "newimages-summary": "Táto špeciálna stránka zobrazuje posledné nahrané súbory.",
        "newimages-legend": "Filter",
        "newimages-label": "Názov súboru (alebo jeho časť):",
+       "newimages-showbots": "Zobraziť súbory nahrané botmi",
        "noimages": "Niet čo zobraziť.",
        "ilsubmit": "Hľadať",
        "bydate": "podľa dátumu",
        "exif-urgency-low": "Nízka ( $1 )",
        "exif-urgency-high": "Vysoká ( $1 )",
        "exif-urgency-other": "Používateľom definovaná priorita ($1)",
-       "watchlistall2": "všetky",
        "namespacesall": "všetky",
        "monthsall": "všetky",
        "confirmemail": "Potvrdiť e-mailovú adresu",
        "autosumm-replace": "Nahrádzam stránku textom „$1“",
        "autoredircomment": "Presmerovanie na [[$1]]",
        "autosumm-new": "Vytvorená stránka „$1“",
+       "autosumm-newblank": "Vytvorená prázdna stránka",
        "lag-warn-normal": "Úpravy za {{PLURAL:$1|poslednú sekundu|posledné $1 sekundy|posledných $1 sekúnd}} nemusia byť v tomto zozname zobrazené.",
        "lag-warn-high": "Kvôli dlhšej odozve databázového servera nemusia byť úpravy za {{PLURAL:$1|poslednú sekundu|posledné $1 sekundy|posledných $1 sekúnd}} v tomto zozname zobrazené.",
        "watchlistedit-normal-title": "Upraviť zoznam sledovaných stránok",
        "watchlistedit-raw-done": "Váš zoznam sledovaných stránok bol aktualizovaný.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Jedna položka bola pridaná|$1 položky boli pridané|$1 položiek bolo pridaných}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Jedna položka bola odstránená|$1 položky boli odstránené|$1 položiek bolo odstránených}}:",
+       "watchlistedit-clear-title": "Vyprázdnenie zoznamu sledovaných stránok",
+       "watchlistedit-clear-legend": "Vyprázdniť zoznam sledovaných stránok",
+       "watchlistedit-clear-explain": "Z vášho zoznamu sledovaných stránok budú odstránené všetky názvy",
+       "watchlistedit-clear-titles": "Názvy:",
+       "watchlistedit-clear-submit": "Vyprázdniť zoznam sledovaných stránok (natrvalo!)",
+       "watchlistedit-clear-done": "Váš zoznam sledovaných stránok bol vyprázdnený.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Bol odstránený jeden názov|Boli odstránené $1 názvy|Bolo odstránených $1 názvov}}:",
        "watchlisttools-view": "Zobraziť súvisiace zmeny",
        "watchlisttools-edit": "Zobraziť a upraviť zoznam sledovaných stránok",
        "watchlisttools-raw": "Upraviť nespracovaný zoznam sledovaných stránok",
        "version-license": "Licencia",
        "version-ext-license": "Licencia",
        "version-ext-colheader-name": "Rozšírenie",
+       "version-skin-colheader-name": "Vzhľad",
        "version-ext-colheader-version": "Verzia",
        "version-ext-colheader-license": "Licencia",
        "version-ext-colheader-description": "Popis",
        "htmlform-no": "Nie",
        "htmlform-yes": "Áno",
        "htmlform-chosen-placeholder": "Vyberte možnosť",
+       "htmlform-cloner-create": "Pridať ďalšie",
+       "htmlform-cloner-delete": "Odstrániť",
        "sqlite-has-fts": "$1 s podporou vyhľadávania v plnom texte",
        "sqlite-no-fts": "$1 bez podpory vyhľadávania v plnom texte",
        "logentry-delete-delete": "$1 zmazal stránku $3",
        "logentry-rights-rights-legacy": "$1 zmenil členstvo $3 v skupinách",
        "logentry-rights-autopromote": "$1 bol automaticky povýšený z $4 na $5",
        "rightsnone": "(žiadne)",
+       "revdelete-summary": "zhrnutie úprav",
        "feedback-bugornote": "Ak ste pripravený podrobne popísať technický problém, prosím pošlite [$1 hlásenie o chybe]. \nV opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš komentár sa pridá na stránku „[$3 $2]“ spolu s vašim používateľským meno a prehliadačom, ktorý používate.",
        "feedback-subject": "Predmet:",
        "feedback-message": "Správa:",
        "expand_templates_remove_comments": "Odstrániť komentáre",
        "expand_templates_remove_nowiki": "Potlačiť značky <nowiki> vo výsledku",
        "expand_templates_generate_xml": "Zobraziť strom XML",
-       "expand_templates_preview": "Náhľad"
+       "expand_templates_preview": "Náhľad",
+       "pagelang-name": "Stránka",
+       "pagelang-language": "Jazyk",
+       "pagelang-use-default": "Použiť predvolený jazyk",
+       "pagelang-select-lang": "Vybrať jazyk",
+       "right-pagelang": "Zmeniť jazyk stránky",
+       "default-skin-not-found": "Uups! Základná tapeta pre Vašu wiki, popísanú v <code dir=\"ltr\">$wgDefaultSkin</code> ako <code>$1</code>, nie je dostupná. \n\nVaša inštalácia pravdepodobne obsahuje nasledovné tapety. Pozri [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pre viac informácii o ich aktivácii a zvoľte základnú.\n\n$2\n\n; Ak ste MediaWiki len teraz nainštalovali\n; Zrejme ste to nainštalovali z gitu alebo priamo zo zdrojového kódu inou metódou. Je to očakávané. Skúste nainštalovať nejaké tapety z [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory];\n:*Stiahnutím [https://www.mediawiki.org/wiki/Download tarball installer], ktorý ponúka viacero tapiet a rozšírení. Skopírovať a nalepiť možno priamo z <code>skins/</code>.\n:*Klonovanie jednej zo <code>mediawiki/skins/*</code> schránok cez git do <code dir=\"ltr\">skins/</code> priečinku Vašej Media Wiki inštalácie.\n: S existujúcou git schránkou, ak ste vývojár MediaWiki, by nemal byť konflikt.\n\n: Ak ste upgradeovali MediaWiki\n: MediaWiki 1.24 a novšie už tapety automaticky neaktivujú. (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Nasledovný kód môžete skopírovať do <code>LocalSettings.php</code> pre aktivovanie všetkých dostupných tapiet.\n\n<pre dir=\"ltr\">$3</pre>\n\n; Ak ste upravili <code>LocalSettings.php</code>:\n: Skontrolujte chyby.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (povolený)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''zakázaný''')",
+       "mediastatistics": "Štatistika súborov",
+       "mediastatistics-table-count": "Počet súborov",
+       "mediastatistics-table-totalbytes": "Celková veľkosť",
+       "mediastatistics-header-unknown": "Neznáme",
+       "mediastatistics-header-bitmap": "Rastrové obrázky",
+       "mediastatistics-header-drawing": "Kresby (vektorové obrázky)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videá",
+       "mediastatistics-header-multimedia": "Multimédiá",
+       "mediastatistics-header-office": "Kancelárske súbory",
+       "mediastatistics-header-text": "Text",
+       "mediastatistics-header-executable": "Spustiteľné súbory",
+       "mediastatistics-header-archive": "Komprimované formáty"
 }
index fb31594..c078e01 100644 (file)
        "otherlanguages": "V drugih jezikih",
        "redirectedfrom": "(Preusmerjeno s strani $1)",
        "redirectpagesub": "Preusmeritvena stran",
+       "redirectto": "Preusmeritev na:",
        "lastmodifiedat": "Čas zadnje spremembe: $2, $1.",
        "viewcount": "Stran je bila naložena {{PLURAL:$1|$1-krat}}.",
        "protectedpage": "Zaščitena stran",
        "createaccount-text": "Nekdo je ustvaril račun $2 na {{GRAMMAR:dajalnik|{{SITENAME}}}} ($4). Geslo za »$2« je »$3«. Priporočljivo je, da se prijavite in spremenite svoje geslo sedaj.\n\nTo sporočilo lahko prezrete, če je bil račun ustvarjen pomotoma.",
        "login-throttled": "Nedavno ste izvedli preveč poskusov prijave.\nProsimo, počakajte $1, preden poskusite znova.",
        "login-abort-generic": "Vaša prijava ni bila uspešna – Prekinjeno",
+       "login-migrated-generic": "Vaš račun smo preselili in vaše uporabniško ime na tem wikiju ne obstaja več.",
        "loginlanguagelabel": "Jezik: $1",
        "suspicious-userlogout": "Vaša zahteva za odjavo je bila zavrnjena, saj kaže, da je bila poslana iz pokvarjenega brskalnika ali proxyja s predpomnilnikom.",
        "createacct-another-realname-tip": "Pravo ime ni obvezno.\nČe se ga odločite navesti, bo uporabljeno za priznavanje uporabnikovega dela.",
        "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-header": "Sprememba e-poštnega naslova računa",
        "changeemail-text": "Izpolnite obrazec za spremembo vašega e-poštnega naslova. Za potrditev spremembe boste morali vnesti svoje geslo.",
        "changeemail-no-info": "Za neposredni dostop do strani morate biti prijavljeni.",
        "changeemail-oldemail": "Trenutni e-poštni naslov:",
        "changeemail-none": "(noben)",
        "changeemail-password": "Vaše geslo za {{GRAMMAR:tožilnik|{{SITENAME}}}}:",
        "changeemail-submit": "Spremeni e-naslov",
-       "changeemail-cancel": "Prekliči",
        "changeemail-throttled": "Izvedli ste preveč poskusov prijave.\nProsimo, počakajte $1, preden poskusite znova.",
        "resettokens": "Ponastavitev žetonov",
        "resettokens-text": "Žetone lahko ponastavite, kar omogoča dostop do nekaterih zasebnih podatkov, povezanih z vašim računom.\n\nTo storite, če ste po nesreči žetone z nekom delili, ali če je bil vaš račun ogrožen.",
        "showpreview": "Prikaži predogled",
        "showdiff": "Prikaži spremembe",
        "blankarticle": "<strong>Opozorilo:</strong> Stran, ki jo ustvarjate, je prazna.\nČe ponovno kliknete »{{int:savearticle}}«, bomo stran ustvarili brez kakršne koli vsebine.",
-       "anoneditwarning": "'''Opozorilo''': niste prijavljeni. V zgodovino strani se bo zapisal vaš IP-naslov.",
+       "anoneditwarning": "<strong>Opozorilo:</strong> Niste prijavljeni. Vaš IP-naslov bo javno viden, če naredite kakršno koli urejanje. Če se <strong>[$1 prijavite]</strong> ali <strong>[$2 ustvarite račun]</strong>, bodo vaša urejanja pripisana vašemu uporabniškemu imenu skupaj z drugimi prednostmi.",
        "anonpreviewwarning": "Niste prijavljeni. Ob spremembi strani se bo vaš IP-naslov zapisal v zgodovini urejanja te strani.",
        "missingsummary": "'''Opozorilo:''' Niste napisali povzetka urejanja. Ob ponovnem kliku gumba ''Shrani'' se bo vaše urejanje shranilo brez njega.",
        "missingcommenttext": "Prosimo, vpišite v spodnje polje komentar.",
        "searchall": "vse",
        "showingresults": "Prikazujem do '''$1''' {{PLURAL:$1|zadetek|zadetka|zadetke|zadetkov}}, začenši s št. '''$2'''.",
        "showingresultsinrange": "Spodaj prikazujem {{PLURAL:$1|1=<strong>1</strong> rezultat|<strong>$1</strong> rezultata|<strong>$1</strong> rezultate|<strong>$1</strong> rezultatov}} v razponu od št. <strong>$2</strong> do št. <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Zadetek '''$1''' od '''$3'''|Zadetki '''$1 - $2''' od skupno '''$3'''}} za povpraševanje '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1–$2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Ni bilo zadetkov, ki ustrezajo poizvedbi.",
        "powersearch-legend": "Napredno iskanje",
        "powersearch-ns": "Iskanje v imenskih prostorih:",
        "prefs-tokenwatchlist": "Žeton",
        "prefs-diffs": "Primerjave",
        "prefs-help-prefershttps": "Nastavitev bo začela veljati ob vaši naslednji prijavi.",
+       "prefswarning-warning": "V svojih nastavitvah ste naredili spremembe, ki jih še niste shranili. Če odidete s strani brez da bi kliknili »$1«, vaših nastavitev ne bomo posodobili.",
        "prefs-tabs-navigation-hint": "Namig: Za krmarjenje med zavihki na seznamu zavihkov lahko uporabite levo in desno smerno tipko.",
        "email-address-validity-valid": "E-poštni naslov je videti veljaven",
        "email-address-validity-invalid": "Vnesite veljaven e-poštni naslov",
        "randomincategory": "Naključna stran v kategoriji",
        "randomincategory-invalidcategory": "»$1« ni veljavno ime kategorije.",
        "randomincategory-nopages": "V kategoriji [[:Category:$1]] ni nobene strani.",
-       "randomincategory-selectcategory": "Dobi naključno stran iz kategorije: $1 $2.",
-       "randomincategory-selectcategory-submit": "Pojdi",
+       "randomincategory-category": "Kategorija:",
+       "randomincategory-legend": "Naključna stran v kategoriji",
        "randomredirect": "Naključna preusmeritev",
        "randomredirect-nopages": "V imenskem prostoru »$1« ni preusmeritev.",
        "statistics": "Statistika",
        "querypage-disabled": "Ta posebna stran je onemogočena iz zmogljivostnih razlogov.",
        "booksources": "Viri knjig",
        "booksources-search-legend": "Išči knjižne vire",
-       "booksources-go": "Pojdi",
+       "booksources-search": "Išči",
        "booksources-text": "Sledi seznam povezav do drugi spletnih strani, ki prodajajo nove in rabljene knjige, in imajo morda nadaljnje informacije o knjigah, ki jih iščete:",
        "booksources-invalid-isbn": "Za dani ISBN se ne zdi, da je veljaven; preverite za morebitne napake pri kopiranju iz prvotnega vira.",
        "specialloguserlabel": "Izvajalec:",
        "wlheader-enotif": "Obveščanje po elektronski pošti je omogočeno.",
        "wlheader-showupdated": "Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
        "wlnote": "{{PLURAL:$1|Navedena je zadnja|Navedeni sta zadnji|Navedene so zadnje|Navedenih je zadnjih}} <strong>$1</strong> {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb}} v {{PLURAL:$2|zadnji <strong>$2</strong> uri|zadnjih <strong>$2</strong> urah}}, od $3, $4.",
-       "wlshowlast": "Prikaži zadnjih $1 ur; $2 dni; $3;",
+       "wlshowlast": "Prikaži zadnjih $1 ur; $2 dni",
        "watchlist-options": "Možnosti spiska nadzorov",
        "watching": "Nadziranje ...",
        "unwatching": "Nenadziranje ...",
        "exbeforeblank": "vsebina pred brisanjem: '$1'",
        "delete-confirm": "Brisanje »$1«",
        "delete-legend": "Izbriši",
-       "historywarning": "'''Opozorilo:''' Stran, ki jo želite izbrisati, ima zgodovino s približno $1 {{PLURAL:$1|redakcijo|redakcijama|redakcijami}}:",
+       "historywarning": "<strong>Opozorilo:</strong> Stran, ki jo nameravate izbrisati, ima zgodovino s približno $1 {{PLURAL:$1|redakcijo|redakcijama|redakcijami}}:",
        "confirmdeletetext": "Iz zbirke podatkov boste izbrisali stran ali sliko skupaj z vso njeno zgodovino.\nProsimo, '''potrdite''', da to resnično želite, da razumete posledice dejanja in da se ravnate po [[{{MediaWiki:Policy-url}}|pravilih]].",
        "actioncomplete": "Poseg je končan",
        "actionfailed": "Dejanje spodletelo",
        "delete-edit-reasonlist": "Uredi razloge za brisanje",
        "delete-toobig": "Ta stran ima obsežno zgodovino urejanja, tj. čez $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}.\nIzbris takšnih strani je bil omejen v izogib neželenim motnjam {{GRAMMAR:dative|{{SITENAME}}}}.",
        "delete-warning-toobig": "Ta stran ima obsežno zgodovino urejanja, tj. čez $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}.\nNjeno brisanje lahko zmoti obratovanje zbirke podatkov {{GRAMMAR:dative|{{SITENAME}}}};\nnadaljujte s previdnostjo.",
-       "delete-cantedit": "Strani ne morete izbrisati, ker je nimate dovoljenja urejati.",
+       "deleteprotected": "Strani ne morete izbrisati, ker jo je nekdo zaščitil.",
        "deleting-backlinks-warning": "'''Opozorilo:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druge strani]] se povezujejo na ali vključujejo stran, ki jo nameravate izbrisati.",
        "rollback": "Vrni spremembe",
        "rollback_short": "Vrni",
        "protect-othertime": "Drugačen čas:",
        "protect-othertime-op": "drugačen čas",
        "protect-existing-expiry": "Obstoječ čas izteka: $3, $2",
+       "protect-existing-expiry-infinity": "Obstoječ čas izteka: neskončno",
        "protect-otherreason": "Drug/dodaten razlog:",
        "protect-otherreason-op": "Drug razlog",
        "protect-dropdown": "*Pogosti razlogi za zaščito\n** Prekomeren vandalizem\n** Vztrajno dodajanje reklamnih povezav\n** Neproduktivne urejevalske vojne\n** Zelo obiskana stran",
        "unblocked": "[[User:$1|$1]] je bil odblokiran",
        "unblocked-range": "$1 so odblokirani",
        "unblocked-id": "Blokada $1 je odstranjena",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] smo odblokirali.",
        "blocklist": "Blokirani uporabniki",
        "ipblocklist": "Blokirani uporabniki",
        "ipblocklist-legend": "Poišči blokiranega uporabnika",
        "import": "Uvoz strani",
        "importinterwiki": "Uvoz transwiki",
        "import-interwiki-text": "Izberite wiki in naslov strani za uvoz.\nDatumi in imena urejevalcev redakcij bodo ohranjena.\nVsi uvozi med wikiji so zabeleženi v [[Special:Log/import|dnevniku uvozov]].",
-       "import-interwiki-source": "Izvorni wiki/stran:",
+       "import-interwiki-sourcewiki": "Izvorni wiki:",
+       "import-interwiki-sourcepage": "Izvorna stran:",
        "import-interwiki-history": "Kopiraj vse dosedanje redakcije te strani",
        "import-interwiki-templates": "Vključi vse predloge",
        "import-interwiki-submit": "Uvozi",
        "exif-urgency-low": "Nizko ($1)",
        "exif-urgency-high": "Visoko ($1)",
        "exif-urgency-other": "Uporabniško določena prednost ($1)",
-       "watchlistall2": "vse",
        "namespacesall": "vse",
        "monthsall": "vse",
        "confirmemail": "Potrditev naslova elektronske pošte",
        "logentry-upload-overwrite": "$1 je {{GENDER:$2|naložil|naložila|naložil(-a)}} novo različico $3",
        "logentry-upload-revert": "$1 je {{GENDER:$2|naložil|naložila|naložil(-a)}} $3",
        "rightsnone": "(nobeno)",
+       "revdelete-summary": "povzetek urejanja",
        "feedback-bugornote": "Če ste pripravljeni podrobno opisati tehnično težavo, vložite [$1 poročilo o hrošču].\nV nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bomo dodali na stran »[$3 $2]«, skupaj z vašim uporabniškim imenom in podatkom o brskalniku, ki ga uporabljate.",
        "feedback-subject": "Zadeva:",
        "feedback-message": "Sporočilo:",
        "log-name-pagelang": "Dnevnik spreminjanja jezika",
        "log-description-pagelang": "Dnevnik sprememb jezika strani.",
        "logentry-pagelang-pagelang": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} jezik strani $3 z jezika $4 na jezik $5.",
+       "default-skin-not-found": "Ups! Privzeta koža vašega wikija, določena v <code dir=\"ltr\">$wgDefaultSkin</code> kot <code>$1</code>, ni na voljo.\n\nKot kaže, vaša namestitev vsebuje kože, navedene spodaj. Oglejte si [https://www.mediawiki.org/wiki/Manual:Skin_configuration Priročnik: Konfiguracija kož] za več informacij, kako jih omogočiti in nastaviti kot privzete.\n\n$2\n\n; Če ste MediaWiki pravkar namestili:\n: Verjetno ste ga namestili z git ali neposredno iz izvorne kode na kakšen drug način. To je pričakovano. Poskusite namestiti nekaj kož z [https://www.mediawiki.org/wiki/Category:All_skins imenika kož mediawiki.org] tako:\n:* Prenesite [https://www.mediawiki.org/wiki/Download namestitveni program tarball], ki vsebuje nekaj kož in razširitev. Iz njega lahko kopirate in prilepite mapo <code>skins/</code>.\n:* Klonirajte enega od repozitorijev <code>mediawiki/skins/*</code> z git v mapo <code dir=\"ltr\">skins/</code> vaše namestitve MediaWiki.\n: Če ste razvijalec MediaWiki, to ne sme poseči v vaš repozitorij git.\n\n; Če ste MediaWiki pravkar posodobili:\n: MediaWiki 1.24 in novejši nameščenih kož več ne omogočijo samodejno (oglejte si [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Priročnik: Samodejno odkrivanje kož]). V <code>LocalSettings.php</code> lahko prilepite naslednje vrstice, da omogočite trenutno nameščene kože:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Če ste pravkar spremenili <code>LocalSettings.php</code>:\n: Ponovno preverite imena kož, če ste se morda zatipkali.",
+       "default-skin-not-found-no-skins": "Ups! Privzeta koža vašega wikija, določena v <code dir=\"ltr\">$wgDefaultSkin</code> kot <code>$1</code>, ni na voljo.\n\nNimate nameščenih kož.\n\n; Če ste MediaWiki pravkar namestili ali posodobili:\n: Verjetno ste ga namestili z git ali neposredno iz izvorne kode na kakšen drug način. To je pričakovano. MediaWiki 1.24 in novejši nimajo vključene nobene kože v glavnem repozitoriju. Poskusite namestiti nekaj kož z [https://www.mediawiki.org/wiki/Category:All_skins imenika kož mediawiki.org] tako:\n:* Prenesite [https://www.mediawiki.org/wiki/Download namestitveni program tarball], ki vsebuje nekaj kož in razširitev. Iz njega lahko kopirate in prilepite mapo <code dir=\"ltr\">skins/</code>.\n:* Klonirajte enega od repozitorijev <code>mediawiki/skins/*</code> z git v mapo <code>skins/</code> vaše namestitve MediaWiki.\n: Če ste razvijalec MediaWiki, to ne sme poseči v vaš repozitorij git. Oglejte si [https://www.mediawiki.org/wiki/Manual:Skin_configuration Priročnik: Konfiguracija kož] za več informacij, kako jih omogočiti in nastaviti kot privzete.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (omogočeno)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''onemogočeno''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''onemogočeno''')",
+       "mediastatistics": "Statistika predstavnosti",
+       "mediastatistics-summary": "Statistika o naloženih vrstah datotek. To vključuje samo najnovejše različice datotek. Stare in izbrisane različice niso vključene.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajta|$1 bajti|$1 bajtov}} ($2; $3 %)",
+       "mediastatistics-table-mimetype": "Vrsta MIME",
+       "mediastatistics-table-extensions": "Možne razširitve",
+       "mediastatistics-table-count": "Število datotek",
+       "mediastatistics-table-totalbytes": "Skupna velikost",
+       "mediastatistics-header-unknown": "Neznano",
+       "mediastatistics-header-bitmap": "Bitne slike",
+       "mediastatistics-header-drawing": "Risbe (vektorske slike)",
+       "mediastatistics-header-audio": "Zvok",
+       "mediastatistics-header-video": "Videoposnetki",
+       "mediastatistics-header-multimedia": "Obogatena predstavnost",
+       "mediastatistics-header-office": "Pisarna",
+       "mediastatistics-header-text": "Besedilno",
+       "mediastatistics-header-executable": "Izvedljive datoteke",
+       "mediastatistics-header-archive": "Stisnjene oblike",
+       "json-warn-trailing-comma": "Iz JSON-a smo odstranili $1 {{PLURAL:$1|končno vejico|končni vejici|končne vejice|končnih vejic}}",
+       "json-error-unknown": "Naleteli smo na težavo z JSON-om. Napaka: $1",
+       "json-error-depth": "Presegli smo največjo globino sklada",
+       "json-error-state-mismatch": "Neveljaven ali slabo oblikovan JSON",
+       "json-error-ctrl-char": "Napaka kontrolnega znaka; morda je nepravilno zakodiran",
+       "json-error-syntax": "Skladenjska napaka",
+       "json-error-utf8": "Nepravilno oblikovani znaki UTF-8; morda so nepravilno zakodirani",
+       "json-error-recursion": "En ali več rekurzivnih sklicev v vrednosti za zakodirati",
+       "json-error-inf-or-nan": "Ena ali več vrednosti NAN ali INF v vrednosti za zakodirati",
+       "json-error-unsupported-type": "Podana je bila vrsta, ki je ni mogoče zakodirati"
 }
index 3c0729d..3e72352 100644 (file)
        "searchrelated": "verwandt",
        "searchall": "olle",
        "showingresults": "Hier {{PLURAL:$1|ies '''1''' Ergebnis|sein '''$1''' Ergebnisse}}, beginnend miet Nummer '''$2.'''",
-       "showingresultsheader": "{{PLURAL:$5|Ergebnis '''$1''' vu '''$3'''|Ergebnisse '''$1–$2''' vu '''$3'''}} fier '''$4'''",
        "search-nonefound": "Fier denne Sichoafroage wurden kenne Ergebnisse gefunda.",
        "powersearch-ns": "Suche ei Noamasräuma:",
        "powersearch-toggleall": "Olle",
        "pager-older-n": "{{PLURAL:$1|vurheriger|vurherige $1}}",
        "booksources": "ISBN-Suche",
        "booksources-search-legend": "Suche noach Bezugsquella fier Bicher",
-       "booksources-go": "Sucha",
        "booksources-text": "Dies ies anne Liste miet Links zu Internetseyta, de neue und gebrauchte Bicher verkoofa. Durt koan is au wettere Informationen ieber de Bicher gahn. {{SITENAME}} ies miet kemm dieser Oabieter geschäftlich verbunda.",
        "booksources-invalid-isbn": "Vermutlich ies de ISBN ungiltig.\nBitte priefe, ob korrekt vu dar Quelle iebertraga wurde.",
        "speciallogtitlelabel": "Tittel:",
        "wlheader-enotif": "Dar E-Mail-Benoachrichtigungsdienst ies aktiviert.",
        "wlheader-showupdated": "Seyta miet noo ne gesehenen Änderunga waan '''fett''' dargestellt.",
        "wlnote": "Is {{PLURAL:$1|folgt de letzte Änderung|folga de letzta '''$1''' Änderunga}} dar letzta {{PLURAL:$2|Stunde|'''$2''' Stunda}}.",
-       "wlshowlast": "Zeige de Änneronga dar letzta $1 Stonda, $2 Taage oder $3.",
+       "wlshowlast": "Zeige de Änneronga dar letzta $1 Stonda, $2 Taage oder .",
        "watchlist-options": "Oazeegeoptiona",
        "watching": "Beobachta …",
        "unwatching": "Nee beobachta …",
        "thumbnail_image-type": "Bildtyp ne understützt",
        "import": "Seyta importiern",
        "import-interwiki-text": "Wähle a Wiki und anne Seite zum Importieren aus.\nDe Versionsdaten und Nutzernoama bleiba dabei erhaala.\nOlle Transwiki-Import-Aksjonna waan eim [[Special:Log/import|Import-Logbuch]] protokolliert.",
-       "import-interwiki-source": "Quell-Wiki/-Seite:",
        "import-interwiki-history": "Olle Versionen dieser Seite importieren",
        "import-interwiki-templates": "Olle Vurloaga einschließen",
        "import-interwiki-namespace": "Zielnoamasraum:",
        "exif-sharpness-2": "Stork",
        "exif-subjectdistancerange-0": "Unbekennt",
        "exif-gpsstatus-v": "Interoperabilität vu Messunga",
-       "watchlistall2": "olle",
        "namespacesall": "olle",
        "monthsall": "olle",
        "confirmemail": "E-Mail-Atresse bestätiga (Authentifizierung)",
        "htmlform-reset": "Änderunga rickgängig macha",
        "htmlform-selectorother-other": "Ondere",
        "revdelete-restricted": "Einschränkungen gelten au fier Administratorn",
-       "revdelete-unrestricted": "Einschränkungen fier Administratorn uffgehobn"
+       "revdelete-unrestricted": "Einschränkungen fier Administratorn uffgehobn",
+       "revdelete-summary": "Zusommafoassungskommentar"
 }
index 7587cea..64d48e6 100644 (file)
        "passwordreset-emailelement": "Magaca gudagalka: $1\nEreysirka kumeelgaarka ah: $2",
        "passwordreset-emailerror-capture": "E-mail xasuus ah ayaa la sameeyay, oo ka arki kartid hoosta,laakiin wuxuu ku guul dareestay in isticmaalaha loo diro: $1",
        "changeemail": "Bedel ciwaanka E-mailka",
-       "changeemail-header": "Bedel ciwaanka e-mailka akoonka",
        "changeemail-oldemail": "Ciwaanka e-mailka hadda jiro:",
        "changeemail-newemail": "Ciwaan e-mail oo cusub:",
        "changeemail-none": "(waxna)",
        "changeemail-submit": "Bedel e-mailka",
-       "changeemail-cancel": "Ka noqo",
        "bold_sample": "Far butac ah",
        "bold_tip": "Far butac ah",
        "italic_sample": "Farta caatada ah",
        "searchrelated": "La xiriiro",
        "searchall": "Dhamaan",
        "showingresults": "Waxaa hoos laga heley{{PLURAL:$1|'''1''' natiijo|'''$1''' natiijooyin}} ka biloow #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Natiijada  '''$1''' ee '''$3'''|Natiijooyinka '''$1 - $2'''  oo ah  '''$3'''}} ee '''$4'''",
        "search-nonefound": "Wax natiijo oo ka soo baxay ma jirto wixii aad raadisay",
        "powersearch-legend": "Sidii aad wax uugu raadin laheed",
        "powersearch-ns": "ka raadi xarun magaceedka:",
        "pager-older-n": "{{PLURAL:$1|ka duqsan 1|ka duqsan $1}}",
        "booksources": "Xogta buuga",
        "booksources-search-legend": "Raadi xogta buuga",
-       "booksources-go": "Soco",
        "log": "Guda galayaasha",
        "allpages": "Dhamaan bogagga",
        "nextpage": "Bogga ku xiga ($1)",
        "unwatch": "Ha waardiyeynin",
        "unwatchthispage": "Jooji waardiyeyntiisa",
        "watchlist-details": "{{PLURAL:$1|$1 bog|$1 boggag ah}}  aa ku jirto liiskaaga waardiyaha, ma lagu darin boggaga wadahadalka.",
-       "wlshowlast": "Itus wixii ka danbeeyay $1 saacadood $2 maalmood $3",
+       "wlshowlast": "Itus wixii ka danbeeyay $1 saacadood $2 maalmood",
        "watchlist-options": "Dooqyada liiska waardiyaha",
        "watching": "Daawasho...",
        "enotif_subject_created": "{{SITENAME}} Bogga $1 Qof ayaa sameeyey {{gender:$2|$2}}",
        "metadata-fields": "Sawirka qeybihiisa metadata oo ku tixan fariintaan waxaa lagu dari doonaa bogga sawirka meesha laga arko markii miiska metadata la qariyo.Kuwa kale waxaa loo qarinaa sida default.\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-iimcategory": "Qeybta",
        "exif-dc-rights": "Xuquuqaha",
-       "watchlistall2": "dhamaan",
        "namespacesall": "dhamaan",
        "monthsall": "Dhamaan",
        "confirmemail_noemail": "Kuma haysatid cinwaan E-boosto sax [[Special:Preferences|isticmaala dooqiisa]].",
index cda9eba..6d7a6a3 100644 (file)
        "passwordreset-emailsent-capture": "U dërgua një e-mail kujtesë, 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-header": "Ndrysho llogarinë e adresës së postës 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-none": "(asgjë)",
        "changeemail-submit": "Ndrysho postën elektronike",
-       "changeemail-cancel": "Anulo",
        "bold_sample": "Stil i theksuar i tekstit",
        "bold_tip": "Stil i theksuar i tekstit",
        "italic_sample": "Tekst i pjerrët",
        "searchrelated": "të ngjashme",
        "searchall": "të gjitha",
        "showingresults": "Më poshtë tregohen {{PLURAL:$1|'''1''' përfundim|'''$1''' përfundime}} duke filluar nga #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Rezultati '''$1''' nga '''$3'''|Rezultatet '''$1 - $2''' nga '''$3'''}} për '''$4'''",
        "search-nonefound": "Nuk ka rezultate që përputhen me kërkesën.",
        "powersearch-legend": "Kërkim i përparuar",
        "powersearch-ns": "Kërkim në hapësira:",
        "querypage-disabled": "Kjo faqe speciale është çaktivizuar për arsye të performancës.",
        "booksources": "Burime librash",
        "booksources-search-legend": "Kërkim burimor librash",
-       "booksources-go": "Shko",
        "booksources-text": "Më posht është një listë me lidhje të cilët shesin ose përdorin libra dhe munden të kenë informacione për librat që kërkoni ju:",
        "booksources-invalid-isbn": "ISBN-ja e dhënë nuk duket të jetë e vlefshme; kontrolloni oër gabime gjatë kopjimit nga burimi origjinal.",
        "specialloguserlabel": "Performuesi:",
        "wlheader-enotif": "Njoftimi me email është lejuar.",
        "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
        "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLUARAL:$2:orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.",
-       "wlshowlast": "Trego $1 orët $2 ditët $3",
+       "wlshowlast": "Trego $1 orët $2 ditët",
        "watchlist-options": "Mundësitë e listës mbikqyrëse",
        "watching": "Duke mbikqyrur...",
        "unwatching": "Duke çmbikqyrur...",
        "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-source": "Burimi wiki/faqe",
        "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",
        "exif-urgency-low": "Ulët ( $1 )",
        "exif-urgency-high": "E Lartë ( $1 )",
        "exif-urgency-other": "Prioritet i përcaktuar nga përdoruesi ( $1 )",
-       "watchlistall2": "të gjitha",
        "namespacesall": "të gjitha",
        "monthsall": "të gjitha",
        "confirmemail": "Vërtetoni adresën tuaj",
        "logentry-newusers-create2": "$1 krijoi një llogari $3",
        "logentry-newusers-autocreate": "Llogaria $1 u krijua automatikisht",
        "rightsnone": "(asgjë)",
+       "revdelete-summary": "përmbledhja redaktimit",
        "feedback-bugornote": "Nëse jeni gati për të përshkruar një problem teknik me detaje ju lutemi [$1 raportoni një problem].\nPërndryshe, ju mund të formularin e thjeshtë më poshtë. Komenti juaj do të shtohet te faqja \"[$3 $2]\"\", së bashku me emrin tuaj të përdoruesit dhe shfletuesin të cilin jeni duke përdorur.",
        "feedback-subject": "Subjekti:",
        "feedback-message": "Mesazhi:",
index 5a3a2f9..85b079d 100644 (file)
        "otherlanguages": "Други језици",
        "redirectedfrom": "(преусмерено са $1)",
        "redirectpagesub": "Преусмерење",
+       "redirectto": "Преусмерава на:",
        "lastmodifiedat": "Ова страница је последњи пут измењена $1 у $2.",
        "viewcount": "Ова страница је прегледана {{PLURAL:$1|једанпут|$1 пута|$1 пута}}.",
        "protectedpage": "Заштићена страница",
        "badtitle": "Неисправан наслов",
        "badtitletext": "Наслов странице је неисправан, празан или је међујезички или међувики наслов погрешно повезан.\nМожда садржи знакове који се не могу користити у насловима.",
        "perfcached": "Следећи подаци су кеширани и могу бити застарели. Кеш садржи највише {{PLURAL:$1|један резултат|$1 резултата|$1 резултата}}.",
-       "perfcachedts": "Следећи подаци су кеширани и последњи пут су ажурирани $2 у $3. У кешу {{PLURAL:$4|је доступан највише један резултат|су доступна највише $4 резултата|је доступно највише $4 резултата}}.",
+       "perfcachedts": "Следећи подаци су кеширани и последњи пут су ажурирани $2 у $3. У кешу {{PLURAL:$4|1=је доступан највише један резултат|су доступна највише $4 резултата|је доступно највише $4 резултата}}.",
        "querypage-no-updates": "Ажурирање ове странице је тренутно онемогућено.\nПодаци који се овде налазе могу бити застарели.",
        "viewsource": "Изворни код",
        "viewsource-title": "Приказ извора странице $1",
        "createacct-another-submit": "Отвори још један налог",
        "createacct-benefit-heading": "{{SITENAME}} је направљен од стране људи као што сте ви.",
        "createacct-benefit-body1": "{{PLURAL:$1|измена}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|страница}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|страница|странице}}",
        "createacct-benefit-body3": "скорашњих {{PLURAL:$1|доприноса}}",
        "badretype": "Унете лозинке се не поклапају.",
        "userexists": "Корисничко име је заузето. Изаберите друго.",
        "loginerror": "Грешка при пријављивању",
-       "createacct-error": "Ð\94оÑ\88ло Ñ\98е Ð´Ð¾ Ð³Ñ\80еÑ\88ке Ð¿Ñ\80и ÐºÑ\80еирању налога",
+       "createacct-error": "Ð\94оÑ\88ло Ñ\98е Ð´Ð¾ Ð³Ñ\80еÑ\88ке Ð¿Ñ\80и Ð¾Ñ\82варању налога",
        "createaccounterror": "Не могу да отворим налог: $1",
        "nocookiesnew": "Кориснички налог је отворен, али нисте пријављени.\n{{SITENAME}} користи колачиће за пријаву. Вама су колачићи онемогућени.\nОмогућите их, па се онда пријавите са својим корисничким именом и лозинком.",
        "nocookieslogin": "{{SITENAME}} користи колачиће за пријављивање корисника.\nВама су колачићи онемогућени. Омогућите их и покушајте поново.",
        "passwordsent": "Нова лозинка је послата на е-адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.",
        "blocked-mailpassword": "Вашој ИП адреси је онемогућено уређивање страница, као и могућност захтевања нове лозинке.",
        "eauthentsent": "На наведену е-адресу је послат потврдни код.\nПре него што пошаљемо даљње поруке, пратите упутства с е-поште да бисте потврдили да сте ви отворили налог.",
-       "throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|сат времена|$1 сата|$1 сати}}.",
+       "throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
        "mailerror": "Грешка при слању поруке: $1",
        "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу ИП адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога|$1 налога}} претходни дан, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове ИП адресе тренутно не могу отворити више налога.",
        "emailauthenticated": "Ваша е-адреса је потврђена $2 у $3.",
        "passwordreset-emailsent-capture": "Послат је подсетник преко е-поште (приказан доле).",
        "passwordreset-emailerror-capture": "Е-порука за ресетовање лозинке, приказана испод је послата, али слање {{GENDER:$2|кориснику|корисници}} није успело: $1",
        "changeemail": "Промена е-адресе",
-       "changeemail-header": "Промените е-адресу налога",
        "changeemail-text": "Попуните овај образац да бисте променили своју е-адресу. Мораћете да унесете лозинку да потврдите измену.",
        "changeemail-no-info": "Морате бити пријављени да бисте приступили овој страници.",
        "changeemail-oldemail": "Тренутна е-адреса:",
        "changeemail-none": "(ништа)",
        "changeemail-password": "Ваша лозинка:",
        "changeemail-submit": "Промени",
-       "changeemail-cancel": "Откажи",
        "changeemail-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
        "resettokens": "Ресетовање жетона",
        "resettokens-no-tokens": "Нема жетона за ресетовање.",
        "showpreview": "Прикажи претпреглед",
        "showdiff": "Прикажи измене",
        "blankarticle": "<strong>Упозорење:</strong> страница коју правите нема никакав садржај.\nАко још једном притиснете „{{int:savearticle}}“ направићете страницу без садржаја.",
-       "anoneditwarning": "'''Упозорење:''' нисте пријављени.\nВаша ИП адреса ће бити забележена у историји ове странице.",
+       "anoneditwarning": "<strong>Упозорење:</strong> нисте пријављени. Ваша ИП адреса ће бити јавно видљива у историји ове странице ако начините било какву измену. Ако се <strong>[$1 пријавите]</strong> или <strong>[$2 отворите налог]</strong> ваше измене ће бити приписане вашем корисничком имену.",
        "anonpreviewwarning": "''Нисте пријављени. Ваша ИП адреса ће бити забележена у историји ове странице.''",
        "missingsummary": "'''Напомена:''' нисте унели опис измене.\nАко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити сачувана без описа.",
        "missingcommenttext": "Унесите коментар испод.",
        "subject-preview": "Преглед теме/наслова:",
        "blockedtitle": "Корисник је блокиран",
        "blockedtext": "<strong>Ваше корисничко име или ИП адреса је блокирана.</strong>\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог: <em>$2</em>.\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварања било каквих упита.",
-       "autoblockedtext": "Ваша ИП адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$1|блокирао|блокирала|блокирао}} $1.\nРазлог:\n\n:''$2''\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$1|кориснику|корисници|кориснику}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ИБ $5.\nНаведите све податке изнад при стварању било каквих упита.",
+       "autoblockedtext": "Ваша ИП адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "За уређивање странице је потребно да будете $1.",
        "confirmedittext": "Морате да потврдите своју е-адресу пре уређивања страница.\nПоставите и потврдите адресу преко [[Special:Preferences|подешавања]].",
        "parser-unstrip-loop-warning": "Утврђена је петља",
        "parser-unstrip-recursion-limit": "Прекорачено је ограничење рекурзије ($1)",
        "converter-manual-rule-error": "Пронађена је грешка у правилу за ручно претварање језика",
-       "undo-success": "Измена се може вратити.\nПроверите разлике испод, па сачувајте измене.",
+       "undo-success": "Измена се може вратити.\nПроверите разлике испод па сачувајте измене.",
        "undo-failure": "Ова измена се не може поништити због сукоба измена.",
        "undo-norev": "Не могу да вратим измену јер не постоји или је обрисана.",
        "undo-nochange": "Изгледа да је измена већ поништена.",
        "undo-summary": "Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]])",
        "undo-summary-username-hidden": "Поништи измену $1 скривеног корисника",
        "cantcreateaccounttitle": "Не могу да отворим налог",
-       "cantcreateaccount-text": "Отварање налога с ове IP адресе ('''$1''') је {{GENDER:$3|блокирао|блокирала|блокирао}} [[User:$3|$3]].\n\nРазлог који је навео {{GENDER:$3|корисник|корисница|корисник}} $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 је <em>$2</em>",
        "viewpagelogs": "Погледај дневнике ове странице",
        "nohistory": "Не постоји историја измена ове странице.",
        "currentrev": "Текућа измена",
        "mergehistory-same-destination": "Изворна и одредишна страница не могу бити исте",
        "mergehistory-reason": "Разлог:",
        "mergelog": "Дневник спајања",
-       "pagemerge-logentry": "Ñ\81Ñ\82Ñ\80аниÑ\86а [[$1]] Ñ\98е Ñ\81поÑ\98ена у [[$2]] (све до измене $3)",
+       "pagemerge-logentry": "Ñ\98е Ñ\81поÑ\98ио [[$1]] у [[$2]] (све до измене $3)",
        "revertmerge": "растави",
        "mergelogpagetext": "Испод је списак најскоријих спајања историја двеју страница.",
        "history-title": "Историја измена странице „$1“",
        "searchall": "све",
        "showingresults": "Испод {{PLURAL:$1|је приказан <strong>1</strong> резултат|су приказана <strong>$1</strong> резултата|је приказано <strong>$1</strong> резултата}} почев од броја <strong>$2</strong>.",
        "showingresultsinrange": "Испод {{PLURAL:$1|је приказан <strong>1</strong> резултат|су приказана <strong>$1</strong> резултата|је приказано <strong>$1</strong> резултата}}, у распону од <strong>$2</strong> до <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Резултат '''$1''' од '''$3'''|Резултата '''$1 – $2''' од '''$3'''}} за '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Резултат <strong>$1</strong> од <strong>$3</strong>|Резултата <strong>$1 – $2</strong> од <strong>$3</strong>}}",
        "search-nonefound": "Нема поклапања.",
        "powersearch-legend": "Напредна претрага",
        "powersearch-ns": "Тражи у следећим именским просторима:",
        "prefs-tokenwatchlist": "Жетон",
        "prefs-diffs": "Разлике",
        "prefs-help-prefershttps": "Ова подешавања ће ступити на снагу при следећој пријави.",
+       "prefswarning-warning": "Променили сте ваша подешавања али нисте их још сачували.\nАко не притиснете „$1“ ваша подешавања ће бити изгубљена.",
        "email-address-validity-valid": "Е-адреса је исправна",
        "email-address-validity-invalid": "Унесите исправну е-адресу",
        "userrights": "Управљање корисничким правима",
        "action-move": "премештање ове странице",
        "action-move-subpages": "премештање ове странице и њених подстраница",
        "action-move-rootuserpages": "премештање основних корисничких страница",
+       "action-move-categorypages": "премештање категорија",
        "action-movefile": "премештање ове датотеке",
        "action-upload": "слање ове датотеке",
        "action-reupload": "замењивање постојеће датотеке",
        "randomincategory": "Случајна страница у категорији",
        "randomincategory-invalidcategory": "„$1“ није ваљано име категорије",
        "randomincategory-nopages": "Нема страница у категорији [[:Category:$1|$1]].",
-       "randomincategory-selectcategory-submit": "Иди",
+       "randomincategory-category": "Категорија:",
        "randomredirect": "Случајно преусмерење",
        "randomredirect-nopages": "Нема преусмерења у именском простору „$1”.",
        "statistics": "Статистике",
        "statistics-views-peredit": "Прегледа по измени",
        "statistics-users": "Регистровани [[Special:ListUsers|корисници]]",
        "statistics-users-active": "Активни корисници",
-       "statistics-users-active-desc": "Корисници који су извршили бар једну радњу {{PLURAL:$1|претходни дан|у последња $1 дана|у последњих $1 дана}}",
+       "statistics-users-active-desc": "Корисници који су извршили бар једну радњу {{PLURAL:$1|1=претходни дан|у последња $1 дана|у последњих $1 дана}}",
        "statistics-mostpopular": "Најпосећеније странице",
        "pageswithprop": "Стране с особином стране",
        "pageswithprop-legend": "Стране с особином стране",
        "suppress": "Надзор",
        "querypage-disabled": "Ова посебна страница је онемогућена ради побољшања перформанси.",
        "booksources": "Штампани извори",
-       "booksources-search-legend": "ТÑ\80ажеÑ\9aе Ð¸Ð·Ð²Ð¾Ñ\80а ÐºÑ\9aиге",
+       "booksources-search-legend": "ТÑ\80ажи ÐºÑ\9aижевне Ð¸Ð·Ð²Ð¾Ñ\80е",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Иди",
+       "booksources-search": "Претражи",
        "booksources-text": "Испод се налази списак веза ка сајтовима који се баве продајом нових и половних књига, а који би могли имати додатне податке о књигама које тражите:",
        "booksources-invalid-isbn": "Наведени ISBN број није исправан. Проверите да није дошло до грешке при умножавању из првобитног извора.",
        "specialloguserlabel": "Извршилац:",
        "listusers-noresult": "Корисник није пронађен.",
        "listusers-blocked": "({{GENDER:$1|блокиран|блокирана|блокиран}})",
        "activeusers": "Списак активних корисника",
-       "activeusers-intro": "Ово је списак корисника који су били активни {{PLURAL:$1|претходни дан|у последња $1 дана|у последњих $1 дана}}.",
+       "activeusers-intro": "Ово је списак корисника који су били активни {{PLURAL:$1|1=претходни дан|у последња $1 дана|у последњих $1 дана}}.",
        "activeusers-count": "$1 {{PLURAL:$1|радња|радње|радњи}} {{PLURAL:$3|претходни дан|у последња $3 дана|у последњих $3 дана}}",
        "activeusers-from": "Прикажи кориснике почев од:",
        "activeusers-hidebots": "Сакриј ботове",
        "listgrouprights-namespaceprotection-namespace": "Именски простор",
        "trackingcategories-name": "Име поруке",
        "trackingcategories-nodesc": "Опис није доступан.",
+       "trackingcategories-disabled": "Категорија је онемогућена",
        "mailnologin": "Нема адресе за слање",
        "mailnologintext": "Морате бити [[Special:UserLogin|пријављени]] и имати исправну е-адресу у [[Special:Preferences|подешавањима]] да бисте слали е-поруке другим корисницима.",
        "emailuser": "Пошаљи е-поруку",
        "emailuser-title-target": "Слање е-поруке {{GENDER:$1|кориснику|корисници|кориснику}}",
        "emailuser-title-notarget": "Слање е-поруке кориснику",
        "emailpage": "Слање е-порука",
-       "emailpagetext": "Можете да користите доњи образац да пошаљете е-поруку {{GENDER:$1|овом кориснику|овој корисници|овом кориснику|}}.\nЕ-адреса коју сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.",
+       "emailpagetext": "Можете да користите доњи образац да пошаљете е-поруку {{GENDER:$1|овом кориснику|овој корисници}}.\nЕ-адреса коју сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.",
        "defemailsubject": "{{SITENAME}} — Е-пошта од {{GENDER:$1|корисника|кориснице}} $1",
        "usermaildisabled": "Корисничка е-пошта је онемогућена",
        "usermaildisabledtext": "Не можете да шаљете е-поруке другим корисницима на овом викију",
        "wlheader-enotif": "Обавештење е-поруком је омогућено.",
        "wlheader-showupdated": "Странице које су измењене откад сте их последњи пут посетили су '''подебљане'''.",
        "wlnote": "Испод {{PLURAL:$1|је последња измена|су последње '''$1''' измене|је последњих '''$1''' измена}} у {{PLURAL:$2|претходном сату|претходна '''$2''' сата|претходних '''$2''' сати}}, закључно са $3, $4.",
-       "wlshowlast": "Прикажи последњих $1 сати, $2 дана, $3",
+       "wlshowlast": "Прикажи последњих $1 сати, $2 дана",
        "watchlist-options": "Поставке списка надгледања",
        "watching": "Надгледање…",
        "unwatching": "Прекидање надгледања…",
        "exbeforeblank": "садржај пре брисања је био: „$1“",
        "delete-confirm": "Брисање странице „$1“",
        "delete-legend": "Обриши",
-       "historywarning": "<strong>Упозорење:</strong> страница коју желите да обришете има историју с приближно $1 {{PLURAL:$1|изменом|измене|измена}}:",
+       "historywarning": "<strong>Упозорење:</strong> страница коју желите да обришете има историју са $1 {{PLURAL:$1|изменом|измене|измена}}:",
        "confirmdeletetext": "Управо ћете обрисати страницу, укључујући и њену историју.\nПотврдите своју намеру, да разумете последице и да ово радите у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "actioncomplete": "Радња је завршена",
        "actionfailed": "Радња није успела",
        "delete-edit-reasonlist": "Уреди разлоге брисања",
        "delete-toobig": "Ова страница има велику историју, преко $1 {{PLURAL:$1|измене|измене|измена}}.\nБрисање таквих страница је ограничено да би се спречило случајно оптерећење сервера.",
        "delete-warning-toobig": "Ова страница има велику историју, преко $1 {{PLURAL:$1|измене|изменe|измена}}.\nЊено брисање може пореметити базу података, стога поступајте с опрезом.",
-       "delete-cantedit": "Не можете обрисати страницу коју не можете уређивати.",
+       "deleteprotected": "Не можете обрисати ову страницу зато што је заштићена.",
        "deleting-backlinks-warning": "'''Упозорење:''' бришете страницу која је укључена у [[Special:WhatLinksHere/{{FULLPAGENAME}}|друге странице]] или друге странице воде на њу.",
        "rollback": "Врати измене",
        "rollback_short": "Врати",
        "undeleteinvert": "Обрни избор",
        "undeletecomment": "Разлог:",
        "undeletedrevisions": "{{PLURAL:$1|Измена је враћена|$1 измене су враћене|$1 измена је враћено}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека|датотеке|датотека}} је враћено",
+       "undeletedrevisions-files": "$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека је враћена|датотеке су враћене|датотека је враћено}}",
        "undeletedfiles": "{{PLURAL:$1|Датотека је враћена|$1 датотеке су враћене|$1 датотека је враћено}}",
        "cannotundelete": "Враћање није успело:\n$1",
        "undeletedpage": "'''Страница $1 је враћена'''\n\nПогледајте [[Special:Log/delete|историју брисања]] за записе о скорашњим брисањима и враћањима.",
        "unblockiptext": "Користите образац испод да бисте вратили право писања блокираној IP адреси или корисничком имену.",
        "ipusubmit": "Уклони ову блокаду",
        "unblocked": "[[User:$1|$1]] је деблокиран",
-       "unblocked-range": "$1 је {{GENDER:$1|деблокиран|деблокирана|деблокиран}}",
+       "unblocked-range": "$1 је деблокиран",
        "unblocked-id": "Блокирање $1 је уклоњено",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] је деблокиран.",
        "blocklist": "Блокирани корисници",
        "ipblocklist": "Блокирани корисници",
        "ipblocklist-legend": "Проналажење блокираног корисника",
        "emaillink": "пошаљи е-поруку",
        "autoblocker": "Аутоматски сте блокирани јер делите ИП адресу с корисником/цом [[User:$1|$1]].\nРазлог блокирања: „$2“",
        "blocklogpage": "Дневник блокирања",
-       "blocklog-showlog": "{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана|Овај корисник је раније блокиран}}.\nИсторија блокирања се налази испод:",
-       "blocklog-showsuppresslog": "{{GENDER:|Овај корисник је раније блокиран и сакривен|Ова корисница је раније блокирана и сакривена|Овај корисник је раније блокиран и сакривен}}.\nИсторија сакривања се налази испод:",
+       "blocklog-showlog": "{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана}}.\nИсторија блокирања се налази испод:",
+       "blocklog-showsuppresslog": "{{GENDER:$1|Овај корисник је раније блокиран и сакривен|Ова корисница је раније блокирана и сакривена}}.\nИсторија сакривања се налази испод:",
        "blocklogentry": "је блокирао [[$1]] с роком истицања од $2 $3",
        "reblock-logentry": "{{GENDER:|је променио|је променила|је променио}} подешавања за блокирање {{GENDER:$1|корисника|кориснице|корисника}} [[$1]] с роком истека од $2 ($3)",
        "blocklogtext": "Ово је дневник блокирања и деблокирања корисника.\nАутоматски блокиране ИП адресе нису наведене.\nТекуће забране и блокирања можете наћи [[Special:BlockList|овде]].",
-       "unblocklogentry": "{{GENDER:|је деблокирао|је деблокирала}} $1",
+       "unblocklogentry": "је деблокирао $1",
        "block-log-flags-anononly": "само анонимни корисници",
        "block-log-flags-nocreate": "онемогућено отварање налога",
        "block-log-flags-noautoblock": "аутоматско блокирање је онемогућено",
        "movepage-moved": "'''„$1“ је премештена на „$2“'''",
        "movepage-moved-redirect": "Преусмерење је направљено.",
        "movepage-moved-noredirect": "Стварање преусмерења је онемогућено.",
-       "articleexists": "Страница с тим именом већ постоји, или је име неисправно.\nИзаберите друго име.",
+       "articleexists": "Страница с тим именом већ постоји или је име неисправно.\nИзаберите друго име.",
        "cantmove-titleprotected": "Не можете да преместите страницу на то место јер је жељени наслов заштићен од стварања",
        "movetalk": "Премести и страницу за разговор",
        "move-subpages": "Премести и подстранице (до $1)",
        "import": "Увоз страница",
        "importinterwiki": "Међувики увоз",
        "import-interwiki-text": "Изаберите вики и наслов странице за увоз.\nДатуми и имена уредника ће бити сачувани.\nСве радње при увозу с других викија су забележене у [[Special:Log/import|дневнику увоза]].",
-       "import-interwiki-source": "Извор викија/странице:",
        "import-interwiki-history": "Копирај све верзије историје за ову страницу",
        "import-interwiki-templates": "Укључи све шаблоне",
        "import-interwiki-submit": "Увези",
        "import-rootpage-nosubpage": "Именски простор „$1“ основне странице не дозвољава подстранице.",
        "importlogpage": "Дневник увоза",
        "importlogpagetext": "Административни увози страница с историјама измена с других викија.",
-       "import-logentry-upload": "Ñ\83везено [[$1]] отпремањем датотеке",
+       "import-logentry-upload": "Ñ\98е Ñ\83везао [[$1]] отпремањем датотеке",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|измена увезена|измене увезене|измена увезено}}",
-       "import-logentry-interwiki": "премештено с другог викија: $1",
+       "import-logentry-interwiki": "је увезао $1 с другог викија",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|измена увезена|измене увезене|измена увезено}} из $2",
        "javascripttest": "Јаваскрипт тест",
        "javascripttest-title": "Извршавање тестова за $1",
        "tooltip-undo": "Поништава ову измену и отвара образац за уређивање.",
        "tooltip-preferences-save": "Сачувај поставке",
        "tooltip-summary": "Унесите кратак опис",
-       "common.css": "/** CSS постављен овде ће се одразити на све теме */",
+       "common.css": "/* CSS постављен овде ће се одразити на све теме */",
        "print.css": "/* CSS постављен овде ће утицати на издање за штампу */",
        "noscript.css": "/* CSS постављен овде ће утицати на све кориснике којима је онемогућен јаваскрипт */",
        "group-autoconfirmed.css": "/* CSS постављен овде ће утицати на самопотврђене кориснике */",
        "exif-urgency-low": "Ниско ($1)",
        "exif-urgency-high": "Високо ($1)",
        "exif-urgency-other": "Прилагођени приоритет ($1)",
-       "watchlistall2": "све",
        "namespacesall": "сви",
        "monthsall": "све",
        "confirmemail": "Потврда е-адресе",
        "scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
        "scarytranscludetoolong": "[URL адреса је предугачка]",
        "deletedwhileediting": "<strong>Упозорење</strong>: ова страница је обрисана након што сте почели с уређивањем!",
-       "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|обриса}} ову страницу након што сте почели да је уређујете из следећег разлога:\n: ''$2''\nПотврдите да стварно желите да направите страницу.",
+       "confirmrecreate": "Корисник [[User:$1|$1]] ([[User talk:$1|разговор]]) је обрисао ову страницу након што сте почели да је уређујете из следећег разлога:\n: <em>$2</em>\nПотврдите да стварно желите да направите страницу.",
        "confirmrecreate-noreason": "Корисник [[User:$1|$1]] ([[User talk:$1|разговор]]) је обрисао ову страницу након што сте почели да га уређујете. Потврдите да стварно желите да поново направите ову страницу.",
        "recreate": "Поново направи",
        "unit-pixel": "px",
        "table_pager_limit_submit": "Иди",
        "table_pager_empty": "Нема резултата",
        "autosumm-blank": "Уклоњен целокупан садржај странице",
-       "autosumm-replace": "Замена садржаја странице са „$1“",
+       "autosumm-replace": "Замењен садржај странице са „$1“",
        "autoredircomment": "Преусмерење на [[$1]]",
        "autosumm-new": "Нова страница: $1",
        "autosumm-newblank": "Направљена празна страница",
        "watchlistedit-clear-titles": "Наслови:",
        "watchlistedit-clear-submit": "Испразни списак надгледања (Ово је трајно!)",
        "watchlistedit-clear-done": "Ваш списак надгледања је испражњен.",
-       "watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова је уклоњено}}:",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова су уклоњена|$1 наслова је уклоњено}}:",
+       "watchlistedit-too-many": "Има превише страница за приказ овде.",
        "watchlisttools-clear": "испразни списак надгледања",
        "watchlisttools-view": "прикажи сродне измене",
        "watchlisttools-edit": "прикажи и уреди списак надгледања",
        "sqlite-no-fts": "$1 без подршке претраге целог текста",
        "logentry-delete-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} страницу $3",
        "logentry-delete-restore": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3",
-       "logentry-delete-event": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|догађаја|$5 догађаја}} у дневнику на $3: $4",
-       "logentry-delete-revision": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|измене|$5 измена}} на страници $3: $4",
+       "logentry-delete-event": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4",
+       "logentry-delete-revision": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|$5 измене|$5 измена|1=измене}} на страници $3: $4",
        "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|догађаја|$5 догађаја}} у дневнику на $3: $4",
+       "logentry-suppress-event": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4",
        "logentry-suppress-revision": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|измене|$5 измена}} на страници $3: $4",
        "logentry-suppress-event-legacy": "$1 је потајно {{GENDER:$2|променио|променила}} видљивост догађаја у дневнику на $3",
        "logentry-suppress-revision-legacy": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост измена на страници $3",
        "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",
+       "logentry-upload-upload": "$1 је {{GENDER:$2|послао|послала}} $3",
+       "logentry-upload-overwrite": "$1 је {{GENDER:$2|послао|послала}} нову верзију $3",
+       "logentry-upload-revert": "$1 је {{GENDER:$2|послао|послала}} $3",
        "rightsnone": "(нема)",
+       "revdelete-summary": "опис измене",
        "feedback-bugornote": "Ако сте спремни да детаљно опишете технички проблем, онда [$1 пријавите грешку].\nУ супротном, послужите се једноставним обрасцем испод. Ваш коментар ће стајати на страници „[$3 $2]“, заједно с корисничким именом и прегледачем који користите.",
        "feedback-subject": "Наслов:",
        "feedback-message": "Порука:",
        "pagelang-language": "Језик",
        "pagelang-select-lang": "Изабери језик",
        "right-pagelang": "мењање језика странице",
-       "action-pagelang": "промену језика странице"
+       "action-pagelang": "промену језика странице",
+       "mediastatistics-summary": "Статистике о типовима послатих датотека. Овде су урачунате само најновије верзије датотека. Старе или обрисане верзије нису урачунате.",
+       "mediastatistics-table-mimetype": "MIME тип",
+       "mediastatistics-table-extensions": "Могуће екстензије",
+       "mediastatistics-table-count": "Број датотека",
+       "mediastatistics-table-totalbytes": "Укупна величина",
+       "mediastatistics-header-bitmap": "Битмап слике",
+       "mediastatistics-header-drawing": "Цртежи (векторске слике)",
+       "mediastatistics-header-audio": "Аудио",
+       "mediastatistics-header-video": "Видео",
+       "mediastatistics-header-office": "Канцеларија"
 }
index b386295..c7fe57a 100644 (file)
        "otherlanguages": "Drugi jezici",
        "redirectedfrom": "(preusmereno sa $1)",
        "redirectpagesub": "Preusmerenje",
+       "redirectto": "Preusmerava na:",
        "lastmodifiedat": "Ova stranica je poslednji put izmenjena $1 u $2.",
        "viewcount": "Ova stranica je pregledana {{PLURAL:$1|jedanput|$1 puta|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "error": "Greška",
        "databaseerror": "Greška u bazi podataka",
        "databaseerror-text": "Došlo je do greške u upitu baze podataka. Možda je u pitanju programska greška.",
+       "databaseerror-query": "Upit: $1",
        "databaseerror-function": "Funkcija: $1",
        "databaseerror-error": "Greška: $1",
        "laggedslavemode": "'''Upozorenje:''' stranica je možda zastarela.",
        "badtitle": "Neispravan naslov",
        "badtitletext": "Naslov stranice je neispravan, prazan ili je međujezički ili međuviki naslov pogrešno povezan.\nMožda sadrži znakove koji se ne mogu koristiti u naslovima.",
        "perfcached": "Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.",
-       "perfcachedts": "Sledeći podaci su keširani i poslednji put su ažurirani $2 u $3. U kešu {{PLURAL:$4|je dostupan najviše jedan rezultat|su dostupna najviše $4 rezultata|je dostupno najviše $4 rezultata}}.",
+       "perfcachedts": "Sledeći podaci su keširani i poslednji put su ažurirani $2 u $3. U kešu {{PLURAL:$4|1=je dostupan najviše jedan rezultat|su dostupna najviše $4 rezultata|je dostupno najviše $4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je trenutno onemogućeno.\nPodaci koji se ovde nalaze mogu biti zastareli.",
        "viewsource": "Izvorni kod",
        "viewsource-title": "Prikaz izvora stranice $1",
        "badretype": "Unete lozinke se ne poklapaju.",
        "userexists": "Korisničko ime je zauzeto. Izaberite drugo.",
        "loginerror": "Greška pri prijavljivanju",
-       "createacct-error": "Došlo je do greške pri kreiranju naloga",
+       "createacct-error": "Došlo je do greške pri otvaranju naloga",
        "createaccounterror": "Ne mogu da otvorim nalog: $1",
        "nocookiesnew": "Korisnički nalog je otvoren, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće za prijavu. Vama su kolačići onemogućeni.\nOmogućite ih, pa se onda prijavite sa svojim korisničkim imenom i lozinkom.",
        "nocookieslogin": "{{SITENAME}} koristi kolačiće za prijavljivanje korisnika.\nVama su kolačići onemogućeni. Omogućite ih i pokušajte ponovo.",
        "passwordsent": "Nova lozinka je poslata na e-adresu {{GENDER:$1|korisnika|korisnice|korisnika}} $1.\nPrijavite se pošto je primite.",
        "blocked-mailpassword": "Vašoj IP adresi je onemogućeno uređivanje stranica, kao i mogućnost zahtevanja nove lozinke.",
        "eauthentsent": "Na navedenu e-adresu je poslat potvrdni kod.\nPre nego što pošaljemo daljnje poruke, pratite uputstva s e-pošte da biste potvrdili da ste vi otvorili nalog.",
-       "throttled-mailpassword": "Poruka za promenu lozinke je poslata u {{PLURAL:$1|poslednjih sat vremena|poslednja $1 sata|poslednjih $1 sati}}.\nDa bismo sprečili zloupotrebu, podsetnik šaljemo samo jednom u roku od {{PLURAL:$1|sat vremena|$1 sata|$1 sati}}.",
+       "throttled-mailpassword": "Poruka za promenu lozinke je poslata u {{PLURAL:$1|1=poslednjih sat vremena|poslednja $1 sata|poslednjih $1 sati}}.\nDa bismo sprečili zloupotrebu, podsetnik šaljemo samo jednom u roku od {{PLURAL:$1|1=sat vremena|$1 sata|$1 sati}}.",
        "mailerror": "Greška pri slanju poruke: $1",
        "acct_creation_throttle_hit": "Posetioci ovog vikija koji koriste vašu IP adresu su već otvorili {{PLURAL:$1|1=jedan nalog|$1 naloga|$1 naloga}} prethodni dan, što je najveći dozvoljeni broj u tom vremenskom periodu.\nZbog toga posetioci s ove IP adrese trenutno ne mogu otvoriti više naloga.",
        "emailauthenticated": "Vaša e-adresa je potvrđena $2 u $3.",
        "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-header": "Promenite e-adresu naloga",
        "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:",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Vaša lozinka:",
        "changeemail-submit": "Promeni",
-       "changeemail-cancel": "Otkaži",
        "changeemail-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
        "resettokens": "Resetovanje žetona",
        "resettokens-no-tokens": "Nema žetona za resetovanje.",
        "showpreview": "Prikaži pretpregled",
        "showdiff": "Prikaži izmene",
        "blankarticle": "<strong>Upozorenje:</strong> stranica koju pravite nema nikakav sadržaj.\nAko još jednom pritisnete „{{int:savearticle}}“ napravićete stranicu bez sadržaja.",
-       "anoneditwarning": "'''Upozorenje:''' niste prijavljeni.\nVaša IP adresa će biti zabeležena u istoriji ove stranice.",
+       "anoneditwarning": "<strong>Upozorenje:</strong> niste prijavljeni. Vaša IP adresa će biti javno vidljiva u istoriji ove stranice ako načinite bilo kakvu izmenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 otvorite nalog]</strong> vaše izmene će biti pripisane vašem korisničkom imenu.",
        "anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabeležena u istoriji ove stranice.''",
        "missingsummary": "'''Napomena:''' niste uneli opis izmene.\nAko ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvana bez opisa.",
        "missingcommenttext": "Unesite komentar ispod.",
        "subject-preview": "Pregled teme/naslova:",
        "blockedtitle": "Korisnik je blokiran",
        "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog: <em>$2</em>.\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\nVaša blokirana IP adresa je $3, a ID blokiranja $5.\nNavedite sve podatke iznad pri stvaranja bilo kakvih upita.",
-       "autoblockedtext": "Vaša IP adresa je blokirana jer ju je upotrebljavao drugi korisnik, koga je {{GENDER:$1|blokirao|blokirala|blokirao}} $1.\nRazlog:\n\n:''$2''\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$1|korisniku|korisnici|korisniku}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\n\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\n\nVaša blokirana IP adresa je $3, a IB $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
+       "autoblockedtext": "Vaša IP adresa je blokirana jer ju je upotrebljavao drugi korisnik, koga je {{GENDER:$4|blokirao|blokirala}} $1.\nRazlog:\n\n:<em>$2</em>\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\n\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\n\nVaša blokirana IP adresa je $3, a ID $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
        "blockednoreason": "razlog nije naveden",
        "whitelistedittext": "Za uređivanje stranice je potrebno da budete $1.",
        "confirmedittext": "Morate da potvrdite svoju e-adresu pre uređivanja stranica.\nPostavite i potvrdite adresu preko [[Special:Preferences|podešavanja]].",
        "parser-unstrip-loop-warning": "Utvrđena je petlja",
        "parser-unstrip-recursion-limit": "Prekoračeno je ograničenje rekurzije ($1)",
        "converter-manual-rule-error": "Pronađena je greška u pravilu za ručno pretvaranje jezika",
-       "undo-success": "Izmena se može vratiti.\nProverite razlike ispod, pa sačuvajte izmene.",
+       "undo-success": "Izmena se može vratiti.\nProverite razlike ispod pa sačuvajte izmene.",
        "undo-failure": "Ova izmena se ne može poništiti zbog sukoba izmena.",
        "undo-norev": "Ne mogu da vratim izmenu jer ne postoji ili je obrisana.",
        "undo-nochange": "Izgleda da je izmena već poništena.",
        "undo-summary": "Poništena izmena $1 {{GENDER:$2|korisnika|korisnice}} [[Special:Contribs/$2|$2]] ([[User talk:$2|razgovor]])",
        "undo-summary-username-hidden": "Poništi izmenu $1 skrivenog korisnika",
        "cantcreateaccounttitle": "Ne mogu da otvorim nalog",
-       "cantcreateaccount-text": "Otvaranje naloga s ove IP adrese ('''$1''') je {{GENDER:$3|blokirao|blokirala|blokirao}} [[User:$3|$3]].\n\nRazlog koji je naveo {{GENDER:$3|korisnik|korisnica|korisnik}} $3 je ''$2''",
+       "cantcreateaccount-text": "Otvaranje naloga s ove IP adrese (<strong>$1</strong>) je blokirao/la [[User:$3|$3]].\n\nRazlog koji je naveo/la $3 je <em>$2</em>",
+       "cantcreateaccount-range-text": "Otvaranje naloga sa IP adresa u rasponu '''$1''', koji uključuje i vašu IP adresu ('''$4''') je blokirao/la [[User:$3|$3]].\n\nRazlog koji je naveo/la $3 je <em>$2</em>",
        "viewpagelogs": "Pogledaj dnevnike ove stranice",
        "nohistory": "Ne postoji istorija izmena ove stranice.",
        "currentrev": "Tekuća izmena",
        "revdelete-selected-text": "{{PLURAL:$1|Izabrana izmena|Izabrane izmene}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Izabrana verzija datoteke|Izabrane verzije datoteke}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Izabrana stavka u istoriji|Izabrane stavke u istoriji}}:",
+       "revdelete-text-text": "Izbrisane izmene će i dalje biti vidljive u istoriji stranice, ali delovi njihovog sadržaja neće biti javno dostupnu.",
+       "revdelete-text-file": "Izbrisane verzije datoteke će i dalje biti vidljive u istoriji datoteke, ali delovi njihovog sadržaja neće biti javno dostupnu.",
+       "logdelete-text": "Izbrisani unosi u dnevnicima će i dalje biti vidljivi u dnevnicima, ali delovi njihovog sadržaja neće biti javno dostupnu.",
        "revdelete-confirm": "Potvrdite da nameravate ovo uraditi, da razumete posledice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sakrivanje izmena bi trebalo koristiti '''samo''' u sledećim slučajevima:\n* Zlonamerni ili pogrdni podaci\n* Neprikladni lični podaci\n*: ''kućna adresa i broj telefona, broj bankovne kartice itd.''",
        "revdelete-legend": "Ograničenja vidljivosti",
        "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-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.",
        "mergehistory-no-destination": "Odredišna stranica $1 ne postoji.",
        "mergehistory-invalid-source": "Izvorna stranica mora imati ispravan naslov.",
        "mergehistory-same-destination": "Izvorna i odredišna stranica ne mogu biti iste",
        "mergehistory-reason": "Razlog:",
        "mergelog": "Dnevnik spajanja",
-       "pagemerge-logentry": "stranica [[$1]] je spojena u [[$2]] (sve do izmene $3)",
+       "pagemerge-logentry": "je spojio [[$1]] u [[$2]] (sve do izmene $3)",
        "revertmerge": "rastavi",
        "mergelogpagetext": "Ispod je spisak najskorijih spajanja istorija dveju stranica.",
        "history-title": "Istorija izmena stranice „$1“",
        "searchall": "sve",
        "showingresults": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}} počev od broja <strong>$2</strong>.",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|1=Rezultat '''$1''' od '''$3'''|Rezultata '''$1 – $2''' od '''$3'''}} za '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultata <strong>$1 – $2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Nema poklapanja.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Traži u sledećim imenskim prostorima:",
        "prefs-tokenwatchlist": "Žeton",
        "prefs-diffs": "Razlike",
        "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sledećoj prijavi.",
+       "prefswarning-warning": "Promenili ste vaša podešavanja ali niste ih još sačuvali.\nAko ne pritisnete „$1“ vaša podešavanja će biti izgubljena.",
        "email-address-validity-valid": "E-adresa je ispravna",
        "email-address-validity-invalid": "Unesite ispravnu e-adresu",
        "userrights": "Upravljanje korisničkim pravima",
        "action-move": "premeštanje ove stranice",
        "action-move-subpages": "premeštanje ove stranice i njenih podstranica",
        "action-move-rootuserpages": "premeštanje osnovnih korisničkih stranica",
+       "action-move-categorypages": "premeštanje kategorija",
        "action-movefile": "premeštanje ove datoteke",
        "action-upload": "slanje ove datoteke",
        "action-reupload": "zamenjivanje postojeće datoteke",
        "license-nopreview": "(pregled nije dostupan)",
        "upload_source_url": "(ispravna i javno dostupna adresa)",
        "upload_source_file": "(datoteka na vašem računaru)",
+       "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve poslate datoteke.",
        "listfiles_search_for": "Naziv datoteke:",
        "imgfile": "datoteka",
        "randomincategory": "Slučajna stranica u kategoriji",
        "randomincategory-invalidcategory": "„$1“ nije valjano ime kategorije",
        "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
-       "randomincategory-selectcategory-submit": "Idi",
+       "randomincategory-category": "Kategorija:",
        "randomredirect": "Slučajno preusmerenje",
        "randomredirect-nopages": "Nema preusmerenja u imenskom prostoru „$1”.",
        "statistics": "Statistike",
        "statistics-views-peredit": "Pregleda po izmeni",
        "statistics-users": "Registrovani [[Special:ListUsers|korisnici]]",
        "statistics-users-active": "Aktivni korisnici",
-       "statistics-users-active-desc": "Korisnici koji su izvršili bar jednu radnju {{PLURAL:$1|prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}",
+       "statistics-users-active-desc": "Korisnici koji su izvršili bar jednu radnju {{PLURAL:$1|1=prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}",
        "statistics-mostpopular": "Najposećenije stranice",
        "pageswithprop": "Strane s osobinom strane",
        "pageswithprop-legend": "Strane s osobinom strane",
        "wantedfiles": "Tražene datoteke",
        "wantedfiletext-cat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih riznica mogu biti navedene iako ne postoje. Takve datoteke će biti <del>poništene</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze [[:$1|ovde]].",
        "wantedfiletext-nocat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih riznica mogu biti navedene iako ne postoje. Takve datoteke će biti <del>poništene</del> sa spiska.",
+       "wantedfiletext-nocat-noforeign": "Sledeće datoteke se koriste, ali ne postoje.",
        "wantedtemplates": "Traženi šabloni",
        "mostlinked": "Stranice s najviše veza",
        "mostlinkedcategories": "Kategorije s najviše veza",
        "suppress": "Nadzor",
        "querypage-disabled": "Ova posebna stranica je onemogućena radi poboljšanja performansi.",
        "booksources": "Štampani izvori",
-       "booksources-search-legend": "Traženje izvora knjige",
+       "booksources-search-legend": "Traži književne izvore",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Idi",
+       "booksources-search": "Pretraži",
        "booksources-text": "Ispod se nalazi spisak veza ka sajtovima koji se bave prodajom novih i polovnih knjiga, a koji bi mogli imati dodatne podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije ispravan. Proverite da nije došlo do greške pri umnožavanju iz prvobitnog izvora.",
        "specialloguserlabel": "Izvršilac:",
        "listusers-noresult": "Korisnik nije pronađen.",
        "listusers-blocked": "({{GENDER:$1|blokiran|blokirana|blokiran}})",
        "activeusers": "Spisak aktivnih korisnika",
-       "activeusers-intro": "Ovo je spisak korisnika koji su bili aktivni {{PLURAL:$1|prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}.",
+       "activeusers-intro": "Ovo je spisak korisnika koji su bili aktivni {{PLURAL:$1|1=prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}.",
        "activeusers-count": "$1 {{PLURAL:$1|radnja|radnje|radnji}} {{PLURAL:$3|prethodni dan|u poslednja $3 dana|u poslednjih $3 dana}}",
        "activeusers-from": "Prikaži korisnike počev od:",
        "activeusers-hidebots": "Sakrij botove",
        "listgrouprights-addgroup-self-all": "Dodaj sve grupe na sopstveni nalog",
        "listgrouprights-removegroup-self-all": "Ukloni sve grupe sa sopstvenog naloga",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
+       "trackingcategories-name": "Ime poruke",
        "trackingcategories-nodesc": "Opis nije dostupan.",
+       "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu e-adresu u [[Special:Preferences|podešavanjima]] da biste slali e-poruke drugim korisnicima.",
        "emailuser": "Pošalji e-poruku",
        "emailuser-title-target": "Slanje e-poruke {{GENDER:$1|korisniku|korisnici|korisniku}}",
        "emailuser-title-notarget": "Slanje e-poruke korisniku",
        "emailpage": "Slanje e-poruka",
-       "emailpagetext": "Možete da koristite donji obrazac da pošaljete e-poruku {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku|}}.\nE-adresa koju ste uneli u vašim [[Special:Preferences|podešavanjima]] će se prikazati u polju „Od“, tako da će primalac moći da vam odgovori direktno.",
+       "emailpagetext": "Možete da koristite donji obrazac da pošaljete e-poruku {{GENDER:$1|ovom korisniku|ovoj korisnici}}.\nE-adresa koju ste uneli u vašim [[Special:Preferences|podešavanjima]] će se prikazati u polju „Od“, tako da će primalac moći da vam odgovori direktno.",
        "defemailsubject": "{{SITENAME}} — E-pošta od {{GENDER:$1|korisnika|korisnice}} $1",
        "usermaildisabled": "Korisnička e-pošta je onemogućena",
        "usermaildisabledtext": "Ne možete da šaljete e-poruke drugim korisnicima na ovom vikiju",
        "wlheader-enotif": "Obaveštenje e-porukom je omogućeno.",
        "wlheader-showupdated": "Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''.",
        "wlnote": "Ispod {{PLURAL:$1|je poslednja izmena|su poslednje '''$1''' izmene|je poslednjih '''$1''' izmena}} u {{PLURAL:$2|prethodnom satu|prethodna '''$2''' sata|prethodnih '''$2''' sati}}, zaključno sa $3, $4.",
-       "wlshowlast": "Prikaži poslednjih $1 sati, $2 dana, $3",
+       "wlshowlast": "Prikaži poslednjih $1 sati, $2 dana",
        "watchlist-options": "Postavke spiska nadgledanja",
        "watching": "Nadgledanje…",
        "unwatching": "Prekidanje nadgledanja…",
        "delete-edit-reasonlist": "Uredi razloge brisanja",
        "delete-toobig": "Ova stranica ima veliku istoriju, preko $1 {{PLURAL:$1|izmene|izmene|izmena}}.\nBrisanje takvih stranica je ograničeno da bi se sprečilo slučajno opterećenje servera.",
        "delete-warning-toobig": "Ova stranica ima veliku istoriju, preko $1 {{PLURAL:$1|izmene|izmene|izmena}}.\nNjeno brisanje može poremetiti bazu podataka, stoga postupajte s oprezom.",
+       "deleteprotected": "Ne možete obrisati ovu stranicu zato što je zaštićena.",
        "deleting-backlinks-warning": "'''Upozorenje:''' brišete stranicu koja je uključena u [[Special:WhatLinksHere/{{FULLPAGENAME}}|druge stranice]] ili druge stranice vode na nju.",
        "rollback": "Vrati izmene",
        "rollback_short": "Vrati",
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
        "undeletedrevisions": "{{PLURAL:$1|Izmena je vraćena|$1 izmene su vraćene|$1 izmena je vraćeno}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka|datoteke|datoteka}} je vraćeno",
+       "undeletedrevisions-files": "$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka je vraćena|datoteke su vraćene|datoteka je vraćeno}}",
        "undeletedfiles": "{{PLURAL:$1|Datoteka je vraćena|$1 datoteke su vraćene|$1 datoteka je vraćeno}}",
        "cannotundelete": "Vraćanje nije uspelo:\n$1",
        "undeletedpage": "'''Stranica $1 je vraćena'''\n\nPogledajte [[Special:Log/delete|istoriju brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
        "unblockiptext": "Koristite obrazac ispod da biste vratili pravo pisanja blokiranoj IP adresi ili korisničkom imenu.",
        "ipusubmit": "Ukloni ovu blokadu",
        "unblocked": "[[User:$1|$1]] je deblokiran",
-       "unblocked-range": "$1 je {{GENDER:$1|deblokiran|deblokirana|deblokiran}}",
+       "unblocked-range": "$1 je deblokiran",
        "unblocked-id": "Blokiranje $1 je uklonjeno",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] je deblokiran.",
        "blocklist": "Blokirani korisnici",
        "ipblocklist": "Blokirani korisnici",
        "ipblocklist-legend": "Pronalaženje blokiranog korisnika",
        "autoblocker": "Automatski ste blokirani jer delite IP adresu s korisnikom/com [[User:$1|$1]].\nRazlog blokiranja: „$2“",
        "blocklogpage": "Dnevnik blokiranja",
        "blocklog-showlog": "{{GENDER:$1|Ovaj korisnik je ranije blokiran|Ova korisnica je ranije blokirana|Ovaj korisnik je ranije blokiran}}.\nIstorija blokiranja se nalazi ispod:",
-       "blocklog-showsuppresslog": "{{GENDER:|Ovaj korisnik je ranije blokiran i sakriven|Ova korisnica je ranije blokirana i sakrivena|Ovaj korisnik je ranije blokiran i sakriven}}.\nIstorija sakrivanja se nalazi ispod:",
+       "blocklog-showsuppresslog": "{{GENDER:$1|Ovaj korisnik je ranije blokiran i sakriven|Ova korisnica je ranije blokirana i sakrivena}}.\nIstorija sakrivanja se nalazi ispod:",
        "blocklogentry": "je blokirao [[$1]] s rokom isticanja od $2 $3",
        "reblock-logentry": "{{GENDER:|je promenio|je promenila|je promenio}} podešavanja za blokiranje {{GENDER:$1|korisnika|korisnice|korisnika}} [[$1]] s rokom isteka od $2 ($3)",
        "blocklogtext": "Ovo je dnevnik blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu navedene.\nTekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].",
-       "unblocklogentry": "{{GENDER:|je deblokirao|je deblokirala}} $1",
+       "unblocklogentry": "je deblokirao $1",
        "block-log-flags-anononly": "samo anonimni korisnici",
        "block-log-flags-nocreate": "onemogućeno otvaranje naloga",
        "block-log-flags-noautoblock": "automatsko blokiranje je onemogućeno",
        "movepage-moved": "'''„$1“ je premeštena na „$2“'''",
        "movepage-moved-redirect": "Preusmerenje je napravljeno.",
        "movepage-moved-noredirect": "Stvaranje preusmerenja je onemogućeno.",
-       "articleexists": "Stranica s tim imenom već postoji, ili je ime neispravno.\nIzaberite drugo ime.",
+       "articleexists": "Stranica s tim imenom već postoji ili je ime neispravno.\nIzaberite drugo ime.",
        "cantmove-titleprotected": "Ne možete da premestite stranicu na to mesto jer je željeni naslov zaštićen od stvaranja",
        "movetalk": "Premesti i stranicu za razgovor",
        "move-subpages": "Premesti i podstranice (do $1)",
        "import": "Uvoz stranica",
        "importinterwiki": "Međuviki uvoz",
        "import-interwiki-text": "Izaberite viki i naslov stranice za uvoz.\nDatumi i imena urednika će biti sačuvani.\nSve radnje pri uvozu s drugih vikija su zabeležene u [[Special:Log/import|dnevniku uvoza]].",
-       "import-interwiki-source": "Izvor vikija/stranice:",
        "import-interwiki-history": "Kopiraj sve verzije istorije za ovu stranicu",
        "import-interwiki-templates": "Uključi sve šablone",
        "import-interwiki-submit": "Uvezi",
        "import-rootpage-nosubpage": "Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.",
        "importlogpage": "Dnevnik uvoza",
        "importlogpagetext": "Administrativni uvozi stranica s istorijama izmena s drugih vikija.",
-       "import-logentry-upload": "uvezeno [[$1]] otpremanjem datoteke",
+       "import-logentry-upload": "je uvezao [[$1]] otpremanjem datoteke",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}}",
-       "import-logentry-interwiki": "premešteno s drugog vikija: $1",
+       "import-logentry-interwiki": "je uvezao $1 s drugog vikija",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}} iz $2",
        "javascripttest": "Javaskript test",
        "javascripttest-title": "Izvršavanje testova za $1",
        "tooltip-undo": "Poništava ovu izmenu i otvara obrazac za uređivanje.",
        "tooltip-preferences-save": "Sačuvaj postavke",
        "tooltip-summary": "Unesite kratak opis",
-       "common.css": "/** CSS postavljen ovde će se odraziti na sve teme */",
+       "common.css": "/* CSS postavljen ovde će se odraziti na sve teme */",
        "print.css": "/* CSS postavljen ovde će uticati na izdanje za štampu */",
        "noscript.css": "/* CSS postavljen ovde će uticati na sve korisnike kojima je onemogućen javaskript */",
        "group-autoconfirmed.css": "/* CSS postavljen ovde će uticati na samopotvrđene korisnike */",
        "exif-urgency-low": "Nisko ($1)",
        "exif-urgency-high": "Visoko ($1)",
        "exif-urgency-other": "Prilagođeni prioritet ($1)",
-       "watchlistall2": "sve",
        "namespacesall": "svi",
        "monthsall": "sve",
        "confirmemail": "Potvrda e-adrese",
        "scarytranscludefailed-httpstatus": "[Ne mogu da preuzmem šablon $1: HTTP $2]",
        "scarytranscludetoolong": "[URL adresa je predugačka]",
        "deletedwhileediting": "<strong>Upozorenje</strong>: ova stranica je obrisana nakon što ste počeli s uređivanjem!",
-       "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|je obrisao|je obrisala|je obrisao}} ovu stranicu nakon što ste počeli da je uređujete iz sledećeg razloga:\n: ''$2''\nPotvrdite da stvarno želite da napravite stranicu.",
+       "confirmrecreate": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovu stranicu nakon što ste počeli da je uređujete iz sledećeg razloga:\n: <em>$2</em>\nPotvrdite da stvarno želite da napravite stranicu.",
        "confirmrecreate-noreason": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovu stranicu nakon što ste počeli da ga uređujete. Potvrdite da stvarno želite da ponovo napravite ovu stranicu.",
        "recreate": "Ponovo napravi",
        "unit-pixel": "px",
        "table_pager_limit_submit": "Idi",
        "table_pager_empty": "Nema rezultata",
        "autosumm-blank": "Uklonjen celokupan sadržaj stranice",
-       "autosumm-replace": "Zamena sadržaja stranice sa „$1“",
+       "autosumm-replace": "Zamenjen sadržaj stranice sa „$1“",
        "autoredircomment": "Preusmerenje na [[$1]]",
        "autosumm-new": "Nova stranica: $1",
        "autosumm-newblank": "Napravljena prazna stranica",
        "watchlistedit-clear-titles": "Naslovi:",
        "watchlistedit-clear-submit": "Isprazni spisak nadgledanja (Ovo je trajno!)",
        "watchlistedit-clear-done": "Vaš spisak nadgledanja je ispražnjen.",
-       "watchlistedit-clear-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova je uklonjeno}}:",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova su uklonjena|$1 naslova je uklonjeno}}:",
+       "watchlistedit-too-many": "Ima previše stranica za prikaz ovde.",
        "watchlisttools-clear": "isprazni spisak nadgledanja",
        "watchlisttools-view": "prikaži srodne izmene",
        "watchlisttools-edit": "prikaži i uredi spisak nadgledanja",
        "version-hook-name": "Naziv kuke",
        "version-hook-subscribedby": "Prijavljeno od",
        "version-version": "(izdanje $1)",
+       "version-no-ext-name": "[nema imena]",
        "version-svn-revision": "(izm. $2)",
        "version-license": "Medijaviki licenca",
        "version-ext-license": "Licenca",
        "version-ext-colheader-name": "Ekstenzija",
+       "version-skin-colheader-name": "Tema",
        "version-ext-colheader-version": "Verzija",
        "version-ext-colheader-license": "Licenca",
        "version-ext-colheader-description": "Opis",
        "sqlite-no-fts": "$1 bez podrške pretrage celog teksta",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
        "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
-       "logentry-delete-event": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|događaja|$5 daogađaja}} u dnevniku na $3: $4",
-       "logentry-delete-revision": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|izmene|$5 izmena}} na stranici $3: $4",
+       "logentry-delete-event": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja|$5 događaja}} u dnevniku na $3: $4",
+       "logentry-delete-revision": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|$5 izmene|$5 izmena|1=izmene}} na stranici $3: $4",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost događaja u dnevniku na $3",
        "logentry-delete-revision-legacy": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost izmena na stranici $3",
        "logentry-suppress-delete": "$1 je {{GENDER:$2|potisnuo|potisnula}} stranicu $3",
-       "logentry-suppress-event": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u dnevniku na $3: $4",
+       "logentry-suppress-event": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja|$5 događaja}} u dnevniku na $3: $4",
        "logentry-suppress-revision": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|izmene|$5 izmena}} na stranici $3: $4",
        "logentry-suppress-event-legacy": "$1 је tajno {{GENDER:$2|promenio|promenila}} vidljivost događaj u dnevniku na $3",
        "logentry-suppress-revision-legacy": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost izmena na stranici $3",
        "logentry-rights-rights": "$1 je {{GENDER:$2|promenio|promenila}} članstvo grupe za $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promenio|promenila}} čalnstvo grupe za $3",
        "logentry-rights-autopromote": "$1 je automatski {{GENDER:$1|unapređen|unapređena}} iz $4 u $5",
+       "logentry-upload-upload": "$1 je {{GENDER:$2|poslao|poslala}} $3",
+       "logentry-upload-overwrite": "$1 je {{GENDER:$2|poslao|poslala}} novu verziju $3",
+       "logentry-upload-revert": "$1 je {{GENDER:$2|poslao|poslala}} $3",
        "rightsnone": "(nema)",
+       "revdelete-summary": "opis izmene",
        "feedback-bugornote": "Ako ste spremni da detaljno opišete tehnički problem, onda [$1 prijavite grešku].\nU suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajati na stranici „[$3 $2]“, zajedno s korisničkim imenom i pregledačem koji koristite.",
        "feedback-subject": "Naslov:",
        "feedback-message": "Poruka:",
        "expand_templates_input": "Unos:",
        "expand_templates_output": "Rezultat",
        "expand_templates_xml_output": "XML izlaz",
+       "expand_templates_html_output": "Sirov HTML izlaz",
        "expand_templates_ok": "U redu",
        "expand_templates_remove_comments": "Ukloni komentare",
        "expand_templates_remove_nowiki": "Poništava efekat <nowiki> tagova u prikazu članaka",
        "expand_templates_generate_xml": "Prikaži XML stablo",
+       "expand_templates_generate_rawhtml": "Prikaži sirov HTML",
        "expand_templates_preview": "Prikaz",
-       "right-pagelang": "menjanje jezika stranice"
+       "pagelang-name": "Stranica",
+       "pagelang-language": "Jezik",
+       "pagelang-select-lang": "Izaberi jezik",
+       "right-pagelang": "menjanje jezika stranice",
+       "action-pagelang": "promenu jezika stranice",
+       "mediastatistics-table-mimetype": "MIME tip",
+       "mediastatistics-table-count": "Broj datoteka"
 }
index 8cc2bbd..8218904 100644 (file)
        "pager-newer-n": "{{PLURAL:$1|nyunr wan|nyunr $1}}",
        "pager-older-n": "{{PLURAL:$1|owrur wan|owrur $1}}",
        "booksources": "Buku source",
-       "booksources-go": "Suku",
        "specialloguserlabel": "Kebroikiman:",
        "speciallogtitlelabel": "Papira nen:",
        "log": "Log buku",
        "watchthispage": "Tan luku a papira disi",
        "unwatch": "No tan luku",
        "watchlist-details": "{{PLURAL:$1|Wan papira|$1 papira}} de ini yu Tan Luku réy, sondro fu teri den kruderi papira.",
-       "wlshowlast": "Sori laste $1 yuru, $2 dey ($3)",
+       "wlshowlast": "Sori laste $1 yuru, $2 dey ()",
        "watching": "A wiki e poti a papira disi ini yu Tan Luku...",
        "unwatching": "A wiki e puru a papira disi fu yu Tan Luku...",
        "deletepage": "Disi papira trowe",
        "metadata-expand": "Sori moro fin'fini",
        "metadata-collapse": "Kibri a fin'fini",
        "metadata-fields": "Den EXIF-metadata boksu ini a boskopu disi o sori owktu tapu wan prenki papira, efu a metadata tabel tapu.\nTrawan o kibri.\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",
-       "watchlistall2": "ala",
        "namespacesall": "ala",
        "monthsall": "ala",
        "confirm_purge_button": "oki",
index edfbeb0..1496896 100644 (file)
        "searchrelated": "früünd",
        "searchall": "aal",
        "showingresults": "Hier {{PLURAL:$1|is '''1''' Resultoat|sunt '''$1''' Resultoate}}, ounfangend mäd Nuumer '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resultoat '''$1''' fon '''$3'''|Resultoate '''$1–$2''' fon '''$3'''}} foar '''$4'''",
        "search-nonefound": "Foar dien Säikanfroage wuuden neen Resultoate fuunen.",
        "powersearch-legend": "Fääre säike",
        "powersearch-ns": "Säik in Noomensruume:",
        "querypage-disabled": "Disse Spezialsiede wuud deaktivierd uum ju Laistenge tou behoolden.",
        "booksources": "ISBN-Säike",
        "booksources-search-legend": "Säik ätter Steeden wier me Bouke kriege kon",
-       "booksources-go": "Säike (011)",
        "booksources-text": "Dit is ne Lieste mäd Ferbiendengen tou Internetsieden, do der näie un bruukte Bouke ferkoopje. Deer kon et uk wiedere Informatione uur do Bouke reeke. {{SITENAME}} is mäd neen fon disse Anbjoodere geskäftelk ferbuunen.",
        "booksources-invalid-isbn": "Fermoudelk is ju ISBN uungultich. Säik ätter Failere in ju Kopie.",
        "specialloguserlabel": "Uutfierenden Benutser:",
        "wlheader-enotif": "E-Mail-Beskeed is aktivierd.",
        "wlheader-showupdated": "Sieden, do ätter dien lääste Besäik annerd wuuden sunt, wäide '''fat''' deerstoald.",
        "wlnote": "Hier {{PLURAL:$1|foulget do lääste Annerenge|foulgje do lääste '''$1''' Annerengen}} fon do lääste {{PLURAL:$2|Uur|'''$2''' Uuren}}.",
-       "wlshowlast": "Wies do lääste $1 Uuren, $2 Deege, of $3 (in do lääste 30 Deege).",
+       "wlshowlast": "Wies do lääste $1 Uuren, $2 Deege, of  (in do lääste 30 Deege).",
        "watchlist-options": "Anwiesoptione",
        "watching": "Beooboachtje …",
        "unwatching": "Nit beooboachtje …",
        "import": "Sieden importierje",
        "importinterwiki": "Transwiki-Import",
        "import-interwiki-text": "Wääl n Wiki un ne Siede toun Importierjen uut.\nDo Versionsdoaten un Benutsernoomen blieuwe deerbie beheelden.\nAal Transwiki-Import-Aktione wäide in dät [[Special:Log/import|Import-Logbouk]] protokollierd.",
-       "import-interwiki-source": "Wälle-Wiki/-Siede:",
        "import-interwiki-history": "Importier aal Versione fon disse Siede",
        "import-interwiki-templates": "Aal Foarloagen iensluute",
        "import-interwiki-submit": "Import",
        "exif-gpsspeed-n": "Knätte",
        "exif-gpsdirection-t": "Wuddelke Gjuchte",
        "exif-gpsdirection-m": "Magnetiske Gjuchte",
-       "watchlistall2": "aal",
        "namespacesall": "aal",
        "monthsall": "aal",
        "confirmemail": "Email-Adrässe bestäätigje",
        "revdelete-restricted": "Einskränkengen jäilde uk foar Administratore",
        "revdelete-unrestricted": "Ienskränkengen foar Administratore wächhoald",
        "rightsnone": "(-)",
+       "revdelete-summary": "Touhoopefoatengskommentoar",
        "searchsuggest-search": "Säik",
        "searchsuggest-containing": "Fultextsäike ätter ...",
        "expandtemplates": "Foarloagen expandierje",
index 0002de3..1272c13 100644 (file)
        "tog-hidepatrolled": "Sumputkeun anu geus diroris ti béréndélan nu anyar robah",
        "tog-newpageshidepatrolled": "Sumputkeun nu geus diroris tina béréndélan kaca anyar",
        "tog-extendwatchlist": "Legaan béréndélan ngarah sakabéh parobahanana kaawaskeun",
-       "tog-usenewrc": "Parobahan grup dumasar kaca dina béréndélan anyar robah jeung awaskeuneun (maké JavaScript)",
+       "tog-usenewrc": "Parobahan grup dumasar kaca dina béréndélan anu anyar robah jeung awaskeuneun",
        "tog-numberheadings": "Nomeran lulugu sacara otomatis",
-       "tog-showtoolbar": "Témbongkeun ''toolbar'' édit (JavaScript)",
-       "tog-editondblclick": "Édit kaca ku klik ganda (JavaScript)",
-       "tog-editsectiononrightclick": "Fungsikeun ngédit sub-bagean kalawan klik-katuhu dina judul bagean (JavaScript)",
+       "tog-showtoolbar": "Témbongkeun tulbar édit",
+       "tog-editondblclick": "Édit kaca ku klik ganda",
+       "tog-editsectiononrightclick": "Fungsikeun ngédit sub-bagean kalawan klik-katuhu dina judul bagéan",
        "tog-watchcreations": "Tambahkeun kaca-kaca jieunan kuring jeung berkas muatan kuring kana awaskeuneun",
        "tog-watchdefault": "Tambahkeun kaca jeung berkas anu diédit ku kuring kana awaskeuneun",
        "tog-watchmoves": "Tambahkeun kaca jeung berkas anu dipindahkeun ka awaskeuneun",
        "tog-watchdeletion": "Tambahkeun kaca jeung berkas anu dihapus kana awaskeuneun",
+       "tog-watchrollback": "Tambahkeun kaca anu jujutanana kungsi dibalikkeun kana awaskeuneun",
        "tog-minordefault": "Tandaan sadaya éditan salaku minor luyu jeung ti dituna",
        "tog-previewontop": "Témbongkeun sawangan méméh kotak édit (lain sanggeusna)",
        "tog-previewonfirst": "Témbongkeun sawangan dina éditan munggaran",
@@ -37,7 +38,7 @@
        "tog-shownumberswatching": "Témbongkeun jumlah nu ngawaskeun",
        "tog-oldsig": "Paraf nu geus aya:",
        "tog-fancysig": "Témbongkeun paraf salaku wikitext (tanpa tumbu otomatis)",
-       "tog-uselivepreview": "Paké pramidang saharita (JavaScript) (ujicoba)",
+       "tog-uselivepreview": "Paké pramidang saharita (ujicoba)",
        "tog-forceeditsummary": "Mun kotak ringkesan éditan masih kosong, béjaan!",
        "tog-watchlisthideown": "Sumputkeun éditan kuring dina daptar awaskeuneun",
        "tog-watchlisthidebots": "Sumputkeun éditan bot dina daptar awaskeuneun",
        "tog-showhiddencats": "Témbongkeun kategori nyumput",
        "tog-norollbackdiff": "Liwat béda sanggeus malikkeun révisi",
        "tog-useeditwarning": "Béjaan kuring lamun ninggalkeun kaca édit anu parobahanana can disimpen",
+       "tog-prefershttps": "Salawasna paké sambungan aman nalika asup log",
        "underline-always": "Salawasna",
        "underline-never": "Ulah",
-       "underline-default": "Luyu jeung buhunna panyungsi",
+       "underline-default": "Buhunna kulit atawa panyungsi",
        "editfont-style": "Gaya aksara dina kotak éditan:",
        "editfont-default": "Luyu jeung buhunna panyungsi",
        "editfont-monospace": "Aksara monospasi",
@@ -65,7 +67,7 @@
        "thursday": "Kemis",
        "friday": "Jumaah",
        "saturday": "Saptu",
-       "sun": "Min",
+       "sun": "Ming",
        "mon": "Sen",
        "tue": "Sal",
        "wed": "Reb",
        "oct": "Okt",
        "nov": "Nop",
        "dec": "Dés",
+       "january-date": "$1 Januari",
+       "february-date": "$1 Pébruari",
+       "march-date": "$1 Maret",
+       "april-date": "$1 April",
+       "may-date": "$1 Méi",
+       "june-date": "$1 Juni",
+       "july-date": "$1 Juli",
+       "august-date": "$1 Agustus",
+       "september-date": "$1 Séptémber",
+       "october-date": "$1 Oktober",
+       "november-date": "$1 Nopémber",
+       "december-date": "$1 Désémber",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategori}}",
        "category_header": "Artikel-artikel na kategori \"$1\"",
        "subcategories": "Subkategori",
        "newwindow": "(buka na jandéla anyar)",
        "cancel": "Bolay",
        "moredotdotdot": "Deui...",
-       "mypage": "Kaca kuring",
+       "morenotlisted": "Ieu béréndélan tacan lengkep.",
+       "mypage": "Kaca",
        "mytalk": "Obrolan",
        "anontalk": "Obrolan pikeun IP ieu",
        "navigation": "Pituduh",
        "actions": "Peta",
        "namespaces": "Spasi ngaran",
        "variants": "Varian",
+       "navigation-heading": "Ménu navigasi",
        "errorpagetitle": "Kasalahan",
        "returnto": "Balik deui ka $1.",
        "tagline": "Ti {{SITENAME}}",
        "permalink": "Tutumbu permanén",
        "print": "Citak",
        "view": "Tempo",
+       "view-foreign": "Tempo di $1",
        "edit": "Édit",
+       "edit-local": "Edit déskripsi lokal",
        "create": "Jieun",
+       "create-local": "Tambah déskripsi lokal",
        "editthispage": "Édit kaca ieu",
        "create-this-page": "Jieun kaca ieu",
        "delete": "Hapus",
        "deletethispage": "Hapus kaca ieu",
+       "undeletethispage": "Bolaykeun ngahapus ieu kaca",
        "undelete_short": "Bolaykeun ngahapus {{PLURAL:$1|hiji éditan|$1 éditan}}",
        "viewdeleted_short": "Témbongkeun {{PLURAL:$1|hiji éditan nu dihapus|$1 éditan nu dihapus}}",
        "protect": "Konci",
        "articlepage": "Témbongkeun kaca eusi",
        "talk": "Sawala",
        "views": "Témbongan",
-       "toolbox": "Kotak parabot",
+       "toolbox": "Parabot",
        "userpage": "Témbongkeun kaca pamaké",
        "projectpage": "Témbongkeun kaca proyék",
        "imagepage": "Tempo kaca gambar",
        "otherlanguages": "Dina séjén basa",
        "redirectedfrom": "(dipindahkeun ti $1)",
        "redirectpagesub": "Kaca alihan",
+       "redirectto": "Alihkeun ka:",
        "lastmodifiedat": "Kaca ieu panungtungan dirobah $2, $1.",
        "viewcount": "Kaca ieu geus dibuka {{PLURAL:$1|sakali|$1 kali}}.<br />",
        "protectedpage": "Kaca nu dikonci",
        "jumptonavigation": "pituduh",
        "jumptosearch": "sungsi",
        "view-pool-error": "Punten, serverna keur pinuh.\nLoba teuing nu nyoba muka ieu kaca.\nMangga cobian sanés waktos.\n\n$1",
+       "generic-pool-error": "Hampura, serverna keur pinuh.\nLoba teuing nu nyoba muka ieu sumberdaya.\nAntosan sakedap, engké cobaan deui.",
        "pool-timeout": "Béakeun waktu nungguan konci",
        "pool-queuefull": "Antrian geus pinuh",
        "pool-errorunknown": "Éror teu dipikawanoh",
+       "pool-servererror": "Palayanan ''pool counter'' teu disadiakeun ($1).",
        "aboutsite": "Ngeunaan {{SITENAME}}",
        "aboutpage": "Project:Ngeunaan",
-       "copyright": "Sadaya kandungan ieu loka ditangtayungan ku $1",
+       "copyright": "Eusina ditangtayungan ku $1 iwal lamun disebutkeun béda.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
        "currentevents": "Keur lumangsung",
-       "currentevents-url": "Project:Keur lumangsung",
+       "currentevents-url": "Portal:Keur lumangsung",
        "disclaimers": "Bantahan",
        "disclaimerpage": "Project:Bantahan_umum",
        "edithelp": "Pitulung ngédit",
        "ok": "Heug",
        "retrievedfrom": "Disalin ti \"$1\"",
        "youhavenewmessages": "Anjeun boga $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Anjeun boga}} $1 ti {{PLURAL:$3|pamaké séjén|$3 pamaké}} ($2).",
+       "youhavenewmessagesmanyusers": "Anjeun boga $1 ti pamaké lian ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|obrolan anyar|obrolan anyar}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|parobahan|999=parobahan}} panungtung",
        "youhavenewmessagesmulti": "Anjeun boga talatah anyar di $1",
        "editsection": "édit",
        "editold": "édit",
        "hidetoc": "sumputkeun",
        "collapsible-collapse": "Tilepkeun",
        "collapsible-expand": "Amparkeun",
+       "confirmable-confirm": "{{GENDER:$1|Anjeun}} geus yakin?",
+       "confirmable-yes": "Enya",
+       "confirmable-no": "Henteu",
        "thisisdeleted": "Témbongkeun atawa simpen deui $1?",
        "viewdeleted": "Témbongkeun $1?",
        "restorelink": "$1 {{PLURAL:$1|éditan|éditan}} dihapus",
        "nospecialpagetext": "<strong>Anjeun ménta kaca husus nu teu dipikawanoh.</strong>\nKaca husus anu bener bisa ditempo béréndélanana dina [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Kasalahan",
        "databaseerror": "Kasalahan gudang data",
+       "databaseerror-query": "Kueri: $1",
+       "databaseerror-function": "Fungsi: $1",
+       "databaseerror-error": "Eror: $1",
        "laggedslavemode": "Awas: kandungan kaca bisa baé teu mutahir.",
        "readonly": "pangkalan data dikonci",
        "enterlockreason": "Asupkeun alesan pikeun ngonci, kaasup kira-kira iraha konci ieu rék dibuka",
        "viewsource-title": "Témbongkeun sumber pikeun $1",
        "actionthrottled": "Peta diwates",
        "actionthrottledtext": "Salaku tetengger anti-spam, anjeun teu diwenangkeun loba kitu peta dina jangka waktu anu sakitu heureutna. Mangga lajengkeun deui sanggeus sababaraha menit ka payun.",
-       "protectedpagetext": "Ieu kaca dikonci ngarah teu bisa dirobah.",
+       "protectedpagetext": "Ieu kaca dijaga tina éditan atawa peta lianna.",
        "viewsourcetext": "Anjeun bisa némbongkeun sarta nyalin sumber ieu kaca:",
        "viewyourtext": "Anjeun bisa némbongkeun sarta nyalin sumber '''éditan anjeun''' ka ieu kaca:",
        "protectedinterface": "Kaca ieu eusina teks antarmuka pikeun dipaké ku pakakas beyé sarta geus dikunci pikeun ngahindar ti kasalahan.",
        "namespaceprotected": "Anjeun teu ngabogaan hak pikeun ngédit kaca di ngaranspasi '''$1'''.",
        "customcssprotected": "Anjeun teu teu diwenangkeun pikeun ngédit ieu kaca CSS, sabab ngandung setélan pribadi kontributor séjén.",
        "customjsprotected": "Anjeun teu teu diwenangkeun pikeun ngédit ieu kaca JavaScript, sabab ngandung setélan pribadi kontributor séjén.",
+       "mycustomcssprotected": "Anjeun teu boga kawenangan pikeun ngédit kaca CSS ieu.",
+       "mycustomjsprotected": "Anjeun teu boga kawenangan pikeun ngédit kaca JavaScript ieu.",
+       "myprivateinfoprotected": "Anjeun teu boga kawenangan pikeun ngédit émbaran pribadi anjeun.",
+       "mypreferencesprotected": "Anjeun teu boga kawenangan pikeun ngédit préferénsi anjeun.",
        "ns-specialprotected": "Kaca dina ngaranspasi {{ns:special}} teu bisa di édit.",
        "titleprotected": "Ieu judul dikonci ku [[User:$1|$1]] kalawan alesan ''$2''.",
+       "filereadonlyerror": "Berkas \"$1\" teu bisa dirobah kusabab répositori \"$2\" keur dina mode ukur-maca.\n\nKuncén anu ngonci méré alesan: \"$3\".",
+       "exception-nologin": "Henteu asup log",
+       "exception-nologin-text": "Mangga asup log pikeun bisa asup atawa ngarobah ieu kaca.",
+       "exception-nologin-text-manual": "Mangga $1 pikeun bisa asup atawa ngarobah ieu kaca.",
        "virus-badscanner": "Kasalahan konfigurasi: panyekén virus teu dipikawanoh: ''$1''",
        "virus-scanfailed": "nyekén gagal (kode $1)",
        "virus-unknownscanner": "antivirus teu dipikawanoh:",
-       "logouttext": "'''Anjeun ayeuna geus kaluar log.'''\n\nAnjeun bisa tetep migunakeun {{SITENAME}} bari anonim, atawa bisa <span class='plainlinks'>[$1 asup log deui]</span> salaku pamaké nu sarua atawa nu séjén deui.\nMangkahadé, sababaraha kaca bakal tetep némbongkeun saolah-olah anjeun asup log kénéh nepi ka anjeun ngosongkeun ''cache'' panyungsi anjeun.",
+       "logouttext": "<strong>Anjeun ayeuna geus kaluar log.<strong>\n\nMangkahadé, sababaraha kaca bakal tetep némbongkeun saolah-olah asup kénéh log nepi ka anjeun ngosongkeun ''cache'' dina panyungsi.",
+       "welcomeuser": "Bagéa, $1!",
+       "welcomecreation-msg": "Akun anjeun geus dijieun.\nLamun minat, Anjeun bisa ngarobah [[Special:Preferences|préferénsi]] {{SITENAME}}.",
        "yourname": "Sandiasma:",
+       "userlogin-yourname": "Sandiasma",
+       "userlogin-yourname-ph": "Asupkeun sandiasma anjeun",
+       "createacct-another-username-ph": "Asupkeun sandiasma",
        "yourpassword": "Sandi anjeun",
+       "userlogin-yourpassword": "Kecap sandi",
+       "userlogin-yourpassword-ph": "Asupkeun kecap sandi anjeun",
+       "createacct-yourpassword-ph": "Asupkeun kecap sandi",
        "yourpasswordagain": "Ketik deui sandi anjeun",
+       "createacct-yourpasswordagain": "Konfirmasi kecap sandi",
+       "createacct-yourpasswordagain-ph": "Asupkeun deui kecap sandi",
        "remembermypassword": "Apalkeun login kuring dina ieu komputer (pikeun paling lila $1 {{PLURAL:$1|poé|poé}})",
+       "userlogin-remembermypassword": "Jaga ngarah angger asup log",
+       "userlogin-signwithsecure": "Paké sambungan aman",
        "yourdomainname": "Domain anjeun",
+       "password-change-forbidden": "Anjeun teu bisa ngarobah kecap sandi dina ieu wiki.",
        "externaldberror": "Aya kasalahan dina pangkalan data oténtikasi luar, atawa anjeun mémang teu diwenangkeun pikeun ngaropéa rekening luar anjeun.",
        "login": "Asup log",
        "nav-login-createaccount": "Nyieun akun/asup log",
        "logout": "Kaluar log",
        "userlogout": "Kaluar log",
        "notloggedin": "Can asup log",
+       "userlogin-noaccount": "Teu boga akun?",
+       "userlogin-joinproject": "Ngiluan {{SITENAME}}",
        "nologin": "Teu boga akun? '''$1'''.",
        "nologinlink": "Jieun akun",
        "createaccount": "Jieun akun",
        "gotaccount": "Geus boga akun? '''$1'''.",
        "gotaccountlink": "Asup log",
        "userlogin-resetlink": "Poho akun sorangan?",
-       "createaccountmail": "ku surélék",
+       "userlogin-resetpassword-link": "Poho kecap sandi?",
+       "userlogin-helplink2": "Pitulung asup log",
+       "userlogin-loggedin": "Anjeun geus asup log salaku {{GENDER:$1|$1}}.\nPaké pormulir di handap pikeun asup log salaku pamaké séjén.",
+       "userlogin-createanother": "Jieun akun séjén",
+       "createacct-emailrequired": "Alamat surélék:",
+       "createacct-emailoptional": "Alamat surélék (teu wajib)",
+       "createacct-email-ph": "Asupkeun alamat surélék anjeun",
+       "createacct-another-email-ph": "Asupkeun alamat surélék",
+       "createaccountmail": "Paké kecap sandi acak sarta kirim ka alamat surélék",
+       "createacct-realname": "Ngaran asli (teu wajib)",
        "createaccountreason": "Alesan:",
+       "createacct-reason": "Alesan",
+       "createacct-reason-ph": "Naha bet nyieun akun séjén",
+       "createacct-captcha": "Pamariksaan kaamanan",
+       "createacct-imgcaptcha-ph": "Asupkeun téks anu kabaca di luhur",
+       "createacct-submit": "Jieun akun anjeun",
+       "createacct-another-submit": "Jieun akun séjén",
+       "createacct-benefit-heading": "{{SITENAME}} téh dijieun ku jalma-jalma siga anjeun.",
+       "createacct-benefit-body1": "{{PLURAL:$1|édit|édit}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|kaca|kaca}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|kontributor|kontributor}} panungtung",
        "badretype": "Sandi nu diasupkeun teu cocog.",
        "userexists": "Sandiasma nu diasupkeun geus aya nu maké.\nMangga pilih sandiasma nu séjén.",
        "loginerror": "Kasalahan asup log",
+       "createacct-error": "Nyieun akun éror",
        "createaccounterror": "Teu bisa nyieun rekening: $1",
        "nocookiesnew": "Rekening pamaké geus dijieun, tapi anjeun can asup log. {{SITENAME}} maké ''cookies'' pikeun ngasupkeun log pamaké. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga fungsikeun, teras asup log migunakeun ngaran pamaké sarta sandi nu anyar.",
        "nocookieslogin": "{{SITENAME}} migunakeun ''cookies'' pikeun ngasupkeun pamaké kana log. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga pungsikeun sarta cobian deui.",
        "passwordtooshort": "Sandina kudu diwangun ku sahanteuna {{PLURAL:$1|1 karakter|$1 karakter}}.",
        "password-name-match": "Sandi anjeun kudu béda ti landihan.",
        "password-login-forbidden": "Sandiasma jeung sandina teu bisa dipaké.",
-       "mailmypassword": "Kirim sandi anyar ngaliwatan surélék",
+       "mailmypassword": "Setél ulang kecap sandi",
        "passwordremindertitle": "Pangéling sandi ti {{SITENAME}}",
        "passwordremindertext": "Aya (jigana anjeun ti alamat IP $1) nu ménta sangkan dikiriman sandi anyar asup log {{SITENAME}} ($4). Saheulaanan, sandi anyar keur pamaké \"$2\" ayeuna diganti jadi \"$3\". Anjeun kudu asup log sarta ngarobah sandi anjeun ayeuna. Ieu sandi bakal kadaluwarsa dina {{PLURAL:$5|sapoé|$5 poé}}.\n\nMun pamundut ieu datang ti nu séjén, atawa mun anjeun geus inget sandi anu tadina poho, sarta teu hayang ngarobah sandina, anjeun teu kudu ngawaro kana ieu surat sarta bisa tetep maké sandi anu ti heula.",
        "noemail": "Teu aya alamat surélék karékam pikeun \"$1\".",
        "noemailcreate": "Anjeun kudu nyadiakeun alamat surélék anu bener",
        "passwordsent": "Sandi anyar geus dikirim ka alamat surélék nu kadaptar pikeun \"$1\". Mangga asup log deui satutasna katarima.",
        "blocked-mailpassword": "Alamat IP anjeun dipeungpeuk, moal bisa ngédit, and so\nis not allowed to use the password recovery function to prevent abuse.",
-       "eauthentsent": "Surélék konfirmasi geus dikirim ka alamat bieu. Méméh aya surat séjén asup ka rekeningna, anjeun kudu nuturkeun pituduh na surélékna pikeun ngonfirmasi yén rekening éta téh bener nu anjeun.",
-       "throttled-mailpassword": "Hiji panginget kecap sandi geus dikirimkeun dina {{PLURAL:$1|jam|$1 jam}} pamungkas.\nPikeun ngahindar disalahgunakeun, ngan hiji kecap sandi anu baris dikirimkeun saban {{PLURAL:$1|jam|$1 jam}}.",
+       "eauthentsent": "Surélék konfirmasi geus dikirim ka alamat bieu.\nMéméh aya surat séjén asup ka akunna, anjeun kudu nuturkeun pituduh dina surélékna pikeun mastikeun yén akun éta téh bener boga anjeun.",
+       "throttled-mailpassword": "Surélék pikeun ngarobah kecap sandi geus dikirim {{PLURAL:$1|jam|$1 jam}} kaliwat.\nNgarah hanteu disalahgunakeun, ngan hiji surélék anu bakal dikirim saban {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Kasalahan ngirim surat: $1",
        "acct_creation_throttle_hit": "Punten,pamaké alamat IP anjeun geus nyieun {{PLURAL:$1|1 rekening|$1 rekening}} dina sapoé ieu. mangrupa jumlah nu di idinan dina sapoé.\nanjeun teu bisa nyieun deui samentara waktu.",
-       "emailauthenticated": "Alamat surélék anjeun geus dioténtikasi dina $3, $2.",
-       "emailnotauthenticated": "Alamat surélék anjeun <strong>can dioténtikasi</strong>. Moal aya surélék nu bakal dikirim pikeun fitur-fitur di handap ieu.",
+       "emailauthenticated": "Alamat surélék anjeun geus dikonfirmasi $2 tabuh $3.",
+       "emailnotauthenticated": "Alamat surélék anjeun can dikonfirmasi.\nMoal aya surélék nu bakal dikirim pikeun fitur-fitur di handap ieu.",
        "noemailprefs": "Teu aya alamat surélék, fitur di handap moal bisa jalan.",
        "emailconfirmlink": "Konfirmasi alamat surélék anjeun",
        "invalidemailaddress": "Alamat surélék teu bisa ditarima sabab formatna salah.\nMangga lebetkeun alamat nu formatna bener atawa kosongkeun baé.",
        "cannotchangeemail": "Alamat surat-é akun hanteu bisa dirobah di ieu wiki.",
+       "emaildisabled": "Ieu loka teu bisa ngirim surélék.",
        "accountcreated": "Rekening geus dijieun.",
-       "accountcreatedtext": "Rekening pamaké pikeun $1 geus dijieun.",
+       "accountcreatedtext": "Akun pamaké [[{{ns:Pamaké}}:$1|$1]] ([[{{ns:Obrolan pamaké}}:$1|obrolan]]) geus dijieun.",
        "createaccount-title": "Nyieun rekening keur {{SITENAME}}",
        "createaccount-text": "Aya nu nyieun rekening pikeun alamat surélék anjeun di {{SITENAME}} ($4) maké landihan \"$2\" sarta sandi \"$3\". Anjeun kudu asup log sarta ngaganti sandina ayeuna kénéh.\n\nMun ieu rekening balukar ayana éror, teu kudu diwaro.",
-       "login-throttled": "Anjeun geus loba teuing nyobaan asup log.\nTungguan heula sakeudeung, laju cobaan deui.",
+       "login-throttled": "Anjeun geus loba teuing nyobaan asup log.\nTungguan $1, laju cobaan deui.",
        "login-abort-generic": "Login gagal - Dibolaykeun",
+       "login-migrated-generic": "Akun anjeun geus pindah, ku kituna sandiasma anjeun geus leungit ti ieu wiki.",
        "loginlanguagelabel": "Basa: $1",
        "suspicious-userlogout": "Pamundut anjeun pikeun kaluar log ditolak ku sabab sigana dikirim ku pangaprak buntu atawa ''cache'' proxi.",
+       "createacct-another-realname-tip": "Ngaran asli hanteu diwajibkeun.\nLamun anjeun milih ngeusian, ieu ngaran bakal dipaké pikeun nandaan kontribusi anjeun.",
+       "pt-login": "Asup log",
+       "pt-login-button": "Asup log",
+       "pt-createaccount": "Jieun akun",
+       "pt-userlogout": "Kaluar log",
        "php-mail-error-unknown": "Kasalahan nu teu kanyahoan dina fungsi PHP surélék().",
        "user-mail-no-addy": "Nyobaan ngirim surélék tanpa alamat.",
        "changepassword": "Robah sandi",
-       "resetpass_announce": "Anjeun asup log migunakeun sandi samentara. Salajengna, mangga gentos ku sandi anyar di dieu:",
+       "resetpass_announce": "Pikeun nganggeuskeun asup log, anjeun kudu nyieun kecap sandi anyar.",
        "resetpass_text": "<!-- Tambahkeun téks di dieu -->",
        "resetpass_header": "Ganti sandi rekening",
        "oldpassword": "Sandi heubeul",
        "newpassword": "Sandi anyar:",
        "retypenew": "Ketik ulang sandi",
        "resetpass_submit": "Setél log asup katut sandina",
-       "changepassword-success": "Kecap sandi Anjeun geus junun dirobah! Ayeuna proses asup log Anjeun...",
+       "changepassword-success": "Kecap sandi Anjeun geus laksana dirobah!",
+       "changepassword-throttled": "Anjeun geus loba teuing nyobaan asup log.\nTungguan $1 méméh nyobaan deui.",
        "resetpass_forbidden": "Sandi henteu bisa dirobah",
        "resetpass-no-info": "Anjeun kudu asup log pkeun bisa muka ieu kaca sacara langsung.",
        "resetpass-submit-loggedin": "Ganti kecap sandi rekening",
        "resetpass-submit-cancel": "Bolay",
        "resetpass-wrong-oldpass": "Salah sandi.\nBisa jadi anjeun geus ngaganti sandina atawa ménta sandi saheulaanan anu anyar.",
+       "resetpass-recycled": "Mangga ganti kecap sandi anjeun ku nu anyar.",
+       "resetpass-temp-emailed": "Anjeun asup log migunakeun sandi témporér. Pikeun nganggeuskeun asup log, anjeun kudu nyieun kecap sandi anyar di dieu:",
        "resetpass-temp-password": "Sandi samentara:",
+       "resetpass-expired": "Kecap sandi anjeun geus kadaluwarsa. Mangga jieun anu anyar pikeun asup log.",
        "passwordreset": "Setél ulang sandi",
        "passwordreset-legend": "Setél ulang sandi",
        "passwordreset-disabled": "Dina ieu wiki, sandi teu bisa disetél ulang.",
        "passwordreset-emailelement": "Sandiasma: $1\nSandi saheulaanan: $2",
        "passwordreset-emailsent": "Surélék pangéling geus dikirim.",
        "changeemail": "Ganti alamat surélék",
-       "changeemail-header": "Ganti alamat surélék akun",
        "changeemail-text": "Lengkepan ieu formulir pikeun ngaganti alamat surélék. Anjeun bakal kudu ngasupkeun sandi pikeun ngonfirmasi ieu parobahan.",
        "changeemail-no-info": "Anjeun kudu asup log pikeun bisa muka ieu kaca sacara langsung.",
        "changeemail-oldemail": "Alamat surélék ayeuna:",
        "changeemail-newemail": "Alamat surélék anyar:",
        "changeemail-none": "(euweuh)",
+       "changeemail-password": "Kecap sandi {{SITENAME}} Anjeun:",
        "changeemail-submit": "Ganti surélék",
-       "changeemail-cancel": "Bolay",
+       "resettokens-tokens": "Token:",
        "bold_sample": "Téks kandel",
        "bold_tip": "Téks kandel",
        "italic_sample": "Tulisan déngdék",
        "token_suffix_mismatch": "'''Éditan anjeun ditolak sabab aplikasi klien Anjeun ngarobah karakter tanda baca dina éditan. Éditan kasebut ditolak keur nyegah kasalahan dina artikel téks. Hal ieu kadang-kadang kajadian lamun Anjeun maké proksi anonim basis web nu masalah.'''",
        "edit_form_incomplete": "'''Sawatara bagian tina wangun éditan teu nepi ka sérver; pariksa deui naha éditan Anjeun tetep gembleng sarta cobaan deui.'''",
        "editing": "Ngédit $1",
+       "creating": "Nyieun $1",
        "editingsection": "Ngédit $1 (bagian)",
        "editingcomment": "Ngédit $1 (bagian anyar)",
        "editconflict": "Konflik éditan: $1",
        "copyrightwarning": "Perhatikeun yén sadaya kontribusi ka MediaWiki dianggap medal dina panangtayungan lisénsi $2 (tempo $1 pikeun jéntréna). Mun anjeun teu miharep tulisan anjeun dirobah sarta disebarkeun deui, ulah dilebetkeun ka dieu.<br />\nAnjeun ogé jangji yén tulisan ieu dijieun ku sorangan, atawa disalin ti ''domain'' umum atawa sumberdaya bébas séjénna. '''ULAH NGASUPKEUN KARYA NU MIBANDA HAK CIPTA TANPA IDIN!'''",
        "copyrightwarning2": "Catet yén sadaya kontribusi ka {{SITENAME}} bisa diédit, dirobah, atawa dihapus ku kontributor séjén. Mun anjeun teu miharep tulisan anjeun dirobah, ulah ngintunkeun ka dieu.<br />\nAnjeun ogé mastikeun yén ieu téh pituin tulisan anjeun, atawa salinan ti domain umum atawa sumberdaya bébas séjénna (tempo $1 pikeun écésna).\n'''ULAH NGINTUNKEUN KARYA NU MIBANDA HAK CIPTA TANPA WIDI!'''",
        "longpageerror": "'''SALAH: Téks anu dikirimkeun gedéna $1 kb, leuwih ti maksimum $2 kb. Téks teu bisa disimpen.'''",
-       "readonlywarning": "'''PERHATOSAN''': pangkalan data dikonci pikeun diropéa, anjeun moal bisa nyimpen éditan anjeun ayeuna. Cobi ''cut-n-paste'' téksna ka na koropak téks sarta simpen dina waktu séjén.\n\nkuncén nu ngonci pangkalan data mikeun kajelasan : $1",
+       "readonlywarning": "<strong>Awas: pangkalan data dikonci pikeun diropéa, anjeun moal bisa nyimpen éditan anjeun ayeuna.</strong>\nMun perlu, simpen heula téksna kana berkas téks pikeun diasupkeun deui séjén mangsa.\n\nKuncén anu ngonci pangkalan data méré katerangan: $1",
        "protectedpagewarning": "'''AWAS: ieu kaca dikonci sarta ngan bisa dirobah ku pamaké nu statusna kuncén.'''\nÉntri log panungtungan ditémbongkeun di handap:",
        "semiprotectedpagewarning": "'''Catetan''': ieu kaca dikonci sarta ukur bisa dirobah ku pamaké nu geus kadaptar.\nÉntri log panungtung dibéréndélkeun di handap:",
        "cascadeprotectedwarning": "'''Awas''': ieu kaca dikonci sahingga ukur bisa dirobah ku kuncén, sabab kaasup {{PLURAL:$1|kaca|kaca}} dina panyalindungan-ngaruntuy di handap ieu:",
        "edit-gone-missing": "Kaca teu bisa dianyarkeun,\nsigana kusabab geus dihapus.",
        "edit-conflict": "Éditan bantrok",
        "edit-no-change": "Éditan anjeun teu diwaro, kusabab taya nu robah dina tulisanana.",
+       "postedit-confirmation-saved": "Éditan anjeun tos disimpen.",
        "edit-already-exists": "Teu bisa nyieun kaca anyar.\nArtikelna geus aya.",
+       "defaultmessagetext": "Téks ti dituna",
+       "invalid-content-data": "Data eusi henteu valid",
+       "content-not-allowed-here": "Eusi \"$1\" teu diijinan di kaca [[$2]]",
+       "content-model-wikitext": "wikitéks",
+       "content-model-text": "téks polos",
+       "content-model-javascript": "JavaScript",
+       "content-model-css": "CSS",
        "expensive-parserfunction-warning": "Inget!: Kaca ieu ngandung réa teuing maké fungsi ''parser''.\n\nAyeuna aya {{PLURAL:$1|$1 panggilan|$1 panggilan}}, sakuduna kurang ti $2 {{PLURAL:$2|panggilan|panggilan}}.",
        "expensive-parserfunction-category": "Kaca kalawan réa teuing maké fungsi parser",
        "post-expand-template-inclusion-warning": "Inget! : Ukuran citakan anu dipaké badag teuing.\nSawatara citakan baris teu diasupkeun.",
        "histlegend": "Pilihan béda: tandaan wadah buleud vérsina pikeun ngabandingkeun sarta pencét énter atawa tombol di handap.<br />\nKaterangan: (kiw) = bédana jeung vérsi kiwari,\n(ahir) = bédana jeung vérsi nu harita, m = éditan minor.",
        "history-fieldset-title": "Sungsi jujutan",
        "history-show-deleted": "Ukur nu dihapus",
-       "histfirst": "Pangheubeulna",
-       "histlast": "Pangahirna",
+       "histfirst": "pangheubeulna",
+       "histlast": "panganyarna",
        "historysize": "($1 {{PLURAL:$1|bit|bit}})",
        "historyempty": "(kosong)",
        "history-feed-title": "Sajarah révisi",
        "revdelete-nooldid-title": "Udagan révisi salah",
        "revdelete-nooldid-text": "Anjeun can nangtukeun atawa méré révisi pikeun ngajalankeun ieu fungsi, révisi nu di tangtukeun can aya, atawa anjeun nyoba nyumputkeun  révisi kiwari.",
        "revdelete-no-file": "Berkas anu ditujul teu kapanggih.",
-       "revdelete-show-file-confirm": "Anjeun yakin rék nempo révisi anu geus dihapus dina koropak \"<nowiki>$1</nowiki>\" ti $2 nepi ka $3?",
+       "revdelete-show-file-confirm": "Anjeun yakin rék nempo révisi anu geus dihapus dina berkas \"<nowiki>$1</nowiki>\" ti $2 nepi ka $3?",
        "revdelete-show-file-submit": "Enya",
        "logdelete-selected": "{{PLURAL:$1|pilihan keur log|pilihan keur log}}:",
        "revdelete-confirm": "Mangga geura konfirmasi yen Anjeun gaduh maksad pikeun ngalakukeun hal ieu, paham kana konsekwensina, tur nu dilakukeun ieu teh luyu sareng [[{{MediaWiki:Policy-url}}|kawijakanana]]",
        "revdelete-suppress-text": "Nyumputkeun revisi '''ukur''' bisa digunakeun keur kasus-kasus di handap ieu:\n* Informasi nu boga potensi mitenah\n* Informasi pribadi nu teu pantes\n*: ''alamat imah katut nomer telepon, nomer kartu identitas, jeung lian-liana.''",
        "revdelete-legend": "Setél réstriksi révisi:",
-       "revdelete-hide-text": "Sumputkeun téks révisi",
+       "revdelete-hide-text": "Téks révisi",
        "revdelete-hide-image": "Sumputkeun eusi gambar",
        "revdelete-hide-name": "Sumputkeun lampah sarta udagan",
        "revdelete-hide-comment": "Sumputkeun koméntar ngédit",
        "revdelete-hide-user": "Sumputkeun ngaran pamaké/IP éditor",
        "revdelete-hide-restricted": "Sumputkeun data boh ti kuncén atawa nu séjénna",
        "revdelete-radio-same": "(ulah dirobah)",
-       "revdelete-radio-set": "Enya",
-       "revdelete-radio-unset": "Ulah",
+       "revdelete-radio-set": "Nyumput",
+       "revdelete-radio-unset": "Némbongan",
        "revdelete-suppress": "Sumputkeun ogé ti kuncén",
        "revdelete-unsuppress": "Hapus watesan kana révisi anu geus dipulangkeun",
        "revdelete-log": "Alesan:",
        "revdelete-submit": "Larapkeun kana {{PLURAL:$1|révisi|révisi}} nu dipilih",
-       "revdelete-success": "Pangaturan nyumpukeun révisi junun dilarapkeun.",
+       "revdelete-success": "<strong>Visibilitas révisi geus dimutahirkeun.</strong>",
        "revdelete-failure": "'''Visibilitas révisi teu bisa diapdét:'''\n$1",
        "logdelete-success": "Log pangatur nyumputkeun junun dilarapkeun.",
        "logdelete-failure": "'''Visibilitas log teu bisa disét:'''\n$1",
        "searchprofile-everything": "Sagala",
        "searchprofile-advanced": "Lengkep",
        "searchprofile-articles-tooltip": "Pilari di $1",
-       "searchprofile-images-tooltip": "Pilari koropak/file",
+       "searchprofile-images-tooltip": "Pilari berkas",
        "searchprofile-everything-tooltip": "Pilari di sakabéh eusi (kaasup kaca obrolan)",
        "searchprofile-advanced-tooltip": "Paluruh di rohang ngaran anu tangtu",
        "search-result-size": "$1 ({{PLURAL:$2|1 kecap|$2 kecap}})",
        "search-section": "(bagean $1)",
        "search-suggest": "Meureun maksud Anjeun nyaéta: $1",
        "search-interwiki-caption": "Proyék sawargi",
-       "search-interwiki-default": "$1 hasil:",
+       "search-interwiki-default": "Hasil ti $1:",
        "search-interwiki-more": "(saterusna)",
        "search-relatedarticle": "Patula-patali",
        "searchrelated": "patula-patali",
        "searchall": "sadayana",
        "showingresults": "Di handap ieu némbongkeun {{PLURAL:$1|'''1''' hasil|'''$1''' hasil}}, dimimitianku  #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Hasil '''$1''' ti '''$3'''|Hasil '''$1 - $2''' ti '''$3'''}} pikeun '''$4'''",
        "search-nonefound": "Euweuh hasil nu cocog jeung kueri.",
        "powersearch-legend": "Panéangan tuluy",
        "powersearch-ns": "Téangan di ngaranspasi:",
        "search-external": "Panéangan luar",
        "searchdisabled": "Punten! Néangan téks lengkep di {{SITENAME}} kanggo samentawis ditumpurkeun pikeun alesan kinerja. Jalaran kitu, saheulaanan anjeun bisa nyungsi di Google di handap ieu. Catet yén indéxna ngeunaan eusi {{SITENAME}} bisa jadi teu mutahir.",
        "preferences": "Préferénsi",
-       "mypreferences": "Préferéns",
+       "mypreferences": "Préferénsi",
        "prefs-edits": "Jumlah éditan:",
        "prefs-skin": "Kulit",
        "skin-preview": "Pramidang",
        "datedefault": "Tanpa préferénsi",
        "prefs-labs": "Fitur Labs",
+       "prefs-user-pages": "Kaca pamaké",
        "prefs-personal": "Data pamaké",
        "prefs-rc": "Panémbong robahan anyar jeung tukung",
        "prefs-watchlist": "Awaskeuneun",
        "prefs-watchlist-days": "Jumlah poé anu ditémbongkeun dina daptar awaskeuneun:",
-       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "prefs-watchlist-days-max": "Panglilana $1 {{PLURAL:$1|poé|poé}}",
        "prefs-watchlist-edits": "Jumlah parobahan maksimum nu ditémbongkeun dina daptar panjang awaskeuneun:",
        "prefs-watchlist-edits-max": "Panglobana: 1000",
        "prefs-misc": "Pangaturan rupa-rupa",
        "prefs-email": "Pilihan surélék",
        "prefs-rendering": "Pidangan",
        "saveprefs": "Simpen préferénsi",
-       "restoreprefs": "Larapkeun setélan buhun",
+       "restoreprefs": "Larapkeun setélan buhun (sakabéh bab)",
        "prefs-editing": "Ukuran kotak téks",
        "rows": "Baris",
        "columns": "Kolom",
        "timezoneregion-indian": "Samudra Indonésia",
        "timezoneregion-pacific": "Samudra Pasifik",
        "allowemail": "Buka koropak pikeun nampa surélék ti nu séjén",
-       "prefs-searchoptions": "Piliheun Panéangan",
+       "prefs-searchoptions": "Paluruh",
        "prefs-namespaces": "Ngaranspasi",
        "default": "ti dituna",
        "prefs-files": "Koropak",
        "prefs-reset-intro": "Anjeun bisa maké ieu kaca pikeun mulangkeun préferénsi anjeun ka nu baku.\nMun geus anggeus teu bisa dibolaykeun.",
        "prefs-emailconfirm-label": "Konfirmasi surélék:",
        "youremail": "Surélék:",
-       "username": "Landihan:",
-       "prefs-memberingroups": "Anggota {{PLURAL:$1|jumplukan|jumplukan}}:",
+       "username": "{{GENDER:$1|Sandiasma}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Anggota}} {{PLURAL:$1|kelompok|kelompok}}:",
        "prefs-registration": "Waktu daptar:",
        "yourrealname": "Ngaran anjeun*",
        "yourlanguage": "Basa antarbeungeut",
        "badsig": "Parafna teu valid; pariksa tag HTML-na geura.",
        "badsiglength": "Tawis leungeun panjang teuing. Kuduna kurang ti $1 {{PLURAL:$1|karaktér|karaktér}}.",
        "yourgender": "Jenis kelamin:",
-       "gender-unknown": "Teu nyebutkeun",
-       "gender-male": "Lalaki",
-       "gender-female": "Awéwé",
+       "gender-unknown": "Moal béja-béja",
+       "gender-male": "Manéhna ngédit kaca wiki",
+       "gender-female": "Manéhna ngédit kaca wiki",
        "email": "Surélék",
        "prefs-help-realname": "* Ngaran asli (pilihan): mun anjeun milih ngeusian, bakal dipaké pikeun nandaan kontribusi anjeun.",
        "prefs-help-email": "Surélék sipatna pilihan, tapi diperlukeun pikeun nyetél ulang sandi lamun anjeun poho.",
        "prefs-signature": "Tandatangan",
        "prefs-dateformat": "Format titimangsa",
        "prefs-timeoffset": "Format waktu",
-       "prefs-advancedediting": "Pilihan lengkep",
+       "prefs-advancedediting": "Pilihan umum",
+       "prefs-editor": "Éditor",
+       "prefs-preview": "Pratayang",
        "prefs-advancedrc": "Pilihan lengkep",
        "prefs-advancedrendering": "Pilihan lengkep",
        "prefs-advancedsearchoptions": "Pilihan lengkep",
        "prefs-advancedwatchlist": "Pilihan lengkep",
        "prefs-displayrc": "Pilihan pidangan",
        "prefs-displaywatchlist": "Pilihan pidangan",
+       "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Béda",
        "email-address-validity-valid": "Alamat surélék sigana bener",
        "email-address-validity-invalid": "Asupkeun alamat ratron nu bener",
        "right-move": "Mindahkeun kaca",
        "right-move-subpages": "Pindahkeun kaca katut sakabéh subkacana",
        "right-move-rootuserpages": "Mindahkeun akar kaca kontributor",
+       "right-move-categorypages": "Pindahkeun kaca kategori",
        "right-movefile": "Mindahkeun berkas",
        "right-suppressredirect": "Henteu nyieun hiji alihan ti ngaran lila sabot mindahkeun kaca",
        "right-upload": "Muatkeun koropak",
        "right-browsearchive": "Sungsi kaca nu geus dihapus",
        "right-undelete": "Balikeun deui kaca",
        "right-suppressrevision": "Mariksa jeung mulangkeun révisi anu disumputkeun ti kuncén",
+       "right-viewsuppressed": "Témbongkeun révisi anu disumputkeun ti pamaké lianna",
        "right-suppressionlog": "Nempo log privat",
        "right-block": "Peungpeuk pamaké lain tina ngédit",
        "right-blockemail": "Halangan pamaké keur ngirim Surélék",
        "right-hideuser": "Peungpeuk pamaké, tong ditingalikeun ka nulain",
        "right-ipblock-exempt": "Narabas peungpeuk IP, peungpeuk-otomatis, jeung peungpeuk rentang",
        "right-proxyunbannable": "Abaikeun pengpeuk otomatis keur proxy",
-       "right-unblockself": "Muka peungpeuk ka dirina sorangan",
-       "right-protect": "Ngarobah hambalan konci jeung ngédit kaca anu dikonci",
-       "right-editprotected": "Ngédit kaca anu dikonci (tanpa ngarobah protéksi)",
+       "right-unblockself": "buka peungpeuk sorangan",
+       "right-protect": "Ngarobah hambalan protéksi jeung édit kaca anu dikonci",
+       "right-editprotected": "Edit kaca anu dikonci salaku \"{{int:protect-level-sysop}}\"",
        "right-editinterface": "Édit antarbenget pamaké",
        "right-editusercssjs": "Édit berkas CSS jeung JS pamaké séjén",
        "right-editusercss": "Édit berkas CSS pamaké séjén",
        "right-edituserjs": "Ngédit berkas JS pamaké séjén",
+       "right-viewmywatchlist": "Tempo awaskeuneun anjeun",
+       "right-viewmyprivateinfo": "Tempo data pribadi anjeun (alamat surélék, ngaran asli)",
+       "right-editmyprivateinfo": "Robah data pribadi anjeun (alamat surélék, ngaran asli)",
+       "right-editmyoptions": "Robah préferénsi anjeun",
        "right-import": "Ngimpor kaca ti wiki séjén",
        "right-importupload": "Ngimpor kaca tina hiji koropak nu dimuat",
        "right-patrol": "Nandaan éditan pamaké séjén minangka geus dipatroli",
        "action-createpage": "mitembeyan kaca anyar",
        "action-createtalk": "mitembeyan kaca obrolan",
        "action-createaccount": "nyieun rekening pamaké ieu",
+       "action-history": "tempo jujutan ieu kaca",
        "action-minoredit": "nandaan ieu éditan salaku minor",
        "action-move": "mindahkeun ieu kaca",
        "action-move-subpages": "mindahkeun ieu kaca katut bagian-bagianana",
        "action-move-rootuserpages": "mindahkeun kaca utama kontributor",
+       "action-move-categorypages": "pindahkeun kaca kategori",
        "action-movefile": "mindahkeun ieu berkas",
        "action-upload": "ngamuat ieu berkas",
        "action-reupload": "nimpah berkas nu geus aya ieu",
        "action-suppressionlog": "nempo ieu log pribadi",
        "action-block": "meungpeuk ieu pamaké tina ngédit",
        "action-protect": "ngarobah hambalan konci ieu kaca",
-       "action-import": "impor ieu kaca ti séjén wiki",
+       "action-import": "impor kaca ti wiki séjén",
        "action-patrol": "Nandaan éditan séjén minangka geus diroris",
        "action-autopatrol": "tandaan éditan anjeun salaku geus diroris",
        "action-unwatchedpages": "témbongkeun béréndélan kaca nu teu diawaskeun",
        "action-userrights-interwiki": "ngarobah hak pamaké di wiki lianna",
        "action-siteadmin": "ngonci atawa muka konci databés",
        "action-sendemail": "ngirim surélék",
+       "action-editmywatchlist": "robah awaskeuneun anjeun",
+       "action-viewmyprivateinfo": "tempo émbaran pribadi anjeun",
+       "action-editmyprivateinfo": "robah émbaran pribadi anjeun",
        "nchanges": "$1 {{PLURAL:$1|parobahan|parobahan}}",
+       "enhancedrc-history": "jujutan",
        "recentchanges": "Anyar robah",
        "recentchanges-legend": "Pilihan parobahan anyar",
        "recentchanges-summary": "Lacak parobahan ka wiki panganyarna na kaca ieu.",
        "recentchanges-label-minor": "Ieu éditan minor",
        "recentchanges-label-bot": "Ieu parobahan dijieun ku bot",
        "recentchanges-label-unpatrolled": "Ieu éditan can karoris",
+       "recentchanges-legend-heading": "'''Pedaran:'''",
        "recentchanges-legend-newpage": "$1 - kaca anyar",
        "rcnotefrom": "Di handap ieu parobahan saprak <b>$2</b> (nu ditémbongkeun nepi ka <b>$1</b>).",
        "rclistfrom": "Témbongkeun nu anyar robah nepi ka $3 $2",
        "rcshowhideminor": "$1 éditan minor",
+       "rcshowhideminor-show": "Témbongkeun",
+       "rcshowhideminor-hide": "Sumputkeun",
        "rcshowhidebots": "$1 bot",
-       "rcshowhideliu": "$1 kontributor nu asup log",
+       "rcshowhidebots-show": "Témbongkeun",
+       "rcshowhidebots-hide": "Sumputkeun",
+       "rcshowhideliu": "$1 pamaké kadaptar",
+       "rcshowhideliu-show": "Témbongkeun",
+       "rcshowhideliu-hide": "Sumputkeun",
        "rcshowhideanons": "$1 kontributor anonim",
+       "rcshowhideanons-show": "Témbongkeun",
+       "rcshowhideanons-hide": "Sumputkeun",
        "rcshowhidepatr": "$1 éditan karoris",
+       "rcshowhidepatr-show": "Témbongkeun",
+       "rcshowhidepatr-hide": "Sumputkeun",
        "rcshowhidemine": "$1 éditan kuring",
+       "rcshowhidemine-show": "Témbongkeun",
+       "rcshowhidemine-hide": "Sumputkeun",
        "rclinks": "Témbongkeun $1 parobahan ahir dina $2 poé ahir<br />$3",
        "diff": "béda",
        "hist": "juj",
        "newsectionsummary": "/* $1 */ bagean anyar",
        "rc-enhanced-expand": "Témbongkeun rincian (butuh JavaScript)",
        "rc-enhanced-hide": "Sumputkeun rincian",
+       "rc-old-title": "Mimitina dijieun salaku \"$1\"",
        "recentchangeslinked": "Parobahan nu patali",
        "recentchangeslinked-feed": "Parobahan nu patali",
        "recentchangeslinked-toolbox": "Parobahan nu patali",
        "recentchangeslinked-summary": "Ieu kaca husus ngabéréndélkeun parobahan anyar anu numbu ti kaca husus (atawa uesi katagori husus). Kaca anu [[Special:Watchlist|diawaskeun]] némbongan '''kandel'''.",
        "recentchangeslinked-page": "Ngaran kaca:",
        "recentchangeslinked-to": "Témbongkeun parobahan ka kaca-kaca nu ditumbukeun ka kaca nu dimaksud",
-       "upload": "Unggah berkas",
+       "upload": "Muat berkas",
        "uploadbtn": "Muatkeun koropak",
        "reuploaddesc": "Balik ka formulir muatan.",
        "uploadnologin": "Can asup log",
-       "uploadnologintext": "Anjeun kudu [[Special:UserLogin|asup log]] pikeun ngamuat koropak.",
+       "uploadnologintext": "Mangga $1 pikeun ngunggah berkas.",
        "upload_directory_read_only": "Diréktori muatan ($1) teu bisa ditulis ku server ramat.",
        "uploaderror": "Kasalahan muat",
        "upload-recreate-warning": "'''Awas: berkas nu ngaranna kitu geus kungsi dihapus atawa dipindahkeun.'''\n\nLog hahapus jeung pipindah pikeun ieu kaca dipidangkeun di handap:",
        "uploadwarning-text": "Ropéa pedaran berkas di handap terus cobaan deui.",
        "savefile": "Simpen koropak",
        "uploaddisabled": "Punten, ngamuat ayeuna ditumpurkeun.",
+       "copyuploaddisabled": "Unggahan dumasar URL ditumpurkeun.",
        "uploaddisabledtext": "Fungsi ngamuat koropak ditumpurkeun.",
        "uploadscripted": "Koropak ieu ngandung kode HTML atawa skrip nu bisa dibaca ngaco ku panyungsi ramat (''web browser'').",
        "uploadvirus": "Koropakna ngandung virus! Katrangan: $1",
        "lockmanager-fail-db-release": "Teu bisa ngaleupaskeun konci dina databés $1.",
        "lockmanager-fail-svr-release": "Teu bisa ngaleupaskeun konci dina server $1.",
        "zip-wrong-format": "Berkas anu dipilih lain berkas ZIP.",
+       "img-auth-accessdenied": "Aksés ditolak",
        "img-auth-nofile": "Berkas \"$1\" henteu aya.",
        "img-auth-noread": "Pamaké teu boga kawenangan maca \"$1\".",
        "http-invalid-url": "URL teu bener: $1",
        "license": "Lisénsi:",
        "license-header": "Lisénsi",
        "nolicense": "Taya nu dipilih",
+       "licenses-edit": "Robah pilihan lisénsi",
        "license-nopreview": "(euweuh pramidang)",
        "upload_source_url": "(URL nu sohéh sarta bisa dibuka ku umum)",
        "upload_source_file": " (koropak dina komputer salira)",
+       "listfiles-delete": "hapus",
+       "listfiles-summary": "Ieu kaca husus némbongkeun sakabéh berkas anu geus diunggah.",
        "listfiles_search_for": "Sungsi ngaran média:",
-       "imgfile": "koropak",
+       "imgfile": "Berkas",
        "listfiles": "Daptar gambar",
        "listfiles_date": "Titimangsa",
        "listfiles_name": "Ngaran",
        "listfiles_size": "Badagna",
        "listfiles_description": "Pedaran",
        "listfiles_count": "Vérsi",
+       "listfiles-latestversion": "Vérsi ayeuna",
+       "listfiles-latestversion-yes": "Enya",
+       "listfiles-latestversion-no": "Henteu",
        "file-anchor-link": "Gambar",
        "filehist": "Sajarah gambar",
        "filehist-help": "Klik dina titimangsa pikeun nempo koropak nu aya dina mangsa éta.",
        "filedelete-reason-otherlist": "Alesan séjén",
        "filedelete-reason-dropdown": "*Alesan nu ilahar\n** Ngarumpak hak cipta\n** Koropak geus aya",
        "filedelete-edit-reasonlist": "Alesan ngahapus éditan",
+       "filedelete-maintenance-title": "Henteu bisa ngahapus berkas",
        "mimesearch": "Sungsi MIME",
        "mimesearch-summary": "Ieu kaca bisa dipaké nyaring koropak dumasar tipeu MIME-na. Asupan: contenttype/subtype, contona <code>image/jpeg</code>.",
        "mimetype": "Tipeu MIME:",
        "unusedtemplateswlh": "tumbu lianna",
        "randompage": "Kaca acak",
        "randompage-nopages": "Euweuh kaca dina ieu spasi ngaran \"$1\".",
+       "randomincategory-category": "Kategori:",
        "randomredirect": "Alihan acak",
        "randomredirect-nopages": "Euweuh alihan dina ieu spasi ngaran \"$1\".",
        "statistics": "Statistik",
        "statistics-users-active": "Pamaké getol",
        "statistics-users-active-desc": "Kontributor nu ngoprék salila {{PLURAL:$1|poé|$1 poé}} panungtung",
        "statistics-mostpopular": "Kaca nu pangmindengna dibuka",
+       "pageswithprop-submit": "Jung",
        "doubleredirects": "Alihan ganda",
        "doubleredirectstext": "Ieu kaca ngabéréndélkeun kaca-kaca alihan ka kaca alihan lianna. Unggal baris ngandung tutumbu ka alihan kahiji jeung kadua, ogé tujul alihan kadua anu biasana tujul kaca anu \"bener\", anu sakuduna dituju ku alihan kahiji. Ëntri nu <del>dicorét</del> geus diropéa.",
        "double-redirect-fixed-move": "[[$1]] geus pindah, dialihkeun ka [[$2]].",
        "fewestrevisions": "Artikel nu pangjarangna dirévisi",
        "nbytes": "$1 {{PLURAL:$1|bait|bait}}",
        "ncategories": "$1 {{PLURAL:$1|kategori|kategori}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwiki}}",
        "nlinks": "$1 {{PLURAL:$1|tumbu|tumbu}}",
        "nmembers": "$1 {{PLURAL:$1|kontributor|kontributor}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|anggota|anggota}}",
        "nrevisions": "$1 {{PLURAL:$1|révisi|révisi}}",
        "nviews": "$1 {{PLURAL:$1|témbongan|témbongan}}",
        "nimagelinks": "Dipaké di $1 {{PLURAL:$1|kaca|kaca}}",
        "protectedpages": "Kaca-kaca nu dikonci",
        "protectedpages-indef": "Ngan pikeun panangtayungan kalawan waktu nuteu kawates",
        "protectedpagesempty": "Dina danget ieu, teu aya kaca nu dikonci dumasar kana ieu paraméter.",
+       "protectedpages-timestamp": "Cap titimangsa",
+       "protectedpages-page": "Kaca",
+       "protectedpages-expiry": "Kadaluwarsa",
+       "protectedpages-params": "Paraméter protéksi",
+       "protectedpages-reason": "Alesan",
+       "protectedpages-unknown-timestamp": "Teu kanyahoan",
+       "protectedpages-unknown-performer": "Pamaké henteu dipikawanoh",
        "protectedtitles": "Judul nu dikonci",
        "protectedtitlesempty": "Dina danget ieu, euweuh judul nu keur dikonci tina paraméter-paraméter éta.",
        "listusers": "Daptar pamaké",
        "querypage-disabled": "Ieu kaca husus ditumpurkeun ku alesan kinerja.",
        "booksources": "Sumber pustaka",
        "booksources-search-legend": "Sungsi sumber buku",
-       "booksources-go": "Jung",
        "booksources-text": "Di handap ieu ngabéréndélkeun tumbu ka loka-loka nu ngical buku, boh nu anyar atawa loakan, nu sugan uninga kana buku anu nuju dipilari:",
        "booksources-invalid-isbn": "ISBN-na sigana henteu bener; pariksa deui bisi aya salah salin ti sumber aslina.",
        "specialloguserlabel": "Pamaké:",
-       "speciallogtitlelabel": "Judul:",
+       "speciallogtitlelabel": "Sasaran (judul atawa pamaké):",
        "log": "Log",
        "all-logs-page": "Sakabéh log umum",
        "alllogstext": "Béréndélan sakabéh log nu aya di {{SITENAME}}.\nBisa dipondokkeun ku cara milih tipe log, ngaran pamaké, atawa kaca nu dimaksud.",
        "emailuser": "Surélékan pamaké ieu",
        "emailpage": "Surélékan pamaké",
        "emailpagetext": "Anjeun bisa maké formulir di handap pikeun ngirim surélék ka ieu pamaké.\nAlamat surélék nu diasupkeun kana [[Special:Preferences|préferénsi pamaké anjeun]] bakal katémbong salaku alamat \"Ti\" dina surélékna, sahingga nu dituju bisa males langsung.",
-       "defemailsubject": "Surélék {{SITENAME}}",
+       "defemailsubject": "Surélék {{SITENAME}} ti pamaké \"$1\"",
        "usermaildisabled": "Surélék kontributor ditumpurkeun",
        "usermaildisabledtext": "Anjeun teu bisa ngirim surélék ka kontributor séjén di ieu wiki",
        "noemailtitle": "Teu aya alamat surélék",
        "noemailtext": "Ieu pamaké ieu teu méré alamat surélék nu sah.",
        "nowikiemailtext": "Ieu kontributor milih teu nampa surélék ti kontributor séjén.",
+       "emailnotarget": "Sandiasma panarima henteu valid atawa henteu aya.",
+       "emailtarget": "ASupkeun sandiasma panarima",
        "emailusername": "Sandiasma:",
        "emailusernamesubmit": "Kirim",
        "email-legend": "Kirim surélék ka kontributor {{SITENAME}} lianna",
        "emailsent": "Surélék geus dikirim",
        "emailsenttext": "Surélék anjeun geus dikirim.",
        "emailuserfooter": "Ieu surélék dikirim ku $1 ka $2 migunakeun fungsi \"Surélékan pamaké ieu\" di {{SITENAME}}.",
+       "usermessage-summary": "Ninggalkeun talatah sistem.",
        "watchlist": "Awaskeuneun",
        "mywatchlist": "Awaskeuneun",
        "watchlistfor2": "Pikeun $1 $2",
        "nowatchlist": "Anjeun teu boga awaskeuneun.",
-       "watchlistanontext": "Mangga $1 pikeun némbongkeun atawa ngarobah béréndélan awaskeuneun anjeun.",
+       "watchlistanontext": "Mangga asup log pikeun nempo atawa ngarobah béréndélan awaskeuneun anjeun.",
        "watchnologin": "Can asup log",
        "addedwatchtext": "Kaca \"[[:$1]]\" geus ditambahkeun ka [[Special:Watchlist|awaskeuneun]] anjeun.\nJaga, parobahan na kaca ieu katut kaca obrolanana bakal dibéréndélkeun di dinya, sarta kacana bakal katémbong '''dikandelan''' dina kaca [[Special:RecentChanges|Nu anyar robah]] sangkan leuwih gampang ngawaskeunana.\n\n<p>Mun jaga anjeun moal deui ngawaskeun parobahan na kaca éta, klik tumbu \"Eureun ngawaskeun\" na lajursisi.",
+       "removewatch": "Piceun tina béréndélan awaskeuneun",
        "removedwatchtext": "Kaca \"[[:$1]]\" geus dikaluarkeun tina [[Special:Watchlist|daptar awaskeuneun]] anjeun.",
+       "removedwatchtext-short": "Kaca \"$1\" geus dipiceun tina béréndélan awaskeuneun.",
        "watch": "awaskeun",
        "watchthispage": "Awaskeun kaca ieu",
        "unwatch": "Eureun ngawaskeun",
        "unwatchthispage": "Eureun ngawaskeun",
        "notanarticle": "Sanés kaca eusi",
        "notvisiblerev": "Révisi geus dihapus",
-       "watchlist-details": "Aya {{PLURAL:$1|$1 kaca|$1 kaca}} nu ku anjeun diawaskeun, teu kaasup kaca obrolan/sawala.",
+       "watchlist-details": "Aya {{PLURAL:$1|$1 kaca|$1 kaca}} dina béréndélan awaskeuneun, teu kaasup kaca obrolan/sawala.",
        "wlheader-enotif": "Pangémbar surélék difungsikeun.",
        "wlheader-showupdated": "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
        "wlnote": "Di handap ieu mangrupa $1 {{PLURAL:$1|robahan|robahan}} ahir salila '''$2''' jam.",
-       "wlshowlast": "Témbongkeun $1 jam $2 poé $3 ahir",
+       "wlshowlast": "Témbongkeun $1 jam $2 poé  ahir",
        "watchlist-options": "Pilihan awaskeuneun",
        "watching": "Ngawaskeun...",
        "unwatching": "Eureun ngawaskeun...",
        "enotif_reset": "Tandaan sadaya kaca nu geus dilongok",
        "enotif_impersonal_salutation": "Pamaké {{SITENAME}}",
+       "enotif_subject_deleted": "Kaca {{SITENAME}} $1 geus {{GENDER:$2|dihapus}} ku $2",
        "enotif_lastvisited": "Tempo $1 pikeun sadaya parobahan ti saprak anjeun ninggalkeun ieu kaca.",
        "enotif_lastdiff": "Buka $1 pikeun nempo ieu parobahan.",
        "enotif_anon_editor": "pamaké anonim $1",
        "protect-level-sysop": "Ngan bisa ku kuncén",
        "protect-summary-cascade": "ngaruntuykeun",
        "protect-expiring": "kadaluwarsa $1",
+       "protect-expiring-local": "kadaluwarsa $1",
        "protect-expiry-indefinite": "tanpa wates",
        "protect-cascade": "Konci kaca nu kawengku dina ieu kaca (pangonci ngaruntuy).",
        "protect-cantedit": "Anjeung teu wenang ngarobah hambalan ngonci ieu kaca.",
        "protect-othertime": "Séjén waktu",
+       "protect-othertime-op": "séjén waktu",
        "protect-existing-expiry": "Waktu mungkas nu aya: $3, $2",
+       "protect-existing-expiry-infinity": "Waktu kadaluwarsa nu aya: taya wates",
        "protect-otherreason": "Alesan panambah/lianna:",
        "protect-otherreason-op": "Alesan séjén",
        "protect-dropdown": "*Alesan ngonci nu ilahar\n** Vandalismeu kamalinaan\n** Spamming kamalinaan\n** Perang éditan\n** Kaca loba pisan diédit",
        "undeleteviewlink": "tempo",
        "undeletecomment": "Alesan:",
        "undeletedrevisions": "$1 {{PLURAL:$1|révisi|révisi}} disimpen deui",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 révisi|$1 révisi}} jeung {{PLURAL:$2|1 koropak|$2 koropak}} geus dipulangkeun",
-       "undeletedfiles": "$1 {{PLURAL:$1|koropak}} dibalikeun",
+       "undeletedrevisions-files": "{{PLURAL:$1|1 révisi|$1 révisi}} jeung {{PLURAL:$2|1 berkas|$2 berkas}} geus dibalikkeun",
+       "undeletedfiles": "{{PLURAL:$1|1 berkas|$1 berkas}} dibalikkeun",
        "cannotundelete": "Gagal ngabolaykeun hapusan; sigana kapiheulaan ngabolaykeun hapusan ku nu séjén.",
        "undeletedpage": "'''$1 hasil dibalikeun'''\n\nTempo [[Special:Log/delete|log hapusan]] keur data ngahapus jeung malikeun.",
        "undelete-header": "Tempo [[Special:Log/delete|log hapusan]] pikeun béréndélan kaca nu anyar dihapus.",
        "undelete-search-prefix": "Témbongkeun kaca dimimitian ku",
        "undelete-search-submit": "Téang",
        "undelete-no-results": "Euweuh kaca nu cocog dina arsip hapusan.",
-       "undelete-filename-mismatch": "Teu bisa ngabolaykeun hapusan révisi koropak nu titimangsana $1: ngaran teu cocog.",
-       "undelete-bad-store-key": "Teu bisa ngabolaykeun hapusan révisi koropak nu titimangsana $1: leungit méméh dihapus.",
-       "undelete-cleanup-error": "Éror ngahapus koropak arsip \"$1\" nu teu kapaké.",
-       "undelete-missing-filearchive": "Gagal mulangkeun arsip koropak ID $1 kusabab teu kapanggih dina pangkalan data. Bisa jadi éta koropak bolay dihapus.",
+       "undelete-filename-mismatch": "Hanteu bisa ngabolaykeun hapusan révisi berkas titimangsa $1: ngaran berkas teu cocog.",
+       "undelete-bad-store-key": "Hanteu bisa ngabolaykeun hapusan révisi berkas titimangsa $1: Berkas leungit méméh dihapus.",
+       "undelete-cleanup-error": "Éror ngahapus berkas arsip \"$1\" anu teu kapaké.",
+       "undelete-missing-filearchive": "Hanteu bisa mulangkeun arsip berkas ID $1 kusabab teu kapanggih dina pangkalan data. Bisa jadi éta koropak bolay dihapus.",
        "undelete-error-short": "Éror ngabolaykeun hapusan: $1",
        "undelete-error-long": "Aya éror nalika ngabolaykeun hapusan:\n\n$1",
        "undelete-show-file-submit": "Enya",
        "contributions": "Kontribusi ti kontributor",
        "contributions-title": "Sumbangan tulisan ti $1",
        "mycontris": "Kontribusi",
-       "contribsub2": "Pikeun $1 ($2)",
+       "contribsub2": "Pikeun {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Akun pamaké \"$1\" teu aya dina daptar.",
        "nocontribs": "Taya robahan nu kapanggih cocog jeung patokan ieu.",
-       "uctop": "(pangluhurna)",
+       "uctop": "(ayeuna)",
        "month": "Ti bulan (jeung saméméhna):",
        "year": "Ti taun (jeung saméméhna):",
        "sp-contributions-newbies": "Témbongkeun kontribusi ti akun anyar wungkul",
        "unblocklink": "buka blokir",
        "change-blocklink": "Robah status blokir",
        "contribslink": "kontribusi",
+       "emaillink": "kirim surélék",
        "autoblocker": "Otomatis dipeungpeuk kusabab alamat IP anjeun dipaké ku \"[[User:$1|$1]]\".\nAlesan: \"$2\"",
        "blocklogpage": "Log_peungpeuk",
        "blocklog-showlog": "Ieu pamaké saméméhna geus kungsi dipeungpeuk.\nPikeun rujukan, logna dipidangkeun di handap ieu:",
        "immobile-source-page": "Ieu kaca teu bisa dipindahkeun.",
        "immobile-target-page": "Teu bisa mindahkeun ka judul nu ditujul.",
        "imagenocrossnamespace": "Teu bisa mindahkeun gambar ka rohangan ngaran nu lain gambar",
-       "imagetypemismatch": "Éksténsi koropak anyar teu cocog jeung tipena",
-       "imageinvalidfilename": "Ngaran koropak tujuan teu sah",
+       "imagetypemismatch": "Éksténsi berkas anyar teu cocog jeung tipena",
+       "imageinvalidfilename": "Ngaran berkas tujuan teu sah",
        "fix-double-redirects": "Hadéan sakabéh alihan ganda nu mungkin kajadian",
        "protectedpagemovewarning": "'''Awas:''' ieu kaca geus dikonci sarta ngan bisa dipindahkeun ku pamaké nu boga kawenangan kuncén.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
        "semiprotectedpagemovewarning": "'''Awas:''' ieu kaca geus dikonci sarta ukur bisa dipindahkeun ku pamaké nu geus asup log.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
        "export-addcattext": "Tambahkeun kaca tina kategori:",
        "export-addcat": "Tambahkeun",
        "export-addns": "Tambahkeun",
-       "export-download": "Simpen dina koropak",
+       "export-download": "Simpen salaku berkas",
        "export-templates": "Kaasup citakan",
        "allmessages": "Talatah sistim",
        "allmessagesname": "Ngaran",
        "allmessages-language": "Basa:",
        "allmessages-filter-submit": "Jung",
        "thumbnail-more": "Gedéan",
-       "filemissing": "Koropak leungit",
+       "filemissing": "Berkas leungit",
        "thumbnail_error": "Kasalahan sawaktu nyieun gambar leutik (thumbnail): $1",
        "djvu_page_error": "Kaca DjVu teu kawadahan",
-       "djvu_no_xml": "XML keur koropak DjVu teu bisa dicokot",
+       "djvu_no_xml": "Hanteu bisa nyokot XML pikeun berkas DjVu",
        "thumbnail_invalid_params": "Kasalahan paraméter miniatur",
        "thumbnail_dest_directory": "Diréktori nu dituju teu bisa dijieun",
        "thumbnail_image-type": "Jenis gambar teu dirojong",
        "import": "Impor kaca",
        "importinterwiki": "Impor transwiki",
        "import-interwiki-text": "Pilih wiki jeung judul kaca nu rék diimpor.\nTanggal révisi katut ngaran nu ngédit bakal dipertahankeun.\nSadaya aktivitas impor transwiki baris kacatet dina [[Special:Log/import|log impor]].",
-       "import-interwiki-source": "Wiki/kaca sumber:",
+       "import-interwiki-sourcewiki": "Wiki sumber:",
+       "import-interwiki-sourcepage": "Kaca sumber:",
        "import-interwiki-history": "Salin sakabéh vérsi jujutan pikeun ieu kaca",
        "import-interwiki-templates": "Kaasup sakabéh citakan",
        "import-interwiki-submit": "Impor",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|vérsi heubeul}}",
        "import-logentry-interwiki": "$1 geus ditranswikikeun",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|vérsi heubel}} ti $2",
+       "javascripttest": "Nguji JavaScript",
        "tooltip-pt-userpage": "Kaca kontributor Anjeun",
        "tooltip-pt-anonuserpage": "Kaca pamaké pikeun IP nu ku anjeun keur diédit",
        "tooltip-pt-mytalk": "Kaca obrolan Anjeun",
        "tooltip-pt-anontalk": "Sawala ngeunaan éditan ti alamat IP ieu",
-       "tooltip-pt-preferences": "Préferénsi kuring",
+       "tooltip-pt-preferences": "Préferénsi anjeun",
        "tooltip-pt-watchlist": "Daptar kaca nu diawaskeun ku anjeun parobahanana.",
        "tooltip-pt-mycontris": "Daptar tulisan Anjeun",
        "tooltip-pt-login": "Leuwih hadé asup log, sanajan teu wajib",
        "spamprotectiontitle": "Saringan spam",
        "spamprotectiontext": "Kaca nu rék disimpen dipeungpeuk ku saringan spam.\nSigana mah ieu téh alatan tumbu ka loka luar.",
        "pageinfo-title": "Émbaran pikeun \"$1\"",
-       "pageinfo-header-edits": "Éditan",
+       "pageinfo-header-basic": "Émbaran dasar",
+       "pageinfo-header-edits": "Jujutan édit",
+       "pageinfo-header-restrictions": "Protéksi kaca",
        "pageinfo-watchers": "Jumlah nu ngawaskeun",
        "pageinfo-edits": "Jumlah éditan",
        "pageinfo-authors": "Jumlah kontributor nu béda",
+       "pageinfo-contentpage-yes": "Enya",
+       "pageinfo-protect-cascading-yes": "Enya",
        "markaspatrolleddiff": "Tandaan salaku geus diriksa",
        "markaspatrolledtext": "Tandaan artikel ieu salaku geus diriksa",
        "markedaspatrolled": "Tandaan salaku geus diriksa",
        "ilsubmit": "Sungsi",
        "bydate": "dumasar titimangsa",
        "sp-newimages-showfrom": "Témbongkeun gambar anyar ti $2, $1",
+       "sunday-at": "Minggu jam $1",
        "bad_image_list": "Formatna kieu:\n\nNgan daptar butiran (baris anu dimimitian ku tanda *) anu diitung. \nTutumbu kahiji dina hiji baris dianggap numbu ka berkas anu goréng. \nTutumbu sanggeusna dina baris anu sarua dianggap bener, nyaéta artikel anu midangkeun éta berkas.",
        "metadata": "Métadata",
        "metadata-help": "Ieu koropak ngandung émbaran tambahan, nu sigana asalna tina kaméra digital atawa paminday nu dipaké pikeun ngadigitalkeunana. Mun ieu koropak geus dirobah tina bentuk aslina, datana bisa jadi teu bener.",
        "exif-iimcategory-spo": "Olahraga",
        "exif-iimcategory-wea": "Cuaca",
        "exif-urgency-normal": "Normal ($1)",
-       "watchlistall2": "sadaya",
        "namespacesall": "kabéh",
        "monthsall": "kabéh",
        "confirmemail": "Konfirmasi alamat surélék",
        "revdelete-restricted": "akses geus dibatesan ukur keur kuncén",
        "revdelete-unrestricted": "Watesan akses kuncén dihapuskeun",
        "rightsnone": "(euweuh)",
+       "revdelete-summary": "ringkesan ngédit",
        "feedback-subject": "Ngeunaan:",
        "feedback-message": "Surat:",
        "feedback-cancel": "Bolay",
index d4aa3c9..3b186d9 100644 (file)
                        "WikiPhoenix",
                        "לערי ריינהארט",
                        "아라",
-                       "Abbedabb"
+                       "Abbedabb",
+                       "Platinawolf"
                ]
        },
        "tog-underline": "Stryk under länkar:",
-       "tog-hideminor": "Visa inte mindre redigeringar i senaste ändringar",
+       "tog-hideminor": "Dölj mindre redigeringar i senaste ändringar",
        "tog-hidepatrolled": "Dölj patrullerade redigeringar i senaste ändringar",
-       "tog-newpageshidepatrolled": "Göm patrullerade sidor från listan över nya sidor",
+       "tog-newpageshidepatrolled": "Dölj patrullerade sidor i listan över nya sidor",
        "tog-extendwatchlist": "Utöka bevakningslistan till att visa alla ändringar, inte bara den senaste",
        "tog-usenewrc": "Gruppera ändringar efter sida i senaste ändringar och bevakningslistan",
        "tog-numberheadings": "Automatisk numrerade rubriker",
@@ -75,7 +76,7 @@
        "tog-watchdefault": "Lägg till sidor och filer jag redigerar i min bevakningslista",
        "tog-watchmoves": "Lägg till sidor och filer jag flyttar i min bevakningslista",
        "tog-watchdeletion": "Lägg till sidor och filer jag raderar i min bevakningslista",
-       "tog-watchrollback": "Lägg till sidor som jag har utfört en tillbakarullning på i min övervakningslista",
+       "tog-watchrollback": "Lägg till sidor där jag har utfört en tillbakarullning till min övervakningslista",
        "tog-minordefault": "Markera automatiskt ändringar som mindre",
        "tog-previewontop": "Visa förhandsgranskningen ovanför redigeringsrutan",
        "tog-previewonfirst": "Visa förhandsgranskning vid första redigeringen",
        "tog-enotifrevealaddr": "Visa min e-postadress i e-postmeddelanden om ändringar som skickas till andra",
        "tog-shownumberswatching": "Visa antalet användare som bevakar",
        "tog-oldsig": "Nuvarande signatur:",
-       "tog-fancysig": " signatur som wikitext (utan en automatisk länk)",
+       "tog-fancysig": "Behandla signatur som wikitext (utan en automatisk länk)",
        "tog-uselivepreview": "Använd direktuppdaterad förhandsgranskning (experimentell)",
        "tog-forceeditsummary": "Påminn mig om jag inte fyller i en redigeringskommentar",
-       "tog-watchlisthideown": "Visa inte mina redigeringar i bevakningslistan",
+       "tog-watchlisthideown": "Dölj mina redigeringar i bevakningslistan",
        "tog-watchlisthidebots": "Visa inte robotredigeringar i bevakningslistan",
-       "tog-watchlisthideminor": "Visa inte mindre ändringar i bevakningslistan",
+       "tog-watchlisthideminor": "Dölj mindre ändringar i bevakningslistan",
        "tog-watchlisthideliu": "Visa inte redigeringar av inloggade användare i bevakningslistan",
-       "tog-watchlisthideanons": "Visa inte redigeringar av anonyma användare i bevakningslistan",
-       "tog-watchlisthidepatrolled": "Göm patrullerade redigeringar från bevakningslistan",
+       "tog-watchlisthideanons": "Dölj redigeringar av anonyma användare i bevakningslistan",
+       "tog-watchlisthidepatrolled": "Dölj patrullerade redigeringar i bevakningslistan",
        "tog-ccmeonemails": "Skicka kopior till mig av e-post jag skickar till andra användare",
        "tog-diffonly": "Visa inte sidinnehåll under diffar",
        "tog-showhiddencats": "Visa dolda kategorier",
        "editfont-style": "Typsnitt i redigeringsrutan:",
        "editfont-default": "Webbläsarens standard",
        "editfont-monospace": "Fast bredd",
-       "editfont-sansserif": "Sans-serif",
-       "editfont-serif": "Serif",
+       "editfont-sansserif": "Sans-serif-teckensnitt",
+       "editfont-serif": "Serif-teckensnitt",
        "sunday": "söndag",
        "monday": "måndag",
        "tuesday": "tisdag",
        "category-article-count": "{{PLURAL:$2|Denna kategori innehåller endast följande sida.|Följande {{PLURAL:$1|sida|$1 sidor}} (av totalt $2) finns i denna kategori.}}",
        "category-article-count-limited": "Följande {{PLURAL:$1|sida|$1 sidor}} finns i den här kategorin.",
        "category-file-count": "{{PLURAL:$2|Denna kategori innehåller endast följande fil.|Följande {{PLURAL:$1|fil|$1 filer}} (av totalt $2) finns i denna kategori.}}",
-       "category-file-count-limited": "Följande {{PLURAL:$1|fil |$1 filer}} finns i den här kategorin.",
+       "category-file-count-limited": "Följande {{PLURAL:$1|fil|$1 filer}} finns i den aktuella kategorin.",
        "listingcontinuesabbrev": "forts.",
        "index-category": "Indexerade sidor",
        "noindex-category": "Icke-indexerade sidor",
        "cancel": "Avbryt",
        "moredotdotdot": "Mer...",
        "morenotlisted": "Denna lista är inte fullständig.",
-       "mypage": "Min sida",
+       "mypage": "Sida",
        "mytalk": "Diskussion",
        "anontalk": "Diskussionssida för denna IP-adress",
        "navigation": "Navigering",
        "searchbutton": "Sök",
        "go": "Gå till",
        "searcharticle": "Gå till",
-       "history": "Versionshistorik",
+       "history": "Sidhistorik",
        "history_short": "Historik",
        "updatedmarker": "uppdaterad sedan senaste besöket",
        "printableversion": "Utskriftsvänlig version",
        "otherlanguages": "På andra språk",
        "redirectedfrom": "(Omdirigerad från $1)",
        "redirectpagesub": "Omdirigeringssida",
+       "redirectto": "Omdirigering till:",
        "lastmodifiedat": "Sidan ändrades senast den $1 kl. $2.",
        "viewcount": "Den här sidan har visats {{PLURAL:$1|en gång|$1 gånger}}.",
        "protectedpage": "Skrivskyddad sida",
        "editsectionhint": "Redigera avsnitt: $1",
        "toc": "Innehåll",
        "showtoc": "visa",
-       "hidetoc": "göm",
+       "hidetoc": "dölj",
        "collapsible-collapse": "Dölj",
        "collapsible-expand": "Visa",
        "confirmable-confirm": "Är {{GENDER:$1|du}} säker?",
        "viewsource": "Visa wikitext",
        "viewsource-title": "Visa källa för $1",
        "actionthrottled": "Åtgärden stoppades",
-       "actionthrottledtext": "Som skydd mot spam, finns det en begränsning av hur många gånger du kan utföra den här åtgärden under en viss tid. Du har överskridit den gränsen. Försök igen om några minuter.",
+       "actionthrottledtext": "Som skydd mot spam finns det en begränsning av hur många gånger du kan utföra den här åtgärden under en viss tid. Du har överskridit den gränsen. Försök igen om några minuter.",
        "protectedpagetext": "Den här sidan har skrivskyddats för att förhindra redigering eller andra åtgärder.",
        "viewsourcetext": "Du kan se och kopiera denna sidas källtext:",
        "viewyourtext": "Du kan se och kopiera källan för '''dina redigeringar''' av denna sida:",
        "protectedinterface": "Denna sida innehåller text för mjukvarans gränssnitt på denna wiki, och är skrivskyddad för att förebygga missbruk.\nFör att lägga till eller ändra översättningar för alla wikis, var god använd [//translatewiki.net/ translatewiki.net], lokaliseringsprojektet för MediaWiki.",
-       "editinginterface": "'''Varning:''' Du redigerar en sida som används för texten i gränssnittet.\nÄndringar på denna sida kommer att påverka gränssnittets utseende för alla användare på denna wiki.\nFör att lägga till eller ändra översättningar för alla wikis, var god använd [//translatewiki.net/ translatewiki.net], översättningsprojektet för MediaWiki.",
+       "editinginterface": "<strong>Varning:</strong> Du redigerar en sida som används för texten i gränssnittet.\nÄndringar på denna sida kommer att påverka användargränssnittets utseende för andra användare på denna wiki.\nFör att lägga till eller ändra översättningar för alla wikis, var god använd [//translatewiki.net/ translatewiki.net], översättningsprojektet för MediaWiki.",
        "cascadeprotected": "Den här sidan har skyddats från redigering eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som skrivskyddats med \"kaskaderande skydd\":\n$2",
        "namespaceprotected": "Du har inte behörighet att redigera sidor i namnrymden '''$1'''.",
        "customcssprotected": "Du har inte behörighet att redigera denna CSS-sida eftersom den innehåller en annan användares personliga inställningar.",
        "virus-badscanner": "Dålig konfigurering: okänd virusskanner: ''$1''",
        "virus-scanfailed": "skanning misslyckades (kod $1)",
        "virus-unknownscanner": "okänt antivirusprogram:",
-       "logouttext": "'''Du är nu utloggad.'''\n\nObservera att det, tills du tömmer din webbläsares cache, på vissa sidor kan se ut som att du fortfarande är inloggad.",
+       "logouttext": "<strong>Du är nu utloggad.</strong>\n\nObservera att det, tills du tömmer din webbläsares cache, på vissa sidor kan det se ut som att du fortfarande är inloggad.",
        "welcomeuser": "Välkommen, $1!",
-       "welcomecreation-msg": "Ditt konto har skapats.\nGlöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].",
+       "welcomecreation-msg": "Ditt konto har skapats.\nDu kan justera dina [[Special:Preferences|{{SITENAME}}-inställningar]] om du vill.",
        "yourname": "Användarnamn:",
        "userlogin-yourname": "Användarnamn",
        "userlogin-yourname-ph": "Ange ditt användarnamn",
        "loginerror": "Inloggningsproblem",
        "createacct-error": "Fel när konto skulle skapas",
        "createaccounterror": "Kunde inte skapa konto: $1",
-       "nocookiesnew": "Användarkontot skapades, men du är inte inloggad.\n{{SITENAME}} använder kakor för att logga in användare.\nDu har kakor inaktiverade.\nAktivera dem, och logga sen in med ditt nya användarnamn och lösenord.",
+       "nocookiesnew": "Användarkontot skapades, men du är inte inloggad.\n{{SITENAME}} använder kakor för att logga in användare.\nDu har kakor inaktiverade.\nAktivera dem, och logga sedan in med ditt nya användarnamn och lösenord.",
        "nocookieslogin": "{{SITENAME}} använder kakor för att logga in användare. Du har stängt av kakor i din webbläsare. Försök igen med stöd för kakor aktiverat.",
        "nocookiesfornew": "Användarkontot skapades inte, eftersom vi inte kunde bekräfta dess källa.\nSe till att du har aktiverat kakor, ladda om denna sida och försök igen.",
        "noname": "Du har angett ett ogiltigt användarnamn.",
        "createaccount-text": "Någon har skapat ett konto åt din e-postadress på {{SITENAME}} ($4) med namnet \"$2\" och lösenordet \"$3\". Du bör nu logga in och ändra ditt lösenord.\n\nDu kan ignorera detta meddelande om kontot skapats av misstag.",
        "login-throttled": "Du har gjort för många misslyckade inloggningsförsök.\nVänta $1 innan du försöker igen.",
        "login-abort-generic": "Din inloggning misslyckades - Avbröts",
+       "login-migrated-generic": "Dit konto har migrerats och ditt användarnamn existerar inte längre på denna wiki.",
        "loginlanguagelabel": "Språk: $1",
        "suspicious-userlogout": "Din begäran om att logga ut nekades eftersom det ser ut som det skickades av en trasig webbläsare eller cachande proxy.",
-       "createacct-another-realname-tip": "Riktiga namnet är valfritt.\nOm du väljer att ange det, kommer det användas för att tillskriva användaren för sitt arbete.",
+       "createacct-another-realname-tip": "Riktigt namn behöver inte anges.\nOm du väljer att ange det, kommer det att användas för att tillskriva dig ditt arbete.",
        "pt-login": "Logga in",
        "pt-login-button": "Logga in",
        "pt-createaccount": "Skapa konto",
        "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-header": "Ändra kontots 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-no-info": "Du måste vara inloggad för att komma åt den här sidan direkt.",
        "changeemail-oldemail": "Nuvarande e-postadress:",
        "changeemail-none": "(ingen)",
        "changeemail-password": "Ditt lösenord till {{SITENAME}}:",
        "changeemail-submit": "Ändra e-post",
-       "changeemail-cancel": "Avbryt",
        "changeemail-throttled": "Du har gjort för många inloggningsförsök.\nVänta $1 innan du försöker igen.",
        "resettokens": "Återställ nycklar",
        "resettokens-text": "Du kan återställa nycklar som tillåter åtkomst till vissa privata uppgifter som är associerade till ditt konto här.\n\nDu bör återställa om du av misstag delade dem med någon eller om ditt konto har äventyrats.",
        "showpreview": "Visa förhandsgranskning",
        "showdiff": "Visa ändringar",
        "blankarticle": "<strong>Varning:</strong> Sidan du skapar är tom.\nOm du klickar på \"{{int:savearticle}}\" igen kommer sidan skapas utan något innehåll.",
-       "anoneditwarning": "'''Varning:''' Du är inte inloggad.\nDin IP-adress kommer att sparas i historiken för den här sidan.",
+       "anoneditwarning": "<strong>Varning:</strong> Du är inte inloggad. Din IP-adress kommer att vara publikt synlig om du gör några redigeringar. Om du <strong>[$1 loggar in]</strong> eller <strong>[$2 skapar ett konto]</strong> kommer dina redigeringar att tillskrivas ditt användarnamn, tillsammans med andra fördelar.",
        "anonpreviewwarning": "''Du är inte inloggad. Om du sparar kommer din IP-adress registreras på denna sidas redigeringshistorik.''",
-       "missingsummary": "'''Påminnelse:''' Du har inte skrivit någon redigeringskommentar.\nOm du klickar på \"{{int:savearticle}}\" igen, kommer din redigering att sparas utan en sådan.",
+       "missingsummary": "<strong>Påminnelse:</strong> Du har inte skrivit någon redigeringskommentar.\nOm du klickar på \"{{int:savearticle}}\" igen kommer din redigering att sparas utan en sådan.",
        "missingcommenttext": "Var god och skriv in en kommentar nedan.",
-       "missingcommentheader": "'''Påminnelse:''' Du har inte skrivit något ämne/rubrik för den här kommentaren.\nOm du trycker på \"{{int:savearticle}}\" igen, kommer din redigering sparas utan rubrik.",
+       "missingcommentheader": "<strong>Påminnelse:</strong> Du har inte skrivit något ämne/rubrik för den här kommentaren.\nOm du trycker på \"{{int:savearticle}}\" igen kommer din redigering sparas utan rubrik.",
        "summary-preview": "Förhandsgranskning av sammanfattning:",
        "subject-preview": "Rubrikförhandsgranskning:",
        "blockedtitle": "Användaren är blockerad",
        "blockedtext": "'''Din IP-adress eller ditt användarnamn är blockerat.'''\n\nBlockeringen utfördes av $1 med motiveringen: ''$2''.\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6.\n* Blockeringen var avsedd för: $7.\n\nDu kan kontakta $1 eller någon annan av [[{{MediaWiki:Grouppage-sysop}}|administratörerna]] för att diskutera blockeringen.\nOm du är inloggad och har uppgivit en e-postadress i dina [[Special:Preferences|inställningar]] så kan du använda funktionen 'Skicka e-post till den här användaren', såvida du inte blivit blockerad från funktionen.\n\nDin IP-adress är $3 och blockerings-ID är #$5.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "autoblockedtext": "Din IP-adress har blockerats automatiskt eftersom den har använts av en annan användare som blockerats av $1.\nMotiveringen av blockeringen var:\n\n:''$2''\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6\n* Blockeringen är avsedd för: $7\n\nDu kan kontakta $1 eller någon annan [[{{MediaWiki:Grouppage-sysop}}|administratör]] för att diskutera blockeringen.\n\nObservera att du inte kan använda dig av funktionen \"skicka e-post till användare\" om du inte har registrerat en giltig e-postadress i [[Special:Preferences|dina inställningar]] eller om du har blivit blockerad från att skicka e-post.\n\nDin nuvarande IP-adress är $3, och blockerings-ID är #$5.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "blockednoreason": "ingen motivering angavs",
-       "whitelistedittext": "Du måste $1 för att kunna redigera sidor.",
+       "whitelistedittext": "Vänligen $1 för att redigera sidor.",
        "confirmedittext": "Du måste bekräfta din e-postadress innan du kan redigera sidor. Var vänlig ställ in och validera din e-postadress genom dina [[Special:Preferences|användarinställningar]].",
        "nosuchsectiontitle": "Kan inte hitta avsnitt",
        "nosuchsectiontext": "Du försökte redigera ett avsnitt som inte finns.\nDet kan ha flyttats eller raderats medan du tittade på sidan.",
        "previewconflict": "Den här förhandsvisningen är resultatet av den\nredigerbara texten ovanför,\nså som det kommer att se ut om du väljer att spara.",
        "session_fail_preview": "'''Vi kunde inte behandla din redigering eftersom sessionsdata gått förlorad.\nVar god försök igen.\nOm det fortfarande inte fungerar, prova att [[Special:UserLogout|logga ut]] och logga in igen.'''",
        "session_fail_preview_html": "'''Vi kunde inte behandla din redigering eftersom sessionsdata gått förlorad.'''\n\n''Eftersom {{SITENAME}} har aktiverat rå HTML, så döljs förhandsvisningen som en förebyggande säkerhetsåtgärd mot JavaScript-attacker.''\n\n'''Om detta är ett försök att göra en rättmätig redigering, så försök igen.\nOm det fortfarande inte fungerar, pröva att [[Special:UserLogout|logga ut]] och logga in igen.'''",
-       "token_suffix_mismatch": "'''Din redigering har stoppats eftersom din klient har ändrat tecknen\ni redigeringens \"edit token\". Redigeringen stoppades för att förhindra att sidtexten skadas.\nDetta händer ibland om du använder buggiga webbaserade anonyma proxytjänster.'''",
+       "token_suffix_mismatch": "'''Din redigering har stoppats eftersom din klient har ändrat tecknen\ni redigerings-nyckeln. Redigeringen stoppades för att förhindra att sidtexten skadas.\nDetta händer ibland om du använder buggiga webbaserade anonyma proxytjänster.'''",
        "edit_form_incomplete": "'''Vissa delar av redigeringen kunde inte nå servern, dubbelkolla att dina ändringar är intakta och försök igen.'''",
        "editing": "Redigerar $1",
        "creating": "Skapar $1",
        "rev-suppressed-unhide-diff": "En av versionerna för denna diff har blivit '''undanhållen'''.\nDet kan finnas detaljer i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} undanhållandeloggen].\nDu kan fortfarande [$1 se denna diff] om du önskar fortsätta.",
        "rev-deleted-diff-view": "En av sidversionerna i denna diff har '''raderats'''.\nDu kan se denna diff; mer information kan finnas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
        "rev-suppressed-diff-view": "En av versionerna för denna diff har blivit '''undanhållen'''.\nDu kan se denna diff; detaljer kan finnas i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} undanhållandeloggen].",
-       "rev-delundel": "visa/göm",
+       "rev-delundel": "ändra synlighet",
        "rev-showdeleted": "visa",
        "revisiondelete": "Ta bort/återställ versioner",
        "revdelete-nooldid-title": "Ogiltig målversion",
-       "revdelete-nooldid-text": "Antingen har du inte angivit någon sidversion att utföra funktionen på,\neller så finns inte den version du angav,\neller så försöker du gömma den senaste versionen av sidan.",
+       "revdelete-nooldid-text": "Antingen har du inte angivit någon sidversion att utföra funktionen på, eller så finns inte den version du angav,\neller så försöker du dölja den senaste versionen av sidan.",
        "revdelete-no-file": "Den specificerade filen finns inte.",
        "revdelete-show-file-confirm": "Är du säker på att du vill visa en raderad version av filen \"<nowiki>$1</nowiki>\" från den $2 klockan $3?",
        "revdelete-show-file-submit": "Ja",
        "searchall": "alla",
        "showingresults": "Nedan visas upp till {{PLURAL:$1|'''1''' post|'''$1''' poster}} från och med nummer '''$2'''.",
        "showingresultsinrange": "Nedan visas upp till {{PLURAL:$3|<strong>1</strong> resultat|<strong>$1</strong> resultat}} mellan nummer <strong>$2</strong> och nummer <strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} för '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> av <strong>$3</strong>|Resultat <strong>$1 – $2</strong> av <strong>$3</strong>}}",
        "search-nonefound": "Inga resultat matchade frågan.",
        "powersearch-legend": "Avancerad sökning",
        "powersearch-ns": "Sök i namnrymderna:",
        "prefs-namespaces": "Namnrymder",
        "default": "ursprungsinställning",
        "prefs-files": "Filer",
-       "prefs-custom-css": "personlig CSS",
-       "prefs-custom-js": "personlig JavaScript",
+       "prefs-custom-css": "Personlig CSS",
+       "prefs-custom-js": "Personligt JavaScript",
        "prefs-common-css-js": "Delad CSS/JS för alla utseenden:",
        "prefs-reset-intro": "Du kan använda den här sidan till att återställa dina inställningar till webbplatsens standardinställningar.\nDetta kan inte återställas.",
        "prefs-emailconfirm-label": "E-postbekräftelse:",
        "prefs-tokenwatchlist": "Nyckel",
        "prefs-diffs": "Skillnader",
        "prefs-help-prefershttps": "Ändringar av denna inställning börjar gälla nästa gång du loggar in",
+       "prefswarning-warning": "Du har gjort ändringar i dina inställningarna som inte har sparats ännu.\nOm du lämnar denna sida utan att klicka på \"$1\" kommer dina inställningar inte att uppdateras.",
        "prefs-tabs-navigation-hint": "Tips: Du kan använda vänster och höger piltangenterna för att navigera mellan flikarna i listan flikar.",
        "email-address-validity-valid": "E-postadress ser giltig ut",
        "email-address-validity-invalid": "Ange en giltig e-postadress",
        "right-suppressionlog": "Se privata loggar",
        "right-block": "Blockera andra användare från att redigera",
        "right-blockemail": "Blockera användare från att skicka e-post",
-       "right-hideuser": "Blockera användarnamn och dölja det från blockeringsloggen",
+       "right-hideuser": "Blockera ett användarnamn och dölja det från allmänheten",
        "right-ipblock-exempt": "Kan redigera från blockerade IP-adresser",
        "right-proxyunbannable": "Kan redigera från blockerade proxyer",
        "right-unblockself": "Avblockera sig själv",
        "right-patrol": "Markera ändringar som patrullerade",
        "right-autopatrol": "Får automatiskt sina ändringar markerade som patrullerade",
        "right-patrolmarks": "Se markeringar av opatrullerade ändringar i senaste ändringarna",
-       "right-unwatchedpages": "Se listan över obevakade sidor",
+       "right-unwatchedpages": "Se en lista över obevakade sidor",
        "right-mergehistory": "Sammanfoga sidhistoriker",
-       "right-userrights": "Ändra alla användarrättigheter",
-       "right-userrights-interwiki": "Ändra rättigheter för användare på andra wikier",
-       "right-siteadmin": "Låsa och låsa upp databasen",
+       "right-userrights": "Redigera alla användarrättigheter",
+       "right-userrights-interwiki": "Redigera användarrättigheterna på andra wikier",
+       "right-siteadmin": "Lås och öppna databasen",
        "right-override-export-depth": "Exportera sidor inklusive länkade sidor till ett djup på 5",
        "right-sendemail": "Skicka e-post till andra användare",
        "right-passwordreset": "Visa e-postmeddelanden med lösenordsåterställning",
        "newuserlogpage": "Logg över nya användare",
-       "newuserlogpagetext": "Detta är en logg över skapade användarkonton.",
+       "newuserlogpagetext": "Detta är en logg över nya användarkonton.",
        "rightslog": "Användarrättighetslogg",
        "rightslogtext": "Detta är en logg över ändringar av användares rättigheter.",
        "action-read": "läsa denna sida",
        "action-suppressionlog": "se denna privata logg",
        "action-block": "blockera denna användare från redigering",
        "action-protect": "ändra skyddsnivå för denna sida",
-       "action-rollback": "snabbt rulla tillbaka ändringarna gjorda av den användare som senast redigerade en viss sida",
+       "action-rollback": "rulla snabbt tillbaka ändringarna gjorda av den användare som senast redigerade en viss sida",
        "action-import": "importera sidor från en annan wiki",
        "action-importupload": "importera sidor från en filuppladdning",
        "action-patrol": "märka annans redigering som patrullerad",
        "recentchanges-legend-heading": "'''Teckenförklaring:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se även [[Special:NewPages|listan över nya sidor]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Nedan visas {{PLURAL:$5|ändringar|ändringen}} sedan <strong>$3, $4</strong> (upp till <strong>$1</strong> ändringar visas).",
+       "rcnotefrom": "Nedan visas {{PLURAL:$5|ändringen|ändringar}} sedan <strong>$3, $4</strong> (upp till <strong>$1</strong> ändringar visas).",
        "rclistfrom": "Visa ändringar från och med $3 $2",
        "rcshowhideminor": "$1 mindre ändringar",
        "rcshowhideminor-show": "Visa",
        "rclinks": "Visa senaste $1 ändringar under de senaste $2 dygnen<br />$3",
        "diff": "skillnad",
        "hist": "historik",
-       "hide": "Göm",
+       "hide": "Dölj",
        "show": "Visa",
        "minoreditletter": "m",
        "newpageletter": "N",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte}} efter ändring",
        "newsectionsummary": "/* $1 */ nytt avsnitt",
        "rc-enhanced-expand": "Visa detaljer",
-       "rc-enhanced-hide": "Göm detaljer",
+       "rc-enhanced-hide": "Dölj detaljer",
        "rc-old-title": "skapades ursprungligen som \"$1\"",
        "recentchangeslinked": "Relaterade ändringar",
        "recentchangeslinked-feed": "Relaterade ändringar",
        "randomincategory": "Slumpsida i kategori",
        "randomincategory-invalidcategory": "\"$1\" är inte ett giltigt kategorinamn.",
        "randomincategory-nopages": "Det finns inga sidor i kategorin [[:Category:$1]].",
-       "randomincategory-selectcategory": "Få slumpsida från kategori: $1 $2.",
-       "randomincategory-selectcategory-submit": "Gå",
+       "randomincategory-category": "Kategori:",
+       "randomincategory-legend": "Slumpsida i kategori",
        "randomredirect": "Slumpmässig omdirigering",
        "randomredirect-nopages": "Det finns inte några omdirigeringar i namnrymden \"$1\".",
        "statistics": "Statistik",
        "protectedpages-timestamp": "Tidsstämpel",
        "protectedpages-page": "Sida",
        "protectedpages-expiry": "Upphör",
-       "protectedpages-performer": "Skyddar användare",
+       "protectedpages-performer": "Skyddande användare",
        "protectedpages-params": "Skyddsparametrar",
        "protectedpages-reason": "Anledning",
        "protectedpages-unknown-timestamp": "Okänd",
        "querypage-disabled": "Den här specialsidan är inaktiverad av prestandaskäl.",
        "booksources": "Bokkällor",
        "booksources-search-legend": "Sök efter bokkällor",
-       "booksources-go": "Visa",
+       "booksources-search": "Sök",
        "booksources-text": "Nedan följer en lista över länkar till webbplatser som säljer nya och begagnade böcker, och som kanske har ytterligare information om de böcker du söker.",
        "booksources-invalid-isbn": "Det angivna ISBN-numret verkar inte vara giltigt. Kontrollera källan för eventuella fel.",
        "specialloguserlabel": "Utförare:",
        "allpagesprefix": "Visa sidor med prefixet:",
        "allpagesbadtitle": "Den angivna sidtiteln var ogiltig eller innehöll ett prefix för annan språkversion eller ett interwiki-prefix.\nDen kan innehålla en eller fler tecken som inte är tillåtna i titlar.",
        "allpages-bad-ns": "Namnrymden \"$1\" finns inte på {{SITENAME}}.",
-       "allpages-hide-redirects": "Göm omdirigeringar",
+       "allpages-hide-redirects": "Dölj omdirigeringar",
        "cachedspecial-viewing-cached-ttl": "Du visar en cachad version av denna sida, som kan vara upp till $1 gammal.",
        "cachedspecial-viewing-cached-ts": "Du visar en cachad version av denna sida, som kanske inte är helt aktuell.",
        "cachedspecial-refresh-now": "Visa senaste.",
        "wlheader-enotif": "E-postmeddelanden är aktiverade.",
        "wlheader-showupdated": "Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
        "wlnote": "Nedan finns {{PLURAL:$1|den senaste ändringen|de senaste <strong>$1</strong> ändringarna}} under {{PLURAL:$2|den senaste timmen|de senaste <strong>$2</strong> timmarna}} från den $3 kl. $4.",
-       "wlshowlast": "Visa senaste $1 timmarna $2 dygnen $3",
+       "wlshowlast": "Visa senaste $1 timmarna $2 dygnen",
        "watchlist-options": "Alternativ för bevakningslistan",
        "watching": "Bevakar...",
        "unwatching": "Avbevakar...",
        "exbeforeblank": "innehåll före tömning var: \"$1\"",
        "delete-confirm": "Radera \"$1\"",
        "delete-legend": "Radera",
-       "historywarning": "'''Varning:''' Sidan du håller på att radera har en historik med ungefär $1 {{PLURAL:$1|version|versioner}}:",
+       "historywarning": "<strong>Varning:</strong> Sidan du håller på att radera har en historik med ungefär $1 {{PLURAL:$1|version|versioner}}:",
        "confirmdeletetext": "Du håller på att ta bort en sida med hela dess historik.\nBekräfta att du förstår vad du håller på med och vilka konsekvenser detta leder till, och att du följer [[{{MediaWiki:Policy-url}}|riktlinjerna]].",
        "actioncomplete": "Genomfört",
        "actionfailed": "Handlingen misslyckades",
        "delete-edit-reasonlist": "Redigera anledningar för radering",
        "delete-toobig": "Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Borttagning av sådana sidor har begränsats för att förhindra oavsiktliga driftstörningar på {{SITENAME}}.",
        "delete-warning-toobig": "Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Att radera sidan kan skapa problem med hanteringen av databasen på {{SITENAME}}; var försiktig.",
-       "delete-cantedit": "Du kan inte ta radera denna sida eftersom du inte har behörighet att redigera den.",
+       "deleteprotected": "Du kan inte radera denna sida eftersom den är skyddad.",
        "deleting-backlinks-warning": "'''Varning:'''\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Andra sidor]] länkar till eller inkluderar sidan som du är på väg att radera.",
        "rollback": "Rulla tillbaka ändringar",
        "rollback_short": "Tillbakarullning",
        "protect-othertime": "Annan tidsperiod:",
        "protect-othertime-op": "annan tidsperiod",
        "protect-existing-expiry": "Gällande varaktighet: $2, kl. $3",
+       "protect-existing-expiry-infinity": "Gällande varaktighet: oändlig",
        "protect-otherreason": "Annan/ytterligare anledning:",
        "protect-otherreason-op": "Annan anledning",
        "protect-dropdown": "*Vanliga anledningar för skrivskydd\n** Upprepad vandalisering\n** Upprepad spam\n** Redigeringskrig\n** Sida med många besökare",
        "blockipsuccesssub": "Blockeringen är utförd",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] har blockerats.<br />\nFör att se alla aktuella blockeringar, gå till [[Special:BlockList|listan över blockeringar]].",
        "ipb-blockingself": "Du håller på att blockera dig själv! Är du säker på att du vill göra det?",
-       "ipb-confirmhideuser": "Du är på väg att blockera en användare med \"göm användare\" aktiverat. Detta kommer upphäva användarens namn i alla listor och loggar. Är du säker på att du vill göra det?",
+       "ipb-confirmhideuser": "Du är på väg att blockera en användare med \"dölj användare\" aktiverat. Detta kommer upphäva användarens namn i alla listor och loggar. Är du säker på att du vill göra det?",
        "ipb-confirmaction": "Markera fältet \"{{int:ipb-confirm}}\" längst ned om du är säker på att du verkligen vill göra det.",
        "ipb-edit-dropdown": "Redigera blockeringsanledningar",
        "ipb-unblock-addr": "Ta bort blockering av $1",
        "unblocked": "Blockeringen av [[User:$1|$1]] har hävts",
        "unblocked-range": "$1 har avblockerats",
        "unblocked-id": "Blockeringen $1 har hävts",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] har avblockerats.",
        "blocklist": "Blockerade användare",
        "ipblocklist": "Blockerade användare",
        "ipblocklist-legend": "Sök efter en blockerad användare",
-       "blocklist-userblocks": "Göm kontoblockeringar",
+       "blocklist-userblocks": "Dölj kontoblockeringar",
        "blocklist-tempblocks": "Dölj tillfälliga blockeringar",
-       "blocklist-addressblocks": "Göm enskilda IP-blockeringar",
-       "blocklist-rangeblocks": "Göm intervallblockeringar",
+       "blocklist-addressblocks": "Dölj enskilda IP-blockeringar",
+       "blocklist-rangeblocks": "Dölj intervallblockeringar",
        "blocklist-timestamp": "Tidsstämpel",
        "blocklist-target": "Mål",
        "blocklist-expiry": "Upphör",
        "autoblocker": "Automatisk blockerad eftersom din IP-adress nyligen använts av \"[[User:$1|$1]]\".\nMotiveringen som angavs för blockeringen av $1 var: \"$2\".",
        "blocklogpage": "Blockeringslogg",
        "blocklog-showlog": "Denna användare har blivit blockerad tidigare.\nBlockeringsloggen är tillgänglig nedan som referens:",
-       "blocklog-showsuppresslog": "Denna användare har tidigare blivit blockerad och gömd.\nUndanhållandeloggen visas nedan för referens:",
+       "blocklog-showsuppresslog": "Denna användare har tidigare blivit blockerad och dold.\nUndanhållandeloggen visas nedan för referens:",
        "blocklogentry": "blockerade [[$1]] med blockeringstid på $2 $3",
        "reblock-logentry": "ändrade blockeringsinställningar för [[$1]] med en varaktighet på $2 $3",
        "blocklogtext": "Detta är en logg över blockeringar och avblockeringar.\nAutomatiskt blockerade IP-adresser listas ej.\nSe [[Special:BlockList|blockeringslistan]] för en översikt av gällande blockeringar.",
        "block-log-flags-noemail": "e-post blockerad",
        "block-log-flags-nousertalk": "kan inte redigera sin diskussionssida",
        "block-log-flags-angry-autoblock": "utökad automatblockering aktiverad",
-       "block-log-flags-hiddenname": "användarnamn gömt",
+       "block-log-flags-hiddenname": "användarnamn dolt",
        "range_block_disabled": "Möjligheten för administratörer att blockera intervall av IP-adresser har stängts av.",
        "ipb_expiry_invalid": "Ogiltig varaktighetstid.",
        "ipb_expiry_temp": "För att dölja användarnamnet måste blockeringen vara permanent.",
        "sorbsreason": "Din IP-adress är listad som öppen proxy i den DNSBL {{SITENAME}} använder.",
        "sorbs_create_account_reason": "Din IP-adress är listad som en öppen proxy i den DNSBL som används av {{SITENAME}}.\nDu får inte skapa ett användarkonto",
        "xffblockreason": "En IP-adress i sidhuvudet X-Forwarded-For, antingen din adress eller en proxyserver som du använder, har blockerats. Den ursprungliga anledningen till blockeringen var: $1",
-       "cant-see-hidden-user": "Användaren du försöker blockera är redan blockerad och gömd. Eftersom du inte har hideuser-rättigheter, kan du inte se eller redigera användarens blockering.",
+       "cant-see-hidden-user": "Användaren du försöker blockera är redan blockerad och dold. Eftersom du inte har hideuser-rättigheter, kan du inte se eller redigera användarens blockering.",
        "ipbblocked": "Du kan inte blockera eller avblockera andra användare, eftersom du själv är blockerad",
        "ipbnounblockself": "Du har inte tillåtelse att avblockera dig själv",
        "lockdb": "Lås databas",
        "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:",
        "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 ebn 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.",
+       "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]].",
        "movenotallowed": "Du har inte behörighet att flytta sidor på den här wikin.",
        "movenotallowedfile": "Du har inte tillåtelse att flytta filer.",
        "import": "Importera sidor",
        "importinterwiki": "Transwiki-import",
        "import-interwiki-text": "Välj en wiki och sidtitel att importera.\nVersionshistorik (datum och redaktörer) kommer att bevaras.\nAll överföring mellan wikier (transwiki) listas i  [[Special:Log/import|importloggen]].",
-       "import-interwiki-source": "Källwiki/sida:",
+       "import-interwiki-sourcewiki": "Källwiki:",
+       "import-interwiki-sourcepage": "Källsida:",
        "import-interwiki-history": "Kopiera hela versionshistoriken för denna sida",
        "import-interwiki-templates": "Inkludera alla mallar",
        "import-interwiki-submit": "Importera",
        "tooltip-recreate": "Återskapa sidan fast den har tagits bort",
        "tooltip-upload": "Starta uppladdning",
        "tooltip-rollback": "\"Tillbakarullning\" tar med en knapptryckning bort ändringar som gjorts av den som senast redigerade sidan",
-       "tooltip-undo": "\"Gör ogjord\" återställer denna redigering och öppnar redigeringsrutan med förhandsgranskning.\nDen ger möjlighet att skriva en motivering i redigeringssammanfattningen.",
+       "tooltip-undo": "\"Gör ogjord\" återställer denna redigering och öppnar redigeringsrutan med förhandsgranskning. Det ger möjlighet att skriva en motivering i redigeringssammanfattningen.",
        "tooltip-preferences-save": "Spara inställningar",
        "tooltip-summary": "Skriv en kort sammanfattning",
        "interlanguage-link-title": "$1 - $2",
        "metadata-help": "Den här filen innehåller extrainformation som troligen lades till av en digitalkamera eller skanner när filen skapades. Om filen har modifierats kan det hända att vissa detaljer inte överensstämmer med den modifierade filen.",
        "metadata-expand": "Visa utökade detaljer",
        "metadata-collapse": "Dölj utökade detaljer",
-       "metadata-fields": "Bildens metadata-fält som är listad i detta meddelande kommer att finnas på bildsidan när metadata-tabellen är hopfälld.\nAndra kommer att gömmas 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",
+       "metadata-fields": "Bildens metadata-fält som är listad i detta meddelande kommer att finnas på bildsidan när metadata-tabellen är hopfälld.\nAndra kommer att döljas 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-imagewidth": "Bredd",
        "exif-imagelength": "Höjd",
        "exif-bitspersample": "Bitar per komponent",
        "exif-urgency-low": "Låg ($1)",
        "exif-urgency-high": "Hög ($1)",
        "exif-urgency-other": "Användardefinierad prioritet ($1)",
-       "watchlistall2": "alla",
        "namespacesall": "alla",
        "monthsall": "alla",
        "confirmemail": "Bekräfta e-postadress",
        "logentry-delete-revision": "$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ändrade}} synligheten för logghändelser på $3",
        "logentry-delete-revision-legacy": "$1 {{GENDER:$2|ändrade}} synligheten för versioner på sidan $3",
-       "logentry-suppress-delete": "$1 {{GENDER:$2|gömde}} sidan $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|dolde}} sidan $3",
        "logentry-suppress-event": "$1 {{GENDER:$2|ändrade}} i hemlighet synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4",
        "logentry-suppress-revision": "$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för logghändelser på $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|laddade upp}} en ny version av $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|laddade upp}} $3",
        "rightsnone": "(inga)",
+       "revdelete-summary": "sammanfattning",
        "feedback-bugornote": "Om du är redo att beskriva ett tekniskt problem detaljerat, var god [$1 rapporterar en bugg].\nAnnars kan du använda det enkla formuläret nedan. Din kommentar kommer att läggas till på sidan \"[$3 $2]\", tillsammans med ditt användarnamn och vilken webbläsare du använder.",
        "feedback-subject": "Ämne:",
        "feedback-message": "Meddelande:",
        "searchsuggest-search": "Sök",
        "searchsuggest-containing": "innehåller...",
        "api-error-badaccess-groups": "Du får inte ladda upp filer till denna wiki.",
-       "api-error-badtoken": "Internt fel: felaktig token.",
+       "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.",
        "log-name-pagelang": "Språkändringslogg",
        "log-description-pagelang": "Detta är en logg över ändringar i sidspråken.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ändrade}} sidspråket för $3 från $4 till $5.",
-       "default-skin-not-found": "Ojsan! Standardutseendet för din wiki (<code>$wgDefaultSkin</code>), <code>$1</code>, är inte tillgängligt.\n\nDin installation verkar innehålla följande utseenden. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manualen: Utseendeinställningar] för information om hur dessa aktiveras och hur standard väljs.\n\n$2\n\n; Om du precis installerat MediaWiki:\n: Du installerade troligen från git, eller direkt från källkoden via någon annan metod. Detta är att förvänta. Försök att installera några utseenden från [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org:s utseendekatalog], genom att:\n:* Ladda ner [https://www.mediawiki.org/wiki/Download tarball-installeraren], som kommer med flera utseenden och tillägg. Du kan klipp-och-klistra in <code>skins/</code>-katalogen från den.\n:* Klona ett av <code>mediawiki/skins/*</code>-centralförvaren in i <code>skins/</code>-katalogen i din MediaWiki-installation.\n: Att göra detta borde inte påverka ditt git-centralförvar om du är en MediaWiki-utvecklare.\n\n; Om du precis har uppgraderat MediaWiki:\n: MediaWiki 1.24 och nyare aktiverar ej längre automatiskt utseenden (se [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Automatisk identifiering av utseenden]). Du kan klistra in följande rader i <code>LocalSettings.php</code> för att aktivera alla för närvarande installerade utseenden:\n\n<pre>$3</pre>\n\n; Om du precis har ändrat i <code>LocalSettings.php</code>:\n: Dubbelkolla namnen för utseendena för att identifiera stavfel.",
-       "default-skin-not-found-no-skins": "Ojsan! Standardutseendet för din wiki (<code>$wgDefaultSkin</code>), <code>$1</code>, är inte tillgängligt.\n\nDu har inga installerade utseenden.\n\n; Om du precis installerat eller uppdaterat MediaWiki:\n: Du installerade troligen från git, eller direkt från källkoden via någon annan metod. Detta är att förvänta. MediaWiki 1.24 och nyare inkluderar inte några utseenden i det huvudsakliga centralförvaret. Försök att installera några utseenden från [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org:s utseendekatalog], genom att:\n:* Ladda ner [https://www.mediawiki.org/wiki/Download tarball-installeraren], som kommer med flera utseenden och tillägg. Du kan klipp-och-klistra in <code>skins/</code>-katalogen från den.\n* Klona ett av <code>mediawiki/skins/*</code>-centralförvaren in i <code>skins/</code>-katalogen i din MediaWiki-installation.\n: Att göra detta borde inte påverka ditt git-centralförvar om du är en MediaWiki-utvecklare. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manualen: Utseendeinställningar] för information om hur utseenden aktiveras och hur standardutseendet väljs.",
+       "default-skin-not-found": "Ojsan! Standardutseendet för din wiki, definierad i <code dir=\"ltr\">$wgDefaultSkin</code> som <code>$1</code>, är inte tillgängligt.\n\nDin installation verkar innehålla följande utseenden. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manualen: Utseendeinställningar] för information om hur dessa aktiveras och hur standard väljs.\n\n$2\n\n; Om du precis installerat MediaWiki:\n: Du installerade troligen från git, eller direkt från källkoden via någon annan metod. Detta är att förvänta. Försök att installera några utseenden från [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org:s utseendekatalog], genom att:\n:* Ladda ner [https://www.mediawiki.org/wiki/Download tarball-installeraren], som kommer med flera utseenden och tillägg. Du kan klipp-och-klistra in <code>skins/</code>-katalogen från den.\n:* Klona ett av <code>mediawiki/skins/*</code>-centralförvaren in i <code dir=\"ltr\">skins/</code>-katalogen i din MediaWiki-installation.\n: Att göra detta borde inte påverka ditt git-centralförvar om du är en MediaWiki-utvecklare.\n\n; Om du precis har uppgraderat MediaWiki:\n: MediaWiki 1.24 och nyare aktiverar ej längre automatiskt utseenden (se [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Automatisk identifiering av utseenden]). Du kan klistra in följande rader i <code>LocalSettings.php</code> för att aktivera alla för närvarande installerade utseenden:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Om du precis har ändrat i <code>LocalSettings.php</code>:\n: Dubbelkolla namnen för utseendena för att identifiera stavfel.",
+       "default-skin-not-found-no-skins": "Ojsan! Standardutseendet för din wiki, definierad i <code>$wgDefaultSkin</code> som <code>$1</code>, är inte tillgängligt.\n\nDu har inga installerade utseenden.\n\n; Om du precis installerat eller uppdaterat MediaWiki:\n: Du installerade troligen från git, eller direkt från källkoden via någon annan metod. Detta är att förvänta. MediaWiki 1.24 och nyare inkluderar inte några utseenden i det huvudsakliga centralförvaret. Försök att installera några utseenden från [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org:s utseendekatalog], genom att:\n:* Ladda ner [https://www.mediawiki.org/wiki/Download tarball-installeraren], som kommer med flera utseenden och tillägg. Du kan klipp-och-klistra in <code dir=\"ltr\">skins/</code>-katalogen från den.\n* Klona ett av <code>mediawiki/skins/*</code>-centralförvaren in i <code>skins/</code>-katalogen i din MediaWiki-installation.\n: Att göra detta borde inte påverka ditt git-centralförvar om du är en MediaWiki-utvecklare. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manualen: Utseendeinställningar] för information om hur utseenden aktiveras och hur standardutseendet väljs.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiverad)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''inaktiverad''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''inaktiverad''')",
+       "mediastatistics": "Mediastatistik",
+       "mediastatistics-summary": "Statistik om uppladdade filtyper. Detta inkluderar bara den senaste versionen av en fil. Äldre eller raderade filversioner exkluderas.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-typ",
+       "mediastatistics-table-extensions": "Möjliga tillägg",
+       "mediastatistics-table-count": "Antal filer",
+       "mediastatistics-table-totalbytes": "Kombinerad storlek",
+       "mediastatistics-header-unknown": "Okänd",
+       "mediastatistics-header-bitmap": "Bitmap-bilder",
+       "mediastatistics-header-drawing": "Teckningar (vektorbilder)",
+       "mediastatistics-header-audio": "Ljud",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-multimedia": "Rik media",
+       "mediastatistics-header-office": "Dokument",
+       "mediastatistics-header-text": "Text",
+       "mediastatistics-header-executable": "Körbara filer",
+       "mediastatistics-header-archive": "Komprimerade format",
+       "json-warn-trailing-comma": "$1 avslutande {{PLURAL:$1|kommatecken}} togs bort från JSON",
+       "json-error-unknown": "Det var ett problem med JSON. Fel: $1",
+       "json-error-depth": "Listans maximala djup har överskridits",
+       "json-error-state-mismatch": "Ogiltig eller felaktig JSON",
+       "json-error-ctrl-char": "Kontrollteckenfel, möjligen felaktigt kodad",
+       "json-error-syntax": "Syntaxfel",
+       "json-error-utf8": "Felaktiga UTF-8-tecken, möjligen felkodade",
+       "json-error-recursion": "En eller flera rekursiva referenser i värde som ska kodas",
+       "json-error-inf-or-nan": "En eller flera NAN- eller INF-värden i värdet som ska kodas",
+       "json-error-unsupported-type": "Ett värde av en typ som inte kan kodas angavs"
 }
index 47803e2..113f13c 100644 (file)
        "passwordreset-emailsent-capture": "Barua pepe ya ukukumbusho imetumwa, ambayo inaonekana hapo chini.",
        "passwordreset-emailerror-capture": "Barua pepe ya ukukumbusho imetengenezwa, ambayo inaonekana hapo chini, lakini kuituma kwa mtumiaji imeshindikana: $1",
        "changeemail": "Badilisha anwani ya barua pepe",
-       "changeemail-header": "Badilisha anwani ya barua pepe ya akaunti yako",
        "changeemail-text": "Jaza fomu hii ili kubadilisha anwani yako ya barua pepe. Itabidi uingize neno lako la siri ili kukamilisha badiliko hili.",
        "changeemail-no-info": "Lazima uwe umeingia ili kuweza kutumia kurasa hii moja kwa moja.",
        "changeemail-oldemail": "Anwani ya barua pepe ya sasa:",
        "changeemail-none": "(hakuna)",
        "changeemail-password": "Neno lako la siri kuingia {{SITENAME}}:",
        "changeemail-submit": "Badilisha anwani ya barua pepe",
-       "changeemail-cancel": "Batilisha",
        "bold_sample": "Maandishi ya kooze",
        "bold_tip": "Kukoozesha maandishi",
        "italic_sample": "Matini ya italiki",
        "searchrelated": "zingine zinazofanana",
        "searchall": "zote",
        "showingresults": "{{PLURAL:$1|Tokeo '''1''' linaonyeshwa|matokeo '''$1''' yanaonyeshwa}} chini, kuanzia na namba '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Tokeo '''$1''' kati ya jumla ya '''$3'''|Matokeo '''$1 - $2''' kati ya jumla ya '''$3'''}} kutokana na kuitafuta '''$4'''",
        "search-nonefound": "Hakuna matokeo ya kutafuta ulizio ule.",
        "powersearch-legend": "Tafuta kwa hali ya juu",
        "powersearch-ns": "Tafuta kwenye maeneo ya wiki yafuatayo:",
        "unusedtemplateswlh": "viungo vingine",
        "randompage": "Ukurasa wa bahati",
        "randompage-nopages": "Hakuna kurasa katika {{PLURAL:$2|eneo la wiki lifuatalo|maeneo ya wiki yafuatayo}}: $1.",
-       "randomincategory-selectcategory-submit": "Nenda",
        "randomredirect": "Elekezo la bahati",
        "randomredirect-nopages": "Hakuna maelekezo katika eneo la wiki la \"$1\".",
        "statistics": "Takwimu",
        "suppress": "Uangalizi",
        "booksources": "Vyanzo vya vitabu",
        "booksources-search-legend": "Tafuta mahali panopopatikana kitabu",
-       "booksources-go": "Nenda",
        "booksources-invalid-isbn": "ISBN iliyoandikwa haonekani kuwa halali; hakikisha kwamba ni sawa na chanzo halisi cha ISBN.",
        "specialloguserlabel": "Mtendaji:",
        "speciallogtitlelabel": "Kusudio (jina la ukurasa au mtumiaji):",
        "wlheader-enotif": "Huduma ya kuarifu kwa barua pepe imewezeshwa.",
        "wlheader-showupdated": "Kurasa zilizobadilika tangu ulivyotembelea mara ya mwisho zinaonyeshwa katika hali ya '''kukooza'''",
        "wlnote": "{{PLURAL:$1|is the last change|Mabadiliko '''$1''' ya}} mwisho katika {{PLURAL:$2|hour|masaa '''$2''' yaliyopita yanaonyeshwa}} chini, ilivyokuwa saa $4, tarehe $3.",
-       "wlshowlast": "Onyesha kutoka masaa $1 siku $2 $3",
+       "wlshowlast": "Onyesha kutoka masaa $1 siku $2",
        "watchlist-options": "Hitiari za maangalizi",
        "watching": "Unafuatilia...",
        "unwatching": "Umeacha kufuatilia...",
        "import": "Kuleta kurasa",
        "importinterwiki": "Kuleta kutoka wiki nyingine",
        "import-interwiki-text": "Chagua wiki na jina la ukurasa unaotaka kuuleta.\nTarehe za mapitio na majina ya wahariri zitaletwa pia.\nVitendo vyote vya kuleta kutoka wiki nyingine vinaandikwa katika [[Special:Log/import|kumbukumbu za kuleta]].",
-       "import-interwiki-source": "Wiki/ukurasa wa chanzo:",
        "import-interwiki-history": "Leta pamoja na mapitio yote ya ukurasa huu",
        "import-interwiki-templates": "Leta pamoja na vigezo vyote",
        "import-interwiki-submit": "Leta",
        "exif-urgency-low": "Chini ($1)",
        "exif-urgency-high": "Juu ($1)",
        "exif-urgency-other": "Upaumbele uliotajwa na mtumiaji ($1)",
-       "watchlistall2": "zote",
        "namespacesall": "zote",
        "monthsall": "yote",
        "confirmemail": "Kuyakinisha anwani ya barua pepe",
        "logentry-newusers-create2": "$1 alianzisha akaunti ya mtumiaji $3",
        "logentry-newusers-autocreate": "Akaunti ya mtumiaji $1 ilianzishwa na mashine",
        "rightsnone": "(hana)",
+       "revdelete-summary": "muhtasari wa kuhariri",
        "feedback-subject": "Mada:",
        "feedback-message": "Ujumbe:",
        "feedback-cancel": "Batilisha",
index 2a0f494..3f5a78f 100644 (file)
        "passwordreset-emailsent-capture": "E-brif posłony, kerego widać niżej.",
        "passwordreset-emailerror-capture": "Ńy udoło śe posłać wjadomości lo {{GENDER:$2|używocza|używoczki}}: $1",
        "changeemail": "Pomjyno ausdruka e-mail",
-       "changeemail-header": "Pomjyno ausduku e-mail",
        "changeemail-text": "Wypełnij formularz, podej nowy ausdruk a hasło.",
        "changeemail-no-info": "Muśisz być zalogowany, coby uzyskać bezpostrzedńi dostymp do tyj zajty.",
        "changeemail-oldemail": "Uobecny ausdruk:",
        "changeemail-newemail": "Nowy adresu e-brif",
        "changeemail-none": "podstawowo",
        "changeemail-submit": "Spamjyntej nowy",
-       "changeemail-cancel": "Uodćepej",
        "resettokens": "Resetuj tokeny",
        "bold_sample": "Ruby tekst",
        "bold_tip": "Ruby tekst",
        "searchrelated": "podane",
        "searchall": "wszyjske",
        "showingresults": "To lista na keryj je {{PLURAL:$1|'''1''' wyńik|'''$1''' wyńikůw}}, počynojůnc uod nůmeru '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Wyńik '''$1''' z '''$3'''|Wyńiki '''$1 – $2''' z '''$3'''}} lo '''$4'''",
        "search-nonefound": "Ńy mo wynikůw, kere uodpadajům kryterjům zapytańo.",
        "powersearch-legend": "Sznupańy zaawansowane",
        "powersearch-ns": "Sznupej we przestrzyńach mjan:",
        "suppress": "Oversight",
        "booksources": "Kśůnžki",
        "booksources-search-legend": "Sznupej za zdrzůdłůma kśůnżkowymi",
-       "booksources-go": "Pokoż",
        "booksources-text": "Půńiżyj je lista uodnośńikůw do inkszych witryn, kere pośredńiczům we sprzedaży nowych a używanych buchůw, a tyż můgům mjeć dolsze informacyje uo poszukiwanym bez ćebje buchu.",
        "booksources-invalid-isbn": "Podany numer ISBN zostoł rozpoznany kej felerny. Sprowdź aże podany numer je zgodny s numerym kery je we zdrzůdle.",
        "specialloguserlabel": "Užytkowńik:",
        "wlheader-enotif": "Wysůuańy powjadůmjyń na adres e-brif je zouůnčůne",
        "wlheader-showupdated": "Zajty, kere bouy sprowjane uod Twoi uostatńi wizyty na ńych zostoy naškryflane '''tuustym'''",
        "wlnote": "Půńižy pokazano {{PLURAL:$1|ostatńy sprawjyńy dokůnane|ostatńy '''$1''' sprawjyńe dokůnane|ostatńych '''$1''' sprawjyń dokůnanych}} bez {{PLURAL:$2|uostatńo godźina|uostatńich '''$2''' godźin}}.",
-       "wlshowlast": "Pokož uostatńy $1 godźin $2 dńi ($3)",
+       "wlshowlast": "Pokož uostatńy $1 godźin $2 dńi ()",
        "watchlist-options": "Uopcyje artikli na kere dowosz pozůr",
        "watching": "Dowom pozor...",
        "unwatching": "Njy dowom pozoru...",
        "import": "Importuj zajty",
        "importinterwiki": "Import transwiki",
        "import-interwiki-text": "Wybjer wiki i nmjano zajty do importowańo.\nDaty a tyž mjana autorůw bydům zachowane.\nWšyjstke uoperacyje importu transwiki sům uodnotowywane w [[Special:Log/import|rejeře importu]].",
-       "import-interwiki-source": "Zdrzůdło wiki/zajty:",
        "import-interwiki-history": "Kopjuj couko historja sprowjyń tyi zajty",
        "import-interwiki-submit": "Importuj",
        "import-interwiki-namespace": "Docelowo przestrzyń mjan:",
        "exif-gpsspeed-n": "wynzuůw",
        "exif-gpsdirection-t": "kerůnek geůgrafičny",
        "exif-gpsdirection-m": "kerůnek magnetyčny",
-       "watchlistall2": "do kupy",
        "namespacesall": "wszyjske",
        "monthsall": "wšyskie",
        "confirmemail": "Potwjerdź adres e-brif",
        "revdelete-restricted": "naštaluj uograničyńo do administratorůw",
        "revdelete-unrestricted": "wycofej uograničyńo do administratorůw",
        "rightsnone": "podstawowo",
+       "revdelete-summary": "uopis pomjyńań",
        "expand_templates_ok": "OK"
 }
index 115f1ac..af54d9c 100644 (file)
        "hidetoc": "மறை",
        "collapsible-collapse": "சுருக்கு",
        "collapsible-expand": "விரிவாக்கு",
+       "confirmable-yes": "ஆம்",
+       "confirmable-no": "இல்லை",
        "thisisdeleted": "$1 பார்க்கவா அல்லது மீள்விக்கவா?",
        "viewdeleted": "$1 பார்?",
        "restorelink": "{{PLURAL:$1|ஒரு நீக்கப்பட்ட தொகுப்பை|$1 நீக்கப்பட்ட தொகுப்புகளை}}",
        "userlogout": "விடுபதிகை",
        "notloggedin": "புகுபதிகை செய்யப்படவில்லை",
        "userlogin-noaccount": "பயனர் கணக்கு இல்லையா?",
-       "userlogin-joinproject": "இணைக {{SITENAME}}",
+       "userlogin-joinproject": "{{SITENAME}}-இல் இணைக",
        "nologin": "பயனர் கணக்கு இல்லையா? '''$1'''.",
        "nologinlink": "கணக்கு ஒன்றை உருவாக்கவும்",
        "createaccount": "புதிய கணக்கை உருவாக்கு",
        "passwordreset-emailsent-capture": "கீழே காண்பிக்கப்பட்டுள்ளது போல் கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்பட்டது.",
        "passwordreset-emailerror-capture": "கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல்  உருவாக்கப்பட்டுவிட்டது, அது கீழே காட்டப்பட்டுள்ளது, ஆனால் பயனீட்டாளருக்கு அனுப்புவது தோல்வியடைந்தது:$1",
        "changeemail": "மின்னஞ்சல் முகவரியை மாற்று",
-       "changeemail-header": "கணக்கின் மின்னஞ்சல் முகவரியை மாற்று",
        "changeemail-text": "இந்த படிவத்தை உங்கள் மின்னஞ்சல் முகவரியை மாற்ற பூர்த்தி செய்யவும். நீங்கள் இந்த மாற்றத்தை உறுதிசெய்ய உங்கள் கடவுச்சொல்லை உள்ளிட வேண்டிவரும்.",
        "changeemail-no-info": "இப்பக்கத்தை நேரடியாக அணுகுவதற்கு நீங்கள் புகுபதிகை செய்திருக்கவேண்டும்.",
        "changeemail-oldemail": "தற்பொழுதுள்ள மின்னஞ்சல் முகவரி:",
        "changeemail-none": "(எதுவுமில்லை)",
        "changeemail-password": "உங்கள் {{SITENAME}} கடவுச்சொல்:",
        "changeemail-submit": "மின்னஞ்சலை மாற்று",
-       "changeemail-cancel": "விட்டுவிடு",
        "bold_sample": "தடித்த எழுத்துக்கள்",
        "bold_tip": "தடித்த எழுத்து",
        "italic_sample": "சாய்வெழுத்து",
        "searchrelated": "தொடர்புடையவை",
        "searchall": "அனைத்தும்",
        "showingresults": "'''$2''' இலிருந்து தொடங்கும்  {{PLURAL:$1|'''1''' முடிவு கீழே காட்டப்பட்டுள்ளது|'''$1''' முடிவுகள் கீழே காட்டப்பட்டுள்ளன}}.",
-       "showingresultsheader": "'''$4''' இற்கான {{PLURAL:$5|முடிவு  '''$3''' இல் '''$1'''|முடிவுகள்'''$3''' இல்  '''$1 - $2''' }}",
        "search-nonefound": "உங்கள் வினவலுக்கான முடிவுகள் எதுவும் இல்லை.",
        "powersearch-legend": "மேம்பட்ட தேடல்",
        "powersearch-ns": "பெயர்வெளிகளில் தேடவும்",
        "querypage-disabled": "செயல்பாட்டு காரணங்களுக்காக இந்த சிறப்புப் பக்கம் முடக்கப்பட்டுள்ளது.",
        "booksources": "நூல் மூலங்கள்",
        "booksources-search-legend": "நூல் மூலங்களைத் தேடு",
-       "booksources-go": "செல்",
+       "booksources-search": "தேடுக",
        "booksources-text": "நீங்கள் தேடும் நூல்களின் புதிய, பயன்படுத்தியப் பிரதிகளை விற்பனை செய்யும் இணையத்தளங்களின் பட்டியல் கீழே காட்டப்பட்டுள்ளது. நூல்கள் பற்றிய மேலதிகத் தகவல்களை இத்தளங்கள் கொண்டிருக்கலாம்:",
        "booksources-invalid-isbn": "கொடுக்கப்பட்ட ISBN செல்லத்தக்கதாக தெரியவில்லை ; மூலத்திலிருந்து நகலெடுத்ததில் உள்ள  பிழைகளை சரிபார்.",
        "specialloguserlabel": "செயல்படுபவர்:",
        "wlheader-enotif": "மின்னஞ்சல் அறிவிப்புகள் செயல்படுத்தப்பட்டுள்ளன.",
        "wlheader-showupdated": "உங்கள் கடைசி வருகைக்குப் பின்னர் மாற்றங்கள் செய்யப்பட்ட பக்கங்கள் '''தடித்த எழுத்துக்களில்''' காட்டப்பட்டுள்ளன",
        "wlnote": "பின்வருவன கடைசி {{PLURAL:$2|மணித்தியாலத்தில்|'''$2''' மணித்தியாலங்களில்}} செய்யப்பட்ட {{PLURAL:$1|கடைசி ஒரு மாற்றமாகும்|கடைசி $1 மாற்றங்களாகும்}}.",
-       "wlshowlast": "கடைசி $1 மணித்தியாலங்கள் $2 நாட்களைக் காட்டு $3",
+       "wlshowlast": "கடைசி $1 மணித்தியாலங்கள் $2 நாட்களைக் காட்டு",
        "watchlist-options": "கவனிப்பு பட்டியலின் விருப்பத் தேர்வுகள்",
        "watching": "கவனிக்கப்படுகிறது...",
        "unwatching": "கவனிப்பு விடப்படுகிறது...",
        "exbeforeblank": "வெறுமைப்படுத்த முன்னிருந்த உள்ளடக்கம்: '$1'",
        "delete-confirm": "\"$1\" பக்கத்தை நீக்கு",
        "delete-legend": "நீக்கவும்",
-       "historywarning": "'''எச்சரிக்கை:''' தாங்கள் நீக்கவுள்ள பக்கத்திற்கு சுமார் $1 {{PLURAL:$1|திருத்தம்|திருத்தங்களின்}} வரலாறு உண்டு:",
+       "historywarning": "<strong>எச்சரிக்கை:</strong> தாங்கள் நீக்கவுள்ள பக்கத்திற்கு $1 {{PLURAL:$1|திருத்தம்|திருத்தங்களின்}} வரலாறு உண்டு:",
        "confirmdeletetext": "நீங்கள் இப்பக்கத்தை அதன் வரலாற்றுடன் சேர்த்து நீக்க விழைகிறீர்கள்.\nஅருள் கூர்ந்து உங்கள் செய்கையின் விளைவுகளை நீங்கள் விளங்கிக் கொண்டீர்கள் என்பதையும் இது [[{{MediaWiki:Policy-url}}|கொள்கைகளுடன்]] ஒத்துப்போவதையும் உறுதிப் படுத்தவும்.",
        "actioncomplete": "செயற்பாடு நிறைவுற்றது",
        "actionfailed": "செயல் வெற்றியடையவில்லை",
        "import": "பக்கங்களை இறக்கு",
        "importinterwiki": "விக்கியிடை இறக்குமதி",
        "import-interwiki-text": "இறக்குமதிக்கான விக்கியையும் பக்கத்தையும் தெரிவுச் செய்க.\nதிருத்த நாட்கள், தொகுத்தவர்களின் பெயர்கள் என்பன பேனப்படும்.\nஎல்லா விக்கியிடை இறக்குமதிகளும் [[Special:Log/import|இறக்குமதிப் பதிகையில்]] பதியப்படும்.",
-       "import-interwiki-source": "மூல விக்கி/பக்கம்:",
+       "import-interwiki-sourcepage": "மூலப் பக்கம்:",
        "import-interwiki-history": "இப்பக்கத்தின் அனைத்து வரலாற்றுப் பதிப்புகளையும் நகலெடு",
        "import-interwiki-templates": "அனைத்து வார்ப்புருக்களையும் சேர்",
        "import-interwiki-submit": "இறக்கு",
        "exif-urgency-low": "குறைந்த ($1)",
        "exif-urgency-high": "அதிகம் ($1)",
        "exif-urgency-other": "பயனர் அறுதியிட்ட முன்னுரிமை ( $1 )",
-       "watchlistall2": "அனைத்து",
        "namespacesall": "அனைத்து",
        "monthsall": "அனைத்து மாதங்களும்",
        "confirmemail": "மின்னஞ்சல் முகவரியை உறுதிப்படுத்துக",
        "logentry-newusers-create2": "$3 பயனர் கணக்கினை $1 உருவாக்கினார்",
        "logentry-newusers-autocreate": "பயணர் கணக்கு $1 தானாக உருவாக்கப்பட்டது",
        "rightsnone": "(எதுவுமில்லை)",
+       "revdelete-summary": "தொகுப்பு சுருக்கத்தை",
        "feedback-bugornote": "நீங்கள் ஒரு தொழில்நுட்பக் கோளாறு குறித்து விரிவாக விளக்க தாயாராக இருந்தால் தயவுசெய்து [ $1  ஒரு bug பற்றி கூறு].\nஇல்லையெனில், நீங்கள் கீழேயுள்ள எளிதான படிவத்தை பயன்படுத்தலாம்.உங்கள் கருத்துரை \"[$3 $2]\" பக்கத்தில் உங்கள் பயனர் பெயர் மற்றும் உங்கள் உலாவியின் பெயருடன் சேர்க்கப்படும்.",
        "feedback-subject": "பொருள்:",
        "feedback-message": "தகவல்:",
        "expand_templates_output": "முடிவுகள்",
        "expand_templates_ok": "ஆம்",
        "expand_templates_remove_comments": "கருத்துரைகளை நீக்கு",
-       "expand_templates_preview": "முன்தோற்றம்"
+       "expand_templates_preview": "முன்தோற்றம்",
+       "mediastatistics-header-unknown": "அறியப்படாதது",
+       "mediastatistics-header-video": "காணொளிகள்"
 }
index 135f57d..e95efe4 100644 (file)
        "passwordreset-emailsent-capture": "క్రింద చూపిన సంకేతపదం మార్పు ఈమెయిలును పంపించాం.",
        "passwordreset-emailerror-capture": "కింద చూపిన సంకేతపదం మార్పు ఈమెయిలును తయారుచేసాం. కానీ దాన్ని {{GENDER:$2|వాడుకరికి}} పంపడం విఫలమైంది: $1",
        "changeemail": "ఈ-మెయిలు చిరునామా మార్పు",
-       "changeemail-header": "ఖాతా ఈ-మెయిల్ చిరునామాని మార్చండి",
        "changeemail-text": "మీ ఈమెయిలు చిరునామాని మార్చుకోడానికి ఈ ఫారాన్ని నింపండి. ఈ మార్పుని నిర్ధారించడానికి మీ సంకేతపదాన్ని ఇవ్వాల్సివస్తుంది.",
        "changeemail-no-info": "ఈ పేజీని నేరుగా చూడటానికి మీరు లాగినయి వుండాలి.",
        "changeemail-oldemail": "ప్రస్తుత ఈ-మెయిలు చిరునామా:",
        "changeemail-none": "(ఏమీలేదు)",
        "changeemail-password": "మీ {{SITENAME}} సంకేతపదం:",
        "changeemail-submit": "ఈ-మెయిల్ మార్చు",
-       "changeemail-cancel": "రద్దుచేయి",
        "changeemail-throttled": "మరీ ఎక్కువగా లాగిన్ ప్రయత్నాలు చేసారు.\nమళ్ళీ ప్రయత్నించే ముందు $1 ఆగండి.",
        "resettokens": "టోకెన్ ను రీసెట్ చెయ్యి",
        "resettokens-text": "మీ ఖాతాకు అనుబంధంగా ఉన్న గోపనీయ డేటాను చూపించే టోకెన్లను మీరు ఇక్కడ రీసెట్ చెయ్యవచ్చు.\n\nమీరా టోకెన్లను పొరపాటున ఎవరికైనా ఇచ్చి ఉన్నా, లేక మీ ఖాతా వివరాలు మరెవరికైనా తెలిసిపోయినా మీరీ పని చెయ్యాలి.",
        "searchall": "అన్నీ",
        "showingresults": "#<strong>$2</strong> నుండి మొదలుకొని {{PLURAL:$1|</strong>ఒక్క</strong> ఫలితాన్ని|<strong>$1</strong> ఫలితాలను}} కింద చూపించాం.",
        "showingresultsinrange": "#<strong>$2</strong> నుండి  #<strong>$3</strong> వరకు ఉన్న ఫలితాల శ్రేణి నుండి {{PLURAL:$1|<strong>ఒక్క</strong> ఫలితం|<strong>$1</strong> ఫలితాల}} వరకు కింద చూపించాం.",
-       "showingresultsheader": "<strong>$4</strong> కోసం వచ్చిన ఫలితాలు {{PLURAL:$5|<strong>$3</strong> లో <strong>$1</strong>|</strong>$3</strong> లో <strong>$1 - $2</strong>}}",
        "search-nonefound": "మీ ప్రశ్నకి సరిపోలిన ఫలితాలేమీ లేవు.",
        "powersearch-legend": "నిశితమైన అన్వేషణ",
        "powersearch-ns": "ఈ పేరుబరుల్లో వెతుకు:",
        "randomincategory": "వర్గంలోని యాదృచ్చిక పేజీ",
        "randomincategory-invalidcategory": "\"$1\" అనేది సరైన పర్గం పేరు కాదు.",
        "randomincategory-nopages": "[[:Category:$1|$1]] వర్గంలో పేజీలేమీ లేవు.",
-       "randomincategory-selectcategory": "ఈ వర్గం నుంచి ఒక యాదృచ్ఛిక పేజీని చూడండి: $1 $2.",
-       "randomincategory-selectcategory-submit": "వెళ్ళు",
        "randomredirect": "యాదృచ్చిక దారిమార్పు",
        "randomredirect-nopages": "\"$1\" పేరుబరిలో దారిమార్పులేమీ లేవు.",
        "statistics": "గణాంకాలు",
        "querypage-disabled": "పనితీరు కారణాల వలన, ఈ ప్రత్యేకపేజీని అశక్తం చేసాం.",
        "booksources": "పుస్తక మూలాలు",
        "booksources-search-legend": "పుస్తక మూలాల కోసం వెతుకు",
-       "booksources-go": "వెళ్ళు",
        "booksources-text": "కొత్త, పాత పుస్తకాలు అమ్మే ఇతర సైట్లకు లింకులు కింద ఇచ్చాం. మీరు వెతికే పుస్తకాలకు సంబంధించిన మరింత సమాచారం కూడా అక్కడ దొరకొచ్చు:",
        "booksources-invalid-isbn": "మీరిచ్చిన ISBN సరైనదిగా అనిపించుటలేదు; అసలు మూలాన్నుండి కాపీ చేయడంలో పొరపాట్లున్నాయేమో చూసుకోండి.",
        "specialloguserlabel": "కర్త:",
        "wlheader-enotif": "ఈ-మెయిలు గమనికలు పంపబడతాయి.",
        "wlheader-showupdated": "మీ గత సందర్శన తరువాత మారిన పేజీలు <strong>బొద్దు</strong>గా చూపించబడ్డాయి.",
        "wlnote": "$3 నాడు $4 సమయానికి, గడచిన {{PLURAL:$2|గంటలో|'''$2''' గంటలలో}} జరిగిన {{PLURAL:$1|ఒక్క మార్పు కింద ఉంది|'''$1''' మార్పులు కింద ఉన్నాయి}}.",
-       "wlshowlast": "గత $1 గంటల $2 రోజుల $3 చూపించు",
+       "wlshowlast": "గత $1 గంటల $2 రోజుల  చూపించు",
        "watchlist-options": "వీక్షణ జాబితా ఎంపికలు",
        "watching": "గమనిస్తున్నారు...",
        "unwatching": "గమనించడం లేదు...",
        "import": "పేజీలను దిగుమతి చేసుకోండి",
        "importinterwiki": "ఇంకోవికీ నుండి దిగుమతి",
        "import-interwiki-text": "దిగుమతి చేసుకోవడానికి ఒక వికీని మరియు అందులోని పేజీని ఎంచుకోండి.\nకూర్పుల తేదీలు మరియు మార్పులు చేసిన వారి పేర్లు భద్రపరచబడతాయి.\nఇతర వికీలనుండి చేస్తున్న దిగుమతుల చర్యలన్నీ [[Special:Log/import|దిగుమతుల చిట్టా]]లో నమోదవుతాయి.",
-       "import-interwiki-source": "మూల వికీ/పేజీ:",
        "import-interwiki-history": "ఈ పేజీ యొక్క అన్ని చారిత్రక కూర్పులను కాపీ చెయ్యి",
        "import-interwiki-templates": "అన్ని మూసలను ఉంచు",
        "import-interwiki-submit": "దిగుమతించు",
        "exif-urgency-low": "తక్కువ ($1)",
        "exif-urgency-high": "ఎక్కువ ($1)",
        "exif-urgency-other": "వాడుకరి-నిర్వచిత ప్రాథాన్యత ($1)",
-       "watchlistall2": "అన్నీ",
        "namespacesall": "అన్నీ",
        "monthsall": "అన్నీ",
        "confirmemail": "ఈ-మెయిలు చిరునామా ధృవీకరించండి",
        "logentry-rights-rights-legacy": "$1, $3 యొక్క గుంపు సభ్యత్వాన్ని {{GENDER:$2|మార్చారు}}",
        "logentry-rights-autopromote": "$1, $4 నుండి $5 కు ఆటోమేటిగ్గా {{GENDER:$2|ప్రమోటు చెయ్యబడ్డారు}}",
        "rightsnone": "(ఏమీలేవు)",
+       "revdelete-summary": "మార్పు సంగ్రహం",
        "feedback-bugornote": "ఏదైనా సాంకేతిక సమస్యను మీరు వివరించదలిస్తే [$1 లోపంపై ఫిర్యాదు చెయ్యండి].\nలేదంటే, కింద ఉన్న సులువైన ఫారాన్ని వాడండి. మీ వ్యాఖ్య మీ వాడుకరిపేరుతో సహా  \"[$3 $2]\" పేజీలో చేర్చబడుతుంది.",
        "feedback-subject": "విషయం:",
        "feedback-message": "సందేశం:",
index 3c840fd..e60a27d 100644 (file)
        "historyempty": "(mamuk)",
        "history-feed-item-nocomment": "$1 iha $2",
        "rev-delundel": "hatudu/subar",
+       "rev-showdeleted": "hatudu",
        "revisiondelete": "Halakon/restaurar versaun",
        "revdelete-show-file-submit": "Sin",
-       "revdelete-hide-user": "Subar naran edita-na'in/IP",
+       "revdelete-hide-text": "Testu versaun nian",
+       "revdelete-hide-user": "Naran edita-na'in/diresaun IP",
        "revdelete-radio-set": "Sin",
        "revdelete-radio-unset": "Lae",
        "revdelete-edit-reasonlist": "Edita lista motivu nian",
        "recentchanges-label-minor": "Ne'e mudansa ki'ik",
        "recentchanges-label-bot": "Edita husi prosesu automátiku (\"bot\")",
        "rcshowhideminor": "$1 muda ki-ki'ik",
+       "rcshowhideminor-show": "Hatudu",
        "rcshowhidebots": "$1 bot sira",
+       "rcshowhidebots-show": "Hatudu",
        "rcshowhideliu": "$1 ema rejista",
+       "rcshowhideliu-show": "Hatudu",
        "rcshowhideanons": "$1 ema anónimu",
+       "rcshowhideanons-show": "Hatudu",
+       "rcshowhideanons-hide": "Subar",
+       "rcshowhidepatr-show": "Hatudu",
        "rcshowhidemine": "$1 ha'u-nia edita",
+       "rcshowhidemine-show": "Hatudu",
        "diff": "diferensa",
        "hist": "istória",
        "hide": "Hamsumik",
        "ancientpages": "Pájina tuan liu hotu sira",
        "move": "Book",
        "movethispage": "Book pájina ne'e",
-       "booksources-go": "Bá",
        "specialloguserlabel": "Uza-na'in ne'ebé halo:",
        "speciallogtitlelabel": "Objetivu (títulu ka uza-na'in):",
        "allpages": "Pájina hotu",
        "watchthispage": "Hateke pájina ne'e",
        "unwatch": "La hateke ona",
        "watchlist-details": "{{PLURAL:$1|Pájina ida (1)|Pájina $1}} iha Ita-nia \"lista hateke\" (la ho pájina diskusaun).",
-       "wlshowlast": "Hatudu $1 hora $2 loron ikus $3",
+       "wlshowlast": "Hatudu $1 hora $2 loron ikus",
        "watching": "Hateke...",
        "unwatching": "La hateke...",
        "enotif_impersonal_salutation": "Uza-na'in {{SITENAME}} nian",
        "exif-urgency-normal": "Normál ($1)",
        "exif-urgency-low": "Kraik ($1)",
        "exif-urgency-high": "Aas ($1)",
-       "watchlistall2": "hotu",
        "namespacesall": "hotu",
        "monthsall": "hotu",
        "confirm_purge_button": "OK",
index 20e7d0e..e460181 100644 (file)
        "otherlanguages": "Бо забонҳои дигар",
        "redirectedfrom": "(Тағйири масир аз $1)",
        "redirectpagesub": "Саҳифаи равонакунӣ",
+       "redirectto": "Тағйири масир ба:",
        "lastmodifiedat": "Ин саҳифа бори охир $2, $1 дигаргун карда шудааст.",
        "viewcount": "Ин саҳифа {{PLURAL:$1|бор|$1 бор}} дида шудааст.",
        "protectedpage": "Саҳифаи муҳофизатшуда",
        "jumptonavigation": "гаштан",
        "jumptosearch": "Ҷустуҷӯ",
        "view-pool-error": "Мутаасифона, корсозҳои дар ҳоли ҳозир дучори бори изофӣ ҳастанд.\nТеъдоди зиёди аз корбарон талош мекунанд, ки ин саҳифаро бубинанд.\nЛутфан қабл аз талош дубора барои дидани ин саҳифа муддате сабр кунед.\n\n$1",
+       "generic-pool-error": "Мутаасифона, корсозҳои дар ҳоли ҳозир дучори бори изофӣ ҳастанд.\nТеъдоди зиёди аз корбарон талош мекунанд, ки ин саҳифаро бубинанд.\nЛутфан қабл аз талош дубора барои дидани ин саҳифа муддате сабр кунед.",
+       "pool-timeout": "Замони мунтазирӣ барои қуфл",
+       "pool-queuefull": "Қатори ҳафза пур аст",
        "pool-errorunknown": "Хатогии ношинос",
+       "pool-servererror": "Хидмати ҳисобкунаки ҳафз дастрас нест ($1).",
        "aboutsite": "Дар бораи {{SITENAME}}",
        "aboutpage": "Project:Дар бораи",
        "copyright": "Мӯҳтаво таҳти иҷозатномаи $1 ва ё дигар дастрас аст.",
        "createacct-yourpasswordagain": "Тасдиқи гузарвожа",
        "createacct-yourpasswordagain-ph": "Гузарвожаро бори дигар ворид кунед",
        "remembermypassword": "Вуруди манро дар ин мурургар дар хотир нигоҳ дор (то ҳадди аксар $1 {{PLURAL:$1|рӯз|рӯз}})",
-       "userlogin-remembermypassword": "Вурудшударо манро нигоҳ дор",
+       "userlogin-remembermypassword": "Вурудшуда манро нигоҳ дор",
        "userlogin-signwithsecure": "Истифодаи пайвастшавии амн",
        "yourdomainname": "Домейни Шумо",
        "password-change-forbidden": "Шумо гузарвожаро дар ин вики тағийр дода наметавонед.",
        "changeemail-none": "(ҳеҷ)",
        "changeemail-password": "Гузарвожаи Шумо дар {{SITENAME}}:",
        "changeemail-submit": "Ивази email",
-       "changeemail-cancel": "Лағв",
        "resettokens-no-tokens": "Ягон нишона барои танзими муҷадад вуҷуд надорад.",
        "resettokens-legend": "Танзими муҷадади нишона",
        "resettokens-tokens": "Нишонаҳо:",
        "preview": "Пешнамоиш",
        "showpreview": "Пеш намоиш",
        "showdiff": "Намоиши тағйирот",
-       "anoneditwarning": "'''Ð\9eгоҳӣ:''' Ð¨Ñ\83мо Ð²Ñ\83Ñ\80Ñ\83д Ð½Ð°ÐºÐ°Ñ\80даед. Ð¡Ñ\83Ñ\80оÒ\93аи IP Ð¨Ñ\83мо Ð´Ð°Ñ\80 Ð²Ð¸Ñ\80оиÑ\88оÑ\82и Ð¸Ð½ Ñ\81аҳиÑ\84а Ñ\81абÑ\82 хоҳад шуд.",
+       "anoneditwarning": "'''Ð\9eгоҳӣ:''' Ð¨Ñ\83мо Ð²Ñ\83Ñ\80Ñ\83д Ð½Ð°ÐºÐ°Ñ\80даед. Ð\90гаÑ\80 Ñ\8fгон Ð²Ð¸Ñ\80оиÑ\88и ÐºÑ\83нед Ð½Ð¸Ñ\88онаи IP Ð¨Ñ\83мо Ð±Ð° Ò³Ð°Ð¼Ð° Ð½Ð°Ð¼Ð¾Ñ\91н Ñ\85оҳад Ð±Ñ\83д. Ð\90гаÑ\80 Ð¨Ñ\83мо <strong>[$1 Ð²Ð¾Ñ\80ид Ñ\88авед]</strong> Ñ\91 <strong>[$2 Ò³Ð¸Ñ\81обеÑ\80о Ñ\8dҷод ÐºÑ\83нед]</strong>, Ð²Ð¸Ñ\80оиÑ\88оÑ\82и Ð¨Ñ\83мо Ð±Ð° Ð½Ð¾Ð¼Ð¸ ÐºÐ¾Ñ\80баÑ\80иаÑ\82он Ò³Ð°Ð¼Ñ\80оҳ Ð±Ð¾ Ð´Ð¸Ð³Ð°Ñ\80 Ð±Ð°Ñ\80Ñ\82аÑ\80иҳо Ð¼Ñ\83Ñ\82алиÒ\9b хоҳад шуд.",
        "anonpreviewwarning": "<em>Шумо вориди нашудаед. Захиракунӣ IP нишонаи шуморо дар таърихи вироиши ин саҳифа захира хоҳад кард.</em>",
        "missingsummary": "'''Ёдоварӣ:''' Шумо хулосаи вироиш нанавиштаед.\nАгар дубора тугмаи \"Захира\"-ро клик кунед, вироишатон бидуни хулоса захира хоҳад шуд.",
        "missingcommenttext": "Лутфан тавсифе дар зер бинависед.",
        "currentrev": "Вироишоти кунунӣ",
        "currentrev-asof": "Нусхаи кунунӣ то $1",
        "revisionasof": "Нусха $1",
-       "revision-info": "Нусхаи вироиш $2 дар таърихи $1",
+       "revision-info": "Нусхаи вироиш аз $1 тавассути {{GENDER:$6|$2}}$7",
        "previousrevision": "←Нусхаи кӯҳнатар",
        "nextrevision": "Нусхаи навтарин→",
        "currentrevisionlink": "Намоиши нусхаи феълӣ",
        "searchrelated": "алоқаманд",
        "searchall": "ҳама",
        "showingresults": "Намоиши {{PLURAL:$1|'''1''' натиҷа|'''$1''' натоиҷ}} дар зер оғоз аз #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Натиҷаи <strong>$1</strong> <strong>$3</strong>|Натоиҷи <strong>$1 - $2</strong> <strong>$3</strong>}} барои <strong>$4</strong>",
        "search-nonefound": "Натиҷаи муносиб бо дархост пайдо нашуд.",
        "powersearch-legend": "Ҷустуҷӯи пешрафта",
        "powersearch-ns": "Ҷустуҷӯ дар фазоҳои ном:",
        "randompage": "Саҳифаи тасодуфӣ",
        "randompage-nopages": "Ҳеҷ саҳифае дар ин фазои ном мавҷуд нест.",
        "randomincategory": "Саҳифаи тасодуфӣ дар гурӯҳ",
-       "randomincategory-selectcategory-submit": "Бирав",
        "randomredirect": "Масири тасодуфӣ",
        "randomredirect-nopages": "Ҳеҷ саҳифаи тағйири масире дар ин фазои ном мавҷуд нест.",
        "statistics": "Омор\\Статистика",
        "suppress": "Назорат",
        "booksources": "Манбаҳои китобҳо",
        "booksources-search-legend": "Ҷустуҷӯи сарчашмаҳои китоб",
-       "booksources-go": "Бирав",
        "booksources-text": "Дер зер феҳристи пайвандҳо ба сомонаҳое, ки китобҳои нав ва кӯҳна мефурӯшанд, оварда шудааст. Мумкин аст, иттилооти бештарро дар бораи китобҳои ҷустуҷӯ кардаатон дошта бошанд:",
        "specialloguserlabel": "Иҷрокунанда:",
        "speciallogtitlelabel": "Ҳадаф (унвон ё корбар):",
        "wlheader-enotif": "Иттилоорасонии тариқи почтаи электронӣ (E-mail) фаъол шудааст.",
        "wlheader-showupdated": "Саҳифаҳое, ки пас аз охирин сар заданатон ба онҳо тағйир кардаанд '''пурранг''' нишон дода шудаанд",
        "wlnote": "Дар зер {{PLURAL:$1|охирин тағйир|'''$1''' охирин тағйирот}} дар $2 соати охир {{PLURAL:омадааст|омадаанд}}.",
-       "wlshowlast": "Намоиши охирин $1 соат $2 рӯзҳо $3",
+       "wlshowlast": "Намоиши охирин $1 соат $2 рӯзҳо",
        "watchlist-options": "Ихтиёроти феҳристи пайгириҳо",
        "watching": "Пайгири...",
        "unwatching": "Тавқифи пайгири...",
        "exif-iimcategory-pol": "Сиёсат",
        "exif-iimcategory-rel": "Дин ва ибодат",
        "exif-iimcategory-spo": "Варзиш",
-       "watchlistall2": "ҳама",
        "namespacesall": "ҳама",
        "monthsall": "ҳама",
        "confirmemail": "Тасдиқи нишонаи почтаи электронӣ",
        "revdelete-restricted": "маҳдудиятҳо ба мудирон амалӣ шуданд",
        "revdelete-unrestricted": "маҳдудиятҳо аз мудирон бардошта шуданд",
        "rightsnone": "(ҳеҷ)",
+       "revdelete-summary": "вироиши хулоса",
        "feedback-subject": "Мавзӯъ:",
        "feedback-message": "Пайём:",
        "feedback-cancel": "Лағв",
index ec2df52..1a27487 100644 (file)
        "suppress": "Nazorat",
        "booksources": "Manbahoi kitobho",
        "booksources-search-legend": "Çustuçūi sarcaşmahoi kitob",
-       "booksources-go": "Birav",
        "booksources-text": "Der zer fehristi pajvandho ba somonahoe, ki kitobhoi nav va kūhna mefurūşand, ovarda şudaast. Mumkin ast, ittilooti beştarro dar borai kitobhoi çustuçū kardaaton doşta boşand:",
        "specialloguserlabel": "Korbar:",
        "speciallogtitlelabel": "Sarlavha:",
        "wlheader-enotif": "Ittiloorasoniji tariqi poctai elektronī (E-mail) imkonpazir ast.",
        "wlheader-showupdated": "Sahifahoe, ki pas az oxirin sar zadanaton ba onho taƣjir kardaand '''purrang''' nişon doda şudaand",
        "wlnote": "Dar zer {{PLURAL:$1|oxirin taƣjir|'''$1''' oxirin taƣjirot}} dar $2 soati oxir {{PLURAL:omadaast|omadaand}}.",
-       "wlshowlast": "Namoişi oxirin $1 soat $2 rūzho $3",
+       "wlshowlast": "Namoişi oxirin $1 soat $2 rūzho",
        "watchlist-options": "Ixtijoroti fehristi pajgiriho",
        "watching": "Pajgiri...",
        "unwatching": "Tavqifi pajgiri...",
        "exif-gpsspeed-n": "Gireh",
        "exif-gpsdirection-t": "Ravandi durust",
        "exif-gpsdirection-m": "Ravandi magnetikī",
-       "watchlistall2": "hama",
        "namespacesall": "hama",
        "monthsall": "hama",
        "confirmemail": "Tasdiqi nişonai poctai elektronī",
        "revdelete-restricted": "mahdudijatho ba mudiron amalī şudand",
        "revdelete-unrestricted": "mahdudijatho az mudiron bardoşta şudand",
        "rightsnone": "(heç)",
+       "revdelete-summary": "viroişi xulosa",
        "expandtemplates": "Bastdodani şablonho",
        "expand_templates_intro": "In sahifai viƶa matnero darjoft karda va tamomi şablonhoi ba kor rafta dar onro ba tavri bozgaşte bast medihad. Hamcunin tobehoi taçzeh\n<nowiki>{{</nowiki>#language:...}}, va mutaƣjirhoe cun\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash;ro ham bast medihad – dar voqe' taqriban har ciro ki doxili du akulot boşad.\nIn kor bo sado zadani marhilai taçzehi marbut dar xudi MediaViki surat megirad.",
        "expand_templates_title": "Unvoni mavzū', baroi {{FULLPAGENAME}} va ƣajra.:",
index e59011e..ef9e529 100644 (file)
@@ -25,8 +25,8 @@
        },
        "tog-underline": "การขีดเส้นใต้ลิงก์:",
        "tog-hideminor": "ซ่อนการแก้ไขเล็กน้อยในหน้าปรับปรุงล่าสุด",
-       "tog-hidepatrolled": "ซ่อนการแก้ไขที่ตรวจแล้วในหน้าปรับปรุงล่าสุด",
-       "tog-newpageshidepatrolled": "à¸\8bà¹\88อà¸\99หà¸\99à¹\89าà¸\97ีà¹\88à¸\95รวà¸\88à¹\81ลà¹\89วà¸\88าà¸\81รายการหน้าใหม่",
+       "tog-hidepatrolled": "à¸\8bà¹\88อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ีà¹\88à¸\95รวà¸\88สอà¸\9aà¹\81ลà¹\89วà¹\83à¸\99หà¸\99à¹\89าà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94",
+       "tog-newpageshidepatrolled": "à¸\8bà¹\88อà¸\99หà¸\99à¹\89าà¸\97ีà¹\88à¸\95รวà¸\88สอà¸\9aà¹\81ลà¹\89วà¹\83à¸\99รายการหน้าใหม่",
        "tog-extendwatchlist": "ขยายรายการเฝ้าดูให้แสดงการเปลี่ยนแปลงทั้งหมด ไม่เพียงการเปลี่ยนแปลงล่าสุด",
        "tog-usenewrc": "จัดกลุ่มการเปลี่ยนแปลงแบ่งตามหน้าในรายการปรับปรุงล่าสุดและรายการเฝ้าดู",
        "tog-numberheadings": "ใส่เลขหัวเรื่องอัตโนมัติ",
        "tog-editsectiononrightclick": "เปิดใช้งานการแก้ไขเฉพาะส่วนโดยคลิกขวาที่ชื่อเรื่องของส่วนนั้น",
        "tog-watchcreations": "เพิ่มหน้าที่ฉันสร้างและไฟล์ที่ฉันอัปโหลดเข้ารายการเฝ้าดู",
        "tog-watchdefault": "เพิ่มหน้าและไฟล์ที่ฉันแก้ไขเข้ารายการเฝ้าดู",
-       "tog-watchmoves": "à¹\80à¸\9eิà¹\88มà¹\81ละà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\89ัà¸\99à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อเข้ารายการเฝ้าดู",
+       "tog-watchmoves": "à¹\80à¸\9eิà¹\88มà¹\81ละà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\89ัà¸\99ยà¹\89ายเข้ารายการเฝ้าดู",
        "tog-watchdeletion": "เพิ่มหน้าและไฟล์ที่ฉันลบเข้ารายการเฝ้าดู",
        "tog-watchrollback": "เพิ่มหน้าที่ฉันย้อนกลับฉุกเฉินเข้ารายการเฝ้าดู",
-       "tog-minordefault": "à¸\81ำหà¸\99à¸\94à¹\83หà¹\89à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ุà¸\81à¸\84รัà¹\89à¸\87à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อยà¹\82à¸\94ยà¸\9bริยาย",
+       "tog-minordefault": "กำหนดการแก้ไขทุกครั้งเป็นการแก้ไขเล็กน้อยโดยปริยาย",
        "tog-previewontop": "ให้ตัวอย่างการแก้ไขแสดงก่อนกล่องแก้ไข",
        "tog-previewonfirst": "แสดงตัวอย่างในการแก้ไขครั้งแรก",
        "tog-enotifwatchlistpages": "อีเมลหาเมื่อหน้าหรือไฟล์ในรายการเฝ้าดูเปลี่ยนแปลง",
@@ -47,8 +47,8 @@
        "tog-enotifrevealaddr": "เปิดเผยที่อยู่อีเมลของฉันในอีเมลแจ้งเตือน",
        "tog-shownumberswatching": "แสดงจำนวนผู้ใช้ที่เฝ้าดู",
        "tog-oldsig": "ลายเซ็นที่ใช้อยู่:",
-       "tog-fancysig": "à¹\83à¸\8aà¹\89à¸\84ำสัà¹\88à¸\87วิà¸\81ิà¸\97ีà¹\88à¸\9bราà¸\81à¸\8fà¹\83à¸\99ลายà¹\80à¸\8bà¹\87à¸\99à¸\99ีà¹\89 (โดยไม่มีลิงก์อัตโนมัติ)",
-       "tog-uselivepreview": "à¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\81à¸\9aà¸\9aทันที (ทดลอง)",
+       "tog-fancysig": "à¸\96ือลายà¹\80à¸\8bà¹\87à¸\99à¹\80à¸\9bà¹\87à¸\99à¸\82à¹\89อà¸\84วามวิà¸\81ิ (โดยไม่มีลิงก์อัตโนมัติ)",
+       "tog-uselivepreview": "à¹\83à¸\8aà¹\89à¸\95ัวอยà¹\88าà¸\87ทันที (ทดลอง)",
        "tog-forceeditsummary": "เตือนเมื่อช่องคำอธิบายอย่างย่อว่าง",
        "tog-watchlisthideown": "ซ่อนการแก้ไขของฉันจากรายการเฝ้าดู",
        "tog-watchlisthidebots": "ซ่อนการแก้ไขของบอตจากรายการเฝ้าดู",
        "category-empty": "<em>ปัจจุบันหมวดหมู่นี้ไม่มีหน้าหรือสื่อใด</em>",
        "hidden-categories": "{{PLURAL:$1|หมวดหมู่ที่ซ่อนอยู่|หมวดหมู่ที่ซ่อนอยู่}}",
        "hidden-category-category": "หมวดหมู่ที่ซ่อนอยู่",
-       "category-subcat-count": "{{PLURAL:$2|หมวà¸\94หมูà¹\88à¸\99ีà¹\89มีหมวà¸\94หมูà¹\88ยà¹\88อยà¹\80à¸\9eียà¸\87หมวà¸\94หมูà¹\88à¹\80à¸\94ียว|หมวà¸\94หมูà¹\88à¸\99ีà¹\89มี {{PLURAL:$1|หมวà¸\94หมูà¹\88ยà¹\88อย|$1 à¸«à¸¡à¸§à¸\94หมูà¹\88ยà¹\88อย}} จากทั้งหมด $2 หมวดหมู่}}",
-       "category-subcat-count-limited": "หมวดหมู่นี้มี $1 หมวดหมู่ย่อย",
-       "category-article-count": "{{PLURAL:$2|หมวà¸\94หมูà¹\88à¸\99ีà¹\89มีอยูà¹\88à¹\80à¸\9eียà¸\87หà¸\99à¹\89าà¹\80à¸\94ียว|à¹\83à¸\99หมวà¸\94หมูà¹\88à¸\99ีà¹\89มี {{PLURAL:$1|หà¸\99à¹\89าà¹\80à¸\94ียว|$1 à¸«à¸\99à¹\89า}} จากทั้งหมด $2 หน้า}}",
+       "category-subcat-count": "{{PLURAL:$2|หมวà¸\94หมูà¹\88à¸\99ีà¹\89มีหมวà¸\94หมูà¹\88ยà¹\88อยà¹\80à¸\94ียวà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89|หมวà¸\94หมูà¹\88à¸\99ีà¹\89มี {{PLURAL:$1|หมวà¸\94หมูà¹\88ยà¹\88อยà¹\80à¸\94ียว|$1 à¸«à¸¡à¸§à¸\94หมูà¹\88ยà¹\88อย}}à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89 จากทั้งหมด $2 หมวดหมู่}}",
+       "category-subcat-count-limited": "หมวดหมู่นี้มี $1 หมวดหมู่ย่อยต่อไปนี้",
+       "category-article-count": "{{PLURAL:$2|หมวà¸\94หมูà¹\88à¸\99ีà¹\89มีอยูà¹\88à¹\80à¸\9eียà¸\87หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89|{{PLURAL:$1|หà¸\99à¹\89า|$1 à¸«à¸\99à¹\89า}}à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89อยูà¹\88à¹\83à¸\99หมวà¸\94หมูà¹\88à¸\99ีà¹\89 จากทั้งหมด $2 หน้า}}",
        "category-article-count-limited": "$1 หน้าต่อไปนี้อยู่ในหมวดหมู่นี้",
-       "category-file-count": "{{PLURAL:$2|หมวดหมู่นี้มีเพียงไฟล์นี้|หมวดหมู่นี้มี $1 ไฟล์ จากทั้งหมด $2 ไฟล์}}",
+       "category-file-count": "{{PLURAL:$2|หมวดหมู่นี้มีเพียงไฟล์นี้|$1 ไฟล์ต่อไปนี้อยู่ในหมวดหมู่นี้ จากทั้งหมด $2 ไฟล์}}",
        "category-file-count-limited": "{{PLURAL:$1|ไฟล์|ไฟล์}}ต่อไปนี้อยู่ในหมวดหมู่นี้",
        "listingcontinuesabbrev": "ต่อ",
        "index-category": "หน้าที่มีดัชนี",
        "mypage": "หน้า",
        "mytalk": "พูดคุย",
        "anontalk": "พูดคุยกับเลขที่อยู่ไอพีนี้",
-       "navigation": "à¸\9bà¹\89ายà¸\9aอà¸\81ทาง",
+       "navigation": "à¸\81ารà¸\99ำทาง",
        "and": "&#32;และ",
        "qbfind": "ค้นหา",
        "qbbrowse": "สืบค้น",
        "actions": "ปฏิบัติการ",
        "namespaces": "เนมสเปซ",
        "variants": "สิ่งที่แตกต่าง",
-       "navigation-heading": "รายà¸\81ารà¹\80ลือà¸\81à¸\9bà¹\89ายà¸\9aอà¸\81ทาง",
+       "navigation-heading": "รายà¸\81ารà¹\80ลือà¸\81à¸\81ารà¸\99ำทาง",
        "errorpagetitle": "มีข้อผิดพลาด",
-       "returnto": "กลับไปที่ $1",
+       "returnto": "กลับไป $1",
        "tagline": "จาก {{SITENAME}}",
-       "help": "à¸\84ำอà¸\98ิà¸\9aาย",
+       "help": "วิà¸\98ีà¹\83à¸\8aà¹\89",
        "search": "ค้นหา",
        "searchbutton": "ค้นหา",
        "go": "ไป",
        "searcharticle": "ไป",
        "history": "ประวัติหน้า",
        "history_short": "ประวัติ",
-       "updatedmarker": "à¸\96ูà¸\81à¸\9bรัà¸\9aà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\81ารà¹\80à¸\82à¹\89าà¸\8aมà¸\84รัà¹\89à¸\87ลà¹\88าสุà¸\94ของฉัน",
+       "updatedmarker": "à¸\96ูà¸\81à¸\9bรัà¸\9aà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\81ารà¹\80ยีà¹\88ยมà¸\8aมà¸\84รัà¹\89à¸\87สุà¸\94à¸\97à¹\89ายของฉัน",
        "printableversion": "รุ่นพร้อมพิมพ์",
-       "permalink": "à¸\81ารà¹\82ยà¸\87ถาวร",
+       "permalink": "ลิà¸\87à¸\81à¹\8cถาวร",
        "print": "พิมพ์",
        "view": "ดู",
        "view-foreign": "ดูบน $1",
        "otherlanguages": "ในภาษาอื่น",
        "redirectedfrom": "(เปลี่ยนทางจาก $1)",
        "redirectpagesub": "หน้าเปลี่ยนทาง",
-       "lastmodifiedat": "หน้านี้แก้ไขล่าสุดเมื่อวันที่ $1 เวลา $2",
-       "viewcount": "หน้านี้มีการเข้าชม $1 ครั้ง",
+       "redirectto": "เปลี่ยนทางไป:",
+       "lastmodifiedat": "ดัดแปรหน้านี้ล่าสุดเมื่อวันที่ $1 เวลา $2",
+       "viewcount": "มีการเข้าถึงหน้านี้ $1 ครั้ง",
        "protectedpage": "หน้าถูกล็อก",
-       "jumpto": "ข้ามไปยัง:",
-       "jumptonavigation": "à¸\9aอà¸\81ทาง",
+       "jumpto": "ข้ามไป:",
+       "jumptonavigation": "à¸\81ารà¸\99ำทาง",
        "jumptosearch": "ค้นหา",
        "view-pool-error": "ขออภัย ขณะนี้เซิร์ฟเวอร์มีภาระเกิน\nผู้ใช้พยายามดูหน้านี้มากเกินไป\nกรุณารอสักครู่ก่อนเข้าหน้านี้อีกครั้ง\n\n$1",
        "generic-pool-error": "ขออภัย ขณะนี้เซิร์ฟเวอร์โหลดเกิน\nมีผู้ใช้พยายามดูทรัพยากรนี้มากเกินไป\nโปรดรอสักครู่ก่อนลองเข้าถึงทรัพยากรนี้อีกครั้ง",
-       "pool-timeout": "à¹\80à¸\81ิà¸\99à¹\80วลารอà¸\81ารล็อก",
+       "pool-timeout": "หมà¸\94à¹\80วลารอà¸\81ำลัà¸\87รอล็อก",
        "pool-queuefull": "พื้นที่รองรับคิวเต็ม",
        "pool-errorunknown": "เกิดข้อผิดพลาดไม่ทราบสาเหตุ",
        "aboutsite": "เกี่ยวกับ{{SITENAME}}",
        "restorelink": "$1 การแก้ไขที่ถูกลบ",
        "feedlinks": "ฟีด:",
        "feed-invalid": "ฟีดที่สมัครไม่ถูกชนิด",
-       "feed-unavailable": "à¸\9fีà¸\94à¹\84มà¹\88à¸\96ูà¸\81à¹\80à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99",
+       "feed-unavailable": "à¸\9fีà¸\94ยัà¸\87à¹\83à¸\8aà¹\89à¹\84มà¹\88à¹\84à¸\94à¹\89",
        "site-rss-feed": "ฟีดอาร์เอสเอส $1",
        "site-atom-feed": "ฟีดอะตอม $1",
        "page-rss-feed": "ฟีดอาร์เอสเอส \"$1\"",
        "nstab-template": "แม่แบบ",
        "nstab-help": "หน้าวิธีใช้",
        "nstab-category": "หมวดหมู่",
-       "nosuchaction": "à¹\84มà¹\88มีà¸\81ารà¸\81ระà¸\97ำดังกล่าว",
+       "nosuchaction": "à¹\84มà¹\88มีà¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารดังกล่าว",
        "nosuchactiontext": "การกระทำที่กำหนดผ่านยูอาร์แอลดังกล่าวไม่สามารถใช้ได้\nคุณอาจกรอกยูอาร์แอลผิด หรือมาตามลิงก์ที่ไม่ถูกต้อง\nหรืออาจเกิดจากข้อผิดพลาดในซอฟต์แวร์ซึ่ง {{SITENAME}} ใช้อยู่",
        "nosuchspecialpage": "ไม่มีหน้าพิเศษดังกล่าว",
        "nospecialpagetext": "<strong>คุณขอหน้าพิเศษไม่ถูกต้อง</strong>\n\nรายการหน้าพิเศษที่ถูกต้องดูได้ที่ [[Special:SpecialPages|รายการหน้าพิเศษ]]",
-       "error": "ข้อผิดพลาด",
-       "databaseerror": "ข้อผิดพลาดที่ฐานข้อมูล",
-       "databaseerror-text": "à¹\80à¸\81ิà¸\94à¸\84วามผิดพลาดข้อคำถามของฐานข้อมูล\nซึ่งอาจบ่งชี้ว่ามีจุดบกพร่องในซอฟต์แวร์",
-       "databaseerror-textcl": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¸\82à¹\89อà¸\84ำà¸\96ามของฐานข้อมูล",
-       "databaseerror-query": "à¸\82à¹\89อà¸\84ำà¸\96าม: $1",
+       "error": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94",
+       "databaseerror": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¸\97ีà¹\88à¸\90าà¸\99à¸\82à¹\89อมูล",
+       "databaseerror-text": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อผิดพลาดข้อคำถามของฐานข้อมูล\nซึ่งอาจบ่งชี้ว่ามีจุดบกพร่องในซอฟต์แวร์",
+       "databaseerror-textcl": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¸\84ำสัà¹\88à¸\87ของฐานข้อมูล",
+       "databaseerror-query": "à¸\84ำสัà¹\88à¸\87: $1",
        "databaseerror-function": "ฟังก์ชัน: $1",
        "databaseerror-error": "ข้อผิดพลาด: $1",
        "laggedslavemode": "<strong>คำเตือน:</strong> หน้านี้อาจไม่มีการปรับล่าสุด",
        "readonly_lag": "ฐานข้อมูลถูกล็อกอัตโนมัติขณะที่เซิร์ฟเวอร์ฐานข้อมูลรองกำลังปรับปรุงตามฐานข้อมูลหลัก",
        "internalerror": "ข้อผิดพลาดภายใน",
        "internalerror_info": "เกิดข้อผิดพลาดภายใน: $1",
-       "filecopyerror": "ไม่สามารถคัดลอกไฟล์ \"$1\" ไปที่ \"$2\"",
+       "filecopyerror": "ไม่สามารถคัดลอกไฟล์ \"$1\" ไป \"$2\"",
        "filerenameerror": "ไม่สามารถเปลี่ยนชื่อไฟล์ \"$1\" เป็น \"$2\"",
        "filedeleteerror": "ไม่สามารถลบไฟล์ \"$1\"",
-       "directorycreateerror": "à¹\84มà¹\88สามารà¸\96สรà¹\89าà¸\87à¹\84à¸\94à¹\80รà¸\81à¸\97อรี \"$1\"",
+       "directorycreateerror": "à¹\84มà¹\88สามารà¸\96สรà¹\89าà¸\87สารà¸\9aà¸\9a \"$1\"",
        "filenotfound": "ไม่พบไฟล์ \"$1\"",
-       "unexpected": "à¸\9cลà¸\97ีà¹\88à¹\84มà¹\88à¸\84าà¸\94à¸\84ิà¸\94: \"$1\"=\"$2\"",
-       "formerror": "ข้อผิดพลาด: ส่งแบบไม่ได้",
+       "unexpected": "à¸\84à¹\88าà¹\84มà¹\88à¸\84าà¸\94หมาย: \"$1\"=\"$2\"",
+       "formerror": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94: à¸ªà¹\88à¸\87à¹\81à¸\9aà¸\9aà¹\84มà¹\88à¹\84à¸\94à¹\89",
        "badarticleerror": "ไม่สามารถดำเนินปฏิบัติการนี้ในหน้านี้",
-       "cannotdelete": "à¹\84มà¹\88สามารà¸\96ลà¸\9aหà¸\99à¹\89าหรือà¹\84à¸\9fลà¹\8c \"$1\" \nอาà¸\88มีà¸\9cูà¹\89อืà¹\88à¸\99ลบไปแล้ว",
+       "cannotdelete": "à¹\84มà¹\88สามารà¸\96ลà¸\9aหà¸\99à¹\89าหรือà¹\84à¸\9fลà¹\8c \"$1\" \nà¸\9cูà¹\89อืà¹\88à¸\99อาà¸\88ลบไปแล้ว",
        "cannotdelete-title": "ไม่สามารถลบหน้า ''$1''",
        "delete-hook-aborted": "การลบถูกฮุกยกเลิก\nโดยไม่มีคำชี้แจง",
        "no-null-revision": "ไม่สามารถสร้างรุ่นว่างใหม่ของหน้า \"$1\"",
        "badtitle": "ใช้ชื่อเรื่องนี้ไม่ได้",
        "badtitletext": "ชื่อหน้าที่ขอไม่ถูกต้อง เป็นชื่อว่าง หรือชื่อข้ามภาษาหรือข้ามวิกิที่เชื่อมโยงไม่ถูกต้อง\nอาจมีอักขระที่ไม่สามารถใช้ในชื่อเรื่องได้",
-       "perfcached": "ข้อมูลต่อไปนี้ถูกเก็บในแคช และอาจล้าสมัย มีผลการค้นหาสูงสุด $1 รายการในแคช",
-       "perfcachedts": "ข้อมูลต่อไปนี้ถูกเก็บในแคช และได้รับการปรับล่าสุดเมื่อ $1 ผลลัพธ์สูงสุด $4 รายการสามารถเก็บในแคชได้",
+       "perfcached": "ข้อมูลต่อไปนี้ถูกเก็บในแคชและอาจล้าสมัย มีผลการค้นหาสูงสุด $1 รายการในแคช",
+       "perfcachedts": "ข้อมูลต่อไปนี้ถูกเก็บในแคชและถูกปรับล่าสุดเมื่อ $1 มีผลลัพธ์สูงสุด $4 รายการในแคชได้",
        "querypage-no-updates": "ขณะนี้ปิดใช้งานการปรับหน้านี้ \nข้อมูลในที่นี้จะไม่รีเฟรชเป็นปัจจุบัน",
        "viewsource": "ดูโค้ด",
        "viewsource-title": "ดูโค้ดสำหรับ $1",
        "protectedpagetext": "หน้านี้ถูกล็อกเพื่อป้องกันการแก้ไขหรือปฏิบัติการอื่น",
        "viewsourcetext": "คุณสามารถดูและคัดลอกโค้ดของหน้านี้:",
        "viewyourtext": "คุณสามารถดูและคัดลอกต้นฉบับ<strong>การแก้ไขของคุณ</strong>มายังหน้านี้ได้:",
-       "protectedinterface": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99à¸\82à¹\89อà¸\84วามอิà¸\99à¹\80à¸\95อรà¹\8cà¹\80à¸\9fà¸\8bสำหรัà¸\9aà¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cà¸\9aà¸\99วิà¸\81ิà¸\99ีà¹\89 à¹\81ละà¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¹\80à¸\9eืà¹\88อมิà¹\83หà¹\89มีการกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
-       "editinginterface": "'''คำเตือน:''' คุณกำลังแก้ไขหน้าที่ใช้เพื่อให้ข้อความอินเตอร์เฟซแก่ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะกระทบต่อลักษณะของอินเตอร์เฟซผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้\nในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/wiki/Main_Page?setlang=th translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
+       "protectedinterface": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99à¸\95à¹\88อà¸\9bระสาà¸\99สำหรัà¸\9aà¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cà¸\9aà¸\99วิà¸\81ิà¸\99ีà¹\89 à¹\81ละà¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99การกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
+       "editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะกระทบต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้\nในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/wiki/Main_Page?setlang=th translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
        "cascadeprotected": "หน้านี้ถูกป้องกันมิให้แก้ไข เพราะถูกรวมอยู่ในหน้าซึ่งถูกล็อกโดยเปิดตัวเลือก \"ทบทุกลำดับขั้น\":\n$2",
        "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
-       "customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้าสไตล์ CSS นี้ เพราะมีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
+       "customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้ เพราะมีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "customjsprotected": "คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้ เพราะหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
-       "mycustomcssprotected": "à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89แก้ไขหน้าซีเอสเอสนี้",
-       "mycustomjsprotected": "à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89แก้ไขหน้าจาวาสคริปต์นี้",
-       "myprivateinfoprotected": "à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89แก้ไขข้อมูลส่วนตัวของคุณ",
-       "mypreferencesprotected": "à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89แก้ไขการตั้งค่าของคุณ",
+       "mycustomcssprotected": "à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิแก้ไขหน้าซีเอสเอสนี้",
+       "mycustomjsprotected": "à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิแก้ไขหน้าจาวาสคริปต์นี้",
+       "myprivateinfoprotected": "à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิแก้ไขข้อมูลส่วนตัวของคุณ",
+       "mypreferencesprotected": "à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิแก้ไขการตั้งค่าของคุณ",
        "ns-specialprotected": "ไม่สามารถแก้ไขหน้าพิเศษ",
        "titleprotected": "ชื่อเรื่องนี้ถูก [[User:$1|$1]] ป้องกันมิให้สร้าง\nเหตุผลที่ให้ไว้คือ ''<em>$2</em>''",
        "filereadonlyerror": "ไม่สามารถแก้ไขไฟล์ \"$1\" เพราะที่เก็บไฟล์ \"$2\" อยู่ในภาวะอ่านอย่างเดียว\n\nผู้ดูแลระบบที่ล็อกให้คำอธิบายว่า: \"$3\"",
        "exception-nologin-text-manual": "โปรด$1เพื่อสามารถเข้าถึงหน้าหรือปฏิบัติการนี้",
        "virus-badscanner": "โครงแบบผิดพลาด: ไม่รู้จักตัวสแกนไวรัส: <em>$1</em>",
        "virus-scanfailed": "การสแกนล้มเหลว (โค้ด $1)",
-       "virus-unknownscanner": "à¹\84มà¹\88รูà¹\89à¸\88ัà¸\81à¹\82à¸\9bรà¹\81à¸\81รมà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¹\84วรัสà¸\95ัวà¸\99ีà¹\89:",
-       "logouttext": "<strong>à¸\84ุà¸\93ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8cà¹\81ลà¹\89ว</strong>\n\nหมายà¹\80หà¸\95ุวà¹\88า à¸\9aาà¸\87หà¸\99à¹\89าอาà¸\88ยัà¸\87à¹\81สà¸\94à¸\87à¸\9cลà¹\80สมือà¸\99วà¹\88าà¸\84ุà¸\93ยัà¸\87ลà¹\87อà¸\81อิà¸\99อยูà¹\88 à¸\88à¸\99à¸\81วà¹\88าà¸\84ุà¸\93à¸\88ะลà¹\89าà¸\87à¹\81à¸\84à¸\8aà¹\80à¸\9aราวà¹\8cà¹\80à¸\8bอรà¹\8cà¸\82อà¸\87à¸\84ุà¸\93",
+       "virus-unknownscanner": "à¹\82à¸\9bรà¹\81à¸\81รมà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¹\84วรัสà¸\97ีà¹\88à¹\84มà¹\88รูà¹\89à¸\88ัà¸\81:",
+       "logouttext": "<strong>คุณล็อกเอาต์แล้ว</strong>\n\nหมายเหตุว่า บางหน้าอาจยังแสดงผลเสมือนว่าคุณยังล็อกอินอยู่ จนกว่าคุณล้างแคชเบราว์เซอร์ของคุณ",
        "welcomeuser": "ยินดีต้อนรับ $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": "กรอกรหัสผ่าน",
+       "userlogin-yourpassword-ph": "กรอกรหัสผ่านของคุณ",
        "createacct-yourpassword-ph": "กรอกรหัสผ่าน",
        "yourpasswordagain": "พิมพ์รหัสผ่านอีกครั้ง:",
        "createacct-yourpasswordagain": "ยืนยันรหัสผ่าน",
        "userlogin-createanother": "สร้างอีกบัญชี",
        "createacct-emailrequired": "ที่อยู่อีเมล",
        "createacct-emailoptional": "ที่อยู่อีเมล (เลือกไม่ใส่ได้)",
-       "createacct-email-ph": "กรอกที่อยู่อีเมล",
+       "createacct-email-ph": "กรอกที่อยู่อีเมลของคุณ",
        "createacct-another-email-ph": "กรอกที่อยู่อีเมล",
        "createaccountmail": "ใช้รหัสผ่านสุ่มชั่วคราวและส่งไปยังที่อยู่อีเมลที่ระบุ",
        "createacct-realname": "ชื่อจริง (เลือกไม่ใส่ได้)",
        "createacct-benefit-heading": "{{SITENAME}}สร้างขึ้นจากคนเช่นคุณ",
        "createacct-benefit-body1": "$1 การแก้ไข",
        "createacct-benefit-body2": "$1 หน้า",
-       "createacct-benefit-body3": "$1 ผู้ร่วมเขียน",
-       "badretype": "รหัสผ่านที่คุณกรอกไม่ตรงกัน",
+       "createacct-benefit-body3": "$1 ผู้ร่วมเขียนล่าสุด",
+       "badretype": "รหัสผ่านที่คุณกรอกไม่ตรง",
        "userexists": "ชื่อผู้ใช้ที่กรอกมีผู้ใช้แล้ว \nกรุณาเลือกชื่ออื่น",
        "loginerror": "ล็อกอินผิดพลาด",
        "createacct-error": "การสร้างบัญชีผิดพลาด",
        "nocookiesfornew": "บัญชีผู้ใช้ไม่ถูกสร้าง เนื่องจากเราไม่สามารถยืนยันต้นทาง\nกรุณาทำให้แน่ใจว่าคุณได้เปิดใช้งานคุกกี้ โหลดหน้านี้ใหม่และลองอีกครั้ง",
        "noname": "คุณไม่ได้ใส่ชื่อผู้ใช้ที่ถูกต้อง",
        "loginsuccesstitle": "ล็อกอินสำเร็จ",
-       "loginsuccess": "<strong>à¸\82à¸\93ะà¸\99ีà¹\89à¸\84ุà¸\93ลà¹\87อà¸\81อิà¸\99à¹\80à¸\82à¹\89าสูà¹\88 {{SITENAME}} à¸\94à¹\89วยชื่อ \"$1\"</strong>",
+       "loginsuccess": "<strong>à¸\82à¸\93ะà¸\99ีà¹\89à¸\84ุà¸\93ลà¹\87อà¸\81อิà¸\99สูà¹\88 {{SITENAME}} à¹\83à¸\99ชื่อ \"$1\"</strong>",
        "nosuchuser": "ไม่มีผู้ใช้ชื่อ \"$1\"\nชื่อผู้ใช้นั้นไวต่ออักษรใหญ่เล็ก\nกรุณาตรวจการสะกดอีกครั้ง หรือ[[Special:UserLogin/signup|สร้างบัญชีใหม่]]",
        "nosuchusershort": "ไม่มีผู้ใช้ชื่อ \"$1\" \nกรุณาตรวจสอบการสะกด",
        "nouserspecified": "คุณต้องระบุชื่อผู้ใช้",
        "password-login-forbidden": "ห้ามใช้ชื่อผู้ใช้และรหัสผ่านนี้",
        "mailmypassword": "ตั้งรหัสผ่านใหม่",
        "passwordremindertitle": "รหัสผ่านชั่วคราวใหม่สำหรับ {{SITENAME}}",
-       "passwordremindertext": "à¸\9cูà¹\89à¹\83à¸\94à¸\9cูà¹\89หà¸\99ึà¹\88à¸\87 (à¸\8bึà¹\88à¸\87อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\97ีà¹\88à¹\83à¸\8aà¹\89เลขที่อยู่ไอพี $1) ขอให้ส่งรหัสผ่านใหม่ของ {{SITENAME}} ($4) รหัสผ่านชั่วคราวสำหรับผู้ใช้ \"$2\" ถูกสร้างขึ้น และกำหนดเป็น \"$3\" หากเป็นเจตนาของคุณ คุณจำต้องล็อกอินและเลือกรหัสผ่านใหม่ในขณะนี้ \nรหัสผ่านชั่วคราวของคุณจะหมดอายุใน $5 วัน\n\nหากเป็นบุคคลอื่นที่ขอรหัสผ่านใหม่ หรือหากคุณจำรหัสผ่านของคุณได้แล้ว และไม่ต้องการเปลี่ยนรหัสผ่านใหม่อีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
+       "passwordremindertext": "à¸\9cูà¹\89à¹\83à¸\94à¸\9cูà¹\89หà¸\99ึà¹\88à¸\87 (à¸\8bึà¹\88à¸\87อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\88าà¸\81เลขที่อยู่ไอพี $1) ขอให้ส่งรหัสผ่านใหม่ของ {{SITENAME}} ($4) รหัสผ่านชั่วคราวสำหรับผู้ใช้ \"$2\" ถูกสร้างขึ้น และกำหนดเป็น \"$3\" หากเป็นเจตนาของคุณ คุณจำต้องล็อกอินและเลือกรหัสผ่านใหม่ในขณะนี้ \nรหัสผ่านชั่วคราวของคุณจะหมดอายุใน $5 วัน\n\nหากเป็นบุคคลอื่นที่ขอรหัสผ่านใหม่ หรือหากคุณจำรหัสผ่านของคุณได้แล้ว และไม่ต้องการเปลี่ยนรหัสผ่านใหม่อีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
        "noemail": "ไม่มีการบันทึกที่อยู่อีเมลสำหรับผู้ใช้ \"$1\"",
        "noemailcreate": "คุณจำต้องใส่ที่อยู่อีเมลให้ถูกต้อง",
        "passwordsent": "รหัสผ่านใหม่ถูกส่งไปยังที่อยู่อีเมลที่ลงทะเบียนไว้ของ \"$1\"\nกรุณาล็อกอินอีกครั้งหลังได้รับอีเมล",
        "cannotchangeemail": "ไม่สามารถเปลี่ยนที่อยู่อีเมลบนวิกินี้",
        "emaildisabled": "เว็บไซต์นี้ไม่สามารถส่งอีเมล",
        "accountcreated": "สร้างบัญชีแล้ว",
-       "accountcreatedtext": "à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9a [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|à¸\9eูà¸\94à¸\84ุย]]) à¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99แล้ว",
+       "accountcreatedtext": "สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9a [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|à¸\9eูà¸\94à¸\84ุย]]) แล้ว",
        "createaccount-title": "การสร้างบัญชีสำหรับ {{SITENAME}}",
        "createaccount-text": "มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ \"$2\" และรหัสผ่าน \"$3\" \nคุณควรล็อกอินและเปลี่ยนรหัสผ่านทันที\n\nคุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เป็นความผิดพลาด",
        "login-throttled": "ที่ผ่านมาคุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
        "newpassword": "รหัสผ่านใหม่:",
        "retypenew": "พิมพ์รหัสผ่านใหม่อีกครั้ง:",
        "resetpass_submit": "ตั้งรหัสผ่านและล็อกอิน",
-       "changepassword-success": "เปลี่ยนรหัสผ่านของคุณสำเร็จ",
-       "changepassword-throttled": "คุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
+       "changepassword-success": "เปลี่ยนรหัสผ่านของคุณสำเร็จ!",
+       "changepassword-throttled": "ลà¹\88าสุà¸\94à¸\84ุà¸\93à¸\9eยายามลà¹\87อà¸\81อิà¸\99มาà¸\81à¸\84รัà¹\89à¸\87à¹\80à¸\81ิà¸\99à¹\84à¸\9b\nà¸\81รุà¸\93ารอ $1 à¸\81à¹\88อà¸\99ลอà¸\87อีà¸\81à¸\84รัà¹\89à¸\87",
        "resetpass_forbidden": "ไม่สามารถเปลี่ยนรหัสผ่านได้",
        "resetpass-no-info": "คุณต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง",
        "resetpass-submit-loggedin": "เปลี่ยนรหัสผ่าน",
        "resetpass-submit-cancel": "ยกเลิก",
-       "resetpass-wrong-oldpass": "รหัสผ่านชั่วคราวหรือปัจจุบันไม่ถูกต้อง\nคุณอาจเปลี่ยนรหัสผ่านของคุณแล้ว หรือขอรหัสผ่านชั่วคราวใหม่แล้ว",
+       "resetpass-wrong-oldpass": "รหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวหรือà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87\nà¸\84ุà¸\93อาà¸\88à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99à¸\82อà¸\87à¸\84ุà¸\93สำà¹\80รà¹\87à¸\88à¹\81ลà¹\89ว à¸«à¸£à¸·à¸­à¸\82อรหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวà¹\83หมà¹\88à¹\81ลà¹\89ว",
        "resetpass-recycled": "โปรดตั้งรหัสผ่านใหม่ให้ต่างจากรหัสผ่านปัจจุบัน",
        "resetpass-temp-emailed": "คุณล็อกอินด้วยรหัสผ่านชั่วคราวที่ส่งทางอีเมล\nคุณต้องตั้งรหัสผ่านใหม่ที่นี่จึงจะเสร็จสิ้นการล็อกอิน:",
        "resetpass-temp-password": "รหัสผ่านชั่วคราว:",
        "resetpass-expired-soft": "รหัสผ่านของคุณหมดอายุแล้วและจำเป็นต้องตั้งใหม่ โปรดเลือกรหัสผ่านใหม่ขณะนี้ หรือคลิก \"{{int:resetpass-submit-cancel}}\" เพื่อตั้งใหม่ทีหลัง",
        "resetpass-validity-soft": "รหัสผ่านของคุณไม่สมเหตุสมผล: $1\n\nโปรดเลือดรหัสผ่านใหม่ในขณะนี้ หรือคลิก \"{{int:resetpass-submit-cancel}}\" เพื่อตั้งใหม่ทีหลัง",
        "passwordreset": "ตั้งรหัสผ่านใหม่",
-       "passwordreset-text-one": "à¸\81รอà¸\81à¹\81à¸\9aà¸\9aà¸\99ีà¹\89à¹\80à¸\9eืà¹\88อà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88",
-       "passwordreset-text-many": "{{PLURAL:$1|กรอกเขตข้อมูลหนึ่งเพื่อรับรหัสผ่านชั่วคราวทางอีเมล}}",
-       "passwordreset-legend": "à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99",
+       "passwordreset-text-one": "à¸\81รอà¸\81à¹\81à¸\9aà¸\9aà¸\99ีà¹\89à¹\80à¸\9eืà¹\88อรัà¸\9aรหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวà¹\82à¸\94ยà¸\97าà¸\87อีà¹\80มล",
+       "passwordreset-text-many": "{{PLURAL:$1|à¸\81รอà¸\81à¹\80à¸\82à¸\95à¸\82à¹\89อมูลหà¸\99ึà¹\88à¸\87à¹\80à¸\9eืà¹\88อรัà¸\9aรหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวà¹\82à¸\94ยà¸\97าà¸\87อีà¹\80มล}}",
+       "passwordreset-legend": "à¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88",
        "passwordreset-disabled": "วิกินี้ปิดใช้งานการตั้งรหัสผ่านใหม่",
        "passwordreset-emaildisabled": "วิกินี้ปิดใช้งานคุณลักษณะอีเมล",
        "passwordreset-username": "ชื่อผู้ใช้:",
        "passwordreset-domain": "โดเมน:",
        "passwordreset-capture": "ดูอีเมลที่ได้หรือไม่",
-       "passwordreset-capture-help": "หาà¸\81à¸\84ุà¸\93à¹\80ลือà¸\81à¸\81ลà¹\88อà¸\87à¸\99ีà¹\89 à¸­à¸µà¹\80มลà¸\94ัà¸\87à¸\81ลà¹\88าว (à¸\9eรà¹\89อมรหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราว) à¸\88ะà¹\81สà¸\94à¸\87แก่คุณ เช่นเดียวกับส่งไปยังผู้ใช้",
+       "passwordreset-capture-help": "หาà¸\81à¸\84ุà¸\93à¹\80ลือà¸\81à¸\81ลà¹\88อà¸\87à¸\99ีà¹\89 à¸\88ะà¹\81สà¸\94à¸\87อีà¹\80มลà¸\94ัà¸\87à¸\81ลà¹\88าว (à¸\9eรà¹\89อมรหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราว) แก่คุณ เช่นเดียวกับส่งไปยังผู้ใช้",
        "passwordreset-email": "ที่อยู่อีเมล:",
        "passwordreset-emailtitle": "รายละเอียดบัญชีบน {{SITENAME}}",
-       "passwordreset-emailtext-ip": "à¸\9aาà¸\87à¸\84à¸\99 (à¸\8bึà¹\88à¸\87อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\88าà¸\81à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี $1) à¸£à¹\89อà¸\87à¸\82อà¸\81ารตั้งรหัสผ่านของคุณใหม่บน{{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
-       "passwordreset-emailtext-user": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89 $1 à¸\82อà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¹\83หมà¹\88à¸\9aà¸\99{{SITENAME}} ($4) {{PLURAL:$3||}}บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
+       "passwordreset-emailtext-ip": "à¸\9aาà¸\87à¸\84à¸\99 (à¸\8bึà¹\88à¸\87อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\88าà¸\81à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี $1) à¸\82อตั้งรหัสผ่านของคุณใหม่บน{{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
+       "passwordreset-emailtext-user": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89 $1 à¸\9aà¸\99 {{SITENAME}} à¸\82อà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¹\83หมà¹\88สำหรัà¸\9a {{SITENAME}} ($4) {{PLURAL:$3||}}บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
        "passwordreset-emailelement": "ชื่อผู้ใช้: $1\nรหัสผ่านชั่วคราว: $2",
        "passwordreset-emailsent": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้ว",
        "passwordreset-emailsent-capture": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้ว ซึ่งแสดงด้านล่าง",
        "passwordreset-emailerror-capture": "อีเมลตั้งรหัสผ่านใหม่ถูกสร้างขึ้นแล้ว ซึ่งแสดงด้านล่าง แต่ไม่สามารถส่งไปยัง{{GENDER:$2|ผู้ใช้}}: $1",
        "changeemail": "เปลี่ยนที่อยู่อีเมล",
-       "changeemail-header": "เปลี่ยนที่อยู่อีเมลของบัญชี",
        "changeemail-text": "กรอกแบบนี้เพื่อเปลี่ยนที่อยู่อีเมลของคุณ คุณต้องกรอกรหัสผ่านเพื่อยืนยันการเปลี่ยนแปลงนี้",
        "changeemail-no-info": "คุณจำต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง",
        "changeemail-oldemail": "ที่อยู่อีเมลปัจจุบัน:",
        "changeemail-none": "(ไม่มี)",
        "changeemail-password": "รหัสผ่าน {{SITENAME}} ของคุณ:",
        "changeemail-submit": "เปลี่ยนอีเมล",
-       "changeemail-cancel": "ยกเลิก",
        "changeemail-throttled": "คุณได้พยายามล็อกอินหลายครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
        "resettokens": "ตั้งโทเค็นใหม่",
        "resettokens-text": "คุณสามารถตั้งโทเค็นใหม่ ซึ่งให้การเข้าถึงข้อมูลส่วนตัวบางอย่างที่เกี่ยวข้องกับบัญชีของคุณที่นี่\n\nคุณควรตั้งโทเค็นใหม่ หากคุณบอกผู้อื่นโดยมิได้ตั้งใจหรือบัญชีของคุณถูกเจาะ",
        "resettokens-legend": "ตั้งโทเค็นใหม่",
        "resettokens-tokens": "โทเค็น:",
        "resettokens-token-label": "$1 (ค่าปัจจุบัน: $2)",
-       "resettokens-watchlist-token": "à¹\82à¸\97à¹\80à¸\84à¹\87à¸\99à¸\81ารà¸\9bà¹\89อà¸\99à¹\80วà¹\87à¸\9a (Atom/RSS) à¸\82อà¸\87[[Special:Watchlist|à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\84à¸\9bยัà¸\87หน้าในรายการเฝ้าดูของคุณ]]",
+       "resettokens-watchlist-token": "à¹\82à¸\97à¹\80à¸\84à¹\87à¸\99สำหรัà¸\9aà¹\80วà¹\87à¸\9aà¸\9fีà¸\94 (Atom/RSS) à¸\82อà¸\87[[Special:Watchlist|à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\81à¸\81à¹\88หน้าในรายการเฝ้าดูของคุณ]]",
        "resettokens-done": "ตั้งโทเค็นใหม่แล้ว",
        "resettokens-resetbutton": "ตั้งโทเค็นที่เลือกใหม่",
        "bold_sample": "ข้อความตัวหนา",
        "sig_tip": "ลายเซ็นของคุณพร้อมตราเวลา",
        "hr_tip": "เส้นนอน (ใช้อย่างจำกัด)",
        "summary": "คำอธิบายโดยย่อ:",
-       "subject": "หัวà¸\82à¹\89อ/พาดหัว:",
+       "subject": "à¹\80รืà¹\88อà¸\87/พาดหัว:",
        "minoredit": "เป็นการแก้ไขเล็กน้อย",
        "watchthis": "เฝ้าดูหน้านี้",
        "savearticle": "บันทึก",
        "preview": "ตัวอย่าง",
-       "showpreview": "à¸\94ูตัวอย่าง",
+       "showpreview": "à¹\81สà¸\94à¸\87ตัวอย่าง",
        "showdiff": "แสดงความเปลี่ยนแปลง",
        "blankarticle": "<strong>คำเตือน:</strong> หน้าที่คุณกำลังสร้างว่าง หากคุณคลิก \"{{int:savearticle}}\" อีกครั้ง จะสร้างหน้าโดยไม่มีเนื้อหาใด",
-       "anoneditwarning": "'''คำเตือน:''' คุณมิได้ล็อกอิน เลขที่อยู่ไอพีของคุณจะถูกบันทึกไว้ในประวัติการแก้ไขของหน้านี้",
-       "anonpreviewwarning": "'''คุณมิได้ล็อกอิน การบันทึกจะเก็บเลขที่อยู่ไอพีของคุณในประวัติการแก้ไขของหน้านี้'''",
-       "missingsummary": "'''อย่าลืม:''' คุณยังไม่ได้ระบุคำอธิบายการแก้ไข ถ้าคุณกด \"บันทึก\" อีกครั้ง การแก้ไขของคุณจะถูกบันทึกโดยไม่มีคำอธิบายการแก้ไข",
-       "missingcommenttext": "à¸\81รุà¸\93าà¹\83สà¹\88ความเห็นด้านล่าง",
-       "missingcommentheader": "'''ประกาศเตือน:''' คุณยังไม่ได้ใส่หัวข้อ/จ่าหัวสำหรับความเห็นนี้ ถ้าคุณกด \"{{int:savearticle}}\" อีกครั้ง การแก้ไขของคุณจะถูกบันทึกโดยไม่มีหัวข้อ",
-       "summary-preview": "ตัวอย่างคำอธิบายการแก้ไข:",
-       "subject-preview": "à¸\95ัวอยà¹\88าà¸\87หัวà¸\82à¹\89อ/พาดหัว:",
+       "anoneditwarning": "<strong>คำเตือน:</strong> คุณมิได้ล็อกอิน สาธารณะจะเห็นเลขที่อยู่ไอพีของคุณหากคุณแก้ไข หากคุณ<strong>[$1 ล็อกอิน]</strong>หรือ<strong>[$2 สร้างบัญชี]</strong> การแก้ไขของคุณจะถือว่าเป็นของชื่อผู้ใช้ของคุณ ร่วมกับประโยชน์อื่น",
+       "anonpreviewwarning": "<em>คุณมิได้ล็อกอิน การบันทึกจะเก็บเลขที่อยู่ไอพีของคุณในประวัติการแก้ไขของหน้านี้</em>",
+       "missingsummary": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ให้คำอธิบายการแก้ไข \nถ้าคุณคลิก \"{{int:savearticle}}\" อีก จะบันทึกการแก้ไขของคุณโดยไม่มีคำอธิบายการแก้ไข",
+       "missingcommenttext": "à¸\81รุà¸\93าà¸\81รอà¸\81ความเห็นด้านล่าง",
+       "missingcommentheader": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ใส่หัวข้อ/พาดหัวสำหรับความเห็นนี้ \nถ้าคุณคลิก \"{{int:savearticle}}\" อีก จะบันทึกการแก้ไขของคุณโดยไม่มีหัวข้อ/พาดหัว",
+       "summary-preview": "ตัวอย่างคำอธิบาย:",
+       "subject-preview": "à¸\95ัวอยà¹\88าà¸\87à¹\80รืà¹\88อà¸\87/พาดหัว:",
        "blockedtitle": "ผู้ใช้ถูกบล็อก",
-       "blockedtext": "<strong>ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อก</strong>\n\nการบล็อกนี้ดำเนินการโดย $1\nซึ่งให้เหตุผลว่า ''$2''\n\n* เริ่มการบล็อก: $8\n* หมดเขตการบล็อก: $6\n* ผู้ถูกบล็อก: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ได้\nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้ความสามารถนี้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดแสดงรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
-       "autoblockedtext": "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81อัà¸\95à¹\82à¸\99มัà¸\95ิ à¹\80à¸\9eราะมีà¸\9cูà¹\89à¹\83à¸\8aà¹\89อืà¹\88à¸\99à¹\83à¸\8aà¹\89มาà¸\81à¹\88อà¸\99 à¸\8bึà¹\88à¸\87à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\82à¸\94ย $1\nà¹\82à¸\94ยà¹\83หà¹\89à¹\80หà¸\95ุà¸\9cลวà¹\88า\n\n:<em>$2</em>\n\n* à¹\80ริà¹\88มà¸\81ารà¸\9aลà¹\87อà¸\81: $8\n* à¸ªà¸´à¹\89à¸\99สุà¸\94à¸\81ารà¸\9aลà¹\87อà¸\81: $6\n* à¸\9cูà¹\89à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81: $7\n\nà¸\84ุà¸\93สามารà¸\96à¸\95ิà¸\94à¸\95à¹\88อ $1 à¸«à¸£à¸·à¸­[[{{MediaWiki:Grouppage-sysop}}|à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a]]à¸\84à¸\99อืà¹\88à¸\99à¹\80à¸\9eืà¹\88อหารือการบล็อกนี้ \nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลที่ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดรวมรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
+       "blockedtext": "<strong>ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อก</strong>\n\nการบล็อกนี้ดำเนินการโดย $1\nซึ่งให้เหตุผลว่า ''$2''\n\n* เริ่มการบล็อก: $8\n* หมดเขตการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ได้\nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้ความสามารถนี้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดแสดงรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
+       "autoblockedtext": "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81อัà¸\95à¹\82à¸\99มัà¸\95ิ à¹\80à¸\9eราะà¹\80à¸\84ยมีà¸\9cูà¹\89à¹\83à¸\8aà¹\89อืà¹\88à¸\99à¹\83à¸\8aà¹\89 à¸\8bึà¹\88à¸\87à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\82à¸\94ย $1\nà¹\82à¸\94ยà¹\83หà¹\89à¹\80หà¸\95ุà¸\9cลวà¹\88า\n\n:<em>$2</em>\n\n* à¹\80ริà¹\88มà¸\81ารà¸\9aลà¹\87อà¸\81: $8\n* à¸ªà¸´à¹\89à¸\99สุà¸\94à¸\81ารà¸\9aลà¹\87อà¸\81: $6\n* à¸\9cูà¹\89à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¸\97ีà¹\88à¹\80à¸\88à¸\95à¸\99า: $7\n\nà¸\84ุà¸\93สามารà¸\96à¸\95ิà¸\94à¸\95à¹\88อ $1 à¸«à¸£à¸·à¸­[[{{MediaWiki:Grouppage-sysop}}|à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a]]à¸\84à¸\99อืà¹\88à¸\99à¹\80à¸\9eืà¹\88ออภิà¸\9bรายการบล็อกนี้ \nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลที่ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดรวมรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
        "blockednoreason": "ไม่ได้ให้เหตุผล",
        "whitelistedittext": "คุณต้อง$1เพื่อแก้ไขหน้า",
-       "confirmedittext": "คุณต้องยืนยันที่อยู่อีเมลของคุณก่อนแก้ไขหน้า โปรดกำหนดที่อยู่อีเมลของคุณและทำให้ถูกต้องผ่าน[[Special:Preferences|การตั้งค่าผู้ใช้]]",
+       "confirmedittext": "คุณต้องยืนยันที่อยู่อีเมลของคุณก่อนแก้ไขหน้า \nโปรดตั้งและตรวจสอบความสมเหตุสมผลของที่อยู่อีเมลของคุผ่าน[[Special:Preferences|การตั้งค่าผู้ใช้]]",
        "nosuchsectiontitle": "ไม่พบส่วน",
-       "nosuchsectiontext": "คุณพยายามแก้ไขส่วนที่ไม่มีอยู่ ส่วนดังกล่าวอาจถูกย้ายหรือลบขณะที่คุณดูหน้าอยู่",
-       "loginreqtitle": "à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87ลà¹\87อà¸\81อิà¸\99",
+       "nosuchsectiontext": "คุณพยายามแก้ไขส่วนที่ไม่มีอยู่ \nส่วนดังกล่าวอาจถูกย้ายหรือลบขณะที่คุณดูหน้าอยู่",
+       "loginreqtitle": "ต้องล็อกอิน",
        "loginreqlink": "ล็อกอิน",
-       "loginreqpagetext": "à¸\84ุà¸\93à¸\95à¹\89อà¸\87$1เพื่อดูหน้าอื่น",
+       "loginreqpagetext": "à¸\81รุà¸\93า$1เพื่อดูหน้าอื่น",
        "accmailtitle": "ส่งรหัสผ่านแล้ว",
-       "accmailtext": "รหัสà¸\9cà¹\88าà¸\99à¹\81à¸\9aà¸\9aสุà¹\88มà¸\82อà¸\87 [[User talk:$1|$1]] à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bยัà¸\87 $2 à¹\81ลà¹\89ว à¸ªà¸²à¸¡à¸²à¸£à¸\96à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99à¹\83à¸\99หà¸\99à¹\89า''[[Special:ChangePassword|à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99]]'' หลังล็อกอิน",
+       "accmailtext": "สà¹\88à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\81à¸\9aà¸\9aสุà¹\88มà¸\82อà¸\87 [[User talk:$1|$1]] à¹\84à¸\9b $2 à¹\81ลà¹\89ว à¸ªà¸²à¸¡à¸²à¸£à¸\96à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99à¹\83à¸\99หà¸\99à¹\89า<em>[[Special:ChangePassword|à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99]]</em> หลังล็อกอิน",
        "newarticle": "(ใหม่)",
-       "newarticletext": "คุณตามลิงก์ไปยังหน้าที่ยังไม่มีในขณะนี้\nในการสร้างหน้า เริ่มพิมพ์ในกล่องด้านล่าง (ดูข้อมูลเพิ่มเติมใน[$1 หน้าคำอธิบาย])\nถ้าคุณเข้ามาหน้านี้โดยผิดพลาด ให้กดปุ่ม'''ถอยหลัง''' (back) ของเบราว์เซอร์",
-       "anontalkpagetext": "----\n<em>หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99ามà¸\8bึà¹\88à¸\87ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีหรือà¹\84มà¹\88à¹\84à¸\94à¹\89à¹\83à¸\8aà¹\89</em>\nดังนั้นเราจึงระบุตัวตนโดยใช้เลขที่อยู่ไอพีแทน\nเลขที่อยู่ไอพีนี้อาจมีผู้ใช้ร่วมกันหลายคน\nถ้าคุณเป็นผู้ใช้นิรนาม และรู้สึกว่าคุณได้รับความเห็นที่ไม่เกี่ยวข้องส่งหาคุณ กรุณา[[Special:UserLogin/signup|สร้างบัญชี]]หรือ[[Special:UserLogin|ล็อกอิน]] เพื่อป้องกันการสับสนกับผู้ใช้นิรนามรายอื่นในอนาคต",
+       "newarticletext": "คุณตามลิงก์ไปยังหน้าที่ยังไม่มีในขณะนี้\nในการสร้างหน้า เริ่มพิมพ์ในกล่องด้านล่าง (ดูข้อมูลเพิ่มเติมใน[$1 หน้าคำอธิบาย])\nถ้าคุณเข้ามาหน้านี้โดยผิดพลาด ให้กดปุ่ม<strong>ถอยหลัง</strong> (back) ของเบราว์เซอร์",
+       "anontalkpagetext": "----\n<em>หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99ามà¸\8bึà¹\88à¸\87ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89สรà¹\89าà¸\87หรือà¹\83à¸\8aà¹\89à¸\9aัà¸\8dà¸\8aี</em>\nดังนั้นเราจึงระบุตัวตนโดยใช้เลขที่อยู่ไอพีแทน\nเลขที่อยู่ไอพีนี้อาจมีผู้ใช้ร่วมกันหลายคน\nถ้าคุณเป็นผู้ใช้นิรนาม และรู้สึกว่าคุณได้รับความเห็นที่ไม่เกี่ยวข้องส่งหาคุณ กรุณา[[Special:UserLogin/signup|สร้างบัญชี]]หรือ[[Special:UserLogin|ล็อกอิน]] เพื่อป้องกันการสับสนกับผู้ใช้นิรนามรายอื่นในอนาคต",
        "noarticletext": "ปัจจุบันไม่มีข้อความในหน้านี้\nคุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อหน้านี้]]ในหน้าอื่น <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": "บัญชีผู้ใช้ \"$1\" มิได้ลงทะเบียน \nกรุณาตรวจสอบหากคุณต้องการสร้าง/แก้ไขหน้านี้",
        "userpage-userdoesnotexist-view": "บัญชีผู้ใช้ \"$1\" มิได้ลงทะเบียน",
        "blocked-notice-logextract": "ปัจจุบันผู้ใช้นี้ถูกบล็อก\nหน่วยปูมการบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:",
-       "clearyourcache": "'''หมายเหตุ:''' หลังจากบันทึก คุณอาจต้องล้างแคชเว็บเบราว์เซอร์ของคุณเพื่อดูการเปลี่ยนแปลง\n* '''ไฟร์ฟอกซ์ / ซาฟารี:''' กดปุ่ม ''Shift'' ค้างไว้ขณะคลิก ''Reload'' หรือกด ''Ctrl-F5'' หรือ ''Ctrl-R'' (''⌘-R'' บนแมค)\n* '''กูเกิล โครม:''' กดปุ่ม ''Ctrl-Shift-R'' (''⌘-Shift-R'' บนแมค)\n* '''อินเทอร์เน็ตเอกซ์พลอเรอร์:''' กดปุ่ม ''Ctrl'' ค้างไว้ขณะคลิก ''Refresh'' หรือกด ''Ctrl-F5''\n* '''โอเปร่า:''' ล้างแคชใน ''Tools → Preferences''",
-       "usercssyoucanpreview": "'''คำแนะนำ:''' กดปุ่ม \"{{int:showpreview}}\" เพื่อทดสอบ CSS ใหม่ของคุณก่อนบันทึก",
-       "userjsyoucanpreview": "'''คำแนะนำ:''' กดปุ่ม \"{{int:showpreview}}\" เพื่อทดสอบจาวาสคริปต์ใหม่ของคุณก่อนบันทึก",
-       "usercsspreview": "'''อย่าลืมว่าคุณกำลังดูตัวอย่าง CSS ผู้ใช้ของคุณ'''\n'''ยังไม่ได้ถูกบันทึก!'''",
-       "userjspreview": "'''อย่าลืมว่าคุณกำลังทดสอบ/ดูตัวอย่างจาวาสคริปต์ผู้ใช้ของคุณ'''\n'''ยังไม่ถูกบันทึก!'''",
-       "sitecsspreview": "'''พึงระลึกว่าคุณกำลังแสดงตัวอย่าง CSS นี้เท่านั้น'''\n'''ยังไม่ได้ถูกบันทึก!'''",
-       "sitejspreview": "'''พึงระลึกว่าคุณกำลังแสดงตัวอย่างโค้ดจาวาสคริปต์นี้เท่านั้น'''\n'''ยังไม่ได้ถูกบันทึก!'''",
-       "userinvalidcssjstitle": "'''คำเตือน:''' ไม่มีหน้าตา \"$1\" หน้า .css และ .js ที่ปรับแต่งเอง ใช้ตัวเล็กทั้งหมด เช่น {{ns:user}}:Foo/vector.css มิใช่ {{ns:user}}:Foo/Vector.css",
+       "clearyourcache": "<strong>หมายเหตุ:</strong> หลังบันทึก คุณอาจต้องล้างแคชเว็บเบราว์เซอร์ของคุณเพื่อดูการเปลี่ยนแปลง\n* <strong>ไฟร์ฟอกซ์ / ซาฟารี:</strong> กด <em>Shift</em> ค้างขณะคลิก <em>Reload</em> หรือกด <em>Ctrl-F5</em> หรือ <em>Ctrl-R</em> (<em>⌘-R</em> บนแมค)\n* <strong>กูเกิล โครม:</strong> กด <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> บนแมค)\n* <strong>อินเทอร์เน็ตเอกซ์พลอเรอร์:</strong> กด <em>Ctrl</em> ค้างขณะคลิก <em>Refresh</em> หรือกด <em>Ctrl-F5</em>\n* <strong>โอเปร่า:</strong> ล้างแคชใน <em>Tools → Preferences</em>",
+       "usercssyoucanpreview": "<strong>คำแนะนำ:</strong> กดปุ่ม \"{{int:showpreview}}\" เพื่อทดสอบ CSS ใหม่ของคุณก่อนบันทึก",
+       "userjsyoucanpreview": "<strong>คำแนะนำ:</strong> กดปุ่ม \"{{int:showpreview}}\" เพื่อทดสอบจาวาสคริปต์ใหม่ของคุณก่อนบันทึก",
+       "usercsspreview": "<strong>พึงระลึกว่าคุณเพียงกำลังดูตัวอย่าง CSS ผู้ใช้ของคุณ\nยังไม่ได้บันทึก!</strong>",
+       "userjspreview": "<strong>พึงระลึกว่าคุณกำลังทดสอบ/ดูตัวอย่างจาวาสคริปต์ผู้ใช้ของคุณ\nยังไม่ได้บันทึก!</strong>",
+       "sitecsspreview": "<strong>พึงระลึกว่าคุณเพียงกำลังแสดงตัวอย่าง CSS นี้\nยังไม่ได้บันทึก!</strong>",
+       "sitejspreview": "<strong>พึงระลึกว่าคุณเพียงกำลังแสดงตัวอย่างโค้ดจาวาสคริปต์นี้\nยังไม่ได้บันทึก!</strong>",
+       "userinvalidcssjstitle": "<strong>คำเตือน:</strong> ไม่มีหน้าตา \"$1\" หน้า .css และ .js ใช้ตัวเล็กทั้งหมด เช่น {{ns:user}}:Foo/vector.css มิใช่ {{ns:user}}:Foo/Vector.css",
        "updated": "(ปรับแล้ว)",
-       "note": "'''หมายเหตุ:'''",
-       "previewnote": "'''พึงระลึกว่านี่เป็นเพียงการแสดงตัวอย่างเท่านั้น'''\nการเปลี่ยนแปลงของคุณยังไม่ได้ถูกบันทึก!",
-       "continue-editing": "à¹\84à¸\9bยัà¸\87à¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¹\81à¸\81à¹\89à¹\84à¸\82",
-       "previewconflict": "à¸\81ารà¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¸\99ีà¹\89สะà¸\97à¹\89อà¸\99à¸\82à¹\89อà¸\84วามà¹\83à¸\99à¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99à¸\9aà¸\99à¸\8bึà¹\88à¸\87à¸\88ะà¸\9bราà¸\81à¸\8fหาà¸\81à¸\84ุà¸\93à¹\80ลือà¸\81à¸\9aัà¸\99à¸\97ึà¸\81",
-       "session_fail_preview": "'''ขออภัย ไม่สามารถดำเนินการแก้ไขต่อได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย'''\nโปรดทดลองอีกครั้ง หากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา",
-       "session_fail_preview_html": "'''ขออภัย ไม่สามารถดำเนินการแก้ไขต่อได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย'''\n\n''เนื่องจาก {{SITENAME}} เปิดใช้งานเอชทีเอ็มแอลล้วน การแสดงตัวอย่างจะถูกซ่อนไว้เพื่อป้องกันการโจมตีด้วยจาวาสคริปต์''\n\n'''หากนี่เป็นความพยายามแก้ไขโดยชอบ โปรดลองอีกครั้งหนึ่ง''' หากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา",
-       "token_suffix_mismatch": "'''การแก้ไขของคุณถูกปฏิเสธ เนื่องจากเครื่องลูกข่ายที่คุณใช้ทำให้อักขระเครื่องหมายวรรคตอนในตราสารประจำการแก้ไข (edit token) เสีย'''\nการแก้ไขนี้ถูกปฏิเสธเพื่อป้องกันการวิบัติของข้อความหน้า\nบางครั้งเกิดปัญหานี้ขึ้นเมื่อคุณใช้บริการเว็บพร็อกซีนิรนามที่มีบั๊ก",
-       "edit_form_incomplete": "'''แบบแก้ไขบางส่วนไปไม่ถึงเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังอยู่และลองอีกครั้ง'''",
+       "note": "<strong>หมายเหตุ:</strong>",
+       "previewnote": "<strong>พึงระลึกว่านี่เป็นเพียงการแสดงตัวอย่าง</strong>\nยังไม่ได้บันทึกการเปลี่ยนแปลงของคุณ!",
+       "continue-editing": "ไปพื้นที่แก้ไข",
+       "previewconflict": "ตัวอย่างนี้สะท้อนข้อความในพื้นที่แก้ไขข้อความส่วนบนซึ่งจะปรากฏหากคุณเลือกบันทึก",
+       "session_fail_preview": "<strong>ขออภัย! ไม่สามารถดำเนินการแก้ไขของคุณได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย</strong>\nโปรดลองอีกครั้ง \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา",
+       "session_fail_preview_html": "<strong>ขออภัย! ไม่สามารถดำเนินการแก้ไขของคุณต่อได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย</strong>\n\n<em>เนื่องจาก {{SITENAME}} เปิดใช้งานเอชทีเอ็มแอลล้วน การแสดงตัวอย่างจะถูกซ่อนไว้เพื่อป้องกันการโจมตีด้วยจาวาสคริปต์</em>\n\n<strong>หากนี่เป็นความพยายามแก้ไขโดยชอบ โปรดลองอีกครั้งหนึ่ง</strong> \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา",
+       "token_suffix_mismatch": "<strong>การแก้ไขของคุณถูกปฏิเสธ เนื่องจากเครื่องลูกข่ายของคุณทำให้อักขระเครื่องหมายวรรคตอนในโทเค็นการแก้ไขเสีย</strong>\nการแก้ไขนี้ถูกปฏิเสธเพื่อป้องกันการวิบัติของข้อความหน้า\nบางครั้งเกิดปัญหานี้ขึ้นเมื่อคุณใช้บริการเว็บพร็อกซีนิรนามที่มีจุดบกพร่อง",
+       "edit_form_incomplete": "<strong>แบบแก้ไขบางส่วนไปไม่ถึงเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังอยู่และลองอีกครั้ง</strong>",
        "editing": "กำลังแก้ไข $1",
        "creating": "กำลังสร้าง $1",
        "editingsection": "กำลังแก้ไข $1 (เฉพาะส่วน)",
        "editingcomment": "กำลังแก้ไข $1 (ส่วนใหม่)",
        "editconflict": "แก้ไขชนกัน: $1",
-       "explainconflict": "à¹\83à¸\84รà¸\9aาà¸\87à¸\84à¸\99à¹\84à¸\94à¹\89à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82\nà¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99à¸\9aà¸\99มีà¸\82à¹\89อà¸\84วามหà¸\99à¹\89าà¸\97ีà¹\88มีอยูà¹\88à¹\83à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99\nà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\81สà¸\94à¸\87อยูà¹\88à¹\83à¸\99à¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99ลà¹\88าà¸\87\nà¸\84ุà¸\93à¸\88ะà¸\95à¹\89อà¸\87รวมà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\82อà¸\87à¸\84ุà¸\93à¹\80à¸\82à¹\89าà¸\81ัà¸\9aà¸\82à¹\89อà¸\84วามà¸\97ีà¹\88มีอยูà¹\88\n'''à¹\80à¸\89à¸\9eาะ'''à¸\82à¹\89อà¸\84วามà¹\83à¸\99à¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99à¸\9aà¸\99à¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99à¸\97ีà¹\88à¸\88ะà¸\96ูà¸\81à¸\9aัà¸\99à¸\97ึà¸\81 à¹\80มืà¹\88อà¸\81à¸\94à¸\9bุà¹\88ม \"{{int:savearticle}}\"",
+       "explainconflict": "มีà¸\9cูà¹\89à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\84ุà¸\93à¹\80ริà¹\88มà¹\81à¸\81à¹\89à¹\84à¸\82\nà¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99à¸\9aà¸\99มีà¸\82à¹\89อà¸\84วามหà¸\99à¹\89าà¸\97ีà¹\88มีอยูà¹\88à¹\83à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99\nà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\81สà¸\94à¸\87อยูà¹\88à¹\83à¸\99à¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99ลà¹\88าà¸\87\nà¸\84ุà¸\93à¸\88ะà¸\95à¹\89อà¸\87รวมà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\82อà¸\87à¸\84ุà¸\93à¹\80à¸\82à¹\89าà¸\81ัà¸\9aà¸\82à¹\89อà¸\84วามà¸\97ีà¹\88มีอยูà¹\88\n<strong>à¹\80à¸\89à¸\9eาะ</strong>à¸\82à¹\89อà¸\84วามà¹\83à¸\99à¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99à¸\9aà¸\99à¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99à¸\97ีà¹\88à¸\88ะà¸\96ูà¸\81à¸\9aัà¸\99à¸\97ึà¸\81 à¹\80มืà¹\88อà¸\81à¸\94 \"{{int:savearticle}}\"",
        "yourtext": "ข้อความของคุณ",
        "storedversion": "รุ่นที่เก็บไว้",
-       "nonunicodebrowser": "'''คำเตือน: เว็บเบราว์เซอร์นี้ไม่สนับสนุนการใช้งานแบบยูนิโคด ตัวอักษรที่ไม่ใช่แบบแอสกีจะแสดงในกล่องการแก้ไขในลักษณะรหัสเลขฐานสิบหก'''",
-       "editingold": "'''คำเตือน: ข้อมูลที่แก้ไขอยู่ไม่ใช่ข้อมูลใหม่ล่าสุดของหน้านี้ ถ้าทำการบันทึกไป การเปลี่ยนแปลงที่เกิดขึ้นระหว่างรุ่นนี้กับรุ่นใหม่จะสูญหาย'''",
+       "nonunicodebrowser": "<strong>คำเตือน: เบราว์เซอร์ของคุณไม่สนับสนุนยูนิโคด</strong> \nการแก้ไขไปพลางจะทำให้คุณแก้ไขหน้าได้อย่างปลอดภัย: อักขระที่มิใช่ ASCII จะปรากฏในกล่องแก้ไขเป็นรหัสฐานสิบหก",
+       "editingold": "<strong>คำเตือน: คุณกำลังแก้ไขรุ่นที่ล้าสมัยของหน้านี้</strong> ถ้าคุณบันทึก การเปลี่ยนแปลงใด ๆ หลังรุ่นนี้จะหาย",
        "yourdiff": "ความแตกต่าง",
-       "copyrightwarning": "à¹\82à¸\9bรà¸\94อยà¹\88าลืมวà¹\88าà¸\87าà¸\99à¹\80à¸\82ียà¸\99à¸\97ัà¹\89à¸\87หมà¸\94à¹\83à¸\99 {{SITENAME}} à¸\9cูà¹\89à¹\80à¸\82ียà¸\99à¸\97ัà¹\89à¸\87หมà¸\94ยิà¸\99à¸\94ีà¹\83หà¹\89à¸\87าà¸\99à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89ภายà¹\83à¸\95à¹\89สัà¸\8dà¸\8dาลิà¸\82สิà¸\97à¸\98ิà¹\8c $2 (à¸\94ู $1 à¸ªà¸³à¸«à¸£à¸±à¸\9aà¸\82à¹\89อมูลà¹\80à¸\9eิà¹\88มà¹\80à¸\95ิม)\nà¸\96à¹\89าà¸\84ุà¸\93à¹\84มà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\83หà¹\89à¸\87าà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¹\81à¸\81à¹\89à¹\84à¸\82 à¸«à¸£à¸·à¸­à¹\84มà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\83หà¹\89à¸\87าà¸\99à¹\80à¸\9cยà¹\81à¸\9eรà¹\88à¸\95ามà¸\97ีà¹\88à¹\84à¸\94à¹\89à¸\81ลà¹\88าวà¹\84วà¹\89 à¸­à¸¢à¹\88าสà¹\88à¸\87à¸\82à¹\89อà¸\84วามà¹\80à¸\82à¹\89ามาà¸\97ีà¹\88à¸\99ีà¹\88<br />\nà¸\99อà¸\81à¸\88าà¸\81à¸\99ีà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\82à¹\89อà¸\84วามà¸\97ีà¹\88สà¹\88à¸\87à¹\80à¸\82à¹\89ามาà¹\84à¸\94à¹\89à¹\80à¸\82ียà¸\99à¸\94à¹\89วยà¸\95ัวà¹\80อà¸\87 à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\84ัà¸\94ลอà¸\81 à¸«à¸£à¸·à¸­à¸\97ำà¸\8bà¹\89ำà¸\88าà¸\81à¹\81หลà¹\88à¸\87อืà¹\88à¸\99\n'''อยà¹\88าสà¹\88à¸\87à¸\87าà¸\99à¸\97ีà¹\88มีลิà¸\82สิà¸\97à¸\98ิà¹\8cà¹\80à¸\82à¹\89ามาà¸\81à¹\88อà¸\99à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¸\88าà¸\81à¹\80à¸\88à¹\89าà¸\82อà¸\87!'''",
-       "copyrightwarning2": "à¹\82à¸\9bรà¸\94อยà¹\88าลืมวà¹\88าà¸\87าà¸\99à¹\80à¸\82ียà¸\99à¸\97ัà¹\89à¸\87หมà¸\94à¹\83à¸\99 {{SITENAME}} à¸­à¸²à¸\88à¸\88ะà¸\96ูà¸\81à¹\81à¸\81à¹\89à¹\84à¸\82 à¸\94ัà¸\94à¹\81à¸\9bลà¸\87 à¸«à¸£à¸·à¸­à¸¥à¸\9aออà¸\81à¹\82à¸\94ยà¸\9cูà¹\89รà¹\88วมà¹\80à¸\82ียà¸\99à¸\84à¸\99อืà¹\88à¸\99\nà¸\96à¹\89าà¸\84ุà¸\93à¹\84มà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\83หà¹\89à¸\87าà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¹\81à¸\81à¹\89à¹\84à¸\82 à¸«à¸£à¸·à¸­à¹\84มà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\83หà¹\89à¸\87าà¸\99à¹\80à¸\9cยà¹\81à¸\9eรà¹\88à¸\95ามà¸\97ีà¹\88à¸\81ลà¹\88าวà¹\84วà¹\89 à¸­à¸¢à¹\88าสà¹\88à¸\87à¸\82à¹\89อà¸\84วามà¸\82อà¸\87à¸\84ุà¸\93à¹\80à¸\82à¹\89ามาà¸\97ีà¹\88à¸\99ีà¹\88<br />\nà¸\99อà¸\81à¸\88าà¸\81à¸\99ีà¹\89à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\82à¹\89อà¸\84วามà¸\97ีà¹\88สà¹\88à¸\87à¹\80à¸\82à¹\89ามาà¸\84ุà¸\93à¹\84à¸\94à¹\89à¹\80à¸\82ียà¸\99à¸\94à¹\89วยà¸\95ัวà¹\80อà¸\87 à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\84ัà¸\94ลอà¸\81 à¸\97ำà¸\8bà¹\89ำสà¹\88วà¸\99หà¸\99ึà¹\88à¸\87สà¹\88วà¸\99à¹\83à¸\94หรือà¸\97ัà¹\89à¸\87หมà¸\94à¸\88าà¸\81à¹\81หลà¹\88à¸\87อืà¹\88à¸\99 (à¸\94ูรายละà¹\80อียà¸\94à¸\97ีà¹\88 $1)\n'''อยà¹\88าสà¹\88à¸\87à¸\87าà¸\99à¸\97ีà¹\88มีลิà¸\82สิà¸\97à¸\98ิà¹\8cà¹\80à¸\82à¹\89ามาà¸\81à¹\88อà¸\99à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¸\88าà¸\81à¹\80à¸\88à¹\89าà¸\82อà¸\87!'''",
-       "longpageerror": "'''ข้อผิดพลาด: ข้อความที่คุณส่งเข้ามามีขนาด $1 กิโลไบต์\nซึ่งเกินกว่าขนาดสูงสุดซึ่งกำหนดไว้ที่ $2 กิโลไบต์ จึงไม่สามารถบันทึกได้'''",
-       "readonlywarning": "'''คำเตือน: ฐานข้อมูลถูกล็อกเพื่อบำรุงรักษา คุณจึงไม่สามารถบันทึกการเปลี่ยนแปลงของคุณได้ในขณะนี้'''\nคุณอาจต้องการคัดลอกและวางข้อความของคุณในไฟล์ข้อความ และบันทึกไว้ใช้ภายหลัง\n\nผู้ดูแลระบบที่ล็อกฐานข้อมูลได้ให้คำอธิบายดังนี้: $1",
-       "protectedpagewarning": "'''คำเตือน: หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้น'''\nรายการปูมล่าสุดถูกแสดงไว้ด้านล่างเพื่อการอ้างอิง:",
-       "semiprotectedpagewarning": "'''หมายเหตุ:''' หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่ลงทะเบียนเท่านั้น\nรายการแก้ไขล่าสุดได้ถูกแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง",
-       "cascadeprotectedwarning": "'''คำเตือน:''' หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้น เนื่องจากหน้านี้สืบทอดการล็อกมาจาก{{PLURAL:$1|หน้า|หน้า}}ต่อไปนี้:",
-       "titleprotectedwarning": "'''คำเตือน: หน้านี้ได้รับการป้องกัน สร้างได้เฉพาะผู้ใช้ที่มี[[Special:ListGroupRights|สิทธิจำเพาะ]]เท่านั้น'''\nรายการปูมล่าสุดถูกแสดงไว้ด้านล่างเพื่อการอ้างอิง",
+       "copyrightwarning": "à¹\82à¸\9bรà¸\94ระลึà¸\81วà¹\88าà¸\87าà¸\99à¹\80à¸\82ียà¸\99à¸\97ัà¹\89à¸\87หมà¸\94à¹\83à¸\99 {{SITENAME}} à¸\96ือวà¹\88าà¹\80à¸\9cยà¹\81à¸\9eรà¹\88ภายà¹\83à¸\95à¹\89 $2 (à¸\94ูรายละà¹\80อียà¸\94à¸\97าà¸\87 $1)\nหาà¸\81à¸\84ุà¸\93à¹\84มà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\83หà¹\89à¸\87าà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¹\81à¸\81à¹\89à¹\84à¸\82à¹\81ละà¸\81ระà¸\88ายà¹\84à¸\94à¹\89à¸\95ามà¹\83à¸\88 à¸\81à¹\87อยà¹\88าสà¹\88à¸\87à¹\80à¸\82à¹\89ามา<br />\nà¸\99อà¸\81à¸\88าà¸\81à¸\99ีà¹\89 à¸\84ุà¸\93ยัà¸\87สัà¸\8dà¸\8dาà¹\80ราวà¹\88าà¸\84ุà¸\93à¹\80à¸\82ียà¸\99à¸\87าà¸\99à¸\94à¹\89วยà¸\95à¸\99à¹\80อà¸\87 à¸«à¸£à¸·à¸­à¸\84ัà¸\94ลอà¸\81à¸\88าà¸\81สาà¸\98ารà¸\93สมà¸\9aัà¸\95ิหรือà¸\97รัà¸\9eยาà¸\81รà¹\80สรีà¸\97ีà¹\88à¸\84ลà¹\89ายà¸\81ัà¸\99\n<strong>อยà¹\88าสà¹\88à¸\87à¸\87าà¸\99มีลิà¸\82สิà¸\97à¸\98ิà¹\8cà¹\82à¸\94ยà¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95!</strong>",
+       "copyrightwarning2": "à¹\82à¸\9bรà¸\94ระลึà¸\81วà¹\88าà¸\87าà¸\99à¹\80à¸\82ียà¸\99à¸\97ัà¹\89à¸\87หมà¸\94à¹\83à¸\99 {{SITENAME}} à¸­à¸²à¸\88à¸\96ูà¸\81à¸\9cูà¹\89à¹\80à¸\82ียà¸\99อืà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82 à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87หรือà¸\99ำออà¸\81\nหาà¸\81à¸\84ุà¸\93à¹\84มà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\83หà¹\89à¸\87าà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¹\81à¸\81à¹\89à¹\84à¸\82 à¸\81à¹\87อยà¹\88าสà¹\88à¸\87à¹\80à¸\82à¹\89ามา<br />\nà¸\99อà¸\81à¸\88าà¸\81à¸\99ีà¹\89 à¸\84ุà¸\93ยัà¸\87สัà¸\8dà¸\8dาà¹\80ราวà¹\88าà¸\84ุà¸\93à¹\80à¸\82ียà¸\99à¸\87าà¸\99à¸\94à¹\89วยà¸\95à¸\99à¹\80อà¸\87 à¸«à¸£à¸·à¸­à¸\84ัà¸\94ลอà¸\81à¸\88าà¸\81สาà¸\98ารà¸\93สมà¸\9aัà¸\95ิหรือà¸\97รัà¸\9eยาà¸\81รà¹\80สรีà¸\97ีà¹\88à¸\84ลà¹\89ายà¸\81ัà¸\99 (à¸\94ูรายละà¹\80อียà¸\94à¸\97ีà¹\88 $1)\n<strong>อยà¹\88าสà¹\88à¸\87à¸\87าà¸\99มีลิà¸\82สิà¸\97à¸\98ิà¹\8cà¹\82à¸\94ยà¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95!</strong>",
+       "longpageerror": "<strong>ข้อผิดพลาด: ข้อความที่คุณส่งมีขนาด $1 กิโลไบต์\nซึ่งเกินสูงสุด $2 กิโลไบต์</strong>\nไม่สามารถบันทึกได้",
+       "readonlywarning": "<strong>คำเตือน: ฐานข้อมูลถูกล็อกเพื่อบำรุงรักษา คุณจึงไม่สามารถบันทึกการเปลี่ยนแปลงของคุณได้ในขณะนี้</strong>\nคุณอาจต้องการคัดลอกและวางข้อความของคุณในไฟล์ข้อความ และบันทึกไว้ภายหลัง\n\nผู้ดูแลระบบที่ล็อกฐานข้อมูลให้คำอธิบายดังนี้: $1",
+       "protectedpagewarning": "<strong>คำเตือน: หน้านี้ถูกล็อก เพื่อให้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบแก้ไขได้เท่านั้น</strong>\nรายการปูมล่าสุดจัดไว้ด้านล่างเพื่อการอ้างอิง:",
+       "semiprotectedpagewarning": "<strong>หมายเหตุ:</strong> หน้านี้ถูกล็อก เพื่อให้เฉพาะผู้ใช้ลงทะเบียนสามารถแก้ไขเท่านั้น\nรายการปูมล่าสุดได้จัดไว้ด้านล่างนี้เพื่อการอ้างอิง",
+       "cascadeprotectedwarning": "<strong>คำเตือน:</strong> หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้น เนื่องจากหน้านี้สืบทอดการล็อกมาจาก{{PLURAL:$1|หน้า|หน้า}}ต่อไปนี้:",
+       "titleprotectedwarning": "<strong>คำเตือน: หน้านี้ได้รับการป้องกัน สร้างได้เฉพาะผู้ใช้ที่มี[[Special:ListGroupRights|สิทธิจำเพาะ]]เท่านั้น</strong>\nรายการปูมล่าสุดถูกแสดงไว้ด้านล่างเพื่อการอ้างอิง",
        "templatesused": "{{PLURAL:$1|แม่แบบ}}ที่ใช้ในหน้านี้:",
-       "templatesusedpreview": "{{PLURAL:$1|à¹\81มà¹\88à¹\81à¸\9aà¸\9a}}à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\83à¸\99à¸\81ารà¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87:",
+       "templatesusedpreview": "{{PLURAL:$1|à¹\81มà¹\88à¹\81à¸\9aà¸\9a}}à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\83à¸\99à¸\95ัวอยà¹\88าà¸\87à¸\99ีà¹\89:",
        "templatesusedsection": "{{PLURAL:$1|แม่แบบ}}ที่ใช้ในส่วนนี้:",
        "template-protected": "(ถูกล็อก)",
        "template-semiprotected": "(ถูกกึ่งล็อก)",
        "hiddencategories": "หน้านี้มี {{PLURAL:$1|1 หมวดหมู่ที่ซ่อนอยู่|$1 หมวดหมู่ที่ซ่อนอยู่}}:",
        "edittools": "<!-- ข้อความนี้จะแสดงผลใต้ฟอร์มสำหรับการแก้ไขและอัปโหลด -->",
        "nocreatetext": "{{SITENAME}} จำกัดการสร้างหน้าใหม่\nคุณสามารถย้อนกลับไปแก้ไขหน้าที่มีอยู่เดิม หรือ[[Special:UserLogin|ล็อกอินหรือสร้างบัญชีผู้ใช้]]",
-       "nocreate-loggedin": "à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89สร้างหน้าใหม่",
+       "nocreate-loggedin": "à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิสร้างหน้าใหม่",
        "sectioneditnotsupported-title": "ไม่สนับสนุนการแก้ไขหัวข้อย่อย",
        "sectioneditnotsupported-text": "ไม่สนับสนุนการแก้ไขหัวข้อย่อยในหน้านี้",
        "permissionserrors": "ข้อผิดพลาดในการใช้สิทธิ",
-       "permissionserrorstext": "à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aสิà¸\97à¸\98ิà¹\83à¸\99à¸\81ารà¸\97ำสิà¹\88à¸\87à¸\99ีà¹\89 เนื่องจาก{{PLURAL:$1|เหตุผล|เหตุผล}}ต่อไปนี้:",
+       "permissionserrorstext": "à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิà¸\97ำà¹\80à¸\8aà¹\88à¸\99à¸\99ัà¹\89à¸\99 เนื่องจาก{{PLURAL:$1|เหตุผล|เหตุผล}}ต่อไปนี้:",
        "permissionserrorstext-withaction": "คุณไม่มีสิทธิ$2 ด้วย{{PLURAL:$1|เหตุ|เหตุ}}ต่อไปนี้:",
-       "recreate-moveddeleted-warn": "'''คำเตือน: คุณกำลังสร้างหน้าซึ่งได้ถูกลบไปก่อนหน้านี้แล้วอีกครั้ง'''\n\nคุณควรพิจารณาว่าการแก้ไขหน้านี้ต่อไปเหมาะสมหรือไม่\nปูมการลบและเปลี่ยนชื่อหน้านี้ได้แสดงไว้ด้านล่างเพื่อความสะดวก:",
-       "moveddeleted-notice": "หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¸\9a\nà¸\9bูมà¸\81ารลà¸\9aà¹\81ละà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94à¹\89à¹\81สà¸\94à¸\87à¹\84วà¹\89à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9eืà¹\88ออà¹\89าà¸\87อิà¸\87",
+       "recreate-moveddeleted-warn": "<strong>คำเตือน: คุณกำลังสร้างหน้าซึ่งได้ถูกลบไปก่อนหน้านี้แล้วอีกครั้ง</strong>\n\nคุณควรพิจารณาว่าการแก้ไขหน้านี้ต่อไปเหมาะสมหรือไม่\nปูมการลบและเปลี่ยนชื่อหน้านี้จัดไว้ด้านล่างเพื่อความสะดวก:",
+       "moveddeleted-notice": "หน้านี้ถูกลบ\nปูมการลบและเปลี่ยนชื่อของหน้านี้แสดงไว้ด้านล่างเพื่ออ้างอิง",
        "log-fulllog": "ดูปูมแบบเต็ม",
-       "edit-hook-aborted": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\96ูà¸\81ยà¸\81à¹\80ลิà¸\81\nà¹\84มà¹\88มีà¸\84ำอà¸\98ิà¸\9aายสำหรัà¸\9aà¸\81ารยà¸\81à¹\80ลิà¸\81à¸\99ีà¹\89",
-       "edit-gone-missing": "à¹\84มà¹\88สามารà¸\96อัà¸\9bà¹\80à¸\94à¸\95หà¸\99à¹\89าà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\84à¸\94à¹\89\nà¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bแล้ว",
+       "edit-hook-aborted": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\96ูà¸\81ฮุà¸\81ยà¸\81à¹\80ลิà¸\81\nà¹\84มà¹\88à¹\84à¸\94à¹\89à¹\83หà¹\89à¸\84ำอà¸\98ิà¸\9aาย",
+       "edit-gone-missing": "à¹\84มà¹\88สามารà¸\96à¸\9bรัà¸\9aหà¸\99à¹\89าà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\84à¸\94à¹\89\nà¸\94ูà¹\80หมือà¸\99à¸\96ูà¸\81ลà¸\9aแล้ว",
        "edit-conflict": "แก้ชนกัน",
-       "edit-no-change": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¹\80à¸\9eิà¸\81à¹\80à¸\89ย à¹\80à¸\9eราะà¹\84มà¹\88มีà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\94 à¹\86",
-       "postedit-confirmation-created": "หà¸\99à¹\89าà¸\96ูà¸\81สรà¹\89าà¸\87แล้ว",
-       "postedit-confirmation-restored": "หà¸\99à¹\89าà¸\96ูà¸\81à¸\81ูà¹\89à¸\84ืà¸\99",
+       "edit-no-change": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¹\80à¸\9eิà¸\81à¹\80à¸\89ย à¹\80à¸\9eราะà¹\84มà¹\88มีà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\82à¹\89อà¸\84วาม",
+       "postedit-confirmation-created": "สรà¹\89าà¸\87หà¸\99à¹\89าแล้ว",
+       "postedit-confirmation-restored": "à¸\81ูà¹\89à¸\84ืà¸\99หà¸\99à¹\89าà¹\81ลà¹\89ว",
        "postedit-confirmation-saved": "บันทึกการแก้ไขของคุณแล้ว",
-       "edit-already-exists": "à¹\84มà¹\88สามารà¸\96สรà¹\89าà¸\87หà¸\99à¹\89าà¹\83หมà¹\88à¹\84à¸\94à¹\89\nà¹\80à¸\9eราะมีหà¸\99à¹\89าà¸\99ีà¹\89à¹\81ลà¹\89ว",
+       "edit-already-exists": "ไม่สามารถสร้างหน้าใหม่ได้\nเพราะมีแล้ว",
        "defaultmessagetext": "ข้อความสารโดยปริยาย",
        "content-failed-to-parse": "แจงส่วนเนื้อหา $2 ของตัวแบบ $1 ล้มเหลว: $3",
        "invalid-content-data": "ข้อมูลเนื้อหาไม่ถูกต้อง",
-       "content-not-allowed-here": "à¹\80à¸\99ืà¹\89อหา \"$1\" à¹\84มà¹\88อà¸\99ุà¸\8dาà¸\95ในหน้า [[$2]]",
+       "content-not-allowed-here": "à¹\84มà¹\88อà¸\99ุà¸\8dาà¸\95à¹\80à¸\99ืà¹\89อหา \"$1\" ในหน้า [[$2]]",
        "editwarning-warning": "การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณดำเนินการสูญหาย\nถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน \"{{int:prefs-editing}}\" ในการตั้งค่าของคุณ",
        "editpage-notsupportedcontentformat-title": "รูปแบบเนื้อหาไม่ได้รับการรองรับ",
        "editpage-notsupportedcontentformat-text": "ตัวแบบเนื้อหา $2 ไม่รองรับตัวแบบเนื้อหา $1",
        "content-model-text": "ข้อความธรรมดา",
        "content-model-javascript": "จาวาสคริปต์",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "'''คำเตือน:''' หน้านี้มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป\n\nหน้านี้ควรมีการเรียกใช้น้อยกว่า $2  ครั้ง แต่ปัจจุบันมีการเรียกใช้ $1 ครั้ง",
+       "expensive-parserfunction-warning": "<strong>คำเตือน:</strong> หน้านี้มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป\n\nหน้านี้ควรมีการเรียกใช้น้อยกว่า $2  ครั้ง แต่ปัจจุบันมีการเรียกใช้ $1 ครั้ง",
        "expensive-parserfunction-category": "หน้าที่มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป",
-       "post-expand-template-inclusion-warning": "'''คำเตือน:''' แม่แบบที่นำมารวมมีขนาดใหญ่เกินไป\nบางแม่แบบจะไม่ถูกรวมเข้ามา",
+       "post-expand-template-inclusion-warning": "<strong>คำเตือน:</strong> แม่แบบที่นำมารวมมีขนาดใหญ่เกินไป\nจะไม่รวมบางแม่แบบเข้ามา",
        "post-expand-template-inclusion-category": "หน้าที่มีแม่แบบรวมมาเกินขนาด",
-       "post-expand-template-argument-warning": "คำเตือน: หน้านี้มีแม่แบบที่มีอาร์กิวเมนต์ขนาดใหญ่เกินไป อาร์กิวเมนต์เหล่านี้จะถูกละทิ้ง",
-       "post-expand-template-argument-category": "หà¸\99à¹\89าà¸\97ีà¹\88มีà¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\8bึà¹\88à¸\87อารà¹\8cà¸\81ิวà¹\80มà¸\99à¸\95à¹\8cà¸\96ูà¸\81ละà¸\97ิà¹\89à¸\87",
-       "parser-template-loop-warning": "à¸\95รวà¸\88à¸\9eà¸\9aà¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\81ลัà¸\9aมาà¹\80รียà¸\81à¸\95ัวà¹\80อà¸\87: [[$1]]",
-       "parser-template-recursion-depth-warning": "à¹\80รียà¸\81à¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\8bà¹\89อà¸\99หลายà¸\8aัà¹\89à¸\99à¹\80à¸\81ิà¸\99à¸\82ีà¸\94à¸\88ำà¸\81ัà¸\94 ($1)",
-       "language-converter-depth-warning": "à¸\84ำสัà¹\88à¸\87à¹\83à¸\99à¸\81ารà¹\81à¸\9bลà¸\87ภาษาลึà¸\81à¹\80à¸\81ิà¸\99 $1 à¸¥à¸³à¸\94ัà¸\9a",
+       "post-expand-template-argument-warning": "<strong>คำเตือน:</strong> หน้านี้มีอาร์กิวเมนต์แม่แบบอย่างน้อยหนึ่งที่มีขนาดขยายใหญ่เกินไป\nสละอาร์กิวเมนต์เหล่านี้แล้ว",
+       "post-expand-template-argument-category": "หà¸\99à¹\89าà¸\97ีà¹\88มีอารà¹\8cà¸\81ิวà¹\80มà¸\99à¸\95à¹\8cà¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\96ูà¸\81สละ",
+       "parser-template-loop-warning": "à¸\95รวà¸\88à¸\9eà¸\9aวà¸\87วà¸\99à¹\81มà¹\88à¹\81à¸\9aà¸\9a: [[$1]]",
+       "parser-template-recursion-depth-warning": "à¹\80à¸\81ิà¸\99à¸\82ีà¸\94à¸\88ำà¸\81ัà¸\94à¸\84วามลึà¸\81à¸\81ารà¹\80รียà¸\81à¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\8bà¹\89ำ ($1)",
+       "language-converter-depth-warning": "à¹\80à¸\81ิà¸\99à¸\82ีà¸\94à¸\88ำà¸\81ัà¸\94à¸\84วามลึà¸\81à¸\95ัวà¹\81à¸\9bลà¸\87à¸\9cัà¸\99ภาษา ($1)",
        "node-count-exceeded-category": "หน้าที่จำนวนปมเกิน",
        "node-count-exceeded-warning": "หน้าเกินจำนวนปม",
        "expansion-depth-exceeded-category": "หน้าที่ความลึกการขยายเกิน",
        "parser-unstrip-loop-warning": "พบวงวน unstrip",
        "parser-unstrip-recursion-limit": "ขีดจำกัดการเรียกซ้ำ unstrip เกิน ($1)",
        "converter-manual-rule-error": "พบข้อผิดพลาดในกฎการแปลงผันภาษาด้วยมือ",
-       "undo-success": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\99ีà¹\89สามารà¸\96ยà¹\89อà¸\99à¸\81ลัà¸\9aà¹\84à¸\94à¹\89 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aà¸\82à¹\89อà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\99ีà¹\88à¸\84ือสิà¹\88à¸\87à¸\97ีà¹\88à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¸\97ำ à¸\88าà¸\81à¸\99ัà¹\89à¸\99à¹\83หà¹\89à¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9eืà¹\88อà¹\80สรà¹\87à¸\88สิà¹\89à¸\99à¸\82ัà¹\89à¸\99à¸\95อà¸\99",
-       "undo-failure": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\99ีà¹\89à¹\84มà¹\88สามารà¸\96ยà¹\89อà¸\99à¸\81ลัà¸\9aà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\82ัà¸\94à¹\81ยà¹\89à¸\87à¸\81ัà¸\9aà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99",
-       "undo-norev": "ไม่สามารถย้อนการแก้ไขนี้ เพราะไม่มีหรือถูกลบไปแล้ว",
-       "undo-nochange": "ดูเหมือนว่าการแก้ไขดังกล่าวถูกย้อนแล้ว",
+       "undo-success": "สามารà¸\96ยà¹\89อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\99ีà¹\89à¸\81ลัà¸\9aà¹\84à¸\94à¹\89 \nà¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aà¸\82à¹\89อà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9eืà¹\88อà¸\97วà¸\99สอà¸\9aวà¹\88าà¸\99ีà¹\88à¹\80à¸\9bà¹\87à¸\99สิà¹\88à¸\87à¸\97ีà¹\88à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¸\97ำ à¹\81ลà¹\89วà¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9eืà¹\88อà¹\80สรà¹\87à¸\88สิà¹\89à¸\99à¸\81ารยà¹\89อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\81ลัà¸\9a",
+       "undo-failure": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\99ีà¹\89à¹\84มà¹\88สามารà¸\96ยà¹\89อà¸\99à¸\81ลัà¸\9aà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\82ัà¸\94à¹\81ยà¹\89à¸\87à¸\81ัà¸\9aà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82ระหวà¹\88าà¸\87à¸\81ลาà¸\87",
+       "undo-norev": "ไม่สามารถย้อนการแก้ไขนี้กลับ เพราะไม่มีหรือถูกลบไปแล้ว",
+       "undo-nochange": "à¸\94ูà¹\80หมือà¸\99วà¹\88าà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\94ัà¸\87à¸\81ลà¹\88าวà¸\96ูà¸\81ยà¹\89อà¸\99à¸\81ลัà¸\9aà¹\81ลà¹\89ว",
        "undo-summary": "ย้อนการแก้ไขรุ่น $1 โดย [[Special:Contributions/$2|$2]] ([[User talk:$2|พูดคุย]])",
        "undo-summary-username-hidden": "ย้อนรุ่น $1 โดยผู้ใช้ไม่ระบุชื่อ",
        "cantcreateaccounttitle": "ไม่สามารถสร้างบัญชีได้",
        "nohistory": "ไม่มีประวัติการแก้ไขสำหรับหน้านี้",
        "currentrev": "รุ่นปัจจุบัน",
        "currentrev-asof": "รุ่นปัจจุบัน เมื่อ $1",
-       "revisionasof": "รุ่นเมื่อ $1",
-       "revision-info": "รุ่นเมื่อ $1 โดย {{GENDER:$6|$2}}$7",
-       "previousrevision": "←รุ่นก่อนหน้า",
-       "nextrevision": "รุ่นถัดไป→",
+       "revisionasof": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¹\80มืà¹\88อ $1",
+       "revision-info": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¹\80มืà¹\88อ $1 à¹\82à¸\94ย {{GENDER:$6|$2}}$7",
+       "previousrevision": "â\86\90รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\81à¹\88อà¸\99หà¸\99à¹\89า",
+       "nextrevision": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\96ัà¸\94à¹\84à¸\9bâ\86\92",
        "currentrevisionlink": "รุ่นล่าสุด",
        "cur": "ป",
        "next": "ถัดไป",
        "last": "ก",
        "page_first": "แรกสุด",
        "page_last": "ท้ายสุด",
-       "histlegend": "วิà¸\98ีà¹\80à¸\9bรียà¸\9aà¹\80à¸\97ียà¸\9a: à¹\80ลือà¸\81à¸\9bุà¹\88มà¸\82อà¸\87รุà¹\88à¸\99สอà¸\87รุà¹\88à¸\99à¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\80à¸\9bรียà¸\9aà¹\80à¸\97ียà¸\9a à¹\81ละà¸\81à¸\94à¸\9bุà¹\88มà¹\80ริà¹\88มà¹\80à¸\9bรียà¸\9aà¹\80à¸\97ียà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87<br />\nà¸\84ำอà¸\98ิà¸\9aาย: <strong>({{int:cur}})</strong> = à¹\80à¸\97ียà¸\9aà¸\81ัà¸\9aรุà¹\88à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99, <strong>({{int:last}})</strong> = à¹\80à¸\97ียà¸\9aกับรุ่นก่อนหน้า, <strong>{{int:minoreditletter}}</strong> = การแก้ไขเล็กน้อย",
-       "history-fieldset-title": "à¸\84à¹\89à¸\99หาประวัติ",
+       "histlegend": "à¸\81ารà¹\80ลือà¸\81à¸\9cลà¸\95à¹\88าà¸\87: à¹\80ลือà¸\81à¸\9bุà¹\88มà¸\82อà¸\87สอà¸\87รุà¹\88à¸\99à¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\80à¸\9bรียà¸\9aà¹\80à¸\97ียà¸\9a à¹\81ละà¸\81à¸\94à¸\9bà¹\89อà¸\99à¹\80à¸\82à¹\89าหรือà¸\9bุà¹\88มà¸\94à¹\89าà¸\99ลà¹\88าà¸\87<br />\nà¸\84ำอà¸\98ิà¸\9aาย: <strong>({{int:cur}})</strong> = à¸\9cลà¸\95à¹\88าà¸\87à¸\81ัà¸\9aรุà¹\88à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99, <strong>({{int:last}})</strong> = à¸\9cลà¸\95à¹\88าà¸\87กับรุ่นก่อนหน้า, <strong>{{int:minoreditletter}}</strong> = การแก้ไขเล็กน้อย",
+       "history-fieldset-title": "à¸\84à¹\89à¸\99à¸\94ูประวัติ",
        "history-show-deleted": "เฉพาะที่ถูกลบ",
        "histfirst": "แรกสุด",
        "histlast": "ล่าสุด",
-       "historysize": "$1 ไบต์",
+       "historysize": "($1 ไบต์)",
        "historyempty": "(ว่าง)",
-       "history-feed-title": "ประวัติรุ่น",
-       "history-feed-description": "ประวัติรุ่นของหน้านี้ในวิกิ",
+       "history-feed-title": "ประวัติรุ่นปรับปรุง",
+       "history-feed-description": "à¸\9bระวัà¸\95ิรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¹\83à¸\99วิà¸\81ิ",
        "history-feed-item-nocomment": "$1 เมื่อ $2",
-       "history-feed-empty": "à¹\84มà¹\88มีหà¸\99à¹\89าà¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร \nà¸\8bึà¹\88à¸\87อาà¸\88à¸\96ูà¸\81ลà¸\9aหรือà¸\96ูà¸\81à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\84à¸\9bแล้ว \nลอง[[Special:Search|ค้นวิกินี้]]หาหน้าใหม่ที่เกี่ยวข้อง",
+       "history-feed-empty": "à¹\84มà¹\88มีหà¸\99à¹\89าà¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร \nà¸\8bึà¹\88à¸\87อาà¸\88à¸\96ูà¸\81ลà¸\9aหรือà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อแล้ว \nลอง[[Special:Search|ค้นวิกินี้]]หาหน้าใหม่ที่เกี่ยวข้อง",
        "rev-deleted-comment": "(คำอธิบายอย่างย่อถูกลบออก)",
        "rev-deleted-user": "(ชื่อผู้ใช้ถูกลบออก)",
        "rev-deleted-event": "(ปฏิบัติการปูมถูกลบออก)",
-       "rev-deleted-user-contribs": "[ชื่อผู้ใช้หรือเลขที่อยู่ไอพีถูกลบแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]",
-       "rev-deleted-text-permission": "รุ่นหน้านี้'''ถูกลบ'''\nรายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-       "rev-deleted-text-unhide": "รุ่นหน้านี้'''ถูกลบ'''\nรายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]\nคุณยังสามารถ[$1 ดูรุ่นนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
-       "rev-suppressed-text-unhide": "รุ่นหน้านี้'''ถูกยับยั้ง'''\nรายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]\nคุณยังสามารถ[$1 ดูรุ่นนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
-       "rev-deleted-text-view": "รุ่นหน้านี้'''ถูกลบ'''\nคุณสามารถดูรุ่นนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-       "rev-suppressed-text-view": "รุ่นหน้านี้'''ถูกยับยั้ง'''\nคุณสามารถดูรุ่นนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
-       "rev-deleted-no-diff": "คุณไม่สามารถเรียกดูผลต่างนี้ เพราะมีบางรุ่น'''ถูกลบ'''\nรายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-       "rev-suppressed-no-diff": "คุณไม่สามารถดูผลต่างนี้ได้ เพราะมีผลต่างหนึ่งที่'''ถูกลบ'''",
-       "rev-deleted-unhide-diff": "รุ่นหนึ่งของผลต่างนี้'''ถูกลบ'''\nรายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]\nคุณยังสามารถ[$1 ดูผลต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
-       "rev-suppressed-unhide-diff": "รุ่นหนึ่งของผลต่างนี้'''ถูกยับยั้ง'''\nรายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]\nคุณยังสามารถ[$1 ดูผลต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
+       "rev-deleted-user-contribs": "[นำชื่อผู้ใช้หรือเลขที่อยู่ไอพีออกแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]",
+       "rev-deleted-text-permission": "รุ่นหน้านี้ <strong>ถูกลบ</strong>.\nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
+       "rev-suppressed-text-permission": "รุ่นหน้านี้ถูก<strong>ยับยั้ง</strong> \nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
+       "rev-deleted-text-unhide": "รุ่นหน้านี้<strong>ถูกลบ</strong>\nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]\nคุณยังสามารถ[$1 ดูรุ่นนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
+       "rev-suppressed-text-unhide": "รุ่นหน้านี้<strong>ถูกยับยั้ง</strong>\nพบรายละเอียดพบใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]\nคุณยังสามารถ[$1 ดูรุ่นนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
+       "rev-deleted-text-view": "รุ่นหน้านี้<strong>ถูกลบ</strong>\nคุณสามารถดูรุ่นนี้ได้ พบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
+       "rev-suppressed-text-view": "รุ่นหน้านี้strong>ถูกยับยั้ง</strong>\nคุณสามารถดูรุ่นนี้ได้ พบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
+       "rev-deleted-no-diff": "คุณไม่สามารถเรียกดูผลต่างนี้ เพราะมีรุ่นหนึ่ง<strong>ถูกลบ</strong>\nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
+       "rev-suppressed-no-diff": "คุณไม่สามารถดูผลต่างนี้ได้ เพราะมีรุ่นหนึ่งที่<strong>ถูกลบ</strong>",
+       "rev-deleted-unhide-diff": "รุ่นหนึ่งของผลต่างนี้<strong>ถูกลบ</strong>\nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]\nคุณยังสามารถ[$1 ดูผลต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
+       "rev-suppressed-unhide-diff": "รุ่นหนึ่งของผลต่างนี้<strong>ถูกยับยั้ง</strong>\nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]\nคุณยังสามารถ[$1 ดูผลต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
        "rev-deleted-diff-view": "รุ่นหนึ่งของผลต่างนี้'''ถูกลบ'''\nคุณสามารถดูผลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-       "rev-suppressed-diff-view": "รุ่นหนึ่งของผลต่างนี้'''ถูกยับยั้ง'''\nคุณสามารถดูผลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
+       "rev-suppressed-diff-view": "รุ่นหนึ่งของผลต่างนี้<strong>ถูกยับยั้ง</strong>\nคุณสามารถดูผลต่างนี้ได้ พบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
        "rev-delundel": "เปลี่ยนทัศนวิสัย",
        "rev-showdeleted": "แสดง",
-       "revisiondelete": "ลบ/กู้คืนรุ่น",
-       "revdelete-nooldid-title": "à¹\84มà¹\88มีรุà¹\88à¸\99à¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร",
-       "revdelete-nooldid-text": "à¸\84ุà¸\93มิà¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87รุà¹\88à¸\99à¹\80à¸\9bà¹\89าหมายà¹\80à¸\9eืà¹\88อà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\99ีà¹\89 à¸«à¸£à¸·à¸­à¹\84มà¹\88มีรุà¹\88à¸\99ที่เจาะจง หรือคุณกำลังพยายามซ่อนรุ่นปัจจุบันอย่างใดอย่างหนึ่ง",
+       "revisiondelete": "ลบ/กู้คืนรุ่นปรับปรุง",
+       "revdelete-nooldid-title": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¹\80à¸\9bà¹\89าหมายà¹\84มà¹\88สมà¹\80หà¸\95ุสมà¸\9cล",
+       "revdelete-nooldid-text": "à¸\84ุà¸\93มิà¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¹\80à¸\9bà¹\89าหมายà¹\80à¸\9eืà¹\88อà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\99ีà¹\89 à¸«à¸£à¸·à¸­à¹\84มà¹\88มีรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87ที่เจาะจง หรือคุณกำลังพยายามซ่อนรุ่นปัจจุบันอย่างใดอย่างหนึ่ง",
        "revdelete-no-file": "ไม่มีไฟล์ที่ระบุ",
-       "revdelete-show-file-confirm": "à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88à¸\97ีà¹\88à¸\88ะดูรุ่นที่ถูกลบของไฟล์ \"<nowiki>$1</nowiki>\" เมื่อวันที่ $2 เวลา $3 หรือไม่",
+       "revdelete-show-file-confirm": "à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารดูรุ่นที่ถูกลบของไฟล์ \"<nowiki>$1</nowiki>\" เมื่อวันที่ $2 เวลา $3 หรือไม่",
        "revdelete-show-file-submit": "ใช่",
-       "revdelete-selected-text": "{{PLURAL:$1|รุ่นที่เลือก}}ของ [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88à¹\80ลือà¸\81}}à¸\82อà¸\87 [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|รุ่นไฟล์ที่เลือก}}ของ [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|เหตุการณ์ปูมที่เลือก|เหตุการณ์ปูมที่เลือก}} :",
-       "revdelete-text-text": "รุ่นที่ถูกลบจะยังปรากฏในประวัติหน้า แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
-       "revdelete-text-file": "รุ่นที่ถูกลบจะยังปรากฏในประวัติไฟล์ แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
-       "logdelete-text": "รายà¸\81ารปูมที่ถูกลบจะยังปรากฏในปูม แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
-       "revdelete-text-others": "à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\84à¸\99อืà¹\88à¸\99à¸\88ะยัà¸\87สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\80à¸\99ืà¹\89อหาà¸\97ีà¹\88à¸\96ูà¸\81à¸\8bà¹\88อà¸\99 à¹\81ละสามารà¸\96à¸\81ูà¹\89à¸\84ืà¸\99à¹\80à¸\99ืà¹\89อหาà¹\84à¸\94à¹\89 à¸¢à¸\81à¹\80วà¹\89à¸\99มีà¸\81ารตั้งข้อจำกัดเพิ่มเติม",
-       "revdelete-confirm": "กรุณายืนยันว่าคุณมีเจตนาลบจริง และเข้าใจผลลัพธ์ และกระทำภายใต้[[{{MediaWiki:Policy-url}}|นโยบาย]]",
-       "revdelete-suppress-text": "การระงับควรใช้'''เฉพาะ'''กรณีต่อไปนี้:\n* ข้อมูลที่อาจหมิ่นประมาท\n* ข้อมูลส่วนบุคคลที่ไม่เหมาะสม\n*: ''ที่อยู่บ้านและหมายเลขโทรศัพท์บ้าน, หมายเลขประกันสังคม, ฯลฯ''",
-       "revdelete-legend": "ตั้งการจำกัดทัศนวิสัย:",
-       "revdelete-hide-text": "ข้อความรุ่น",
+       "revdelete-text-text": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¸\88ะยัà¸\87à¸\9bราà¸\81à¸\8fà¹\83à¸\99à¸\9bระวัà¸\95ิหà¸\99à¹\89า à¹\81à¸\95à¹\88สาà¸\98ารà¸\93ะà¸\88ะà¹\84มà¹\88สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\80à¸\99ืà¹\89อหาà¸\9aาà¸\87สà¹\88วà¸\99à¹\84à¸\94à¹\89",
+       "revdelete-text-file": "รุà¹\88à¸\99à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¸\88ะยัà¸\87à¸\9bราà¸\81à¸\8fà¹\83à¸\99à¸\9bระวัà¸\95ิà¹\84à¸\9fลà¹\8c à¹\81à¸\95à¹\88สาà¸\98ารà¸\93ะà¸\88ะà¹\84มà¹\88สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\80à¸\99ืà¹\89อหาà¸\9aาà¸\87สà¹\88วà¸\99à¹\84à¸\94à¹\89",
+       "logdelete-text": "à¹\80หà¸\95ุà¸\81ารà¸\93à¹\8cปูมที่ถูกลบจะยังปรากฏในปูม แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
+       "revdelete-text-others": "à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\84à¸\99อืà¹\88à¸\99à¸\88ะยัà¸\87สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99à¹\80à¸\99ืà¹\89อหาà¸\97ีà¹\88à¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¹\84à¸\94à¹\89 à¸¢à¸\81à¹\80วà¹\89à¸\99ตั้งข้อจำกัดเพิ่มเติม",
+       "revdelete-confirm": "กรุณายืนยันว่าคุณมีเจตนาลบ คุณเข้าใจผลลัพธ์ และคุณปฏิบัติการต้องกับ[[{{MediaWiki:Policy-url}}|นโยบาย]]",
+       "revdelete-suppress-text": "การระงับควรใช้<strong>เฉพาะ</strong>กรณีต่อไปนี้:\n* ข้อมูลที่อาจหมิ่นประมาท\n* ข้อมูลส่วนบุคคลที่ไม่เหมาะสม\n*: <em>ที่อยู่บ้านและหมายเลขโทรศัพท์บ้าน, หมายเลขการประกันสังคมแห่งชาติ ฯลฯ</em>",
+       "revdelete-legend": "ตั้งการจำกัดทัศนวิสัย",
+       "revdelete-hide-text": "ข้อความรุ่นปรับปรุง",
        "revdelete-hide-image": "ซ่อนเนื้อหาไฟล์",
        "revdelete-hide-name": "ซ่อนปฏิบัติการและเป้าหมาย",
        "revdelete-hide-comment": "คำอธิบายอย่างย่อ",
        "revdelete-hide-user": "ชื่อผู้ใช้/เลขที่อยู่ไอพีผู้เขียน",
-       "revdelete-hide-restricted": "ระà¸\87ัà¸\9aข้อมูลจากผู้ดูแลระบบเช่นเดียวกับผู้ใช้อื่น",
+       "revdelete-hide-restricted": "ยัà¸\9aยัà¹\89à¸\87ข้อมูลจากผู้ดูแลระบบเช่นเดียวกับผู้ใช้อื่น",
        "revdelete-radio-same": "(ไม่เปลี่ยนแปลง)",
        "revdelete-radio-set": "ซ่อน",
        "revdelete-radio-unset": "เปิดเผย",
-       "revdelete-suppress": "à¸\8bà¹\88อà¸\99ข้อมูลจากผู้ดูแลระบบเช่นเดียวกับผู้ใช้อื่น",
-       "revdelete-unsuppress": "ลà¸\9aà¸\81ารà¸\88ำà¸\81ัà¸\94สำหรัà¸\9aรุà¹\88à¸\99ที่กู้คืน",
+       "revdelete-suppress": "ยัà¸\9aยัà¹\89à¸\87ข้อมูลจากผู้ดูแลระบบเช่นเดียวกับผู้ใช้อื่น",
+       "revdelete-unsuppress": "ลà¸\9aà¸\81ารà¸\88ำà¸\81ัà¸\94à¹\81à¸\81à¹\88รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87ที่กู้คืน",
        "revdelete-log": "เหตุผล:",
-       "revdelete-submit": "ใช้กับ{{PLURAL:$1|รุ่น|รุ่น}}ที่เลือก",
-       "revdelete-success": "'''ปรับทัศนวิสัยรุ่นสำเร็จ'''",
-       "revdelete-failure": "'''ไม่สามารถปรับทัศนวิสัยของรุ่นได้:'''\n$1",
-       "logdelete-success": "'''ตั้งทัศนวิสัยปูมสำเร็จ'''",
-       "logdelete-failure": "'''ไม่สามารถตั้งทัศนวิสัยของปูมได้:'''\n$1",
+       "revdelete-submit": "ใช้กับรุ่นปรับปรุง{{PLURAL:$1|}}ที่เลือก",
+       "revdelete-success": "<strong>ปรับทัศนวิสัยรุ่นปรับปรุงสำเร็จ</strong>",
+       "revdelete-failure": "<strong>ไม่สามารถปรับทัศนวิสัยของรุ่นปรับปรุงได้:</strong>\n$1",
+       "logdelete-success": "<strong>ตั้งทัศนวิสัยปูมสำเร็จ</strong>",
+       "logdelete-failure": "<strong>ไม่สามารถตั้งทัศนวิสัยของปูม:</strong>\n$1",
        "revdel-restore": "เปลี่ยนทัศนวิสัย",
        "pagehist": "ประวัติหน้า",
        "deletedhist": "ประวัติที่ถูกลบ",
        "revdelete-hide-current": "เกิดความผิดพลาดในการซ่อนรายการลงวันที่ $2 เวลา $1: นี่คือรุ่นการแก้ไขปัจจุบัน\nไม่สามารถซ่อนได้",
-       "revdelete-show-no-access": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81สà¸\94à¸\87รายà¸\81ารลà¸\87วันที่ $2 เวลา $1: รายการนี้ถูกทำเครื่องหมายเป็น \"ถูกจำกัด\"\nคุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว",
-       "revdelete-modify-no-access": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\94ัà¸\94à¹\81à¸\9bรรายà¸\81ารลà¸\87วันที่ $2 เวลา $1: รายการนี้ถูกทำเครื่องหมายเป็น \"ถูกจำกัด\"\nคุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว",
-       "revdelete-modify-missing": "à¹\80à¸\81ิà¸\94ข้อผิดพลาดในการดัดแปรรายการหมายเลข $1: รายการนี้สูญหายจากฐานข้อมูล!",
-       "revdelete-no-change": "'''คำเตือน:''' รายการลงวันที่ $2 เวลา $1 ตั้งค่าทัศนวิสัยตามที่ขออยู่แล้ว",
-       "revdelete-concurrent-change": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\94ัà¸\94à¹\81à¸\9bรรายà¸\81ารลà¸\87วัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸ªà¸\96าà¸\99ะà¸\82อà¸\87รายà¸\81ารà¸\96ูà¸\81à¸\9aาà¸\87à¸\84à¸\99à¹\80à¸\9bลีà¹\88ยà¸\99à¸\82à¸\93ะà¸\97ีà¹\88คุณพยายามดัดแปร\nโปรดตรวจสอบปูม",
-       "revdelete-only-restricted": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\8bà¹\88อà¸\99รายà¸\81ารลà¸\87วัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96ยัà¸\9aยัà¹\89à¸\87à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aมิà¹\83หà¹\89ดูรุ่นนี้ได้โดยไม่เลือกตัวเลือกทัศนวิสัยอื่นด้วย",
+       "revdelete-show-no-access": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81สà¸\94à¸\87รายà¸\81ารวันที่ $2 เวลา $1: รายการนี้ถูกทำเครื่องหมายเป็น \"ถูกจำกัด\"\nคุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว",
+       "revdelete-modify-no-access": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\94ัà¸\94à¹\81à¸\9bรรายà¸\81ารวันที่ $2 เวลา $1: รายการนี้ถูกทำเครื่องหมายเป็น \"ถูกจำกัด\"\nคุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว",
+       "revdelete-modify-missing": "มีข้อผิดพลาดในการดัดแปรรายการหมายเลข $1: รายการนี้สูญหายจากฐานข้อมูล!",
+       "revdelete-no-change": "<strong>คำเตือน:</strong> รายการวันที่ $2 เวลา $1 ตั้งค่าทัศนวิสัยตามที่ขออยู่แล้ว",
+       "revdelete-concurrent-change": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\94ัà¸\94à¹\81à¸\9bรรายà¸\81ารลà¸\87วัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸\94ูà¹\80หมือà¸\99วà¹\88ามีà¸\9cูà¹\89à¹\80à¸\9bลีà¹\88ยà¸\99สà¸\96าà¸\99ะà¸\82อà¸\87รายà¸\81ารà¸\82à¸\93ะคุณพยายามดัดแปร\nโปรดตรวจสอบปูม",
+       "revdelete-only-restricted": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\8bà¹\88อà¸\99รายà¸\81ารวัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96ยัà¸\9aยัà¹\89à¸\87มิà¹\83หà¹\89à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aดูรุ่นนี้ได้โดยไม่เลือกตัวเลือกทัศนวิสัยอื่นด้วย",
        "revdelete-reason-dropdown": "*เหตุผลการลบทั่วไป\n** ละเมิดลิขสิทธิ์\n** ความเห็นไม่เหมาะสมหรือสารสนเทศส่วนบุคคล\n** ชื่อผู้ใช้ไม่เหมาะสม\n** สารสนเทศที่อาจหมิ่นประมาท",
        "revdelete-otherreason": "เหตุผลอื่น/เพิ่มเติม:",
        "revdelete-reasonotherlist": "เหตุผลอื่น",
        "revdelete-edit-reasonlist": "แก้ไขเหตุผลการลบ",
-       "revdelete-offender": "à¸\9cูà¹\89à¹\80à¸\82ียà¸\99รุà¹\88à¸\99:",
-       "suppressionlog": "à¸\9bูมà¸\81ารระà¸\87ัà¸\9a",
-       "suppressionlogtext": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¸\84ือรายà¸\81ารà¸\81ารลà¸\9aà¹\81ละà¸\81ารà¸\9aลà¹\87อà¸\81à¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87à¸\81ัà¸\9aà¹\80à¸\99ืà¹\89อหาà¸\97ีà¹\88à¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¸\88าà¸\81à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a\nà¸\94ู[[Special:BlockList|รายà¸\81ารà¸\9aลà¹\87อà¸\81à¹\84อà¸\9eี]]สำหรัà¸\9aà¸\81ารà¸\9aลà¹\87อà¸\81à¹\81ละà¸\81ารระà¸\87ัà¸\9aในปัจจุบัน",
-       "mergehistory": "à¸\9bระวัà¸\95ิà¸\81ารรวมหน้า",
-       "mergehistory-header": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\84วà¹\89à¹\83หà¹\89à¸\84ุà¸\93à¹\83à¸\8aà¹\89รวมรุà¹\88à¸\99à¹\83à¸\99à¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87หà¸\99à¹\89าà¸\95à¹\89à¸\99à¸\97าà¸\87หà¸\99ึà¹\88à¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¹\83หมà¹\88\nà¸\81à¹\88อà¸\99à¸\94ำà¹\80à¸\99ิà¸\99à¸\81าร à¸\84วรà¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88à¸\81à¹\88อà¸\99วà¹\88าà¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\99ีà¹\89ยัà¸\87รัà¸\81ษาความต่อเนื่องของประวัติหน้าเก่า",
-       "mergehistory-box": "รวมรุà¹\88à¸\99à¸\82อà¸\87หà¸\99à¹\89าà¸\97ัà¹\89à¸\87สอà¸\87:",
+       "revdelete-offender": "à¸\9cูà¹\89à¸\9bระà¸\9eัà¸\99à¸\98à¹\8cรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87:",
+       "suppressionlog": "à¸\9bูมà¸\81ารยัà¸\9aยัà¹\89à¸\87",
+       "suppressionlogtext": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¸\84ือรายà¸\81ารà¸\81ารลà¸\9aà¹\81ละà¸\9aลà¹\87อà¸\81à¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87à¸\81ัà¸\9aà¹\80à¸\99ืà¹\89อหาà¸\97ีà¹\88à¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¸\88าà¸\81à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a\nà¸\94ู[[Special:BlockList|รายà¸\81ารà¸\9aลà¹\87อà¸\81]]สำหรัà¸\9aรายà¸\81ารà¸\81ารà¹\81à¸\9aà¸\99à¹\81ละà¸\9aลà¹\87อà¸\81à¸\97ีà¹\88ยัà¸\87มีà¸\9cลในปัจจุบัน",
+       "mergehistory": "รวมà¸\9bระวัà¸\95ิหน้า",
+       "mergehistory-header": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\83หà¹\89à¸\84ุà¸\93รวมรุà¹\88à¸\99à¸\82อà¸\87à¸\9bระวัà¸\95ิหà¸\99à¹\89าà¸\95à¹\89à¸\99à¸\97าà¸\87หà¸\99ึà¹\88à¸\87à¹\84à¸\9bหà¸\99à¹\89าà¹\83หมà¹\88\nà¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\99ีà¹\89à¸\88ะà¸\84à¸\87ความต่อเนื่องของประวัติหน้าเก่า",
+       "mergehistory-box": "รวมรุà¹\88à¸\99à¸\82อà¸\87สอà¸\87หà¸\99à¹\89า:",
        "mergehistory-from": "หน้าต้นทาง:",
        "mergehistory-into": "หน้าปลายทาง:",
        "mergehistory-list": "ประวัติการแก้ไขที่สามารถรวมได้",
-       "mergehistory-merge": "รุà¹\88à¸\99à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\82อà¸\87หà¸\99à¹\89า [[:$1]] à¸ªà¸²à¸¡à¸²à¸£à¸\96รวมà¹\80à¸\82à¹\89าà¸\81ัà¸\9aหà¸\99à¹\89า [[:$2]] à¹\84à¸\94à¹\89 à¹\83à¸\8aà¹\89à¸\84อลัมà¸\99à¹\8cà¸\9bุà¹\88มรวมà¹\80à¸\89à¸\9eาะรุà¹\88à¸\99à¸\97ีà¹\88สรà¹\89าà¸\87à¹\80วลาà¸\97ีà¹\88à¸\81ำหà¸\99à¸\94หรือà¸\81à¹\88อà¸\99หà¸\99à¹\89าà¸\99ัà¹\89à¸\99 หมายเหตุว่าการใช้ลิงก์นำทางจะตั้งคอลัมน์นี้ใหม่",
-       "mergehistory-go": "à¹\81สà¸\94à¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ีà¹\88สามารà¸\96รวมà¹\84à¸\94à¹\89",
-       "mergehistory-submit": "รวมรุ่น",
-       "mergehistory-empty": "à¹\84มà¹\88มีรุà¹\88à¸\99à¸\97ีà¹\88สามารà¸\96รวมได้",
-       "mergehistory-success": "à¸\9bระวัà¸\95ิ $3 à¸£à¸¸à¹\88à¸\99à¸\82อà¸\87 [[:$1]] à¹\84à¸\94à¹\89à¸\96ูà¸\81รวมเข้ากับ [[:$2]] แล้ว",
-       "mergehistory-fail": "à¹\84มà¹\88สามารà¸\96รวมà¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\84à¸\94à¹\89 à¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\84à¹\88าà¸\95ัวà¹\81à¸\9bรหน้าและเวลาอีกครั้ง",
-       "mergehistory-no-source": "ไม่มีหน้าต้นทาง $1 อยู่ในสารบบ",
-       "mergehistory-no-destination": "ไม่มีหน้าปลายทาง $1 อยู่ในสารบบ",
+       "mergehistory-merge": "รุà¹\88à¸\99à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\82อà¸\87หà¸\99à¹\89า [[:$1]] à¸ªà¸²à¸¡à¸²à¸£à¸\96รวมà¸\81ัà¸\9aหà¸\99à¹\89า [[:$2]] à¹\84à¸\94à¹\89 \nà¹\83à¸\8aà¹\89à¸\84อลัมà¸\99à¹\8cà¸\9bุà¹\88มà¹\80à¸\9eืà¹\88อรวมà¹\80à¸\89à¸\9eาะรุà¹\88à¸\99à¸\97ีà¹\88สรà¹\89าà¸\87 à¸\93 à¹\81ละà¸\81à¹\88อà¸\99à¹\80วลาà¸\97ีà¹\88ระà¸\9aุ\nหมายเหตุว่าการใช้ลิงก์นำทางจะตั้งคอลัมน์นี้ใหม่",
+       "mergehistory-go": "แสดงการแก้ไขที่รวมได้",
+       "mergehistory-submit": "รวมรุ่นปรับปรุง",
+       "mergehistory-empty": "à¹\84มà¹\88มีรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88รวมได้",
+       "mergehistory-success": "รวม $3 à¸£à¸¸à¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\82อà¸\87 [[:$1]] เข้ากับ [[:$2]] แล้ว",
+       "mergehistory-fail": "à¹\84มà¹\88สามารà¸\96รวมà¸\9bระวัà¸\95ิà¹\84à¸\94à¹\89 à¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\95ัวà¹\81à¸\9bรà¹\80สริมหน้าและเวลาอีกครั้ง",
+       "mergehistory-no-source": "ไม่มีหน้าต้นทาง $1",
+       "mergehistory-no-destination": "ไม่มีหน้าปลายทาง $1",
        "mergehistory-invalid-source": "ชื่อเรื่องหน้าต้นทางต้องสมเหตุสมผล",
        "mergehistory-invalid-destination": "ชื่อเรื่องหน้าปลายทางต้องสมเหตุสมผล",
        "mergehistory-autocomment": "รวม [[:$1]] เข้ากับ [[:$2]]",
        "mergehistory-comment": "รวม [[:$1]] เข้ากับ [[:$2]]: $3",
        "mergehistory-same-destination": "หน้าต้นทางและปลายทางเป็นหน้าเดียวกันไม่ได้",
        "mergehistory-reason": "เหตุผล:",
-       "mergelog": "ปูมการรวมหน้า",
-       "pagemerge-logentry": "รวม [[$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[$2]] (รุà¹\88à¸\99ถึง $3)",
-       "revertmerge": "ยà¸\81à¹\80ลิà¸\81à¸\81ารรวมหà¸\99à¹\89า",
-       "mergelogpagetext": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารรวมà¸\9bระวัà¸\95ิà¸\82อà¸\87หà¸\99à¹\89าหà¸\99ึà¹\88à¸\87à¹\80à¸\82à¹\89ากับของอีกหน้าหนึ่งล่าสุด",
+       "mergelog": "ปูมการรวม",
+       "pagemerge-logentry": "รวม [[$1]] à¸\81ัà¸\9a [[$2]] (รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87ถึง $3)",
+       "revertmerge": "à¹\80ลิà¸\81รวม",
+       "mergelogpagetext": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารรวมà¸\9bระวัà¸\95ิหà¸\99à¹\89าหà¸\99ึà¹\88à¸\87กับของอีกหน้าหนึ่งล่าสุด",
        "history-title": "ประวัติรุ่นปรับปรุงของ \"$1\"",
        "difference-title": "ผลต่างระหว่างรุ่นของ \"$1\"",
        "difference-title-multipage": "ผลต่างระหว่างหน้า \"$1\" และ \"$2\"",
        "difference-multipage": "(ผลต่างระหว่างหน้า)",
        "lineno": "แถว $1:",
-       "compareselectedversions": "เปรียบเทียบรุ่นที่เลือกไว้",
-       "showhideselectedversions": "à¹\81สà¸\94à¸\87/à¸\8bà¹\88อà¸\99รุ่นที่เลือก",
+       "compareselectedversions": "เปรียบเทียบรุ่นที่เลือก",
+       "showhideselectedversions": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\97ัศà¸\99วิสัยà¸\82อà¸\87รุ่นที่เลือก",
        "editundo": "ย้อน",
        "diff-empty": "(ไม่แตกต่าง)",
-       "diff-multi-sameuser": "(มิà¹\84à¸\94à¹\89แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน)",
-       "diff-multi-otherusers": "(มิà¹\84à¸\94à¹\89แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้ $2 คน)",
-       "diff-multi-manyusers": "(มิà¹\84à¸\94à¹\89แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้กว่า $2 คน)",
-       "difference-missing-revision": "ไม่พบรุ่น{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)\n\nโดยปกติเกิดจากการเข้าลิงก์ผลต่างของหน้าที่ถูกลบไปแล้ว \nดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
+       "diff-multi-sameuser": "(à¹\84มà¹\88แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน)",
+       "diff-multi-otherusers": "(à¹\84มà¹\88แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้ $2 คน)",
+       "diff-multi-manyusers": "(à¹\84มà¹\88แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้กว่า $2 คน)",
+       "difference-missing-revision": "ไม่พบ{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)\n\nโดยปกติเกิดจากการเข้าลิงก์ผลต่างของหน้าที่ถูกลบแล้ว \nดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
        "searchresults": "ผลการค้นหา",
        "searchresults-title": "ผลการค้นหาสำหรับ \"$1\"",
-       "titlematches": "à¸\9eà¸\9aà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87หà¸\99à¹\89าà¸\95รà¸\87à¸\81ัà¸\99",
-       "textmatches": "à¸\9eà¸\9aà¸\82à¹\89อà¸\84วามà¸\95รà¸\87à¹\83à¸\99หà¸\99à¹\89า",
-       "notextmatches": "à¹\84มà¹\88à¸\9eà¸\9aà¸\82à¹\89อà¸\84วามà¸\95รà¸\87à¹\83à¸\99หà¸\99à¹\89า",
+       "titlematches": "ชื่อเรื่องหน้าตรงกัน",
+       "textmatches": "à¸\82à¹\89อà¸\84วามหà¸\99à¹\89าà¸\95รà¸\87à¸\81ัà¸\99",
+       "notextmatches": "à¹\84มà¹\88à¸\9eà¸\9aà¸\82à¹\89อà¸\84วามหà¸\99à¹\89าà¸\95รà¸\87à¸\81ัà¸\99",
        "prevn": "ก่อนหน้า $1",
        "nextn": "ถัดไป $1",
        "prevn-title": "$1 ผลลัพธ์ก่อนหน้า",
        "searchmenu-exists": "<strong>มีหน้าชื่อ \"[[:$1]]\" บนวิกินี้</strong>\n{{PLURAL:$2|0=|ดูผลการค้นหาอื่นที่พบเพิ่มเติม}}",
        "searchmenu-new": "<strong>สร้างหน้า \"[[:$1]]\" บนวิกินี้!</strong> {{PLURAL:$2|0=|ดูหน้าที่พบด้วยการค้นหาของคุณ|ดูผลการค้นหาที่พบเพิ่มเติม}}",
        "searchprofile-articles": "หน้าเนื้อหา",
-       "searchprofile-images": "มัลà¸\95ิมีà¹\80à¸\94ีย",
+       "searchprofile-images": "สืà¹\88อà¸\9bระสม",
        "searchprofile-everything": "ทุกอย่าง",
-       "searchprofile-advanced": "à¸\8aั้นสูง",
+       "searchprofile-advanced": "à¸\82ั้นสูง",
        "searchprofile-articles-tooltip": "ค้นหาใน $1",
        "searchprofile-images-tooltip": "ค้นหาไฟล์",
        "searchprofile-everything-tooltip": "ค้นเนื้อหาทั้งหมด (รวมหน้าอภิปราย)",
        "search-result-category-size": "$1 สมาชิก ($2 หมวดหมู่ย่อย, $3 ไฟล์)",
        "search-redirect": "(เปลี่ยนทาง $1)",
        "search-section": "(ส่วน $1)",
-       "search-file-match": "(à¸\88ัà¸\9aà¸\84ูà¹\88à¹\80à¸\99ืà¹\89อหาà¹\84à¸\9fลà¹\8c)",
+       "search-file-match": "(à¹\80à¸\99ืà¹\89อหาà¹\84à¸\9fลà¹\8cà¸\95รà¸\87)",
        "search-suggest": "คุณอาจหมายถึง: $1",
        "search-interwiki-caption": "โครงการพี่น้อง",
-       "search-interwiki-default": "ผลลัพธ์จาก $1 :",
+       "search-interwiki-default": "ผลลัพธ์จาก $1:",
        "search-interwiki-more": "(เพิ่มเติม)",
        "search-relatedarticle": "สัมพันธ์",
        "searchrelated": "สัมพันธ์",
        "searchall": "ทั้งหมด",
        "showingresults": "ด้านล่างแสดง <strong>1</strong> ผลลัพธ์ เริ่มตั้งแต่รายการที่ <strong>$2</strong>",
        "showingresultsinrange": "ด้านล่างแสดงมากสุด {{PLURAL:$1|<strong>1</strong>|<strong>$1</strong>}} ผลลัพธ์ ในพิสัย #<strong>$2</strong> ถึง #<strong>$3</strong>",
-       "showingresultsheader": "{{PLURAL:$5|ผลการค้นหา <strong>$1</strong> จาก <strong>$3</strong>|ผลการค้นหา <strong>$1 - $2</strong> จาก <strong>$3</strong>}} สำหรับ <strong>$4</strong>",
+       "search-showingresults": "{{PLURAL:$4|ผลลัพธ์ <strong>$1</strong> จากทั้งหมด <strong>$3</strong>|ผลลัพธ์ <strong>$1 - $2</strong> จากทั้งหมด <strong>$3</strong>}}",
        "search-nonefound": "ไม่มีผลลัพธ์ตรงกับคำค้น",
-       "powersearch-legend": "à¸\84à¹\89à¸\99หาระà¸\94ัà¸\9aสูง",
+       "powersearch-legend": "à¸\84à¹\89à¸\99หาà¸\82ัà¹\89à¸\99สูง",
        "powersearch-ns": "ค้นหาในเนมสเปซ:",
        "powersearch-togglelabel": "เลือก:",
        "powersearch-toggleall": "ทั้งหมด",
        "powersearch-togglenone": "ไม่เลือก",
        "powersearch-remember": "จำการเลือกสำหรับการค้นหาในอนาคต",
        "search-external": "ค้นหาภายนอก",
-       "searchdisabled": "à¸\81ารà¸\84à¹\89à¸\99หา {{SITENAME}} à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99 à¸\84ุà¸\93สามารà¸\96à¸\84à¹\89à¸\99หาà¸\9cà¹\88าà¸\99à¸\81ูà¹\80à¸\81ิลหรือà¹\80à¸\8bิรà¹\8cà¸\8aà¹\80อà¸\99à¸\88ิà¸\99อืà¹\88à¸\99à¹\83à¸\99à¹\80วลาà¹\84มà¹\88à¸\99าà¸\99 à¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88าà¸\94ัà¸\8aà¸\99ีà¹\80à¸\99ืà¹\89อหาà¸\82อà¸\87 {{SITENAME}} à¸\9aà¸\99à¹\80à¸\8bิรà¹\8cà¸\8aà¹\80อà¸\99à¸\88ิà¸\99อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\82à¹\89อมูลà¹\80à¸\81à¹\88า",
-       "search-error": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¸\82à¸\93ะà¸\81ำลัà¸\87ค้นหา: $1",
-       "preferences": "à¸\95ัà¹\89à¸\87à¸\84à¹\88าสà¹\88วà¸\99à¸\95ัว",
+       "searchdisabled": "à¸\81ารà¸\84à¹\89à¸\99หา {{SITENAME}} à¸\96ูà¸\81à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99 \nà¸\84ุà¸\93สามารà¸\96à¸\84à¹\89à¸\99หาà¹\82à¸\94ยà¸\97าà¸\87à¸\81ูà¹\80à¸\81ิลà¹\83à¸\99ระหวà¹\88าà¸\87à¸\99ัà¹\89à¸\99\nà¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88าà¸\94ัà¸\8aà¸\99ีà¹\80à¸\99ืà¹\89อหา {{SITENAME} à¸­à¸²à¸\88ลà¹\89าสมัย",
+       "search-error": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¸\82à¸\93ะค้นหา: $1",
+       "preferences": "à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88า",
        "mypreferences": "การตั้งค่า",
        "prefs-edits": "จำนวนการแก้ไข:",
        "prefsnologintext2": "โปรดล็อกอินเพื่อเปลี่ยนการตั้งค่าของคุณ",
        "prefs-skin": "หน้าตา",
-       "skin-preview": "à¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87",
+       "skin-preview": "ตัวอย่าง",
        "datedefault": "ไม่มีการตั้งค่า",
        "prefs-labs": "คุณสมบัติทดลอง",
        "prefs-user-pages": "หน้าผู้ใช้",
        "prefs-watchlist": "รายการเฝ้าดู",
        "prefs-watchlist-days": "จำนวนวันที่แสดงในรายการเฝ้าดู:",
        "prefs-watchlist-days-max": "มากสุด $1 วัน",
-       "prefs-watchlist-edits": "à¸\88ำà¸\99วà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82มาà¸\81สุà¸\94à¸\97ีà¹\88à¹\81สà¸\94à¸\87à¹\83à¸\99รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\97ีà¹\88à¸\82ยายออà¸\81:",
+       "prefs-watchlist-edits": "à¸\88ำà¸\99วà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82มาà¸\81สุà¸\94à¸\97ีà¹\88à¹\81สà¸\94à¸\87à¹\83à¸\99รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82ยาย:",
        "prefs-watchlist-edits-max": "จำนวนสูงสุด: 1000",
        "prefs-watchlist-token": "โทเค็นรายการเฝ้าดู:",
        "prefs-misc": "เบ็ดเตล็ด",
        "rows": "แถว:",
        "columns": "คอลัมน์:",
        "searchresultshead": "ค้นหา",
-       "stub-threshold": "ขีดแบ่งสำหรับ <a href=\"#\" class=\"stub\">ลิงก์โครง</a> (ไบต์):",
+       "stub-threshold": "ขีดแบ่งสำหรับการจัดรูปแบบ <a href=\"#\" class=\"stub\">ลิงก์โครง</a> (ไบต์):",
        "stub-threshold-disabled": "ปิดใช้งาน",
        "recentchangesdays": "จำนวนวันที่แสดงในปรับปรุงล่าสุด:",
        "recentchangesdays-max": "มากสุด $1 วัน",
        "recentchangescount": "จำนวนการแก้ไขที่แสดงโดยปริยาย:",
        "prefs-help-recentchangescount": "นี่รวมถึงการปรับปรุงล่าสุด ประวิติหน้า และปูม",
        "prefs-help-watchlist-token2": "นี่คือแป้นลับสำหรับเข้าการป้อนเว็บรายการเฝ้าดูของคุณ\nใครก็ตามที่ทราบจะสามารถอ่านรายการเฝ้าดูของคุณได้ ฉะนั้นอย่าบอกผู้อื่น\n[[Special:ResetTokens|คลิกที่นี่หากคุณต้องการตั้งใหม่]]",
-       "savedprefs": "à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9aัà¸\99à¸\97ึà¸\81แล้ว",
+       "savedprefs": "à¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\82อà¸\87à¸\84ุà¸\93แล้ว",
        "timezonelegend": "เขตเวลา:",
-       "localtime": "เวลาท้องถิ่น",
+       "localtime": "เวลาท้องถิ่น:",
        "timezoneuseserverdefault": "ใช้ค่าโดยปริยายของวิกิ ($1)",
        "timezoneuseoffset": "อื่น ๆ (ระบุส่วนต่างเวลา)",
        "servertime": "เวลาเซิร์ฟเวอร์:",
-       "guesstimezone": "à¹\80รียà¸\81à¸\84à¹\88าà¸\88าà¸\81à¹\80วà¹\87à¸\9aà¹\80à¸\9aราวà¹\8cà¹\80à¸\8bอรà¹\8c",
+       "guesstimezone": "เรียกค่าจากเบราว์เซอร์",
        "timezoneregion-africa": "แอฟริกา",
        "timezoneregion-america": "อเมริกา",
        "timezoneregion-antarctica": "แอนตาร์กติกา",
        "timezoneregion-europe": "ยุโรป",
        "timezoneregion-indian": "มหาสมุทรอินเดีย",
        "timezoneregion-pacific": "มหาสมุทรแปซิฟิก",
-       "allowemail": "à¹\80à¸\9bิà¸\94รัà¸\9aอีเมลจากผู้ใช้อื่น",
+       "allowemail": "à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99อีเมลจากผู้ใช้อื่น",
        "prefs-searchoptions": "ค้นหา",
        "prefs-namespaces": "เนมสเปซ",
        "default": "ค่าโดยปริยาย",
        "prefs-files": "ไฟล์",
        "prefs-custom-css": "สไตล์ชีตปรับแต่งเอง",
        "prefs-custom-js": "จาวาสคริปต์ปรับแต่งเอง",
-       "prefs-common-css-js": "CSS / à¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8cà¸\97ีà¹\88à¹\83à¸\8aà¹\89รà¹\88วมà¸\81ัà¸\99à¸\81ับทุกหน้าตา:",
-       "prefs-reset-intro": "à¸\84ุà¸\93สามารà¸\96à¹\83à¸\8aà¹\89หà¸\99à¹\89าà¸\99ีà¹\89à¸\95ัà¹\89à¸\87à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\82อà¸\87à¸\84ุà¸\93à¸\81ลัà¸\9aà¹\84à¸\9bยัà¸\87à¸\84à¹\88าà¸\95ัà¹\89à¸\87à¸\95à¹\89à¸\99à¸\82อà¸\87à¹\80วà¹\87à¸\9aà¹\83หมà¹\88\nà¸\8bึà¹\88à¸\87ไม่สามารถทำกลับได้",
+       "prefs-common-css-js": "CSS / à¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8cรวมสำหรับทุกหน้าตา:",
+       "prefs-reset-intro": "à¸\84ุà¸\93สามารà¸\96à¹\83à¸\8aà¹\89หà¸\99à¹\89าà¸\99ีà¹\89à¸\95ัà¹\89à¸\87à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\82อà¸\87à¸\84ุà¸\93à¹\80à¸\9bà¹\87à¸\99à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายà¸\82อà¸\87à¹\80วà¹\87à¸\9aà¹\83หมà¹\88\nไม่สามารถทำกลับได้",
        "prefs-emailconfirm-label": "การยืนยันอีเมล:",
        "youremail": "อีเมล:",
        "username": "{{GENDER:$1|ชื่อผู้ใช้}}:",
        "yourlanguage": "ภาษา:",
        "yourvariant": "อักษรต่างรูปของเนื้อหา:",
        "prefs-help-variant": "รูปแปรหรืออักขรวิธีที่คุณเลือกให้แสดงหน้าเนื้อหาของวิกินี้",
-       "yournick": "ลายเซ็น:",
-       "prefs-help-signature": "à¸\84วามà¹\80หà¹\87à¸\99à¹\83à¸\99หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\84วรลà¸\87ลายà¹\80à¸\8bà¹\87à¸\99ด้วย \"<nowiki>~~~~</nowiki>\" ซึ่งจะถูกแปลงเป็นลายเซ็นของคุณและตราเวลา",
-       "badsig": "ลายเซ็นดิบไม่ถูกต้อง ให้ตรวจสอบแท็กเอชทีเอ็มแอล",
-       "badsiglength": "ลายเซ็นของคุณยาวเกินไป ต้องยาวไม่เกิน $1 ตัวอักษร",
-       "yourgender": "à¹\80à¸\9eศ:",
-       "gender-unknown": "ไม่ระบุ",
+       "yournick": "ลายเซ็นใหม่:",
+       "prefs-help-signature": "à¸\84วรลà¸\87ลายà¹\80à¸\8bà¹\87à¸\99à¸\84วามà¹\80หà¹\87à¸\99à¹\83à¸\99หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยด้วย \"<nowiki>~~~~</nowiki>\" ซึ่งจะถูกแปลงเป็นลายเซ็นของคุณและตราเวลา",
+       "badsig": "ลายเซ็นดิบไม่ถูกต้อง \nให้ตรวจสอบป้ายระบุเอชทีเอ็มแอล",
+       "badsiglength": "ลายเซ็นของคุณยาวเกินไป \nต้องยาวไม่เกิน $1 อักขระ",
+       "yourgender": "à¸\95à¹\89อà¸\87à¸\81ารà¹\83หà¹\89ระà¸\9aุà¸\84ุà¸\93à¹\80à¸\9bà¹\87à¸\99à¹\80à¸\9eศà¹\83à¸\94",
+       "gender-unknown": "à¸\82อà¹\84มà¹\88ระà¸\9aุ",
        "gender-male": "ชาย",
        "gender-female": "หญิง",
-       "prefs-help-gender": "à¹\80ลือà¸\81à¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89หรือà¹\84มà¹\88à¸\81à¹\87à¹\84à¸\94à¹\89\nà¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cà¹\83à¸\8aà¹\89à¸\84à¹\88าà¸\99ีà¹\89à¹\80à¸\9eืà¹\88อà¸\95ิà¸\94à¸\95à¹\88อà¸\84ุà¸\93à¹\81ละà¸\81ลà¹\88าวà¸\96ึà¸\87à¸\84ุà¸\93à¹\82à¸\94ยà¹\83à¸\8aà¹\89à¹\80à¸\9eศà¸\97าà¸\87à¹\84วยาà¸\81รà¸\93à¹\8cà¸\97ีà¹\88à¹\80หมาะสมà¹\80มืà¹\88อà¸\95ิà¸\94à¸\95à¹\88อà¸\9cูà¹\89อืà¹\88à¸\99\nà¸\82à¹\89อมูลนี้เปิดเผยต่อสาธารณะ",
+       "prefs-help-gender": "à¹\80ลือà¸\81à¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89หรือà¹\84มà¹\88à¸\81à¹\87à¹\84à¸\94à¹\89\nà¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cà¹\83à¸\8aà¹\89à¸\84à¹\88าà¸\99ีà¹\89à¹\80à¸\9eืà¹\88อà¸\95ิà¸\94à¸\95à¹\88อà¸\84ุà¸\93à¹\81ละà¸\81ลà¹\88าวà¸\96ึà¸\87à¸\84ุà¸\93à¹\82à¸\94ยà¹\83à¸\8aà¹\89à¹\80à¸\9eศà¸\97าà¸\87à¹\84วยาà¸\81รà¸\93à¹\8cà¸\97ีà¹\88à¹\80หมาะสมà¹\80มืà¹\88อà¸\95ิà¸\94à¸\95à¹\88อà¸\9cูà¹\89อืà¹\88à¸\99\nสารสà¸\99à¹\80à¸\97ศนี้เปิดเผยต่อสาธารณะ",
        "email": "อีเมล",
-       "prefs-help-realname": "ไม่จำเป็นต้องใช้ชื่อจริง ถ้าคุณเลือกใช้ชื่อจริง จะใช้เพื่อให้เกียรติแก่งานของคุณ",
-       "prefs-help-email": "à¹\84มà¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87à¹\83สà¹\88à¸\97ีà¹\88อยูà¹\88อีà¹\80มล à¹\81à¸\95à¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99สำหรัà¸\9aà¸\81ารà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\80มืà¹\88อคุณลืมรหัสผ่าน",
-       "prefs-help-email-others": "à¸\84ุà¸\93ยัà¸\87สามารà¸\96à¹\80ลือà¸\81à¹\83หà¹\89à¸\9cูà¹\89อืà¹\88à¸\99à¸\95ิà¸\94à¸\95à¹\88อà¸\84ุà¸\93à¹\82à¸\94ยอีà¹\80มลà¸\9cà¹\88าà¸\99ลิà¸\87à¸\81à¹\8cà¸\9aà¸\99หà¸\99à¹\89าà¸\9cูà¹\89à¹\83à¸\8aà¹\89หรือหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87à¸\84ุà¸\93\nà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93à¹\84มà¹\88à¸\96ูà¸\81à¹\80à¸\9bิà¸\94à¹\80à¸\9cยเมื่อผู้ใช้อื่นติดต่อคุณ",
+       "prefs-help-realname": "ไม่จำเป็นต้องใช้ชื่อจริง \nถ้าคุณเลือกใช้ชื่อจริง จะใช้เพื่อให้เกียรติแก่งานของคุณ",
+       "prefs-help-email": "à¹\84มà¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87à¹\83สà¹\88à¸\97ีà¹\88อยูà¹\88อีà¹\80มล à¹\81à¸\95à¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99สำหรัà¸\9aà¸\81ารà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88หาà¸\81คุณลืมรหัสผ่าน",
+       "prefs-help-email-others": "à¸\84ุà¸\93ยัà¸\87สามารà¸\96à¹\80ลือà¸\81à¹\83หà¹\89à¸\9cูà¹\89อืà¹\88à¸\99à¸\95ิà¸\94à¸\95à¹\88อà¸\84ุà¸\93à¹\82à¸\94ยอีà¹\80มลà¸\9cà¹\88าà¸\99ลิà¸\87à¸\81à¹\8cà¸\9aà¸\99หà¸\99à¹\89าà¸\9cูà¹\89à¹\83à¸\8aà¹\89หรือหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87à¸\84ุà¸\93\nà¹\84มà¹\88à¹\80à¸\9bิà¸\94à¹\80à¸\9cยà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93เมื่อผู้ใช้อื่นติดต่อคุณ",
        "prefs-help-email-required": "ต้องการที่อยู่อีเมล",
-       "prefs-info": "à¸\82à¹\89อมูลเบื้องต้น",
+       "prefs-info": "สารสà¸\99à¹\80à¸\97ศเบื้องต้น",
        "prefs-i18n": "สากลวิวัตน์",
        "prefs-signature": "ลายเซ็น",
-       "prefs-dateformat": "รูปแบบวันที่และเวลา",
+       "prefs-dateformat": "รูปแบบวัน",
        "prefs-timeoffset": "ส่วนต่างเวลา",
        "prefs-advancedediting": "ตัวเลือกทั่วไป",
        "prefs-editor": "ตัวแก้ไข",
        "prefs-tokenwatchlist": "โทเค็น",
        "prefs-diffs": "ผลต่าง",
        "prefs-help-prefershttps": "การตั้งค่านี้จะมีผลเมื่อคุณล็อกอินครั้งถัดไป",
+       "prefswarning-warning": "คุณเปลี่ยนแปลงการตั้งค่าของคุณที่ยังไม่ได้บันทึก\nหากคุณออกจากหน้านี้โดยไม่คลิก \"$1\" จะไม่ปรับการตั้งค่าของคุณ",
        "prefs-tabs-navigation-hint": "แนะนำ: คุณสามารถใช้แป้นลูกศรซ้ายและขวาเพื่อนำทางระหว่างแถบในรายการแถบได้",
        "email-address-validity-valid": "ที่อยู่อีเมลดูถูกต้อง",
        "email-address-validity-invalid": "ป้อนที่อยู่อีเมลที่ถูกต้อง",
-       "userrights": "บริหารสิทธิผู้ใช้",
-       "userrights-lookup-user": "à¸\9aริหารสิà¸\97à¸\98ิผู้ใช้",
+       "userrights": "à¸\81ารà¸\9aริหารสิà¸\97à¸\98ิà¸\9cูà¹\89à¹\83à¸\8aà¹\89",
+       "userrights-lookup-user": "à¸\9aริหารà¸\81ลุà¹\88มผู้ใช้",
        "userrights-user-editname": "ใส่ชื่อผู้ใช้:",
        "editusergroup": "แก้ไขกลุ่มผู้ใช้",
-       "editinguser": "กำลังเปลี่ยนสิทธิผู้ใช้ของผู้ใช้ '''[[User:$1|$1]]''' $2",
+       "editinguser": "กำลังเปลี่ยนสิทธิผู้ใช้ของผู้ใช้ <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "แก้ไขกลุ่มผู้ใช้",
-       "saveusergroups": "à¸\95à¸\81ลà¸\87",
-       "userrights-groupsmember": "สมาà¸\8aิà¸\81à¹\83à¸\99à¸\81ลุà¹\88ม:",
+       "saveusergroups": "à¸\9aัà¸\99à¸\97ึà¸\81à¸\81ลุà¹\88มà¸\9cูà¹\89à¹\83à¸\8aà¹\89",
+       "userrights-groupsmember": "สมาà¸\8aิà¸\81à¸\82อà¸\87:",
        "userrights-groupsmember-auto": "สมาชิกโดยปริยายของ:",
        "userrights-groups-help": "คุณสามารถเปลี่ยนแปลงกลุ่มที่ผู้ใช้รายนี้อยู่:\n* กล่องที่มีเครื่องหมายถูก หมายความว่า ผู้ใช้อยู่ในกลุ่มนั้น\n* กล่องที่ไม่มีเครื่องหมายถูก หมายความว่า ผู้ใช้ไม่ได้อยู่ในกลุ่มนั้น\n* เครื่องหมาย * ชี้ว่าคุณไม่สามารถนำกลุ่มนั้นออกได้เมื่อคุณเพิ่มกลุ่มนั้นไปแล้ว หรือกลับกัน",
        "userrights-reason": "เหตุผล:",
-       "userrights-no-interwiki": "à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aสิทธิแก้ไขสิทธิผู้ใช้บนวิกิอื่น",
-       "userrights-nodatabase": "à¹\84มà¹\88มีà¸\90าà¸\99à¸\82à¹\89อมูล $1 à¸­à¸¢à¸¹à¹\88 à¸«à¸£à¸·à¸­à¸\90าà¸\99à¸\82à¹\89อมูลอยูà¹\88à¸\9aà¸\99à¹\80à¸\84รืà¹\88อà¸\87อืà¹\88à¸\99",
+       "userrights-no-interwiki": "à¸\84ุà¸\93à¹\84มà¹\88มีสิทธิแก้ไขสิทธิผู้ใช้บนวิกิอื่น",
+       "userrights-nodatabase": "ไม่มีฐานข้อมูล $1 หรือฐานข้อมูลอยู่บนเครื่องอื่น",
        "userrights-nologin": "คุณต้อง[[Special:UserLogin|ล็อกอิน]]ด้วยบัญชีผู้ดูแลระบบก่อน จึงจะกำหนดสิทธิผู้ใช้ได้",
-       "userrights-notallowed": "à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\80à¸\9eิà¹\88มหรือลà¸\94สิทธิผู้ใช้",
+       "userrights-notallowed": "à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิà¹\80à¸\9eิà¹\88มหรือà¹\80à¸\9eิà¸\81à¸\96อà¸\99สิทธิผู้ใช้",
        "userrights-changeable-col": "กลุ่มที่คุณสามารถเปลี่ยนได้",
        "userrights-unchangeable-col": "กลุ่มที่คุณไม่สามารถเปลี่ยนได้",
        "userrights-conflict": "พบการเปลี่ยนแปลงสิทธิผู้ใช้ขัดกัน! โปรดทบทวนและยืนยันการเปลี่ยนแปลงของคุณ",
-       "userrights-removed-self": "คุณเพิกถอนสิทธิของคุณสำเร็จแล้ว ฉะนั้น คุณจึงไม่สามารถเข้าถึงหน้านี้ได้อีกต่อไป",
+       "userrights-removed-self": "คุณเพิกถอนสิทธิของคุณสำเร็จแล้ว ฉะนั้น คุณจึงไม่สามารถเข้าถึงหน้านี้ได้อีก",
        "group": "กลุ่ม:",
        "group-user": "ผู้ใช้",
        "group-autoconfirmed": "ผู้ใช้ทั่วไป",
        "right-move": "ย้ายหน้า",
        "right-move-subpages": "ย้ายหน้าพร้อมหน้าย่อย",
        "right-move-rootuserpages": "ย้ายหน้าผู้ใช้หลัก",
+       "right-move-categorypages": "เปลี่ยนชื่อหน้าหมวดหมู่",
        "right-movefile": "ย้ายไฟล์",
        "right-suppressredirect": "ไม่สร้างหน้าเปลี่ยนทางจากหน้าต้นทางเมื่อย้ายหน้า",
        "right-upload": "อัปโหลดไฟล์",
-       "right-reupload": "à¹\80à¸\82ียà¸\99ทับไฟล์เดิม",
-       "right-reupload-own": "à¹\80à¸\82ียà¸\99à¸\97ัà¸\9aà¹\84à¸\9fลà¹\8cà¹\80à¸\94ิมà¸\97ีà¹\88อัà¸\9bà¹\82หลà¸\94à¸\94à¹\89วยà¸\95à¸\99เอง",
-       "right-reupload-shared": "à¹\80à¸\82ียà¸\99à¸\97ัà¸\9aà¹\84à¸\9fลà¹\8cà¸\9aà¸\99à¸\84ลัà¸\87à¹\80à¸\81à¹\87à¸\9aสืà¹\88อสà¹\88วà¸\99à¸\81ลาà¸\87",
+       "right-reupload": "à¸\9aัà¸\99à¸\97ึà¸\81ทับไฟล์เดิม",
+       "right-reupload-own": "à¸\9aัà¸\99à¸\97ึà¸\81à¸\97ัà¸\9aà¹\84à¸\9fลà¹\8cà¹\80à¸\94ิมà¸\97ีà¹\88à¸\84ุà¸\93อัà¸\9bà¹\82หลà¸\94เอง",
+       "right-reupload-shared": "à¸\9aัà¸\99à¸\97ึà¸\81à¸\97ัà¸\9aà¹\84à¸\9fลà¹\8cà¸\9aà¸\99à¸\84ลัà¸\87รà¹\88วมสืà¹\88อà¸\97à¹\89อà¸\87à¸\96ิà¹\88à¸\99",
        "right-upload_by_url": "อัปโหลดไฟล์จากยูอาร์แอล",
-       "right-purge": "ลà¹\89าà¸\87à¹\81à¸\84à¸\8aà¸\82อà¸\87à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cà¹\82à¸\94ยà¹\84มà¹\88มีà¸\81ารยืà¸\99ยัà¸\99",
-       "right-autoconfirmed": "à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81à¸\81ึà¹\88à¸\87ลà¹\87อà¸\81",
+       "right-purge": "ล้างแคชของเว็บไซต์โดยไม่ยืนยัน",
+       "right-autoconfirmed": "à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\9cลà¸\88าà¸\81à¸\82ีà¸\94à¸\88ำà¸\81ัà¸\94อัà¸\95รายึà¸\94à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี",
        "right-bot": "กำหนดเป็นกระบวนการอัตโนมัติ",
-       "right-nominornewtalk": "à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อยà¹\83à¸\99หà¸\99à¹\89าอภิà¸\9bรายà¸\97ีà¹\88ทำให้การแจ้งข้อความใหม่ปรากฏ",
+       "right-nominornewtalk": "หาà¸\81à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อยà¹\83à¸\99หà¸\99à¹\89าอภิà¸\9bรายà¸\88ะทำให้การแจ้งข้อความใหม่ปรากฏ",
        "right-apihighlimits": "ใช้ข้อจำกัดที่สูงขึ้นในคำสั่งเอพีไอ",
        "right-writeapi": "ใช้การเขียนเอพีไอ",
        "right-delete": "ลบหน้า",
-       "right-bigdelete": "ลà¸\9aหà¸\99à¹\89าà¸\97ีà¹\88มีà¸\9bระวัà¸\95ิà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88",
-       "right-deletelogentry": "ลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99หà¸\99à¹\88วยà¸\9bูมà¸\97ีà¹\88à¹\80à¸\88าะà¸\88à¸\87",
+       "right-bigdelete": "ลบหน้าที่มีประวัติใหญ่",
+       "right-deletelogentry": "ลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99หà¸\99à¹\88วยà¸\9bูมà¸\88ำà¹\80à¸\9eาะ",
        "right-deleterevision": "ลบและกู้คืนรุ่นจำเพาะของหน้า",
        "right-deletedhistory": "ดูหน่วยประวัติที่ถูกลบ โดยไม่มีข้อความที่เกี่ยวข้อง",
        "right-deletedtext": "ดูข้อความที่ถูกลบและการเปลี่ยนแปลงระหว่างรุ่นที่ถูกลบ",
        "right-browsearchive": "ค้นหาหน้าที่ถูกลบ",
        "right-undelete": "กู้คืนหน้า",
-       "right-suppressrevision": "ดูรุ่นต่าง ๆ หรือ ซ่อน/เลิกซ่อนรุ่นที่กำหนดจากผู้ใช้ใด ๆ",
-       "right-viewsuppressed": "à¸\94ูรุà¸\99à¸\97ีà¹\88à¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¸\88าà¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89อืà¹\88น",
+       "right-suppressrevision": "ดู ซ่อนและเปิดเผยรุ่นจำเพาะของหน้าจากผู้ใช้ทุกคน",
+       "right-viewsuppressed": "à¸\94ูรุà¹\88à¸\99à¸\97ีà¹\88à¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¸\88าà¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ุà¸\81à¸\84น",
        "right-suppressionlog": "ดูปูมส่วนตัว",
        "right-block": "บล็อกมิให้ผู้ใช้อื่นแก้ไข",
-       "right-blockemail": "à¸\9aลà¹\87อà¸\81มิà¹\83หà¹\89à¸\9cูà¹\89à¹\83à¸\8a้ส่งอีเมล",
+       "right-blockemail": "à¸\9aลà¹\87อà¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89มิà¹\83ห้ส่งอีเมล",
        "right-hideuser": "บล็อกชื่อผู้ใช้ ซ่อนไม่ให้สาธารณะเห็น",
-       "right-ipblock-exempt": "อà¹\89อมการบล็อกเลขที่อยู่ไอพี บล็อกอัตโนมัติ และบล็อกช่วง",
+       "right-ipblock-exempt": "à¹\80ลีà¹\88ยà¸\87การบล็อกเลขที่อยู่ไอพี บล็อกอัตโนมัติ และบล็อกช่วง",
        "right-proxyunbannable": "เลี่ยงการบล็อกอัตโนมัติของพร็อกซี",
        "right-unblockself": "ปลดบล็อกตนเอง",
-       "right-protect": "เปลี่ยนระดับการล็อกและแก้ไขหน้าที่ถูกล็อก",
-       "right-editprotected": "à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81à¸\8bึà¹\88à¸\87 \"{{int:protect-level-sysop}}\"",
-       "right-editsemiprotected": "à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81à¸\8bึà¹\88à¸\87 \"{{int:protect-level-autoconfirmed}}\"",
+       "right-protect": "เปลี่ยนระดับการล็อกและแก้ไขหน้าที่ถูกล็อกแบบถ่ายทอด",
+       "right-editprotected": "à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81à¹\83à¸\99à¸\90าà¸\99ะ \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87อà¸\81à¹\83à¸\99à¸\90าà¸\99ะ \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "แก้ไขอินเตอร์เฟซผู้ใช้",
        "right-editusercssjs": "แก้ไขไฟล์ CSS และจาวาสคริปต์ของผู้ใช้อื่น",
        "right-editusercss": "แก้ไขไฟล์ CSS ของผู้ใช้อื่น",
        "right-editmyusercss": "แก้ไขไฟล์ซีเอสเอสผู้ใช้ของคุณเอง",
        "right-editmyuserjs": "แก้ไขไฟล์จาวาสคริปต์ผู้ใช้ของคุณเอง",
        "right-viewmywatchlist": "ดูรายการเฝ้าดูของคุณ",
-       "right-editmywatchlist": "à¹\81à¸\81à¹\89à¹\84à¸\82รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93 à¸«à¸¡à¸²à¸¢à¹\80หà¸\95ุวà¹\88า à¸\81ารà¸\81ระà¸\97ำà¸\9aาà¸\87อยà¹\88าà¸\87อาà¸\88ยัà¸\87à¹\80à¸\9eิà¹\88มหà¸\99à¹\89าà¹\81มà¹\89à¸\88ะปราศจากสิทธินี้",
+       "right-editmywatchlist": "à¹\81à¸\81à¹\89à¹\84à¸\82รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93 à¸«à¸¡à¸²à¸¢à¹\80หà¸\95ุวà¹\88า à¸\9aาà¸\87à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\88ะยัà¸\87à¹\80à¸\9eิà¹\88มหà¸\99à¹\89าà¹\81มà¹\89ปราศจากสิทธินี้",
        "right-viewmyprivateinfo": "ดูข้อมูลส่วนตัวของคุณ (เช่น ที่อยู่อีเมล ชื่อจริง)",
        "right-editmyprivateinfo": "แก้ไขข้อมูลส่วนตัวของคุณ (เช่น ที่อยู่อีเมล ชื่อจริง)",
        "right-editmyoptions": "แก้ไขการตั้งค่าของคุณ",
        "right-rollback": "ย้อนการแก้ไขของผู้ใช้ล่าสุดที่แก้ไขหน้าเฉพาะอย่างรวดเร็ว",
-       "right-markbotedits": "ทำเครื่องหมายการย้อนว่าเป็นการแก้ไขโดยบอต",
+       "right-markbotedits": "à¸\97ำà¹\80à¸\84รืà¹\88อà¸\87หมายà¸\81ารยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\89ุà¸\81à¹\80à¸\89ิà¸\99วà¹\88าà¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\82à¸\94ยà¸\9aอà¸\95",
        "right-noratelimit": "ไม่ได้รับผลกระทบจากขีดจำกัดอัตรา",
        "right-import": "นำเข้าหน้าจากวิกิอื่น",
        "right-importupload": "นำเข้าหน้าจากไฟล์ที่อัปโหลด",
        "right-patrol": "ทำเครื่องหมายการแก้ไขของผู้อื่นว่าตรวจสอบแล้ว",
        "right-autopatrol": "ให้ทำเครื่องหมายการแก้ไขของตนเองเป็นตรวจสอบแล้วอัตโนมัติ",
-       "right-patrolmarks": "à¸\94ูà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ลà¹\88าสุà¸\94à¸\82อà¸\87à¸\81ารà¸\97ำà¹\80à¸\84รืà¹\88อà¸\87หมายà¸\95รวà¸\88สอà¸\9a",
+       "right-patrolmarks": "à¸\94ูà¸\81ารà¸\97ำà¹\80à¸\84รืà¹\88อà¸\87หมายà¸\95รวà¸\88สอà¸\9aà¹\83à¸\99à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ลà¹\88าสุà¸\94",
        "right-unwatchedpages": "ดูรายการหน้าที่ไม่มีผู้เฝ้าดู",
        "right-mergehistory": "รวมประวัติหน้า",
        "right-userrights": "แก้ไขสิทธิผู้ใช้ทั้งหมด",
        "action-createpage": "สร้างหน้า",
        "action-createtalk": "สร้างหน้าอภิปราย",
        "action-createaccount": "สร้างบัญชีผู้ใช้นี้",
-       "action-history": "à¸\94ูà¸\9bระวัà¸\95ิà¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89",
+       "action-history": "ดูประวัติหน้านี้",
        "action-minoredit": "ทำเครื่องหมายการแก้ไขนี้เป็นการแก้ไขเล็กน้อย",
        "action-move": "ย้ายหน้านี้",
-       "action-move-subpages": "ย้ายหน้านี้ รวมทั้งหน้าย่อย",
+       "action-move-subpages": "ย้ายหน้านี้และหน้าย่อย",
        "action-move-rootuserpages": "ย้ายหน้าผู้ใช้หลัก",
+       "action-move-categorypages": "เปลี่ยนชื่อหน้าหมวดหมู่",
        "action-movefile": "ย้ายไฟล์นี้",
        "action-upload": "อัปโหลดไฟล์นี้",
-       "action-reupload": "อัà¸\9bà¹\82หลà¸\94ทับไฟล์ที่มีอยู่แล้วนี้",
-       "action-reupload-shared": "à¹\80à¸\82ียà¸\99à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¸\97ัà¸\9aà¸\9aà¸\99à¸\84ลัà¸\87สà¹\88วà¸\99à¸\81ลาà¸\87",
-       "action-upload_by_url": "อัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¸\88าà¸\81à¸\97ีà¹\88อยูà¹\88ยูอารà¹\8cà¹\81อล",
+       "action-reupload": "à¸\9aัà¸\99à¸\97ึà¸\81ทับไฟล์ที่มีอยู่แล้วนี้",
+       "action-reupload-shared": "à¸\9aัà¸\99à¸\97ึà¸\81à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¸\97ัà¸\9aà¸\9aà¸\99à¸\84ลัà¸\87รวม",
+       "action-upload_by_url": "อัปโหลดไฟล์นี้จากยูอาร์แอล",
        "action-writeapi": "ใช้การเขียนเอพีไอ",
        "action-delete": "ลบหน้านี้",
-       "action-deleterevision": "ลบรุ่นนี้",
+       "action-deleterevision": "ลà¸\9aรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99ีà¹\89",
        "action-deletedhistory": "ดูประวัติที่ถูกลบของหน้านี้",
        "action-browsearchive": "ค้นหาหน้าที่ถูกลบ",
        "action-undelete": "กู้คืนหน้านี้",
-       "action-suppressrevision": "ทบทวนและกู้คืนรุ่นที่ซ่อนอยู่นี้",
+       "action-suppressrevision": "à¸\97à¸\9aà¸\97วà¸\99à¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88à¸\8bà¹\88อà¸\99อยูà¹\88à¸\99ีà¹\89",
        "action-suppressionlog": "ดูปูมส่วนตัวนี้",
-       "action-block": "à¸\9aลà¹\87อà¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89รายà¸\99ีà¹\89มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82",
+       "action-block": "บล็อกผู้ใช้นี้มิให้แก้ไข",
        "action-protect": "เปลี่ยนระดับการล็อกสำหรับหน้านี้",
        "action-rollback": "ย้อนการแก้ไขของผู้ใช้ล่าสุดที่แก้ไขหน้าเฉพาะอย่างรวดเร็ว",
        "action-import": "นำเข้าหน้าจากวิกิอื่น",
        "action-sendemail": "ส่งอีเมล",
        "action-editmywatchlist": "แก้ไขรายการเฝ้าดูของคุณ",
        "action-viewmywatchlist": "ดูรายการเฝ้าดูของคุณ",
-       "action-viewmyprivateinfo": "à¸\94ูà¸\82à¹\89อมูลส่วนตัวของคุณ",
-       "action-editmyprivateinfo": "à¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¹\89อมูลส่วนตัวของคุณ",
-       "nchanges": "$1 à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82",
-       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\81ารà¹\80à¸\82à¹\89าà¸\8aมลà¹\88าสุà¸\94}}",
+       "action-viewmyprivateinfo": "à¸\94ูสารสà¸\99à¹\80à¸\97ศส่วนตัวของคุณ",
+       "action-editmyprivateinfo": "à¹\81à¸\81à¹\89à¹\84à¸\82สารสà¸\99à¹\80à¸\97ศส่วนตัวของคุณ",
+       "nchanges": "$1 à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\81ารà¹\80ยีà¹\88ยมà¸\8aมà¸\84รัà¹\89à¸\87สุà¸\94à¸\97à¹\89าย}}",
        "enhancedrc-history": "ประวัติ",
        "recentchanges": "ปรับปรุงล่าสุด",
        "recentchanges-legend": "ตัวเลือกการปรับปรุงล่าสุด",
-       "recentchanges-summary": "à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94à¸\9aà¸\99วิà¸\81ินี้",
+       "recentchanges-summary": "à¸\95ิà¸\94à¸\95ามà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ลà¹\88าสุà¸\94à¸\9aà¸\99วิà¸\81ิà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\97าà¸\87หà¸\99à¹\89านี้",
        "recentchanges-noresult": "ไม่มีการเปลี่ยนแปลงในช่วงที่กำหนดซึ่งตรงกับเกณฑ์เหล่านี้",
        "recentchanges-feed-description": "ติดตามการปรับปรุงล่าสุดในวิกินี้ในฟีดนี้",
        "recentchanges-label-newpage": "การแก้ไขนี้สร้างหน้าใหม่",
        "recentchanges-label-unpatrolled": "การแก้ไขนี้ยังไม่ได้ตรวจสอบ",
        "recentchanges-label-plusminus": "ขนาดของหน้าเปลี่ยนไปด้วยจำนวนไบต์เท่านี้",
        "recentchanges-legend-heading": "'''คำอธิบายสัญลักษณ์:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ดูเพิ่มที่[[Special:NewPages|รายชื่อหน้าใหม่]])",
-       "rcnotefrom": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88 <strong>$3, $4</strong> (มาà¸\81สุà¸\94 <strong>$1</strong> à¸£à¸²à¸¢à¸\81าร)",
-       "rclistfrom": "แสดงการเปลี่ยนแปลงใหม่เริ่มตั้งแต่ $3 $2",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ดูเพิ่มที่ [[Special:NewPages|รายชื่อหน้าใหม่]])",
+       "rcnotefrom": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88 <strong>$3, $4</strong> (à¹\81สà¸\94à¸\87มาà¸\81สุà¸\94 <strong>$1</strong>)",
+       "rclistfrom": "แสดงการเปลี่ยนแปลงใหม่เริ่มตั้งแต่ $2, $3",
        "rcshowhideminor": "$1การแก้ไขเล็กน้อย",
        "rcshowhideminor-show": "แสดง",
        "rcshowhideminor-hide": "ซ่อน",
        "newpageletter": "ม",
        "boteditletter": "บ",
        "unpatrolledletter": "!",
-       "number_of_watching_users_pageview": "[$1 à¸\84à¸\99เฝ้าดู]",
+       "number_of_watching_users_pageview": "[$1 à¸\9cูà¹\89à¹\83à¸\8aà¹\89เฝ้าดู]",
        "rc_categories": "จำกัดเฉพาะหมวดหมู่ (แยกด้วย \"|\")",
        "rc_categories_any": "ใด ๆ",
        "rc-change-size-new": "$1 ไบต์หลังปรับปรุง",
        "recentchangeslinked": "ปรับปรุงที่เกี่ยวโยง",
        "recentchangeslinked-feed": "ปรับปรุงที่เกี่ยวโยง",
        "recentchangeslinked-toolbox": "การปรับปรุงที่เกี่ยวโยง",
-       "recentchangeslinked-title": "à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88à¹\82ยà¸\87มายัà¸\87 \"$1\"",
-       "recentchangeslinked-summary": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94à¸\82อà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81à¹\82ยà¸\87à¹\84à¸\9b (หรือà¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\95à¹\88าà¸\87 à¹\86 à¸\82อà¸\87หมวà¸\94หมูà¹\88à¸\97ีà¹\88à¸\81ำหà¸\99à¸\94) à¹\82à¸\94ยหà¸\99à¹\89าà¸\97ีà¹\88อยูà¹\88à¹\83à¸\99[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¹\81สà¸\94à¸\87à¹\80à¸\9bà¹\87à¸\99'''à¸\95ัวหà¸\99า'''",
+       "recentchangeslinked-title": "à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88à¹\82ยà¸\87à¸\81ัà¸\9a \"$1\"",
+       "recentchangeslinked-summary": "à¸\99ีà¹\88à¸\84ือรายà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ลà¹\88าสุà¸\94à¸\82อà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลิà¸\87à¸\81à¹\8cà¸\88าà¸\81หà¸\99à¹\89าà¹\80à¸\89à¸\9eาะ (หรือà¹\84à¸\9bสมาà¸\8aิà¸\81à¸\82อà¸\87หมวà¸\94หมูà¹\88à¹\80à¸\89à¸\9eาะ)\nหà¸\99à¹\89าà¹\83à¸\99[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¹\81สà¸\94à¸\87à¹\80à¸\9bà¹\87à¸\99<strong>à¸\95ัวหà¸\99า</strong>",
        "recentchangeslinked-page": "ชื่อหน้า:",
        "recentchangeslinked-to": "แสดงการเปลี่ยนแปลงไปยังหน้าที่เชื่อมโยงมายังหน้าที่ระบุแทน",
        "upload": "อัปโหลดไฟล์",
        "reuploaddesc": "ยกเลิกการอัปโหลดและกลับไปยังแบบอัปโหลด",
        "upload-tryagain": "ส่งคำอธิบายไฟล์ที่ดัดแปรแล้ว",
        "uploadnologin": "ไม่ได้ล็อกอิน",
-       "uploadnologintext": "à¸\95à¹\89อà¸\87$1à¸\81à¹\88อà¸\99à¸\88ึà¸\87à¸\88ะอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¹\84à¸\94à¹\89",
-       "upload_directory_missing": "à¹\84à¸\94à¹\80รà¸\81à¸\97อรีสำหรัà¸\9aอัà¸\9bà¹\82หลà¸\94 ($1) à¸«à¸²à¸¢à¹\84à¸\9b และเว็บเซิร์ฟเวอร์ไม่สามารถสร้างได้",
-       "upload_directory_read_only": "à¹\80วà¹\87à¸\9aà¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วอรà¹\8cà¹\84มà¹\88สามารà¸\96à¹\80à¸\81à¹\87à¸\9aà¸\82à¹\89อมูลà¹\83à¸\99à¹\84à¸\94à¹\80รà¸\81à¸\97อรี ($1)",
+       "uploadnologintext": "à¹\82à¸\9bรà¸\94$1à¹\80à¸\9eืà¹\88ออัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8c",
+       "upload_directory_missing": "สารà¸\9aà¸\9aอัà¸\9bà¹\82หลà¸\94 ($1) à¸«à¸²à¸¢ และเว็บเซิร์ฟเวอร์ไม่สามารถสร้างได้",
+       "upload_directory_read_only": "à¹\80วà¹\87à¸\9aà¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วอรà¹\8cà¹\84มà¹\88สามารà¸\96à¹\80à¸\82ียà¸\99สารà¸\9aà¸\9aอัà¸\9bà¹\82หลà¸\94 ($1)",
        "uploaderror": "การอัปโหลดผิดพลาด",
-       "upload-recreate-warning": "'''คำเตือน: ไฟล์ชื่อนั้นถูกลบหรือเปลี่ยนชื่อแล้ว'''\n\nปูมการลบและปูมการย้ายของหน้านี้ถูกนำมาไว้ด้านล่างเพื่อความสะดวก:",
+       "upload-recreate-warning": "<strong>คำเตือน: ไฟล์ชื่อนั้นถูกลบหรือเปลี่ยนชื่อแล้ว</strong>\n\nปูมการลบและปูมการย้ายของหน้านี้จัดไว้ด้านล่างเพื่อความสะดวก:",
        "uploadtext": "กรุณาใช้แบบด้านล่างในการอัปโหลดไฟล์\nสำหรับการดูหรือการค้นหาไฟล์ที่เคยอัปโหลดก่อนหน้านี้ ให้ไปที่[[Special:FileList|รายการไฟล์ที่ถูกอัปโหลด]] การอัปโหลดและการอัปโหลดซ้ำดูได้ที่[[Special:Log/upload|ปูมการอัปโหลด]] และการลบไฟล์ดูได้ที่[[Special:Log/delete|ปูมการลบ]]\n\nถ้าต้องการแทรกไฟล์ลงในหน้าหนึ่ง ๆ ให้ใช้คำสั่งหนึ่งในรูปแบบต่อไปนี้\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' เพื่อใช้รูปขนาดเต็ม\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|ข้อความอธิบาย]]</nowiki></code>''' เพื่อใช้รูปย่อขนาดกว้าง 200 พิกเซลในกล่องที่จัดชิดซ้าย โดยมี \"ข้อความอธิบาย\" เป็นคำบรรยายใต้ภาพ\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' สำหรับการเชื่อมโยงไฟล์โดยตรง โดยไม่ปรากฏไฟล์นั้นออกมา",
        "upload-permitted": "ชนิดไฟล์ที่อนุญาต: $1",
        "upload-preferred": "ชนิดไฟล์ที่ควรใช้: $1",
        "uploadlogpagetext": "ด้านล่างเป็นรายการการอัปโหลดไฟล์ล่าสุด\nดูภาพรวมที่ [[Special:NewFiles|แกลอรีไฟล์ใหม่]]",
        "filename": "ชื่อไฟล์",
        "filedesc": "ความย่อ",
-       "fileuploadsummary": "รายละà¹\80อียà¸\94à¹\84à¸\9fลà¹\8c:",
-       "filereuploadsummary": "เปลี่ยนแปลงไฟล์:",
+       "fileuploadsummary": "à¸\84วามยà¹\88อ:",
+       "filereuploadsummary": "à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\84à¸\9fลà¹\8c:",
        "filestatus": "สถานะลิขสิทธิ์:",
        "filesource": "แหล่งที่มา:",
        "ignorewarning": "บันทึกไฟล์โดยละเลยคำเตือน",
        "ignorewarnings": "ละเลยคำเตือนทั้งหมด",
        "minlength1": "ชื่อไฟล์ต้องมีตัวอักษรอย่างน้อยหนึ่งตัว",
-       "illegalfilename": "ชื่อไฟล์  \"$1\" มีอักขระที่ไม่อนุญาตในชื่อเรื่องหน้า กรุณาเปลี่ยนชื่อไฟล์และลองอัปโหลดอีกครั้ง",
+       "illegalfilename": "ชื่อไฟล์  \"$1\" มีอักขระที่ไม่อนุญาตในชื่อเรื่องหน้า \nกรุณาเปลี่ยนชื่อไฟล์และลองอัปโหลดอีกครั้ง",
        "filename-toolong": "ชื่อไฟล์ไม่อาจยาวกว่า 240 ไบต์",
-       "badfilename": "à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\96ูà¸\81à¹\80à¸\9bลีà¹\88ยà¸\99เป็น \"$1\"",
+       "badfilename": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cเป็น \"$1\"",
        "filetype-mime-mismatch": "นามสกุลไฟล์ \".$1\" ไม่ตรงกับชนิดไมม์ของไฟล์ที่ตรวจพบ ($2)",
        "filetype-badmime": "ไม่อนุญาตให้อัปโหลดไฟล์ที่เป็นไมม์ชนิด \"$1\"",
        "filetype-bad-ie-mime": "ไม่สามารถอัปโหลดไฟล์นี้เนื่องจากอินเทอร์เน็ตเอกซ์พลอเรอร์จะตรวจจับว่าเป็น \"$1\" ซึ่งเป็นชนิดไฟล์ที่ไม่อนุญาตและอาจเป็นอันตราย",
-       "filetype-unwanted-type": "{{PLURAL:$3|ไฟล์|ไฟล์}}ชนิด '''\".$1\"''' เป็นไฟล์ที่ไม่สามารถอัปโหลดได้ ไฟล์ที่สามารถใช้ได้ ได้แก่ $2",
-       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|เป็นชนิดไฟล์ที่ไม่อนุญาต|เป็นชนิดไฟล์ที่ไม่อนุญาต}}\n{{PLURAL:$3|ชนิดไฟล์|ชนิดไฟล์}}ที่อนุญาตคือ $2",
-       "filetype-missing": "à¸\99ามสà¸\81ุลà¹\84à¸\9fลà¹\8cหายà¹\84à¸\9b (เช่น \".jpg\")",
-       "empty-file": "à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93สà¹\88à¸\87มาà¸\99ัà¹\89à¸\99วà¹\88าà¸\87",
+       "filetype-unwanted-type": "<strong>\".$1\"</strong> เป็นชนิดไฟล์ที่ไม่ปรารถนา\n{{PLURAL:$3|}}ชนิดไฟล์ที่สนับสนุน ได้แก่ $2",
+       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|เป็นชนิดไฟล์ที่ไม่อนุญาต|เป็นชนิดไฟล์ที่ไม่อนุญาต}}\n{{PLURAL:$3|ชนิดไฟล์|ชนิดไฟล์}}ที่อนุญาตคือ $2",
+       "filetype-missing": "à¹\84à¸\9fลà¹\8cà¹\84มà¹\88มีà¸\99ามสà¸\81ุล (เช่น \".jpg\")",
+       "empty-file": "ไฟล์ที่คุณส่งมาว่าง",
        "file-too-large": "ไฟล์ที่คุณส่งมามีขนาดใหญ่เกินไป",
        "filename-tooshort": "ชื่อไฟล์สั้นเกินไป",
-       "filetype-banned": "à¹\84à¸\9fลà¹\8cà¸\8aà¸\99ิà¸\94à¸\99ีà¹\89à¸\96ูà¸\81หà¹\89าม",
+       "filetype-banned": "หà¹\89ามà¹\84à¸\9fลà¹\8cà¸\8aà¸\99ิà¸\94à¸\99ีà¹\89",
        "verification-error": "ไฟล์นี้ไม่ผ่านการพิสูจน์ยืนยันไฟล์",
-       "hookaborted": "สิà¹\88à¸\87à¸\97ีà¹\88à¸\84ุà¸\93à¸\9eยายามà¸\9bรัà¸\9aà¹\80à¸\9bลีà¹\88ยà¸\99à¸\96ูà¸\81ยà¸\81à¹\80ลิà¸\81à¹\82à¸\94ยสà¹\88วà¸\99à¸\82ยาย",
-       "illegal-filename": "à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95",
-       "overwrite": "à¹\84มà¹\88อà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\80à¸\82ียà¸\99à¸\97ัà¸\9aà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88มีอยูà¹\88à¹\81ลà¹\89ว",
+       "hookaborted": "สิà¹\88à¸\87à¸\97ีà¹\88à¸\84ุà¸\93à¸\9eยายามà¸\94ัà¸\94à¹\81à¸\9bรà¹\80à¸\9bลีà¹\88ยà¸\99à¸\96ูà¸\81สà¹\88วà¸\99à¸\82ยายยà¸\81à¹\80ลิà¸\81",
+       "illegal-filename": "à¹\84มà¹\88อà¸\99ุà¸\8dาà¸\95à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\99ีà¹\89",
+       "overwrite": "à¹\84มà¹\88อà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¸\9aัà¸\99à¸\97ึà¸\81à¸\97ัà¸\9aà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88มีอยูà¹\88",
        "unknown-error": "เกิดข้อผิดพลาดไม่ทราบสาเหตุ",
        "tmp-create-error": "ไม่สามารถสร้างไฟล์ชั่วคราว",
-       "tmp-write-error": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99การเขียนไฟล์ชั่วคราว",
-       "large-file": "แนะนำว่าไฟล์ไม่ควรมีขนาดใหญ่กว่า $1 ไฟล์นี้มีขนาด $2",
-       "largefileserver": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¸\81วà¹\88าà¸\97ีà¹\88à¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วอรà¹\8cอนุญาต",
-       "emptyfile": "à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93อัà¸\9bà¹\82หลà¸\94à¹\80หมือà¸\99à¹\80à¸\9bà¹\87à¸\99à¹\84à¸\9fลà¹\8cวà¹\88าà¸\87 à¸­à¸²à¸\88à¹\80à¸\81ิà¸\94à¸\88าà¸\81à¸\9bัà¸\8dหาà¸\9eิมà¸\9eà¹\8cà¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\9cิà¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aวà¹\88า à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¸\88ริà¸\87 à¹\86",
+       "tmp-write-error": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94การเขียนไฟล์ชั่วคราว",
+       "large-file": "แนะนำว่าไฟล์ไม่ควรมีขนาดใหญ่กว่า $1 \nไฟล์นี้มีขนาด $2",
+       "largefileserver": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¹\80à¸\81ิà¸\99à¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วอรà¹\8cมีà¹\82à¸\84รà¸\87à¹\81à¸\9aà¸\9aอนุญาต",
+       "emptyfile": "à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93อัà¸\9bà¹\82หลà¸\94à¹\80หมือà¸\99วà¹\88าà¸\87 \nอาà¸\88à¹\80à¸\81ิà¸\94à¸\88าà¸\81à¸\9bัà¸\8dหาà¸\9eิมà¸\9eà¹\8cà¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\9cิà¸\94 \nà¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aวà¹\88า à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¸\88ริà¸\87 à¹\86 à¸«à¸£à¸·à¸­à¹\84มà¹\88",
        "windows-nonascii-filename": "วิกินี้ไม่รองรับชื่อไฟล์ที่มีอักขระพิเศษ",
-       "fileexists": "มีà¹\84à¸\9fลà¹\8cà¸\8aืà¹\88อà¸\99ีà¹\89อยูà¹\88à¹\81ลà¹\89ว à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9a <strong>[[:$1]]</strong> à¸«à¸²à¸\81à¸\84ุà¸\93à¹\84มà¹\88à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89หรือà¹\84มà¹\88 [[$1|thumb]]",
-       "filepageexists": "หà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายสำหรัà¸\9aà¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81สรà¹\89าà¸\87à¹\81ลà¹\89วà¸\97ีà¹\88 <strong>[[:$1]]</strong> à¹\81à¸\95à¹\88à¹\84à¸\9fลà¹\8cà¸\8aืà¹\88อà¸\99ีà¹\89à¹\84มà¹\88มีอยูà¹\88à¹\83à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99\nà¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อà¸\97ีà¹\88à¸\84ุà¸\93à¸\81รอà¸\81à¸\88ะà¹\84มà¹\88à¸\9bราà¸\81à¸\8fà¸\9aà¸\99หà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aาย\nà¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อà¸\9bราà¸\81à¸\8fà¸\82ึà¹\89à¸\99 คุณจำเป็นต้องแก้ไขด้วยตนเอง\n[[$1|thumb]]",
-       "fileexists-extension": "มีà¹\84à¸\9fลà¹\8cà¸\8aืà¹\88อà¸\84ลà¹\89ายà¸\81ัà¸\99: [[$2|thumb]]\n* à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\81ำลัà¸\87อัà¸\9bà¹\82หลà¸\94: <strong>[[:$1]]</strong>\n* à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88มีอยูà¹\88: <strong>[[:$2]]</strong>\nà¸\81รุà¸\93าà¹\80ลือà¸\81à¸\8aืà¹\88ออืà¹\88à¸\99",
+       "fileexists": "มีà¹\84à¸\9fลà¹\8cà¸\8aืà¹\88อà¸\99ีà¹\89à¹\81ลà¹\89ว à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9a <strong>[[:$1]]</strong> à¸«à¸²à¸\81à¸\84ุà¸\93à¹\84มà¹\88à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99หรือà¹\84มà¹\88 \n[[$1|thumb]]",
+       "filepageexists": "สรà¹\89าà¸\87หà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายสำหรัà¸\9aà¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\81ลà¹\89วà¸\97ีà¹\88 <strong>[[:$1]]</strong> à¹\81à¸\95à¹\88à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¹\84มà¹\88มีà¹\84à¸\9fลà¹\8cà¸\8aืà¹\88อà¸\99ีà¹\89\nà¸\84วามยà¹\88อà¸\97ีà¹\88à¸\84ุà¸\93à¸\81รอà¸\81à¸\88ะà¹\84มà¹\88à¸\9bราà¸\81à¸\8fà¸\9aà¸\99หà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aาย\nà¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¸\84วามยà¹\88อà¸\82อà¸\87à¸\84ุà¸\93à¸\9bราà¸\81à¸\8f คุณจำเป็นต้องแก้ไขด้วยตนเอง\n[[$1|thumb]]",
+       "fileexists-extension": "มีà¹\84à¸\9fลà¹\8cà¸\8aืà¹\88อà¸\84ลà¹\89ายà¸\81ัà¸\99: [[$2|thumb]]\n* à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\81ำลัà¸\87อัà¸\9bà¹\82หลà¸\94: <strong>[[:$1]]</strong>\n* à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88มีอยูà¹\88: <strong>[[:$2]]</strong>\nà¸\9aาà¸\87à¸\97ีà¸\84ุà¸\93อาà¸\88à¸\95à¹\89อà¸\87à¸\81ารà¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\97ีà¹\88à¹\80à¸\94à¹\88à¸\99à¸\81วà¹\88าà¸\99ีà¹\89",
        "fileexists-thumbnail-yes": "ไฟล์นี้ดูเหมือนจะเป็นภาพที่ถูกลดขนาด ''(รูปย่อ)''\n[[$1|thumb]]\nกรุณาตรวจสอบไฟล์ <strong>[[:$1]]</strong>\nถ้าตรวจสอบแล้วและพบว่าเป็นภาพขนาดเดียวกับต้นฉบับ ไฟล์นั้นไม่จำเป็นต้องอัปโหลดเพิ่ม",
        "file-thumbnail-no": "ชื่อไฟล์ขึ้นต้นด้วย <strong>$1</strong>\nภาพนี้ดูเหมือนว่าจะเป็นภาพที่ถูกลดขนาด ''(thumbnail)''\nถ้าคุณมีภาพนี้ในความละเอียดเต็ม ให้อัปโหลดภาพนี้ มิฉะนั้นแล้วโปรดเปลี่ยนชื่อไฟล์",
        "fileexists-forbidden": "มีไฟล์ชื่อนี้แล้ว และไม่สามารถเขียนทับได้\nหากคุณยังต้องการอัปโหลดไฟล์ของคุณ กรุณาย้อนกลับและใช้ชื่อใหม่ \n[[File:$1|thumb|center|$1]]",
        "uploaddisabled": "ปิดใช้งานการอัปโหลด",
        "copyuploaddisabled": "ปิดใช้งานการอัปโหลดโดยยูอาร์แอล",
        "uploaddisabledtext": "ปิดใช้งานการอัปโหลดไฟล์",
-       "php-uploaddisabledtext": "à¹\80à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¹\83à¸\99à¸\9eีà¹\80อà¸\8aà¸\9eี\nà¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88า file_uploads",
-       "uploadscripted": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีสà¹\88วà¸\99à¸\9bระà¸\81อà¸\9aà¸\82อà¸\87à¹\82à¸\84à¹\89à¸\94à¹\80อà¸\8aà¸\97ีà¹\80อà¹\87มà¹\81อลหรือสà¸\84ริà¸\9bà¸\95à¹\8c à¸\8bึà¹\88à¸\87อาà¸\88à¸\81à¹\88อà¹\83หà¹\89à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81สà¸\94à¸\87à¸\9cลà¸\82อà¸\87à¹\80วà¹\87à¸\9aà¹\80à¸\9aราวà¹\8cà¹\80à¸\8bอรà¹\8c",
+       "php-uploaddisabledtext": "ปิดการใช้งานการอัปโหลดไฟล์ในพีเอชพี\nกรุณาตรวจสอบการตั้งค่า file_uploads",
+       "uploadscripted": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¹\82à¸\84à¹\89à¸\94à¹\80อà¸\8aà¸\97ีà¹\80อà¹\87มà¹\81อลหรือสà¸\84ริà¸\9bà¸\95à¹\8c à¸\8bึà¹\88à¸\87อาà¸\88à¸\81à¹\88อà¹\83หà¹\89à¸\81ารà¹\81à¸\9bลà¸\84ำสัà¹\88à¸\87à¸\82อà¸\87à¹\80à¸\9aราวà¹\8cà¹\80à¸\8bอรà¹\8cà¸\9cิà¸\94à¸\9eลาà¸\94",
        "uploadscriptednamespace": "ไฟล์ SVG นี้มีเนมสเปซไม่ถูกต้อง \"$1\"",
-       "uploadvirus": "ไฟล์นี้มีไวรัส! รายละเอียด: $1",
+       "uploadvirus": "ไฟล์นี้มีไวรัส! \nรายละเอียด: $1",
        "upload-source": "ไฟล์ต้นทาง",
        "sourcefilename": "ชื่อไฟล์ต้นทาง:",
        "sourceurl": "ยูอาร์แอลที่มา:",
        "destfilename": "ชื่อไฟล์ปลายทาง:",
-       "upload-maxfilesize": "à¸\82à¸\99าà¸\94à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\83หà¸\8dà¹\88à¸\97ีà¹\88สุà¸\94à¸\97ีà¹\88อà¸\99ุà¸\8dาà¸\95: $1",
+       "upload-maxfilesize": "à¸\82à¸\99าà¸\94à¹\84à¸\9fลà¹\8cà¹\83หà¸\8dà¹\88สุà¸\94: $1",
        "upload-description": "คำอธิบายไฟล์",
        "upload-options": "ตัวเลือกอัปโหลด",
        "watchthisupload": "เฝ้าดูไฟล์นี้",
        "filewasdeleted": "ไฟล์ชื่อนี้ถูกอัปโหลดก่อนหน้าและถูกลบไปแล้ว กรุณาตรวจสอบ $1 ก่อนอัปโหลดอีกครั้ง",
-       "filename-bad-prefix": "à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87อัà¸\9bà¹\82หลà¸\94à¸\82à¹\89à¸\99à¸\95à¹\89à¸\99à¸\94à¹\89วย '''\"$1\"''' à¸\8bึà¹\88à¸\87à¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¸\97ีà¹\88à¹\84มà¹\88สืà¹\88อà¸\84วามหมายà¹\83à¸\94 à¹\86 à¸\97ีà¹\88à¹\82à¸\94ยà¸\9bà¸\81à¸\95ิà¹\81ลà¹\89วà¸\81ลà¹\89อà¸\87à¸\96à¹\88ายรูà¸\9bà¸\94ิà¸\88ิà¸\97ัลà¸\95ัà¹\89à¸\87à¹\83หà¹\89อัà¸\95à¹\82à¸\99มัà¸\95ิ กรุณาตั้งชื่อไฟล์ใหม่ให้สื่อความหมายกว่าเดิม",
+       "filename-bad-prefix": "à¸\8aืà¹\88อà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87อัà¸\9bà¹\82หลà¸\94à¸\82à¹\89à¸\99à¸\95à¹\89à¸\99à¸\94à¹\89วย '''\"$1\"''' à¸\8bึà¹\88à¸\87à¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¸\97ีà¹\88à¹\84มà¹\88สืà¹\88อà¸\84วามหมายà¹\83à¸\94 à¹\86 à¸\97ีà¹\88à¸\9bà¸\81à¸\95ิà¸\81ลà¹\89อà¸\87à¸\96à¹\88ายรูà¸\9bà¸\94ิà¸\88ิà¸\97ัลà¸\95ัà¹\89à¸\87à¹\83หà¹\89อัà¸\95à¹\82à¸\99มัà¸\95ิ \nกรุณาตั้งชื่อไฟล์ใหม่ให้สื่อความหมายกว่าเดิม",
        "upload-success-subj": "อัปโหลดสำเร็จ",
        "upload-success-msg": "การอัปโหลดของคุณจาก [$2] สำเร็จแล้ว และสามารถใช้ไฟล์ได้ที่นี่: [[:{{ns:file}}:$1]]",
        "upload-failure-subj": "ปัญหาการอัปโหลด",
        "upload-warning-msg": "พบปัญหาการอัปโหลดของคุณจาก [$2] คุณอาจกลับไปยัง[[Special:Upload/stash/$1|แบบอัปโหลด]]เพื่อแก้ไขปัญหานี้",
        "upload-proto-error": "โพรโทคอลไม่ถูกต้อง",
        "upload-proto-error-text": "การอัปโหลดโดยตรงจากเว็บต้องการยูอาร์แอลที่ขึ้นต้นด้วย <code>http://</code> หรือ <code>ftp://</code>",
-       "upload-file-error": "à¹\80à¸\81ิà¸\94à¸\84วามผิดพลาดภายใน",
-       "upload-file-error-text": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94ภายà¹\83à¸\99à¸\82à¸\93ะà¸\9eยายามสรà¹\89าà¸\87à¹\84à¸\9fลà¹\8cà¸\8aัà¹\88วà¸\84ราวà¸\9aà¸\99à¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วอรà¹\8c กรุณาติดต่อ[[Special:ListUsers/sysop|ผู้ดูแลระบบ]]",
-       "upload-misc-error": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\82à¸\94ยไม่ทราบสาเหตุ",
-       "upload-misc-error-text": "เกิดความผิดพลาดไม่ทราบสาเหตุระหว่างอัปโหลด กรุณาตรวจสอบว่ายูอาร์แอลนั้นถูกต้องและเข้าถึงได้ และลองอีกครั้ง ถ้ายังมีปัญหา ให้ติดต่อ[[Special:ListUsers/sysop|ผู้ดูแลระบบ]]",
-       "upload-too-many-redirects": "ยูอารà¹\8cà¹\81อลà¸\97ีà¹\88ระà¸\9aุมีการเปลี่ยนทางมากเกินไป",
+       "upload-file-error": "มีà¸\82à¹\89อผิดพลาดภายใน",
+       "upload-file-error-text": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94ภายà¹\83à¸\99à¸\82à¸\93ะà¸\9eยายามสรà¹\89าà¸\87à¹\84à¸\9fลà¹\8cà¸\8aัà¹\88วà¸\84ราวà¸\9aà¸\99à¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วอรà¹\8c \nกรุณาติดต่อ[[Special:ListUsers/sysop|ผู้ดูแลระบบ]]",
+       "upload-misc-error": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¸\81ารอัà¸\9bà¹\82หลà¸\94ไม่ทราบสาเหตุ",
+       "upload-misc-error-text": "เกิดความผิดพลาดไม่ทราบสาเหตุระหว่างอัปโหลด \nกรุณาตรวจสอบว่ายูอาร์แอลนั้นถูกต้องและเข้าถึงได้ และลองอีกครั้ง \nถ้ายังมีปัญหา ให้ติดต่อ[[Special:ListUsers/sysop|ผู้ดูแลระบบ]]",
+       "upload-too-many-redirects": "ยูอารà¹\8cà¹\81อลà¸\99ัà¹\89à¸\99มีการเปลี่ยนทางมากเกินไป",
        "upload-http-error": "เกิดข้อผิดพลาดเอชทีทีพี: $1",
-       "upload-copy-upload-invalid-domain": "à¸\81ารอัà¸\9bà¹\82หลà¸\94สำà¹\80à¸\99าà¹\84มà¹\88สามารà¸\96à¸\97ำà¹\84à¸\94à¹\89จากโดเมนนี้",
-       "backend-fail-backup": "à¹\84มà¹\88สามารà¸\96สำรอà¸\87à¸\82à¹\89อมูลà¹\84à¸\9fลà¹\8c $1.",
+       "upload-copy-upload-invalid-domain": "à¹\84มà¹\88สามารà¸\96à¸\84ัà¸\94ลอà¸\81à¸\81ารอัà¸\9bà¹\82หลà¸\94จากโดเมนนี้",
+       "backend-fail-backup": "à¹\84มà¹\88สามารà¸\96สำรอà¸\87à¹\84à¸\9fลà¹\8c \"$1\"",
        "backend-fail-notexists": "ไม่มีไฟล์ $1",
-       "backend-fail-delete": "ไม่สามารถลบไฟล์ $1 ได้",
+       "backend-fail-delete": "ไม่สามารถลบไฟล์ \"$1\"",
        "backend-fail-alreadyexists": "มีไฟล์ \"$1\" อยู่แล้ว",
        "backend-fail-store": "ไม่สามารถเก็บไฟล์ \"$1\" ที่ \"$2\" ได้",
        "backend-fail-copy": "ไม่สามารถคัดลอกไฟล์ \"$1\" ไปยัง \"$2\" ได้",
        "uploadstash-nofiles": "คุณไม่มีไฟล์ซ่อน",
        "uploadstash-badtoken": "ดำเนินการปฏิบัติไม่สำเร็จ อาจเนื่องจากข้อมูลการแก้ไขประจำตัวของคุณหมดอายุแล้ว กรุณาลองใหม่",
        "uploadstash-errclear": "การล้างไฟล์ไม่สำเร็จ",
-       "uploadstash-refresh": "à¸\9fืà¹\89à¸\99à¸\9fูรายการไฟล์",
-       "img-auth-accessdenied": "à¸\81ารà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¸\96ูà¸\81à¸\88ำà¸\81ัà¸\94",
-       "img-auth-nopathinfo": "ค่า PATH_INFO สูญหาย\nเซิร์ฟเวอร์ของคุณอาจไม่ได้ถูกตั้งให้ส่งข้อมูลนี้\nหรือเซิร์ฟเวอร์อาจเป็นแบบ CGI-based และไม่สนับสนุนข้อมูล img_auth\nดูที่ https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
-       "img-auth-notindir": "à¸\97ีà¹\88อยูà¹\88à¸\97ีà¹\88รà¹\89อà¸\87à¸\82อà¹\84มà¹\88à¹\84à¸\94à¹\89อยูà¹\88à¹\83à¸\99à¹\84à¸\94à¹\80รà¹\87à¸\81à¸\97อรีอัพโหลดที่กำหนดไว้",
-       "img-auth-badtitle": "ไม่สามารถสร้างชื่อเรื่องที่ถูกต้องจาก \"$1\" ได้",
-       "img-auth-nologinnWL": "à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87อà¸\81อิà¸\99à¹\81ละ \"$1\" à¹\84มà¹\88à¹\84à¸\94à¹\89อยูà¹\88à¹\83à¸\99รายà¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\94ี (whitelist)",
+       "uploadstash-refresh": "รีà¹\80à¸\9fรà¸\8aรายการไฟล์",
+       "img-auth-accessdenied": "à¸\81ารà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¸\96ูà¸\81à¸\9bà¸\8fิà¹\80สà¸\98",
+       "img-auth-nopathinfo": "PATH_INFO สูญหาย\nเซิร์ฟเวอร์ของคุณอาจไม่ได้ถูกตั้งให้ส่งสารสนเทศนี้\nอาจเป็นแบบ CGI-based และไม่สามารถสนับสนุน img_auth\nดูที่ https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
+       "img-auth-notindir": "à¸\97ีà¹\88อยูà¹\88à¸\97ีà¹\88รà¹\89อà¸\87à¸\82อà¹\84มà¹\88à¹\84à¸\94à¹\89อยูà¹\88à¹\83à¸\99สารà¸\9aà¸\9aอัพโหลดที่กำหนดไว้",
+       "img-auth-badtitle": "ไม่สามารถสร้างชื่อเรื่องที่ถูกต้องจาก \"$1\"",
+       "img-auth-nologinnWL": "à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87อà¸\81อิà¸\99à¹\81ละ \"$1\" à¹\84มà¹\88à¹\84à¸\94à¹\89อยูà¹\88à¹\83à¸\99รายà¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95 (whitelist)",
        "img-auth-nofile": "ไม่มีไฟล์ \"$1\"",
-       "img-auth-isdir": "à¸\84ุà¸\93à¸\81ำลัà¸\87à¸\9eยายามà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\84à¸\94à¹\80รà¹\87à¸\81à¸\97อรี \"$1\"\nà¸\8bึà¹\88à¸\87à¸\84ุà¸\93สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\84à¸\94à¹\89à¹\80à¸\89à¸\9eาะà¹\84à¸\9fลà¹\8cà¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99",
+       "img-auth-isdir": "à¸\84ุà¸\93à¸\81ำลัà¸\87à¸\9eยายามà¹\80à¸\82à¹\89าà¸\96ึà¸\87สารà¸\9aà¸\9a \"$1\"\nอà¸\99ุà¸\8dาà¸\95à¹\80à¸\89à¸\9eาะà¸\81ารà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\84à¸\9fลà¹\8c",
        "img-auth-streaming": "กำลังดึงข้อมูล \"$1\"",
-       "img-auth-public": "à¸\9fัà¸\87à¸\81à¹\87à¸\8aัà¸\99à¸\82อà¸\87 img_auth.php à¸\84ือà¹\80à¸\9eืà¹\88อสà¹\88à¸\87à¹\84à¸\9fลà¹\8cà¸\82าออà¸\81à¸\88าà¸\81วิà¸\81ิสà¹\88วà¸\99à¸\95ัว\nวิà¸\81ิà¸\99ีà¹\89à¸\96ูà¸\81à¸\81ำหà¸\99à¸\94à¹\80à¸\9bà¹\87à¸\99วิà¸\81ิสà¹\88วà¸\99à¸\95ัว\nà¹\80à¸\9eืà¹\88อà¸\84วามà¸\9bลอà¸\94ภัยสูà¸\87สุà¸\94 img_auth.php à¸\88ึà¸\87à¸\96ูà¸\81à¸\9bิà¸\94",
-       "img-auth-noread": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aสิà¸\97à¸\98ิà¹\8cà¹\83à¸\99à¸\81ารอ่าน \"$1\"",
+       "img-auth-public": "หà¸\99à¹\89าà¸\97ีà¹\88à¸\82อà¸\87 img_auth.php à¸\84ือ à¹\80à¸\9eืà¹\88อสà¹\88à¸\87à¹\84à¸\9fลà¹\8cออà¸\81à¸\88าà¸\81วิà¸\81ิสà¹\88วà¸\99à¸\95ัว\nวิà¸\81ิà¸\99ีà¹\89มีà¹\82à¸\84รà¸\87à¹\81à¸\9aà¸\9aà¹\80à¸\9bà¹\87à¸\99วิà¸\81ิสาà¸\98ารà¸\93ะ\nà¹\80à¸\9eืà¹\88อà¸\84วามà¸\9bลอà¸\94ภัยสูà¸\87สุà¸\94 à¸\88ึà¸\87à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99 img_auth.php",
+       "img-auth-noread": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88มีสิà¸\97à¸\98ิอ่าน \"$1\"",
        "http-invalid-url": "ยูอาร์แอลไม่ถูกต้อง: $1",
        "http-invalid-scheme": "ไม่สนับสนุนยูอาร์แอลที่มีรูปแบบ \"$1\"",
        "http-request-error": "คำขอข้อมูล HTTP ผิดพลาดโดยไม่ทราบสาเหตุ",
-       "http-read-error": "การอ่านข้อมูล HTTP ผิดพลาด",
-       "http-timed-out": "คำขอข้อมูล HTTP เกินเวลาที่กำหนด",
-       "http-curl-error": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\80รียà¸\81à¸\82à¹\89อมูลà¸\88าà¸\81 URL: $1",
-       "http-bad-status": "à¸\9eà¸\9aà¸\9bัà¸\8dหาà¹\83à¸\99ระหวà¹\88าà¸\87à¸\81ารà¸\82à¹\89อà¸\82à¹\89อมูล HTTP: $1 $2",
-       "upload-curl-error6": "ไม่สามารถติดต่อยูอาร์แอลได้",
-       "upload-curl-error6-text": "à¹\84มà¹\88สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87ยูอารà¹\8cà¹\81อลà¸\97ีà¹\88à¹\83สà¹\88มาà¹\84à¸\94à¹\89 กรุณาตรวจสอบอีกครั้งว่ายูอาร์แอลนั้นถูกต้อง และเว็บไซต์นั้นยังใช้งานได้",
-       "upload-curl-error28": "à¹\80วลาอัà¸\9bà¹\82หลà¸\94à¸\96ูà¸\81à¸\95ัด",
-       "upload-curl-error28-text": "à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cà¸\99ีà¹\89à¹\83à¸\8aà¹\89à¹\80วลาà¸\99าà¸\99à¹\80à¸\81ิà¸\99à¹\84à¸\9bà¹\83à¸\99à¸\81ารà¹\80à¸\8aืà¹\88อมà¸\95à¹\88อ à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aวà¹\88าà¹\80วà¹\87à¸\9aà¸\99ีà¹\89ยัà¸\87à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84à¸\94à¹\89à¸\95ามà¸\9bà¸\81à¸\95ิ à¸«à¸£à¸·à¸­à¸­à¸²à¸\88à¸\88ะรอสัà¸\81à¸\84รูà¹\88à¹\81ลà¹\89วลอà¸\87อัà¸\9bà¹\82หลà¸\94à¹\83หมà¹\88",
+       "http-read-error": "การอ่าน HTTP ผิดพลาด",
+       "http-timed-out": "คำขอ HTTP เกินเวลา",
+       "http-curl-error": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¸\81ารà¹\84à¸\9bà¸\99ำมาà¸\8bึà¹\88à¸\87ยูอารà¹\8cà¹\81อล: $1",
+       "http-bad-status": "à¸\9eà¸\9aà¸\9bัà¸\8dหาระหวà¹\88าà¸\87à¸\81ารà¸\82อ HTTP: $1 $2",
+       "upload-curl-error6": "ไม่สามารถติดต่อยูอาร์แอล",
+       "upload-curl-error6-text": "à¹\84มà¹\88สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87ยูอารà¹\8cà¹\81อลà¸\97ีà¹\88à¸\88ัà¸\94มาà¹\84à¸\94à¹\89 \nกรุณาตรวจสอบอีกครั้งว่ายูอาร์แอลนั้นถูกต้อง และเว็บไซต์นั้นยังใช้งานได้",
+       "upload-curl-error28": "หมà¸\94à¹\80วลารออัà¸\9bà¹\82หลด",
+       "upload-curl-error28-text": "à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cà¸\99ีà¹\89à¹\83à¸\8aà¹\89à¹\80วลาà¸\95อà¸\9aสà¸\99อà¸\87à¸\99าà¸\99à¹\80à¸\81ิà¸\99\nà¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aวà¹\88าà¹\80วà¹\87à¸\9aà¸\99ีà¹\89ยัà¸\87à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84à¸\94à¹\89à¸\95ามà¸\9bà¸\81à¸\95ิ à¸£à¸­à¸ªà¸±à¸\81à¸\84รูà¹\88à¹\81ลà¹\89วลอà¸\87อัà¸\9bà¹\82หลà¸\94à¹\83หมà¹\88\nà¸\84ุà¸\93อาà¸\88ลอà¸\87à¹\83à¸\99à¹\80วลาà¸\97ีà¹\88วุà¹\88à¸\99วายà¸\99à¹\89อยà¸\81วà¹\88า",
        "license": "การอนุญาตใช้สิทธิ:",
        "license-header": "การอนุญาตใช้สิทธิ",
        "nolicense": "ไม่ได้เลือก",
-       "license-nopreview": "(ไม่สามารถแสดงตัวอย่าง)",
+       "licenses-edit": "แก้ไขตัวเลือกใบอนุญาต",
+       "license-nopreview": "(ไม่มีตัวอย่าง)",
        "upload_source_url": "(ไฟล์ที่คุณเลือกจากยูอาร์แอลที่สมเหตุสมผลและสาธารณะเข้าถึงได้)",
        "upload_source_file": "(ไฟล์ที่คุณเลือกจากคอมพิวเตอร์ของคุณ)",
        "listfiles-delete": "ลบ",
        "listfiles-latestversion-no": "ไม่",
        "file-anchor-link": "ไฟล์",
        "filehist": "ประวัติไฟล์",
-       "filehist-help": "กดเลือกวัน/เวลา เพื่อดูไฟล์ที่ปรากฏในขณะนั้น",
+       "filehist-help": "กดเลือกวัน/เวลาเพื่อดูไฟล์ที่ปรากฏในขณะนั้น",
        "filehist-deleteall": "ลบทั้งหมด",
        "filehist-deleteone": "ลบ",
        "filehist-revert": "ย้อน",
        "filehist-current": "ปัจจุบัน",
-       "filehist-datetime": "วันที่/เวลา",
+       "filehist-datetime": "วัน/เวลา",
        "filehist-thumb": "รูปย่อ",
-       "filehist-thumbtext": "รูปย่อสำหรับรุ่น $1",
+       "filehist-thumbtext": "รูปย่อสำหรับรุ่นเมื่อ $1",
        "filehist-nothumb": "ไม่มีรูปย่อ",
        "filehist-user": "ผู้ใช้",
        "filehist-dimensions": "ขนาด",
        "filehist-comment": "ความเห็น",
        "imagelinks": "การใช้ไฟล์",
        "linkstoimage": "มี $1 หน้าเชื่อมโยงมายังไฟล์นี้:",
-       "linkstoimage-more": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีหà¸\99à¹\89าà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87มาà¸\81วà¹\88า $1 à¸«à¸\99à¹\89า\nรายà¸\81ารà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87 $1 à¸«à¸\99à¹\89าà¹\81รà¸\81à¸\97ีà¹\88มายัà¸\87à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99\nà¸\94ูà¹\80à¸\9eิà¹\88มà¹\84à¸\94à¹\89à¸\97ีà¹\88[[Special:WhatLinksHere/$2|รายการเต็ม]]",
+       "linkstoimage-more": "มีหà¸\99à¹\89าà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87มาà¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¸\81วà¹\88า $1 à¸«à¸\99à¹\89า\nรายà¸\81ารà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87 $1 à¸«à¸\99à¹\89าà¹\81รà¸\81à¸\97ีà¹\88มายัà¸\87à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99\nมี[[Special:WhatLinksHere/$2|รายการเต็ม]]",
        "nolinkstoimage": "ไม่มีหน้าเชื่อมโยงมายังไฟล์นี้",
        "morelinkstoimage": "ดู[[Special:WhatLinksHere/$1|การเชื่อมโยง]]มายังไฟล์นี้เพิ่มเติม",
        "linkstoimage-redirect": "$1 (ไฟล์เปลี่ยนทาง) $2",
        "duplicatesoffile": "$1 ไฟล์ต่อไปนี้ เป็นไฟล์เดียวกับไฟล์นี้ ([[Special:FileDuplicateSearch/$2|รายละเอียดเพิ่มเติม]]):",
-       "sharedupload": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88มีà¸\81ารà¹\83à¸\8aà¹\89à¹\83à¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99",
-       "sharedupload-desc-there": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88à¸\96ูà¸\81à¹\83à¸\8aà¹\89à¸\9aà¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99\nà¸\81รุà¸\93าà¸\94ู[หà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c $2] à¸ªà¸³à¸«à¸£à¸±à¸\9aà¸\82à¹\89อมูลเพิ่มเติม",
-       "sharedupload-desc-here": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88มีà¹\83à¸\8aà¹\89à¹\83à¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99\nà¸\84ำอà¸\98ิà¸\9aายà¹\83à¸\99[$2 à¸«à¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c]à¹\81สà¸\94à¸\87à¹\84วà¹\89à¸\82à¹\89าà¸\87ล่างนี้",
-       "sharedupload-desc-edit": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88มีà¹\83à¸\8aà¹\89à¹\83à¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99\nหาà¸\81à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\84ำอà¸\98ิà¸\9aาย à¹\83หà¹\89à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\9aà¸\99[$2 à¸«à¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c]",
-       "sharedupload-desc-create": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88มีà¸\81ารà¹\83à¸\8aà¹\89à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\83à¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99\nหาà¸\81à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\84ำอà¸\98ิà¸\9aาย à¹\83หà¹\89à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\9aà¸\99[$2 à¸«à¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c]",
+       "sharedupload": "ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น",
+       "sharedupload-desc-there": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88à¹\83à¸\8aà¹\89à¸\9aà¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99\nà¸\81รุà¸\93าà¸\94ู[หà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c $2] à¸ªà¸³à¸«à¸£à¸±à¸\9aสารสà¸\99à¹\80à¸\97ศเพิ่มเติม",
+       "sharedupload-desc-here": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88มีà¹\83à¸\8aà¹\89à¹\83à¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99\nà¸\84ำอà¸\98ิà¸\9aายà¹\83à¸\99[$2 à¸«à¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c]à¹\81สà¸\94à¸\87à¹\84วà¹\89à¸\94à¹\89าà¸\99ล่างนี้",
+       "sharedupload-desc-edit": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88มีà¹\83à¸\8aà¹\89à¹\83à¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99\nà¸\84ุà¸\93อาà¸\88à¸\95à¹\89อà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\84ำอà¸\98ิà¸\9aายà¹\83à¸\99[$2 à¸«à¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c]à¸\99ัà¹\89à¸\99",
+       "sharedupload-desc-create": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88มีà¹\83à¸\8aà¹\89à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\83à¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99\nà¸\84ุà¸\93อาà¸\88à¸\95à¹\89อà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\84ำอà¸\98ิà¸\9aายà¹\83à¸\99[$2 à¸«à¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c]à¸\99ัà¹\89à¸\99",
        "filepage-nofile": "ไม่มีไฟล์ชื่อนี้",
        "filepage-nofile-link": "ไม่มีไฟล์ชื่อนี้ แต่คุณสามารถ[$1 อัปโหลด]ได้",
        "uploadnewversion-linktext": "อัปโหลดรุ่นใหม่ของไฟล์นี้",
        "shared-repo-from": "จาก $1",
-       "shared-repo": "à¸\84ลัà¸\87à¸\97ีà¹\88à¹\83à¸\8aà¹\89รà¹\88วมà¸\81ัà¸\99",
+       "shared-repo": "à¸\84ลัà¸\87รà¹\88วม",
        "shared-repo-name-wikimediacommons": "วิกิมีเดียคอมมอนส์",
        "filepage.css": "/* สไตล์ชีตในหน้านี้ถูกรวมในหน้าคำอธิบายไฟล์ และถูกรวมในวิกิผู้รับบริการต่างถิ่นด้วย */",
-       "upload-disallowed-here": "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96อัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¹\83หมà¹\88à¸\97ัà¸\9aà¹\84à¸\9fลà¹\8cà¹\80à¸\94ิมà¸\99ีà¹\89à¹\84à¸\94้",
+       "upload-disallowed-here": "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¸\9aัà¸\99à¸\97ึà¸\81à¸\97ัà¸\9aà¹\84à¸\9fลà¹\8cà¸\99ี้",
        "filerevert": "ย้อน $1",
        "filerevert-legend": "ย้อนไฟล์กลับ",
-       "filerevert-intro": "<span class=\"plainlinks\">คุณกำลังย้อนไฟล์ '''[[Media:$1|$1]]''' ไปยัง [รุ่น $4 วันที่ $2, $3]</span>",
+       "filerevert-intro": "คุณกำลังย้อนไฟล์ <strong>[[Media:$1|$1]]</strong> ไปยัง [รุ่น $4 เมื่อ $2, $3]",
        "filerevert-comment": "เหตุผล:",
-       "filerevert-defaultcomment": "ย้อนไปรุ่น $1, $2",
+       "filerevert-defaultcomment": "ย้อนไปรุ่นเมื่อ $1, $2",
        "filerevert-submit": "ย้อน",
-       "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' ถูกย้อนไปยัง [รุ่น $4 วันที่ $2, $3]</span>",
-       "filerevert-badversion": "à¹\84มà¹\88มีรุà¹\88à¸\99à¸\81à¹\88อà¸\99หà¸\99à¹\89าà¸\82อà¸\87à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\83à¸\99à¹\80วลาà¸\97ีà¹\88à¸\81ำหà¸\99à¸\94à¹\84วà¹\89",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> ถูกย้อนไปเป็น [รุ่น $4 เมื่อ $2, $3]",
+       "filerevert-badversion": "à¹\84มà¹\88มีรุà¹\88à¸\99à¸\97à¹\89อà¸\87à¸\96ิà¹\88à¸\99à¸\81à¹\88อà¸\99หà¸\99à¹\89าà¸\82อà¸\87à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¸\8bึà¹\88à¸\87มีà¸\95ราà¹\80วลาà¸\97ีà¹\88à¸\81ำหà¸\99à¸\94",
        "filedelete": "ลบ $1",
        "filedelete-legend": "ลบไฟล์",
-       "filedelete-intro": "คุณกำลังลบไฟล์ '''[[Media:$1|$1]]''' พร้อมกับประวัติทั้งหมดของไฟล์นี้",
-       "filedelete-intro-old": "คุณกำลังลบ '''[[Media:$1|$1]]''' รุ่น [$4 $3, $2]",
+       "filedelete-intro": "คุณกำลังลบไฟล์ <strong>[[Media:$1|$1]]</strong> พร้อมประวัติทั้งหมด",
+       "filedelete-intro-old": "คุณกำลังลบรุ่นของ <strong>[[Media:$1|$1]]</strong> เมื่อ [$4 $3, $2]",
        "filedelete-comment": "เหตุผล:",
        "filedelete-submit": "ลบ",
-       "filedelete-success": "ลบไฟล์ '''$1''' แล้ว",
-       "filedelete-success-old": "à¹\84à¸\9fลà¹\8c '''[[Media:$1|$1]]''' à¸£à¸¸à¹\88à¸\99à¹\80มืà¹\88อ $3, $2 à¸\96ูà¸\81ลà¸\9aแล้ว",
-       "filedelete-nofile": "ไม่มีไฟล์ '''$1'''",
-       "filedelete-nofile-old": "ไม่มี '''$1''' ตามคุณลักษณะที่กำหนด อยู่ในกรุ",
+       "filedelete-success": "ลบ <strong>$1</strong> แล้ว",
+       "filedelete-success-old": "ลà¸\9aรุà¹\88à¸\99à¸\82อà¸\87 <strong>[[Media:$1|$1]]</strong> à¹\80มืà¹\88อ $3, $2 แล้ว",
+       "filedelete-nofile": "ไม่มีไฟล์ <strong>$1</strong>",
+       "filedelete-nofile-old": "ไม่มีรุ่นเก็บถาวรของ <strong>$1</strong> ซึ่งมีคุณลักษณะที่กำหนด",
        "filedelete-otherreason": "เหตุผลอื่น/เพิ่มเติม:",
        "filedelete-reason-otherlist": "เหตุผลอื่น",
        "filedelete-reason-dropdown": "* เหตุผลการลบทั่วไป\n** ละเมิดลิขสิทธิ์\n** ไฟล์ซ้ำ",
        "filedelete-edit-reasonlist": "แก้ไขเหตุผลการลบ",
-       "filedelete-maintenance": "à¸\81ารลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\9fลà¹\8cà¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84มà¹\88à¹\84à¸\94à¹\89ชั่วคราวระหว่างการบำรุงรักษา",
+       "filedelete-maintenance": "à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\9fลà¹\8cชั่วคราวระหว่างการบำรุงรักษา",
        "filedelete-maintenance-title": "ไม่สามารถลบไฟล์",
-       "mimesearch": "à¸\84à¹\89à¸\99หาà¸\95ามà¸\8aà¸\99ิà¸\94à¹\84มมà¹\8c",
+       "mimesearch": "ค้นหาไมม์",
        "mimesearch-summary": "หน้านี้แสดงไฟล์ตามการแบ่งของชนิดไมม์ของแต่ละไฟล์ \nใส่ค่า: contenttype/subtype เช่น <code>image/jpeg</code>",
        "mimetype": "ชนิดไมม์:",
        "download": "ดาวน์โหลด",
        "unwatchedpages": "หน้าที่ไม่มีผู้เฝ้าดู",
        "listredirects": "รายการหน้าเปลี่ยนทาง",
        "unusedtemplates": "แม่แบบไม่ได้ใช้",
-       "unusedtemplatestext": "หน้านี้แสดงรายการหน้าทั้งหมดในเนมสเปซ {{ns:template}} ซึ่งไม่ได้ถูกรวมอยู่ในหน้าอื่น อย่าลืมตรวจสอบการเชื่อมโยงมายังแม่แบบอื่นก่อนลบ",
+       "unusedtemplatestext": "หน้านี้แสดงรายการหน้าทั้งหมดในเนมสเปซ {{ns:template}} ซึ่งไม่ได้ถูกรวมอยู่ในหน้าอื่น \nอย่าลืมตรวจสอบการเชื่อมโยงมายังแม่แบบอื่นก่อนลบ",
        "unusedtemplateswlh": "การเชื่อมโยงอื่น",
        "randompage": "สุ่มหน้า",
        "randompage-nopages": "ไม่มีหน้าใดใน{{PLURAL:$2|เนมสเปซ}}ต่อไปนี้: \"$1\"",
        "randomincategory": "สุ่มหน้าในหมวดหมู่",
        "randomincategory-invalidcategory": "\"$1\" มิใช่ชื่อหมวดหมู่ที่ถูกต้อง",
-       "randomincategory-nopages": "ไม่มีหน้าใน[[:Category:$1]]",
-       "randomincategory-selectcategory": "ดึงหน้าแบบสุ่มจากหมวดหมู่: $1 $2",
-       "randomincategory-selectcategory-submit": "ไป",
+       "randomincategory-nopages": "ไม่มีหน้าในหมวดหมู่ [[:Category:$1]]",
+       "randomincategory-category": "หมวดหมู่:",
+       "randomincategory-legend": "สุ่มหน้าในหมวดหมู่",
        "randomredirect": "สุ่มหน้าเปลี่ยนทาง",
        "randomredirect-nopages": "ไม่มีหน้าเปลี่ยนทางในเนมสเปซ \"$1\"",
        "statistics": "สถิติ",
-       "statistics-header-pages": "สà¸\96ิà¸\95ิà¸\82อà¸\87หà¸\99à¹\89า",
+       "statistics-header-pages": "สถิติหน้า",
        "statistics-header-edits": "สถิติการแก้ไข",
-       "statistics-header-views": "สà¸\96ิà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม",
+       "statistics-header-views": "สถิติการชม",
        "statistics-header-users": "สถิติผู้ใช้",
        "statistics-header-hooks": "สถิติอื่น",
        "statistics-articles": "หน้าเนื้อหา",
-       "statistics-pages": "หน้าทั้งหมด",
+       "statistics-pages": "หน้า",
        "statistics-pages-desc": "หน้าทั้งหมดในวิกินี้ รวมทั้งหน้าพูดคุย หน้าเปลี่ยนทาง เป็นต้น",
-       "statistics-files": "à¸\88ำà¸\99วà¸\99à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\96ูà¸\81อัปโหลด",
-       "statistics-edits": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ัà¹\89à¸\87หมà¸\94à¸\99ัà¸\9aà¹\81à¸\95à¹\88à¸\81à¹\88อà¸\95ัà¹\89à¸\87 {{SITENAME}}",
-       "statistics-edits-average": "à¸\88ำà¸\99วà¸\99à¹\81à¸\81à¹\89à¹\84à¸\82à¸\95à¹\88อหà¸\99à¹\89าà¹\82à¸\94ยเฉลี่ย",
-       "statistics-views-total": "à¸\88ำà¸\99วà¸\99à¸\81ารà¹\80à¸\82à¹\89าชมทั้งหมด",
-       "statistics-views-total-desc": "à¹\84มà¹\88à¸\99ัà¸\9aรวมà¸\88ำà¸\99วà¸\99à¸\81ารà¹\80à¸\82à¹\89าà¸\8aมหà¸\99à¹\89าà¸\97ีà¹\88à¹\84มà¹\88มีอยูà¹\88และหน้าพิเศษ",
-       "statistics-views-peredit": "à¸\88ำà¸\99วà¸\99à¸\81ารà¹\80à¸\82à¹\89าà¸\94ูà¸\95à¹\88อà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82:",
+       "statistics-files": "à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88อัปโหลด",
+       "statistics-edits": "การแก้ไขหน้านับแต่ก่อตั้ง {{SITENAME}}",
+       "statistics-edits-average": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\95à¹\88อหà¸\99à¹\89าเฉลี่ย",
+       "statistics-views-total": "à¸\81ารชมทั้งหมด",
+       "statistics-views-total-desc": "à¹\84มà¹\88à¸\99ัà¸\9aรวมà¸\81ารà¸\8aมหà¸\99à¹\89าà¸\97ีà¹\88à¹\84มà¹\88มีและหน้าพิเศษ",
+       "statistics-views-peredit": "à¸\81ารà¸\8aมà¸\95à¹\88อà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82",
        "statistics-users": "[[Special:ListUsers|ผู้ใช้]]ลงทะเบียน",
        "statistics-users-active": "ผู้ใช้ที่ยังมีความเคลื่อนไหว",
-       "statistics-users-active-desc": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\94ำà¹\80à¸\99ิà¸\99à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¹\83à¸\99à¸\8aà¹\88วà¸\87 $1 à¸§à¸±à¸\99à¸\97ีà¹\88à¸\9cà¹\88าà¸\99มา",
-       "statistics-mostpopular": "หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\82à¹\89าà¸\8aมมาà¸\81à¸\97ีà¹\88สุà¸\94",
+       "statistics-users-active-desc": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\94ำà¹\80à¸\99ิà¸\99à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¹\83à¸\99à¸\8aà¹\88วà¸\87 $1 à¸§à¸±à¸\99หลัà¸\87สุà¸\94",
+       "statistics-mostpopular": "หน้าที่มีการชมมากที่สุด",
        "pageswithprop": "หน้าพร้อมคุณสมบัติหน้า",
        "pageswithprop-legend": "หน้าพร้อมคุณสมบัติหน้า",
-       "pageswithprop-text": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารหà¸\99à¹\89าà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¸\84ุà¸\93สมà¸\9aัà¸\95ิหà¸\99à¹\89าอยà¹\88าà¸\87à¹\83à¸\94อยà¹\88าà¸\87หà¸\99ึà¹\88à¸\87à¹\82à¸\94ยà¹\80à¸\89à¸\9eาะ",
+       "pageswithprop-text": "หน้านี้แสดงรายการหน้าที่ใช้คุณสมบัติหน้าเฉพาะ",
        "pageswithprop-prop": "ชื่อคุณสมบัติ:",
        "pageswithprop-submit": "ไป",
-       "doubleredirects": "หà¸\99à¹\89าเปลี่ยนทางซ้ำซ้อน",
-       "doubleredirectstext": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารหà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87อืà¹\88à¸\99\nà¹\81à¸\95à¹\88ละà¹\81à¸\96วมีà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\84รัà¹\89à¸\87à¹\81รà¸\81à¹\81ละà¸\84รัà¹\89à¸\87à¸\97ีà¹\88สอà¸\87 à¹\80à¸\8aà¹\88à¸\99à¹\80à¸\94ียวà¸\81ัà¸\9aà¹\80à¸\9bà¹\89าหมายà¸\82อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\84รัà¹\89à¸\87à¸\97ีà¹\88สอà¸\87 à¸\8bึà¹\88à¸\87มัà¸\81à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¹\80à¸\9bà¹\89าหมาย \"à¸\97ีà¹\88แท้จริง\" ที่การเปลี่ยนแปลงครั้งแรกควรชี้ไป\nหน่วยที่<del>ขีดฆ่า</del> คือ รายการที่ได้แก้ไขแล้ว",
-       "double-redirect-fixed-move": "[[$1]] ถูกย้ายแล้ว มีการปรับอัตโนมัติและขณะนี้เปลี่ยนทางไปยัง [[$2]]",
-       "double-redirect-fixed-maintenance": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\8bà¹\89ำà¸\8bà¹\89อà¸\99à¸\88าà¸\81 [[$1]] à¹\84à¸\9bยัà¸\87 [[$2]] โดยอัตโนมัติในงานบำรุงรักษา",
+       "doubleredirects": "à¸\81ารเปลี่ยนทางซ้ำซ้อน",
+       "doubleredirectstext": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารหà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¹\84à¸\9bหà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87อืà¹\88à¸\99\nà¹\81à¸\95à¹\88ละà¹\81à¸\96วมีà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\84รัà¹\89à¸\87à¹\81รà¸\81à¹\81ละà¸\84รัà¹\89à¸\87à¸\97ีà¹\88สอà¸\87 à¹\80à¸\8aà¹\88à¸\99à¹\80à¸\94ียวà¸\81ัà¸\9aà¹\80à¸\9bà¹\89าหมายà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\84รัà¹\89à¸\87à¸\97ีà¹\88สอà¸\87 à¸\8bึà¹\88à¸\87มัà¸\81à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¹\80à¸\9bà¹\89าหมาย \"แท้จริง\" ที่การเปลี่ยนแปลงครั้งแรกควรชี้ไป\nหน่วยที่<del>ขีดฆ่า</del> คือ รายการที่ได้แก้ไขแล้ว",
+       "double-redirect-fixed-move": "ย้าย [[$1]] แล้ว \nมีการปรับอัตโนมัติและขณะนี้เปลี่ยนทางไป [[$2]]",
+       "double-redirect-fixed-maintenance": "à¸\81ำลัà¸\87à¸\8bà¹\88อมà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\8bà¹\89ำà¸\8bà¹\89อà¸\99à¸\88าà¸\81 [[$1]] à¹\84à¸\9b [[$2]] โดยอัตโนมัติในงานบำรุงรักษา",
        "double-redirect-fixer": "ตัวซ่อมหน้าเปลี่ยนทาง",
-       "brokenredirects": "หà¸\99à¹\89าเปลี่ยนทางเสีย",
-       "brokenredirectstext": "หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\97ีà¹\88ยัà¸\87à¹\84มà¹\88à¸\96ูà¸\81สรà¹\89าà¸\87:",
+       "brokenredirects": "à¸\81ารเปลี่ยนทางเสีย",
+       "brokenredirectstext": "à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¹\84มà¹\88มี:",
        "brokenredirects-edit": "แก้ไข",
        "brokenredirects-delete": "ลบ",
        "withoutinterwiki": "หน้าที่ไม่มีลิงก์ข้ามภาษา",
-       "withoutinterwiki-summary": "หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\84มà¹\88มีลิà¸\87à¸\81à¹\8cà¸\82à¹\89ามà¹\84à¸\9bภาษาอื่น",
+       "withoutinterwiki-summary": "หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¹\84มà¹\88à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bรุà¹\88à¸\99ภาษาอื่น",
        "withoutinterwiki-legend": "คำขึ้นต้น",
        "withoutinterwiki-submit": "แสดง",
-       "fewestrevisions": "หน้าที่มีรุ่นน้อยสุด",
+       "fewestrevisions": "หà¸\99à¹\89าà¸\97ีà¹\88มีรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99à¹\89อยสุà¸\94",
        "nbytes": "$1 ไบต์",
        "ncategories": "$1 หมวดหมู่",
        "ninterwikis": "$1 ลิงก์ข้ามโครงการ",
        "nlinks": "$1 ลิงก์",
        "nmembers": "$1 หน้า",
        "nmemberschanged": "$1 → $2 สมาชิก",
-       "nrevisions": "$1 รุ่น",
+       "nrevisions": "$1 รุ่นปรับปรุง",
        "nviews": "$1 ครั้ง",
        "nimagelinks": "ใช้ใน $1 {{PLURAL:$1|หน้า|หน้า}}",
        "ntransclusions": "ใช้ใน $1 {{PLURAL:$1|หน้า|หน้า}}",
        "uncategorizedcategories": "หมวดหมู่ที่ไม่ได้จัดหมวดหมู่",
        "uncategorizedimages": "ไฟล์ที่ยังไม่จัดหมวดหมู่",
        "uncategorizedtemplates": "แม่แบบที่ยังไม่จัดหมวดหมู่",
-       "unusedcategories": "หมวà¸\94หมูà¹\88à¸\97ีà¹\88à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\83à¸\8aà¹\89",
+       "unusedcategories": "หมวดหมู่ไม่ได้ใช้",
        "unusedimages": "ไฟล์ไม่ได้ใช้",
-       "popularpages": "หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\82à¹\89าà¸\94ูมาà¸\81",
+       "popularpages": "หà¸\99à¹\89าà¸\97ีà¹\88à¸\99ิยม",
        "wantedcategories": "หมวดหมู่ที่ต้องการ",
        "wantedpages": "หน้าที่ต้องการ",
        "wantedpages-badtitle": "ชื่อเรื่องไม่สมเหตุสมผลในเซตผลลัพธ์: $1",
        "wantedfiles": "ไฟล์ที่ต้องการ",
-       "wantedfiletext-cat": "ไฟล์ต่อไปนี้มีการเรียกใช้แต่ไม่มีอยู่ ไฟล์จากคลังเก็บภาษาอื่นอาจแสดงรายการแม้จะมีอยู่ ผลบวกลวงใด ๆ จะถูก<del>ขีดฆ่า</del> ยิ่งไปกว่านั้น หน้าที่ฝังตัวไฟล์ที่ไม่มีอยู่จะแสดงรายการใน [[:$1]]",
-       "wantedfiletext-nocat": "ไฟล์ต่อไปนี้มีการเรียกใช้แต่ไม่มีอยู่ ไฟล์จากคลังเก็บภาษาอื่นอาจแสดงรายการแม้จะมีอยู่ ผลบวกลวงใด ๆ จะถูก<del>ขีดฆ่า</del>",
+       "wantedfiletext-cat": "ไฟล์ต่อไปนี้พบใช้แต่ไม่มี ไฟล์จากคลังภายนอกอาจแสดงรายการแม้มีอยู่ ผลบวกลวงใด ๆ จะถูก<del>ขีดฆ่า</del> นอกจากนั้น หน้าที่ใส่ไฟล์ที่ไม่มีแสดงรายการใน [[:$1]]",
+       "wantedfiletext-cat-noforeign": "ไฟล์ต่อไปนี้พบใช้แต่ไม่มี นอกจากนี้ หน้าที่ใส่ไฟล์ที่ไม่มีแสดงรายการใน [[:$1]]",
+       "wantedfiletext-nocat": "ไฟล์ต่อไปนี้พบใช้แต่ไม่มี ไฟล์จากคลังภายนอกอาจแสดงรายการได้แม้มีอยู่ ผลบวกลวงดังกล่าวใด ๆ จะถูก<del>ขีดฆ่า</del>",
+       "wantedfiletext-nocat-noforeign": "ไฟล์ต่อไปนี้พบใช้แต่ไม่มี",
        "wantedtemplates": "แม่แบบที่ต้องการ",
        "mostlinked": "หน้าที่มีการเชื่อมโยงหามากที่สุด",
        "mostlinkedcategories": "หมวดหมู่ที่มีการเชื่อมโยงหามากที่สุด",
        "mostlinkedtemplates": "หน้าที่มีการเชื่อมโยงหามากที่สุด",
        "mostcategories": "หน้าที่มีหมวดหมู่มากที่สุด",
-       "mostimages": "ภาà¸\9eà¸\97ีà¹\88มีà¸\81ารà¹\82ยà¸\87à¹\84à¸\9bหามากที่สุด",
+       "mostimages": "à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88มีà¸\81ารà¹\82ยà¸\87หามากที่สุด",
        "mostinterwikis": "หน้าที่มีลิงก์ข้ามโครงการมากที่สุด",
-       "mostrevisions": "หà¸\99à¹\89าà¸\97ีà¹\88มีรุà¹\88à¸\99มาà¸\81à¸\97ีà¹\88สุด",
-       "prefixindex": "à¸\97ุà¸\81หà¸\99à¹\89าพร้อมคำขึ้นต้น",
-       "prefixindex-namespace": "à¸\97ุà¸\81หà¸\99à¹\89าพร้อมคำขึ้นต้น (เนมสเปซ $1)",
+       "mostrevisions": "หà¸\99à¹\89าà¸\97ีà¹\88มีรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87มาà¸\81สุด",
+       "prefixindex": "หà¸\99à¹\89าà¸\97ัà¹\89à¸\87หมà¸\94พร้อมคำขึ้นต้น",
+       "prefixindex-namespace": "หà¸\99à¹\89าà¸\97ัà¹\89à¸\87หมà¸\94พร้อมคำขึ้นต้น (เนมสเปซ $1)",
        "prefixindex-strip": "ลบคำขึ้นต้นในรายการออก",
        "shortpages": "หน้าสั้น",
        "longpages": "หน้ายาว",
        "deadendpages": "หน้าสุดทาง",
        "deadendpagestext": "หน้าต่อไปนี้ไม่เชื่อมโยงไปหน้าอื่นใน {{SITENAME}}",
        "protectedpages": "หน้าที่ถูกล็อก",
-       "protectedpages-indef": "à¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¹\84มà¹\88มีà¸\81ำหà¸\99à¸\94à¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99",
+       "protectedpages-indef": "à¹\80à¸\89à¸\9eาะà¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aà¹\84มà¹\88มีà¸\81ำหà¸\99à¸\94",
        "protectedpages-summary": "หน้านี้แสดงรายการหน้าที่มีอยู่ซึ่งปัจจุบันถูกล็อก สำหรับรายการชื่อเรื่องที่ถูกป้องกันมิให้สร้าง ดู [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]",
-       "protectedpages-cascade": "à¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aสืà¸\9aà¸\97อà¸\94à¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99",
+       "protectedpages-cascade": "à¹\80à¸\89à¸\9eาะà¸\81ารลà¹\87อà¸\81à¹\81à¸\9aà¸\9aสืà¸\9aà¸\97อà¸\94",
        "protectedpages-noredirect": "ซ่อนการเปลี่ยนทาง",
-       "protectedpagesempty": "à¸\82à¸\93ะà¸\99ีà¹\89à¹\84มà¹\88มีหà¸\99à¹\89าà¹\83à¸\94à¸\96ูà¸\81ลà¹\87อà¸\81à¸\95ามà¸\9eารามิà¹\80à¸\95อรà¹\8cà¹\80หลà¹\88าà¸\99ีà¹\89",
+       "protectedpagesempty": "ขณะนี้ไม่มีหน้าถูกล็อกตามพารามิเตอร์เหล่านี้",
        "protectedpages-timestamp": "ตราเวลา",
        "protectedpages-page": "หน้า",
        "protectedpages-expiry": "หมดอายุ",
        "protectedtitles": "ชื่อเรื่องที่ถูกป้องกัน",
        "protectedtitles-summary": "หน้านี้แสดงรายการชื่อที่ปัจจุบันถูกป้องกันมิให้สร้าง สำหรับรายการหน้าที่มีอยู่ที่ถูกล็อก ดู [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]",
        "protectedtitlesempty": "ปัจจุบันไม่มีหัวเรื่องที่ได้รับการป้องกันด้วยพารามิเตอร์เหล่านี้",
-       "listusers": "รายà¸\99ามผู้ใช้",
+       "listusers": "รายà¸\81ารผู้ใช้",
        "listusers-editsonly": "แสดงเฉพาะผู้ใช้ที่มีการแก้ไข",
-       "listusers-creationsort": "à¹\80รียà¸\87ลำà¸\94ัà¸\9aà¸\95ามวัà¸\99สรà¹\89าà¸\87",
-       "listusers-desc": "à¹\80รียà¸\87à¸\95ามลำà¸\94ัà¸\9aลà¸\94",
-       "usereditcount": "การแก้ไข $1 ครั้ง",
+       "listusers-creationsort": "เรียงตามวันสร้าง",
+       "listusers-desc": "à¹\80รียà¸\87ลำà¸\94ัà¸\9aลà¸\87",
+       "usereditcount": "$1 การแก้ไข",
        "usercreated": "{{GENDER:$3|ถูกสร้าง}}เมื่อ $1 เวลา $2",
        "newpages": "หน้าใหม่",
        "newpages-username": "ชื่อผู้ใช้:",
-       "ancientpages": "หà¸\99à¹\89าà¸\97ีà¹\88à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\81à¸\81à¹\89à¹\84à¸\82à¸\99าà¸\99สุด",
+       "ancientpages": "หà¸\99à¹\89าà¹\80à¸\81à¹\88าสุด",
        "move": "เปลี่ยนชื่อ",
        "movethispage": "เปลี่ยนชื่อหน้านี้",
-       "unusedimagestext": "ไฟล์ต่อไปนี้มีอยู่ แต่ไม่มีการเรียกใช้ในหน้าใด ๆ เลย\nหมายเหตุว่า เว็บไซต์อื่นอาจเชื่อมโยงมายังไฟล์ด้วยยูอาร์แอลโดยตรง ฉะนั้นจึงชื่ออาจยังแสดงรายการอยู่ที่นี่แม้จะมีการใช้อย่างต่อเนื่อง",
-       "unusedcategoriestext": "หมวà¸\94หมูà¹\88à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89ยัà¸\87มีอยูà¹\88 à¹\81มà¹\89à¹\84มà¹\88มีหà¸\99à¹\89าอืà¹\88à¸\99หรือหมวà¸\94หมูà¹\88à¹\83à¸\94à¹\83à¸\8aà¹\89สà¹\88วà¸\99à¸\99ี้",
-       "notargettitle": "à¹\84มà¹\88à¸\9eà¸\9aเป้าหมาย",
+       "unusedimagestext": "ไฟล์ต่อไปนี้มีอยู่ แต่ไม่มีการเรียกใช้ในหน้าใด\nหมายเหตุว่า เว็บไซต์อื่นอาจเชื่อมโยงมายังไฟล์ด้วยยูอาร์แอลโดยตรง ฉะนั้นจึงอาจยังแสดงรายการอยู่ที่นี่แม้ยังใช้อยู่",
+       "unusedcategoriestext": "หมวà¸\94หมูà¹\88à¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89มีอยูà¹\88 à¹\81มà¹\89à¹\84มà¹\88มีหà¸\99à¹\89าอืà¹\88à¸\99หรือหมวà¸\94หมูà¹\88à¹\83à¸\94à¹\83à¸\8a้",
+       "notargettitle": "à¹\84มà¹\88มีเป้าหมาย",
        "notargettext": "คุณมิได้ระบุหน้าหรือผู้ใช้เป้าหมายที่จะดำเนินการฟังก์ชันนี้",
        "nopagetitle": "ไม่มีหน้าเป้าหมายดังกล่าว",
-       "nopagetext": "หà¸\99à¹\89าà¹\80à¸\9bà¹\89าหมายà¸\97ีà¹\88à¸\84ุà¸\93ระà¸\9aุà¹\84มà¹\88มีอยูà¹\88",
+       "nopagetext": "à¹\84มà¹\88มีหà¸\99à¹\89าà¹\80à¸\9bà¹\89าหมายà¸\97ีà¹\88à¸\84ุà¸\93ระà¸\9aุ",
        "pager-newer-n": "ใหม่กว่า $1",
        "pager-older-n": "เก่ากว่า $1",
        "suppress": "ผู้ดูแลประวัติ",
-       "querypage-disabled": "หà¸\99à¹\89าà¸\9eิà¹\80ศษà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81มีà¸\9bระสิà¸\97à¸\98ิภาà¸\9eà¸\95à¹\88ำ",
+       "querypage-disabled": "หà¸\99à¹\89าà¸\9eิà¹\80ศษà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\94à¹\89วยà¹\80หà¸\95ุà¸\9cลà¸\94à¹\89าà¸\99สมรรà¸\96ภาà¸\9e",
        "booksources": "แหล่งหนังสือ",
        "booksources-search-legend": "ค้นหาแหล่งหนังสือ",
-       "booksources-go": "ค้นหา",
+       "booksources-search": "ค้นหา",
        "booksources-text": "ด้านล่างเป็นรายการการเชื่อมโยงไปยังเว็บไซต์อื่นที่ขายหนังสือใหม่และหนังสือใช้แล้ว และอาจมีสารสนเทศเพิ่มเติมเกี่ยวกับหนังสือที่คุณกำลังมองหา:",
        "booksources-invalid-isbn": "รหัส ISBN ที่ให้ไว้ไม่ถูกต้อง กรุณาตรวจสอบจากต้นฉบับอีกครั้ง",
        "specialloguserlabel": "ผู้ดำเนินการ:",
        "all-logs-page": "ปูมสาธารณะทั้งหมด",
        "alllogstext": "การแสดงผลรวมปูมที่มีทั้งหมดของ {{SITENAME}}\nคุณสามารถค้นหาให้ละเอียดขึ้นโดยเลือกประเภทปูม ชื่อผู้ใช้หรือหน้าที่ต้องการ (ไวต่ออักษรใหญ่เล็ก)",
        "logempty": "ไม่พบรายการตรงกันในปูม",
-       "log-title-wildcard": "ค้นหาชื่อเรื่องด้วยข้อความนี้",
-       "showhideselectedlogentries": "à¹\81สà¸\94à¸\87/à¸\8bà¹\88อà¸\99หน่วยปูมที่เลือก",
+       "log-title-wildcard": "à¸\84à¹\89à¸\99หาà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\8bึà¹\88à¸\87à¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99à¸\94à¹\89วยà¸\82à¹\89อà¸\84วามà¸\99ีà¹\89",
+       "showhideselectedlogentries": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\97ัศà¸\99วิสัยà¸\82อà¸\87หน่วยปูมที่เลือก",
        "allpages": "หน้าทั้งหมด",
        "nextpage": "หน้าถัดไป ($1)",
        "prevpage": "หน้าก่อนหน้า ($1)",
-       "allpagesfrom": "à¹\81สà¸\94à¸\87หà¸\99à¹\89าà¹\82à¸\94ยà¹\80ริà¹\88มà¸\88าà¸\81:",
+       "allpagesfrom": "แสดงหน้าเริ่มจาก:",
        "allpagesto": "แสดงหน้าจบที่:",
-       "allarticles": "à¸\97ุà¸\81หà¸\99à¹\89า",
-       "allinnamespace": "หà¸\99à¹\89าà¸\97ุà¸\81หà¸\99à¹\89า (เนมสเปซ $1)",
+       "allarticles": "หà¸\99à¹\89าà¸\97ัà¹\89à¸\87หมà¸\94",
+       "allinnamespace": "หà¸\99à¹\89าà¸\97ัà¹\89à¸\87หมà¸\94 (เนมสเปซ $1)",
        "allpagessubmit": "ดู",
        "allpagesprefix": "แสดงหน้าที่ขึ้นต้นด้วย:",
-       "allpagesbadtitle": "ชื่อเรื่องนี้ไม่ถูกต้อง อาจสะกดผิด หรือเป็นลิงก์ข้ามภาษา หรือมีตัวอักษรที่ไม่สามารถใช้เป็นชื่อเรื่องได้",
+       "allpagesbadtitle": "ชื่อเรื่องนี้ไม่ถูกต้องหรือมีคำเติมหน้าข้ามภาษาหรือข้ามโครงการ \nอาจมีอักขระที่ไม่สามารถใช้ในชื่อเรื่องได้",
        "allpages-bad-ns": "{{SITENAME}} ไม่มีเนมสเปซ \"$1\"",
        "allpages-hide-redirects": "ซ่อนการเปลี่ยนทาง",
        "cachedspecial-viewing-cached-ttl": "คุณกำลังดูรุ่นที่เก็บหน่วยความจำแคชของหน้านี้ ซึ่งอาจมีอายุ $1",
        "categoriesfrom": "แสดงหมวดหมู่เริ่มจาก:",
        "special-categories-sort-count": "เรียงตามจำนวน",
        "special-categories-sort-abc": "เรียงตามตัวอักษร",
-       "deletedcontributions": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82ที่ถูกลบ",
-       "deletedcontributions-title": "à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82ที่ถูกลบ",
+       "deletedcontributions": "à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¹\80à¸\82ียà¸\99à¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89ที่ถูกลบ",
+       "deletedcontributions-title": "à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¹\80à¸\82ียà¸\99à¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89ที่ถูกลบ",
        "sp-deletedcontributions-contribs": "เรื่องที่เขียน",
        "linksearch": "ค้นหาลิงก์ภายนอก",
        "linksearch-pat": "รูปแบบการค้นหา:",
        "listusers-noresult": "ไม่พบผู้ใช้",
        "listusers-blocked": "(ถูกบล็อก)",
        "activeusers": "รายการผู้ใช้ที่มีความเคลื่อนไหว",
-       "activeusers-intro": "à¸\99ีà¹\88à¸\84ือรายà¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\81ิà¸\88à¸\81รรมà¹\83à¸\94 à¹\86 à¹\83à¸\99à¸\8aà¹\88วà¸\87 $1 à¸§à¸±à¸\99à¸\97ีà¹\88à¸\9cà¹\88าà¸\99มา",
-       "activeusers-count": "{{PLURAL:$1|ปฏิบัติการล่าสุด|ปฏิบัติการล่าสุด $1 รายการ}} ในช่วง $3 วันที่ผ่านมา",
+       "activeusers-intro": "à¸\99ีà¹\88à¸\84ือรายà¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\81ิà¸\88à¸\81รรมà¹\83à¸\94 à¹\86 à¹\83à¸\99à¸\8aà¹\88วà¸\87 $1 à¸§à¸±à¸\99หลัà¸\87สุà¸\94",
+       "activeusers-count": "$1 ปฏิบัติการ{{PLURAL:$1|}} ในช่วง $3 วันหลังสุด",
        "activeusers-from": "แสดงผู้ใช้เริ่มจาก:",
        "activeusers-hidebots": "ซ่อนบอต",
        "activeusers-hidesysops": "ซ่อนผู้ดูแลระบบ",
        "activeusers-noresult": "ไม่พบผู้ใช้",
        "listgrouprights": "สิทธิกลุ่มผู้ใช้",
-       "listgrouprights-summary": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ลุà¹\88มà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\99ิยามà¸\9aà¸\99วิà¸\81ิà¸\99ีà¹\89 à¹\81ละสิà¸\97à¸\98ิà¸\81ารà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87\nอาà¸\88มี[[{{MediaWiki:Listgrouprights-helppage}}|à¸\82à¹\89อมูลเพิ่มเติม]]เกี่ยวกับสิทธิหนึ่ง ๆ",
+       "listgrouprights-summary": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ลุà¹\88มà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\99ิยามà¸\9aà¸\99วิà¸\81ิà¸\99ีà¹\89 à¹\81ละสิà¸\97à¸\98ิà¸\81ารà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87\nอาà¸\88มี[[{{MediaWiki:Listgrouprights-helppage}}|สารสà¸\99à¹\80à¸\97ศเพิ่มเติม]]เกี่ยวกับสิทธิหนึ่ง ๆ",
        "listgrouprights-key": "คำอธิบาย:\n* <span class=\"listgrouprights-granted\">สิทธิที่ได้รับแต่งตั้ง</span>\n* <span class=\"listgrouprights-revoked\">สิทธิที่ถูกเพิกถอน</span>",
        "listgrouprights-group": "กลุ่ม",
        "listgrouprights-rights": "สิทธิ",
        "listgrouprights-addgroup": "เพิ่ม{{PLURAL:$2|กลุ่มนี้|กลุ่มเหล่านี้}}: $1",
        "listgrouprights-removegroup": "นำ{{PLURAL:$2|กลุ่มนี้|กลุ่มเหล่านี้}}ออก: $1",
        "listgrouprights-addgroup-all": "เพิ่มกลุ่มทั้งหมด",
-       "listgrouprights-removegroup-all": "à¸\99ำกลุ่มทั้งหมดออก",
-       "listgrouprights-addgroup-self": "à¹\80à¸\9eิà¹\88ม{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88ม}}à¹\80à¸\82à¹\89าà¹\84à¸\9bà¹\83à¸\99à¸\9aัà¸\8dà¸\8aี: $1",
-       "listgrouprights-removegroup-self": "ลบ{{PLURAL:$2|กลุ่ม|กลุ่ม}}ออกจากบัญชี: $1",
-       "listgrouprights-addgroup-self-all": "à¹\80à¸\9eิà¹\88มà¸\97ุà¸\81à¸\81ลุà¹\88มà¹\80à¸\82à¹\89าà¹\84à¸\9bà¹\83à¸\99à¸\9aัà¸\8dà¸\8aีà¸\99ีà¹\89",
-       "listgrouprights-removegroup-self-all": "à¸\99ำà¸\97ุà¸\81à¸\81ลุà¹\88มออà¸\81à¸\88าà¸\81à¸\9aัà¸\8dà¸\8aีà¸\99ีà¹\89",
+       "listgrouprights-removegroup-all": "ลà¸\9aกลุ่มทั้งหมดออก",
+       "listgrouprights-addgroup-self": "à¹\80à¸\9eิà¹\88ม{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88ม}}à¹\83หà¹\89à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\95ัว: $1",
+       "listgrouprights-removegroup-self": "ลบ{{PLURAL:$2|กลุ่ม|กลุ่ม}}ออกจากบัญชีของตัว: $1",
+       "listgrouprights-addgroup-self-all": "à¹\80à¸\9eิà¹\88มà¸\97ุà¸\81à¸\81ลุà¹\88มà¹\80à¸\82à¹\89าà¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\95ัว",
+       "listgrouprights-removegroup-self-all": "ลà¸\9aà¸\97ุà¸\81à¸\81ลุà¹\88มออà¸\81à¸\88าà¸\81à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\95ัว",
        "listgrouprights-namespaceprotection-header": "การจำกัดเนมสเปซ",
        "listgrouprights-namespaceprotection-namespace": "เนมสเปซ",
        "listgrouprights-namespaceprotection-restrictedto": "สิทธิอนุญาตให้ผู้ใช้แก้ไข",
        "trackingcategories": "หมวดหมู่ค้นหาและติดตาม",
-       "trackingcategories-summary": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารหมวà¸\94หมูà¹\88à¸\84à¹\89à¸\99หาà¹\81ละà¸\95ิà¸\94à¸\95ามà¸\8bึà¹\88à¸\87à¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cมีà¹\80à¸\94ียวิà¸\81ิà¸\88ัà¸\94à¸\81ารอัà¸\95à¹\82à¸\99มัà¸\95ิ à¸\8aืà¹\88อà¹\80หลà¹\88าà¸\99ีà¹\89สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ได้โดยการเปลี่ยนสารระบบที่เกี่ยวข้องในเนมสเปซ {{ns:8}}",
+       "trackingcategories-summary": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารหมวà¸\94หมูà¹\88à¸\84à¹\89à¸\99หาà¹\81ละà¸\95ิà¸\94à¸\95ามà¸\8bึà¹\88à¸\87à¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cมีà¹\80à¸\94ียวิà¸\81ิà¸\88ัà¸\94à¸\81ารอัà¸\95à¹\82à¸\99มัà¸\95ิ à¸ªà¸²à¸¡à¸²à¸£à¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\80หลà¹\88าà¸\99ีà¹\89ได้โดยการเปลี่ยนสารระบบที่เกี่ยวข้องในเนมสเปซ {{ns:8}}",
        "trackingcategories-msg": "หมวดหมู่ค้นหาและติดตาม",
        "trackingcategories-name": "ชื่อสาร",
        "trackingcategories-desc": "เกณฑ์การรวมหมวดหมู่",
        "noindex-category-desc": "โรบอตไม่สามารถทำดัชนีหน้านี้เพราะมีเมจิกเวิร์ด <code><nowiki>__NOINDEX__</nowiki></code> อยู่และอยู่ในเนมสเปซซึ่งอนุญาตตัวบ่งชี้นี้",
        "index-category-desc": "หน้านี้มี <code><nowiki>__INDEX__</nowiki></code> อยู่ (และอยู่ในเนมสเปซซึ่งอนุญาตตัวบ่งชี้นี้) ฉะนั้น โรบอตจึงทำดัชนี้ได้ ซึ่งปกติไม่สามารถทำได้",
-       "hidden-category-category-desc": "นี่คือหมวดหมู่ที่ติด <code><nowiki>__HIDDENCAT__</nowiki></code> ซึ่งป้องกันมิให้แสดงในกล่องลิงก์หมวดหมู่ในหน้าโดยปริยาย",
+       "hidden-category-category-desc": "หมวดหมู่นี้มี <code><nowiki>__HIDDENCAT__</nowiki></code> ในเนื้อหาหน้า ซึ่งป้องกันมิให้แสดงในกล่องลิงก์หมวดหมู่ในหน้าโดยปริยาย",
+       "trackingcategories-nodesc": "ไม่มีคำอธิบาย",
+       "trackingcategories-disabled": "ปิดใช้งานหมวดหมู่",
        "mailnologin": "ไม่มีที่อยู่ส่ง",
-       "mailnologintext": "คุณต้อง[[Special:UserLogin|ล็อกอิน]]และมีที่อยู่อีเมลที่สมเหตุสมผลใน[[Special:Preferences|การตั้งค่า]]ของคุณ ในการส่งอีเมลหาผู้ใช้อื่น",
+       "mailnologintext": "คุณต้อง[[Special:UserLogin|ล็อกอิน]]และมีที่อยู่อีเมลที่สมเหตุสมผลใน[[Special:Preferences|การตั้งค่า]]ของคุณเพื่อส่งอีเมลหาผู้ใช้อื่น",
        "emailuser": "ส่งอีเมลหาผู้ใช้นี้",
        "emailuser-title-target": "ส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}",
        "emailuser-title-notarget": "อีเมลผู้ใช้",
        "emailpage": "อีเมลผู้ใช้",
        "emailpagetext": "คุณสามารถใช้แบบด้านล่างส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้\nที่อยู่อีเมลที่คุณกรอกใน[[Special:Preferences|การตั้งค่าส่วนตัวของคุณ]]จะปรากฏเป็นที่อยู่ \"จาก\" ของอีเมล ซึ่งผู้รับสามารถตอบกลับคุณได้โดยตรง",
-       "defemailsubject": "อีเมล{{SITENAME}}จากผู้ใช้ \"$1\"",
+       "defemailsubject": "อีเมล {{SITENAME}} จากผู้ใช้ \"$1\"",
        "usermaildisabled": "ปิดใช้งานการส่งอีเมลหาผู้ใช้",
        "usermaildisabledtext": "คุณไม่สามารถส่งอีเมลหาผู้ใช้อื่นบนวิกินี้",
        "noemailtitle": "ไม่มีที่อยู่อีเมล",
        "email-legend": "ส่งอีเมลถึงผู้ใช้ {{SITENAME}} อีกคน",
        "emailfrom": "จาก:",
        "emailto": "ถึง:",
-       "emailsubject": "หัวà¹\80รืà¹\88อà¸\87:",
+       "emailsubject": "เรื่อง:",
        "emailmessage": "ข้อความ:",
        "emailsend": "ส่ง",
-       "emailccme": "สà¹\88à¸\87อีà¹\80มลสำà¹\80à¸\99าà¸\81ลัà¸\9aมา",
-       "emailccsubject": "à¸\84ัà¸\94ลอà¸\81à¸\82à¹\89อà¸\84วามà¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\9bยัà¸\87$1: $2",
-       "emailsent": "อีà¹\80มลà¸\96ูà¸\81สà¹\88à¸\87แล้ว",
-       "emailsenttext": "อีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81สà¹\88à¸\87แล้ว",
-       "emailuserfooter": "อีà¹\80มลà¸\89à¸\9aัà¸\9aà¸\99ีà¹\89à¸\96ูà¸\81สà¹\88à¸\87à¹\82à¸\94ย $1 ถึง $2 ด้วยฟังก์ชัน \"อีเมลผู้ใช้รายนี้\" ที่ {{SITENAME}}",
-       "usermessage-summary": "à¸\9dาà¸\81à¸\82à¹\89อà¸\84วามà¸\82อà¸\87ระบบ",
-       "usermessage-editor": "à¸\95ัวสà¹\88à¸\87à¸\82à¹\89อà¸\84วามของระบบ",
+       "emailccme": "สà¹\88à¸\87อีà¹\80มลสำà¹\80à¸\99าสารà¸\82อà¸\87à¸\89ัà¸\99หาà¸\89ัà¸\99",
+       "emailccsubject": "à¸\84ัà¸\94ลอà¸\81สารà¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\9b $1: $2",
+       "emailsent": "สà¹\88à¸\87อีà¹\80มลแล้ว",
+       "emailsenttext": "สà¹\88à¸\87สารอีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93แล้ว",
+       "emailuserfooter": "สà¹\88à¸\87อีà¹\80มลà¸\88าà¸\81 $1 ถึง $2 ด้วยฟังก์ชัน \"อีเมลผู้ใช้รายนี้\" ที่ {{SITENAME}}",
+       "usermessage-summary": "à¸\9dาà¸\81สารระบบ",
+       "usermessage-editor": "à¸\95ัวสà¹\88à¸\87สารของระบบ",
        "watchlist": "รายการเฝ้าดู",
        "mywatchlist": "รายการเฝ้าดู",
        "watchlistfor2": "สำหรับ $1 $2",
        "watchlistanontext": "กรุณาล็อกอินเพื่อดูหรือแก้ไขรายการในรายการเฝ้าดูของคุณ",
        "watchnologin": "ยังไม่ได้ล็อกอิน",
        "addwatch": "เพิ่มเข้ารายการเฝ้าดู",
-       "addedwatchtext": "หà¸\99à¹\89า \"[[:$1]]\" à¹\84à¸\94à¹\89à¹\80à¸\9eิà¹\88มลà¸\87à¹\83à¸\99[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¸\82อà¸\87à¸\84ุà¸\93à¹\81ลà¹\89ว à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หน้านี้หรือหน้าพูดคุยที่เกี่ยวข้องจะแสดงในรายการดังกล่าว",
-       "addedwatchtext-short": "หà¸\99à¹\89า \"$1\" à¸\96ูà¸\81à¹\80à¸\9eิà¹\88มà¹\80à¸\82à¹\89ารายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93",
+       "addedwatchtext": "à¹\80à¸\9eิà¹\88มหà¸\99à¹\89า \"[[:$1]]\" à¹\80à¸\82à¹\89า[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¸\82อà¸\87à¸\84ุà¸\93à¹\81ลà¹\89ว \nà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99อà¸\99าà¸\84à¸\95à¹\81à¸\81à¹\88หน้านี้หรือหน้าพูดคุยที่เกี่ยวข้องจะแสดงในรายการดังกล่าว",
+       "addedwatchtext-short": "à¹\80à¸\9eิà¹\88มหà¸\99à¹\89า \"$1\" à¹\80à¸\82à¹\89ารายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93à¹\81ลà¹\89ว",
        "removewatch": "นำออกจากรายการเฝ้าดู",
-       "removedwatchtext": "หà¸\99à¹\89า \"[[:$1]]\" à¸\96ูà¸\81à¸\99ำออà¸\81à¸\88าà¸\81[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93]]",
-       "removedwatchtext-short": "หà¸\99à¹\89า \"$1\" à¸\96ูà¸\81à¸\99ำออà¸\81à¸\88าà¸\81รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93",
+       "removedwatchtext": "à¸\99ำหà¸\99à¹\89า \"[[:$1]]\" à¸­à¸­à¸\81à¸\88าà¸\81[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93]]à¹\81ลà¹\89ว",
+       "removedwatchtext-short": "à¸\99ำหà¸\99à¹\89า \"$1\" à¸­à¸­à¸\81à¸\88าà¸\81รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93à¹\81ลà¹\89ว",
        "watch": "เฝ้าดู",
        "watchthispage": "เฝ้าดูหน้านี้",
        "unwatch": "เลิกเฝ้าดู",
        "notanarticle": "ไม่ใช่หน้าเนื้อหา",
        "notvisiblerev": "รุ่นล่าสุดโดยผู้ใช้อีกคนถูกลบแล้ว",
        "watchlist-details": "มี $1 หน้าในรายการเฝ้าดูของคุณ ไม่นับแยกหน้าอภิปราย",
-       "wlheader-enotif": "à¸\81ารà¹\81à¸\88à¹\89à¸\87à¹\80à¸\95ือà¸\99à¸\9cà¹\88าà¸\99อีà¹\80มลà¸\96ูà¸\81à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99",
-       "wlheader-showupdated": "หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\84ุà¸\93à¹\80à¸\82à¹\89าà¸\8aมลà¹\88าสุà¸\94à¹\81สà¸\94à¸\87à¹\83à¸\99'''à¸\95ัวหà¸\99า'''",
-       "wlnote": "ด้านล่างเป็นการแก้ไข{{PLURAL:$1|ล่าสุด|ล่าสุด <strong>$1</strong> รายการ}} ใน{{PLURAL:$2|ชั่วโมง| <strong>$2</strong> ชั่วโมง}}ที่ผ่านมา จนถึง $3, $4",
-       "wlshowlast": "แสดง $1 ชั่วโมง $2 วันล่าสุด $3",
+       "wlheader-enotif": "à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¹\81à¸\88à¹\89à¸\87à¹\80à¸\95ือà¸\99à¸\9cà¹\88าà¸\99อีà¹\80มล",
+       "wlheader-showupdated": "หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\84ุà¸\93à¹\80ยีà¹\88ยมà¸\84รัà¹\89à¸\87สุà¸\94à¸\97à¹\89ายà¹\81สà¸\94à¸\87à¸\94à¹\89วย<strong>à¸\95ัวหà¸\99า</strong>",
+       "wlnote": "ด้านล่างเป็น{{PLURAL:$1|การเปลี่ยนแปลงหลังสุด| <strong>$1</strong> การเปลี่ยนแปลงหลังสุด}} ใน{{PLURAL:$2|ชั่วโมง| <strong>$2</strong> ชั่วโมง}}ที่หลังสุด จนถึง $3, $4",
+       "wlshowlast": "แสดง $1 ชั่วโมง $2 วันล่าสุด",
        "watchlist-options": "ตัวเลือกรายการเฝ้าดู",
-       "watching": "เฝ้าดู...",
-       "unwatching": "เลิกเฝ้าดู...",
+       "watching": "à¸\81ำลัà¸\87à¹\80à¸\9dà¹\89าà¸\94ู...",
+       "unwatching": "à¸\81ำลัà¸\87à¹\80ลิà¸\81à¹\80à¸\9dà¹\89าà¸\94ู...",
        "watcherrortext": "เกิดข้อผิดพลาดขณะเปลี่ยนแปลงการตั้งค่ารายการเฝ้าดูของคุณ เพราะ \"$1\"",
-       "enotif_reset": "ทำเครื่องหมายว่าชมทุกหน้าแล้ว",
-       "enotif_impersonal_salutation": "ผู้ใช้{{SITENAME}}",
-       "enotif_subject_deleted": "หน้า $1 บน {{SITENAME}} ถูกลบโดย {{gender:$2|$2}}",
-       "enotif_subject_created": "หน้า $1 บน {{SITENAME}} ถูกสร้างโดย {{gender:$2|$2}}",
-       "enotif_subject_moved": "หน้า $1 บน {{SITENAME}} ถูกย้ายโดย {{gender:$2|$2}}",
-       "enotif_subject_restored": "หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|กู้คืน}}โดย $2",
-       "enotif_subject_changed": "หน้า $1 บน {{SITENAME}} มีการเปลี่ยนแปลงโดย {{gender:$2|$2}}",
-       "enotif_body_intro_deleted": "หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|ลบ}}เมื่อ $PAGEEDITDATE โดย $2 ดู $3",
-       "enotif_body_intro_created": "หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|สร้าง}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3",
-       "enotif_body_intro_moved": "หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|เปลี่ยนชื่อ}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3",
-       "enotif_body_intro_restored": "หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|กู้คืน}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3",
-       "enotif_body_intro_changed": "หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|เปลี่ยนแปลง}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3",
-       "enotif_lastvisited": "à¸\94ู $1 à¸ªà¸³à¸«à¸£à¸±à¸\9aà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\97ัà¹\89à¸\87หมà¸\94à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\84ุà¸\93à¹\80à¸\82à¹\89าà¸\8aมà¸\84รัà¹\89à¸\87ลà¹\88าสุà¸\94",
+       "enotif_reset": "à¸\97ำà¹\80à¸\84รืà¹\88อà¸\87หมายวà¹\88าà¹\80ยีà¹\88ยมà¸\8aมà¸\97ุà¸\81หà¸\99à¹\89าà¹\81ลà¹\89ว",
+       "enotif_impersonal_salutation": "ผู้ใช้ {{SITENAME}}",
+       "enotif_subject_deleted": "$2 ลบหน้า $1 บน {{SITENAME}}",
+       "enotif_subject_created": "$2 สร้างหน้า $1 บน {{SITENAME}}",
+       "enotif_subject_moved": "$2 ย้ายหน้า $1 บน {{SITENAME}}",
+       "enotif_subject_restored": "$2 กู้คืนหน้า $1 บน {{SITENAME}}",
+       "enotif_subject_changed": "$2 เปลี่ยนแปลงหน้า $1 บน {{SITENAME}}",
+       "enotif_body_intro_deleted": "$2 ลบหน้า $1 บน {{SITENAME}} เมื่อ $PAGEEDITDATE ดู $3",
+       "enotif_body_intro_created": "$2 สร้างหน้า $1 บน {{SITENAME}} เมื่อ $PAGEEDITDATE ดูรุ่นปัจจุบันที่ $3",
+       "enotif_body_intro_moved": "$2 ย้ายหน้า $1 บน {{SITENAME}} เมื่อ $PAGEEDITDATE ดูรุ่นปัจจุบันที่ $3",
+       "enotif_body_intro_restored": "$2 กู้คืนหน้า $1 บน {{SITENAME}} เมื่อ $PAGEEDITDATE ดูรุ่นปัจจุบันที่ $3",
+       "enotif_body_intro_changed": "$2 เปลี่ยนแปลงหน้า $1 บน {{SITENAME}} เมื่อ $PAGEEDITDATE ดูรุ่นปัจจุบันที่ $3",
+       "enotif_lastvisited": "à¸\94ู $1 à¸ªà¸³à¸«à¸£à¸±à¸\9aà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\97ัà¹\89à¸\87หมà¸\94à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\84ุà¸\93à¹\80ยีà¹\88ยมà¸\8aมà¸\84รัà¹\89à¸\87สุà¸\94à¸\97à¹\89าย",
        "enotif_lastdiff": "ดู $1 เพื่อดูการเปลี่ยนแปลงนี้",
        "enotif_anon_editor": "ผู้ใช้นิรนาม $1",
        "enotif_body": "เรียน $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nคำอธิบายอย่างย่อของผู้เขียน: $PAGESUMMARY $PAGEMINOREDIT\n\nติดต่อผู้เขียน:\nเมล: $PAGEEDITOR_EMAIL\nวิกิ: $PAGEEDITOR_WIKI\n\nจะไม่มีประกาศอื่นหากมีกิจกรรมเพิ่มเติม เว้นเสียแต่คุณจะเข้าชมหน้านี้ คุณยังสามารถตั้งค่าตัวบ่งชี้ประกาศใหม่สำหรับหน้าที่คุณเฝ้าดูทุกหน้าในรายการเฝ้าดูของคุณ\n\nระบบประกาศ {{SITENAME}} ที่เป็นมิตรของคุณ\n\n--\nในการเปลี่ยนการตั้งค่าประกาศอีเมลของคุณ โปรดดู\n{{canonicalurl:{{#special:Preferences}}}}\n\nในการเปลี่ยนการตั้งค่ารายการเฝ้าดูของคุณ โปรดดู\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nในการลบหน้าจากรายการเฝ้าดูของคุณ โปรดดู\n$UNWATCHURL\n\nผลป้อนกลับและความช่วยเหลือเพิ่มเติม:\n$HELPPAGE",
        "changed": "ถูกเปลี่ยนแปลง",
        "deletepage": "ลบหน้า",
        "confirm": "ยืนยัน",
-       "excontent": "เนื้อหาเดิม: '$1'",
-       "excontentauthor": "เนื้อหาเดิม: '$1' (และมีผู้เขียนคนเดียวคือ '[[Special:Contributions/$2|$2]]')",
-       "exbeforeblank": "เนื้อหาก่อนถูกทำว่างคือ: '$1'",
+       "excontent": "เนื้อหาเดิม: \"$1\"",
+       "excontentauthor": "เนื้อหาเดิม: \"$1\" (และมีผู้เขียนคนเดียวคือ \"[[Special:Contributions/$2|$2]]\")",
+       "exbeforeblank": "เนื้อหาก่อนถูกทำว่างคือ: \"$1\"",
        "delete-confirm": "ลบ \"$1\"",
        "delete-legend": "ลบ",
        "historywarning": "'''คำเตือน:'''' หน้าที่คุณกำลังลบมีประวัติการแก้ไขประมาณ $1 {{PLURAL:$1|รุ่น}}:",
        "confirmdeletetext": "คุณกำลังลบหน้า รวมทั้งประวัติทั้งหมดของหน้า\nกรุณายืนยันว่าคุณเจตนา เข้าใจผลกระทบ และการกระทำนี้สอดคล้องกับ[[{{MediaWiki:Policy-url}}|นโยบาย]]",
        "actioncomplete": "ปฏิบัติการสำเร็จ",
        "actionfailed": "ปฏิบัติการล้มเหลว",
-       "deletedtext": "\"$1\" ถูกลบ\nดู $2 สำหรับบันทึกการลบล่าสุด",
+       "deletedtext": "ลบ \"$1\" แล้ว\nดู $2 สำหรับบันทึกการลบล่าสุด",
        "dellogpage": "ปูมการลบ",
        "dellogpagetext": "ด้านล่างเป็นรายการการลบล่าสุด",
        "deletionlog": "ปูมการลบ",
        "delete-edit-reasonlist": "แก้ไขเหตุผลการลบ",
        "delete-toobig": "หน้านี้มีประวัติการแก้ไขนาดใหญ่ คือ กว่า $1 รุ่น การลบหน้าเช่นนี้ถูกจำกัดเพื่อป้องกันการรบกวน{{SITENAME}}โดยบังเอิญ",
        "delete-warning-toobig": "หน้านี้มีประวัติการแก้ไขขนาดใหญ่ กว่า $1 รุ่น การลบหน้านี้อาจรบกวนการทำงานของฐานข้อมูลของ {{SITENAME}} โปรดดำเนินการด้วยความระมัดระวัง",
-       "delete-cantedit": "คุณไม่สามารถลบหน้านี้ได้เพราะคุณไม่ได้รับอนุญาตให้แก้ไข",
+       "deleteprotected": "คุณไม่สามารถลบหน้านี้เพราะถูกล็อก",
        "deleting-backlinks-warning": "'''คำเตือน:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|หน้าอื่น]]เชื่อมโยงมายังหรือดึงข้อมูลจากหน้าที่คุณกำลังจะลบ",
        "rollback": "ย้อนการแก้ไขกลับฉุกเฉิน",
        "rollback_short": "ย้อนกลับฉุกเฉิน",
        "rollbackfailed": "ย้อนกลับฉุกเฉินล้มเหลว",
        "cantrollback": "ไม่สามารถย้อนการแก้ไขได้ ผู้เขียนคนล่าสุดเป็นผู้เขียนคนเดียวของหน้านี้",
        "alreadyrolled": "ไม่สามารถย้อนกลับฉุกเฉินการแก้ไขสุดท้ายโดย [[User:$2|$2]] ([[User talk:$2|พูดคุย]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ในหน้า [[:$1]] มีผู้อื่นได้แก้ไขหรือย้อนกลับฉุกเฉินหน้านี้ไปก่อนแล้ว\n\nผู้แก้ไขล่าสุดของหน้านี้คือ [[User:$3|$3]] ([[User talk:$3|พูดคุย]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])",
-       "editcomment": "à¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อคือ: \"''$1''\"",
+       "editcomment": "à¸\84ำอà¸\98ิà¸\9aายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82คือ: \"''$1''\"",
        "revertpage": "ย้อนการแก้ไขของ [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ไปยังรุ่นของ [[User:$1|$1]]",
        "revertpage-nouser": "ย้อนการแก้ไขโดยผู้ใช้ไม่ระบุชื่อไปยังรุ่นสุดท้ายโดย {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "ย้อนการแก้ไขโดย $1 ไปยังรุ่นล่าสุดโดย $2",
        "protectlogtext": "ด้านล่างเป็นรายการการเปลี่ยนแปลงการล็อกหน้า\nดู[[Special:ProtectedPages|รายการหน้าที่ถูกล็อก]]สำหรับการล็อกหน้าที่มีผลอยู่ในปัจจุบัน",
        "protectedarticle": "ล็อก \"[[$1]]\"",
        "modifiedarticleprotection": "เปลี่ยนระดับการล็อกของ \"[[$1]]\"",
-       "unprotectedarticle": "ยกเลิกการล็อกจาก \"[[$1]]\" แล้ว",
-       "movedarticleprotection": "ย้ายการตั้งค่าการล็อกจาก \"[[$2]]\" ไปยัง \"[[$1]]\"",
-       "protect-title": "à¸\81ำลัà¸\87ลà¹\87อà¸\81หà¸\99à¹\89า \"$1\"",
+       "unprotectedarticle": "ยกเลิกการล็อกจาก \"[[$1]]\"",
+       "movedarticleprotection": "ย้ายการตั้งค่าการล็อกจาก \"[[$2]]\" ไป \"[[$1]]\"",
+       "protect-title": "à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81สำหรัà¸\9a \"$1\"",
        "protect-title-notallowed": "ดูระดับการล็อกของ \"$1\"",
-       "prot_1movedto2": "[[$1]] ถูกเปลี่ยนชื่อเป็น [[$2]]",
+       "prot_1movedto2": "เปลี่ยนชื่อ [[$1]] เป็น [[$2]]",
        "protect-badnamespace-title": "เนมสเปซล็อกไม่ได้",
-       "protect-badnamespace-text": "หà¸\99à¹\89าà¹\83à¸\99à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\99ีà¹\89à¹\84มà¹\88สามารà¸\96à¸\9bà¹\89อà¸\87à¸\81ัà¸\99ได้",
+       "protect-badnamespace-text": "ลà¹\87อà¸\81หà¸\99à¹\89าà¹\83à¸\99à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\99ีà¹\89à¹\84มà¹\88ได้",
        "protect-norestrictiontypes-text": "หน้านี้ไม่สามารถถูกล็อก เพราะไม่มีประเภทการจำกัดที่ใช้ได้",
        "protect-norestrictiontypes-title": "หน้าที่ล็อกไม่ได้",
        "protect-legend": "ยืนยันการล็อก",
        "protect_expiry_invalid": "เวลาหมดอายุไม่ถูกต้อง",
        "protect_expiry_old": "เวลาหมดอายุผ่านมาแล้ว",
        "protect-unchain-permissions": "ปลดล็อกตัวเลือกการล็อกอื่น ๆ",
-       "protect-text": "ที่นี่คุณสามารถดูและเปลี่ยนแปลงระดับการล็อกของหน้า '''$1''' ได้",
-       "protect-locked-blocked": "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81หà¸\99à¹\89าà¸\82à¸\93ะà¸\97ีà¹\88à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\84à¸\94à¹\89 à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82อà¸\87หà¸\99à¹\89า '''$1''' คือ:",
-       "protect-locked-dblock": "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¹\84à¸\94à¹\89à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\90าà¸\99à¸\82à¹\89อมูลà¸\96ูà¸\81ลà¹\87อà¸\81 à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82อà¸\87หà¸\99à¹\89า '''$1''' คือ:",
-       "protect-locked-access": "à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81หà¸\99à¹\89า à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82อà¸\87หà¸\99à¹\89า '''$1''' คือ:",
-       "protect-cascadeon": "หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¹\80à¸\9bà¹\87à¸\99สà¹\88วà¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87{{PLURAL:$1|หน้า|หน้า}}ที่เปิดการล็อกแบบสืบทอด\nการเปลี่ยนระดับการล็อกของหน้านี้จะไม่มีผลต่อการล็อกแบบสืบทอด",
+       "protect-text": "ที่นี่คุณสามารถดูและเปลี่ยนแปลงระดับการล็อกของหน้า <strong>$1</strong> ได้",
+       "protect-locked-blocked": "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81หà¸\99à¹\89าà¸\82à¸\93ะà¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\84à¸\94à¹\89 \nà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82อà¸\87หà¸\99à¹\89า <strong>$1</strong> คือ:",
+       "protect-locked-dblock": "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81à¹\84à¸\94à¹\89à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\90าà¸\99à¸\82à¹\89อมูลà¸\81ำลัà¸\87à¸\96ูà¸\81ลà¹\87อà¸\81 \nà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82อà¸\87หà¸\99à¹\89า <strong>$1</strong> คือ:",
+       "protect-locked-access": "à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81หà¸\99à¹\89า \nà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82อà¸\87หà¸\99à¹\89า <strong>$1</strong> คือ:",
+       "protect-cascadeon": "à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81รวมอยูà¹\88à¹\83à¸\99{{PLURAL:$1|หน้า|หน้า}}ที่เปิดการล็อกแบบสืบทอด\nการเปลี่ยนระดับการล็อกของหน้านี้จะไม่มีผลต่อการล็อกแบบสืบทอด",
        "protect-default": "อนุญาตผู้ใช้ทั้งหมด",
        "protect-fallback": "อนุญาตเฉพาะผู้ใช้ที่มีสิทธิ \"$1\"",
        "protect-level-autoconfirmed": "อนุญาตเฉพาะผู้ใช้ยืนยันอัตโนมัติ",
        "protect-expiring": "หมดอายุ $1 (UTC)",
        "protect-expiring-local": "หมดอายุ $1",
        "protect-expiry-indefinite": "ไม่มีกำหนด",
-       "protect-cascade": "ล็อกหน้าที่เป็นส่วนหนึ่งของหน้านี้ (ล็อกแบบสืบทอด)",
-       "protect-cantedit": "คุณไม่สามารถเปลี่ยนระดับการล็อกของหน้านี้ เพราะคุณไม่ได้รับอนุญาตให้แก้ไขระดับการล็อก",
-       "protect-othertime": "ระยะเวลาอื่น:",
-       "protect-othertime-op": "ระยะเวลาอื่น",
-       "protect-existing-expiry": "ระยะเวลาการป้องกัน: $3, $2",
+       "protect-cascade": "ล็อกหน้าที่เป็นรวมอยู่ในหน้านี้ (ล็อกแบบสืบทอด)",
+       "protect-cantedit": "คุณไม่สามารถเปลี่ยนระดับการล็อกของหน้านี้ เพราะคุณไม่มีสิทธิแก้ไข",
+       "protect-othertime": "เวลาอื่น:",
+       "protect-othertime-op": "เวลาอื่น",
+       "protect-existing-expiry": "เวลาหมดอายุที่มีอยู่: $3, $2",
+       "protect-existing-expiry-infinity": "เวลาหมดอายุที่มีอยู่: ไม่มีกำหนด",
        "protect-otherreason": "เหตุผลอื่น/เพิ่มเติม:",
        "protect-otherreason-op": "เหตุผลอื่น",
        "protect-dropdown": "* เหตุผลการป้องกันทั่วไป\n** การก่อกวนจำนวนมาก\n** สแปมจำนวนมาก\n** สงครามการแก้ไขที่ไม่สร้างสรรค์\n** หน้าที่มีการเข้าชมมาก",
-       "protect-edit-reasonlist": "สาà¹\80หà¸\95ุà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99การแก้ไข",
+       "protect-edit-reasonlist": "สาà¹\80หà¸\95ุà¸\81ารลà¹\87อà¸\81การแก้ไข",
        "protect-expiry-options": "1 ชั่วโมง:1 hour,1 วัน:1 day,1 สัปดาห์:1 week,2 สัปดาห์:2 weeks,1 เดือน:1 month,3 เดือน:3 months,6 เดือน:6 months,1 ปี:1 year,ไม่มีกำหนด:infinite",
-       "restriction-type": "อà¸\99ุà¸\8dาà¸\95",
-       "restriction-level": "ระà¸\94ัà¸\9aà¸\81ารลà¹\87อà¸\81",
+       "restriction-type": "à¸\81ารอà¸\99ุà¸\8dาà¸\95:",
+       "restriction-level": "ระà¸\94ัà¸\9aà¸\81ารà¸\88ำà¸\81ัà¸\94:",
        "minimum-size": "ขนาดอย่างน้อย",
        "maximum-size": "ขนาดอย่างมาก",
        "pagesize": "(ไบต์)",
        "restriction-level-all": "ทุกระดับ",
        "undelete": "ดูหน้าที่ถูกลบ",
        "undeletepage": "ดูและกู้คืนหน้าที่ถูกลบ",
-       "undeletepagetitle": "'''ต่อไปนี้เป็นรุ่นการแก้ไขที่ถูกลบของ [[:$1|$1]]'''",
+       "undeletepagetitle": "<strong>ต่อไปนี้เป็นรุ่นการแก้ไขที่ถูกลบของ [[:$1|$1]]</strong>",
        "viewdeletedpage": "ดูหน้าที่ถูกลบ",
-       "undeletepagetext": "{{PLURAL:$1||$1 }}หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¹\81ลà¹\89ว à¹\81à¸\95à¹\88à¹\80à¸\99ืà¹\89อหายัà¸\87à¸\84à¸\87อยูà¹\88à¹\83à¸\99à¸\81รุà¹\81ละสามารà¸\96à¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\94à¹\89 \nà¸\81รุอาà¸\88à¸\96ูà¸\81ลà¸\9aà¹\80à¸\9bà¹\87à¸\99ระยะà¹\84à¸\94à¹\89",
-       "undelete-fieldset-title": "กู้คืนรุ่น",
-       "undeleteextrahelp": "à¸\96à¹\89าà¸\95à¹\89อà¸\87à¸\81ารà¸\81ูà¹\89à¸\9bระวัà¸\95ิà¸\82อà¸\87หà¸\99à¹\89าà¸\84ืà¸\99à¸\97ัà¹\89à¸\87หมà¸\94 à¹\84มà¹\88à¸\95à¹\89อà¸\87à¹\80ลือà¸\81à¸\81ลà¹\88อà¸\87à¹\83à¸\94à¹\80ลย à¹\81ลà¹\89วà¸\81à¸\94à¸\9bุà¹\88ม '''''à¸\81ูà¹\89à¸\84ืà¸\99'''''\nà¸\96à¹\89าà¸\95à¹\89อà¸\87à¸\81ารà¸\81ูà¹\89à¸\9bระวัà¸\95ิà¸\84ืà¸\99à¹\80à¸\89à¸\9eาะà¸\9aาà¸\87สà¹\88วà¸\99 à¹\83หà¹\89à¹\80ลือà¸\81à¸\81ลà¹\88อà¸\87à¸\97ีà¹\88มีà¸\9bระวัà¸\95ิสà¹\88วà¸\99à¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¸\81ูà¹\89 à¹\81ลà¹\89วà¸\81à¸\94'''''à¸\81ูà¹\89à¸\84ืà¸\99'''''\nà¸\81à¸\94 '''''ลà¹\89าà¸\87à¸\84à¹\88า''''' à¹\80à¸\9eืà¹\88อลà¸\9aà¸\84à¹\88าà¹\83à¸\99à¸\81ลà¹\88อà¸\87à¸\84วามà¹\80หà¹\87à¸\99à¹\81ละà¸\81ลà¹\88อà¸\87à¸\95ัวà¹\80ลือà¸\81à¸\97ัà¹\89à¸\87หมà¸\94",
-       "undeleterevisions": "$1 à¸£à¸¸à¹\88à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\96ูà¸\81à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89",
-       "undeletehistory": "à¹\80มืà¹\88อà¸\84ุà¸\93à¸\81ูà¹\89หà¸\99à¹\89าà¹\83à¸\94หà¸\99à¹\89าหà¸\99ึà¹\88à¸\87 à¸£à¸¸à¹\88à¸\99à¸\97ัà¹\89à¸\87หมà¸\94à¸\88ะà¸\96ูà¸\81à¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\9bยัà¸\87à¸\9bระวัà¸\95ิ à¸«à¸²à¸\81มีหà¸\99à¹\89าà¹\83หมà¹\88à¹\83à¸\99à¸\8aืà¹\88อà¹\80à¸\94ียวà¸\81ัà¸\99à¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99หลัà¸\87à¸\88าà¸\81à¸\81ารลà¸\9a à¸£à¸¸à¹\88à¸\99à¸\97ีà¹\88à¸\81ูà¹\89à¸\84ืà¸\99à¸\99ัà¹\89à¸\99à¸\88ะà¸\9bราà¸\81à¸\8fà¹\83à¸\99à¸\9bระวัà¸\95ิà¸\97ีà¹\88มีมาà¸\81à¹\88อà¸\99",
-       "undeleterevdel": "à¸\88ะà¸\81ูà¹\89à¸\84ืà¸\99à¹\84มà¹\88à¹\84à¸\94à¹\89หาà¸\81à¸\81ารà¸\81ูà¹\89à¸\84ืà¸\99à¸\99ัà¹\89à¸\99สà¹\88à¸\87à¸\9cลà¹\83หà¹\89รุà¹\88à¸\99ลà¹\88าสุà¸\94à¸\82อà¸\87หà¸\99à¹\89าหรือà¹\84à¸\9fลà¹\8cà¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¸\9aาà¸\87สà¹\88วà¸\99 \nà¹\83à¸\99à¸\81รà¸\93ีà¹\80à¸\8aà¹\88à¸\99à¸\99ัà¹\89à¸\99 à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¹\84มà¹\88à¹\80ลือà¸\81หรือà¹\81สà¸\94à¸\87รุà¹\88à¸\99à¹\83หมà¹\88สุà¸\94à¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¸\81à¹\88อà¸\99",
-       "undeletehistorynoadmin": "หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¹\81ลà¹\89ว\nมีสาà¹\80หà¸\95ุà¸\81ารลà¸\9aà¹\81สà¸\94à¸\87à¹\84วà¹\89à¹\83à¸\99à¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อà¸\82à¹\89าà¸\87ลà¹\88าà¸\87 à¸£à¹\88วมà¸\81ัà¸\9aรายละà¹\80อียà¸\94à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¹\80à¸\84ยà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\99ีà¹\89à¸\81à¹\88อà¸\99ลà¸\9a\nà¸\82à¹\89อà¸\84วามà¹\81à¸\97à¹\89à¸\88ริà¸\87à¸\82อà¸\87รุà¹\88à¸\99à¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¸\94ูà¹\84à¸\94à¹\89à¹\80à¸\89à¸\9eาะà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a",
+       "undeletepagetext": "{{PLURAL:$1||$1 }}หà¸\99à¹\89าà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81ลà¸\9aà¹\81ลà¹\89ว à¹\81à¸\95à¹\88à¹\80à¸\99ืà¹\89อหายัà¸\87à¸\84à¸\87อยูà¹\88à¹\83à¸\99หà¸\99à¹\88วยà¹\80à¸\81à¹\87à¸\9aà¸\96าวรà¹\81ละสามารà¸\96à¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\94à¹\89 \nหà¸\99à¹\88วยà¹\80à¸\81à¹\87à¸\9aà¸\96าวรอาà¸\88à¸\96ูà¸\81ลà¸\9aà¹\80à¸\9bà¹\87à¸\99ระยะ",
+       "undelete-fieldset-title": "กู้คืนรุ่นปรับปรุง",
+       "undeleteextrahelp": "à¹\83à¸\99à¸\81ารà¸\81ูà¹\89à¸\9bระวัà¸\95ิà¸\82อà¸\87หà¸\99à¹\89าà¸\84ืà¸\99à¸\97ัà¹\89à¸\87หมà¸\94 à¹\83หà¹\89à¹\80วà¹\89à¸\99à¸\97ุà¸\81à¸\81ลà¹\88อà¸\87à¹\81ละà¸\84ลิà¸\81 <strong><em>{{int:undeletebtn}}</em></strong>\nà¸\96à¹\89าà¸\95à¹\89อà¸\87à¸\81ารà¸\81ูà¹\89à¸\9bระวัà¸\95ิà¸\84ืà¸\99à¹\80à¸\89à¸\9eาะà¸\9aาà¸\87สà¹\88วà¸\99 à¹\83หà¹\89à¹\80ลือà¸\81à¸\81ลà¹\88อà¸\87à¸\97ีà¹\88มีà¸\9bระวัà¸\95ิสà¹\88วà¸\99à¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\81ละà¸\84ลิà¸\81 <strong><em>{{int:undeletebtn}}</em></strong>",
+       "undeleterevisions": "$1 à¸£à¸¸à¹\88à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\96ูà¸\81à¹\80à¸\81à¹\87à¸\9aà¸\96าวร",
+       "undeletehistory": "à¹\80มืà¹\88อà¸\84ุà¸\93à¸\81ูà¹\89หà¸\99à¹\89าà¸\84ืà¸\99 à¸£à¸¸à¹\88à¸\99à¸\97ัà¹\89à¸\87หมà¸\94à¸\88ะà¸\96ูà¸\81à¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\9bยัà¸\87à¸\9bระวัà¸\95ิ \nหาà¸\81มีà¸\81ารสรà¹\89าà¸\87หà¸\99à¹\89าà¹\83หมà¹\88à¸\8aืà¹\88อà¹\80à¸\94ียวà¸\81ัà¸\99หลัà¸\87à¸\81ารลà¸\9a à¸£à¸¸à¹\88à¸\99à¸\97ีà¹\88à¸\81ูà¹\89à¸\84ืà¸\99à¸\99ัà¹\89à¸\99à¸\88ะà¸\9bราà¸\81à¸\8fà¹\83à¸\99à¸\9bระวัà¸\95ิà¸\81à¹\88อà¸\99หà¸\99à¹\89า",
+       "undeleterevdel": "à¸\88ะà¹\84มà¹\88à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\81ูà¹\89à¸\84ืà¸\99หาà¸\81สà¹\88à¸\87à¸\9cลà¹\83หà¹\89รุà¹\88à¸\99à¸\9aà¸\99สุà¸\94à¸\82อà¸\87หà¸\99à¹\89าหรือà¹\84à¸\9fลà¹\8cà¸\96ูà¸\81ลà¸\9aà¸\9aาà¸\87สà¹\88วà¸\99\nà¹\83à¸\99à¸\81รà¸\93ีà¹\80à¸\8aà¹\88à¸\99à¸\99ัà¹\89à¸\99 à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¹\84มà¹\88à¹\80ลือà¸\81หรือà¹\81สà¸\94à¸\87รุà¹\88à¸\99à¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¹\83หมà¹\88สุà¸\94",
+       "undeletehistorynoadmin": "หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¸\9aà¹\81ลà¹\89ว\nสาà¹\80หà¸\95ุà¸\81ารลà¸\9aà¹\81สà¸\94à¸\87à¹\83à¸\99à¸\84วามยà¹\88อà¸\94à¹\89าà¸\99ลà¹\88าà¸\87 à¸£à¹\88วมà¸\81ัà¸\9aรายละà¹\80อียà¸\94à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¹\80à¸\84ยà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\99ีà¹\89à¸\81à¹\88อà¸\99ลà¸\9a\nà¹\80à¸\89à¸\9eาะà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\97ีà¹\88à¸\94ูà¸\82à¹\89อà¸\84วามà¹\81à¸\97à¹\89à¸\88ริà¸\87à¸\82อà¸\87รุà¹\88à¸\99à¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¹\80หลà¹\88าà¸\99ีà¹\89à¹\84à¸\94à¹\89",
        "undelete-revision": "รุ่นที่ถูกลบของหน้า $1 (ตั้งแต่ $4 เมื่อ $5) โดย $3:",
        "undeleterevision-missing": "รุ่นไม่ถูกต้องหรือสูญหาย\nคุณอาจมีลิงก์เสีย หรือรุ่นอาจถูกกู้คืนหรือนำออกจากกรุ",
        "undelete-nodiff": "ไม่พบรุ่นก่อนหน้า",
        "undeleteinvert": "กลับการเลือก",
        "undeletecomment": "เหตุผล:",
        "undeletedrevisions": "กู้คืนการแก้ไข $1 รุ่นแล้ว",
-       "undeletedrevisions-files": "$1 รุ่น และ $2 ไฟล์ถูกกู้คืน",
-       "undeletedfiles": "$1 ไฟล์ถูกกู้คืน",
+       "undeletedrevisions-files": "กู้คืน $1 รุ่นและ $2 ไฟล์แล้ว",
+       "undeletedfiles": "กู้คืน $1 ไฟล์แล้ว",
        "cannotundelete": "การกู้คืนล้มเหลว:\n$1",
-       "undeletedpage": "'''$1 ถูกกู้คืน'''\n\nดู[[Special:Log/delete|ปูมการลบ]] สำหรับรายชื่อการลบและการกู้คืนล่าสุด",
+       "undeletedpage": "<strong>กู้คืน $1 แล้ว</strong>\n\nดู[[Special:Log/delete|ปูมการลบ]] สำหรับบันทึกรายชื่อการลบและการกู้คืนล่าสุด",
        "undelete-header": "ดู [[Special:Log/delete|ปูมการลบ]] สำหรับหน้าที่ถูกลบล่าสุด",
        "undelete-search-title": "ค้นหาหน้าที่ถูกลบ",
        "undelete-search-box": "ค้นหาหน้าที่ถูกลบ",
-       "undelete-search-prefix": "à¸\84à¹\89à¸\99หาหน้าที่ขึ้นต้นด้วย:",
+       "undelete-search-prefix": "à¹\81สà¸\94à¸\87หน้าที่ขึ้นต้นด้วย:",
        "undelete-search-submit": "ค้นหา",
-       "undelete-no-results": "à¹\84มà¹\88à¸\9eà¸\9aหà¸\99à¹\89าà¸\97ีà¹\88à¸\95รà¸\87à¸\81ัà¸\99à¹\83à¸\99à¸\81รุการลบ",
+       "undelete-no-results": "à¹\84มà¹\88à¸\9eà¸\9aหà¸\99à¹\89าà¸\95รà¸\87à¸\81ัà¸\99à¹\83à¸\99หà¸\99à¹\88วยà¹\80à¸\81à¹\87à¸\9aà¸\96าวรการลบ",
        "undelete-filename-mismatch": "ไม่สามารถกู้คืนรุ่นไฟล์ที่มีตราเวลา $1: ชื่อไฟล์ไม่ตรง",
        "undelete-bad-store-key": "ไม่สามารถกู้คืนรุ่นไฟล์ที่มีตราเวลา $1: ไฟล์สูญหายก่อนถูกลบ",
-       "undelete-cleanup-error": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารลà¸\9aà¹\84à¸\9fลà¹\8cà¸\81รุà¸\97ีà¹\88ไม่ใช้แล้ว \"$1\"",
-       "undelete-missing-filearchive": "à¹\84มà¹\88สามารà¸\96à¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\9fลà¹\8cà¹\80à¸\81à¹\88าหมายà¹\80ลà¸\82 $1 à¹\80à¸\9eราะà¹\84มà¹\88มีà¸\82à¹\89อมูลà¹\83à¸\99à¸\90าà¸\99à¸\82à¹\89อมูล \nà¹\84à¸\9fลà¹\8cอาà¸\88à¸\96ูà¸\81à¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\9bแล้ว",
-       "undelete-error": "à¹\80à¸\81ิà¸\94ข้อผิดพลาดในการกู้คืนหน้า",
-       "undelete-error-short": "à¹\80à¸\81ิà¸\94ข้อผิดพลาดในการกู้คืนไฟล์: $1",
+       "undelete-cleanup-error": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารลà¸\9aà¹\84à¸\9fลà¹\8cà¹\80à¸\81à¹\87à¸\9aà¸\96าวรไม่ใช้แล้ว \"$1\"",
+       "undelete-missing-filearchive": "à¹\84มà¹\88สามารà¸\96à¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\9fลà¹\8cà¹\80à¸\81à¹\87à¸\9aà¸\96าวรหมายà¹\80ลà¸\82 $1 à¹\80à¸\9eราะà¹\84มà¹\88อยูà¹\88à¹\83à¸\99à¸\90าà¸\99à¸\82à¹\89อมูล \nà¹\84à¸\9fลà¹\8cอาà¸\88à¸\96ูà¸\81à¸\81ูà¹\89à¸\84ืà¸\99แล้ว",
+       "undelete-error": "มีข้อผิดพลาดในการกู้คืนหน้า",
+       "undelete-error-short": "มีข้อผิดพลาดในการกู้คืนไฟล์: $1",
        "undelete-error-long": "เกิดข้อผิดพลาดขณะกู้คืนไฟล์:\n\n$1",
        "undelete-show-file-confirm": "คุณแน่ใจหรือว่าต้องการดูรุ่นที่ถูกลบของไฟล์ \"<nowiki>$1</nowiki>\" ตั้งแต่ $2 เมื่อ $3",
        "undelete-show-file-submit": "ใช่",
        "sp-contributions-newbies-sub": "สำหรับบัญชีใหม่",
        "sp-contributions-newbies-title": "เรื่องที่เขียนโดยบัญชีใหม่",
        "sp-contributions-blocklog": "ปูมการบล็อก",
-       "sp-contributions-deleted": "การแก้ไขที่ถูกลบ",
+       "sp-contributions-suppresslog": "ระงับเรื่องที่ผู้ใช้เขียน",
+       "sp-contributions-deleted": "การแก้ไขของผู้ใช้ที่ถูกลบ",
        "sp-contributions-uploads": "อัปโหลด",
        "sp-contributions-logs": "ปูม",
        "sp-contributions-talk": "พูดคุย",
-       "sp-contributions-userrights": "จัดการสิทธิผู้ใช้",
-       "sp-contributions-blocked-notice": "à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีนี้ถูกบล็อก\nปูมการบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:",
+       "sp-contributions-userrights": "à¸\81ารà¸\88ัà¸\94à¸\81ารสิà¸\97à¸\98ิà¸\9cูà¹\89à¹\83à¸\8aà¹\89",
+       "sp-contributions-blocked-notice": "à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\9cูà¹\89à¹\83à¸\8aà¹\89นี้ถูกบล็อก\nปูมการบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:",
        "sp-contributions-blocked-notice-anon": "ปัจจุบันเลขที่อยู่ไอพีนี้ถูกบล็อก\nปูมการบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:",
        "sp-contributions-search": "ค้นหาการแก้ไข",
        "sp-contributions-username": "เลขที่อยู่ไอพีหรือชื่อผู้ใช้:",
        "sp-contributions-newonly": "แสดงเฉพาะการแก้ไขที่เป็นการสร้างหน้า",
        "sp-contributions-submit": "ค้นหา",
        "whatlinkshere": "หน้าที่ลิงก์มา",
-       "whatlinkshere-title": "หน้าที่ลิงก์มายัง \"$1\"",
+       "whatlinkshere-title": "หน้าที่ลิงก์มา \"$1\"",
        "whatlinkshere-page": "หน้า:",
-       "linkshere": "หน้าต่อไปนี้ลิงก์มายัง '''[[:$1]]''':",
-       "nolinkshere": "ไม่มีหน้าใดลิงก์มาที่ '''[[:$1]]'''",
-       "nolinkshere-ns": "ไม่มีหน้าใดลิงก์มาที่'''[[:$1]]''' ในเนมสเปซที่เลือกไว้",
+       "linkshere": "หน้าต่อไปนี้ลิงก์มา <strong>[[:$1]]</strong>:",
+       "nolinkshere": "ไม่มีหน้าใดลิงก์มา <strong>[[:$1]]</strong>",
+       "nolinkshere-ns": "ไม่มีหน้าใดลิงก์มา <strong>[[:$1]]</strong> ในเนมสเปซที่เลือก",
        "isredirect": "หน้าเปลี่ยนทาง",
        "istemplate": "รวมอยู่",
        "isimage": "ลิงก์ไฟล์",
-       "whatlinkshere-prev": "{{PLURAL:$1|ก่อนหน้า|ก่อนหน้า $1 หน้า}}",
-       "whatlinkshere-next": "{{PLURAL:$1|ถัดไป|ถัดไป $1 หน้า}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|ก่อนหน้า|ก่อนหน้า $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|ถัดไป|ถัดไป $1}}",
        "whatlinkshere-links": "← ลิงก์",
        "whatlinkshere-hideredirs": "$1หน้าเปลี่ยนทาง",
        "whatlinkshere-hidetrans": "$1 ถูกรวมอยู่",
        "blockip": "บล็อกผู้ใช้",
        "blockip-legend": "บล็อกผู้ใช้",
        "blockiptext": "ใช้แบบด้านล่างเพื่อบล็อกสิทธิเข้าถึงการเขียนของเลขที่อยู่ไอพีหรือชื่อผู้ใช้โดยเจาะจง การบล็อกนี้ควรดำเนินการเพื่อป้องกันการก่อกวนเท่านั้น และให้สอดคล้องกับ[[{{MediaWiki:Policy-url}}|นโยบาย]]\nกรอกเหตุผลโดยเจาะจงด้านล่าง (เช่น อ้างถึงหน้าที่ถูกก่อกวน)",
-       "ipaddressorusername": "เลขที่อยู่ไอพีหรือชื่อผู้ใช้",
-       "ipbexpiry": "หมดอายุ",
+       "ipaddressorusername": "เลขที่อยู่ไอพีหรือชื่อผู้ใช้:",
+       "ipbexpiry": "หมดอายุ:",
        "ipbreason": "เหตุผล:",
        "ipbreason-dropdown": "*สาเหตุการบล็อกทั่วไป\n** ใส่ข้อมูลเท็จ\n** ลบเนื้อหาในหน้าออก\n** ใส่ลิงก์สแปม\n** ใส่ข้อความไร้สาระ/ขยะเข้ามา\n** พฤติกรรมข่มขู่/รังควาน\n** ใช้หลายบัญชีในทางที่ผิด\n** ชื่อผู้ใช้ที่ไม่อาจยอมรับได้",
        "ipb-hardblock": "ป้องกันไม่ให้ผู้ใช้ล็อกอินแก้ไขจากเลขที่อยู่ไอพีนี้",
        "ipbemailban": "ป้องกันมิให้ผู้ใช้ส่งอีเมล",
        "ipbenableautoblock": "บล็อกเลขที่อยู่ไอพีล่าสุดที่ผู้ใช้นี้ใช้ ทั้งทุกเลขที่อยู่ไอพีที่ผู้นั้นพยายามใช้แก้ไขโดยอัตโนมัติ",
        "ipbsubmit": "บล็อกผู้ใช้นี้",
-       "ipbother": "เวลาอื่น",
+       "ipbother": "เวลาอื่น:",
        "ipboptions": "2 ชั่วโมง:2 hours,1 วัน:1 day,3 วัน:3 days,1 สัปดาห์:1 week,2 สัปดาห์:2 weeks,1 เดือน:1 month,3 เดือน:3 months,6 เดือน:6 months,1 ปี:1 year,ไม่มีกำหนด:infinite",
-       "ipbhidename": "à¸\8bà¹\88อà¸\99à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\88าà¸\81à¸\9bูมและรายการต่าง ๆ",
-       "ipbwatchuser": "à¹\80à¸\9dà¹\89าà¸\94ูหà¸\99à¹\89าà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\81ละหà¸\99à¹\89าà¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89รายà¸\99ีà¹\89",
+       "ipbhidename": "à¸\8bà¹\88อà¸\99à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\88าà¸\81à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82และรายการต่าง ๆ",
+       "ipbwatchuser": "เฝ้าดูหน้าผู้ใช้และหน้าคุยกับผู้ใช้ของผู้ใช้นี้",
        "ipb-disableusertalk": "ป้องกันไม่ให้ผู้ใช้นี้แก้ไขหน้าคุยกับผู้ใช้ของตัวเองขณะถูกบล็อก",
        "ipb-change-block": "บล็อกผู้ใช้อีกครั้งด้วยการตั้งค่าเหล่านี้",
        "ipb-confirm": "ยืนยันการบล็อก",
        "badipaddress": "เลขที่อยู่ไอพีไม่ถูกต้อง",
        "blockipsuccesssub": "บล็อกสำเร็จ",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] ได้ถูกบล็อกแล้ว<br />\nดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อก",
+       "blockipsuccesstext": "บล็อก [[Special:Contributions/$1|$1]] แล้ว<br />\nดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อก",
        "ipb-blockingself": "คุณกำลังบล็อกตัวเอง! แน่ใจแล้วหรือว่าต้องการทำอย่างนั้น",
        "ipb-confirmhideuser": "คุณกำลังบล็อกผู้ใช้โดยเป็นผู้ใช้ \"ซ่อนผู้ใช้\" ซึ่งจะระงับชื่อผู้ใช้ในรายการและหน่วยปูมทั้งหมด คุณแน่ใจหรือว่าต้องการดำเนินการเช่นนั้น",
-       "ipb-confirmaction": "หากคุณแน่ใจว่าคุณต้องการดำเนินการ โปรดเลือกเขตข้อมูล \"{{int:ipb-confirm}}\"  ที่อยู่ล่างสุด",
+       "ipb-confirmaction": "หากคุณแน่ใจว่าคุณต้องการดำเนินการ โปรดเลือกเขตข้อมูล \"{{int:ipb-confirm}}\" ที่อยู่ล่างสุด",
        "ipb-edit-dropdown": "แก้ไขสาเหตุการบล็อก",
        "ipb-unblock-addr": "ปลดบล็อก $1",
        "ipb-unblock": "ปลดบล็อกผู้ใช้หรือเลขที่อยู่ไอพี",
-       "ipb-blocklist": "à¸\94ูà¸\81ารà¸\9aลà¹\87อà¸\81à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99",
-       "ipb-blocklist-contribs": "à¸\9cลà¸\87าà¸\99เขียนโดย $1",
+       "ipb-blocklist": "à¸\94ูà¸\81ารà¸\9aลà¹\87อà¸\81à¸\97ีà¹\88มีอยูà¹\88",
+       "ipb-blocklist-contribs": "à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88เขียนโดย $1",
        "unblockip": "ปลดบล็อกผู้ใช้",
-       "unblockiptext": "à¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9eืà¹\88อà¸\84ืà¸\99สิà¸\97à¸\98ิà¸\81ารà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¸\81ารà¹\80à¸\82ียà¸\99à¹\81à¸\81à¹\88à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี à¸«à¸£à¸·à¸­à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¹\80à¸\84ยà¸\96ูà¸\81à¸\9aลà¹\87อà¸\81",
+       "unblockiptext": "ใช้แบบด้านล่างเพื่อคืนการเข้าถึงการเขียนแก่เลขที่อยู่ไอพี หรือชื่อผู้ใช้ที่เคยถูกบล็อก",
        "ipusubmit": "ยกเลิกการบล็อกนี้",
-       "unblocked": "[[User:$1|$1]] ถูกปลดบล็อกแล้ว",
-       "unblocked-range": "$1 ถูกปลดบล็อกแล้ว",
-       "unblocked-id": "เลิกบล็อก $1",
+       "unblocked": "ปลดบล็อก [[User:$1|$1]] แล้ว",
+       "unblocked-range": "ปลดบล็อก $1 แล้ว",
+       "unblocked-id": "เลิกบล็อก $1 แล้ว",
+       "unblocked-ip": "ปลดบล็อก [[Special:Contributions/$1|$1]] แล้ว",
        "blocklist": "ผู้ใช้ที่ถูกบล็อก",
        "ipblocklist": "ผู้ใช้ที่ถูกบล็อก",
        "ipblocklist-legend": "ค้นหาผู้ใช้ที่ถูกบล็อก",
-       "blocklist-userblocks": "ซ่อนบล็อกบัญชี",
-       "blocklist-tempblocks": "ซ่อนบล็อกชั่วคราว",
-       "blocklist-addressblocks": "ซ่อนบล็อกไอพีเดียว",
+       "blocklist-userblocks": "à¸\8bà¹\88อà¸\99à¸\81ารà¸\9aลà¹\87อà¸\81à¸\9aัà¸\8dà¸\8aี",
+       "blocklist-tempblocks": "à¸\8bà¹\88อà¸\99à¸\81ารà¸\9aลà¹\87อà¸\81à¸\8aัà¹\88วà¸\84ราว",
+       "blocklist-addressblocks": "à¸\8bà¹\88อà¸\99à¸\81ารà¸\9aลà¹\87อà¸\81à¹\84อà¸\9eีà¹\80à¸\94ียว",
        "blocklist-rangeblocks": "ซ่อนการบล็อกช่วง",
        "blocklist-timestamp": "ตราเวลา",
        "blocklist-target": "เป้าหมาย",
        "ipblocklist-otherblocks": "{{PLURAL:$1|การบล็อก}}อื่น",
        "infiniteblock": "ไม่มีกำหนด",
        "expiringblock": "หมดอายุ $1 เวลา $2",
-       "anononlyblock": "à¹\84มà¹\88ลà¹\87อà¸\81อิà¸\99à¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99",
-       "noautoblockblock": "ยà¸\81à¹\80ลิà¸\81การบล็อกอัตโนมัติ",
-       "createaccountblock": "ปิดใช้งานการสร้างบัญชีผู้ใช้ใหม่",
+       "anononlyblock": "à¹\80à¸\89à¸\9eาะà¸\99ิรà¸\99าม",
+       "noautoblockblock": "à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99การบล็อกอัตโนมัติ",
+       "createaccountblock": "ปิดใช้งานการสร้างบัญชี",
        "emailblock": "ปิดใช้งานอีเมล",
        "blocklist-nousertalk": "ไม่สามารถแก้ไขหน้าคุยกับผู้ใช้ของตนเอง",
        "ipblocklist-empty": "รายการบล็อกว่าง",
-       "ipblocklist-no-results": "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีหรือà¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\84มà¹\88à¹\84à¸\94à¹\89ถูกบล็อก",
+       "ipblocklist-no-results": "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีหรือà¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\82อà¹\84มà¹\88ถูกบล็อก",
        "blocklink": "บล็อก",
-       "unblocklink": "à¹\80ลิà¸\81บล็อก",
+       "unblocklink": "à¸\9bลà¸\94บล็อก",
        "change-blocklink": "เปลี่ยนการบล็อก",
        "contribslink": "เรื่องที่เขียน",
        "emaillink": "ส่งอีเมล",
        "autoblocker": "ถูกบล็อกอัตโนมัติเนื่องจาก \"[[User:$1|$1]]\" ใช้เลขที่อยู่ไอพีของคุณเมื่อเร็ว ๆ นี้\nเหตุผลที่ให้แก่การบล็อก $1 คือ: \"$2\"",
        "blocklogpage": "ปูมการบล็อก",
-       "blocklog-showlog": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¸\96ูà¸\81สà¸\81ัà¸\94à¸\81ัà¹\89à¸\99มาà¸\81à¹\88อà¸\99\nà¸\9bูมà¸\81ารสà¸\81ัà¸\94à¸\81ัà¹\89à¸\99แสดงไว้ด้านล่างนี้เพื่อการอ้างอิง:",
-       "blocklog-showsuppresslog": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¸\96ูà¸\81สà¸\81ัà¸\94à¸\81ัà¹\89à¸\99à¹\81ละà¸\96ูà¸\81à¸\8bà¹\88อà¸\99มาà¸\81่อน\nปูมการระงับแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง:",
-       "blocklogentry": "บล็อก \"[[$1]]\" หมดอายุ $2 $3",
+       "blocklog-showlog": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¹\80à¸\84ยà¸\96ูà¸\81à¸\9aลà¹\87อà¸\81\nà¸\9bูมà¸\81ารà¸\9aลà¹\87อà¸\81แสดงไว้ด้านล่างนี้เพื่อการอ้างอิง:",
+       "blocklog-showsuppresslog": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\81ละà¸\8b่อน\nปูมการระงับแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง:",
+       "blocklogentry": "บล็อก [[$1]] หมดอายุ $2 $3",
        "reblock-logentry": "เปลี่ยนระดับการบล็อกสำหรับ [[$1]] หมดอายุ $2 $3",
        "blocklogtext": "นี่คือปูมการบล็อกและการเลิกบล็อกผู้ใช้\nการบล็อกที่อยู่ไอพีโดยอัตโนมัติจะไม่แสดงในรายการ\nดู[[Special:BlockList|รายการบล็อกไอพี]]สำหรับการบล็อกและการระงับในปัจจุบัน",
-       "unblocklogentry": "à¹\80ลิà¸\81บล็อก $1",
-       "block-log-flags-anononly": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99ามà¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99",
+       "unblocklogentry": "à¸\9bลà¸\94บล็อก $1",
+       "block-log-flags-anononly": "à¹\80à¸\89à¸\9eาะà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99าม",
        "block-log-flags-nocreate": "ปิดใช้งานการสร้างบัญชี",
        "block-log-flags-noautoblock": "ปิดใช้งานการบล็อกอัตโนมัติ",
        "block-log-flags-noemail": "ปิดใช้งานอีเมล",
        "block-log-flags-nousertalk": "ไม่สามารถแก้ไขหน้าพูดคุยของตนเอง",
        "block-log-flags-angry-autoblock": "การบล็อกอัตโนมัติขั้นสูงเปิดใช้งาน",
        "block-log-flags-hiddenname": "ชื่อผู้ใช้ถูกซ่อน",
-       "range_block_disabled": "à¸\81ารà¸\9aลà¹\87อà¸\81à¸\8aà¹\88วà¸\87à¹\84อà¸\9eีà¸\82อà¸\87à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\96ูà¸\81à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99",
-       "ipb_expiry_invalid": "วัà¸\99หมดอายุไม่ถูกต้อง",
+       "range_block_disabled": "การบล็อกช่วงไอพีของผู้ดูแลระบบถูกปิดใช้งาน",
+       "ipb_expiry_invalid": "à¹\80วลาหมดอายุไม่ถูกต้อง",
        "ipb_expiry_temp": "การบล็อกชื่อผู้ใช้ที่ซ่อนต้องเป็นการบล็อกถาวร",
        "ipb_hide_invalid": "ไม่สามารถยับยั้งชื่อผู้ใช้นี้ได้ อาจเพราะมีการแก้ไขมากกว่า $1 การแก้ไข",
-       "ipb_already_blocked": "\"$1\" à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\84à¸\9bà¹\81ลà¹\89วà¸\81à¹\88อà¸\99หà¸\99à¹\89าà¸\99ีà¹\89",
+       "ipb_already_blocked": "\"$1\" à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\81ลà¹\89ว",
        "ipb-needreblock": "$1 ถูกบล็อกแล้ว คุณต้องการเปลี่ยนการตั้งค่าหรือไม่",
-       "ipb-otherblocks-header": "{{PLURAL:$1|การบล็อก}}อื่น ๆ",
-       "unblock-hideuser": "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96ยà¸\81à¹\80ลิà¸\81à¸\81ารà¸\9aลà¹\87อà¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\87าà¸\99รายนี้ได้ เพราะชื่อผู้ใช้ถูกซ่อนอยู่",
-       "ipb_cant_unblock": "à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94: à¹\84มà¹\88à¸\9eà¸\9aหมายà¹\80ลà¸\82à¸\9aลà¹\87อà¸\81 $1 à¸\81ารà¸\9aลà¹\87อà¸\81à¸\94ัà¸\87à¸\81ลà¹\88าวอาจถูกปลดบล็อกแล้ว",
-       "ipb_blocked_as_range": "à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94: à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี $1 à¸¡à¸´à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\82à¸\94ยà¸\95รà¸\87à¹\81ละà¹\84มà¹\88สามารà¸\96à¸\9bลà¸\94à¸\9aลà¹\87อà¸\81à¹\84à¸\94à¹\89\nอยà¹\88าà¸\87à¹\84รà¸\81à¹\87à¸\95าม à¹\84อà¸\9eีà¸\99ีà¹\89à¸\96ูà¸\81ระà¸\87ัà¸\9aà¹\83à¸\99à¸\90าà¸\99ะà¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99สà¹\88วà¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¹\83à¸\99à¸\9eิสัย $2 ซึ่งสามารถปลดบล็อกได้",
+       "ipb-otherblocks-header": "{{PLURAL:$1|การบล็อก}}อื่น",
+       "unblock-hideuser": "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¸\9bลà¸\94à¸\9aลà¹\87อà¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89นี้ได้ เพราะชื่อผู้ใช้ถูกซ่อนอยู่",
+       "ipb_cant_unblock": "à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94: à¹\84มà¹\88à¸\9eà¸\9aà¸\81ารà¸\9aลà¹\87อà¸\81หมายà¹\80ลà¸\82 $1 อาจถูกปลดบล็อกแล้ว",
+       "ipb_blocked_as_range": "à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94: à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี $1 à¸¡à¸´à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\82à¸\94ยà¸\95รà¸\87à¹\81ละà¹\84มà¹\88สามารà¸\96à¸\9bลà¸\94à¸\9aลà¹\87อà¸\81à¹\84à¸\94à¹\89\nอยà¹\88าà¸\87à¹\84รà¸\81à¹\87à¸\95าม à¹\84อà¸\9eีà¸\99ีà¹\89à¸\96ูà¸\81ระà¸\87ัà¸\9aà¹\82à¸\94ยà¹\80à¸\9bà¹\87à¸\99สà¹\88วà¸\99หà¸\99ึà¹\88à¸\87à¸\82อà¸\87à¸\8aà¹\88วà¸\87 $2 ซึ่งสามารถปลดบล็อกได้",
        "ip_range_invalid": "พิสัยไอพีไม่ถูกต้อง",
        "ip_range_toolarge": "พิสัยบล็อกที่มีขนาดใหญ่กว่า /$1 จะไม่ได้รับอนุญาต",
        "proxyblocker": "ตัวบล็อกพร็อกซี",
        "unlockdb": "ปลดล็อกฐานข้อมูล",
        "lockdbtext": "เมื่อล็อกฐานข้อมูลจะส่งผลให้ไม่สามารถแก้ไขทุกหน้า หรือแม้แต่เปลี่ยนแปลงการตั้งค่า ตรวจสอบให้แน่ใจว่าต้องการล็อกฐานข้อมูล และอย่าลืมปลดล็อกเมื่อตรวจสอบฐานข้อมูลเรียบร้อย",
        "unlockdbtext": "เมื่อปลดล็อกฐานข้อมูลจะส่งผลให้ ผู้ใช้สามารถเริ่มแก้ไขหน้าได้เหมือนเดิม รวมถึงการตั้งค่าทุกอย่าง ตรวจสอบให้แน่ใจว่าต้องการปลดล็อกฐานข้อมูล",
-       "lockconfirm": "ยืà¸\99ยัà¸\99 ต้องการล็อกฐานข้อมูล",
-       "unlockconfirm": "ยืà¸\99ยัà¸\99 ต้องการปลดล็อกฐานข้อมูล",
+       "lockconfirm": "à¹\83à¸\8aà¹\88 à¸\89ัà¸\99ต้องการล็อกฐานข้อมูล",
+       "unlockconfirm": "à¹\83à¸\8aà¹\88 à¸\89ัà¸\99ต้องการปลดล็อกฐานข้อมูล",
        "lockbtn": "ล็อกฐานข้อมูล",
        "unlockbtn": "ปลดล็อกฐานข้อมูล",
        "locknoconfirm": "ค่าตัวเลือกไม่ได้ถูกเลือก",
        "movenotallowedfile": "คุณไม่มีสิทธิย้ายไฟล์",
        "cant-move-user-page": "คุณไม่มีสิทธิย้ายหน้าผู้ใช้ (แยกจากหน้าย่อย)",
        "cant-move-to-user-page": "คุณไม่มีสิทธิย้ายหน้าใด ๆ ไปเป็นหน้าผู้ใช้ (ยกเว้นหน้าย่อยของผู้ใช้)",
-       "newtitle": "ชื่อเรื่องใหม่:",
+       "newtitle": "à¹\84à¸\9bà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88:",
        "move-watch": "เฝ้าดูหน้าต้นทางและหน้าปลายทาง",
        "movepagebtn": "เปลี่ยนชื่อ",
        "pagemovedsub": "เปลี่ยนชื่อสำเร็จ",
-       "movepage-moved": "'''\"$1\" ถูกเปลี่ยนชื่อเป็น \"$2\"'''",
-       "movepage-moved-redirect": "หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99",
+       "movepage-moved": "<strong>เปลี่ยนชื่อ \"$1\" เป็น \"$2\" แล้ว</strong>",
+       "movepage-moved-redirect": "สรà¹\89าà¸\87หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¹\81ลà¹\89ว",
        "movepage-moved-noredirect": "การสร้างหน้าเปลี่ยนทางถูกระงับ",
        "articleexists": "หน้าที่ต้องการมีอยู่แล้ว หรือชื่อที่เลือกไม่ถูกต้อง กรุณาเลือกชื่อใหม่",
        "cantmove-titleprotected": "คุณไม่สามารถเปลี่ยนชื่อหน้าเป็นชื่อนี้ได้ เนื่องจากชื่อเรื่องใหม่ถูกป้องกันมิให้สร้าง",
-       "movetalk": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\9eรà¹\89อมà¸\81ัà¸\99",
-       "move-subpages": "ยà¹\89ายหà¸\99à¹\89ายà¹\88อยà¸\97ัà¹\89à¸\87หมà¸\94 (มาà¸\81à¸\96ึà¸\87 $1 หน้า)",
-       "move-talk-subpages": "ยà¹\89ายหà¸\99à¹\89ายà¹\88อยà¸\97ัà¹\89à¸\87หมà¸\94à¸\82อà¸\87หà¸\99à¹\89าอภิà¸\9bราย (มาà¸\81à¸\96ึà¸\87 $1 หน้า)",
-       "movepage-page-exists": "หà¸\99à¹\89า $1 à¸¡à¸µà¸­à¸¢à¸¹à¹\88à¹\81ลà¹\89วà¹\81ละà¹\84มà¹\88สามารà¸\96à¹\80à¸\82ียà¸\99à¸\97ัà¸\9aà¹\84à¸\94à¹\89à¹\82à¸\94ยอัตโนมัติ",
-       "movepage-page-moved": "หà¸\99à¹\89า $1 à¸\96ูà¸\81à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\80à¸\9bà¹\87à¸\99 $2",
-       "movepage-page-unmoved": "หà¸\99à¹\89า $1 à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\80à¸\9bà¹\87à¸\99 $2 à¹\84à¸\94à¹\89",
-       "movepage-max-pages": "หà¸\99à¹\89า $1 à¸«à¸\99à¹\89าà¸\96ูà¸\81ยà¹\89ายà¹\84à¸\9b à¸\8bึà¹\88à¸\87มาà¸\81สุà¸\94à¹\81ลà¹\89ว à¹\81ละà¸\88ะà¹\84มà¹\88มีหà¸\99à¹\89าà¹\83à¸\94ยà¹\89ายอัà¸\95à¹\82à¸\99มัà¸\95ิà¹\80à¸\9eิà¹\88ม",
+       "movetalk": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\97ีà¹\88สัมà¸\9eัà¸\99à¸\98à¹\8c",
+       "move-subpages": "ยà¹\89ายหà¸\99à¹\89ายà¹\88อยà¸\97ัà¹\89à¸\87หมà¸\94 (มาà¸\81สุà¸\94 $1 หน้า)",
+       "move-talk-subpages": "ยà¹\89ายหà¸\99à¹\89ายà¹\88อยà¸\97ัà¹\89à¸\87หมà¸\94à¸\82อà¸\87หà¸\99à¹\89าอภิà¸\9bราย (มาà¸\81สุà¸\94 $1 หน้า)",
+       "movepage-page-exists": "มีหà¸\99à¹\89า $1 à¸­à¸¢à¸¹à¹\88à¹\81ลà¹\89วà¹\81ละà¹\84มà¹\88สามารà¸\96à¸\9aัà¸\99à¸\97ึà¸\81à¸\97ัà¸\9aอัตโนมัติ",
+       "movepage-page-moved": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89า $1 à¹\80à¸\9bà¹\87à¸\99 $2 à¹\81ลà¹\89ว",
+       "movepage-page-unmoved": "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89า $1 à¹\80à¸\9bà¹\87à¸\99 $2",
+       "movepage-max-pages": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89ามาà¸\81สุà¸\94 $1 à¸«à¸\99à¹\89าà¹\81ลà¹\89วà¹\81ละà¸\88ะà¹\84มà¹\88à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าà¹\80à¸\9eิà¹\88มอีà¸\81อัà¸\95à¹\82à¸\99มัà¸\95ิ",
        "movelogpage": "ปูมการเปลี่ยนชื่อ",
        "movelogpagetext": "ด้านล่างเป็นรายการการเปลี่ยนชื่อทั้งหมด",
        "movesubpage": "{{PLURAL:$1|หน้าย่อย|หน้าย่อย}}",
        "movereason": "เหตุผล:",
        "revertmove": "ย้อน",
        "delete_and_move": "ลบและย้าย",
-       "delete_and_move_text": "== ต้องการลบ ==\nมีหน้าปลายทาง \"[[:$1]]\" แล้ว คุณต้องการลบหน้าดังกล่าวเพื่อสร้างหนทางที่จะย้ายหรือไม่?",
-       "delete_and_move_confirm": "à¹\83à¸\8aà¹\88 à¸\95à¹\89อà¸\87à¸\81ารà¸\88ะลà¸\9aà¹\81ละยà¹\89าย",
-       "delete_and_move_reason": "ลà¸\9aà¹\80à¸\9eืà¹\88อสรà¹\89าà¸\87หà¸\99à¸\97าà¸\87à¸\97ีà¹\88à¸\88ะย้ายจาก \"[[$1]]\"",
-       "selfmove": "à¸\8aืà¹\88อหà¸\99à¹\89าà¸\95à¹\89à¸\99à¸\97าà¸\87à¹\81ละà¸\9bลายà¸\97าà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¹\80à¸\94ียวà¸\81ัà¸\99 à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\84à¸\94à¹\89มาใช้ชื่อเดิมได้",
+       "delete_and_move_text": "== ต้องการลบ ==\nมีหน้าปลายทาง \"[[:$1]]\" แล้ว \nคุณต้องการลบหน้าดังกล่าวเพื่อสร้างหนทางสำหรับการย้ายหรือไม่",
+       "delete_and_move_confirm": "à¹\83à¸\8aà¹\88 à¸¥à¸\9aหà¸\99à¹\89าà¸\99ัà¹\89à¸\99",
+       "delete_and_move_reason": "à¸\96ูà¸\81ลà¸\9aà¹\80à¸\9eืà¹\88อสรà¹\89าà¸\87หà¸\99à¸\97าà¸\87สำหรัà¸\9aà¸\81ารย้ายจาก \"[[$1]]\"",
+       "selfmove": "à¸\8aืà¹\88อหà¸\99à¹\89าà¸\95à¹\89à¸\99à¸\97าà¸\87à¹\81ละà¸\9bลายà¸\97าà¸\87à¹\80หมือà¸\99à¸\81ัà¸\99\nà¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อมาใช้ชื่อเดิมได้",
        "immobile-source-namespace": "ไม่สามารถเปลี่ยนชื่อหน้าในเนมสเปซ \"$1\"",
-       "immobile-target-namespace": "à¹\84มà¹\88สามารà¸\96ยà¹\89ายหà¸\99à¹\89าà¹\84à¸\9bยัà¸\87เนมสเปซ \"$1\" ได้",
-       "immobile-target-namespace-iw": "à¹\84มà¹\88สามารà¸\96ยà¹\89ายà¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\9bลายà¸\97าà¸\87à¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99ลิà¸\87à¸\81à¹\8c interwiki à¹\84à¸\94à¹\89",
-       "immobile-source-page": "หน้านี้ไม่สามารถเปลี่ยนชื่อได้",
-       "immobile-target-page": "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¹\84à¸\9bยัà¸\87à¸\8aืà¹\88อà¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81ารà¹\84à¸\94à¹\89",
+       "immobile-target-namespace": "à¹\84มà¹\88สามารà¸\96ยà¹\89ายหà¸\99à¹\89าà¹\80à¸\82à¹\89าเนมสเปซ \"$1\" ได้",
+       "immobile-target-namespace-iw": "ลิà¸\87à¸\81à¹\8cà¸\82à¹\89ามà¹\82à¸\84รà¸\87à¸\81ารมิà¹\83à¸\8aà¹\88à¹\80à¸\9bà¹\89าหมายà¸\97ีà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87à¸\82อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89า",
+       "immobile-source-page": "หน้านี้ไม่สามารถเปลี่ยนชื่อ",
+       "immobile-target-page": "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\9bลายà¸\97าà¸\87à¸\99ัà¹\89à¸\99",
        "imagenocrossnamespace": "ไม่สามารถย้ายไฟล์ไปยังเนมสเปซอื่น",
        "nonfile-cannot-move-to-file": "ไม่สามารถย้ายจากเนมสเปซอื่นมาเป็นเนมสเปซไฟล์",
-       "imagetypemismatch": "à¸\99ามสà¸\81ุลà¸\82อà¸\87à¹\84à¸\9fลà¹\8cà¹\83หมà¹\88à¹\84มà¹\88à¸\95รà¸\87à¸\81ัà¸\9aà¸\8aà¸\99ิà¸\94à¸\82อà¸\87à¹\84à¸\9fลà¹\8c",
+       "imagetypemismatch": "à¸\99ามสà¸\81ุลà¹\84à¸\9fลà¹\8cà¹\83หมà¹\88à¹\84มà¹\88à¸\95รà¸\87à¸\81ัà¸\9aà¸\8aà¸\99ิà¸\94",
        "imageinvalidfilename": "ชื่อไฟล์เป้าหมายไม่ถูกต้อง",
-       "fix-double-redirects": "อัà¸\9bà¹\80à¸\94à¸\95หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\97ุà¸\81หà¸\99à¹\89าà¸\97ีà¹\88à¹\82อà¸\99à¹\84à¸\9bยัà¸\87à¸\8aืà¹\88อเดิม",
+       "fix-double-redirects": "à¸\9bรัà¸\9aà¸\97ุà¸\81หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\97ีà¹\88à¸\8aีà¹\89à¹\84à¸\9bยัà¸\87à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87เดิม",
        "move-leave-redirect": "สร้างหน้าเปลี่ยนทางตามมา",
        "protectedpagemovewarning": "'''คำเตือน:''' หน้านี้ถูกล็อก เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้นที่ย้ายได้\nปูมการป้องกันล่าสุดถูกแสดงไว้ด้านล่างเพื่อการอ้างอิง:",
        "semiprotectedpagemovewarning": "'''หมายเหตุ:''' หน้านี้ถูกล็อก เฉพาะผู้ใช้ลงทะเบียนเท่านั้นที่ย้ายได้\nรายการปูมล่าสุดได้ถูกแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง:",
        "allmessagesnotsupportedDB": "หน้านี้ไม่สามารถใช้งานได้เนื่องจาก '''$wgUseDatabaseMessages''' ถูกระงับการใช้งาน",
        "allmessages-filter-legend": "กรอง",
        "allmessages-filter": "กรองตามสถานะที่เลือก:",
-       "allmessages-filter-unmodified": "à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82",
+       "allmessages-filter-unmodified": "à¹\84มà¹\88à¸\94ัà¸\94à¹\81à¸\9bร",
        "allmessages-filter-all": "ทั้งหมด",
-       "allmessages-filter-modified": "มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82",
+       "allmessages-filter-modified": "à¸\94ัà¸\94à¹\81à¸\9bร",
        "allmessages-prefix": "กรองด้วยคำขึ้นต้น:",
        "allmessages-language": "ภาษา:",
        "allmessages-filter-submit": "ไป",
-       "allmessages-filter-translate": "à¸\81ารà¹\81à¸\9bล",
+       "allmessages-filter-translate": "แปล",
        "thumbnail-more": "ขยาย",
        "filemissing": "ไฟล์สูญหาย",
-       "thumbnail_error": "à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาà¹\84มà¹\88สามารà¸\96à¸\97ำรูà¸\9bยà¹\88อà¹\84à¸\94à¹\89: $1",
+       "thumbnail_error": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารสรà¹\89าà¸\87รูà¸\9bยà¹\88อ: $1",
        "djvu_page_error": "หน้าเดจาวู (DjVu) เกินขนาด",
        "djvu_no_xml": "ไม่สามารถส่งเอกซ์เอ็มแอล (XML) สำหรับไฟล์เดจาวู (DjVu)",
-       "thumbnail_invalid_params": "à¸\9eารามิà¹\80à¸\95อรà¹\8cà¸\82อà¸\87à¸\98ัมà¸\9aà¹\8cà¹\80à¸\99ลไม่ถูกต้อง",
-       "thumbnail_dest_directory": "à¹\84มà¹\88สามารà¸\96สรà¹\89าà¸\87à¹\84à¸\94à¹\80รà¸\81à¸\97อรีภาà¸\9eà¹\84à¸\94à¹\89",
+       "thumbnail_invalid_params": "à¸\9eารามิà¹\80à¸\95อรà¹\8cรูà¸\9bยà¹\88อไม่ถูกต้อง",
+       "thumbnail_dest_directory": "à¹\84มà¹\88สามารà¸\96สรà¹\89าà¸\87สารà¸\9aà¸\9aà¸\9bลายà¸\97าà¸\87",
        "thumbnail_image-type": "ไม่รองรับรูปแบบของไฟล์รูปภาพนี้",
        "thumbnail_gd-library": "การตั้งค่าไลบรารี GD ไม่สมบูรณ์: ไม่พบฟังก์ชัน $1",
-       "thumbnail_image-missing": "à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\80หมือà¸\99à¸\88ะหายà¹\84à¸\9b: $1",
+       "thumbnail_image-missing": "ไฟล์ที่เหมือนหายไป: $1",
        "import": "หน้านำเข้า",
        "importinterwiki": "นำเข้าข้ามวิกิ",
        "import-interwiki-text": "เลือกวิกิและชื่อหัวข้อที่ต้องการนำเข้า วันที่และชื่อผู้เขียนทั้งหมดจะถูกเก็บไว้ โดยการนำเข้าทุกส่วนจะถูกเก็บไว้ใน [[Special:Log/import|ปูมการนำเข้า]]",
-       "import-interwiki-source": "หน้า/วิกิต้นทาง:",
+       "import-interwiki-sourcewiki": "วิกิต้นทาง:",
+       "import-interwiki-sourcepage": "หน้าต้นทาง:",
        "import-interwiki-history": "คัดลอกประวัติทั้งหมดในหน้านี้",
        "import-interwiki-templates": "รวมแม่แบบทั้งหมด",
        "import-interwiki-submit": "นำเข้า",
        "javascripttest-qunit-intro": "ดู[$1 เอกสารกำกับการทดสอบ]บน mediawiki.org",
        "tooltip-pt-userpage": "หน้าผู้ใช้ของคุณ",
        "tooltip-pt-anonuserpage": "หน้าผู้ใช้ของเลขที่อยู่ไอพีที่คุณกำลังใช้แก้ไข",
-       "tooltip-pt-mytalk": "หà¸\99à¹\89าอภิà¸\9bรายของคุณ",
-       "tooltip-pt-anontalk": "à¸\9eูà¸\94à¸\84ุยเกี่ยวกับการแก้ไขจากเลขที่อยู่ไอพีนี้",
+       "tooltip-pt-mytalk": "หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยของคุณ",
+       "tooltip-pt-anontalk": "อภิà¸\9bรายเกี่ยวกับการแก้ไขจากเลขที่อยู่ไอพีนี้",
        "tooltip-pt-preferences": "ตั้งค่าการใช้งานส่วนตัว",
        "tooltip-pt-watchlist": "รายการหน้าที่คุณเฝ้าดูการแก้ไข",
        "tooltip-pt-mycontris": "รายการหน้าที่คุณเขียน",
        "tooltip-pt-login": "ไม่จำเป็นต้องล็อกอินในการแก้ไข แต่แนะนำอย่างยิ่งให้ล็อกอิน",
        "tooltip-pt-logout": "ล็อกเอาต์",
-       "tooltip-ca-talk": "à¸\9eูà¸\94à¸\84ุยà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aเนื้อหา",
-       "tooltip-ca-edit": "à¸\84ุà¸\93สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94à¹\89 à¹\82à¸\9bรà¸\94à¹\83à¸\8aà¹\89à¸\9bุà¹\88มà¸\94ูà¸\95ัวอยà¹\88าà¸\87à¸\81à¹\88อà¸\99à¸\9aัà¸\99à¸\97ึà¸\81",
-       "tooltip-ca-addsection": "à¹\80ริà¹\88มหัวà¸\82à¹\89อยà¹\88อยใหม่",
-       "tooltip-ca-viewsource": "หน้านี้ถูกล็อก แต่ยังดูโค้ดได้",
+       "tooltip-ca-talk": "อภิà¸\9bรายà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aหà¸\99à¹\89าเนื้อหา",
+       "tooltip-ca-edit": "คุณสามารถแก้ไขหน้านี้ได้ โปรดใช้ปุ่มตัวอย่างก่อนบันทึก",
+       "tooltip-ca-addsection": "à¹\80ริà¹\88มสà¹\88วà¸\99ใหม่",
+       "tooltip-ca-viewsource": "หน้านี้ถูกล็อก \nแต่ยังดูโค้ดได้",
        "tooltip-ca-history": "รุ่นที่แล้วของหน้านี้",
        "tooltip-ca-protect": "ล็อกหน้านี้",
-       "tooltip-ca-unprotect": "à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99หà¸\99à¹\89าà¸\99ีà¹\89",
+       "tooltip-ca-unprotect": "เปลี่ยนการป้องกันหน้านี้",
        "tooltip-ca-delete": "ลบหน้านี้",
        "tooltip-ca-undelete": "กู้คืนการแก้ไขหน้านี้กลับมาเป็นรุ่นก่อนที่ถูกลบ",
        "tooltip-ca-move": "เปลี่ยนชื่อหน้านี้",
        "tooltip-search": "ค้นหา {{SITENAME}}",
        "tooltip-search-go": "ตรงไปยังหน้าที่ตรงกับชื่อนี้ (ถ้ามี)",
        "tooltip-search-fulltext": "ค้นหาหน้าที่มีข้อความนี้",
-       "tooltip-p-logo": "à¹\80à¸\82à¹\89าสูà¹\88หน้าหลัก",
-       "tooltip-n-mainpage": "à¹\80à¸\82à¹\89าสูà¹\88หน้าหลัก",
-       "tooltip-n-mainpage-description": "à¹\80à¸\82à¹\89าสูà¹\88หน้าหลัก",
+       "tooltip-p-logo": "à¹\80ยีà¹\88ยมà¸\8aมหน้าหลัก",
+       "tooltip-n-mainpage": "à¹\80ยีà¹\88ยมà¸\8aมหน้าหลัก",
+       "tooltip-n-mainpage-description": "à¹\80ยีà¹\88ยมà¸\8aมหน้าหลัก",
        "tooltip-n-portal": "เกี่ยวกับโครงการ สิ่งที่คุณทำได้ วิธีการค้นหา",
        "tooltip-n-currentevents": "ค้นหาเหตุการณ์ปัจจุบัน",
        "tooltip-n-recentchanges": "รายการปรับปรุงล่าสุดในวิกินี้",
        "tooltip-diff": "แสดงการเปลี่ยนการต่อข้อความ",
        "tooltip-compareselectedversions": "แสดงความแตกต่างระหว่างสองรุ่นที่เลือกของหน้านี้",
        "tooltip-watch": "เพิ่มหน้านี้เข้ารายการเฝ้าดู",
-       "tooltip-watchlistedit-normal-submit": "à¸\99ำชื่อเรื่องออก",
-       "tooltip-watchlistedit-raw-submit": "อัà¸\9eà¹\80à¸\94à¸\97รายการเฝ้าดู",
+       "tooltip-watchlistedit-normal-submit": "ลà¸\9aชื่อเรื่องออก",
+       "tooltip-watchlistedit-raw-submit": "à¸\9bรัà¸\9aรายการเฝ้าดู",
        "tooltip-recreate": "สร้างหน้านี้อีกครั้งแม้เคยถูกลบ",
        "tooltip-upload": "เริ่มอัปโหลด",
        "tooltip-rollback": "\"ย้อนกลับฉุกเฉิน\" ใช้ย้อนการแก้ไขในหน้านี้ของผู้เขียนคนล่าสุดในคลิกเดียว",
        "anonymous": "{{PLURAL:$1|ผู้ใช้|ผู้ใช้}}นิรนามของ{{SITENAME}}",
        "siteuser": "ผู้ใช้ $1 จาก {{SITENAME}}",
        "anonuser": "ผู้ใช้นิรนามจาก {{SITENAME}} $1",
-       "lastmodifiedatby": "à¹\81à¸\81à¹\89à¹\84à¸\82ลà¹\88าสุà¸\94à¹\80มืà¹\88อà¹\80วลา $2 $1 โดย $3",
+       "lastmodifiedatby": "à¸\94ัà¸\94à¹\81à¸\9bรหà¸\99à¹\89าà¸\99ีà¹\89ลà¹\88าสุà¸\94à¹\80มืà¹\88อà¹\80วลา $2, $1 โดย $3",
        "othercontribs": "พัฒนาจากงานเขียนของ $1",
        "others": "ผู้อื่น",
-       "siteusers": "{{PLURAL:$2|ผู้ใช้|ผู้ใช้}} {{SITENAME}} $1",
-       "anonusers": "{{PLURAL:$2|à¸\9cูà¹\89à¹\83à¸\8aà¹\89|à¸\9aรรà¸\94าà¸\9cูà¹\89à¹\83à¸\8aà¹\89}}à¸\99ิรà¸\99ามà¸\88าà¸\81 {{SITENAME}} $1",
+       "siteusers": "{{PLURAL:$2|ผู้ใช้|ผู้ใช้}}จาก {{SITENAME}} $1",
+       "anonusers": "{{PLURAL:$2|ผู้ใช้|ผู้ใช้}}นิรนามจาก {{SITENAME}} $1",
        "creditspage": "เกียรติแก่ผู้ร่วมสร้าง",
        "nocredits": "ไม่มีรายชื่อผู้เป็นเกียรติที่ร่วมสร้างหน้านี้",
        "spamprotectiontitle": "ตัวกรองป้องกันสแปม",
        "spam_blanking": "รุ่นการปรับปรุงทุกรุ่นประกอบไปด้วยลิงก์ไปยังเว็บ $1 (ทำหน้าว่าง)",
        "spam_deleting": "ทุกรุ่นที่มีลิงก์ไปยัง $1 กำลังลบ",
        "simpleantispam-label": "การตรวจสอบสแปม\n<strong>อย่า</strong>กรอกช่องนี้!",
-       "pageinfo-title": "à¸\82à¹\89อมูลสำหรับ \"$1\"",
-       "pageinfo-not-current": "à¸\82ออภัย à¹\84มà¹\88สามารà¸\96à¹\83หà¹\89à¸\82à¹\89อมูลà¸\99ีà¹\89สำหรัà¸\9aรุà¹\88à¸\99เก่าได้",
-       "pageinfo-header-basic": "à¸\82à¹\89อมูลเบื้องต้น",
+       "pageinfo-title": "สารสà¸\99à¹\80à¸\97ศสำหรับ \"$1\"",
+       "pageinfo-not-current": "à¸\82ออภัย à¹\84มà¹\88สามารà¸\96à¹\83หà¹\89สารสà¸\99à¹\80à¸\97ศà¸\99ีà¹\89สำหรัà¸\9aรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87เก่าได้",
+       "pageinfo-header-basic": "สารสà¸\99à¹\80à¸\97ศเบื้องต้น",
        "pageinfo-header-edits": "ประวัติการแก้ไข",
        "pageinfo-header-restrictions": "การล็อกหน้า",
        "pageinfo-header-properties": "คุณสมบัติหน้า",
        "pageinfo-robot-index": "อนุญาต",
        "pageinfo-robot-noindex": "ไม่อนุญาต",
        "pageinfo-views": "จำนวนการเข้าดู",
-       "pageinfo-watchers": "à¸\88ำà¸\99วà¸\99à¸\9cูà¹\89à¹\80à¸\82้าดูหน้า",
+       "pageinfo-watchers": "à¸\88ำà¸\99วà¸\99à¸\9cูà¹\89à¹\80à¸\9d้าดูหน้า",
        "pageinfo-few-watchers": "{{PLURAL:$1|ผู้เฝ้าดู|ผู้เฝ้าดู}}น้อยกว่า $1 คน",
        "pageinfo-redirects-name": "จำนวนการเปลี่ยนทางมาหน้านี้",
-       "pageinfo-subpages-name": "หน้าย่อยของหน้านี้",
+       "pageinfo-subpages-name": "à¸\88ำà¸\99วà¸\99หà¸\99à¹\89ายà¹\88อยà¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89",
        "pageinfo-subpages-value": "$1 ($2 หน้าเปลี่ยนทาง; $3 หน้าไม่เปลี่ยนทาง)",
        "pageinfo-firstuser": "ผู้สร้างหน้า",
        "pageinfo-firsttime": "วันที่สร้างหน้า",
        "pageinfo-recent-authors": "จำนวนผู้เขียนล่าสุด",
        "pageinfo-hidden-categories": "หมวดหมู่ที่ซ่อนอยู่ ($1)",
        "pageinfo-templates": "แม่แบบที่ใช้ ($1)",
-       "pageinfo-toolboxlink": "à¸\82à¹\89อมูลหน้า",
-       "pageinfo-redirectsto": "เปลี่ยนทางไปยัง",
+       "pageinfo-toolboxlink": "สารสà¸\99à¹\80à¸\97ศหน้า",
+       "pageinfo-redirectsto": "เปลี่ยนทางไป",
        "pageinfo-contentpage": "นับเป็นหน้าเนื้อหา",
        "pageinfo-contentpage-yes": "ใช่",
        "pageinfo-protect-cascading": "การล็อกที่สืบทอดจากหน้านี้",
        "pageinfo-protect-cascading-yes": "ใช่",
-       "pageinfo-protect-cascading-from": "à¸\81ารลà¹\87อà¸\81à¸\97ีà¹\88สืà¸\9aà¸\97อà¸\94มายัà¸\87หà¸\99à¹\89าà¸\99ีà¹\89",
-       "pageinfo-category-info": "à¸\82à¹\89อมูลหมวดหมู่",
+       "pageinfo-protect-cascading-from": "à¸\81ารลà¹\87อà¸\81สืà¸\9aà¸\97อà¸\94à¸\88าà¸\81",
+       "pageinfo-category-info": "สารสà¸\99à¹\80à¸\97ศหมวดหมู่",
        "pageinfo-category-pages": "จำนวนหน้า",
        "pageinfo-category-subcats": "จำนวนหมวดหมู่ย่อย",
        "pageinfo-category-files": "จำนวนไฟล์",
        "markaspatrolleddiff": "ทำเครื่องหมายว่าตรวจสอบแล้ว",
        "markaspatrolledtext": "ทำเครื่องหมายว่าหน้านี้ถูกตรวจสอบแล้ว",
        "markedaspatrolled": "ตรวจสอบแล้ว",
-       "markedaspatrolledtext": "รุà¹\88à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87[[:$1]]à¸\96ูà¸\81à¸\81ำหà¸\99à¸\94ว่าตรวจสอบแล้ว",
-       "rcpatroldisabled": "การตรวจสอบหน้าปรับปรุงล่าสุดปิดใช้งาน",
-       "rcpatroldisabledtext": "à¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\81ารà¸\95รวà¸\88สอà¸\9aหà¸\99à¹\89าà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94à¸\82à¸\93ะà¸\99ีà¹\89à¹\84มà¹\88à¹\80à¸\9bิà¸\94à¸\81ารใช้งาน",
+       "markedaspatrolledtext": "à¸\81ำหà¸\99à¸\94รุà¹\88à¸\99à¸\97ีà¹\88à¹\80ลือà¸\81à¸\82อà¸\87 [[:$1]] ว่าตรวจสอบแล้ว",
+       "rcpatroldisabled": "à¸\81ารà¸\95รวà¸\88สอà¸\9aหà¸\99à¹\89าà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94à¸\96ูà¸\81à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99",
+       "rcpatroldisabledtext": "à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\81ารà¸\95รวà¸\88สอà¸\9aหà¸\99à¹\89าà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94à¸\96ูà¸\81à¸\9bิà¸\94ใช้งาน",
        "markedaspatrollederror": "ไม่สามารถทำเครื่องหมายว่าตรวจสอบแล้ว",
        "markedaspatrollederrortext": "คุณจำเป็นต้องระบุรุ่นการแก้ไขที่กำหนดว่าตรวจสอบแล้ว",
        "markedaspatrollederror-noautopatrol": "คุณไม่สามารถทำเครื่องหมายการแก้ไขของคุณเองว่าตรวจสอบแล้ว",
        "patrol-log-header": "หน้านี้คือปูมรุ่นการแก้ไขที่กำหนดว่าตรวจสอบแล้ว",
        "log-show-hide-patrol": "$1 ปูมการตรวจสอบ",
        "deletedrevision": "รุ่นเก่าที่ถูกลบ $1",
-       "filedeleteerror-short": "à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาการลบไฟล์: $1",
+       "filedeleteerror-short": "มีà¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94การลบไฟล์: $1",
        "filedeleteerror-long": "เกิดข้อผิดพลาดขณะลบไฟล์:\n\n$1",
        "filedelete-missing": "ไม่สามารถลบไฟล์ \"$1\" ได้ เนื่องจากไม่มีไฟล์ชื่อนี้อยู่",
        "filedelete-old-unregistered": "ไม่มีรุ่นไฟล์ \"$1\" ที่ระบุในฐานข้อมูล",
        "noimages": "ไม่มีให้ดู",
        "ilsubmit": "สืบค้น",
        "bydate": "ตามวันที่",
-       "sp-newimages-showfrom": "à¹\81สà¸\94à¸\87ภาà¸\9eà¹\83หมà¹\88à¹\80ริà¹\88มà¸\95à¹\89à¸\99จาก $2, $1",
+       "sp-newimages-showfrom": "à¹\81สà¸\94à¸\87à¹\84à¸\9fลà¹\8cà¹\83หมà¹\88à¹\80ริà¹\88มจาก $2, $1",
        "seconds-abbrev": "$1 วินาที",
        "minutes-abbrev": "$1 นาที",
        "hours-abbrev": "$1 ชั่วโมง",
        "bad_image_list": "รูปแบบแสดงต่อไปนี้:\n\nเฉพาะรายการที่แสดง (ในแถวขึ้นต้นด้วย *) โดยลิงก์แรกของแต่ละแถวเป็นลิงก์ไปยังภาพที่เสีย\nโดยลิงก์ถัดไปเป็นข้อยกเว้น เช่น บทความที่ภาพถูกจัดในบรรทัดเดียวกับส่วนข้อความ",
        "metadata": "ข้อมูลแนบ",
        "metadata-help": "ไฟล์นี้มีข้อมูลเพิ่มเติมแนบไว้ อาจจะมาจาก กล้องดิจิทัล สแกนเนอร์ หรือเครื่องรับส่งจีพีเอส อย่างไรก็ตามข้อมูลที่เก็บไว้อาจถูกดัดแปลงถ้าไฟล์ต้นฉบับถูกแก้ไขจากซอฟต์แวร์อื่น",
-       "metadata-expand": "à¹\81สà¸\94à¸\87à¸\82à¹\89อมูลà¹\80à¸\9eิà¹\88มà¹\80à¸\95ิม",
-       "metadata-collapse": "à¸\8bà¹\88อà¸\99à¸\82à¹\89อมูลà¹\80à¸\9eิà¹\88มà¹\80à¸\95ิม",
+       "metadata-expand": "à¹\81สà¸\94à¸\87รายละà¹\80อียà¸\94à¸\82ยาย",
+       "metadata-collapse": "à¸\8bà¹\88อà¸\99รายละà¹\80อียà¸\94à¸\82ยาย",
        "metadata-fields": "เขตข้อมูลเมทาเดตาของภาพดังที่แสดงรายการไว้ในข้อความนี้ จะถูกรวมบนหน้าภาพเมื่อตารางเมทาเดตาถูกยุบ เขตข้อมูลอื่น ๆ จะถูกซ่อนโดยปริยาย\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "ความกว้าง",
        "exif-imagelength": "ความสูง",
-       "exif-bitspersample": "บิต ต่อคอมโพเนนต์",
+       "exif-bitspersample": "บิตต่อคอมโพเนนต์",
        "exif-compression": "รูปแบบการบีบอัด",
        "exif-photometricinterpretation": "พิกเซลคอมโพซิชัน",
        "exif-orientation": "การจัดวางภาพ",
        "exif-model": "รุ่นกล้อง",
        "exif-software": "ซอฟต์แวร์ที่ใช้",
        "exif-artist": "ผู้สร้างสรรค์",
-       "exif-copyright": "à¸\9cูà¹\89à¸\96ือลิขสิทธิ์",
+       "exif-copyright": "à¸\9cูà¹\89à¸\97รà¸\87ลิขสิทธิ์",
        "exif-exifversion": "รุ่นเอกซิฟ (Exif)",
        "exif-flashpixversion": "รุ่นแฟลชพิกซ์ที่รองรับ",
        "exif-colorspace": "สเปซสี",
        "exif-gpslatitude-s": "ละติจูดใต้",
        "exif-gpslongitude-e": "ลองจิจูดตะวันออก",
        "exif-gpslongitude-w": "ลองจิจูดตะวันตก",
-       "exif-gpsstatus-a": "à¸\81ำลัà¸\87à¸\97ำà¸\81ารวัà¸\94อยูà¹\88",
+       "exif-gpsstatus-a": "à¸\81ำลัà¸\87วัà¸\94",
        "exif-gpsstatus-v": "ความสามารถในการวัดตำแหน่ง",
        "exif-gpsmeasuremode-2": "การวัดสองมิติ",
        "exif-gpsmeasuremode-3": "การวัดสามมิติ",
        "exif-iimcategory-sci": "วิทยาศาสตร์และเทคโนโลยี",
        "exif-iimcategory-spo": "กีฬา",
        "exif-iimcategory-wea": "ภูมิอากาศ",
-       "watchlistall2": "ทั้งหมด",
        "namespacesall": "ทั้งหมด",
        "monthsall": "ทั้งหมด",
        "confirmemail": "ยืนยันที่อยู่อีเมล",
        "confirmemail_body": "ใครบางคน ซึ่งอาจจะเป็นคุณ จากหมายเลขไอพี $1 ได้ลงทะเบียนในชื่อ \"$2\" โดยใช้อีเมลนี้ที่ {{SITENAME}}\n\nเพื่อยืนยันว่าบัญชีผู้ใช้นี้เป็นของคุณอย่างแน่อน และใช้งานฟีเจอร์ส่งอีเมลหาผู้ใช้บน {{SITENAME}} กดลิงก์นี้ในเว็บเบราวเซอร์ของคุณ:\n\n$3\n\nถ้าคุณ*ไม่*ได้ลงทะเบียน กรุณากดลิงก์ด้านล่างเพื่อยกเลิกการยืนยันที่อยู่อีเมล\n\n$5\n\nรหัสยืนยันนี้จะหมดอายุเมื่อ $4",
        "confirmemail_body_changed": "ใครบางคน ซึ่งอาจจะเป็นคุณ จากเลขที่อยู่ไอพี $1 ได้เปลี่ยนที่อยู่อีเมลสำหรับบัญชีผู้ใช้ \"$2\" ไปยังที่อยู่นี้บน {{SITENAME}}\n\nเพื่อยืนยันว่าบัญชีผู้ใช้นี้เป็นของคุณอย่างแน่นอนและเปิดใช้งานฟีเจอร์ส่งอีเมลหาผู้ใช้บน {{SITENAME}} อีกครั้งหนึ่ง กดลิงก์นี้ในเว็บเบราวเซอร์ของคุณ:\n\n$3\n\nถ้าบัญชีผู้ใช้นี้*ไม่*ได้เป็นของคุณ กรุณากดลิงก์ด้านล่างเพื่อยกเลิกการยืนยันที่อยู่อีเมล\n\n$5\n\nรหัสยืนยันนี้จะหมดอายุเมื่อ $4",
        "confirmemail_body_set": "ใครสักคนจากที่อยู่ไอพี $1 ซึ่งอาจเป็นคุณ\nได้กำหนดที่อยู่อีเมลของบัญชี \"$2\" บน {{SITENAME}} มายังที่อยู่อีเมลนี้\n\nเพื่อยืนยันว่าบัญชีนี้เป็นของคุณจริง ๆ\nและเปิดใช้งานคุณสมบัติอีเมลบน {{SITENAME}} อีกครั้ง\nให้เปิดลิงก์ต่อไปนี้ในเบราว์เซอร์ของคุณ:\n\n$3\n\nหากบัญชีดังกล่าว *ไม่ใช่* ของคุณ\nให้เปิดลิงก์ต่อไปนี้เพื่อยกเลิกการยืนยันที่อยู่อีเมล:\n\n$5\n\nรหัสยืนยันนี้จะหมดอายุเมื่อ $4",
-       "confirmemail_invalidated": "à¸\81ารยืà¸\99ยัà¸\99à¸\97าà¸\87อีà¹\80มลà¹\84à¸\94à¹\89à¸\96ูà¸\81ยà¸\81à¹\80ลิà¸\81แล้ว",
-       "invalidateemail": "ยà¸\81à¹\80ลิà¸\81à¸\81ารยืà¸\99ยัà¸\99à¸\97าà¸\87อีà¹\80มล",
+       "confirmemail_invalidated": "ยà¸\81à¹\80ลิà¸\81à¸\81ารยืà¸\99ยัà¸\99à¸\97ีà¹\88อยูà¹\88อีà¹\80มลแล้ว",
+       "invalidateemail": "ยกเลิกการยืนยันอีเมล",
        "scarytranscludedisabled": "[ส่งค่าของอินเตอร์วิกิถูกระงับ]",
        "scarytranscludefailed": "[ไม่สามารถดึงแม่แบบมาได้สำหรับ $1]",
-       "scarytranscludetoolong": "[à¸\97ีà¹\88อยูà¹\88à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cยาวเกินไป]",
-       "deletedwhileediting": "'''คำเตือน''': หน้านี้ถูกลบไปแล้วในขณะที่คุณกำลังแก้ไข!",
-       "confirmrecreate": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89 [[User:$1|$1]] ([[User talk:$1|à¸\9eูà¸\94à¸\84ุย]]) à¹\84à¸\94à¹\89ลà¸\9aหà¸\99à¹\89าà¸\99ีà¹\89à¹\83à¸\99à¸\8aà¹\88วà¸\87à¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82 à¸\94à¹\89วยà¹\80หà¸\95ุà¸\9cลวà¹\88า:\n: ''$2''\nà¸\81รุà¸\93ายืà¸\99ยัà¸\99วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารสรà¹\89าà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\82ึà¹\89à¸\99มาใหม่",
+       "scarytranscludetoolong": "[ยูอารà¹\8cà¹\81อลยาวเกินไป]",
+       "deletedwhileediting": "<strong>คำเตือน:</strong>  หน้านี้ถูกลบหลังคุณเริ่มแก้ไข!",
+       "confirmrecreate": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89 [[User:$1|$1]] ([[User talk:$1|à¸\9eูà¸\94à¸\84ุย]]) à¸¥à¸\9aหà¸\99à¹\89าà¸\99ีà¹\89หลัà¸\87à¸\84ุà¸\93à¹\80ริà¹\88มà¹\81à¸\81à¹\89à¹\84à¸\82 à¸\94à¹\89วยà¹\80หà¸\95ุà¸\9cลวà¹\88า:\n: <em>$2</em>\nà¸\81รุà¸\93ายืà¸\99ยัà¸\99วà¹\88า à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารสรà¹\89าà¸\87หà¸\99à¹\89าà¸\99ีà¹\89ใหม่",
        "confirmrecreate-noreason": "ผู้ใช้ [[User:$1|$1]] ([[User talk:$1|พูดคุย]]) ลบหน้านี้หลังคุณเริ่มแก้ไข โปรดยืนยันว่าคุณต้องการสร้างหน้านี้ใหม่จริง ๆ",
        "recreate": "สร้างใหม่",
        "confirm_purge_button": "ตกลง",
        "imgmultipageprev": "← หน้าก่อนหน้า",
        "imgmultipagenext": "หน้าถัดไป →",
        "imgmultigo": "ไป!",
-       "imgmultigoto": "à¹\84à¸\9bà¸\97ีà¹\88หà¸\99à¹\89า $1",
-       "ascending_abbrev": "หà¸\99à¹\89าà¹\84à¸\9bหลัà¸\87",
-       "descending_abbrev": "หลัà¸\87มาหà¸\99à¹\89า",
+       "imgmultigoto": "ไปหน้า $1",
+       "ascending_abbrev": "ลำà¸\94ัà¸\9aà¸\82ึà¹\89à¸\99",
+       "descending_abbrev": "ลำà¸\94ัà¸\9aลà¸\87",
        "table_pager_next": "หน้าถัดไป",
        "table_pager_prev": "หน้าก่อนหน้า",
        "table_pager_first": "หน้าแรก",
        "table_pager_limit": "แสดง $1 รายการต่อหน้า",
        "table_pager_limit_label": "รายการต่อหน้า:",
        "table_pager_limit_submit": "ค้นหา",
-       "table_pager_empty": "à¹\84มà¹\88à¸\9eà¸\9aà¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร",
+       "table_pager_empty": "à¹\84มà¹\88มีà¸\9cลลัà¸\9eà¸\98à¹\8c",
        "autosumm-blank": "ทำหน้าว่าง",
-       "autosumm-replace": "à¹\81à¸\97à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามà¸\97ัà¹\89à¸\87หมà¸\94à¸\94à¹\89วย '$1'",
-       "autoredircomment": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¹\84à¸\9bà¸\97ีà¹\88 [[$1]]",
-       "autosumm-new": "หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81สรà¹\89าà¸\87à¸\94à¹\89วย '$1'",
+       "autosumm-replace": "à¹\81à¸\97à¸\99à¸\97ีà¹\88à¹\80à¸\99ืà¹\89อหาà¸\94à¹\89วย \"$1\"",
+       "autoredircomment": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87หà¸\99à¹\89าà¹\84à¸\9b [[$1]]",
+       "autosumm-new": "สรà¹\89าà¸\87หà¸\99à¹\89าà¸\94à¹\89วย \"$1\"",
        "autosumm-newblank": "สร้างหน้าว่าง",
        "size-bytes": "$1 ไบต์",
        "size-kilobytes": "$1 กิโลไบต์",
        "bitrate-exabits": "$1 เอกซะบิตต่อวินาที",
        "bitrate-zetabits": "$1 เซตตะบิตต่อวินาที",
        "bitrate-yottabits": "$1 ยอตตะบิตต่อวินาที",
-       "lag-warn-normal": "à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88à¹\83หมà¹\88à¸\81วà¹\88า $1 à¸§à¸´à¸\99าà¸\97ี à¸­à¸²à¸\88à¹\84มà¹\88à¹\81สà¸\94à¸\87à¸\9cลà¹\83à¸\99รายà¸\81ารà¸\99ีà¹\89",
-       "lag-warn-high": "เนื่องจากปัญหาการล่าช้าของเซิร์ฟเวอร์ฐานข้อมูล การปรับปรุงที่ใหม่กว่า $1 วินาที อาจไม่แสดงผลในรายการนี้",
+       "lag-warn-normal": "การปรับปรุงที่ใหม่กว่า $1 วินาที อาจไม่แสดงในรายการนี้",
+       "lag-warn-high": "เนื่องจากปัญหาการล่าช้าของเซิร์ฟเวอร์ฐานข้อมูล การปรับปรุงที่ใหม่กว่า $1 วินาทีอาจไม่แสดงในรายการนี้",
        "watchlistedit-normal-title": "แก้ไขรายการเฝ้าดู",
        "watchlistedit-normal-legend": "ลบชื่อเรื่องออกจากรายการเฝ้าดู",
        "watchlistedit-normal-explain": "ชื่อเรื่องในรายการเฝ้าดูของคุณแสดงด้านล่าง \nถ้าต้องการลบออก ให้คลิกเลือกที่กล่องด้านข้างแต่ละชื่อ และคลิก \"{{int:Watchlistedit-normal-submit}}\" \nหรืออาจจะ[[Special:EditWatchlist/raw|แก้ไขรายการทั้งหมด]]",
        "watchlistedit-raw-legend": "แก้ไขรายการเฝ้าดูทั้งหมด",
        "watchlistedit-raw-explain": "ชื่อเรื่องในรายการเฝ้าดูของคุณแสดงด้านล่าง ซึ่งสามารถเพิ่มหรือนำออกได้ หนึ่งชื่อเรื่องต่อแถว \nเมื่อเสร็จแล้ว ให้กด \"{{int:Watchlistedit-raw-submit}}\" \nซึ่งอาจแก้ไขผ่าน [[Special:EditWatchlist|โปรแกรมแก้ไขข้อความทั่วไป]]",
        "watchlistedit-raw-titles": "ชื่อเรื่อง:",
-       "watchlistedit-raw-submit": "à¸\9bรัà¸\9aà¸\9bรุà¸\87รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู",
-       "watchlistedit-raw-done": "รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¸\9bรัà¸\9aแล้ว",
-       "watchlistedit-raw-added": "$1 ชื่อเรื่องได้ถูกเพิ่มเข้าไป:",
-       "watchlistedit-raw-removed": "$1 ชื่อเรื่องได้ถูกนำออกไป:",
+       "watchlistedit-raw-submit": "ปรับรายการเฝ้าดู",
+       "watchlistedit-raw-done": "à¸\9bรัà¸\9aรายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93แล้ว",
+       "watchlistedit-raw-added": "เพิ่ม $1 ชื่อเรื่อง:",
+       "watchlistedit-raw-removed": "ลบ $1 ชื่อเรื่อง:",
        "watchlistedit-clear-title": "ล้างรายการเฝ้าดู",
        "watchlistedit-clear-legend": "ล้างรายการเฝ้าดู",
-       "watchlistedit-clear-explain": "à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\97ัà¹\89à¸\87หมà¸\94à¸\88ะà¸\96ูà¸\81à¸\99ำออà¸\81จากรายการเฝ้าดูของคุณ",
+       "watchlistedit-clear-explain": "ลà¸\9aà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\97ัà¹\89à¸\87หมà¸\94จากรายการเฝ้าดูของคุณ",
        "watchlistedit-clear-titles": "ชื่อเรื่อง:",
        "watchlistedit-clear-submit": "ล้างรายการเฝ้าดู (เป็นการถาวร!)",
        "watchlistedit-clear-done": "ล้างรายการเฝ้าดูของคุณแล้ว",
-       "watchlistedit-clear-removed": "$1 ชื่อเรื่องถูกนำออก:",
-       "watchlistedit-too-many": "มีหà¸\99à¹\89ามาà¸\81à¹\80à¸\81ิà¸\99à¹\84à¸\9bà¸\97ีà¹\88à¸\88ะà¹\81สà¸\94à¸\87à¸\9cลที่นี่",
+       "watchlistedit-clear-removed": "ลบ $1 ชื่อเรื่อง:",
+       "watchlistedit-too-many": "มีหà¸\99à¹\89ามาà¸\81à¹\80à¸\81ิà¸\99à¹\81สà¸\94à¸\87ที่นี่",
        "watchlisttools-clear": "ล้างรายการเฝ้าดู",
        "watchlisttools-view": "ดูการเปลี่ยนแปลงที่เกี่ยวข้อง",
        "watchlisttools-edit": "ดูและแก้ไขรายการเฝ้าดู",
        "watchlisttools-raw": "แก้ไขรายการเฝ้าดูทั้งหมด",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|พูดคุย]])",
-       "unknown_extension_tag": "ไม่รู้จัก tag ส่วนขยาย (extension tag) \"$1\"",
-       "duplicate-defaultsort": "คำเตือน: หลักเรียงลำดับปริยาย \"$2\" ได้ลบล้างหลักเรียงลำดับปริยาย \"$1\" ที่มีอยู่ก่อนหน้า",
-       "version": "รุ่นซอฟต์แวร์",
+       "unknown_extension_tag": "ไม่รู้จักป้ายระบุส่วนขยาย \"$1\"",
+       "duplicate-defaultsort": "<strong>คำเตือน:</strong> หลักเรียงลำดับปริยาย \"$2\" ได้ลบล้างหลักเรียงลำดับปริยาย \"$1\" ที่มีอยู่ก่อนหน้า",
+       "version": "รุ่น",
        "version-extensions": "ส่วนขยายเพิ่ม (extension) ที่ติดตั้ง",
-       "version-skins": "รูà¸\9bลัà¸\81ษà¸\93à¹\8cที่ติดตั้ง",
+       "version-skins": "หà¸\99à¹\89าà¸\95าที่ติดตั้ง",
        "version-specialpages": "หน้าพิเศษ",
-       "version-parserhooks": "ฮุà¸\81à¸\97ีà¹\88มีà¸\81ารà¸\9eารà¹\8cสà¸\84à¹\88า",
+       "version-parserhooks": "ฮุà¸\81à¸\95ัวà¹\81à¸\88à¸\87สà¹\88วà¸\99",
        "version-variables": "ตัวแปร",
        "version-antispam": "การป้องกันสแปม",
-       "version-other": "อื่นๆ",
-       "version-mediahandlers": "à¸\95ัวà¸\88ัà¸\94à¸\81ารà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aสืà¹\88อ (media handler)",
+       "version-other": "อื่น ๆ",
+       "version-mediahandlers": "à¸\95ัวà¸\88ัà¸\94à¸\81ารสืà¹\88อ",
        "version-hooks": "ฮุก",
-       "version-parser-extensiontags": "à¹\81à¸\97à¹\87à¸\81à¸\97ีà¹\88มีà¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\82อà¸\87à¸\9eารà¹\8cสà¹\80à¸\8bอรà¹\8c",
-       "version-parser-function-hooks": "ฮุà¸\81à¸\97ีà¹\88มีà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\9eารà¹\8cสà¹\80à¸\8bอรà¹\8c",
+       "version-parser-extensiontags": "à¸\9bà¹\89ายระà¸\9aุสà¹\88วà¸\99à¸\82ยายà¸\95ัวà¹\81à¸\88à¸\87สà¹\88วà¸\99",
+       "version-parser-function-hooks": "ฮุà¸\81à¸\97ีà¹\88มีà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\95ัวà¹\81à¸\88à¸\87สà¹\88วà¸\99",
        "version-hook-name": "ชื่อฮุก",
        "version-hook-subscribedby": "สนับสนุนโดย",
        "version-version": "(รุ่น $1)",
+       "version-no-ext-name": "[ไม่มีชื่อ]",
        "version-license": "สัญญาอนุญาตมีเดียวิกิ",
        "version-poweredby-credits": "วิกินี้จัดทำโดย '''[https://www.mediawiki.org/ MediaWiki]''', สงวนลิขสิทธิ์ © 2001-$1 โดย $2",
        "version-poweredby-others": "ผู้อื่น",
        "version-poweredby-translators": "ผู้แปล translatewiki.net",
        "version-license-info": "มีเดียวิกิเป็นซอฟต์แวร์เสรี คุณสามารถแจกจ่าย และ/หรือ แก้ไขได้ภายใต้เงื่อนไขแห่งสัญญาอนุญาตสาธารณะทั่วไปของกนูตามที่เผยแพร่โดยมูลนิธิซอฟต์แวร์เสรี ไม่ว่ารุ่นที่ 2 แห่งสัญญาอนุญาต หรือรุ่นภายหลังอื่นใด (ตามที่คุณเลือก)\n\nมีเดียวิกิมีถูกแจกจ่ายด้วยหวังว่าจะเป็นประโยชน์ แต่ไม่มีการรับประกันใด ๆ ทั้งสิ้น ไม่มีแม้การรับประกันโดยนัยเพื่อการค้า หรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ดูรายละเอียดเพิ่มเติมที่สัญญาอนุญาตสาธารณะทั่วไปของกนู\n\nคุณควรได้รับ[{{SERVER}}{{SCRIPTPATH}}/COPYING สำเนาของสัญญาอนุญาตสาธารณะทั่วไปของกนู]พร้อมกับโปรแกรมนี้ หากไม่พบ กรุณาเขียนจดหมายถึงบริษัทมูลนิธิซอฟต์แวร์เสรี ที่อยู่ 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": "à¸\8aืà¹\88อ",
+       "version-software-product": "à¸\9cลิà¸\95ภัà¸\93à¸\91à¹\8c",
        "version-software-version": "รุ่น",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath เส้นทางบทความ]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath เส้นทางสคริปต์]",
        "redirect-value": "ค่า:",
        "redirect-user": "รหัสผู้ใช้",
        "redirect-page": "รหัสประจำหน้า",
-       "redirect-revision": "รุ่นหน้า",
+       "redirect-revision": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87หà¸\99à¹\89า",
        "redirect-file": "ชื่อไฟล์",
        "redirect-not-exists": "ไม่พบค่า",
-       "fileduplicatesearch": "à¸\84à¹\89à¸\99หาà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\8bà¹\89ำà¸\8bà¹\89อà¸\99",
-       "fileduplicatesearch-summary": "à¸\84à¹\89à¸\99หาà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\8bà¹\89ำà¸\81ัà¸\99à¸\95ามà¸\84à¹\88าà¹\81ฮà¸\8a",
+       "fileduplicatesearch": "ค้นหาไฟล์ซ้ำซ้อน",
+       "fileduplicatesearch-summary": "ค้นหาไฟล์ซ้ำกันตามค่าแฮช",
        "fileduplicatesearch-legend": "ค้นหาไฟล์ที่ซ้ำกัน",
        "fileduplicatesearch-filename": "ชื่อไฟล์ :",
-       "fileduplicatesearch-submit": "สืà¸\9aà¸\84à¹\89à¸\99",
+       "fileduplicatesearch-submit": "à¸\84à¹\89à¸\99หา",
        "fileduplicatesearch-info": "$1 × $2 พิกเซล<br />ขนาดไฟล์: $3<br />ชนิดของไมม์: $4",
        "fileduplicatesearch-result-1": "ไม่มีไฟล์ที่ซ้ำกับไฟล์ \"$1\"",
        "fileduplicatesearch-result-n": "มี {{PLURAL:$2|ไฟล์เดียว|$2 ไฟล์}}ที่ซ้ำกับไฟล์ \"$1\"",
        "specialpages": "หน้าพิเศษ",
        "specialpages-note-top": "คำอธิบายสัญลักษณ์",
        "specialpages-note": "* หน้าพิเศษปกติ\n* <span class=\"mw-specialpagerestricted\">หน้าพิเศษที่ถูกจำกัด</span>",
-       "specialpages-group-maintenance": "รายà¸\87าà¸\99à¸\81ารà¹\80à¸\81à¹\87à¸\9aà¸\81วาà¸\94",
+       "specialpages-group-maintenance": "รายà¸\87าà¸\99à¸\81ารà¸\9aำรุà¸\87รัà¸\81ษา",
        "specialpages-group-other": "หน้าพิเศษอื่น ๆ",
        "specialpages-group-login": "ล็อกอิน / สร้างบัญชี",
-       "specialpages-group-changes": "ปรับปรุงล่าสุดและปูมต่าง ๆ",
-       "specialpages-group-media": "รายà¸\87าà¸\99à¹\80รืà¹\88อà¸\87สืà¹\88อà¹\81ละà¸\81ารอัà¸\9bà¹\82หลà¸\94",
+       "specialpages-group-changes": "ปรับปรุงล่าสุดและปูม",
+       "specialpages-group-media": "รายงานสื่อและการอัปโหลด",
        "specialpages-group-users": "ผู้ใช้และสิทธิ",
        "specialpages-group-highuse": "หน้าที่มีการใช้งานสูง",
-       "specialpages-group-pages": "รายà¸\8aืà¹\88อหน้า",
-       "specialpages-group-pagetools": "à¹\80à¸\84รืà¹\88อà¸\87มือà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aหà¸\99à¹\89าà¸\95à¹\88าà¸\87 à¹\86",
+       "specialpages-group-pages": "รายà¸\81ารหน้า",
+       "specialpages-group-pagetools": "à¹\80à¸\84รืà¹\88อà¸\87มือหà¸\99à¹\89า",
        "specialpages-group-wiki": "ข้อมูลและเครื่องมือ",
        "specialpages-group-redirects": "เปลี่ยนทางหน้าพิเศษ",
-       "specialpages-group-spam": "à¹\80à¸\84รืà¹\88อà¸\87มือà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aสà¹\81à¸\9bม",
+       "specialpages-group-spam": "เครื่องมือสแปม",
        "blankpage": "หน้าว่าง",
        "intentionallyblankpage": "หน้านี้ถูกทิ้งว่างโดยเจตนา",
        "external_image_whitelist": "  #เว้นบรรทัดนี้ไว้จากการแก้ไข<pre>\n#ใส่คำอธิบายปกติ (เฉพาะในส่วนที่อยู่ระหว่างสัญลักษณ์ //) ด้านล่างนี้\n#ซึ่งคำอธิบายดังกล่าวจะถูกจับคู่กับ URL ของรูปถ่ายภายนอก\n#ถ้าตรงกันจะปรากฏเป็นภาพออกมา หรือมิเช่นนั้นจะปรากฏเป็นลิงก์ไปยังรูปภาพนั้น\n#บรรทัดที่ขึ้นต้นด้วย # จะถูกกำหนดเป็นหมายเหตุเพิ่มเติม\n#กรุณาพิมพ์ตัวพิมพ์เล็ก-ใหญ่ตามชื่อไฟล์ให้ตรงกัน\n\n#ใส่ส่วนของคำอธิบายด้านบนของบรรทัดนี้และเว้นบรรทัดนี้จากการแก้ไข</pre>",
        "logentry-upload-overwrite": "$1 อัปโหลดรุ่นใหม่ของ $3",
        "logentry-upload-revert": "$1 อัปโหลด $3",
        "rightsnone": "(ไม่มี)",
+       "revdelete-summary": "คำอธิบายโดยย่อ",
        "feedback-bugornote": "หากคุณได้อธิบายปัญหาทางเทคนิคในรายละเอียดแล้ว โปรด[$1 รายงานจุดบกพร่อง]\nมิฉะนั้น คุณสามารถแบบอย่างง่ายด้านล่าง ความเห็นของคุณจะถูกเพิ่มเข้าสู่ \"[$3 $2]\" ร่วมกับชื่อผู้ใช้ของคุณ",
        "feedback-subject": "เรื่อง:",
        "feedback-message": "ข้อความ:",
        "feedback-bugcheck": "ยอดเยี่ยม! เพียงตรวจสอบว่าจุดบกพร่องนั้นมิใช่หนึ่งใน[$1 จุดบกพร่องที่ทราบแล้ว]",
        "feedback-bugnew": "ฉันตรวจสอบแล้ว รายงานจุดบกพร่องใหม่",
        "searchsuggest-search": "ค้นหา",
-       "searchsuggest-containing": "à¸\9bระà¸\81อà¸\9aà¹\84à¸\9bà¸\94à¹\89วย...",
+       "searchsuggest-containing": "มี...",
        "api-error-badaccess-groups": "คุณไม่ได้รับอนุญาตให้อัปโหลดไฟล์มายังวิกินี้",
        "api-error-empty-file": "ไฟล์ที่คุณส่งมานั้นว่าง",
        "api-error-emptypage": "ไม่อนุญาตให้สร้างหน้าใหม่ที่ว่าง",
index 07d5212..3930fdb 100644 (file)
        "changeemail-newemail": "Täze e-poçta adresi:",
        "changeemail-none": "(hiç biri)",
        "changeemail-submit": "E-poçtany üýtget",
-       "changeemail-cancel": "Goýbolsun et",
        "bold_sample": "Goýy tekst",
        "bold_tip": "Goýy tekst",
        "italic_sample": "Kursiw tekst",
        "searchrelated": "baglanyşykly",
        "searchall": "ählisi",
        "showingresults": "Aşakda №'''$2''' netijeden başlap, {{PLURAL:$1|'''1''' netije|'''$1''' netije}} görkezilýär.",
-       "showingresultsheader": "'''$4''' hakda {{PLURAL:$5|'''$3''' netijeden '''$1''' sanysy|'''$3''' netijeden '''$1 - $2''' aralygy}}",
        "search-nonefound": "Talaba gabat gelýän hiç hili netije ýok.",
        "powersearch-legend": "Giňişleýin gözleg",
        "powersearch-ns": "At giňişliklerinde gözleg:",
        "suppress": "Esewan",
        "booksources": "Kitap çeşmeleri",
        "booksources-search-legend": "Kitap çeşmelerini gözle",
-       "booksources-go": "Git",
        "booksources-text": "Aşakda täze hem-de ulanylan kitap satýan başga saýtlara çykgytlaryň sanawy görkezilýär, we olarda agtarýan kitabyňyz barada has köp maglumat bar bolmagy mümkin.",
        "booksources-invalid-isbn": "Berlen ISBN dogry däl ýaly; asyl çeşmä seredip göçürme säwliklerini barlaň.",
        "specialloguserlabel": "Ulanyjy:",
        "wlheader-enotif": "E-poçta bilen habar beriş açyk.",
        "wlheader-showupdated": "Soňky gezek baryp görenizden soňra üýtgedilen sahypalar '''goýy şrift''' bilen görkezilýär.",
        "wlnote": "Aşakda soňky {{PLURAL:$2|bir sagatda|'''$2''' sagatda}} edilen {{PLURAL:$1|soňky üýtgeşme|soňky '''$1''' üýtgeşme}} görkezilýär.",
-       "wlshowlast": "Soňky $1 sagady $2 güni görkez $3",
+       "wlshowlast": "Soňky $1 sagady $2 güni görkez",
        "watchlist-options": "Gözegçilik sanawynyň opsiýalary",
        "watching": "Gözegçilige alynýar...",
        "unwatching": "Gözegçilikden aýyrylýar...",
        "import": "Sahypalary importirle",
        "importinterwiki": "Wikiara importirleme",
        "import-interwiki-text": "Importirlemek üçin biri wiki we sahypa adyny saýlaň.\nWersiýalaryň seneleri we awtorlaryň atlary saklanyljakdyr.\nÄhli wikiara importirleme amallary [[Special:Log/import|import gündeligine]] ýazylýar.",
-       "import-interwiki-source": "Wiki çeşme/sahypa:",
        "import-interwiki-history": "Bu sahypa üçin ähli geçmiş wersiýalary göçür",
        "import-interwiki-templates": "Ähli şablonlary giriz",
        "import-interwiki-submit": "Importirle",
        "exif-gpsspeed-n": "Uzel (deňiz mili)",
        "exif-gpsdirection-t": "Hakyky ugur",
        "exif-gpsdirection-m": "Magnit ugur",
-       "watchlistall2": "Ählisini görkez",
        "namespacesall": "ählisi",
        "monthsall": "ählisi",
        "confirmemail": "E-poçta adresini tassykla",
        "revdelete-restricted": "administratorlara goýlan çäklendirmeler",
        "revdelete-unrestricted": "administratorlardan aýyrylan çäklendirmeler",
        "rightsnone": "(hiç biri)",
+       "revdelete-summary": "özgerdiş mazmuny",
        "searchsuggest-search": "Gözleg",
        "searchsuggest-containing": "öz içine alýar...",
        "expandtemplates": "Şablonlary giňelt",
index cbb0891..bdd6211 100644 (file)
@@ -12,7 +12,8 @@
                        "Sky Harbor",
                        "tl.wikipedia.org sysops",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Ianlopez1115"
                ]
        },
        "tog-underline": "Pagsasalungguhit ng link:",
        "permalink": "Palagiang kawing",
        "print": "Ilimbag",
        "view": "Tingnan",
+       "view-foreign": "Tingnan sa $1",
        "edit": "Baguhin",
        "create": "Likhain",
        "editthispage": "Baguhin ang pahinang ito",
        "passwordreset-emailsent-capture": "Naipadala na ang isang e-liham na paalala, na ipinapakita sa ibaba.",
        "passwordreset-emailerror-capture": "Nalikha na ang isang e-liham na paalala, na ipinapakita sa ibaba, subalit nabigo ang pagpapadala sa tagagamit: $1",
        "changeemail": "Baguhin ang direksiyong e-liham",
-       "changeemail-header": "Baguhin ang email address ng account",
        "changeemail-text": "Kumpletuhin ang form na ito upang mabago ang email address. Kakailanganin mong ipasok ang iyong password upang tiyakin ang pagbabagong ito.",
        "changeemail-no-info": "Kailangan mong lumagda upang tuwirang mapuntahan ang pahinang ito.",
        "changeemail-oldemail": "Kasalukuyang direksiyong e-liham:",
        "changeemail-none": "(wala)",
        "changeemail-password": "Ang iyong {{SITENAME}} password:",
        "changeemail-submit": "Baguhin ang e-liham",
-       "changeemail-cancel": "Kanselahin",
        "changeemail-throttled": "Masyadong madami ang kamakailan lamang mong pagsubok sa pag-login.\nMaghintay po muna ng $1 bago subukan uli.",
        "resettokens": "I-reset ang mga token o susi",
        "bold_sample": "Makapal na panitik",
        "searchrelated": "kaugnay",
        "searchall": "lahat",
        "showingresults": "Ipinapakita sa ibaba ang magpahanggang sa {{PLURAL:$1|'''1''' resultang|'''$1''' mga resultang}} nagsisimula sa #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resultang '''$1''' ng '''$3'''|Mga resultang '''$1 - $2''' ng '''$3'''}} para sa '''$4'''",
        "search-nonefound": "Walang mga resultang tumutugma sa katanungan/pagtatanong.",
        "powersearch-legend": "Paghahanap na may mas mataas na antas",
        "powersearch-ns": "Maghanap sa mga espasyo ng pangalan:",
        "unusedtemplateswlh": "ibang mga ugnay",
        "randompage": "Pahinang walang-pili",
        "randompage-nopages": "Walang mga pahina sa sumusunod na {{PLURAL:$2|ngalan-espasyo|mga ngalan-espasyo}}: $1.",
-       "randomincategory-selectcategory-submit": "Gawin",
        "randomredirect": "Pagkargang walang-pili",
        "randomredirect-nopages": "Walang mga pagkarga sa ngalan-espasyong \"$1\".",
        "statistics": "Mga estadistika",
        "booksources": "Mga mapagkukunang aklat",
        "booksources-search-legend": "Maghanap ng mapagkukunang aklat",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Puntahan",
+       "booksources-search": "Hanapin",
        "booksources-text": "Matatagpuan sa ibaba ang isang tala ng mga kawil patungo sa ibang mga website na nagtitinda ng mga bago at gamit nang aklat, at maaaring may iba pang impormasyon ito tungkol sa mga aklat na hinahanap mo:",
        "booksources-invalid-isbn": "Tila mukhang hindi yata katanggap-tanggap ang ibinigay na ISBN; pakisuri kung may mga kamalian ang pagkakasip/pagkakakopya mula sa orihinal na pinagmulan.",
        "specialloguserlabel": "Tagaganap:",
        "wlheader-enotif": "Umiiral ang pagpapahayag sa pamamagitan ng e-liham.",
        "wlheader-showupdated": "Ipinapakitang may '''makakapal na mga panitik''' ang nabagong/binagong mga pahina mula pa noong huli mong pagdalaw sa kanila",
        "wlnote": "Nasa ibaba ang {{PLURAL:$1|pinakahuling pagbabago|pinakahuling '''$1''' mga pagbabago}} sa loob ng huling {{PLURAL:$2|oras|'''$2''' mga oras}}, magmula noong $3 sa ganap na ika-$4.",
-       "wlshowlast": "Ipakita ang huling $1 mga oras $2 mga araw $3",
+       "wlshowlast": "Ipakita ang huling $1 mga oras $2 mga araw",
        "watchlist-options": "Mga pagpipilian para sa talaan ng mga binabantayan",
        "watching": "Isinasama sa mga binabantayan...",
        "unwatching": "Tinatanggal mula sa mga binabantayan...",
        "import": "Mag-angkat ng pahina",
        "importinterwiki": "Angkat na transwiki",
        "import-interwiki-text": "Pumili ng isang wiki at pamagat ng pahina na iaangkat.\nMapapanatili ang mga petsa ng pagbabago at mga pangalan ng patnugot.\nNaitatala sa [[Special:Log/import|tala ng inangkat]] ang lahat ng mga transwiking aksyon para sa pag-angkat.",
-       "import-interwiki-source": "Batayang wiki/pahina:",
        "import-interwiki-history": "Kopyahin ang lahat ng mga bersyon ng kasaysayan para sa pahinang ito",
        "import-interwiki-templates": "Isama ang lahat ng mga suleras",
        "import-interwiki-submit": "Mag-angkat",
        "exif-urgency-low": "Mababa ( $1 )",
        "exif-urgency-high": "Mataas ($1)",
        "exif-urgency-other": "Pagkakauna-unang tinukoy ng tagagamit ($1)",
-       "watchlistall2": "lahat",
        "namespacesall": "lahat",
        "monthsall": "lahat",
        "confirmemail": "Patotohanan ang adres ng e-liham",
        "logentry-newusers-create2": "Lumikha si $1 ng isang kuwenta ng tagagamit na $3",
        "logentry-newusers-autocreate": "Automatikong {{GENDER:$2|inilikha}} ang account ng tagagamit na $1",
        "rightsnone": "(wala)",
+       "revdelete-summary": "buod ng pagbabago",
        "feedback-bugornote": "Kung handa ka nang detalyadong maglarawan ng isang suliraning teknikal mangyaring [$1 iulat ang kamalian].\nO kaya, maaari mo ring gamitin ang pinadaling pormularyo sa ibaba.  Madadagdagan ang komento mo sa pahinang \"[$3 $2]\", kasama ang iyong pangalan ng tagagamit.",
        "feedback-subject": "Paksa:",
        "feedback-message": "Mensahe:",
index 79b7b31..b3bc4dc 100644 (file)
        "changeemail-newemail": "Е-номә тожә унвон:",
        "changeemail-none": "(ни)",
        "changeemail-submit": "Е-номә дәгиш кардеј",
-       "changeemail-cancel": "Ләғв карде",
        "bold_sample": "Нимәтындә шрифт",
        "bold_tip": "Нимәтындә шрифт",
        "italic_sample": "Курсивә мәтн",
        "search-interwiki-more": "(һәнијән)",
        "searchrelated": "ангыл кардә быә",
        "searchall": "Һәммәј",
-       "showingresultsheader": "{{PLURAL:$5|Нәтиҹә'''$1''' из '''$3'''|Нәтиҹон '''$1 — $2''' че '''$3'''}} бо '''$4'''",
        "search-nonefound": "Бә шымә хәбәсә ујғун омә сәкыштә пәјдо ныбе.",
        "powersearch-toggleall": "Һәммәј",
        "preferences": "Кукон",
        "pager-older-n": "{{PLURAL:$1|1 тикиән канә|$1 ән канә}}",
        "booksources": "Китобон сәвонон",
        "booksources-search-legend": "Китоби барәдә мәлумоти нәве",
-       "booksources-go": "Нәве",
        "log": "Журналон",
        "allpages": "Һәммәј сәһифон",
        "allarticles": "Һәммәј сәһифон",
        "watch": "Думотоно егыниеј",
        "unwatch": "Думотоно ныегыниеј",
        "watchlist-details": "Мызокирә сәһифон ныашмардеј, шымә ноғо доә сијоһиәдә {{PLURAL:$1|$1 сәһифәје|$1 сәһифәје}}.",
-       "wlshowlast": "Нишо дој бә охонә $1 саат $2 руж $3",
+       "wlshowlast": "Нишо дој бә охонә $1 саат $2 руж",
        "watchlist-options": "Ноғо доә сијоһи пеғандон",
        "actioncomplete": "Һәрәкәт иҹро кардә быә",
        "actionfailed": "Һәрәкәт иҹро кардә бәни",
        "exif-gaincontrol-0": "Ни",
        "exif-saturation-0": "Ади",
        "exif-dc-publisher": "Нәшрәкә",
-       "watchlistall2": "һәммәј",
        "namespacesall": "һәммәј",
        "monthsall": "һәммәј",
        "table_pager_limit_submit": "Давард",
index 1aed46c..86e6e3a 100644 (file)
        "pager-newer-n": "kupu foʻou ange ʻe $1",
        "pager-older-n": "kupu motuʻa ange ʻe $1",
        "booksources": "Ngaahi tupunga tohi",
-       "booksources-go": "Fai ā",
        "specialloguserlabel": "ʻEtita:",
        "speciallogtitlelabel": "Hingoa:",
        "log": "Tohinoa",
        "wlheader-enotif": "Kuo fakamafeiaʻi tala mei he tohila",
        "wlheader-showupdated": "*Ko e ngaahi peesi kuo liliu talu he taimi hoʻo ʻaʻahi ki ai, ʻoku ʻasi mai fakasinolahi",
        "wlnote": "ʻOku ʻasi ʻi lalo ʻa e liliu fakamuimui ʻe $1 ʻi he houa fakamuimui ʻe <b>$2</b>.",
-       "wlshowlast": "ʻAsi mai houa fakamuimui ʻe $1, ʻaho ʻe $2, $3",
+       "wlshowlast": "ʻAsi mai houa fakamuimui ʻe $1, ʻaho ʻe $2,",
        "watching": "ʻOku leʻo...",
        "unwatching": "ʻOku taʻeleʻo...",
        "created": "kuo fakatupu",
        "exif-gpsspeed-m": "Maile he houa",
        "exif-gpsdirection-t": "Tūkufua moʻoni",
        "exif-gpsdirection-m": "Tūkufua fakamakineti",
-       "watchlistall2": "kātoa",
        "namespacesall": "vā kotoa",
        "confirmemail": "Fakamoʻoniʻi ho tuʻasila tohila",
        "confirmemail_noemail": "Naʻe ʻikai te ke fakamoʻoniʻi ʻa e tohila totonu ʻi he [[Special:Preferences|faʻiteliha ʻaʻau]].",
index 2f0bb2c..afdb78d 100644 (file)
                        "לערי ריינהארט",
                        "아라",
                        "Arystanbek",
-                       "Sayginer"
+                       "Sayginer",
+                       "Sucsuzz",
+                       "Kafkasmurat",
+                       "Violetanka"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
@@ -77,6 +80,7 @@
        "tog-watchdefault": "Düzenleme 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": "Eski haline getirme kullandığım sayfaları izleme listeme ekle",
        "tog-minordefault": "Varsayılan olarak bütün düzenlemeleri küçük olarak işaretle",
        "tog-previewontop": "Ön izlemeyi düzenleme kutusunun üstünde göster",
        "tog-previewonfirst": "İlk düzenlemede ön izlemeyi göster",
        "index-category": "Dizinli sayfalar",
        "noindex-category": "Dizinli olmayan sayfalar",
        "broken-file-category": "Bozuk dosya bağlantıları içeren sayfalar",
+       "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Hakkında",
        "article": "İçerik sayfası",
        "newwindow": "(yeni bir pencerede açılır)",
        "otherlanguages": "Diğer dillerde",
        "redirectedfrom": "($1 sayfasından yönlendirildi)",
        "redirectpagesub": "Yönlendirme sayfası",
+       "redirectto": "Şuraya yönlendir:",
        "lastmodifiedat": "Bu sayfa son olarak $1, $2 tarihinde güncellenmiştir.",
        "viewcount": "Bu sayfaya {{PLURAL:$1|bir|$1 }} defa erişilmiş.",
        "protectedpage": "Korumalı sayfa",
        "pool-timeout": "Kilit için zaman bitimi bekleniyor",
        "pool-queuefull": "Havuz sırası dolu",
        "pool-errorunknown": "Bilinmeyen hata",
+       "pool-servererror": "Anket sayacı hizmeti kullanılamıyor ($1).",
        "aboutsite": "{{SITENAME}} hakkında",
        "aboutpage": "Project:Hakkında",
        "copyright": "Aksi belirtilmedikçe içerik $1 altındadır.",
        "invalidtitle-knownnamespace": "\"$2\" alan adı için \"$3\" metni geçersiz bir başlık",
        "invalidtitle-unknownnamespace": "Bilinmeyen $1 ad alanı sayısı ve geçersiz \"$2\" başlık",
        "exception-nologin": "Giriş yapılmamış",
-       "exception-nologin-text": "Bu sayfaya ya da eyleme erişmek için lütfen [[Special:Userlogin|oturum açın]].",
+       "exception-nologin-text": "Bu sayfaya ya da eyleme erişmek için lütfen oturum açın.",
        "exception-nologin-text-manual": "Bu sayfaya ya da eyleme erişebilmek için lütfen $1ın.",
        "virus-badscanner": "Yanlış ayarlama: bilinmeyen virüs tarayıcı: ''$1''",
        "virus-scanfailed": "tarama başarısız (kod $1)",
        "passwordreset-emailsent-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası gönderildi.",
        "passwordreset-emailerror-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası oluşturuldu ancak {{GENDER:$2|kullanıcıya}} gönderme işlemi başarısız oldu: $1",
        "changeemail": "E-posta adresini değiştir",
-       "changeemail-header": "Hesabın e-posta adresini değiştirin",
        "changeemail-text": "E-posta adresinizi değiştirmek için bu formu doldurun. Değişikliği onaylamak için parolanızı girmeniz gerekecektir.",
        "changeemail-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
        "changeemail-oldemail": "Mevcut E-posta adresi:",
        "changeemail-none": "(yok)",
        "changeemail-password": "{{SITENAME}} parolanız:",
        "changeemail-submit": "E-posta'yı değiştir",
-       "changeemail-cancel": "İptal",
        "changeemail-throttled": "Çok fazla oturum açma girişiminde bulundunuz.\nLütfen tekrar denemeden önce $1 bekleyin.",
        "resettokens": "Anahtarları sıfırla",
        "resettokens-text": "Burada hesabınızla ilişkili bazı özel verilere erişim izin anahtarları sıfırlayabilirsiniz.\n\n\nSiz yanlışlıkla bunları paylaştıysanız veya hesabınızda bir bozulma varsa bunu yapmalısınız.",
        "mergehistory-comment": "[[:$1]] ile [[:$2]] birleştirildi: $3",
        "mergehistory-same-destination": "Kaynak ve hedef sayfaları aynı olamaz",
        "mergehistory-reason": "Sebep:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "Birleştirme kaydı",
        "pagemerge-logentry": "[[$1]] ile [[$2]] birleştirildi ($3'e kadar olan revizyonlar)",
        "revertmerge": "Ayır",
        "searchall": "hepsi",
        "showingresults": "$2. sonuçtan başlayarak {{PLURAL:$1|'''1''' sonuç |'''$1''' sonuç }} aşağıdadır:",
        "showingresultsinrange": "<strong>$2</strong> ile <strong>$3</strong> arasında toplam <strong>$1</strong> sonuç gösteriliyor.",
-       "showingresultsheader": "'''$4''' için {{PLURAL:$5|'''$3''' sonuçtan '''$1'''i|'''$1 - $2''' arası '''$3''' sonuç}}",
        "search-nonefound": "Sorguyla eşleşen bir sonuç yok.",
        "powersearch-legend": "Gelişmiş arama",
        "powersearch-ns": "Ad alanlarında ara:",
        "preferences": "Tercihler",
        "mypreferences": "Tercihler",
        "prefs-edits": "Değişiklik sayısı:",
-       "prefsnologintext2": "Kullanıcı tercihlerini ayarlamak için lütfen $1ın.",
+       "prefsnologintext2": "Kullanıcı tercihlerini ayarlamak için lütfen oturum açın.",
        "prefs-skin": "Görünüm",
        "skin-preview": "Önizleme",
        "datedefault": "Tercih yok",
        "youremail": "E-posta:",
        "username": "{{GENDER:$1|Kullanıcı adı}}:",
        "prefs-memberingroups": "{{GENDER:$2|Üye}} {{PLURAL:$1|group|grupları}}:",
+       "prefs-memberingroups-type": "$1",
        "prefs-registration": "Kayıt zamanı:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "Gerçek adınız:",
        "yourlanguage": "Dil:",
        "yourvariant": "İçerik dili türevi:",
        "prefs-tokenwatchlist": "Anahtar",
        "prefs-diffs": "Farklar",
        "prefs-help-prefershttps": "Bu tercih bir sonraki girişinizde etkili olacaktır.",
+       "prefswarning-warning": "Henüz kaydedilmemiş değişiklikler yaptınız. \"$\"'e basmadığınız takdirde tercihleriniz güncellenmeyecektir.",
        "prefs-tabs-navigation-hint": "İpucu: Sekmeler listesindeki sekmeler arasında gezinmek için sağ ve sol ok tuşlarını kullanabilirsiniz.",
        "email-address-validity-valid": "E-posta adresi geçerli görünüyor",
        "email-address-validity-invalid": "Geçerli bir e-posta adresi girin",
        "saveusergroups": "Kullanıcı grupları kaydet",
        "userrights-groupsmember": "İçinde olduğu gruplar:",
        "userrights-groupsmember-auto": "Saklı olarak içinde olduğu gruplar:",
+       "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "Bu kullanıcının içinde olduğu grupları değiştirebilirsiniz:\n* Seçili bir kutu, kullanıcının o gruba dahil olduğu anlamına gelir\n* Seçilmemiş bir kutu, kullanıcının o grupta olmadığı anlamına gelir.\n* *, grubu bir kez oluşturduktan sonra silemeceğinizi belirtir, ya da karşılıklı olarak.",
        "userrights-reason": "Neden:",
        "userrights-no-interwiki": "Diğer vikilerdeki kullanıcıların izinlerini değiştirmeye yetkiniz yok.",
        "license": "Lisans:",
        "license-header": "Lisanslama",
        "nolicense": "Hiçbirini seçme",
+       "licenses-edit": "Lisans seçeneklerini düzenle",
        "license-nopreview": "(Önizleme etkin değil)",
        "upload_source_url": "(geçerli, herkesin ulaşabileceği bir URL'den seçtiğiniz dosya)",
        "upload_source_file": "(bilgisayarınızdan seçtiğiniz dosya)",
        "uploadnewversion-linktext": "Dosyanın yenisini yükleyin",
        "shared-repo-from": "$1'dan",
        "shared-repo": "ortak bir havuz",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons'ta",
        "upload-disallowed-here": "Bu dosyanın üzerine yazamazsınız.",
        "filerevert": "$1 dosyasını eski haline döndür",
        "filerevert-legend": "Dosyayı eski haline döndür",
        "randomincategory": "Kategoriye göre rastgele sayfa",
        "randomincategory-invalidcategory": "\"$1\" geçerli bir kategori adı değil.",
        "randomincategory-nopages": "[[:Category:$1|$1]] kategorisinde hiç sayfa yok.",
-       "randomincategory-selectcategory": "Rastgele sayfa alınacak kategori: $1 $2.",
-       "randomincategory-selectcategory-submit": "Getir",
+       "randomincategory-category": "Kategori:",
+       "randomincategory-legend": "Kategoriden rastgele sayfa",
        "randomredirect": "Rastgele yönlendirme",
        "randomredirect-nopages": "\"$1\" ad alanında hiç bir yönlendirme yok.",
        "statistics": "İstatistikler",
        "doubleredirects": "Çift yönlendirmeler",
        "doubleredirectstext": "Bu sayfa diğer yönlendirme sayfalarına yönlendirme yapan sayfaları listeler.\nHer satırın içerdiği bağlantılar; birinci ve ikinci yönlendirme, ayrıca ikinci yönlendirmenin hedefi, ki bu genelde birinci yönlendirmenin göstermesi gereken \"gerçek\" hedef sayfasıdır.\n<del>Üstü çizili</del> girdiler çözülmüştür.",
        "double-redirect-fixed-move": "[[$1]] taşındı.\nYönlendirme otomatik olarak güncellendi ve [[$2]] sayfasına yönlendirildi.",
-       "double-redirect-fixed-maintenance": "[[$1]] - [[$2]] yapılan çift yönlendirme düzeltiliyor.",
+       "double-redirect-fixed-maintenance": "[[$1]] sayfasından [[$2]] sayfasına yapılan çift yönlendirme otomatik olarak düzeltiliyor.",
        "double-redirect-fixer": "Yönlendirme tamircisi",
        "brokenredirects": "Boş yönlendirmeler",
        "brokenredirectstext": "Aşağıdaki yönlendirmeler varolmayan sayfalara bağlantı veriyor:",
        "wantedfiles": "İstenen dosyalar",
        "wantedfiletext-cat": "Aşağıdaki dosyalar kullanılıyor ama mevcut değil. Yabancı depolardaki dosyalar, varolsalar bile gösterilebilir. Böyle yanlış pozitiflerin <del>üstü çizilecektir</del>. Ek olarak, varolmayan dosyaları gömen sayfalar [[:$1]] sayfasında listelenmiştir.",
        "wantedfiletext-nocat": "Aşağıdaki dosyalar kullanılıyor ama mevcut değil. Yabancı depolardaki dosyalar, varolsalar bile gösterilebilir. Böyle yanlış pozitiflerin <del>üstü çizilecektir</del>.",
+       "wantedfiletext-nocat-noforeign": "Aşağıdaki dosyalar kullanıyor ancak mevcut değil.",
        "wantedtemplates": "İstenen şablonlar",
        "mostlinked": "Kendisine en fazla bağlantı verilmiş sayfalar",
        "mostlinkedcategories": "En çok maddeye sahip kategoriler",
        "querypage-disabled": "Bu özel sayfa, performansa dayalı nedenlerle devre dışı bırakılır.",
        "booksources": "Kaynak kitaplar",
        "booksources-search-legend": "Kitap kaynaklarını ara",
-       "booksources-go": "Git",
+       "booksources-isbn": "ISBN:",
+       "booksources-search": "Ara",
        "booksources-text": "Aşağıdaki, yeni ve kullanılmış kitap satan diğer sitelere bağlantıların listesidir, ve aradığınız kitaplar hakkında daha fazla bilgiye sahip olabilirler:",
        "booksources-invalid-isbn": "Verilen ISBN geçersiz gibi görünüyor; orijinal kaynaktan kopyalama hataları için kontrol edin.",
        "specialloguserlabel": "Kullanıcı:",
        "listgrouprights-removegroup-self": "Kendi hesabından {{PLURAL:$2|grup|grupları}} çıkarabilir: $1",
        "listgrouprights-addgroup-self-all": "Kendi hesabına tüm grupları ekleyebilir",
        "listgrouprights-removegroup-self-all": "Kendi hesabından tüm grupları çıkarabilir",
+       "listgrouprights-namespaceprotection-restrictedto": "Kullanıcının değişiklik yapmasına izin veren hak(lar)",
+       "broken-file-category-desc": "Sayfa bozuk dosya bağlantısı (mevcut olmayan bir dosyayı kullanmaya çalışan bağlantı) içeriyor.",
        "trackingcategories-nodesc": "Açıklama yok.",
        "mailnologin": "Gönderi adresi yok.",
        "mailnologintext": "Diğer kullanıcılara e-posta gönderebilmeniz için [[Special:UserLogin|oturum aç]]malısınız ve [[Special:Preferences|tercihler]] sayfasında geçerli bir e-posta adresiniz olmalı.",
        "mywatchlist": "İzleme listesi",
        "watchlistfor2": "$1 için $2",
        "nowatchlist": "İzleme listesinde hiçbir madde bulunmuyor.",
-       "watchlistanontext": "Lütfen izleme listenizdeki maddeleri görmek ya da değiştirmek için $1.",
+       "watchlistanontext": "Lütfen izleme listenizdeki maddeleri görmek ya da değiştirmek için oturum açın.",
        "watchnologin": "Oturum açık değil.",
        "addwatch": "İzleme listesine ekle",
        "addedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenize]] eklenmiştir.\nBundan sonra, bu sayfaya ve ilgili tartışma sayfasına yapılacak değişiklikler burada listelenecek.",
        "wlheader-enotif": "E-posta bildirimi etkin.",
        "wlheader-showupdated": "Sayfaları son ziyaretinizden beri değişen sayfalar '''kalın''' gösterilmiştir.",
        "wlnote": "$3 saat $4 itibariyle son {{PLURAL:$2|bir saatte|'''$2''' saatte}} yapılan {{PLURAL:$1|son değişiklik|son '''$1''' değişiklik}} aşağıdadır.",
-       "wlshowlast": "Son $1 saati $2 günü göster $3",
+       "wlshowlast": "Son $1 saati $2 günü göster",
        "watchlist-options": "İzleme listesi seçenekleri",
        "watching": "İzleniyor...",
        "unwatching": "İzlenmiyor...",
        "exbeforeblank": "Silinmeden önceki içerik: '$1'",
        "delete-confirm": "\"$1\" sil",
        "delete-legend": "sil",
-       "historywarning": "'''Uyarı:''' Silmek üzere olduğunuz sayfanın yaklaşık olarak $1 {{PLURAL:$1|sürüme|sürüme}} sahip bir geçmişi var:",
+       "historywarning": "<strong>Uyarı:</strong> Silmek üzere olduğunuz sayfanın yaklaşık olarak $1 sürüme sahip bir geçmişi var:",
        "confirmdeletetext": "Bu sayfayı veya dosyayı tüm geçmişi ile birlikte veritabanından kalıcı olarak silmek üzeresiniz.\nBu işlemden kaynaklı doğabilecek sonuçların farkında iseniz ve işlemin [[{{MediaWiki:Policy-url}}|Silme kurallarına]] uygun olduğuna eminseniz, işlemi onaylayın.",
        "actioncomplete": "İşlem tamamlandı",
        "actionfailed": "İşlem başarısız oldu",
        "delete-edit-reasonlist": "Silme nedenlerini değiştir",
        "delete-toobig": "Bu sayfa, $1 {{PLURAL:$1|tane değişiklik|tane değişiklik}} ile çok uzun bir geçmişe sahiptir.\nBöyle sayfaların silinmesi, {{SITENAME}} sitesini bozmamak için sınırlanmaktadır.",
        "delete-warning-toobig": "Bu sayfanın büyük bir değişiklik geçmişi var, $1 {{PLURAL:$1|revizyonun|revizyonun}} üzerinde.\nBunu silmek {{SITENAME}} işlemlerini aksatabilir;\ndikkatle devam edin.",
+       "deleteprotected": "Bu sayfayı silemezsiniz çünkü sayfa korumaya alınmış.",
        "deleting-backlinks-warning": "'''Uyarı:''' Silmek üzere olduğunuz sayfaya [[Özel:SayfayaBağlantılar/{{FULLPAGENAME}}|başka sayfalardan]] bağlantılar var veya sayfanın bazı bölümleri başka sayfalar tarafından alıntı olarak kullanılıyor.",
        "rollback": "değişiklikleri geri al",
        "rollback_short": "geri al",
        "protect-othertime": "Farklı zaman:",
        "protect-othertime-op": "farklı zaman",
        "protect-existing-expiry": "Mevcut bitiş zamanı: $3, $2",
+       "protect-existing-expiry-infinity": "Mevcut sona erme zamanı: sonsuz",
        "protect-otherreason": "Diğer/ilave gerekçe:",
        "protect-otherreason-op": "Diğer gerekçe",
        "protect-dropdown": "*Genel koruma gerekçeleri\n** Aşırı vandalizm\n** Aşırı spam\n** Değişiklik savaşı\n** Yüksek trafiğe sahip sayfa",
        "autoblockid": "Otomatik engelleme #$1",
        "block": "Kullanıcıyı engelle",
        "unblock": "Kullanıcının engelini kaldır",
-       "blockip": "Kullanıcıyı engelle",
+       "blockip": "{{GENDER:$1|Kullanıcıyı}} engelle",
        "blockip-legend": "Kullanıcıyı engelle",
        "blockiptext": "Aşağıdaki formu kullanarak belli bir IP'nin veya kayıtlı kullanıcının değişiklik yapmasını engelleyebilirsiniz. Bu sadece vandalizmi engellemek için ve [[{{MediaWiki:Policy-url}}|kurallara]] uygun olarak yapılmalı. Aşağıya mutlaka engelleme ile ilgili bir açıklama yazınız. (örnek: -Şu- sayfalarda vandalizm yapmıştır).",
        "ipaddressorusername": "IP adresi veya kullanıcı adı",
        "ipb-unblock-addr": "$1 için engellemeyi kaldır",
        "ipb-unblock": "Engellemeyi kaldır",
        "ipb-blocklist": "Mevcut olan engellemeleri göster",
-       "ipb-blocklist-contribs": "$1 için katkılar",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} için katkılar",
        "unblockip": "Kullanıcının engellemesini kaldır",
        "unblockiptext": "Daha önceden engellenmiş bir IP adresine ya da kullanıcı adına yazma erişimini geri vermek için aşağıdaki formu kullanın.",
        "ipusubmit": "Bu engellemeyi kaldır",
        "import": "Sayfaları aktar",
        "importinterwiki": "Vikilerarası içe aktarım",
        "import-interwiki-text": "İçe aktarmak için bir viki ve sayfa başlığı seçin.\nRevizyon tarihleri ve yazarların isimleri korunacaktır.\nBütün vikilerarası içe aktarım eylemleri [[Special:Log/import|içe aktarım günlüğünde]] kaydedilmektedir.",
-       "import-interwiki-source": "Kaynak viki/sayfa:",
+       "import-interwiki-sourcewiki": "Kaynak viki:",
+       "import-interwiki-sourcepage": "Kaynak sayfa:",
        "import-interwiki-history": "Sayfanın tüm geçmiş sürümlerini kopyala",
        "import-interwiki-templates": "Tüm şablonları içer",
        "import-interwiki-submit": "Import",
        "exif-urgency-low": "Düşük ( $1 )",
        "exif-urgency-high": "Yüksek ( $1 )",
        "exif-urgency-other": "Kullanıcı tanımlı öncelik ($1)",
-       "watchlistall2": "Hepsini göster",
        "namespacesall": "hepsi",
        "monthsall": "hepsi",
        "confirmemail": "E-posta adresini onayla",
        "confirm-unwatch-button": "TAMAM",
        "confirm-unwatch-top": "Bu sayfayı izleme listenizden çıkarın",
        "percent": "%$1",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← önceki sayfa",
        "imgmultipagenext": "sonraki sayfa →",
        "imgmultigo": "Git!",
        "logentry-rights-rights-legacy": "$1, $3 için grup üyeliğini {{GENDER:$2|değiştirdi}}",
        "logentry-rights-autopromote": "$1, $4 iken $5 olarak otomatik {{GENDER:$2|terfi edildi}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|yükledi}} $3",
+       "logentry-upload-overwrite": "$1 $3 dosyasının yeni bir sürümünü {{GENDER:$2|yükledi}}",
        "rightsnone": "(hiçbiri)",
+       "revdelete-summary": "değişiklik özeti",
        "feedback-bugornote": "Eğer teknik bir problemi detaylarıyla açıklamaya hazırsanız lütfen [$1 bir hata raporlayın]. Diğer taraftan, aşağıdaki kolay formu kullanabilirsiniz. Yorumunuz, kullanıcı adınızla beraber \"[$3 $2]\" sayfasına eklenecektir.",
        "feedback-subject": "Konu:",
        "feedback-message": "Mesaj:",
        "pagelang-use-default": "Varsayılan dili kullan",
        "pagelang-select-lang": "Dil seçin",
        "right-pagelang": "Sayfa dilini değiştir",
-       "action-pagelang": "sayfa dilini değiştir"
+       "action-pagelang": "sayfa dilini değiştir",
+       "mediastatistics": "Medya istatistikleri",
+       "mediastatistics-summary": "Karşıya yüklenen dosya türlerine ilişkin istatistikler. Bu yalnızca bir dosyanın en son sürümünü içerir. Eski veya silinen dosyala sürümleri hariç tutulur.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 byte}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME türü",
+       "mediastatistics-table-extensions": "Olası uzantılar",
+       "mediastatistics-table-count": "Dosya sayısı",
+       "mediastatistics-table-totalbytes": "Toplam boyut",
+       "mediastatistics-header-unknown": "Bilinmeyen",
+       "mediastatistics-header-bitmap": "Bitmap görüntüleri",
+       "mediastatistics-header-drawing": "Çizimler (vektör görüntüler)",
+       "mediastatistics-header-audio": "Ses",
+       "mediastatistics-header-video": "Videolar",
+       "mediastatistics-header-multimedia": "Zengin medya",
+       "mediastatistics-header-office": "Ofis",
+       "mediastatistics-header-text": "Metin türü",
+       "mediastatistics-header-executable": "Yürütülebilir dosyalar",
+       "mediastatistics-header-archive": "Sıkıştırılmış biçimler",
+       "json-warn-trailing-comma": "$1 takip eden {{PLURAL:$1|virgül|virgüller}} JSON'dan kaldırılmıştır.",
+       "json-error-unknown": "JSON ile ilgili bir sorun oluştu. Hata:$1",
+       "json-error-depth": "Azami yığın derinliği aşıldı",
+       "json-error-state-mismatch": "Geçersiz veya hatalı biçimlendirilmiş JSON",
+       "json-error-ctrl-char": "Kontrol karakteri hatası, muhtemelen yanlış kodlanmış",
+       "json-error-syntax": "Sözdizimi hatası",
+       "json-error-utf8": "Hatalı biçimlendirilmiş UTF-8 karakterleri bulundu, muhtemelen yanlış kodlanmış",
+       "json-error-recursion": "Kodlanacak değeri bir veya daha fazla tekrarlı başvurular",
+       "json-error-inf-or-nan": "Değerde kodlanacak bir veya daha fazla NAN veya INF değerleri",
+       "json-error-unsupported-type": "Kodlanamaz bir değer çeşidi girildi"
 }
index fbb3d9b..5d532fc 100644 (file)
        "search-interwiki-more": "(heşa)",
        "searchrelated": "related",
        "searchall": "kulle",
-       "showingresultsheader": "{{PLURAL:$5|Nafqo '''$1''' of '''$3'''|Nafqe '''$1 - $2''' men '''$3'''}} l'''$4'''",
        "search-nonefound": "Für deine Suchanfrage wurden keine Ergebnisse gefunden.",
        "powersearch-togglelabel": "Sım Qontrol:",
        "powersearch-toggleall": "Kulle",
        "pager-older-n": "{{PLURAL:$1|3atiqo1|3atiqe $1}}",
        "booksources": "Kruxyo baNumarat duISBN",
        "booksources-search-legend": "Krax Mabu³e me Kṭowe",
-       "booksources-go": "Zux",
        "log": "Logs",
        "allpages": "aFaṭaṭe kulle",
        "allarticles": "aFaṭaṭe kulle",
        "watch": "Watch",
        "unwatch": "Unwatch",
        "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.",
-       "wlshowlast": "Maḥway li aŞuḥlofe dıtsimi meqım $1 Sa³ayat $2 Yawme $3",
+       "wlshowlast": "Maḥway li aŞuḥlofe dıtsimi meqım $1 Sa³ayat $2 Yawme",
        "watchlist-options": "Watchlist options",
        "actioncomplete": "uDuboro kamıl",
        "actionfailed": "Action failed",
        "exif-writer": "Kaṭowo",
        "exif-languagecode": "Leşono",
        "exif-cameraownername": "uMoro diQamera",
-       "watchlistall2": "kulle",
        "namespacesall": "kulle",
        "monthsall": "kulle",
        "watchlisttools-view": "View relevant changes",
index 91da0bb..c38423b 100644 (file)
        "searchrelated": "Yelanaka",
        "searchall": "Hinkwaswo",
        "showingresults": "Kombisa e hansi kufika eka {{PLURAL:$1|'''1''' mbuyelo|'''$1''' mimbuyelo}} Kusungula hi#'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|nkutlunya '''$1''' wa '''$3''' lowu|minkutlunya '''$1 - $2''' ya '''$3''' leyi}} yelanaka na '''$4'''",
        "search-nonefound": "Kuhava mimbuyelo leyi yelanaka xikombelo lexi.",
        "mypreferences": "Minhlawulo ya mina",
        "prefs-edits": "Ntsengo wa mindzulamiso:",
        "pager-older-n": "{{PLURAL:$1|ra khale|$1 ya khale}}",
        "booksources": "Swihlovo swatibuku",
        "booksources-search-legend": "Lavalava swihlovo swa tibuku",
-       "booksources-go": "Nghena",
        "specialloguserlabel": "Mutirhisi:",
        "log": "Nghula ya minxaxamelo",
        "allpages": "Matluka hinkwawo",
        "watchthispage": "Languta tluka leri",
        "unwatch": "Ungalanguti",
        "watchlist-details": "{{PLURAL:$1|$1 tluka|$1 wa matluka}} eka nxaxamelo wa leswi uswilanguteke, kungasi hlayiwa matluka yu mbulavulo.",
-       "wlshowlast": "Komba $1 wati awara  $2 wa masiku kumbe $3",
+       "wlshowlast": "Komba $1 wati awara  $2 wa masiku kumbe",
        "watchlist-options": "Minhlawulo ya nxaxamelo wa leswilangutiweke",
        "watching": "Ulangutile...",
        "unwatching": "Utshika ku languta...",
        "metadata": "Nghula ya vuxokoxoko",
        "metadata-help": "Fayili leyi yi khome vuxokoxoko lebyi engetelekeke, swingaendleka yi hoxiwile kusuka eka Khemera kumbe muchini wo gandlisa lowu tirhisiweke ku yi tumbuluxa.\nLoko fayili yi antswisiwile kusukela eka matshamelo ya yona yo sungula, vuxokoxoko bya yona byinga va byi cincile.",
        "metadata-fields": "Vuxokoxoko bya xifaniso lexi nga eka hungu leri byi ta kombiwa eka tluka leri kombaka xifaniso lexi loko tafula ra nxaxamela wa vuxokoxoko ri pfariwa.\nLebyi n'wana vuxokoxoko bya finiso byitumbetiwile.\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",
-       "watchlistall2": "Hinkwawo",
        "namespacesall": "Hinkwawo",
        "monthsall": "hikwato",
        "watchlisttools-view": "Vona kucinca loku yelanaka",
index 57d4c06..2d27fd8 100644 (file)
@@ -20,7 +20,8 @@
                        "Ильнар",
                        "Рашат Якупов",
                        "Умар",
-                       "아라"
+                       "아라",
+                       "Derslek"
                ]
        },
        "tog-underline": "Сылтамаларның астына сызу:",
        "print": "Бастыру",
        "view": "Карау",
        "edit": "Үзгәртү",
+       "edit-local": "Локаль тасвирламаны үзгәртергә",
        "create": "Төзү",
+       "create-local": "Локаль тасвирлама өстәргә",
        "editthispage": "Бу битне үзгәртү",
        "create-this-page": "Бу битне төзү",
        "delete": "Бетерү",
        "deletethispage": "Бу битне бетерү",
        "undeletethispage": "Бу битне кайтарырга",
-       "undelete_short": "$1 {{PLURAL:$1|үзгәртмәне}} торгызу",
-       "viewdeleted_short": "{{PLURAL:$1|1=1 бетерелгән үзгәртүне|$1 бетерелгән үзгәртүне}} карау",
+       "undelete_short": "$1 {{PLURAL:$1|төзәтмәне|$1 төзәтмә}} торгызу",
+       "viewdeleted_short": "{{PLURAL:$1|1=1 бетерелгән үзгәртүне|$1 бетерелгән үзгәртүне}} карау\n{{PLURAL:$1|бетерелгән төзәтмәне|$1 бетерелгән төзәтмәне}} карау",
        "protect": "Яклау",
        "protect_change": "үзгәртү",
        "protectthispage": "Бу битне яклау",
        "otherlanguages": "Башка телләрдә",
        "redirectedfrom": "($1 битеннән юнәлтелде)",
        "redirectpagesub": "Башка биткә юнәлтү бите",
+       "redirectto": "Шунда юнәлтелә:",
        "lastmodifiedat": "Бу битне соңгы үзгәртү: $2, $1.",
-       "viewcount": "Бу биткә $1 {{PLURAL:$1|тапкыр}} мөрәҗәгать иттеләр.",
+       "viewcount": "Бу биткә $1 {{PLURAL:$1|бер тапкыр|$1 тапкыр}} мөрәҗәгать иттеләр.",
        "protectedpage": "Якланган бит",
        "jumpto": "Моңа күчү:",
        "jumptonavigation": "навигация",
        "passwordreset-emailsent-capture": "Җибәрелгән хат-искәртү түбәндә китерелә",
        "passwordreset-emailerror-capture": "Түбәндә язылган хат-искәртү китерелгән, аны җибәрмәүнең сәбәбе:$1",
        "changeemail": "Электрон әрҗә адресын үзгәртү",
-       "changeemail-header": "Электрон әрҗә адресын үзгәртү",
        "changeemail-text": "Электрон әрҗә адресын үзгәртү өчен, бу кырларны тутырыгыз. Үзгәртүне раслау өчен, сезгә серсүзне җыярга кирәк булыр",
        "changeemail-no-info": "Бу сәхифәгә турыдан-туры мөрәҗәгать итәр өчен, сез системага керергә тиешсез",
        "changeemail-oldemail": "Хәзерге электрон әрҗә адресы:",
        "changeemail-none": "(юк)",
        "changeemail-password": "«{{SITENAME}}» проекты өчен серсүзегез:",
        "changeemail-submit": "E-mail адресын үзгәртү",
-       "changeemail-cancel": "Баш тарту",
        "bold_sample": "Калын язылыш",
        "bold_tip": "Калын язылыш",
        "italic_sample": "Курсив язылыш",
        "searchrelated": "бәйләнгән",
        "searchall": "барлык",
        "showingresults": "Аста № '''$2''' {{PLURAL:$1|башлап}} '''$1''' {{PLURAL:$1|результат}} күрсәтелгән.",
-       "showingresultsheader": "'''$4''' өчен {{PLURAL:$5|1=Результат '''$1''' сеннән '''$3'''|Результатлар '''$1 — $2''' сеннән  '''$3'''}}",
        "search-nonefound": "Сорауга туры килгән җаваплар табылмады.",
        "powersearch-legend": "Өстәмә эзләү",
        "powersearch-ns": "исемнәрендә эзләү",
        "suppress": "Яшерү",
        "booksources": "Китап чыганаклары",
        "booksources-search-legend": "Китап чыганакларыны эзләү",
-       "booksources-go": "Башкару",
        "booksources-text": "Әлеге биттә күрсәтелгән сылтамалар ярәмендә сезнең кызыксындырган китап буенча өстәмә мәгълүматлар табарга мөмкин. Болар интернет-кибетләр һәм китапханә җыентыгында эзләүче системалар.",
        "booksources-invalid-isbn": "Бирелгән ISBN саны бәлки хаталдыр. Зинһар, бирелгән саннарны яңадан тикшерегез.",
        "specialloguserlabel": "Кулланучы:",
        "unwatchthispage": "Күзәтүне туктат",
        "notanarticle": "Мәкалә түгел",
        "watchlist-details": "Күзәтү исемлегегездә, бәхәс битләрен санамыйча, {{PLURAL:$1|1=$1 бит|$1 бит}} бар.",
-       "wlshowlast": "Баягы $1 сәгать $2 көн эчендә яки $3ны күрсәт",
+       "wlshowlast": "Баягы $1 сәгать $2 көн эчендә яки ны күрсәт",
        "watchlist-options": "Күзәтү исемлеге көйләүләре",
        "watching": "Күзәтү исемлегемә өстәүе…",
        "unwatching": "Күзәтү исемлегемнән чыгаруы…",
        "import": "Битләр кертү",
        "importinterwiki": "Викиара кертү",
        "import-interwiki-text": "Викины һәм кертелүче битнең исемен языгыз.\nҮзгәртүләр вакыты һәм аның авторлары сакланачак.\nБөтен викиара күчерүләр [[Special:Log/import|махсус журналда]] сакланачак.",
-       "import-interwiki-source": "Вики-чыганак/бит:",
        "import-interwiki-history": "Бу битнең барлык үзгәртү тарихын күчермәләү",
        "import-interwiki-templates": "Барлык үрнәкләрне кертү",
        "import-interwiki-submit": "Импортлау",
        "exif-gpsstatus-v": "Мәгълүматларны җибәрүгә әзер",
        "exif-gpsspeed-k": "км/сәг",
        "exif-gpsspeed-m": "миля/сәг",
-       "watchlistall2": "барлык",
        "namespacesall": "барлык",
        "monthsall": "барлык",
        "recreate": "Яңадан ясау",
        "logentry-newusers-create2": "$1 $3 кулланучы хисап язмасын төзеде",
        "logentry-newusers-autocreate": "Автоматик рәвештә $1 хисап язмасы төзелде.",
        "rightsnone": "(юк)",
+       "revdelete-summary": "үзгәртүләр тасвирламасы",
        "feedback-bugornote": "Әгәр дә сез техник проблеманы җентекләп тасвирларга әзер икәнсез, зинһар өчен, [$1 хата турында хәбәр итегез].\nБашка очракта сез түбәндәге гади форманы куллана аласыз. Сезнең шәрехләмә \"[$3 $2]\" сәхифәсенә сезнең кулланучы исеме һәм сез кулланган браузер исеме белән бергә өстәләчәк.",
        "feedback-subject": "Тема:",
        "feedback-message": "Хәбәр:",
index a7f86ed..fb54e68 100644 (file)
        "searchrelated": "bäylängän",
        "searchall": "barlıq",
        "showingresults": "Asta № '''$2''' {{PLURAL:$1|başlap}} '''$1''' {{PLURAL:$1|rezultat}} kürsätelgän.",
-       "showingresultsheader": "'''$4''' öçen {{PLURAL:$5|Rezultat '''$1''' sennän '''$3'''|Rezultatlar '''$1 — $2''' sennän  '''$3'''}}",
        "search-nonefound": "Sorawğa turı kilgän cawaplar tabılmadı.",
        "powersearch-legend": "Östämä ezläw",
        "powersearch-ns": "isemnärendä ezläw",
        "suppress": "Yäşerü",
        "booksources": "Kitap çığanaqları",
        "booksources-search-legend": "Kitap çığanaqlarını ezläw",
-       "booksources-go": "Başqaru",
        "booksources-text": "Älege bittä kürsätelgän sıltamalar yärämendä sezneñ qızıqsındırğan kitap buyınça östämä mäğlümatlar tabarğa mömkin. Bolar internet-kibetlär häm kitapxanä cıyıntığında ezläwçe sistemalar.",
        "booksources-invalid-isbn": "Birelgän ISBN sanı bälki xataldır. Zinhar, birelgän sannarnı yañadan tikşeregez.",
        "specialloguserlabel": "Qullanuçı:",
        "unwatch": "Küzätmäw",
        "notanarticle": "Mäqälä tügel",
        "watchlist-details": "Küzätü isemlegegezdä, bäxäs bitlären sanamıyça, {{PLURAL:$1|$1 bit|$1 bit}} bar.",
-       "wlshowlast": "Bayağı $1 säğät $2 kön eçendä yäki $3nı kürsät",
+       "wlshowlast": "Bayağı $1 säğät $2 kön eçendä yäki nı kürsät",
        "watchlist-options": "Küzätü isemlege köyläwläre",
        "watching": "Küzätü isemlegemä östäwe…",
        "unwatching": "Küzätü isemlegemnän çığaruı…",
        "exif-subjectdistancerange-3": "Yıraqtan töşerü",
        "exif-gpsspeed-k": "km/säğ",
        "exif-gpsspeed-m": "milya/säğ",
-       "watchlistall2": "barlıq",
        "namespacesall": "barlıq",
        "monthsall": "barlıq",
        "recreate": "Yañadan yasaw",
        "htmlform-reset": "Üzgärtülärne kire qaytaru",
        "htmlform-selectorother-other": "Başqa",
        "revdelete-restricted": "çikläwlär idaräçelärgä dä qullanıla",
-       "rightsnone": "(yuq)"
+       "rightsnone": "(yuq)",
+       "revdelete-summary": "üzgärtülär taswirlaması"
 }
index 0fb063a..bbc4284 100644 (file)
        "accountcreatedtext": "«$1» деп ажыглакчының бүрүткел бижиини бүдүрген.",
        "login-abort-generic": "Системаже таптыг эвес кирип тур силер",
        "loginlanguagelabel": "Дыл: $1",
+       "pt-userlogout": "Үнер",
        "php-mail-error-unknown": "PHP-ниң mail() ажыл-чорудулгазында билбес алдаг бар.",
        "changepassword": "Чажыт сөстү өскертири",
        "resetpass_text": "<!-- Маңаа сөзүглелди немерелээри -->",
        "passwordreset-email": "Э-чагааның адреси:",
        "passwordreset-emailelement": "Ажыглакчы ады: $1\nТүр чажыт сөс: $2",
        "changeemail": "Э-чагааның адресин өскертири",
-       "changeemail-header": "Бүрүткел бижиктиң э-чагааның адресин өскертири",
        "changeemail-oldemail": "Амгы э-чагааның адреси:",
        "changeemail-newemail": "Чаа э-чагааның адреси:",
        "changeemail-none": "(чок)",
        "changeemail-submit": "Э-чагааны өскертири",
-       "changeemail-cancel": "Соксаары",
        "bold_sample": "Кара сөзүглел",
        "bold_tip": "Кара сөзүглел",
        "italic_sample": "Ийлендирер сөзүглел",
        "search-interwiki-more": "(артык)",
        "searchrelated": "холбаалыг",
        "searchall": "шупту",
-       "showingresultsheader": "«'''$4'''» дилээниниң {{PLURAL:$5|1='''$3''' одуругдан '''$1''' түңнели|'''$3''' одуругдан '''$1—$2''' түңнелдери}}",
        "search-nonefound": "Айыткан негелдениң түңнели чок",
        "powersearch-ns": "Аттар делгемнеринден дилээри:",
        "powersearch-toggleall": "Шупту",
        "pager-older-n": "{{PLURAL:$1|артык эски}}",
        "booksources": "Номнарның үнген дөзү",
        "booksources-search-legend": "Номнуң медээлерин дилээри",
-       "booksources-go": "Күүcедири",
        "specialloguserlabel": "Күүседикчи:",
        "speciallogtitlelabel": "Target (aтка азы ажыглакчыга):",
        "log": "Журналдар",
        "unwatch": "Хайгааравас",
        "unwatchthispage": "Бо арынны хайгаарабас",
        "watchlist-details": "Чугаалажылга арыннарын санаваска, хайгаарал даңзыңарда {{PLURAL:$1|$1 арын}} бар.",
-       "wlshowlast": "Сөөлү $1 шак болгаш $2 хүн иштинде $3 көргүзери",
+       "wlshowlast": "Сөөлү $1 шак болгаш $2 хүн иштинде  көргүзери",
        "watchlist-options": "Хайгаарал даңзының эдиглери",
        "watching": "Хайгаарап турар...",
        "unwatching": "Хайгааравайн турар...",
        "exif-iimcategory-sci": "Эртем база техника",
        "exif-iimcategory-spo": "Спорт",
        "exif-iimcategory-wea": "Агаар",
-       "watchlistall2": "шупту",
        "namespacesall": "шупту",
        "monthsall": "шупту",
        "recreate": "Катап чогаадыры",
index a4f87fa..9e5168f 100644 (file)
        "passwordreset-emailsent-capture": "پارولنى قايتا بېكىتىش ئېلخېتى يوللاندى، تۆۋەندە كۆرسىتىلىدۇ.",
        "passwordreset-emailerror-capture": "ھاسىل قىلىنغان پارولنى قايتا بېكىتىش ئېلخېتى تۆۋەندە كۆرسىتىلگەندەك ئەمما ئۇنى {{GENDER:$2|ئىشلەتكۈچى}}گە يوللىيالمىدى: $1",
        "changeemail": "ئېلخەت ئادرېس ئۆزگەرت",
-       "changeemail-header": "ھېساباتنىڭ ئېلخەت ئادرېسىنى ئۆزگەرت",
        "changeemail-text": "بۇ جەدۋەل تاماملانسا ئېلخەت ئادرېسىڭىزنى ئۆزگەرتىدۇ. سىز ئىم كىرگۈزۈپ بۇ ئۆزگەرتىشنى جەزملەيسىز.",
        "changeemail-no-info": "سىز تىزىمغا كىرگەندىن كېيىن بىۋاسىتە بۇ بەتكە كىرىشىڭىز لازىم.",
        "changeemail-oldemail": "نۆۋەتتىكى ئېلخەت ئادرېسى:",
        "changeemail-none": "(يوق)",
        "changeemail-password": "{{SITENAME}} دىكى پارولىڭىز:",
        "changeemail-submit": "ئېلخەت ئۆزگەرت",
-       "changeemail-cancel": "ۋاز كەچ",
        "changeemail-throttled": "سىز بۇ ھېساباتتا تىزىمغا كىرىشنى كۆپ قېتىم سىنىدىڭىز.\n$1 ساقلاپ، ئاندىن قايتا سىناڭ.",
        "resettokens": "ئاچقۇچلۇق بەلگىلەرنى قايتا بېكىتمەك",
        "resettokens-text": "سىز بۇ يەردە سىزنىڭ ھىساۋاتىڭىزگە مۇناسۋەتلىك شەخسى ئۇچۇر مەخپىيەتلىكىنى قايتا كۆرەلەيسىز.\n\nئۇ ئۇچۇرلار ھەمبەھرلىنىپ كەتسە ياكى باشقىلار ئىشلىتۋالغان بولسا، ئۇ ئۇچۇرلارنى ئەسلىگە قايتۇرۇڭ.",
        "searchrelated": "ئالاقىدار",
        "searchall": "ھەممىسى",
        "showingresults": "تۆۋەندە '''$2''' - نەتىجىدىن باشلانغان {{PLURAL:$1|'''1''' نەتىجە|'''$1''' نەتىجە}} كۆرسىتىدۇ:",
-       "showingresultsheader": "'''$4''' نىڭ {{PLURAL:$5|'''$1''' دىن '''$3'''غىچە نەتىجە | '''$1 - $2''' غىچە جەمئى '''$3''' نەتىجە}}",
        "search-nonefound": "سۈرۈشتۈرۈشكە ماس نەتىجە تېپىلمىدى.",
        "powersearch-legend": "ئالىي ئىزدەش",
        "powersearch-ns": "ئات بوشلۇقىدىن ئىزدە:",
        "booksources": "كىتاب مەنبەسى",
        "booksources-search-legend": "كىتاب مەنبەسى ئىزدە",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "يۆتكەل",
        "booksources-text": "تۆۋەندىكىسى بىر قىسىم تور كىتابخانىلىرىنىڭ تىزىملىكى، ئىچىدە سىز ئىزدىمەكچى بولغان كىتابلارنىڭ تېخىمۇ كۆپ ئۇچۇرى بولۇشى مۇمكىن:",
        "booksources-invalid-isbn": "تەمىنلىگەن ISBN نومۇرى توغرا ئەمەس. ئەسلى كۆچۈرگەن مەنبەدىكى نومۇردا خاتالىق بار يوقلۇقىنى تەكشۈرۈڭ.",
        "specialloguserlabel": "ئىشلەتكۈچى:",
        "wlheader-enotif": "ئېلخەتتە ئەسكەرتىش ئىقتىدارى قوزغىتىلدى.",
        "wlheader-showupdated": "سىز ئالدىنقى قېتىم كۆرگەندىن كېيىن ئۆزگەرتىلگەن بەتلەر '''توم''' كۆرۈنىدۇ",
        "wlnote": "تۆۋەندىكىسى يېقىنقى {{PLURAL:$2|سائەت}} ئىچىدىكى ئاخىرقى '{{PLURAL:$1| قېتىملىق}}  ئۆزگەرتىش، $3 $4 گىچە.",
-       "wlshowlast": "يېقىنقى $1 سائەت $2 كۈن $3 نىڭ ئۆزگەرتىشىنى كۆرسەت",
+       "wlshowlast": "يېقىنقى $1 سائەت $2 كۈن  نىڭ ئۆزگەرتىشىنى كۆرسەت",
        "watchlist-options": "كۆزەت تىزىملىك تاللانما",
        "watching": "كۆزەت قىلىۋاتىدۇ…",
        "unwatching": "كۆزەت قىلمايۋاتىدۇ…",
        "import": "بەت ئەكىر",
        "importinterwiki": "wiki ھالقىپ ئەكىر",
        "import-interwiki-text": "wiki دىن بىرنى ۋە بەت ماۋزۇسىنى تاللاپ ئەكىرىڭ.\nتۈزىتىلگەن ۋاقىت ۋە تەھرىرلىگۈچى ئاتى بىرلا ۋاقىتتا ساقلىنىدۇ.\nبارلىق wiki ھالقىغان ئەكىرىش مەشغۇلاتى  [[Special:Log/import|ئەكىرىش خاتىرىسى]]غا خاتىرىلىنىدۇ.",
-       "import-interwiki-source": "مەنبە wiki /بەت:",
        "import-interwiki-history": "بۇ بەتنىڭ ھەممە تارىخى تۈزىتىلگەن نەشرىنى كۆچۈر.",
        "import-interwiki-templates": "ھەممە قېلىپىنى ئۆز ئىچىگە ئالىدۇ",
        "import-interwiki-submit": "ئەكىر",
        "exif-urgency-low": "تۆۋەن ($1)",
        "exif-urgency-high": "يۇقىرى ($1)",
        "exif-urgency-other": "ئىشلەتكۈچى بەلگىلىگەن ئالدىنلىق ($1)",
-       "watchlistall2": "ھەممىسى",
        "namespacesall": "ھەممىسى",
        "monthsall": "ھەممىسى",
        "confirmemail": "جەزملەش ئېلخەت ئادرېسى",
        "logentry-rights-rights-legacy": "$3 نىڭ ئىشلەتكۈچى گۇرۇپپىسىنى $1 ئۆزگەرتتى",
        "logentry-rights-autopromote": "$1 نىڭ ئىشلەتكۈچى گۇرۇپپىسى ئۆزلۈكىدىن $4 دىن $5 غا يۈكسەلدى",
        "rightsnone": "(يوق)",
+       "revdelete-summary": "ئۈزۈندە تەھرىرلە",
        "feedback-bugornote": "ئەگەر بىر تېخنىكىلىق مەسىلىنى تەپسىلىي بايان قىلىشقا تەييارلانماقچى بولسىڭىز، [$1 خاتالىق دوكلات]ى يوللاڭ. ياكى تۆۋەندىكى ئاددىي جەدۋەلنى ئىشلىتىڭ. ئىنكاسىڭىز \"[$3 $2]\" بەتكە قوشۇلىدۇ، ئىشلەتكۈچى ئاتىڭىز ۋە ئىشلەتكەن توركۆرگۈڭىز قوشۇپ قويۇلىدۇ.",
        "feedback-subject": "تېما:",
        "feedback-message": "ئۇچۇر:",
index 26a9de1..a33d17d 100644 (file)
@@ -49,7 +49,9 @@
                        "아라",
                        "Calak",
                        "Mykola Swarnyk",
-                       "Milicevic01"
+                       "Milicevic01",
+                       "Lamsec",
+                       "Olion"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
@@ -71,7 +73,7 @@
        "tog-previewontop": "Показувати попередній перегляд перед вікном редагування, а не після",
        "tog-previewonfirst": "Показувати попередній перегляд під час першого редагування",
        "tog-enotifwatchlistpages": "Повідомляти електронною поштою про зміну сторінки або файлу з мого списку спостереження",
-       "tog-enotifusertalkpages": "Ð\9fовÑ\96домлÑ\8fÑ\82и ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\8e Ð¿Ð¾Ñ\88Ñ\82оÑ\8e Ð¿Ñ\80о Ð·Ð¼Ñ\96ни Ð½Ð° Ð¼Ð¾Ñ\97й Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\96 обговорення",
+       "tog-enotifusertalkpages": "Ð\9fовÑ\96домлÑ\8fÑ\82и ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\8e Ð¿Ð¾Ñ\88Ñ\82оÑ\8e Ð¿Ñ\80о Ð·Ð¼Ñ\96ни Ð¼Ð¾Ñ\94Ñ\97 Ñ\81Ñ\82оÑ\80Ñ\96нки обговорення",
        "tog-enotifminoredits": "Надсилати мені електронного листа навіть при незначних редагуваннях сторінок та файлів",
        "tog-enotifrevealaddr": "Показувати мою поштову адресу в повідомленнях",
        "tog-shownumberswatching": "Показувати число користувачів, які додали сторінку до свого списку спостереження",
        "october-date": "$1 жовтня",
        "november-date": "$1 листопада",
        "december-date": "$1 грудня",
-       "pagecategories": "{{PLURAL:$1|1=Категорія|Категорії|Категорій}}",
-       "category_header": "Сторінок в категорії «$1»",
+       "pagecategories": "{{PLURAL:$1|1=Категорія|Категорії}}",
+       "category_header": "Сторінок у категорії «$1»",
        "subcategories": "Підкатегорії",
        "category-media-header": "Файли в категорії «$1»",
        "category-empty": "''Ця категорія зараз порожня.''",
-       "hidden-categories": "{{PLURAL:$1|1=Прихована категорія|Приховані категорії|Прихованих категорій}}",
+       "hidden-categories": "{{PLURAL:$1|1=Прихована категорія|Приховані категорії}}",
        "hidden-category-category": "Приховані категорії",
        "category-subcat-count": "{{PLURAL:$2|Ця категорія має тільки таку підкатегорію.|Показано $1 {{PLURAL:$1|підкатегорію з|підкатегорії з|підкатегорій із}} $2.}}",
        "category-subcat-count-limited": "У цій категорії {{PLURAL:$1|$1 підкатегорія|$1 підкатегорії|$1 підкатегорій}}.",
        "otherlanguages": "Іншими мовами",
        "redirectedfrom": "(Перенаправлено з $1)",
        "redirectpagesub": "Сторінка-перенаправлення",
+       "redirectto": "Перенаправити на:",
        "lastmodifiedat": "Цю сторінку востаннє змінено: $2, $1.",
        "viewcount": "Цю сторінку переглядали $1 {{PLURAL:$1|раз|рази|разів}}.",
        "protectedpage": "Захищена сторінка",
        "invalidtitle-knownnamespace": "Неприйнятна назва у просторі імен «$2» і текстом «$3»",
        "invalidtitle-unknownnamespace": "Неправильний заголовок з невідомим номером простору імен ($1) і текстом: «$2»",
        "exception-nologin": "Не виконано вхід",
-       "exception-nologin-text": "Необхідно [[Special:Userlogin|увійти]], щоб мати доступ до цієї сторінки або дії.",
+       "exception-nologin-text": "Необхідно увійти, щоб мати доступ до цієї сторінки або дії.",
        "exception-nologin-text-manual": "Потрібно $1, щоб мати доступ до цієї сторінки або дії.",
        "virus-badscanner": "Помилка налаштування: невідомий сканер вірусів: ''$1''",
        "virus-scanfailed": "помилка сканування (код $1)",
        "createaccount-text": "Хтось створив обліковий запис «$2» на сервері проекту {{SITENAME}} ($4) з паролем «$3», зазначивши вашу адресу електронної пошти. Вам слід зайти і змінити пароль.\n\nІгноруйте дане повідомлення, якщо обліковий запис було створено помилково.",
        "login-throttled": "Ви зробили надто багато спроб ввійти до системи.\nБудь ласка, зачекайте $1 перед повторною спробою.",
        "login-abort-generic": "Не вдалося ввійти до системи",
+       "login-migrated-generic": "Ваш обліковий запис було перенесено і ваше ім'я користувача більше не існує на цій вікі.",
        "loginlanguagelabel": "Мова: $1",
        "suspicious-userlogout": "Ваш запит на завершення сеансу відхилений, оскільки він схожий на запит, відправлений зіпсованим веб-оглядачем або кешуючим проксі-сервером.",
        "createacct-another-realname-tip": "Справжнє ім'я є необов'язковим.\nЯкщо ви вирішите надати його, воно буде використовуватись для позначення редагувань та інших дій користувача.",
        "passwordreset-emailsent-capture": "Електронний лист скидання пароля було надіслано, як показано нижче.",
        "passwordreset-emailerror-capture": "Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання {{GENDER:$2|користувачеві|користувачці}} $1 не вдалося.",
        "changeemail": "Змінити адресу електронної пошти",
-       "changeemail-header": "Зміна адреси електронної пошти",
        "changeemail-text": "Заповніть цю форму, щоб змінити адресу електронної пошти. Вам потрібно буде ввести пароль, щоб підтвердити ці зміни.",
        "changeemail-no-info": "Ви повинні увійти в систему, щоб отримати безпосередній доступ до цієї сторінки.",
        "changeemail-oldemail": "Поточна адреса електронної пошти:",
        "changeemail-none": "(немає)",
        "changeemail-password": "Ваш пароль проекту {{SITENAME}}:",
        "changeemail-submit": "Змінити адресу електронної пошти",
-       "changeemail-cancel": "Скасувати",
        "changeemail-throttled": "Ви зробили надто багато спроб ввійти до системи.\nБудь ласка, зачекайте $1 перед повторною спробою.",
        "resettokens": "Скидання жетонів",
        "resettokens-text": "Ви можете скинути жетони, що забезпечують доступ до певних особистих даних, пов'язаних тут із вашим обліковим записом.\nВам слід це зробити, якщо ви випадково поділились жетонами з кимось, або якщо ваш обліковий запис було зламано.",
        "showpreview": "Попередній перегляд",
        "showdiff": "Показати зміни",
        "blankarticle": "'''Попередження:''' Створена вами сторінка порожня.\nЯкщо Ви знову натиснете «{{int:savearticle}}», сторінку буде створено без вмісту.",
-       "anoneditwarning": "'''Увага''': Ви не увійшли до системи. До історії змін цієї сторінки буде записана ваша IP-адреса.",
+       "anoneditwarning": "<strong>Увага!</strong> Ви не авторизувалися на сайті. Ваша IP-адреса буде публічно видима, якщо ви будете вносити будь-які правки. Якщо ви <strong>[$1 увійдете]</strong> або <strong>[$2 створите обліковий запис]</strong>, правки замість цього будуть пов'язані з вашим ім'ям користувача, а також у вас з'являться інші переваги.",
        "anonpreviewwarning": "''Ви не увійшли в систему. Якщо ви виконаєте збереження, то в історію сторінки буде записана ваша IP-адреса.''",
        "missingsummary": "'''Нагадування''': Ви не дали короткого опису змін.\nНатиснувши кнопку «Зберегти» ще раз, ви збережете зміни без коментаря.",
        "missingcommenttext": "Будь ласка, введіть нижче ваше повідомлення.",
        "parser-template-recursion-depth-warning": "Перевищене обмеження глибини рекурсії шаблону ($1)",
        "language-converter-depth-warning": "Перевищене обмеження глибини мовного конвертора ($1)",
        "node-count-exceeded-category": "Сторінки, на яких перевищено лічильник вузлів",
-       "node-count-exceeded-category-desc": "Ð\9aаÑ\82егоÑ\80Ñ\96Ñ\8f Ð´Ð»Ñ\8f Ñ\81Ñ\82оÑ\80Ñ\96нок, Ð½Ð° Ñ\8fкиÑ\85 Ð¿ÐµÑ\80евиÑ\89ена ÐºÑ\96лÑ\8cкÑ\96Ñ\81Ñ\82Ñ\8c вузлів.",
-       "node-count-exceeded-warning": "Ð\9aÑ\96лÑ\8cкÑ\96Ñ\81Ñ\82Ñ\8c Ð²Ñ\83злÑ\96в Ð¿Ñ\80епÑ\80оÑ\86еÑ\81оÑ\80а Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\96 Ð¿ÐµÑ\80евиÑ\89ила Ð²Ñ\81Ñ\82ановленÑ\83 Ð¼ÐµÐ¶Ñ\83.",
+       "node-count-exceeded-category-desc": "Ð\9dа Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\96 Ð¿ÐµÑ\80евиÑ\89ено Ð¼Ð°ÐºÑ\81ималÑ\8cно Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82име Ñ\87иÑ\81ло вузлів.",
+       "node-count-exceeded-warning": "СÑ\82оÑ\80Ñ\96нка Ð¿ÐµÑ\80евиÑ\89ила Ð²Ñ\81Ñ\82ановленÑ\83 Ð¼ÐµÐ¶Ñ\83 Ð²Ñ\83злÑ\96в",
        "expansion-depth-exceeded-category": "Сторінки, де перевищено глибину розгортання",
-       "expansion-depth-exceeded-category-desc": "Це ÐºÐ°Ñ\82егоÑ\80Ñ\96Ñ\8f Ð´Ð»Ñ\8f Ñ\81Ñ\82оÑ\80Ñ\96нок Ð· Ð¿ÐµÑ\80евиÑ\89еноÑ\8e Ð³Ð»Ð¸Ð±Ð¸Ð½Ð¾Ñ\8e розкриття.",
+       "expansion-depth-exceeded-category-desc": "Ð\9dа Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\96 Ð¿ÐµÑ\80евиÑ\89ено Ð¼Ð°ÐºÑ\81ималÑ\8cно Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82има Ð³Ð»Ð¸Ð±Ð¸Ð½Ñ\83 розкриття.",
        "expansion-depth-exceeded-warning": "На сторінці перевищено межу глибини вкладеності",
        "parser-unstrip-loop-warning": "Виявлено незакритий тег (такий, як <pre>)",
        "parser-unstrip-recursion-limit": "Перевищено межу вкладеної рекурсії ($1) для парсера.",
        "shown-title": "Показувати $1 {{PLURAL:$1|запис|записи|записів}} на сторінці",
        "viewprevnext": "Переглянути ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''У цій вікі є сторінка з назвою «[[:$1]]»'''",
-       "searchmenu-new": "<strong>Створити сторінку «[[:$1]]» у цьому вікі-проекті!</strong>\n{{PLURAL:$2|0=|Див. також сторінку, знайдену по результатами вашого пошуку.|Див. також знайдені результати пошуку.}}",
+       "searchmenu-new": "<strong>Створити сторінку «[[:$1]]» у цьому вікіпроекті!</strong>\n{{PLURAL:$2|0=|Див. також сторінку, знайдену за результатами вашого пошуку.|Див. також знайдені результати пошуку.}}",
        "searchprofile-articles": "Статті",
        "searchprofile-images": "Мультимедіа",
        "searchprofile-everything": "Усюди",
        "searchall": "усі",
        "showingresults": "Нижче {{PLURAL:$1|показане|показані|показані}} '''$1''' {{PLURAL:$1|результат|результати|результатів}}, починаючи з №&nbsp;'''$2'''",
        "showingresultsinrange": "Нижче показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результатів|<strong>$1</strong> результати}} у діапазоні від #<strong>$2</strong> до #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|1=Результат '''$1''' з '''$3'''|Результати '''$1 — $2''' з '''$3'''}} для '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Результат <strong>$1</strong> із <strong>$3</strong>|Результати <strong>$1 — $2</strong> із <strong>$3</strong>}}",
        "search-nonefound": "Не знайдено результатів, що відповідають запиту.",
        "powersearch-legend": "Розширений пошук",
        "powersearch-ns": "Пошук у просторах назв:",
        "preferences": "Налаштування",
        "mypreferences": "Налаштування",
        "prefs-edits": "Кількість редагувань:",
-       "prefsnologintext2": "Ð\9fоÑ\82Ñ\80Ñ\96бно $1 Ð´Ð»Ñ\8f Ð½Ð°Ð»Ð°Ñ\88Ñ\82Ñ\83ваннÑ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а.",
+       "prefsnologintext2": "Ð\91Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, Ñ\83вÑ\96йдÑ\96Ñ\82Ñ\8c, Ñ\89об Ð·Ð¼Ñ\96ниÑ\82и Ð²Ð°Ñ\88Ñ\96 Ñ\83подобаннÑ\8f.",
        "prefs-skin": "Оформлення",
        "skin-preview": "Попередній перегляд",
        "datedefault": "Стандартний",
        "prefs-tokenwatchlist": "Жетон",
        "prefs-diffs": "Різниці версій",
        "prefs-help-prefershttps": "Цей параметр набуде чинності при вашому наступному вході у систему.",
+       "prefswarning-warning": "Ви внесли в свої налаштування зміни, які ще не були збережені.\nЯкщо ви залишите цю сторінку, не натиснувши \"$1\", налаштування не будуть оновлені.",
        "prefs-tabs-navigation-hint": "Порада: Ви можете використовувати клавіші стрілок вліво і вправо для переходу між вкладками в списку вкладок.",
        "email-address-validity-valid": "Адреса електронної пошти є чинною",
        "email-address-validity-invalid": "Введіть чинну адресу електронної пошти",
        "randomincategory": "Випадкова сторінка у категорії",
        "randomincategory-invalidcategory": "\" $1 \" не є дійсним іменем категорії.",
        "randomincategory-nopages": "У [[:Category:$1]] немає сторінок.",
-       "randomincategory-selectcategory": "Перейти на випадкову сторінку з категорії: $1 $2.",
-       "randomincategory-selectcategory-submit": "Перейти",
+       "randomincategory-category": "Категорія:",
+       "randomincategory-legend": "Випадкова сторінка у категорії",
        "randomredirect": "Випадкове перенаправлення",
        "randomredirect-nopages": "Простір назв «$1» не містить перенаправлень.",
        "statistics": "Статистика",
        "booksources": "Джерела книг",
        "booksources-search-legend": "Пошук інформації про книгу",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Знайти",
+       "booksources-search": "Пошук",
        "booksources-text": "На цій сторінці наведено список посилань на сайти, де ви, можливо, знайдете додаткову інформацію про книгу. Це інтернет-магазини й системи пошуку в бібліотечних каталогах.",
        "booksources-invalid-isbn": "Вказаний номер ISBN, судячи з усього, містить помилку. Будь ласка, перевірте, що при перенесенні номера з першоджерела не виникло спотворень.",
        "specialloguserlabel": "Виконавець:",
        "trackingcategories-desc": "Критерій включення в категорію",
        "noindex-category-desc": "Сторінка не індексується пошуковими роботами, тому що на ній є «чарівне слово» <code><nowiki>__NOINDEX__</nowiki></code>, і вона знаходиться в просторі імен, де дозволений цей прапор).",
        "index-category-desc": "На сторінці є «чарівне слово» __INDEX__ (і сторінка знаходиться в просторі імен, де дозволений цей прапор), тому вона індексуються пошуковими роботами в тих випадках, коли цього зазвичай не відбувається.",
-       "post-expand-template-inclusion-category-desc": "Ð\9fÑ\96Ñ\81лÑ\8f Ð¿Ð¾ÐºÐ°Ð·Ñ\83 Ð²Ñ\81Ñ\96Ñ\85 Ñ\88аблонÑ\96в Ñ\80озмÑ\96Ñ\80 Ñ\81Ñ\82оÑ\80Ñ\96нки Ñ\81Ñ\82ане Ð±Ñ\96лÑ\8cÑ\88е, Ð½Ñ\96ж <code>$wgMaxArticleSize</code>, Ñ\82омÑ\83 Ð´ÐµÑ\8fкÑ\96 Ñ\88аблони не були показані повністю.",
-       "post-expand-template-argument-category-desc": "Ð\9fÑ\96Ñ\81лÑ\8f Ñ\80озкÑ\80иÑ\82Ñ\82Ñ\8f Ð°Ñ\80гÑ\83менÑ\82Ñ\83 Ñ\88аблона (Ñ\89о-небÑ\83дÑ\8c Ð² Ð¿Ð¾Ñ\82Ñ\80Ñ\96йниÑ\85 Ñ\84Ñ\96гÑ\83Ñ\80ниÑ\85 Ð´Ñ\83жкаÑ\85, Ð½Ð°Ð¿Ñ\80иклад, <code>{{{Foo}}})</code>, Ñ\81Ñ\82оÑ\80Ñ\96нка Ñ\81Ñ\82ане Ð±Ñ\96лÑ\8cÑ\88е, Ð½Ñ\96ж <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "На сторінці використовується занадто багато ресурсомістких функцій (таких, як <code>#ifexist</code>). Детальніше - на сторінці [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Ð\9aаÑ\82егоÑ\80Ñ\96Ñ\8f Ð´Ð¾Ð´Ð°Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f, Ñ\8fкÑ\89о Ñ\81Ñ\82оÑ\80Ñ\96нка Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ð½ÐµÐºÐ¾Ñ\80екÑ\82нÑ\83 Ñ\84айловÑ\83 посилання (посилання на неіснуючий файл).",
-       "hidden-category-category-desc": "Це категорія з доданою міткою <code><nowiki>__HIDDENCAT__</nowiki></code> в неї, що за замовчуванням запобігає її відображенню на сторінках в розділі категорій.",
+       "post-expand-template-inclusion-category-desc": "РозмÑ\96Ñ\80 Ñ\81Ñ\82оÑ\80Ñ\96нки Ñ\81Ñ\82ане Ð±Ñ\96лÑ\8cÑ\88ий Ð·Ð° <code>$wgMaxArticleSize</code> Ð¿Ñ\96Ñ\81лÑ\8f Ð¿Ð¾ÐºÐ°Ð·Ñ\83 Ð²Ñ\81Ñ\96Ñ\85 Ñ\88аблонÑ\96в, Ñ\82омÑ\83 Ð´ÐµÑ\8fкÑ\96 Ð· Ð½Ð¸Ñ\85 не були показані повністю.",
+       "post-expand-template-argument-category-desc": "СÑ\82оÑ\80Ñ\96нка Ñ\81Ñ\82ане Ð±Ñ\96лÑ\8cÑ\88оÑ\8e Ð·Ð° <code>$wgMaxArticleSize</code> Ð¿Ñ\96Ñ\81лÑ\8f Ñ\80озкÑ\80иÑ\82Ñ\82Ñ\8f Ð°Ñ\80гÑ\83менÑ\82Ñ\83 Ñ\88аблона (Ñ\89о-небÑ\83дÑ\8c Ð² Ð¿Ð¾Ñ\82Ñ\80Ñ\96йниÑ\85 Ñ\84Ñ\96гÑ\83Ñ\80ниÑ\85 Ð´Ñ\83жкаÑ\85, Ð½Ð°Ð¿Ñ\80иклад, <code>{{{Foo}}})</code>).",
+       "expensive-parserfunction-category-desc": "На сторінці також використовується занадто багато ресурсомістких функцій (таких, як <code>#ifexist</code>). Детальніше - на сторінці [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "СÑ\82оÑ\80Ñ\96нка Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ð½ÐµÐºÐ¾Ñ\80екÑ\82не Ñ\84айлове посилання (посилання на неіснуючий файл).",
+       "hidden-category-category-desc": "Ця категорія містить мітку <code><nowiki>__HIDDENCAT__</nowiki></code> у вмісті сторінки, що типово запобігає її відображенню на сторінках в розділі категорій.",
        "trackingcategories-nodesc": "Опис відсутній.",
        "trackingcategories-disabled": "Категорія вимкнена",
        "mailnologin": "Відсутня адреса для відправки",
        "mywatchlist": "Список спостереження",
        "watchlistfor2": "Для $1 $2",
        "nowatchlist": "Ваш список спостереження порожній.",
-       "watchlistanontext": "Вам необхідно $1, щоб переглянути чи редагувати список спостереження.",
+       "watchlistanontext": "Вам необхідно увійти, щоб переглянути чи редагувати список спостереження.",
        "watchnologin": "Ви не ввійшли до системи",
        "addwatch": "Додати до списку спостереження",
        "addedwatchtext": "Сторінку «[[:$1]]» додано до вашого [[Special:Watchlist|списку спостереження]].\nПодальші редагування цієї сторінки (та пов'язаної з нею сторінки обговорення) відображатимуться в цьому списку.",
        "wlheader-enotif": "Сповіщення електронною поштою ввімкнено.",
        "wlheader-showupdated": "Сторінки, що змінилися після вашого останнього їх відвідування, виділені '''жирним''' шрифтом.",
        "wlnote": "Нижче наведено {{PLURAL:$1|останнє $1 редагування|останні $1 редагування|останні $1 редагувань}} за {{PLURAL:$2|останню|останні|останні}} <strong>$2</strong> {{PLURAL:$2|годину|години|годин}}, на час $3 $4.",
-       "wlshowlast": "Показати зміни за останні $1 годин $2 днів $3",
+       "wlshowlast": "Показати зміни за останні $1 годин $2 днів",
        "watchlist-options": "Налаштування списку спостереження",
        "watching": "Додавання до списку спостереження…",
        "unwatching": "Вилучення зі списку спостереження…",
        "exbeforeblank": "зміст до очистки: «$1»",
        "delete-confirm": "Вилучення «$1»",
        "delete-legend": "Вилучення",
-       "historywarning": "'''Попередження:''' Сторінка, яку ви збираєтеся вилучити, має історію редагувань з приблизно $1 {{PLURAL:$1|1=версії|версій}}:",
+       "historywarning": "<strong>Попередження:</strong> Сторінка, яку ви збираєтеся вилучити, має історію редагувань з приблизно $1 {{PLURAL:$1|1=версії|версій}}:",
        "confirmdeletetext": "Ви збираєтесь вилучити сторінку і всі її журнали редагувань з бази даних.\nБудь ласка, підтвердіть, що ви бажаєте зробити це, повністю розумієте наслідки і що робите це у відповідності з [[{{MediaWiki:Policy-url}}|правилами]].",
        "actioncomplete": "Дію виконано",
        "actionfailed": "Виконати дію не вдалося",
        "delete-edit-reasonlist": "Редагувати причини вилучення",
        "delete-toobig": "У цієї сторінки дуже довга історія редагувань, більше $1 {{PLURAL:$1|версії|версій|версій}}.\nВилучення таких сторінок було заборонене з метою уникнення порушень у роботі сайту {{SITENAME}}.",
        "delete-warning-toobig": "У цієї сторінки дуже довга історія редагувань, більше $1 {{PLURAL:$1|версії|версій|версій}}.\nЇї вилучення може призвести до порушень у роботі бази даних сайту {{SITENAME}};\nдійте обережно.",
+       "deleteprotected": "Ви не можете видалити цю сторінку, тому що вона захищена.",
        "deleting-backlinks-warning": "'''Попередження:'''  [[Special:WhatLinksHere/{{FULLPAGENAME}}|інші сторінки]] посилаються або містять сторінку, яку ви маєте намір видалити.",
-       "rollback": "Ð\92Ñ\96дкинÑ\83Ñ\82и редагування",
+       "rollback": "Ð\92Ñ\96дкинÑ\83Ñ\82о редагування",
        "rollback_short": "Відкинути",
        "rollbacklink": "відкинути",
        "rollbacklinkcount": "відкинути $1 {{PLURAL:$1|редагування|редагування|редагувань}}",
        "protect-othertime": "Інший час/термін:",
        "protect-othertime-op": "інший час/термін",
        "protect-existing-expiry": "Поточний час завершення: $3, $2",
+       "protect-existing-expiry-infinity": "Поточний час завершення: нескінченний",
        "protect-otherreason": "Інша/додаткова причина:",
        "protect-otherreason-op": "Інша причина",
        "protect-dropdown": "* Типові причини захисту\n** частий вандалізм\n** надмірний спам\n** непродуктивна війна редагувань\n** популярна сторінка",
        "autoblockid": "Автоблокування #$1",
        "block": "Заблокувати користувача",
        "unblock": "Розблокувати користувача",
-       "blockip": "Ð\91локÑ\83ваннÑ\8f",
+       "blockip": "Ð\97аблокÑ\83ваÑ\82и {{GENDER:$1|коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87а|коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87кÑ\83}}",
        "blockip-legend": "Блокування користувача",
        "blockiptext": "Використовуйте форму нижче, щоб заблокувати можливість редагування зазначеній IP-адресі або користувачу.\nЦе слід робити лише для запобігання порушенням і у відповідності до [[{{MediaWiki:Policy-url}}|правил]].\nОбов'язково заповніть причину нижче, бажано дати інформативну вичерпну інформацію (наприклад, послатися на конкретні правила, дати посилання на редагування користувача, які призвели до блокування). Можна конкретизувати причину блокування на сторінці обговорення користувача.\n* Якщо ви блокуєте обліковий запис бота, переконайтеся, що ви вимкнули автоблокування (для запобігання автоматичного блокування облікових записів власника бота або інших ботів).\n* Зверніть увагу, що IP-адреси у більшості випадків не варто блокувати на більший за декілька днів термін, щоб під блокування не підпали інші користувачі з таким самим IP. Винятки — частий довготривалий вандалізм.",
        "ipaddressorusername": "IP-адреса або ім'я користувача:",
        "ipb-unblock-addr": "Розблокувати $1",
        "ipb-unblock": "Розблокувати користувача або IP-адресу",
        "ipb-blocklist": "Показати чинні блокування",
-       "ipb-blocklist-contribs": "Внесок користувача $1",
+       "ipb-blocklist-contribs": "Внесок {{GENDER:$1|$1}}",
        "unblockip": "Розблокувати IP-адресу",
        "unblockiptext": "Використовуйте подану нижче форму, щоб відновити можливість збереження з раніше заблокованої IP-адреси.",
        "ipusubmit": "Зняти це блокування",
        "unblocked": "[[User:$1|$1]] розблокований",
        "unblocked-range": "$1 розблоковано",
        "unblocked-id": "Блокування $1 було зняте",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] вже розлоковано.",
        "blocklist": "Заблоковані користувачі",
        "ipblocklist": "Список заблокованих адрес та користувачів",
        "ipblocklist-legend": "Пошук заблокованого користувача",
        "import": "Імпорт статей",
        "importinterwiki": "Міжвікі імпорт",
        "import-interwiki-text": "Вкажіть вікі й назву імпортованої сторінки.\nДати змін й імена авторів буде збережено.\nУсі операції міжвікі-імпорту реєструються в [[Special:Log/import|відповідному протоколі]].",
-       "import-interwiki-source": "Вікі/сторінка-джерело",
+       "import-interwiki-sourcewiki": "Джерело вікі:",
+       "import-interwiki-sourcepage": "Вихідна сторінка:",
        "import-interwiki-history": "Копіювати всю історію змін цієї сторінки",
        "import-interwiki-templates": "Включити всі шаблони",
        "import-interwiki-submit": "Імпортувати",
        "exif-urgency-low": "Низька ($1)",
        "exif-urgency-high": "Висока ($1)",
        "exif-urgency-other": "Визначений користувачем пріоритет ($1)",
-       "watchlistall2": "всі",
        "namespacesall": "всі",
        "monthsall": "всі",
        "confirmemail": "Підтвердження адреси ел. пошти",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|завантажив|завантажила}} нову версію $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|завантажив|завантажила}} $3",
        "rightsnone": "(нема)",
+       "revdelete-summary": "коментар до редагування",
        "feedback-bugornote": "Якщо ви готові описати технічні проблеми в деталях, будь ласка, [$1 повідомте про помилку].\nАбо можете використати форму нижче. Ваш коментар буде додано на сторінку \"[$3  $2]\", разом з іменем користувача.",
        "feedback-subject": "Тема:",
        "feedback-message": "Повідомлення:",
        "log-name-pagelang": "Журнал змін мови",
        "log-description-pagelang": "Це журнал змін мови сторінок.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|змінив|змінила}} мову сторінки для $3 з $4 на $5.",
+       "default-skin-not-found": "Ой! Типова тема оформлення для вашої вікі <code>$wgDefaultSkin</code>, <code>$1</code> недоступна.\n\nВаша установка, вірогідно, містить наступні теми оформлення. Див.  [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для отримання інформації про те, як включити теми оформлення і вибрати типову тему.\n\n\n$2\n\n\n; Якщо ви щойно встановили MediaWiki:\n: Ви, мабуть, зробили це з Git або безпосередньо з вихідного коду, використовуючи інший спосіб. Тоді можливе наступне. Спробуйте встановити деякі теми з [https://www.mediawiki.org/wiki/Category:All_skins каталогу тем оформлення сайту mediawiki.org]:\n:* Завантаживши [https://www.mediawiki.org/wiki/Download архів файлів], який містить декілька тем оформлення і розширень. Ви можете скопіювати теку <code>skins/</code> з нього.\n:* Склонувавши один з репозиторіїв <code>mediawiki/skins/*</code> через git у підтеку <code dir=\"ltr\">skins/</code> теки, де встановлена MediaWiki.\n: Це не повинно зашкодити вашому сховищу, якщо ви MediaWiki-розробник. Див. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для отримання інформації про те, як включити теми оформлення і вибрати типову тему.\n; Якщо ви щойно оновили MediaWiki:\n: MediaWiki версії 1.24 і новійша більше не включає автоматично встановлені теми (див. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\nВи можете вставити наступні рядки в <code>LocalSettings.php</code>, щоб включити всі встановлені теми оформлення: \n\n\n<pre dir=\"ltr\">$3</pre>\n\n\n; Якщо ви щойно змінили <code>LocalSettings.php</code>:\n: Повторно перевірте назви тем на наявність помилок.",
+       "default-skin-not-found-no-skins": "Ой! Типова тема оформлення для вашої вікі <code>$wgDefaultSkin</code>, <code>$1</code> недоступна.\n\n\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 архів файлів], який містить декілька тем оформлення і розширень. Ви можете скопіювати теку <code>skins/</code> з нього.\n:* Склонувавши один з репозиторіїв <code>mediawiki/skins/*</code> через git в підтеку <code dir=\"ltr\">skins/</code> теки, де встановлена MediaWiki.\n: Це не повинно зашкодити вашому сховищу, якщо ви MediaWiki-розробник. Див. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для отримання інформації про те, як включити теми оформлення і вибрати типову тему.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (увімкнено)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''вимкнено''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''вимкнено''')",
+       "mediastatistics": "Медіа-статистика",
+       "mediastatistics-summary": "Статистичні дані про типи завантажених файлів. Вона тільки включає в себе найновішу версію файлу. Старі або видалені версії файлів виключені.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 байт|$1 байтів|$1 байти}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-тип",
+       "mediastatistics-table-extensions": "Можливі розширення",
+       "mediastatistics-table-count": "Кількість файлів",
+       "mediastatistics-table-totalbytes": "Загальний розмір",
+       "mediastatistics-header-unknown": "Невідомо",
+       "mediastatistics-header-bitmap": "Растрові зображення",
+       "mediastatistics-header-drawing": "Малюнки (векторні зображення)",
+       "mediastatistics-header-audio": "Звук",
+       "mediastatistics-header-video": "Відео",
+       "mediastatistics-header-multimedia": "Мішана мультимедія",
+       "mediastatistics-header-office": "Офіс",
+       "mediastatistics-header-text": "Текст",
+       "mediastatistics-header-executable": "Виконувані файли",
+       "mediastatistics-header-archive": "Стиснуті формати",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|зайву завершальну кому|зайвих завершальних коми|зайвих завершальних ком}} було видалено із JSON",
+       "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": "Було вказано значення типу, який не вдається закодувати"
 }
index 3170cbd..fe7fb68 100644 (file)
        "changeemail-newemail": "نیا برقی ڈاک پتہ:",
        "changeemail-none": "(کوئی نہیں)",
        "changeemail-submit": "برقی ڈاک تبدیل کریں",
-       "changeemail-cancel": "منسوخ",
        "bold_sample": "دبیز متن",
        "bold_tip": "دبیز متن",
        "italic_sample": "ترچھا متن",
        "pager-older-n": "{{PLURAL:$1|پُرانا 1|پُرانے $1}}",
        "booksources": "کتابی وسائل",
        "booksources-search-legend": "تلاش برائے مآخذاتِ کتاب",
-       "booksources-go": "چلو",
        "specialloguserlabel": "صارف:",
        "speciallogtitlelabel": "عنوان:",
        "log": "نوشتہ جات",
        "unwatch": "زیرنظرمنسوخ",
        "watchlist-details": "آپ کی زیرِنظرفہرست پر {{PLURAL:$1|$1 صفحہ ہے|$1 صفحات ہیں}}، اِس میں تبادلۂ خیال صفحات کی تعداد شامل نہیں.",
        "wlnote": "نیچےآخری $1 تبدیلیاں ہیں جو کے پیچھلے <b>$2</b> گھنٹوں میں کی گئیں۔",
-       "wlshowlast": "دکھائیں آخری $1 گھنٹے $2 دن $3",
+       "wlshowlast": "دکھائیں آخری $1 گھنٹے $2 دن",
        "watchlist-options": "اختیارات برائے زیرِنظرفہرست",
        "created": "بنا دیا گیا",
        "changed": "تبدیل کردیاگیا",
        "metadata": "میٹا ڈیٹا",
        "metadata-collapse": "طویل تفاصیل چھپاؤ",
        "exif-meteringmode-0": "نامعلوم",
-       "watchlistall2": "تمام",
        "namespacesall": "تمام",
        "monthsall": "تمام",
        "deletedwhileediting": "انتباہ: آپ کے ترمیم شروع کرنے کے بعد یہ صفحہ حذف کیا جا چکا ہے!",
        "version": "ورژن",
        "specialpages": "خصوصی صفحات",
        "rightsnone": "(کچھ نہیں)",
+       "revdelete-summary": "خلاصۂ تدوین",
        "searchsuggest-search": "تلاش",
        "expandtemplates": "سانچے کو وسیع کریں",
        "expand_templates_input": "ان پٹ متن:",
index 5c1fd06..942c445 100644 (file)
@@ -9,17 +9,18 @@
                        "Nataev",
                        "Sociologist",
                        "Xexdof",
-                       "Arystanbek"
+                       "Arystanbek",
+                       "6ahodir"
                ]
        },
        "tog-underline": "Havolalarning tagiga chizish:",
-       "tog-hideminor": "Yangi oʻzgarishlar roʻyxatida kichik tahrirlarni yashirish",
-       "tog-hidepatrolled": "Yangi oʻzgarishlar roʻyxatida tekshirilgan tahrirlarni yashirish",
-       "tog-newpageshidepatrolled": "Yangi sahifalar roʻyxatida tekshirilgan sahifalarni yashirish",
+       "tog-hideminor": "Yangi oʻzgarishlar roʻyxatidan kichik tahrirlarni yashirish",
+       "tog-hidepatrolled": "Yangi oʻzgarishlar roʻyxatidan tekshirilgan tahrirlarni yashirish",
+       "tog-newpageshidepatrolled": "Yangi sahifalar roʻyxatidan tekshirilgan sahifalarni yashirish",
        "tog-extendwatchlist": "Kengaytirilgan kuzatuv roʻyxati: faqat oxirgi paytdagi emas, barcha oʻzgarishlar koʻrsatiladi",
        "tog-usenewrc": "Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish (JavaScript orqali)",
        "tog-numberheadings": "Sarlavhalarni avtomatik raqamlash",
-       "tog-showtoolbar": "Yuqoridagi tahrirlash asboblarini koʻrsatish",
+       "tog-showtoolbar": "Tahrirlash asboblarini koʻrsatish",
        "tog-editondblclick": "Sichqonchaning chap tugmasini ikki marta bosib tahrirlashni boshlash",
        "tog-editsectiononrightclick": "Boʻlim sarlavhasiga sichqonchaning oʻng tugmasini bosib tahrirlashni boshlash",
        "tog-watchcreations": "Men yaratgan sahifalar va yuklagan fayllar kuzatuv roʻyxatimga qoʻshilsin",
        "thu": "Pay",
        "fri": "Jum",
        "sat": "Shn",
-       "january": "yanvar",
-       "february": "fevral",
-       "march": "mart",
-       "april": "aprel",
-       "may_long": "may",
-       "june": "iyun",
-       "july": "iyul",
-       "august": "avgust",
-       "september": "sentabr",
-       "october": "oktabr",
-       "november": "noyabr",
-       "december": "dekabr",
-       "january-gen": "yanvar",
-       "february-gen": "fevral",
-       "march-gen": "mart",
-       "april-gen": "aprel",
-       "may-gen": "may",
-       "june-gen": "iyun",
-       "july-gen": "iyul",
-       "august-gen": "avgust",
-       "september-gen": "sentabr",
-       "october-gen": "oktabr",
-       "november-gen": "noyabr",
-       "december-gen": "dekabr",
-       "jan": "yan",
-       "feb": "fev",
-       "mar": "mar",
-       "apr": "apr",
-       "may": "may",
-       "jun": "iyn",
-       "jul": "iyl",
-       "aug": "avg",
-       "sep": "sen",
-       "oct": "okt",
-       "nov": "noy",
-       "dec": "dek",
+       "january": "Yanvar",
+       "february": "Fevral",
+       "march": "Mart",
+       "april": "Aprel",
+       "may_long": "May",
+       "june": "Iyun",
+       "july": "Iyul",
+       "august": "Avgust",
+       "september": "Sentabr",
+       "october": "Oktabr",
+       "november": "Noyabr",
+       "december": "Dekabr",
+       "january-gen": "Yanvar",
+       "february-gen": "Fevral",
+       "march-gen": "Mart",
+       "april-gen": "Aprel",
+       "may-gen": "May",
+       "june-gen": "Iyun",
+       "july-gen": "Iyul",
+       "august-gen": "Avgust",
+       "september-gen": "Sentabr",
+       "october-gen": "Oktabr",
+       "november-gen": "Noyabr",
+       "december-gen": "Dekabr",
+       "jan": "Yan",
+       "feb": "Fev",
+       "mar": "Mar",
+       "apr": "Apr",
+       "may": "May",
+       "jun": "Jyn",
+       "jul": "Iyl",
+       "aug": "Avg",
+       "sep": "Sen",
+       "oct": "Okt",
+       "nov": "Noy",
+       "dec": "Dek",
        "january-date": "Yanvar $1",
        "february-date": "Fevral $1",
        "march-date": "Mart $1",
        "november-date": "Noyabr $1",
        "december-date": "Dekabr $1",
        "pagecategories": "{{PLURAL:$1|Turkum}}",
-       "category_header": "\"$1\" turkumidagi maqolalar.",
+       "category_header": "\"$1\" turkumidagi sahifalar",
        "subcategories": "Ostturkumlar",
        "category-media-header": "\"$1\" turkumidagi fayllar",
        "category-empty": "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
        "anontalk": "Ushbu IP-manzil munozarasi",
        "navigation": "Saytda harakatlanish",
        "and": "&#32;va",
-       "qbfind": "Qidiruv",
-       "qbbrowse": "Koʻrish",
+       "qbfind": "Topish",
+       "qbbrowse": "Koʻrib chiqish",
        "qbedit": "Tahrirlash",
        "qbpageoptions": "Ushbu sahifa moslamalari",
-       "qbmyoptions": "Moslamalarim",
+       "qbmyoptions": "Mening sahifalarim",
        "faq": "TSS",
-       "faqpage": "Project:TSS",
+       "faqpage": "Loyiha:TSS",
        "actions": "Amallar",
        "namespaces": "Nomfazolar",
        "variants": "Variantlar",
        "passwordreset-email": "Elektron pochta manzilingiz:",
        "passwordreset-emailelement": "Foydalanuvchi ismi: $1\nVaqtinchalik maxfiy so'z: $2",
        "changeemail": "Elektron pochta manzilini oʻzgartirish",
-       "changeemail-header": "Elektron pochta manzilini o'zgaritish",
        "changeemail-oldemail": "Joriy elektron pochta manzili",
        "changeemail-newemail": "Elektron pochtaning yangi manzili",
        "changeemail-none": "(yoʻq)",
        "changeemail-submit": "Manzilni o'zgartirish",
-       "changeemail-cancel": "Bekor",
        "bold_sample": "Qalin matn",
        "bold_tip": "Qalin matn",
        "italic_sample": "Yotiq matn",
        "searchrelated": "bogʻlangan",
        "searchall": "barchasi",
        "showingresults": "Quyida №'''$2'''dan boshlab {{PLURAL:$1|'''bitta''' natija|'''$1''' ta natija}} koʻrsatilgan.",
-       "showingresultsheader": "<strong>$4</strong> uchun jami {{PLURAL:$5|<strong>$3</strong> tadan <strong>$1</strong> ta natija koʻrsatildi|<strong>$3</strong> tadan <strong>$1</strong> — <strong>$2</strong> chi natijalar koʻrsatildi}}",
        "search-nonefound": "Talabga javob beradigan natija topilmadi.",
        "powersearch-legend": "Kengaytirilgan qidiruv",
        "powersearch-ns": "Quyidagi nomfazolardan qidir:",
        "download": "yuklash",
        "unusedtemplates": "Ishlatilinmagan andozalar",
        "randompage": "Tasodifiy sahifa",
-       "randomincategory-selectcategory-submit": "Oʻtish",
        "statistics": "Statistika",
        "statistics-header-pages": "Sahifalar statistikasi",
        "statistics-header-edits": "Tahrirlar statistikasi",
        "suppress": "Bekitish",
        "booksources": "Kitob manbalari",
        "booksources-search-legend": "Kitob haqida ma'lumot qidirish",
-       "booksources-go": "O‘tish",
        "specialloguserlabel": "Ijrochi:",
        "speciallogtitlelabel": "Moʻljal:",
        "log": "Qaydlar",
        "watchlist-details": "Sizning kuzatuv roʻyxatingizda hozirda {{PLURAL:$1|bitta sahifa|$1ta sahifa}} mavjud (munozara sahifalarini hisobga olmaganda).",
        "wlheader-showupdated": "Siz oxirgi marta kirganingizdan keyin oʻzgartirilgan sahifalar '''qalin''' yozuv bilan ajratib koʻrsatilgan.",
        "wlnote": "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
-       "wlshowlast": "Oxirgi $1 soatdagi $2 kundagi tahrirlarni koʻrsat $3",
+       "wlshowlast": "Oxirgi $1 soatdagi $2 kundagi tahrirlarni koʻrsatish",
        "watchlist-options": "Kuzatuv roʻyxati moslamalari",
        "watching": "Kuzatish...",
        "unwatching": "Kuzatuv ro'yxatidan o'chirish...",
        "exif-iimcategory-sci": "Fan va texnologiyalar",
        "exif-iimcategory-spo": "Sport",
        "exif-iimcategory-wea": "Ob-havo",
-       "watchlistall2": "hammasi",
        "namespacesall": "Barchasi",
        "monthsall": "barchasi",
        "unit-pixel": " piksel",
index 67a4e39..a791529 100644 (file)
        "passwordreset-emailsent-capture": "Xe stà invià na mail de reset password: el contegù xe riportà cuà de seguito.",
        "passwordreset-emailerror-capture": "Xe stà generà na mail de reset password, riportà cuà de seguito. L'invio a {{GENDER:$2|l'utente}} no xe riusido: $1",
        "changeemail": "Canbia indiriso de posta ełetronega",
-       "changeemail-header": "Canbia el indiriso de posta ełetronega del account",
        "changeemail-text": "Conpleta sto moduło par canbiare el to indiriso de posta ełetronega. Sarà necesario inserire ła password par confermare ła modifega.",
        "changeemail-no-info": "Te ghe da aver efetuà l'aceso par acedare a sta pajina diretamente.",
        "changeemail-oldemail": "Indiriso de posta ełetronega atuałe:",
        "changeemail-none": "(nisun)",
        "changeemail-password": "Ła password so {{SITENAME}}:",
        "changeemail-submit": "Canbia indiriso de posta ełetronega",
-       "changeemail-cancel": "Anuła",
        "resettokens-token-label": "$1 (valor atuale: $2)",
        "bold_sample": "Testo in grosso",
        "bold_tip": "Testo in grosso",
        "searchrelated": "ligà",
        "searchall": "tuti",
        "showingresults": "Qua de soto vien mostrà al massimo {{PLURAL:$1|'''1''' risultato|'''$1''' risultati}} a partir dal nùmaro '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Risultato '''$1''' de '''$3'''|Risultati '''$1 - $2''' de '''$3'''}} par '''$4'''",
        "search-nonefound": "La riserca no la gà catà gnente.",
        "powersearch-legend": "Riserca avansà",
        "powersearch-ns": "Serca ne i namespace:",
        "recentchanges-label-plusminus": "La dimension de la pagina la xe canbià de sto nùmaro de byte",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (varda anca [[Special:NewPages|l'elenco de le pagine nove]])",
        "rcnotefrom": "Qui di seguito sono elencate le modifiche da '''$2''' (fino a '''$1''').",
-       "rclistfrom": "Fà védar i canbiamenti fati dal $3 $2",
+       "rclistfrom": "Mostra i canbiamenti fati da ƚe $2 del $3",
        "rcshowhideminor": "$1 i canbiamenti picenini",
        "rcshowhidebots": "$1 i bot",
        "rcshowhideliu": "$1 i utenti registrài",
        "randomincategory": "Pagina a ocio in te na categoria",
        "randomincategory-invalidcategory": "\"$1\" no'l và mia ben come nome de categoria.",
        "randomincategory-nopages": "No ghe xe mia pagine in [[:Category:$1]].",
-       "randomincategory-selectcategory": "Ciapa na pagina a ocio da la categoria: $1 $2.",
-       "randomincategory-selectcategory-submit": "Và",
        "randomredirect": "Un redirect a caso",
        "randomredirect-nopages": "No ghe xe nissun rimando in tel namespace \"$1\".",
        "statistics": "Statisteghe",
        "querypage-disabled": "Sta pàjina speciałe ła xe dixativà par motivi de prestasion.",
        "booksources": "Fonti librarie",
        "booksources-search-legend": "Riserca de fonti librarie",
-       "booksources-go": "Va",
        "booksources-text": "De seguito vien presentà un elenco de colegamenti verso siti foresti che vende libri novi e usài, atraverso i quali se pol otegner piassè informazioni sul testo sercà.",
        "booksources-invalid-isbn": "El nùmaro ISBN inserìo no'l xe mia valido: controla de novo se te lo ghè copià justo da la fonte originale.",
        "specialloguserlabel": "Asion efetuà da:",
        "wlheader-enotif": "Xe ativà la notifica via e-mail.",
        "wlheader-showupdated": "Le pagine che xe stà canbià da la to ultima visita le xe segnà in '''grosso'''",
        "wlnote": "Cuà soto te cati {{PLURAL:$1|'l ultimo canbiamento|i ultimi '''$1''' canbiamenti}} inte {{PLURAL:$2|l'ultema ora|łe ultime '''$2''' ore}}; i dati i xe axornai a łe $4 del $3.",
-       "wlshowlast": "Mostra le ultime $1 ore $2 zorni $3",
+       "wlshowlast": "Mostra le ultime $1 ore $2 zorni",
        "watchlist-options": "Inpostassion de le pagine tegnùe d'ocio",
        "watching": "Taco a tegner d'ocio...",
        "unwatching": "Desmeto de tegner d'ocio...",
        "import": "Inporta pàxene",
        "importinterwiki": "Inportazion transwiki",
        "import-interwiki-text": "Seleziona un projeto wiki e el titoło de ła pàxena da inportar.\nLe date de publicazion e i nomi de i autori de łe varie version i sarà conservà.\nTute łe operazion de inportazion trans-wiki łe xè notà nel [[Special:Log/import|registro de inportazion]].",
-       "import-interwiki-source": "Sorgente wiki/pàxena:",
        "import-interwiki-history": "Copia l'intiera cronołogia de sta pàxena",
        "import-interwiki-templates": "Tira dentro tuti i modèi",
        "import-interwiki-submit": "Inporta",
        "exif-urgency-low": "Basa ($1)",
        "exif-urgency-high": "Alta ($1)",
        "exif-urgency-other": "Priorità definie dal utente ($1)",
-       "watchlistall2": "tute",
        "namespacesall": "Tuti",
        "monthsall": "tuti",
        "confirmemail": "Conferma indirisso e-mail",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|el|la}} ga canbià l'apartenensa a grupi de $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|el|la}} xe stà automategamente promoso/a da $4 a $5",
        "rightsnone": "(nissun)",
+       "revdelete-summary": "modifica ogeto",
        "feedback-bugornote": "Se se xe in grado de descrivare el problema tenico riscontrà in maniera precixa, [$1 segnałare el bug]. In alternadiva, se pol doparar el moduło senplifegà cuà soto. El comento inserio el sarà xontà a ła pàjina \"[$3 $2]\", insieme al propio nome utente.",
        "feedback-subject": "Ogeto:",
        "feedback-message": "Messajo:",
index d00ada8..eed4051 100644 (file)
        "changeemail-newemail": "Uz' e-počtan adres",
        "changeemail-none": "(ei ole)",
        "changeemail-submit": "Toižetada e-počtan adres",
-       "changeemail-cancel": "Heitta",
        "resettokens-tokens": "Tokenad:",
        "bold_sample": "Lihavoitud tekst",
        "bold_tip": "Lihavoitud tekst",
        "searchrelated": "sidotud",
        "searchall": "kaik",
        "showingresults": "Alemba ozutadas {{PLURAL:$1|'''1''' rezul'tat|'''$1''' rezul'tatad}} nomeraspäi #'''$2''' augotaden.",
-       "showingresultsheader": "{{PLURAL:$5|'''$1''' '''$3'''-š rezul'tatoišpäi|Rezul'tatad '''$1–$2''' '''$3'''-špäi}} '''$4'''-n täht",
        "search-nonefound": "Ecmižhe ei löudnus rezul'tatoid.",
        "powersearch-legend": "Levitoittud ecind",
        "powersearch-ns": "Ecind nimiavaruziš:",
        "unusedtemplateswlh": "toižed kosketused",
        "randompage": "Statjaline lehtpol'",
        "randompage-nopages": "\"$1\"-{{PLURAL:$2|Nimiavarudes|Nimiavaruziš}} ei ole lehtpolid.",
-       "randomincategory-selectcategory-submit": "Mäne",
        "randomredirect": "Statjaline läbikosketuz",
        "randomredirect-nopages": "\"$1\"-nimiavaruses ei ole läbikosketusid.",
        "statistics": "Statistik",
        "booksources": "Kirjpurtked",
        "booksources-search-legend": "Ectä kirjpurtkid",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "Ectä",
        "booksources-text": "Naku om kosketusid saitoile, kudambil mödas uzid da kuluid kirjoid. Niilpäi voib löuta ližainformacijad ectud kirjoiš:",
        "booksources-invalid-isbn": "Nece ISBN, näguse, om vär; Kodvgat, oikti-k oled kopiruinuded sidä originaližes purtkespäi.",
        "specialloguserlabel": "Kävutai:",
        "notvisiblerev": "Versijad oma čutud",
        "watchlist-details": "Teiden kaclendnimikirjuteses om {{PLURAL:$1|$1 lehtpol'|$1 lehtpol't}}. Lodulehtpoled ei olgoi neciš lugus.",
        "wlheader-enotif": "Tedotand e-počtadme om kävutamas.",
-       "wlshowlast": "Ozutada jäl'gmäižiš $1 časuiš da $2 päiviš $3",
+       "wlshowlast": "Ozutada jäl'gmäižiš $1 časuiš da $2 päiviš",
        "watchlist-options": "Kaclendnimikirjutesen järgendused",
        "watching": "Ližaduz kaclendnimikirjuteshe...",
        "unwatching": "Heitmine kaclendnimikirjutesespäi...",
        "thumbnail_image-missing": "Näguse, ei ole $1-failad",
        "import": "Toda lehtesid toižiš saitoišpäi",
        "importinterwiki": "Transwiki-tomine",
-       "import-interwiki-source": "Wikipurde/lehtpol':",
        "import-interwiki-history": "Kopiruida kaik necen lehtpolen toižetamižen istorii",
        "import-interwiki-templates": "Mülütada kaik šablonad",
        "import-interwiki-submit": "Import",
        "exif-urgency-normal": "Normaline ($1)",
        "exif-urgency-low": "Madal ($1)",
        "exif-urgency-high": "Korged ($1)",
-       "watchlistall2": "kaik",
        "namespacesall": "kaik",
        "monthsall": "kaik",
        "confirmemail": "Vahvištoitta e-počtan adres",
        "revdelete-restricted": "kaidendused administratoriden täht",
        "revdelete-unrestricted": "kaidendused heittud administratoriden täht",
        "rightsnone": "(ei ole)",
+       "revdelete-summary": "kaik toižetused",
        "feedback-subject": "Tem:",
        "feedback-message": "Tedotuz:",
        "feedback-cancel": "Heitta pätand",
index e7a4a53..95434b4 100644 (file)
        "otherlanguages": "Ngôn ngữ khác",
        "redirectedfrom": "(đổi hướng từ $1)",
        "redirectpagesub": "Trang đổi hướng",
+       "redirectto": "Đổi hướng đến:",
        "lastmodifiedat": "Trang này được sửa đổi lần cuối lúc $2 $1.",
        "viewcount": "Trang này đã được đọc {{PLURAL:$1|một|$1}} lần.",
        "protectedpage": "Trang bị khóa",
        "hidetoc": "ẩn",
        "collapsible-collapse": "Thu gọn",
        "collapsible-expand": "Mở rộng",
+       "confirmable-confirm": "{{GENDER:$1}}Bạn chắc chứ?",
+       "confirmable-yes": "Có",
+       "confirmable-no": "Không",
        "thisisdeleted": "Xem hay phục hồi $1 ?",
        "viewdeleted": "Xem $1?",
        "restorelink": "{{PLURAL:$1|một|$1}} sửa đổi đã xóa",
        "invalidtitle-knownnamespace": "Tựa trang không hợp lệ có không gian tên “$2” và văn bản “$3”",
        "invalidtitle-unknownnamespace": "Tựa trang không hợp lệ có không gian tên số $1 không rõ và văn bản “$2”",
        "exception-nologin": "Chưa đăng nhập",
-       "exception-nologin-text": "Xin vui lòng [[Special:Userlogin|đăng nhập]] để truy cập trang hoặc thực hiện tác vụ này.",
+       "exception-nologin-text": "Xin vui lòng đăng nhập để truy cập trang hoặc thực hiện tác vụ này.",
        "exception-nologin-text-manual": "Xin vui lòng $1 để truy cập trang hoặc tác vụ này.",
        "virus-badscanner": "Cấu hình sau: không nhận ra bộ quét virus: ''$1''",
        "virus-scanfailed": "quét thất bại (mã $1)",
        "createaccount-text": "Ai đó đã tạo một tài khoản với tên $2 tại {{SITENAME}} ($4). Mật khẩu của \"$2\" là \"$3\". Bạn nên đăng nhập và đổi mật khẩu ngay bây giờ.\n\nXin hãy bỏ qua thông điệp này nếu tài khoản này không phải do bạn tạo ra.",
        "login-throttled": "Bạn đã hết quyền thử mật khẩu tài khoản này vì bạn đã nhập sai quá nhiều. Xin hãy đợi $1 rồi hãy thử lại.",
        "login-abort-generic": "Thất bại khi đăng nhập",
+       "login-migrated-generic": "Tài khoản của bạn đã được hợp nhất, và tên đăng nhập của bạn không còn tồn tại trên wiki này.",
        "loginlanguagelabel": "Ngôn ngữ: $1",
        "suspicious-userlogout": "Đã bỏ qua yêu cầu đăng xuất bạn, hình như được gửi từ trình duyệt hoặc máy proxy nhớ đệm hư.",
        "createacct-another-realname-tip": "Tên thật là không bắt buộc. \n\nNếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao của 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-header": "Đổi địa chỉ thư điện tử của tài khoản",
        "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-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-none": "(không có)",
        "changeemail-password": "Mật khẩu của bạn tại {{SITENAME}}:",
        "changeemail-submit": "Đổi địa chỉ",
-       "changeemail-cancel": "Hủy bỏ",
        "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.",
        "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.",
        "showpreview": "Xem trước",
        "showdiff": "Xem thay đổi",
        "blankarticle": "<strong>Cảnh báo:</strong> Bạn sẽ tạo ra một trang trống.\nNếu bấm “{{int:savearticle}}” lần nữa, một trang không có nội dung sẽ được tạo ra.",
-       "anoneditwarning": "'''Cảnh báo:''' Bạn chưa đăng nhập. Địa chỉ IP của bạn sẽ được ghi lại trong lịch sử sửa đổi của trang.",
+       "anoneditwarning": "<strong>Cảnh báo:</strong> Bạn chưa đăng nhập. Địa chỉ IP của bạn sẽ bị hiển thị công khai nếu bạn thực hiện bất kỳ sửa đổi nào. Nếu bạn <strong>[$1 đăng nhập]</strong> hoặc <strong>[$2 mở tài khoản]</strong>, sửa đổi của bạn sẽ được gán bởi tên đăng nhập của bạn, cùng nhiều lợi ích khác.",
        "anonpreviewwarning": "''Bạn chưa đăng nhập. Khi lưu trang này, địa chỉ IP của bạn sẽ được ghi vào lịch sử trang.''",
        "missingsummary": "'''Nhắc nhở:''' Bạn đã không ghi lại tóm lược sửa đổi. Nếu bạn nhấn Lưu trang một lần nữa, sửa đổi của bạn sẽ được lưu mà không có tóm lược.",
        "missingcommenttext": "Xin hãy gõ vào lời bàn luận ở dưới.",
        "parser-template-recursion-depth-warning": "Bản mẫu đã vượt quá giới hạn về độ sâu đệ quy ($1)",
        "language-converter-depth-warning": "Đã vượt quá giới hạn độ sâu của bộ chuyển đổi ngôn ngữ ($1)",
        "node-count-exceeded-category": "Trang có số nốt vượt quá giới hạn cho phép",
-       "node-count-exceeded-category-desc": "Thể loại chứa các trang có số nốt vượt quá giới hạn cho phép.",
-       "node-count-exceeded-warning": "Trang có nhiều nốt quá",
+       "node-count-exceeded-category-desc": "Trang có số nốt vượt quá giới hạn cho phép.",
+       "node-count-exceeded-warning": "Trang có quá nhiều nốt",
        "expansion-depth-exceeded-category": "Trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép",
-       "expansion-depth-exceeded-category-desc": "Thể loại này chứa các trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép.",
+       "expansion-depth-exceeded-category-desc": "Trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép.",
        "expansion-depth-exceeded-warning": "Trang bung bản mẫu sâu quá",
        "parser-unstrip-loop-warning": "Vòng lặp unstrip",
        "parser-unstrip-recursion-limit": "Đã vượt quá giới hạn về độ sâu đệ quy unstrip ($1)",
        "searchall": "tất cả",
        "showingresults": "Dưới đây là {{PLURAL:$1|'''1'''|'''$1'''}} kết quả bắt đầu từ #'''$2'''.",
        "showingresultsinrange": "Dưới đây là cho tới <strong>$1</strong> kết quả từ #<strong>$2</strong> đến #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|Kết quả thứ '''$1''' trong tổng số '''$3''' kết quả|Các kết quả '''$1–$2''' trong tổng số '''$3''' kết quả}} cho '''$4'''",
+       "search-showingresults": "{{PLURAL:$4|Kết quả thứ <strong>$1</strong> trong tổng số <strong>$3</strong>|Các kết quả <strong>$1–$2</strong> trong tổng số <strong>$3</strong>}}",
        "search-nonefound": "Không có kết quả nào khớp với câu truy vấn.",
        "powersearch-legend": "Tìm kiếm nâng cao",
        "powersearch-ns": "Tìm trong không gian tên:",
        "preferences": "Tùy chọn",
        "mypreferences": "Tùy chọn",
        "prefs-edits": "Số lần sửa đổi:",
-       "prefsnologintext2": "Xin vui lòng $1 để thay đổi tùy chọn.",
+       "prefsnologintext2": "Xin vui lòng đăng nhập để thay đổi tùy chọn.",
        "prefs-skin": "Giao diện",
        "skin-preview": "Xem trước",
        "datedefault": "Không quan tâm",
        "prefs-tokenwatchlist": "Dấu hiệu",
        "prefs-diffs": "Khác biệt",
        "prefs-help-prefershttps": "Đăng xuất và đăng nhập lại để áp dụng tùy chọn này.",
+       "prefswarning-warning": "Bạn chưa lưu những thay đổi tùy chọn đã thực hiện.\nNếu bạn rời khỏi trang này mà không bấm “$1”, các tùy chọn của bạn sẽ không được cập nhật.",
        "prefs-tabs-navigation-hint": "Mẹo: Bạn có thể bấm các phím mũi tên trái phải để luân chuyển qua các thẻ trong danh sách thẻ.",
        "email-address-validity-valid": "Có vẻ hợp lệ",
        "email-address-validity-invalid": "Yêu cầu địa chỉ hợp lệ!",
        "randomincategory": "Trang ngẫu nhiên trong thể loại",
        "randomincategory-invalidcategory": "“$1” không phải tên thể loại hợp lệ.",
        "randomincategory-nopages": "Không có trang nào trong [[:Category:$1]].",
-       "randomincategory-selectcategory": "Xem trang ngẫu nhiên trong thể loại: $1 $2.",
-       "randomincategory-selectcategory-submit": "Xem",
+       "randomincategory-category": "Thể loại:",
+       "randomincategory-legend": "Trang ngẫu nhiên trong thể loại",
        "randomredirect": "Trang đổi hướng ngẫu nhiên",
        "randomredirect-nopages": "Không có trang đổi hướng nào trong không gian tên “$1”.",
        "statistics": "Thống kê",
        "querypage-disabled": "Trang đặc biệt này bị tắt vì lý do hiệu suất.",
        "booksources": "Nguồn sách",
        "booksources-search-legend": "Tìm kiếm nguồn sách",
-       "booksources-go": "Tìm kiếm",
+       "booksources-search": "Tìm kiếm",
        "booksources-text": "Dưới đây là danh sách những trang bán sách mới và cũ, đồng thời có thể có thêm thông tin về những cuốn sách bạn đang tìm:",
        "booksources-invalid-isbn": "ISBN mà bạn cung cấp dường như không đúng; xin hãy kiểm tra lại xem có lỗi gì khi sao chép từ nội dung gốc hay không.",
        "specialloguserlabel": "Người thực hiện:",
        "trackingcategories-desc": "Tiêu chuẩn xếp thể loại",
        "noindex-category-desc": "Trang này không được các robot đánh chỉ mục vì trang có từ thần chú <code><nowiki>__NOINDEX__</nowiki></code> và nằm trong không gian tên cho phép từ thần chú này.",
        "index-category-desc": "Trang này có từ thần chú <code><nowiki>__INDEX__</nowiki></code> và nằm trong một không gian tên cho phép từ thần chú này, nên được các robot đánh chỉ mục, trong khi bình thường nó không được đánh chỉ mục.",
-       "post-expand-template-inclusion-category-desc": "Nếu bung tất cả các bản mẫu, kích thước trang sẽ vượt quá <code>$wgMaxArticleSize</code>, nên một số bản mẫu không được bung.",
-       "post-expand-template-argument-category-desc": "Nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ <code>{{{Thí dụ}}}</code>), trang này sẽ vượt quá <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Trang có quá nhiều hàm cú pháp cần mức độ xử lý cao (chẳng hạn như <code>#ifexist</code>). Xem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit?uselang=vi Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Trang này muốn nhúng một tập tin không tồn tại.",
-       "hidden-category-category-desc": "Thể loại này có <code><nowiki>__HIDDENCAT__</nowiki></code>, nên, theo mặc định, thể loại không xuất hiện trong hộp thể loại trên các trang được xếp vào thể loại.",
+       "post-expand-template-inclusion-category-desc": "Kích thước trang sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung hết toàn bộ bản mẫu, nên một số bản mẫu không được bung.",
+       "post-expand-template-argument-category-desc": "Trang này sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ <code>{{{Thí dụ}}}</code>).",
+       "expensive-parserfunction-category-desc": "Trang có quá nhiều hàm cú pháp cần mức độ xử lý cao (chẳng hạn như <code>#ifexist</code>). Xem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Trang này có một liên kết tập tin hỏng (liên kết nhúng tập tin không tồn tại).",
+       "hidden-category-category-desc": "Nội dung của trang thể loại này chứa <code><nowiki>__HIDDENCAT__</nowiki></code>, nên theo mặc định thì thể loại không xuất hiện trong thanh thể loại trên các trang được xếp vào thể loại.",
        "trackingcategories-nodesc": "Không có miêu tả.",
        "trackingcategories-disabled": "Thể loại bị tắt",
        "mailnologin": "Không có địa chỉ gửi thư",
        "mywatchlist": "Trang theo dõi",
        "watchlistfor2": "Của $1 $2",
        "nowatchlist": "Danh sách theo dõi của bạn không có gì.",
-       "watchlistanontext": "Xin hãy $1 để xem hay sửa đổi các trang được theo dõi.",
+       "watchlistanontext": "Xin hãy đăng nhập để xem hay sửa đổi các trang trong danh sách theo dõi của bạn.",
        "watchnologin": "Chưa đăng nhập",
        "addwatch": "Thêm vào danh sách theo dõi",
        "addedwatchtext": "Trang “[[:$1]]” đã vào [[Special:Watchlist|danh sách theo dõi]] của bạn.\nNhững sửa đổi đối với trang này và trang thảo luận của nó sẽ được liệt kê ở đấy.",
        "exbeforeblank": "nội dung trước khi tẩy trống: “$1”",
        "delete-confirm": "Xóa “$1”",
        "delete-legend": "Xóa",
-       "historywarning": "'''Cảnh báo:''' Trang bạn sắp xóa đã có lịch sử khoảng $1 {{PLURAL:$1|phiên bản|phiên bản}}:",
+       "historywarning": "<strong>Cảnh báo:</strong> Trang bạn sắp xóa đã có lịch sử $1 phiên bản:",
        "confirmdeletetext": "Bạn sắp xóa hẳn một trang cùng với tất cả lịch sử của nó.\nXin xác nhận việc bạn định làm, và hiểu rõ những hệ lụy của nó, và bạn thực hiện nó theo đúng đúng [[{{MediaWiki:Policy-url}}|quy định]].",
        "actioncomplete": "Đã thực hiện xong",
        "actionfailed": "Tác động bị thất bại",
        "delete-edit-reasonlist": "Sửa lý do xóa",
        "delete-toobig": "Trang này có lịch sử sửa đổi lớn, đến hơn {{PLURAL:$1|lần|lần}} sửa đổi.\nViệc xóa các trang như vậy bị hạn chế để ngăn ngừa phá hoại do vô ý cho {{SITENAME}}.",
        "delete-warning-toobig": "Trang này có lịch sử sửa đổi lớn, đến hơn {{PLURAL:$1|lần|lần}} sửa đổi.\nViệc xóa các trang có thể làm tổn hại đến hoạt động của cơ sở dữ liệu {{SITENAME}};\nhãy cẩn trọng khi thực hiện.",
+       "deleteprotected": "Bạn không thể xóa trang này vì nó đã được khóa lại.",
        "deleting-backlinks-warning": "'''Cảnh báo:''' Có [[Special:WhatLinksHere/{{FULLPAGENAME}}|trang khác]] liên kết đến hoặc nhúng trang mà bạn sắp xóa.",
        "rollback": "Lùi tất cả sửa đổi",
        "rollback_short": "Lùi tất cả",
        "protect-othertime": "Thời hạn khác:",
        "protect-othertime-op": "thời hạn khác",
        "protect-existing-expiry": "Thời hạn hiện thời: $3, $2",
+       "protect-existing-expiry-infinity": "Thời hạn hiện thời: vô hạn",
        "protect-otherreason": "Lý do khác/bổ sung:",
        "protect-otherreason-op": "Lý do khác",
        "protect-dropdown": "*Các lý do thường dùng khi khóa\n** Bị phá hoại quá mức\n** Bị spam quá mức\n** Bút chiến thiếu tính xây dựng\n** Trang nhiều người xem",
        "autoblockid": "Cấm tự động #$1",
        "block": "Cấm người dùng",
        "unblock": "Bỏ cấm người dùng",
-       "blockip": "Cấm người dùng",
+       "blockip": "Cấm {{GENDER:$1}}người dùng",
        "blockip-legend": "Cấm người dùng",
        "blockiptext": "Dùng mẫu dưới để cấm một địa chỉ IP hoặc thành viên không được viết trang.\nĐiều này chỉ nên làm để tránh phá hoại, và phải theo [[{{MediaWiki:Policy-url}}|quy định]].\nĐiền vào lý do cụ thể ở dưới (ví dụ, chỉ ra trang nào bị phá hoại).",
        "ipaddressorusername": "Địa chỉ IP hay tên thành viên:",
        "unblocked": "[[User:$1|$1]] đã hết bị cấm",
        "unblocked-range": "$1 đã được bỏ cấm",
        "unblocked-id": "$1 đã hết bị cấm",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] đã được bỏ cấm.",
        "blocklist": "Người dùng bị cấm",
        "ipblocklist": "Người dùng bị cấm",
        "ipblocklist-legend": "Tìm một thành viên bị cấm",
        "import": "Nhập các trang",
        "importinterwiki": "Nhập giữa các wiki",
        "import-interwiki-text": "Chọn tên trang và wiki để nhập trang vào.\nNgày của phiên bản và tên người viết trang sẽ được giữ nguyên.\nTất cả những lần nhập trang từ wiki khác được ghi lại ở [[Special:Log/import|nhật trình nhập trang]].",
-       "import-interwiki-source": "Wiki/trang mã nguồn:",
+       "import-interwiki-sourcewiki": "Wiki nguồn:",
+       "import-interwiki-sourcepage": "Trang nguồn:",
        "import-interwiki-history": "Sao chép tất cả các phiên bản cũ của trang này",
        "import-interwiki-templates": "Gồm tất cả các bản mẫu",
        "import-interwiki-submit": "Nhập",
        "exif-urgency-low": "Thấp ($1)",
        "exif-urgency-high": "Cao ($1)",
        "exif-urgency-other": "Ưu tiên người dùng định nghĩa ($1)",
-       "watchlistall2": "tất cả",
        "namespacesall": "tất cả",
        "monthsall": "tất cả",
        "confirmemail": "Xác nhận thư điện tử",
        "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",
+       "logentry-upload-upload": "$1 {{GENDER:$2}}đã tải lên $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2}}đã tải lên một phiên bản mới của $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2}}đã tải lên $3",
        "rightsnone": "(không có)",
+       "revdelete-summary": "tóm lược sửa đổi",
        "feedback-bugornote": "Nếu bạn đã sẵn sàng để miêu tả các chi tiết của một vấn đề kỹ thuật, xin vui lòng [$1 báo cáo lỗi].\nNếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới. Lời ghi của bạn sẽ được đăng lên trang “[$3 $2]”, cùng với tên người dùng và trình duyệt của bạn.",
        "feedback-subject": "Tiêu đề:",
        "feedback-message": "Thông điệp:",
        "action-pagelang": "thay đổi ngôn ngữ của trang",
        "log-name-pagelang": "Nhật trình thay đổi ngôn ngữ",
        "log-description-pagelang": "Nhật trình này ghi các thay đổi ngôn ngữ của các trang.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2}}đã đổi ngôn ngữ của trang $3 từ $4 thành $5."
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2}}đã đổi ngôn ngữ của trang $3 từ $4 thành $5.",
+       "default-skin-not-found": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nViệc cài đặt của bạn dường như bao gồm những giao diện sau đây. Xin xem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt hoặc chọn một trong số chúng làm giao diện mặc định.\n\n$2\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Có lẽ bạn đã cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này đã nằm trong tính toán của chúng tôi. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org] bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:*Sao chép một trong những kho <code>mediawiki/skins/*</code> thông qua git vào trong thư mục <code dir=\"ltr\">skins/</code> của cài đặt MediaWiki của bạn.\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki.\n\n; Nếu bạn vừa mới nâng cấp MediaWiki:\n: Phiên bản MediaWiki 1.24 trở lên không còn tự động kích hoạt giao diện đã cài đặt (xem [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Hướng dẫn: Tự động dò giao diện]). Bạn có thể dán những dòng lệnh vào <code>LocalSettings.php</code> để kích hoạt tất cả giao diện hiện đã được cài dặt:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Nếu bạn vừa mới chỉnh sửa <code>LocalSettings.php</code>:\n: Kiểm tra lại tên các giao diện xem có lỗi đánh máy nào không.",
+       "default-skin-not-found-no-skins": "Đã xảy ra lỗi! Giao diện mặc định của wiki này được định nghĩa trong <code dir=\"ltr\">$wgDefaultSkin</code> là <code>$1</code> nhưng không tồn tại.\n\nKhông có giao diện nào của bạn được kích hoạt.\n\n; Nếu bạn vừa mới cài đặt MediaWiki:\n: Bạn có thể cài đặt nó từ git, hoặc trực tiếp từ mã nguồn bằng cách sử dụng một số phương thức khác. Điều này nằm trong dự kiến. Hãy thử cài đặt một số giao diện từ [https://www.mediawiki.org/wiki/Category:All_skins thư mục giao diện của mediawiki.org], bằng cách:\n:* Tải về [https://www.mediawiki.org/wiki/Special:MyLanguage/Download trình cài đặt dưới dạng gói tar], trong đó có kèm theo một số giao diện và phần mở rộng. Bạn có thể chép nó và dán vào thư mục <code>skins/</code>.\n:*Sao chép một trong những kho <code>mediawiki/skins/*</code> thông qua git vào trong thư mục <code dir=\"ltr\">skins/</code> của cài đặt MediaWiki của bạn.\n: Cách này sẽ không có ảnh hưởng đến kho git của bạn dù bạn là một nhà phát triển MediaWiki. Xin xem [https://www.mediawiki.org/wiki/Manual:Skin_configuration Hướng dẫn: Cấu hình giao diện] để biết thông tin về cách kích hoạt hoặc chọn một trong số chúng làm giao diện mặc định.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (kích hoạt)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''vô hiệu hóa''')",
+       "mediastatistics": "Thống kê phương tiện",
+       "mediastatistics-summary": "Thống kê về các kiểu tập tin đã tải lên. Bảng này chỉ liệt kê phiên bản mới nhất của các tập tin. Các phiên bản cũ hoặc các phiên bản bị xóa được bỏ qua.",
+       "mediastatistics-nbytes": "$1 byte ($2; $3%)",
+       "mediastatistics-table-mimetype": "Kiểu MIME",
+       "mediastatistics-table-extensions": "Phần mở rộng có thể",
+       "mediastatistics-table-count": "Số tập tin",
+       "mediastatistics-table-totalbytes": "Kích thước kết hợp",
+       "mediastatistics-header-unknown": "Không rõ",
+       "mediastatistics-header-bitmap": "Hình ảnh bitmap",
+       "mediastatistics-header-drawing": "Bản vẽ (hình ảnh vectơ)",
+       "mediastatistics-header-audio": "Âm thanh",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-multimedia": "Phương tiện phong phú",
+       "mediastatistics-header-office": "Văn phòng",
+       "mediastatistics-header-text": "Văn bản",
+       "mediastatistics-header-executable": "Tập tin khả thi",
+       "mediastatistics-header-archive": "Định dạng nén",
+       "json-warn-trailing-comma": "$1 dấu phẩy lủng lẳng được xóa khỏi JSON",
+       "json-error-unknown": "JSON có vấn đề. Lỗi: $1",
+       "json-error-depth": "Đã vượt quá độ sâu ngăn xếp tối đa",
+       "json-error-state-mismatch": "JSON không hợp lệ hoặc sai dạng",
+       "json-error-ctrl-char": "Lỗi ký tự điều khiển, có lẽ đã mã hóa không chính xác",
+       "json-error-syntax": "Lỗi cú pháp",
+       "json-error-utf8": "Ký tự UTF-8 sai dạng, có lẽ đã mã hóa không chính xác",
+       "json-error-recursion": "Giá trị để mã hóa có tham chiếu đệ quy",
+       "json-error-inf-or-nan": "Giá trị để mã hóa có giá trị NAN (không phải số) hoặc INF (vô tận)",
+       "json-error-unsupported-type": "Đã đưa vào giá trị có kiểu không thể mã hóa"
 }
index 8eefeb6..4c3f099 100644 (file)
        "searchrelated": "fârwand",
        "searchall": "ale",
        "showingresults": "Hiâr {{PLURAL:$1|is '''1'''|sin '''$1'''}} Ärgääbnis , ôôgfangn baj numâr '''$2.'''",
-       "showingresultsheader": "{{PLURAL:$5|Ärgääbnis '''$1''' don '''$3'''|Ärgääbnis '''$1–$2''' fon '''$3'''}} fir '''$4'''",
        "search-nonefound": "Dsu dajna suuchfrôôchn is nigs gfundn wôrn.",
        "powersearch-legend": "Suuche mid mäa oogaam",
        "powersearch-ns": "In dena Nôômâsrajm suchng:",
        "pager-older-n": "{{PLURAL:$1|foorichâr|fooriche $1}}",
        "booksources": "ISBN-Suuche",
        "booksources-search-legend": "Gugn, woo mr biâchâr häärgrichd",
-       "booksources-go": "Loos-suchng",
        "log": "Logbicher",
        "allpages": "Ale sajdn",
        "prevpage": "Fooriche sajdn ($1)",
        "watchthispage": "Dii sajdn undâr beoobachdung nämâ",
        "unwatch": "Nimmä beoobachdn",
        "watchlist-details": "Duu häldsch {{PLURAL:$1|1 sajdn|$1 sajdn}} undâr beoobachdung.",
-       "wlshowlast": "Dsajch dii ändrunga fo di ledsdn $1 schdundn, $2 dooch odär $3",
+       "wlshowlast": "Dsajch dii ändrunga fo di ledsdn $1 schdundn, $2 dooch odär",
        "watchlist-options": "Was un wii alles af Dajnâr beobachdungslisdn dsajchd wärn sol",
        "watching": "Ghumd undâr beoobachdung ...",
        "unwatching": "Beobachdn ajschränggn",
        "metadata-fields": "Folgnde Felder vo däi EXIF-Medadaden, däi wou in den MediaWigi-Sysdemdexd ogeem sin, werrn af Bildbeschreibungsseidn miid eiglabbder Medadadndabelln ozeichd. Weidere werrn schdandaddmäßich net ozeichd.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "brajdn",
        "exif-imagelength": "Heen",
-       "watchlistall2": "ale",
        "namespacesall": "ale",
        "monthsall": "alle",
        "watchlisttools-view": "Ändrunga in där beoobachdungslisdn",
index 84c90c1..79a1c3e 100644 (file)
        "passwordreset-domain": "Domen:",
        "passwordreset-email": "Ladet leäktronik:",
        "changeemail": "Votükön ladeti leäktronik",
-       "changeemail-header": "Votükön ladeti leäktronik kala",
        "changeemail-oldemail": "Ladet leäktronik anuik:",
        "changeemail-newemail": "Ladet leäktronik nulik:",
        "changeemail-none": "(nonik)",
        "changeemail-password": "Letavöd olik su {{SITENAME}}:",
        "changeemail-submit": "Votükön ladeti leäktronik",
-       "changeemail-cancel": "Stöpädön",
        "bold_sample": "Vödem bigik",
        "bold_tip": "Vödem bigik",
        "italic_sample": "Korsiv",
        "searchrelated": "tefik",
        "searchall": "valik",
        "showingresults": "Pajonons dono jü {{PLURAL:$1|sukasek '''1'''|sukaseks '''$1'''}}, primölo me nüm #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Sek: '''$1''' se '''$3'''|Seks: '''$1 - $2''' se '''$3'''}} pro '''$4'''",
        "search-nonefound": "Sukaseks nonik dabinons.",
        "powersearch-legend": "Suk komplitikum",
        "powersearch-ns": "Sukön in nemaspads:",
        "suppress": "Lovelogam",
        "booksources": "Bukafons",
        "booksources-search-legend": "Sukön bukafonis:",
-       "booksources-go": "Getolöd",
        "booksources-text": "Is palisedons bevüresodatopäds votik, kels selons bukis nulik e pegebölis, e kels ba labons nünis pluik dö buks fa ol pasuköls:",
        "booksources-invalid-isbn": "El ISBN at jiniko no lonöfon; kontrololös pökis po kopiedam se rigafonät.",
        "specialloguserlabel": "Dunan:",
        "wlheader-enotif": "Nunam medü pot leäktronik pemögükon.",
        "wlheader-showupdated": "Pads pos visit lätik ola pevotüköls papenons '''me tonats bigik'''",
        "wlnote": "Is palisedons votükam{{PLURAL:$1| lätik|s lätik '''$1'''}} dü düp{{PLURAL:$2| lätik|s lätik '''$2'''}}.",
-       "wlshowlast": "Jonolöd: düpis lätik $1, delis lätik $2, $3",
+       "wlshowlast": "Jonolöd: düpis lätik $1, delis lätik $2,",
        "watchlist-options": "Paramets galädaliseda",
        "watching": "Papladon ini galädalised...",
        "unwatching": "Pamoükon se galädalised...",
        "import": "Nüveigön padis",
        "importinterwiki": "Nüveigam vü vüks",
        "import-interwiki-text": "Levälolös vüki e padatiädi ad nüveigön.\nDäts fomamas e nems redakanas pokipedons.\nNüveigs vüvükik valik pajonons su [[Special:Log/import|nüveigamalised]].",
-       "import-interwiki-source": "Fonätavük/pad:",
        "import-interwiki-history": "Kopiedön fomamis valik jenotema pada at",
        "import-interwiki-templates": "Keninükön samafomotis valik",
        "import-interwiki-submit": "Nüveigön",
        "exif-dc-publisher": "Püban",
        "exif-iimcategory-spo": "Spots",
        "exif-iimcategory-wea": "Stom",
-       "watchlistall2": "valikis",
        "namespacesall": "valik",
        "monthsall": "valik",
        "confirmemail": "Fümedolös ladeti leäktronik",
        "revdelete-restricted": "miedükams pelonöfükons pro guvans",
        "revdelete-unrestricted": "miedükams pro guvans pemoükons",
        "rightsnone": "(nonik)",
+       "revdelete-summary": "plän redakama",
        "feedback-subject": "Yegäd:",
        "searchsuggest-search": "Suk",
        "searchsuggest-containing": "ninädöl...",
index 28d38e7..1fcb1d9 100644 (file)
        "resetpass-submit-cancel": "Otmeńoit",
        "passwordreset-username": "Cäüttijänimi:",
        "changeemail-newemail": "Vassõn e-mail:",
-       "changeemail-cancel": "Otmeńoit",
        "bold_sample": "Pimmiä teksti",
        "bold_tip": "Pimmiä teksti",
        "italic_sample": "Kursiivoi teksti",
        "search-interwiki-more": "(lisä)",
        "searchrelated": "sittu",
        "searchall": "kõik",
-       "showingresultsheader": "{{PLURAL:$5|Tuloz '''$1''' '''$3'''-ss|Tulohsõd '''$1-$2''' '''$3'''-ss}} «$4» vart",
        "search-nonefound": "Cüsümühse mukaizõssi eb õõ mitäid löütettü.",
        "powersearch-legend": "Etenennü ettsü",
        "powersearch-ns": "Etsi nimiruumõssa:",
        "pager-older-n": "{{PLURAL:$1|vanöpi 1|vanõpad $1}}",
        "booksources": "Сirjalähed",
        "booksources-search-legend": "Etsi сirjalähteit",
-       "booksources-go": "Mee",
        "log": "Logid",
        "allpages": "Kõik artikkelid",
        "prevpage": "Entin сülсi ($1)",
        "watchthispage": "Katso sitä cülciä",
        "unwatch": "Lõpõt kattsõõmin",
        "watchlist-details": "Kattsõspiizgall on {{PLURAL:$1|$1 cülci|$1 cülciä}} (ilma juttucülciit).",
-       "wlshowlast": "Näüt viimeized $1 tunnia vai $2 päivää $3",
+       "wlshowlast": "Näüt viimeized $1 tunnia vai $2 päivää",
        "watchlist-options": "Kattsõspiizgaa valimizõd",
        "watching": "Kattsõõn…",
        "unwatching": "Kattsõõmizõõ lõpõttõmin…",
        "exif-iimcategory-hth": "Terveüz",
        "exif-iimcategory-pol": "Politiikka",
        "exif-iimcategory-wea": "Ilma",
-       "watchlistall2": "koko istori",
        "namespacesall": "kõik",
        "monthsall": "kõik",
        "confirm_purge_button": "OK",
index 9461efe..ba98951 100644 (file)
        "searchrelated": "samasugunõ",
        "searchall": "kõik",
        "showingresults": "{{PLURAL:$1|'''Üts''' tulõmus|'''$1''' tulõmust}} (tulõmusõst '''$2''' pääle).",
-       "showingresultsheader": "{{PLURAL:$5|'''$1''' '''$3'''-st vastussõst|Vastusõq '''$1–$2''' '''$3'''-st}} perräküsümisele '''$4'''",
        "search-nonefound": "Perräküsümisele löüdä-äs vastust.",
        "powersearch-legend": "Laendõt otsminõ",
        "powersearch-ns": "Otsminõ nimeruumõst:",
        "pager-older-n": "{{PLURAL:$1|vanõmb 1|vanõmbaq $1}}",
        "booksources": "Raamaduq",
        "booksources-search-legend": "Otsiq raamatut",
-       "booksources-go": "Otsiq",
        "booksources-text": "Tan om linke lehekülile, kon müvväs raamatit vai andas raamatidõ kotsilõ teedüst.",
        "specialloguserlabel": "Pruukja:",
        "speciallogtitlelabel": "Päälkiri:",
        "wlheader-enotif": "E-postiga teedäqandmisõq ommaq käügin.",
        "wlheader-showupdated": "Leheq, midä om muudõt päält su viimäst käümist, ommaq '''paksun kirän'''",
        "wlnote": "Tan om '''$1''' {{PLURAL:$1|muutminõ|muutmist}} viimädse '''$2''' tunni ao seen.",
-       "wlshowlast": "Näütäq viimädseq $1 tunni $2 päivä $3",
+       "wlshowlast": "Näütäq viimädseq $1 tunni $2 päivä",
        "watchlist-options": "Perräkaemisnimekirä säädmine",
        "watching": "Pandas perräkaemisnimekirjä...",
        "unwatching": "Võetas perräkaemisõ alt maaha...",
        "exif-gpsspeed-n": "sõlmõ",
        "exif-gpsdirection-t": "Peris tsiht",
        "exif-gpsdirection-m": "Magnõttsiht",
-       "watchlistall2": ", terveq aolugu",
        "namespacesall": "kõik",
        "monthsall": "kõik",
        "confirmemail": "Kinnüdäq e-postiaadrõssit",
index 49957ca..873a42f 100644 (file)
        "createaccount": "Ahiver on novea conte",
        "gotaccount": "Vos avoz ddja on conte so ç' wiki ci? '''$1'''.",
        "gotaccountlink": "Elodjîz vs",
-       "userlogin-resetlink": "Avoz rovyî vos detays d' elodjaedje?",
+       "userlogin-resetlink": "Avoz rovyî les pondants et djondants po s' elodjî?",
        "createaccountmail": "pa emile",
        "createaccountreason": "Råjhon:",
+       "createacct-another-submit": "Ahiver èn ôte conte",
        "badretype": "Vos avoz dné deus screts diferins.",
        "userexists": "Li no d' uzeu ki vs avoz tchoezi est ddja eployî.\nTchoezixhoz è èn ôte s' i vs plait.",
        "loginerror": "Aroke d' elodjaedje",
        "accountcreated": "Conte ahivé",
        "accountcreatedtext": "Li conte d' uzeu «$1» a stî ahivé.",
        "loginlanguagelabel": "Lingaedje: $1",
+       "pt-login": "S' elodjî",
+       "pt-login-button": "S' elodjî",
+       "pt-createaccount": "Ahiver on novea conte",
+       "pt-userlogout": "\nSi dislodjî",
        "changepassword": "Candjî l' sicret",
        "resetpass_announce": "Vos vs avoz elodjî avou on scret timporaire ki vos a stî emilé.\nPor vos fini l' elodjaedje, vos dvoz defini on novea scret:",
        "resetpass_header": "Candjî l' sicret do conte",
        "passwordreset-email": "Adresse emile:",
        "passwordreset-emailtitle": "Detays do contre so {{SITENAME}}",
        "changeemail": "Candjî l' emile",
-       "changeemail-header": "Candjî l' adresse emile do conte",
        "changeemail-text": "Rimplixhoz l' formulrece po candjî voste adresse emile. Vos dvroz dner vosse sicret po-z acertiner l' candjmint.",
        "changeemail-no-info": "Vos dvoz esse elodjî po pleur aveur accès a cisse pådje ci.",
        "changeemail-oldemail": "Adresse emile pol moumint:",
        "changeemail-newemail": "Novele adresse emile:",
        "changeemail-none": "(nole)",
        "changeemail-submit": "Candjî l' emile",
-       "changeemail-cancel": "Rinoncî",
        "bold_sample": "Cråssès letes",
        "bold_tip": "Tecse e cråssès letes",
        "italic_sample": "Clintcheyès letes",
        "search-interwiki-more": "(dipus)",
        "searchall": "totafwait",
        "showingresults": "Chal pa dzo {{PLURAL:$1|'''1''' rizultat|'''$1''' rizultats}} a pårti do limero '''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Rizultat '''$1'''|Rizultats '''$1 - $2'''}} foû di '''$3'' po '''$4'''",
        "search-nonefound": "N' a rén di çou ki vs cweroz après",
        "powersearch-legend": "Pus spepieus rcweraedjes",
        "powersearch-ns": "Cweri ezès espåces di lomaedje:",
        "pager-older-n": "{{PLURAL:$1|$1 pus vî|$1 pus vîs}}",
        "booksources": "Sourdants po les lives",
        "booksources-search-legend": "Cweri des sourdants po des lives",
-       "booksources-go": "I va",
        "specialloguserlabel": "Fwait pa:",
        "speciallogtitlelabel": "Såme (tite ou uzeu):",
        "log": "Djournås",
        "wlheader-enotif": "Li notifiaedje pa emile est en alaedje.",
        "wlheader-showupdated": "Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e '''cråssès letes'''",
        "wlnote": "Chal pa dzo {{PLURAL:$1|li dierin candjmint|les '''$1''' dierins candjmints}} {{PLURAL:$2|del dierinne eure|des '''$2''' dierinnès eures}}, disk' å $3 a $4.",
-       "wlshowlast": "Mostrer les dierin(nè)s $1 eures, $2 djoûs ou $3",
+       "wlshowlast": "Mostrer les dierin(nè)s $1 eures, $2 djoûs ou",
        "watchlist-options": "Tchuzes del djivêye des shuvous",
        "enotif_reset": "Mårker totes les pådjes come vizitêyes",
        "enotif_lastvisited": "Loukîz $1 po tos les candjmints dispoy vosse dierinne vizite.",
        "pageinfo-watchers": "Nombe di shuveus",
        "pageinfo-edits": "Nombe di candjmints",
        "pageinfo-authors": "Nombe d' oteurs diferins",
-       "markaspatrolleddiff": "Marké come patrouyî",
+       "markaspatrolleddiff": "Marké come ricoridjî",
        "markaspatrolledtext": "Marker cisse pådje ci come dedja patrouyeye",
        "patrol-log-page": "Djournå des patrouyaedjes",
        "patrol-log-header": "Çouchal c' est on djournå des modêyes k' ont stî patrouyeyes.",
        "exif-gpsspeed-k": "km/h",
        "exif-gpsspeed-m": "miles/h",
        "exif-gpsspeed-n": "nuks",
-       "watchlistall2": "totafwait",
        "namespacesall": "tos",
        "monthsall": "tos",
        "confirmemail": "Acertinaedje di l' adresse emile",
index 7d6b931..2a6710a 100644 (file)
        "passwordreset-emailsent-capture": "Ginpadangat an password reset email, nga ginpakita ha ubos.",
        "passwordreset-emailerror-capture": "Ginhimo an password reset email, kun diin nakikita ha ubos, pero pakyas an pagpadara ha  {{GENDER:$2|gumaramit}}: $1",
        "changeemail": "Igliwan an e-mail address",
-       "changeemail-header": "Igliwan an e-mail address akawnt",
        "changeemail-text": "Igkompleto ini nga porma para makapagliwan han imo e-mail address.  Kinahanglanon mo igbutang an imo tigaman-pagsulod para makompirma ini nga pagbag-o.",
        "changeemail-no-info": "Kinahanglanon mo mag-log-in para ka direkta makasakob hini nga pakli.",
        "changeemail-oldemail": "Yana nga e-mail address:",
        "changeemail-none": "(waray)",
        "changeemail-password": "An imo {{SITENAME}} password:",
        "changeemail-submit": "Igbalyo an e-mail",
-       "changeemail-cancel": "Pasagdi",
        "changeemail-throttled": "Nakadamo kada pag-log-in. Alayon paghulat hin $1 ugsa ka umutro.",
        "resettokens": "Igrest an mga token",
        "resettokens-text": "Puydi nimo mareset an mga token para makahatag hin pipira nga pribado nga datos nga may pakahisumpay ha imo akawnt dinhi.\nKinahanglan mo ini buhaton kun aksidenti nim nasaro hira ha iba nga tawo o an imo akawnt in nakompromiso.",
        "search-relatedarticle": "kasumapy",
        "searchrelated": "kadugtong",
        "searchall": "ngatanan",
-       "showingresultsheader": "{{PLURAL:$5|Resulta '''$1''' han '''$3'''|Mga resulta '''$1 - $2''' han '''$3'''}} para ha '''$4'''",
        "search-nonefound": "Waray resulta an nakakabaton han pakiana.",
        "powersearch-legend": "Abansado nga pagbiling",
        "powersearch-ns": "Pamiling ha mga ngaran-lat'ang:",
        "unusedtemplates": "Waray kagamiti nga mga batakan",
        "unusedtemplateswlh": "iba nga mga sumpay",
        "randompage": "Bisan ano nga pakli",
-       "randomincategory-selectcategory-submit": "Pakadto",
        "randomredirect": "Bisan ano la nga redirect",
        "randomredirect-nopages": "Waray mga redirecta ha ngaran-lat'ang nga \"$1\".",
        "statistics": "Mga estadistika",
        "pager-older-n": "{{PLURAL:$1|durudaan 1|durudaan $1}}",
        "booksources": "Mga libro nga tinikangan",
        "booksources-search-legend": "Pamilnga an mga libro nga gintikangan",
-       "booksources-go": "Kadto-a",
        "specialloguserlabel": "Magburuhat:",
        "speciallogtitlelabel": "iiguon (titulo o gumarami):",
        "log": "Mga talaan",
        "notanarticle": "Diri uska unod nga pakli",
        "notvisiblerev": "An urhi nga pagliwat han iba nga gumaramit in ginpara",
        "watchlist-details": "{{PLURAL:$1|$1 nga pakli|$1 nga mga pakli}} nga aada ha imo talaan nga binabantayan, diri bulag nga paglakip han mga hiruhimangraw-nga-pakli.",
-       "wlshowlast": "Igpakita an katapusan nga $1 nga mga oras $2 nga mga adlaw $3",
+       "wlshowlast": "Igpakita an katapusan nga $1 nga mga oras $2 nga mga adlaw",
        "watchlist-options": "Mga pirilian han talaan han binabantayan",
        "watching": "Ginbabantay...",
        "unwatching": "Diri na ginbabantay...",
        "thumbnail_error": "Sayo han paghihimo hin thumbnail: $1",
        "thumbnail_image-type": "An klase han hulagway in diri suportado",
        "import": "Naangbit hit mga pakli",
-       "import-interwiki-source": "Tinikangan nga wiki/pakli:",
        "import-interwiki-templates": "Lakip an ngatanan nga mga batakan",
        "import-interwiki-submit": "Naangbit",
        "import-interwiki-namespace": "Kakadtoan nga ngaran-lat'ang:",
        "exif-urgency-normal": "Normal ($1)",
        "exif-urgency-low": "Hamubo ($1)",
        "exif-urgency-high": "Hataas ($1)",
-       "watchlistall2": "ngatanan",
        "namespacesall": "ngatanan",
        "monthsall": "ngatanan",
        "confirmemail": "Igkompirma an e-mail address",
index e3a99fe..ca9ed62 100644 (file)
        "searchrelated": "yeneeni ngérte",
        "searchall": "yépp",
        "showingresults": "Woneg <b>$1</b> {{PLURAL:$1|ngérte|ciy ngérte}} doore ko ci #<b>$2</b>.",
-       "showingresultsheader": "{{PLURAL:$5|Ngérte '''$1''' bu '''$3'''|Ngértey '''$1 - $2'''}}  ngir '''$4'''",
        "search-nonefound": "Ceet gi jurul dara.",
        "powersearch-legend": "Ceet gu xóot",
        "powersearch-ns": "Seet ci barabi tur yi :",
        "booksources": "Téereb delluwaay",
        "booksources-search-legend": "Seet ab téereb delluwaay",
        "booksources-isbn": "ISBN :",
-       "booksources-go": "Ayca",
        "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 :",
        "watchlist-details": "Topp nga $1 {{PLURAL:$1|xët|ciy xët}}, soo waññiwaalewul xëti waxtaanuwaay yi.",
        "wlheader-showupdated": "Xët yi ñu soppiwoon ca sa duggu bu mujj ñoom la ñu fesal ñu <b>xëm</b>",
        "wlnote": "Fii ci suuf {{PLURAL:$1| ngay gis coppite yu mujj yi|ngay gis $1 coppite yu mujj}} ci {{PLURAL:$2|waxtu gu mujj gi|<b>$2</b> waxtu yu mujj}}.",
-       "wlshowlast": "wone $1 waxtu yu mujj, $2 bess yu mujj, walla $3.",
+       "wlshowlast": "wone $1 waxtu yu mujj, $2 bess yu mujj, walla .",
        "watchlist-options": "Tànneefi limu toppte bi",
        "watching": "Topp...",
        "unwatching": "Farug toppte gi ...",
        "exif-imagelength": "Kawewaay",
        "exif-usercomment": "Kadduy jëfëndikookat bi",
        "exif-componentsconfiguration-0": "Amul",
-       "watchlistall2": "yépp",
        "namespacesall": "Yépp",
        "monthsall": "Yépp",
        "confirmemail": "Dëggalal sa m-bataaxal",
        "specialpages": "Xëti jagleel",
        "revdelete-restricted": "doxalub digal ngir yorkat yi",
        "revdelete-unrestricted": "digal ngir yorkat yi deñ na",
-       "rightsnone": "(menn)"
+       "rightsnone": "(menn)",
+       "revdelete-summary": "soppi tënk gi"
 }
index 32dc1d2..b62b7ee 100644 (file)
@@ -15,7 +15,9 @@
                        "Cwek",
                        "Duolaimi",
                        "Impersonator 1",
-                       "LNDDYL"
+                       "LNDDYL",
+                       "TheChampionMan1234",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "鏈接下橫線:",
@@ -42,7 +44,7 @@
        "tog-shownumberswatching": "顯示關注人數",
        "tog-oldsig": "能界签名先望:",
        "tog-fancysig": "畀簽名當wiki文本(弗自動鏈接)",
-       "tog-uselivepreview": "用当场先望(试验)",
+       "tog-uselivepreview": "用當場先望(試驗)",
        "tog-forceeditsummary": "編要空白到提醒我",
        "tog-watchlisthideown": "關注表裏囥脫我所編",
        "tog-watchlisthidebots": "關注表裏囥脫機器人所編",
        "currentevents-url": "Project:箇阶段个事干",
        "disclaimers": "甮追問",
        "disclaimerpage": "Project:甮追問",
-       "edithelp": "ç¼\96å\86\99帮助",
+       "edithelp": "編寫幫助",
        "mainpage": "封面",
        "mainpage-description": "封面",
        "policy-url": "Project:策略",
-       "portal": "社å\8cºå\8f°é\97¨",
-       "portal-url": "Project:社å\8cºå\8f°é\97¨",
+       "portal": "社å\8d\80è\87ºé\96\80",
+       "portal-url": "Project:社å\8d\80è\87ºé\96\80",
        "privacy": "隱私策略",
        "privacypage": "Project:隱私策略",
        "badaccess": "权限",
        "databaseerror-text": "數據庫討信出錯。\n嘸數說明軟件裏有一個bug。",
        "databaseerror-textcl": "數據庫討信出錯。",
        "databaseerror-query": "討信:$1",
-       "databaseerror-function": "功能ː $1",
+       "databaseerror-function": "功能: $1",
        "databaseerror-error": "出錯:$1",
        "laggedslavemode": "警告: 页面可能弗包含最近个更新。",
        "readonly": "數據庫鎖牢",
        "searchrelated": "相关",
        "searchall": "全部",
        "showingresults": "下头显示从第<b>$2</b>条开始个<b>$1</b>条结果:",
-       "showingresultsheader": "对'''$4'''个{{PLURAL:$5|第'''$1'''至第'''$3'''项结果|第'''$1-$2'''项,共'''$3'''个结果}}",
        "search-nonefound": "查询呒有结果。",
        "powersearch-legend": "高级搜索",
        "powersearch-ns": "垃拉箇眼名字空间里向搜索:",
        "unusedtemplateswlh": "其他鏈接",
        "randompage": "随便望望",
        "randomincategory": "分類裏個隨便一頁",
-       "randomincategory-selectcategory-submit": "去",
        "statistics": "统计",
        "statistics-header-users": "用户资料",
        "statistics-users-active": "活跃用户",
        "pager-older-n": "旧$1次",
        "booksources": "书源",
        "booksources-search-legend": "搜索图书来源",
-       "booksources-go": "去",
        "specialloguserlabel": "用戶:",
        "speciallogtitlelabel": "目標(標題要弗用戶):",
        "log": "记录",
        "unwatchthispage": "停止监控",
        "notanarticle": "弗是內容頁",
        "watchlist-details": "弗包括讨论页,有 $1 页徕你侬关注表里向。",
-       "wlshowlast": "显示上 $1 个钟头 $2 日 $3",
+       "wlshowlast": "显示上 $1 个钟头 $2 日",
        "watchlist-options": "监控列表选项",
        "watching": "监控……",
        "unwatching": "解除监控……",
        "exif-contrast-2": "高",
        "exif-gpsspeed-k": "公里每小时",
        "exif-gpsspeed-m": "英里每小时",
-       "watchlistall2": "全部",
        "namespacesall": "全部",
        "monthsall": "全",
        "confirmemail": "确认电子邮件地址",
        "dberr-info-hidden": "(數據庫服務器連弗上)",
        "revdelete-restricted": "已将限制应用到管理员",
        "revdelete-unrestricted": "已移除对管理员个限制",
-       "rightsnone": "(呒)"
+       "rightsnone": "(呒)",
+       "revdelete-summary": "编辑摘要"
 }
index c952187..deee147 100644 (file)
        "pager-older-n": "{{PLURAL:$1|1=көгшәр 1|көгшәр $1}}",
        "booksources": "Дегтрин делгүрс",
        "booksources-search-legend": "Дегтр туск хәәх",
-       "booksources-go": "Ор",
        "log": "Сеткүлс",
        "allpages": "Цуг халхс",
        "prevpage": "Урдк халх ($1)",
        "watchthispage": "Эн халхиг шинҗлх",
        "unwatch": "Шинҗлх биш",
        "watchlist-details": "$1 {{PLURAL:$1|халх|халхс|халхс}} ухалвр угаһар тана шиҗллһнә сеткүлд.",
-       "wlshowlast": "Кенз $1 часд $2 өдрт $3 үзүлх",
+       "wlshowlast": "Кенз $1 часд $2 өдрт  үзүлх",
        "watchlist-options": "Шинҗллһнә сеткүлин көгүд",
        "watching": "Шинҗллһнә бүтлклд немлһн...",
        "unwatching": "Шинҗлһнә бүрткләс һарһлһн...",
        "exif-gpsaltitude": "Теңгсәс өндр",
        "exif-orientation-1": "Кирин",
        "exif-orientation-2": "Теңгрин хормаһар туссн",
-       "watchlistall2": "цуг",
        "namespacesall": "цуг",
        "monthsall": "цуг",
        "confirm_purge_button": "Тиим",
index c71079f..6b95e78 100644 (file)
        "search-interwiki-more": "(უმოს)",
        "searchrelated": "მათანგეფ",
        "searchall": "არძო",
-       "showingresultsheader": "{{PLURAL:$5|მოღალუ '''$1''' '''$3'''-შე|მოღალუეფ '''$1 - $2''' '''$3'''-შე}} '''$4'''-შო",
        "search-nonefound": "თქვანი მოგორაფილიშ მუთუნნერ მანგი მოღალუქ ვეძირჷ.",
        "powersearch-legend": "გოძინელ გორუა",
        "powersearch-ns": "დოგორ ჯოხოეფიშ ოფირჩას:",
        "pager-older-n": "{{PLURAL:$1|უმოს ჯვეში 1|უმოს ჯვეში $1}}",
        "booksources": "წინგიშ წყუეფ",
        "booksources-search-legend": "წიგნიშ წყუშ გორუა",
-       "booksources-go": "გინულა",
        "specialloguserlabel": "მახვარებუ:",
        "speciallogtitlelabel": "სათაურ:",
        "log": "ჟურნალეფ",
        "watchthispage": "თე ხასილაშ კონტროლ",
        "unwatch": "კონტროლიშ გოუქვაფა",
        "watchlist-details": "{{PLURAL:$1|$1 ხასილა|$1 ხასილეფ}} რე თქვან კონტროლიშ ერკებულს, სხუნუაშ ხასილეფიშ მეუკოროცხუო.",
-       "wlshowlast": "ეკონია $1 საათიშ $2 დღაშ $3 ძირაფა",
+       "wlshowlast": "ეკონია $1 საათიშ $2 დღაშ  ძირაფა",
        "watchlist-options": "კონტროლიშ ერკებულიშ ოფციეფ",
        "watching": "კონტროლირებად...",
        "unwatching": "კონტროლ მონწყუმილ რე ...-შა",
        "metadata-fields": "ათე მესიჯის შინაფილ მეტა მოჩამილოფეფიშ ოფირჩეფ ეკოროცხილ იჸი ნახანტიშ ხასილაშ დისფლეის მუჟამსით მეტა მოჩამილოფეფიშ ერკებულ იჸი გითოფაჩილინ \nშხვეფ, მუჭოთ წესინ, ტყობინაფილ იყ’ი.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "სიგანე",
        "exif-imagelength": "სიმაღალე",
-       "watchlistall2": "არძა",
        "namespacesall": "არძა",
        "monthsall": "არძა",
        "watchlisttools-view": "მერცხილ თირაფეფიშ ძირაფა",
index 71252d3..c8799e2 100644 (file)
@@ -28,6 +28,7 @@
        "tog-watchdefault": "צולייגן בלעטער וואס איך רעדאקטיר צו מיין אכטונג ליסטע",
        "tog-watchmoves": "צולייגן בלעטער וואס איך באוועג און טעקעס וואס איך לאד ארויף צו מיין אכטונג ליסטע",
        "tog-watchdeletion": "צולייגן בלעטער וואס איך מעק אויס צו מיין אויפפאסונג ליסטע",
+       "tog-watchrollback": "צולייגן צו מיין אויפפאסן ליסטע בלעטער אויף וואס איך האב אדורכגעפירט א צוריקשטעלן.",
        "tog-minordefault": "באגרענעצן אלע רעדאַקטירונגען גרונטלעך אלס מינערדיק",
        "tog-previewontop": "צײַג די \"פֿאָרויסיגע װײַזונג\" גלײַך בײַ דער ערשטער באַאַרבעטונג",
        "tog-previewonfirst": "ווייזן פֿאראויסדיגע ווייזונג בײַ דער ערשטער רעדאקטירונג",
        "otherlanguages": "אין אַנדערע שפראַכן",
        "redirectedfrom": "(אַריבערגעפֿירט פון $1)",
        "redirectpagesub": "ווייטערפירן בלאט",
+       "redirectto": "ווײַטערפירן צו:",
        "lastmodifiedat": "דער בלאט איז לעצט געווארן מאדיפיצירט $2, $1.",
        "viewcount": "דער בלאט איז געווארן געליינט {{PLURAL:$1|איין מאל|$1 מאל}}.",
        "protectedpage": "באשיצטער בלאט",
        "createaccount-text": "עמעצער האט באשאפֿן א קאנטע פֿאר אייער ע-פאסט אדרעס אין {{SITENAME}} ($4) מיטן נאמען \"$2\" און  פאסווארט \"$3\". איר דארפט אצינד איינלאגירן און ענדערן דאס פאסווארט.\n\nאיר קענט איגנארירן די מעלדונג, ווען די קאנטע איז באשאפֿן בטעות.",
        "login-throttled": "איר האט געפרוווט צופֿיל מאל אריינלאגירן.\nזייט אזוי גוט און וואַרט $1 איידער איר פרוווט נאכאמאל.",
        "login-abort-generic": "אײַער ארײַנלאגירונג איז נישט געווען דערפֿאלגרייך—אָפגעשטעלט",
+       "login-migrated-generic": "אײַער קאנטע איז געווארן מיגרירט, און אײַער באניצער־נאמען איז מער נישט פאראן אויף דער וויקי.",
        "loginlanguagelabel": "שפראך: $1",
        "suspicious-userlogout": " אײַער בקשה אַרויסלאָגירן זיך איז אפגעלייגט געווארן ווייַל אייגנטלעך איז זי געשיקט דורך אַ צעבראכענעם בלעטערער אָדער א פראקסי מיט א זאפאס.",
        "createacct-another-realname-tip": "עכטער נאמען איז אפציאנאל.\nאויב איר וויילט אויס צוצושטעלן אים, וועט דאס גענוצט ווערן צו געבן אטריבוציע פאר זייער ארבעט.",
        "passwordreset-emailsent-capture": "מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.",
        "passwordreset-emailerror-capture": "מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום {{GENDER:$2|באניצער}}איז דורכגעפאלן: $1",
        "changeemail": "ענדערן ע-פּאָסט אַדרעס",
-       "changeemail-header": "ענדערן קאנטע ע-פּאָסט אַדרעס",
        "changeemail-text": "דערגאַנצט די פֿאָרעם צו ענדערן אייער ע-פּאָסט אַדרעס. איר וועט דאַרפֿן אַרײַנגעבן אײַער פּאַראָל צו באַשטעטיקן די ענדערונג.",
        "changeemail-no-info": "איר דאַרפֿט זיין אַרײַנלאגירט צוצוקומען גלײַך צו דעם דאָזיגן בלאַט.",
        "changeemail-oldemail": "קראַנטער ע-פּאָסט אַדרעס:",
        "changeemail-none": "(קיין)",
        "changeemail-password": "אייער {{SITENAME}} פאסווארט:",
        "changeemail-submit": "ענדערן ע־פאסט אדרעס",
-       "changeemail-cancel": "אַנולירן",
        "changeemail-throttled": "איר האט געפרוווט צופֿיל מאל אריינלאגירן.\nזייט אזוי גוט און וואַרט $1 איידער איר פרוווט נאכאמאל.",
        "resettokens": "צוריקזעצן טאקנס",
+       "resettokens-text": "דא קענט איר צוריקשטעלן טאקנס וואס דערלויבן צוטריט צו געוויסע פריוואטע דאטן שייך צו אײַער קאנטע.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.",
        "resettokens-no-tokens": "נישט פאראן קיין טאקנס צוריקצוזעצן.",
        "resettokens-legend": "צוריקזעצן טאקנס",
        "resettokens-tokens": "טאקנס:",
        "showpreview": "ווײַזן פֿאָרױסקוק",
        "showdiff": "ווײַז די ענדערונגען",
        "blankarticle": "<strong>אזהרה:</strong> דער בלאט איר גייט שאפן איז ליידיק.\nטאמער איר וועט דריקן אויף \"{{int:savearticle}}\" נאכאמאל, וועט דער בלאט ווערן געשאפן אן קיין אינהאלט.",
-       "anoneditwarning": "'''ווארענונג:''' איר זענט נישט אריינלאגירט אין אייער קאנטע. אייער איי פי אדרעס וועט ווערן דאקומענטירט אין דעם בלאטס היסטאריע פון ענדערונגען. אויב זארגט איר זיך פאר פריוואטקייטן, ביטע טוט זיך אריינלאגירן.",
+       "anoneditwarning": "<strong>ווארענונג:</strong> איר זענט נישט אריינלאגירט. אייער איי פי אדרעס וועט ווערן עפנטלעך זעבאר ווען איר פירט דורך  ענדערונגען . אז איר <strong>[$1 לאגירט ארײַן]</strong> אדער <strong>[$2 שאפט א קאנטע]</strong>, וועלן אײַערע רעדאקטירונגען ווערן צוגעשריבן צו אײַער באניצער-נאמען, ווי אויך אנדערע טובות.",
        "anonpreviewwarning": "''איר זענט נישט אַרײַנלאגירט. אויפֿהיטן וועט ארײַנשרײַבן אײַער IP אַדרעס אין דער רעדאַקטירונג היסטאריע פונעם בלאַט.''",
        "missingsummary": "'''דערמאנונג:''' איר האט נישט אויסגעפילט דעם קורץ ווארט אויפקלערונג אויף אייער עדיט. אויב וועט איר דרוקן נאכאמאל אויף  \"היט אפ דעם בלאט\", וועט אייער ענדערונג ווערן געהיטן אן דעם.",
        "missingcommenttext": "ביטע שטעלט אריין א אנמערקונג פון אונטן.",
        "rev-deleted-event": "(לאגירן אקציע אראפגענומען)",
        "rev-deleted-user-contribs": "[באַניצער נאָמען אָדער IP אַדרעס אראפגענומען - רעדאַקטירונג פֿאַרבאָרגן פֿון בייַשטייַערונגען]",
        "rev-deleted-text-permission": "די בלאט רעוויזיע איז געווארן '''אויסגעמעקט '''.\nעס איז מעגלעך דא נאך פרטים אין דעם\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} אויסמעקונג לאג].",
+       "rev-suppressed-text-permission": "די בלאט רעוויזיע איז געווארן <strong>אונטערדריקט</strong>. מען קען געפינען נאך פרטים אין דעם [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} אונטערדריקן לאגבוך].",
        "rev-deleted-text-unhide": "די בלאט רעוויזיע איז געווארן '''אויסגעמעקט '''.\nעס איז מעגלעך דא נאך פרטים אין דעם\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} אויסמעקונג לאג].\nאיר קענט נאך  [$1 באקוקן די רעוויזיע] אויב איר ווילט גיין ווײַטער.",
        "rev-suppressed-text-unhide": "די בלאט רעוויזיע איז געווארן '''באהאלטן'''.\nעס איז מעגלעך דא נאך פרטים אין דעם [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} באהעלטעניש לאג].\nאיר קענט נאך [$1 באקוקן די רעוויזיע] אויב איר ווילט גיין ווײַטער.",
        "rev-deleted-text-view": "די בלאט רעוויזיע איז געווארן '''אויסגעמעקט'''.\nאיר קענט זען זי;\nעס איז מעגלעך דא נאך פרטים אין דעם [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} אויסמעקונג לאג].",
        "searchall": "אלץ",
        "showingresults": "ווייזן ביז {{PLURAL:$1|רעזולטאט '''איינס'''|'''$1''' רעזולטאטן}} אנגעפאנגן פון נומער #'''$2''':",
        "showingresultsinrange": "ווײַזן אונטן ביז {{PLURAL:$1|<strong>1</strong> רעזולטאט|<strong>$1</strong> רעזולטאטן}} אין גרייך #<strong>$2</strong> ביז #<strong>$3</strong>.",
-       "showingresultsheader": "{{PLURAL:$5|רעזולטאַט '''$1''' פֿון '''$3'''| רעזולטאַטן '''$1 - $2''' פֿון '''$3'''}} פֿאַר '''$4'''",
        "search-nonefound": "נישטא קיין רעזולטאטן פֿאַר דער שאלה.",
        "powersearch-legend": "ווײַטהאלטן זוכן",
        "powersearch-ns": "זוכן אין נאמענטיילן:",
        "randomincategory": "צופעליקער בלאט אין קאטעגאריע",
        "randomincategory-invalidcategory": "\"$1\" איז נישט קיין גילטיקער קאטעגאריע נאמען.",
        "randomincategory-nopages": "נישט פאראן קיין בלעטער אין [[:Category:$1]].",
-       "randomincategory-selectcategory": "באקומען צופעליקן בלאט פון קאטעגאריע: $1, $2.",
-       "randomincategory-selectcategory-submit": "גיין",
+       "randomincategory-category": "קאַטעגאריע:",
+       "randomincategory-legend": "צופעליקער בלאט אין קאטעגאריע",
        "randomredirect": "צופֿעליק ווײַטערפֿירן",
        "randomredirect-nopages": "נישטא קיין ווײַטערפֿירונגען אין דעם נאמענטייל $1.",
        "statistics": "סטאַטיסטיק",
        "querypage-disabled": "דער באַזונדער־בלאַט איז אומאַקטיווירט צוליב אויספֿירונג סיבות.",
        "booksources": "דרויסנדיגע ליטעראַטור ISBN",
        "booksources-search-legend": "זוכן פאר דרויסנדע ביכער מקורות",
-       "booksources-go": "גיין",
+       "booksources-search": "זוכן",
        "booksources-text": "אונטן איז א ליסטע פון סייטס וואס פֿארקויפֿן נייע און גענוצטע ביכער און האבן אויך נאך אינפֿארמאציע וועגן די ביכער וואס איר זוכט:",
        "booksources-invalid-isbn": "דאָס געגעבענע ISBN זעט נישט אויס צו זיין גילטיק; קאנטראלירט פֿאַר גרײַזן בײַם קאפּירן פון דעם ערשטיקן מקור.",
        "specialloguserlabel": "אויספֿירער:",
        "allpages-bad-ns": "{{SITENAME}} האט נישט קיין נאָמענטייל \"$1\".",
        "allpages-hide-redirects": "פֿארהיילן ווייטערפֿירונגען",
        "cachedspecial-viewing-cached-ttl": "איר באקוקט א ווערסיע פון דעם בלאט פונעם זאפאס, וואס קען אבער זיין  פֿארעלטערט ביז $1.",
+       "cachedspecial-viewing-cached-ts": "איר זעט א זאפאס־ווערסיע פון דעם בלאט, וואס איז מעגלעך נישט אקטועל.",
        "cachedspecial-refresh-now": "באקוקן די לעצטע.",
        "categories": "קאַטעגאָריעס",
        "categoriespagetext": "די פֿאלגענדע {{PLURAL:$1| קאַטעגאָריע אַנטהאַלט|קאַטעגאָריעס אַנטהאַלטן}} בלעטער אדער מעדיע.\n[[Special:UnusedCategories|אומבאַניצטע קאַטעגאריעס]] זענען נישט געוויזן דא.\nזעט אויך [[Special:WantedCategories|געזוכטע קאַטעגאריעס]].",
        "trackingcategories-msg": "אויפפאסן־קאטעגאריע",
        "trackingcategories-name": "מעלדונג נאמען",
        "trackingcategories-desc": "קאטעגאריע אײַנשליסן קריטעריע",
+       "hidden-category-category-desc": "די קאטעגאריע אנטהאלט  <code><nowiki>__HIDDENCAT__</nowiki></code> אין בלאט־אינהנהאלט, וואס פארמײַדט אים פון באשײַנען אין דעם קאטעגאריע־לינק־קעסטל.",
        "trackingcategories-nodesc": "נישט פאראן קיין באשרײַבונג.",
        "trackingcategories-disabled": "קאטעגאריע איז אומאקטיווירט",
        "mailnologin": "נישטא קיין אדרעס צו שיקן",
        "wlheader-enotif": "ע-פאסט מעלדונג ערמעגליכט.",
        "wlheader-showupdated": "בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''.",
        "wlnote": "אונטן {{PLURAL:$1|איז די לעצטע ענדערונג|זענען די לעצטע <strong>$1</strong> ענדערונגען}} אין {{PLURAL:$2|דער לעצטער שעה|די לעצטע <strong>$2</strong> שעה'ן}} ביז $3, $4.",
-       "wlshowlast": "(ווײַזן די לעצטע $1 שעה'ן | $2 טעג | $3)",
+       "wlshowlast": "ווײַזן די לעצטע $1 שעה'ן  $2 טעג",
        "watchlist-options": "אויפֿפאַסן ליסטע ברירות",
        "watching": "אויפפאסענדונג…",
        "unwatching": "נעמט אראפ פון אויפפאסונג ליסטע…",
        "exbeforeblank": "אינהאַלט בעפֿאַרן אויסליידיגן איז געווען: \"$1\"",
        "delete-confirm": "אויסמעקן $1",
        "delete-legend": "אויסמעקן",
-       "historywarning": "אכטונג – איר גייט אויסמעקן א בלאט וואָס האט א היסטאריע מיט $1 {{PLURAL:$1|ווערסיע|ווערסיעס}}:",
+       "historywarning": "<strong>אכטונג:</strong> איר גייט אויסמעקן א בלאט וואָס האט א היסטאריע מיט $1 {{PLURAL:$1|ווערסיע|ווערסיעס}}:",
        "confirmdeletetext": "איר גייט איצט אויסמעקן א בלאט צוזאַמען מיט זײַן גאנצע היסטאריע.\n\nביטע באשטעטיגט אז דאס איז טאקע אייער כוונה, אז איר פארשטייט פולערהייט די קאנסקווענסן פון דעם אַקט, און אז דאס איז אין איינקלאנג מיט [[{{MediaWiki:Policy-url}}|דער פאליסי]].",
        "actioncomplete": "די אַקציע אָט זיך דורכגעפֿירט",
        "actionfailed": "אקציע דורכגעפאלן",
        "delete-edit-reasonlist": "רעדאַקטירן די אויסמעקן סיבות",
        "delete-toobig": "דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אזעלכע בלעטער איז באַגרענעצט געווארן בכדי צו פֿאַרמײַדן א צופֿעליגע פֿאַרשטערונג פֿון  {{SITENAME}}.",
        "delete-warning-toobig": "דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אים קען פֿאַרשטערן דאַטנבאַזע אפעראַציעס פֿון {{SITENAME}}; זײַט פֿארזיכטיג איידער איר מעקט אויס.",
+       "deleteprotected": "איר קענט נישט אויסמעקן דעם בלאט ווײַל ער איז געשיצט.",
        "deleting-backlinks-warning": "'''ווארענוג:'''\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|אנדערע בלעטער]]  פארבינדן צום בלאט אדער אריבערשליסן דעם בלאט איר האלט ביי אויסמעקן.",
        "rollback": "צוריקדרייען רעדאַקטירונגען",
        "rollback_short": "צוריקדרייען",
        "sp-contributions-search": "זוכן בײַשטײַערונגען",
        "sp-contributions-username": "באניצער נאמען אדער IP אדרעס:",
        "sp-contributions-toponly": "בלויז ווײַזן רעדאַקטירונגען וואָס זענען די לעצטיקע רעוויזיעס",
-       "sp-contributions-newonly": "בלוז ווײַזן רעדאקטירונגען וואס זענען נײַ־געשאפענע בלעטער",
+       "sp-contributions-newonly": "×\91×\9c×\95×\99×\96 ×\95×\95ײַ×\96×\9f ×¨×¢×\93×\90ק×\98×\99ר×\95× ×\92×¢×\9f ×\95×\95×\90ס ×\96×¢× ×¢×\9f × ×²Ö·Ö¾×\92עש×\90פענע ×\91×\9c×¢×\98ער",
        "sp-contributions-submit": "זוכן",
        "whatlinkshere": "װאָס פֿאַרבינדט אַהער",
        "whatlinkshere-title": "בלעטער וואס פֿארבינדן צו $1",
        "movepagetalktext": "דער רעדן בלאט וועט ווערן באַוועגט אויטאמאֵטיש מיט אים, '''אחוץ:'''\n* ס'איז שוין דא א נישט-ליידיגער בלאט מיטן נייעם נאמען, אדער.\n* איר נעמט  אראפ דעם צייכן פונעם קעסטל אונטן.\n\nאין די פֿעלער, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
        "movearticle": "באוועג בלאט:",
        "moveuserpage-warning": "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
+       "movecategorypage-warning": "<strong>ווארענונג:</strong> איר האלט ביי באוועגן א קאטעגאריע בלאט. גיט אכט אז נאר דער בלאט וועט ווערן באוועגט, אבער די בלעטער אין דער אלטער קאטעגאריע וועט מען <em>נישט</em> be ארײַנשטעלן אין דער נייער קאטעגאריע.",
        "movenologintext": "איר דארפֿט זיך אײַנשרײַבן און זײַן  [[Special:UserLogin|אַרײַנלאגירט]] צו באַוועגן א בלאַט.",
        "movenotallowed": "איר זענט נישט דערלויבט צו באוועגן בלעטער.",
        "movenotallowedfile": "איר האט נישט קיין רשות צו באוועגן טעקעס.",
        "import": "אימפארטירן בלעטער",
        "importinterwiki": "אריבערוויקי אימפארט",
        "import-interwiki-text": "קלויבט אויס א וויקי און אן ארטיקל קעפל צו אימפארטירן.\nדי דאטעס און די נעמען פון די רעדאקטארן וועט ווערן געהיטן.\nאלע צווישנוויקי אימפארט אקציעס ווערן פארשריבן אינעם   [[Special:Log/import|אימפארט לאג]].",
-       "import-interwiki-source": "מקור וויקי/בלאט",
+       "import-interwiki-sourcewiki": "מקור וויקי:",
+       "import-interwiki-sourcepage": "מקור בלאַט:",
        "import-interwiki-history": "קאפירן אלע היסטאריע ווערסיעס פאר דעם בלאט",
        "import-interwiki-templates": "איינשילסן אלע מוסטערן",
        "import-interwiki-submit": "אימפארט",
        "exif-urgency-low": "נידעריק ($1)",
        "exif-urgency-high": "הויך ($1)",
        "exif-urgency-other": "באניצער־דעפינירטע פריאריטעט ($1)",
-       "watchlistall2": "אַלע",
        "namespacesall": "אַלע",
        "monthsall": "אלע",
        "confirmemail": "באַשטעטיקט בליצפּאָסט אַדרעס",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|האט געביטן}} גרופע מיטגלידערשאפט פאר $3",
        "logentry-rights-autopromote": "$1 אויטאמאטיש  {{GENDER:$2|פראמאווירט}} פון $4 צו $5",
        "rightsnone": "(גארנישט)",
+       "revdelete-summary": "רעדאקטירונג קיצור",
        "feedback-bugornote": "ווען איר זענט גרייט צו באשרייבן א טעכנישן פראבלעם ביטע [$1 מעלדט א פעלער].\nאנדערש, קענט איר ניצן די גרינגע פארעם אונטן. מען וועט צולייגן אייער הערה צום בלאט \"[$3 $2]\", צוזאמען מיט אייער באניצער נאמען און וועלכן בלעטערער איר ניצט.",
        "feedback-subject": "טעמע:",
        "feedback-message": "מעלדונג:",
index 842cc1d..c4b68c1 100644 (file)
        "passwordreset-emailsent-capture": "E-mail àtúntò ọ̀rọ̀ìpamọ́ kan ti jẹ́ fífiránṣẹ́. Òhun nìyí nísàlẹ̀.",
        "passwordreset-emailerror-capture": "E-mail ìyípadà ọ̀rọ̀ìpamọ́ jẹ́ dídá, òhun lóhàn nísàlẹ̀ yìí, sùgbọ́n ìfiránṣẹ́ rẹ̀ sí {{GENDER:$2|oníṣe}} náà kùnà: $1",
        "changeemail": "Ìyípadà àdírẹ̀sì E-mail",
-       "changeemail-header": "Ìyípadà àdírẹ̀sì e-mail àkópamọ́",
        "changeemail-text": "Ẹ parí fọ́ọ̀mù yìí láti ṣèyípadà àdírẹ̀sì e-mail yín. Ẹ gbọ́dọ̀ tẹ ọ̀rọ̀ìpamọ́ yín láti ṣèmúdájú ìyípadà yìí.",
        "changeemail-no-info": "Ẹ gbódọ̀ wọlé láti bósí ojúewé yìí tààrà.",
        "changeemail-oldemail": "Àdírẹ̀sì E-mail ìsinsìnyí:",
        "changeemail-none": "(kòsí)",
        "changeemail-password": "Ọ̀rọ̀ìpamọ́ {{SITENAME}} yín:",
        "changeemail-submit": "Ìyípadà E-mail",
-       "changeemail-cancel": "Fagilé",
        "bold_sample": "Ìkọ kedere",
        "bold_tip": "Ìkọ kedere",
        "italic_sample": "Ìkọ italiki",
        "searchrelated": "tóbáramu",
        "searchall": "gbogbo",
        "showingresults": "Ìfihàn nísàlẹ̀ títí dé {{PLURAL:$1|èsì '''1'''|àwọn èsì '''$1'''}} láti ìbẹ̀rẹ̀ ní #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Èsì '''$1''' nínú ''''$3'''|Àwọn èsì '''$1 - $2''' nínú '''$3'''}} fún '''$4'''",
        "search-nonefound": "Kò sí àwọn èsì kankan tóbáramu mọ́ ìtọrọ.",
        "powersearch-legend": "Àwárí kíkúnrẹ́rẹ́",
        "powersearch-ns": "Àwárí nínú orúkọàyè:",
        "querypage-disabled": "Ojúewé pàtàkì yìí jẹ́ ìdálẹ́kun nítorí ìsiṣẹ́.",
        "booksources": "Àwọn orísun ìwé",
        "booksources-search-legend": "Àwáàrí fún áwọn ìwé ìtọ́ka",
-       "booksources-go": "Lọ",
        "booksources-text": "Nísàlẹ̀ ni àtòjọ àwọn àjápọ̀ mọ́ àwọn ibiìtakùn míràn tí wọ́n únta ìwé tuntun àti ìwé àtijọ́, wọ́n sì le ní ọ̀rọ̀ ẹ̀kúnrẹ́rẹ́ nípa àwọn ìwé tí ẹ únwá:",
        "booksources-invalid-isbn": "ISBN náà kò dà bíi pé ó jẹ́ oníìbámu; ẹ yẹ̀ ẹ́ wò bóyá àsìṣe wà láti ibi tó jẹ́ kíkọ wá.",
        "specialloguserlabel": "Olùṣe:",
        "wlheader-enotif": "Ìfitónilétí e-mail wà ní gbígbàláyè.",
        "wlheader-showupdated": "Àwọn ojúewé tí wọn ti yípadà látìgbà tí ẹ ṣàbẹ̀wò wọn gbẹ̀yìn jẹ́ fífihàn ní ''kedere'''",
        "wlnote": "Lábẹ́ {{PLURAL:$1|ni àtúnṣe tó gbẹ̀yìn|ni àwọn àtúnṣe '''$1''' tí wọn gbẹ̀yìn}} ní {{PLURAL:$2|wákàtí kan|wákàtí '''$2'''}} sẹ́yìn, títí dí ọjọ́ $3, $4.",
-       "wlshowlast": "Ìfihàn wákàtí $1 sẹ́yìn ọjọ́ $2 sẹ́yìn $3",
+       "wlshowlast": "Ìfihàn wákàtí $1 sẹ́yìn ọjọ́ $2 sẹ́yìn",
        "watchlist-options": "Àṣàyàn ìmójútọ́",
        "watching": "Ó ún mójútó...",
        "unwatching": "Jíjáwọ́ ìmójútó...",
        "import": "Ìkówọlé àwọn ojúewé",
        "importinterwiki": "Ìkówọlé láàrin àwọn wiki",
        "import-interwiki-text": "Ẹ mú wiki àti àkọlé ojúewé tí ẹ fẹ́ kówọlé.\nỌjọ́ àti orúkọ olùtúnṣe àtúnyẹ̀wò kò ní yàtọ̀.\nGbogbo ìkówọlé láàrin wiki jẹ́ kíkọsílẹ̀ sí [[Special:Log/import|àkọọ́lẹ̀ ìkówọlé]].",
-       "import-interwiki-source": "Orísún wiki/ojúewé:",
        "import-interwiki-history": "Ṣe àwòkọ gbogbo àwọn àtúnyẹ̀wò ìtàn fún ojúewé yìí",
        "import-interwiki-templates": "Ìmúpọ̀ gbogbo àwọn àdàkọ",
        "import-interwiki-submit": "Ìkówọlé",
        "exif-urgency-normal": "Déédé ($1)",
        "exif-urgency-low": "Kúkúrú ($1)",
        "exif-urgency-high": "Gíga ($1)",
-       "watchlistall2": "gbogbo",
        "namespacesall": "gbogbo",
        "monthsall": "gbogbo",
        "confirmemail": "Ṣè'múdájú àdírẹ́ẹ̀sì e-mail",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|yí}} ọmọ ẹgbẹ́ padà fún $3",
        "logentry-rights-autopromote": "$1 jẹ́ {{GENDER:$2|gbígbénípòga}} nífúnraẹni láti $4 sí $5",
        "rightsnone": "(kòsí)",
+       "revdelete-summary": "àkótán àtúnṣe",
        "feedback-bugornote": "Tí ẹ bá ti ṣetán láti ṣàlàyé ìsòrò iṣẹ́ẹ̀rọ́ lẹ́ẹ̀kúnrẹ́rẹ́ ẹ jọ̀wọ́ [$1 ẹ sọ irú ìsòro náà]\nBíbẹ̀ẹ̀kọ́, ẹ le lo fọ́ọ̀mù ìsàlẹ̀. Ẹjọ́ yín yíò jẹ́ fífikún mọ́ ojúewé \"[$3 $2]\", bákannáà mọ́ orúkọ oníṣe yín.",
        "feedback-subject": "Oríọ̀rọ̀:",
        "feedback-message": "Ìránṣẹ́:",
index 4b0d976..969f4b3 100644 (file)
        "passwordreset-emailsent-capture": "密碼重設電郵經已送出,下面有顯示。",
        "passwordreset-emailerror-capture": "密碼重設電郵經已送出,下面有顯示,但送畀{{GENDER:$2|user}}時失敗: $1",
        "changeemail": "改電郵地址",
-       "changeemail-header": "改戶口電郵地址",
        "changeemail-text": "填呢份表去改戶口電郵地址。你需要入密碼確認改動。",
        "changeemail-no-info": "你一定要簽到咗去直接入來呢一版。",
        "changeemail-oldemail": "而家個電郵地址:",
        "changeemail-none": "(冇)",
        "changeemail-password": "你{{SITENAME}}個密碼:",
        "changeemail-submit": "轉電郵",
-       "changeemail-cancel": "取消",
        "changeemail-throttled": "你試咗登入太多次,請喺$1後再試過。",
        "resettokens": "重設密匙",
        "resettokens-text": "您可以重設有關你戶口私隱資料嘅密匙。\n\n如果你唔小心洩漏密匙,或者戶口畀人入侵,就要重設密匙。",
        "searchrelated": "有關",
        "searchall": "全部",
        "showingresults": "'自#'''$2'''起顯示最多'''$1'''個結果。",
-       "showingresultsheader": "對'''$4'''嘅{{PLURAL:$5|第'''$1'''到第'''$3'''項結果|第'''$1 - $2'''項,共'''$3'''項結果}}",
        "search-nonefound": "響個查詢度無結果配合。",
        "powersearch-legend": "進階搵嘢",
        "powersearch-ns": "喺以下嘅空間名度搵:",
        "querypage-disabled": "呢個特別版基於效能嘅原因停用咗。",
        "booksources": "書籍來源",
        "booksources-search-legend": "搵書源",
-       "booksources-go": "去",
        "booksources-text": "以下嘅連結清單列出其它一啲賣新書同二手書嘅網站,可能可以提供到有關你想搵嘅書嘅更多資料:",
        "booksources-invalid-isbn": "個ISBN無效;請檢查原來源複製落來嘅錯。",
        "specialloguserlabel": "用戶:",
        "wlheader-enotif": "電子郵件通知已經啟用。",
        "wlheader-showupdated": "'''粗體字'''嘅頁響你上次嚟之後被人改過",
        "wlnote": "以下係最近'''$2'''個鐘之內嘅最新$1次修改。",
-       "wlshowlast": "顯示最近 $1 個鐘 $2 日 $3 嘅修改",
+       "wlshowlast": "顯示最近 $1 個鐘 $2 日  嘅修改",
        "watchlist-options": "監視清單選項",
        "watching": "監視緊...",
        "unwatching": "唔再監視緊...",
        "import": "倒入頁面",
        "importinterwiki": "Transwiki 倒入",
        "import-interwiki-text": "揀一個 wiki 同埋一頁去倒入。\n修訂日期同編輯者會被保存落嚟。\n所有 transwiki 嘅倒入動作會響[[Special:Log/import|倒入日誌]]度記錄落嚟。",
-       "import-interwiki-source": "來源 wiki/頁:",
        "import-interwiki-history": "複製呢一頁所有嘅歷史修訂",
        "import-interwiki-templates": "包含全部嘅模",
        "import-interwiki-submit": "倒入",
        "exif-gpsdestdistance-n": "浬",
        "exif-gpsdirection-t": "真實方向",
        "exif-gpsdirection-m": "地磁方向",
-       "watchlistall2": "全部",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認電郵地址",
        "revdelete-restricted": "已經應用限制到操作員",
        "revdelete-unrestricted": "已經拎走對於操作員嘅限制",
        "rightsnone": "(冇)",
+       "revdelete-summary": "編輯摘要",
        "searchsuggest-search": "搵嘢",
        "searchsuggest-containing": "名單傳送緊...",
        "duration-hours": "$1{{PLURAL:$1|個鐘}}",
index e99e9f2..524ae7d 100644 (file)
        "searchrelated": "gerelateerd",
        "searchall": "aolle",
        "showingresults": "Ieronder {{PLURAL:$1|sti '''1''' resultaot|staen '''$1''' resultaoten}} vanof #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Resultaot '''$1''' von '''$3'''|Resultaot'n '''$1 - $2''' von '''$3'''}} vò '''$4'''",
        "search-nonefound": "Er zin geen resultaot'n vò je zoekopdracht.",
        "powersearch-legend": "Uutebreid zoeken",
        "search-external": "Extern zoeken",
        "pager-older-n": "{{PLURAL:$1|1 ouwere|$1 ouwere}}",
        "booksources": "Bronnen vò boeken",
        "booksources-search-legend": "Bronn'n en informaosie over 'n boek zoek'n",
-       "booksources-go": "OK",
        "specialloguserlabel": "Gebruker:",
        "log": "Logboek'n",
        "alllogstext": "Saemengesteld overzicht van de wis-, bescherm-, blokkeer- en gebrukerslechtenlogboeken.\nJe kan 't overzicht bepaelen deu 'n soôrte logboek, 'n gebrukersnaem of eên bladzie uut te kiezen.",
        "watchthispage": "Bekiek deêze bladzie",
        "unwatch": "Nie meêr volge",
        "watchlist-details": "Er {{PLURAL:$1|sti eên pagina|staen $1 pagina's}} op je volglieste, exclusief overlegpagina's.",
-       "wlshowlast": "Laetste $1 uur, $2 daegen bekieken ($3)",
+       "wlshowlast": "Laetste $1 uur, $2 daegen bekieken ()",
        "watchlist-options": "Opties vò volglieste",
        "actioncomplete": "Actie uutgevoerd",
        "actionfailed": "De handelienge is mislukt.",
        "metadata": "Metadata",
        "metadata-help": "Dit bestand bevat anvullende informaotie, die deur 'n fotocaomera, scanner of fotobewarkiengsprogramma toegevoegd kan zien. As 't bestand angepast is, kommen details mogelijk nie overeên mei 't gewiezigde bestand.",
        "metadata-fields": "De aofbildiengsmetadataveld'n in dit bericht worr'n oôk weergegeev'n op 'n aofbildiengspagina as de metadatatabel ingeklapt is.\nAorre veld'n worr'n verborr'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",
-       "watchlistall2": "aol",
        "namespacesall": "aol",
        "monthsall": "aolle",
        "imgmultipageprev": "← vorrege bladzie",
        "tag-filter": "[[Special:Tags|Labelfilter]]:",
        "revdelete-restricted": "ei beperkiengen an beheêrders opeleid",
        "revdelete-unrestricted": "ei beperkiengen voe beheêrders opeheven",
-       "rightsnone": "(hin)"
+       "rightsnone": "(hin)",
+       "revdelete-summary": "saemenvattieng bewerken"
 }
index 6f28fa4..2286a75 100644 (file)
                        "Impersonator 1",
                        "Duolaimi",
                        "TianyinLee",
-                       "NigelSoft"
+                       "NigelSoft",
+                       "Zhuyifei1999"
                ]
        },
        "tog-underline": "链接下划线:",
        "tog-hideminor": "隐藏最近更改中的小编辑",
        "tog-hidepatrolled": "隐藏最近更改中的已巡查编辑",
        "tog-newpageshidepatrolled": "隐藏新页面列表中的已巡查页面",
-       "tog-extendwatchlist": "扩展监视列表以显示所有更改而不仅是最近更改",
+       "tog-extendwatchlist": "扩展监视列表以显示所有更改,而不仅限于最近更改",
        "tog-usenewrc": "按页面合并最近更改和监视列表中的更改",
        "tog-numberheadings": "自动编号标题",
        "tog-showtoolbar": "显示编辑工具栏",
        "tog-editondblclick": "双击编辑页面",
-       "tog-editsectiononrightclick": "启用右击段落标题编辑段落",
-       "tog-watchcreations": "添加我创建的页面和我上传的文件至我的监视列表",
-       "tog-watchdefault": "添加我编辑的页面和文件至我的监视列表",
-       "tog-watchmoves": "添加我移动的页面和文件至我的监视列表",
-       "tog-watchdeletion": "添加我删除的页面和文件至我的监视列表",
-       "tog-watchrollback": "添加我回退过的页面至我的监视列表",
-       "tog-minordefault": "默认标记所有编辑为小编辑",
-       "tog-previewontop": "å°\86é¢\84è§\88æ\98¾ç¤ºå\9c¨ç¼\96è¾\91æ¡\86ä¸\8aæ\96¹",
+       "tog-editsectiononrightclick": "启用右击小节标题编辑段落",
+       "tog-watchcreations": "将我创建的页面和我上传的文件添加至我的监视列表",
+       "tog-watchdefault": "将我编辑的页面和文件添加至我的监视列表",
+       "tog-watchmoves": "将我移动的页面和文件添加至我的监视列表",
+       "tog-watchdeletion": "将我删除的页面和文件添加至我的监视列表",
+       "tog-watchrollback": "将我回退过的页面添加至我的监视列表",
+       "tog-minordefault": "将所有编辑默认标记为小编辑",
+       "tog-previewontop": "å\9c¨ç¼\96è¾\91æ¡\86ä¸\8aæ\96¹æ\98¾ç¤ºé¢\84è§\88",
        "tog-previewonfirst": "首次编辑时显示预览",
        "tog-enotifwatchlistpages": "当我的监视列表中的页面或文件更改时发送电子邮件通知我",
        "tog-enotifusertalkpages": "当我的用户讨论页面更改时发送电子邮件通知我",
        "tog-diffonly": "不在差异下面显示页面内容",
        "tog-showhiddencats": "显示隐藏分类",
        "tog-norollbackdiff": "执行回退后不显示差异",
-       "tog-useeditwarning": "当我离开有未保存更改的编辑页面时提醒我",
+       "tog-useeditwarning": "当我离开编辑页面时,如果有尚未保存的更改,请提醒我",
        "tog-prefershttps": "登录时始终使用安全连接",
        "underline-always": "始终",
        "underline-never": "从不",
        "subcategories": "子分类",
        "category-media-header": "分类“$1”中的媒体文件",
        "category-empty": "<em>本分类目前没有包含页面或媒体文件。</em>",
-       "hidden-categories": "{{PLURAL:$1|隐藏分类}}",
+       "hidden-categories": "{{PLURAL:$1|隐藏分类|$1个隐藏分类}}",
        "hidden-category-category": "隐藏分类",
        "category-subcat-count": "{{PLURAL:$2|本分类只有以下子分类。|本分类有以下$1个子分类,共有$2个子分类。}}",
        "category-subcat-count-limited": "本分类有以下{{PLURAL:$1|子分类|$1个子分类}}。",
-       "category-article-count": "{{PLURAL:$2|本分类只包含以下页面。|以下{{PLURAL:$1|页面|$1个页面}}属于本分类,共$2个页面。}}",
-       "category-article-count-limited": "以下{{PLURAL:$1|页面|$1个页面}}属于当前分类。",
-       "category-file-count": "{{PLURAL:$2|本分类只包含以下文件。|以下{{PLURAL:$1|文件|$1个文件}}属于本分类,共$2个文件。}}",
-       "category-file-count-limited": "以下{{PLURAL:$1|文件|$1个文件}}属于当前分类。",
+       "category-article-count": "{{PLURAL:$2|本分类只包含以下页面。|本分类中包含以下$1个页面,共$2个页面。}}",
+       "category-article-count-limited": "当前分类包含以下$1个页面。",
+       "category-file-count": "{{PLURAL:$2|本分类只包含以下一个文件。|本分类包含以下$1个文件,共$2个文件。}}",
+       "category-file-count-limited": "当前分类包含以下$1个文件。",
        "listingcontinuesabbrev": "续",
-       "index-category": "å\8f¯索引页面",
+       "index-category": "å·²索引页面",
        "noindex-category": "不可索引页面",
        "broken-file-category": "有受损文件链接的页面",
        "categoryviewer-pagedlinks": "($1)($2)",
        "faq": "常见问题",
        "faqpage": "Project:常见问题",
        "actions": "操作",
-       "namespaces": "å\90\8då­\97空间",
+       "namespaces": "å\91½å\90\8d空间",
        "variants": "变种",
        "navigation-heading": "导航菜单",
-       "errorpagetitle": "出错",
+       "errorpagetitle": "错误",
        "returnto": "返回$1。",
        "tagline": "来自{{SITENAME}}",
        "help": "帮助",
        "searcharticle": "前往",
        "history": "页面历史",
        "history_short": "历史",
-       "updatedmarker": "更新于我上次访问后",
+       "updatedmarker": "已于我上次访问之后更新",
        "printableversion": "打印版本",
        "permalink": "固定链接",
        "print": "打印",
        "deletethispage": "删除本页",
        "undeletethispage": "还原本页",
        "undelete_short": "还原$1次编辑",
-       "viewdeleted_short": "查看$1个已删除的编辑",
+       "viewdeleted_short": "查看$1个已删除的编辑",
        "protect": "保护",
        "protect_change": "更改",
        "protectthispage": "保护本页",
        "personaltools": "个人工具",
        "articlepage": "查看内容页面",
        "talk": "讨论",
-       "views": "查看",
+       "views": "视图",
        "toolbox": "工具",
        "userpage": "查看用户页面",
        "projectpage": "查看项目页面",
        "imagepage": "查看文件页面",
-       "mediawikipage": "查看息页面",
+       "mediawikipage": "查看息页面",
        "templatepage": "查看模板页面",
        "viewhelppage": "查看帮助页面",
        "categorypage": "查看分类页面",
        "otherlanguages": "其他语言",
        "redirectedfrom": "(重定向自$1)",
        "redirectpagesub": "重定向页面",
+       "redirectto": "重定向至:",
        "lastmodifiedat": "本页面最后修改于$1 $2。",
        "viewcount": "本页面已经被访问过$1次。",
        "protectedpage": "受保护页面",
        "policy-url": "Project:方针",
        "portal": "社区主页",
        "portal-url": "Project:社区专页",
-       "privacy": "é\9a\90ç§\81æ\9d\83æ\94¿ç­\96",
+       "privacy": "隐私政策",
        "privacypage": "Project:隐私权政策",
        "badaccess": "权限错误",
        "badaccess-group0": "你被禁止执行你刚才请求的操作。",
        "hidetoc": "隐藏",
        "collapsible-collapse": "折叠",
        "collapsible-expand": "展开",
-       "confirmable-confirm": "{{GENDER:$1|}}确定么?",
+       "confirmable-confirm": "{{GENDER:$1|}}确定么?",
        "confirmable-yes": "是",
        "confirmable-no": "否",
        "thisisdeleted": "查看或还原$1?",
        "viewyourtext": "您可以查看并复制<strong>您对此页面作出编辑后</strong>的源代码:",
        "protectedinterface": "该页提供此wiki软件的界面文字,它已被保护以防止恶意修改。\n如欲修改所有wiki的翻译,请到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化计划。",
        "editinginterface": "'''警告:'''您正在编辑的页面是用于提供软件的界面文字。\n改变此页将影响其他在此wiki上的用户界面外观。\n如欲修改所有wiki的翻译,请到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化计划。",
-       "cascadeprotected": "本页面已经受到保护,不能编辑,因为它被嵌入了以下启用“级联”选项的受保护{{PLURAL:$1|页面}}:$2",
+       "cascadeprotected": "本页面已经受到保护,不能编辑,因为它包含于以下被“连锁保护”的{{PLURAL:$1|页面}}:\n$2",
        "namespaceprotected": "您没有权限编辑'''$1'''名字空间内的页面。",
        "customcssprotected": "您没有权限编辑此CSS页面,因为它包含另一位用户的个人设置。",
        "customjsprotected": "您没有权限编辑此JavaScript页面,因为它包含另一位用户的个人设置。",
        "createaccount-text": "有人在{{SITENAME}}中利用您的邮箱创建了一个名为 \"$2\" 的新帐户($4),密码是 \"$3\" 。您应该立即登录并更改密码。\n\n如果该账户创建错误的话,您可以忽略此信息。",
        "login-throttled": "你最近尝试登录的次数过多。请等待$1后再试。",
        "login-abort-generic": "登录失败 - 已终止",
+       "login-migrated-generic": "您的账户已被迁移,并且您的用户名在此wiki不再存在。",
        "loginlanguagelabel": "语言:$1",
        "suspicious-userlogout": "注销请求被拒绝,因为它似乎是由有设计缺陷的浏览器或缓存代理发出的。",
        "createacct-another-realname-tip": "真实姓名是选填项目。\n如果你选择提供它,它将会用于贡献署名。",
        "passwordreset-capture-help": "如果您选中此框,电子邮件(包括临时密码)将显示,并发送给用户。",
        "passwordreset-email": "电子邮件地址:",
        "passwordreset-emailtitle": "在 {{SITENAME}} 的帐户详细信息",
-       "passwordreset-emailtext-ip": "有人(可能是您,来自IP地址$1)请求重设{{SITENAME}}($4)上相关账户的密码。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:\n\n$2\n\n这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。",
+       "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": "用户名:$1\n临时密码:$2",
        "passwordreset-emailsent": "密码重置邮件已发送。",
        "passwordreset-emailsent-capture": "密码重设电子邮件已发送,并在下面显示。",
        "passwordreset-emailerror-capture": "重置密码邮件已生成,但是无法向{{GENDER:$2|下列用户}} 发送:$1",
        "changeemail": "更改电子邮件地址",
-       "changeemail-header": "更改账户电子邮件地址",
        "changeemail-text": "完成该表格以更改你的电子邮件地址。你需要输入你的密码以确认该更改。",
        "changeemail-no-info": "\n您必须登录以直接访问本页。",
        "changeemail-oldemail": "当前电子邮件地址:",
        "changeemail-none": "(无)",
        "changeemail-password": "你的{{SITENAME}}密码:",
        "changeemail-submit": "更改电子邮件地址",
-       "changeemail-cancel": "取消",
        "changeemail-throttled": "您最近尝试了太多次登录。请等待$1后再试。",
        "resettokens": "重置密钥",
        "resettokens-text": "你可以在这里重置允许访问与你的账户有关的特定私人数据的密钥。\n\n如果你意外将它们分享给他人,或是你的账户已经被入侵,你应该重置它们。",
        "showpreview": "显示预览",
        "showdiff": "显示更改",
        "blankarticle": "<strong>警告</strong>:您创建的页面是空白的。如果您再次点击“{{int:savearticle}}”,您将真的创建没有任何内容的页面。",
-       "anoneditwarning": "<strong>警告:</strong>您没有登录。您的IP地址将被记录在该页面的编辑历史中。",
+       "anoneditwarning": "<strong>警告:</strong>您没有登录。您做出任何编辑后您的IP地址会公开可见。如果您<strong>[$1 登陆]</strong>或<strong>[$2 注册]</strong>一个账户,您的编辑将归属于您的用户名,以及有其他好处。",
        "anonpreviewwarning": "<em>你没有登录。保存会记录你的IP地址于该页面的编辑历史中。</em>",
        "missingsummary": "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
        "missingcommenttext": "请在下面输入评论。",
        "editingold": "'''警告:你正在编辑的是本页面的旧版本。'''如果你保存该编辑,该版本后的所有更改都会丢失。",
        "yourdiff": "差异",
        "copyrightwarning": "请注意您对{{SITENAME}}的所有贡献都被认为是在$2下发布,请查看在$1的细节。\n如果您不希望您的文字被任意修改和再散布,请不要提交。<br />\n您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源。\n'''不要在未获授权的情况下发表!'''<br />",
-       "copyrightwarning2": "请注意您对{{SITENAME}}的所有贡献\n都可能被其他贡献者编辑,修改或删除。\n如果您不希望您的文字被任意修改和再散布,请不要提交。<br />\n您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅$1的细节)。\n'''不要在未获授权的情况下发表!'''",
+       "copyrightwarning2": "请注意,您对{{SITENAME}}的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。<br />\n您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅$1的细节)。'''不要在未获授权的情况下发表!'''",
        "longpageerror": "'''错误:您所提交的文本长度有{{PLURAL:$1|1|$1}}KB,这大于{{PLURAL:$2|1|$2}}KB的最大值。'''\n因此,该文本无法保存。",
        "readonlywarning": "警告:数据库被锁定以进行维护,所以您目前将无法保存您的修改。'''您或许希望将本段文字先剪贴并保存到文本文件,并在稍后进行修改。\n\n锁定数据库的管理员有如下解释:$1",
        "protectedpagewarning": "'''警告:本页面已被保护,只有拥有管理员权限的用户可以编辑。'''下面提供最后的日志条目以供参考:",
        "semiprotectedpagewarning": "'''注意:'''本页面已被保护,只有注册用户可以编辑。下面提供最后的日志条目以供参考:",
-       "cascadeprotectedwarning": "<strong>警告:</strong>本页面已经被保护,只有拥有管理员权限的用户可以编辑,因为它被嵌入了以下启用级联保护的{{PLURAL:$1|页面}}:",
+       "cascadeprotectedwarning": "<strong>警告:</strong>本页面已经被保护,只有拥有管理员权限的用户可以编辑,因为它包含于以下启用连锁保护的{{PLURAL:$1|页面}}中:",
        "titleprotectedwarning": "'''警告:本页面已被保护,创建本页面需要[[Special:ListGroupRights|特定权限]]。'''下面提供最后的日志条目以供参考:",
        "templatesused": "该页面使用的{{PLURAL:$1|模板}}:",
        "templatesusedpreview": "本预览使用的{{PLURAL:$1|模板}}:",
        "parser-template-recursion-depth-warning": "模板递归深度越限($1)",
        "language-converter-depth-warning": "字词转换器深度越限($1)",
        "node-count-exceeded-category": "页面的节点数超出限制",
-       "node-count-exceeded-category-desc": "超出最高节点数的页面。",
-       "node-count-exceeded-warning": "页面超出了节点数",
+       "node-count-exceeded-category-desc": "页面超出最大节点数限制。",
+       "node-count-exceeded-warning": "页面超出节点数限制",
        "expansion-depth-exceeded-category": "扩展深度超出限制的页面",
-       "expansion-depth-exceeded-category-desc": "页面超出最大扩展深度。",
-       "expansion-depth-exceeded-warning": "页面超过了扩展深度",
+       "expansion-depth-exceeded-category-desc": "页面超出最大展开深度限制。",
+       "expansion-depth-exceeded-warning": "页面超出展开深度限制",
        "parser-unstrip-loop-warning": "检测到回圈",
        "parser-unstrip-recursion-limit": "递归超过限制 ($1)",
        "converter-manual-rule-error": "在手动语言转换规则中检测到错误",
        "searchall": "所有",
        "showingresults": "下面显示从第'''$2'''条结果开始的'''$1'''条结果。",
        "showingresultsinrange": "下面显示区间#<strong>$2</strong>至#<strong>$3</strong>的<strong>$1</strong>条结果。",
-       "showingresultsheader": "关于<strong>$4</strong>的{{PLURAL:$5|第<strong>$1</strong>条结果,共<strong>$3</strong>条结果|第<strong>$1 - $2</strong>条结果,共<strong>$3</strong>条结果}}",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>条结果中的<strong>$1</strong>条|<strong>$3</strong>条结果中的<strong>$1~$2</strong>条}}",
        "search-nonefound": "找不到和查询相匹配的结果。",
        "powersearch-legend": "高级搜索",
        "powersearch-ns": "搜索名字空间:",
        "powersearch-togglelabel": "选择:",
        "powersearch-toggleall": "全选",
        "powersearch-togglenone": "全不选",
-       "powersearch-remember": "记住选择用于以后搜索",
+       "powersearch-remember": "记住选择用于以后搜索",
        "search-external": "外部搜索",
        "searchdisabled": "{{SITENAME}}的搜索已被禁用。您可以暂时使用搜索引擎进行搜索,须注意他们索引的{{SITENAME}}内容可能不是最新的。",
        "search-error": "搜索时发生错误:$1",
        "prefs-tokenwatchlist": "密钥",
        "prefs-diffs": "差异对比",
        "prefs-help-prefershttps": "该设置将在下次登录时生效。",
+       "prefswarning-warning": "您对您的参数设置的更改尚未保存。如果您不点击“$1”就离开,您的设置就不会更新。",
        "prefs-tabs-navigation-hint": "提示:您可以通过左、右箭头键在选项卡之间切换。",
        "email-address-validity-valid": "电子邮件地址有效",
        "email-address-validity-invalid": "请输入有效的电子邮件地址",
        "watchthisupload": "监视这个文件",
        "filewasdeleted": "之前已经有一个同名文件被上传后又被删除了。在上传此文件之前您需要检查$1。",
        "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-success-msg": "您在[$2]的上传已经成功,可以在这里找到:[[:{{ns:file}}:$1]]",
        "upload-failure-subj": "上传问题",
        "shared-repo-from": "来自$1",
        "shared-repo": "一个共享文件库",
        "shared-repo-name-wikimediacommons": "维基共享资源",
+       "filepage.css": "/* 放置于此的CSS会包含在文件描述页上,并包含在其他客户端wiki上 */",
        "upload-disallowed-here": "您不可以覆盖此文件。",
        "filerevert": "恢复$1",
        "filerevert-legend": "恢复文件",
        "randomincategory": "分类中随机页面",
        "randomincategory-invalidcategory": "“$1”不是一个有效的分类名称。",
        "randomincategory-nopages": "[[:Category:$1]]中没有页面。",
-       "randomincategory-selectcategory": "获取随机页面从分类:$1 $2。",
-       "randomincategory-selectcategory-submit": "提交",
+       "randomincategory-category": "分类:",
+       "randomincategory-legend": "分内中随机页面",
        "randomredirect": "随机重定向",
        "randomredirect-nopages": "“$1”名字空间中没有重定向。",
        "statistics": "统计",
        "booksources": "网络书源",
        "booksources-search-legend": "搜索图书来源",
        "booksources-isbn": "ISBN:",
-       "booksources-go": "提交",
+       "booksources-search": "搜索",
        "booksources-text": "下面是销售新书和二手书的其他网站的链接的列表,也可能有关于你正在寻找的图书的更多信息:",
        "booksources-invalid-isbn": "提供的ISBN号码并不正确,请检查原始复制来源号码是否有误。",
        "specialloguserlabel": "执行者:",
        "listusers-blocked": "(已封禁)",
        "activeusers": "活跃用户列表",
        "activeusers-intro": "这是在过去$1{{PLURAL:$1|天}}有过某种活动的用户的列表。",
-       "activeusers-count": "最近$3天内有$1次编辑",
+       "activeusers-count": "过去{{PLURAL:$3|$3天}}有$1个{{PLURAL:$1|操作}}",
        "activeusers-from": "显示用户开始于:",
        "activeusers-hidebots": "隐藏机器人",
        "activeusers-hidesysops": "隐藏管理员",
        "listgrouprights-namespaceprotection-namespace": "名字空间",
        "listgrouprights-namespaceprotection-restrictedto": "允许用户编辑的权限",
        "trackingcategories": "追踪分类",
-       "trackingcategories-summary": "æ\9c¬é¡µé\9d¢å\88\97举ç\94±MediaWiki软件è\87ªå\8a¨æ·»å\8a ç\9a\84è·\9f踪分类。它们的名字可通过修改{{ns:8}}名字空间对应的系统信息而变更。",
+       "trackingcategories-summary": "æ\9c¬é¡µé\9d¢å\88\97举ç\94±MediaWiki软件è\87ªå\8a¨æ·»å\8a ç\9a\84追踪分类。它们的名字可通过修改{{ns:8}}名字空间对应的系统信息而变更。",
        "trackingcategories-msg": "追踪分类",
        "trackingcategories-name": "信息名",
        "trackingcategories-desc": "分类收录标准",
-       "noindex-category-desc": "页面中有<code><nowiki>__NOINDEX__</nowiki></code>魔术字(并且在标记允许的名字空间)且因此未被机器人索引的。",
-       "index-category-desc": "页é\9d¢ä¸­æ\9c\89<code><nowiki>__INDEX__</nowiki></code>é­\94æ\9c¯å­\97ï¼\88并ä¸\94å\9c¨æ \87è®°å\85\81许ç\9a\84å\90\8då­\97空é\97´ï¼\89ä¸\94å\9b æ­¤è¢«æ\9cºå\99¨äººç´¢å¼\95ä½\86æ\9c¬ä¸\8dåº\94ç´¢å¼\95ç\9a\84。",
-       "post-expand-template-inclusion-category-desc": "在展开了所有模板后,页面大小大于<code>$wgMaxArticleSize</code>,所以一些模板未展开。",
-       "post-expand-template-argument-category-desc": "å±\95å¼\80äº\86模æ\9d¿å\8f\82æ\95°ï¼\88ä¸\89对è\8a±æ\8b¬å\8f·å\86\85ï¼\8cä¾\8bå¦\82<code>{{{Foo}}}</code>ï¼\89ä¹\8b后,页面大于<code>$wgMaxArticleSize</code>。",
-       "expensive-parserfunction-category-desc": "页面包含了太多的高级解析器函数(例如<code>#ifexist</code>)。参见[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
-       "broken-file-category-desc": "页é\9d¢å\8c\85å\90«æ\8d\9få\9d\8fç\9a\84æ\96\87件è¿\9eæ\8e¥ï¼\88è¿\9eæ\8e¥è\87³åµ\8cå\85¥ç\9a\84ä¸\80个ä¸\8då­\98å\9c¨æ\96\87件)。",
-       "hidden-category-category-desc": "页面中包含<code><nowiki>__HIDDENCAT__</nowiki></code>的分类,它阻止分类默认在页面上的分类链接框中显示。",
+       "noindex-category-desc": "因为页面上有魔术字<code><nowiki>__NOINDEX__</nowiki></code>并位于允许该标记的名字空间,而不被网络爬虫索引的页面。",
+       "index-category-desc": "页é\9d¢ä¸\8aæ\9c\89é­\94æ\9c¯å­\97<code><nowiki>__INDEX__</nowiki></code>ï¼\88并ä½\8däº\8eå\85\81许该æ \87è®°ç\9a\84å\90\8då­\97空é\97´ï¼\89ï¼\8c并å\9b æ­¤è¢«ç½\91ç»\9cç\88¬è\99«ç´¢å¼\95ï¼\88è¿\99äº\9b页é\9d¢é\80\9a常ä¸\8dä¼\9a被索å¼\95ï¼\89。",
+       "post-expand-template-inclusion-category-desc": "在展开所有模板后,页面大小大于<code>$wgMaxArticleSize</code>,所以某些模板未展开。",
+       "post-expand-template-argument-category-desc": "å\9c¨å±\95å¼\80模æ\9d¿å\8f\82æ\95°ï¼\88以ä¸\89对è\8a±æ\8b¬å\8f·å\8c\85å\90«ç\9a\84ä¸\9c西ï¼\8cå¦\82<code>{{{Foo}}}</code>ï¼\89后,页面大于<code>$wgMaxArticleSize</code>。",
+       "expensive-parserfunction-category-desc": "页面使用过多高开销解析器函数(如<code>#ifexist</code>)。请见[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit MediaWiki官网手册]。",
+       "broken-file-category-desc": "页é\9d¢å\90«æ\9c\89å\8f\97æ\8d\9fæ\96\87件é\93¾æ\8e¥ï¼\88æ\96\87件ä¸\8då­\98å\9c¨æ\97¶ç\9a\84åµ\8cå\85¥æ\96\87件é\93¾æ\8e¥)。",
+       "hidden-category-category-desc": "分类的页面内容中含有<code><nowiki>__HIDDENCAT__</nowiki></code>,它会阻止分类默认在页面的分类链接框中显示。",
        "trackingcategories-nodesc": "没有说明。",
        "trackingcategories-disabled": "分类被禁用",
        "mailnologin": "无电子邮件地址",
        "wlheader-enotif": "已启用电子邮件通知。",
        "wlheader-showupdated": "您上次访问后发生更改的页面'''加粗'''显示",
        "wlnote": "下面是{{PLURAL:$2|过去<strong>$2</strong>小时}}的{{PLURAL:$1|最后<strong>$1</strong>个更改}},截至$3 $4。",
-       "wlshowlast": "显示过去$1小时$2天$3",
+       "wlshowlast": "显示过去$1小时$2天",
        "watchlist-options": "监视列表选项",
        "watching": "正在监视...",
        "unwatching": "正在取消监视...",
        "exbeforeblank": "被清空前的内容为:“$1”",
        "delete-confirm": "删除“$1”",
        "delete-legend": "删除",
-       "historywarning": "警告:您将要删除的页面有约$1个{{PLURAL:$1|版本}}的历史:",
+       "historywarning": "<strong>警告</strong>:您将要删除的页面有约$1次修订的历史:",
        "confirmdeletetext": "您即将删除一个页面或图像以及其历史。\n请确定您要进行此项操作,并且了解其后果,同时您的行为符合[[{{MediaWiki:Policy-url}}]]。",
        "actioncomplete": "操作完成",
        "actionfailed": "操作失败",
        "delete-edit-reasonlist": "编辑删除原因",
        "delete-toobig": "这个页面有一个十分大量的编辑历史,超过$1个版本。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。",
        "delete-warning-toobig": "这个页面有一个十分大量的编辑历史,超过$1个版本。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。",
-       "delete-cantedit": "您不能删除此页面,因为您没有权限编辑它。",
+       "deleteprotected": "您不能删除此页面因为它被保护。",
        "deleting-backlinks-warning": "'''警告:'''有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他页面]]链接至或包含您要删除的页面。",
        "rollback": "回退编辑",
        "rollback_short": "回退",
        "protect-othertime": "其它时间:",
        "protect-othertime-op": "其它时间",
        "protect-existing-expiry": "现有的终止时间:$2 $3",
+       "protect-existing-expiry-infinity": "当前到期时间:无限期",
        "protect-otherreason": "其他/附加原因:",
        "protect-otherreason-op": "其他原因",
        "protect-dropdown": "*常见保护原因\n** 过度破坏\n** 过多垃圾信息\n** 负面的编辑战\n** 高流量页面",
        "unblocked": "[[User:$1|$1]]已经被解封",
        "unblocked-range": "$1已被解封",
        "unblocked-id": "封禁$1已被解除",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]]已解封。",
        "blocklist": "被封禁用户",
        "ipblocklist": "被封禁用户",
        "ipblocklist-legend": "查找被封禁用户",
        "thumbnail-more": "放大",
        "filemissing": "无法找到文件",
        "thumbnail_error": "生成缩略图出错:$1",
-       "thumbnail_error_remote": "来自$1的错误消息从:\n$2",
+       "thumbnail_error_remote": "来自$1的错误消息$2",
        "djvu_page_error": "DjVu页面超出范围",
        "djvu_no_xml": "无法在DjVu文件中获取XML",
        "thumbnail-temp-create": "无法创建临时缩略图文件",
        "import": "导入页面",
        "importinterwiki": "跨wiki导入",
        "import-interwiki-text": "选择要导入的wiki和页面标题,导入版本的日期和编辑者名称会被保存。所有的跨wiki导入操作都将记录到[[Special:Log/import|导入日志]]。",
-       "import-interwiki-source": "来源wiki/页面:",
+       "import-interwiki-sourcewiki": "来源wiki:",
+       "import-interwiki-sourcepage": "来源页面:",
        "import-interwiki-history": "复制此页的所有历史版本",
        "import-interwiki-templates": "包含所有模板",
        "import-interwiki-submit": "导入",
        "import-interwiki-namespace": "目标名字空间:",
-       "import-interwiki-rootpage": "目的根页(可选):",
+       "import-interwiki-rootpage": "目标根页面(可选):",
        "import-upload-filename": "文件名:",
        "import-comment": "注释:",
        "importtext": "请使用[[Special:Export|导出功能]]从源 wiki 导出文件,\n保存到您的电脑并上传到这里。",
        "importlogpage": "导入日志",
        "importlogpagetext": "管理性导入在其他wiki上有编辑历史的页面。",
        "import-logentry-upload": "通过文件上传导入[[$1]]",
-       "import-logentry-upload-detail": "已导å\85¥$1个{{PLURAL:$1|ç\89\88æ\9c¬}}",
-       "import-logentry-interwiki": "跨wiki页面$1",
-       "import-logentry-interwiki-detail": "已从$2导入$1个{{PLURAL:$1|版本}}",
+       "import-logentry-upload-detail": "导入$1个{{PLURAL:$1|版本}}",
+       "import-logentry-interwiki": "跨wiki导入页面$1",
+       "import-logentry-interwiki-detail": "来自$2的$1个{{PLURAL:$1|版本}}已导入",
        "javascripttest": "JavaScript测试",
        "javascripttest-title": "运行$1测试",
        "javascripttest-pagetext-noframework": "本页面被保留进行JavaScript测试。",
        "print.css": "/* 放置于这里的CSS将影响打印输出 */",
        "noscript.css": "/* 放置于这里的CSS将影响停用JavaScript的用户 */",
        "group-autoconfirmed.css": "/* 放置于这里的CSS将只影响自动确认用户 */",
-       "group-user.css": "/* 放置于此的CSS将只影响注册用户 */",
+       "group-user.css": "/* 放置于此的CSS将只影响注册用户 */",
        "group-bot.css": "/* 放置于这里的CSS将只影响机器人 */",
        "group-sysop.css": "/* 放置于这里的CSS将只影响管理员 */",
        "group-bureaucrat.css": "/* 放置于这里的CSS将只影响行政员 */",
        "exif-urgency-low": "低($1)",
        "exif-urgency-high": "高($1)",
        "exif-urgency-other": "用户定义的优先级($1)",
-       "watchlistall2": "所有",
        "namespacesall": "所有",
        "monthsall": "所有",
        "confirmemail": "确认电子邮件地址",
        "logentry-rights-rights": "$1{{GENDER:$2|更改}}$3的用户组自$4至$5",
        "logentry-rights-rights-legacy": "$1更改$3的用户组",
        "logentry-rights-autopromote": "$1被自动地{{GENDER:$2|提升}}自$4至$5",
-       "logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
-       "logentry-upload-overwrite": "$1{{GENDER:$2|上传}}$3的新版本",
-       "logentry-upload-revert": "$1{{GENDER:$2|上传}}$3",
+       "logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
+       "logentry-upload-overwrite": "$1{{GENDER:$2|上传}}$3的新版本",
+       "logentry-upload-revert": "$1{{GENDER:$2|上传}}$3",
        "rightsnone": "(无)",
+       "revdelete-summary": "编辑摘要",
        "feedback-bugornote": "如果你准备好详细描述一个技术问题,请[$1 报告bug]。或者你可以使用下面的简单表格。你的评论将被添加至页面“[$3 $2]”,附有你的用户名。",
        "feedback-subject": "主题:",
        "feedback-message": "信息:",
        "expand_templates_intro": "此特殊页面可以递归地展开所给文本中的模板。\n它同时还可展开诸如<nowiki>{{</nowiki>#language:...}}的解析器函数和诸如<nowiki>{{</nowiki>CURRENTDAY}}的变量。\n实际上,几乎所有在双重花括号中的内容都会被展开。",
        "expand_templates_title": "上下文标题,用于{{FULLPAGENAME}}等:",
        "expand_templates_input": "输入文本:",
-       "expand_templates_output": "结果",
+       "expand_templates_output": "结果",
        "expand_templates_xml_output": "XML输出",
        "expand_templates_html_output": "原始HTML输出",
        "expand_templates_ok": "确定",
        "log-name-pagelang": "更改语言日志",
        "log-description-pagelang": "这是页面语言更改的日志。",
        "logentry-pagelang-pagelang": "$1{{GENDER:$2|更改}}$3的页面语言:从$4改为$5。",
-       "default-skin-not-found": "天哪!您wiki的默认皮肤(<code>$wgDefaultSkin</code>)<code>$1</code>不可用。您的安装版本看起来需要包含以下皮肤。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Manual:Skin_configuration “皮肤配置”]获取如何启用他们并设置为默认。\n\n$2\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的。希望如此。尝试通过以下方法从[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴<code>skins/</code>。\n:* 通过git直接克隆<code>mediawiki/skins/*</code>存储库中的一个至您的MediaWiki副本的<code>skins/</code>。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。\n\n; 如果您升级了您的MediaWiki的话:\n: MediaWiki 1.24版本起不再自动启用已安装皮肤(参见[https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 此手册])。您可复制粘贴以下文本至您wiki的<code>LocalSettings.php</code>以启用安装的皮肤:\n\n<pre>$3</pre>\n\n; 如果您已经修改了<code>LocalSettings.php</code>:\n: 请再次检查皮肤名以确保不存在错误拼写。",
-       "default-skin-not-found-no-skins": "天哪!您wiki的默认皮肤(<code>$wgDefaultSkin</code>)<code>$1</code>不可用。而且您没有安装任何皮肤。\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的。希望如此。尝试通过以下方法从[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴<code>skins/</code>。\n:* 通过git直接克隆<code>mediawiki/skins/*</code>存储库中的一个至您的MediaWiki副本的<code>skins/</code>。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Manual:Skin_configuration “皮肤配置”]获取如何启用他们并设置为默认。",
+       "default-skin-not-found": "天哪!您在<code dir=\"ltr\">$wgDefaultSkin</code>定义的wiki默认皮肤<code>$1</code>不可用。您的安装版本看起来需要包含以下皮肤。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Manual:Skin_configuration “皮肤配置”]获取如何启用他们并设置为默认。\n\n$2\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的。希望如此。尝试通过以下方法从[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴<code>skins/</code>。\n:* 通过git直接克隆<code>mediawiki/skins/*</code>存储库中的一个至您的MediaWiki副本的<code dir=\"ltr\">skins/</code>。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。\n\n; 如果您升级了您的MediaWiki的话:\n: MediaWiki 1.24版本起不再自动启用已安装皮肤(参见[https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 此手册])。您可复制粘贴以下文本至您wiki的<code>LocalSettings.php</code>以启用安装的皮肤:\n\n<pre dir=\"ltr\">$3</pre>\n\n; 如果您已经修改了<code>LocalSettings.php</code>:\n: 请再次检查皮肤名以确保不存在错误拼写。",
+       "default-skin-not-found-no-skins": "天哪!您在<code>$wgDefaultSkin</code>定义的wiki默认皮肤<code>$1</code>不可用。而且您没有安装任何皮肤。\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的,希望如此。这是因为MediaWiki 1.24版本起主代码库不再包含任何皮肤。尝试通过以下方法从[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴<code>skins/</code>。\n:* 通过git直接克隆<code>mediawiki/skins/*</code>存储库中的一个至您的MediaWiki副本的<code dir=\"ltr\">skins/</code>。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration “皮肤配置”]获取如何启用他们并设置为默认。",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2(已启用)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2('''已禁用''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2('''已禁用''')",
+       "mediastatistics": "媒体统计",
+       "mediastatistics-summary": "有关上传文件类型的统计。这只包含文件的最新版本,旧版本或删除版本则不会包括。",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1字节}}($2;$3%)",
+       "mediastatistics-table-mimetype": "MIME类型",
+       "mediastatistics-table-extensions": "可用扩展名",
+       "mediastatistics-table-count": "文件数",
+       "mediastatistics-table-totalbytes": "组合尺寸",
+       "mediastatistics-header-unknown": "未知",
+       "mediastatistics-header-bitmap": "位图图像",
+       "mediastatistics-header-drawing": "图纸(矢量图像)",
+       "mediastatistics-header-audio": "音频",
+       "mediastatistics-header-video": "视频",
+       "mediastatistics-header-multimedia": "富媒体",
+       "mediastatistics-header-office": "办公文件",
+       "mediastatistics-header-text": "文本",
+       "mediastatistics-header-executable": "可执行文件",
+       "mediastatistics-header-archive": "压缩格式",
+       "json-warn-trailing-comma": "$1个结尾逗号从JSON移除",
+       "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": "给出了不能编码的类型的值"
 }
index a6dc8d9..0fc3378 100644 (file)
                        "Impersonator 1",
                        "LNDDYL",
                        "Cathypilot0117",
-                       "NigelSoft"
+                       "NigelSoft",
+                       "EagerLin"
                ]
        },
-       "tog-underline": "連結底線:",
-       "tog-hideminor": "隱藏最近變更中的小修訂",
-       "tog-hidepatrolled": "隱藏最近更改中巡查過的編輯",
+       "tog-underline": "連結顯示底線:",
+       "tog-hideminor": "隱藏近期變更以來的小編輯",
+       "tog-hidepatrolled": "隱藏近期變更中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
        "tog-extendwatchlist": "展開監視清單顯示包含最近以外的所有變更",
-       "tog-usenewrc": "依最近變更與監視清單頁面分類顯示變更",
+       "tog-usenewrc": "依近期變更與監視清單頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示編輯工具列",
-       "tog-editondblclick": "啟用滑鼠雙擊編輯頁面",
+       "tog-editondblclick": "開啟滑鼠雙擊編輯頁面",
        "tog-editsectiononrightclick": "開啟滑鼠右鍵點選章節標題編輯",
        "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視清單",
        "tog-watchdefault": "將我編輯的頁面和檔案新增至監視清單",
@@ -94,7 +95,7 @@
        "tog-watchlisthideanons": "隱藏監視清單中匿名使用者的編輯",
        "tog-watchlisthidepatrolled": "隱藏監視清單中已巡查的編輯",
        "tog-ccmeonemails": "傳送郵件給他人時,也送一份副本到我的電子郵件信箱",
-       "tog-diffonly": "比對版本差異時下面不顯示頁面內容",
+       "tog-diffonly": "比對差異時下方不顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏分類",
        "tog-norollbackdiff": "執行還原後略過差異比對",
        "tog-useeditwarning": "未儲存離開編輯頁面時警告我",
        "october-date": "十月 $1 日",
        "november-date": "十一月 $1 日",
        "december-date": "十二月 $1 日",
-       "pagecategories": "{{PLURAL:$1|分類|分類}}",
+       "pagecategories": "{{PLURAL:$1|分類|$1 個分類}}",
        "category_header": "分類 \"$1\" 中的頁面",
        "subcategories": "子分類",
        "category-media-header": "分類 \"$1\" 中的媒體",
        "listingcontinuesabbrev": "續",
        "index-category": "已列索引的頁面",
        "noindex-category": "未列索引的頁面",
-       "broken-file-category": "含有損壞檔案連結的頁面",
+       "broken-file-category": "檔案連結損壞的頁面",
        "about": "關於",
        "article": "內容頁面",
        "newwindow": "(以新視窗開啟)",
        "otherlanguages": "其他語言",
        "redirectedfrom": "(已重新導向自 $1)",
        "redirectpagesub": "重新導向頁面",
+       "redirectto": "重新導向至:",
        "lastmodifiedat": "此頁面最後修訂於 $1 $2。",
        "viewcount": "此頁面已被檢視過 $1 次。",
        "protectedpage": "受保護頁面",
        "aboutpage": "Project:About",
        "copyright": "除非額外說明,否則本站內容均使用 $1 授權條款。",
        "copyrightpage": "{{ns:project}}:Copyrights",
-       "currentevents": "最新事件",
+       "currentevents": "最新動態",
        "currentevents-url": "Project:Current events",
        "disclaimers": "免責聲明",
        "disclaimerpage": "Project:General disclaimer",
        "edithelp": "編輯説明",
-       "mainpage": "頁",
-       "mainpage-description": "頁",
+       "mainpage": "頁",
+       "mainpage-description": "頁",
        "policy-url": "Project:Policy",
        "portal": "社群入口",
        "portal-url": "Project:Community portal",
        "viewdeleted": "檢視 $1?",
        "restorelink": "$1 個已刪除的編輯",
        "feedlinks": "訂閱:",
-       "feed-invalid": "無效的訂閱類型。",
+       "feed-invalid": "無效的訂閱 Feed 類型。",
        "feed-unavailable": "目前未提供 RSS 或 Atom",
        "site-rss-feed": "$1 的 RSS feed",
        "site-atom-feed": "$1 的 Atom feed",
        "readonly": "資料庫已鎖定",
        "enterlockreason": "請輸入鎖定的原因,包括估計重新開放的時間",
        "readonlytext": "資料庫目前已鎖定無法新增或修改資料,\n可能正在進行例行的資料庫維修作業,完成之後即可恢復正常。\n\n鎖定資料庫的管理員說明:$1",
-       "missing-article": "資料庫查無預期的頁面文字,頁面 \"$1\" $2。\n\n通常是因您連結到了已過期(已被刪除)的差異或歷史頁面。\n\n若這不是您所遇到的情況,您可能找到了一個系統的問題。\n請記錄 URL 位址,並向 [[Special:ListUsers/sysop|管理員]] 報告此問題。",
+       "missing-article": "資料庫查無預期的頁面文字,名稱為 \"$1\" $2。\n\n通常是因您連結到了已被刪除的差異或歷史頁面。\n\n若您所遇到的不是這個情況,您可能是發現軟體問題。\n請記錄 URL 位址,並向 [[Special:ListUsers/sysop|管理員]] 回報此問題。",
        "missingarticle-rev": "(修訂#:$1)",
        "missingarticle-diff": "(差異:$1, $2)",
        "readonly_lag": "資料庫已自動鎖定,正在等候次要資料庫同步資料到主要資料庫",
        "throttled-mailpassword": "密碼重設的電子郵件已經在最近 $1 小時內寄出。\n為防止濫用,$1 小時內只能寄出一次密碼重設信件。",
        "mailerror": "傳送電子郵件錯誤:$1",
        "acct_creation_throttle_hit": "使用您目前的 IP 位址的訪客在最近一天建立了 {{PLURAL:$1|1 個帳號|$1 個帳號}},已超出系統允許的上限。\n因此,目前無法讓使用此 IP 位址的訪客建立帳號。",
-       "emailauthenticated": "您的電子郵件位址已確認於 $2 的 $3。",
+       "emailauthenticated": "您的電子郵件位址已於 $2 $3 確認。",
        "emailnotauthenticated": "您的電子郵件位址尚未確認,\n尚不會寄出以下功能的電子郵件給您。",
        "noemailprefs": "在您的偏好設定中設定電子郵件位址,讓您可以使用這些功能。",
        "emailconfirmlink": "確認您的電子郵件位址",
        "createaccount-text": "不明人士使用您的電子郵件位址在 {{SITENAME}} ($4) 建立了一個帳號名稱為 \"$2\",密碼為 \"$3\"。\n您應該立即登入並更改密碼。\n\n如果該帳號是建立錯誤的話,您可以忽略此訊息。",
        "login-throttled": "您已經嘗試太多次的登入動作。\n請稍等 $1 後再試。",
        "login-abort-generic": "您登入失敗 - 已中止",
+       "login-migrated-generic": "您的帳號已轉移,且此 Wiki 中您的使用者名稱已不存在。",
        "loginlanguagelabel": "語言:$1",
        "suspicious-userlogout": "您登出的請求被拒絕,可能是因您使用了有問題的瀏覽器或者快取代理伺服器。",
        "createacct-another-realname-tip": "真實姓名為選填欄位。\n若您提供真實姓名,它會用於使用者貢獻署名。",
        "pt-userlogout": "登出",
        "php-mail-error-unknown": "PHP 的 mail() 函數發生不明錯誤。",
        "user-mail-no-addy": "試圖傳送沒有電子郵件位址的信件。",
-       "user-mail-no-body": "試圖寄出一個空的或異常簡短的電子郵件。",
+       "user-mail-no-body": "試圖寄出內容為空的或異常簡短的電子郵件。",
        "changepassword": "變更密碼",
        "resetpass_announce": "要完成登入,您必須設定一個新密碼。",
        "resetpass_text": "<!-- 在此處加入文字 -->",
        "passwordreset-emailtext-user": "使用者 $1 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件位址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailelement": "使用者名稱:$1\n臨時密碼:$2",
        "passwordreset-emailsent": "已寄出重設密碼的電子郵件。",
-       "passwordreset-emailsent-capture": "已寄出重設密碼的電子郵件,並在下面顯示。",
-       "passwordreset-emailerror-capture": "產生的重設密碼的電子郵件如下所示,但傳送給{{GENDER:$2|使用者}}失敗:$1",
+       "passwordreset-emailsent-capture": "已寄出重設密碼的電子郵件,並於下方顯示。",
+       "passwordreset-emailerror-capture": "下列為重設密碼的電子郵件內容,傳送給{{GENDER:$2|使用者}}失敗:$1",
        "changeemail": "變更電子郵件位址",
-       "changeemail-header": "變更帳號的電子郵件位址",
-       "changeemail-text": "填寫表格以修改您的電子郵件位址。您需要輸入密碼以確認此次變更。",
+       "changeemail-text": "完成此表單以修改您的電子郵件位址,您需要輸入您的密碼來確認此次變更。",
        "changeemail-no-info": "您必須登入方可直接存取此頁面。",
        "changeemail-oldemail": "目前的電子郵件位址:",
        "changeemail-newemail": "新的電子郵件位址:",
        "changeemail-none": "(無)",
        "changeemail-password": "您於 {{SITENAME}} 的密碼:",
        "changeemail-submit": "變更電子郵件",
-       "changeemail-cancel": "取消",
        "changeemail-throttled": "您最近嘗試了太多次登入。\n請等待 $1 後再試。",
        "resettokens": "重設密鑰",
        "resettokens-text": "您可以在此重設用來存取您帳號相關隱私資料的密鑰。\n\n若您不小心將您的密鑰分享給其他人或您的帳號已遭到入侵、破壞,應該要重設此密鑰。",
        "headline_tip": "第 2 層標題文字",
        "nowiki_sample": "插入非格式化文字",
        "nowiki_tip": "忽略 Wiki 格式化語法",
+       "image_sample": "範例.jpg",
        "image_tip": "附加檔案",
        "media_tip": "檔案連結",
        "sig_tip": "您的簽名與日期時間",
        "showpreview": "顯示預覽",
        "showdiff": "顯示變更",
        "blankarticle": "<strong>警告:</strong>您正在建立的頁面是空白的。\n如果您再按一下\"{{int:savearticle}}\",將建立沒有任何內容的頁面。",
-       "anoneditwarning": "<strong>警告:</strong>您尚未登入。\n您的 IP 位址將記錄在此頁的編輯歷史中。",
+       "anoneditwarning": "<strong>警告:</strong>您尚未登入。 若您進行任何的編輯您的 IP 位置將會被公開。 若您 <strong>[$1 登入]</strong> 或 <strong>[$2 建立帳號]</strong>,您的編輯將會以您的使用者名稱標示,擁有其他優點。",
        "anonpreviewwarning": "<em>您尚未登入。儲存頁面會將您的 IP 位址記錄在此頁面的編輯歷史中。</em>",
        "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
        "missingcommenttext": "請在下方輸入評論。",
        "userpage-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。\n若您要建立/編輯此頁面,請先檢查是否正確。",
        "userpage-userdoesnotexist-view": "使用者帳號 \"$1\" 尚未註冊。",
        "blocked-notice-logextract": "此使用者目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
-       "clearyourcache": "<strong>注意:</strong> 在您儲存之後您必須清除瀏覽器快取才可看到最新的變動。\n* <strong>Firefox / Safari:</strong> 按住 <em>Shift</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em> 或 <em>Ctrl-R</em> (Mac 為 <em>⌘-R</em>)\n* <strong>Google Chrome:</strong> 按 <em>Ctrl-Shift-R</em> (Mac 為 <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong> 按住 <em>Ctrl</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em>\n* <strong>Opera:</strong> 進入 <em>工具 → 偏好設定</em> 中清除快取。",
+       "clearyourcache": "<strong>注意:</strong>在您儲存之後您必須清除瀏覽器快取才可看到最新的變動。\n* <strong>Firefox / Safari:</strong>按住 <em>Shift</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em> 或 <em>Ctrl-R</em> (Mac 則為 <em>⌘-R</em>) \n* <strong>Google Chrome:</strong>按 <em>Ctrl-Shift-R</em> (Mac 則為 <em>⌘-Shift-R</em>) \n* <strong>Internet Explorer:</strong>按住 <em>Ctrl</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em>\n* <strong>Opera:</strong>進入 <em>工具 → 偏好設定</em> 中清除快取。",
        "usercssyoucanpreview": "<strong>提示:</strong>在儲存之前使用 \"{{int:showpreview}}\" 按鈕來測試您的新 CSS。",
        "userjsyoucanpreview": "<strong>提示:</strong>在儲存之前使用 \"{{int:showpreview}}\" 按鈕來測試您的新 JavaScript。",
        "usercsspreview": "<strong>您目前正預覽您的使用者 CSS,CSS 還尚未儲存!</strong>",
        "sitejspreview": "<strong>您目前正預覽此 JavaScript,JavaScript 還尚未儲存!</strong>",
        "userinvalidcssjstitle": "<strong>警告:</strong> 無此外觀樣式 \"$1\"。\n自訂的 .css 和 .js 頁面要使用小寫標題,例如:{{ns:user}}:Foo/vector.css 與 {{ns:user}}:Foo/Vector.css 是不同的。",
        "updated": "(已更新)",
-       "note": "</strong>注意:</strong>",
+       "note": "<strong>注意:</strong>",
        "previewnote": "<strong>您目前正在預覽,您的變更還尚未儲存!</strong>",
        "continue-editing": "前往編輯框",
        "previewconflict": "此預覽顯示了您於上方文字編輯框中的內容儲存之後將會顯示的結果。",
        "postedit-confirmation-saved": "您的編輯已儲存。",
        "edit-already-exists": "無法建立新頁面。\n該頁面已存在。",
        "defaultmessagetext": "預設訊息文字",
-       "content-failed-to-parse": "析 $2 格式的 $1 語法內容失敗:$3",
+       "content-failed-to-parse": "析 $2 格式的 $1 語法內容失敗:$3",
        "invalid-content-data": "內容資料無效",
        "content-not-allowed-here": "頁面 [[$2]] 不允許使用 \"$1\" 語法內容",
        "editwarning-warning": "離開此頁面可能會令您遺失之前所作的所有更改。\n若您已經登入,您可在偏好設定的 \"{{int:prefs-editing}}\" 項目關閉此警告。",
        "content-model-text": "純文字",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "<strong>警告:</strong>此頁面使用了太多消耗系統資源的析函數。\n\n使用次數應小於 $2 次,但目前使用了 $1 次。",
+       "expensive-parserfunction-warning": "<strong>警告:</strong>此頁面使用了太多消耗系統資源的析函數。\n\n使用次數應小於 $2 次,但目前使用了 $1 次。",
        "expensive-parserfunction-category": "使用了太多消耗系統資源的分析函數的頁面",
        "post-expand-template-inclusion-warning": "<strong>警告:</strong>引用樣板後大小超出限制。\n部份樣版內容將不會被使用。",
        "post-expand-template-inclusion-category": "引用樣板後大小超出限制的頁面",
        "parser-template-recursion-depth-warning": "超出樣版遞迴深度限制 ($1)",
        "language-converter-depth-warning": "已超出語言轉換器深度限制 ($1)",
        "node-count-exceeded-category": "節點數量超出限制的頁面",
-       "node-count-exceeded-category-desc": "這個頁面超出最大節點數",
+       "node-count-exceeded-category-desc": "超出節點數量限制的頁面。",
        "node-count-exceeded-warning": "頁面超出節點數量限制",
        "expansion-depth-exceeded-category": "展開深度超出限制的頁面",
-       "expansion-depth-exceeded-category-desc": "頁面超出顯示範圍",
+       "expansion-depth-exceeded-category-desc": "超出展開深度限制的頁面。",
        "expansion-depth-exceeded-warning": "頁面超出展開深度限制",
        "parser-unstrip-loop-warning": "偵測到 Unstrip 迴圈",
        "parser-unstrip-recursion-limit": "Unstrip 遞迴超出限制 ($1)",
        "revdelete-text-text": "已刪除的修訂仍會出現於頁面歷史中,但內容將不開放存取。",
        "revdelete-text-file": "已刪除的檔案版本仍會出現於檔案歷史中,但內容將不開放存取。",
        "logdelete-text": "已刪除的日誌活動仍會出現於日誌中,但內容將不開放存取。",
-       "revdelete-text-others": "其他管理員仍有權限檢視隱藏的內容,且能夠取消刪除,除非有額外的設定限制。",
+       "revdelete-text-others": "若未有額外的設定限制,其他管理員仍有權限檢視與取消刪除隱藏的內容。",
        "revdelete-confirm": "請確認您是否明白此動作會造成的後果,\n以及您所做的動作是否符合 [[{{MediaWiki:Policy-url}}|政策]] 規範。",
        "revdelete-suppress-text": "禁制顯示應<strong>只有</strong>在下述情形時使用:\n* 潛在誹謗的資訊\n* 不合適個人資料\n*: <em>住家地址、電話號碼、身分證字號等。</em>",
        "revdelete-legend": "設定顯示限制",
        "mergehistory-submit": "合併修訂",
        "mergehistory-empty": "沒有可以合併的修訂",
        "mergehistory-success": "[[:$1]] 中 $3 次修訂已經成功地合併至 [[:$2]]。",
-       "mergehistory-fail": "不可以進行歷史合併,請重新檢查該頁面以及時間參數。",
+       "mergehistory-fail": "無法進行歷史合併,請重新檢查該頁面及時間參數。",
        "mergehistory-fail-toobig": "超過 $1 個修訂移動的上限,無法進行歷史合併。",
        "mergehistory-no-source": "來源頁面 $1 不存在。",
        "mergehistory-no-destination": "目標頁面 $1 不存在。",
        "showhideselectedversions": "更改已選擇修訂的顯示設定",
        "editundo": "還原",
        "diff-empty": "(無差異)",
-       "diff-multi-sameuser": "(未顯示相同使用者於中間所作的 $1 次修訂)",
+       "diff-multi-sameuser": "(未顯示同一使用者於中間所作的 $1 次修訂)",
        "diff-multi-otherusers": "(未顯示由 $2 位使用者於中間所作的 $1 次修訂)",
        "diff-multi-manyusers": "(未顯示由超過 $2 位使用者於中間所作的 $1 次修訂)",
        "difference-missing-revision": "查無此差異 ($1) 中的{{PLURAL:$2|1 次修訂|$2 次修訂}}。\n\n這通常是因為差異的連結過時,頁面已被刪除。\n詳情資訊請參閱 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "searchall": "全部",
        "showingresults": "以下顯示從第 <strong>$2</strong> 筆開始,共 {{PLURAL:$1|<strong>1</strong> 筆結果|<strong>$1</strong> 筆結果}}:",
        "showingresultsinrange": "以下顯示從第 <strong>$2</strong> 筆至第 <strong>$3</strong> 筆中的 {{PLURAL:$1|<strong>1</strong> 筆結果|<strong>$1</strong> 筆結果}}:",
-       "showingresultsheader": "<strong>$4</strong> 的 {{PLURAL:$5|第 <strong>$1</strong> 筆結果,共 <strong>$3</strong> 筆|第 <strong>$1 - $2</strong>,共 <strong>$3</strong> 筆}}",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> 的 <strong>$1</strong> 筆結果|<strong>$3</strong> 的 <strong>$1 - $2</strong> 筆結果}}",
        "search-nonefound": "無符合查詢條件的結果。",
        "powersearch-legend": "進階搜尋",
        "powersearch-ns": "搜尋以下命名空間:",
        "prefs-labs": "實驗中的功能",
        "prefs-user-pages": "使用者頁面",
        "prefs-personal": "使用者基本資料",
-       "prefs-rc": "最近變更",
+       "prefs-rc": "近期變更",
        "prefs-watchlist": "監視清單",
        "prefs-watchlist-days": "監視清單中顯示的天數:",
        "prefs-watchlist-days-max": "最多 $1 {{PLURAL:$1|天}}",
        "searchresultshead": "搜尋",
        "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面連結</a>格式門檻值 (位元組):",
        "stub-threshold-disabled": "已停用",
-       "recentchangesdays": "最近變更的顯示日數:",
+       "recentchangesdays": "近期變更的顯示天數:",
        "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "recentchangescount": "預設顯示的編輯數:",
-       "prefs-help-recentchangescount": "這包含最近變更、頁面歷史以及日誌。",
+       "prefs-help-recentchangescount": "這包含近期變更、頁面歷史以及日誌。",
        "prefs-help-watchlist-token2": "訂閱您的監視清單所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視清單,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
        "savedprefs": "已儲存您的偏好設定。",
        "timezonelegend": "時區:",
        "prefs-help-signature": "在對話頁面上評論時應使用 \"<nowiki>~~~~</nowiki>\" 簽名,\n該符號會轉換成您的簽名與時間。",
        "badsig": "錯誤的原始簽名。請檢查 HTML 標籤。",
        "badsiglength": "您的簽名過長。\n它的長度不可超過 $1 個字元。",
-       "yourgender": "您希望如何被描述?",
+       "yourgender": "您希望使用何種性別稱呼?",
        "gender-unknown": "我不想說明",
        "gender-male": "他編輯了 Wiki 頁面",
        "gender-female": "她編輯了 Wiki 頁面",
        "prefs-tokenwatchlist": "密鑰",
        "prefs-diffs": "差異",
        "prefs-help-prefershttps": "此偏好設定將於您下次登入時生效。",
+       "prefswarning-warning": "您對您的偏好設定所做的變更尚未儲存。\n若您未點選 \"$1\" 離開此頁面,將不會更新您的偏好設定。",
        "prefs-tabs-navigation-hint": "提示:您可使用左、右方向鍵切換頁籤。",
        "email-address-validity-valid": "電子郵件位址有效",
        "email-address-validity-invalid": "請輸入一個有效的電子郵件位址",
        "right-deletedtext": "檢視已刪除修訂中已刪除的文字及變更",
        "right-browsearchive": "搜尋已刪除的頁面",
        "right-undelete": "取消刪除頁面",
-       "right-suppressrevision": "檢視、隱藏與還原某使用者對頁面的特定修訂",
-       "right-viewsuppressed": "檢è¦\96æ\9f\90使ç\94¨è\80\85é\9a±è\97\8fç\9a\84修訂",
+       "right-suppressrevision": "檢視、隱藏與取消隱藏任何使用者對頁面的修訂",
+       "right-viewsuppressed": "檢è¦\96æ\89\80æ\9c\89使ç\94¨è\80\85ç\9a\84é\9a±è\97\8f修訂",
        "right-suppressionlog": "檢視非公開日誌",
        "right-block": "封鎖其他使用者的編輯權限",
-       "right-blockemail": "封鎖使用者傳送電子郵件的權限",
+       "right-blockemail": "封鎖使用者傳送電子郵件",
        "right-hideuser": "封鎖使用者名稱,避免公開顯示",
        "right-ipblock-exempt": "略過 IP 封鎖、自動封鎖及範圍封鎖檢查",
        "right-proxyunbannable": "略過 Proxy 自動封鎖檢查",
        "right-import": "由其他 Wiki 匯入頁面",
        "right-importupload": "由檔案上傳匯入頁面",
        "right-patrol": "標示其他人的編輯爲已巡查",
-       "right-autopatrol": "將自己的編輯自動標示為已巡查",
-       "right-patrolmarks": "檢視最近變更的巡查標記",
+       "right-autopatrol": "將自己的編輯自動標示為已巡查",
+       "right-patrolmarks": "檢視近期變更的巡查標記",
        "right-unwatchedpages": "檢視未監視的頁面",
        "right-mergehistory": "合併頁面歷史",
        "right-userrights": "編輯所有使用者的權限",
        "action-mergehistory": "合併此頁面的歷史",
        "action-userrights": "編輯所有使用者的權限",
        "action-userrights-interwiki": "編輯在其它 Wiki 上的使用者權限",
-       "action-siteadmin": "鎖定解除鎖定資料庫",
+       "action-siteadmin": "鎖定解除鎖定資料庫",
        "action-sendemail": "傳送電子郵件",
        "action-editmywatchlist": "編輯您的監視清單",
        "action-viewmywatchlist": "檢視您的監視清單",
        "nchanges": "$1 次變更",
        "enhancedrc-since-last-visit": "自上次訪問已有 $1",
        "enhancedrc-history": "歷史",
-       "recentchanges": "最近變更",
-       "recentchanges-legend": "最近變更選項",
-       "recentchanges-summary": "追蹤 Wiki 中此頁面的最近變更。",
+       "recentchanges": "近期變更",
+       "recentchanges-legend": "近期變更選項",
+       "recentchanges-summary": "追蹤 Wiki 中此頁面的近期變更。",
        "recentchanges-noresult": "於指定時間內沒有符合條件的變更。",
-       "recentchanges-feed-description": "追蹤此訂閱中該 Wiki 的最近變更。",
+       "recentchanges-feed-description": "追蹤此訂閱中該 Wiki 的近期變更。",
        "recentchanges-label-newpage": "該編輯建立新頁面",
        "recentchanges-label-minor": "該編輯是一個小修訂",
        "recentchanges-label-bot": "該編輯由機器人執行",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考 [[Special:NewPages|最新頁面]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
-       "rclistfrom": "顯示自 $3 $2 以來的最近變更",
+       "rclistfrom": "顯示自 $3 $2 以來的近期變更",
        "rcshowhideminor": "$1 小修訂",
        "rcshowhideminor-show": "顯示",
        "rcshowhideminor-hide": "隱藏",
        "recentchangeslinked": "相關變更",
        "recentchangeslinked-feed": "相關變更",
        "recentchangeslinked-toolbox": "相關變更",
-       "recentchangeslinked-title": "與 \"$1\" 相關變更",
+       "recentchangeslinked-title": "與 \"$1\" 相關變更",
        "recentchangeslinked-summary": "此頁面列出指定頁面連結到的所有頁面中 (或指定分類中的所有成員) 有做變更的頁面清單。\n有在 [[Special:Watchlist|您的監視清單]] 中的頁面會以 <strong>粗體</strong> 標示。",
        "recentchangeslinked-page": "頁面名稱:",
        "recentchangeslinked-to": "改顯示連結至指定頁面的變更",
        "upload_directory_read_only": "網頁伺服器沒有上傳目錄 ($1) 的寫入權限。",
        "uploaderror": "上傳錯誤",
        "upload-recreate-warning": "<strong>警告:曾有檔案使用此名稱已被刪除或者移動至它處。</strong>\n\n在此提供刪除與移動日誌方便作為參考:",
-       "uploadtext": "使用下面的表單來上傳檔案。\n要檢視或搜尋以前上傳的檔案,可至 [[Special:FileList|檔案上傳清單]],(重新)上傳會在 [[Special:Log/upload|上傳日誌]] 中記錄,而刪除則會在 [[Special:Log/delete|刪除日誌]] 中記錄。\n\n要在頁面中引用檔案,可使用以下其中一種方式連結:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> 顯示完整尺寸的圖片\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> 會在左方放置一張 200 像素寬的圖片於框中,並顯示 \"alt text\" 作為描述\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> 直接連結到圖片而不顯示預覽",
+       "uploadtext": "使用下面的表單來上傳檔案。\n要檢視或搜尋以前上傳的檔案,可至 [[Special:FileList|檔案上傳清單]],(重新) 上傳會在 [[Special:Log/upload|上傳日誌]] 中記錄,而刪除則會在 [[Special:Log/delete|刪除日誌]] 中記錄。\n\n要在頁面中引用檔案,可使用以下其中一種方式連結:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> 顯示完整尺寸的圖片\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> 會在左方放置一張 200 像素寬的圖片於框中,並顯示 \"alt text\" 作為描述\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> 直接連結到圖片而不顯示預覽",
        "upload-permitted": "允許的檔案類型:$1。",
        "upload-preferred": "建議的檔案類型:$1。",
        "upload-prohibited": "禁止的檔案類型:$1。",
        "filetype-badmime": "不允許上傳 MIME 類型為 \"$1\" 的檔案。",
        "filetype-bad-ie-mime": "Internet Explorer 會將此檔案類型誤判為 \"$1\",可能造成潛在問題,不允許上傳此類型檔案。",
        "filetype-unwanted-type": "不建議使用檔案類型 <strong>\".$1\"</strong>。\n建議的檔案類型有 $2。",
-       "filetype-banned-type": "不允許使用檔案類型 <strong>\".$1\"</strong>。\n允許的{{PLURAL:$3|檔案類型|檔案類型}}為 $2。",
+       "filetype-banned-type": "不允許使用檔案類型 <strong>\".$1\"</strong>。允許的{{PLURAL:$3|檔案類型}}為 $2。",
        "filetype-missing": "該檔案沒有副檔名 (如 \".jpg\")。",
        "empty-file": "您所送出的檔案為空的。",
        "file-too-large": "您所送出的檔案過大。",
        "filename-tooshort": "檔案名稱過短。",
        "filetype-banned": "此類型檔案已禁止使用。",
        "verification-error": "此檔案未通過驗證。",
-       "hookaborted": "æ\82¨æ\89\80å\98\97試ç\9a\84ä¿®æ\94¹è¢«æ\93´å±\95套件中止。",
+       "hookaborted": "æ\82¨æ\89\80å\98\97試ç\9a\84ä¿®æ\94¹è¢«æ\93´å\85\85套件中止。",
        "illegal-filename": "不允許使用的檔案名稱。",
        "overwrite": "不允許覆蓋現有檔案。",
        "unknown-error": "發生不明錯誤。",
-       "tmp-create-error": "無法建立臨時檔案。",
+       "tmp-create-error": "無法建立暫存檔案。",
        "tmp-write-error": "寫入臨時檔案發生錯誤。",
        "large-file": "建議的檔案大小上限為 $1;\n此檔案為 $2。",
        "largefileserver": "此檔案大小超出伺服器設定的允許範圍。",
-       "emptyfile": "您上傳的檔案為空的。\n可能是檔案名輸入錯誤。\n請檢查您是否真的要上傳空檔案。",
+       "emptyfile": "您上傳的檔案為空的。\n可能是檔案名輸入錯誤。\n請檢查您是否真的要上傳空檔案。",
        "windows-nonascii-filename": "本 Wiki 不支援使用特殊符號的檔案名稱。",
        "fileexists": "已存在相同名稱的檔案,若{{GENDER:|您}}不確定是否要變更它,請檢查 <strong>[[:$1]]</strong>。\n[[$1|thumb]]",
        "filepageexists": "此檔案的描述頁面 <strong>[[:$1]]</strong> 已存在,但目前沒有使用此名稱的檔案。\n您在此輸入的摘要不會儲存到該描述頁面,\n您必須手動編輯該描述頁面。\n[[$1|thumb]]",
        "upload-proto-error": "通訊協定不正確",
        "upload-proto-error-text": "遠端上傳檔案需要使用以 <code>http://</code> 或 <code>ftp://</code> 開頭的 URL。",
        "upload-file-error": "內部錯誤",
-       "upload-file-error-text": "嘗試在伺服器上建立臨時檔案時發生內部錯誤。\n請連絡 [[Special:ListUsers/sysop|管理員]]。",
+       "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 重新導向至太多其他位址",
        "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
        "backend-fail-backup": "無法備份檔案 \"$1\"。",
        "backend-fail-notexists": "檔案 $1 不存在。",
-       "backend-fail-hashes": "無法取得檔案雜湊值(Hash)進行比較。",
+       "backend-fail-hashes": "無法取得檔案雜湊值 (Hash) 進行比較。",
        "backend-fail-notsame": "於 \"$1\" 已存在另一個不相同的檔案。",
        "backend-fail-invalidpath": "\"$1\" 不是有效的儲存路徑。",
        "backend-fail-delete": "無法刪除檔案 \"$1\"。",
        "uploadstash-refresh": "更新檔案清單",
        "invalid-chunk-offset": "無效區塊位置",
        "img-auth-accessdenied": "拒絕存取",
-       "img-auth-nopathinfo": "缺少 PATH_INFO 參。\n您的伺服器環境未傳遞此資訊,\n您可能使用 CGI-based 的伺服器,不支援 img_auth。\n請參考 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization。",
+       "img-auth-nopathinfo": "缺少 PATH_INFO 參。\n您的伺服器環境未傳遞此資訊,\n您可能使用 CGI-based 的伺服器,不支援 img_auth。\n請參考 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization。",
        "img-auth-notindir": "已設定的上傳目錄清單中不存在您指定的路徑。",
        "img-auth-badtitle": "無法使用 \"$1\" 建立有效的標題。",
        "img-auth-nologinnWL": "您尚未登入,且 \"$1\" 並未在允許清單上。",
        "listfiles-summary": "此特殊頁面顯示所有已上傳的檔案。",
        "listfiles_search_for": "搜尋媒體名稱:",
        "imgfile": "檔案",
-       "listfiles": "檔案列表",
+       "listfiles": "檔案清單",
        "listfiles_thumb": "縮圖",
        "listfiles_date": "日期",
        "listfiles_name": "名稱",
        "filehist-comment": "備註",
        "imagelinks": "檔案用途",
        "linkstoimage": "下列 {{PLURAL:$1|頁面連結|$1 個頁面連結}}到此檔案:",
-       "linkstoimage-more": "超過$1個{{PLURAL:$1|頁面連結|頁面連結}}到這個檔案。\n此處只列出{{PLURAL:$1|首個連結|首$1個連結}}到此檔案的頁面。\n您也可以檢視[[Special:WhatLinksHere/$2|完整的清單]]。",
-       "nolinkstoimage": "沒有頁面連接到本檔案。",
+       "linkstoimage-more": "超過 $1 個{{PLURAL:$1|頁面連結|頁面連結}}到此檔案。\n下列清單只列出前 {{PLURAL:$1|1 筆連結|$1 筆連結}}到此檔案的頁面。\n您也可以檢視 [[Special:WhatLinksHere/$2|完整清單]]。",
+       "nolinkstoimage": "沒有頁面連結到此檔案。",
        "morelinkstoimage": "檢視連結到這個檔案的[[Special:WhatLinksHere/$1|更多連結]]。",
        "linkstoimage-redirect": "$1 (檔案重新導向) $2",
        "duplicatesoffile": "以下 $1 個檔案與此檔案重覆 ([[Special:FileDuplicateSearch/$2|了解詳細資訊]]):",
        "randomincategory": "隨機分類頁面",
        "randomincategory-invalidcategory": "\"$1\" 不是一個有效的分類名稱。",
        "randomincategory-nopages": "[[:Category:$1]] 中沒有任何頁面。",
-       "randomincategory-selectcategory": "取得隨機頁面於分類:$1 $2。",
-       "randomincategory-selectcategory-submit": "執行",
+       "randomincategory-category": "分類:",
+       "randomincategory-legend": "隨機分類頁面",
        "randomredirect": "隨機重新導向",
        "randomredirect-nopages": "在命名空間 \"$1\" 中沒有任何重新導向頁面。",
        "statistics": "統計",
        "brokenredirectstext": "以下的重新導向頁面連結的頁面不存在:",
        "brokenredirects-edit": "編輯",
        "brokenredirects-delete": "刪除",
-       "withoutinterwiki": "未有語言連結的頁面",
+       "withoutinterwiki": "語言連結的頁面",
        "withoutinterwiki-summary": "下列是沒有連結到其它語言版本的頁面。",
        "withoutinterwiki-legend": "字首",
        "withoutinterwiki-submit": "顯示",
        "wantedpages": "需要的頁面",
        "wantedpages-badtitle": "結果集合中的標題無效:$1",
        "wantedfiles": "需要的檔案",
-       "wantedfiletext-cat": "以ä¸\8bæª\94æ¡\88被使ç\94¨ï¼\8cä½\86ä¸\8då­\98å\9c¨ã\80\82å¤\96é\83¨å\84²å­\98庫ç\9a\84æª\94æ¡\88å\84\98管ç\8f¾æ\9c\89ï¼\8cä½\86å\8f¯è\83½æ\9c\83å\9c¨æ­¤å\88\97å\87ºï¼\8cä»»ä½\95æ­¤é¡\9eç\9a\84誤報å°\87被<del>å\89\94é\99¤</del>ã\80\82æ­¤å¤\96ï¼\8cå\85§åµ\8cäº\86ä¸\8då­\98å\9c¨ç\9a\84æª\94æ¡\88ç\9a\84網é \81å°\87å\9c¨[[:$1]]å\88\97å\87ºã\80\82",
+       "wantedfiletext-cat": "ä¸\8bå\88\97æª\94æ¡\88被æ\99\82ç\94¨ï¼\8cä½\86æª\94æ¡\88ä¸\8då­\98å\9c¨ã\80\82 å¤\96é\83¨å\84²å­\98庫ç\9a\84æª\94æ¡\88å\84\98管å­\98å\9c¨ï¼\8cä½\86æ­¤æ¸\85å\96®ä»\8dæ\9c\83å\88\97å\87ºã\80\82 é\80\99é¡\9e誤報ç\9a\84é \85ç\9b®æ\9c\83以 <del>å\88ªé\99¤ç·\9a</del> æ¨\99示ã\80\82 å\8f¦å¤\96ï¼\8cé \81é\9d¢å\85§åµ\8cæª\94æ¡\88ä¸\8då­\98å\9c¨æ\9c\83æ\96¼æ¸\85å\96® [[:$1]] ä¸­é¡¯ç¤ºã\80\82",
        "wantedfiletext-cat-noforeign": "下列檔案已被使用但不存在。 除此之外,頁面已內嵌但不存在的檔案列於 [[:$1]]。",
-       "wantedfiletext-nocat": "以ä¸\8bæª\94æ¡\88被使ç\94¨ï¼\8cä½\86ä¸\8då­\98å\9c¨ã\80\82å¤\96é\83¨å\84²å­\98庫ç\9a\84æ\96\87件å\84\98管ç\8f¾æ\9c\89ï¼\8cä½\86å\8f¯è\83½æ\9c\83å\9c¨æ­¤å\88\97å\87ºï¼\8cä»»ä½\95æ­¤é¡\9eç\9a\84誤報å°\87被<del>å\89\94é\99¤</del>。",
+       "wantedfiletext-nocat": "ä¸\8bå\88\97æª\94æ¡\88被æ\99\82ç\94¨ï¼\8cä½\86æª\94æ¡\88ä¸\8då­\98å\9c¨ã\80\82 å¤\96é\83¨å\84²å­\98庫ç\9a\84æª\94æ¡\88å\84\98管å­\98å\9c¨ï¼\8cä½\86æ­¤æ¸\85å\96®ä»\8dæ\9c\83å\88\97å\87ºã\80\82 é\80\99é¡\9e誤報ç\9a\84é \85ç\9b®æ\9c\83以 <del>å\88ªé\99¤ç·\9a</del> æ¨\99示。",
        "wantedfiletext-nocat-noforeign": "下列檔案已被使用但不存在。",
        "wantedtemplates": "需要的樣版",
        "mostlinked": "被連結最多的頁面",
        "pager-newer-n": "較新 $1 筆",
        "pager-older-n": "較舊 $1 筆",
        "suppress": "監督",
-       "querypage-disabled": "æ­¤ç\89¹æ®\8aé \81é\9d¢å\9fºæ\96¼æ\95\88è\83½ç\9a\84å\8e\9få\9b å·²ç¶\93被停用。",
+       "querypage-disabled": "æ­¤ç\89¹æ®\8aé \81é\9d¢å\9b è\80\83é\87\8fæ\95\88è\83½å\95\8fé¡\8cå·²被停用。",
        "booksources": "圖書資源",
        "booksources-search-legend": "尋找圖書資源",
        "booksources-isbn": "國際標準書號:",
-       "booksources-go": "執行",
-       "booksources-text": "以ä¸\8bæ\98¯ä¸\80份é\8a·å\94®æ\96°æ\9b¸æ\88\96äº\8cæ\89\8bæ\9b¸ç\9a\84å\88\97表ï¼\8c並å\8f¯è\83½æ\9c\89{{GENDER:|ä½ |妳|ä½ }}æ­£å°\8bæ\89¾ç\9a\84æ\9b¸ç\9a\84é\80²ä¸\80æ­¥è¨\8aæ\81¯:",
-       "booksources-invalid-isbn": "æ\8f\90ä¾\9bç\9a\84ISBNè\99\9f碼並ä¸\8d正確ï¼\8cè«\8b檢æ\9f¥å\8e\9få§\8bè¤\87製ä¾\86æº\90è\99\9f碼是否有誤。",
+       "booksources-search": "搜尋",
+       "booksources-text": "ä¸\8bå\88\97æ¸\85å\96®å\8c\85å\90«å\85¶ä»\96é\8a·å\94®æ\96°æ\9b¸ç±\8dæ\88\96äº\8cæ\89\8bæ\9b¸ç±\8dç\9a\84網ç«\99é\80£çµ\90ï¼\8cå\8f¯æ\9c\83æ\9c\89ä½ æ\83³å°\8bæ\89¾æ\9b¸ç±\8dç\9a\84é\80²ä¸\80é\83¨è³\87è¨\8a:",
+       "booksources-invalid-isbn": "æ\82¨æ\8f\90ä¾\9bç\9a\84 ISBN ä¸\8d正確ï¼\8cè«\8b檢æ\9f¥è¤\87製ç\9a\84ä¾\86æº\90是否有誤。",
        "specialloguserlabel": "執行者:",
        "speciallogtitlelabel": "目標 (標題或使用者):",
        "log": "日誌",
        "deletedcontributions-title": "已刪除的使用者貢獻",
        "sp-deletedcontributions-contribs": "貢獻",
        "linksearch": "外部連結搜尋",
-       "linksearch-pat": "搜尋網址:",
+       "linksearch-pat": "搜尋關鍵字:",
        "linksearch-ns": "命名空間:",
        "linksearch-ok": "搜尋",
-       "linksearch-text": "可使用萬用字元如 \"*.wikipedia.org\"。\n萬用字元必須使用在最上層網域,例如 \"*.org\".<br />\n支援的{{PLURAL:$2|通訊協定|通訊協定}}有:<code>$1</code> (若未指定則預設使用 http:// 通訊協定)。",
-       "linksearch-line": "$1 連自 $2",
+       "linksearch-text": "可使用萬用字元如 \"*.wikipedia.org\"。\n萬用字元必須使用在最上層網域,例如 \"*.org\".<br />\n支援的{{PLURAL:$2|通訊協定}}有:<code>$1</code> (若未指定則預設使用 http:// 通訊協定)。",
+       "linksearch-line": "$1 由 $2 所連結",
        "linksearch-error": "萬用字元僅可在主機名稱的開頭使用。",
        "listusersfrom": "顯示使用者開始自:",
        "listusers-submit": "顯示",
        "listgrouprights-rights": "權限",
        "listgrouprights-helppage": "Help:Group rights",
        "listgrouprights-members": "(成員清單)",
-       "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-namespaceprotection-header": "命名空間限制",
        "listgrouprights-namespaceprotection-namespace": "命名空間",
        "listgrouprights-namespaceprotection-restrictedto": "允許使用者編輯的權限",
-       "trackingcategories": "è·\9f蹤分類",
-       "trackingcategories-summary": "此頁面列出由 MediaWiki 系統自動產生用來追蹤頁面的分類,這些分類的名稱可由命名空間 {{ns:8}} 中的相關系統訊息中修改。",
-       "trackingcategories-msg": "è·\9f蹤分類",
+       "trackingcategories": "追蹤分類",
+       "trackingcategories-summary": "此頁面列出由 MediaWiki 軟體自動產生用來追蹤頁面的分類,這些分類的名稱可由命名空間 {{ns:8}} 中的相關系統訊息中修改。",
+       "trackingcategories-msg": "追蹤分類",
        "trackingcategories-name": "訊息名稱",
-       "trackingcategories-desc": "å\88\86é¡\9eæ\94¶é\8c\84æº\96å\89\87",
+       "trackingcategories-desc": "å\88\86é¡\9eæ\94¶é\8c\84æ¨\99æº\96",
        "noindex-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__NOINDEX__</nowiki></code> 未被機器人列入索引的頁面。",
        "index-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__INDEX__</nowiki></code> 被機器人列入索引的頁面。",
-       "post-expand-template-inclusion-category-desc": "當展開所有模組,大小大於<code>$wgMaxArticleSize</code>,因此一些模組尚未展開",
-       "post-expand-template-argument-category-desc": "展開樣版參數之後 (有些於三括號中,如 <code>{{{Foo}}}</code>),頁面大小超過<code>$wgMaxArticleSize</code> 設定的限制。",
-       "expensive-parserfunction-category-desc": "頁面使用太多消耗系統資源的析器函數 (如 <code>#ifexist</code>)。\n請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
-       "broken-file-category-desc": "頁面包含損壞的檔案連結 (內嵌檔案連結的檔案不存在時)",
-       "hidden-category-category-desc": "該分類使用了 <code><nowiki>__HIDDENCAT__</nowiki></code>,可預設避免在頁面中顯示該分類的分類連結框。",
+       "post-expand-template-inclusion-category-desc": "展開樣版後大小超過 <code>$wgMaxArticleSize</code> 導致部份樣版未正常展開的頁面。",
+       "post-expand-template-argument-category-desc": "展開樣版參數後大小超過 <code>$wgMaxArticleSize</code> 的頁面 (有些於三括號中,如 <code>{{{Foo}}}</code>)。",
+       "expensive-parserfunction-category-desc": "頁面使用太多消耗系統資源的析器函數 (如 <code>#ifexist</code>)。\n請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
+       "broken-file-category-desc": "含有損壞檔案連結的頁面 (內嵌檔案連結的檔案不存在)。",
+       "hidden-category-category-desc": "內容中使用 <code><nowiki>__HIDDENCAT__</nowiki></code> 的分類,可隱藏預設在頁面上顯示的分類連結方塊。",
        "trackingcategories-nodesc": "沒有可用的描述。",
        "trackingcategories-disabled": "已停用分類",
        "mailnologin": "沒有傳送位址",
        "emailuser-title-notarget": "E-mail 給使用者",
        "emailpage": "E-mail 給使用者",
        "emailpagetext": "您可以使用以下表格傳送電子郵件給這位 {{Gender:$1|使用者}}。\n您在 [[Special:Preferences|偏好設定]] 中所輸入的電子郵件位址將會作為郵件的 \"寄件人\",因此該使用者可直接回覆您。",
-       "defemailsubject": "來自使用者 \"$1\" 於 {{SITENAME}} 寄來的電子郵件",
+       "defemailsubject": "{{SITENAME}} 使用者 \"$1\" 寄來的電子郵件",
        "usermaildisabled": "使用者電子郵件已停用",
-       "usermaildisabledtext": "您不傳送信件到這個 Wiki 上的其他使用者",
+       "usermaildisabledtext": "您不傳送信件到這個 Wiki 上的其他使用者",
        "noemailtitle": "沒有電子郵件位址",
        "noemailtext": "此使用者尚未指定一個有效的電子郵件位址。",
        "nowikiemailtext": "此使用者選擇不接收其他使用者的信件。",
        "emailtarget": "輸入收件人使用者名稱",
        "emailusername": "使用者名稱:",
        "emailusernamesubmit": "送出",
-       "email-legend": "傳送電子郵件給另一位 {{SITENAME}} 使用者",
+       "email-legend": "傳送電子郵件給另一位 {{SITENAME}} 使用者",
        "emailfrom": "寄件人:",
        "emailto": "收件人:",
        "emailsubject": "主旨:",
        "emailmessage": "訊息:",
        "emailsend": "傳送",
-       "emailccme": "傳送一份副本到我的電子郵件信箱。",
+       "emailccme": "傳送一份訊息副本到我的電子郵件信箱。",
        "emailccsubject": "您寄給 $1 的訊息副本:$2",
        "emailsent": "已寄出電子郵件",
        "emailsenttext": "已寄出您的電子郵件訊息。",
        "wlheader-enotif": "已開啟電子郵件通知功能。",
        "wlheader-showupdated": "在您最後一次檢視過後修改的頁面會以 <strong>粗體</strong> 顯示。",
        "wlnote": "以下為自 $3 $4 之後的 <strong>$2</strong> 小時內所做的 <strong>$1</strong> 次變更。",
-       "wlshowlast": "顯示最近 $1 小時,$2 天,$3 的修改",
+       "wlshowlast": "顯示最近 $1 小時 $2 天",
        "watchlist-options": "監視清單選項",
        "watching": "正在監視...",
        "unwatching": "正在停止監視...",
        "exbeforeblank": "被清空前的內容為:\"$1\"",
        "delete-confirm": "刪除 \"$1\"",
        "delete-legend": "刪除",
-       "historywarning": "<strong>警告:</strong>您正要刪除的頁面內含有約 $1 次{{PLURAL:$1|的修訂}}歷史:",
+       "historywarning": "<strong>警告:</strong>您正要刪除的頁面內含 $1 次{{PLURAL:$1|的修訂}}歷史:",
        "confirmdeletetext": "您正要刪除一個頁面或圖片以及其所有歷史。\n請確定您了解要進行此項操作所造成的後果,同時確認您的行為符合[[{{MediaWiki:Policy-url}}]] 規範。",
        "actioncomplete": "操作完成",
        "actionfailed": "操作失敗",
        "deletedtext": "已刪除 \"$1\"。\n請參考 $2 檢視最近的刪除記錄。",
        "dellogpage": "刪除日誌",
-       "dellogpagetext": "以下為最近刪除記錄的列表。",
+       "dellogpagetext": "以下為最近刪除記錄的清單。",
        "deletionlog": "刪除日誌",
        "reverted": "還原到較早的版本",
        "deletecomment": "原因:",
        "deletereasonotherlist": "其它原因",
        "deletereason-dropdown": "* 常見的刪除原因\n** 濫發廣告訊息\n** 破壞\n** 侵犯版權\n** 作者請求\n** 損壞的重新導向連結",
        "delete-edit-reasonlist": "編輯刪除原因",
-       "delete-toobig": "這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除此類頁面的動作已經被限制,以防止在{{SITENAME}}上的意外擾亂。",
-       "delete-warning-toobig": "這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。",
-       "delete-cantedit": "您沒有權限編輯此頁面,您無法刪除。",
+       "delete-toobig": "此頁面含有大量的編輯歷史,超過 $1 次修訂。\n已限制刪除此類頁面的動作,以避免意外中斷 {{SITENAME}} 的運作。",
+       "delete-warning-toobig": "此頁面含有大量的編輯歷史,超過 $1 次修訂。\n刪除該頁面可能會中斷 {{SITENAME}} 的資料庫運作;\n請小心執行此動作。",
+       "deleteprotected": "此頁面已受保護,您無法刪除此頁面。",
        "deleting-backlinks-warning": "<strong>警告:</strong>您正要刪除的頁面有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他頁面]]連結或引用。",
        "rollback": "還原編輯",
        "rollback_short": "還原",
        "rollbacklink": "還原",
        "rollbacklinkcount": "還原 $1 次編輯",
-       "rollbacklinkcount-morethan": "回退多過 $1 次{{PLURAL:$1|編輯}}",
+       "rollbacklinkcount-morethan": "還原超過 $1 次{{PLURAL:$1|編輯}}",
        "rollbackfailed": "還原失敗",
        "cantrollback": "無法還原編輯;\n此頁面的最後貢獻者是唯一的作者。",
        "alreadyrolled": "無法還原由 [[User:$2|$2]] ([[User talk:$2|對話]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]] 所作的最後一次編輯 [[:$1]],已有其他人編輯或還原了該頁面。\n\n最後一次編輯該頁面的使用者是 [[User:$3|$3]] ([[User talk:$3|對話]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
        "sessionfailure-title": "連線階段失敗",
        "sessionfailure": "似乎您的登入會話有問題;\n為了防止會話劫持,這個操作已經被取消。\n請返回先前的頁面,重新載入該頁面,然後重試。",
        "protectlogpage": "保護日誌",
-       "protectlogtext": "以下為變更頁面保護的列表。\n請參考 [[Special:ProtectedPages|受保護頁面列表]] 檢視目前受保護頁面。",
+       "protectlogtext": "以下為變更頁面保護的清單。\n請參考 [[Special:ProtectedPages|受保護頁面清單]] 檢視目前受保護頁面。",
        "protectedarticle": "已保護 \"[[$1]]\"",
        "modifiedarticleprotection": "已變更 \"[[$1]]\" 的保護層級",
        "unprotectedarticle": "已解除 \"[[$1]]\" 的保護",
        "protect-expiry-indefinite": "無限期",
        "protect-cascade": "保護本頁中包含的頁面 (連鎖保護)",
        "protect-cantedit": "您沒有編輯權限,無法更改此頁面的保護層級。",
-       "protect-othertime": "其它時間:",
+       "protect-othertime": "其它時間",
        "protect-othertime-op": "其它時間",
        "protect-existing-expiry": "已設定期限:$2 $3",
+       "protect-existing-expiry-infinity": "已設定的期限:無限期",
        "protect-otherreason": "其它/額外的原因:",
        "protect-otherreason-op": "其它原因",
        "protect-dropdown": "*常見的保護原因\n** 過度的破壞\n** 過多垃圾訊息\n** 反生產性的編輯戰\n** 高流量頁面",
        "protect-edit-reasonlist": "編輯保護原因",
-       "protect-expiry-options": "1 小時:1 hour,1 天:1 day,1 週:1 week,2 週:2 weeks,1 個月:1 month,3 個月:3 months,6 個月:6 months,1 年:1 year,限期:infinite",
+       "protect-expiry-options": "1 小時:1 hour,1 天:1 day,1 週:1 week,2 週:2 weeks,1 個月:1 month,3 個月:3 months,6 個月:6 months,1 年:1 year,限期:infinite",
        "restriction-type": "權限:",
        "restriction-level": "限制層級:",
        "minimum-size": "大小下限",
        "restriction-move": "移動",
        "restriction-create": "建立",
        "restriction-upload": "上傳",
-       "restriction-level-sysop": "全保護",
-       "restriction-level-autoconfirmed": "半保護",
+       "restriction-level-sysop": "å\8f\97å\85¨ä¿\9dè­·",
+       "restriction-level-autoconfirmed": "å\8f\97å\8d\8aä¿\9dè­·",
        "restriction-level-all": "任何層級",
        "undelete": "檢視已刪除的頁面",
        "undeletepage": "檢視與還原已刪除的頁面",
-       "undeletepagetitle": "'''以下包含[[:$1]]的已刪除之修訂版本'''。",
+       "undeletepagetitle": "<strong>下列為 [[:$1]] 已刪除的修訂版本</strong>。",
        "viewdeletedpage": "檢視已刪除頁面",
-       "undeletepagetext": "以ä¸\8bç\9a\84$1å\80\8bé \81é\9d¢å·²ç¶\93被å\88ªé\99¤ï¼\8cä½\86ä¾\9dç\84¶å\9c¨æª\94æ¡\88中並å\8f¯ä»¥è¢«æ\81¢å¾©ã\80\82\næª\94æ¡\88庫å\8f¯è\83½è¢«定時清理。",
+       "undeletepagetext": "ä¸\8bå\88\97 {{PLURAL:$1|1 å\80\8bé \81é\9d¢å·²å\88ªé\99¤|$1 å\80\8bé \81é\9d¢å·²å\88ªé\99¤}}ä½\86å°\9aå\9c¨å°\81å­\98ï¼\8cä»\8då\8f¯é\82\84å\8e\9fã\80\82\nå°\81å­\98ç\9a\84æª\94æ¡\88å\8f¯è\83½æ\9c\83定時清理。",
        "undelete-fieldset-title": "還原修訂",
        "undeleteextrahelp": "若要還原所有的頁面歷史,請取消勾選所有核選方塊並點選 <strong><em>{{int:undeletebtn}}</em></strong>。\n若要還原指定的頁面歷史,請勾選要還原的修訂核選方塊並點選 <strong><em>{{int:undeletebtn}}</em></strong>。",
        "undeleterevisions": "已封存 $1 個修訂",
        "undeletedpage": "<strong>已還原 $1</strong>\n\n請參考 [[Special:Log/delete|刪除日誌]] 以查詢最近刪除及還原的記錄。",
        "undelete-header": "請參考 [[Special:Log/delete|刪除日誌]] 查詢最近刪除的頁面。",
        "undelete-search-title": "搜尋已刪除頁面",
-       "undelete-search-box": "搜尋已刪除頁面",
+       "undelete-search-box": "搜尋已刪除頁面",
        "undelete-search-prefix": "顯示頁面開始自:",
        "undelete-search-submit": "搜尋",
        "undelete-no-results": "刪除記錄裡沒有符合的頁面。",
        "mycontris": "我的貢獻",
        "contribsub2": "{{GENDER:$3|$1}} 的貢獻 ($2)",
        "contributions-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。",
-       "nocontribs": "沒有找到符合特徵的更改。",
+       "nocontribs": "沒有找到符合條件的變更。",
        "uctop": "(目前)",
        "month": "截止月份:",
        "year": "截止年份:",
        "sp-contributions-userrights": "使用者權限管理",
        "sp-contributions-blocked-notice": "此使用者目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
        "sp-contributions-blocked-notice-anon": "此 IP 位址目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
-       "sp-contributions-search": "搜尋貢獻記錄",
+       "sp-contributions-search": "搜尋貢獻",
        "sp-contributions-username": "IP 位址或使用者名稱:",
-       "sp-contributions-toponly": "å\8fªé¡¯ç¤ºæ\9c\80æ\96°ä¿®è¨\82ç\89\88æ\9c¬ç\9a\84編輯",
-       "sp-contributions-newonly": "å\83\85顯示建ç«\8bé \81é\9d¢ä¹\8b編輯",
+       "sp-contributions-toponly": "只顯示最新修訂的編輯",
+       "sp-contributions-newonly": "å\8fªé¡¯ç¤ºå»ºç«\8bé \81é\9d¢ç\9a\84編輯",
        "sp-contributions-submit": "搜尋",
        "whatlinkshere": "連入頁面",
        "whatlinkshere-title": "連結到 \"$1\" 的頁面",
        "whatlinkshere-page": "頁面:",
-       "linkshere": "以下頁面連結到[[:$1]]:",
-       "nolinkshere": "沒有頁面連結到[[:$1]]。",
+       "linkshere": "以下頁面連結至 <strong>[[:$1]]</strong>:",
+       "nolinkshere": "沒有頁面連結至 <strong>[[:$1]]</strong>。",
        "nolinkshere-ns": "已選擇的命名空間中沒有頁面連結到 [[:$1]]。",
        "isredirect": "重新導向頁面",
        "istemplate": "引用",
        "isimage": "檔案連結",
        "whatlinkshere-prev": "前 $1 筆",
        "whatlinkshere-next": "後 $1 筆",
-       "whatlinkshere-links": "← 連",
+       "whatlinkshere-links": "← 連",
        "whatlinkshere-hideredirs": "$1 重新導向頁面",
        "whatlinkshere-hidetrans": "$1 引用",
        "whatlinkshere-hidelinks": "$1 連結",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*常見的封鎖原因\n** 填寫不實資訊\n** 刪除頁面內容\n** 散佈外部廣告連結\n** 在頁面填寫無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個帳號\n** 使用不受歡迎的使用者名稱",
-       "ipb-hardblock": "避免使用此 IP 位址登入的使用者編輯",
+       "ipb-hardblock": "禁止使用此 IP 位址登入的使用者編輯",
        "ipbcreateaccount": "禁止建立帳號",
        "ipbemailban": "禁止使用者傳送電子郵件",
        "ipbenableautoblock": "自動封鎖此使用者最後使用的 IP 位址,以及所有之後嘗試編輯使用的 IP 位址",
        "ipbsubmit": "封鎖此使用者",
        "ipbother": "其他時間:",
-       "ipboptions": "2小時:2 hours,1天:1 day,3天:3 days,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,無限期:infinite",
+       "ipboptions": "2 小時:2 hours,1 天:1 day,3 天:3 days,1 週:1 week,2 週:2 weeks,1 個月:1 month,3 個月:3 months,6 個月:6 months,1 年:1 year,無限期:infinite",
        "ipbhidename": "在編輯及清單中隱藏使用者名稱",
        "ipbwatchuser": "監視這位使用者的使用者頁面及其對話頁面",
        "ipb-disableusertalk": "避免在封鎖此使用者的期間編輯自己的對話頁面",
        "unblocked": "[[User:$1|$1]] 的封鎖已經解除。",
        "unblocked-range": "已解除封鎖 $1。",
        "unblocked-id": "已經移除 $1 的封鎖。",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] 已解除封鎖。",
        "blocklist": "已封鎖的使用者",
        "ipblocklist": "已封鎖的使用者",
        "ipblocklist-legend": "搜尋已封鎖的使用者",
        "block-log-flags-angry-autoblock": "加強自動封鎖已開啟",
        "block-log-flags-hiddenname": "隱藏使用者名稱",
        "range_block_disabled": "管理員可建立範圍封鎖的權限以被關閉。",
-       "ipb_expiry_invalid": "無效的終止時間。",
+       "ipb_expiry_invalid": "無效的期限。",
        "ipb_expiry_temp": "隱藏使用者名稱的封鎖不可設定期限。",
        "ipb_hide_invalid": "無法禁止顯示此帳號;它擁有超過 $1 次的編輯。",
        "ipb_already_blocked": "已經封鎖 \"$1\"。",
        "ipb_blocked_as_range": "錯誤:IP 位址 $1 並不是直接被封鎖,因此無法直接解除封鎖。\n此 IP 位址在 $2 的封鎖範圍之中,您可以解決此範圍的封鎖。",
        "ip_range_invalid": "無效的 IP 範圍。",
        "ip_range_toolarge": "不允許封鎖範圍大於 /$1。",
-       "proxyblocker": "代理封鎖器",
-       "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯繫您的網服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
-       "sorbsreason": "您的 IP 位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器。",
+       "proxyblocker": "代理伺服器封鎖器",
+       "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯繫您的網服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
+       "sorbsreason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。",
        "sorbs_create_account_reason": "您連線到 {{SITENAME}} 的 IP 位址被 DNSBL 列為開放代理伺服器。\n您不能建立帳號。",
        "xffblockreason": "您的 IP 位址使用 X-Forwarded-For 標頭,您或您使用的代理伺服器已被封鎖。\n封鎖的原因為:$1",
        "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
        "thumbnail_error_remote": "來自 $1 錯誤訊息:\n$2",
        "djvu_page_error": "DjVu 頁面超出範圍",
        "djvu_no_xml": "無法在 DjVu 檔案中擷取 XML",
-       "thumbnail-temp-create": "無法建立臨時縮圖檔案",
+       "thumbnail-temp-create": "無法建立暫存縮圖檔案",
        "thumbnail-dest-create": "無法儲存縮圖至目標",
        "thumbnail_invalid_params": "無效的縮圖參數",
        "thumbnail_dest_directory": "無法建立目標目錄",
        "import": "匯入頁面",
        "importinterwiki": "Transwiki 匯入",
        "import-interwiki-text": "請選擇一個 Wiki 與頁面標題以進行匯入。\n會同時記錄修訂日期和編輯者的名稱。\n所有的 Transwiki 匯入操作會被記錄在 [[Special:Log/import|匯入日誌]]。",
-       "import-interwiki-source": "來源 Wiki/頁面:",
+       "import-interwiki-sourcewiki": "來源 Wiki:",
+       "import-interwiki-sourcepage": "來源頁面:",
        "import-interwiki-history": "複製此頁的所有歷史修訂",
        "import-interwiki-templates": "包含所有樣版",
        "import-interwiki-submit": "匯入",
        "importsuccess": "已完成匯入!",
        "importnosources": "未定義任何 Transwiki 匯入來源且已關閉使用歷史記錄上傳功能。",
        "importnofile": "未上傳匯入檔案。",
-       "importuploaderrorsize": "上匯入檔案失敗。\n檔案大小超過允許上傳大小。",
-       "importuploaderrorpartial": "上匯入檔案失敗。\n僅上傳部份檔案。",
-       "importuploaderrortemp": "上載匯入檔案失敗。\n遺失臨時資料夾。",
-       "import-parse-failure": "XML 匯入析失敗",
+       "importuploaderrorsize": "上匯入檔案失敗。\n檔案大小超過允許上傳大小。",
+       "importuploaderrorpartial": "上匯入檔案失敗。\n僅上傳部份檔案。",
+       "importuploaderrortemp": "上傳匯入檔案失敗。\n遺失暫存資料夾。",
+       "import-parse-failure": "XML 匯入析失敗",
        "import-noarticle": "沒有任何可匯入的頁面!",
        "import-nonewrevisions": "未匯入任何修訂 (修訂已存在,或因錯誤跳過)。",
        "xml-error-string": "$1 於行 $2,欄 $3 ($4 位元組):$5",
        "tooltip-search-fulltext": "搜尋使用此文字的頁面",
        "tooltip-p-logo": "參觀主頁面",
        "tooltip-n-mainpage": "參觀主頁面",
-       "tooltip-n-mainpage-description": "å\8f\83è§\80主頁面",
+       "tooltip-n-mainpage-description": "å\8f\83訪主頁面",
        "tooltip-n-portal": "關於本專案、您可以做什麼、哪裡可以找到事情",
-       "tooltip-n-currentevents": "提供目前新聞事件的背景資料",
-       "tooltip-n-recentchanges": "列出此 Wiki 中的最近變更清單",
+       "tooltip-n-currentevents": "尋找新聞中最新動態的背景資訊",
+       "tooltip-n-recentchanges": "列出此 Wiki 中的近期修訂清單",
        "tooltip-n-randompage": "隨機進入一個頁面",
        "tooltip-n-help": "尋求協助的地方",
        "tooltip-t-whatlinkshere": "列出所有連結此頁面的頁面",
-       "tooltip-t-recentchangeslinked": "此頁面連結到其他頁面的最近變更",
+       "tooltip-t-recentchangeslinked": "此頁面連結到其他頁面的近期變更",
        "tooltip-feed-rss": "訂閱此頁面的 RSS feed",
        "tooltip-feed-atom": "訂閱此頁面的 Atom feed",
        "tooltip-t-contributions": "此使用者的貢獻清單",
        "tooltip-t-emailuser": "傳送電子郵件給這個使用者",
        "tooltip-t-upload": "上傳檔案",
-       "tooltip-t-specialpages": "全部特殊頁面的列表",
+       "tooltip-t-specialpages": "全部特殊頁面的清單",
        "tooltip-t-print": "此頁面的可列印版本",
-       "tooltip-t-permalink": "此頁面修訂的固定連結",
+       "tooltip-t-permalink": "此頁面修訂的靜態連結",
        "tooltip-ca-nstab-main": "檢視頁面內容",
        "tooltip-ca-nstab-user": "檢視使用者頁面",
        "tooltip-ca-nstab-media": "檢視媒體頁面",
        "noscript.css": "/* 此 CSS 會影響沒有啓用 JavaScript 的使用者 */",
        "group-autoconfirmed.css": "/* 此 CSS 會影響自動確認的使用者 */",
        "group-bot.css": "/* 此 CSS 會影響機器人 */",
-       "group-sysop.css": "/*  CSS 會影響管理員 */",
+       "group-sysop.css": "/* 這裡的 CSS 會影響管理員 */",
        "group-bureaucrat.css": "/* 此 CSS 會影響行政員 */",
        "common.js": "/* 此 JavaScript 會用於使用者載入的每一個頁面。 */",
+       "group-sysop.js": "/* 這裡的 JavaScript 會影響管理員 */",
        "anonymous": "{{SITENAME}} 的匿名{{PLURAL:$1|使用者}}",
        "siteuser": "{{SITENAME}} 使用者 $1",
        "anonuser": "{{SITENAME}} 匿名使用者 $1",
-       "lastmodifiedatby": "此頁由 $3 於 $1 $2 的最後更改。",
+       "lastmodifiedatby": "此頁面由 $3 於 $1 $2 做最後修改。",
        "othercontribs": "此頁面由 $1 所貢獻。",
        "others": "其他",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|使用者}} $1",
        "pageinfo-lasttime": "最近編輯日期",
        "pageinfo-edits": "編輯總次數",
        "pageinfo-authors": "作者總數",
-       "pageinfo-recent-edits": "最近編輯次數 (過去$1內)",
+       "pageinfo-recent-edits": "最近編輯次數 (過去 $1 內)",
        "pageinfo-recent-authors": "最近作者數",
        "pageinfo-magic-words": "魔術{{PLURAL:$1|字}} ($1)",
-       "pageinfo-hidden-categories": "隱藏{{PLURAL:$1|分類}} ($1)",
+       "pageinfo-hidden-categories": "隱藏分類 ($1)",
        "pageinfo-templates": "引用樣版 ($1)",
        "pageinfo-transclusions": "頁面被引用於 ($1)",
        "pageinfo-toolboxlink": "頁面資訊",
        "markaspatrolledtext": "標記此頁面為已巡查",
        "markedaspatrolled": "己標記為已巡查",
        "markedaspatrolledtext": "已標記選擇的修訂 [[:$1]] 為已巡查。",
-       "rcpatroldisabled": "最近變更巡查已停用",
+       "rcpatroldisabled": "近期變更巡查已停用",
        "rcpatroldisabledtext": "最新變更巡查的功能目前已停用。",
        "markedaspatrollederror": "無法標記為已巡查",
        "markedaspatrollederrortext": "您需指定要標記為已巡查的修訂。",
        "metadata-help": "此檔案包含額外的資訊,可能由數位相機或掃描機所建立的。\n若修改此檔案,部份資訊將無法保留。",
        "metadata-expand": "顯示詳細資料",
        "metadata-collapse": "隱藏詳細資料",
-       "metadata-fields": "在本訊息中所列出的 EXIF 元數據域將包含在圖片顯示頁面,當元數據表損壞時只顯示以下訊息。\n其他的元數據預設為隱藏。\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "在本訊息中所列出的 EXIF 詮釋資料域將包含在圖片顯示頁面,當詮釋資料表損壞時只顯示以下訊息。\n其他的詮釋資料預設為隱藏。\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "寬度",
        "exif-imagelength": "高度",
        "exif-bitspersample": "每像素位元",
        "exif-samplesperpixel": "像素數量",
        "exif-planarconfiguration": "資料排列",
        "exif-ycbcrsubsampling": "黃色轉洋紅二次抽樣比率",
-       "exif-ycbcrpositioning": "黃色和洋紅配置",
+       "exif-ycbcrpositioning": "亮度與彩度偏移",
        "exif-xresolution": "水平解析度",
        "exif-yresolution": "垂直解析度",
        "exif-stripoffsets": "影像資料位置",
        "exif-rating": "評分 (共 5 分)",
        "exif-rightscertificate": "版權管理證書",
        "exif-copyrighted": "版權狀態",
-       "exif-copyrightowner": "ç\89\88æ¬\8aæ\8c\81有人",
+       "exif-copyrightowner": "ç\89\88æ¬\8aæ\89\80有人",
        "exif-usageterms": "使用條款",
        "exif-webstatement": "線上版權聲明",
        "exif-originaldocumentid": "原始文件唯一識別碼",
        "exif-giffilecomment": "GIF 檔案備註",
        "exif-intellectualgenre": "項目類型",
        "exif-subjectnewscode": "主題代碼",
-       "exif-scenecode": "IPTC現場代碼",
+       "exif-scenecode": "IPTC 現場代碼",
        "exif-event": "事件描述",
        "exif-organisationinimage": "組織描述",
        "exif-personinimage": "所描述的人",
-       "exif-originalimageheight": "被è£\81å\89ªå\89\8d高度",
-       "exif-originalimagewidth": "被è£\81å\89ªå\89\8d寬度",
+       "exif-originalimageheight": "è£\81å\88\87å\89\8dç\9a\84高度",
+       "exif-originalimagewidth": "è£\81å\88\87å\89\8dç\9a\84寬度",
        "exif-compression-1": "未壓縮",
-       "exif-compression-2": "CCITT第3組一維修改霍夫曼遊程編碼",
-       "exif-compression-3": "CCITT第3組傳真編碼",
-       "exif-compression-4": "CCITT第4組傳真編碼",
+       "exif-compression-2": "CCITT 第 3 組一維修改霍夫曼變動長度編碼",
+       "exif-compression-3": "CCITT 第 3 組傳真編碼",
+       "exif-compression-4": "CCITT 第 4 組傳真編碼",
        "exif-compression-6": "JPEG (舊)",
        "exif-copyrighted-true": "受版權保護",
-       "exif-copyrighted-false": "版權所屬者不明",
+       "exif-copyrighted-false": "版權狀態不明",
        "exif-unknowndate": "日期不明",
        "exif-orientation-1": "標準",
        "exif-orientation-2": "水平翻轉",
        "exif-flash-redeye-1": "防紅眼模式",
        "exif-focalplaneresolutionunit-2": "英寸",
        "exif-sensingmethod-1": "未定義",
-       "exif-sensingmethod-2": "一塊彩色區域傳感器",
-       "exif-sensingmethod-3": "兩塊彩色區域傳感器",
-       "exif-sensingmethod-4": "三塊彩色區域傳感器",
-       "exif-sensingmethod-5": "連續彩色區域傳感器",
-       "exif-sensingmethod-7": "三線傳感器",
-       "exif-sensingmethod-8": "連續彩色線性傳感器",
+       "exif-sensingmethod-2": "單晶片彩色區域感測器",
+       "exif-sensingmethod-3": "雙晶片彩色區域感測器",
+       "exif-sensingmethod-4": "三晶片彩色區域感測器",
+       "exif-sensingmethod-5": "連續彩色區域感測器",
+       "exif-sensingmethod-7": "三線性感測器",
+       "exif-sensingmethod-8": "連續彩色線性感測器",
        "exif-filesource-3": "數位相機",
        "exif-scenetype-1": "直接照像圖片",
        "exif-customrendered-0": "標準處理",
        "exif-urgency-low": "低 ($1)",
        "exif-urgency-high": "高 ($1)",
        "exif-urgency-other": "使用者自訂優先權 ($1)",
-       "watchlistall2": "全部",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認電子郵件位址",
        "confirmemail_noemail": "您尚未於 [[Special:Preferences|偏好設定]] 輸入一個有效的電子郵件位址。",
-       "confirmemail_text": "{{SITENAME}}è¦\81æ±\82æ\82¨å\9c¨ä½¿ç\94¨é\83µä»¶å\8a\9fè\83½ä¹\8bå\89\8dé©\97è­\89æ\82¨ç\9a\84é\83µç®±ä½\8då\9d\80ã\80\82\né»\9eé\81¸ä»¥ä¸\8bæ\8c\89é\88\95å\8f¯å\90\91æ\82¨ç\9a\84é\83µç®±å\82³é\80\81ä¸\80å°\81確èª\8dé\83µä»¶ã\80\82該é\83µä»¶å\8c\85å\90«æ\9c\89ä¸\80è¡\8c代碼é\80£çµ\90ï¼\9b\nè«\8bå\9c¨æ\82¨ç\9a\84ç\80\8f覽å\99¨ä¸­è¼\89å\85¥æ­¤é\80£çµ\90以確èª\8dæ\82¨ç\9a\84é\83µç®±位址是有效的。",
+       "confirmemail_text": "{{SITENAME}}è¦\81æ±\82æ\82¨å\9c¨ä½¿ç\94¨é\83µä»¶å\8a\9fè\83½ä¹\8bå\89\8dé©\97è­\89æ\82¨ç\9a\84é\9b»å­\90é\83µä»¶ä½\8då\9d\80ã\80\82\né»\9eé\81¸ä»¥ä¸\8bæ\8c\89é\88\95å\8f¯å\90\91æ\82¨ç\9a\84é\9b»å­\90é\83µä»¶å\82³é\80\81ä¸\80å°\81確èª\8dé\83µä»¶ã\80\82該é\83µä»¶å\8c\85å\90«æ\9c\89ä¸\80è¡\8c代碼é\80£çµ\90ï¼\9b\nè«\8bå\9c¨æ\82¨ç\9a\84ç\80\8f覽å\99¨ä¸­è¼\89å\85¥æ­¤é\80£çµ\90以確èª\8dæ\82¨ç\9a\84é\9b»å­\90é\83µä»¶位址是有效的。",
        "confirmemail_pending": "確認碼已傳送至您的電子郵件,\n若您才剛建立好您的帳號,可能需要稍後幾分鐘才能收到。\n若沒有收到,請再重新申請一次確認碼。",
        "confirmemail_send": "電子郵件寄送確認代碼",
        "confirmemail_sent": "已寄出確認電子郵件。",
-       "confirmemail_oncreate": "一個確認代碼已經被傳送到您的郵箱。該代碼並不要求您進行登入,\n但若您要啟用在此 wiki 上的任何基於電子郵件的功能,您必須先提交此代碼。",
-       "confirmemail_sendfailed": "{{SITENAME}}ç\84¡æ³\95å\82³é\80\81確èª\8dé\83µä»¶ï¼\8cè«\8b檢æ\9f¥é\83µç®±位址是否包含非法字元。\n\n郵件傳送員回應: $1",
+       "confirmemail_oncreate": "確認代碼已傳送至您的電子郵件位址。\n登入動作不需要使用此代碼,但開啟在 Wiki 中任何以電子郵件為基礎的功能會需要先提供此代碼。",
+       "confirmemail_sendfailed": "{{SITENAME}}ç\84¡æ³\95å\82³é\80\81確èª\8dé\83µä»¶ï¼\8cè«\8b檢æ\9f¥é\9b»å­\90é\83µä»¶位址是否包含非法字元。\n\n郵件傳送員回應: $1",
        "confirmemail_invalid": "無效的確認碼,該代碼可能已經過期。",
        "confirmemail_needlogin": "請 $1 以確認您的電子郵件地址。",
-       "confirmemail_success": "æ\82¨ç\9a\84é\83µç®±已經被確認。您現在可以[[Special:UserLogin|登入]]並使用此網站了。",
+       "confirmemail_success": "æ\82¨ç\9a\84é\9b»å­\90é\83µä»¶已經被確認。您現在可以[[Special:UserLogin|登入]]並使用此網站了。",
        "confirmemail_loggedin": "已確認您的電子郵件地址。",
        "confirmemail_subject": "{{SITENAME}} 電子郵件地址確認",
        "confirmemail_body": "不明人士 (可能是您自己,來自 IP 位址 $1)  已在 {{SITENAME}} 註冊了一個帳號 \"$2\" 並使用了此電子郵件位址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_body_changed": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件位址更改至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_body_set": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件位址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
-       "confirmemail_invalidated": "已取消電子郵件址確認",
+       "confirmemail_invalidated": "已取消電子郵件址確認",
        "invalidateemail": "取消電子郵件確認",
        "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
        "scarytranscludefailed": "[樣版 $1 讀取失敗]",
        "deletedwhileediting": "<strong>警告:</strong>此頁在您開始編輯之後已經被刪除﹗",
        "confirmrecreate": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,原因為:\n: <em>$2</em>\n請確認您是否真的要重新建立此頁面。",
        "confirmrecreate-noreason": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,請確認您是否真的要重新建立此頁面。",
-       "recreate": "重",
+       "recreate": "重新建立",
        "confirm_purge_button": "確定",
-       "confirm-purge-top": "要清除此頁面的快取嗎?",
+       "confirm-purge-top": "要清除此頁面的快取嗎",
        "confirm-purge-bottom": "清理一頁將會清除快取以及強迫顯示最現時之修訂版本。",
        "confirm-watch-button": "確定",
        "confirm-watch-top": "新增此頁面至您的監視清單?",
        "table_pager_limit_label": "每頁筆數︰",
        "table_pager_limit_submit": "送出",
        "table_pager_empty": "沒有結果",
-       "autosumm-blank": "清空頁面",
+       "autosumm-blank": "空白的頁面",
        "autosumm-replace": "使用 \"$1\" 取代內容",
        "autoredircomment": "頁面已重新導向至 [[$1]]",
        "autosumm-new": "已建立頁面,內容為 \"$1\"",
-       "autosumm-newblank": "建立空白頁",
+       "autosumm-newblank": "建立空白頁",
        "size-bytes": "$1 位元組",
        "lag-warn-normal": "此清單可能不會顯示最近 $1 {{PLURAL:$1|秒}}內的變更。",
        "lag-warn-high": "由於資料庫回應延遲,此清單可能不會顯示最近 $1 {{PLURAL:$1|秒}}內的變更。",
        "version-extensions": "已安裝的擴充套件",
        "version-skins": "已安裝的外觀",
        "version-specialpages": "特殊頁面",
-       "version-parserhooks": "èª\9eæ³\95é\80£çµ\90(Hook)",
+       "version-parserhooks": "解æ\9e\90å\99¨é\80£çµ\90 (Hook)",
        "version-variables": "變數",
        "version-antispam": "垃圾訊息防止",
        "version-other": "其他",
        "version-mediahandlers": "媒體處理器",
-       "version-hooks": "連結(Hooks)",
-       "version-parser-extensiontags": "èª\9eæ³\95擴充標籤",
+       "version-hooks": "連結 (Hooks)",
+       "version-parser-extensiontags": "解æ\9e\90å\99¨擴充標籤",
        "version-parser-function-hooks": "語法函數連結",
        "version-hook-name": "連結名稱",
        "version-hook-subscribedby": "署名",
        "redirect-legend": "重新導向至檔案或頁面",
        "redirect-summary": "此特殊頁面可用來重新導向至檔案 (指定檔案名稱)、頁面 (指定修訂 ID 或頁面 ID) 或使用者頁面 (指定使用者 ID)。用法:[[{{#Special:Redirect}}/file/Example.jpg]]、[[{{#Special:Redirect}}/page/64308]]、[[{{#Special:Redirect}}/revision/328429]] 或 [[{{#Special:Redirect}}/user/101]]。",
        "redirect-submit": "執行",
-       "redirect-lookup": "尋找:",
+       "redirect-lookup": "查詢:",
        "redirect-value": "值:",
        "redirect-user": "使用者 ID",
        "redirect-page": "頁面 ID",
        "redirect-revision": "頁面修訂 ID",
        "redirect-file": "檔案名稱",
-       "redirect-not-exists": "æ\89¾ä¸\8då\88°",
+       "redirect-not-exists": "æ\9f¥ç\84¡å\80¼",
        "fileduplicatesearch": "搜尋重覆檔案",
-       "fileduplicatesearch-summary": "依據雜湊值(Hash)來搜尋重複的檔案。",
+       "fileduplicatesearch-summary": "依據雜湊值 (Hash) 來搜尋重複的檔案。",
        "fileduplicatesearch-legend": "搜尋重覆",
        "fileduplicatesearch-filename": "檔案名稱:",
        "fileduplicatesearch-submit": "搜尋",
        "specialpages-group-maintenance": "維護報表",
        "specialpages-group-other": "其它特殊頁面",
        "specialpages-group-login": "登入 / 建立帳號",
-       "specialpages-group-changes": "最近變更與日誌",
+       "specialpages-group-changes": "近期變更與日誌",
        "specialpages-group-media": "媒體上傳與報表",
        "specialpages-group-users": "使用者與權限",
        "specialpages-group-highuse": "常用頁面",
        "tag-filter-submit": "搜尋",
        "tag-list-wrapper": "([[Special:Tags|標籤]]:$2)",
        "tags-title": "標籤",
-       "tags-intro": "這個頁面列示出在軟件中已標示的編輯,以及它們的解釋。",
+       "tags-intro": "此頁面列出所有可用來標示編輯的標籤,以及這些標籤的含意。",
        "tags-tag": "標籤名稱",
        "tags-display-header": "在更改清單中的出現方式",
        "tags-description-header": "完整含意說明",
        "compare-rev1": "修訂 1",
        "compare-rev2": "修訂 2",
        "compare-submit": "比較",
-       "compare-invalid-title": "æ\89\80æ\8c\87å®\9a標題無效。",
-       "compare-title-not-exists": "æ\89\80æ\8c\87å®\9aç\9a\84話題不存在。",
-       "compare-revision-not-exists": "所指定的修訂不存在。",
+       "compare-invalid-title": "æ\82¨æ\89\80æ\8c\87å®\9aç\9a\84標題無效。",
+       "compare-title-not-exists": "æ\82¨æ\89\80æ\8c\87å®\9aç\9a\84æ¨\99題不存在。",
+       "compare-revision-not-exists": "æ\82¨æ\89\80æ\8c\87å®\9aç\9a\84ä¿®è¨\82ä¸\8då­\98å\9c¨ã\80\82",
        "dberr-problems": "抱歉!這個網站出現了一些技術上的問題。",
        "dberr-again": "嘗試等候數分鐘後,然後再試。",
        "dberr-info": "(無法連線資料庫伺服器:$1)",
        "dberr-info-hidden": "(無法連線資料庫伺服器)",
-       "dberr-usegoogle": "在現階段您可以嘗試透過 Google 搜尋。",
-       "dberr-outofdate": "留意他們索引出來之內容可能不是最新的。",
-       "dberr-cachederror": "這個是所要求出來的快取複本,可能不是最新的。",
-       "htmlform-invalid-input": "您輸入的內容存在問題",
+       "dberr-usegoogle": "您可以嘗試在此期間使用 Google 搜尋。",
+       "dberr-outofdate": "注意,它們用來建立索引的內容可能不是最新的。",
+       "dberr-cachederror": "這是請求面頁面的快取複本,可能不是最新的。",
+       "htmlform-invalid-input": "您的輸入的內容有問題。",
        "htmlform-select-badoption": "您所指定的值不是有效的選項。",
        "htmlform-int-invalid": "您所指定的值不是一個整數。",
        "htmlform-float-invalid": "您所指定的值不是一個數字。",
-       "htmlform-int-toolow": "您所指定的值低於最小值$1",
-       "htmlform-int-toohigh": "您所指定的值高於最大值$1",
-       "htmlform-required": "此值是必填項",
+       "htmlform-int-toolow": "您所指定的值低於最小值 $1。",
+       "htmlform-int-toohigh": "您所指定的值高於最大值 $1。",
+       "htmlform-required": "此值為必填。",
        "htmlform-submit": "送出",
        "htmlform-reset": "還原更改",
        "htmlform-selectorother-other": "其他",
        "htmlform-no": "否",
        "htmlform-yes": "是",
-       "htmlform-chosen-placeholder": "選項",
+       "htmlform-chosen-placeholder": "謮選擇一個選項",
        "htmlform-cloner-create": "新增更多",
        "htmlform-cloner-delete": "移除",
        "htmlform-cloner-required": "至少必須填寫一筆資料。",
-       "sqlite-has-fts": "帶全文搜尋的版本$1",
-       "sqlite-no-fts": "不帶全文搜尋的版本$1",
+       "sqlite-has-fts": "$1 且支援全文搜尋",
+       "sqlite-no-fts": "$1 且不支援全文搜尋",
        "logentry-delete-delete": "$1 刪除頁面 $3",
        "logentry-delete-restore": "$1 還原頁面 $3",
        "logentry-delete-event": "$1 {{GENDER:$2|已更改}} $3 中 {{PLURAL:$5|1 筆日誌|$5 筆日誌}}的可見性:$4",
        "logentry-suppress-revision": "$1 {{GENDER:$2|已暗中更改}}頁面 $3 中 {{PLURAL:$5|1 筆修訂|$5 筆修訂}}的可見性:$4",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|已暗中更改}} $3 中日誌的可見性",
        "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|已暗中更改}}頁面 $3 中修訂的可見性",
-       "revdelete-content-hid": "隱藏內容",
-       "revdelete-summary-hid": "隱藏編輯摘要",
+       "revdelete-content-hid": "隱藏內容",
+       "revdelete-summary-hid": "己隱藏摘要",
        "revdelete-uname-hid": "隱藏使用者名稱",
        "revdelete-content-unhid": "取消隱藏內容",
        "revdelete-summary-unhid": "取消隱藏編輯摘要",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|上傳了}}新版本的 $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|已上傳}} $3",
        "rightsnone": "(無)",
+       "revdelete-summary": "編輯摘要",
        "feedback-bugornote": "如果您準備要詳細描述一個技術問題,請至 [$1 回報問題]。\n或您可以使用以下的簡易表單回報問題,您的使用者名稱與評論將被新增到頁面 \"[$3 $2]\"。",
        "feedback-subject": "主旨:",
        "feedback-message": "訊息:",
        "feedback-cancel": "取消",
-       "feedback-submit": "送出回饋",
-       "feedback-adding": "正在頁面添加反饋...",
-       "feedback-error1": "錯誤:從API返回無法識別的結果",
+       "feedback-submit": "送出意見回饋",
+       "feedback-adding": "正在新增意見回饋至頁面...",
+       "feedback-error1": "錯誤:無法識別 API 回傳的結果",
        "feedback-error2": "錯誤:編輯失敗",
-       "feedback-error3": "錯誤:API 沒有應",
-       "feedback-thanks": "謝謝!您的反饋已被發布到頁面“[$2 $1]”。",
+       "feedback-error3": "錯誤:API 沒有應",
+       "feedback-thanks": "感謝!您的意見回饋已發佈到頁面 \"[$2 $1]\"。",
        "feedback-close": "完成",
-       "feedback-bugcheck": "請檢查此bug是否為[$1 已知bug]。",
-       "feedback-bugnew": "我已經檢查過。報告一個新的bug",
+       "feedback-bugcheck": "很好! 檢查一下您的意見是不是已經被列為 [$1 已知問題]。",
+       "feedback-bugnew": "我已經檢查。 回報新問題",
        "searchsuggest-search": "搜尋",
        "searchsuggest-containing": "包含...",
        "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-badtoken": "內部錯誤:密鑰錯誤。",
+       "api-error-copyuploaddisabled": "此伺服器已停用使用 URL 上傳檔案的功能。",
+       "api-error-duplicate": "在網站上已有相同內容的{{PLURAL:$1|[$2 其他檔案]|[$2 其他檔案]}}。",
+       "api-error-duplicate-archive": "在網站上曾有相同內容的{{PLURAL:$1|[$2 其他檔案]|[$2 其他檔案]}},但已被刪除。",
+       "api-error-duplicate-archive-popup-title": "重複的{{PLURAL:$1|檔案}}已經被刪除。",
        "api-error-duplicate-popup-title": "重複的{{PLURAL:$1|檔案}}。",
-       "api-error-empty-file": "您提交的檔案是空的。",
-       "api-error-emptypage": "不許創建沒有內容的新頁面。",
-       "api-error-fetchfileerror": "內部錯誤:獲取檔案時發生錯誤。",
-       "api-error-fileexists-forbidden": "以\" $1 \"命名的檔案已經存在,並且不能被重寫。",
-       "api-error-fileexists-shared-forbidden": "以\" $1 \"命名的檔案已經存在於共用檔案儲存庫上,並且不能被重寫。",
-       "api-error-file-too-large": "您提交的檔案太大了。",
-       "api-error-filename-tooshort": "檔案名過短。",
-       "api-error-filetype-banned": "這種類型的檔案是被禁止的。",
-       "api-error-filetype-banned-type": "$1{{PLURAL:$4|不是允許的檔案類型}}。  允許的{{PLURAL:$3|檔案類型是}} $2。",
-       "api-error-filetype-missing": "æ\9c¬æª\94æ¡\88缺å°\91äº\86副檔名。",
-       "api-error-hookaborted": "你試圖進行的修改被一個擴展鉤子終止。",
-       "api-error-http": "內部錯誤:無法連到伺服器。",
-       "api-error-illegal-filename": "æª\94æ¡\88å\90\8dä¸\8då\85\81許ã\80\82",
+       "api-error-empty-file": "您送出的檔案是空的。",
+       "api-error-emptypage": "不允許建立空白的頁面。",
+       "api-error-fetchfileerror": "內部錯誤:取得檔案時發生錯誤。",
+       "api-error-fileexists-forbidden": "名稱為 \"$1\" 的檔案已經存在,並且不能被覆寫。",
+       "api-error-fileexists-shared-forbidden": "名稱為 \"$1\" 的檔案已經存在於共用儲存庫,並且不能被覆寫。",
+       "api-error-file-too-large": "您送出的檔案太大了。",
+       "api-error-filename-tooshort": "檔案名過短。",
+       "api-error-filetype-banned": "此檔案類型已禁止使用。",
+       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|不是允許的檔案類型}}。 允許的{{PLURAL:$3|檔案類型有}} $2。",
+       "api-error-filetype-missing": "æ­¤æª\94æ¡\88å\90\8d稱缺å°\91副檔名。",
+       "api-error-hookaborted": "您嘗試進行的修改被某個擴充套件中止。",
+       "api-error-http": "內部錯誤:無法連到伺服器。",
+       "api-error-illegal-filename": "ä¸\8då\85\81許使ç\94¨ç\9a\84æª\94æ¡\88å\90\8d稱ã\80\82",
        "api-error-internal-error": "內部錯誤:此 Wiki 在處理你的上傳時發生錯誤。",
-       "api-error-invalid-file-key": "內部錯誤:於臨時儲存庫中查無檔案。",
-       "api-error-missingparam": "內部錯誤:請求缺少參數。",
-       "api-error-missingresult": "內部錯誤:無法確定複製是否成功。",
-       "api-error-mustbeloggedin": "您必須登入後再上傳檔案。",
-       "api-error-mustbeposted": "內部錯誤:請求需 HTTP POST。",
-       "api-error-noimageinfo": "上傳成功,但伺服器沒有給我們任何該檔案的資訊。",
-       "api-error-nomodule": "內部錯誤:缺少上傳模集。",
-       "api-error-ok-but-empty": "內部錯誤:伺服器沒有應。",
-       "api-error-overwrite": "不允許覆蓋現有檔案。",
-       "api-error-stashfailed": "內部錯誤:伺服器儲存臨時檔案失敗。",
-       "api-error-publishfailed": "內部錯誤:伺服器發佈臨時檔案失敗。",
-       "api-error-stasherror": "上載檔案存檔時出錯。",
+       "api-error-invalid-file-key": "內部錯誤:於暫存儲存庫中查無檔案。",
+       "api-error-missingparam": "內部錯誤:請求缺少參數。",
+       "api-error-missingresult": "內部錯誤:無法辨識複製是否成功。",
+       "api-error-mustbeloggedin": "您必須登入方可上傳檔案。",
+       "api-error-mustbeposted": "內部錯誤:請求需使用 HTTP POST。",
+       "api-error-noimageinfo": "已成功上傳,但伺服器未回應任何該檔案的資訊。",
+       "api-error-nomodule": "內部錯誤:缺少上傳模集。",
+       "api-error-ok-but-empty": "內部錯誤:伺服器沒有應。",
+       "api-error-overwrite": "不允許覆蓋已存在的檔案。",
+       "api-error-stashfailed": "內部錯誤:伺服器儲存暫存檔案失敗。",
+       "api-error-publishfailed": "內部錯誤:伺服器發佈暫存檔案失敗。",
+       "api-error-stasherror": "上傳檔案至儲存庫時發生錯誤。",
        "api-error-timeout": "伺服器沒有在預期的時間內回應。",
-       "api-error-unclassified": "發生未知錯誤。",
-       "api-error-unknown-code": "未知錯誤:$1",
-       "api-error-unknown-error": "å\85§é\83¨é\8c¯èª¤ï¼\9aå\98\97試ä¸\8aå\82³æª\94æ¡\88æ\99\82å\87ºé\8c¯。",
-       "api-error-unknown-warning": "未知的警告:$1",
-       "api-error-unknownerror": "未知錯誤:$1。",
-       "api-error-uploaddisabled": "æ\9c¬wikiç\9a\84ä¸\8aå\82³æª\94æ¡\88功能已停用。",
-       "api-error-verification-error": "æ\9c¬檔案可能已損壞,或副檔名錯誤。",
+       "api-error-unclassified": "發生不明錯誤。",
+       "api-error-unknown-code": "不明錯誤:\"$1\"。",
+       "api-error-unknown-error": "å\85§é\83¨é\8c¯èª¤ï¼\9aå\98\97試ä¸\8aå\82³æ\82¨ç\9a\84æª\94æ¡\88æ\99\82ç\99¼ç\94\9fé\8c¯èª¤。",
+       "api-error-unknown-warning": "不明警告:\"$1\"。",
+       "api-error-unknownerror": "不明錯誤:\"$1\"。",
+       "api-error-uploaddisabled": "æ­¤ Wiki ç\9a\84ä¸\8aå\82³功能已停用。",
+       "api-error-verification-error": "æ­¤檔案可能已損壞,或副檔名錯誤。",
        "duration-seconds": "$1 秒",
        "duration-minutes": "$1 分鐘",
        "duration-hours": "$1 小時",
        "duration-decades": "$1{{PLURAL:$1|0 年|0 年}}",
        "duration-centuries": "$1 世紀",
        "duration-millennia": "$1 千年",
-       "rotate-comment": "順時針旋轉圖像$1{{PLURAL:$1|度}}",
-       "limitreport-title": "析器分析資料:",
+       "rotate-comment": "已順時針旋轉圖片 $1 {{PLURAL:$1|度|度}}",
+       "limitreport-title": "析器分析資料:",
        "limitreport-cputime": "CPU 使用時間",
        "limitreport-cputime-value": "$1 秒",
        "limitreport-walltime": "實際使用時間",
        "limitreport-walltime-value": "$1 秒",
-       "limitreport-ppvisitednodes": "預處理機訪問節點次數",
+       "limitreport-ppvisitednodes": "預處理器已訪問節點計數",
        "limitreport-ppgeneratednodes": "預處理器產生節點次數",
        "limitreport-postexpandincludesize": "展開後的引用大小",
        "limitreport-postexpandincludesize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-templateargumentsize": "樣版參數大小",
        "limitreport-templateargumentsize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-expansiondepth": "最高展開深度",
-       "limitreport-expensivefunctioncount": "高分析函數次數",
+       "limitreport-expensivefunctioncount": "高消耗解析器函數次數",
        "expandtemplates": "展開樣版",
-       "expand_templates_intro": "本特殊頁面會將文字中的樣版展開,可以包含支援的分析程式語法,如 <code><nowiki>{{</nowiki>#language:…}}</code> 與變數如 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,絕大部分在雙括號中的內容都會被展開。",
+       "expand_templates_intro": "本特殊頁面會將文字中的樣版展開,可以包含支援的解析器語法,如 <code><nowiki>{{</nowiki>#language:…}}</code> 與變數如 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,絕大部分在雙括號中的內容都會被展開。",
        "expand_templates_title": "上下文標題,用於 {{FULLPAGENAME}} 等:",
        "expand_templates_input": "輸入文字:",
        "expand_templates_output": "結果",
        "right-pagelang": "更改頁面語言",
        "action-pagelang": "更改頁面語言",
        "log-name-pagelang": "更改語言日誌",
-       "log-description-pagelang": "這是頁面語言更改日誌。",
+       "log-description-pagelang": "此頁為頁面語言的變更日誌。",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|已更改}}頁面 $3 的語言從 $4 到 $5。",
-       "default-skin-not-found": "注意! 此維基預設的介面(<code>$wgDefaultSkin</code>), <code>$1</code>目前無法使用.",
+       "default-skin-not-found": "哎呀!您於 <code dir=\"ltr\">$wgDefaultSkin</code> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您的安裝程序應包含以下外觀。 請參考 [https://www.mediawiki.org/wiki/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何開啟外觀並設為預設值的資訊。\n\n$2\n\n; 若您才剛安裝完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。 您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 透過 git 複製 <code>mediawiki/skins/*</code> 儲存庫中其中一個外觀到您安裝的 MediaWiki <code dir=\"ltr\">skins/</code> 目錄中。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。\n\n; 若您才剛升級 MediaWiki:\n: MediaWiki 1.24 與較新的版本不再自動開啟已安裝的外觀 (請參考 [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 操作手冊:外觀自動搜尋])。 您可以將下列行貼上至 <code>LocalSettings.php</code> 來開啟所有目前已經安裝的外觀:\n\n<pre dir=\"ltr\">$3</pre>\n\n; 若您才剛修改 <code>LocalSettings.php</code>:\n: 請再次確認您輸入的外觀名稱是否有誤。",
+       "default-skin-not-found-no-skins": "哎呀!您於 <code>$wgDefaultSkin</code> 設定的 Wiki 預設外觀 <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 安裝程式],該程式包含數個外觀與擴充套件。 您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 透過 git 複製 <code>mediawiki/skins/*</code> 儲存庫中其中一個外觀到您安裝的 MediaWiki <code dir=\"ltr\">skins/</code> 目錄中。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。 請參考 [https://www.mediawiki.org/wiki/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何開啟外觀並設為預設值的資訊。",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (已開啟)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''已關閉''')"
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''已停用''')",
+       "mediastatistics": "媒體統計資訊",
+       "mediastatistics-summary": "已上傳檔案類型的統計資訊,此報表僅統計檔案的最新版本,不包含舊的或已刪除的版本。",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 位元組|$1 位元組}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME 類型",
+       "mediastatistics-table-extensions": "可用的副檔名",
+       "mediastatistics-table-count": "檔案數量",
+       "mediastatistics-table-totalbytes": "大小總計",
+       "mediastatistics-header-unknown": "不明",
+       "mediastatistics-header-bitmap": "點陣圖",
+       "mediastatistics-header-drawing": "繪圖 (向量圖)",
+       "mediastatistics-header-audio": "音訊",
+       "mediastatistics-header-video": "影片",
+       "mediastatistics-header-multimedia": "豐富多媒體",
+       "mediastatistics-header-office": "辦公",
+       "mediastatistics-header-text": "純文字",
+       "mediastatistics-header-executable": "可執行",
+       "mediastatistics-header-archive": "已壓縮格式",
+       "json-warn-trailing-comma": "已移除 $1 個 JSON 結尾的{{PLURAL:$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": "下列的資料型態無法被編碼"
 }
index a8190b3..84eb922 100644 (file)
@@ -139,6 +139,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'MeesteWysigings' ),
        'Movepage'                  => array( 'Skuif_bladsy', 'Skuifbladsy' ),
        'Mycontributions'           => array( 'Mybydrae' ),
+       'MyLanguage'                => array( 'MyTaal' ),
        'Mypage'                    => array( 'MyBladsy' ),
        'Mytalk'                    => array( 'Mybespreking', 'Mybesprekings' ),
        'Newimages'                 => array( 'Nuwe_beelde', 'Nuwebeelde', 'Nuwe_lêers', 'Nuwelêers' ),
index dd9b06f..3872f1c 100644 (file)
@@ -357,6 +357,7 @@ $specialPageAliases = array(
        'Mycontributions'           => array( 'مساهماتي' ),
        'Mypage'                    => array( 'صفحتي' ),
        'Mytalk'                    => array( 'نقاشي' ),
+       'MyLanguage'                => array( 'لغتي' ),
        'Myuploads'                 => array( 'رفوعاتي' ),
        'Newimages'                 => array( 'ملفات_جديدة', 'صور_جديدة' ),
        'Newpages'                  => array( 'صفحات_جديدة' ),
index cd514d3..2247b36 100644 (file)
@@ -64,6 +64,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'ܬܢܝ̈ܬܐ_ܝܬܝܪ_ܡܢ_ܟܠ' ),
        'Movepage'                  => array( 'ܫܢܝ_ܦܐܬܐ' ),
        'Mycontributions'           => array( 'ܫܘܬܦܘ̈ܬܝ' ),
+       'MyLanguage'                => array( 'ܠܫܢܐ_ܕܝܠܝ' ),
        'Mypage'                    => array( 'ܦܐܬܐ_ܕܝܠܝ' ),
        'Mytalk'                    => array( 'ܡܡܠܠܐ_ܕܝܠܝ' ),
        'Myuploads'                 => array( 'ܐܣܩ̈ܬܐ_ܕܝܠܝ' ),
index 8e2b71f..09fd319 100644 (file)
@@ -83,6 +83,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'اكتر_مراجعات' ),
        'Movepage'                  => array( 'نقل_صفحه' ),
        'Mycontributions'           => array( 'مساهماتى' ),
+       'MyLanguage'                => array( 'اللغة_بتاعتى' ),
        'Mypage'                    => array( 'صفحتى' ),
        'Mytalk'                    => array( 'مناقشتى' ),
        'Newimages'                 => array( 'فايلات_جديده', 'صور_جديده' ),
index 3d6e1f2..9afe020 100644 (file)
@@ -98,6 +98,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIMEMIMEmmmgM_অনুসন্ধান' ),
        'Movepage'                  => array( 'পৃষ্ঠা_স্থানান্তৰ' ),
        'Mycontributions'           => array( 'মোৰ_বৰঙনি' ),
+       'MyLanguage'                => array( 'মোৰ_ভাষা' ),
        'Mypage'                    => array( 'মোৰ_পৃষ্ঠা' ),
        'Mytalk'                    => array( 'মোৰ_কথোপকথন' ),
        'Myuploads'                 => array( 'মোৰ_আপল’ডসমূহ' ),
index 88d8d6e..07246a4 100644 (file)
@@ -92,6 +92,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Paubahan_pambanyaknya' ),
        'Movepage'                  => array( 'Pindahakan_tungkaran' ),
        'Mycontributions'           => array( 'Sumbangan_ulun' ),
+       'MyLanguage'                => array( 'Bahasa_ulun' ),
        'Mypage'                    => array( 'Tungkaran_ulun' ),
        'Mytalk'                    => array( 'Pamandiran_ulun' ),
        'Myuploads'                 => array( 'Unggahan_ulun' ),
index 7824ba4..222399e 100644 (file)
@@ -66,6 +66,7 @@ $specialPageAliases = array(
        'Mostlinkedtemplates'       => array( 'PatromoùImplijetañ' ),
        'Movepage'                  => array( 'AdkasPajenn' ),
        'Mycontributions'           => array( 'MaDegasadennoù' ),
+       'MyLanguage'                => array( 'MaYezh' ),
        'Mypage'                    => array( 'MaFajenn' ),
        'Mytalk'                    => array( 'MaC\'haozeadennoù' ),
        'Newimages'                 => array( 'RestroùNevez', 'SkeudennoùNevez' ),
index 2259641..f9a58ca 100644 (file)
@@ -55,6 +55,7 @@ $specialPageAliases = array(
        'ComparePages'              => array( 'Хуудаһа_харисуулха' ),
        'Confirmemail'              => array( 'Сахим_хаяг_баталха' ),
        'CreateAccount'             => array( 'Данса_үүсхэхэ' ),
+       'MyLanguage'                => array( 'Минии_хэлэн' ),
        'Mypage'                    => array( 'Минии_хуудаһан' ),
        'Mytalk'                    => array( 'Минии_хэлэлсэл' ),
        'Myuploads'                 => array( 'Минии_ашаалһан_зүйл' ),
index c9b8a86..fb61b4a 100644 (file)
@@ -80,6 +80,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( '最稠其版本' ),
        'Movepage'                  => array( '移動其頁面' ),
        'Mycontributions'           => array( '我其貢獻' ),
+       'MyLanguage'                => array( '我其語言' ),
        'Mypage'                    => array( '我其頁面' ),
        'Mytalk'                    => array( '我其討論' ),
        'Myuploads'                 => array( '我其上傳' ),
index d8e07ae..2babb83 100644 (file)
@@ -117,6 +117,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Сих_сиха_нисйина_йолу_агӀонаш' ),
        'Movepage'                  => array( 'АгӀона_цӀе_хийцар' ),
        'Mycontributions'           => array( 'Сан_къинхьегам' ),
+       'MyLanguage'                => array( 'Сан_мотт' ),
        'Mypage'                    => array( 'Сан_агӀо' ),
        'Mytalk'                    => array( 'Сан_дийцаре' ),
        'Myuploads'                 => array( 'Сан_файлаш' ),
index dd19174..6595543 100644 (file)
@@ -8,10 +8,8 @@
  *
  */
 
-$linkPrefixExtension = true;
-$fallback8bitEncoding = 'windows-1256';
-
 $rtl = true;
+$fallback8bitEncoding = 'windows-1256';
 
 $namespaceNames = array(
        NS_MEDIA            => 'میدیا',
@@ -173,3 +171,4 @@ $dateFormats = array(
        'hijri both' => '‏H:i، xmjی xmFی xmY',
 );
 
+$linkTrail = "/^([ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆهھەیێ‌]+)(.*)$/sDu";
index 1d97c23..95f1719 100644 (file)
@@ -91,6 +91,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Meistbearbeitete_Seiten' ),
        'Movepage'                  => array( 'Verschieben' ),
        'Mycontributions'           => array( 'Meine_Beiträge' ),
+       'MyLanguage'                => array( 'Meine_Sprache' ),
        'Mypage'                    => array( 'Meine_Benutzerseite' ),
        'Mytalk'                    => array( 'Meine_Diskussionsseite' ),
        'Myuploads'                 => array( 'Meine_hochgeladenen_Dateien' ),
index 12d3b96..70e4de3 100644 (file)
@@ -106,6 +106,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'TewrvéşiRevizyon' ),
        'Movepage'                  => array( 'PelerBeré' ),
        'Mycontributions'           => array( 'DekerdenéMe' ),
+       'MyLanguage'                => array( 'ZıwaneMe' ),
        'Mypage'                    => array( 'PeréMe' ),
        'Mytalk'                    => array( 'VatenayışéMe' ),
        'Myuploads'                 => array( 'BarkerdışéMe' ),
index c6bcc46..a6a64f6 100644 (file)
@@ -108,6 +108,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'ΠερισσότεροΕπεξεργασίες' ),
        'Movepage'                  => array( 'ΜετακίνησηΣελίδας' ),
        'Mycontributions'           => array( 'ΟιΣυνεισφορέςΜου' ),
+       'MyLanguage'                => array( 'ΗΓλώσσαΜου' ),
        'Mypage'                    => array( 'ΗΣελίδαΜου' ),
        'Mytalk'                    => array( 'ΗΣυζήτησήΜου' ),
        'Myuploads'                 => array( 'ΟιΕπιφορτώσειςΜου' ),
index ccdd310..c210b17 100644 (file)
@@ -388,6 +388,7 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'AllMessages' ),
        'AllMyUploads'              => array( 'AllMyUploads', 'AllMyFiles' ),
        'Allpages'                  => array( 'AllPages' ),
+       'ApiHelp'                   => array( 'ApiHelp' ),
        'Ancientpages'              => array( 'AncientPages' ),
        'Badtitle'                  => array( 'Badtitle' ),
        'Blankpage'                 => array( 'BlankPage' ),
@@ -428,6 +429,7 @@ $specialPageAliases = array(
        'Log'                       => array( 'Log', 'Logs' ),
        'Lonelypages'               => array( 'LonelyPages', 'OrphanedPages' ),
        'Longpages'                 => array( 'LongPages' ),
+       'MediaStatistics'           => array( 'MediaStatistics' ),
        'MergeHistory'              => array( 'MergeHistory' ),
        'MIMEsearch'                => array( 'MIMESearch' ),
        'Mostcategories'            => array( 'MostCategories' ),
@@ -512,16 +514,16 @@ $linkPrefixCharset = 'a-zA-Z\\x{80}-\\x{10ffff}';
  * basis if needed.
  */
 $imageFiles = array(
-       'button-bold'     => 'button_bold.png',
-       'button-italic'   => 'button_italic.png',
-       'button-link'     => 'button_link.png',
-       'button-extlink'  => 'button_extlink.png',
-       'button-headline' => 'button_headline.png',
-       'button-image'    => 'button_image.png',
-       'button-media'    => 'button_media.png',
-       'button-nowiki'   => 'button_nowiki.png',
-       'button-sig'      => 'button_sig.png',
-       'button-hr'       => 'button_hr.png',
+       'button-bold'     => 'en/button_bold.png',
+       'button-italic'   => 'en/button_italic.png',
+       'button-link'     => 'en/button_link.png',
+       'button-extlink'  => 'en/button_extlink.png',
+       'button-headline' => 'en/button_headline.png',
+       'button-image'    => 'en/button_image.png',
+       'button-media'    => 'en/button_media.png',
+       'button-nowiki'   => 'en/button_nowiki.png',
+       'button-sig'      => 'en/button_sig.png',
+       'button-hr'       => 'en/button_hr.png',
 );
 
 /**
@@ -535,7 +537,7 @@ $preloadedMessages = array(
        'accesskey-ca-history',
        'accesskey-ca-nstab-main',
        'accesskey-ca-talk',
-       'accesskey-ca-view',
+       'accesskey-ca-viewsource',
        'accesskey-n-currentevents',
        'accesskey-n-help',
        'accesskey-n-mainpage-description',
@@ -544,15 +546,19 @@ $preloadedMessages = array(
        'accesskey-n-recentchanges',
        'accesskey-p-logo',
        'accesskey-pt-login',
+       'accesskey-pt-createaccount',
        'accesskey-search',
        'accesskey-search-fulltext',
        'accesskey-search-go',
        'accesskey-t-permalink',
+       'accesskey-t-print',
        'accesskey-t-recentchangeslinked',
        'accesskey-t-specialpages',
        'accesskey-t-whatlinkshere',
        'actions',
        'anonnotice',
+       'brackets',
+       'comma-separator',
        'currentevents',
        'currentevents-url',
        'disclaimerpage',
@@ -574,7 +580,6 @@ $preloadedMessages = array(
        'navigation',
        'nav-login-createaccount',
        'nstab-main',
-       'nstab-talk',
        'opensearch-desc',
        'pagecategories',
        'pagecategorieslink',
@@ -596,6 +601,7 @@ $preloadedMessages = array(
        'search',
        'searcharticle',
        'searchbutton',
+       'searchsuggest-search',
        'sidebar',
        'navigation-heading',
        'site-atom-feed',
@@ -608,7 +614,7 @@ $preloadedMessages = array(
        'tooltip-ca-history',
        'tooltip-ca-nstab-main',
        'tooltip-ca-talk',
-       'tooltip-ca-view',
+       'tooltip-ca-viewsource',
        'tooltip-n-currentevents',
        'tooltip-n-help',
        'tooltip-n-mainpage-description',
@@ -616,13 +622,13 @@ $preloadedMessages = array(
        'tooltip-n-randompage',
        'tooltip-n-recentchanges',
        'tooltip-p-logo',
-       'tooltip-p-navigation',
-       'tooltip-p-tb',
        'tooltip-pt-login',
+       'tooltip-pt-createaccount',
        'tooltip-search',
        'tooltip-search-fulltext',
        'tooltip-search-go',
        'tooltip-t-permalink',
+       'tooltip-t-print',
        'tooltip-t-recentchangeslinked',
        'tooltip-t-specialpages',
        'tooltip-t-whatlinkshere',
@@ -633,5 +639,6 @@ $preloadedMessages = array(
        'viewcount',
        'views',
        'whatlinkshere',
+       'word-separator',
 );
 
index 49f3ae9..05f3be8 100644 (file)
@@ -101,6 +101,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Plej_multaj_revizioj' ),
        'Movepage'                  => array( 'Alinomigi_paĝon' ),
        'Mycontributions'           => array( 'Miaj_kontribuoj', 'MiajKontribuoj' ),
+       'MyLanguage'                => array( 'Mia_lingvo' ),
        'Mypage'                    => array( 'Mia_paĝo', 'MiaPaĝo' ),
        'Mytalk'                    => array( 'Mia_diskutpaĝo', 'MiaDiskutpaĝo' ),
        'Myuploads'                 => array( 'Miaj_alŝutaĵoj' ),
index 2b4b8b9..e872d4e 100644 (file)
@@ -89,6 +89,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'MásEdiciones', 'Más_ediciones' ),
        'Movepage'                  => array( 'MoverPágina', 'Mover_página' ),
        'Mycontributions'           => array( 'MisContribuciones', 'Mis_contribuciones' ),
+       'MyLanguage'                => array( 'MiIdioma', 'Mi_idioma' ),
        'Mypage'                    => array( 'MiPágina', 'Mi_página' ),
        'Mytalk'                    => array( 'MiDiscusión', 'Mi_discusión' ),
        'Myuploads'                 => array( 'MisArchivosSubidos' ),
index da3eb7a..9fd3123 100644 (file)
@@ -92,6 +92,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'بیشترین_نسخه' ),
        'Movepage'                  => array( 'انتقال_صفحه' ),
        'Mycontributions'           => array( 'مشارکت‌های_من' ),
+       'MyLanguage'                => array( 'زبان‌های_من' ),
        'Mypage'                    => array( 'صفحه_من' ),
        'Mytalk'                    => array( 'بحث_من' ),
        'Myuploads'                 => array( 'بارگذاری‌های_من' ),
index 50558ee..ed4c90a 100644 (file)
@@ -84,6 +84,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Muokatuimmat_sivut' ),
        'Movepage'                  => array( 'Siirrä_sivu' ),
        'Mycontributions'           => array( 'Omat_muokkaukset' ),
+       'MyLanguage'                => array( 'Oma_kieli' ),
        'Mypage'                    => array( 'Oma_sivu' ),
        'Mytalk'                    => array( 'Oma_keskustelu' ),
        'Myuploads'                 => array( 'Omat_tiedostot' ),
index cd5359b..5e406da 100644 (file)
@@ -92,6 +92,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Pages_les_plus_modifiées', 'PagesLesPlusModifiées', 'Pages_les_plus_modifiees', 'PagesLesPlusModifiees', 'Les_plus_modifiés', 'LesPlusModifiés', 'Les_plus_modifies', 'LesPlusModifies' ),
        'Movepage'                  => array( 'Renommer_une_page', 'Renommer', 'Renommage' ),
        'Mycontributions'           => array( 'Mes_contributions', 'Mescontributions' ),
+       'MyLanguage'                => array( 'MaLangue', 'Ma_langue' ),
        'Mypage'                    => array( 'Ma_page', 'Mapage' ),
        'Mytalk'                    => array( 'Mes_discussions', 'Mesdiscussions' ),
        'Newimages'                 => array( 'Nouveaux_fichiers', 'NouveauxFichiers', 'Nouvelles_images', 'NouvellesImages' ),
index 7cbe696..d165495 100644 (file)
@@ -60,6 +60,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Syte_wo_am_meischte_bearbeitet_sin' ),
        'Movepage'                  => array( 'Verschiebe' ),
        'Mycontributions'           => array( 'Myyni_Byytreeg' ),
+       'MyLanguage'                => array( 'Myyni_Sprooch' ),
        'Mypage'                    => array( 'Myyni_Benutzersyte' ),
        'Mytalk'                    => array( 'Myyni_Diskussionssyte' ),
        'Myuploads'                 => array( 'Dateie_wonni_uffeglade_han' ),
index 60f9bf8..0852f44 100644 (file)
@@ -95,6 +95,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'הגרסאות_הרבות_ביותר', 'הדפים_בעלי_מספר_העריכות_הגבוה_ביותר' ),
        'Movepage'                  => array( 'העברת_דף', 'העברה' ),
        'Mycontributions'           => array( 'התרומות_שלי' ),
+       'MyLanguage'                => array( 'השפה_שלי' ),
        'Mypage'                    => array( 'הדף_שלי', 'דף_המשתמש_שלי' ),
        'Mytalk'                    => array( 'השיחה_שלי', 'דף_השיחה_שלי' ),
        'Myuploads'                 => array( 'ההעלאות_שלי' ),
index 38e5b0a..22219b2 100644 (file)
@@ -99,6 +99,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Strony_z_najwjace_wersijemi' ),
        'Movepage'                  => array( 'Přesunyć' ),
        'Mycontributions'           => array( 'Moje_přinoški' ),
+       'MyLanguage'                => array( 'Moja_rěč' ),
        'Mypage'                    => array( 'Moja_wužiwarska_strona' ),
        'Mytalk'                    => array( 'Moja_diskusijna_strona' ),
        'Newimages'                 => array( 'Nowe_dataje' ),
index 5e4b1e4..18e4a2d 100644 (file)
@@ -86,6 +86,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'PlisRevizyon' ),
        'Movepage'                  => array( 'DeplasePaj' ),
        'Mycontributions'           => array( 'KontribisyonM' ),
+       'MyLanguage'                => array( 'LangMwen' ),
        'Mypage'                    => array( 'PajMwen' ),
        'Mytalk'                    => array( 'DiskisyonM' ),
        'Myuploads'                 => array( 'ChajmanM' ),
index 744ac9d..0d4fd18 100644 (file)
@@ -85,6 +85,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Le_plus_versiones' ),
        'Movepage'                  => array( 'Renominar_pagina' ),
        'Mycontributions'           => array( 'Mi_contributiones' ),
+       'MyLanguage'                => array( 'Mi_lingua' ),
        'Mypage'                    => array( 'Mi_pagina' ),
        'Mytalk'                    => array( 'Mi_discussion' ),
        'Myuploads'                 => array( 'Mi_files_incargate' ),
index 4ea207d..dc2ea35 100644 (file)
@@ -245,6 +245,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Perubahan_terbanyak', 'PerubahanTerbanyak' ),
        'Movepage'                  => array( 'Pindahkan_halaman', 'PindahkanHalaman' ),
        'Mycontributions'           => array( 'Kontribusi_saya', 'KontribusiSaya' ),
+       'MyLanguage'                => array( 'Bahasa_saya' ),
        'Mypage'                    => array( 'Halaman_saya', 'HalamanSaya' ),
        'Mytalk'                    => array( 'Pembicaraan_saya', 'PembicaraanSaya' ),
        'Myuploads'                 => array( 'Unggahan_saya' ),
index b3f301b..7c0f1a7 100644 (file)
@@ -101,6 +101,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'PagineConPiùRevisioni' ),
        'Movepage'                  => array( 'Sposta', 'Rinomina' ),
        'Mycontributions'           => array( 'MieiContributi' ),
+       'MyLanguage'                => array( 'MiaLingua' ),
        'Mypage'                    => array( 'MiaPaginaUtente', 'MiaPagina' ),
        'Mytalk'                    => array( 'MieDiscussioni' ),
        'Myuploads'                 => array( 'MieiUpload', 'MieiEdit' ),
index ebb52ce..aef8dad 100644 (file)
@@ -111,6 +111,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( '編集履歴の多いページ', '版の多い項目', '版の多いページ' ),
        'Movepage'                  => array( '移動', 'ページの移動' ),
        'Mycontributions'           => array( '自分の投稿記録' ),
+       'MyLanguage'                => array( '自分の言語' ),
        'Mypage'                    => array( '利用者ページ', 'マイページ', 'マイ・ページ' ),
        'Mytalk'                    => array( 'トークページ', '会話ページ', 'マイトーク', 'マイ・トーク' ),
        'Myuploads'                 => array( '自分のアップロード記録' ),
index 1006422..598f101 100644 (file)
@@ -73,6 +73,7 @@ $specialPageAliases = array(
        'Longpages'                 => array( 'გრძელი_გვერდები' ),
        'Movepage'                  => array( 'გვერდის_გადატანა' ),
        'Mycontributions'           => array( 'ჩემი_წვლილი' ),
+       'MyLanguage'                => array( 'ჩემი_ენა' ),
        'Mypage'                    => array( 'ჩემი_გვერდი' ),
        'Mytalk'                    => array( 'ჩენი_განხილვა' ),
        'Myuploads'                 => array( 'ჩემი_ატვირთვები' ),
index faceb17..289e5c2 100644 (file)
@@ -139,6 +139,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'ទំព័រមានកំណែច្រើនជាងគេ' ),
        'Movepage'                  => array( 'ប្ដូរទីតាំងទំព័រ' ),
        'Mycontributions'           => array( 'ការរួមចំណែករបស់ខ្ញុំ' ),
+       'MyLanguage'                => array( 'ភាសារបស់ខ្ញុំ' ),
        'Mypage'                    => array( 'ទំព័ររបស់ខ្ញុំ' ),
        'Mytalk'                    => array( 'ការពិភាក្សារបស់ខ្ញុំ' ),
        'Myuploads'                 => array( 'អ្វីដែលខ្ញុំផ្ទុកឡើង' ),
index f31bb06..4e83fe3 100644 (file)
@@ -125,6 +125,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( '역사긴문서' ),
        'Movepage'                  => array( '옮기기', '문서옮기기', '이동', '문서이동' ),
        'Mycontributions'           => array( '내기여', '내기여목록' ),
+       'MyLanguage'                => array( '내언어' ),
        'Mypage'                    => array( '내사용자문서' ),
        'Mytalk'                    => array( '내사용자토론' ),
        'Myuploads'                 => array( '내가올린파일' ),
index d7826be..6b62160 100644 (file)
@@ -79,6 +79,7 @@ $specialPageAliases = array(
        'Mostimages'                => array( 'Эм_кёб_хайырланнган_файлла' ),
        'Movepage'                  => array( 'Бетни_атын_тюрлендириу', 'Атны_тюрлендириу', 'Атны_тюрлендир' ),
        'Mycontributions'           => array( 'Мени_къошумум' ),
+       'MyLanguage'                => array( 'Мени_тилим' ),
        'Mypage'                    => array( 'Мени_бетим' ),
        'Mytalk'                    => array( 'Мени_сюзюуюм' ),
        'Myuploads'                 => array( 'Мени_джюклегенлерим' ),
index 2f6c650..e338b42 100644 (file)
@@ -209,6 +209,6 @@ $magicWords = array(
 );
 
 $imageFiles = array(
-       'button-italic'   => 'ksh/button_S_italic.png',
+       'button-italic'   => 'ksh/button_italic.png',
 );
 
index f42a893..4a42160 100644 (file)
@@ -62,6 +62,7 @@ $specialPageAliases = array(
        'Listbots'                  => array( 'Lîsteya_Botan' ),
        'Listusers'                 => array( 'Lîsteya_bikarhêneran' ),
        'Longpages'                 => array( 'Rûpelên_dirêj' ),
+       'MyLanguage'                => array( 'Zimanê_Min' ),
        'Newpages'                  => array( 'Rûpelên_nû' ),
        'Randompage'                => array( 'Rûpela_tesadufî' ),
        'Randomredirect'            => array( 'Redirecta_tasadufî' ),
index 1b7c78c..ea7384a 100644 (file)
@@ -110,6 +110,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'AnMoyhaAmendyansow' ),
        'Movepage'                  => array( 'GwayaFolen' ),
        'Mycontributions'           => array( 'OwHevrohow' ),
+       'MyLanguage'                => array( 'OwYeth' ),
        'Mypage'                    => array( 'OwFolen' ),
        'Mytalk'                    => array( 'OwHeskows' ),
        'Myuploads'                 => array( 'OwUghkargansow' ),
index 8850302..02fdb1c 100644 (file)
@@ -104,6 +104,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Säite_mat_de_meeschten_Ännerungen' ),
        'Movepage'                  => array( 'Säit_réckelen' ),
        'Mycontributions'           => array( 'Meng_Kontributiounen' ),
+       'MyLanguage'                => array( 'Meng_Sprooch' ),
        'Mypage'                    => array( 'Meng_Benotzersäit' ),
        'Mytalk'                    => array( 'Meng_Diskussiounssäit' ),
        'Myuploads'                 => array( 'Meng_eropgeluede_Fichieren' ),
index 063b8d9..3d29b6b 100644 (file)
@@ -145,6 +145,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'НајмногуРевизии' ),
        'Movepage'                  => array( 'ПреместиСтраница' ),
        'Mycontributions'           => array( 'МоиПридонеси' ),
+       'MyLanguage'                => array( 'МојЈазик' ),
        'Mypage'                    => array( 'МојаСтраница' ),
        'Mytalk'                    => array( 'МојРазговор', 'МоиРазговори' ),
        'Myuploads'                 => array( 'МоиПодигања' ),
index 718ab28..5b87ace 100644 (file)
@@ -136,6 +136,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'കൂടുതൽ_പുനരവലോകനങ്ങൾ' ),
        'Movepage'                  => array( 'താൾ_മാറ്റുക' ),
        'Mycontributions'           => array( 'എന്റെസംഭാവനകൾ' ),
+       'MyLanguage'                => array( 'എന്റെഭാഷ' ),
        'Mypage'                    => array( 'എന്റെതാൾ' ),
        'Mytalk'                    => array( 'എന്റെസംവാദം' ),
        'Myuploads'                 => array( 'ഞാൻഅപ്‌ലോഡ്‌ചെയ്തവ' ),
index 0bbbf8c..6806443 100644 (file)
@@ -123,6 +123,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'सर्वाधिकआवर्तने' ),
        'Movepage'                  => array( 'पान_हलवा' ),
        'Mycontributions'           => array( 'माझे_योगदान' ),
+       'MyLanguage'                => array( 'माझीभाषा' ),
        'Mypage'                    => array( 'माझे_पान' ),
        'Mytalk'                    => array( 'माझ्या_चर्चा' ),
        'Newimages'                 => array( 'नवीन_संचिका', 'नवीन_चित्रे' ),
index f6b688e..e5e189c 100644 (file)
@@ -74,6 +74,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'ВесемедеЛамокстьЛиякстомтозь' ),
        'Movepage'                  => array( 'ПечтевтемсЛопа' ),
        'Mycontributions'           => array( 'МонМезеТеинь' ),
+       'MyLanguage'                => array( 'Келем' ),
        'Mypage'                    => array( 'МоньЛопам' ),
        'Mytalk'                    => array( 'МоньКортамом' ),
        'Newimages'                 => array( 'ОдАртовкст' ),
index 83e736f..e53cefd 100644 (file)
@@ -148,6 +148,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Flest_revisjoner' ),
        'Movepage'                  => array( 'Flytt_side' ),
        'Mycontributions'           => array( 'Mine_bidrag' ),
+       'MyLanguage'                => array( 'Mitt_språk' ),
        'Mypage'                    => array( 'Min_side' ),
        'Mytalk'                    => array( 'Min_diskusjon' ),
        'Myuploads'                 => array( 'Mine_opplastinger' ),
index 49268f6..43e19e0 100644 (file)
@@ -271,6 +271,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Meeste_bewarkingen' ),
        'Movepage'                  => array( 'Zied_herneumen' ),
        'Mycontributions'           => array( 'Mien_biedragen' ),
+       'MyLanguage'                => array( 'Mien_taal' ),
        'Mypage'                    => array( 'Mien_gebrukerszied' ),
        'Mytalk'                    => array( 'Mien_overleg' ),
        'Myuploads'                 => array( 'Mien_in-elaojen_bestaanden' ),
index c90908f..0132437 100644 (file)
@@ -323,6 +323,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'MeesteVersies', 'MeesteHerzieningen', 'MeesteRevisies' ),
        'Movepage'                  => array( 'PaginaHernoemen', 'PaginaVerplaatsen', 'TitelWijzigen', 'VerplaatsPagina' ),
        'Mycontributions'           => array( 'MijnBijdragen' ),
+       'MyLanguage'                => array( 'MijnTaal' ),
        'Mypage'                    => array( 'MijnPagina' ),
        'Mytalk'                    => array( 'MijnOverleg' ),
        'Myuploads'                 => array( 'MijnUploads' ),
index 9d99964..991a513 100644 (file)
@@ -267,6 +267,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Flest_endringar' ),
        'Movepage'                  => array( 'Flytt_side' ),
        'Mycontributions'           => array( 'Bidraga_mine' ),
+       'MyLanguage'                => array( 'Språket_mitt' ),
        'Mypage'                    => array( 'Sida_mi' ),
        'Mytalk'                    => array( 'Diskusjonssida_mi' ),
        'Myuploads'                 => array( 'Opplastingane_mine' ),
index 3c512d7..3412c80 100644 (file)
@@ -115,6 +115,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਰੀਵਿਜ਼ਨ' ),
        'Movepage'                  => array( 'ਸਿਰਲੇਖ_ਬਦਲੋ' ),
        'Mycontributions'           => array( 'ਮੇਰੇ_ਯੋਗਦਾਨ' ),
+       'MyLanguage'                => array( 'ਮੇਰੀ_ਭਾਸ਼ਾ', 'ਮੇਰੀ_ਬੋਲੀ' ),
        'Mypage'                    => array( 'ਮੇਰਾ_ਸਫ਼ਾ' ),
        'Mytalk'                    => array( 'ਮੇਰੀ_ਚਰਚਾ' ),
        'Myuploads'                 => array( 'ਮੇਰੇ_ਅੱਪਲੋਡ' ),
index c591faa..f3f2ef5 100644 (file)
@@ -178,6 +178,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Najwięcej_edycji', 'Najczęściej_edytowane' ),
        'Movepage'                  => array( 'Przenieś' ),
        'Mycontributions'           => array( 'Mój_wkład' ),
+       'MyLanguage'                => array( 'Mój_język' ),
        'Mypage'                    => array( 'Moja_strona' ),
        'Mytalk'                    => array( 'Moja_dyskusja' ),
        'Myuploads'                 => array( 'Moje_pliki' ),
index 63d6513..f057810 100644 (file)
@@ -84,6 +84,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'AnchaLlamkapusqa', 'AchkaKutiLlamkapusqa' ),
        'Movepage'                  => array( 'PanqataAstay' ),
        'Mycontributions'           => array( 'Rurasqaykuna', 'Llamkapusqaykuna' ),
+       'MyLanguage'                => array( 'Rimayniy' ),
        'Mypage'                    => array( 'Panqay', 'NuqapPanqay' ),
        'Mytalk'                    => array( 'Rimachinay', 'RimanakuyPanqay', 'NuqapRimachinay', 'NuqapRimanakuyPanqay' ),
        'Newimages'                 => array( 'MusuqRikcha', 'MusuqRikchakuna' ),
index 9098d85..02b7972 100644 (file)
@@ -184,6 +184,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Наибольшее_количество_версий' ),
        'Movepage'                  => array( 'Переименовать_страницу', 'Переименование', 'Переименовать' ),
        'Mycontributions'           => array( 'Мой_вклад' ),
+       'MyLanguage'                => array( 'Мой_язык' ),
        'Mypage'                    => array( 'Моя_страница' ),
        'Mytalk'                    => array( 'Моё_обсуждение' ),
        'Myuploads'                 => array( 'Мои_загрузки' ),
@@ -433,9 +434,9 @@ $fallback8bitEncoding = 'windows-1251';
 $linkPrefixExtension = false;
 
 $imageFiles = array(
-       'button-bold'   => 'cyrl/button_bold.png',
-       'button-italic' => 'cyrl/button_italic.png',
-       'button-link'   => 'cyrl/button_link.png',
+       'button-bold'   => 'ru/button_bold.png',
+       'button-italic' => 'ru/button_italic.png',
+       'button-link'   => 'ru/button_link.png',
 );
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюя]+)(.*)$/sDu';
index d06e726..74ca0bc 100644 (file)
@@ -102,6 +102,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'PagineConPiùRevisioni' ),
        'Movepage'                  => array( 'Sposta', 'Rinomina' ),
        'Mycontributions'           => array( 'MieiContributi' ),
+       'MyLanguage'                => array( 'MiaLingua' ),
        'Mypage'                    => array( 'MiaPaginaUtente', 'MiaPagina' ),
        'Mytalk'                    => array( 'MieDiscussioni' ),
        'Myuploads'                 => array( 'MieiUpload', 'MieiEdit' ),
index 839a5de..e9d8aa9 100644 (file)
@@ -130,6 +130,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'ЧланциСаНајвишеРевизија' ),
        'Movepage'                  => array( 'Преусмери', 'Премести_страницу' ),
        'Mycontributions'           => array( 'МојиДоприноси', 'Моји_доприноси', 'Моји_прилози' ),
+       'MyLanguage'                => array( 'Мој_језик' ),
        'Mypage'                    => array( 'МојаСтраница', 'Моја_страница' ),
        'Mytalk'                    => array( 'МојРазговор', 'Мој_разговор' ),
        'Myuploads'                 => array( 'Моја_слања' ),
index 0d64526..b3d0996 100644 (file)
@@ -137,6 +137,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Flest_versioner' ),
        'Movepage'                  => array( 'Flytta' ),
        'Mycontributions'           => array( 'Mina_bidrag' ),
+       'MyLanguage'                => array( 'Mitt_språk' ),
        'Mypage'                    => array( 'Min_sida' ),
        'Mytalk'                    => array( 'Min_diskussion' ),
        'Myuploads'                 => array( 'Mina_uppladdningar' ),
index 7825ae9..140073a 100644 (file)
@@ -102,6 +102,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'บทความที่ถูกแก้ไขมากที่สุด' ),
        'Movepage'                  => array( 'เปลี่ยนทาง' ),
        'Mycontributions'           => array( 'เรื่องที่ฉันเขียน' ),
+       'MyLanguage'                => array( 'ภาษาของฉัน' ),
        'Mypage'                    => array( 'หน้าของฉัน' ),
        'Mytalk'                    => array( 'หน้าพูดคุยของฉัน' ),
        'Myuploads'                 => array( 'ไฟล์ที่อัปโหลดของฉัน' ),
index 5a9b68c..f1d9a4b 100644 (file)
@@ -46,6 +46,7 @@ $specialPageAliases = array(
        'Emailuser'                 => array( 'Бә_иштирокәкә_номә_вығандеј' ),
        'Longpages'                 => array( 'Дырозә_сәһифон' ),
        'Movepage'                  => array( 'Сәһифә_номи_дәгиш_кардеј' ),
+       'MyLanguage'                => array( 'Чымы_зывон' ),
        'Mypage'                    => array( 'Чымы_сәһифә' ),
        'Mytalk'                    => array( 'Чымы_мызокирә' ),
        'Myuploads'                 => array( 'Чымы_бо_жә_быә_чијон' ),
index e08c9fc..21cc341 100644 (file)
@@ -145,6 +145,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'EnÇokRevizyon' ),
        'Movepage'                  => array( 'SayfaTaşı' ),
        'Mycontributions'           => array( 'Katkılarım' ),
+       'MyLanguage'                => array( 'Dilim', 'BenimDilim' ),
        'Mypage'                    => array( 'Sayfam', 'BenimSayfam', 'KullanıcıSayfam' ),
        'Mytalk'                    => array( 'MesajSayfam', 'İletiSayfam' ),
        'Myuploads'                 => array( 'Yüklemelerim' ),
index 49a8891..457ca9a 100644 (file)
@@ -140,6 +140,7 @@ $specialPageAliases = array(
        'Mostcategories'            => array( 'Зур_төркемнәр' ),
        'Mostrevisions'             => array( 'Зур_үзгәртүләр' ),
        'Movepage'                  => array( 'Битне_күчерү' ),
+       'MyLanguage'                => array( 'Телем' ),
        'Mypage'                    => array( 'Сәхифәм' ),
        'Mytalk'                    => array( 'Бәхәсем' ),
        'Newimages'                 => array( 'Яңа_файл' ),
index 41f21e5..77759a1 100644 (file)
@@ -48,6 +48,10 @@ $namespaceAliases = array(
        'Категория_чугаазы'  => NS_CATEGORY_TALK,
 );
 
+$specialPageAliases = array(
+       'MyLanguage'                => array( 'Дылым' ),
+);
+
 $magicWords = array(
        'redirect'                  => array( '0', '#көжүрүлге', '#ШИГЛЕДИР', '#перенаправление', '#перенапр', '#REDIRECT' ),
        'notoc'                     => array( '0', '__ЭГЕ_ЧОК__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
index e18fc46..861b936 100644 (file)
@@ -165,6 +165,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Найбільш_редаговані' ),
        'Movepage'                  => array( 'Перейменувати' ),
        'Mycontributions'           => array( 'Мій_внесок' ),
+       'MyLanguage'                => array( 'Моя_мова' ),
        'Mypage'                    => array( 'Моя_сторінка' ),
        'Mytalk'                    => array( 'Моє_обговорення' ),
        'Myuploads'                 => array( 'Мої_завантаження' ),
index 1712c05..c691b0e 100644 (file)
@@ -111,6 +111,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Nhiều_phiên_bản_nhất' ),
        'Movepage'                  => array( 'Di_chuyển', 'Đổi_tên_trang' ),
        'Mycontributions'           => array( 'Đóng_góp_của_tôi', 'Tôi_đóng_góp' ),
+       'MyLanguage'                => array( 'Ngôn_ngữ_tôi' ),
        'Mypage'                    => array( 'Trang_tôi', 'Trang_cá_nhân' ),
        'Mytalk'                    => array( 'Thảo_luận_tôi', 'Trang_thảo_luận_của_tôi' ),
        'Myuploads'                 => array( 'Tập_tin_tôi' ),
index 12711d1..dcbc3e1 100644 (file)
@@ -143,6 +143,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( '最多版本' ),
        'Movepage'                  => array( '搬頁' ),
        'Mycontributions'           => array( '我嘅貢獻' ),
+       'MyLanguage'                => array( '我個話' ),
        'Mypage'                    => array( '我嘅頁面' ),
        'Mytalk'                    => array( '我嘅傾偈' ),
        'Myuploads'                 => array( '我嘅上傳' ),
index fa72339..e6501c6 100644 (file)
@@ -185,6 +185,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( '最多修订页面' ),
        'Movepage'                  => array( '移动页面' ),
        'Mycontributions'           => array( '我的贡献' ),
+       'MyLanguage'                => array( '我的语言' ),
        'Mypage'                    => array( '我的用户页' ),
        'Mytalk'                    => array( '我的讨论页' ),
        'Myuploads'                 => array( '我上传的文件' ),
index be18e0b..9b7dc9e 100644 (file)
@@ -169,6 +169,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( '最多修訂頁面' ),
        'Movepage'                  => array( '移動頁面' ),
        'Mycontributions'           => array( '我的貢獻' ),
+       'MyLanguage'                => array( '我的語言' ),
        'Mypage'                    => array( '我的用戶頁' ),
        'Mytalk'                    => array( '我的討論頁' ),
        'Myuploads'                 => array( '我的上傳' ),
index 1dd1a89..655f309 100644 (file)
--- a/load.php
+++ b/load.php
@@ -39,7 +39,9 @@ if ( !$wgRequest->checkUrlExtension() ) {
 }
 
 // Respond to resource loading request
-$resourceLoader = new ResourceLoader();
+$resourceLoader = new ResourceLoader(
+       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+);
 $resourceLoader->respond( new ResourceLoaderContext( $resourceLoader, $wgRequest ) );
 
 wfProfileOut( 'load.php' );
index ffb07eb..8d30df4 100644 (file)
@@ -113,6 +113,13 @@ abstract class Maintenance {
         */
        public $fileHandle;
 
+       /**
+        * Accessible via getConfig()
+        *
+        * @var Config
+        */
+       private $config;
+
        /**
         * Default constructor. Children should call this *first* if implementing
         * their own constructors
@@ -457,6 +464,26 @@ abstract class Maintenance {
                $this->mDependantParameters = array_diff_key( $this->mParams, $this->mGenericParameters );
        }
 
+       /**
+        * @since 1.24
+        * @return Config
+        */
+       public function getConfig() {
+               if ( $this->config === null ) {
+                       $this->config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               }
+
+               return $this->config;
+       }
+
+       /**
+        * @since 1.24
+        * @param Config $config
+        */
+       public function setConfig( Config $config ) {
+               $this->config = $config;
+       }
+
        /**
         * Run a child maintenance script. Pass all of the current arguments
         * to it.
diff --git a/maintenance/archives/patch-fa_major_mime-chemical.sql b/maintenance/archives/patch-fa_major_mime-chemical.sql
new file mode 100644 (file)
index 0000000..be9b0ff
--- /dev/null
@@ -0,0 +1,3 @@
+ALTER TABLE /*$wgDBprefix*/filearchive
+  CHANGE  fa_major_mime fa_major_mime ENUM('unknown','application','audio','image','text','video','message','model','multipart','chemical');
+
diff --git a/maintenance/archives/patch-img_major_mime-chemical.sql b/maintenance/archives/patch-img_major_mime-chemical.sql
new file mode 100644 (file)
index 0000000..4bde446
--- /dev/null
@@ -0,0 +1,3 @@
+ALTER TABLE /*$wgDBprefix*/image
+  CHANGE  img_major_mime img_major_mime ENUM('unknown','application','audio','image','text','video','message','model','multipart','chemical');
+
diff --git a/maintenance/archives/patch-oi_major_mime-chemical.sql b/maintenance/archives/patch-oi_major_mime-chemical.sql
new file mode 100644 (file)
index 0000000..e3b4552
--- /dev/null
@@ -0,0 +1,3 @@
+ALTER TABLE /*$wgDBprefix*/oldimage
+  CHANGE  oi_major_mime oi_major_mime ENUM('unknown','application','audio','image','text','video','message','model','multipart','chemical');
+
diff --git a/maintenance/archives/patch-restructure.sql b/maintenance/archives/patch-restructure.sql
deleted file mode 100644 (file)
index a5bc3e5..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
--- The Great Restructuring of October 2004
--- Creates 'page', 'revision' tables and transforms the classic
--- cur+old into a separate page+revision+text structure.
---
--- The pre-conversion 'old' table is renamed to 'text' and used
--- without internal restructuring to avoid rebuilding the entire
--- table. (This can be done separately if desired.)
---
--- The pre-conversion 'cur' table is now redundant and can be
--- discarded when done.
-
-CREATE TABLE /*$wgDBprefix*/page (
-  page_id int unsigned NOT NULL auto_increment,
-  page_namespace tinyint NOT NULL,
-  page_title varchar(255) binary NOT NULL,
-  page_restrictions tinyblob NOT NULL,
-  page_counter bigint unsigned NOT NULL default '0',
-  page_is_redirect tinyint unsigned NOT NULL default '0',
-  page_is_new tinyint unsigned NOT NULL default '0',
-  page_random real unsigned NOT NULL,
-  page_touched binary(14) NOT NULL default '',
-  page_latest int unsigned NOT NULL,
-  page_len int unsigned NOT NULL,
-
-  PRIMARY KEY page_id (page_id),
-  UNIQUE INDEX name_title (page_namespace,page_title),
-  INDEX (page_random),
-  INDEX (page_len)
-);
-
-CREATE TABLE /*$wgDBprefix*/revision (
-  rev_id int unsigned NOT NULL auto_increment,
-  rev_page int unsigned NOT NULL,
-  rev_comment tinyblob NOT NULL,
-  rev_user int unsigned NOT NULL default '0',
-  rev_user_text varchar(255) binary NOT NULL default '',
-  rev_timestamp binary(14) NOT NULL default '',
-  rev_minor_edit tinyint unsigned NOT NULL default '0',
-  rev_deleted tinyint unsigned NOT NULL default '0',
-
-  PRIMARY KEY rev_page_id (rev_page, rev_id),
-  UNIQUE INDEX rev_id (rev_id),
-  INDEX rev_timestamp (rev_timestamp),
-  INDEX page_timestamp (rev_page,rev_timestamp),
-  INDEX user_timestamp (rev_user,rev_timestamp),
-  INDEX usertext_timestamp (rev_user_text,rev_timestamp)
-);
-
--- If creating new 'text' table it would look like this:
---
--- CREATE TABLE /*$wgDBprefix*/text (
---   old_id int(8) unsigned NOT NULL auto_increment,
---   old_text mediumtext NOT NULL,
---   old_flags tinyblob NOT NULL,
---
---   PRIMARY KEY old_id (old_id)
--- );
-
-
--- Lock!
-LOCK TABLES /*$wgDBprefix*/page WRITE, /*$wgDBprefix*/revision WRITE, /*$wgDBprefix*/old WRITE, /*$wgDBprefix*/cur WRITE;
-
--- Save the last old_id value for later
-SELECT (@maxold:=MAX(old_id)) FROM /*$wgDBprefix*/old;
-
--- First, copy all current entries into the old table.
-INSERT
-  INTO /*$wgDBprefix*/old
-    (old_namespace,
-    old_title,
-    old_text,
-    old_comment,
-    old_user,
-    old_user_text,
-    old_timestamp,
-    old_minor_edit,
-    old_flags)
-  SELECT
-    cur_namespace,
-    cur_title,
-    cur_text,
-    cur_comment,
-    cur_user,
-    cur_user_text,
-    cur_timestamp,
-    cur_minor_edit,
-    ''
-  FROM /*$wgDBprefix*/cur;
-
--- Now, copy all old data except the text into revisions
-INSERT
-  INTO /*$wgDBprefix*/revision
-    (rev_id,
-    rev_page,
-    rev_comment,
-    rev_user,
-    rev_user_text,
-    rev_timestamp,
-    rev_minor_edit)
-  SELECT
-    old_id,
-    cur_id,
-    old_comment,
-    old_user,
-    old_user_text,
-    old_timestamp,
-    old_minor_edit
-  FROM /*$wgDBprefix*/old,/*$wgDBprefix*/cur
-  WHERE old_namespace=cur_namespace
-    AND old_title=cur_title;
-
--- And, copy the cur data into page
-INSERT
-  INTO /*$wgDBprefix*/page
-    (page_id,
-    page_namespace,
-    page_title,
-    page_restrictions,
-    page_counter,
-    page_is_redirect,
-    page_is_new,
-    page_random,
-    page_touched,
-    page_latest)
-  SELECT
-    cur_id,
-    cur_namespace,
-    cur_title,
-    cur_restrictions,
-    cur_counter,
-    cur_is_redirect,
-    cur_is_new,
-    cur_random,
-    cur_touched,
-    rev_id
-  FROM /*$wgDBprefix*/cur,/*$wgDBprefix*/revision
-  WHERE cur_id=rev_page
-    AND rev_timestamp=cur_timestamp
-    AND rev_id > @maxold;
-
-UNLOCK TABLES;
-
--- Keep the old table around as the text store.
--- Its extra fields will be ignored, but trimming them is slow
--- so we won't bother doing it for now.
-ALTER TABLE /*$wgDBprefix*/old RENAME TO /*$wgDBprefix*/text;
index 9ac204d..aeadc93 100644 (file)
@@ -125,6 +125,8 @@ EOT;
 
        /**
         * Copy all rows from $srcTable to $dstTable
+        * @param string $srcTable
+        * @param string $dstTable
         */
        function sync( $srcTable, $dstTable ) {
                $batchSize = 1000;
index 7fca377..5f77637 100644 (file)
@@ -343,6 +343,7 @@ class TextPassDumper extends BackupDumper {
 
        /**
         * @throws MWException Failure to parse XML input
+        * @param string $input
         * @return bool
         */
        function readDump( $input ) {
index 6ef4909..d1c2edd 100644 (file)
@@ -345,7 +345,6 @@ class CheckSyntax extends Maintenance {
         * or pointless ?> closing tags at the end.
         *
         * @param string $file String Path to a file to check for errors
-        * @return bool
         */
        private function checkForMistakes( $file ) {
                foreach ( $this->mNoStyleCheckPaths as $regex ) {
index cc8b024..e1d0ed6 100644 (file)
@@ -47,7 +47,7 @@ class CleanupRemovedModules extends Maintenance {
 
        public function execute() {
                $dbw = wfGetDB( DB_MASTER );
-               $rl = new ResourceLoader();
+               $rl = new ResourceLoader( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
                $moduleNames = $rl->getModuleNames();
                $moduleList = implode( ', ', array_map( array( $dbw, 'addQuotes' ), $moduleNames ) );
                $limit = max( 1, intval( $this->getOption( 'batchsize', 500 ) ) );
index eee1204..0df9e7f 100644 (file)
@@ -156,7 +156,7 @@ class TitleCleanup extends TableCleanup {
 
                        $clean = 'Broken/' . $prior;
                        $verified = Title::makeTitleSafe( $ns, $clean );
-                       if ( $verified->exists() ) {
+                       if ( !$verified || $verified->exists() ) {
                                $blah = "Broken/id:" . $row->page_id;
                                $this->output( "Couldn't legalize; form '$clean' exists; using '$blah'\n" );
                                $verified = Title::makeTitleSafe( $ns, $blah );
index 0d3e643..88776f4 100644 (file)
@@ -43,6 +43,7 @@ class CommandLineInc extends Maintenance {
 
        /**
         * No help, it would just be misleading since it misses custom options
+        * @param bool $force
         */
        protected function maybeHelp( $force = false ) {
                if ( !$force ) {
diff --git a/maintenance/cssjanus/COPYING b/maintenance/cssjanus/COPYING
deleted file mode 100644 (file)
index 3f2c895..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-   Copyright 2008 Google Inc.
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/maintenance/cssjanus/LICENSE b/maintenance/cssjanus/LICENSE
deleted file mode 100644 (file)
index d645695..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/maintenance/cssjanus/README b/maintenance/cssjanus/README
deleted file mode 100644 (file)
index 1b96d1a..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-=CSSJanus=
-
-_Flips CSS from LTR to an RTL orienation and vice-versa_
-
-Author: `Lindsey Simon <elsigh@google.com>`
-
-==Introduction==
-
-CSSJanus is CSS parser utility designed to aid the conversion of a website's
-layout from left-to-right(LTR) to right-to-left(RTL). The script was born out of
-a need to convert CSS for RTL languages when tables are not being used for layout (since tables will automatically reorder TD's in RTL).
-CSSJanus will change most of the obvious CSS property names and their values as
-well as some not-so-obvious ones (cursor, background-position %, etc...).
-The script is designed to offer flexibility to account for cases when you do
-not want to change certain rules which exist to account for bidirectional text
-display bugs, as well as situations where you may or may not want to flip annotations inside of the background url string.
-Note that you can disable CSSJanus from running on an entire class or any
-rule within a class by prepending a /* @noflip */ comment before the rule(s)
-you want CSSJanus to ignore.
-
-CSSJanus itself is not always enough to make a website that works in a LTR
-language context work in a RTL language all the way, but it is a start.
-
-==Getting the code==
-
-View the trunk at:
-
-  http://cssjanus.googlecode.com/svn/trunk/
-
-Check out the latest development version anonymously with:
-
-{{{
-  $ svn checkout http://cssjanus.googlecode.com/svn/trunk/ cssjanus
-}}}
-
-==Using==
-
-Usage:
-  ./cssjanus.py < file.css > file-rtl.css
-Flags:
-  --swap_left_right_in_url: Fixes "left"/"right" string within urls.
-  Ex: ./cssjanus.py --swap_left_right_in_url < file.css > file_rtl.css
-  --swap_ltr_rtl_in_url: Fixes "ltr"/"rtl" string within urls.
-  Ex: ./cssjanus.py --swap_ltr_rtl_in_url < file.css > file_rtl.css
-
-If you'd like to make use of the webapp version of cssjanus, you'll need to
-download the Google App Engine SDK
-  http://code.google.com/appengine/downloads.html
-and also drop a "django" directory into this directory, with the latest svn
-from django. You should be good to go with that setup. Please let me know
-otherwise.
-
-==Bugs, Patches==
-
-Patches and bug reports are welcome, just please keep the style
-consistent with the original source. If you find a bug, please include a diff
-of cssjanus_test.py with the bug included as a new unit test which fails. It
-will make understanding and fixing the bug easier.
-
-==Todo==
-
-* Include some helpers for some typical bidi text solutions?
-* Aural CSS (azimuth) swapping?
-
-==Contributors==
-
-Additional thanks to Mike Samuel for his work on csslex.py, Andy Perelson for
-his help coding and reviewing, Stephen Zabel for his help with i18n and my sanity,
-and to Eric Meyer for his thoughtful input.
-Thanks to Junyu Wang for the Chinese translation.
-Thanks to Masashi Kawashima for the Japanese translation.
-Thanks to Taaryk Taar and Tariq Al-Omaireeni for an updated Arabic translation.
-Thanks to Jens Meiert for the German translation.
-
-==License==
-
-{{{
-  Copyright 2008 Google Inc. All Rights Reserved.
-
-  Licensed under the Apache License, Version 2.0 (the 'License');
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an 'AS IS' BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-}}}
diff --git a/maintenance/cssjanus/cssjanus.py b/maintenance/cssjanus/cssjanus.py
deleted file mode 100644 (file)
index dd14bd5..0000000
+++ /dev/null
@@ -1,574 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright 2008 Google Inc. All Rights Reserved.
-
-"""Converts a LeftToRight Cascading Style Sheet into a RightToLeft one.
-
-   This is a utility script for replacing "left" oriented things in a CSS file
-   like float, padding, margin with "right" oriented values.
-   It also does the opposite.
-   The goal is to be able to conditionally serve one large, cat'd, compiled CSS
-   file appropriate for LeftToRight oriented languages and RightToLeft ones.
-   This utility will hopefully help your structural layout done in CSS in
-   terms of its RTL compatibility. It will not help with some of the more
-   complicated bidirectional text issues.
-"""
-
-__author__ = 'elsigh@google.com (Lindsey Simon)'
-__version__ = '0.1'
-
-import logging
-import re
-import sys
-import getopt
-import os
-
-import csslex
-
-logging.getLogger().setLevel(logging.INFO)
-
-# Global for the command line flags.
-SWAP_LTR_RTL_IN_URL_DEFAULT = False
-SWAP_LEFT_RIGHT_IN_URL_DEFAULT = False
-FLAGS = {'swap_ltr_rtl_in_url': SWAP_LTR_RTL_IN_URL_DEFAULT,
-         'swap_left_right_in_url': SWAP_LEFT_RIGHT_IN_URL_DEFAULT}
-
-# Generic token delimiter character.
-TOKEN_DELIMITER = '~'
-
-# This is a temporary match token we use when swapping strings.
-TMP_TOKEN = '%sTMP%s' % (TOKEN_DELIMITER, TOKEN_DELIMITER)
-
-# Token to be used for joining lines.
-TOKEN_LINES = '%sJ%s' % (TOKEN_DELIMITER, TOKEN_DELIMITER)
-
-# Global constant text strings for CSS value matches.
-LTR = 'ltr'
-RTL = 'rtl'
-LEFT = 'left'
-RIGHT = 'right'
-
-# This is a lookbehind match to ensure that we don't replace instances
-# of our string token (left, rtl, etc...) if there's a letter in front of it.
-# Specifically, this prevents replacements like 'background: url(bright.png)'.
-LOOKBEHIND_NOT_LETTER = r'(?<![a-zA-Z])'
-
-# This is a lookahead match to make sure we don't replace left and right
-# in actual classnames, so that we don't break the HTML/CSS dependencies.
-# Read literally, it says ignore cases where the word left, for instance, is
-# directly followed by valid classname characters and a curly brace.
-# ex: .column-left {float: left} will become .column-left {float: right}
-LOOKAHEAD_NOT_OPEN_BRACE = (r'(?!(?:%s|%s|%s|#|\:|\.|\,|\+|>)*?{)' %
-                            (csslex.NMCHAR, TOKEN_LINES, csslex.SPACE))
-
-
-# These two lookaheads are to test whether or not we are within a
-# background: url(HERE) situation.
-# Ref: http://www.w3.org/TR/CSS21/syndata.html#uri
-VALID_AFTER_URI_CHARS = r'[\'\"]?%s' % csslex.WHITESPACE
-LOOKAHEAD_NOT_CLOSING_PAREN = r'(?!%s?%s\))' % (csslex.URL_CHARS,
-                                                VALID_AFTER_URI_CHARS)
-LOOKAHEAD_FOR_CLOSING_PAREN = r'(?=%s?%s\))' % (csslex.URL_CHARS,
-                                                VALID_AFTER_URI_CHARS)
-
-# Compile a regex to swap left and right values in 4 part notations.
-# We need to match negatives and decimal numeric values.
-# ex. 'margin: .25em -2px 3px 0' becomes 'margin: .25em 0 3px -2px'.
-POSSIBLY_NEGATIVE_QUANTITY = r'((?:-?%s)|(?:inherit|auto))' % csslex.QUANTITY
-POSSIBLY_NEGATIVE_QUANTITY_SPACE = r'%s%s%s' % (POSSIBLY_NEGATIVE_QUANTITY,
-                                                csslex.SPACE,
-                                                csslex.WHITESPACE)
-FOUR_NOTATION_QUANTITY_RE = re.compile(r'%s%s%s%s' %
-                                       (POSSIBLY_NEGATIVE_QUANTITY_SPACE,
-                                        POSSIBLY_NEGATIVE_QUANTITY_SPACE,
-                                        POSSIBLY_NEGATIVE_QUANTITY_SPACE,
-                                        POSSIBLY_NEGATIVE_QUANTITY),
-                                       re.I)
-COLOR = r'(%s|%s)' % (csslex.NAME, csslex.HASH)
-COLOR_SPACE = r'%s%s' % (COLOR, csslex.SPACE)
-FOUR_NOTATION_COLOR_RE = re.compile(r'(-color%s:%s)%s%s%s(%s)' %
-                                    (csslex.WHITESPACE,
-                                     csslex.WHITESPACE,
-                                     COLOR_SPACE,
-                                     COLOR_SPACE,
-                                     COLOR_SPACE,
-                                     COLOR),
-                                    re.I)
-
-# Compile the cursor resize regexes
-CURSOR_EAST_RE = re.compile(LOOKBEHIND_NOT_LETTER + '([ns]?)e-resize')
-CURSOR_WEST_RE = re.compile(LOOKBEHIND_NOT_LETTER + '([ns]?)w-resize')
-
-# Matches the condition where we need to replace the horizontal component
-# of a background-position value when expressed in horizontal percentage.
-# Had to make two regexes because in the case of position-x there is only
-# one quantity, and otherwise we don't want to match and change cases with only
-# one quantity.
-BG_HORIZONTAL_PERCENTAGE_RE = re.compile(r'background(-position)?(%s:%s)'
-                                         '([^%%]*?)(%s)%%'
-                                         '(%s(?:%s|%s))' % (csslex.WHITESPACE,
-                                                            csslex.WHITESPACE,
-                                                            csslex.NUM,
-                                                            csslex.WHITESPACE,
-                                                            csslex.QUANTITY,
-                                                            csslex.IDENT))
-
-BG_HORIZONTAL_PERCENTAGE_X_RE = re.compile(r'background-position-x(%s:%s)'
-                                           '(%s)%%' % (csslex.WHITESPACE,
-                                                       csslex.WHITESPACE,
-                                                       csslex.NUM))
-
-# Matches the opening of a body selector.
-BODY_SELECTOR = r'body%s{%s' % (csslex.WHITESPACE, csslex.WHITESPACE)
-
-# Matches anything up until the closing of a selector.
-CHARS_WITHIN_SELECTOR = r'[^\}]*?'
-
-# Matches the direction property in a selector.
-DIRECTION_RE = r'direction%s:%s' % (csslex.WHITESPACE, csslex.WHITESPACE)
-
-# These allow us to swap "ltr" with "rtl" and vice versa ONLY within the
-# body selector and on the same line.
-BODY_DIRECTION_LTR_RE = re.compile(r'(%s)(%s)(%s)(ltr)' %
-                                   (BODY_SELECTOR, CHARS_WITHIN_SELECTOR,
-                                    DIRECTION_RE),
-                                   re.I)
-BODY_DIRECTION_RTL_RE = re.compile(r'(%s)(%s)(%s)(rtl)' %
-                                   (BODY_SELECTOR, CHARS_WITHIN_SELECTOR,
-                                    DIRECTION_RE),
-                                   re.I)
-
-
-# Allows us to swap "direction:ltr" with "direction:rtl" and
-# vice versa anywhere in a line.
-DIRECTION_LTR_RE = re.compile(r'%s(ltr)' % DIRECTION_RE)
-DIRECTION_RTL_RE = re.compile(r'%s(rtl)' % DIRECTION_RE)
-
-# We want to be able to switch left with right and vice versa anywhere
-# we encounter left/right strings, EXCEPT inside the background:url(). The next
-# two regexes are for that purpose. We have alternate IN_URL versions of the
-# regexes compiled in case the user passes the flag that they do
-# actually want to have left and right swapped inside of background:urls.
-LEFT_RE = re.compile('%s(%s)%s%s' % (LOOKBEHIND_NOT_LETTER,
-                                     LEFT,
-                                     LOOKAHEAD_NOT_CLOSING_PAREN,
-                                     LOOKAHEAD_NOT_OPEN_BRACE),
-                     re.I)
-RIGHT_RE = re.compile('%s(%s)%s%s' % (LOOKBEHIND_NOT_LETTER,
-                                      RIGHT,
-                                      LOOKAHEAD_NOT_CLOSING_PAREN,
-                                      LOOKAHEAD_NOT_OPEN_BRACE),
-                      re.I)
-LEFT_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
-                                          LEFT,
-                                          LOOKAHEAD_FOR_CLOSING_PAREN),
-                            re.I)
-RIGHT_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
-                                           RIGHT,
-                                           LOOKAHEAD_FOR_CLOSING_PAREN),
-                             re.I)
-LTR_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
-                                         LTR,
-                                         LOOKAHEAD_FOR_CLOSING_PAREN),
-                           re.I)
-RTL_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
-                                         RTL,
-                                         LOOKAHEAD_FOR_CLOSING_PAREN),
-                           re.I)
-
-COMMENT_RE = re.compile('(%s)' % csslex.COMMENT, re.I)
-
-NOFLIP_TOKEN = r'\@noflip'
-# The NOFLIP_TOKEN inside of a comment. For now, this requires that comments
-# be in the input, which means users of a css compiler would have to run
-# this script first if they want this functionality.
-NOFLIP_ANNOTATION = r'/\*%s%s%s\*/' % (csslex.WHITESPACE,
-                                       NOFLIP_TOKEN,
-                                       csslex. WHITESPACE)
-
-# After a NOFLIP_ANNOTATION, and within a class selector, we want to be able
-# to set aside a single rule not to be flipped. We can do this by matching
-# our NOFLIP annotation and then using a lookahead to make sure there is not
-# an opening brace before the match.
-NOFLIP_SINGLE_RE = re.compile(r'(%s%s[^;}]+;?)' % (NOFLIP_ANNOTATION,
-                                                   LOOKAHEAD_NOT_OPEN_BRACE),
-                              re.I)
-
-# After a NOFLIP_ANNOTATION, we want to grab anything up until the next } which
-# means the entire following class block. This will prevent all of its
-# declarations from being flipped.
-NOFLIP_CLASS_RE = re.compile(r'(%s%s})' % (NOFLIP_ANNOTATION,
-                                           CHARS_WITHIN_SELECTOR),
-                             re.I)
-
-
-class Tokenizer:
-  """Replaces any CSS comments with string tokens and vice versa."""
-
-  def __init__(self, token_re, token_string):
-    """Constructor for the Tokenizer.
-
-    Args:
-      token_re: A regex for the string to be replace by a token.
-      token_string: The string to put between token delimiters when tokenizing.
-    """
-    logging.debug('Tokenizer::init token_string=%s' % token_string)
-    self.token_re = token_re
-    self.token_string = token_string
-    self.originals = []
-
-  def Tokenize(self, line):
-    """Replaces any string matching token_re in line with string tokens.
-
-    By passing a function as an argument to the re.sub line below, we bypass
-    the usual rule where re.sub will only replace the left-most occurrence of
-    a match by calling the passed in function for each occurrence.
-
-    Args:
-      line: A line to replace token_re matches in.
-
-    Returns:
-      line: A line with token_re matches tokenized.
-    """
-    line = self.token_re.sub(self.TokenizeMatches, line)
-    logging.debug('Tokenizer::Tokenize returns: %s' % line)
-    return line
-
-  def DeTokenize(self, line):
-    """Replaces tokens with the original string.
-
-    Args:
-      line: A line with tokens.
-
-    Returns:
-      line with any tokens replaced by the original string.
-    """
-
-    # Put all of the comments back in by their comment token.
-    for i, original in enumerate(self.originals):
-      token = '%s%s_%s%s' % (TOKEN_DELIMITER, self.token_string, i + 1,
-                             TOKEN_DELIMITER)
-      line = line.replace(token, original)
-      logging.debug('Tokenizer::DeTokenize i:%s w/%s' % (i, token))
-    logging.debug('Tokenizer::DeTokenize returns: %s' % line)
-    return line
-
-  def TokenizeMatches(self, m):
-    """Replaces matches with tokens and stores the originals.
-
-    Args:
-      m: A match object.
-
-    Returns:
-      A string token which replaces the CSS comment.
-    """
-    logging.debug('Tokenizer::TokenizeMatches %s' % m.group(1))
-    self.originals.append(m.group(1))
-    return '%s%s_%s%s' % (TOKEN_DELIMITER,
-                          self.token_string,
-                          len(self.originals),
-                          TOKEN_DELIMITER)
-
-
-def FixBodyDirectionLtrAndRtl(line):
-  """Replaces ltr with rtl and vice versa ONLY in the body direction.
-
-  Args:
-    line: A string to replace instances of ltr with rtl.
-  Returns:
-    line with direction: ltr and direction: rtl swapped only in body selector.
-    line = FixBodyDirectionLtrAndRtl('body { direction:ltr }')
-    line will now be 'body { direction:rtl }'.
-  """
-
-  line = BODY_DIRECTION_LTR_RE.sub('\\1\\2\\3%s' % TMP_TOKEN, line)
-  line = BODY_DIRECTION_RTL_RE.sub('\\1\\2\\3%s' % LTR, line)
-  line = line.replace(TMP_TOKEN, RTL)
-  logging.debug('FixBodyDirectionLtrAndRtl returns: %s' % line)
-  return line
-
-
-def FixLeftAndRight(line):
-  """Replaces left with right and vice versa in line.
-
-  Args:
-    line: A string in which to perform the replacement.
-
-  Returns:
-    line with left and right swapped. For example:
-    line = FixLeftAndRight('padding-left: 2px; margin-right: 1px;')
-    line will now be 'padding-right: 2px; margin-left: 1px;'.
-  """
-
-  line = LEFT_RE.sub(TMP_TOKEN, line)
-  line = RIGHT_RE.sub(LEFT, line)
-  line = line.replace(TMP_TOKEN, RIGHT)
-  logging.debug('FixLeftAndRight returns: %s' % line)
-  return line
-
-
-def FixLeftAndRightInUrl(line):
-  """Replaces left with right and vice versa ONLY within background urls.
-
-  Args:
-    line: A string in which to replace left with right and vice versa.
-
-  Returns:
-    line with left and right swapped in the url string. For example:
-    line = FixLeftAndRightInUrl('background:url(right.png)')
-    line will now be 'background:url(left.png)'.
-  """
-
-  line = LEFT_IN_URL_RE.sub(TMP_TOKEN, line)
-  line = RIGHT_IN_URL_RE.sub(LEFT, line)
-  line = line.replace(TMP_TOKEN, RIGHT)
-  logging.debug('FixLeftAndRightInUrl returns: %s' % line)
-  return line
-
-
-def FixLtrAndRtlInUrl(line):
-  """Replaces ltr with rtl and vice versa ONLY within background urls.
-
-  Args:
-    line: A string in which to replace ltr with rtl and vice versa.
-
-  Returns:
-    line with left and right swapped. For example:
-    line = FixLtrAndRtlInUrl('background:url(rtl.png)')
-    line will now be 'background:url(ltr.png)'.
-  """
-
-  line = LTR_IN_URL_RE.sub(TMP_TOKEN, line)
-  line = RTL_IN_URL_RE.sub(LTR, line)
-  line = line.replace(TMP_TOKEN, RTL)
-  logging.debug('FixLtrAndRtlInUrl returns: %s' % line)
-  return line
-
-
-def FixCursorProperties(line):
-  """Fixes directional CSS cursor properties.
-
-  Args:
-    line: A string to fix CSS cursor properties in.
-
-  Returns:
-    line reformatted with the cursor properties substituted. For example:
-    line = FixCursorProperties('cursor: ne-resize')
-    line will now be 'cursor: nw-resize'.
-  """
-
-  line = CURSOR_EAST_RE.sub('\\1' + TMP_TOKEN, line)
-  line = CURSOR_WEST_RE.sub('\\1e-resize', line)
-  line = line.replace(TMP_TOKEN, 'w-resize')
-  logging.debug('FixCursorProperties returns: %s' % line)
-  return line
-
-
-def FixFourPartNotation(line):
-  """Fixes the second and fourth positions in 4 part CSS notation.
-
-  Args:
-    line: A string to fix 4 part CSS notation in.
-
-  Returns:
-    line reformatted with the 4 part notations swapped. For example:
-    line = FixFourPartNotation('padding: 1px 2px 3px 4px')
-    line will now be 'padding: 1px 4px 3px 2px'.
-  """
-  line = FOUR_NOTATION_QUANTITY_RE.sub('\\1 \\4 \\3 \\2', line)
-  line = FOUR_NOTATION_COLOR_RE.sub('\\1\\2 \\5 \\4 \\3', line)
-  logging.debug('FixFourPartNotation returns: %s' % line)
-  return line
-
-
-def FixBackgroundPosition(line):
-  """Fixes horizontal background percentage values in line.
-
-  Args:
-    line: A string to fix horizontal background position values in.
-
-  Returns:
-    line reformatted with the 4 part notations swapped.
-  """
-  line = BG_HORIZONTAL_PERCENTAGE_RE.sub(CalculateNewBackgroundPosition, line)
-  line = BG_HORIZONTAL_PERCENTAGE_X_RE.sub(CalculateNewBackgroundPositionX,
-                                           line)
-  logging.debug('FixBackgroundPosition returns: %s' % line)
-  return line
-
-
-def CalculateNewBackgroundPosition(m):
-  """Fixes horizontal background-position percentages.
-
-  This function should be used as an argument to re.sub since it needs to
-  perform replacement specific calculations.
-
-  Args:
-    m: A match object.
-
-  Returns:
-    A string with the horizontal background position percentage fixed.
-    BG_HORIZONTAL_PERCENTAGE_RE.sub(FixBackgroundPosition,
-                                    'background-position: 75% 50%')
-    will return 'background-position: 25% 50%'.
-  """
-
-  # The flipped value is the offset from 100%
-  new_x = str(100-int(m.group(4)))
-
-  # Since m.group(1) may very well be None type and we need a string..
-  if m.group(1):
-    position_string = m.group(1)
-  else:
-    position_string = ''
-
-  return 'background%s%s%s%s%%%s' % (position_string, m.group(2), m.group(3),
-                                     new_x, m.group(5))
-
-
-def CalculateNewBackgroundPositionX(m):
-  """Fixes percent based background-position-x.
-
-  This function should be used as an argument to re.sub since it needs to
-  perform replacement specific calculations.
-
-  Args:
-    m: A match object.
-
-  Returns:
-    A string with the background-position-x percentage fixed.
-    BG_HORIZONTAL_PERCENTAGE_X_RE.sub(CalculateNewBackgroundPosition,
-                                      'background-position-x: 75%')
-    will return 'background-position-x: 25%'.
-  """
-
-  # The flipped value is the offset from 100%
-  new_x = str(100-int(m.group(2)))
-
-  return 'background-position-x%s%s%%' % (m.group(1), new_x)
-
-
-def ChangeLeftToRightToLeft(lines,
-                            swap_ltr_rtl_in_url=None,
-                            swap_left_right_in_url=None):
-  """Turns lines into a stream and runs the fixing functions against it.
-
-  Args:
-    lines: An list of CSS lines.
-    swap_ltr_rtl_in_url: Overrides this flag if param is set.
-    swap_left_right_in_url: Overrides this flag if param is set.
-
-  Returns:
-    The same lines, but with left and right fixes.
-  """
-
-  global FLAGS
-
-  # Possibly override flags with params.
-  logging.debug('ChangeLeftToRightToLeft swap_ltr_rtl_in_url=%s, '
-                'swap_left_right_in_url=%s' % (swap_ltr_rtl_in_url,
-                                               swap_left_right_in_url))
-  if swap_ltr_rtl_in_url is None:
-    swap_ltr_rtl_in_url = FLAGS['swap_ltr_rtl_in_url']
-  if swap_left_right_in_url is None:
-    swap_left_right_in_url = FLAGS['swap_left_right_in_url']
-
-  # Turns the array of lines into a single line stream.
-  logging.debug('LINES COUNT: %s' % len(lines))
-  line = TOKEN_LINES.join(lines)
-
-  # Tokenize any single line rules with the /* noflip */ annotation.
-  noflip_single_tokenizer = Tokenizer(NOFLIP_SINGLE_RE, 'NOFLIP_SINGLE')
-  line = noflip_single_tokenizer.Tokenize(line)
-
-  # Tokenize any class rules with the /* noflip */ annotation.
-  noflip_class_tokenizer = Tokenizer(NOFLIP_CLASS_RE, 'NOFLIP_CLASS')
-  line = noflip_class_tokenizer.Tokenize(line)
-
-  # Tokenize the comments so we can preserve them through the changes.
-  comment_tokenizer = Tokenizer(COMMENT_RE, 'C')
-  line = comment_tokenizer.Tokenize(line)
-
-  # Here starteth the various left/right orientation fixes.
-  line = FixBodyDirectionLtrAndRtl(line)
-
-  if swap_left_right_in_url:
-    line = FixLeftAndRightInUrl(line)
-
-  if swap_ltr_rtl_in_url:
-    line = FixLtrAndRtlInUrl(line)
-
-  line = FixLeftAndRight(line)
-  line = FixCursorProperties(line)
-  line = FixFourPartNotation(line)
-  line = FixBackgroundPosition(line)
-
-  # DeTokenize the single line noflips.
-  line = noflip_single_tokenizer.DeTokenize(line)
-
-  # DeTokenize the class-level noflips.
-  line = noflip_class_tokenizer.DeTokenize(line)
-
-  # DeTokenize the comments.
-  line = comment_tokenizer.DeTokenize(line)
-
-  # Rejoin the lines back together.
-  lines = line.split(TOKEN_LINES)
-
-  return lines
-
-def usage():
-  """Prints out usage information."""
-
-  print 'Usage:'
-  print '  ./cssjanus.py < file.css > file-rtl.css'
-  print 'Flags:'
-  print '  --swap_left_right_in_url: Fixes "left"/"right" string within urls.'
-  print '  Ex: ./cssjanus.py --swap_left_right_in_url < file.css > file_rtl.css'
-  print '  --swap_ltr_rtl_in_url: Fixes "ltr"/"rtl" string within urls.'
-  print '  Ex: ./cssjanus --swap_ltr_rtl_in_url < file.css > file_rtl.css'
-
-def setflags(opts):
-  """Parse the passed in command line arguments and set the FLAGS global.
-
-  Args:
-    opts: getopt iterable intercepted from argv.
-  """
-
-  global FLAGS
-
-  # Parse the arguments.
-  for opt, arg in opts:
-    logging.debug('opt: %s, arg: %s' % (opt, arg))
-    if opt in ("-h", "--help"):
-      usage()
-      sys.exit()
-    elif opt in ("-d", "--debug"):
-      logging.getLogger().setLevel(logging.DEBUG)
-    elif opt == '--swap_ltr_rtl_in_url':
-      FLAGS['swap_ltr_rtl_in_url'] = True
-    elif opt == '--swap_left_right_in_url':
-      FLAGS['swap_left_right_in_url'] = True
-
-
-def main(argv):
-  """Sends stdin lines to ChangeLeftToRightToLeft and writes to stdout."""
-
-  # Define the flags.
-  try:
-    opts, args = getopt.getopt(argv, 'hd', ['help', 'debug',
-                                            'swap_left_right_in_url',
-                                            'swap_ltr_rtl_in_url'])
-  except getopt.GetoptError:
-    usage()
-    sys.exit(2)
-
-  # Parse and set the flags.
-  setflags(opts)
-
-  # Call the main routine with all our functionality.
-  fixed_lines = ChangeLeftToRightToLeft(sys.stdin.readlines())
-  sys.stdout.write(''.join(fixed_lines))
-
-if __name__ == '__main__':
-  main(sys.argv[1:])
diff --git a/maintenance/cssjanus/csslex.py b/maintenance/cssjanus/csslex.py
deleted file mode 100644 (file)
index 1fc7304..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright 2007 Google Inc. All Rights Reserved.
-
-"""CSS Lexical Grammar rules.
-
-CSS lexical grammar from http://www.w3.org/TR/CSS21/grammar.html
-"""
-
-__author__ = ['elsigh@google.com (Lindsey Simon)',
-              'msamuel@google.com (Mike Samuel)']
-
-# public symbols
-__all__ = [ "NEWLINE", "HEX", "NON_ASCII", "UNICODE", "ESCAPE", "NMSTART", "NMCHAR", "STRING1", "STRING2", "IDENT", "NAME", "HASH", "NUM", "STRING", "URL", "SPACE", "WHITESPACE", "COMMENT", "QUANTITY", "PUNC" ]
-
-# The comments below are mostly copied verbatim from the grammar.
-
-# "@import"               {return IMPORT_SYM;}
-# "@page"                 {return PAGE_SYM;}
-# "@media"                {return MEDIA_SYM;}
-# "@charset"              {return CHARSET_SYM;}
-KEYWORD = r'(?:\@(?:import|page|media|charset))'
-
-# nl                      \n|\r\n|\r|\f ; a newline
-NEWLINE = r'\n|\r\n|\r|\f'
-
-# h                       [0-9a-f]      ; a hexadecimal digit
-HEX = r'[0-9a-f]'
-
-# nonascii                [\200-\377]
-NON_ASCII = r'[\200-\377]'
-
-# unicode                 \\{h}{1,6}(\r\n|[ \t\r\n\f])?
-UNICODE = r'(?:(?:\\' + HEX + r'{1,6})(?:\r\n|[ \t\r\n\f])?)'
-
-# escape                  {unicode}|\\[^\r\n\f0-9a-f]
-ESCAPE = r'(?:' + UNICODE + r'|\\[^\r\n\f0-9a-f])'
-
-# nmstart                 [_a-z]|{nonascii}|{escape}
-NMSTART = r'(?:[_a-z]|' + NON_ASCII + r'|' + ESCAPE + r')'
-
-# nmchar                  [_a-z0-9-]|{nonascii}|{escape}
-NMCHAR = r'(?:[_a-z0-9-]|' + NON_ASCII + r'|' + ESCAPE + r')'
-
-# ident                   -?{nmstart}{nmchar}*
-IDENT = r'-?' + NMSTART + NMCHAR + '*'
-
-# name                    {nmchar}+
-NAME = NMCHAR + r'+'
-
-# hash
-HASH = r'#' + NAME
-
-# string1                 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"  ; "string"
-STRING1 = r'"(?:[^\"\\]|\\.)*"'
-
-# string2                 \'([^\n\r\f\\']|\\{nl}|{escape})*\'  ; 'string'
-STRING2 = r"'(?:[^\'\\]|\\.)*'"
-
-# string                  {string1}|{string2}
-STRING = '(?:' + STRING1 + r'|' + STRING2 + ')'
-
-# num                     [0-9]+|[0-9]*"."[0-9]+
-NUM = r'(?:[0-9]*\.[0-9]+|[0-9]+)'
-
-# s                       [ \t\r\n\f]
-SPACE = r'[ \t\r\n\f]'
-
-# w                       {s}*
-WHITESPACE = '(?:' + SPACE + r'*)'
-
-# url special chars
-URL_SPECIAL_CHARS = r'[!#$%&*-~]'
-
-# url chars               ({url_special_chars}|{nonascii}|{escape})*
-URL_CHARS = r'(?:%s|%s|%s)*' % (URL_SPECIAL_CHARS, NON_ASCII, ESCAPE)
-
-# url
-URL = r'url\(%s(%s|%s)%s\)' % (WHITESPACE, STRING, URL_CHARS, WHITESPACE)
-
-# comments
-# see http://www.w3.org/TR/CSS21/grammar.html
-COMMENT = r'/\*[^*]*\*+([^/*][^*]*\*+)*/'
-
-# {E}{M}             {return EMS;}
-# {E}{X}             {return EXS;}
-# {P}{X}             {return LENGTH;}
-# {C}{M}             {return LENGTH;}
-# {M}{M}             {return LENGTH;}
-# {I}{N}             {return LENGTH;}
-# {P}{T}             {return LENGTH;}
-# {P}{C}             {return LENGTH;}
-# {D}{E}{G}          {return ANGLE;}
-# {R}{A}{D}          {return ANGLE;}
-# {G}{R}{A}{D}       {return ANGLE;}
-# {M}{S}             {return TIME;}
-# {S}                {return TIME;}
-# {H}{Z}             {return FREQ;}
-# {K}{H}{Z}          {return FREQ;}
-# %                  {return PERCENTAGE;}
-UNIT = r'(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)'
-
-# {num}{UNIT|IDENT}                   {return NUMBER;}
-QUANTITY = '%s(?:%s%s|%s)?' % (NUM, WHITESPACE, UNIT, IDENT)
-
-# "<!--"                  {return CDO;}
-# "-->"                   {return CDC;}
-# "~="                    {return INCLUDES;}
-# "|="                    {return DASHMATCH;}
-# {w}"{"                  {return LBRACE;}
-# {w}"+"                  {return PLUS;}
-# {w}">"                  {return GREATER;}
-# {w}","                  {return COMMA;}
-PUNC =  r'<!--|-->|~=|\|=|[\{\+>,:;]'
index 3d30b83..dbe9698 100644 (file)
@@ -30,8 +30,8 @@ require_once __DIR__ . '/Maintenance.php';
 class DeleteEqualMessages extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Deletes all pages in the MediaWiki namespace that are equal to '
-                       . 'the default message";
+               $this->mDescription = 'Deletes all pages in the MediaWiki namespace that are equal to '
+                       . 'the default message';
                $this->addOption( 'delete', 'Actually delete the pages (default: dry run)' );
                $this->addOption( 'delete-talk', 'Don\'t leave orphaned talk pages behind during deletion' );
                $this->addOption( 'lang-code', 'Check for subpages of this language code (default: root '
@@ -41,6 +41,7 @@ class DeleteEqualMessages extends Maintenance {
 
        /**
         * @param string|bool $langCode See --lang-code option.
+        * @param array &$messageInfo
         */
        protected function fetchMessageInfo( $langCode, array &$messageInfo ) {
                global $wgContLang;
@@ -137,10 +138,10 @@ class DeleteEqualMessages extends Maintenance {
                        return;
                }
 
-               $this->output( "\n{$messageInfo['relevantPages']} pages in the MediaWiki namespace ' .
-                       'override messages." );
-               $this->output( "\n{$messageInfo['equalPages']} pages are equal to the default message ' .
-                       '(+ {$messageInfo['equalPagesTalks']} talk pages).\n" );
+               $this->output( "\n{$messageInfo['relevantPages']} pages in the MediaWiki namespace "
+                       . "override messages." );
+               $this->output( "\n{$messageInfo['equalPages']} pages are equal to the default message "
+                       . "(+ {$messageInfo['equalPagesTalks']} talk pages).\n" );
 
                if ( !$doDelete ) {
                        $list = '';
index fc72908..99f43ff 100644 (file)
@@ -750,6 +750,7 @@ bmwschema
 bmysql
 bname
 bodycontent
+bogo
 boldening
 bolding
 booksources
@@ -861,6 +862,7 @@ categorypage
 categoryviewer
 catids
 catlinks
+catmsg
 catpage
 catrope
 cattitles
@@ -1677,6 +1679,7 @@ geocoordinate
 geodata
 geosearch
 gerrit
+geshi
 getcookie
 getenv
 getheader
@@ -1810,8 +1813,8 @@ hit
 hitcount
 hitcounter
 hits
+hlist
 hmac
-hmtl
 hobby
 homelink
 hookaborted
@@ -2245,17 +2248,16 @@ logextract
 loggedin
 logid
 login
-loginend
 loginerror
 loginfo
 loginlanguagelinks
 loginlink
+loginout
 loginprompt
 loginreqlink
 loginreqpagetext
 loginreqtitle
 logins
-loginstart
 logitem
 loglink
 loglist
@@ -2454,6 +2456,7 @@ moodbar
 moredotdotdot
 morelinkstoimage
 morethan
+mouseup
 move
 movedarticleprotection
 moveddeleted
@@ -2600,6 +2603,7 @@ newpos
 newquery
 newrevid
 news
+newsectionheaderdefaultlevel
 newsectionlink
 newsectionsummary
 newset
@@ -4011,6 +4015,7 @@ test
 testclean
 testdata
 testmailuser
+teston
 testpass
 testrunner
 testswarm
@@ -4157,6 +4162,7 @@ transwiki
 troff
 true
 truespeed
+truncatedtext
 trustworthy
 truteq
 truthy
@@ -4264,6 +4270,7 @@ unseed
 unserialization
 unserialize
 unserialized
+unserializes
 unserializing
 unsetting
 unstub
@@ -4438,6 +4445,7 @@ viewdeleted
 viewhelppage
 viewmyprivateinfo
 viewmywatchlist
+viewport
 viewprevnext
 viewsource
 viewsourcelink
@@ -4613,6 +4621,7 @@ xml
 xmldoublequote
 xmlfm
 xmlimport
+xmlmeta
 xmlns
 xmlselect
 xor
index 28a0545..46844c9 100644 (file)
@@ -44,6 +44,7 @@ if ( !$maintClass || !class_exists( $maintClass ) ) {
 }
 
 // Get an object to start us off
+/** @var Maintenance $maintenance */
 $maintenance = new $maintClass();
 
 // Basic sanity checks and such
@@ -89,6 +90,8 @@ if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
                $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
        }
 }
+
+$maintenance->setConfig( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
 $maintenance->finalSetup();
 // Some last includes
 require_once "$IP/includes/Setup.php";
index 074388f..66e8da0 100644 (file)
@@ -99,6 +99,7 @@ class FindHooks extends Maintenance {
                        $IP . '/includes/revisiondelete/',
                        $IP . '/includes/search/',
                        $IP . '/includes/site/',
+                       $IP . '/includes/skins/',
                        $IP . '/includes/specialpage/',
                        $IP . '/includes/specials/',
                        $IP . '/includes/upload/',
@@ -109,9 +110,6 @@ class FindHooks extends Maintenance {
                        $IP . '/tests/',
                        $IP . '/tests/parser/',
                        $IP . '/tests/phpunit/suites/',
-                       $IP . '/skins/',
-                       $IP . '/skins/MonoBook/',
-                       $IP . '/skins/Vector/',
                );
 
                foreach ( $pathinc as $dir ) {
@@ -136,7 +134,8 @@ class FindHooks extends Maintenance {
 
        /**
         * Get the hook documentation, either locally or from MediaWiki.org
-        * @return Array of documented hooks
+        * @param string $doc
+        * @return array Array of documented hooks
         */
        private function getHooksFromDoc( $doc ) {
                if ( $this->hasOption( 'online' ) ) {
@@ -149,7 +148,7 @@ class FindHooks extends Maintenance {
        /**
         * Get hooks from a local file (for example docs/hooks.txt)
         * @param string $doc Filename to look in
-        * @return Array of documented hooks
+        * @return array Array of documented hooks
         */
        private function getHooksFromLocalDoc( $doc ) {
                $m = array();
@@ -161,45 +160,48 @@ class FindHooks extends Maintenance {
 
        /**
         * Get hooks from www.mediawiki.org using the API
-        * @return Array of documented hooks
+        * @return array Array of documented hooks
         */
        private function getHooksFromOnlineDoc() {
-               // All hooks
-               $allhookdata = Http::get(
-                       'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&'
-                       . 'cmtitle=Category:MediaWiki_hooks&cmlimit=500&format=php'
+               $allhooks = $this->getHooksFromOnlineDocCategory( 'MediaWiki_hooks' );
+               $removed = $this->getHooksFromOnlineDocCategory( 'Removed_hooks' );
+               return array_diff( $allhooks, $removed );
+       }
+
+       /**
+        * @param string $title
+        * @return array
+        */
+       private function getHooksFromOnlineDocCategory( $title ) {
+               $params = array(
+                       'action' => 'query',
+                       'list' => 'categorymembers',
+                       'cmtitle' => "Category:$title",
+                       'cmlimit' => 500,
+                       'format' => 'json',
+                       'continue' => '',
                );
-               $allhookdata = unserialize( $allhookdata );
-               $allhooks = array();
-               foreach ( $allhookdata['query']['categorymembers'] as $page ) {
-                       $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
-                       if ( $found ) {
-                               $hook = str_replace( ' ', '_', $matches[1] );
-                               $allhooks[] = $hook;
+
+               $retval = array();
+               while ( true ) {
+                       $json = Http::get( wfAppendQuery( 'http://www.mediawiki.org/w/api.php', $params ) );
+                       $data = FormatJson::decode( $json, true );
+                       foreach ( $data['query']['categorymembers'] as $page ) {
+                               if ( preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $m ) ) {
+                                       $retval[] = str_replace( ' ', '_', $m[1] );
+                               }
                        }
-               }
-               // Removed hooks
-               $oldhookdata = Http::get(
-                       'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&'
-                       . 'cmtitle=Category:Removed_hooks&cmlimit=500&format=php'
-               );
-               $oldhookdata = unserialize( $oldhookdata );
-               $removed = array();
-               foreach ( $oldhookdata['query']['categorymembers'] as $page ) {
-                       $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
-                       if ( $found ) {
-                               $hook = str_replace( ' ', '_', $matches[1] );
-                               $removed[] = $hook;
+                       if ( !isset( $data['continue'] ) ) {
+                               return $retval;
                        }
+                       $params = array_replace( $params, $data['continue'] );
                }
-
-               return array_diff( $allhooks, $removed );
        }
 
        /**
         * Get hooks from a PHP file
         * @param string $file Full filename to the PHP file.
-        * @return Array of hooks found.
+        * @return array Array of hooks found
         */
        private function getHooksFromFile( $file ) {
                $content = file_get_contents( $file );
@@ -216,7 +218,7 @@ class FindHooks extends Maintenance {
        /**
         * Get hooks from the source code.
         * @param string $path Directory where the include files can be found
-        * @return Array of hooks found.
+        * @return array Array of hooks found
         */
        private function getHooksFromPath( $path ) {
                $hooks = array();
@@ -236,7 +238,7 @@ class FindHooks extends Maintenance {
        /**
         * Get bad hooks (where the hook name could not be determined) from a PHP file
         * @param string $file Full filename to the PHP file.
-        * @return Array of bad wfRunHooks() lines
+        * @return array Array of bad wfRunHooks() lines
         */
        private function getBadHooksFromFile( $file ) {
                $content = file_get_contents( $file );
@@ -254,7 +256,7 @@ class FindHooks extends Maintenance {
        /**
         * Get bad hooks from the source code.
         * @param string $path Directory where the include files can be found
-        * @return Array of bad wfRunHooks() lines
+        * @return array Array of bad wfRunHooks() lines
         */
        private function getBadHooksFromPath( $path ) {
                $hooks = array();
index 8c71699..5818ee2 100644 (file)
@@ -26,8 +26,10 @@ class FindMissingFiles extends Maintenance {
                parent::__construct();
 
                $this->mDescription = 'Find registered files with no corresponding file.';
-               $this->addOption( 'start', 'Starting file name', false, true );
-               $this->setBatchSize( 200 );
+               $this->addOption( 'start', 'Start after this file name', false, true );
+               $this->addOption( 'mtimeafter', 'Only include files changed since this time', false, true );
+               $this->addOption( 'mtimebefore', 'Only includes files changed before this time', false, true );
+               $this->setBatchSize( 300 );
        }
 
        function execute() {
@@ -37,20 +39,44 @@ class FindMissingFiles extends Maintenance {
                $dbr = $repo->getSlaveDB();
                $be = $repo->getBackend();
 
+               $mtime1 = $dbr->timestampOrNull( $this->getOption( 'mtimeafter', null ) );
+               $mtime2 = $dbr->timestampOrNull( $this->getOption( 'mtimebefore', null ) );
+
+               $joinTables = array();
+               $joinConds = array();
+               if ( $mtime1 || $mtime2 ) {
+                       $joinTables[] = 'page';
+                       $joinConds['page'] = array( 'INNER JOIN',
+                               array( 'page_title = img_name', 'page_namespace' => NS_FILE ) );
+                       $joinTables[] = 'logging';
+                       $on = array( 'log_page = page_id', 'log_type' => array( 'upload', 'move', 'delete' ) );
+                       if ( $mtime1 ) {
+                               $on[] = "log_timestamp > {$dbr->addQuotes($mtime1)}";
+                       }
+                       if ( $mtime2 ) {
+                               $on[] = "log_timestamp < {$dbr->addQuotes($mtime2)}";
+                       }
+                       $joinConds['logging'] = array( 'INNER JOIN', $on );
+               }
+
                do {
-                       $res = $dbr->select( 'image',
-                               'img_name',
-                               array( "img_name >= " . $dbr->addQuotes( $lastName ) ),
+                       $res = $dbr->select(
+                               array_merge( array( 'image' ), $joinTables ),
+                               array( 'name' => 'img_name' ),
+                               array( "img_name > " . $dbr->addQuotes( $lastName ) ),
                                __METHOD__,
-                               array( 'ORDER BY' => 'img_name', 'LIMIT' => $this->mBatchSize )
+                               // DISTINCT causes a pointless filesort
+                               array( 'ORDER BY' => 'name', 'GROUP BY' => 'name',
+                                       'LIMIT' => $this->mBatchSize ),
+                               $joinConds
                        );
 
                        // Check if any of these files are missing...
                        $pathsByName = array();
                        foreach ( $res as $row ) {
-                               $file = $repo->newFile( $row->img_name );
-                               $pathsByName[$row->img_name] = $file->getPath();
-                               $lastName = $row->img_name;
+                               $file = $repo->newFile( $row->name );
+                               $pathsByName[$row->name] = $file->getPath();
+                               $lastName = $row->name;
                        }
                        $be->preloadFileStat( array( 'srcs' => $pathsByName ) );
                        foreach ( $pathsByName as $path ) {
@@ -66,14 +92,22 @@ class FindMissingFiles extends Maintenance {
                                        array( 'oi_name' => array_keys( $pathsByName ) ),
                                        __METHOD__
                                );
+
+                               $checkPaths = array();
                                foreach ( $ores as $row ) {
                                        if ( !strlen( $row->oi_archive_name ) ) {
                                                continue; // broken row
                                        }
                                        $file = $repo->newFromArchiveName( $row->oi_name, $row->oi_archive_name );
-                                       $path = $file->getPath();
-                                       if ( $be->fileExists( array( 'src' => $path ) ) === false ) {
-                                               $this->output( "$path\n" );
+                                       $checkPaths[] = $file->getPath();
+                               }
+
+                               foreach ( array_chunk( $checkPaths, $this->mBatchSize ) as $paths ) {
+                                       $be->preloadFileStat( array( 'srcs' => $paths ) );
+                                       foreach ( $paths as $path ) {
+                                               if ( $be->fileExists( array( 'src' => $path ) ) === false ) {
+                                                       $this->output( "$path\n" );
+                                               }
                                        }
                                }
                        }
index 1db53f3..d5f6834 100644 (file)
@@ -87,7 +87,7 @@ class GetConfiguration extends Maintenance {
        public function finalSetup() {
                parent::finalSetup();
 
-               $this->regex = $this->getOption( 'regex' ) ? : $this->getOption( 'iregex' );
+               $this->regex = $this->getOption( 'regex' ) ?: $this->getOption( 'iregex' );
                if ( $this->regex ) {
                        $this->regex = '/' . $this->regex . '/';
                        if ( $this->hasOption( 'iregex' ) ) {
index 7705ec9..e67d077 100644 (file)
@@ -70,33 +70,40 @@ class ImportSiteScripts extends Maintenance {
        protected function fetchScriptList() {
                $data = array(
                        'action' => 'query',
-                       'format' => 'php', //'json',
+                       'format' => 'json',
                        'list' => 'allpages',
                        'apnamespace' => '8',
                        'aplimit' => '500',
+                       'continue' => '',
                );
                $baseUrl = $this->getArg( 0 );
                $pages = array();
 
-               do {
+               while ( true ) {
                        $url = wfAppendQuery( $baseUrl, $data );
                        $strResult = Http::get( $url );
-                       //$result = FormatJson::decode( $strResult ); // Still broken
-                       $result = unserialize( $strResult );
+                       $result = FormatJson::decode( $strResult, true );
 
-                       if ( !empty( $result['query']['allpages'] ) ) {
-                               foreach ( $result['query']['allpages'] as $page ) {
-                                       if ( substr( $page['title'], -3 ) === '.js' ) {
-                                               strtok( $page['title'], ':' );
-                                               $pages[] = strtok( '' );
-                                       }
+                       $page = null;
+                       foreach ( $result['query']['allpages'] as $page ) {
+                               if ( substr( $page['title'], -3 ) === '.js' ) {
+                                       strtok( $page['title'], ':' );
+                                       $pages[] = strtok( '' );
                                }
                        }
-                       if ( !empty( $result['query-continue'] ) ) {
-                               $data['apfrom'] = $result['query-continue']['allpages']['apfrom'];
-                               $this->output( "Fetching new batch from {$data['apfrom']}\n" );
+
+                       if ( $page !== null ) {
+                               $this->output( "Fetched list up to {$page['title']}\n" );
+                       }
+
+                       if ( isset( $result['continue'] ) ) { // >= 1.21
+                               $data = array_replace( $data, $result['continue'] );
+                       } elseif ( isset( $result['query-continue']['allpages'] ) ) { // <= 1.20
+                               $data = array_replace( $data, $result['query-continue']['allpages'] );
+                       } else {
+                               break;
                        }
-               } while ( isset( $result['query-continue'] ) );
+               }
 
                return $pages;
        }
index e97f292..3a74804 100644 (file)
@@ -17,6 +17,7 @@
                "../../resources/src/mediawiki.language",
                "../../resources/src/mediawiki.page",
                "../../resources/src/mediawiki.special",
+               "../../resources/src/mediawiki.toolbar",
                "../../resources/src/jquery/jquery.accessKeyLabel.js",
                "../../resources/src/jquery/jquery.arrowSteps.js",
                "../../resources/src/jquery/jquery.autoEllipsis.js",
index db6c315..973cf7b 100644 (file)
@@ -48,7 +48,7 @@ class GenerateCollationData extends Maintenance {
         * Important tertiary weights from UTS #10 section 7.2
         */
        const NORMAL_UPPERCASE = 0x08;
-       const NORMAL_HIRAGANA = 0X0E;
+       const NORMAL_HIRAGANA = 0x0E;
 
        public function __construct() {
                parent::__construct();
diff --git a/maintenance/mssql/archives/patch-fa_major_mime-chemical.sql b/maintenance/mssql/archives/patch-fa_major_mime-chemical.sql
new file mode 100644 (file)
index 0000000..1836808
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/filearchive
+DROP CONSTRAINT fa_major_mime_ckc;
+ALTER TABLE /*_*/filearchive
+WITH NOCHECK ADD CONSTRAINT fa_major_mime_ckc CHECK (fa_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical'));
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-img_major_mime-chemical.sql b/maintenance/mssql/archives/patch-img_major_mime-chemical.sql
new file mode 100644 (file)
index 0000000..eed0786
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/image
+DROP CONSTRAINT img_major_mime_ckc;
+ALTER TABLE /*_*/image
+WITH NOCHECK ADD CONSTRAINT img_major_mime_ckc CHECK (img_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical'));
\ No newline at end of file
diff --git a/maintenance/mssql/archives/patch-oi_major_mime-chemical.sql b/maintenance/mssql/archives/patch-oi_major_mime-chemical.sql
new file mode 100644 (file)
index 0000000..35482ed
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/oldimage
+DROP CONSTRAINT oi_major_mime_ckc;
+ALTER TABLE /*_*/oldimage
+WITH NOCHECK ADD CONSTRAINT oi_major_mime_ckc CHECK (oi_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical'));
\ No newline at end of file
index daaa81e..b9cd715 100644 (file)
@@ -594,7 +594,7 @@ CREATE TABLE /*_*/image (
   -- SHA-1 content hash in base-36
   img_sha1 nvarchar(32) NOT NULL default '',
 
-  CONSTRAINT img_major_mime_ckc check (img_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart')),
+  CONSTRAINT img_major_mime_ckc check (img_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
   CONSTRAINT img_media_type_ckc check (img_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'))
 );
 
@@ -639,7 +639,7 @@ CREATE TABLE /*_*/oldimage (
   oi_deleted tinyint NOT NULL default 0,
   oi_sha1 nvarchar(32) NOT NULL default '',
 
-  CONSTRAINT oi_major_mime_ckc check (oi_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart')),
+  CONSTRAINT oi_major_mime_ckc check (oi_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
   CONSTRAINT oi_media_type_ckc check (oi_media_type IN('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'))
 );
 
@@ -700,7 +700,7 @@ CREATE TABLE /*_*/filearchive (
   -- sha1 hash of file content
   fa_sha1 nvarchar(32) NOT NULL default '',
 
-  CONSTRAINT fa_major_mime_ckc check (fa_major_mime in('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart')),
+  CONSTRAINT fa_major_mime_ckc check (fa_major_mime in('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
   CONSTRAINT fa_media_type_ckc check (fa_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'))
 );
 
diff --git a/maintenance/mssql/update-keys.sql b/maintenance/mssql/update-keys.sql
new file mode 100644 (file)
index 0000000..4d2c1c1
--- /dev/null
@@ -0,0 +1,31 @@
+-- Update keys for Microsoft SQL Server
+-- SQL to insert update keys into the initial tables after a
+-- fresh installation of MediaWiki's database.
+-- This is read and executed by the install script; you should
+-- not have to run it by itself unless doing a manual install.
+-- Insert keys here if either the unnecessary would cause heavy
+-- processing or could potentially cause trouble by lowering field
+-- sizes, adding constraints, etc.
+-- When adjusting field sizes, it is recommended removing old
+-- patches but to play safe, update keys should also inserted here.
+
+--
+-- The /*_*/ comments in this and other files are
+-- replaced with the defined table prefix by the installer
+-- and updater scripts. If you are installing or running
+-- updates manually, you will need to manually insert the
+-- table prefix if any when running these scripts.
+--
+
+INSERT INTO /*_*/updatelog
+       SELECT 'filearchive-fa_major_mime-patch-fa_major_mime-chemical.sql' AS ul_key, null as ul_value
+       UNION SELECT 'image-img_major_mime-patch-img_major_mime-chemical.sql', null
+       UNION SELECT 'oldimage-oi_major_mime-patch-oi_major_mime-chemical.sql', null
+       UNION SELECT 'cl_type-category_types-ck', null
+       UNION SELECT 'fa_major_mime-major_mime-ck', null
+       UNION SELECT 'fa_media_type-media_type-ck', null
+       UNION SELECT 'img_major_mime-major_mime-ck', null
+       UNION SELECT 'img_media_type-media_type-ck', null
+       UNION SELECT 'oi_major_mime-major_mime-ck', null
+       UNION SELECT 'oi_media_type-media_type-ck', null
+       UNION SELECT 'us_media_type-media_type-ck', null;
\ No newline at end of file
index c80981b..0cc7bde 100644 (file)
@@ -16,8 +16,33 @@ if ( PHP_SAPI != 'cli' ) {
 }
 
 $source = file_get_contents( $argv[1] );
-$regexp = '#\@var\s+([^\s]+)([^/]+)/\s+(var|public|protected|private)\s+(\$[^\s;=]+)#';
-$replac = '${2} */ ${3} ${1} ${4}';
+$regexp = '#'
+       . '\@var'
+       . '\s+'
+       // Type hint
+       . '([^\s]+)'
+       . '\s+'
+       // Any text or line(s) between type hint and '/' closing the comment
+       // (includes the star of "*/"). Descriptions containing a slash
+       // are not supported. Those will have to to be rewritten to have their
+       // description *before* the @var:
+       // /**
+       //  * Description with / in it.
+       //  * @var array
+       //  */
+       // instead of:
+       // /**
+       //  * @var array Description with / in it.
+       //  */
+       . '([^/]+)'
+       . '/'
+       . '\s+'
+       . '(var|public|protected|private)'
+       . '\s+'
+       // Variable name
+       . '(\$[^\s;=]+)'
+       . '#';
+$replac = '${2}/ ${3} ${1} ${4}';
 $source = preg_replace( $regexp, $replac, $source );
 
 echo $source;
index 1e0fa40..36be16e 100644 (file)
@@ -88,7 +88,7 @@ CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_name
 
 -- Create a dummy page to satisfy fk contraints especially with revisions
 INSERT INTO &mw_prefix.page
-  VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, NULL, 0, 0, NULL);
+  VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, NULL, 0, 0, NULL, NULL);
 
 /*$mw$*/
 CREATE TRIGGER &mw_prefix.page_set_random BEFORE INSERT ON &mw_prefix.page
diff --git a/maintenance/populateBloomCache.php b/maintenance/populateBloomCache.php
new file mode 100644 (file)
index 0000000..40ad5fc
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Script to populate a bloom filter with a BloomFilter* class
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Script to populate a bloom filter with a BloomFilter* class
+ *
+ * @ingroup Maintenance
+ */
+class PopulateBloomFilter extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addOption( 'cache', 'Bloom cache store name', true, true );
+               $this->addOption( 'filter', 'Bloom filter name', true, true );
+               $this->addOption( 'domain', 'Bloom filter domain', true, true );
+               $this->addOption( 'delay', 'Sleep delay between batches (us)', false, true );
+               $this->mDescription = "Populate the specified bloom filter";
+       }
+
+       public function execute() {
+               $type = $this->getOption( 'filter' );
+               $domain = $this->getOption( 'domain' );
+               $bcache = BloomCache::get( $this->getOption( 'cache' ) );
+               $delay = $this->getOption( 'delay', 1e5 );
+
+               if ( !method_exists( "BloomFilter{$type}", 'merge' ) ) {
+                       $this->error( "No \"BloomFilter{$type}::merge\" method found.", 1 );
+               }
+
+               $virtualKey = "$domain:$type";
+               $status = $bcache->getStatus( $virtualKey );
+               if ( $status == false ) {
+                       $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 );
+               }
+
+               $startTime = microtime( true );
+               $this->output( "Current timestamp is '$startTime'.\n" );
+               $this->output( "Current filter timestamp is '{$status['asOfTime']}'.\n" );
+
+               do {
+                       $status = call_user_func_array(
+                               array( "BloomFilter{$type}", 'merge' ),
+                               array( $bcache, $domain, $virtualKey, $status )
+                       );
+                       if ( $status == false ) {
+                               $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 );
+                       }
+                       $this->output( "Filter updated to timestamp '{$status['asOfTime']}'.\n" );
+                       usleep( $delay );
+               } while ( $status['asOfTime'] && $status['asOfTime'] < $startTime );
+
+               $this->output( "Done, filter $type of domain $domain reached time '$startTime'.\n" );
+       }
+}
+
+$maintClass = "PopulateBloomFilter";
+require_once RUN_MAINTENANCE_IF_MAIN;
index 9155623..cb55f0f 100644 (file)
@@ -159,6 +159,7 @@ class PPFuzzTest {
 
        /**
         * @param Title $title
+        * @return array
         */
        function templateHook( $title ) {
                $titleText = $title->getPrefixedDBkey();
index 4ce9474..6702209 100644 (file)
@@ -164,6 +164,7 @@ class PurgeChangedPages extends Maintenance {
         *
         * @param ResultWrapper $res Query result sorted by $column (ascending)
         * @param string $column
+        * @param int $limit
         * @return array (array of rows, string column value)
         */
        protected function pageableSortedRows( ResultWrapper $res, $column, $limit ) {
diff --git a/maintenance/purgeOldText.inc b/maintenance/purgeOldText.inc
deleted file mode 100644 (file)
index 913e9f0..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-
-/**
- * Support functions for cleaning up redundant text records
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- * @author Rob Church <robchur@gmail.com>
- */
-
-function PurgeRedundantText( $delete = false ) {
-
-       # Data should come off the master, wrapped in a transaction
-       $dbw = wfGetDB( DB_MASTER );
-       $dbw->begin( __METHOD__ );
-
-       $tbl_arc = $dbw->tableName( 'archive' );
-       $tbl_rev = $dbw->tableName( 'revision' );
-       $tbl_txt = $dbw->tableName( 'text' );
-
-       # Get "active" text records from the revisions table
-       echo "Searching for active text records in revisions table...";
-       $res = $dbw->query( "SELECT DISTINCT rev_text_id FROM $tbl_rev" );
-       foreach ( $res as $row ) {
-               $cur[] = $row->rev_text_id;
-       }
-       echo "done.\n";
-
-       # Get "active" text records from the archive table
-       echo "Searching for active text records in archive table...";
-       $res = $dbw->query( "SELECT DISTINCT ar_text_id FROM $tbl_arc" );
-       $cur = array();
-       foreach ( $res as $row ) {
-               $cur[] = $row->ar_text_id;
-       }
-       echo "done.\n";
-
-       # Get the IDs of all text records not in these sets
-       echo "Searching for inactive text records...";
-       $set = implode( ', ', $cur );
-       $res = $dbw->query( "SELECT old_id FROM $tbl_txt WHERE old_id NOT IN ( $set )" );
-       $old = array();
-       foreach ( $res as $row ) {
-               $old[] = $row->old_id;
-       }
-       echo "done.\n";
-
-       # Inform the user of what we're going to do
-       $count = count( $old );
-       echo "$count inactive items found.\n";
-
-       # Delete as appropriate
-       if ( $delete && $count ) {
-               echo "Deleting...";
-               $set = implode( ', ', $old );
-               $dbw->query( "DELETE FROM $tbl_txt WHERE old_id IN ( $set )" );
-               echo "done.\n";
-       }
-
-       # Done
-       $dbw->commit( __METHOD__ );
-}
index 1b35292..651f211 100755 (executable)
@@ -71,8 +71,8 @@ NEWCHANGES=$(git log $OLDHASH.. --oneline --no-merges --reverse --color=never)
 NEWCHANGESDISPLAY=$(git log $OLDHASH.. --oneline --no-merges --reverse --color=always)
 
 # Copy files
-# - Exclude the default non-svg stylesheet
-rsync --recursive --delete --force --exclude 'oojs-ui.css' --exclude 'oojs-ui*.rtl.css' ./dist/ "$TARGET_REPO/$TARGET_DIR" || exit 1
+# - Exclude the minimised distribution files and RTL sheets for non-CSSJanus environments
+rsync --recursive --delete --force --exclude 'oojs-ui*.min.*' --exclude 'oojs-ui*.rtl.css' ./dist/ "$TARGET_REPO/$TARGET_DIR" || exit 1
 
 # Read the new version
 NEWVERSION=$(oojsuiversion)
index 38f346b..a9f7d8b 100644 (file)
@@ -38,16 +38,19 @@ class ShowJobs extends Maintenance {
                parent::__construct();
                $this->mDescription = "Show number of jobs waiting in master database";
                $this->addOption( 'group', 'Show number of jobs per job type' );
-               $this->addOption(
-                       'list',
-                       'Show a complete list of all jobs in a machine-readable format, instead of statistics'
-               );
+               $this->addOption( 'list',
+                       'Show a list of all jobs in a machine-readable format, instead of statistics' );
+               $this->addOption( 'type', 'Only show/count jobs of a given type', false, true );
        }
 
        public function execute() {
+               $filterType = $this->getOption( 'type', '' );
                $group = JobQueueGroup::singleton();
                if ( $this->hasOption( 'list' ) ) {
                        foreach ( $group->getQueueTypes() as $type ) {
+                               if ( $filterType != '' && $type != $filterType ) {
+                                       continue;
+                               }
                                $queue = $group->get( $type );
                                foreach ( $queue->getAllQueuedJobs() as $job ) {
                                        $this->output( $job->toString() . " status=unclaimed\n" );
@@ -58,13 +61,16 @@ class ShowJobs extends Maintenance {
                        }
                } elseif ( $this->hasOption( 'group' ) ) {
                        foreach ( $group->getQueueTypes() as $type ) {
+                               if ( $filterType != '' && $type != $filterType ) {
+                                       continue;
+                               }
                                $queue = $group->get( $type );
                                $delayed = $queue->getDelayedCount();
                                $pending = $queue->getSize();
                                $claimed = $queue->getAcquiredCount();
                                $abandoned = $queue->getAbandonedCount();
                                $active = max( 0, $claimed - $abandoned );
-                               if ( ( $pending + $claimed + $delayed ) > 0 ) {
+                               if ( ( $pending + $claimed + $delayed + $abandoned ) > 0 ) {
                                        $this->output(
                                                "{$type}: $pending queued; " .
                                                "$claimed claimed ($active active, $abandoned abandoned); " .
@@ -75,6 +81,9 @@ class ShowJobs extends Maintenance {
                } else {
                        $count = 0;
                        foreach ( $group->getQueueTypes() as $type ) {
+                               if ( $filterType != '' && $type != $filterType ) {
+                                       continue;
+                               }
                                $count += $group->get( $type )->getSize();
                        }
                        $this->output( "$count\n" );
index 389b270..afa3ef7 100644 (file)
@@ -39,7 +39,7 @@ class MwSql extends Maintenance {
        }
 
        public function execute() {
-               $wiki = $this->getOption( 'wikidb' ) ? : false;
+               $wiki = $this->getOption( 'wikidb' ) ?: false;
                // Get the appropriate load balancer (for this wiki)
                if ( $this->hasOption( 'cluster' ) ) {
                        $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ), $wiki );
index 43b2598..5c0fd07 100644 (file)
@@ -42,7 +42,7 @@ class Sqlite {
         * Will throw exceptions on SQL errors
         * @param array|string $files
         * @throws MWException
-        * @return True if no error or error string in case of errors
+        * @return bool True if no error or error string in case of errors
         */
        public static function checkSqlSyntax( $files ) {
                if ( !Sqlite::isPresent() ) {
index 0f337ec..cfffbbc 100644 (file)
@@ -136,7 +136,11 @@ class CompressOld extends Maintenance {
                }
        }
 
-       /** @todo document */
+       /**
+        * @todo document
+        * @param int $start
+        * @param string $extdb
+        */
        private function compressOldPages( $start = 0, $extdb = '' ) {
                $chunksize = 50;
                $this->output( "Starting from old_id $start...\n" );
index 307d0b0..910f56b 100644 (file)
@@ -289,6 +289,8 @@ class RecompressTracked {
 
        /**
         * Dispatch a command to a specified slave
+        * @param int $slaveId
+        * @param array|string $args
         */
        function dispatchToSlave( $slaveId, $args ) {
                $args = (array)$args;
@@ -352,6 +354,9 @@ class RecompressTracked {
 
        /**
         * Display a progress report
+        * @param string $label
+        * @param int $current
+        * @param int $end
         */
        function report( $label, $current, $end ) {
                $this->numBatches++;
@@ -707,6 +712,8 @@ class CgzCopyTransaction {
 
        /**
         * Create a transaction from a RecompressTracked object
+        * @param RecompressTracked $parent
+        * @param string $blobClass
         */
        function __construct( $parent, $blobClass ) {
                $this->blobClass = $blobClass;
index dff5cb8..290f164 100644 (file)
@@ -65,6 +65,9 @@ function resolveStubs() {
 
 /**
  * Resolve a history stub
+ * @param int $id
+ * @param string $stubText
+ * @param string $flags
  */
 function resolveStub( $id, $stubText, $flags ) {
        $fname = 'resolveStub';
index b9493cd..14a1502 100644 (file)
@@ -280,6 +280,7 @@ class SyncFileBackend extends Maintenance {
         * Substitute the backend name of storage paths with that of a given one
         *
         * @param array|string $paths List of paths or single string path
+        * @param FileBackend $backend
         * @return array|string
         */
        protected function replaceNamePaths( $paths, FileBackend $backend ) {
index f181e0f..0228684 100644 (file)
@@ -847,7 +847,8 @@ CREATE TABLE /*_*/image (
 
   -- major part of a MIME media type as defined by IANA
   -- see http://www.iana.org/assignments/media-types/
-  img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
+  -- for "chemical" cf. http://dx.doi.org/10.1021/ci9803233 by the ACS
+  img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
 
   -- minor part of a MIME media type as defined by IANA
   -- the minor parts are not required to adher to any standard
@@ -906,7 +907,7 @@ CREATE TABLE /*_*/oldimage (
 
   oi_metadata mediumblob NOT NULL,
   oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
-  oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
+  oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
   oi_minor_mime varbinary(100) NOT NULL default "unknown",
   oi_deleted tinyint unsigned NOT NULL default 0,
   oi_sha1 varbinary(32) NOT NULL default ''
@@ -956,7 +957,7 @@ CREATE TABLE /*_*/filearchive (
   fa_metadata mediumblob,
   fa_bits int default 0,
   fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
-  fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") default "unknown",
+  fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown",
   fa_minor_mime varbinary(100) default "unknown",
   fa_description tinyblob,
   fa_user int unsigned default 0,
diff --git a/maintenance/update-keys.sql b/maintenance/update-keys.sql
new file mode 100644 (file)
index 0000000..dfbb67e
--- /dev/null
@@ -0,0 +1,29 @@
+-- SQL to insert update keys into the initial tables after a
+-- fresh installation of MediaWiki's database.
+-- This is read and executed by the install script; you should
+-- not have to run it by itself unless doing a manual install.
+-- Insert keys here if either the unnecessary would cause heavy
+-- processing or could potentially cause trouble by lowering field
+-- sizes, adding constraints, etc.
+-- When adjusting field sizes, it is recommended removing old
+-- patches but to play safe, update keys should also inserted here.
+
+-- This is a shared file used for both MySQL and SQLite installs.
+-- Therefore inserting multiple values is not possible using the
+-- INSERT INTO VALUES syntax.
+--
+--
+-- The /*_*/ comments in this and other files are
+-- replaced with the defined table prefix by the installer
+-- and updater scripts. If you are installing or running
+-- updates manually, you will need to manually insert the
+-- table prefix if any when running these scripts.
+--
+
+INSERT IGNORE INTO /*_*/updatelog
+       SELECT 'filearchive-fa_major_mime-patch-fa_major_mime-chemical.sql' AS ul_key, null as ul_value
+       UNION SELECT 'image-img_major_mime-patch-img_major_mime-chemical.sql', null
+       UNION SELECT 'oldimage-oi_major_mime-patch-oi_major_mime-chemical.sql', null
+       UNION SELECT 'user_groups-ug_group-patch-ug_group-length-increase-255.sql', null
+       UNION SELECT 'user_former_groups-ufg_group-patch-ufg_group-length-increase-255.sql', null
+       UNION SELECT 'user_properties-up_property-patch-up_property.sql', null;
\ No newline at end of file
index 19c1d24..342ffba 100644 (file)
@@ -219,6 +219,9 @@ TEXT;
        /**
         * Return an SQL expression selecting rows which sort above the given row,
         * assuming an ordering of cl_to, cl_type, cl_from
+        * @param stdClass $row
+        * @param DatabaseBase $dbw
+        * @return string
         */
        function getBatchCondition( $row, $dbw ) {
                $fields = array( 'cl_to', 'cl_type', 'cl_from' );
index 9b8714d..99ba3b8 100644 (file)
@@ -40,7 +40,11 @@ class UserOptions {
 
        private $mMode, $mReady;
 
-       /** Constructor. Will show usage and exit if script options are not correct */
+       /**
+        * Constructor. Will show usage and exit if script options are not correct
+        * @param array $opts
+        * @param array $args
+        */
        function __construct( $opts, $args ) {
                if ( !$this->checkOpts( $opts, $args ) ) {
                        UserOptions::showUsageAndExit();
index 2886e08..cf17aef 100644 (file)
@@ -9,7 +9,7 @@
                                .replace( /__+/g, '_' )
                                .replace( /^_+/, '' )
                                .replace( /_+$/, '' );
-                       value = value.substr( 0, 1 ).toUpperCase() + value.substr( 1 );
+                       value = value.charAt( 0 ).toUpperCase() + value.slice( 1 );
                        $label.text( labelText.replace( '$1', value ) );
                }
 
index 8c42118..c6bd868 100644 (file)
Binary files a/mw-config/images/installer-logo.png and b/mw-config/images/installer-logo.png differ
index 1c0e83b..acc937e 100644 (file)
@@ -83,33 +83,28 @@ return array(
         */
        'mediawiki.skinning.elements' => array(
                'styles' => array(
-                       'commonElements.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/elements.css' => array( 'media' => 'screen' ),
                ),
-               'remoteSkinPath' => 'common',
-               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
        'mediawiki.skinning.content' => array(
                'styles' => array(
-                       'commonElements.css' => array( 'media' => 'screen' ),
-                       'commonContent.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/elements.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/content.css' => array( 'media' => 'screen' ),
                ),
-               'remoteSkinPath' => 'common',
-               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
        'mediawiki.skinning.interface' => array(
+               'class' => 'ResourceLoaderSkinModule',
                // Used in the web installer. Test it after modifying this definition!
                'styles' => array(
-                       'commonElements.css' => array( 'media' => 'screen' ),
-                       'commonContent.css' => array( 'media' => 'screen' ),
-                       'commonInterface.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/elements.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/content.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/interface.css' => array( 'media' => 'screen' ),
                ),
-               'remoteSkinPath' => 'common',
-               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
 
        'mediawiki.skinning.content.parsoid' => array(
                // Style Parsoid HTML+RDFa output consistent with wikitext from PHP parser
-               // with the commonInterface.css styles; skinStyles should be used if your
+               // with the interface.css styles; skinStyles should be used if your
                // skin over-rides common content styling.
                'skinStyles' => array(
                        'default' => 'resources/src/mediawiki.skinning/content.parsoid.less',
@@ -117,6 +112,12 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
 
+       'mediawiki.skinning.content.externallinks' => array(
+               'styles' => array(
+                       'resources/src/mediawiki.skinning/content.externallinks.css' => array( 'media' => 'screen' ),
+               ),
+       ),
+
        /* jQuery */
 
        'jquery' => array(
@@ -200,6 +201,7 @@ return array(
                        'confirmable-confirm',
                        'confirmable-yes',
                        'confirmable-no',
+                       'word-separator',
                ),
                'styles' => 'resources/src/jquery/jquery.confirmable.css',
                'dependencies' => 'mediawiki.jqueryMsg',
@@ -243,14 +245,6 @@ return array(
        'jquery.hoverIntent' => array(
                'scripts' => 'resources/lib/jquery/jquery.hoverIntent.js',
        ),
-       'jquery.json' => array(
-               // @deprecated since 1.24: Use the 'json' module and global JSON object instead.
-               'scripts' => array(
-                       'resources/lib/jquery/jquery.json.js',
-                       'resources/src/jquery.json-deprecate.js',
-               ),
-               'targets' => array( 'mobile', 'desktop' ),
-       ),
        'jquery.localize' => array(
                'scripts' => 'resources/src/jquery/jquery.localize.js',
        ),
@@ -691,82 +685,82 @@ return array(
        'moment' => array(
                'scripts' => 'resources/lib/moment/moment.js',
                'languageScripts' => array(
-                       'af' => 'resources/lib/moment/lang/af.js',
-                       'ar' => 'resources/lib/moment/lang/ar.js',
-                       'ar-ma' => 'resources/lib/moment/lang/ar-ma.js',
-                       'ar-sa' => 'resources/lib/moment/lang/ar-sa.js',
-                       'az' => 'resources/lib/moment/lang/az.js',
-                       'be' => 'resources/lib/moment/lang/be.js',
-                       'bg' => 'resources/lib/moment/lang/bg.js',
-                       'bn' => 'resources/lib/moment/lang/bn.js',
-                       'bo' => 'resources/lib/moment/lang/bo.js',
-                       'br' => 'resources/lib/moment/lang/br.js',
-                       'bs' => 'resources/lib/moment/lang/bs.js',
-                       'ca' => 'resources/lib/moment/lang/ca.js',
-                       'cs' => 'resources/lib/moment/lang/cs.js',
-                       'cv' => 'resources/lib/moment/lang/cv.js',
-                       'cy' => 'resources/lib/moment/lang/cy.js',
-                       'da' => 'resources/lib/moment/lang/da.js',
-                       'de' => 'resources/lib/moment/lang/de.js',
-                       'de-at' => 'resources/lib/moment/lang/de-at.js',
-                       'el' => 'resources/lib/moment/lang/el.js',
-                       'en-au' => 'resources/lib/moment/lang/en-au.js',
-                       'en-ca' => 'resources/lib/moment/lang/en-ca.js',
-                       'en-gb' => 'resources/lib/moment/lang/en-gb.js',
-                       'eo' => 'resources/lib/moment/lang/eo.js',
-                       'es' => 'resources/lib/moment/lang/es.js',
-                       'et' => 'resources/lib/moment/lang/et.js',
-                       'eu' => 'resources/lib/moment/lang/eu.js',
-                       'fa' => 'resources/lib/moment/lang/fa.js',
-                       'fi' => 'resources/lib/moment/lang/fi.js',
-                       'fo' => 'resources/lib/moment/lang/fo.js',
-                       'fr-ca' => 'resources/lib/moment/lang/fr-ca.js',
-                       'fr' => 'resources/lib/moment/lang/fr.js',
-                       'gl' => 'resources/lib/moment/lang/gl.js',
-                       'he' => 'resources/lib/moment/lang/he.js',
-                       'hi' => 'resources/lib/moment/lang/hi.js',
-                       'hr' => 'resources/lib/moment/lang/hr.js',
-                       'hu' => 'resources/lib/moment/lang/hu.js',
-                       'hy-am' => 'resources/lib/moment/lang/hy-am.js',
-                       'id' => 'resources/lib/moment/lang/id.js',
-                       'is' => 'resources/lib/moment/lang/is.js',
-                       'it' => 'resources/lib/moment/lang/it.js',
-                       'ja' => 'resources/lib/moment/lang/ja.js',
-                       'ka' => 'resources/lib/moment/lang/ka.js',
-                       'ko' => 'resources/lib/moment/lang/ko.js',
-                       'lt' => 'resources/lib/moment/lang/lt.js',
-                       'lv' => 'resources/lib/moment/lang/lv.js',
-                       'mk' => 'resources/lib/moment/lang/mk.js',
-                       'ml' => 'resources/lib/moment/lang/ml.js',
-                       'mr' => 'resources/lib/moment/lang/mr.js',
-                       'ms-my' => 'resources/lib/moment/lang/ms-my.js',
-                       'my' => 'resources/lib/moment/lang/my.js',
-                       'nb' => 'resources/lib/moment/lang/nb.js',
-                       'ne' => 'resources/lib/moment/lang/ne.js',
-                       'nl' => 'resources/lib/moment/lang/nl.js',
-                       'nn' => 'resources/lib/moment/lang/nn.js',
-                       'pl' => 'resources/lib/moment/lang/pl.js',
-                       'pt-br' => 'resources/lib/moment/lang/pt-br.js',
-                       'pt' => 'resources/lib/moment/lang/pt.js',
-                       'ro' => 'resources/lib/moment/lang/ro.js',
-                       'ru' => 'resources/lib/moment/lang/ru.js',
-                       'sk' => 'resources/lib/moment/lang/sk.js',
-                       'sl' => 'resources/lib/moment/lang/sl.js',
-                       'sq' => 'resources/lib/moment/lang/sq.js',
-                       'sr' => 'resources/lib/moment/lang/sr.js',
-                       'sr-ec' => 'resources/lib/moment/lang/sr-cyrl.js',
-                       'sv' => 'resources/lib/moment/lang/sv.js',
-                       'ta' => 'resources/lib/moment/lang/ta.js',
-                       'th' => 'resources/lib/moment/lang/th.js',
-                       'tl-ph' => 'resources/lib/moment/lang/tl-ph.js',
-                       'tr' => 'resources/lib/moment/lang/tr.js',
-                       'tzm' => 'resources/lib/moment/lang/tzm.js',
-                       'tzm-latn' => 'resources/lib/moment/lang/tzm-latn.js',
-                       'uk' => 'resources/lib/moment/lang/uk.js',
-                       'uz' => 'resources/lib/moment/lang/uz.js',
-                       'vi' => 'resources/lib/moment/lang/vi.js',
-                       'zh-cn' => 'resources/lib/moment/lang/zh-cn.js',
-                       'zh-tw' => 'resources/lib/moment/lang/zh-tw.js',
+                       'af' => 'resources/lib/moment/locale/af.js',
+                       'ar' => 'resources/lib/moment/locale/ar.js',
+                       'ar-ma' => 'resources/lib/moment/locale/ar-ma.js',
+                       'ar-sa' => 'resources/lib/moment/locale/ar-sa.js',
+                       'az' => 'resources/lib/moment/locale/az.js',
+                       'be' => 'resources/lib/moment/locale/be.js',
+                       'bg' => 'resources/lib/moment/locale/bg.js',
+                       'bn' => 'resources/lib/moment/locale/bn.js',
+                       'bo' => 'resources/lib/moment/locale/bo.js',
+                       'br' => 'resources/lib/moment/locale/br.js',
+                       'bs' => 'resources/lib/moment/locale/bs.js',
+                       'ca' => 'resources/lib/moment/locale/ca.js',
+                       'cs' => 'resources/lib/moment/locale/cs.js',
+                       'cv' => 'resources/lib/moment/locale/cv.js',
+                       'cy' => 'resources/lib/moment/locale/cy.js',
+                       'da' => 'resources/lib/moment/locale/da.js',
+                       'de' => 'resources/lib/moment/locale/de.js',
+                       'de-at' => 'resources/lib/moment/locale/de-at.js',
+                       'el' => 'resources/lib/moment/locale/el.js',
+                       'en-au' => 'resources/lib/moment/locale/en-au.js',
+                       'en-ca' => 'resources/lib/moment/locale/en-ca.js',
+                       'en-gb' => 'resources/lib/moment/locale/en-gb.js',
+                       'eo' => 'resources/lib/moment/locale/eo.js',
+                       'es' => 'resources/lib/moment/locale/es.js',
+                       'et' => 'resources/lib/moment/locale/et.js',
+                       'eu' => 'resources/lib/moment/locale/eu.js',
+                       'fa' => 'resources/lib/moment/locale/fa.js',
+                       'fi' => 'resources/lib/moment/locale/fi.js',
+                       'fo' => 'resources/lib/moment/locale/fo.js',
+                       'fr-ca' => 'resources/lib/moment/locale/fr-ca.js',
+                       'fr' => 'resources/lib/moment/locale/fr.js',
+                       'gl' => 'resources/lib/moment/locale/gl.js',
+                       'he' => 'resources/lib/moment/locale/he.js',
+                       'hi' => 'resources/lib/moment/locale/hi.js',
+                       'hr' => 'resources/lib/moment/locale/hr.js',
+                       'hu' => 'resources/lib/moment/locale/hu.js',
+                       'hy-am' => 'resources/lib/moment/locale/hy-am.js',
+                       'id' => 'resources/lib/moment/locale/id.js',
+                       'is' => 'resources/lib/moment/locale/is.js',
+                       'it' => 'resources/lib/moment/locale/it.js',
+                       'ja' => 'resources/lib/moment/locale/ja.js',
+                       'ka' => 'resources/lib/moment/locale/ka.js',
+                       'ko' => 'resources/lib/moment/locale/ko.js',
+                       'lt' => 'resources/lib/moment/locale/lt.js',
+                       'lv' => 'resources/lib/moment/locale/lv.js',
+                       'mk' => 'resources/lib/moment/locale/mk.js',
+                       'ml' => 'resources/lib/moment/locale/ml.js',
+                       'mr' => 'resources/lib/moment/locale/mr.js',
+                       'ms-my' => 'resources/lib/moment/locale/ms-my.js',
+                       'my' => 'resources/lib/moment/locale/my.js',
+                       'nb' => 'resources/lib/moment/locale/nb.js',
+                       'ne' => 'resources/lib/moment/locale/ne.js',
+                       'nl' => 'resources/lib/moment/locale/nl.js',
+                       'nn' => 'resources/lib/moment/locale/nn.js',
+                       'pl' => 'resources/lib/moment/locale/pl.js',
+                       'pt-br' => 'resources/lib/moment/locale/pt-br.js',
+                       'pt' => 'resources/lib/moment/locale/pt.js',
+                       'ro' => 'resources/lib/moment/locale/ro.js',
+                       'ru' => 'resources/lib/moment/locale/ru.js',
+                       'sk' => 'resources/lib/moment/locale/sk.js',
+                       'sl' => 'resources/lib/moment/locale/sl.js',
+                       'sq' => 'resources/lib/moment/locale/sq.js',
+                       'sr' => 'resources/lib/moment/locale/sr.js',
+                       'sr-ec' => 'resources/lib/moment/locale/sr-cyrl.js',
+                       'sv' => 'resources/lib/moment/locale/sv.js',
+                       'ta' => 'resources/lib/moment/locale/ta.js',
+                       'th' => 'resources/lib/moment/locale/th.js',
+                       'tl-ph' => 'resources/lib/moment/locale/tl-ph.js',
+                       'tr' => 'resources/lib/moment/locale/tr.js',
+                       'tzm' => 'resources/lib/moment/locale/tzm.js',
+                       'tzm-latn' => 'resources/lib/moment/locale/tzm-latn.js',
+                       'uk' => 'resources/lib/moment/locale/uk.js',
+                       'uz' => 'resources/lib/moment/locale/uz.js',
+                       'vi' => 'resources/lib/moment/locale/vi.js',
+                       'zh-cn' => 'resources/lib/moment/locale/zh-cn.js',
+                       'zh-tw' => 'resources/lib/moment/locale/zh-tw.js',
                ),
        ),
 
@@ -778,6 +772,17 @@ return array(
                'raw' => true,
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.apihelp' => array(
+               'styles' => 'resources/src/mediawiki/mediawiki.apihelp.css',
+               'targets' => array( 'desktop' ),
+               'dependencies' => array(
+                       'mediawiki.hlist',
+               ),
+       ),
+       'mediawiki.apipretty' => array(
+               'styles' => 'resources/src/mediawiki/mediawiki.apipretty.css',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.api' => array(
                'scripts' => 'resources/src/mediawiki.api/mediawiki.api.js',
                'dependencies' => 'mediawiki.util',
@@ -818,6 +823,11 @@ return array(
        'mediawiki.content.json' => array(
                'styles' => 'resources/src/mediawiki/mediawiki.content.json.css',
        ),
+       'mediawiki.confirmCloseWindow' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki/mediawiki.confirmCloseWindow.js',
+               ),
+       ),
        'mediawiki.debug' => array(
                'scripts' => array(
                        'resources/src/mediawiki/mediawiki.debug.js',
@@ -914,6 +924,10 @@ return array(
                'scripts' => 'resources/src/mediawiki/mediawiki.notify.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.pager.tablePager' => array(
+               'styles' => 'resources/src/mediawiki/mediawiki.pager.tablePager.less',
+               'position' => 'top',
+       ),
        'mediawiki.searchSuggest' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.searchSuggest.js',
                'styles' => 'resources/src/mediawiki/mediawiki.searchSuggest.css',
@@ -959,6 +973,13 @@ return array(
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.userSuggest' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.userSuggest.js',
+               'dependencies' => array(
+                       'jquery.suggestions',
+                       'mediawiki.api'
+               )
+       ),
        'mediawiki.util' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.util.js',
                'dependencies' => array(
@@ -975,13 +996,20 @@ return array(
                        'jquery.cookie',
                ),
        ),
+       'mediawiki.toolbar' => array(
+               'class' => 'ResourceLoaderEditToolbarModule',
+               'scripts' => 'resources/src/mediawiki.toolbar/toolbar.js',
+               'styles' => 'resources/src/mediawiki.toolbar/toolbar.less',
+       ),
 
        /* MediaWiki Action */
 
        'mediawiki.action.edit' => array(
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.js',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.css',
                'dependencies' => array(
                        'mediawiki.action.edit.styles',
+                       'mediawiki.toolbar',
                        'jquery.textSelection',
                        'jquery.byteLimit',
                ),
@@ -1023,9 +1051,11 @@ return array(
                'dependencies' => array(
                        'mediawiki.util',
                        'mediawiki.page.startup',
+                       'user.options',
                ),
        ),
        'mediawiki.action.view.metadata' => array(
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.metadata.css',
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.metadata.js',
                'messages' => array(
                        'metadata-expand',
@@ -1045,13 +1075,17 @@ return array(
                        'postedit-confirmation-saved',
                ),
        ),
-       'mediawiki.action.view.redirectToFragment' => array(
-               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.redirectToFragment.js',
+       'mediawiki.action.view.redirect' => array(
+               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.redirect.js',
                'dependencies' => array(
                        'jquery.client',
                ),
                'position' => 'top',
        ),
+       'mediawiki.action.view.redirectPage' => array(
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css',
+               'position' => 'top',
+       ),
        'mediawiki.action.view.rightClickEdit' => array(
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
        ),
@@ -1059,10 +1093,12 @@ return array(
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js',
                'dependencies' => array(
                        'jquery.textSelection',
-                       'mediawiki.jqueryMsg'
+                       'mediawiki.jqueryMsg',
+                       'mediawiki.confirmCloseWindow',
                ),
                'messages' => array(
                        'editwarning-warning',
+                       // editwarning-warning uses {{int:prefs-editing}}
                        'prefs-editing'
                ),
        ),
@@ -1072,7 +1108,8 @@ return array(
        'mediawiki.language' => array(
                'scripts' => array(
                        'resources/src/mediawiki.language/mediawiki.language.js',
-                       'resources/src/mediawiki.language/mediawiki.language.numbers.js'
+                       'resources/src/mediawiki.language/mediawiki.language.numbers.js',
+                       'resources/src/mediawiki.language/mediawiki.language.fallback.js',
                ),
                'languageScripts' => array(
                        'bs' => 'resources/src/mediawiki.language/languages/bs.js',
@@ -1090,10 +1127,15 @@ return array(
                        'uk' => 'resources/src/mediawiki.language/languages/uk.js',
                ),
                'dependencies' => array(
-                               'mediawiki.language.data',
-                               'mediawiki.cldr',
-                       ),
+                       'mediawiki.language.data',
+                       'mediawiki.cldr',
+               ),
                'targets' => array( 'desktop', 'mobile' ),
+               'messages' => array(
+                       'and',
+                       'comma-separator',
+                       'word-separator'
+               ),
        ),
 
        'mediawiki.cldr' => array(
@@ -1149,11 +1191,11 @@ return array(
        'mediawiki.page.ready' => array(
                'scripts' => 'resources/src/mediawiki.page/mediawiki.page.ready.js',
                'dependencies' => array(
+                       'jquery.accessKeyLabel',
                        'jquery.checkboxShiftClick',
                        'jquery.makeCollapsible',
                        'jquery.placeholder',
                        'jquery.mw-jump',
-                       'mediawiki.util',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -1251,6 +1293,9 @@ return array(
        'mediawiki.special.changeslist.enhanced' => array(
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css',
        ),
+       'mediawiki.special.import' => array(
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.import.js',
+       ),
        'mediawiki.special.movePage' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.movePage.js',
                'dependencies' => 'jquery.byteLimit',
@@ -1267,6 +1312,8 @@ return array(
                'position' => 'top',
                'messages' => array(
                        'prefs-tabs-navigation-hint',
+                       'prefswarning-warning',
+                       'saveprefs',
                ),
                'dependencies' => array(
                        'mediawiki.language',
@@ -1290,7 +1337,6 @@ return array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.undelete.js',
        ),
        'mediawiki.special.upload' => array(
-               // @todo merge in remainder of mediawiki.legacy.upload
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.upload.js',
                'messages' => array(
                        'widthheight',
@@ -1299,10 +1345,18 @@ return array(
                        'size-megabytes',
                        'size-gigabytes',
                        'largefileserver',
+                       'editwarning-warning',
+                       // editwarning-warning uses {{int:prefs-editing}}
+                       'prefs-editing',
                ),
                'dependencies' => array(
+                       'jquery.spinner',
+                       'mediawiki.jqueryMsg',
+                       'mediawiki.api',
                        'mediawiki.libs.jpegmeta',
+                       'mediawiki.Title',
                        'mediawiki.util',
+                       'mediawiki.confirmCloseWindow',
                ),
        ),
        'mediawiki.special.userlogin.common.styles' => array(
@@ -1392,55 +1446,38 @@ return array(
        /* MediaWiki Legacy */
 
        'mediawiki.legacy.ajax' => array(
-               'scripts' => 'common/ajax.js',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'scripts' => 'resources/src/mediawiki.legacy/ajax.js',
                'dependencies' => array(
                        'mediawiki.util',
                        'mediawiki.legacy.wikibits',
                ),
-               'position' => 'top', // Temporary hack for legacy support
+               'position' => 'top',
        ),
        'mediawiki.legacy.commonPrint' => array(
-               'styles' => array( 'common/commonPrint.css' => array( 'media' => 'print' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'styles' => array(
+                       'resources/src/mediawiki.legacy/commonPrint.css' => array( 'media' => 'print' )
+               ),
        ),
        'mediawiki.legacy.protect' => array(
-               'scripts' => 'common/protect.js',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'scripts' => 'resources/src/mediawiki.legacy/protect.js',
                'dependencies' => array(
                        'jquery.byteLimit',
                ),
-               'position' => 'top',
+               'messages' => array( 'protect-unchain-permissions' )
        ),
        'mediawiki.legacy.shared' => array(
                // Used in the web installer. Test it after modifying this definition!
-               'styles' => array( 'common/shared.css' => array( 'media' => 'screen' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'styles' => array(
+                       'resources/src/mediawiki.legacy/shared.css' => array( 'media' => 'screen' )
+               ),
        ),
        'mediawiki.legacy.oldshared' => array(
-               'styles' => array( 'common/oldshared.css' => array( 'media' => 'screen' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'mediawiki.legacy.upload' => array(
-               'scripts' => 'common/upload.js',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-               'dependencies' => array(
-                       'jquery.spinner',
-                       'mediawiki.api',
-                       'mediawiki.Title',
-                       'mediawiki.util',
+               'styles' => array(
+                       'resources/src/mediawiki.legacy/oldshared.css' => array( 'media' => 'screen' )
                ),
        ),
        'mediawiki.legacy.wikibits' => array(
-               'scripts' => 'common/wikibits.js',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'scripts' => 'resources/src/mediawiki.legacy/wikibits.js',
                'dependencies' => array(
                        'mediawiki.util',
                ),
@@ -1450,38 +1487,67 @@ return array(
        /* MediaWiki UI */
 
        'mediawiki.ui' => array(
-               'styles' => array(
-                       'resources/src/mediawiki.ui/default.less',
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki.ui/default.less',
+                       ),
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.ui.checkbox' => array(
-               'styles' => array(
-                       'resources/src/mediawiki.ui/components/checkbox.less',
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki.ui/components/checkbox.less',
+                       ),
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        // Lightweight module for anchor styles
        'mediawiki.ui.anchor' => array(
-               'styles' => array(
-                       'resources/src/mediawiki.ui/components/anchors.less',
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki.ui/components/anchors.less',
+                       ),
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        // Lightweight module for button styles
        'mediawiki.ui.button' => array(
-               'styles' => array(
-                       'resources/src/mediawiki.ui/components/buttons.less',
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki.ui/components/buttons.less',
+                       ),
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.ui.input' => array(
-               'styles' => array(
-                       'resources/src/mediawiki.ui/components/inputs.less',
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki.ui/components/inputs.less',
+                       ),
+               ),
+               'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+       'mediawiki.ui.icon' => array(
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki.ui/components/icons.less',
+                       ),
+               ),
+               'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+       // Lightweight module for text styles
+       'mediawiki.ui.text' => array(
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki.ui/components/text.less',
+                       ),
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
@@ -1491,6 +1557,7 @@ return array(
        'es5-shim' => array(
                'scripts' => array(
                        'resources/lib/es5-shim/es5-shim.js',
+                       'resources/src/polyfill-object-create.js',
                ),
                'targets' => array( 'desktop', 'mobile' ),
                'skipFunction' => 'resources/src/es5-skip.js',
@@ -1515,13 +1582,13 @@ return array(
                'scripts' => array(
                        'resources/lib/oojs-ui/oojs-ui.js',
                ),
-               'styles' => array(
-                       'resources/lib/oojs-ui/oojs-ui.svg.css',
+               'skinScripts' => array(
+                       'default' => 'resources/lib/oojs-ui/oojs-ui-apex.js',
+                       'minerva' => 'resources/lib/oojs-ui/oojs-ui-mediawiki.js',
                ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/oojs-ui/oojs-ui-apex.css',
-                       // FIXME As of July 2014, this is to be gone "in a couple of months".
-                       'minerva' => 'resources/lib/oojs-ui/oojs-ui-agora.css',
+                       'default' => 'resources/lib/oojs-ui/oojs-ui-apex.svg.css',
+                       'minerva' => 'resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css',
                ),
                'messages' => array(
                        'ooui-outline-control-move-down',
diff --git a/resources/assets/file-type-icons/COPYING b/resources/assets/file-type-icons/COPYING
new file mode 100644 (file)
index 0000000..136530a
--- /dev/null
@@ -0,0 +1,43 @@
+The icons used here are derived from the crystalsvg icons in the the
+pics/crystalsvg/ directory of kdelibs-3.4.0 they were modified on 2005-05-15
+by Ævar Arnfjörð Bjarmason for use in MediaWiki.
+
+What follows is the contents of the LICENSE.crystalsvg file found in the pics/
+subdirectory of kdelibs-3.4.0:
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+This copyright and license notice covers all CrystalSVG images.
+Note the license notice contains an add-on.
+********************************************************************************
+KDE Crystal theme icons.
+Copyright (C) 2002 and following years KDE Artists
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation,
+version 2.1 of the License.
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+    **** NOTE THIS ADD-ON ****
+The GNU Lesser General Public License or LGPL is written for software libraries
+in the first place. We expressly want the LGPL to be valid for this artwork
+library too.
+KDE Crystal theme icons is a special kind of software library, it is an
+artwork library, it's elements can be used in a Graphical User Interface, or
+GUI.
+Source code, for this library means:
+ - for vectors svg;
+ - for pixels, if applicable, the multi-layered formats xcf or psd, or
+otherwise png.
+The LGPL in some sections obliges you to make the files carry
+notices. With images this is in some cases impossible or hardly useful.
+With this library a notice is placed at a prominent place in the directory
+containing the elements. You may follow this practice.
+The exception in section 6 of the GNU Lesser General Public License covers
+the use of elements of this art library in a GUI.
+kde-artists [at] kde.org
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/resources/assets/file-type-icons/fileicon-c.png b/resources/assets/file-type-icons/fileicon-c.png
new file mode 100644 (file)
index 0000000..0d603b7
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-c.png differ
diff --git a/resources/assets/file-type-icons/fileicon-cpp.png b/resources/assets/file-type-icons/fileicon-cpp.png
new file mode 100644 (file)
index 0000000..123688f
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-cpp.png differ
diff --git a/resources/assets/file-type-icons/fileicon-deb.png b/resources/assets/file-type-icons/fileicon-deb.png
new file mode 100644 (file)
index 0000000..87ca3fa
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-deb.png differ
diff --git a/resources/assets/file-type-icons/fileicon-djvu.png b/resources/assets/file-type-icons/fileicon-djvu.png
new file mode 100644 (file)
index 0000000..1da2276
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-djvu.png differ
diff --git a/resources/assets/file-type-icons/fileicon-djvu.xcf b/resources/assets/file-type-icons/fileicon-djvu.xcf
new file mode 100644 (file)
index 0000000..8043dcd
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-djvu.xcf differ
diff --git a/resources/assets/file-type-icons/fileicon-dvi.png b/resources/assets/file-type-icons/fileicon-dvi.png
new file mode 100644 (file)
index 0000000..f37878d
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-dvi.png differ
diff --git a/resources/assets/file-type-icons/fileicon-exe.png b/resources/assets/file-type-icons/fileicon-exe.png
new file mode 100644 (file)
index 0000000..dc020eb
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-exe.png differ
diff --git a/resources/assets/file-type-icons/fileicon-h.png b/resources/assets/file-type-icons/fileicon-h.png
new file mode 100644 (file)
index 0000000..339bf02
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-h.png differ
diff --git a/resources/assets/file-type-icons/fileicon-html.png b/resources/assets/file-type-icons/fileicon-html.png
new file mode 100644 (file)
index 0000000..f28f8a2
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-html.png differ
diff --git a/resources/assets/file-type-icons/fileicon-iso.png b/resources/assets/file-type-icons/fileicon-iso.png
new file mode 100644 (file)
index 0000000..c73d229
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-iso.png differ
diff --git a/resources/assets/file-type-icons/fileicon-java.png b/resources/assets/file-type-icons/fileicon-java.png
new file mode 100644 (file)
index 0000000..a1b4f22
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-java.png differ
diff --git a/resources/assets/file-type-icons/fileicon-mid.png b/resources/assets/file-type-icons/fileicon-mid.png
new file mode 100644 (file)
index 0000000..ce2bebb
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-mid.png differ
diff --git a/resources/assets/file-type-icons/fileicon-mov.png b/resources/assets/file-type-icons/fileicon-mov.png
new file mode 100644 (file)
index 0000000..952de1f
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-mov.png differ
diff --git a/resources/assets/file-type-icons/fileicon-o.png b/resources/assets/file-type-icons/fileicon-o.png
new file mode 100644 (file)
index 0000000..f3523d9
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-o.png differ
diff --git a/resources/assets/file-type-icons/fileicon-ogg.png b/resources/assets/file-type-icons/fileicon-ogg.png
new file mode 100644 (file)
index 0000000..ef4d801
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-ogg.png differ
diff --git a/resources/assets/file-type-icons/fileicon-ogg.xcf b/resources/assets/file-type-icons/fileicon-ogg.xcf
new file mode 100644 (file)
index 0000000..a91024b
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-ogg.xcf differ
diff --git a/resources/assets/file-type-icons/fileicon-pdf.png b/resources/assets/file-type-icons/fileicon-pdf.png
new file mode 100644 (file)
index 0000000..8c8da92
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-pdf.png differ
diff --git a/resources/assets/file-type-icons/fileicon-ps.png b/resources/assets/file-type-icons/fileicon-ps.png
new file mode 100644 (file)
index 0000000..e872833
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-ps.png differ
diff --git a/resources/assets/file-type-icons/fileicon-psd.png b/resources/assets/file-type-icons/fileicon-psd.png
new file mode 100644 (file)
index 0000000..598f190
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-psd.png differ
diff --git a/resources/assets/file-type-icons/fileicon-rm.png b/resources/assets/file-type-icons/fileicon-rm.png
new file mode 100644 (file)
index 0000000..81dbe0b
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-rm.png differ
diff --git a/resources/assets/file-type-icons/fileicon-rpm.png b/resources/assets/file-type-icons/fileicon-rpm.png
new file mode 100644 (file)
index 0000000..1903aac
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-rpm.png differ
diff --git a/resources/assets/file-type-icons/fileicon-svg.png b/resources/assets/file-type-icons/fileicon-svg.png
new file mode 100644 (file)
index 0000000..b782113
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-svg.png differ
diff --git a/resources/assets/file-type-icons/fileicon-tar.png b/resources/assets/file-type-icons/fileicon-tar.png
new file mode 100644 (file)
index 0000000..e5fd1b7
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-tar.png differ
diff --git a/resources/assets/file-type-icons/fileicon-tex.png b/resources/assets/file-type-icons/fileicon-tex.png
new file mode 100644 (file)
index 0000000..a437284
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-tex.png differ
diff --git a/resources/assets/file-type-icons/fileicon-ttf.png b/resources/assets/file-type-icons/fileicon-ttf.png
new file mode 100644 (file)
index 0000000..1ed4e74
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-ttf.png differ
diff --git a/resources/assets/file-type-icons/fileicon-txt.png b/resources/assets/file-type-icons/fileicon-txt.png
new file mode 100644 (file)
index 0000000..9e988e7
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-txt.png differ
diff --git a/resources/assets/file-type-icons/fileicon-xcf.png b/resources/assets/file-type-icons/fileicon-xcf.png
new file mode 100644 (file)
index 0000000..1037b50
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon-xcf.png differ
diff --git a/resources/assets/file-type-icons/fileicon.png b/resources/assets/file-type-icons/fileicon.png
new file mode 100644 (file)
index 0000000..59696a3
Binary files /dev/null and b/resources/assets/file-type-icons/fileicon.png differ
diff --git a/resources/assets/licenses/cc-0.png b/resources/assets/licenses/cc-0.png
new file mode 100644 (file)
index 0000000..9d3fe5f
Binary files /dev/null and b/resources/assets/licenses/cc-0.png differ
diff --git a/resources/assets/licenses/cc-by-nc-sa.png b/resources/assets/licenses/cc-by-nc-sa.png
new file mode 100644 (file)
index 0000000..0d24a71
Binary files /dev/null and b/resources/assets/licenses/cc-by-nc-sa.png differ
diff --git a/resources/assets/licenses/cc-by-sa.png b/resources/assets/licenses/cc-by-sa.png
new file mode 100644 (file)
index 0000000..518fb64
Binary files /dev/null and b/resources/assets/licenses/cc-by-sa.png differ
diff --git a/resources/assets/licenses/cc-by.png b/resources/assets/licenses/cc-by.png
new file mode 100644 (file)
index 0000000..9cca2f9
Binary files /dev/null and b/resources/assets/licenses/cc-by.png differ
diff --git a/resources/assets/licenses/gnu-fdl.png b/resources/assets/licenses/gnu-fdl.png
new file mode 100644 (file)
index 0000000..3feaf57
Binary files /dev/null and b/resources/assets/licenses/gnu-fdl.png differ
diff --git a/resources/assets/licenses/public-domain.png b/resources/assets/licenses/public-domain.png
new file mode 100644 (file)
index 0000000..ebf0107
Binary files /dev/null and b/resources/assets/licenses/public-domain.png differ
diff --git a/resources/assets/mediawiki.png b/resources/assets/mediawiki.png
new file mode 100644 (file)
index 0000000..8c42118
Binary files /dev/null and b/resources/assets/mediawiki.png differ
diff --git a/resources/assets/poweredby_mediawiki_88x31.png b/resources/assets/poweredby_mediawiki_88x31.png
new file mode 100644 (file)
index 0000000..30e1d2e
Binary files /dev/null and b/resources/assets/poweredby_mediawiki_88x31.png differ
diff --git a/resources/assets/wiki.png b/resources/assets/wiki.png
new file mode 100644 (file)
index 0000000..48595b0
Binary files /dev/null and b/resources/assets/wiki.png differ
index 2e088ca..d4f7db3 100644 (file)
@@ -14,7 +14,7 @@
 .ui-helper-hidden { display: none; }
 .ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
 .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
-.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
+.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; border-collapse: collapse; }
 .ui-helper-clearfix:after { clear: both; }
 .ui-helper-clearfix { zoom: 1; }
 .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
diff --git a/resources/lib/jquery/jquery.json.js b/resources/lib/jquery/jquery.json.js
deleted file mode 100644 (file)
index 75953f4..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
- * jQuery JSON plugin 2.4.0
- *
- * @author Brantley Harris, 2009-2011
- * @author Timo Tijhof, 2011-2012
- * @source This plugin is heavily influenced by MochiKit's serializeJSON, which is
- *         copyrighted 2005 by Bob Ippolito.
- * @source Brantley Harris wrote this plugin. It is based somewhat on the JSON.org
- *         website's http://www.json.org/json2.js, which proclaims:
- *         "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
- *         I uphold.
- * @license MIT License <http://www.opensource.org/licenses/mit-license.php>
- */
-(function ($) {
-       'use strict';
-
-       var escape = /["\\\x00-\x1f\x7f-\x9f]/g,
-               meta = {
-                       '\b': '\\b',
-                       '\t': '\\t',
-                       '\n': '\\n',
-                       '\f': '\\f',
-                       '\r': '\\r',
-                       '"' : '\\"',
-                       '\\': '\\\\'
-               },
-               hasOwn = Object.prototype.hasOwnProperty;
-
-       /**
-        * jQuery.toJSON
-        * Converts the given argument into a JSON representation.
-        *
-        * @param o {Mixed} The json-serializable *thing* to be converted
-        *
-        * If an object has a toJSON prototype, that will be used to get the representation.
-        * Non-integer/string keys are skipped in the object, as are keys that point to a
-        * function.
-        *
-        */
-       $.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function (o) {
-               if (o === null) {
-                       return 'null';
-               }
-
-               var pairs, k, name, val,
-                       type = $.type(o);
-
-               if (type === 'undefined') {
-                       return undefined;
-               }
-
-               // Also covers instantiated Number and Boolean objects,
-               // which are typeof 'object' but thanks to $.type, we
-               // catch them here. I don't know whether it is right
-               // or wrong that instantiated primitives are not
-               // exported to JSON as an {"object":..}.
-               // We choose this path because that's what the browsers did.
-               if (type === 'number' || type === 'boolean') {
-                       return String(o);
-               }
-               if (type === 'string') {
-                       return $.quoteString(o);
-               }
-               if (typeof o.toJSON === 'function') {
-                       return $.toJSON(o.toJSON());
-               }
-               if (type === 'date') {
-                       var month = o.getUTCMonth() + 1,
-                               day = o.getUTCDate(),
-                               year = o.getUTCFullYear(),
-                               hours = o.getUTCHours(),
-                               minutes = o.getUTCMinutes(),
-                               seconds = o.getUTCSeconds(),
-                               milli = o.getUTCMilliseconds();
-
-                       if (month < 10) {
-                               month = '0' + month;
-                       }
-                       if (day < 10) {
-                               day = '0' + day;
-                       }
-                       if (hours < 10) {
-                               hours = '0' + hours;
-                       }
-                       if (minutes < 10) {
-                               minutes = '0' + minutes;
-                       }
-                       if (seconds < 10) {
-                               seconds = '0' + seconds;
-                       }
-                       if (milli < 100) {
-                               milli = '0' + milli;
-                       }
-                       if (milli < 10) {
-                               milli = '0' + milli;
-                       }
-                       return '"' + year + '-' + month + '-' + day + 'T' +
-                               hours + ':' + minutes + ':' + seconds +
-                               '.' + milli + 'Z"';
-               }
-
-               pairs = [];
-
-               if ($.isArray(o)) {
-                       for (k = 0; k < o.length; k++) {
-                               pairs.push($.toJSON(o[k]) || 'null');
-                       }
-                       return '[' + pairs.join(',') + ']';
-               }
-
-               // Any other object (plain object, RegExp, ..)
-               // Need to do typeof instead of $.type, because we also
-               // want to catch non-plain objects.
-               if (typeof o === 'object') {
-                       for (k in o) {
-                               // Only include own properties,
-                               // Filter out inherited prototypes
-                               if (hasOwn.call(o, k)) {
-                                       // Keys must be numerical or string. Skip others
-                                       type = typeof k;
-                                       if (type === 'number') {
-                                               name = '"' + k + '"';
-                                       } else if (type === 'string') {
-                                               name = $.quoteString(k);
-                                       } else {
-                                               continue;
-                                       }
-                                       type = typeof o[k];
-
-                                       // Invalid values like these return undefined
-                                       // from toJSON, however those object members
-                                       // shouldn't be included in the JSON string at all.
-                                       if (type !== 'function' && type !== 'undefined') {
-                                               val = $.toJSON(o[k]);
-                                               pairs.push(name + ':' + val);
-                                       }
-                               }
-                       }
-                       return '{' + pairs.join(',') + '}';
-               }
-       };
-
-       /**
-        * jQuery.evalJSON
-        * Evaluates a given json string.
-        *
-        * @param str {String}
-        */
-       $.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
-               /*jshint evil: true */
-               return eval('(' + str + ')');
-       };
-
-       /**
-        * jQuery.secureEvalJSON
-        * Evals JSON in a way that is *more* secure.
-        *
-        * @param str {String}
-        */
-       $.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
-               var filtered =
-                       str
-                       .replace(/\\["\\\/bfnrtu]/g, '@')
-                       .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
-                       .replace(/(?:^|:|,)(?:\s*\[)+/g, '');
-
-               if (/^[\],:{}\s]*$/.test(filtered)) {
-                       /*jshint evil: true */
-                       return eval('(' + str + ')');
-               }
-               throw new SyntaxError('Error parsing JSON, source is not valid.');
-       };
-
-       /**
-        * jQuery.quoteString
-        * Returns a string-repr of a string, escaping quotes intelligently.
-        * Mostly a support function for toJSON.
-        * Examples:
-        * >>> jQuery.quoteString('apple')
-        * "apple"
-        *
-        * >>> jQuery.quoteString('"Where are we going?", she asked.')
-        * "\"Where are we going?\", she asked."
-        */
-       $.quoteString = function (str) {
-               if (str.match(escape)) {
-                       return '"' + str.replace(escape, function (a) {
-                               var c = meta[a];
-                               if (typeof c === 'string') {
-                                       return c;
-                               }
-                               c = a.charCodeAt();
-                               return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
-                       }) + '"';
-               }
-               return '"' + str + '"';
-       };
-
-}(jQuery));
diff --git a/resources/lib/moment/lang/af.js b/resources/lib/moment/lang/af.js
deleted file mode 100644 (file)
index 2777e58..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-// moment.js locale configuration
-// locale : afrikaans (af)
-// author : Werner Mollentze : https://github.com/wernerm
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('af', {
-        months : "Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),
-        monthsShort : "Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),
-        weekdays : "Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),
-        weekdaysShort : "Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),
-        weekdaysMin : "So_Ma_Di_Wo_Do_Vr_Sa".split("_"),
-        meridiem : function (hours, minutes, isLower) {
-            if (hours < 12) {
-                return isLower ? 'vm' : 'VM';
-            } else {
-                return isLower ? 'nm' : 'NM';
-            }
-        },
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Vandag om] LT',
-            nextDay : '[Môre om] LT',
-            nextWeek : 'dddd [om] LT',
-            lastDay : '[Gister om] LT',
-            lastWeek : '[Laas] dddd [om] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "oor %s",
-            past : "%s gelede",
-            s : "'n paar sekondes",
-            m : "'n minuut",
-            mm : "%d minute",
-            h : "'n uur",
-            hh : "%d ure",
-            d : "'n dag",
-            dd : "%d dae",
-            M : "'n maand",
-            MM : "%d maande",
-            y : "'n jaar",
-            yy : "%d jaar"
-        },
-        ordinal : function (number) {
-            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter
-        },
-        week : {
-            dow : 1, // Maandag is die eerste dag van die week.
-            doy : 4  // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ar-ma.js b/resources/lib/moment/lang/ar-ma.js
deleted file mode 100644 (file)
index c8add2d..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js locale configuration
-// locale : Moroccan Arabic (ar-ma)
-// author : ElFadili Yassine : https://github.com/ElFadiliY
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('ar-ma', {
-        months : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
-        monthsShort : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
-        weekdays : "الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
-        weekdaysShort : "احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),
-        weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[اليوم على الساعة] LT",
-            nextDay: '[غدا على الساعة] LT',
-            nextWeek: 'dddd [على الساعة] LT',
-            lastDay: '[أمس على الساعة] LT',
-            lastWeek: 'dddd [على الساعة] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "في %s",
-            past : "منذ %s",
-            s : "ثوان",
-            m : "دقيقة",
-            mm : "%d دقائق",
-            h : "ساعة",
-            hh : "%d ساعات",
-            d : "يوم",
-            dd : "%d أيام",
-            M : "شهر",
-            MM : "%d أشهر",
-            y : "سنة",
-            yy : "%d سنوات"
-        },
-        week : {
-            dow : 6, // Saturday is the first day of the week.
-            doy : 12  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ar-sa.js b/resources/lib/moment/lang/ar-sa.js
deleted file mode 100644 (file)
index 64e2091..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-// moment.js locale configuration
-// locale : Arabic Saudi Arabia (ar-sa)
-// author : Suhail Alkowaileet : https://github.com/xsoh
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '١',
-        '2': '٢',
-        '3': '٣',
-        '4': '٤',
-        '5': '٥',
-        '6': '٦',
-        '7': '٧',
-        '8': '٨',
-        '9': '٩',
-        '0': '٠'
-    }, numberMap = {
-        '١': '1',
-        '٢': '2',
-        '٣': '3',
-        '٤': '4',
-        '٥': '5',
-        '٦': '6',
-        '٧': '7',
-        '٨': '8',
-        '٩': '9',
-        '٠': '0'
-    };
-
-    return moment.defineLocale('ar-sa', {
-        months : "يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),
-        monthsShort : "يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),
-        weekdays : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
-        weekdaysShort : "أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),
-        weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 12) {
-                return "ص";
-            } else {
-                return "م";
-            }
-        },
-        calendar : {
-            sameDay: "[اليوم على الساعة] LT",
-            nextDay: '[غدا على الساعة] LT',
-            nextWeek: 'dddd [على الساعة] LT',
-            lastDay: '[أمس على الساعة] LT',
-            lastWeek: 'dddd [على الساعة] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "في %s",
-            past : "منذ %s",
-            s : "ثوان",
-            m : "دقيقة",
-            mm : "%d دقائق",
-            h : "ساعة",
-            hh : "%d ساعات",
-            d : "يوم",
-            dd : "%d أيام",
-            M : "شهر",
-            MM : "%d أشهر",
-            y : "سنة",
-            yy : "%d سنوات"
-        },
-        preparse: function (string) {
-            return string.replace(/[۰-۹]/g, function (match) {
-                return numberMap[match];
-            }).replace(/،/g, ',');
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            }).replace(/,/g, '،');
-        },
-        week : {
-            dow : 6, // Saturday is the first day of the week.
-            doy : 12  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ar.js b/resources/lib/moment/lang/ar.js
deleted file mode 100644 (file)
index 2af64ee..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-// moment.js locale configuration
-// locale : Arabic (ar)
-// author : Abdel Said : https://github.com/abdelsaid
-// changes in months, weekdays : Ahmed Elkhatib
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '١',
-        '2': '٢',
-        '3': '٣',
-        '4': '٤',
-        '5': '٥',
-        '6': '٦',
-        '7': '٧',
-        '8': '٨',
-        '9': '٩',
-        '0': '٠'
-    }, numberMap = {
-        '١': '1',
-        '٢': '2',
-        '٣': '3',
-        '٤': '4',
-        '٥': '5',
-        '٦': '6',
-        '٧': '7',
-        '٨': '8',
-        '٩': '9',
-        '٠': '0'
-    };
-
-    return moment.defineLocale('ar', {
-        months : "يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
-        monthsShort : "يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
-        weekdays : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
-        weekdaysShort : "أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),
-        weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 12) {
-                return "ص";
-            } else {
-                return "م";
-            }
-        },
-        calendar : {
-            sameDay: "[اليوم على الساعة] LT",
-            nextDay: '[غدا على الساعة] LT',
-            nextWeek: 'dddd [على الساعة] LT',
-            lastDay: '[أمس على الساعة] LT',
-            lastWeek: 'dddd [على الساعة] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "في %s",
-            past : "منذ %s",
-            s : "ثوان",
-            m : "دقيقة",
-            mm : "%d دقائق",
-            h : "ساعة",
-            hh : "%d ساعات",
-            d : "يوم",
-            dd : "%d أيام",
-            M : "شهر",
-            MM : "%d أشهر",
-            y : "سنة",
-            yy : "%d سنوات"
-        },
-        preparse: function (string) {
-            return string.replace(/[۰-۹]/g, function (match) {
-                return numberMap[match];
-            }).replace(/،/g, ',');
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            }).replace(/,/g, '،');
-        },
-        week : {
-            dow : 6, // Saturday is the first day of the week.
-            doy : 12  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/az.js b/resources/lib/moment/lang/az.js
deleted file mode 100644 (file)
index a6a5aff..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-// moment.js locale configuration
-// locale : azerbaijani (az)
-// author : topchiyev : https://github.com/topchiyev
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var suffixes = {
-        1: "-inci",
-        5: "-inci",
-        8: "-inci",
-        70: "-inci",
-        80: "-inci",
-
-        2: "-nci",
-        7: "-nci",
-        20: "-nci",
-        50: "-nci",
-
-        3: "-üncü",
-        4: "-üncü",
-        100: "-üncü",
-
-        6: "-ncı",
-
-        9: "-uncu",
-        10: "-uncu",
-        30: "-uncu",
-
-        60: "-ıncı",
-        90: "-ıncı"
-    };
-    return moment.defineLocale('az', {
-        months : "yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),
-        monthsShort : "yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),
-        weekdays : "Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),
-        weekdaysShort : "Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),
-        weekdaysMin : "Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[bugün saat] LT',
-            nextDay : '[sabah saat] LT',
-            nextWeek : '[gələn həftə] dddd [saat] LT',
-            lastDay : '[dünən] LT',
-            lastWeek : '[keçən həftə] dddd [saat] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s sonra",
-            past : "%s əvvəl",
-            s : "birneçə saniyyə",
-            m : "bir dəqiqə",
-            mm : "%d dəqiqə",
-            h : "bir saat",
-            hh : "%d saat",
-            d : "bir gün",
-            dd : "%d gün",
-            M : "bir ay",
-            MM : "%d ay",
-            y : "bir il",
-            yy : "%d il"
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "gecə";
-            } else if (hour < 12) {
-                return "səhər";
-            } else if (hour < 17) {
-                return "gündüz";
-            } else {
-                return "axşam";
-            }
-        },
-        ordinal : function (number) {
-            if (number === 0) {  // special case for zero
-                return number + "-ıncı";
-            }
-            var a = number % 10,
-                b = number % 100 - a,
-                c = number >= 100 ? 100 : null;
-
-            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/be.js b/resources/lib/moment/lang/be.js
deleted file mode 100644 (file)
index 6e0aef1..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-// moment.js locale configuration
-// locale : belarusian (be)
-// author : Dmitry Demidov : https://github.com/demidov91
-// author: Praleska: http://praleska.pro/
-// Author : Menelion Elensúle : https://github.com/Oire
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function plural(word, num) {
-        var forms = word.split('_');
-        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
-    }
-
-    function relativeTimeWithPlural(number, withoutSuffix, key) {
-        var format = {
-            'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
-            'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
-            'dd': 'дзень_дні_дзён',
-            'MM': 'месяц_месяцы_месяцаў',
-            'yy': 'год_гады_гадоў'
-        };
-        if (key === 'm') {
-            return withoutSuffix ? 'хвіліна' : 'хвіліну';
-        }
-        else if (key === 'h') {
-            return withoutSuffix ? 'гадзіна' : 'гадзіну';
-        }
-        else {
-            return number + ' ' + plural(format[key], +number);
-        }
-    }
-
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_'),
-            'accusative': 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_')
-        },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
-            'accusative': 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_')
-        },
-
-        nounCase = (/\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return weekdays[nounCase][m.day()];
-    }
-
-    return moment.defineLocale('be', {
-        months : monthsCaseReplace,
-        monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
-        weekdays : weekdaysCaseReplace,
-        weekdaysShort : "нд_пн_ат_ср_чц_пт_сб".split("_"),
-        weekdaysMin : "нд_пн_ат_ср_чц_пт_сб".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY г.",
-            LLL : "D MMMM YYYY г., LT",
-            LLLL : "dddd, D MMMM YYYY г., LT"
-        },
-        calendar : {
-            sameDay: '[Сёння ў] LT',
-            nextDay: '[Заўтра ў] LT',
-            lastDay: '[Учора ў] LT',
-            nextWeek: function () {
-                return '[У] dddd [ў] LT';
-            },
-            lastWeek: function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                case 5:
-                case 6:
-                    return '[У мінулую] dddd [ў] LT';
-                case 1:
-                case 2:
-                case 4:
-                    return '[У мінулы] dddd [ў] LT';
-                }
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "праз %s",
-            past : "%s таму",
-            s : "некалькі секунд",
-            m : relativeTimeWithPlural,
-            mm : relativeTimeWithPlural,
-            h : relativeTimeWithPlural,
-            hh : relativeTimeWithPlural,
-            d : "дзень",
-            dd : relativeTimeWithPlural,
-            M : "месяц",
-            MM : relativeTimeWithPlural,
-            y : "год",
-            yy : relativeTimeWithPlural
-        },
-
-
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "ночы";
-            } else if (hour < 12) {
-                return "раніцы";
-            } else if (hour < 17) {
-                return "дня";
-            } else {
-                return "вечара";
-            }
-        },
-
-        ordinal: function (number, period) {
-            switch (period) {
-            case 'M':
-            case 'd':
-            case 'DDD':
-            case 'w':
-            case 'W':
-                return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';
-            case 'D':
-                return number + '-га';
-            default:
-                return number;
-            }
-        },
-
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/bg.js b/resources/lib/moment/lang/bg.js
deleted file mode 100644 (file)
index b8a8c32..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-// moment.js locale configuration
-// locale : bulgarian (bg)
-// author : Krasen Borisov : https://github.com/kraz
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('bg', {
-        months : "януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),
-        monthsShort : "янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),
-        weekdays : "неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),
-        weekdaysShort : "нед_пон_вто_сря_чет_пет_съб".split("_"),
-        weekdaysMin : "нд_пн_вт_ср_чт_пт_сб".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "D.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Днес в] LT',
-            nextDay : '[Утре в] LT',
-            nextWeek : 'dddd [в] LT',
-            lastDay : '[Вчера в] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[В изминалата] dddd [в] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[В изминалия] dddd [в] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "след %s",
-            past : "преди %s",
-            s : "няколко секунди",
-            m : "минута",
-            mm : "%d минути",
-            h : "час",
-            hh : "%d часа",
-            d : "ден",
-            dd : "%d дни",
-            M : "месец",
-            MM : "%d месеца",
-            y : "година",
-            yy : "%d години"
-        },
-        ordinal : function (number) {
-            var lastDigit = number % 10,
-                last2Digits = number % 100;
-            if (number === 0) {
-                return number + '-ев';
-            } else if (last2Digits === 0) {
-                return number + '-ен';
-            } else if (last2Digits > 10 && last2Digits < 20) {
-                return number + '-ти';
-            } else if (lastDigit === 1) {
-                return number + '-ви';
-            } else if (lastDigit === 2) {
-                return number + '-ри';
-            } else if (lastDigit === 7 || lastDigit === 8) {
-                return number + '-ми';
-            } else {
-                return number + '-ти';
-            }
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/bn.js b/resources/lib/moment/lang/bn.js
deleted file mode 100644 (file)
index 8ceb8eb..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-// moment.js locale configuration
-// locale : Bengali (bn)
-// author : Kaushik Gandhi : https://github.com/kaushikgandhi
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '১',
-        '2': '২',
-        '3': '৩',
-        '4': '৪',
-        '5': '৫',
-        '6': '৬',
-        '7': '৭',
-        '8': '৮',
-        '9': '৯',
-        '0': '০'
-    },
-    numberMap = {
-        '১': '1',
-        '২': '2',
-        '৩': '3',
-        '৪': '4',
-        '৫': '5',
-        '৬': '6',
-        '৭': '7',
-        '৮': '8',
-        '৯': '9',
-        '০': '0'
-    };
-
-    return moment.defineLocale('bn', {
-        months : 'জানুয়ারী_ফেবুয়ারী_মার্চ_এপ্রিল_মে_জুন_জুলাই_অগাস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split("_"),
-        monthsShort : 'জানু_ফেব_মার্চ_এপর_মে_জুন_জুল_অগ_সেপ্ট_অক্টো_নভ_ডিসেম্'.split("_"),
-        weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পত্তিবার_শুক্রুবার_শনিবার'.split("_"),
-        weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পত্তি_শুক্রু_শনি'.split("_"),
-        weekdaysMin : 'রব_সম_মঙ্গ_বু_ব্রিহ_শু_শনি'.split("_"),
-        longDateFormat : {
-            LT : "A h:mm সময়",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        calendar : {
-            sameDay : '[আজ] LT',
-            nextDay : '[আগামীকাল] LT',
-            nextWeek : 'dddd, LT',
-            lastDay : '[গতকাল] LT',
-            lastWeek : '[গত] dddd, LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s পরে",
-            past : "%s আগে",
-            s : "কএক সেকেন্ড",
-            m : "এক মিনিট",
-            mm : "%d মিনিট",
-            h : "এক ঘন্টা",
-            hh : "%d ঘন্টা",
-            d : "এক দিন",
-            dd : "%d দিন",
-            M : "এক মাস",
-            MM : "%d মাস",
-            y : "এক বছর",
-            yy : "%d বছর"
-        },
-        preparse: function (string) {
-            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
-                return numberMap[match];
-            });
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            });
-        },
-        //Bengali is a vast language its spoken
-        //in different forms in various parts of the world.
-        //I have just generalized with most common one used
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "রাত";
-            } else if (hour < 10) {
-                return "শকাল";
-            } else if (hour < 17) {
-                return "দুপুর";
-            } else if (hour < 20) {
-                return "বিকেল";
-            } else {
-                return "রাত";
-            }
-        },
-        week : {
-            dow : 0, // Sunday is the first day of the week.
-            doy : 6  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/bo.js b/resources/lib/moment/lang/bo.js
deleted file mode 100644 (file)
index f1567ab..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-// moment.js locale configuration
-// locale : tibetan (bo)
-// author : Thupten N. Chakrishar : https://github.com/vajradog
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '༡',
-        '2': '༢',
-        '3': '༣',
-        '4': '༤',
-        '5': '༥',
-        '6': '༦',
-        '7': '༧',
-        '8': '༨',
-        '9': '༩',
-        '0': '༠'
-    },
-    numberMap = {
-        '༡': '1',
-        '༢': '2',
-        '༣': '3',
-        '༤': '4',
-        '༥': '5',
-        '༦': '6',
-        '༧': '7',
-        '༨': '8',
-        '༩': '9',
-        '༠': '0'
-    };
-
-    return moment.defineLocale('bo', {
-        months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split("_"),
-        monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split("_"),
-        weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split("_"),
-        weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split("_"),
-        weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split("_"),
-        longDateFormat : {
-            LT : "A h:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        calendar : {
-            sameDay : '[དི་རིང] LT',
-            nextDay : '[སང་ཉིན] LT',
-            nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT',
-            lastDay : '[ཁ་སང] LT',
-            lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s ལ་",
-            past : "%s སྔན་ལ",
-            s : "ལམ་སང",
-            m : "སྐར་མ་གཅིག",
-            mm : "%d སྐར་མ",
-            h : "ཆུ་ཚོད་གཅིག",
-            hh : "%d ཆུ་ཚོད",
-            d : "ཉིན་གཅིག",
-            dd : "%d ཉིན་",
-            M : "ཟླ་བ་གཅིག",
-            MM : "%d ཟླ་བ",
-            y : "ལོ་གཅིག",
-            yy : "%d ལོ"
-        },
-        preparse: function (string) {
-            return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
-                return numberMap[match];
-            });
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            });
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "མཚན་མོ";
-            } else if (hour < 10) {
-                return "ཞོགས་ཀས";
-            } else if (hour < 17) {
-                return "ཉིན་གུང";
-            } else if (hour < 20) {
-                return "དགོང་དག";
-            } else {
-                return "མཚན་མོ";
-            }
-        },
-        week : {
-            dow : 0, // Sunday is the first day of the week.
-            doy : 6  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/br.js b/resources/lib/moment/lang/br.js
deleted file mode 100644 (file)
index fb11fe1..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-// moment.js locale configuration
-// locale : breton (br)
-// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function relativeTimeWithMutation(number, withoutSuffix, key) {
-        var format = {
-            'mm': "munutenn",
-            'MM': "miz",
-            'dd': "devezh"
-        };
-        return number + ' ' + mutation(format[key], number);
-    }
-
-    function specialMutationForYears(number) {
-        switch (lastNumber(number)) {
-        case 1:
-        case 3:
-        case 4:
-        case 5:
-        case 9:
-            return number + ' bloaz';
-        default:
-            return number + ' vloaz';
-        }
-    }
-
-    function lastNumber(number) {
-        if (number > 9) {
-            return lastNumber(number % 10);
-        }
-        return number;
-    }
-
-    function mutation(text, number) {
-        if (number === 2) {
-            return softMutation(text);
-        }
-        return text;
-    }
-
-    function softMutation(text) {
-        var mutationTable = {
-            'm': 'v',
-            'b': 'v',
-            'd': 'z'
-        };
-        if (mutationTable[text.charAt(0)] === undefined) {
-            return text;
-        }
-        return mutationTable[text.charAt(0)] + text.substring(1);
-    }
-
-    return moment.defineLocale('br', {
-        months : "Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),
-        monthsShort : "Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),
-        weekdays : "Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),
-        weekdaysShort : "Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),
-        weekdaysMin : "Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),
-        longDateFormat : {
-            LT : "h[e]mm A",
-            L : "DD/MM/YYYY",
-            LL : "D [a viz] MMMM YYYY",
-            LLL : "D [a viz] MMMM YYYY LT",
-            LLLL : "dddd, D [a viz] MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Hiziv da] LT',
-            nextDay : '[Warc\'hoazh da] LT',
-            nextWeek : 'dddd [da] LT',
-            lastDay : '[Dec\'h da] LT',
-            lastWeek : 'dddd [paset da] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "a-benn %s",
-            past : "%s 'zo",
-            s : "un nebeud segondennoù",
-            m : "ur vunutenn",
-            mm : relativeTimeWithMutation,
-            h : "un eur",
-            hh : "%d eur",
-            d : "un devezh",
-            dd : relativeTimeWithMutation,
-            M : "ur miz",
-            MM : relativeTimeWithMutation,
-            y : "ur bloaz",
-            yy : specialMutationForYears
-        },
-        ordinal : function (number) {
-            var output = (number === 1) ? 'añ' : 'vet';
-            return number + output;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/bs.js b/resources/lib/moment/lang/bs.js
deleted file mode 100644 (file)
index d69015a..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-// moment.js locale configuration
-// locale : bosnian (bs)
-// author : Nedim Cholich : https://github.com/frontyard
-// based on (hr) translation by Bojan Marković
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function translate(number, withoutSuffix, key) {
-        var result = number + " ";
-        switch (key) {
-        case 'm':
-            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minuta';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'jedan sat' : 'jednog sata';
-        case 'hh':
-            if (number === 1) {
-                result += 'sat';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'sata';
-            } else {
-                result += 'sati';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dana';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mjesec';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'mjeseca';
-            } else {
-                result += 'mjeseci';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'godina';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'godine';
-            } else {
-                result += 'godina';
-            }
-            return result;
-        }
-    }
-
-    return moment.defineLocale('bs', {
-        months : "januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),
-        monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
-        weekdays : "nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),
-        weekdaysShort : "ned._pon._uto._sri._čet._pet._sub.".split("_"),
-        weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD. MM. YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay  : '[danas u] LT',
-            nextDay  : '[sutra u] LT',
-
-            nextWeek : function () {
-                switch (this.day()) {
-                case 0:
-                    return '[u] [nedjelju] [u] LT';
-                case 3:
-                    return '[u] [srijedu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
-                }
-            },
-            lastDay  : '[jučer u] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                    return '[prošlu] dddd [u] LT';
-                case 6:
-                    return '[prošle] [subote] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prošli] dddd [u] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "za %s",
-            past   : "prije %s",
-            s      : "par sekundi",
-            m      : translate,
-            mm     : translate,
-            h      : translate,
-            hh     : translate,
-            d      : "dan",
-            dd     : translate,
-            M      : "mjesec",
-            MM     : translate,
-            y      : "godinu",
-            yy     : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ca.js b/resources/lib/moment/lang/ca.js
deleted file mode 100644 (file)
index 932c1cb..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-// moment.js locale configuration
-// locale : catalan (ca)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('ca', {
-        months : "gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),
-        monthsShort : "gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),
-        weekdays : "diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),
-        weekdaysShort : "dg._dl._dt._dc._dj._dv._ds.".split("_"),
-        weekdaysMin : "Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : function () {
-                return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
-            },
-            nextDay : function () {
-                return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
-            },
-            nextWeek : function () {
-                return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
-            },
-            lastDay : function () {
-                return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
-            },
-            lastWeek : function () {
-                return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "en %s",
-            past : "fa %s",
-            s : "uns segons",
-            m : "un minut",
-            mm : "%d minuts",
-            h : "una hora",
-            hh : "%d hores",
-            d : "un dia",
-            dd : "%d dies",
-            M : "un mes",
-            MM : "%d mesos",
-            y : "un any",
-            yy : "%d anys"
-        },
-        ordinal : '%dº',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/cs.js b/resources/lib/moment/lang/cs.js
deleted file mode 100644 (file)
index 085bba0..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-// moment.js locale configuration
-// locale : czech (cs)
-// author : petrbela : https://github.com/petrbela
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var months = "leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),
-        monthsShort = "led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");
-
-    function plural(n) {
-        return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
-    }
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var result = number + " ";
-        switch (key) {
-        case 's':  // a few seconds / in a few seconds / a few seconds ago
-            return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
-        case 'm':  // a minute / in a minute / a minute ago
-            return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
-        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'minuty' : 'minut');
-            } else {
-                return result + 'minutami';
-            }
-            break;
-        case 'h':  // an hour / in an hour / an hour ago
-            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
-        case 'hh': // 9 hours / in 9 hours / 9 hours ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'hodiny' : 'hodin');
-            } else {
-                return result + 'hodinami';
-            }
-            break;
-        case 'd':  // a day / in a day / a day ago
-            return (withoutSuffix || isFuture) ? 'den' : 'dnem';
-        case 'dd': // 9 days / in 9 days / 9 days ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'dny' : 'dní');
-            } else {
-                return result + 'dny';
-            }
-            break;
-        case 'M':  // a month / in a month / a month ago
-            return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
-        case 'MM': // 9 months / in 9 months / 9 months ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'měsíce' : 'měsíců');
-            } else {
-                return result + 'měsíci';
-            }
-            break;
-        case 'y':  // a year / in a year / a year ago
-            return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
-        case 'yy': // 9 years / in 9 years / 9 years ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'roky' : 'let');
-            } else {
-                return result + 'lety';
-            }
-            break;
-        }
-    }
-
-    return moment.defineLocale('cs', {
-        months : months,
-        monthsShort : monthsShort,
-        monthsParse : (function (months, monthsShort) {
-            var i, _monthsParse = [];
-            for (i = 0; i < 12; i++) {
-                // use custom parser to solve problem with July (červenec)
-                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
-            }
-            return _monthsParse;
-        }(months, monthsShort)),
-        weekdays : "neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),
-        weekdaysShort : "ne_po_út_st_čt_pá_so".split("_"),
-        weekdaysMin : "ne_po_út_st_čt_pá_so".split("_"),
-        longDateFormat : {
-            LT: "H.mm",
-            L : "DD. MM. YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[dnes v] LT",
-            nextDay: '[zítra v] LT',
-            nextWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[v neděli v] LT';
-                case 1:
-                case 2:
-                    return '[v] dddd [v] LT';
-                case 3:
-                    return '[ve středu v] LT';
-                case 4:
-                    return '[ve čtvrtek v] LT';
-                case 5:
-                    return '[v pátek v] LT';
-                case 6:
-                    return '[v sobotu v] LT';
-                }
-            },
-            lastDay: '[včera v] LT',
-            lastWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[minulou neděli v] LT';
-                case 1:
-                case 2:
-                    return '[minulé] dddd [v] LT';
-                case 3:
-                    return '[minulou středu v] LT';
-                case 4:
-                case 5:
-                    return '[minulý] dddd [v] LT';
-                case 6:
-                    return '[minulou sobotu v] LT';
-                }
-            },
-            sameElse: "L"
-        },
-        relativeTime : {
-            future : "za %s",
-            past : "před %s",
-            s : translate,
-            m : translate,
-            mm : translate,
-            h : translate,
-            hh : translate,
-            d : translate,
-            dd : translate,
-            M : translate,
-            MM : translate,
-            y : translate,
-            yy : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/cv.js b/resources/lib/moment/lang/cv.js
deleted file mode 100644 (file)
index 0a290d8..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-// moment.js locale configuration
-// locale : chuvash (cv)
-// author : Anatoly Mironov : https://github.com/mirontoli
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('cv', {
-        months : "кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),
-        monthsShort : "кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),
-        weekdays : "вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун".split("_"),
-        weekdaysShort : "выр_тун_ытл_юн_кĕç_эрн_шăм".split("_"),
-        weekdaysMin : "вр_тн_ыт_юн_кç_эр_шм".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD-MM-YYYY",
-            LL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",
-            LLL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",
-            LLLL : "dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"
-        },
-        calendar : {
-            sameDay: '[Паян] LT [сехетре]',
-            nextDay: '[Ыран] LT [сехетре]',
-            lastDay: '[Ĕнер] LT [сехетре]',
-            nextWeek: '[Çитес] dddd LT [сехетре]',
-            lastWeek: '[Иртнĕ] dddd LT [сехетре]',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : function (output) {
-                var affix = /сехет$/i.exec(output) ? "рен" : /çул$/i.exec(output) ? "тан" : "ран";
-                return output + affix;
-            },
-            past : "%s каялла",
-            s : "пĕр-ик çеккунт",
-            m : "пĕр минут",
-            mm : "%d минут",
-            h : "пĕр сехет",
-            hh : "%d сехет",
-            d : "пĕр кун",
-            dd : "%d кун",
-            M : "пĕр уйăх",
-            MM : "%d уйăх",
-            y : "пĕр çул",
-            yy : "%d çул"
-        },
-        ordinal : '%d-мĕш',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/cy.js b/resources/lib/moment/lang/cy.js
deleted file mode 100644 (file)
index 6231a52..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-// moment.js locale configuration
-// locale : Welsh (cy)
-// author : Robert Allen
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale("cy", {
-        months: "Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),
-        monthsShort: "Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),
-        weekdays: "Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),
-        weekdaysShort: "Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),
-        weekdaysMin: "Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),
-        // time formats are the same as en-gb
-        longDateFormat: {
-            LT: "HH:mm",
-            L: "DD/MM/YYYY",
-            LL: "D MMMM YYYY",
-            LLL: "D MMMM YYYY LT",
-            LLLL: "dddd, D MMMM YYYY LT"
-        },
-        calendar: {
-            sameDay: '[Heddiw am] LT',
-            nextDay: '[Yfory am] LT',
-            nextWeek: 'dddd [am] LT',
-            lastDay: '[Ddoe am] LT',
-            lastWeek: 'dddd [diwethaf am] LT',
-            sameElse: 'L'
-        },
-        relativeTime: {
-            future: "mewn %s",
-            past: "%s yn ôl",
-            s: "ychydig eiliadau",
-            m: "munud",
-            mm: "%d munud",
-            h: "awr",
-            hh: "%d awr",
-            d: "diwrnod",
-            dd: "%d diwrnod",
-            M: "mis",
-            MM: "%d mis",
-            y: "blwyddyn",
-            yy: "%d flynedd"
-        },
-        // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
-        ordinal: function (number) {
-            var b = number,
-                output = '',
-                lookup = [
-                    '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
-                    'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
-                ];
-
-            if (b > 20) {
-                if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
-                    output = 'fed'; // not 30ain, 70ain or 90ain
-                } else {
-                    output = 'ain';
-                }
-            } else if (b > 0) {
-                output = lookup[b];
-            }
-
-            return number + output;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/da.js b/resources/lib/moment/lang/da.js
deleted file mode 100644 (file)
index 9c1c68f..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js locale configuration
-// locale : danish (da)
-// author : Ulrik Nielsen : https://github.com/mrbase
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('da', {
-        months : "januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),
-        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
-        weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
-        weekdaysShort : "søn_man_tir_ons_tor_fre_lør".split("_"),
-        weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd [d.] D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[I dag kl.] LT',
-            nextDay : '[I morgen kl.] LT',
-            nextWeek : 'dddd [kl.] LT',
-            lastDay : '[I går kl.] LT',
-            lastWeek : '[sidste] dddd [kl] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "om %s",
-            past : "%s siden",
-            s : "få sekunder",
-            m : "et minut",
-            mm : "%d minutter",
-            h : "en time",
-            hh : "%d timer",
-            d : "en dag",
-            dd : "%d dage",
-            M : "en måned",
-            MM : "%d måneder",
-            y : "et år",
-            yy : "%d år"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/de-at.js b/resources/lib/moment/lang/de-at.js
deleted file mode 100644 (file)
index 48d1b88..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-// moment.js locale configuration
-// locale : austrian german (de-at)
-// author : lluchs : https://github.com/lluchs
-// author: Menelion Elensúle: https://github.com/Oire
-// author : Martin Groller : https://github.com/MadMG
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function processRelativeTime(number, withoutSuffix, key, isFuture) {
-        var format = {
-            'm': ['eine Minute', 'einer Minute'],
-            'h': ['eine Stunde', 'einer Stunde'],
-            'd': ['ein Tag', 'einem Tag'],
-            'dd': [number + ' Tage', number + ' Tagen'],
-            'M': ['ein Monat', 'einem Monat'],
-            'MM': [number + ' Monate', number + ' Monaten'],
-            'y': ['ein Jahr', 'einem Jahr'],
-            'yy': [number + ' Jahre', number + ' Jahren']
-        };
-        return withoutSuffix ? format[key][0] : format[key][1];
-    }
-
-    return moment.defineLocale('de-at', {
-        months : "Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),
-        monthsShort : "Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),
-        weekdays : "Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),
-        weekdaysShort : "So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),
-        weekdaysMin : "So_Mo_Di_Mi_Do_Fr_Sa".split("_"),
-        longDateFormat : {
-            LT: "HH:mm [Uhr]",
-            L : "DD.MM.YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[Heute um] LT",
-            sameElse: "L",
-            nextDay: '[Morgen um] LT',
-            nextWeek: 'dddd [um] LT',
-            lastDay: '[Gestern um] LT',
-            lastWeek: '[letzten] dddd [um] LT'
-        },
-        relativeTime : {
-            future : "in %s",
-            past : "vor %s",
-            s : "ein paar Sekunden",
-            m : processRelativeTime,
-            mm : "%d Minuten",
-            h : processRelativeTime,
-            hh : "%d Stunden",
-            d : processRelativeTime,
-            dd : processRelativeTime,
-            M : processRelativeTime,
-            MM : processRelativeTime,
-            y : processRelativeTime,
-            yy : processRelativeTime
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/de.js b/resources/lib/moment/lang/de.js
deleted file mode 100644 (file)
index 0c389f9..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-// moment.js locale configuration
-// locale : german (de)
-// author : lluchs : https://github.com/lluchs
-// author: Menelion Elensúle: https://github.com/Oire
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function processRelativeTime(number, withoutSuffix, key, isFuture) {
-        var format = {
-            'm': ['eine Minute', 'einer Minute'],
-            'h': ['eine Stunde', 'einer Stunde'],
-            'd': ['ein Tag', 'einem Tag'],
-            'dd': [number + ' Tage', number + ' Tagen'],
-            'M': ['ein Monat', 'einem Monat'],
-            'MM': [number + ' Monate', number + ' Monaten'],
-            'y': ['ein Jahr', 'einem Jahr'],
-            'yy': [number + ' Jahre', number + ' Jahren']
-        };
-        return withoutSuffix ? format[key][0] : format[key][1];
-    }
-
-    return moment.defineLocale('de', {
-        months : "Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),
-        monthsShort : "Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),
-        weekdays : "Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),
-        weekdaysShort : "So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),
-        weekdaysMin : "So_Mo_Di_Mi_Do_Fr_Sa".split("_"),
-        longDateFormat : {
-            LT: "HH:mm [Uhr]",
-            L : "DD.MM.YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[Heute um] LT",
-            sameElse: "L",
-            nextDay: '[Morgen um] LT',
-            nextWeek: 'dddd [um] LT',
-            lastDay: '[Gestern um] LT',
-            lastWeek: '[letzten] dddd [um] LT'
-        },
-        relativeTime : {
-            future : "in %s",
-            past : "vor %s",
-            s : "ein paar Sekunden",
-            m : processRelativeTime,
-            mm : "%d Minuten",
-            h : processRelativeTime,
-            hh : "%d Stunden",
-            d : processRelativeTime,
-            dd : processRelativeTime,
-            M : processRelativeTime,
-            MM : processRelativeTime,
-            y : processRelativeTime,
-            yy : processRelativeTime
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/el.js b/resources/lib/moment/lang/el.js
deleted file mode 100644 (file)
index 7f31628..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-// moment.js locale configuration
-// locale : modern greek (el)
-// author : Aggelos Karalias : https://github.com/mehiel
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('el', {
-        monthsNominativeEl : "Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),
-        monthsGenitiveEl : "Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),
-        months : function (momentToFormat, format) {
-            if (/D/.test(format.substring(0, format.indexOf("MMMM")))) { // if there is a day number before 'MMMM'
-                return this._monthsGenitiveEl[momentToFormat.month()];
-            } else {
-                return this._monthsNominativeEl[momentToFormat.month()];
-            }
-        },
-        monthsShort : "Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),
-        weekdays : "Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),
-        weekdaysShort : "Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),
-        weekdaysMin : "Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),
-        meridiem : function (hours, minutes, isLower) {
-            if (hours > 11) {
-                return isLower ? 'μμ' : 'ΜΜ';
-            } else {
-                return isLower ? 'πμ' : 'ΠΜ';
-            }
-        },
-        longDateFormat : {
-            LT : "h:mm A",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendarEl : {
-            sameDay : '[Σήμερα {}] LT',
-            nextDay : '[Αύριο {}] LT',
-            nextWeek : 'dddd [{}] LT',
-            lastDay : '[Χθες {}] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                    case 6:
-                        return '[το προηγούμενο] dddd [{}] LT';
-                    default:
-                        return '[την προηγούμενη] dddd [{}] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        calendar : function (key, mom) {
-            var output = this._calendarEl[key],
-                hours = mom && mom.hours();
-
-            if (typeof output === 'function') {
-                output = output.apply(mom);
-            }
-
-            return output.replace("{}", (hours % 12 === 1 ? "στη" : "στις"));
-        },
-        relativeTime : {
-            future : "σε %s",
-            past : "%s πριν",
-            s : "δευτερόλεπτα",
-            m : "ένα λεπτό",
-            mm : "%d λεπτά",
-            h : "μία ώρα",
-            hh : "%d ώρες",
-            d : "μία μέρα",
-            dd : "%d μέρες",
-            M : "ένας μήνας",
-            MM : "%d μήνες",
-            y : "ένας χρόνος",
-            yy : "%d χρόνια"
-        },
-        ordinal : function (number) {
-            return number + 'η';
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/en-au.js b/resources/lib/moment/lang/en-au.js
deleted file mode 100644 (file)
index 852ecc9..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-// moment.js locale configuration
-// locale : australian english (en-au)
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('en-au', {
-        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
-        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
-        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
-        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
-        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
-        longDateFormat : {
-            LT : "h:mm A",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Today at] LT',
-            nextDay : '[Tomorrow at] LT',
-            nextWeek : 'dddd [at] LT',
-            lastDay : '[Yesterday at] LT',
-            lastWeek : '[Last] dddd [at] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "in %s",
-            past : "%s ago",
-            s : "a few seconds",
-            m : "a minute",
-            mm : "%d minutes",
-            h : "an hour",
-            hh : "%d hours",
-            d : "a day",
-            dd : "%d days",
-            M : "a month",
-            MM : "%d months",
-            y : "a year",
-            yy : "%d years"
-        },
-        ordinal : function (number) {
-            var b = number % 10,
-                output = (~~(number % 100 / 10) === 1) ? 'th' :
-                (b === 1) ? 'st' :
-                (b === 2) ? 'nd' :
-                (b === 3) ? 'rd' : 'th';
-            return number + output;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/en-ca.js b/resources/lib/moment/lang/en-ca.js
deleted file mode 100644 (file)
index ce253a8..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-// moment.js locale configuration
-// locale : canadian english (en-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('en-ca', {
-        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
-        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
-        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
-        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
-        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
-        longDateFormat : {
-            LT : "h:mm A",
-            L : "YYYY-MM-DD",
-            LL : "D MMMM, YYYY",
-            LLL : "D MMMM, YYYY LT",
-            LLLL : "dddd, D MMMM, YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Today at] LT',
-            nextDay : '[Tomorrow at] LT',
-            nextWeek : 'dddd [at] LT',
-            lastDay : '[Yesterday at] LT',
-            lastWeek : '[Last] dddd [at] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "in %s",
-            past : "%s ago",
-            s : "a few seconds",
-            m : "a minute",
-            mm : "%d minutes",
-            h : "an hour",
-            hh : "%d hours",
-            d : "a day",
-            dd : "%d days",
-            M : "a month",
-            MM : "%d months",
-            y : "a year",
-            yy : "%d years"
-        },
-        ordinal : function (number) {
-            var b = number % 10,
-                output = (~~(number % 100 / 10) === 1) ? 'th' :
-                (b === 1) ? 'st' :
-                (b === 2) ? 'nd' :
-                (b === 3) ? 'rd' : 'th';
-            return number + output;
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/en-gb.js b/resources/lib/moment/lang/en-gb.js
deleted file mode 100644 (file)
index 14ccbab..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// moment.js locale configuration
-// locale : great britain english (en-gb)
-// author : Chris Gedrim : https://github.com/chrisgedrim
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('en-gb', {
-        months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
-        monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
-        weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
-        weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
-        weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Today at] LT',
-            nextDay : '[Tomorrow at] LT',
-            nextWeek : 'dddd [at] LT',
-            lastDay : '[Yesterday at] LT',
-            lastWeek : '[Last] dddd [at] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "in %s",
-            past : "%s ago",
-            s : "a few seconds",
-            m : "a minute",
-            mm : "%d minutes",
-            h : "an hour",
-            hh : "%d hours",
-            d : "a day",
-            dd : "%d days",
-            M : "a month",
-            MM : "%d months",
-            y : "a year",
-            yy : "%d years"
-        },
-        ordinal : function (number) {
-            var b = number % 10,
-                output = (~~(number % 100 / 10) === 1) ? 'th' :
-                (b === 1) ? 'st' :
-                (b === 2) ? 'nd' :
-                (b === 3) ? 'rd' : 'th';
-            return number + output;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/eo.js b/resources/lib/moment/lang/eo.js
deleted file mode 100644 (file)
index 318385b..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-// moment.js locale configuration
-// locale : esperanto (eo)
-// author : Colin Dean : https://github.com/colindean
-// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
-//          Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('eo', {
-        months : "januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),
-        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),
-        weekdays : "Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),
-        weekdaysShort : "Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab".split("_"),
-        weekdaysMin : "Di_Lu_Ma_Me_Ĵa_Ve_Sa".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "YYYY-MM-DD",
-            LL : "D[-an de] MMMM, YYYY",
-            LLL : "D[-an de] MMMM, YYYY LT",
-            LLLL : "dddd, [la] D[-an de] MMMM, YYYY LT"
-        },
-        meridiem : function (hours, minutes, isLower) {
-            if (hours > 11) {
-                return isLower ? 'p.t.m.' : 'P.T.M.';
-            } else {
-                return isLower ? 'a.t.m.' : 'A.T.M.';
-            }
-        },
-        calendar : {
-            sameDay : '[Hodiaŭ je] LT',
-            nextDay : '[Morgaŭ je] LT',
-            nextWeek : 'dddd [je] LT',
-            lastDay : '[Hieraŭ je] LT',
-            lastWeek : '[pasinta] dddd [je] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "je %s",
-            past : "antaŭ %s",
-            s : "sekundoj",
-            m : "minuto",
-            mm : "%d minutoj",
-            h : "horo",
-            hh : "%d horoj",
-            d : "tago",//ne 'diurno', ĉar estas uzita por proksimumo
-            dd : "%d tagoj",
-            M : "monato",
-            MM : "%d monatoj",
-            y : "jaro",
-            yy : "%d jaroj"
-        },
-        ordinal : "%da",
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/es.js b/resources/lib/moment/lang/es.js
deleted file mode 100644 (file)
index ed0b564..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-// moment.js locale configuration
-// locale : spanish (es)
-// author : Julio Napurí : https://github.com/julionc
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var monthsShortDot = "ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),
-        monthsShort = "ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");
-
-    return moment.defineLocale('es', {
-        months : "enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),
-        monthsShort : function (m, format) {
-            if (/-MMM-/.test(format)) {
-                return monthsShort[m.month()];
-            } else {
-                return monthsShortDot[m.month()];
-            }
-        },
-        weekdays : "domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),
-        weekdaysShort : "dom._lun._mar._mié._jue._vie._sáb.".split("_"),
-        weekdaysMin : "Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD/MM/YYYY",
-            LL : "D [de] MMMM [del] YYYY",
-            LLL : "D [de] MMMM [del] YYYY LT",
-            LLLL : "dddd, D [de] MMMM [del] YYYY LT"
-        },
-        calendar : {
-            sameDay : function () {
-                return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
-            },
-            nextDay : function () {
-                return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
-            },
-            nextWeek : function () {
-                return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
-            },
-            lastDay : function () {
-                return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
-            },
-            lastWeek : function () {
-                return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "en %s",
-            past : "hace %s",
-            s : "unos segundos",
-            m : "un minuto",
-            mm : "%d minutos",
-            h : "una hora",
-            hh : "%d horas",
-            d : "un día",
-            dd : "%d días",
-            M : "un mes",
-            MM : "%d meses",
-            y : "un año",
-            yy : "%d años"
-        },
-        ordinal : '%dº',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/et.js b/resources/lib/moment/lang/et.js
deleted file mode 100644 (file)
index 2241529..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-// moment.js locale configuration
-// locale : estonian (et)
-// author : Henry Kehlmann : https://github.com/madhenry
-// improvements : Illimar Tambek : https://github.com/ragulka
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function processRelativeTime(number, withoutSuffix, key, isFuture) {
-        var format = {
-            's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
-            'm' : ['ühe minuti', 'üks minut'],
-            'mm': [number + ' minuti', number + ' minutit'],
-            'h' : ['ühe tunni', 'tund aega', 'üks tund'],
-            'hh': [number + ' tunni', number + ' tundi'],
-            'd' : ['ühe päeva', 'üks päev'],
-            'M' : ['kuu aja', 'kuu aega', 'üks kuu'],
-            'MM': [number + ' kuu', number + ' kuud'],
-            'y' : ['ühe aasta', 'aasta', 'üks aasta'],
-            'yy': [number + ' aasta', number + ' aastat']
-        };
-        if (withoutSuffix) {
-            return format[key][2] ? format[key][2] : format[key][1];
-        }
-        return isFuture ? format[key][0] : format[key][1];
-    }
-
-    return moment.defineLocale('et', {
-        months        : "jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),
-        monthsShort   : "jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),
-        weekdays      : "pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),
-        weekdaysShort : "P_E_T_K_N_R_L".split("_"),
-        weekdaysMin   : "P_E_T_K_N_R_L".split("_"),
-        longDateFormat : {
-            LT   : "H:mm",
-            L    : "DD.MM.YYYY",
-            LL   : "D. MMMM YYYY",
-            LLL  : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay  : '[Täna,] LT',
-            nextDay  : '[Homme,] LT',
-            nextWeek : '[Järgmine] dddd LT',
-            lastDay  : '[Eile,] LT',
-            lastWeek : '[Eelmine] dddd LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s pärast",
-            past   : "%s tagasi",
-            s      : processRelativeTime,
-            m      : processRelativeTime,
-            mm     : processRelativeTime,
-            h      : processRelativeTime,
-            hh     : processRelativeTime,
-            d      : processRelativeTime,
-            dd     : '%d päeva',
-            M      : processRelativeTime,
-            MM     : processRelativeTime,
-            y      : processRelativeTime,
-            yy     : processRelativeTime
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/eu.js b/resources/lib/moment/lang/eu.js
deleted file mode 100644 (file)
index fe2dddb..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-// moment.js locale configuration
-// locale : euskara (eu)
-// author : Eneko Illarramendi : https://github.com/eillarra
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('eu', {
-        months : "urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),
-        monthsShort : "urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),
-        weekdays : "igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),
-        weekdaysShort : "ig._al._ar._az._og._ol._lr.".split("_"),
-        weekdaysMin : "ig_al_ar_az_og_ol_lr".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "YYYY-MM-DD",
-            LL : "YYYY[ko] MMMM[ren] D[a]",
-            LLL : "YYYY[ko] MMMM[ren] D[a] LT",
-            LLLL : "dddd, YYYY[ko] MMMM[ren] D[a] LT",
-            l : "YYYY-M-D",
-            ll : "YYYY[ko] MMM D[a]",
-            lll : "YYYY[ko] MMM D[a] LT",
-            llll : "ddd, YYYY[ko] MMM D[a] LT"
-        },
-        calendar : {
-            sameDay : '[gaur] LT[etan]',
-            nextDay : '[bihar] LT[etan]',
-            nextWeek : 'dddd LT[etan]',
-            lastDay : '[atzo] LT[etan]',
-            lastWeek : '[aurreko] dddd LT[etan]',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s barru",
-            past : "duela %s",
-            s : "segundo batzuk",
-            m : "minutu bat",
-            mm : "%d minutu",
-            h : "ordu bat",
-            hh : "%d ordu",
-            d : "egun bat",
-            dd : "%d egun",
-            M : "hilabete bat",
-            MM : "%d hilabete",
-            y : "urte bat",
-            yy : "%d urte"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/fa.js b/resources/lib/moment/lang/fa.js
deleted file mode 100644 (file)
index 09c7909..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-// moment.js locale configuration
-// locale : Persian
-// author : Ebrahim Byagowi : https://github.com/ebraminio
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '۱',
-        '2': '۲',
-        '3': '۳',
-        '4': '۴',
-        '5': '۵',
-        '6': '۶',
-        '7': '۷',
-        '8': '۸',
-        '9': '۹',
-        '0': '۰'
-    }, numberMap = {
-        '۱': '1',
-        '۲': '2',
-        '۳': '3',
-        '۴': '4',
-        '۵': '5',
-        '۶': '6',
-        '۷': '7',
-        '۸': '8',
-        '۹': '9',
-        '۰': '0'
-    };
-
-    return moment.defineLocale('fa', {
-        months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
-        monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
-        weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
-        weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
-        weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
-        longDateFormat : {
-            LT : 'HH:mm',
-            L : 'DD/MM/YYYY',
-            LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 12) {
-                return "قبل از ظهر";
-            } else {
-                return "بعد از ظهر";
-            }
-        },
-        calendar : {
-            sameDay : '[امروز ساعت] LT',
-            nextDay : '[فردا ساعت] LT',
-            nextWeek : 'dddd [ساعت] LT',
-            lastDay : '[دیروز ساعت] LT',
-            lastWeek : 'dddd [پیش] [ساعت] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : 'در %s',
-            past : '%s پیش',
-            s : 'چندین ثانیه',
-            m : 'یک دقیقه',
-            mm : '%d دقیقه',
-            h : 'یک ساعت',
-            hh : '%d ساعت',
-            d : 'یک روز',
-            dd : '%d روز',
-            M : 'یک ماه',
-            MM : '%d ماه',
-            y : 'یک سال',
-            yy : '%d سال'
-        },
-        preparse: function (string) {
-            return string.replace(/[۰-۹]/g, function (match) {
-                return numberMap[match];
-            }).replace(/،/g, ',');
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            }).replace(/,/g, '،');
-        },
-        ordinal : '%dم',
-        week : {
-            dow : 6, // Saturday is the first day of the week.
-            doy : 12 // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/fi.js b/resources/lib/moment/lang/fi.js
deleted file mode 100644 (file)
index 2afc5e8..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-// moment.js locale configuration
-// locale : finnish (fi)
-// author : Tarmo Aidantausta : https://github.com/bleadof
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
-        numbersFuture = [
-            'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
-            numbersPast[7], numbersPast[8], numbersPast[9]
-        ];
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var result = "";
-        switch (key) {
-        case 's':
-            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
-        case 'm':
-            return isFuture ? 'minuutin' : 'minuutti';
-        case 'mm':
-            result = isFuture ? 'minuutin' : 'minuuttia';
-            break;
-        case 'h':
-            return isFuture ? 'tunnin' : 'tunti';
-        case 'hh':
-            result = isFuture ? 'tunnin' : 'tuntia';
-            break;
-        case 'd':
-            return isFuture ? 'päivän' : 'päivä';
-        case 'dd':
-            result = isFuture ? 'päivän' : 'päivää';
-            break;
-        case 'M':
-            return isFuture ? 'kuukauden' : 'kuukausi';
-        case 'MM':
-            result = isFuture ? 'kuukauden' : 'kuukautta';
-            break;
-        case 'y':
-            return isFuture ? 'vuoden' : 'vuosi';
-        case 'yy':
-            result = isFuture ? 'vuoden' : 'vuotta';
-            break;
-        }
-        result = verbalNumber(number, isFuture) + " " + result;
-        return result;
-    }
-
-    function verbalNumber(number, isFuture) {
-        return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;
-    }
-
-    return moment.defineLocale('fi', {
-        months : "tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),
-        monthsShort : "tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),
-        weekdays : "sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),
-        weekdaysShort : "su_ma_ti_ke_to_pe_la".split("_"),
-        weekdaysMin : "su_ma_ti_ke_to_pe_la".split("_"),
-        longDateFormat : {
-            LT : "HH.mm",
-            L : "DD.MM.YYYY",
-            LL : "Do MMMM[ta] YYYY",
-            LLL : "Do MMMM[ta] YYYY, [klo] LT",
-            LLLL : "dddd, Do MMMM[ta] YYYY, [klo] LT",
-            l : "D.M.YYYY",
-            ll : "Do MMM YYYY",
-            lll : "Do MMM YYYY, [klo] LT",
-            llll : "ddd, Do MMM YYYY, [klo] LT"
-        },
-        calendar : {
-            sameDay : '[tänään] [klo] LT',
-            nextDay : '[huomenna] [klo] LT',
-            nextWeek : 'dddd [klo] LT',
-            lastDay : '[eilen] [klo] LT',
-            lastWeek : '[viime] dddd[na] [klo] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s päästä",
-            past : "%s sitten",
-            s : translate,
-            m : translate,
-            mm : translate,
-            h : translate,
-            hh : translate,
-            d : translate,
-            dd : translate,
-            M : translate,
-            MM : translate,
-            y : translate,
-            yy : translate
-        },
-        ordinal : "%d.",
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/fo.js b/resources/lib/moment/lang/fo.js
deleted file mode 100644 (file)
index cdc9eda..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js locale configuration
-// locale : faroese (fo)
-// author : Ragnar Johannesen : https://github.com/ragnar123
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('fo', {
-        months : "januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),
-        monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),
-        weekdays : "sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),
-        weekdaysShort : "sun_mán_týs_mik_hós_frí_ley".split("_"),
-        weekdaysMin : "su_má_tý_mi_hó_fr_le".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D. MMMM, YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Í dag kl.] LT',
-            nextDay : '[Í morgin kl.] LT',
-            nextWeek : 'dddd [kl.] LT',
-            lastDay : '[Í gjár kl.] LT',
-            lastWeek : '[síðstu] dddd [kl] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "um %s",
-            past : "%s síðani",
-            s : "fá sekund",
-            m : "ein minutt",
-            mm : "%d minuttir",
-            h : "ein tími",
-            hh : "%d tímar",
-            d : "ein dagur",
-            dd : "%d dagar",
-            M : "ein mánaði",
-            MM : "%d mánaðir",
-            y : "eitt ár",
-            yy : "%d ár"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/fr-ca.js b/resources/lib/moment/lang/fr-ca.js
deleted file mode 100644 (file)
index 714b11b..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-// moment.js locale configuration
-// locale : canadian french (fr-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('fr-ca', {
-        months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
-        monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
-        weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
-        weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
-        weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "YYYY-MM-DD",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[Aujourd'hui à] LT",
-            nextDay: '[Demain à] LT',
-            nextWeek: 'dddd [à] LT',
-            lastDay: '[Hier à] LT',
-            lastWeek: 'dddd [dernier à] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "dans %s",
-            past : "il y a %s",
-            s : "quelques secondes",
-            m : "une minute",
-            mm : "%d minutes",
-            h : "une heure",
-            hh : "%d heures",
-            d : "un jour",
-            dd : "%d jours",
-            M : "un mois",
-            MM : "%d mois",
-            y : "un an",
-            yy : "%d ans"
-        },
-        ordinal : function (number) {
-            return number + (number === 1 ? 'er' : '');
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/fr.js b/resources/lib/moment/lang/fr.js
deleted file mode 100644 (file)
index 106ab11..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// moment.js locale configuration
-// locale : french (fr)
-// author : John Fischer : https://github.com/jfroffice
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('fr', {
-        months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
-        monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
-        weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
-        weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
-        weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[Aujourd'hui à] LT",
-            nextDay: '[Demain à] LT',
-            nextWeek: 'dddd [à] LT',
-            lastDay: '[Hier à] LT',
-            lastWeek: 'dddd [dernier à] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "dans %s",
-            past : "il y a %s",
-            s : "quelques secondes",
-            m : "une minute",
-            mm : "%d minutes",
-            h : "une heure",
-            hh : "%d heures",
-            d : "un jour",
-            dd : "%d jours",
-            M : "un mois",
-            MM : "%d mois",
-            y : "un an",
-            yy : "%d ans"
-        },
-        ordinal : function (number) {
-            return number + (number === 1 ? 'er' : '');
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/gl.js b/resources/lib/moment/lang/gl.js
deleted file mode 100644 (file)
index e82065f..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-// moment.js locale configuration
-// locale : galician (gl)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('gl', {
-        months : "Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),
-        monthsShort : "Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),
-        weekdays : "Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),
-        weekdaysShort : "Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),
-        weekdaysMin : "Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : function () {
-                return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
-            },
-            nextDay : function () {
-                return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
-            },
-            nextWeek : function () {
-                return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
-            },
-            lastDay : function () {
-                return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
-            },
-            lastWeek : function () {
-                return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : function (str) {
-                if (str === "uns segundos") {
-                    return "nuns segundos";
-                }
-                return "en " + str;
-            },
-            past : "hai %s",
-            s : "uns segundos",
-            m : "un minuto",
-            mm : "%d minutos",
-            h : "unha hora",
-            hh : "%d horas",
-            d : "un día",
-            dd : "%d días",
-            M : "un mes",
-            MM : "%d meses",
-            y : "un ano",
-            yy : "%d anos"
-        },
-        ordinal : '%dº',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/he.js b/resources/lib/moment/lang/he.js
deleted file mode 100644 (file)
index 0af4e09..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-// moment.js locale configuration
-// locale : Hebrew (he)
-// author : Tomer Cohen : https://github.com/tomer
-// author : Moshe Simantov : https://github.com/DevelopmentIL
-// author : Tal Ater : https://github.com/TalAter
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('he', {
-        months : "ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),
-        monthsShort : "ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),
-        weekdays : "ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),
-        weekdaysShort : "א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),
-        weekdaysMin : "א_ב_ג_ד_ה_ו_ש".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D [ב]MMMM YYYY",
-            LLL : "D [ב]MMMM YYYY LT",
-            LLLL : "dddd, D [ב]MMMM YYYY LT",
-            l : "D/M/YYYY",
-            ll : "D MMM YYYY",
-            lll : "D MMM YYYY LT",
-            llll : "ddd, D MMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[היום ב־]LT',
-            nextDay : '[מחר ב־]LT',
-            nextWeek : 'dddd [בשעה] LT',
-            lastDay : '[אתמול ב־]LT',
-            lastWeek : '[ביום] dddd [האחרון בשעה] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "בעוד %s",
-            past : "לפני %s",
-            s : "מספר שניות",
-            m : "דקה",
-            mm : "%d דקות",
-            h : "שעה",
-            hh : function (number) {
-                if (number === 2) {
-                    return "שעתיים";
-                }
-                return number + " שעות";
-            },
-            d : "יום",
-            dd : function (number) {
-                if (number === 2) {
-                    return "יומיים";
-                }
-                return number + " ימים";
-            },
-            M : "חודש",
-            MM : function (number) {
-                if (number === 2) {
-                    return "חודשיים";
-                }
-                return number + " חודשים";
-            },
-            y : "שנה",
-            yy : function (number) {
-                if (number === 2) {
-                    return "שנתיים";
-                }
-                return number + " שנים";
-            }
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/hi.js b/resources/lib/moment/lang/hi.js
deleted file mode 100644 (file)
index 6dd7098..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-// moment.js locale configuration
-// locale : hindi (hi)
-// author : Mayank Singhal : https://github.com/mayanksinghal
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '१',
-        '2': '२',
-        '3': '३',
-        '4': '४',
-        '5': '५',
-        '6': '६',
-        '7': '७',
-        '8': '८',
-        '9': '९',
-        '0': '०'
-    },
-    numberMap = {
-        '१': '1',
-        '२': '2',
-        '३': '3',
-        '४': '4',
-        '५': '5',
-        '६': '6',
-        '७': '7',
-        '८': '8',
-        '९': '9',
-        '०': '0'
-    };
-
-    return moment.defineLocale('hi', {
-        months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split("_"),
-        monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split("_"),
-        weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split("_"),
-        weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split("_"),
-        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split("_"),
-        longDateFormat : {
-            LT : "A h:mm बजे",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        calendar : {
-            sameDay : '[आज] LT',
-            nextDay : '[कल] LT',
-            nextWeek : 'dddd, LT',
-            lastDay : '[कल] LT',
-            lastWeek : '[पिछले] dddd, LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s में",
-            past : "%s पहले",
-            s : "कुछ ही क्षण",
-            m : "एक मिनट",
-            mm : "%d मिनट",
-            h : "एक घंटा",
-            hh : "%d घंटे",
-            d : "एक दिन",
-            dd : "%d दिन",
-            M : "एक महीने",
-            MM : "%d महीने",
-            y : "एक वर्ष",
-            yy : "%d वर्ष"
-        },
-        preparse: function (string) {
-            return string.replace(/[१२३४५६७८९०]/g, function (match) {
-                return numberMap[match];
-            });
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            });
-        },
-        // Hindi notation for meridiems are quite fuzzy in practice. While there exists
-        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "रात";
-            } else if (hour < 10) {
-                return "सुबह";
-            } else if (hour < 17) {
-                return "दोपहर";
-            } else if (hour < 20) {
-                return "शाम";
-            } else {
-                return "रात";
-            }
-        },
-        week : {
-            dow : 0, // Sunday is the first day of the week.
-            doy : 6  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/hr.js b/resources/lib/moment/lang/hr.js
deleted file mode 100644 (file)
index 20fe8c1..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-// moment.js locale configuration
-// locale : hrvatski (hr)
-// author : Bojan Marković : https://github.com/bmarkovic
-
-// based on (sl) translation by Robert Sedovšek
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function translate(number, withoutSuffix, key) {
-        var result = number + " ";
-        switch (key) {
-        case 'm':
-            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minuta';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'jedan sat' : 'jednog sata';
-        case 'hh':
-            if (number === 1) {
-                result += 'sat';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'sata';
-            } else {
-                result += 'sati';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dana';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mjesec';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'mjeseca';
-            } else {
-                result += 'mjeseci';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'godina';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'godine';
-            } else {
-                result += 'godina';
-            }
-            return result;
-        }
-    }
-
-    return moment.defineLocale('hr', {
-        months : "sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),
-        monthsShort : "sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),
-        weekdays : "nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),
-        weekdaysShort : "ned._pon._uto._sri._čet._pet._sub.".split("_"),
-        weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD. MM. YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay  : '[danas u] LT',
-            nextDay  : '[sutra u] LT',
-
-            nextWeek : function () {
-                switch (this.day()) {
-                case 0:
-                    return '[u] [nedjelju] [u] LT';
-                case 3:
-                    return '[u] [srijedu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
-                }
-            },
-            lastDay  : '[jučer u] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                    return '[prošlu] dddd [u] LT';
-                case 6:
-                    return '[prošle] [subote] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prošli] dddd [u] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "za %s",
-            past   : "prije %s",
-            s      : "par sekundi",
-            m      : translate,
-            mm     : translate,
-            h      : translate,
-            hh     : translate,
-            d      : "dan",
-            dd     : translate,
-            M      : "mjesec",
-            MM     : translate,
-            y      : "godinu",
-            yy     : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/hu.js b/resources/lib/moment/lang/hu.js
deleted file mode 100644 (file)
index 910f086..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-// moment.js locale configuration
-// locale : hungarian (hu)
-// author : Adam Brunner : https://github.com/adambrunner
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var num = number,
-            suffix;
-
-        switch (key) {
-        case 's':
-            return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
-        case 'm':
-            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
-        case 'mm':
-            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
-        case 'h':
-            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
-        case 'hh':
-            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
-        case 'd':
-            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
-        case 'dd':
-            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
-        case 'M':
-            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
-        case 'MM':
-            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
-        case 'y':
-            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
-        case 'yy':
-            return num + (isFuture || withoutSuffix ? ' év' : ' éve');
-        }
-
-        return '';
-    }
-
-    function week(isFuture) {
-        return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
-    }
-
-    return moment.defineLocale('hu', {
-        months : "január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),
-        monthsShort : "jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),
-        weekdays : "vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),
-        weekdaysShort : "vas_hét_kedd_sze_csüt_pén_szo".split("_"),
-        weekdaysMin : "v_h_k_sze_cs_p_szo".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "YYYY.MM.DD.",
-            LL : "YYYY. MMMM D.",
-            LLL : "YYYY. MMMM D., LT",
-            LLLL : "YYYY. MMMM D., dddd LT"
-        },
-        meridiem : function (hours, minutes, isLower) {
-            if (hours < 12) {
-                return isLower === true ? 'de' : 'DE';
-            } else {
-                return isLower === true ? 'du' : 'DU';
-            }
-        },
-        calendar : {
-            sameDay : '[ma] LT[-kor]',
-            nextDay : '[holnap] LT[-kor]',
-            nextWeek : function () {
-                return week.call(this, true);
-            },
-            lastDay : '[tegnap] LT[-kor]',
-            lastWeek : function () {
-                return week.call(this, false);
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s múlva",
-            past : "%s",
-            s : translate,
-            m : translate,
-            mm : translate,
-            h : translate,
-            hh : translate,
-            d : translate,
-            dd : translate,
-            M : translate,
-            MM : translate,
-            y : translate,
-            yy : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/hy-am.js b/resources/lib/moment/lang/hy-am.js
deleted file mode 100644 (file)
index b6984a2..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-// moment.js locale configuration
-// locale : Armenian (hy-am)
-// author : Armendarabyan : https://github.com/armendarabyan
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_'),
-            'accusative': 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_')
-        },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function monthsShortCaseReplace(m, format) {
-        var monthsShort = 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_');
-
-        return monthsShort[m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_');
-
-        return weekdays[m.day()];
-    }
-
-    return moment.defineLocale('hy-am', {
-        months : monthsCaseReplace,
-        monthsShort : monthsShortCaseReplace,
-        weekdays : weekdaysCaseReplace,
-        weekdaysShort : "կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),
-        weekdaysMin : "կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY թ.",
-            LLL : "D MMMM YYYY թ., LT",
-            LLLL : "dddd, D MMMM YYYY թ., LT"
-        },
-        calendar : {
-            sameDay: '[այսօր] LT',
-            nextDay: '[վաղը] LT',
-            lastDay: '[երեկ] LT',
-            nextWeek: function () {
-                return 'dddd [օրը ժամը] LT';
-            },
-            lastWeek: function () {
-                return '[անցած] dddd [օրը ժամը] LT';
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "%s հետո",
-            past : "%s առաջ",
-            s : "մի քանի վայրկյան",
-            m : "րոպե",
-            mm : "%d րոպե",
-            h : "ժամ",
-            hh : "%d ժամ",
-            d : "օր",
-            dd : "%d օր",
-            M : "ամիս",
-            MM : "%d ամիս",
-            y : "տարի",
-            yy : "%d տարի"
-        },
-
-        meridiem : function (hour) {
-            if (hour < 4) {
-                return "գիշերվա";
-            } else if (hour < 12) {
-                return "առավոտվա";
-            } else if (hour < 17) {
-                return "ցերեկվա";
-            } else {
-                return "երեկոյան";
-            }
-        },
-
-        ordinal: function (number, period) {
-            switch (period) {
-            case 'DDD':
-            case 'w':
-            case 'W':
-            case 'DDDo':
-                if (number === 1) {
-                    return number + '-ին';
-                }
-                return number + '-րդ';
-            default:
-                return number;
-            }
-        },
-
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/id.js b/resources/lib/moment/lang/id.js
deleted file mode 100644 (file)
index 6043f30..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-// moment.js locale configuration
-// locale : Bahasa Indonesia (id)
-// author : Mohammad Satrio Utomo : https://github.com/tyok
-// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('id', {
-        months : "Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),
-        monthsShort : "Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),
-        weekdays : "Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),
-        weekdaysShort : "Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),
-        weekdaysMin : "Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),
-        longDateFormat : {
-            LT : "HH.mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY [pukul] LT",
-            LLLL : "dddd, D MMMM YYYY [pukul] LT"
-        },
-        meridiem : function (hours, minutes, isLower) {
-            if (hours < 11) {
-                return 'pagi';
-            } else if (hours < 15) {
-                return 'siang';
-            } else if (hours < 19) {
-                return 'sore';
-            } else {
-                return 'malam';
-            }
-        },
-        calendar : {
-            sameDay : '[Hari ini pukul] LT',
-            nextDay : '[Besok pukul] LT',
-            nextWeek : 'dddd [pukul] LT',
-            lastDay : '[Kemarin pukul] LT',
-            lastWeek : 'dddd [lalu pukul] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "dalam %s",
-            past : "%s yang lalu",
-            s : "beberapa detik",
-            m : "semenit",
-            mm : "%d menit",
-            h : "sejam",
-            hh : "%d jam",
-            d : "sehari",
-            dd : "%d hari",
-            M : "sebulan",
-            MM : "%d bulan",
-            y : "setahun",
-            yy : "%d tahun"
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/is.js b/resources/lib/moment/lang/is.js
deleted file mode 100644 (file)
index ed22406..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-// moment.js locale configuration
-// locale : icelandic (is)
-// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function plural(n) {
-        if (n % 100 === 11) {
-            return true;
-        } else if (n % 10 === 1) {
-            return false;
-        }
-        return true;
-    }
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var result = number + " ";
-        switch (key) {
-        case 's':
-            return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
-        case 'm':
-            return withoutSuffix ? 'mínúta' : 'mínútu';
-        case 'mm':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
-            } else if (withoutSuffix) {
-                return result + 'mínúta';
-            }
-            return result + 'mínútu';
-        case 'hh':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
-            }
-            return result + 'klukkustund';
-        case 'd':
-            if (withoutSuffix) {
-                return 'dagur';
-            }
-            return isFuture ? 'dag' : 'degi';
-        case 'dd':
-            if (plural(number)) {
-                if (withoutSuffix) {
-                    return result + 'dagar';
-                }
-                return result + (isFuture ? 'daga' : 'dögum');
-            } else if (withoutSuffix) {
-                return result + 'dagur';
-            }
-            return result + (isFuture ? 'dag' : 'degi');
-        case 'M':
-            if (withoutSuffix) {
-                return 'mánuður';
-            }
-            return isFuture ? 'mánuð' : 'mánuði';
-        case 'MM':
-            if (plural(number)) {
-                if (withoutSuffix) {
-                    return result + 'mánuðir';
-                }
-                return result + (isFuture ? 'mánuði' : 'mánuðum');
-            } else if (withoutSuffix) {
-                return result + 'mánuður';
-            }
-            return result + (isFuture ? 'mánuð' : 'mánuði');
-        case 'y':
-            return withoutSuffix || isFuture ? 'ár' : 'ári';
-        case 'yy':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
-            }
-            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
-        }
-    }
-
-    return moment.defineLocale('is', {
-        months : "janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),
-        monthsShort : "jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),
-        weekdays : "sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),
-        weekdaysShort : "sun_mán_þri_mið_fim_fös_lau".split("_"),
-        weekdaysMin : "Su_Má_Þr_Mi_Fi_Fö_La".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD/MM/YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY [kl.] LT",
-            LLLL : "dddd, D. MMMM YYYY [kl.] LT"
-        },
-        calendar : {
-            sameDay : '[í dag kl.] LT',
-            nextDay : '[á morgun kl.] LT',
-            nextWeek : 'dddd [kl.] LT',
-            lastDay : '[í gær kl.] LT',
-            lastWeek : '[síðasta] dddd [kl.] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "eftir %s",
-            past : "fyrir %s síðan",
-            s : translate,
-            m : translate,
-            mm : translate,
-            h : "klukkustund",
-            hh : translate,
-            d : translate,
-            dd : translate,
-            M : translate,
-            MM : translate,
-            y : translate,
-            yy : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/it.js b/resources/lib/moment/lang/it.js
deleted file mode 100644 (file)
index a151ccc..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-// moment.js locale configuration
-// locale : italian (it)
-// author : Lorenzo : https://github.com/aliem
-// author: Mattia Larentis: https://github.com/nostalgiaz
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('it', {
-        months : "gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),
-        monthsShort : "gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),
-        weekdays : "Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),
-        weekdaysShort : "Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),
-        weekdaysMin : "D_L_Ma_Me_G_V_S".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: '[Oggi alle] LT',
-            nextDay: '[Domani alle] LT',
-            nextWeek: 'dddd [alle] LT',
-            lastDay: '[Ieri alle] LT',
-            lastWeek: '[lo scorso] dddd [alle] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : function (s) {
-                return ((/^[0-9].+$/).test(s) ? "tra" : "in") + " " + s;
-            },
-            past : "%s fa",
-            s : "alcuni secondi",
-            m : "un minuto",
-            mm : "%d minuti",
-            h : "un'ora",
-            hh : "%d ore",
-            d : "un giorno",
-            dd : "%d giorni",
-            M : "un mese",
-            MM : "%d mesi",
-            y : "un anno",
-            yy : "%d anni"
-        },
-        ordinal: '%dº',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ja.js b/resources/lib/moment/lang/ja.js
deleted file mode 100644 (file)
index 34c4b89..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// moment.js locale configuration
-// locale : japanese (ja)
-// author : LI Long : https://github.com/baryon
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('ja', {
-        months : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
-        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
-        weekdays : "日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),
-        weekdaysShort : "日_月_火_水_木_金_土".split("_"),
-        weekdaysMin : "日_月_火_水_木_金_土".split("_"),
-        longDateFormat : {
-            LT : "Ah時m分",
-            L : "YYYY/MM/DD",
-            LL : "YYYY年M月D日",
-            LLL : "YYYY年M月D日LT",
-            LLLL : "YYYY年M月D日LT dddd"
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 12) {
-                return "午前";
-            } else {
-                return "午後";
-            }
-        },
-        calendar : {
-            sameDay : '[今日] LT',
-            nextDay : '[明日] LT',
-            nextWeek : '[来週]dddd LT',
-            lastDay : '[昨日] LT',
-            lastWeek : '[前週]dddd LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s後",
-            past : "%s前",
-            s : "数秒",
-            m : "1分",
-            mm : "%d分",
-            h : "1時間",
-            hh : "%d時間",
-            d : "1日",
-            dd : "%d日",
-            M : "1ヶ月",
-            MM : "%dヶ月",
-            y : "1年",
-            yy : "%d年"
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ka.js b/resources/lib/moment/lang/ka.js
deleted file mode 100644 (file)
index 3134524..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-// moment.js locale configuration
-// locale : Georgian (ka)
-// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
-            'accusative': 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
-        },
-
-        nounCase = (/D[oD] *MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
-            'accusative': 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_')
-        },
-
-        nounCase = (/(წინა|შემდეგ)/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return weekdays[nounCase][m.day()];
-    }
-
-    return moment.defineLocale('ka', {
-        months : monthsCaseReplace,
-        monthsShort : "იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),
-        weekdays : weekdaysCaseReplace,
-        weekdaysShort : "კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),
-        weekdaysMin : "კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),
-        longDateFormat : {
-            LT : "h:mm A",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[დღეს] LT[-ზე]',
-            nextDay : '[ხვალ] LT[-ზე]',
-            lastDay : '[გუშინ] LT[-ზე]',
-            nextWeek : '[შემდეგ] dddd LT[-ზე]',
-            lastWeek : '[წინა] dddd LT-ზე',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : function (s) {
-                return (/(წამი|წუთი|საათი|წელი)/).test(s) ?
-                    s.replace(/ი$/, "ში") :
-                    s + "ში";
-            },
-            past : function (s) {
-                if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {
-                    return s.replace(/(ი|ე)$/, "ის წინ");
-                }
-                if ((/წელი/).test(s)) {
-                    return s.replace(/წელი$/, "წლის წინ");
-                }
-            },
-            s : "რამდენიმე წამი",
-            m : "წუთი",
-            mm : "%d წუთი",
-            h : "საათი",
-            hh : "%d საათი",
-            d : "დღე",
-            dd : "%d დღე",
-            M : "თვე",
-            MM : "%d თვე",
-            y : "წელი",
-            yy : "%d წელი"
-        },
-        ordinal : function (number) {
-            if (number === 0) {
-                return number;
-            }
-
-            if (number === 1) {
-                return number + "-ლი";
-            }
-
-            if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
-                return "მე-" + number;
-            }
-
-            return number + "-ე";
-        },
-        week : {
-            dow : 1,
-            doy : 7
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/km.js b/resources/lib/moment/lang/km.js
deleted file mode 100644 (file)
index f457e8d..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// moment.js locale configuration
-// locale : khmer (km)
-// author : Kruy Vanna : https://github.com/kruyvanna
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('km', {
-        months: "មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),
-        monthsShort: "មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),
-        weekdays: "អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),
-        weekdaysShort: "អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),
-        weekdaysMin: "អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),
-        longDateFormat: {
-            LT: "HH:mm",
-            L: "DD/MM/YYYY",
-            LL: "D MMMM YYYY",
-            LLL: "D MMMM YYYY LT",
-            LLLL: "dddd, D MMMM YYYY LT"
-        },
-        calendar: {
-            sameDay: '[ថ្ងៃនៈ ម៉ោង] LT',
-            nextDay: '[ស្អែក ម៉ោង] LT',
-            nextWeek: 'dddd [ម៉ោង] LT',
-            lastDay: '[ម្សិលមិញ ម៉ោង] LT',
-            lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
-            sameElse: 'L'
-        },
-        relativeTime: {
-            future: "%sទៀត",
-            past: "%sមុន",
-            s: "ប៉ុន្មានវិនាទី",
-            m: "មួយនាទី",
-            mm: "%d នាទី",
-            h: "មួយម៉ោង",
-            hh: "%d ម៉ោង",
-            d: "មួយថ្ងៃ",
-            dd: "%d ថ្ងៃ",
-            M: "មួយខែ",
-            MM: "%d ខែ",
-            y: "មួយឆ្នាំ",
-            yy: "%d ឆ្នាំ"
-        },
-        week: {
-            dow: 1, // Monday is the first day of the week.
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ko.js b/resources/lib/moment/lang/ko.js
deleted file mode 100644 (file)
index 7de2e51..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// moment.js locale configuration
-// locale : korean (ko)
-//
-// authors
-//
-// - Kyungwook, Park : https://github.com/kyungw00k
-// - Jeeeyul Lee <jeeeyul@gmail.com>
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('ko', {
-        months : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),
-        monthsShort : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),
-        weekdays : "일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),
-        weekdaysShort : "일_월_화_수_목_금_토".split("_"),
-        weekdaysMin : "일_월_화_수_목_금_토".split("_"),
-        longDateFormat : {
-            LT : "A h시 mm분",
-            L : "YYYY.MM.DD",
-            LL : "YYYY년 MMMM D일",
-            LLL : "YYYY년 MMMM D일 LT",
-            LLLL : "YYYY년 MMMM D일 dddd LT"
-        },
-        meridiem : function (hour, minute, isUpper) {
-            return hour < 12 ? '오전' : '오후';
-        },
-        calendar : {
-            sameDay : '오늘 LT',
-            nextDay : '내일 LT',
-            nextWeek : 'dddd LT',
-            lastDay : '어제 LT',
-            lastWeek : '지난주 dddd LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s 후",
-            past : "%s 전",
-            s : "몇초",
-            ss : "%d초",
-            m : "일분",
-            mm : "%d분",
-            h : "한시간",
-            hh : "%d시간",
-            d : "하루",
-            dd : "%d일",
-            M : "한달",
-            MM : "%d달",
-            y : "일년",
-            yy : "%d년"
-        },
-        ordinal : '%d일',
-        meridiemParse : /(오전|오후)/,
-        isPM : function (token) {
-            return token === "오후";
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/lb.js b/resources/lib/moment/lang/lb.js
deleted file mode 100644 (file)
index c878b79..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-// moment.js locale configuration
-// locale : Luxembourgish (lb)
-// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz
-
-// Note: Luxembourgish has a very particular phonological rule ("Eifeler Regel") that causes the
-// deletion of the final "n" in certain contexts. That's what the "eifelerRegelAppliesToWeekday"
-// and "eifelerRegelAppliesToNumber" methods are meant for
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function processRelativeTime(number, withoutSuffix, key, isFuture) {
-        var format = {
-            'm': ['eng Minutt', 'enger Minutt'],
-            'h': ['eng Stonn', 'enger Stonn'],
-            'd': ['een Dag', 'engem Dag'],
-            'M': ['ee Mount', 'engem Mount'],
-            'y': ['ee Joer', 'engem Joer']
-        };
-        return withoutSuffix ? format[key][0] : format[key][1];
-    }
-
-    function processFutureTime(string) {
-        var number = string.substr(0, string.indexOf(' '));
-        if (eifelerRegelAppliesToNumber(number)) {
-            return "a " + string;
-        }
-        return "an " + string;
-    }
-
-    function processPastTime(string) {
-        var number = string.substr(0, string.indexOf(' '));
-        if (eifelerRegelAppliesToNumber(number)) {
-            return "viru " + string;
-        }
-        return "virun " + string;
-    }
-
-    /**
-     * Returns true if the word before the given number loses the "-n" ending.
-     * e.g. "an 10 Deeg" but "a 5 Deeg"
-     *
-     * @param number {integer}
-     * @returns {boolean}
-     */
-    function eifelerRegelAppliesToNumber(number) {
-        number = parseInt(number, 10);
-        if (isNaN(number)) {
-            return false;
-        }
-        if (number < 0) {
-            // Negative Number --> always true
-            return true;
-        } else if (number < 10) {
-            // Only 1 digit
-            if (4 <= number && number <= 7) {
-                return true;
-            }
-            return false;
-        } else if (number < 100) {
-            // 2 digits
-            var lastDigit = number % 10, firstDigit = number / 10;
-            if (lastDigit === 0) {
-                return eifelerRegelAppliesToNumber(firstDigit);
-            }
-            return eifelerRegelAppliesToNumber(lastDigit);
-        } else if (number < 10000) {
-            // 3 or 4 digits --> recursively check first digit
-            while (number >= 10) {
-                number = number / 10;
-            }
-            return eifelerRegelAppliesToNumber(number);
-        } else {
-            // Anything larger than 4 digits: recursively check first n-3 digits
-            number = number / 1000;
-            return eifelerRegelAppliesToNumber(number);
-        }
-    }
-
-    return moment.defineLocale('lb', {
-        months: "Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),
-        monthsShort: "Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),
-        weekdays: "Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),
-        weekdaysShort: "So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),
-        weekdaysMin: "So_Mé_Dë_Më_Do_Fr_Sa".split("_"),
-        longDateFormat: {
-            LT: "H:mm [Auer]",
-            L: "DD.MM.YYYY",
-            LL: "D. MMMM YYYY",
-            LLL: "D. MMMM YYYY LT",
-            LLLL: "dddd, D. MMMM YYYY LT"
-        },
-        calendar: {
-            sameDay: "[Haut um] LT",
-            sameElse: "L",
-            nextDay: '[Muer um] LT',
-            nextWeek: 'dddd [um] LT',
-            lastDay: '[Gëschter um] LT',
-            lastWeek: function () {
-                // Different date string for "Dënschdeg" (Tuesday) and "Donneschdeg" (Thursday) due to phonological rule
-                switch (this.day()) {
-                    case 2:
-                    case 4:
-                        return '[Leschten] dddd [um] LT';
-                    default:
-                        return '[Leschte] dddd [um] LT';
-                }
-            }
-        },
-        relativeTime : {
-            future : processFutureTime,
-            past : processPastTime,
-            s : "e puer Sekonnen",
-            m : processRelativeTime,
-            mm : "%d Minutten",
-            h : processRelativeTime,
-            hh : "%d Stonnen",
-            d : processRelativeTime,
-            dd : "%d Deeg",
-            M : processRelativeTime,
-            MM : "%d Méint",
-            y : processRelativeTime,
-            yy : "%d Joer"
-        },
-        ordinal: '%d.',
-        week: {
-            dow: 1, // Monday is the first day of the week.
-            doy: 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/lt.js b/resources/lib/moment/lang/lt.js
deleted file mode 100644 (file)
index 7d7b93f..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-// moment.js locale configuration
-// locale : Lithuanian (lt)
-// author : Mindaugas Mozūras : https://github.com/mmozuras
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var units = {
-        "m" : "minutė_minutės_minutę",
-        "mm": "minutės_minučių_minutes",
-        "h" : "valanda_valandos_valandą",
-        "hh": "valandos_valandų_valandas",
-        "d" : "diena_dienos_dieną",
-        "dd": "dienos_dienų_dienas",
-        "M" : "mėnuo_mėnesio_mėnesį",
-        "MM": "mėnesiai_mėnesių_mėnesius",
-        "y" : "metai_metų_metus",
-        "yy": "metai_metų_metus"
-    },
-    weekDays = "sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_");
-
-    function translateSeconds(number, withoutSuffix, key, isFuture) {
-        if (withoutSuffix) {
-            return "kelios sekundės";
-        } else {
-            return isFuture ? "kelių sekundžių" : "kelias sekundes";
-        }
-    }
-
-    function translateSingular(number, withoutSuffix, key, isFuture) {
-        return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
-    }
-
-    function special(number) {
-        return number % 10 === 0 || (number > 10 && number < 20);
-    }
-
-    function forms(key) {
-        return units[key].split("_");
-    }
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var result = number + " ";
-        if (number === 1) {
-            return result + translateSingular(number, withoutSuffix, key[0], isFuture);
-        } else if (withoutSuffix) {
-            return result + (special(number) ? forms(key)[1] : forms(key)[0]);
-        } else {
-            if (isFuture) {
-                return result + forms(key)[1];
-            } else {
-                return result + (special(number) ? forms(key)[1] : forms(key)[2]);
-            }
-        }
-    }
-
-    function relativeWeekDay(moment, format) {
-        var nominative = format.indexOf('dddd HH:mm') === -1,
-            weekDay = weekDays[moment.day()];
-
-        return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + "į";
-    }
-
-    return moment.defineLocale("lt", {
-        months : "sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),
-        monthsShort : "sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),
-        weekdays : relativeWeekDay,
-        weekdaysShort : "Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),
-        weekdaysMin : "S_P_A_T_K_Pn_Š".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "YYYY-MM-DD",
-            LL : "YYYY [m.] MMMM D [d.]",
-            LLL : "YYYY [m.] MMMM D [d.], LT [val.]",
-            LLLL : "YYYY [m.] MMMM D [d.], dddd, LT [val.]",
-            l : "YYYY-MM-DD",
-            ll : "YYYY [m.] MMMM D [d.]",
-            lll : "YYYY [m.] MMMM D [d.], LT [val.]",
-            llll : "YYYY [m.] MMMM D [d.], ddd, LT [val.]"
-        },
-        calendar : {
-            sameDay : "[Šiandien] LT",
-            nextDay : "[Rytoj] LT",
-            nextWeek : "dddd LT",
-            lastDay : "[Vakar] LT",
-            lastWeek : "[Praėjusį] dddd LT",
-            sameElse : "L"
-        },
-        relativeTime : {
-            future : "po %s",
-            past : "prieš %s",
-            s : translateSeconds,
-            m : translateSingular,
-            mm : translate,
-            h : translateSingular,
-            hh : translate,
-            d : translateSingular,
-            dd : translate,
-            M : translateSingular,
-            MM : translate,
-            y : translateSingular,
-            yy : translate
-        },
-        ordinal : function (number) {
-            return number + '-oji';
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/lv.js b/resources/lib/moment/lang/lv.js
deleted file mode 100644 (file)
index 0df007d..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-// moment.js locale configuration
-// locale : latvian (lv)
-// author : Kristaps Karlsons : https://github.com/skakri
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var units = {
-        'mm': 'minūti_minūtes_minūte_minūtes',
-        'hh': 'stundu_stundas_stunda_stundas',
-        'dd': 'dienu_dienas_diena_dienas',
-        'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
-        'yy': 'gadu_gadus_gads_gadi'
-    };
-
-    function format(word, number, withoutSuffix) {
-        var forms = word.split('_');
-        if (withoutSuffix) {
-            return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
-        } else {
-            return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
-        }
-    }
-
-    function relativeTimeWithPlural(number, withoutSuffix, key) {
-        return number + ' ' + format(units[key], number, withoutSuffix);
-    }
-
-    return moment.defineLocale('lv', {
-        months : "janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),
-        monthsShort : "jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),
-        weekdays : "svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),
-        weekdaysShort : "Sv_P_O_T_C_Pk_S".split("_"),
-        weekdaysMin : "Sv_P_O_T_C_Pk_S".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "YYYY. [gada] D. MMMM",
-            LLL : "YYYY. [gada] D. MMMM, LT",
-            LLLL : "YYYY. [gada] D. MMMM, dddd, LT"
-        },
-        calendar : {
-            sameDay : '[Šodien pulksten] LT',
-            nextDay : '[Rīt pulksten] LT',
-            nextWeek : 'dddd [pulksten] LT',
-            lastDay : '[Vakar pulksten] LT',
-            lastWeek : '[Pagājušā] dddd [pulksten] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s vēlāk",
-            past : "%s agrāk",
-            s : "dažas sekundes",
-            m : "minūti",
-            mm : relativeTimeWithPlural,
-            h : "stundu",
-            hh : relativeTimeWithPlural,
-            d : "dienu",
-            dd : relativeTimeWithPlural,
-            M : "mēnesi",
-            MM : relativeTimeWithPlural,
-            y : "gadu",
-            yy : relativeTimeWithPlural
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/mk.js b/resources/lib/moment/lang/mk.js
deleted file mode 100644 (file)
index 2d8a739..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-// moment.js locale configuration
-// locale : macedonian (mk)
-// author : Borislav Mickov : https://github.com/B0k0
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('mk', {
-        months : "јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),
-        monthsShort : "јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),
-        weekdays : "недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),
-        weekdaysShort : "нед_пон_вто_сре_чет_пет_саб".split("_"),
-        weekdaysMin : "нe_пo_вт_ср_че_пе_сa".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "D.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Денес во] LT',
-            nextDay : '[Утре во] LT',
-            nextWeek : 'dddd [во] LT',
-            lastDay : '[Вчера во] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[Во изминатата] dddd [во] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[Во изминатиот] dddd [во] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "после %s",
-            past : "пред %s",
-            s : "неколку секунди",
-            m : "минута",
-            mm : "%d минути",
-            h : "час",
-            hh : "%d часа",
-            d : "ден",
-            dd : "%d дена",
-            M : "месец",
-            MM : "%d месеци",
-            y : "година",
-            yy : "%d години"
-        },
-        ordinal : function (number) {
-            var lastDigit = number % 10,
-                last2Digits = number % 100;
-            if (number === 0) {
-                return number + '-ев';
-            } else if (last2Digits === 0) {
-                return number + '-ен';
-            } else if (last2Digits > 10 && last2Digits < 20) {
-                return number + '-ти';
-            } else if (lastDigit === 1) {
-                return number + '-ви';
-            } else if (lastDigit === 2) {
-                return number + '-ри';
-            } else if (lastDigit === 7 || lastDigit === 8) {
-                return number + '-ми';
-            } else {
-                return number + '-ти';
-            }
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ml.js b/resources/lib/moment/lang/ml.js
deleted file mode 100644 (file)
index d3cee1d..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-// moment.js locale configuration
-// locale : malayalam (ml)
-// author : Floyd Pink : https://github.com/floydpink
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('ml', {
-        months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split("_"),
-        monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split("_"),
-        weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split("_"),
-        weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split("_"),
-        weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split("_"),
-        longDateFormat : {
-            LT : "A h:mm -നു",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        calendar : {
-            sameDay : '[ഇന്ന്] LT',
-            nextDay : '[നാളെ] LT',
-            nextWeek : 'dddd, LT',
-            lastDay : '[ഇന്നലെ] LT',
-            lastWeek : '[കഴിഞ്ഞ] dddd, LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s കഴിഞ്ഞ്",
-            past : "%s മുൻപ്",
-            s : "അൽപ നിമിഷങ്ങൾ",
-            m : "ഒരു മിനിറ്റ്",
-            mm : "%d മിനിറ്റ്",
-            h : "ഒരു മണിക്കൂർ",
-            hh : "%d മണിക്കൂർ",
-            d : "ഒരു ദിവസം",
-            dd : "%d ദിവസം",
-            M : "ഒരു മാസം",
-            MM : "%d മാസം",
-            y : "ഒരു വർഷം",
-            yy : "%d വർഷം"
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "രാത്രി";
-            } else if (hour < 12) {
-                return "രാവിലെ";
-            } else if (hour < 17) {
-                return "ഉച്ച കഴിഞ്ഞ്";
-            } else if (hour < 20) {
-                return "വൈകുന്നേരം";
-            } else {
-                return "രാത്രി";
-            }
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/mr.js b/resources/lib/moment/lang/mr.js
deleted file mode 100644 (file)
index 8cbfe7c..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-// moment.js locale configuration
-// locale : Marathi (mr)
-// author : Harshad Kale : https://github.com/kalehv
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '१',
-        '2': '२',
-        '3': '३',
-        '4': '४',
-        '5': '५',
-        '6': '६',
-        '7': '७',
-        '8': '८',
-        '9': '९',
-        '0': '०'
-    },
-    numberMap = {
-        '१': '1',
-        '२': '2',
-        '३': '3',
-        '४': '4',
-        '५': '5',
-        '६': '6',
-        '७': '7',
-        '८': '8',
-        '९': '9',
-        '०': '0'
-    };
-
-    return moment.defineLocale('mr', {
-        months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split("_"),
-        monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split("_"),
-        weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split("_"),
-        weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split("_"),
-        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split("_"),
-        longDateFormat : {
-            LT : "A h:mm वाजता",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        calendar : {
-            sameDay : '[आज] LT',
-            nextDay : '[उद्या] LT',
-            nextWeek : 'dddd, LT',
-            lastDay : '[काल] LT',
-            lastWeek: '[मागील] dddd, LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s नंतर",
-            past : "%s पूर्वी",
-            s : "सेकंद",
-            m: "एक मिनिट",
-            mm: "%d मिनिटे",
-            h : "एक तास",
-            hh : "%d तास",
-            d : "एक दिवस",
-            dd : "%d दिवस",
-            M : "एक महिना",
-            MM : "%d महिने",
-            y : "एक वर्ष",
-            yy : "%d वर्षे"
-        },
-        preparse: function (string) {
-            return string.replace(/[१२३४५६७८९०]/g, function (match) {
-                return numberMap[match];
-            });
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            });
-        },
-        meridiem: function (hour, minute, isLower)
-        {
-            if (hour < 4) {
-                return "रात्री";
-            } else if (hour < 10) {
-                return "सकाळी";
-            } else if (hour < 17) {
-                return "दुपारी";
-            } else if (hour < 20) {
-                return "सायंकाळी";
-            } else {
-                return "रात्री";
-            }
-        },
-        week : {
-            dow : 0, // Sunday is the first day of the week.
-            doy : 6  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ms-my.js b/resources/lib/moment/lang/ms-my.js
deleted file mode 100644 (file)
index eee412f..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-// moment.js locale configuration
-// locale : Bahasa Malaysia (ms-MY)
-// author : Weldan Jamili : https://github.com/weldan
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('ms-my', {
-        months : "Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),
-        monthsShort : "Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),
-        weekdays : "Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),
-        weekdaysShort : "Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),
-        weekdaysMin : "Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),
-        longDateFormat : {
-            LT : "HH.mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY [pukul] LT",
-            LLLL : "dddd, D MMMM YYYY [pukul] LT"
-        },
-        meridiem : function (hours, minutes, isLower) {
-            if (hours < 11) {
-                return 'pagi';
-            } else if (hours < 15) {
-                return 'tengahari';
-            } else if (hours < 19) {
-                return 'petang';
-            } else {
-                return 'malam';
-            }
-        },
-        calendar : {
-            sameDay : '[Hari ini pukul] LT',
-            nextDay : '[Esok pukul] LT',
-            nextWeek : 'dddd [pukul] LT',
-            lastDay : '[Kelmarin pukul] LT',
-            lastWeek : 'dddd [lepas pukul] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "dalam %s",
-            past : "%s yang lepas",
-            s : "beberapa saat",
-            m : "seminit",
-            mm : "%d minit",
-            h : "sejam",
-            hh : "%d jam",
-            d : "sehari",
-            dd : "%d hari",
-            M : "sebulan",
-            MM : "%d bulan",
-            y : "setahun",
-            yy : "%d tahun"
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/my.js b/resources/lib/moment/lang/my.js
deleted file mode 100644 (file)
index 442d569..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-// moment.js locale configuration
-// locale : Burmese (my)
-// author : Squar team, mysquar.com
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '၁',
-        '2': '၂',
-        '3': '၃',
-        '4': '၄',
-        '5': '၅',
-        '6': '၆',
-        '7': '၇',
-        '8': '၈',
-        '9': '၉',
-        '0': '၀'
-    }, numberMap = {
-        '၁': '1',
-        '၂': '2',
-        '၃': '3',
-        '၄': '4',
-        '၅': '5',
-        '၆': '6',
-        '၇': '7',
-        '၈': '8',
-        '၉': '9',
-        '၀': '0'
-    };
-    return moment.defineLocale('my', {
-        months: "ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ".split("_"),
-        monthsShort: "ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),
-        weekdays: "တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ".split("_"),
-        weekdaysShort: "နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),
-        weekdaysMin: "နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),
-        longDateFormat: {
-            LT: "HH:mm",
-            L: "DD/MM/YYYY",
-            LL: "D MMMM YYYY",
-            LLL: "D MMMM YYYY LT",
-            LLLL: "dddd D MMMM YYYY LT"
-        },
-        calendar: {
-            sameDay: '[ယနေ.] LT [မှာ]',
-            nextDay: '[မနက်ဖြန်] LT [မှာ]',
-            nextWeek: 'dddd LT [မှာ]',
-            lastDay: '[မနေ.က] LT [မှာ]',
-            lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
-            sameElse: 'L'
-        },
-        relativeTime: {
-            future: "လာမည့် %s မှာ",
-            past: "လွန်ခဲ့သော %s က",
-            s: "စက္ကန်.အနည်းငယ်",
-            m: "တစ်မိနစ်",
-            mm: "%d မိနစ်",
-            h: "တစ်နာရီ",
-            hh: "%d နာရီ",
-            d: "တစ်ရက်",
-            dd: "%d ရက်",
-            M: "တစ်လ",
-            MM: "%d လ",
-            y: "တစ်နှစ်",
-            yy: "%d နှစ်"
-        },
-        preparse: function (string) {
-            return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
-                return numberMap[match];
-            });
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            });
-        },
-        week: {
-            dow: 1, // Monday is the first day of the week.
-            doy: 4 // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/nb.js b/resources/lib/moment/lang/nb.js
deleted file mode 100644 (file)
index 5e4a511..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-// moment.js locale configuration
-// locale : norwegian bokmål (nb)
-// authors : Espen Hovlandsdal : https://github.com/rexxars
-//           Sigurd Gartmann : https://github.com/sigurdga
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('nb', {
-        months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),
-        monthsShort : "jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),
-        weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
-        weekdaysShort : "sø._ma._ti._on._to._fr._lø.".split("_"),
-        weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
-        longDateFormat : {
-            LT : "H.mm",
-            L : "DD.MM.YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY [kl.] LT",
-            LLLL : "dddd D. MMMM YYYY [kl.] LT"
-        },
-        calendar : {
-            sameDay: '[i dag kl.] LT',
-            nextDay: '[i morgen kl.] LT',
-            nextWeek: 'dddd [kl.] LT',
-            lastDay: '[i går kl.] LT',
-            lastWeek: '[forrige] dddd [kl.] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "om %s",
-            past : "for %s siden",
-            s : "noen sekunder",
-            m : "ett minutt",
-            mm : "%d minutter",
-            h : "en time",
-            hh : "%d timer",
-            d : "en dag",
-            dd : "%d dager",
-            M : "en måned",
-            MM : "%d måneder",
-            y : "ett år",
-            yy : "%d år"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ne.js b/resources/lib/moment/lang/ne.js
deleted file mode 100644 (file)
index 836fb4d..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-// moment.js locale configuration
-// locale : nepali/nepalese
-// author : suvash : https://github.com/suvash
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var symbolMap = {
-        '1': '१',
-        '2': '२',
-        '3': '३',
-        '4': '४',
-        '5': '५',
-        '6': '६',
-        '7': '७',
-        '8': '८',
-        '9': '९',
-        '0': '०'
-    },
-    numberMap = {
-        '१': '1',
-        '२': '2',
-        '३': '3',
-        '४': '4',
-        '५': '5',
-        '६': '6',
-        '७': '7',
-        '८': '8',
-        '९': '9',
-        '०': '0'
-    };
-
-    return moment.defineLocale('ne', {
-        months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split("_"),
-        monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split("_"),
-        weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split("_"),
-        weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split("_"),
-        weekdaysMin : 'आइ._सो._मङ्_बु._बि._शु._श.'.split("_"),
-        longDateFormat : {
-            LT : "Aको h:mm बजे",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        preparse: function (string) {
-            return string.replace(/[१२३४५६७८९०]/g, function (match) {
-                return numberMap[match];
-            });
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            });
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 3) {
-                return "राती";
-            } else if (hour < 10) {
-                return "बिहान";
-            } else if (hour < 15) {
-                return "दिउँसो";
-            } else if (hour < 18) {
-                return "बेलुका";
-            } else if (hour < 20) {
-                return "साँझ";
-            } else {
-                return "राती";
-            }
-        },
-        calendar : {
-            sameDay : '[आज] LT',
-            nextDay : '[भोली] LT',
-            nextWeek : '[आउँदो] dddd[,] LT',
-            lastDay : '[हिजो] LT',
-            lastWeek : '[गएको] dddd[,] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%sमा",
-            past : "%s अगाडी",
-            s : "केही समय",
-            m : "एक मिनेट",
-            mm : "%d मिनेट",
-            h : "एक घण्टा",
-            hh : "%d घण्टा",
-            d : "एक दिन",
-            dd : "%d दिन",
-            M : "एक महिना",
-            MM : "%d महिना",
-            y : "एक बर्ष",
-            yy : "%d बर्ष"
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/nl.js b/resources/lib/moment/lang/nl.js
deleted file mode 100644 (file)
index 1577673..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-// moment.js locale configuration
-// locale : dutch (nl)
-// author : Joris Röling : https://github.com/jjupiter
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var monthsShortWithDots = "jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),
-        monthsShortWithoutDots = "jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");
-
-    return moment.defineLocale('nl', {
-        months : "januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),
-        monthsShort : function (m, format) {
-            if (/-MMM-/.test(format)) {
-                return monthsShortWithoutDots[m.month()];
-            } else {
-                return monthsShortWithDots[m.month()];
-            }
-        },
-        weekdays : "zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),
-        weekdaysShort : "zo._ma._di._wo._do._vr._za.".split("_"),
-        weekdaysMin : "Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD-MM-YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: '[vandaag om] LT',
-            nextDay: '[morgen om] LT',
-            nextWeek: 'dddd [om] LT',
-            lastDay: '[gisteren om] LT',
-            lastWeek: '[afgelopen] dddd [om] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "over %s",
-            past : "%s geleden",
-            s : "een paar seconden",
-            m : "één minuut",
-            mm : "%d minuten",
-            h : "één uur",
-            hh : "%d uur",
-            d : "één dag",
-            dd : "%d dagen",
-            M : "één maand",
-            MM : "%d maanden",
-            y : "één jaar",
-            yy : "%d jaar"
-        },
-        ordinal : function (number) {
-            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/nn.js b/resources/lib/moment/lang/nn.js
deleted file mode 100644 (file)
index e479b45..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js locale configuration
-// locale : norwegian nynorsk (nn)
-// author : https://github.com/mechuwind
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('nn', {
-        months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),
-        monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),
-        weekdays : "sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),
-        weekdaysShort : "sun_mån_tys_ons_tor_fre_lau".split("_"),
-        weekdaysMin : "su_må_ty_on_to_fr_lø".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: '[I dag klokka] LT',
-            nextDay: '[I morgon klokka] LT',
-            nextWeek: 'dddd [klokka] LT',
-            lastDay: '[I går klokka] LT',
-            lastWeek: '[Føregåande] dddd [klokka] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "om %s",
-            past : "for %s sidan",
-            s : "nokre sekund",
-            m : "eit minutt",
-            mm : "%d minutt",
-            h : "ein time",
-            hh : "%d timar",
-            d : "ein dag",
-            dd : "%d dagar",
-            M : "ein månad",
-            MM : "%d månader",
-            y : "eit år",
-            yy : "%d år"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/pl.js b/resources/lib/moment/lang/pl.js
deleted file mode 100644 (file)
index 75e978b..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-// moment.js locale configuration
-// locale : polish (pl)
-// author : Rafal Hirsz : https://github.com/evoL
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var monthsNominative = "styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),
-        monthsSubjective = "stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");
-
-    function plural(n) {
-        return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
-    }
-
-    function translate(number, withoutSuffix, key) {
-        var result = number + " ";
-        switch (key) {
-        case 'm':
-            return withoutSuffix ? 'minuta' : 'minutę';
-        case 'mm':
-            return result + (plural(number) ? 'minuty' : 'minut');
-        case 'h':
-            return withoutSuffix  ? 'godzina'  : 'godzinę';
-        case 'hh':
-            return result + (plural(number) ? 'godziny' : 'godzin');
-        case 'MM':
-            return result + (plural(number) ? 'miesiące' : 'miesięcy');
-        case 'yy':
-            return result + (plural(number) ? 'lata' : 'lat');
-        }
-    }
-
-    return moment.defineLocale('pl', {
-        months : function (momentToFormat, format) {
-            if (/D MMMM/.test(format)) {
-                return monthsSubjective[momentToFormat.month()];
-            } else {
-                return monthsNominative[momentToFormat.month()];
-            }
-        },
-        monthsShort : "sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),
-        weekdays : "niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),
-        weekdaysShort : "nie_pon_wt_śr_czw_pt_sb".split("_"),
-        weekdaysMin : "N_Pn_Wt_Śr_Cz_Pt_So".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: '[Dziś o] LT',
-            nextDay: '[Jutro o] LT',
-            nextWeek: '[W] dddd [o] LT',
-            lastDay: '[Wczoraj o] LT',
-            lastWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[W zeszłą niedzielę o] LT';
-                case 3:
-                    return '[W zeszłą środę o] LT';
-                case 6:
-                    return '[W zeszłą sobotę o] LT';
-                default:
-                    return '[W zeszły] dddd [o] LT';
-                }
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "za %s",
-            past : "%s temu",
-            s : "kilka sekund",
-            m : translate,
-            mm : translate,
-            h : translate,
-            hh : translate,
-            d : "1 dzień",
-            dd : '%d dni',
-            M : "miesiąc",
-            MM : translate,
-            y : "rok",
-            yy : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/pt-br.js b/resources/lib/moment/lang/pt-br.js
deleted file mode 100644 (file)
index d577018..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js locale configuration
-// locale : brazilian portuguese (pt-br)
-// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('pt-br', {
-        months : "janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),
-        monthsShort : "jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),
-        weekdays : "domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),
-        weekdaysShort : "dom_seg_ter_qua_qui_sex_sáb".split("_"),
-        weekdaysMin : "dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D [de] MMMM [de] YYYY",
-            LLL : "D [de] MMMM [de] YYYY [às] LT",
-            LLLL : "dddd, D [de] MMMM [de] YYYY [às] LT"
-        },
-        calendar : {
-            sameDay: '[Hoje às] LT',
-            nextDay: '[Amanhã às] LT',
-            nextWeek: 'dddd [às] LT',
-            lastDay: '[Ontem às] LT',
-            lastWeek: function () {
-                return (this.day() === 0 || this.day() === 6) ?
-                    '[Último] dddd [às] LT' : // Saturday + Sunday
-                    '[Última] dddd [às] LT'; // Monday - Friday
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "em %s",
-            past : "%s atrás",
-            s : "segundos",
-            m : "um minuto",
-            mm : "%d minutos",
-            h : "uma hora",
-            hh : "%d horas",
-            d : "um dia",
-            dd : "%d dias",
-            M : "um mês",
-            MM : "%d meses",
-            y : "um ano",
-            yy : "%d anos"
-        },
-        ordinal : '%dº'
-    });
-}));
diff --git a/resources/lib/moment/lang/pt.js b/resources/lib/moment/lang/pt.js
deleted file mode 100644 (file)
index 8086414..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-// moment.js locale configuration
-// locale : portuguese (pt)
-// author : Jefferson : https://github.com/jalex79
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('pt', {
-        months : "janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),
-        monthsShort : "jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),
-        weekdays : "domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),
-        weekdaysShort : "dom_seg_ter_qua_qui_sex_sáb".split("_"),
-        weekdaysMin : "dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D [de] MMMM [de] YYYY",
-            LLL : "D [de] MMMM [de] YYYY LT",
-            LLLL : "dddd, D [de] MMMM [de] YYYY LT"
-        },
-        calendar : {
-            sameDay: '[Hoje às] LT',
-            nextDay: '[Amanhã às] LT',
-            nextWeek: 'dddd [às] LT',
-            lastDay: '[Ontem às] LT',
-            lastWeek: function () {
-                return (this.day() === 0 || this.day() === 6) ?
-                    '[Último] dddd [às] LT' : // Saturday + Sunday
-                    '[Última] dddd [às] LT'; // Monday - Friday
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "em %s",
-            past : "há %s",
-            s : "segundos",
-            m : "um minuto",
-            mm : "%d minutos",
-            h : "uma hora",
-            hh : "%d horas",
-            d : "um dia",
-            dd : "%d dias",
-            M : "um mês",
-            MM : "%d meses",
-            y : "um ano",
-            yy : "%d anos"
-        },
-        ordinal : '%dº',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ro.js b/resources/lib/moment/lang/ro.js
deleted file mode 100644 (file)
index 21a3293..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-// moment.js locale configuration
-// locale : romanian (ro)
-// author : Vlad Gurdiga : https://github.com/gurdiga
-// author : Valentin Agachi : https://github.com/avaly
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function relativeTimeWithPlural(number, withoutSuffix, key) {
-        var format = {
-                'mm': 'minute',
-                'hh': 'ore',
-                'dd': 'zile',
-                'MM': 'luni',
-                'yy': 'ani'
-            },
-            separator = ' ';
-        if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
-            separator = ' de ';
-        }
-
-        return number + separator + format[key];
-    }
-
-    return moment.defineLocale('ro', {
-        months : "ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),
-        monthsShort : "ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),
-        weekdays : "duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),
-        weekdaysShort : "Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),
-        weekdaysMin : "Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY H:mm",
-            LLLL : "dddd, D MMMM YYYY H:mm"
-        },
-        calendar : {
-            sameDay: "[azi la] LT",
-            nextDay: '[mâine la] LT',
-            nextWeek: 'dddd [la] LT',
-            lastDay: '[ieri la] LT',
-            lastWeek: '[fosta] dddd [la] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "peste %s",
-            past : "%s în urmă",
-            s : "câteva secunde",
-            m : "un minut",
-            mm : relativeTimeWithPlural,
-            h : "o oră",
-            hh : relativeTimeWithPlural,
-            d : "o zi",
-            dd : relativeTimeWithPlural,
-            M : "o lună",
-            MM : relativeTimeWithPlural,
-            y : "un an",
-            yy : relativeTimeWithPlural
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ru.js b/resources/lib/moment/lang/ru.js
deleted file mode 100644 (file)
index 3ae8d23..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-// moment.js locale configuration
-// locale : russian (ru)
-// author : Viktorminator : https://github.com/Viktorminator
-// Author : Menelion Elensúle : https://github.com/Oire
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function plural(word, num) {
-        var forms = word.split('_');
-        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
-    }
-
-    function relativeTimeWithPlural(number, withoutSuffix, key) {
-        var format = {
-            'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
-            'hh': 'час_часа_часов',
-            'dd': 'день_дня_дней',
-            'MM': 'месяц_месяца_месяцев',
-            'yy': 'год_года_лет'
-        };
-        if (key === 'm') {
-            return withoutSuffix ? 'минута' : 'минуту';
-        }
-        else {
-            return number + ' ' + plural(format[key], +number);
-        }
-    }
-
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
-            'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
-        },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function monthsShortCaseReplace(m, format) {
-        var monthsShort = {
-            'nominative': 'янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
-            'accusative': 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_')
-        },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return monthsShort[nounCase][m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
-            'accusative': 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_')
-        },
-
-        nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return weekdays[nounCase][m.day()];
-    }
-
-    return moment.defineLocale('ru', {
-        months : monthsCaseReplace,
-        monthsShort : monthsShortCaseReplace,
-        weekdays : weekdaysCaseReplace,
-        weekdaysShort : "вс_пн_вт_ср_чт_пт_сб".split("_"),
-        weekdaysMin : "вс_пн_вт_ср_чт_пт_сб".split("_"),
-        monthsParse : [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i],
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY г.",
-            LLL : "D MMMM YYYY г., LT",
-            LLLL : "dddd, D MMMM YYYY г., LT"
-        },
-        calendar : {
-            sameDay: '[Сегодня в] LT',
-            nextDay: '[Завтра в] LT',
-            lastDay: '[Вчера в] LT',
-            nextWeek: function () {
-                return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
-            },
-            lastWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[В прошлое] dddd [в] LT';
-                case 1:
-                case 2:
-                case 4:
-                    return '[В прошлый] dddd [в] LT';
-                case 3:
-                case 5:
-                case 6:
-                    return '[В прошлую] dddd [в] LT';
-                }
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "через %s",
-            past : "%s назад",
-            s : "несколько секунд",
-            m : relativeTimeWithPlural,
-            mm : relativeTimeWithPlural,
-            h : "час",
-            hh : relativeTimeWithPlural,
-            d : "день",
-            dd : relativeTimeWithPlural,
-            M : "месяц",
-            MM : relativeTimeWithPlural,
-            y : "год",
-            yy : relativeTimeWithPlural
-        },
-
-        meridiemParse: /ночи|утра|дня|вечера/i,
-        isPM : function (input) {
-            return /^(дня|вечера)$/.test(input);
-        },
-
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "ночи";
-            } else if (hour < 12) {
-                return "утра";
-            } else if (hour < 17) {
-                return "дня";
-            } else {
-                return "вечера";
-            }
-        },
-
-        ordinal: function (number, period) {
-            switch (period) {
-            case 'M':
-            case 'd':
-            case 'DDD':
-                return number + '-й';
-            case 'D':
-                return number + '-го';
-            case 'w':
-            case 'W':
-                return number + '-я';
-            default:
-                return number;
-            }
-        },
-
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/sk.js b/resources/lib/moment/lang/sk.js
deleted file mode 100644 (file)
index d03fff8..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-// moment.js locale configuration
-// locale : slovak (sk)
-// author : Martin Minka : https://github.com/k2s
-// based on work of petrbela : https://github.com/petrbela
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var months = "január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),
-        monthsShort = "jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");
-
-    function plural(n) {
-        return (n > 1) && (n < 5);
-    }
-
-    function translate(number, withoutSuffix, key, isFuture) {
-        var result = number + " ";
-        switch (key) {
-        case 's':  // a few seconds / in a few seconds / a few seconds ago
-            return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
-        case 'm':  // a minute / in a minute / a minute ago
-            return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
-        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'minúty' : 'minút');
-            } else {
-                return result + 'minútami';
-            }
-            break;
-        case 'h':  // an hour / in an hour / an hour ago
-            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
-        case 'hh': // 9 hours / in 9 hours / 9 hours ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'hodiny' : 'hodín');
-            } else {
-                return result + 'hodinami';
-            }
-            break;
-        case 'd':  // a day / in a day / a day ago
-            return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
-        case 'dd': // 9 days / in 9 days / 9 days ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'dni' : 'dní');
-            } else {
-                return result + 'dňami';
-            }
-            break;
-        case 'M':  // a month / in a month / a month ago
-            return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
-        case 'MM': // 9 months / in 9 months / 9 months ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'mesiace' : 'mesiacov');
-            } else {
-                return result + 'mesiacmi';
-            }
-            break;
-        case 'y':  // a year / in a year / a year ago
-            return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
-        case 'yy': // 9 years / in 9 years / 9 years ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'roky' : 'rokov');
-            } else {
-                return result + 'rokmi';
-            }
-            break;
-        }
-    }
-
-    return moment.defineLocale('sk', {
-        months : months,
-        monthsShort : monthsShort,
-        monthsParse : (function (months, monthsShort) {
-            var i, _monthsParse = [];
-            for (i = 0; i < 12; i++) {
-                // use custom parser to solve problem with July (červenec)
-                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
-            }
-            return _monthsParse;
-        }(months, monthsShort)),
-        weekdays : "nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),
-        weekdaysShort : "ne_po_ut_st_št_pi_so".split("_"),
-        weekdaysMin : "ne_po_ut_st_št_pi_so".split("_"),
-        longDateFormat : {
-            LT: "H:mm",
-            L : "DD.MM.YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[dnes o] LT",
-            nextDay: '[zajtra o] LT',
-            nextWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[v nedeľu o] LT';
-                case 1:
-                case 2:
-                    return '[v] dddd [o] LT';
-                case 3:
-                    return '[v stredu o] LT';
-                case 4:
-                    return '[vo štvrtok o] LT';
-                case 5:
-                    return '[v piatok o] LT';
-                case 6:
-                    return '[v sobotu o] LT';
-                }
-            },
-            lastDay: '[včera o] LT',
-            lastWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[minulú nedeľu o] LT';
-                case 1:
-                case 2:
-                    return '[minulý] dddd [o] LT';
-                case 3:
-                    return '[minulú stredu o] LT';
-                case 4:
-                case 5:
-                    return '[minulý] dddd [o] LT';
-                case 6:
-                    return '[minulú sobotu o] LT';
-                }
-            },
-            sameElse: "L"
-        },
-        relativeTime : {
-            future : "za %s",
-            past : "pred %s",
-            s : translate,
-            m : translate,
-            mm : translate,
-            h : translate,
-            hh : translate,
-            d : translate,
-            dd : translate,
-            M : translate,
-            MM : translate,
-            y : translate,
-            yy : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/sl.js b/resources/lib/moment/lang/sl.js
deleted file mode 100644 (file)
index 6174ae6..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-// moment.js locale configuration
-// locale : slovenian (sl)
-// author : Robert Sedovšek : https://github.com/sedovsek
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function translate(number, withoutSuffix, key) {
-        var result = number + " ";
-        switch (key) {
-        case 'm':
-            return withoutSuffix ? 'ena minuta' : 'eno minuto';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2) {
-                result += 'minuti';
-            } else if (number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minut';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'ena ura' : 'eno uro';
-        case 'hh':
-            if (number === 1) {
-                result += 'ura';
-            } else if (number === 2) {
-                result += 'uri';
-            } else if (number === 3 || number === 4) {
-                result += 'ure';
-            } else {
-                result += 'ur';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dni';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mesec';
-            } else if (number === 2) {
-                result += 'meseca';
-            } else if (number === 3 || number === 4) {
-                result += 'mesece';
-            } else {
-                result += 'mesecev';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'leto';
-            } else if (number === 2) {
-                result += 'leti';
-            } else if (number === 3 || number === 4) {
-                result += 'leta';
-            } else {
-                result += 'let';
-            }
-            return result;
-        }
-    }
-
-    return moment.defineLocale('sl', {
-        months : "januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),
-        monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
-        weekdays : "nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),
-        weekdaysShort : "ned._pon._tor._sre._čet._pet._sob.".split("_"),
-        weekdaysMin : "ne_po_to_sr_če_pe_so".split("_"),
-        longDateFormat : {
-            LT : "H:mm",
-            L : "DD. MM. YYYY",
-            LL : "D. MMMM YYYY",
-            LLL : "D. MMMM YYYY LT",
-            LLLL : "dddd, D. MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay  : '[danes ob] LT',
-            nextDay  : '[jutri ob] LT',
-
-            nextWeek : function () {
-                switch (this.day()) {
-                case 0:
-                    return '[v] [nedeljo] [ob] LT';
-                case 3:
-                    return '[v] [sredo] [ob] LT';
-                case 6:
-                    return '[v] [soboto] [ob] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[v] dddd [ob] LT';
-                }
-            },
-            lastDay  : '[včeraj ob] LT',
-            lastWeek : function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[prejšnja] dddd [ob] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prejšnji] dddd [ob] LT';
-                }
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "čez %s",
-            past   : "%s nazaj",
-            s      : "nekaj sekund",
-            m      : translate,
-            mm     : translate,
-            h      : translate,
-            hh     : translate,
-            d      : "en dan",
-            dd     : translate,
-            M      : "en mesec",
-            MM     : translate,
-            y      : "eno leto",
-            yy     : translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/sq.js b/resources/lib/moment/lang/sq.js
deleted file mode 100644 (file)
index 4a3dfea..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-// moment.js locale configuration
-// locale : Albanian (sq)
-// author : Flakërim Ismani : https://github.com/flakerimi
-// author: Menelion Elensúle: https://github.com/Oire (tests)
-// author : Oerd Cukalla : https://github.com/oerd (fixes)
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('sq', {
-        months : "Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),
-        monthsShort : "Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),
-        weekdays : "E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),
-        weekdaysShort : "Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),
-        weekdaysMin : "D_H_Ma_Më_E_P_Sh".split("_"),
-        meridiem : function (hours, minutes, isLower) {
-            return hours < 12 ? 'PD' : 'MD';
-        },
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[Sot në] LT',
-            nextDay : '[Nesër në] LT',
-            nextWeek : 'dddd [në] LT',
-            lastDay : '[Dje në] LT',
-            lastWeek : 'dddd [e kaluar në] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "në %s",
-            past : "%s më parë",
-            s : "disa sekonda",
-            m : "një minutë",
-            mm : "%d minuta",
-            h : "një orë",
-            hh : "%d orë",
-            d : "një ditë",
-            dd : "%d ditë",
-            M : "një muaj",
-            MM : "%d muaj",
-            y : "një vit",
-            yy : "%d vite"
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/sr-cyrl.js b/resources/lib/moment/lang/sr-cyrl.js
deleted file mode 100644 (file)
index ef6e7ce..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-// moment.js locale configuration
-// locale : Serbian-cyrillic (sr-cyrl)
-// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var translator = {
-        words: { //Different grammatical cases
-            m: ['један минут', 'једне минуте'],
-            mm: ['минут', 'минуте', 'минута'],
-            h: ['један сат', 'једног сата'],
-            hh: ['сат', 'сата', 'сати'],
-            dd: ['дан', 'дана', 'дана'],
-            MM: ['месец', 'месеца', 'месеци'],
-            yy: ['година', 'године', 'година']
-        },
-        correctGrammaticalCase: function (number, wordKey) {
-            return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
-        },
-        translate: function (number, withoutSuffix, key) {
-            var wordKey = translator.words[key];
-            if (key.length === 1) {
-                return withoutSuffix ? wordKey[0] : wordKey[1];
-            } else {
-                return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
-            }
-        }
-    };
-
-    return moment.defineLocale('sr-cyrl', {
-        months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],
-        monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'],
-        weekdays: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],
-        weekdaysShort: ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'],
-        weekdaysMin: ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'],
-        longDateFormat: {
-            LT: "H:mm",
-            L: "DD. MM. YYYY",
-            LL: "D. MMMM YYYY",
-            LLL: "D. MMMM YYYY LT",
-            LLLL: "dddd, D. MMMM YYYY LT"
-        },
-        calendar: {
-            sameDay: '[данас у] LT',
-            nextDay: '[сутра у] LT',
-
-            nextWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[у] [недељу] [у] LT';
-                case 3:
-                    return '[у] [среду] [у] LT';
-                case 6:
-                    return '[у] [суботу] [у] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[у] dddd [у] LT';
-                }
-            },
-            lastDay  : '[јуче у] LT',
-            lastWeek : function () {
-                var lastWeekDays = [
-                    '[прошле] [недеље] [у] LT',
-                    '[прошлог] [понедељка] [у] LT',
-                    '[прошлог] [уторка] [у] LT',
-                    '[прошле] [среде] [у] LT',
-                    '[прошлог] [четвртка] [у] LT',
-                    '[прошлог] [петка] [у] LT',
-                    '[прошле] [суботе] [у] LT'
-                ];
-                return lastWeekDays[this.day()];
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "за %s",
-            past   : "пре %s",
-            s      : "неколико секунди",
-            m      : translator.translate,
-            mm     : translator.translate,
-            h      : translator.translate,
-            hh     : translator.translate,
-            d      : "дан",
-            dd     : translator.translate,
-            M      : "месец",
-            MM     : translator.translate,
-            y      : "годину",
-            yy     : translator.translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/sr.js b/resources/lib/moment/lang/sr.js
deleted file mode 100644 (file)
index 86e8e84..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-// moment.js locale configuration
-// locale : Serbian-latin (sr)
-// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var translator = {
-        words: { //Different grammatical cases
-            m: ['jedan minut', 'jedne minute'],
-            mm: ['minut', 'minute', 'minuta'],
-            h: ['jedan sat', 'jednog sata'],
-            hh: ['sat', 'sata', 'sati'],
-            dd: ['dan', 'dana', 'dana'],
-            MM: ['mesec', 'meseca', 'meseci'],
-            yy: ['godina', 'godine', 'godina']
-        },
-        correctGrammaticalCase: function (number, wordKey) {
-            return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
-        },
-        translate: function (number, withoutSuffix, key) {
-            var wordKey = translator.words[key];
-            if (key.length === 1) {
-                return withoutSuffix ? wordKey[0] : wordKey[1];
-            } else {
-                return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
-            }
-        }
-    };
-
-    return moment.defineLocale('sr', {
-        months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],
-        monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'],
-        weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],
-        weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'čet.', 'pet.', 'sub.'],
-        weekdaysMin: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'],
-        longDateFormat: {
-            LT: "H:mm",
-            L: "DD. MM. YYYY",
-            LL: "D. MMMM YYYY",
-            LLL: "D. MMMM YYYY LT",
-            LLLL: "dddd, D. MMMM YYYY LT"
-        },
-        calendar: {
-            sameDay: '[danas u] LT',
-            nextDay: '[sutra u] LT',
-
-            nextWeek: function () {
-                switch (this.day()) {
-                case 0:
-                    return '[u] [nedelju] [u] LT';
-                case 3:
-                    return '[u] [sredu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
-                }
-            },
-            lastDay  : '[juče u] LT',
-            lastWeek : function () {
-                var lastWeekDays = [
-                    '[prošle] [nedelje] [u] LT',
-                    '[prošlog] [ponedeljka] [u] LT',
-                    '[prošlog] [utorka] [u] LT',
-                    '[prošle] [srede] [u] LT',
-                    '[prošlog] [četvrtka] [u] LT',
-                    '[prošlog] [petka] [u] LT',
-                    '[prošle] [subote] [u] LT'
-                ];
-                return lastWeekDays[this.day()];
-            },
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "za %s",
-            past   : "pre %s",
-            s      : "nekoliko sekundi",
-            m      : translator.translate,
-            mm     : translator.translate,
-            h      : translator.translate,
-            hh     : translator.translate,
-            d      : "dan",
-            dd     : translator.translate,
-            M      : "mesec",
-            MM     : translator.translate,
-            y      : "godinu",
-            yy     : translator.translate
-        },
-        ordinal : '%d.',
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/sv.js b/resources/lib/moment/lang/sv.js
deleted file mode 100644 (file)
index 9e39a30..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// moment.js locale configuration
-// locale : swedish (sv)
-// author : Jens Alm : https://github.com/ulmus
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('sv', {
-        months : "januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),
-        monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
-        weekdays : "söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),
-        weekdaysShort : "sön_mån_tis_ons_tor_fre_lör".split("_"),
-        weekdaysMin : "sö_må_ti_on_to_fr_lö".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "YYYY-MM-DD",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: '[Idag] LT',
-            nextDay: '[Imorgon] LT',
-            lastDay: '[Igår] LT',
-            nextWeek: 'dddd LT',
-            lastWeek: '[Förra] dddd[en] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "om %s",
-            past : "för %s sedan",
-            s : "några sekunder",
-            m : "en minut",
-            mm : "%d minuter",
-            h : "en timme",
-            hh : "%d timmar",
-            d : "en dag",
-            dd : "%d dagar",
-            M : "en månad",
-            MM : "%d månader",
-            y : "ett år",
-            yy : "%d år"
-        },
-        ordinal : function (number) {
-            var b = number % 10,
-                output = (~~(number % 100 / 10) === 1) ? 'e' :
-                (b === 1) ? 'a' :
-                (b === 2) ? 'a' :
-                (b === 3) ? 'e' : 'e';
-            return number + output;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/ta.js b/resources/lib/moment/lang/ta.js
deleted file mode 100644 (file)
index 963d403..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-// moment.js locale configuration
-// locale : tamil (ta)
-// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    /*var symbolMap = {
-            '1': '௧',
-            '2': '௨',
-            '3': '௩',
-            '4': '௪',
-            '5': '௫',
-            '6': '௬',
-            '7': '௭',
-            '8': '௮',
-            '9': '௯',
-            '0': '௦'
-        },
-        numberMap = {
-            '௧': '1',
-            '௨': '2',
-            '௩': '3',
-            '௪': '4',
-            '௫': '5',
-            '௬': '6',
-            '௭': '7',
-            '௮': '8',
-            '௯': '9',
-            '௦': '0'
-        }; */
-
-    return moment.defineLocale('ta', {
-        months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split("_"),
-        monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split("_"),
-        weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split("_"),
-        weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split("_"),
-        weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY, LT",
-            LLLL : "dddd, D MMMM YYYY, LT"
-        },
-        calendar : {
-            sameDay : '[இன்று] LT',
-            nextDay : '[நாளை] LT',
-            nextWeek : 'dddd, LT',
-            lastDay : '[நேற்று] LT',
-            lastWeek : '[கடந்த வாரம்] dddd, LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s இல்",
-            past : "%s முன்",
-            s : "ஒரு சில விநாடிகள்",
-            m : "ஒரு நிமிடம்",
-            mm : "%d நிமிடங்கள்",
-            h : "ஒரு மணி நேரம்",
-            hh : "%d மணி நேரம்",
-            d : "ஒரு நாள்",
-            dd : "%d நாட்கள்",
-            M : "ஒரு மாதம்",
-            MM : "%d மாதங்கள்",
-            y : "ஒரு வருடம்",
-            yy : "%d ஆண்டுகள்"
-        },
-/*        preparse: function (string) {
-            return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
-                return numberMap[match];
-            });
-        },
-        postformat: function (string) {
-            return string.replace(/\d/g, function (match) {
-                return symbolMap[match];
-            });
-        },*/
-        ordinal : function (number) {
-            return number + 'வது';
-        },
-
-
-        // refer http://ta.wikipedia.org/s/1er1
-
-        meridiem : function (hour, minute, isLower) {
-            if (hour >= 6 && hour <= 10) {
-                return " காலை";
-            } else if (hour >= 10 && hour <= 14) {
-                return " நண்பகல்";
-            } else if (hour >= 14 && hour <= 18) {
-                return " எற்பாடு";
-            } else if (hour >= 18 && hour <= 20) {
-                return " மாலை";
-            } else if (hour >= 20 && hour <= 24) {
-                return " இரவு";
-            } else if (hour >= 0 && hour <= 6) {
-                return " வைகறை";
-            }
-        },
-        week : {
-            dow : 0, // Sunday is the first day of the week.
-            doy : 6  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/th.js b/resources/lib/moment/lang/th.js
deleted file mode 100644 (file)
index 30b41e6..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// moment.js locale configuration
-// locale : thai (th)
-// author : Kridsada Thanabulpong : https://github.com/sirn
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('th', {
-        months : "มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),
-        monthsShort : "มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),
-        weekdays : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),
-        weekdaysShort : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"), // yes, three characters difference
-        weekdaysMin : "อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),
-        longDateFormat : {
-            LT : "H นาฬิกา m นาที",
-            L : "YYYY/MM/DD",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY เวลา LT",
-            LLLL : "วันddddที่ D MMMM YYYY เวลา LT"
-        },
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 12) {
-                return "ก่อนเที่ยง";
-            } else {
-                return "หลังเที่ยง";
-            }
-        },
-        calendar : {
-            sameDay : '[วันนี้ เวลา] LT',
-            nextDay : '[พรุ่งนี้ เวลา] LT',
-            nextWeek : 'dddd[หน้า เวลา] LT',
-            lastDay : '[เมื่อวานนี้ เวลา] LT',
-            lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "อีก %s",
-            past : "%sที่แล้ว",
-            s : "ไม่กี่วินาที",
-            m : "1 นาที",
-            mm : "%d นาที",
-            h : "1 ชั่วโมง",
-            hh : "%d ชั่วโมง",
-            d : "1 วัน",
-            dd : "%d วัน",
-            M : "1 เดือน",
-            MM : "%d เดือน",
-            y : "1 ปี",
-            yy : "%d ปี"
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/tl-ph.js b/resources/lib/moment/lang/tl-ph.js
deleted file mode 100644 (file)
index dfacf18..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// moment.js locale configuration
-// locale : Tagalog/Filipino (tl-ph)
-// author : Dan Hagman
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('tl-ph', {
-        months : "Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),
-        monthsShort : "Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),
-        weekdays : "Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),
-        weekdaysShort : "Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),
-        weekdaysMin : "Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "MM/D/YYYY",
-            LL : "MMMM D, YYYY",
-            LLL : "MMMM D, YYYY LT",
-            LLLL : "dddd, MMMM DD, YYYY LT"
-        },
-        calendar : {
-            sameDay: "[Ngayon sa] LT",
-            nextDay: '[Bukas sa] LT',
-            nextWeek: 'dddd [sa] LT',
-            lastDay: '[Kahapon sa] LT',
-            lastWeek: 'dddd [huling linggo] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "sa loob ng %s",
-            past : "%s ang nakalipas",
-            s : "ilang segundo",
-            m : "isang minuto",
-            mm : "%d minuto",
-            h : "isang oras",
-            hh : "%d oras",
-            d : "isang araw",
-            dd : "%d araw",
-            M : "isang buwan",
-            MM : "%d buwan",
-            y : "isang taon",
-            yy : "%d taon"
-        },
-        ordinal : function (number) {
-            return number;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/tr.js b/resources/lib/moment/lang/tr.js
deleted file mode 100644 (file)
index e6c2ada..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-// moment.js locale configuration
-// locale : turkish (tr)
-// authors : Erhan Gundogan : https://github.com/erhangundogan,
-//           Burak Yiğit Kaya: https://github.com/BYK
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    var suffixes = {
-        1: "'inci",
-        5: "'inci",
-        8: "'inci",
-        70: "'inci",
-        80: "'inci",
-
-        2: "'nci",
-        7: "'nci",
-        20: "'nci",
-        50: "'nci",
-
-        3: "'üncü",
-        4: "'üncü",
-        100: "'üncü",
-
-        6: "'ncı",
-
-        9: "'uncu",
-        10: "'uncu",
-        30: "'uncu",
-
-        60: "'ıncı",
-        90: "'ıncı"
-    };
-
-    return moment.defineLocale('tr', {
-        months : "Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),
-        monthsShort : "Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),
-        weekdays : "Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),
-        weekdaysShort : "Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),
-        weekdaysMin : "Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd, D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay : '[bugün saat] LT',
-            nextDay : '[yarın saat] LT',
-            nextWeek : '[haftaya] dddd [saat] LT',
-            lastDay : '[dün] LT',
-            lastWeek : '[geçen hafta] dddd [saat] LT',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "%s sonra",
-            past : "%s önce",
-            s : "birkaç saniye",
-            m : "bir dakika",
-            mm : "%d dakika",
-            h : "bir saat",
-            hh : "%d saat",
-            d : "bir gün",
-            dd : "%d gün",
-            M : "bir ay",
-            MM : "%d ay",
-            y : "bir yıl",
-            yy : "%d yıl"
-        },
-        ordinal : function (number) {
-            if (number === 0) {  // special case for zero
-                return number + "'ıncı";
-            }
-            var a = number % 10,
-                b = number % 100 - a,
-                c = number >= 100 ? 100 : null;
-
-            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/tzm-latn.js b/resources/lib/moment/lang/tzm-latn.js
deleted file mode 100644 (file)
index 1411e16..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// moment.js locale configuration
-// locale : Morocco Central Atlas Tamaziɣt in Latin (tzm-latn)
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('tzm-latn', {
-        months : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
-        monthsShort : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
-        weekdays : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
-        weekdaysShort : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
-        weekdaysMin : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[asdkh g] LT",
-            nextDay: '[aska g] LT',
-            nextWeek: 'dddd [g] LT',
-            lastDay: '[assant g] LT',
-            lastWeek: 'dddd [g] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "dadkh s yan %s",
-            past : "yan %s",
-            s : "imik",
-            m : "minuḍ",
-            mm : "%d minuḍ",
-            h : "saɛa",
-            hh : "%d tassaɛin",
-            d : "ass",
-            dd : "%d ossan",
-            M : "ayowr",
-            MM : "%d iyyirn",
-            y : "asgas",
-            yy : "%d isgasn"
-        },
-        week : {
-            dow : 6, // Saturday is the first day of the week.
-            doy : 12  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/tzm.js b/resources/lib/moment/lang/tzm.js
deleted file mode 100644 (file)
index 615eb97..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// moment.js locale configuration
-// locale : Morocco Central Atlas Tamaziɣt (tzm)
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('tzm', {
-        months : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),
-        monthsShort : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),
-        weekdays : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
-        weekdaysShort : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
-        weekdaysMin : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "dddd D MMMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[ⴰⵙⴷⵅ ⴴ] LT",
-            nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
-            nextWeek: 'dddd [ⴴ] LT',
-            lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
-            lastWeek: 'dddd [ⴴ] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",
-            past : "ⵢⴰⵏ %s",
-            s : "ⵉⵎⵉⴽ",
-            m : "ⵎⵉⵏⵓⴺ",
-            mm : "%d ⵎⵉⵏⵓⴺ",
-            h : "ⵙⴰⵄⴰ",
-            hh : "%d ⵜⴰⵙⵙⴰⵄⵉⵏ",
-            d : "ⴰⵙⵙ",
-            dd : "%d oⵙⵙⴰⵏ",
-            M : "ⴰⵢoⵓⵔ",
-            MM : "%d ⵉⵢⵢⵉⵔⵏ",
-            y : "ⴰⵙⴳⴰⵙ",
-            yy : "%d ⵉⵙⴳⴰⵙⵏ"
-        },
-        week : {
-            dow : 6, // Saturday is the first day of the week.
-            doy : 12  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/uk.js b/resources/lib/moment/lang/uk.js
deleted file mode 100644 (file)
index f27d9f3..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-// moment.js locale configuration
-// locale : ukrainian (uk)
-// author : zemlanin : https://github.com/zemlanin
-// Author : Menelion Elensúle : https://github.com/Oire
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    function plural(word, num) {
-        var forms = word.split('_');
-        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
-    }
-
-    function relativeTimeWithPlural(number, withoutSuffix, key) {
-        var format = {
-            'mm': 'хвилина_хвилини_хвилин',
-            'hh': 'година_години_годин',
-            'dd': 'день_дні_днів',
-            'MM': 'місяць_місяці_місяців',
-            'yy': 'рік_роки_років'
-        };
-        if (key === 'm') {
-            return withoutSuffix ? 'хвилина' : 'хвилину';
-        }
-        else if (key === 'h') {
-            return withoutSuffix ? 'година' : 'годину';
-        }
-        else {
-            return number + ' ' + plural(format[key], +number);
-        }
-    }
-
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'),
-            'accusative': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_')
-        },
-
-        nounCase = (/D[oD]? *MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
-            'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
-            'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
-        },
-
-        nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
-            'accusative' :
-            ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
-                'genitive' :
-                'nominative');
-
-        return weekdays[nounCase][m.day()];
-    }
-
-    function processHoursFunction(str) {
-        return function () {
-            return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
-        };
-    }
-
-    return moment.defineLocale('uk', {
-        months : monthsCaseReplace,
-        monthsShort : "січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),
-        weekdays : weekdaysCaseReplace,
-        weekdaysShort : "нд_пн_вт_ср_чт_пт_сб".split("_"),
-        weekdaysMin : "нд_пн_вт_ср_чт_пт_сб".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD.MM.YYYY",
-            LL : "D MMMM YYYY р.",
-            LLL : "D MMMM YYYY р., LT",
-            LLLL : "dddd, D MMMM YYYY р., LT"
-        },
-        calendar : {
-            sameDay: processHoursFunction('[Сьогодні '),
-            nextDay: processHoursFunction('[Завтра '),
-            lastDay: processHoursFunction('[Вчора '),
-            nextWeek: processHoursFunction('[У] dddd ['),
-            lastWeek: function () {
-                switch (this.day()) {
-                case 0:
-                case 3:
-                case 5:
-                case 6:
-                    return processHoursFunction('[Минулої] dddd [').call(this);
-                case 1:
-                case 2:
-                case 4:
-                    return processHoursFunction('[Минулого] dddd [').call(this);
-                }
-            },
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "за %s",
-            past : "%s тому",
-            s : "декілька секунд",
-            m : relativeTimeWithPlural,
-            mm : relativeTimeWithPlural,
-            h : "годину",
-            hh : relativeTimeWithPlural,
-            d : "день",
-            dd : relativeTimeWithPlural,
-            M : "місяць",
-            MM : relativeTimeWithPlural,
-            y : "рік",
-            yy : relativeTimeWithPlural
-        },
-
-        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
-
-        meridiem : function (hour, minute, isLower) {
-            if (hour < 4) {
-                return "ночі";
-            } else if (hour < 12) {
-                return "ранку";
-            } else if (hour < 17) {
-                return "дня";
-            } else {
-                return "вечора";
-            }
-        },
-
-        ordinal: function (number, period) {
-            switch (period) {
-            case 'M':
-            case 'd':
-            case 'DDD':
-            case 'w':
-            case 'W':
-                return number + '-й';
-            case 'D':
-                return number + '-го';
-            default:
-                return number;
-            }
-        },
-
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/uz.js b/resources/lib/moment/lang/uz.js
deleted file mode 100644 (file)
index aeaad63..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// moment.js locale configuration
-// locale : uzbek
-// author : Sardor Muminov : https://github.com/muminoff
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('uz', {
-        months : "январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),
-        monthsShort : "янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),
-        weekdays : "Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),
-        weekdaysShort : "Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),
-        weekdaysMin : "Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM YYYY",
-            LLL : "D MMMM YYYY LT",
-            LLLL : "D MMMM YYYY, dddd LT"
-        },
-        calendar : {
-            sameDay : '[Бугун соат] LT [да]',
-            nextDay : '[Эртага] LT [да]',
-            nextWeek : 'dddd [куни соат] LT [да]',
-            lastDay : '[Кеча соат] LT [да]',
-            lastWeek : '[Утган] dddd [куни соат] LT [да]',
-            sameElse : 'L'
-        },
-        relativeTime : {
-            future : "Якин %s ичида",
-            past : "Бир неча %s олдин",
-            s : "фурсат",
-            m : "бир дакика",
-            mm : "%d дакика",
-            h : "бир соат",
-            hh : "%d соат",
-            d : "бир кун",
-            dd : "%d кун",
-            M : "бир ой",
-            MM : "%d ой",
-            y : "бир йил",
-            yy : "%d йил"
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/vi.js b/resources/lib/moment/lang/vi.js
deleted file mode 100644 (file)
index 3f8f5f5..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-// moment.js locale configuration
-// locale : vietnamese (vi)
-// author : Bang Nguyen : https://github.com/bangnk
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('vi', {
-        months : "tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),
-        monthsShort : "Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),
-        weekdays : "chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),
-        weekdaysShort : "CN_T2_T3_T4_T5_T6_T7".split("_"),
-        weekdaysMin : "CN_T2_T3_T4_T5_T6_T7".split("_"),
-        longDateFormat : {
-            LT : "HH:mm",
-            L : "DD/MM/YYYY",
-            LL : "D MMMM [năm] YYYY",
-            LLL : "D MMMM [năm] YYYY LT",
-            LLLL : "dddd, D MMMM [năm] YYYY LT",
-            l : "DD/M/YYYY",
-            ll : "D MMM YYYY",
-            lll : "D MMM YYYY LT",
-            llll : "ddd, D MMM YYYY LT"
-        },
-        calendar : {
-            sameDay: "[Hôm nay lúc] LT",
-            nextDay: '[Ngày mai lúc] LT',
-            nextWeek: 'dddd [tuần tới lúc] LT',
-            lastDay: '[Hôm qua lúc] LT',
-            lastWeek: 'dddd [tuần rồi lúc] LT',
-            sameElse: 'L'
-        },
-        relativeTime : {
-            future : "%s tới",
-            past : "%s trước",
-            s : "vài giây",
-            m : "một phút",
-            mm : "%d phút",
-            h : "một giờ",
-            hh : "%d giờ",
-            d : "một ngày",
-            dd : "%d ngày",
-            M : "một tháng",
-            MM : "%d tháng",
-            y : "một năm",
-            yy : "%d năm"
-        },
-        ordinal : function (number) {
-            return number;
-        },
-        week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/zh-cn.js b/resources/lib/moment/lang/zh-cn.js
deleted file mode 100644 (file)
index e73acd7..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-// moment.js locale configuration
-// locale : chinese
-// author : suupic : https://github.com/suupic
-// author : Zeno Zeng : https://github.com/zenozeng
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('zh-cn', {
-        months : "一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),
-        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
-        weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),
-        weekdaysShort : "周日_周一_周二_周三_周四_周五_周六".split("_"),
-        weekdaysMin : "日_一_二_三_四_五_六".split("_"),
-        longDateFormat : {
-            LT : "Ah点mm",
-            L : "YYYY-MM-DD",
-            LL : "YYYY年MMMD日",
-            LLL : "YYYY年MMMD日LT",
-            LLLL : "YYYY年MMMD日ddddLT",
-            l : "YYYY-MM-DD",
-            ll : "YYYY年MMMD日",
-            lll : "YYYY年MMMD日LT",
-            llll : "YYYY年MMMD日ddddLT"
-        },
-        meridiem : function (hour, minute, isLower) {
-            var hm = hour * 100 + minute;
-            if (hm < 600) {
-                return "凌晨";
-            } else if (hm < 900) {
-                return "早上";
-            } else if (hm < 1130) {
-                return "上午";
-            } else if (hm < 1230) {
-                return "中午";
-            } else if (hm < 1800) {
-                return "下午";
-            } else {
-                return "晚上";
-            }
-        },
-        calendar : {
-            sameDay : function () {
-                return this.minutes() === 0 ? "[今天]Ah[点整]" : "[今天]LT";
-            },
-            nextDay : function () {
-                return this.minutes() === 0 ? "[明天]Ah[点整]" : "[明天]LT";
-            },
-            lastDay : function () {
-                return this.minutes() === 0 ? "[昨天]Ah[点整]" : "[昨天]LT";
-            },
-            nextWeek : function () {
-                var startOfWeek, prefix;
-                startOfWeek = moment().startOf('week');
-                prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
-                return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
-            },
-            lastWeek : function () {
-                var startOfWeek, prefix;
-                startOfWeek = moment().startOf('week');
-                prefix = this.unix() < startOfWeek.unix()  ? '[上]' : '[本]';
-                return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
-            },
-            sameElse : 'LL'
-        },
-        ordinal : function (number, period) {
-            switch (period) {
-            case "d":
-            case "D":
-            case "DDD":
-                return number + "日";
-            case "M":
-                return number + "月";
-            case "w":
-            case "W":
-                return number + "周";
-            default:
-                return number;
-            }
-        },
-        relativeTime : {
-            future : "%s内",
-            past : "%s前",
-            s : "几秒",
-            m : "1分钟",
-            mm : "%d分钟",
-            h : "1小时",
-            hh : "%d小时",
-            d : "1天",
-            dd : "%d天",
-            M : "1个月",
-            MM : "%d个月",
-            y : "1年",
-            yy : "%d年"
-        },
-        week : {
-            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
-            dow : 1, // Monday is the first day of the week.
-            doy : 4  // The week that contains Jan 4th is the first week of the year.
-        }
-    });
-}));
diff --git a/resources/lib/moment/lang/zh-tw.js b/resources/lib/moment/lang/zh-tw.js
deleted file mode 100644 (file)
index edb1fb9..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-// moment.js locale configuration
-// locale : traditional chinese (zh-tw)
-// author : Ben : https://github.com/ben-lin
-
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory(window.moment); // Browser global
-    }
-}(function (moment) {
-    return moment.defineLocale('zh-tw', {
-        months : "一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),
-        monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
-        weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),
-        weekdaysShort : "週日_週一_週二_週三_週四_週五_週六".split("_"),
-        weekdaysMin : "日_一_二_三_四_五_六".split("_"),
-        longDateFormat : {
-            LT : "Ah點mm",
-            L : "YYYY年MMMD日",
-            LL : "YYYY年MMMD日",
-            LLL : "YYYY年MMMD日LT",
-            LLLL : "YYYY年MMMD日ddddLT",
-            l : "YYYY年MMMD日",
-            ll : "YYYY年MMMD日",
-            lll : "YYYY年MMMD日LT",
-            llll : "YYYY年MMMD日ddddLT"
-        },
-        meridiem : function (hour, minute, isLower) {
-            var hm = hour * 100 + minute;
-            if (hm < 900) {
-                return "早上";
-            } else if (hm < 1130) {
-                return "上午";
-            } else if (hm < 1230) {
-                return "中午";
-            } else if (hm < 1800) {
-                return "下午";
-            } else {
-                return "晚上";
-            }
-        },
-        calendar : {
-            sameDay : '[今天]LT',
-            nextDay : '[明天]LT',
-            nextWeek : '[下]ddddLT',
-            lastDay : '[昨天]LT',
-            lastWeek : '[上]ddddLT',
-            sameElse : 'L'
-        },
-        ordinal : function (number, period) {
-            switch (period) {
-            case "d" :
-            case "D" :
-            case "DDD" :
-                return number + "日";
-            case "M" :
-                return number + "月";
-            case "w" :
-            case "W" :
-                return number + "週";
-            default :
-                return number;
-            }
-        },
-        relativeTime : {
-            future : "%s內",
-            past : "%s前",
-            s : "幾秒",
-            m : "一分鐘",
-            mm : "%d分鐘",
-            h : "一小時",
-            hh : "%d小時",
-            d : "一天",
-            dd : "%d天",
-            M : "一個月",
-            MM : "%d個月",
-            y : "一年",
-            yy : "%d年"
-        }
-    });
-}));
diff --git a/resources/lib/moment/locale/af.js b/resources/lib/moment/locale/af.js
new file mode 100644 (file)
index 0000000..1b8c520
--- /dev/null
@@ -0,0 +1,65 @@
+// moment.js locale configuration
+// locale : afrikaans (af)
+// author : Werner Mollentze : https://github.com/wernerm
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('af', {
+        months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
+        monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
+        weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
+        weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
+        weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 12) {
+                return isLower ? 'vm' : 'VM';
+            } else {
+                return isLower ? 'nm' : 'NM';
+            }
+        },
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[Vandag om] LT',
+            nextDay : '[Môre om] LT',
+            nextWeek : 'dddd [om] LT',
+            lastDay : '[Gister om] LT',
+            lastWeek : '[Laas] dddd [om] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'oor %s',
+            past : '%s gelede',
+            s : '\'n paar sekondes',
+            m : '\'n minuut',
+            mm : '%d minute',
+            h : '\'n uur',
+            hh : '%d ure',
+            d : '\'n dag',
+            dd : '%d dae',
+            M : '\'n maand',
+            MM : '%d maande',
+            y : '\'n jaar',
+            yy : '%d jaar'
+        },
+        ordinal : function (number) {
+            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter
+        },
+        week : {
+            dow : 1, // Maandag is die eerste dag van die week.
+            doy : 4  // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ar-ma.js b/resources/lib/moment/locale/ar-ma.js
new file mode 100644 (file)
index 0000000..5b2095a
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js locale configuration
+// locale : Moroccan Arabic (ar-ma)
+// author : ElFadili Yassine : https://github.com/ElFadiliY
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('ar-ma', {
+        months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+        monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+        weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+        weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+        weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[اليوم على الساعة] LT',
+            nextDay: '[غدا على الساعة] LT',
+            nextWeek: 'dddd [على الساعة] LT',
+            lastDay: '[أمس على الساعة] LT',
+            lastWeek: 'dddd [على الساعة] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'في %s',
+            past : 'منذ %s',
+            s : 'ثوان',
+            m : 'دقيقة',
+            mm : '%d دقائق',
+            h : 'ساعة',
+            hh : '%d ساعات',
+            d : 'يوم',
+            dd : '%d أيام',
+            M : 'شهر',
+            MM : '%d أشهر',
+            y : 'سنة',
+            yy : '%d سنوات'
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ar-sa.js b/resources/lib/moment/locale/ar-sa.js
new file mode 100644 (file)
index 0000000..f7867ea
--- /dev/null
@@ -0,0 +1,96 @@
+// moment.js locale configuration
+// locale : Arabic Saudi Arabia (ar-sa)
+// author : Suhail Alkowaileet : https://github.com/xsoh
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '١',
+        '2': '٢',
+        '3': '٣',
+        '4': '٤',
+        '5': '٥',
+        '6': '٦',
+        '7': '٧',
+        '8': '٨',
+        '9': '٩',
+        '0': '٠'
+    }, numberMap = {
+        '١': '1',
+        '٢': '2',
+        '٣': '3',
+        '٤': '4',
+        '٥': '5',
+        '٦': '6',
+        '٧': '7',
+        '٨': '8',
+        '٩': '9',
+        '٠': '0'
+    };
+
+    return moment.defineLocale('ar-sa', {
+        months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+        monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+        weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+        weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+        weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return 'ص';
+            } else {
+                return 'م';
+            }
+        },
+        calendar : {
+            sameDay: '[اليوم على الساعة] LT',
+            nextDay: '[غدا على الساعة] LT',
+            nextWeek: 'dddd [على الساعة] LT',
+            lastDay: '[أمس على الساعة] LT',
+            lastWeek: 'dddd [على الساعة] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'في %s',
+            past : 'منذ %s',
+            s : 'ثوان',
+            m : 'دقيقة',
+            mm : '%d دقائق',
+            h : 'ساعة',
+            hh : '%d ساعات',
+            d : 'يوم',
+            dd : '%d أيام',
+            M : 'شهر',
+            MM : '%d أشهر',
+            y : 'سنة',
+            yy : '%d سنوات'
+        },
+        preparse: function (string) {
+            return string.replace(/[۰-۹]/g, function (match) {
+                return numberMap[match];
+            }).replace(/،/g, ',');
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            }).replace(/,/g, '،');
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ar.js b/resources/lib/moment/locale/ar.js
new file mode 100644 (file)
index 0000000..1791a6b
--- /dev/null
@@ -0,0 +1,129 @@
+// moment.js locale configuration
+// Locale: Arabic (ar)
+// Author: Abdel Said: https://github.com/abdelsaid
+// Changes in months, weekdays: Ahmed Elkhatib
+// Native plural forms: forabi https://github.com/forabi
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '١',
+        '2': '٢',
+        '3': '٣',
+        '4': '٤',
+        '5': '٥',
+        '6': '٦',
+        '7': '٧',
+        '8': '٨',
+        '9': '٩',
+        '0': '٠'
+    }, numberMap = {
+        '١': '1',
+        '٢': '2',
+        '٣': '3',
+        '٤': '4',
+        '٥': '5',
+        '٦': '6',
+        '٧': '7',
+        '٨': '8',
+        '٩': '9',
+        '٠': '0'
+    }, pluralForm = function (n) {
+        return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;
+    }, plurals = {
+        s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],
+        m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],
+        h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],
+        d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],
+        M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],
+        y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']
+    }, pluralize = function (u) {
+        return function (number, withoutSuffix, string, isFuture) {
+            var f = pluralForm(number),
+                str = plurals[u][pluralForm(number)];
+            if (f === 2) {
+                str = str[withoutSuffix ? 0 : 1];
+            }
+            return str.replace(/%d/i, number);
+        };
+    }, months = [
+        'كانون الثاني يناير',
+        'شباط فبراير',
+        'آذار مارس',
+        'نيسان أبريل',
+        'أيار مايو',
+        'حزيران يونيو',
+        'تموز يوليو',
+        'آب أغسطس',
+        'أيلول سبتمبر',
+        'تشرين الأول أكتوبر',
+        'تشرين الثاني نوفمبر',
+        'كانون الأول ديسمبر'
+    ];
+
+    return moment.defineLocale('ar', {
+        months : months,
+        monthsShort : months,
+        weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+        weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+        weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return 'ص';
+            } else {
+                return 'م';
+            }
+        },
+        calendar : {
+            sameDay: '[اليوم عند الساعة] LT',
+            nextDay: '[غدًا عند الساعة] LT',
+            nextWeek: 'dddd [عند الساعة] LT',
+            lastDay: '[أمس عند الساعة] LT',
+            lastWeek: 'dddd [عند الساعة] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'بعد %s',
+            past : 'منذ %s',
+            s : pluralize('s'),
+            m : pluralize('m'),
+            mm : pluralize('m'),
+            h : pluralize('h'),
+            hh : pluralize('h'),
+            d : pluralize('d'),
+            dd : pluralize('d'),
+            M : pluralize('M'),
+            MM : pluralize('M'),
+            y : pluralize('y'),
+            yy : pluralize('y')
+        },
+        preparse: function (string) {
+            return string.replace(/[۰-۹]/g, function (match) {
+                return numberMap[match];
+            }).replace(/،/g, ',');
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            }).replace(/,/g, '،');
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/az.js b/resources/lib/moment/locale/az.js
new file mode 100644 (file)
index 0000000..e82f6e1
--- /dev/null
@@ -0,0 +1,101 @@
+// moment.js locale configuration
+// locale : azerbaijani (az)
+// author : topchiyev : https://github.com/topchiyev
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var suffixes = {
+        1: '-inci',
+        5: '-inci',
+        8: '-inci',
+        70: '-inci',
+        80: '-inci',
+
+        2: '-nci',
+        7: '-nci',
+        20: '-nci',
+        50: '-nci',
+
+        3: '-üncü',
+        4: '-üncü',
+        100: '-üncü',
+
+        6: '-ncı',
+
+        9: '-uncu',
+        10: '-uncu',
+        30: '-uncu',
+
+        60: '-ıncı',
+        90: '-ıncı'
+    };
+    return moment.defineLocale('az', {
+        months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),
+        monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
+        weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),
+        weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
+        weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[bugün saat] LT',
+            nextDay : '[sabah saat] LT',
+            nextWeek : '[gələn həftə] dddd [saat] LT',
+            lastDay : '[dünən] LT',
+            lastWeek : '[keçən həftə] dddd [saat] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s sonra',
+            past : '%s əvvəl',
+            s : 'birneçə saniyyə',
+            m : 'bir dəqiqə',
+            mm : '%d dəqiqə',
+            h : 'bir saat',
+            hh : '%d saat',
+            d : 'bir gün',
+            dd : '%d gün',
+            M : 'bir ay',
+            MM : '%d ay',
+            y : 'bir il',
+            yy : '%d il'
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'gecə';
+            } else if (hour < 12) {
+                return 'səhər';
+            } else if (hour < 17) {
+                return 'gündüz';
+            } else {
+                return 'axşam';
+            }
+        },
+        ordinal : function (number) {
+            if (number === 0) {  // special case for zero
+                return number + '-ıncı';
+            }
+            var a = number % 10,
+                b = number % 100 - a,
+                c = number >= 100 ? 100 : null;
+
+            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/be.js b/resources/lib/moment/locale/be.js
new file mode 100644 (file)
index 0000000..fe3186a
--- /dev/null
@@ -0,0 +1,150 @@
+// moment.js locale configuration
+// locale : belarusian (be)
+// author : Dmitry Demidov : https://github.com/demidov91
+// author: Praleska: http://praleska.pro/
+// Author : Menelion Elensúle : https://github.com/Oire
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function plural(word, num) {
+        var forms = word.split('_');
+        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+    }
+
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        var format = {
+            'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
+            'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
+            'dd': 'дзень_дні_дзён',
+            'MM': 'месяц_месяцы_месяцаў',
+            'yy': 'год_гады_гадоў'
+        };
+        if (key === 'm') {
+            return withoutSuffix ? 'хвіліна' : 'хвіліну';
+        }
+        else if (key === 'h') {
+            return withoutSuffix ? 'гадзіна' : 'гадзіну';
+        }
+        else {
+            return number + ' ' + plural(format[key], +number);
+        }
+    }
+
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_'),
+            'accusative': 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_')
+        },
+
+        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = {
+            'nominative': 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
+            'accusative': 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_')
+        },
+
+        nounCase = (/\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return weekdays[nounCase][m.day()];
+    }
+
+    return moment.defineLocale('be', {
+        months : monthsCaseReplace,
+        monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+        weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY г.',
+            LLL : 'D MMMM YYYY г., LT',
+            LLLL : 'dddd, D MMMM YYYY г., LT'
+        },
+        calendar : {
+            sameDay: '[Сёння ў] LT',
+            nextDay: '[Заўтра ў] LT',
+            lastDay: '[Учора ў] LT',
+            nextWeek: function () {
+                return '[У] dddd [ў] LT';
+            },
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 5:
+                case 6:
+                    return '[У мінулую] dddd [ў] LT';
+                case 1:
+                case 2:
+                case 4:
+                    return '[У мінулы] dddd [ў] LT';
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'праз %s',
+            past : '%s таму',
+            s : 'некалькі секунд',
+            m : relativeTimeWithPlural,
+            mm : relativeTimeWithPlural,
+            h : relativeTimeWithPlural,
+            hh : relativeTimeWithPlural,
+            d : 'дзень',
+            dd : relativeTimeWithPlural,
+            M : 'месяц',
+            MM : relativeTimeWithPlural,
+            y : 'год',
+            yy : relativeTimeWithPlural
+        },
+
+
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'ночы';
+            } else if (hour < 12) {
+                return 'раніцы';
+            } else if (hour < 17) {
+                return 'дня';
+            } else {
+                return 'вечара';
+            }
+        },
+
+        ordinal: function (number, period) {
+            switch (period) {
+            case 'M':
+            case 'd':
+            case 'DDD':
+            case 'w':
+            case 'W':
+                return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';
+            case 'D':
+                return number + '-га';
+            default:
+                return number;
+            }
+        },
+
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/bg.js b/resources/lib/moment/locale/bg.js
new file mode 100644 (file)
index 0000000..41b1e3a
--- /dev/null
@@ -0,0 +1,86 @@
+// moment.js locale configuration
+// locale : bulgarian (bg)
+// author : Krasen Borisov : https://github.com/kraz
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('bg', {
+        months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
+        monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
+        weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),
+        weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
+        weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+        longDateFormat : {
+            LT : 'H:mm',
+            L : 'D.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[Днес в] LT',
+            nextDay : '[Утре в] LT',
+            nextWeek : 'dddd [в] LT',
+            lastDay : '[Вчера в] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 6:
+                    return '[В изминалата] dddd [в] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[В изминалия] dddd [в] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'след %s',
+            past : 'преди %s',
+            s : 'няколко секунди',
+            m : 'минута',
+            mm : '%d минути',
+            h : 'час',
+            hh : '%d часа',
+            d : 'ден',
+            dd : '%d дни',
+            M : 'месец',
+            MM : '%d месеца',
+            y : 'година',
+            yy : '%d години'
+        },
+        ordinal : function (number) {
+            var lastDigit = number % 10,
+                last2Digits = number % 100;
+            if (number === 0) {
+                return number + '-ев';
+            } else if (last2Digits === 0) {
+                return number + '-ен';
+            } else if (last2Digits > 10 && last2Digits < 20) {
+                return number + '-ти';
+            } else if (lastDigit === 1) {
+                return number + '-ви';
+            } else if (lastDigit === 2) {
+                return number + '-ри';
+            } else if (lastDigit === 7 || lastDigit === 8) {
+                return number + '-ми';
+            } else {
+                return number + '-ти';
+            }
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/bn.js b/resources/lib/moment/locale/bn.js
new file mode 100644 (file)
index 0000000..7e8ccfd
--- /dev/null
@@ -0,0 +1,106 @@
+// moment.js locale configuration
+// locale : Bengali (bn)
+// author : Kaushik Gandhi : https://github.com/kaushikgandhi
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '১',
+        '2': '২',
+        '3': '৩',
+        '4': '৪',
+        '5': '৫',
+        '6': '৬',
+        '7': '৭',
+        '8': '৮',
+        '9': '৯',
+        '0': '০'
+    },
+    numberMap = {
+        '১': '1',
+        '২': '2',
+        '৩': '3',
+        '৪': '4',
+        '৫': '5',
+        '৬': '6',
+        '৭': '7',
+        '৮': '8',
+        '৯': '9',
+        '০': '0'
+    };
+
+    return moment.defineLocale('bn', {
+        months : 'জানুয়ারী_ফেবুয়ারী_মার্চ_এপ্রিল_মে_জুন_জুলাই_অগাস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
+        monthsShort : 'জানু_ফেব_মার্চ_এপর_মে_জুন_জুল_অগ_সেপ্ট_অক্টো_নভ_ডিসেম্'.split('_'),
+        weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পত্তিবার_শুক্রুবার_শনিবার'.split('_'),
+        weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পত্তি_শুক্রু_শনি'.split('_'),
+        weekdaysMin : 'রব_সম_মঙ্গ_বু_ব্রিহ_শু_শনি'.split('_'),
+        longDateFormat : {
+            LT : 'A h:mm সময়',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY, LT',
+            LLLL : 'dddd, D MMMM YYYY, LT'
+        },
+        calendar : {
+            sameDay : '[আজ] LT',
+            nextDay : '[আগামীকাল] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[গতকাল] LT',
+            lastWeek : '[গত] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s পরে',
+            past : '%s আগে',
+            s : 'কএক সেকেন্ড',
+            m : 'এক মিনিট',
+            mm : '%d মিনিট',
+            h : 'এক ঘন্টা',
+            hh : '%d ঘন্টা',
+            d : 'এক দিন',
+            dd : '%d দিন',
+            M : 'এক মাস',
+            MM : '%d মাস',
+            y : 'এক বছর',
+            yy : '%d বছর'
+        },
+        preparse: function (string) {
+            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        //Bengali is a vast language its spoken
+        //in different forms in various parts of the world.
+        //I have just generalized with most common one used
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'রাত';
+            } else if (hour < 10) {
+                return 'শকাল';
+            } else if (hour < 17) {
+                return 'দুপুর';
+            } else if (hour < 20) {
+                return 'বিকেল';
+            } else {
+                return 'রাত';
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/bo.js b/resources/lib/moment/locale/bo.js
new file mode 100644 (file)
index 0000000..0d44e47
--- /dev/null
@@ -0,0 +1,103 @@
+// moment.js locale configuration
+// locale : tibetan (bo)
+// author : Thupten N. Chakrishar : https://github.com/vajradog
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '༡',
+        '2': '༢',
+        '3': '༣',
+        '4': '༤',
+        '5': '༥',
+        '6': '༦',
+        '7': '༧',
+        '8': '༨',
+        '9': '༩',
+        '0': '༠'
+    },
+    numberMap = {
+        '༡': '1',
+        '༢': '2',
+        '༣': '3',
+        '༤': '4',
+        '༥': '5',
+        '༦': '6',
+        '༧': '7',
+        '༨': '8',
+        '༩': '9',
+        '༠': '0'
+    };
+
+    return moment.defineLocale('bo', {
+        months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+        monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+        weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
+        weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+        weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+        longDateFormat : {
+            LT : 'A h:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY, LT',
+            LLLL : 'dddd, D MMMM YYYY, LT'
+        },
+        calendar : {
+            sameDay : '[དི་རིང] LT',
+            nextDay : '[སང་ཉིན] LT',
+            nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT',
+            lastDay : '[ཁ་སང] LT',
+            lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s ལ་',
+            past : '%s སྔན་ལ',
+            s : 'ལམ་སང',
+            m : 'སྐར་མ་གཅིག',
+            mm : '%d སྐར་མ',
+            h : 'ཆུ་ཚོད་གཅིག',
+            hh : '%d ཆུ་ཚོད',
+            d : 'ཉིན་གཅིག',
+            dd : '%d ཉིན་',
+            M : 'ཟླ་བ་གཅིག',
+            MM : '%d ཟླ་བ',
+            y : 'ལོ་གཅིག',
+            yy : '%d ལོ'
+        },
+        preparse: function (string) {
+            return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'མཚན་མོ';
+            } else if (hour < 10) {
+                return 'ཞོགས་ཀས';
+            } else if (hour < 17) {
+                return 'ཉིན་གུང';
+            } else if (hour < 20) {
+                return 'དགོང་དག';
+            } else {
+                return 'མཚན་མོ';
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/br.js b/resources/lib/moment/locale/br.js
new file mode 100644 (file)
index 0000000..a4f1491
--- /dev/null
@@ -0,0 +1,107 @@
+// moment.js locale configuration
+// locale : breton (br)
+// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function relativeTimeWithMutation(number, withoutSuffix, key) {
+        var format = {
+            'mm': 'munutenn',
+            'MM': 'miz',
+            'dd': 'devezh'
+        };
+        return number + ' ' + mutation(format[key], number);
+    }
+
+    function specialMutationForYears(number) {
+        switch (lastNumber(number)) {
+        case 1:
+        case 3:
+        case 4:
+        case 5:
+        case 9:
+            return number + ' bloaz';
+        default:
+            return number + ' vloaz';
+        }
+    }
+
+    function lastNumber(number) {
+        if (number > 9) {
+            return lastNumber(number % 10);
+        }
+        return number;
+    }
+
+    function mutation(text, number) {
+        if (number === 2) {
+            return softMutation(text);
+        }
+        return text;
+    }
+
+    function softMutation(text) {
+        var mutationTable = {
+            'm': 'v',
+            'b': 'v',
+            'd': 'z'
+        };
+        if (mutationTable[text.charAt(0)] === undefined) {
+            return text;
+        }
+        return mutationTable[text.charAt(0)] + text.substring(1);
+    }
+
+    return moment.defineLocale('br', {
+        months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
+        monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
+        weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'),
+        weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
+        weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
+        longDateFormat : {
+            LT : 'h[e]mm A',
+            L : 'DD/MM/YYYY',
+            LL : 'D [a viz] MMMM YYYY',
+            LLL : 'D [a viz] MMMM YYYY LT',
+            LLLL : 'dddd, D [a viz] MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[Hiziv da] LT',
+            nextDay : '[Warc\'hoazh da] LT',
+            nextWeek : 'dddd [da] LT',
+            lastDay : '[Dec\'h da] LT',
+            lastWeek : 'dddd [paset da] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'a-benn %s',
+            past : '%s \'zo',
+            s : 'un nebeud segondennoù',
+            m : 'ur vunutenn',
+            mm : relativeTimeWithMutation,
+            h : 'un eur',
+            hh : '%d eur',
+            d : 'un devezh',
+            dd : relativeTimeWithMutation,
+            M : 'ur miz',
+            MM : relativeTimeWithMutation,
+            y : 'ur bloaz',
+            yy : specialMutationForYears
+        },
+        ordinal : function (number) {
+            var output = (number === 1) ? 'añ' : 'vet';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/bs.js b/resources/lib/moment/locale/bs.js
new file mode 100644 (file)
index 0000000..b9a5851
--- /dev/null
@@ -0,0 +1,138 @@
+// moment.js locale configuration
+// locale : bosnian (bs)
+// author : Nedim Cholich : https://github.com/frontyard
+// based on (hr) translation by Bojan Marković
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function translate(number, withoutSuffix, key) {
+        var result = number + ' ';
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minuta';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'jedan sat' : 'jednog sata';
+        case 'hh':
+            if (number === 1) {
+                result += 'sat';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'sata';
+            } else {
+                result += 'sati';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dana';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mjesec';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'mjeseca';
+            } else {
+                result += 'mjeseci';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'godina';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'godine';
+            } else {
+                result += 'godina';
+            }
+            return result;
+        }
+    }
+
+    return moment.defineLocale('bs', {
+        months : 'januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+        monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
+        weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+        weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+        weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+        longDateFormat : {
+            LT : 'H:mm',
+            L : 'DD. MM. YYYY',
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY LT',
+            LLLL : 'dddd, D. MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay  : '[danas u] LT',
+            nextDay  : '[sutra u] LT',
+
+            nextWeek : function () {
+                switch (this.day()) {
+                case 0:
+                    return '[u] [nedjelju] [u] LT';
+                case 3:
+                    return '[u] [srijedu] [u] LT';
+                case 6:
+                    return '[u] [subotu] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[u] dddd [u] LT';
+                }
+            },
+            lastDay  : '[jučer u] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                    return '[prošlu] dddd [u] LT';
+                case 6:
+                    return '[prošle] [subote] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prošli] dddd [u] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'za %s',
+            past   : 'prije %s',
+            s      : 'par sekundi',
+            m      : translate,
+            mm     : translate,
+            h      : translate,
+            hh     : translate,
+            d      : 'dan',
+            dd     : translate,
+            M      : 'mjesec',
+            MM     : translate,
+            y      : 'godinu',
+            yy     : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ca.js b/resources/lib/moment/locale/ca.js
new file mode 100644 (file)
index 0000000..fd41ff5
--- /dev/null
@@ -0,0 +1,66 @@
+// moment.js locale configuration
+// locale : catalan (ca)
+// author : Juan G. Hurtado : https://github.com/juanghurtado
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('ca', {
+        months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),
+        monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'),
+        weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),
+        weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
+        weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
+        longDateFormat : {
+            LT : 'H:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : function () {
+                return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            nextDay : function () {
+                return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            nextWeek : function () {
+                return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            lastDay : function () {
+                return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            lastWeek : function () {
+                return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'en %s',
+            past : 'fa %s',
+            s : 'uns segons',
+            m : 'un minut',
+            mm : '%d minuts',
+            h : 'una hora',
+            hh : '%d hores',
+            d : 'un dia',
+            dd : '%d dies',
+            M : 'un mes',
+            MM : '%d mesos',
+            y : 'un any',
+            yy : '%d anys'
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/cs.js b/resources/lib/moment/locale/cs.js
new file mode 100644 (file)
index 0000000..87dec55
--- /dev/null
@@ -0,0 +1,155 @@
+// moment.js locale configuration
+// locale : czech (cs)
+// author : petrbela : https://github.com/petrbela
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),
+        monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');
+
+    function plural(n) {
+        return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + ' ';
+        switch (key) {
+        case 's':  // a few seconds / in a few seconds / a few seconds ago
+            return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
+        case 'm':  // a minute / in a minute / a minute ago
+            return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
+        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'minuty' : 'minut');
+            } else {
+                return result + 'minutami';
+            }
+            break;
+        case 'h':  // an hour / in an hour / an hour ago
+            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+        case 'hh': // 9 hours / in 9 hours / 9 hours ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'hodiny' : 'hodin');
+            } else {
+                return result + 'hodinami';
+            }
+            break;
+        case 'd':  // a day / in a day / a day ago
+            return (withoutSuffix || isFuture) ? 'den' : 'dnem';
+        case 'dd': // 9 days / in 9 days / 9 days ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'dny' : 'dní');
+            } else {
+                return result + 'dny';
+            }
+            break;
+        case 'M':  // a month / in a month / a month ago
+            return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
+        case 'MM': // 9 months / in 9 months / 9 months ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'měsíce' : 'měsíců');
+            } else {
+                return result + 'měsíci';
+            }
+            break;
+        case 'y':  // a year / in a year / a year ago
+            return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
+        case 'yy': // 9 years / in 9 years / 9 years ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'roky' : 'let');
+            } else {
+                return result + 'lety';
+            }
+            break;
+        }
+    }
+
+    return moment.defineLocale('cs', {
+        months : months,
+        monthsShort : monthsShort,
+        monthsParse : (function (months, monthsShort) {
+            var i, _monthsParse = [];
+            for (i = 0; i < 12; i++) {
+                // use custom parser to solve problem with July (červenec)
+                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+            }
+            return _monthsParse;
+        }(months, monthsShort)),
+        weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
+        weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'),
+        weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),
+        longDateFormat : {
+            LT: 'H:mm',
+            L : 'DD. MM. YYYY',
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY LT',
+            LLLL : 'dddd D. MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[dnes v] LT',
+            nextDay: '[zítra v] LT',
+            nextWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[v neděli v] LT';
+                case 1:
+                case 2:
+                    return '[v] dddd [v] LT';
+                case 3:
+                    return '[ve středu v] LT';
+                case 4:
+                    return '[ve čtvrtek v] LT';
+                case 5:
+                    return '[v pátek v] LT';
+                case 6:
+                    return '[v sobotu v] LT';
+                }
+            },
+            lastDay: '[včera v] LT',
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[minulou neděli v] LT';
+                case 1:
+                case 2:
+                    return '[minulé] dddd [v] LT';
+                case 3:
+                    return '[minulou středu v] LT';
+                case 4:
+                case 5:
+                    return '[minulý] dddd [v] LT';
+                case 6:
+                    return '[minulou sobotu v] LT';
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'za %s',
+            past : 'před %s',
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/cv.js b/resources/lib/moment/locale/cv.js
new file mode 100644 (file)
index 0000000..138b6c1
--- /dev/null
@@ -0,0 +1,59 @@
+// moment.js locale configuration
+// locale : chuvash (cv)
+// author : Anatoly Mironov : https://github.com/mirontoli
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('cv', {
+        months : 'кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'),
+        monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'),
+        weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун'.split('_'),
+        weekdaysShort : 'выр_тун_ытл_юн_кĕç_эрн_шăм'.split('_'),
+        weekdaysMin : 'вр_тн_ыт_юн_кç_эр_шм'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD-MM-YYYY',
+            LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]',
+            LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT',
+            LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT'
+        },
+        calendar : {
+            sameDay: '[Паян] LT [сехетре]',
+            nextDay: '[Ыран] LT [сехетре]',
+            lastDay: '[Ĕнер] LT [сехетре]',
+            nextWeek: '[Çитес] dddd LT [сехетре]',
+            lastWeek: '[Иртнĕ] dddd LT [сехетре]',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : function (output) {
+                var affix = /сехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран';
+                return output + affix;
+            },
+            past : '%s каялла',
+            s : 'пĕр-ик çеккунт',
+            m : 'пĕр минут',
+            mm : '%d минут',
+            h : 'пĕр сехет',
+            hh : '%d сехет',
+            d : 'пĕр кун',
+            dd : '%d кун',
+            M : 'пĕр уйăх',
+            MM : '%d уйăх',
+            y : 'пĕр çул',
+            yy : '%d çул'
+        },
+        ordinal : '%d-мĕш',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/cy.js b/resources/lib/moment/locale/cy.js
new file mode 100644 (file)
index 0000000..65fb356
--- /dev/null
@@ -0,0 +1,77 @@
+// moment.js locale configuration
+// locale : Welsh (cy)
+// author : Robert Allen
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('cy', {
+        months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),
+        monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),
+        weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),
+        weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
+        weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
+        // time formats are the same as en-gb
+        longDateFormat: {
+            LT: 'HH:mm',
+            L: 'DD/MM/YYYY',
+            LL: 'D MMMM YYYY',
+            LLL: 'D MMMM YYYY LT',
+            LLLL: 'dddd, D MMMM YYYY LT'
+        },
+        calendar: {
+            sameDay: '[Heddiw am] LT',
+            nextDay: '[Yfory am] LT',
+            nextWeek: 'dddd [am] LT',
+            lastDay: '[Ddoe am] LT',
+            lastWeek: 'dddd [diwethaf am] LT',
+            sameElse: 'L'
+        },
+        relativeTime: {
+            future: 'mewn %s',
+            past: '%s yn ôl',
+            s: 'ychydig eiliadau',
+            m: 'munud',
+            mm: '%d munud',
+            h: 'awr',
+            hh: '%d awr',
+            d: 'diwrnod',
+            dd: '%d diwrnod',
+            M: 'mis',
+            MM: '%d mis',
+            y: 'blwyddyn',
+            yy: '%d flynedd'
+        },
+        // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+        ordinal: function (number) {
+            var b = number,
+                output = '',
+                lookup = [
+                    '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
+                    'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
+                ];
+
+            if (b > 20) {
+                if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
+                    output = 'fed'; // not 30ain, 70ain or 90ain
+                } else {
+                    output = 'ain';
+                }
+            } else if (b > 0) {
+                output = lookup[b];
+            }
+
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/da.js b/resources/lib/moment/locale/da.js
new file mode 100644 (file)
index 0000000..5e9ef96
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js locale configuration
+// locale : danish (da)
+// author : Ulrik Nielsen : https://github.com/mrbase
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('da', {
+        months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),
+        monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+        weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+        weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'),
+        weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY LT',
+            LLLL : 'dddd [d.] D. MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[I dag kl.] LT',
+            nextDay : '[I morgen kl.] LT',
+            nextWeek : 'dddd [kl.] LT',
+            lastDay : '[I går kl.] LT',
+            lastWeek : '[sidste] dddd [kl] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'om %s',
+            past : '%s siden',
+            s : 'få sekunder',
+            m : 'et minut',
+            mm : '%d minutter',
+            h : 'en time',
+            hh : '%d timer',
+            d : 'en dag',
+            dd : '%d dage',
+            M : 'en måned',
+            MM : '%d måneder',
+            y : 'et år',
+            yy : '%d år'
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/de-at.js b/resources/lib/moment/locale/de-at.js
new file mode 100644 (file)
index 0000000..ff715f8
--- /dev/null
@@ -0,0 +1,72 @@
+// moment.js locale configuration
+// locale : austrian german (de-at)
+// author : lluchs : https://github.com/lluchs
+// author: Menelion Elensúle: https://github.com/Oire
+// author : Martin Groller : https://github.com/MadMG
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
+        var format = {
+            'm': ['eine Minute', 'einer Minute'],
+            'h': ['eine Stunde', 'einer Stunde'],
+            'd': ['ein Tag', 'einem Tag'],
+            'dd': [number + ' Tage', number + ' Tagen'],
+            'M': ['ein Monat', 'einem Monat'],
+            'MM': [number + ' Monate', number + ' Monaten'],
+            'y': ['ein Jahr', 'einem Jahr'],
+            'yy': [number + ' Jahre', number + ' Jahren']
+        };
+        return withoutSuffix ? format[key][0] : format[key][1];
+    }
+
+    return moment.defineLocale('de-at', {
+        months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+        monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+        weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+        weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+        weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+        longDateFormat : {
+            LT: 'HH:mm [Uhr]',
+            L : 'DD.MM.YYYY',
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY LT',
+            LLLL : 'dddd, D. MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[Heute um] LT',
+            sameElse: 'L',
+            nextDay: '[Morgen um] LT',
+            nextWeek: 'dddd [um] LT',
+            lastDay: '[Gestern um] LT',
+            lastWeek: '[letzten] dddd [um] LT'
+        },
+        relativeTime : {
+            future : 'in %s',
+            past : 'vor %s',
+            s : 'ein paar Sekunden',
+            m : processRelativeTime,
+            mm : '%d Minuten',
+            h : processRelativeTime,
+            hh : '%d Stunden',
+            d : processRelativeTime,
+            dd : processRelativeTime,
+            M : processRelativeTime,
+            MM : processRelativeTime,
+            y : processRelativeTime,
+            yy : processRelativeTime
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/de.js b/resources/lib/moment/locale/de.js
new file mode 100644 (file)
index 0000000..11ab9ac
--- /dev/null
@@ -0,0 +1,71 @@
+// moment.js locale configuration
+// locale : german (de)
+// author : lluchs : https://github.com/lluchs
+// author: Menelion Elensúle: https://github.com/Oire
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
+        var format = {
+            'm': ['eine Minute', 'einer Minute'],
+            'h': ['eine Stunde', 'einer Stunde'],
+            'd': ['ein Tag', 'einem Tag'],
+            'dd': [number + ' Tage', number + ' Tagen'],
+            'M': ['ein Monat', 'einem Monat'],
+            'MM': [number + ' Monate', number + ' Monaten'],
+            'y': ['ein Jahr', 'einem Jahr'],
+            'yy': [number + ' Jahre', number + ' Jahren']
+        };
+        return withoutSuffix ? format[key][0] : format[key][1];
+    }
+
+    return moment.defineLocale('de', {
+        months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+        monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+        weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+        weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+        weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+        longDateFormat : {
+            LT: 'HH:mm [Uhr]',
+            L : 'DD.MM.YYYY',
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY LT',
+            LLLL : 'dddd, D. MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[Heute um] LT',
+            sameElse: 'L',
+            nextDay: '[Morgen um] LT',
+            nextWeek: 'dddd [um] LT',
+            lastDay: '[Gestern um] LT',
+            lastWeek: '[letzten] dddd [um] LT'
+        },
+        relativeTime : {
+            future : 'in %s',
+            past : 'vor %s',
+            s : 'ein paar Sekunden',
+            m : processRelativeTime,
+            mm : '%d Minuten',
+            h : processRelativeTime,
+            hh : '%d Stunden',
+            d : processRelativeTime,
+            dd : processRelativeTime,
+            M : processRelativeTime,
+            MM : processRelativeTime,
+            y : processRelativeTime,
+            yy : processRelativeTime
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/el.js b/resources/lib/moment/locale/el.js
new file mode 100644 (file)
index 0000000..eb8eb1a
--- /dev/null
@@ -0,0 +1,94 @@
+// moment.js locale configuration
+// locale : modern greek (el)
+// author : Aggelos Karalias : https://github.com/mehiel
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('el', {
+        monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),
+        monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),
+        months : function (momentToFormat, format) {
+            if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM'
+                return this._monthsGenitiveEl[momentToFormat.month()];
+            } else {
+                return this._monthsNominativeEl[momentToFormat.month()];
+            }
+        },
+        monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
+        weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'),
+        weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
+        weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
+        meridiem : function (hours, minutes, isLower) {
+            if (hours > 11) {
+                return isLower ? 'μμ' : 'ΜΜ';
+            } else {
+                return isLower ? 'πμ' : 'ΠΜ';
+            }
+        },
+        isPM : function (input) {
+            return ((input + '').toLowerCase()[0] === 'μ');
+        },
+        meridiemParse : /[ΠΜ]\.?Μ?\.?/i,
+        longDateFormat : {
+            LT : 'h:mm A',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendarEl : {
+            sameDay : '[Σήμερα {}] LT',
+            nextDay : '[Αύριο {}] LT',
+            nextWeek : 'dddd [{}] LT',
+            lastDay : '[Χθες {}] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                    case 6:
+                        return '[το προηγούμενο] dddd [{}] LT';
+                    default:
+                        return '[την προηγούμενη] dddd [{}] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        calendar : function (key, mom) {
+            var output = this._calendarEl[key],
+                hours = mom && mom.hours();
+
+            if (typeof output === 'function') {
+                output = output.apply(mom);
+            }
+
+            return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις'));
+        },
+        relativeTime : {
+            future : 'σε %s',
+            past : '%s πριν',
+            s : 'δευτερόλεπτα',
+            m : 'ένα λεπτό',
+            mm : '%d λεπτά',
+            h : 'μία ώρα',
+            hh : '%d ώρες',
+            d : 'μία μέρα',
+            dd : '%d μέρες',
+            M : 'ένας μήνας',
+            MM : '%d μήνες',
+            y : 'ένας χρόνος',
+            yy : '%d χρόνια'
+        },
+        ordinal : function (number) {
+            return number + 'η';
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/en-au.js b/resources/lib/moment/locale/en-au.js
new file mode 100644 (file)
index 0000000..75ad34a
--- /dev/null
@@ -0,0 +1,62 @@
+// moment.js locale configuration
+// locale : australian english (en-au)
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('en-au', {
+        months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+        monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+        weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+        weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+        weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+        longDateFormat : {
+            LT : 'h:mm A',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[Today at] LT',
+            nextDay : '[Tomorrow at] LT',
+            nextWeek : 'dddd [at] LT',
+            lastDay : '[Yesterday at] LT',
+            lastWeek : '[Last] dddd [at] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'in %s',
+            past : '%s ago',
+            s : 'a few seconds',
+            m : 'a minute',
+            mm : '%d minutes',
+            h : 'an hour',
+            hh : '%d hours',
+            d : 'a day',
+            dd : '%d days',
+            M : 'a month',
+            MM : '%d months',
+            y : 'a year',
+            yy : '%d years'
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~(number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/en-ca.js b/resources/lib/moment/locale/en-ca.js
new file mode 100644 (file)
index 0000000..077dc8b
--- /dev/null
@@ -0,0 +1,59 @@
+// moment.js locale configuration
+// locale : canadian english (en-ca)
+// author : Jonathan Abourbih : https://github.com/jonbca
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('en-ca', {
+        months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+        monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+        weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+        weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+        weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+        longDateFormat : {
+            LT : 'h:mm A',
+            L : 'YYYY-MM-DD',
+            LL : 'D MMMM, YYYY',
+            LLL : 'D MMMM, YYYY LT',
+            LLLL : 'dddd, D MMMM, YYYY LT'
+        },
+        calendar : {
+            sameDay : '[Today at] LT',
+            nextDay : '[Tomorrow at] LT',
+            nextWeek : 'dddd [at] LT',
+            lastDay : '[Yesterday at] LT',
+            lastWeek : '[Last] dddd [at] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'in %s',
+            past : '%s ago',
+            s : 'a few seconds',
+            m : 'a minute',
+            mm : '%d minutes',
+            h : 'an hour',
+            hh : '%d hours',
+            d : 'a day',
+            dd : '%d days',
+            M : 'a month',
+            MM : '%d months',
+            y : 'a year',
+            yy : '%d years'
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~(number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/en-gb.js b/resources/lib/moment/locale/en-gb.js
new file mode 100644 (file)
index 0000000..4491d4a
--- /dev/null
@@ -0,0 +1,63 @@
+// moment.js locale configuration
+// locale : great britain english (en-gb)
+// author : Chris Gedrim : https://github.com/chrisgedrim
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('en-gb', {
+        months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+        monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+        weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+        weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+        weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[Today at] LT',
+            nextDay : '[Tomorrow at] LT',
+            nextWeek : 'dddd [at] LT',
+            lastDay : '[Yesterday at] LT',
+            lastWeek : '[Last] dddd [at] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'in %s',
+            past : '%s ago',
+            s : 'a few seconds',
+            m : 'a minute',
+            mm : '%d minutes',
+            h : 'an hour',
+            hh : '%d hours',
+            d : 'a day',
+            dd : '%d days',
+            M : 'a month',
+            MM : '%d months',
+            y : 'a year',
+            yy : '%d years'
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~(number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/eo.js b/resources/lib/moment/locale/eo.js
new file mode 100644 (file)
index 0000000..735ed8e
--- /dev/null
@@ -0,0 +1,65 @@
+// moment.js locale configuration
+// locale : esperanto (eo)
+// author : Colin Dean : https://github.com/colindean
+// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+//          Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('eo', {
+        months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),
+        monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),
+        weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato'.split('_'),
+        weekdaysShort : 'Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab'.split('_'),
+        weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'YYYY-MM-DD',
+            LL : 'D[-an de] MMMM, YYYY',
+            LLL : 'D[-an de] MMMM, YYYY LT',
+            LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT'
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours > 11) {
+                return isLower ? 'p.t.m.' : 'P.T.M.';
+            } else {
+                return isLower ? 'a.t.m.' : 'A.T.M.';
+            }
+        },
+        calendar : {
+            sameDay : '[Hodiaŭ je] LT',
+            nextDay : '[Morgaŭ je] LT',
+            nextWeek : 'dddd [je] LT',
+            lastDay : '[Hieraŭ je] LT',
+            lastWeek : '[pasinta] dddd [je] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'je %s',
+            past : 'antaŭ %s',
+            s : 'sekundoj',
+            m : 'minuto',
+            mm : '%d minutoj',
+            h : 'horo',
+            hh : '%d horoj',
+            d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo
+            dd : '%d tagoj',
+            M : 'monato',
+            MM : '%d monatoj',
+            y : 'jaro',
+            yy : '%d jaroj'
+        },
+        ordinal : '%da',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/es.js b/resources/lib/moment/locale/es.js
new file mode 100644 (file)
index 0000000..04b83a8
--- /dev/null
@@ -0,0 +1,75 @@
+// moment.js locale configuration
+// locale : spanish (es)
+// author : Julio Napurí : https://github.com/julionc
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),
+        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
+
+    return moment.defineLocale('es', {
+        months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+        monthsShort : function (m, format) {
+            if (/-MMM-/.test(format)) {
+                return monthsShort[m.month()];
+            } else {
+                return monthsShortDot[m.month()];
+            }
+        },
+        weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+        weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+        weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'),
+        longDateFormat : {
+            LT : 'H:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D [de] MMMM [de] YYYY',
+            LLL : 'D [de] MMMM [de] YYYY LT',
+            LLLL : 'dddd, D [de] MMMM [de] YYYY LT'
+        },
+        calendar : {
+            sameDay : function () {
+                return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            nextDay : function () {
+                return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            nextWeek : function () {
+                return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            lastDay : function () {
+                return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            lastWeek : function () {
+                return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'en %s',
+            past : 'hace %s',
+            s : 'unos segundos',
+            m : 'un minuto',
+            mm : '%d minutos',
+            h : 'una hora',
+            hh : '%d horas',
+            d : 'un día',
+            dd : '%d días',
+            M : 'un mes',
+            MM : '%d meses',
+            y : 'un año',
+            yy : '%d años'
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/et.js b/resources/lib/moment/locale/et.js
new file mode 100644 (file)
index 0000000..242ee16
--- /dev/null
@@ -0,0 +1,76 @@
+// moment.js locale configuration
+// locale : estonian (et)
+// author : Henry Kehlmann : https://github.com/madhenry
+// improvements : Illimar Tambek : https://github.com/ragulka
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
+        var format = {
+            's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
+            'm' : ['ühe minuti', 'üks minut'],
+            'mm': [number + ' minuti', number + ' minutit'],
+            'h' : ['ühe tunni', 'tund aega', 'üks tund'],
+            'hh': [number + ' tunni', number + ' tundi'],
+            'd' : ['ühe päeva', 'üks päev'],
+            'M' : ['kuu aja', 'kuu aega', 'üks kuu'],
+            'MM': [number + ' kuu', number + ' kuud'],
+            'y' : ['ühe aasta', 'aasta', 'üks aasta'],
+            'yy': [number + ' aasta', number + ' aastat']
+        };
+        if (withoutSuffix) {
+            return format[key][2] ? format[key][2] : format[key][1];
+        }
+        return isFuture ? format[key][0] : format[key][1];
+    }
+
+    return moment.defineLocale('et', {
+        months        : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),
+        monthsShort   : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
+        weekdays      : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),
+        weekdaysShort : 'P_E_T_K_N_R_L'.split('_'),
+        weekdaysMin   : 'P_E_T_K_N_R_L'.split('_'),
+        longDateFormat : {
+            LT   : 'H:mm',
+            L    : 'DD.MM.YYYY',
+            LL   : 'D. MMMM YYYY',
+            LLL  : 'D. MMMM YYYY LT',
+            LLLL : 'dddd, D. MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay  : '[Täna,] LT',
+            nextDay  : '[Homme,] LT',
+            nextWeek : '[Järgmine] dddd LT',
+            lastDay  : '[Eile,] LT',
+            lastWeek : '[Eelmine] dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s pärast',
+            past   : '%s tagasi',
+            s      : processRelativeTime,
+            m      : processRelativeTime,
+            mm     : processRelativeTime,
+            h      : processRelativeTime,
+            hh     : processRelativeTime,
+            d      : processRelativeTime,
+            dd     : '%d päeva',
+            M      : processRelativeTime,
+            MM     : processRelativeTime,
+            y      : processRelativeTime,
+            yy     : processRelativeTime
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/eu.js b/resources/lib/moment/locale/eu.js
new file mode 100644 (file)
index 0000000..8fb89b4
--- /dev/null
@@ -0,0 +1,60 @@
+// moment.js locale configuration
+// locale : euskara (eu)
+// author : Eneko Illarramendi : https://github.com/eillarra
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('eu', {
+        months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),
+        monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),
+        weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),
+        weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'),
+        weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'YYYY-MM-DD',
+            LL : 'YYYY[ko] MMMM[ren] D[a]',
+            LLL : 'YYYY[ko] MMMM[ren] D[a] LT',
+            LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT',
+            l : 'YYYY-M-D',
+            ll : 'YYYY[ko] MMM D[a]',
+            lll : 'YYYY[ko] MMM D[a] LT',
+            llll : 'ddd, YYYY[ko] MMM D[a] LT'
+        },
+        calendar : {
+            sameDay : '[gaur] LT[etan]',
+            nextDay : '[bihar] LT[etan]',
+            nextWeek : 'dddd LT[etan]',
+            lastDay : '[atzo] LT[etan]',
+            lastWeek : '[aurreko] dddd LT[etan]',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s barru',
+            past : 'duela %s',
+            s : 'segundo batzuk',
+            m : 'minutu bat',
+            mm : '%d minutu',
+            h : 'ordu bat',
+            hh : '%d ordu',
+            d : 'egun bat',
+            dd : '%d egun',
+            M : 'hilabete bat',
+            MM : '%d hilabete',
+            y : 'urte bat',
+            yy : '%d urte'
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/fa.js b/resources/lib/moment/locale/fa.js
new file mode 100644 (file)
index 0000000..b1151bd
--- /dev/null
@@ -0,0 +1,97 @@
+// moment.js locale configuration
+// locale : Persian (fa)
+// author : Ebrahim Byagowi : https://github.com/ebraminio
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '۱',
+        '2': '۲',
+        '3': '۳',
+        '4': '۴',
+        '5': '۵',
+        '6': '۶',
+        '7': '۷',
+        '8': '۸',
+        '9': '۹',
+        '0': '۰'
+    }, numberMap = {
+        '۱': '1',
+        '۲': '2',
+        '۳': '3',
+        '۴': '4',
+        '۵': '5',
+        '۶': '6',
+        '۷': '7',
+        '۸': '8',
+        '۹': '9',
+        '۰': '0'
+    };
+
+    return moment.defineLocale('fa', {
+        months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+        monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+        weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+        weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+        weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return 'قبل از ظهر';
+            } else {
+                return 'بعد از ظهر';
+            }
+        },
+        calendar : {
+            sameDay : '[امروز ساعت] LT',
+            nextDay : '[فردا ساعت] LT',
+            nextWeek : 'dddd [ساعت] LT',
+            lastDay : '[دیروز ساعت] LT',
+            lastWeek : 'dddd [پیش] [ساعت] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'در %s',
+            past : '%s پیش',
+            s : 'چندین ثانیه',
+            m : 'یک دقیقه',
+            mm : '%d دقیقه',
+            h : 'یک ساعت',
+            hh : '%d ساعت',
+            d : 'یک روز',
+            dd : '%d روز',
+            M : 'یک ماه',
+            MM : '%d ماه',
+            y : 'یک سال',
+            yy : '%d سال'
+        },
+        preparse: function (string) {
+            return string.replace(/[۰-۹]/g, function (match) {
+                return numberMap[match];
+            }).replace(/،/g, ',');
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            }).replace(/,/g, '،');
+        },
+        ordinal : '%dم',
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12 // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/fi.js b/resources/lib/moment/locale/fi.js
new file mode 100644 (file)
index 0000000..1fedcab
--- /dev/null
@@ -0,0 +1,105 @@
+// moment.js locale configuration
+// locale : finnish (fi)
+// author : Tarmo Aidantausta : https://github.com/bleadof
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
+        numbersFuture = [
+            'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
+            numbersPast[7], numbersPast[8], numbersPast[9]
+        ];
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = '';
+        switch (key) {
+        case 's':
+            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
+        case 'm':
+            return isFuture ? 'minuutin' : 'minuutti';
+        case 'mm':
+            result = isFuture ? 'minuutin' : 'minuuttia';
+            break;
+        case 'h':
+            return isFuture ? 'tunnin' : 'tunti';
+        case 'hh':
+            result = isFuture ? 'tunnin' : 'tuntia';
+            break;
+        case 'd':
+            return isFuture ? 'päivän' : 'päivä';
+        case 'dd':
+            result = isFuture ? 'päivän' : 'päivää';
+            break;
+        case 'M':
+            return isFuture ? 'kuukauden' : 'kuukausi';
+        case 'MM':
+            result = isFuture ? 'kuukauden' : 'kuukautta';
+            break;
+        case 'y':
+            return isFuture ? 'vuoden' : 'vuosi';
+        case 'yy':
+            result = isFuture ? 'vuoden' : 'vuotta';
+            break;
+        }
+        result = verbalNumber(number, isFuture) + ' ' + result;
+        return result;
+    }
+
+    function verbalNumber(number, isFuture) {
+        return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;
+    }
+
+    return moment.defineLocale('fi', {
+        months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),
+        monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),
+        weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),
+        weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'),
+        weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'),
+        longDateFormat : {
+            LT : 'HH.mm',
+            L : 'DD.MM.YYYY',
+            LL : 'Do MMMM[ta] YYYY',
+            LLL : 'Do MMMM[ta] YYYY, [klo] LT',
+            LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT',
+            l : 'D.M.YYYY',
+            ll : 'Do MMM YYYY',
+            lll : 'Do MMM YYYY, [klo] LT',
+            llll : 'ddd, Do MMM YYYY, [klo] LT'
+        },
+        calendar : {
+            sameDay : '[tänään] [klo] LT',
+            nextDay : '[huomenna] [klo] LT',
+            nextWeek : 'dddd [klo] LT',
+            lastDay : '[eilen] [klo] LT',
+            lastWeek : '[viime] dddd[na] [klo] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s päästä',
+            past : '%s sitten',
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/fo.js b/resources/lib/moment/locale/fo.js
new file mode 100644 (file)
index 0000000..a27f9da
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js locale configuration
+// locale : faroese (fo)
+// author : Ragnar Johannesen : https://github.com/ragnar123
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('fo', {
+        months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+        monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+        weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),
+        weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
+        weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D. MMMM, YYYY LT'
+        },
+        calendar : {
+            sameDay : '[Í dag kl.] LT',
+            nextDay : '[Í morgin kl.] LT',
+            nextWeek : 'dddd [kl.] LT',
+            lastDay : '[Í gjár kl.] LT',
+            lastWeek : '[síðstu] dddd [kl] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'um %s',
+            past : '%s síðani',
+            s : 'fá sekund',
+            m : 'ein minutt',
+            mm : '%d minuttir',
+            h : 'ein tími',
+            hh : '%d tímar',
+            d : 'ein dagur',
+            dd : '%d dagar',
+            M : 'ein mánaði',
+            MM : '%d mánaðir',
+            y : 'eitt ár',
+            yy : '%d ár'
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/fr-ca.js b/resources/lib/moment/locale/fr-ca.js
new file mode 100644 (file)
index 0000000..c0f1bdc
--- /dev/null
@@ -0,0 +1,54 @@
+// moment.js locale configuration
+// locale : canadian french (fr-ca)
+// author : Jonathan Abourbih : https://github.com/jonbca
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('fr-ca', {
+        months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+        monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+        weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+        weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+        weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'YYYY-MM-DD',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[Aujourd\'hui à] LT',
+            nextDay: '[Demain à] LT',
+            nextWeek: 'dddd [à] LT',
+            lastDay: '[Hier à] LT',
+            lastWeek: 'dddd [dernier à] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'dans %s',
+            past : 'il y a %s',
+            s : 'quelques secondes',
+            m : 'une minute',
+            mm : '%d minutes',
+            h : 'une heure',
+            hh : '%d heures',
+            d : 'un jour',
+            dd : '%d jours',
+            M : 'un mois',
+            MM : '%d mois',
+            y : 'un an',
+            yy : '%d ans'
+        },
+        ordinal : function (number) {
+            return number + (number === 1 ? 'er' : '');
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/fr.js b/resources/lib/moment/locale/fr.js
new file mode 100644 (file)
index 0000000..f217ff1
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js locale configuration
+// locale : french (fr)
+// author : John Fischer : https://github.com/jfroffice
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('fr', {
+        months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+        monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+        weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+        weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+        weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[Aujourd\'hui à] LT',
+            nextDay: '[Demain à] LT',
+            nextWeek: 'dddd [à] LT',
+            lastDay: '[Hier à] LT',
+            lastWeek: 'dddd [dernier à] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'dans %s',
+            past : 'il y a %s',
+            s : 'quelques secondes',
+            m : 'une minute',
+            mm : '%d minutes',
+            h : 'une heure',
+            hh : '%d heures',
+            d : 'un jour',
+            dd : '%d jours',
+            M : 'un mois',
+            MM : '%d mois',
+            y : 'un an',
+            yy : '%d ans'
+        },
+        ordinal : function (number) {
+            return number + (number === 1 ? 'er' : '');
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/gl.js b/resources/lib/moment/locale/gl.js
new file mode 100644 (file)
index 0000000..ac63862
--- /dev/null
@@ -0,0 +1,71 @@
+// moment.js locale configuration
+// locale : galician (gl)
+// author : Juan G. Hurtado : https://github.com/juanghurtado
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('gl', {
+        months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'),
+        monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'),
+        weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'),
+        weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'),
+        weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'),
+        longDateFormat : {
+            LT : 'H:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : function () {
+                return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+            },
+            nextDay : function () {
+                return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+            },
+            nextWeek : function () {
+                return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+            },
+            lastDay : function () {
+                return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
+            },
+            lastWeek : function () {
+                return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : function (str) {
+                if (str === 'uns segundos') {
+                    return 'nuns segundos';
+                }
+                return 'en ' + str;
+            },
+            past : 'hai %s',
+            s : 'uns segundos',
+            m : 'un minuto',
+            mm : '%d minutos',
+            h : 'unha hora',
+            hh : '%d horas',
+            d : 'un día',
+            dd : '%d días',
+            M : 'un mes',
+            MM : '%d meses',
+            y : 'un ano',
+            yy : '%d anos'
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/he.js b/resources/lib/moment/locale/he.js
new file mode 100644 (file)
index 0000000..06f954f
--- /dev/null
@@ -0,0 +1,77 @@
+// moment.js locale configuration
+// locale : Hebrew (he)
+// author : Tomer Cohen : https://github.com/tomer
+// author : Moshe Simantov : https://github.com/DevelopmentIL
+// author : Tal Ater : https://github.com/TalAter
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('he', {
+        months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
+        monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
+        weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
+        weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
+        weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D [ב]MMMM YYYY',
+            LLL : 'D [ב]MMMM YYYY LT',
+            LLLL : 'dddd, D [ב]MMMM YYYY LT',
+            l : 'D/M/YYYY',
+            ll : 'D MMM YYYY',
+            lll : 'D MMM YYYY LT',
+            llll : 'ddd, D MMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[היום ב־]LT',
+            nextDay : '[מחר ב־]LT',
+            nextWeek : 'dddd [בשעה] LT',
+            lastDay : '[אתמול ב־]LT',
+            lastWeek : '[ביום] dddd [האחרון בשעה] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'בעוד %s',
+            past : 'לפני %s',
+            s : 'מספר שניות',
+            m : 'דקה',
+            mm : '%d דקות',
+            h : 'שעה',
+            hh : function (number) {
+                if (number === 2) {
+                    return 'שעתיים';
+                }
+                return number + ' שעות';
+            },
+            d : 'יום',
+            dd : function (number) {
+                if (number === 2) {
+                    return 'יומיים';
+                }
+                return number + ' ימים';
+            },
+            M : 'חודש',
+            MM : function (number) {
+                if (number === 2) {
+                    return 'חודשיים';
+                }
+                return number + ' חודשים';
+            },
+            y : 'שנה',
+            yy : function (number) {
+                if (number === 2) {
+                    return 'שנתיים';
+                }
+                return number + ' שנים';
+            }
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/hi.js b/resources/lib/moment/locale/hi.js
new file mode 100644 (file)
index 0000000..4e64560
--- /dev/null
@@ -0,0 +1,105 @@
+// moment.js locale configuration
+// locale : hindi (hi)
+// author : Mayank Singhal : https://github.com/mayanksinghal
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '१',
+        '2': '२',
+        '3': '३',
+        '4': '४',
+        '5': '५',
+        '6': '६',
+        '7': '७',
+        '8': '८',
+        '9': '९',
+        '0': '०'
+    },
+    numberMap = {
+        '१': '1',
+        '२': '2',
+        '३': '3',
+        '४': '4',
+        '५': '5',
+        '६': '6',
+        '७': '7',
+        '८': '8',
+        '९': '9',
+        '०': '0'
+    };
+
+    return moment.defineLocale('hi', {
+        months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),
+        monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
+        weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+        weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
+        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
+        longDateFormat : {
+            LT : 'A h:mm बजे',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY, LT',
+            LLLL : 'dddd, D MMMM YYYY, LT'
+        },
+        calendar : {
+            sameDay : '[आज] LT',
+            nextDay : '[कल] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[कल] LT',
+            lastWeek : '[पिछले] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s में',
+            past : '%s पहले',
+            s : 'कुछ ही क्षण',
+            m : 'एक मिनट',
+            mm : '%d मिनट',
+            h : 'एक घंटा',
+            hh : '%d घंटे',
+            d : 'एक दिन',
+            dd : '%d दिन',
+            M : 'एक महीने',
+            MM : '%d महीने',
+            y : 'एक वर्ष',
+            yy : '%d वर्ष'
+        },
+        preparse: function (string) {
+            return string.replace(/[१२३४५६७८९०]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        // Hindi notation for meridiems are quite fuzzy in practice. While there exists
+        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'रात';
+            } else if (hour < 10) {
+                return 'सुबह';
+            } else if (hour < 17) {
+                return 'दोपहर';
+            } else if (hour < 20) {
+                return 'शाम';
+            } else {
+                return 'रात';
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/hr.js b/resources/lib/moment/locale/hr.js
new file mode 100644 (file)
index 0000000..9e3f6fa
--- /dev/null
@@ -0,0 +1,139 @@
+// moment.js locale configuration
+// locale : hrvatski (hr)
+// author : Bojan Marković : https://github.com/bmarkovic
+
+// based on (sl) translation by Robert Sedovšek
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function translate(number, withoutSuffix, key) {
+        var result = number + ' ';
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minuta';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'jedan sat' : 'jednog sata';
+        case 'hh':
+            if (number === 1) {
+                result += 'sat';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'sata';
+            } else {
+                result += 'sati';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dana';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mjesec';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'mjeseca';
+            } else {
+                result += 'mjeseci';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'godina';
+            } else if (number === 2 || number === 3 || number === 4) {
+                result += 'godine';
+            } else {
+                result += 'godina';
+            }
+            return result;
+        }
+    }
+
+    return moment.defineLocale('hr', {
+        months : 'sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'),
+        monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
+        weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+        weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+        weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+        longDateFormat : {
+            LT : 'H:mm',
+            L : 'DD. MM. YYYY',
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY LT',
+            LLLL : 'dddd, D. MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay  : '[danas u] LT',
+            nextDay  : '[sutra u] LT',
+
+            nextWeek : function () {
+                switch (this.day()) {
+                case 0:
+                    return '[u] [nedjelju] [u] LT';
+                case 3:
+                    return '[u] [srijedu] [u] LT';
+                case 6:
+                    return '[u] [subotu] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[u] dddd [u] LT';
+                }
+            },
+            lastDay  : '[jučer u] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                    return '[prošlu] dddd [u] LT';
+                case 6:
+                    return '[prošle] [subote] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prošli] dddd [u] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'za %s',
+            past   : 'prije %s',
+            s      : 'par sekundi',
+            m      : translate,
+            mm     : translate,
+            h      : translate,
+            hh     : translate,
+            d      : 'dan',
+            dd     : translate,
+            M      : 'mjesec',
+            MM     : translate,
+            y      : 'godinu',
+            yy     : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/hu.js b/resources/lib/moment/locale/hu.js
new file mode 100644 (file)
index 0000000..73fdb83
--- /dev/null
@@ -0,0 +1,105 @@
+// moment.js locale configuration
+// locale : hungarian (hu)
+// author : Adam Brunner : https://github.com/adambrunner
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var num = number,
+            suffix;
+
+        switch (key) {
+        case 's':
+            return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
+        case 'm':
+            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
+        case 'mm':
+            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
+        case 'h':
+            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
+        case 'hh':
+            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
+        case 'd':
+            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
+        case 'dd':
+            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
+        case 'M':
+            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+        case 'MM':
+            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+        case 'y':
+            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
+        case 'yy':
+            return num + (isFuture || withoutSuffix ? ' év' : ' éve');
+        }
+
+        return '';
+    }
+
+    function week(isFuture) {
+        return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
+    }
+
+    return moment.defineLocale('hu', {
+        months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),
+        monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),
+        weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
+        weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
+        weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),
+        longDateFormat : {
+            LT : 'H:mm',
+            L : 'YYYY.MM.DD.',
+            LL : 'YYYY. MMMM D.',
+            LLL : 'YYYY. MMMM D., LT',
+            LLLL : 'YYYY. MMMM D., dddd LT'
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 12) {
+                return isLower === true ? 'de' : 'DE';
+            } else {
+                return isLower === true ? 'du' : 'DU';
+            }
+        },
+        calendar : {
+            sameDay : '[ma] LT[-kor]',
+            nextDay : '[holnap] LT[-kor]',
+            nextWeek : function () {
+                return week.call(this, true);
+            },
+            lastDay : '[tegnap] LT[-kor]',
+            lastWeek : function () {
+                return week.call(this, false);
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s múlva',
+            past : '%s',
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/hy-am.js b/resources/lib/moment/locale/hy-am.js
new file mode 100644 (file)
index 0000000..affcd7e
--- /dev/null
@@ -0,0 +1,112 @@
+// moment.js locale configuration
+// locale : Armenian (hy-am)
+// author : Armendarabyan : https://github.com/armendarabyan
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_'),
+            'accusative': 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_')
+        },
+
+        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function monthsShortCaseReplace(m, format) {
+        var monthsShort = 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_');
+
+        return monthsShort[m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_');
+
+        return weekdays[m.day()];
+    }
+
+    return moment.defineLocale('hy-am', {
+        months : monthsCaseReplace,
+        monthsShort : monthsShortCaseReplace,
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+        weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY թ.',
+            LLL : 'D MMMM YYYY թ., LT',
+            LLLL : 'dddd, D MMMM YYYY թ., LT'
+        },
+        calendar : {
+            sameDay: '[այսօր] LT',
+            nextDay: '[վաղը] LT',
+            lastDay: '[երեկ] LT',
+            nextWeek: function () {
+                return 'dddd [օրը ժամը] LT';
+            },
+            lastWeek: function () {
+                return '[անցած] dddd [օրը ժամը] LT';
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : '%s հետո',
+            past : '%s առաջ',
+            s : 'մի քանի վայրկյան',
+            m : 'րոպե',
+            mm : '%d րոպե',
+            h : 'ժամ',
+            hh : '%d ժամ',
+            d : 'օր',
+            dd : '%d օր',
+            M : 'ամիս',
+            MM : '%d ամիս',
+            y : 'տարի',
+            yy : '%d տարի'
+        },
+
+        meridiem : function (hour) {
+            if (hour < 4) {
+                return 'գիշերվա';
+            } else if (hour < 12) {
+                return 'առավոտվա';
+            } else if (hour < 17) {
+                return 'ցերեկվա';
+            } else {
+                return 'երեկոյան';
+            }
+        },
+
+        ordinal: function (number, period) {
+            switch (period) {
+            case 'DDD':
+            case 'w':
+            case 'W':
+            case 'DDDo':
+                if (number === 1) {
+                    return number + '-ին';
+                }
+                return number + '-րդ';
+            default:
+                return number;
+            }
+        },
+
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/id.js b/resources/lib/moment/locale/id.js
new file mode 100644 (file)
index 0000000..143426a
--- /dev/null
@@ -0,0 +1,67 @@
+// moment.js locale configuration
+// locale : Bahasa Indonesia (id)
+// author : Mohammad Satrio Utomo : https://github.com/tyok
+// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('id', {
+        months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),
+        monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'),
+        weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
+        weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
+        weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
+        longDateFormat : {
+            LT : 'HH.mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY [pukul] LT',
+            LLLL : 'dddd, D MMMM YYYY [pukul] LT'
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'pagi';
+            } else if (hours < 15) {
+                return 'siang';
+            } else if (hours < 19) {
+                return 'sore';
+            } else {
+                return 'malam';
+            }
+        },
+        calendar : {
+            sameDay : '[Hari ini pukul] LT',
+            nextDay : '[Besok pukul] LT',
+            nextWeek : 'dddd [pukul] LT',
+            lastDay : '[Kemarin pukul] LT',
+            lastWeek : 'dddd [lalu pukul] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'dalam %s',
+            past : '%s yang lalu',
+            s : 'beberapa detik',
+            m : 'semenit',
+            mm : '%d menit',
+            h : 'sejam',
+            hh : '%d jam',
+            d : 'sehari',
+            dd : '%d hari',
+            M : 'sebulan',
+            MM : '%d bulan',
+            y : 'setahun',
+            yy : '%d tahun'
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/is.js b/resources/lib/moment/locale/is.js
new file mode 100644 (file)
index 0000000..479f82d
--- /dev/null
@@ -0,0 +1,124 @@
+// moment.js locale configuration
+// locale : icelandic (is)
+// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function plural(n) {
+        if (n % 100 === 11) {
+            return true;
+        } else if (n % 10 === 1) {
+            return false;
+        }
+        return true;
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + ' ';
+        switch (key) {
+        case 's':
+            return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
+        case 'm':
+            return withoutSuffix ? 'mínúta' : 'mínútu';
+        case 'mm':
+            if (plural(number)) {
+                return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
+            } else if (withoutSuffix) {
+                return result + 'mínúta';
+            }
+            return result + 'mínútu';
+        case 'hh':
+            if (plural(number)) {
+                return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
+            }
+            return result + 'klukkustund';
+        case 'd':
+            if (withoutSuffix) {
+                return 'dagur';
+            }
+            return isFuture ? 'dag' : 'degi';
+        case 'dd':
+            if (plural(number)) {
+                if (withoutSuffix) {
+                    return result + 'dagar';
+                }
+                return result + (isFuture ? 'daga' : 'dögum');
+            } else if (withoutSuffix) {
+                return result + 'dagur';
+            }
+            return result + (isFuture ? 'dag' : 'degi');
+        case 'M':
+            if (withoutSuffix) {
+                return 'mánuður';
+            }
+            return isFuture ? 'mánuð' : 'mánuði';
+        case 'MM':
+            if (plural(number)) {
+                if (withoutSuffix) {
+                    return result + 'mánuðir';
+                }
+                return result + (isFuture ? 'mánuði' : 'mánuðum');
+            } else if (withoutSuffix) {
+                return result + 'mánuður';
+            }
+            return result + (isFuture ? 'mánuð' : 'mánuði');
+        case 'y':
+            return withoutSuffix || isFuture ? 'ár' : 'ári';
+        case 'yy':
+            if (plural(number)) {
+                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
+            }
+            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
+        }
+    }
+
+    return moment.defineLocale('is', {
+        months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),
+        monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
+        weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),
+        weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
+        weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
+        longDateFormat : {
+            LT : 'H:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY [kl.] LT',
+            LLLL : 'dddd, D. MMMM YYYY [kl.] LT'
+        },
+        calendar : {
+            sameDay : '[í dag kl.] LT',
+            nextDay : '[á morgun kl.] LT',
+            nextWeek : 'dddd [kl.] LT',
+            lastDay : '[í gær kl.] LT',
+            lastWeek : '[síðasta] dddd [kl.] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'eftir %s',
+            past : 'fyrir %s síðan',
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : 'klukkustund',
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/it.js b/resources/lib/moment/locale/it.js
new file mode 100644 (file)
index 0000000..6695390
--- /dev/null
@@ -0,0 +1,59 @@
+// moment.js locale configuration
+// locale : italian (it)
+// author : Lorenzo : https://github.com/aliem
+// author: Mattia Larentis: https://github.com/nostalgiaz
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('it', {
+        months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
+        monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
+        weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'),
+        weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'),
+        weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[Oggi alle] LT',
+            nextDay: '[Domani alle] LT',
+            nextWeek: 'dddd [alle] LT',
+            lastDay: '[Ieri alle] LT',
+            lastWeek: '[lo scorso] dddd [alle] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : function (s) {
+                return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s;
+            },
+            past : '%s fa',
+            s : 'alcuni secondi',
+            m : 'un minuto',
+            mm : '%d minuti',
+            h : 'un\'ora',
+            hh : '%d ore',
+            d : 'un giorno',
+            dd : '%d giorni',
+            M : 'un mese',
+            MM : '%d mesi',
+            y : 'un anno',
+            yy : '%d anni'
+        },
+        ordinal: '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ja.js b/resources/lib/moment/locale/ja.js
new file mode 100644 (file)
index 0000000..f14fa4e
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js locale configuration
+// locale : japanese (ja)
+// author : LI Long : https://github.com/baryon
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('ja', {
+        months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+        monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+        weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
+        weekdaysShort : '日_月_火_水_木_金_土'.split('_'),
+        weekdaysMin : '日_月_火_水_木_金_土'.split('_'),
+        longDateFormat : {
+            LT : 'Ah時m分',
+            L : 'YYYY/MM/DD',
+            LL : 'YYYY年M月D日',
+            LLL : 'YYYY年M月D日LT',
+            LLLL : 'YYYY年M月D日LT dddd'
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return '午前';
+            } else {
+                return '午後';
+            }
+        },
+        calendar : {
+            sameDay : '[今日] LT',
+            nextDay : '[明日] LT',
+            nextWeek : '[来週]dddd LT',
+            lastDay : '[昨日] LT',
+            lastWeek : '[前週]dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s後',
+            past : '%s前',
+            s : '数秒',
+            m : '1分',
+            mm : '%d分',
+            h : '1時間',
+            hh : '%d時間',
+            d : '1日',
+            dd : '%d日',
+            M : '1ヶ月',
+            MM : '%dヶ月',
+            y : '1年',
+            yy : '%d年'
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ka.js b/resources/lib/moment/locale/ka.js
new file mode 100644 (file)
index 0000000..73eb9c7
--- /dev/null
@@ -0,0 +1,107 @@
+// moment.js locale configuration
+// locale : Georgian (ka)
+// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
+            'accusative': 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
+        },
+
+        nounCase = (/D[oD] *MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = {
+            'nominative': 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
+            'accusative': 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_')
+        },
+
+        nounCase = (/(წინა|შემდეგ)/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return weekdays[nounCase][m.day()];
+    }
+
+    return moment.defineLocale('ka', {
+        months : monthsCaseReplace,
+        monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
+        weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
+        longDateFormat : {
+            LT : 'h:mm A',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[დღეს] LT[-ზე]',
+            nextDay : '[ხვალ] LT[-ზე]',
+            lastDay : '[გუშინ] LT[-ზე]',
+            nextWeek : '[შემდეგ] dddd LT[-ზე]',
+            lastWeek : '[წინა] dddd LT-ზე',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : function (s) {
+                return (/(წამი|წუთი|საათი|წელი)/).test(s) ?
+                    s.replace(/ი$/, 'ში') :
+                    s + 'ში';
+            },
+            past : function (s) {
+                if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {
+                    return s.replace(/(ი|ე)$/, 'ის წინ');
+                }
+                if ((/წელი/).test(s)) {
+                    return s.replace(/წელი$/, 'წლის წინ');
+                }
+            },
+            s : 'რამდენიმე წამი',
+            m : 'წუთი',
+            mm : '%d წუთი',
+            h : 'საათი',
+            hh : '%d საათი',
+            d : 'დღე',
+            dd : '%d დღე',
+            M : 'თვე',
+            MM : '%d თვე',
+            y : 'წელი',
+            yy : '%d წელი'
+        },
+        ordinal : function (number) {
+            if (number === 0) {
+                return number;
+            }
+
+            if (number === 1) {
+                return number + '-ლი';
+            }
+
+            if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
+                return 'მე-' + number;
+            }
+
+            return number + '-ე';
+        },
+        week : {
+            dow : 1,
+            doy : 7
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/km.js b/resources/lib/moment/locale/km.js
new file mode 100644 (file)
index 0000000..9ba4888
--- /dev/null
@@ -0,0 +1,55 @@
+// moment.js locale configuration
+// locale : khmer (km)
+// author : Kruy Vanna : https://github.com/kruyvanna
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('km', {
+        months: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+        monthsShort: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+        weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+        weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+        weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+        longDateFormat: {
+            LT: 'HH:mm',
+            L: 'DD/MM/YYYY',
+            LL: 'D MMMM YYYY',
+            LLL: 'D MMMM YYYY LT',
+            LLLL: 'dddd, D MMMM YYYY LT'
+        },
+        calendar: {
+            sameDay: '[ថ្ងៃនៈ ម៉ោង] LT',
+            nextDay: '[ស្អែក ម៉ោង] LT',
+            nextWeek: 'dddd [ម៉ោង] LT',
+            lastDay: '[ម្សិលមិញ ម៉ោង] LT',
+            lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
+            sameElse: 'L'
+        },
+        relativeTime: {
+            future: '%sទៀត',
+            past: '%sមុន',
+            s: 'ប៉ុន្មានវិនាទី',
+            m: 'មួយនាទី',
+            mm: '%d នាទី',
+            h: 'មួយម៉ោង',
+            hh: '%d ម៉ោង',
+            d: 'មួយថ្ងៃ',
+            dd: '%d ថ្ងៃ',
+            M: 'មួយខែ',
+            MM: '%d ខែ',
+            y: 'មួយឆ្នាំ',
+            yy: '%d ឆ្នាំ'
+        },
+        week: {
+            dow: 1, // Monday is the first day of the week.
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ko.js b/resources/lib/moment/locale/ko.js
new file mode 100644 (file)
index 0000000..57017f5
--- /dev/null
@@ -0,0 +1,63 @@
+// moment.js locale configuration
+// locale : korean (ko)
+//
+// authors
+//
+// - Kyungwook, Park : https://github.com/kyungw00k
+// - Jeeeyul Lee <jeeeyul@gmail.com>
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('ko', {
+        months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+        monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+        weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
+        weekdaysShort : '일_월_화_수_목_금_토'.split('_'),
+        weekdaysMin : '일_월_화_수_목_금_토'.split('_'),
+        longDateFormat : {
+            LT : 'A h시 m분',
+            L : 'YYYY.MM.DD',
+            LL : 'YYYY년 MMMM D일',
+            LLL : 'YYYY년 MMMM D일 LT',
+            LLLL : 'YYYY년 MMMM D일 dddd LT'
+        },
+        meridiem : function (hour, minute, isUpper) {
+            return hour < 12 ? '오전' : '오후';
+        },
+        calendar : {
+            sameDay : '오늘 LT',
+            nextDay : '내일 LT',
+            nextWeek : 'dddd LT',
+            lastDay : '어제 LT',
+            lastWeek : '지난주 dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s 후',
+            past : '%s 전',
+            s : '몇초',
+            ss : '%d초',
+            m : '일분',
+            mm : '%d분',
+            h : '한시간',
+            hh : '%d시간',
+            d : '하루',
+            dd : '%d일',
+            M : '한달',
+            MM : '%d달',
+            y : '일년',
+            yy : '%d년'
+        },
+        ordinal : '%d일',
+        meridiemParse : /(오전|오후)/,
+        isPM : function (token) {
+            return token === '오후';
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/lb.js b/resources/lib/moment/locale/lb.js
new file mode 100644 (file)
index 0000000..14fab97
--- /dev/null
@@ -0,0 +1,137 @@
+// moment.js locale configuration
+// locale : Luxembourgish (lb)
+// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz
+
+// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the
+// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday'
+// and 'eifelerRegelAppliesToNumber' methods are meant for
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
+        var format = {
+            'm': ['eng Minutt', 'enger Minutt'],
+            'h': ['eng Stonn', 'enger Stonn'],
+            'd': ['een Dag', 'engem Dag'],
+            'M': ['ee Mount', 'engem Mount'],
+            'y': ['ee Joer', 'engem Joer']
+        };
+        return withoutSuffix ? format[key][0] : format[key][1];
+    }
+
+    function processFutureTime(string) {
+        var number = string.substr(0, string.indexOf(' '));
+        if (eifelerRegelAppliesToNumber(number)) {
+            return 'a ' + string;
+        }
+        return 'an ' + string;
+    }
+
+    function processPastTime(string) {
+        var number = string.substr(0, string.indexOf(' '));
+        if (eifelerRegelAppliesToNumber(number)) {
+            return 'viru ' + string;
+        }
+        return 'virun ' + string;
+    }
+
+    /**
+     * Returns true if the word before the given number loses the '-n' ending.
+     * e.g. 'an 10 Deeg' but 'a 5 Deeg'
+     *
+     * @param number {integer}
+     * @returns {boolean}
+     */
+    function eifelerRegelAppliesToNumber(number) {
+        number = parseInt(number, 10);
+        if (isNaN(number)) {
+            return false;
+        }
+        if (number < 0) {
+            // Negative Number --> always true
+            return true;
+        } else if (number < 10) {
+            // Only 1 digit
+            if (4 <= number && number <= 7) {
+                return true;
+            }
+            return false;
+        } else if (number < 100) {
+            // 2 digits
+            var lastDigit = number % 10, firstDigit = number / 10;
+            if (lastDigit === 0) {
+                return eifelerRegelAppliesToNumber(firstDigit);
+            }
+            return eifelerRegelAppliesToNumber(lastDigit);
+        } else if (number < 10000) {
+            // 3 or 4 digits --> recursively check first digit
+            while (number >= 10) {
+                number = number / 10;
+            }
+            return eifelerRegelAppliesToNumber(number);
+        } else {
+            // Anything larger than 4 digits: recursively check first n-3 digits
+            number = number / 1000;
+            return eifelerRegelAppliesToNumber(number);
+        }
+    }
+
+    return moment.defineLocale('lb', {
+        months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+        monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+        weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),
+        weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
+        weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
+        longDateFormat: {
+            LT: 'H:mm [Auer]',
+            L: 'DD.MM.YYYY',
+            LL: 'D. MMMM YYYY',
+            LLL: 'D. MMMM YYYY LT',
+            LLLL: 'dddd, D. MMMM YYYY LT'
+        },
+        calendar: {
+            sameDay: '[Haut um] LT',
+            sameElse: 'L',
+            nextDay: '[Muer um] LT',
+            nextWeek: 'dddd [um] LT',
+            lastDay: '[Gëschter um] LT',
+            lastWeek: function () {
+                // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
+                switch (this.day()) {
+                    case 2:
+                    case 4:
+                        return '[Leschten] dddd [um] LT';
+                    default:
+                        return '[Leschte] dddd [um] LT';
+                }
+            }
+        },
+        relativeTime : {
+            future : processFutureTime,
+            past : processPastTime,
+            s : 'e puer Sekonnen',
+            m : processRelativeTime,
+            mm : '%d Minutten',
+            h : processRelativeTime,
+            hh : '%d Stonnen',
+            d : processRelativeTime,
+            dd : '%d Deeg',
+            M : processRelativeTime,
+            MM : '%d Méint',
+            y : processRelativeTime,
+            yy : '%d Joer'
+        },
+        ordinal: '%d.',
+        week: {
+            dow: 1, // Monday is the first day of the week.
+            doy: 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/lt.js b/resources/lib/moment/locale/lt.js
new file mode 100644 (file)
index 0000000..013f8f1
--- /dev/null
@@ -0,0 +1,118 @@
+// moment.js locale configuration
+// locale : Lithuanian (lt)
+// author : Mindaugas Mozūras : https://github.com/mmozuras
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var units = {
+        'm' : 'minutė_minutės_minutę',
+        'mm': 'minutės_minučių_minutes',
+        'h' : 'valanda_valandos_valandą',
+        'hh': 'valandos_valandų_valandas',
+        'd' : 'diena_dienos_dieną',
+        'dd': 'dienos_dienų_dienas',
+        'M' : 'mėnuo_mėnesio_mėnesį',
+        'MM': 'mėnesiai_mėnesių_mėnesius',
+        'y' : 'metai_metų_metus',
+        'yy': 'metai_metų_metus'
+    },
+    weekDays = 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_');
+
+    function translateSeconds(number, withoutSuffix, key, isFuture) {
+        if (withoutSuffix) {
+            return 'kelios sekundės';
+        } else {
+            return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
+        }
+    }
+
+    function translateSingular(number, withoutSuffix, key, isFuture) {
+        return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
+    }
+
+    function special(number) {
+        return number % 10 === 0 || (number > 10 && number < 20);
+    }
+
+    function forms(key) {
+        return units[key].split('_');
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + ' ';
+        if (number === 1) {
+            return result + translateSingular(number, withoutSuffix, key[0], isFuture);
+        } else if (withoutSuffix) {
+            return result + (special(number) ? forms(key)[1] : forms(key)[0]);
+        } else {
+            if (isFuture) {
+                return result + forms(key)[1];
+            } else {
+                return result + (special(number) ? forms(key)[1] : forms(key)[2]);
+            }
+        }
+    }
+
+    function relativeWeekDay(moment, format) {
+        var nominative = format.indexOf('dddd HH:mm') === -1,
+            weekDay = weekDays[moment.day()];
+
+        return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į';
+    }
+
+    return moment.defineLocale('lt', {
+        months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
+        monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
+        weekdays : relativeWeekDay,
+        weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
+        weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'YYYY-MM-DD',
+            LL : 'YYYY [m.] MMMM D [d.]',
+            LLL : 'YYYY [m.] MMMM D [d.], LT [val.]',
+            LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]',
+            l : 'YYYY-MM-DD',
+            ll : 'YYYY [m.] MMMM D [d.]',
+            lll : 'YYYY [m.] MMMM D [d.], LT [val.]',
+            llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]'
+        },
+        calendar : {
+            sameDay : '[Šiandien] LT',
+            nextDay : '[Rytoj] LT',
+            nextWeek : 'dddd LT',
+            lastDay : '[Vakar] LT',
+            lastWeek : '[Praėjusį] dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'po %s',
+            past : 'prieš %s',
+            s : translateSeconds,
+            m : translateSingular,
+            mm : translate,
+            h : translateSingular,
+            hh : translate,
+            d : translateSingular,
+            dd : translate,
+            M : translateSingular,
+            MM : translate,
+            y : translateSingular,
+            yy : translate
+        },
+        ordinal : function (number) {
+            return number + '-oji';
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/lv.js b/resources/lib/moment/locale/lv.js
new file mode 100644 (file)
index 0000000..7e1892e
--- /dev/null
@@ -0,0 +1,77 @@
+// moment.js locale configuration
+// locale : latvian (lv)
+// author : Kristaps Karlsons : https://github.com/skakri
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var units = {
+        'mm': 'minūti_minūtes_minūte_minūtes',
+        'hh': 'stundu_stundas_stunda_stundas',
+        'dd': 'dienu_dienas_diena_dienas',
+        'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
+        'yy': 'gadu_gadus_gads_gadi'
+    };
+
+    function format(word, number, withoutSuffix) {
+        var forms = word.split('_');
+        if (withoutSuffix) {
+            return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
+        } else {
+            return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
+        }
+    }
+
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        return number + ' ' + format(units[key], number, withoutSuffix);
+    }
+
+    return moment.defineLocale('lv', {
+        months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),
+        monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
+        weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),
+        weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'),
+        weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD.MM.YYYY',
+            LL : 'YYYY. [gada] D. MMMM',
+            LLL : 'YYYY. [gada] D. MMMM, LT',
+            LLLL : 'YYYY. [gada] D. MMMM, dddd, LT'
+        },
+        calendar : {
+            sameDay : '[Šodien pulksten] LT',
+            nextDay : '[Rīt pulksten] LT',
+            nextWeek : 'dddd [pulksten] LT',
+            lastDay : '[Vakar pulksten] LT',
+            lastWeek : '[Pagājušā] dddd [pulksten] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s vēlāk',
+            past : '%s agrāk',
+            s : 'dažas sekundes',
+            m : 'minūti',
+            mm : relativeTimeWithPlural,
+            h : 'stundu',
+            hh : relativeTimeWithPlural,
+            d : 'dienu',
+            dd : relativeTimeWithPlural,
+            M : 'mēnesi',
+            MM : relativeTimeWithPlural,
+            y : 'gadu',
+            yy : relativeTimeWithPlural
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/mk.js b/resources/lib/moment/locale/mk.js
new file mode 100644 (file)
index 0000000..94c7fc1
--- /dev/null
@@ -0,0 +1,86 @@
+// moment.js locale configuration
+// locale : macedonian (mk)
+// author : Borislav Mickov : https://github.com/B0k0
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('mk', {
+        months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),
+        monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
+        weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),
+        weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
+        weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),
+        longDateFormat : {
+            LT : 'H:mm',
+            L : 'D.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[Денес во] LT',
+            nextDay : '[Утре во] LT',
+            nextWeek : 'dddd [во] LT',
+            lastDay : '[Вчера во] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 6:
+                    return '[Во изминатата] dddd [во] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[Во изминатиот] dddd [во] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'после %s',
+            past : 'пред %s',
+            s : 'неколку секунди',
+            m : 'минута',
+            mm : '%d минути',
+            h : 'час',
+            hh : '%d часа',
+            d : 'ден',
+            dd : '%d дена',
+            M : 'месец',
+            MM : '%d месеци',
+            y : 'година',
+            yy : '%d години'
+        },
+        ordinal : function (number) {
+            var lastDigit = number % 10,
+                last2Digits = number % 100;
+            if (number === 0) {
+                return number + '-ев';
+            } else if (last2Digits === 0) {
+                return number + '-ен';
+            } else if (last2Digits > 10 && last2Digits < 20) {
+                return number + '-ти';
+            } else if (lastDigit === 1) {
+                return number + '-ви';
+            } else if (lastDigit === 2) {
+                return number + '-ри';
+            } else if (lastDigit === 7 || lastDigit === 8) {
+                return number + '-ми';
+            } else {
+                return number + '-ти';
+            }
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ml.js b/resources/lib/moment/locale/ml.js
new file mode 100644 (file)
index 0000000..ea4d949
--- /dev/null
@@ -0,0 +1,64 @@
+// moment.js locale configuration
+// locale : malayalam (ml)
+// author : Floyd Pink : https://github.com/floydpink
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('ml', {
+        months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),
+        monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),
+        weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),
+        weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
+        weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
+        longDateFormat : {
+            LT : 'A h:mm -നു',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY, LT',
+            LLLL : 'dddd, D MMMM YYYY, LT'
+        },
+        calendar : {
+            sameDay : '[ഇന്ന്] LT',
+            nextDay : '[നാളെ] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[ഇന്നലെ] LT',
+            lastWeek : '[കഴിഞ്ഞ] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s കഴിഞ്ഞ്',
+            past : '%s മുൻപ്',
+            s : 'അൽപ നിമിഷങ്ങൾ',
+            m : 'ഒരു മിനിറ്റ്',
+            mm : '%d മിനിറ്റ്',
+            h : 'ഒരു മണിക്കൂർ',
+            hh : '%d മണിക്കൂർ',
+            d : 'ഒരു ദിവസം',
+            dd : '%d ദിവസം',
+            M : 'ഒരു മാസം',
+            MM : '%d മാസം',
+            y : 'ഒരു വർഷം',
+            yy : '%d വർഷം'
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'രാത്രി';
+            } else if (hour < 12) {
+                return 'രാവിലെ';
+            } else if (hour < 17) {
+                return 'ഉച്ച കഴിഞ്ഞ്';
+            } else if (hour < 20) {
+                return 'വൈകുന്നേരം';
+            } else {
+                return 'രാത്രി';
+            }
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/mr.js b/resources/lib/moment/locale/mr.js
new file mode 100644 (file)
index 0000000..141eaf8
--- /dev/null
@@ -0,0 +1,104 @@
+// moment.js locale configuration
+// locale : Marathi (mr)
+// author : Harshad Kale : https://github.com/kalehv
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '१',
+        '2': '२',
+        '3': '३',
+        '4': '४',
+        '5': '५',
+        '6': '६',
+        '7': '७',
+        '8': '८',
+        '9': '९',
+        '0': '०'
+    },
+    numberMap = {
+        '१': '1',
+        '२': '2',
+        '३': '3',
+        '४': '4',
+        '५': '5',
+        '६': '6',
+        '७': '7',
+        '८': '8',
+        '९': '9',
+        '०': '0'
+    };
+
+    return moment.defineLocale('mr', {
+        months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),
+        monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),
+        weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+        weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
+        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
+        longDateFormat : {
+            LT : 'A h:mm वाजता',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY, LT',
+            LLLL : 'dddd, D MMMM YYYY, LT'
+        },
+        calendar : {
+            sameDay : '[आज] LT',
+            nextDay : '[उद्या] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[काल] LT',
+            lastWeek: '[मागील] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s नंतर',
+            past : '%s पूर्वी',
+            s : 'सेकंद',
+            m: 'एक मिनिट',
+            mm: '%d मिनिटे',
+            h : 'एक तास',
+            hh : '%d तास',
+            d : 'एक दिवस',
+            dd : '%d दिवस',
+            M : 'एक महिना',
+            MM : '%d महिने',
+            y : 'एक वर्ष',
+            yy : '%d वर्षे'
+        },
+        preparse: function (string) {
+            return string.replace(/[१२३४५६७८९०]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        meridiem: function (hour, minute, isLower)
+        {
+            if (hour < 4) {
+                return 'रात्री';
+            } else if (hour < 10) {
+                return 'सकाळी';
+            } else if (hour < 17) {
+                return 'दुपारी';
+            } else if (hour < 20) {
+                return 'सायंकाळी';
+            } else {
+                return 'रात्री';
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ms-my.js b/resources/lib/moment/locale/ms-my.js
new file mode 100644 (file)
index 0000000..7efcbaa
--- /dev/null
@@ -0,0 +1,66 @@
+// moment.js locale configuration
+// locale : Bahasa Malaysia (ms-MY)
+// author : Weldan Jamili : https://github.com/weldan
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('ms-my', {
+        months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+        monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+        weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+        weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+        weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+        longDateFormat : {
+            LT : 'HH.mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY [pukul] LT',
+            LLLL : 'dddd, D MMMM YYYY [pukul] LT'
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'pagi';
+            } else if (hours < 15) {
+                return 'tengahari';
+            } else if (hours < 19) {
+                return 'petang';
+            } else {
+                return 'malam';
+            }
+        },
+        calendar : {
+            sameDay : '[Hari ini pukul] LT',
+            nextDay : '[Esok pukul] LT',
+            nextWeek : 'dddd [pukul] LT',
+            lastDay : '[Kelmarin pukul] LT',
+            lastWeek : 'dddd [lepas pukul] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'dalam %s',
+            past : '%s yang lepas',
+            s : 'beberapa saat',
+            m : 'seminit',
+            mm : '%d minit',
+            h : 'sejam',
+            hh : '%d jam',
+            d : 'sehari',
+            dd : '%d hari',
+            M : 'sebulan',
+            MM : '%d bulan',
+            y : 'setahun',
+            yy : '%d tahun'
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/my.js b/resources/lib/moment/locale/my.js
new file mode 100644 (file)
index 0000000..138d101
--- /dev/null
@@ -0,0 +1,88 @@
+// moment.js locale configuration
+// locale : Burmese (my)
+// author : Squar team, mysquar.com
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '၁',
+        '2': '၂',
+        '3': '၃',
+        '4': '၄',
+        '5': '၅',
+        '6': '၆',
+        '7': '၇',
+        '8': '၈',
+        '9': '၉',
+        '0': '၀'
+    }, numberMap = {
+        '၁': '1',
+        '၂': '2',
+        '၃': '3',
+        '၄': '4',
+        '၅': '5',
+        '၆': '6',
+        '၇': '7',
+        '၈': '8',
+        '၉': '9',
+        '၀': '0'
+    };
+    return moment.defineLocale('my', {
+        months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),
+        monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
+        weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),
+        weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+        weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+        longDateFormat: {
+            LT: 'HH:mm',
+            L: 'DD/MM/YYYY',
+            LL: 'D MMMM YYYY',
+            LLL: 'D MMMM YYYY LT',
+            LLLL: 'dddd D MMMM YYYY LT'
+        },
+        calendar: {
+            sameDay: '[ယနေ.] LT [မှာ]',
+            nextDay: '[မနက်ဖြန်] LT [မှာ]',
+            nextWeek: 'dddd LT [မှာ]',
+            lastDay: '[မနေ.က] LT [မှာ]',
+            lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
+            sameElse: 'L'
+        },
+        relativeTime: {
+            future: 'လာမည့် %s မှာ',
+            past: 'လွန်ခဲ့သော %s က',
+            s: 'စက္ကန်.အနည်းငယ်',
+            m: 'တစ်မိနစ်',
+            mm: '%d မိနစ်',
+            h: 'တစ်နာရီ',
+            hh: '%d နာရီ',
+            d: 'တစ်ရက်',
+            dd: '%d ရက်',
+            M: 'တစ်လ',
+            MM: '%d လ',
+            y: 'တစ်နှစ်',
+            yy: '%d နှစ်'
+        },
+        preparse: function (string) {
+            return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        week: {
+            dow: 1, // Monday is the first day of the week.
+            doy: 4 // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/nb.js b/resources/lib/moment/locale/nb.js
new file mode 100644 (file)
index 0000000..533659d
--- /dev/null
@@ -0,0 +1,57 @@
+// moment.js locale configuration
+// locale : norwegian bokmål (nb)
+// authors : Espen Hovlandsdal : https://github.com/rexxars
+//           Sigurd Gartmann : https://github.com/sigurdga
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('nb', {
+        months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+        monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+        weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+        weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'),
+        weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+        longDateFormat : {
+            LT : 'H.mm',
+            L : 'DD.MM.YYYY',
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY [kl.] LT',
+            LLLL : 'dddd D. MMMM YYYY [kl.] LT'
+        },
+        calendar : {
+            sameDay: '[i dag kl.] LT',
+            nextDay: '[i morgen kl.] LT',
+            nextWeek: 'dddd [kl.] LT',
+            lastDay: '[i går kl.] LT',
+            lastWeek: '[forrige] dddd [kl.] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'om %s',
+            past : 'for %s siden',
+            s : 'noen sekunder',
+            m : 'ett minutt',
+            mm : '%d minutter',
+            h : 'en time',
+            hh : '%d timer',
+            d : 'en dag',
+            dd : '%d dager',
+            M : 'en måned',
+            MM : '%d måneder',
+            y : 'ett år',
+            yy : '%d år'
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ne.js b/resources/lib/moment/locale/ne.js
new file mode 100644 (file)
index 0000000..51629eb
--- /dev/null
@@ -0,0 +1,105 @@
+// moment.js locale configuration
+// locale : nepali/nepalese
+// author : suvash : https://github.com/suvash
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var symbolMap = {
+        '1': '१',
+        '2': '२',
+        '3': '३',
+        '4': '४',
+        '5': '५',
+        '6': '६',
+        '7': '७',
+        '8': '८',
+        '9': '९',
+        '0': '०'
+    },
+    numberMap = {
+        '१': '1',
+        '२': '2',
+        '३': '3',
+        '४': '4',
+        '५': '5',
+        '६': '6',
+        '७': '7',
+        '८': '8',
+        '९': '9',
+        '०': '0'
+    };
+
+    return moment.defineLocale('ne', {
+        months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),
+        monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),
+        weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),
+        weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
+        weekdaysMin : 'आइ._सो._मङ्_बु._बि._शु._श.'.split('_'),
+        longDateFormat : {
+            LT : 'Aको h:mm बजे',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY, LT',
+            LLLL : 'dddd, D MMMM YYYY, LT'
+        },
+        preparse: function (string) {
+            return string.replace(/[१२३४५६७८९०]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 3) {
+                return 'राती';
+            } else if (hour < 10) {
+                return 'बिहान';
+            } else if (hour < 15) {
+                return 'दिउँसो';
+            } else if (hour < 18) {
+                return 'बेलुका';
+            } else if (hour < 20) {
+                return 'साँझ';
+            } else {
+                return 'राती';
+            }
+        },
+        calendar : {
+            sameDay : '[आज] LT',
+            nextDay : '[भोली] LT',
+            nextWeek : '[आउँदो] dddd[,] LT',
+            lastDay : '[हिजो] LT',
+            lastWeek : '[गएको] dddd[,] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%sमा',
+            past : '%s अगाडी',
+            s : 'केही समय',
+            m : 'एक मिनेट',
+            mm : '%d मिनेट',
+            h : 'एक घण्टा',
+            hh : '%d घण्टा',
+            d : 'एक दिन',
+            dd : '%d दिन',
+            M : 'एक महिना',
+            MM : '%d महिना',
+            y : 'एक बर्ष',
+            yy : '%d बर्ष'
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/nl.js b/resources/lib/moment/locale/nl.js
new file mode 100644 (file)
index 0000000..213beeb
--- /dev/null
@@ -0,0 +1,67 @@
+// moment.js locale configuration
+// locale : dutch (nl)
+// author : Joris Röling : https://github.com/jjupiter
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+        monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
+
+    return moment.defineLocale('nl', {
+        months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
+        monthsShort : function (m, format) {
+            if (/-MMM-/.test(format)) {
+                return monthsShortWithoutDots[m.month()];
+            } else {
+                return monthsShortWithDots[m.month()];
+            }
+        },
+        weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
+        weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
+        weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD-MM-YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[vandaag om] LT',
+            nextDay: '[morgen om] LT',
+            nextWeek: 'dddd [om] LT',
+            lastDay: '[gisteren om] LT',
+            lastWeek: '[afgelopen] dddd [om] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'over %s',
+            past : '%s geleden',
+            s : 'een paar seconden',
+            m : 'één minuut',
+            mm : '%d minuten',
+            h : 'één uur',
+            hh : '%d uur',
+            d : 'één dag',
+            dd : '%d dagen',
+            M : 'één maand',
+            MM : '%d maanden',
+            y : 'één jaar',
+            yy : '%d jaar'
+        },
+        ordinal : function (number) {
+            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/nn.js b/resources/lib/moment/locale/nn.js
new file mode 100644 (file)
index 0000000..c5b6505
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js locale configuration
+// locale : norwegian nynorsk (nn)
+// author : https://github.com/mechuwind
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('nn', {
+        months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+        monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+        weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
+        weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'),
+        weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[I dag klokka] LT',
+            nextDay: '[I morgon klokka] LT',
+            nextWeek: 'dddd [klokka] LT',
+            lastDay: '[I går klokka] LT',
+            lastWeek: '[Føregåande] dddd [klokka] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'om %s',
+            past : 'for %s sidan',
+            s : 'nokre sekund',
+            m : 'eit minutt',
+            mm : '%d minutt',
+            h : 'ein time',
+            hh : '%d timar',
+            d : 'ein dag',
+            dd : '%d dagar',
+            M : 'ein månad',
+            MM : '%d månader',
+            y : 'eit år',
+            yy : '%d år'
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/pl.js b/resources/lib/moment/locale/pl.js
new file mode 100644 (file)
index 0000000..63a62f1
--- /dev/null
@@ -0,0 +1,98 @@
+// moment.js locale configuration
+// locale : polish (pl)
+// author : Rafal Hirsz : https://github.com/evoL
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'),
+        monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');
+
+    function plural(n) {
+        return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
+    }
+
+    function translate(number, withoutSuffix, key) {
+        var result = number + ' ';
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'minuta' : 'minutę';
+        case 'mm':
+            return result + (plural(number) ? 'minuty' : 'minut');
+        case 'h':
+            return withoutSuffix  ? 'godzina'  : 'godzinę';
+        case 'hh':
+            return result + (plural(number) ? 'godziny' : 'godzin');
+        case 'MM':
+            return result + (plural(number) ? 'miesiące' : 'miesięcy');
+        case 'yy':
+            return result + (plural(number) ? 'lata' : 'lat');
+        }
+    }
+
+    return moment.defineLocale('pl', {
+        months : function (momentToFormat, format) {
+            if (/D MMMM/.test(format)) {
+                return monthsSubjective[momentToFormat.month()];
+            } else {
+                return monthsNominative[momentToFormat.month()];
+            }
+        },
+        monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
+        weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
+        weekdaysShort : 'nie_pon_wt_śr_czw_pt_sb'.split('_'),
+        weekdaysMin : 'N_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[Dziś o] LT',
+            nextDay: '[Jutro o] LT',
+            nextWeek: '[W] dddd [o] LT',
+            lastDay: '[Wczoraj o] LT',
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[W zeszłą niedzielę o] LT';
+                case 3:
+                    return '[W zeszłą środę o] LT';
+                case 6:
+                    return '[W zeszłą sobotę o] LT';
+                default:
+                    return '[W zeszły] dddd [o] LT';
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'za %s',
+            past : '%s temu',
+            s : 'kilka sekund',
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : '1 dzień',
+            dd : '%d dni',
+            M : 'miesiąc',
+            MM : translate,
+            y : 'rok',
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/pt-br.js b/resources/lib/moment/locale/pt-br.js
new file mode 100644 (file)
index 0000000..44eedaf
--- /dev/null
@@ -0,0 +1,56 @@
+// moment.js locale configuration
+// locale : brazilian portuguese (pt-br)
+// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('pt-br', {
+        months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
+        monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
+        weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
+        weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
+        weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D [de] MMMM [de] YYYY',
+            LLL : 'D [de] MMMM [de] YYYY [às] LT',
+            LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT'
+        },
+        calendar : {
+            sameDay: '[Hoje às] LT',
+            nextDay: '[Amanhã às] LT',
+            nextWeek: 'dddd [às] LT',
+            lastDay: '[Ontem às] LT',
+            lastWeek: function () {
+                return (this.day() === 0 || this.day() === 6) ?
+                    '[Último] dddd [às] LT' : // Saturday + Sunday
+                    '[Última] dddd [às] LT'; // Monday - Friday
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'em %s',
+            past : '%s atrás',
+            s : 'segundos',
+            m : 'um minuto',
+            mm : '%d minutos',
+            h : 'uma hora',
+            hh : '%d horas',
+            d : 'um dia',
+            dd : '%d dias',
+            M : 'um mês',
+            MM : '%d meses',
+            y : 'um ano',
+            yy : '%d anos'
+        },
+        ordinal : '%dº'
+    });
+}));
diff --git a/resources/lib/moment/locale/pt.js b/resources/lib/moment/locale/pt.js
new file mode 100644 (file)
index 0000000..aced692
--- /dev/null
@@ -0,0 +1,60 @@
+// moment.js locale configuration
+// locale : portuguese (pt)
+// author : Jefferson : https://github.com/jalex79
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('pt', {
+        months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
+        monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
+        weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
+        weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
+        weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D [de] MMMM [de] YYYY',
+            LLL : 'D [de] MMMM [de] YYYY LT',
+            LLLL : 'dddd, D [de] MMMM [de] YYYY LT'
+        },
+        calendar : {
+            sameDay: '[Hoje às] LT',
+            nextDay: '[Amanhã às] LT',
+            nextWeek: 'dddd [às] LT',
+            lastDay: '[Ontem às] LT',
+            lastWeek: function () {
+                return (this.day() === 0 || this.day() === 6) ?
+                    '[Último] dddd [às] LT' : // Saturday + Sunday
+                    '[Última] dddd [às] LT'; // Monday - Friday
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'em %s',
+            past : 'há %s',
+            s : 'segundos',
+            m : 'um minuto',
+            mm : '%d minutos',
+            h : 'uma hora',
+            hh : '%d horas',
+            d : 'um dia',
+            dd : '%d dias',
+            M : 'um mês',
+            MM : '%d meses',
+            y : 'um ano',
+            yy : '%d anos'
+        },
+        ordinal : '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ro.js b/resources/lib/moment/locale/ro.js
new file mode 100644 (file)
index 0000000..dc34d3c
--- /dev/null
@@ -0,0 +1,72 @@
+// moment.js locale configuration
+// locale : romanian (ro)
+// author : Vlad Gurdiga : https://github.com/gurdiga
+// author : Valentin Agachi : https://github.com/avaly
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        var format = {
+                'mm': 'minute',
+                'hh': 'ore',
+                'dd': 'zile',
+                'MM': 'luni',
+                'yy': 'ani'
+            },
+            separator = ' ';
+        if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
+            separator = ' de ';
+        }
+
+        return number + separator + format[key];
+    }
+
+    return moment.defineLocale('ro', {
+        months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),
+        monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),
+        weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
+        weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
+        weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
+        longDateFormat : {
+            LT : 'H:mm',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY H:mm',
+            LLLL : 'dddd, D MMMM YYYY H:mm'
+        },
+        calendar : {
+            sameDay: '[azi la] LT',
+            nextDay: '[mâine la] LT',
+            nextWeek: 'dddd [la] LT',
+            lastDay: '[ieri la] LT',
+            lastWeek: '[fosta] dddd [la] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'peste %s',
+            past : '%s în urmă',
+            s : 'câteva secunde',
+            m : 'un minut',
+            mm : relativeTimeWithPlural,
+            h : 'o oră',
+            hh : relativeTimeWithPlural,
+            d : 'o zi',
+            dd : relativeTimeWithPlural,
+            M : 'o lună',
+            MM : relativeTimeWithPlural,
+            y : 'un an',
+            yy : relativeTimeWithPlural
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ru.js b/resources/lib/moment/locale/ru.js
new file mode 100644 (file)
index 0000000..2f15233
--- /dev/null
@@ -0,0 +1,166 @@
+// moment.js locale configuration
+// locale : russian (ru)
+// author : Viktorminator : https://github.com/Viktorminator
+// Author : Menelion Elensúle : https://github.com/Oire
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function plural(word, num) {
+        var forms = word.split('_');
+        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+    }
+
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        var format = {
+            'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
+            'hh': 'час_часа_часов',
+            'dd': 'день_дня_дней',
+            'MM': 'месяц_месяца_месяцев',
+            'yy': 'год_года_лет'
+        };
+        if (key === 'm') {
+            return withoutSuffix ? 'минута' : 'минуту';
+        }
+        else {
+            return number + ' ' + plural(format[key], +number);
+        }
+    }
+
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+            'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
+        },
+
+        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function monthsShortCaseReplace(m, format) {
+        var monthsShort = {
+            'nominative': 'янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+            'accusative': 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_')
+        },
+
+        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return monthsShort[nounCase][m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = {
+            'nominative': 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
+            'accusative': 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_')
+        },
+
+        nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return weekdays[nounCase][m.day()];
+    }
+
+    return moment.defineLocale('ru', {
+        months : monthsCaseReplace,
+        monthsShort : monthsShortCaseReplace,
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+        weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+        monthsParse : [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i],
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY г.',
+            LLL : 'D MMMM YYYY г., LT',
+            LLLL : 'dddd, D MMMM YYYY г., LT'
+        },
+        calendar : {
+            sameDay: '[Сегодня в] LT',
+            nextDay: '[Завтра в] LT',
+            lastDay: '[Вчера в] LT',
+            nextWeek: function () {
+                return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
+            },
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[В прошлое] dddd [в] LT';
+                case 1:
+                case 2:
+                case 4:
+                    return '[В прошлый] dddd [в] LT';
+                case 3:
+                case 5:
+                case 6:
+                    return '[В прошлую] dddd [в] LT';
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'через %s',
+            past : '%s назад',
+            s : 'несколько секунд',
+            m : relativeTimeWithPlural,
+            mm : relativeTimeWithPlural,
+            h : 'час',
+            hh : relativeTimeWithPlural,
+            d : 'день',
+            dd : relativeTimeWithPlural,
+            M : 'месяц',
+            MM : relativeTimeWithPlural,
+            y : 'год',
+            yy : relativeTimeWithPlural
+        },
+
+        meridiemParse: /ночи|утра|дня|вечера/i,
+        isPM : function (input) {
+            return /^(дня|вечера)$/.test(input);
+        },
+
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'ночи';
+            } else if (hour < 12) {
+                return 'утра';
+            } else if (hour < 17) {
+                return 'дня';
+            } else {
+                return 'вечера';
+            }
+        },
+
+        ordinal: function (number, period) {
+            switch (period) {
+            case 'M':
+            case 'd':
+            case 'DDD':
+                return number + '-й';
+            case 'D':
+                return number + '-го';
+            case 'w':
+            case 'W':
+                return number + '-я';
+            default:
+                return number;
+            }
+        },
+
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/sk.js b/resources/lib/moment/locale/sk.js
new file mode 100644 (file)
index 0000000..991afeb
--- /dev/null
@@ -0,0 +1,156 @@
+// moment.js locale configuration
+// locale : slovak (sk)
+// author : Martin Minka : https://github.com/k2s
+// based on work of petrbela : https://github.com/petrbela
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),
+        monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
+
+    function plural(n) {
+        return (n > 1) && (n < 5);
+    }
+
+    function translate(number, withoutSuffix, key, isFuture) {
+        var result = number + ' ';
+        switch (key) {
+        case 's':  // a few seconds / in a few seconds / a few seconds ago
+            return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
+        case 'm':  // a minute / in a minute / a minute ago
+            return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
+        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'minúty' : 'minút');
+            } else {
+                return result + 'minútami';
+            }
+            break;
+        case 'h':  // an hour / in an hour / an hour ago
+            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+        case 'hh': // 9 hours / in 9 hours / 9 hours ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'hodiny' : 'hodín');
+            } else {
+                return result + 'hodinami';
+            }
+            break;
+        case 'd':  // a day / in a day / a day ago
+            return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
+        case 'dd': // 9 days / in 9 days / 9 days ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'dni' : 'dní');
+            } else {
+                return result + 'dňami';
+            }
+            break;
+        case 'M':  // a month / in a month / a month ago
+            return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
+        case 'MM': // 9 months / in 9 months / 9 months ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'mesiace' : 'mesiacov');
+            } else {
+                return result + 'mesiacmi';
+            }
+            break;
+        case 'y':  // a year / in a year / a year ago
+            return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
+        case 'yy': // 9 years / in 9 years / 9 years ago
+            if (withoutSuffix || isFuture) {
+                return result + (plural(number) ? 'roky' : 'rokov');
+            } else {
+                return result + 'rokmi';
+            }
+            break;
+        }
+    }
+
+    return moment.defineLocale('sk', {
+        months : months,
+        monthsShort : monthsShort,
+        monthsParse : (function (months, monthsShort) {
+            var i, _monthsParse = [];
+            for (i = 0; i < 12; i++) {
+                // use custom parser to solve problem with July (červenec)
+                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+            }
+            return _monthsParse;
+        }(months, monthsShort)),
+        weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
+        weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'),
+        weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),
+        longDateFormat : {
+            LT: 'H:mm',
+            L : 'DD.MM.YYYY',
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY LT',
+            LLLL : 'dddd D. MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[dnes o] LT',
+            nextDay: '[zajtra o] LT',
+            nextWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[v nedeľu o] LT';
+                case 1:
+                case 2:
+                    return '[v] dddd [o] LT';
+                case 3:
+                    return '[v stredu o] LT';
+                case 4:
+                    return '[vo štvrtok o] LT';
+                case 5:
+                    return '[v piatok o] LT';
+                case 6:
+                    return '[v sobotu o] LT';
+                }
+            },
+            lastDay: '[včera o] LT',
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[minulú nedeľu o] LT';
+                case 1:
+                case 2:
+                    return '[minulý] dddd [o] LT';
+                case 3:
+                    return '[minulú stredu o] LT';
+                case 4:
+                case 5:
+                    return '[minulý] dddd [o] LT';
+                case 6:
+                    return '[minulú sobotu o] LT';
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'za %s',
+            past : 'pred %s',
+            s : translate,
+            m : translate,
+            mm : translate,
+            h : translate,
+            hh : translate,
+            d : translate,
+            dd : translate,
+            M : translate,
+            MM : translate,
+            y : translate,
+            yy : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/sl.js b/resources/lib/moment/locale/sl.js
new file mode 100644 (file)
index 0000000..2bdbf1c
--- /dev/null
@@ -0,0 +1,144 @@
+// moment.js locale configuration
+// locale : slovenian (sl)
+// author : Robert Sedovšek : https://github.com/sedovsek
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function translate(number, withoutSuffix, key) {
+        var result = number + ' ';
+        switch (key) {
+        case 'm':
+            return withoutSuffix ? 'ena minuta' : 'eno minuto';
+        case 'mm':
+            if (number === 1) {
+                result += 'minuta';
+            } else if (number === 2) {
+                result += 'minuti';
+            } else if (number === 3 || number === 4) {
+                result += 'minute';
+            } else {
+                result += 'minut';
+            }
+            return result;
+        case 'h':
+            return withoutSuffix ? 'ena ura' : 'eno uro';
+        case 'hh':
+            if (number === 1) {
+                result += 'ura';
+            } else if (number === 2) {
+                result += 'uri';
+            } else if (number === 3 || number === 4) {
+                result += 'ure';
+            } else {
+                result += 'ur';
+            }
+            return result;
+        case 'dd':
+            if (number === 1) {
+                result += 'dan';
+            } else {
+                result += 'dni';
+            }
+            return result;
+        case 'MM':
+            if (number === 1) {
+                result += 'mesec';
+            } else if (number === 2) {
+                result += 'meseca';
+            } else if (number === 3 || number === 4) {
+                result += 'mesece';
+            } else {
+                result += 'mesecev';
+            }
+            return result;
+        case 'yy':
+            if (number === 1) {
+                result += 'leto';
+            } else if (number === 2) {
+                result += 'leti';
+            } else if (number === 3 || number === 4) {
+                result += 'leta';
+            } else {
+                result += 'let';
+            }
+            return result;
+        }
+    }
+
+    return moment.defineLocale('sl', {
+        months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),
+        monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
+        weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
+        weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
+        weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),
+        longDateFormat : {
+            LT : 'H:mm',
+            L : 'DD. MM. YYYY',
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY LT',
+            LLLL : 'dddd, D. MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay  : '[danes ob] LT',
+            nextDay  : '[jutri ob] LT',
+
+            nextWeek : function () {
+                switch (this.day()) {
+                case 0:
+                    return '[v] [nedeljo] [ob] LT';
+                case 3:
+                    return '[v] [sredo] [ob] LT';
+                case 6:
+                    return '[v] [soboto] [ob] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[v] dddd [ob] LT';
+                }
+            },
+            lastDay  : '[včeraj ob] LT',
+            lastWeek : function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 6:
+                    return '[prejšnja] dddd [ob] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[prejšnji] dddd [ob] LT';
+                }
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'čez %s',
+            past   : '%s nazaj',
+            s      : 'nekaj sekund',
+            m      : translate,
+            mm     : translate,
+            h      : translate,
+            hh     : translate,
+            d      : 'en dan',
+            dd     : translate,
+            M      : 'en mesec',
+            MM     : translate,
+            y      : 'eno leto',
+            yy     : translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/sq.js b/resources/lib/moment/locale/sq.js
new file mode 100644 (file)
index 0000000..6ae4178
--- /dev/null
@@ -0,0 +1,61 @@
+// moment.js locale configuration
+// locale : Albanian (sq)
+// author : Flakërim Ismani : https://github.com/flakerimi
+// author: Menelion Elensúle: https://github.com/Oire (tests)
+// author : Oerd Cukalla : https://github.com/oerd (fixes)
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('sq', {
+        months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),
+        monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
+        weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),
+        weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
+        weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'),
+        meridiem : function (hours, minutes, isLower) {
+            return hours < 12 ? 'PD' : 'MD';
+        },
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[Sot në] LT',
+            nextDay : '[Nesër në] LT',
+            nextWeek : 'dddd [në] LT',
+            lastDay : '[Dje në] LT',
+            lastWeek : 'dddd [e kaluar në] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'në %s',
+            past : '%s më parë',
+            s : 'disa sekonda',
+            m : 'një minutë',
+            mm : '%d minuta',
+            h : 'një orë',
+            hh : '%d orë',
+            d : 'një ditë',
+            dd : '%d ditë',
+            M : 'një muaj',
+            MM : '%d muaj',
+            y : 'një vit',
+            yy : '%d vite'
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/sr-cyrl.js b/resources/lib/moment/locale/sr-cyrl.js
new file mode 100644 (file)
index 0000000..7278de6
--- /dev/null
@@ -0,0 +1,105 @@
+// moment.js locale configuration
+// locale : Serbian-cyrillic (sr-cyrl)
+// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var translator = {
+        words: { //Different grammatical cases
+            m: ['један минут', 'једне минуте'],
+            mm: ['минут', 'минуте', 'минута'],
+            h: ['један сат', 'једног сата'],
+            hh: ['сат', 'сата', 'сати'],
+            dd: ['дан', 'дана', 'дана'],
+            MM: ['месец', 'месеца', 'месеци'],
+            yy: ['година', 'године', 'година']
+        },
+        correctGrammaticalCase: function (number, wordKey) {
+            return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+        },
+        translate: function (number, withoutSuffix, key) {
+            var wordKey = translator.words[key];
+            if (key.length === 1) {
+                return withoutSuffix ? wordKey[0] : wordKey[1];
+            } else {
+                return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+            }
+        }
+    };
+
+    return moment.defineLocale('sr-cyrl', {
+        months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],
+        monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'],
+        weekdays: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],
+        weekdaysShort: ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'],
+        weekdaysMin: ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'],
+        longDateFormat: {
+            LT: 'H:mm',
+            L: 'DD. MM. YYYY',
+            LL: 'D. MMMM YYYY',
+            LLL: 'D. MMMM YYYY LT',
+            LLLL: 'dddd, D. MMMM YYYY LT'
+        },
+        calendar: {
+            sameDay: '[данас у] LT',
+            nextDay: '[сутра у] LT',
+
+            nextWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[у] [недељу] [у] LT';
+                case 3:
+                    return '[у] [среду] [у] LT';
+                case 6:
+                    return '[у] [суботу] [у] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[у] dddd [у] LT';
+                }
+            },
+            lastDay  : '[јуче у] LT',
+            lastWeek : function () {
+                var lastWeekDays = [
+                    '[прошле] [недеље] [у] LT',
+                    '[прошлог] [понедељка] [у] LT',
+                    '[прошлог] [уторка] [у] LT',
+                    '[прошле] [среде] [у] LT',
+                    '[прошлог] [четвртка] [у] LT',
+                    '[прошлог] [петка] [у] LT',
+                    '[прошле] [суботе] [у] LT'
+                ];
+                return lastWeekDays[this.day()];
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'за %s',
+            past   : 'пре %s',
+            s      : 'неколико секунди',
+            m      : translator.translate,
+            mm     : translator.translate,
+            h      : translator.translate,
+            hh     : translator.translate,
+            d      : 'дан',
+            dd     : translator.translate,
+            M      : 'месец',
+            MM     : translator.translate,
+            y      : 'годину',
+            yy     : translator.translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/sr.js b/resources/lib/moment/locale/sr.js
new file mode 100644 (file)
index 0000000..d008282
--- /dev/null
@@ -0,0 +1,105 @@
+// moment.js locale configuration
+// locale : Serbian-latin (sr)
+// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var translator = {
+        words: { //Different grammatical cases
+            m: ['jedan minut', 'jedne minute'],
+            mm: ['minut', 'minute', 'minuta'],
+            h: ['jedan sat', 'jednog sata'],
+            hh: ['sat', 'sata', 'sati'],
+            dd: ['dan', 'dana', 'dana'],
+            MM: ['mesec', 'meseca', 'meseci'],
+            yy: ['godina', 'godine', 'godina']
+        },
+        correctGrammaticalCase: function (number, wordKey) {
+            return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+        },
+        translate: function (number, withoutSuffix, key) {
+            var wordKey = translator.words[key];
+            if (key.length === 1) {
+                return withoutSuffix ? wordKey[0] : wordKey[1];
+            } else {
+                return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+            }
+        }
+    };
+
+    return moment.defineLocale('sr', {
+        months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],
+        monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'],
+        weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],
+        weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'čet.', 'pet.', 'sub.'],
+        weekdaysMin: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'],
+        longDateFormat: {
+            LT: 'H:mm',
+            L: 'DD. MM. YYYY',
+            LL: 'D. MMMM YYYY',
+            LLL: 'D. MMMM YYYY LT',
+            LLLL: 'dddd, D. MMMM YYYY LT'
+        },
+        calendar: {
+            sameDay: '[danas u] LT',
+            nextDay: '[sutra u] LT',
+
+            nextWeek: function () {
+                switch (this.day()) {
+                case 0:
+                    return '[u] [nedelju] [u] LT';
+                case 3:
+                    return '[u] [sredu] [u] LT';
+                case 6:
+                    return '[u] [subotu] [u] LT';
+                case 1:
+                case 2:
+                case 4:
+                case 5:
+                    return '[u] dddd [u] LT';
+                }
+            },
+            lastDay  : '[juče u] LT',
+            lastWeek : function () {
+                var lastWeekDays = [
+                    '[prošle] [nedelje] [u] LT',
+                    '[prošlog] [ponedeljka] [u] LT',
+                    '[prošlog] [utorka] [u] LT',
+                    '[prošle] [srede] [u] LT',
+                    '[prošlog] [četvrtka] [u] LT',
+                    '[prošlog] [petka] [u] LT',
+                    '[prošle] [subote] [u] LT'
+                ];
+                return lastWeekDays[this.day()];
+            },
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'za %s',
+            past   : 'pre %s',
+            s      : 'nekoliko sekundi',
+            m      : translator.translate,
+            mm     : translator.translate,
+            h      : translator.translate,
+            hh     : translator.translate,
+            d      : 'dan',
+            dd     : translator.translate,
+            M      : 'mesec',
+            MM     : translator.translate,
+            y      : 'godinu',
+            yy     : translator.translate
+        },
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/sv.js b/resources/lib/moment/locale/sv.js
new file mode 100644 (file)
index 0000000..634b3cf
--- /dev/null
@@ -0,0 +1,63 @@
+// moment.js locale configuration
+// locale : swedish (sv)
+// author : Jens Alm : https://github.com/ulmus
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('sv', {
+        months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),
+        monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+        weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
+        weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
+        weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'YYYY-MM-DD',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[Idag] LT',
+            nextDay: '[Imorgon] LT',
+            lastDay: '[Igår] LT',
+            nextWeek: 'dddd LT',
+            lastWeek: '[Förra] dddd[en] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'om %s',
+            past : 'för %s sedan',
+            s : 'några sekunder',
+            m : 'en minut',
+            mm : '%d minuter',
+            h : 'en timme',
+            hh : '%d timmar',
+            d : 'en dag',
+            dd : '%d dagar',
+            M : 'en månad',
+            MM : '%d månader',
+            y : 'ett år',
+            yy : '%d år'
+        },
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~(number % 100 / 10) === 1) ? 'e' :
+                (b === 1) ? 'a' :
+                (b === 2) ? 'a' :
+                (b === 3) ? 'e' : 'e';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/ta.js b/resources/lib/moment/locale/ta.js
new file mode 100644 (file)
index 0000000..53bab0d
--- /dev/null
@@ -0,0 +1,112 @@
+// moment.js locale configuration
+// locale : tamil (ta)
+// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    /*var symbolMap = {
+            '1': '௧',
+            '2': '௨',
+            '3': '௩',
+            '4': '௪',
+            '5': '௫',
+            '6': '௬',
+            '7': '௭',
+            '8': '௮',
+            '9': '௯',
+            '0': '௦'
+        },
+        numberMap = {
+            '௧': '1',
+            '௨': '2',
+            '௩': '3',
+            '௪': '4',
+            '௫': '5',
+            '௬': '6',
+            '௭': '7',
+            '௮': '8',
+            '௯': '9',
+            '௦': '0'
+        }; */
+
+    return moment.defineLocale('ta', {
+        months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+        monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+        weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),
+        weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'),
+        weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY, LT',
+            LLLL : 'dddd, D MMMM YYYY, LT'
+        },
+        calendar : {
+            sameDay : '[இன்று] LT',
+            nextDay : '[நாளை] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[நேற்று] LT',
+            lastWeek : '[கடந்த வாரம்] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s இல்',
+            past : '%s முன்',
+            s : 'ஒரு சில விநாடிகள்',
+            m : 'ஒரு நிமிடம்',
+            mm : '%d நிமிடங்கள்',
+            h : 'ஒரு மணி நேரம்',
+            hh : '%d மணி நேரம்',
+            d : 'ஒரு நாள்',
+            dd : '%d நாட்கள்',
+            M : 'ஒரு மாதம்',
+            MM : '%d மாதங்கள்',
+            y : 'ஒரு வருடம்',
+            yy : '%d ஆண்டுகள்'
+        },
+/*        preparse: function (string) {
+            return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },*/
+        ordinal : function (number) {
+            return number + 'வது';
+        },
+
+
+        // refer http://ta.wikipedia.org/s/1er1
+
+        meridiem : function (hour, minute, isLower) {
+            if (hour >= 6 && hour <= 10) {
+                return ' காலை';
+            } else if (hour >= 10 && hour <= 14) {
+                return ' நண்பகல்';
+            } else if (hour >= 14 && hour <= 18) {
+                return ' எற்பாடு';
+            } else if (hour >= 18 && hour <= 20) {
+                return ' மாலை';
+            } else if (hour >= 20 && hour <= 24) {
+                return ' இரவு';
+            } else if (hour >= 0 && hour <= 6) {
+                return ' வைகறை';
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/th.js b/resources/lib/moment/locale/th.js
new file mode 100644 (file)
index 0000000..fc99701
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js locale configuration
+// locale : thai (th)
+// author : Kridsada Thanabulpong : https://github.com/sirn
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('th', {
+        months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),
+        monthsShort : 'มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา'.split('_'),
+        weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
+        weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
+        weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
+        longDateFormat : {
+            LT : 'H นาฬิกา m นาที',
+            L : 'YYYY/MM/DD',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY เวลา LT',
+            LLLL : 'วันddddที่ D MMMM YYYY เวลา LT'
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return 'ก่อนเที่ยง';
+            } else {
+                return 'หลังเที่ยง';
+            }
+        },
+        calendar : {
+            sameDay : '[วันนี้ เวลา] LT',
+            nextDay : '[พรุ่งนี้ เวลา] LT',
+            nextWeek : 'dddd[หน้า เวลา] LT',
+            lastDay : '[เมื่อวานนี้ เวลา] LT',
+            lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'อีก %s',
+            past : '%sที่แล้ว',
+            s : 'ไม่กี่วินาที',
+            m : '1 นาที',
+            mm : '%d นาที',
+            h : '1 ชั่วโมง',
+            hh : '%d ชั่วโมง',
+            d : '1 วัน',
+            dd : '%d วัน',
+            M : '1 เดือน',
+            MM : '%d เดือน',
+            y : '1 ปี',
+            yy : '%d ปี'
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/tl-ph.js b/resources/lib/moment/locale/tl-ph.js
new file mode 100644 (file)
index 0000000..c15cc1f
--- /dev/null
@@ -0,0 +1,58 @@
+// moment.js locale configuration
+// locale : Tagalog/Filipino (tl-ph)
+// author : Dan Hagman
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('tl-ph', {
+        months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),
+        monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
+        weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),
+        weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
+        weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'MM/D/YYYY',
+            LL : 'MMMM D, YYYY',
+            LLL : 'MMMM D, YYYY LT',
+            LLLL : 'dddd, MMMM DD, YYYY LT'
+        },
+        calendar : {
+            sameDay: '[Ngayon sa] LT',
+            nextDay: '[Bukas sa] LT',
+            nextWeek: 'dddd [sa] LT',
+            lastDay: '[Kahapon sa] LT',
+            lastWeek: 'dddd [huling linggo] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'sa loob ng %s',
+            past : '%s ang nakalipas',
+            s : 'ilang segundo',
+            m : 'isang minuto',
+            mm : '%d minuto',
+            h : 'isang oras',
+            hh : '%d oras',
+            d : 'isang araw',
+            dd : '%d araw',
+            M : 'isang buwan',
+            MM : '%d buwan',
+            y : 'isang taon',
+            yy : '%d taon'
+        },
+        ordinal : function (number) {
+            return number;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/tr.js b/resources/lib/moment/locale/tr.js
new file mode 100644 (file)
index 0000000..36e8fca
--- /dev/null
@@ -0,0 +1,92 @@
+// moment.js locale configuration
+// locale : turkish (tr)
+// authors : Erhan Gundogan : https://github.com/erhangundogan,
+//           Burak Yiğit Kaya: https://github.com/BYK
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    var suffixes = {
+        1: '\'inci',
+        5: '\'inci',
+        8: '\'inci',
+        70: '\'inci',
+        80: '\'inci',
+
+        2: '\'nci',
+        7: '\'nci',
+        20: '\'nci',
+        50: '\'nci',
+
+        3: '\'üncü',
+        4: '\'üncü',
+        100: '\'üncü',
+
+        6: '\'ncı',
+
+        9: '\'uncu',
+        10: '\'uncu',
+        30: '\'uncu',
+
+        60: '\'ıncı',
+        90: '\'ıncı'
+    };
+
+    return moment.defineLocale('tr', {
+        months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),
+        monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
+        weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),
+        weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'),
+        weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd, D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay : '[bugün saat] LT',
+            nextDay : '[yarın saat] LT',
+            nextWeek : '[haftaya] dddd [saat] LT',
+            lastDay : '[dün] LT',
+            lastWeek : '[geçen hafta] dddd [saat] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s sonra',
+            past : '%s önce',
+            s : 'birkaç saniye',
+            m : 'bir dakika',
+            mm : '%d dakika',
+            h : 'bir saat',
+            hh : '%d saat',
+            d : 'bir gün',
+            dd : '%d gün',
+            M : 'bir ay',
+            MM : '%d ay',
+            y : 'bir yıl',
+            yy : '%d yıl'
+        },
+        ordinal : function (number) {
+            if (number === 0) {  // special case for zero
+                return number + '\'ıncı';
+            }
+            var a = number % 10,
+                b = number % 100 - a,
+                c = number >= 100 ? 100 : null;
+
+            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/tzm-latn.js b/resources/lib/moment/locale/tzm-latn.js
new file mode 100644 (file)
index 0000000..3189772
--- /dev/null
@@ -0,0 +1,55 @@
+// moment.js locale configuration
+// locale : Morocco Central Atlas Tamaziɣt in Latin (tzm-latn)
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('tzm-latn', {
+        months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+        monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+        weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+        weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+        weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[asdkh g] LT',
+            nextDay: '[aska g] LT',
+            nextWeek: 'dddd [g] LT',
+            lastDay: '[assant g] LT',
+            lastWeek: 'dddd [g] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'dadkh s yan %s',
+            past : 'yan %s',
+            s : 'imik',
+            m : 'minuḍ',
+            mm : '%d minuḍ',
+            h : 'saɛa',
+            hh : '%d tassaɛin',
+            d : 'ass',
+            dd : '%d ossan',
+            M : 'ayowr',
+            MM : '%d iyyirn',
+            y : 'asgas',
+            yy : '%d isgasn'
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/tzm.js b/resources/lib/moment/locale/tzm.js
new file mode 100644 (file)
index 0000000..0a7f3f1
--- /dev/null
@@ -0,0 +1,55 @@
+// moment.js locale configuration
+// locale : Morocco Central Atlas Tamaziɣt (tzm)
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('tzm', {
+        months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+        monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+        weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+        weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+        weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'dddd D MMMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
+            nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
+            nextWeek: 'dddd [ⴴ] LT',
+            lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
+            lastWeek: 'dddd [ⴴ] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
+            past : 'ⵢⴰⵏ %s',
+            s : 'ⵉⵎⵉⴽ',
+            m : 'ⵎⵉⵏⵓⴺ',
+            mm : '%d ⵎⵉⵏⵓⴺ',
+            h : 'ⵙⴰⵄⴰ',
+            hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
+            d : 'ⴰⵙⵙ',
+            dd : '%d oⵙⵙⴰⵏ',
+            M : 'ⴰⵢoⵓⵔ',
+            MM : '%d ⵉⵢⵢⵉⵔⵏ',
+            y : 'ⴰⵙⴳⴰⵙ',
+            yy : '%d ⵉⵙⴳⴰⵙⵏ'
+        },
+        week : {
+            dow : 6, // Saturday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/uk.js b/resources/lib/moment/locale/uk.js
new file mode 100644 (file)
index 0000000..bc22fff
--- /dev/null
@@ -0,0 +1,157 @@
+// moment.js locale configuration
+// locale : ukrainian (uk)
+// author : zemlanin : https://github.com/zemlanin
+// Author : Menelion Elensúle : https://github.com/Oire
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    function plural(word, num) {
+        var forms = word.split('_');
+        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+    }
+
+    function relativeTimeWithPlural(number, withoutSuffix, key) {
+        var format = {
+            'mm': 'хвилина_хвилини_хвилин',
+            'hh': 'година_години_годин',
+            'dd': 'день_дні_днів',
+            'MM': 'місяць_місяці_місяців',
+            'yy': 'рік_роки_років'
+        };
+        if (key === 'm') {
+            return withoutSuffix ? 'хвилина' : 'хвилину';
+        }
+        else if (key === 'h') {
+            return withoutSuffix ? 'година' : 'годину';
+        }
+        else {
+            return number + ' ' + plural(format[key], +number);
+        }
+    }
+
+    function monthsCaseReplace(m, format) {
+        var months = {
+            'nominative': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'),
+            'accusative': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_')
+        },
+
+        nounCase = (/D[oD]? *MMMM?/).test(format) ?
+            'accusative' :
+            'nominative';
+
+        return months[nounCase][m.month()];
+    }
+
+    function weekdaysCaseReplace(m, format) {
+        var weekdays = {
+            'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
+            'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
+            'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
+        },
+
+        nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
+            'accusative' :
+            ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
+                'genitive' :
+                'nominative');
+
+        return weekdays[nounCase][m.day()];
+    }
+
+    function processHoursFunction(str) {
+        return function () {
+            return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
+        };
+    }
+
+    return moment.defineLocale('uk', {
+        months : monthsCaseReplace,
+        monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),
+        weekdays : weekdaysCaseReplace,
+        weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+        weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY р.',
+            LLL : 'D MMMM YYYY р., LT',
+            LLLL : 'dddd, D MMMM YYYY р., LT'
+        },
+        calendar : {
+            sameDay: processHoursFunction('[Сьогодні '),
+            nextDay: processHoursFunction('[Завтра '),
+            lastDay: processHoursFunction('[Вчора '),
+            nextWeek: processHoursFunction('[У] dddd ['),
+            lastWeek: function () {
+                switch (this.day()) {
+                case 0:
+                case 3:
+                case 5:
+                case 6:
+                    return processHoursFunction('[Минулої] dddd [').call(this);
+                case 1:
+                case 2:
+                case 4:
+                    return processHoursFunction('[Минулого] dddd [').call(this);
+                }
+            },
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'за %s',
+            past : '%s тому',
+            s : 'декілька секунд',
+            m : relativeTimeWithPlural,
+            mm : relativeTimeWithPlural,
+            h : 'годину',
+            hh : relativeTimeWithPlural,
+            d : 'день',
+            dd : relativeTimeWithPlural,
+            M : 'місяць',
+            MM : relativeTimeWithPlural,
+            y : 'рік',
+            yy : relativeTimeWithPlural
+        },
+
+        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'ночі';
+            } else if (hour < 12) {
+                return 'ранку';
+            } else if (hour < 17) {
+                return 'дня';
+            } else {
+                return 'вечора';
+            }
+        },
+
+        ordinal: function (number, period) {
+            switch (period) {
+            case 'M':
+            case 'd':
+            case 'DDD':
+            case 'w':
+            case 'W':
+                return number + '-й';
+            case 'D':
+                return number + '-го';
+            default:
+                return number;
+            }
+        },
+
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/uz.js b/resources/lib/moment/locale/uz.js
new file mode 100644 (file)
index 0000000..62fb89e
--- /dev/null
@@ -0,0 +1,55 @@
+// moment.js locale configuration
+// locale : uzbek (uz)
+// author : Sardor Muminov : https://github.com/muminoff
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('uz', {
+        months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+        monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
+        weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
+        weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
+        weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY LT',
+            LLLL : 'D MMMM YYYY, dddd LT'
+        },
+        calendar : {
+            sameDay : '[Бугун соат] LT [да]',
+            nextDay : '[Эртага] LT [да]',
+            nextWeek : 'dddd [куни соат] LT [да]',
+            lastDay : '[Кеча соат] LT [да]',
+            lastWeek : '[Утган] dddd [куни соат] LT [да]',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'Якин %s ичида',
+            past : 'Бир неча %s олдин',
+            s : 'фурсат',
+            m : 'бир дакика',
+            mm : '%d дакика',
+            h : 'бир соат',
+            hh : '%d соат',
+            d : 'бир кун',
+            dd : '%d кун',
+            M : 'бир ой',
+            MM : '%d ой',
+            y : 'бир йил',
+            yy : '%d йил'
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/vi.js b/resources/lib/moment/locale/vi.js
new file mode 100644 (file)
index 0000000..20e3ffe
--- /dev/null
@@ -0,0 +1,62 @@
+// moment.js locale configuration
+// locale : vietnamese (vi)
+// author : Bang Nguyen : https://github.com/bangnk
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('vi', {
+        months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),
+        monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),
+        weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),
+        weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+        weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM [năm] YYYY',
+            LLL : 'D MMMM [năm] YYYY LT',
+            LLLL : 'dddd, D MMMM [năm] YYYY LT',
+            l : 'DD/M/YYYY',
+            ll : 'D MMM YYYY',
+            lll : 'D MMM YYYY LT',
+            llll : 'ddd, D MMM YYYY LT'
+        },
+        calendar : {
+            sameDay: '[Hôm nay lúc] LT',
+            nextDay: '[Ngày mai lúc] LT',
+            nextWeek: 'dddd [tuần tới lúc] LT',
+            lastDay: '[Hôm qua lúc] LT',
+            lastWeek: 'dddd [tuần rồi lúc] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : '%s tới',
+            past : '%s trước',
+            s : 'vài giây',
+            m : 'một phút',
+            mm : '%d phút',
+            h : 'một giờ',
+            hh : '%d giờ',
+            d : 'một ngày',
+            dd : '%d ngày',
+            M : 'một tháng',
+            MM : '%d tháng',
+            y : 'một năm',
+            yy : '%d năm'
+        },
+        ordinal : function (number) {
+            return number;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/zh-cn.js b/resources/lib/moment/locale/zh-cn.js
new file mode 100644 (file)
index 0000000..aff26c5
--- /dev/null
@@ -0,0 +1,108 @@
+// moment.js locale configuration
+// locale : chinese (zh-cn)
+// author : suupic : https://github.com/suupic
+// author : Zeno Zeng : https://github.com/zenozeng
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('zh-cn', {
+        months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+        monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+        weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+        weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),
+        weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+        longDateFormat : {
+            LT : 'Ah点mm',
+            L : 'YYYY-MM-DD',
+            LL : 'YYYY年MMMD日',
+            LLL : 'YYYY年MMMD日LT',
+            LLLL : 'YYYY年MMMD日ddddLT',
+            l : 'YYYY-MM-DD',
+            ll : 'YYYY年MMMD日',
+            lll : 'YYYY年MMMD日LT',
+            llll : 'YYYY年MMMD日ddddLT'
+        },
+        meridiem : function (hour, minute, isLower) {
+            var hm = hour * 100 + minute;
+            if (hm < 600) {
+                return '凌晨';
+            } else if (hm < 900) {
+                return '早上';
+            } else if (hm < 1130) {
+                return '上午';
+            } else if (hm < 1230) {
+                return '中午';
+            } else if (hm < 1800) {
+                return '下午';
+            } else {
+                return '晚上';
+            }
+        },
+        calendar : {
+            sameDay : function () {
+                return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
+            },
+            nextDay : function () {
+                return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
+            },
+            lastDay : function () {
+                return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
+            },
+            nextWeek : function () {
+                var startOfWeek, prefix;
+                startOfWeek = moment().startOf('week');
+                prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
+                return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
+            },
+            lastWeek : function () {
+                var startOfWeek, prefix;
+                startOfWeek = moment().startOf('week');
+                prefix = this.unix() < startOfWeek.unix()  ? '[上]' : '[本]';
+                return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
+            },
+            sameElse : 'LL'
+        },
+        ordinal : function (number, period) {
+            switch (period) {
+            case 'd':
+            case 'D':
+            case 'DDD':
+                return number + '日';
+            case 'M':
+                return number + '月';
+            case 'w':
+            case 'W':
+                return number + '周';
+            default:
+                return number;
+            }
+        },
+        relativeTime : {
+            future : '%s内',
+            past : '%s前',
+            s : '几秒',
+            m : '1分钟',
+            mm : '%d分钟',
+            h : '1小时',
+            hh : '%d小时',
+            d : '1天',
+            dd : '%d天',
+            M : '1个月',
+            MM : '%d个月',
+            y : '1年',
+            yy : '%d年'
+        },
+        week : {
+            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+}));
diff --git a/resources/lib/moment/locale/zh-tw.js b/resources/lib/moment/locale/zh-tw.js
new file mode 100644 (file)
index 0000000..71f99a2
--- /dev/null
@@ -0,0 +1,84 @@
+// moment.js locale configuration
+// locale : traditional chinese (zh-tw)
+// author : Ben : https://github.com/ben-lin
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['moment'], factory); // AMD
+    } else if (typeof exports === 'object') {
+        module.exports = factory(require('../moment')); // Node
+    } else {
+        factory(window.moment); // Browser global
+    }
+}(function (moment) {
+    return moment.defineLocale('zh-tw', {
+        months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+        monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+        weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+        weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+        weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+        longDateFormat : {
+            LT : 'Ah點mm',
+            L : 'YYYY年MMMD日',
+            LL : 'YYYY年MMMD日',
+            LLL : 'YYYY年MMMD日LT',
+            LLLL : 'YYYY年MMMD日ddddLT',
+            l : 'YYYY年MMMD日',
+            ll : 'YYYY年MMMD日',
+            lll : 'YYYY年MMMD日LT',
+            llll : 'YYYY年MMMD日ddddLT'
+        },
+        meridiem : function (hour, minute, isLower) {
+            var hm = hour * 100 + minute;
+            if (hm < 900) {
+                return '早上';
+            } else if (hm < 1130) {
+                return '上午';
+            } else if (hm < 1230) {
+                return '中午';
+            } else if (hm < 1800) {
+                return '下午';
+            } else {
+                return '晚上';
+            }
+        },
+        calendar : {
+            sameDay : '[今天]LT',
+            nextDay : '[明天]LT',
+            nextWeek : '[下]ddddLT',
+            lastDay : '[昨天]LT',
+            lastWeek : '[上]ddddLT',
+            sameElse : 'L'
+        },
+        ordinal : function (number, period) {
+            switch (period) {
+            case 'd' :
+            case 'D' :
+            case 'DDD' :
+                return number + '日';
+            case 'M' :
+                return number + '月';
+            case 'w' :
+            case 'W' :
+                return number + '週';
+            default :
+                return number;
+            }
+        },
+        relativeTime : {
+            future : '%s內',
+            past : '%s前',
+            s : '幾秒',
+            m : '一分鐘',
+            mm : '%d分鐘',
+            h : '一小時',
+            hh : '%d小時',
+            d : '一天',
+            dd : '%d天',
+            M : '一個月',
+            MM : '%d個月',
+            y : '一年',
+            yy : '%d年'
+        }
+    });
+}));
index 03a2460..d100a9c 100644 (file)
@@ -1,5 +1,5 @@
 //! moment.js
-//! version : 2.8.1
+//! version : 2.8.3
 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
 //! license : MIT
 //! momentjs.com
     ************************************/
 
     var moment,
-        VERSION = '2.8.1',
+        VERSION = '2.8.3',
         // the global-scope this is NOT the global object in Node.js
         globalScope = typeof global !== 'undefined' ? global : this,
         oldGlobalMoment,
         round = Math.round,
+        hasOwnProperty = Object.prototype.hasOwnProperty,
         i,
 
         YEAR = 0,
@@ -88,7 +89,7 @@
             ['HH', /(T| )\d\d/]
         ],
 
-        // timezone chunker "+10:00" > ["10", "00"] or "-1530" > ["-15", "30"]
+        // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-15', '30']
         parseTimezoneChunker = /([\+\-]|\d\d)/gi,
 
         // getter and setter names
         }
     }
 
+    function hasOwnProp(a, b) {
+        return hasOwnProperty.call(a, b);
+    }
+
     function defaultParsingFlags() {
         // We need to deep clone this object, and es5 standard is not very
         // helpful.
     function printMsg(msg) {
         if (moment.suppressDeprecationWarnings === false &&
                 typeof console !== 'undefined' && console.warn) {
-            console.warn("Deprecation warning: " + msg);
+            console.warn('Deprecation warning: ' + msg);
         }
     }
 
 
     function extend(a, b) {
         for (var i in b) {
-            if (b.hasOwnProperty(i)) {
+            if (hasOwnProp(b, i)) {
                 a[i] = b[i];
             }
         }
 
-        if (b.hasOwnProperty('toString')) {
+        if (hasOwnProp(b, 'toString')) {
             a.toString = b.toString;
         }
 
-        if (b.hasOwnProperty('valueOf')) {
+        if (hasOwnProp(b, 'valueOf')) {
             a.valueOf = b.valueOf;
         }
 
             var dur, tmp;
             //invert the arguments, but complain about it
             if (period !== null && !isNaN(+period)) {
-                deprecateSimple(name, "moment()." + name  + "(period, number) is deprecated. Please use moment()." + name + "(number, period).");
+                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');
                 tmp = val; val = period; period = tmp;
             }
 
             prop;
 
         for (prop in inputObject) {
-            if (inputObject.hasOwnProperty(prop)) {
+            if (hasOwnProp(inputObject, prop)) {
                 normalizedProp = normalizeUnits(prop);
                 if (normalizedProp) {
                     normalizedInput[normalizedProp] = inputObject[prop];
         for (i = 0; i < config._f.length; i++) {
             currentScore = 0;
             tempConfig = copyConfig({}, config);
+            if (config._useUTC != null) {
+                tempConfig._useUTC = config._useUTC;
+            }
             tempConfig._pf = defaultParsingFlags();
             tempConfig._f = config._f[i];
             makeDateFromStringAndFormat(tempConfig);
             config._pf.iso = true;
             for (i = 0, l = isoDates.length; i < l; i++) {
                 if (isoDates[i][1].exec(string)) {
-                    // match[5] should be "T" or undefined
+                    // match[5] should be 'T' or undefined
                     config._f = isoDates[i][0] + (match[6] || ' ');
                     break;
                 }
         }
     }
 
+    function map(arr, fn) {
+        var res = [], i;
+        for (i = 0; i < arr.length; ++i) {
+            res.push(fn(arr[i], i));
+        }
+        return res;
+    }
+
     function makeDateFromInput(config) {
         var input = config._i, matched;
         if (input === undefined) {
         } else if (typeof input === 'string') {
             makeDateFromString(config);
         } else if (isArray(input)) {
-            config._a = input.slice(0);
+            config._a = map(input.slice(0), function (obj) {
+                return parseInt(obj, 10);
+            });
             dateFromConfig(config);
         } else if (typeof(input) === 'object') {
             dateFromObject(config);
     moment = function (input, format, locale, strict) {
         var c;
 
-        if (typeof(locale) === "boolean") {
+        if (typeof(locale) === 'boolean') {
             strict = locale;
             locale = undefined;
         }
     moment.utc = function (input, format, locale, strict) {
         var c;
 
-        if (typeof(locale) === "boolean") {
+        if (typeof(locale) === 'boolean') {
             strict = locale;
             locale = undefined;
         }
 
         ret = new Duration(duration);
 
-        if (moment.isDuration(input) && input.hasOwnProperty('_locale')) {
+        if (moment.isDuration(input) && hasOwnProp(input, '_locale')) {
             ret._locale = input._locale;
         }
 
     };
 
     moment.lang = deprecate(
-        "moment.lang is deprecated. Use moment.locale instead.",
+        'moment.lang is deprecated. Use moment.locale instead.',
         function (key, value) {
             return moment.locale(key, value);
         }
     moment.locale = function (key, values) {
         var data;
         if (key) {
-            if (typeof(values) !== "undefined") {
+            if (typeof(values) !== 'undefined') {
                 data = moment.defineLocale(key, values);
             }
             else {
     };
 
     moment.langData = deprecate(
-        "moment.langData is deprecated. Use moment.localeData instead.",
+        'moment.langData is deprecated. Use moment.localeData instead.',
         function (key) {
             return moment.localeData(key);
         }
     // compare moment object
     moment.isMoment = function (obj) {
         return obj instanceof Moment ||
-            (obj != null &&  obj.hasOwnProperty('_isAMomentObject'));
+            (obj != null && hasOwnProp(obj, '_isAMomentObject'));
     };
 
     // for typechecking Duration objects
         },
 
         toString : function () {
-            return this.clone().locale('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ");
+            return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
         },
 
         toDate : function () {
                 this._isUTC = false;
 
                 if (keepLocalTime) {
-                    this.add(this._d.getTimezoneOffset(), 'm');
+                    this.add(this._dateTzOffset(), 'm');
                 }
             }
             return this;
         diff : function (input, units, asFloat) {
             var that = makeAs(input, this),
                 zoneDiff = (this.zone() - that.zone()) * 6e4,
-                diff, output;
+                diff, output, daysAdjust;
 
             units = normalizeUnits(units);
 
                 output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
                 // adjust by taking difference in days, average number of days
                 // and dst in the given months.
-                output += ((this - moment(this).startOf('month')) -
-                        (that - moment(that).startOf('month'))) / diff;
+                daysAdjust = (this - moment(this).startOf('month')) -
+                    (that - moment(that).startOf('month'));
                 // same as above but with zones, to negate all dst
-                output -= ((this.zone() - moment(this).startOf('month').zone()) -
-                        (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff;
+                daysAdjust -= ((this.zone() - moment(this).startOf('month').zone()) -
+                        (that.zone() - moment(that).startOf('month').zone())) * 6e4;
+                output += daysAdjust / diff;
                 if (units === 'year') {
                     output = output / 12;
                 }
         },
 
         isAfter: function (input, units) {
-            units = typeof units !== 'undefined' ? units : 'millisecond';
-            return +this.clone().startOf(units) > +moment(input).startOf(units);
+            units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
+            if (units === 'millisecond') {
+                input = moment.isMoment(input) ? input : moment(input);
+                return +this > +input;
+            } else {
+                return +this.clone().startOf(units) > +moment(input).startOf(units);
+            }
         },
 
         isBefore: function (input, units) {
-            units = typeof units !== 'undefined' ? units : 'millisecond';
-            return +this.clone().startOf(units) < +moment(input).startOf(units);
+            units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
+            if (units === 'millisecond') {
+                input = moment.isMoment(input) ? input : moment(input);
+                return +this < +input;
+            } else {
+                return +this.clone().startOf(units) < +moment(input).startOf(units);
+            }
         },
 
         isSame: function (input, units) {
-            units = units || 'ms';
-            return +this.clone().startOf(units) === +makeAs(input, this).startOf(units);
+            units = normalizeUnits(units || 'millisecond');
+            if (units === 'millisecond') {
+                input = moment.isMoment(input) ? input : moment(input);
+                return +this === +input;
+            } else {
+                return +this.clone().startOf(units) === +makeAs(input, this).startOf(units);
+            }
         },
 
         min: deprecate(
                     input = input * 60;
                 }
                 if (!this._isUTC && keepLocalTime) {
-                    localAdjust = this._d.getTimezoneOffset();
+                    localAdjust = this._dateTzOffset();
                 }
                 this._offset = input;
                 this._isUTC = true;
                     }
                 }
             } else {
-                return this._isUTC ? offset : this._d.getTimezoneOffset();
+                return this._isUTC ? offset : this._dateTzOffset();
             }
             return this;
         },
         // instance.  Otherwise, it will return the locale configuration
         // variables for this instance.
         locale : function (key) {
+            var newLocaleData;
+
             if (key === undefined) {
                 return this._locale._abbr;
             } else {
-                this._locale = moment.localeData(key);
+                newLocaleData = moment.localeData(key);
+                if (newLocaleData != null) {
+                    this._locale = newLocaleData;
+                }
                 return this;
             }
         },
 
         lang : deprecate(
-            "moment().lang() is deprecated. Use moment().localeData() instead.",
+            'moment().lang() is deprecated. Use moment().localeData() instead.',
             function (key) {
                 if (key === undefined) {
                     return this.localeData();
                 } else {
-                    this._locale = moment.localeData(key);
-                    return this;
+                    return this.locale(key);
                 }
             }
         ),
 
         localeData : function () {
             return this._locale;
+        },
+
+        _dateTzOffset : function () {
+            // On Firefox.24 Date#getTimezoneOffset returns a floating point.
+            // https://github.com/moment/moment/pull/1871
+            return Math.round(this._d.getTimezoneOffset() / 15) * 15;
         }
     });
 
             var days, months;
             units = normalizeUnits(units);
 
-            days = this._days + this._milliseconds / 864e5;
             if (units === 'month' || units === 'year') {
+                days = this._days + this._milliseconds / 864e5;
                 months = this._months + daysToYears(days) * 12;
                 return units === 'month' ? months : months / 12;
             } else {
-                days += yearsToDays(this._months / 12);
+                // handle milliseconds separately because of floating point math errors (issue #1867)
+                days = this._days + yearsToDays(this._months / 12);
                 switch (units) {
-                    case 'week': return days / 7;
-                    case 'day': return days;
-                    case 'hour': return days * 24;
-                    case 'minute': return days * 24 * 60;
-                    case 'second': return days * 24 * 60 * 60;
-                    case 'millisecond': return days * 24 * 60 * 60 * 1000;
+                    case 'week': return days / 7 + this._milliseconds / 6048e5;
+                    case 'day': return days + this._milliseconds / 864e5;
+                    case 'hour': return days * 24 + this._milliseconds / 36e5;
+                    case 'minute': return days * 24 * 60 + this._milliseconds / 6e4;
+                    case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000;
+                    // Math.floor prevents floating point math errors here
+                    case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds;
                     default: throw new Error('Unknown unit ' + units);
                 }
             }
         locale : moment.fn.locale,
 
         toIsoString : deprecate(
-            "toIsoString() is deprecated. Please use toISOString() instead " +
-            "(notice the capitals)",
+            'toIsoString() is deprecated. Please use toISOString() instead ' +
+            '(notice the capitals)',
             function () {
                 return this.toISOString();
             }
         }
     });
 
+    moment.duration.fn.toString = moment.duration.fn.toISOString;
+
     function makeDurationGetter(name) {
         moment.duration.fn[name] = function () {
             return this._data[name];
     }
 
     for (i in unitMillisecondFactors) {
-        if (unitMillisecondFactors.hasOwnProperty(i)) {
+        if (hasOwnProp(unitMillisecondFactors, i)) {
             makeDurationGetter(i.toLowerCase());
         }
     }
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/add.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/add.png
new file mode 100644 (file)
index 0000000..730d102
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/add.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/advanced.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/advanced.png
new file mode 100644 (file)
index 0000000..514ff1d
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/advanced.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/alert.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/alert.png
new file mode 100644 (file)
index 0000000..e98a14a
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/alert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-ltr.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-ltr.png
new file mode 100644 (file)
index 0000000..88db108
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-ltr.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-rtl.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-rtl.png
new file mode 100644 (file)
index 0000000..0afcbfa
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-rtl.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/check.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/check.png
new file mode 100644 (file)
index 0000000..9a2c9db
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/check.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/clear.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/clear.png
new file mode 100644 (file)
index 0000000..51a33ff
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/clear.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/close.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/close.png
new file mode 100644 (file)
index 0000000..4eedfbc
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/close.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/code.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/code.png
new file mode 100644 (file)
index 0000000..ee58c9a
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/code.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/collapse.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/collapse.png
new file mode 100644 (file)
index 0000000..353ac79
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/collapse.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/comment.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/comment.png
new file mode 100644 (file)
index 0000000..265a3e4
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/comment.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/expand.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/expand.png
new file mode 100644 (file)
index 0000000..9073d24
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/expand.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/help.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/help.png
new file mode 100644 (file)
index 0000000..b80df00
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/help.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/info.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/info.png
new file mode 100644 (file)
index 0000000..eb0fb46
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/info.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/link.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/link.png
new file mode 100644 (file)
index 0000000..2a087a4
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/link.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/menu.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/menu.png
new file mode 100644 (file)
index 0000000..0a78119
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/menu.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-ltr.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-ltr.png
new file mode 100644 (file)
index 0000000..fc4cd39
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-ltr.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-rtl.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-rtl.png
new file mode 100644 (file)
index 0000000..dbce05e
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-rtl.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/picture.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/picture.png
new file mode 100644 (file)
index 0000000..2043424
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/picture.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/remove.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/remove.png
new file mode 100644 (file)
index 0000000..9dc34b8
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/remove.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/search.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/search.png
new file mode 100644 (file)
index 0000000..39d3ab8
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/search.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/settings.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/settings.png
new file mode 100644 (file)
index 0000000..dd2706b
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/settings.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/tag.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/tag.png
new file mode 100644 (file)
index 0000000..8e100fc
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/tag.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/window.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/window.png
new file mode 100644 (file)
index 0000000..db726a1
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/icons/window.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/alert.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/alert.png
new file mode 100644 (file)
index 0000000..5bf0827
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/alert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-down.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-down.png
new file mode 100644 (file)
index 0000000..6574725
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-down.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-ltr.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-ltr.png
new file mode 100644 (file)
index 0000000..7c84397
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-ltr.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-rtl.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-rtl.png
new file mode 100644 (file)
index 0000000..5bf9064
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-rtl.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-up.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-up.png
new file mode 100644 (file)
index 0000000..1a05ade
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-up.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/required.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/required.png
new file mode 100644 (file)
index 0000000..45eb03b
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/required.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/textures/transparency.png b/resources/lib/oojs-ui/dist/themes/apex/images/textures/transparency.png
new file mode 100644 (file)
index 0000000..1843f27
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/apex/images/textures/transparency.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-constructive.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-constructive.png
new file mode 100644 (file)
index 0000000..53d6441
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-constructive.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-invert.png
new file mode 100644 (file)
index 0000000..d6144e3
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add.png
new file mode 100644 (file)
index 0000000..730d102
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced-invert.png
new file mode 100644 (file)
index 0000000..e074515
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced.png
new file mode 100644 (file)
index 0000000..514ff1d
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert-invert.png
new file mode 100644 (file)
index 0000000..5440113
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert.png
new file mode 100644 (file)
index 0000000..e98a14a
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png
new file mode 100644 (file)
index 0000000..8a07140
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr.png
new file mode 100644 (file)
index 0000000..88db108
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl-invert.png
new file mode 100644 (file)
index 0000000..c6cbec1
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl.png
new file mode 100644 (file)
index 0000000..0afcbfa
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-invert.png
new file mode 100644 (file)
index 0000000..1ff6790
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-primary.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-primary.png
new file mode 100644 (file)
index 0000000..7566598
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-primary.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check.png
new file mode 100644 (file)
index 0000000..9a2c9db
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear-invert.png
new file mode 100644 (file)
index 0000000..5668e12
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear.png
new file mode 100644 (file)
index 0000000..51a33ff
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close-invert.png
new file mode 100644 (file)
index 0000000..7b76ffe
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close.png
new file mode 100644 (file)
index 0000000..4eedfbc
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code-invert.png
new file mode 100644 (file)
index 0000000..23c5983
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code.png
new file mode 100644 (file)
index 0000000..ee58c9a
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse-invert.png
new file mode 100644 (file)
index 0000000..a9d0d33
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse.png
new file mode 100644 (file)
index 0000000..353ac79
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment-invert.png
new file mode 100644 (file)
index 0000000..0ed3528
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment.png
new file mode 100644 (file)
index 0000000..265a3e4
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand-invert.png
new file mode 100644 (file)
index 0000000..05f7138
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand.png
new file mode 100644 (file)
index 0000000..9073d24
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help-invert.png
new file mode 100644 (file)
index 0000000..185c1a2
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help.png
new file mode 100644 (file)
index 0000000..b80df00
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info-invert.png
new file mode 100644 (file)
index 0000000..83b00a2
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info.png
new file mode 100644 (file)
index 0000000..eb0fb46
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link-invert.png
new file mode 100644 (file)
index 0000000..d920459
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link.png
new file mode 100644 (file)
index 0000000..2a087a4
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu-invert.png
new file mode 100644 (file)
index 0000000..0400c19
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu.png
new file mode 100644 (file)
index 0000000..0a78119
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr-invert.png
new file mode 100644 (file)
index 0000000..7c9bdc1
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr.png
new file mode 100644 (file)
index 0000000..fc4cd39
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl-invert.png
new file mode 100644 (file)
index 0000000..e97d37b
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl.png
new file mode 100644 (file)
index 0000000..dbce05e
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture-invert.png
new file mode 100644 (file)
index 0000000..d6dc62c
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture.png
new file mode 100644 (file)
index 0000000..2043424
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-destructive.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-destructive.png
new file mode 100644 (file)
index 0000000..8b6799f
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-destructive.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-invert.png
new file mode 100644 (file)
index 0000000..3343de8
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove.png
new file mode 100644 (file)
index 0000000..9dc34b8
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search-invert.png
new file mode 100644 (file)
index 0000000..3e15daf
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search.png
new file mode 100644 (file)
index 0000000..39d3ab8
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings-invert.png
new file mode 100644 (file)
index 0000000..17b4379
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings.png
new file mode 100644 (file)
index 0000000..dd2706b
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag-invert.png
new file mode 100644 (file)
index 0000000..c233429
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag.png
new file mode 100644 (file)
index 0000000..8e100fc
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window-invert.png
new file mode 100644 (file)
index 0000000..1c6ed1f
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window.png
new file mode 100644 (file)
index 0000000..db726a1
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert-invert.png
new file mode 100644 (file)
index 0000000..28c8704
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert.png
new file mode 100644 (file)
index 0000000..5bf0827
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down-invert.png
new file mode 100644 (file)
index 0000000..226eb5c
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down.png
new file mode 100644 (file)
index 0000000..9a418c9
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr-invert.png
new file mode 100644 (file)
index 0000000..a348495
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr.png
new file mode 100644 (file)
index 0000000..bfed7d2
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl-invert.png
new file mode 100644 (file)
index 0000000..5080ea5
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl.png
new file mode 100644 (file)
index 0000000..0639809
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up-invert.png
new file mode 100644 (file)
index 0000000..0474926
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up.png
new file mode 100644 (file)
index 0000000..ac9f0b5
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required-invert.png
new file mode 100644 (file)
index 0000000..614c6e8
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required.png
new file mode 100644 (file)
index 0000000..45eb03b
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/textures/transparency.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/textures/transparency.png
new file mode 100644 (file)
index 0000000..1843f27
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/mediawiki/images/textures/transparency.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check-invert.png b/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check-invert.png
new file mode 100644 (file)
index 0000000..9be50a6
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check-invert.png differ
diff --git a/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check.png b/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check.png
new file mode 100644 (file)
index 0000000..654a034
Binary files /dev/null and b/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check.png differ
index eb13f59..b01e2cd 100644 (file)
        },
        "ooui-outline-control-move-down": "انقل العنصر للأسفل",
        "ooui-outline-control-move-up": "انقل العنصر للأعلى",
+       "ooui-outline-control-remove": "أزل العنصر",
        "ooui-toolbar-more": "مزيد",
+       "ooui-dialog-message-accept": "موافق",
+       "ooui-dialog-message-reject": "ألغ",
+       "ooui-dialog-process-error": "حدث خطأ",
+       "ooui-dialog-process-dismiss": "أغلق",
        "ooui-dialog-process-retry": "حاول مرة أخرى"
 }
diff --git a/resources/lib/oojs-ui/i18n/arq.json b/resources/lib/oojs-ui/i18n/arq.json
new file mode 100644 (file)
index 0000000..8098781
--- /dev/null
@@ -0,0 +1,16 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Bachounda"
+               ]
+       },
+       "ooui-outline-control-move-down": "هبط الشيئ للتحت",
+       "ooui-outline-control-move-up": "طلع الشيئ للفوق",
+       "ooui-outline-control-remove": "أمحي العنصر",
+       "ooui-toolbar-more": "زيادة",
+       "ooui-dialog-message-accept": "مليح",
+       "ooui-dialog-message-reject": "رجَع",
+       "ooui-dialog-process-error": "حاجه ما خدمتش مليح",
+       "ooui-dialog-process-dismiss": "أرفضها",
+       "ooui-dialog-process-retry": "عاود جرب"
+}
index 44247ca..6959191 100644 (file)
@@ -6,9 +6,13 @@
                        "Y-M D"
                ]
        },
-       "ooui-dialog-action-close": "Serriñ",
        "ooui-outline-control-move-down": "Lakaat an elfenn da ziskenn",
        "ooui-outline-control-move-up": "Lakaat an elfenn da bignat",
        "ooui-outline-control-remove": "Tennañ an elfenn",
-       "ooui-toolbar-more": "Muioc'h"
+       "ooui-toolbar-more": "Muioc'h",
+       "ooui-dialog-message-accept": "Mat eo",
+       "ooui-dialog-message-reject": "Nullañ",
+       "ooui-dialog-process-error": "Un dra bennak a-dreuz a zo bet",
+       "ooui-dialog-process-dismiss": "Disteurel",
+       "ooui-dialog-process-retry": "Klask en-dro"
 }
index fa3089f..cddd46e 100644 (file)
                        "Tifa93"
                ]
        },
-       "ooui-dialog-action-close": "Κλείσιμο",
        "ooui-outline-control-move-down": "Μετακίνηση στοιχείου προς τα κάτω",
        "ooui-outline-control-move-up": "Μετακίνηση στοιχείου προς τα επάνω",
        "ooui-outline-control-remove": "Αφαίρεση στοιχείου",
-       "ooui-toolbar-more": "Περισσότερα"
+       "ooui-toolbar-more": "Περισσότερα",
+       "ooui-dialog-message-accept": "ΟΚ",
+       "ooui-dialog-message-reject": "Ακύρωση",
+       "ooui-dialog-process-error": "Κάτι πήγε στραβά",
+       "ooui-dialog-process-dismiss": "Απόρριψη",
+       "ooui-dialog-process-retry": "Δοκιμάστε ξανά"
 }
index d72b3af..2d8315b 100644 (file)
@@ -6,9 +6,12 @@
                        "The Discoverer"
                ]
        },
-       "ooui-dialog-action-close": "બંધ કરો",
        "ooui-outline-control-move-down": "વસ્તુ નીચે ખસેડો",
        "ooui-outline-control-move-up": "વસ્તુ ઉપર ખસેડો",
        "ooui-outline-control-remove": "વસ્તુ હટાવો",
-       "ooui-toolbar-more": "વધુ"
+       "ooui-toolbar-more": "વધુ",
+       "ooui-dialog-message-accept": "બરાબર",
+       "ooui-dialog-message-reject": "રદ કરો",
+       "ooui-dialog-process-error": "કંઇક ગરબડ થઇ",
+       "ooui-dialog-process-retry": "ફરી પ્રયત્ન કરો"
 }
index f16f984..c3724cf 100644 (file)
@@ -3,12 +3,17 @@
                "authors": [
                        "MaGa",
                        "Roberta F.",
-                       "SpeedyGonsales"
+                       "SpeedyGonsales",
+                       "Zeljko.filipin"
                ]
        },
-       "ooui-dialog-action-close": "zatvori",
        "ooui-outline-control-move-down": "Premjesti stavku dolje",
        "ooui-outline-control-move-up": "Premjesti stavku gore",
        "ooui-outline-control-remove": "Ukloni",
-       "ooui-toolbar-more": "Više mogućnosti"
+       "ooui-toolbar-more": "Više",
+       "ooui-dialog-message-accept": "U redu",
+       "ooui-dialog-message-reject": "Odustani",
+       "ooui-dialog-process-error": "Nešto je pošlo po zlu",
+       "ooui-dialog-process-dismiss": "Zatvori",
+       "ooui-dialog-process-retry": "Pokušajte ponovo"
 }
index 6069625..9117a05 100644 (file)
@@ -13,6 +13,8 @@
        "ooui-outline-control-move-up": "Elem mozgatása felfelé",
        "ooui-outline-control-remove": "Elem eltávolítása",
        "ooui-toolbar-more": "Tovább...",
+       "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Mégse",
+       "ooui-dialog-process-dismiss": "Elrejt",
        "ooui-dialog-process-retry": "Próbáld újra"
 }
index a6705d0..ebb2860 100644 (file)
@@ -2,12 +2,17 @@
        "@metadata": {
                "authors": [
                        "Vacio",
-                       "Xelgen"
+                       "Xelgen",
+                       "Դավիթ Սարոյան"
                ]
        },
-       "ooui-dialog-action-close": "Փակել",
        "ooui-outline-control-move-down": "Իջեցնել կետը",
        "ooui-outline-control-move-up": "Բարձրացնել կետը",
        "ooui-outline-control-remove": "Հեռացնել տարրը",
-       "ooui-toolbar-more": "Ավելին"
+       "ooui-toolbar-more": "Ավելին",
+       "ooui-dialog-message-accept": "Լավ",
+       "ooui-dialog-message-reject": "Չեղարկել",
+       "ooui-dialog-process-error": "Ինչ-որ սխալ է տեղի ունեցել",
+       "ooui-dialog-process-dismiss": "Փակել",
+       "ooui-dialog-process-retry": "Կրկին փորձել"
 }
index 70c1e07..2ac8dc1 100644 (file)
@@ -4,16 +4,17 @@
                        "Fryed-peach",
                        "Miya",
                        "Penn Station",
-                       "Shirayuki"
+                       "Shirayuki",
+                       "Takot"
                ]
        },
-       "ooui-dialog-action-close": "閉じる",
        "ooui-outline-control-move-down": "項目を下に移動させる",
        "ooui-outline-control-move-up": "項目を上に移動させる",
        "ooui-outline-control-remove": "項目を除去",
        "ooui-toolbar-more": "その他",
-       "ooui-dialog-confirm-title": "確認",
-       "ooui-dialog-confirm-default-prompt": "本当によろしいですか?",
-       "ooui-dialog-confirm-default-ok": "OK",
-       "ooui-dialog-confirm-default-cancel": "キャンセル"
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "キャンセル",
+       "ooui-dialog-process-error": "エラーが発生しました…",
+       "ooui-dialog-process-dismiss": "閉じる",
+       "ooui-dialog-process-retry": "もう一度お試しください"
 }
index 85931f5..0b89e37 100644 (file)
@@ -5,13 +5,13 @@
                        "Nayvik"
                ]
        },
-       "ooui-dialog-action-close": "ಮುಚ್ಚಿ",
        "ooui-outline-control-move-down": "ವಸ್ತು ಕೆಲ್ಗೆ ಸ್ಥಲಾನ್ಥರಿಸು",
        "ooui-outline-control-move-up": "ವಸ್ತು ಮೆಲೆ ಸ್ಥಲಾನ್ಥರಿಸು",
        "ooui-outline-control-remove": "ವಸ್ತು ತೆಗೆ",
        "ooui-toolbar-more": "ಹೆಚ್ಚು",
-       "ooui-dialog-confirm-title": "ಧೃಡಪಡಿಸು",
-       "ooui-dialog-confirm-default-prompt": "ನೀವು ಖ‍ಚಿತವಾಗಿದ್ದೀರಾ?",
-       "ooui-dialog-confirm-default-ok": "ಸರಿ",
-       "ooui-dialog-confirm-default-cancel": "ರದ್ದು"
+       "ooui-dialog-message-accept": "ಸರಿ",
+       "ooui-dialog-message-reject": "ರದ್ದು",
+       "ooui-dialog-process-error": "ಎನೋ ಎಡವಟ್ಟಾಗಿದೆ....",
+       "ooui-dialog-process-dismiss": "ತೆಗೆದುಹಾಕು",
+       "ooui-dialog-process-retry": "ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"
 }
index afd8753..82d91ab 100644 (file)
@@ -6,16 +6,17 @@
                        "Kwj2772",
                        "LFM",
                        "아라",
-                       "고기랑"
+                       "고기랑",
+                       "Ryuch"
                ]
        },
-       "ooui-dialog-action-close": "닫기",
        "ooui-outline-control-move-down": "항목을 아래로 옮기기",
        "ooui-outline-control-move-up": "항목을 위로 옮기기",
        "ooui-outline-control-remove": "항목 지우기",
        "ooui-toolbar-more": "더 보기",
-       "ooui-dialog-confirm-title": "확인",
-       "ooui-dialog-confirm-default-prompt": "확실합니까?",
-       "ooui-dialog-confirm-default-ok": "확인",
-       "ooui-dialog-confirm-default-cancel": "취소"
+       "ooui-dialog-message-accept": "확인",
+       "ooui-dialog-message-reject": "취소",
+       "ooui-dialog-process-error": "무언가가 잘못되었습니다",
+       "ooui-dialog-process-dismiss": "숨기기",
+       "ooui-dialog-process-retry": "다시 시도하세요"
 }
index 98b6bce..3fe75e3 100644 (file)
@@ -5,13 +5,15 @@
                        "Event",
                        "Jeblad",
                        "Laaknor",
-                       "Njardarlogar"
+                       "Njardarlogar",
+                       "Jdforrester"
                ]
        },
        "ooui-outline-control-move-down": "Flytt ned",
        "ooui-outline-control-move-up": "Flytt opp",
        "ooui-outline-control-remove": "Fjern element",
        "ooui-toolbar-more": "Mer",
+       "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Avbryt",
        "ooui-dialog-process-error": "Noe gikk galt",
        "ooui-dialog-process-dismiss": "Lukk",
index dbae538..a7b4c08 100644 (file)
                        "Gloria sah"
                ]
        },
-       "ooui-dialog-action-close": "Sluiten",
        "ooui-outline-control-move-down": "Item omlaag verplaatsen",
        "ooui-outline-control-move-up": "Item omhoog verplaatsen",
        "ooui-outline-control-remove": "Item verwijderen",
        "ooui-toolbar-more": "Meer",
-       "ooui-dialog-confirm-title": "Bevestigen",
-       "ooui-dialog-confirm-default-prompt": "Weet u het zeker?",
-       "ooui-dialog-confirm-default-ok": "Oké",
-       "ooui-dialog-confirm-default-cancel": "Annuleren"
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Annuleren",
+       "ooui-dialog-process-error": "Er is iets misgegaan",
+       "ooui-dialog-process-dismiss": "Sluiten",
+       "ooui-dialog-process-retry": "Opnieuw proberen"
 }
index 889b0f6..382317e 100644 (file)
@@ -4,10 +4,13 @@
                        "Milicevic01"
                ]
        },
-       "ooui-dialog-action-close": "Zatvori",
        "ooui-outline-control-move-down": "Premesti stavku na dole",
        "ooui-outline-control-move-up": "Premesti stavku na gore",
        "ooui-outline-control-remove": "Ukloni stavku",
        "ooui-toolbar-more": "Više",
-       "ooui-dialog-confirm-default-prompt": "Jeste li sigurni?"
+       "ooui-dialog-message-accept": "U redu",
+       "ooui-dialog-message-reject": "Otkaži",
+       "ooui-dialog-process-error": "Nešto je pošlo naopako",
+       "ooui-dialog-process-dismiss": "Odbaci",
+       "ooui-dialog-process-retry": "Pokušaj ponovo"
 }
index f9c46d7..510e468 100644 (file)
@@ -5,8 +5,11 @@
                        "Muddyb Blast Producer"
                ]
        },
-       "ooui-dialog-action-close": "Funga",
        "ooui-outline-control-move-down": "Sogeza kipengee chini",
        "ooui-outline-control-move-up": "Sogeza kipengee juu",
-       "ooui-toolbar-more": "Zaidi"
+       "ooui-outline-control-remove": "Toa kitu",
+       "ooui-toolbar-more": "Zaidi",
+       "ooui-dialog-message-accept": "Sawa",
+       "ooui-dialog-message-reject": "Batilisha",
+       "ooui-dialog-process-retry": "Jaribu tena"
 }
index 11aeed4..d6034f0 100644 (file)
                        "Ата"
                ]
        },
-       "ooui-dialog-action-close": "Закрити",
        "ooui-outline-control-move-down": "Перемістити елемент униз",
        "ooui-outline-control-move-up": "Перемістити елемент вгору",
        "ooui-outline-control-remove": "Видалити елемент",
        "ooui-toolbar-more": "Більше",
-       "ooui-dialog-confirm-title": "Підтвердити",
-       "ooui-dialog-confirm-default-prompt": "Ви впевнені?",
-       "ooui-dialog-confirm-default-ok": "Готово",
-       "ooui-dialog-confirm-default-cancel": "Скасувати"
+       "ooui-dialog-message-accept": "Готово",
+       "ooui-dialog-message-reject": "Скасувати",
+       "ooui-dialog-process-error": "Щось пішло не так",
+       "ooui-dialog-process-dismiss": "Приховати",
+       "ooui-dialog-process-retry": "Спробуйте ще раз"
 }
diff --git a/resources/lib/oojs-ui/i18n/yue.json b/resources/lib/oojs-ui/i18n/yue.json
new file mode 100644 (file)
index 0000000..81ad9a9
--- /dev/null
@@ -0,0 +1,16 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Deryck Chan"
+               ]
+       },
+       "ooui-outline-control-move-down": "向下搬",
+       "ooui-outline-control-move-up": "向上搬",
+       "ooui-outline-control-remove": "拎走",
+       "ooui-toolbar-more": "仲有...",
+       "ooui-dialog-message-accept": "好",
+       "ooui-dialog-message-reject": "取消",
+       "ooui-dialog-process-error": "唔對路",
+       "ooui-dialog-process-dismiss": "閂咗佢",
+       "ooui-dialog-process-retry": "再試過"
+}
index 05fb20d..cde5ffe 100644 (file)
@@ -23,6 +23,6 @@
        "ooui-dialog-message-accept": "確定",
        "ooui-dialog-message-reject": "取消",
        "ooui-dialog-process-error": "發生不明錯誤",
-       "ooui-dialog-process-dismiss": "放棄",
+       "ooui-dialog-process-dismiss": "關閉",
        "ooui-dialog-process-retry": "再試一次"
 }
diff --git a/resources/lib/oojs-ui/images/anchor.svg b/resources/lib/oojs-ui/images/anchor.svg
deleted file mode 100644 (file)
index 3694391..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="15" height="8" viewBox="0 0 15 8">
-    <g id="anchor">
-        <polygon id="outline" style="fill:#808080;" points="7.609,2.499 2.096,8 13.125,8"/>
-        <polygon id="fill" style="fill:#FFFFFF;" points="7.609,3 2.598,8 12.622,8"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/accept.png b/resources/lib/oojs-ui/images/icons/accept.png
deleted file mode 100644 (file)
index 1075110..0000000
Binary files a/resources/lib/oojs-ui/images/icons/accept.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/accept.svg b/resources/lib/oojs-ui/images/icons/accept.svg
deleted file mode 100644 (file)
index b385a74..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="accept" opacity=".75">
-        <path id="check" d="M19.062 5.139l-1.644-1.139-8.551 12.357-3.454-3.454-1.413 1.413 5.021 5.022z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/add-item.png b/resources/lib/oojs-ui/images/icons/add-item.png
deleted file mode 100644 (file)
index 5cf353f..0000000
Binary files a/resources/lib/oojs-ui/images/icons/add-item.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/add-item.svg b/resources/lib/oojs-ui/images/icons/add-item.svg
deleted file mode 100644 (file)
index c42731a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="add-item" opacity=".75">
-        <path id="plus" d="M13 8h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/advanced.png b/resources/lib/oojs-ui/images/icons/advanced.png
deleted file mode 100644 (file)
index 7f5ada5..0000000
Binary files a/resources/lib/oojs-ui/images/icons/advanced.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/advanced.svg b/resources/lib/oojs-ui/images/icons/advanced.svg
deleted file mode 100644 (file)
index 0f85e44..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="settings" opacity=".75">
-        <path id="gear" d="M20.869 13.476c.079-.482.131-.972.131-1.476s-.052-.994-.131-1.476l-2.463-.259c-.149-.556-.367-1.082-.648-1.57l1.558-1.924c-.576-.806-1.281-1.511-2.087-2.087l-1.924 1.558c-.488-.281-1.015-.499-1.57-.648l-.259-2.463c-.482-.079-.972-.131-1.476-.131s-.994.052-1.476.131l-.259 2.463c-.555.149-1.081.367-1.57.648l-1.924-1.557c-.805.576-1.51 1.281-2.086 2.086l1.558 1.924c-.281.488-.499 1.015-.648 1.57l-2.463.259c-.08.482-.132.972-.132 1.476s.052.994.131 1.476l2.463.259c.149.556.367 1.082.648 1.57l-1.558 1.924c.576.806 1.281 1.511 2.087 2.087l1.924-1.558c.488.281 1.015.499 1.57.648l.259 2.463c.482.079.972.131 1.476.131s.994-.052 1.476-.131l.259-2.463c.556-.149 1.082-.367 1.57-.648l1.924 1.558c.806-.576 1.511-1.281 2.087-2.087l-1.558-1.924c.281-.488.499-1.015.648-1.57l2.463-.259zm-8.869 2.522c-2.209 0-3.998-1.789-3.998-3.998s1.789-3.998 3.998-3.998 3.998 1.789 3.998 3.998-1.789 3.998-3.998 3.998z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/alert.png b/resources/lib/oojs-ui/images/icons/alert.png
deleted file mode 100644 (file)
index 992ea2a..0000000
Binary files a/resources/lib/oojs-ui/images/icons/alert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/alert.svg b/resources/lib/oojs-ui/images/icons/alert.svg
deleted file mode 100644 (file)
index 819e062..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="alert" opacity=".75">
-        <path id="point" d="M11 16h2v2h-2z"/>
-        <path id="stroke" d="M13.516 10h-3l.484 5h2z"/>
-        <path id="triangle" d="M12.017 5.974l7.519 13.026h-15.04l7.521-13.026m0-2.474c-.544 0-1.088.357-1.5 1.071l-7.985 13.831c-.825 1.429-.15 2.598 1.5 2.598h15.968c1.65 0 2.325-1.169 1.5-2.599l-7.983-13.829c-.413-.715-.956-1.072-1.5-1.072z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/arched-arrow-ltr.png b/resources/lib/oojs-ui/images/icons/arched-arrow-ltr.png
deleted file mode 100644 (file)
index 5db1c4d..0000000
Binary files a/resources/lib/oojs-ui/images/icons/arched-arrow-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/arched-arrow-ltr.svg b/resources/lib/oojs-ui/images/icons/arched-arrow-ltr.svg
deleted file mode 100644 (file)
index 9fd2866..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="arched-arrow-ltr" opacity=".75">
-        <path id="arrow" d="M19.925 14.937l-2.391-6.901-1.48 2.329c-.964-.845-2.699-1.85-5.513-1.823-4.887.046-6.524 4.244-6.524 4.244s2.753-2.639 6.925-1.949c1.729.286 3.007 1.206 3.675 1.791l-1.474 2.319 6.782-.01z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/arched-arrow-rtl.png b/resources/lib/oojs-ui/images/icons/arched-arrow-rtl.png
deleted file mode 100644 (file)
index 7931971..0000000
Binary files a/resources/lib/oojs-ui/images/icons/arched-arrow-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/arched-arrow-rtl.svg b/resources/lib/oojs-ui/images/icons/arched-arrow-rtl.svg
deleted file mode 100644 (file)
index b16c1b4..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="arched-arrow-rtl" opacity=".75">
-        <path id="arrow" d="M13.401 8.542c-2.814-.027-4.549.978-5.513 1.823l-1.48-2.329-2.391 6.901 6.782.009-1.474-2.319c.668-.584 1.945-1.504 3.675-1.791 4.172-.69 6.925 1.949 6.925 1.949s-1.637-4.197-6.524-4.243z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/check.png b/resources/lib/oojs-ui/images/icons/check.png
deleted file mode 100644 (file)
index 82c3cb4..0000000
Binary files a/resources/lib/oojs-ui/images/icons/check.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/check.svg b/resources/lib/oojs-ui/images/icons/check.svg
deleted file mode 100644 (file)
index 8d4a1f8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
-    <g id="check">
-        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/clear.png b/resources/lib/oojs-ui/images/icons/clear.png
deleted file mode 100644 (file)
index 697dd62..0000000
Binary files a/resources/lib/oojs-ui/images/icons/clear.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/clear.svg b/resources/lib/oojs-ui/images/icons/clear.svg
deleted file mode 100644 (file)
index 8409c67..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="clear" opacity=".75">
-        <path id="circle-with-strike" d="M11.999 5.022c-3.853 0-6.977 3.124-6.977 6.978 0 3.853 3.124 6.978 6.977 6.978 3.854 0 6.979-3.125 6.979-6.978 0-3.854-3.125-6.978-6.979-6.978zm-5.113 6.978c0-1.092.572-3.25.93-2.929l7.113 7.113c.488.525-1.837.931-2.93.931-2.825-.001-5.113-2.291-5.113-5.115zm9.298 2.929l-7.114-7.113c-.445-.483 1.837-.931 2.929-.931 2.827 0 5.115 2.289 5.115 5.114 0 1.093-.364 3.543-.93 2.93z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/close.png b/resources/lib/oojs-ui/images/icons/close.png
deleted file mode 100644 (file)
index f7eed9f..0000000
Binary files a/resources/lib/oojs-ui/images/icons/close.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/close.svg b/resources/lib/oojs-ui/images/icons/close.svg
deleted file mode 100644 (file)
index 3c0ab46..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="close" opacity=".75">
-        <path id="x" d="M18.717 6.697l-1.414-1.414-5.303 5.303-5.303-5.303-1.414 1.414 5.303 5.303-5.303 5.303 1.414 1.414 5.303-5.303 5.303 5.303 1.414-1.414-5.303-5.303z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/code.png b/resources/lib/oojs-ui/images/icons/code.png
deleted file mode 100644 (file)
index a5ebdbf..0000000
Binary files a/resources/lib/oojs-ui/images/icons/code.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/code.svg b/resources/lib/oojs-ui/images/icons/code.svg
deleted file mode 100644 (file)
index a45ab1e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
-    <g id="code" opacity=".75">
-        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1v-2.386c0-.514.024-.896.073-1.142.054-.252.139-.463.257-.633.204-.279.473-.475.808-.584.335-.115.872-.255 1.835-.255h1.027v1h-.752c-.457 0-.77.191-.936.408-.167.215-.312.445-.312 1.068v1.857c0 .729-.041 1.18-.244 1.493-.2.307-.562.529-1.09.667.535.155.9.385 1.096.688.199.303.238.757.238 1.484v1.862c0 .619.145.848.312 1.062.166.22.479.407.936.407l.752.004v1h-1.027c-.963 0-1.5-.133-1.835-.248-.335-.109-.604-.307-.808-.591-.118-.165-.203-.374-.257-.625-.049-.253-.073-.636-.073-1.149v-2.387c0-1 0-1-1-1h-1z"/>
-        <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/collapse.png b/resources/lib/oojs-ui/images/icons/collapse.png
deleted file mode 100644 (file)
index 38b796f..0000000
Binary files a/resources/lib/oojs-ui/images/icons/collapse.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/collapse.svg b/resources/lib/oojs-ui/images/icons/collapse.svg
deleted file mode 100644 (file)
index c677e9e..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="collapse" opacity=".75">
-        <path id="arrow" d="M6.697 15.714l5.303-5.302 5.303 5.302 1.414-1.414-6.717-6.717-6.717 6.717z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/comment.png b/resources/lib/oojs-ui/images/icons/comment.png
deleted file mode 100644 (file)
index 9546455..0000000
Binary files a/resources/lib/oojs-ui/images/icons/comment.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/comment.svg b/resources/lib/oojs-ui/images/icons/comment.svg
deleted file mode 100644 (file)
index 0348035..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="comment" opacity=".75">
-        <path id="speech-bubble" d="M15 6h-6c-1.657 0-3 1.344-3 3v4c0 1.656 1.343 3 3 3v3l3-3h3c1.657 0 3-1.344 3-3v-4c0-1.656-1.343-3-3-3z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/expand.png b/resources/lib/oojs-ui/images/icons/expand.png
deleted file mode 100644 (file)
index e90aca1..0000000
Binary files a/resources/lib/oojs-ui/images/icons/expand.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/expand.svg b/resources/lib/oojs-ui/images/icons/expand.svg
deleted file mode 100644 (file)
index f41b9f9..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="expand" opacity=".75">
-        <path id="arrow" d="M17.303 8.283l-5.303 5.303-5.303-5.303-1.414 1.414 6.717 6.717 6.717-6.717z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/help.png b/resources/lib/oojs-ui/images/icons/help.png
deleted file mode 100644 (file)
index dca745b..0000000
Binary files a/resources/lib/oojs-ui/images/icons/help.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/help.svg b/resources/lib/oojs-ui/images/icons/help.svg
deleted file mode 100644 (file)
index ce129a7..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="help" opacity=".75">
-        <path id="circle" d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/>
-        <g id="question-mark">
-            <path id="top" d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/>
-            <path id="bottom" d="M11 16h2v2h-2z"/>
-        </g>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/history.png b/resources/lib/oojs-ui/images/icons/history.png
deleted file mode 100644 (file)
index c049931..0000000
Binary files a/resources/lib/oojs-ui/images/icons/history.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/history.svg b/resources/lib/oojs-ui/images/icons/history.svg
deleted file mode 100644 (file)
index 91e072f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="history" opacity=".75">
-        <path id="clock-hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.559 1.702-6.559s-4.35 5.363-4.877 6.699c-.463 1.168 1.459 2.209 2.346 1.678 1.9.551 4.834 1.244 4.834 1.244z"/>
-        <path id="arrow" d="M12.086 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 1.783.476 3.454 1.301 4.898l-2.223 2.04h5.688v-5.219l-2.066 1.896c-.55-1.088-.866-2.312-.866-3.615 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083-1.145 0-2.228-.247-3.213-.678l-.833 1.634c1.235.557 2.602.874 4.045.874 5.476 0 9.914-4.438 9.914-9.914-.001-5.477-4.439-9.915-9.915-9.915z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/info.png b/resources/lib/oojs-ui/images/icons/info.png
deleted file mode 100644 (file)
index f43804d..0000000
Binary files a/resources/lib/oojs-ui/images/icons/info.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/info.svg b/resources/lib/oojs-ui/images/icons/info.svg
deleted file mode 100644 (file)
index 9ba57d7..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
-    <g id="info" opacity=".75">
-        <path id="circled-i" d="M11.499 17c-3.036 0-5.499-2.464-5.499-5.5 0-3.037 2.462-5.5 5.499-5.5 3.037 0 5.501 2.462 5.501 5.5 0 3.036-2.464 5.5-5.501 5.5zm.002-12c-3.591 0-6.501 2.91-6.501 6.5s2.91 6.5 6.501 6.5c3.588 0 6.499-2.911 6.499-6.5s-2.911-6.5-6.499-6.5zM12 10v4h1v1h-3v-1h1v-3h-1v-1zM11 8h1v1h-1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/link.png b/resources/lib/oojs-ui/images/icons/link.png
deleted file mode 100644 (file)
index 7dfa268..0000000
Binary files a/resources/lib/oojs-ui/images/icons/link.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/link.svg b/resources/lib/oojs-ui/images/icons/link.svg
deleted file mode 100644 (file)
index fcb06be..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="link" opacity=".75">
-        <path id="right" d="M19.188 12.001c0 1.1-.891 2.015-1.988 2.015l-4.195-.015c.538 1.088.963 1.999 1.997 1.999h3c1.656 0 2.998-2.343 2.998-4s-1.342-4-2.998-4h-3c-1.034 0-1.459.911-1.998 1.999l4.195-.015c1.098 0 1.989.917 1.989 2.017z"/>
-        <path id="center" d="M8 12c0 .535.42 1 .938 1h6.109c.518 0 .938-.465.938-1 0-.534-.42-1-.938-1h-6.109c-.518 0-.938.466-.938 1z"/>
-        <path id="left" d="M4.816 11.999c0-1.1.891-2.015 1.988-2.015l4.196.015c-.539-1.088-.964-1.999-1.998-1.999h-3c-1.656 0-2.998 2.343-2.998 4s1.342 4 2.998 4h3c1.034 0 1.459-.911 1.998-1.999l-4.195.015c-1.098 0-1.989-.917-1.989-2.017z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/menu.png b/resources/lib/oojs-ui/images/icons/menu.png
deleted file mode 100644 (file)
index b5ac60f..0000000
Binary files a/resources/lib/oojs-ui/images/icons/menu.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/menu.svg b/resources/lib/oojs-ui/images/icons/menu.svg
deleted file mode 100644 (file)
index 2d04789..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="menu" opacity=".75">
-        <path id="lines" d="M6 15h12c.553 0 1 .447 1 1v1c0 .553-.447 1-1 1h-12c-.553 0-1-.447-1-1v-1c0-.553.447-1 1-1zm-1-4v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1zm0-5v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/move-ltr.png b/resources/lib/oojs-ui/images/icons/move-ltr.png
deleted file mode 100644 (file)
index ded5f05..0000000
Binary files a/resources/lib/oojs-ui/images/icons/move-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/move-ltr.svg b/resources/lib/oojs-ui/images/icons/move-ltr.svg
deleted file mode 100644 (file)
index eea75d8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="move-ltr" opacity=".75">
-        <path id="arrow" d="M8.935 7.181l5.302 5.302-5.302 5.303 1.414 1.414 6.716-6.717-6.716-6.716z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/move-rtl.png b/resources/lib/oojs-ui/images/icons/move-rtl.png
deleted file mode 100644 (file)
index fc6e62d..0000000
Binary files a/resources/lib/oojs-ui/images/icons/move-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/move-rtl.svg b/resources/lib/oojs-ui/images/icons/move-rtl.svg
deleted file mode 100644 (file)
index 2dc5eaf..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="move-rtl" opacity=".75">
-        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.414-6.716 6.716 6.716 6.717z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/picture.png b/resources/lib/oojs-ui/images/icons/picture.png
deleted file mode 100644 (file)
index faf8af9..0000000
Binary files a/resources/lib/oojs-ui/images/icons/picture.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/picture.svg b/resources/lib/oojs-ui/images/icons/picture.svg
deleted file mode 100644 (file)
index 4862fbc..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="picture" opacity=".75">
-        <path id="frame" d="M18 4h-12c-2-.007-3 .993-3 2.993l.014 9.007c-.014 2 .986 2.988 2.986 3h12c2-.012 2.994-1 3-3.006v-9.001c-.006-2-1-3-3-2.993zm1 13h-14v-11h14v11z"/>
-        <path id="mountains" d="M6 13.5l3.5-3.5 2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12z"/>
-        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172 2.938-2.016 2.5 2v-4h-12z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/remove-item.png b/resources/lib/oojs-ui/images/icons/remove-item.png
deleted file mode 100644 (file)
index 2f11db3..0000000
Binary files a/resources/lib/oojs-ui/images/icons/remove-item.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/remove-item.svg b/resources/lib/oojs-ui/images/icons/remove-item.svg
deleted file mode 100644 (file)
index 723e70f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
-    <g id="remove-item">
-        <path id="minus" d="M8 11h8v2h-8z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/remove.png b/resources/lib/oojs-ui/images/icons/remove.png
deleted file mode 100644 (file)
index d7e116c..0000000
Binary files a/resources/lib/oojs-ui/images/icons/remove.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/remove.svg b/resources/lib/oojs-ui/images/icons/remove.svg
deleted file mode 100644 (file)
index 61f4d2d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="remove" opacity=".75">
-        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0h-1v6h1v-6zm4 0h-1v6h1v-6zm0-4v-1h-5v1h-3v3h1v7.966l1 1.031v-.074.077h6.984l.016-.018v.015l1-1.031v-7.966h1v-3h-3zm1 11h-7v-8h7v8zm1-9h-9v-1h9v1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/search.png b/resources/lib/oojs-ui/images/icons/search.png
deleted file mode 100644 (file)
index df29792..0000000
Binary files a/resources/lib/oojs-ui/images/icons/search.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/search.svg b/resources/lib/oojs-ui/images/icons/search.svg
deleted file mode 100644 (file)
index 75b38c8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="search" opacity=".75">
-        <path id="magnifying-glass" d="M16.021 15.96l-2.374-2.375-.169-.099c.403-.566.643-1.26.643-2.009-.001-1.92-1.558-3.477-3.477-3.477-1.921 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.749 0 1.442-.239 2.01-.643l.098.169 2.375 2.374c.19.189.543.143.79-.104s.293-.601.104-.791zm-5.377-2.27c-1.221 0-2.213-.991-2.213-2.213 0-1.221.992-2.213 2.213-2.213 1.222 0 2.213.992 2.213 2.213-.001 1.222-.992 2.213-2.213 2.213z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/settings.png b/resources/lib/oojs-ui/images/icons/settings.png
deleted file mode 100644 (file)
index b1b35e9..0000000
Binary files a/resources/lib/oojs-ui/images/icons/settings.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/settings.svg b/resources/lib/oojs-ui/images/icons/settings.svg
deleted file mode 100644 (file)
index 6e45b60..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
-    <g id="settings" opacity=".75">
-        <path id="gear" d="M3 4h3v2h-3zM12 4h9v2h-9zM8 3h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 11h9v2h-9zM18 11h3v2h-3zM14 10h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 18h6v2h-6zM15 18h6v2h-6zM11 17h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/tag.png b/resources/lib/oojs-ui/images/icons/tag.png
deleted file mode 100644 (file)
index 722f4d7..0000000
Binary files a/resources/lib/oojs-ui/images/icons/tag.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/tag.svg b/resources/lib/oojs-ui/images/icons/tag.svg
deleted file mode 100644 (file)
index 1d61b81..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="tag" opacity=".75">
-        <path d="M18.748 11.717c.389.389.389 1.025 0 1.414l-4.949 4.95c-.389.389-1.025.389-1.414 0l-6.01-6.01c-.389-.389-.707-1.157-.707-1.707l-.001-4.364c0-.55.45-1 1-1h4.364c.55 0 1.318.318 1.707.707l6.01 6.01zm-10.644-4.261c-.579.576-.578 1.514-.001 2.093.578.577 1.516.577 2.095.001.576-.578.576-1.517 0-2.095-.581-.576-1.518-.577-2.094.001z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/icons/window.png b/resources/lib/oojs-ui/images/icons/window.png
deleted file mode 100644 (file)
index 3d48a3c..0000000
Binary files a/resources/lib/oojs-ui/images/icons/window.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/window.svg b/resources/lib/oojs-ui/images/icons/window.svg
deleted file mode 100644 (file)
index 802f295..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="window" opacity=".75">
-        <path id="title" d="M7 10h10v1h-10z"/>
-        <path id="window" d="M16 19h-8c-2.206 0-4-1.794-4-4v-6c0-2.206 1.794-4 4-4h8c2.206 0 4 1.794 4 4v6c0 2.206-1.794 4-4 4zm-8-12c-1.103 0-2 .897-2 2v6c0 1.103.897 2 2 2h8c1.103 0 2-.897 2-2v-6c0-1.103-.897-2-2-2h-8z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/alert.png b/resources/lib/oojs-ui/images/indicators/alert.png
deleted file mode 100644 (file)
index bfc83e7..0000000
Binary files a/resources/lib/oojs-ui/images/indicators/alert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/indicators/alert.svg b/resources/lib/oojs-ui/images/indicators/alert.svg
deleted file mode 100644 (file)
index e2e49a8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="alert" opacity=".75">
-        <path d="M6 12c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2v-5h-2zm0 3h2v-2h-2z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-down.png b/resources/lib/oojs-ui/images/indicators/arrow-down.png
deleted file mode 100644 (file)
index 64e3bac..0000000
Binary files a/resources/lib/oojs-ui/images/indicators/arrow-down.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-down.svg b/resources/lib/oojs-ui/images/indicators/arrow-down.svg
deleted file mode 100644 (file)
index 55670de..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="down" opacity=".75">
-        <path id="arrow" d="M2 3l3.5 6 3.5-6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-ltr.png b/resources/lib/oojs-ui/images/indicators/arrow-ltr.png
deleted file mode 100644 (file)
index 4eafd0f..0000000
Binary files a/resources/lib/oojs-ui/images/indicators/arrow-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-ltr.svg b/resources/lib/oojs-ui/images/indicators/arrow-ltr.svg
deleted file mode 100644 (file)
index 5092d88..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="ltr" opacity=".75">
-        <path id="arrow" d="M3 9v-7l6 3.5z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-rtl.png b/resources/lib/oojs-ui/images/indicators/arrow-rtl.png
deleted file mode 100644 (file)
index ce13ba0..0000000
Binary files a/resources/lib/oojs-ui/images/indicators/arrow-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-rtl.svg b/resources/lib/oojs-ui/images/indicators/arrow-rtl.svg
deleted file mode 100644 (file)
index 8d39de8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="rtl" opacity=".75">
-        <path id="arrow" d="M3 5.5l6 3.5v-7z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-up.png b/resources/lib/oojs-ui/images/indicators/arrow-up.png
deleted file mode 100644 (file)
index 401cde6..0000000
Binary files a/resources/lib/oojs-ui/images/indicators/arrow-up.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-up.svg b/resources/lib/oojs-ui/images/indicators/arrow-up.svg
deleted file mode 100644 (file)
index b9d725e..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="up" opacity=".75">
-        <path id="arrow" d="M5.5 2l-3.5 6h7z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/required.png b/resources/lib/oojs-ui/images/indicators/required.png
deleted file mode 100644 (file)
index d10e0d4..0000000
Binary files a/resources/lib/oojs-ui/images/indicators/required.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/indicators/required.svg b/resources/lib/oojs-ui/images/indicators/required.svg
deleted file mode 100644 (file)
index 45035f4..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="required" opacity=".75">
-        <path d="M5 1h2v10h-2zM9.83 2.634l1 1.732-8.66 5-1-1.732zM1.17 4.366l1-1.732 8.66 5-1 1.732z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/images/textures/pending.gif b/resources/lib/oojs-ui/images/textures/pending.gif
deleted file mode 100644 (file)
index 1194eed..0000000
Binary files a/resources/lib/oojs-ui/images/textures/pending.gif and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/textures/transparency.png b/resources/lib/oojs-ui/images/textures/transparency.png
deleted file mode 100644 (file)
index b8e36d3..0000000
Binary files a/resources/lib/oojs-ui/images/textures/transparency.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/toolbar-shadow.png b/resources/lib/oojs-ui/images/toolbar-shadow.png
deleted file mode 100644 (file)
index 97e8d13..0000000
Binary files a/resources/lib/oojs-ui/images/toolbar-shadow.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/oojs-ui-agora.css b/resources/lib/oojs-ui/oojs-ui-agora.css
deleted file mode 100644 (file)
index 22c3079..0000000
+++ /dev/null
@@ -1,394 +0,0 @@
-/*!
- * OOjs UI v0.1.0-pre (0e50d2e336)
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-08-06T12:56:55Z
- */
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  position: absolute;
-  right: 0;
-  left: 0;
-  overflow: hidden;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-dialog-content > .oo-ui-window-head {
-  top: 0;
-  z-index: 1;
-}
-
-.oo-ui-dialog-content > .oo-ui-window-body {
-  top: 0;
-  bottom: 0;
-  z-index: 2;
-}
-
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  bottom: 0;
-  z-index: 1;
-}
-
-.oo-ui-dialog-content > .oo-ui-window-overlay {
-  z-index: 3;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  background-color: rgba(255, 255, 255, 0.5);
-  opacity: 0;
-  -webkit-transition: opacity 250ms ease-in-out;
-     -moz-transition: opacity 250ms ease-in-out;
-      -ms-transition: opacity 250ms ease-in-out;
-       -o-transition: opacity 250ms ease-in-out;
-          transition: opacity 250ms ease-in-out;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 1em;
-  bottom: 1em;
-  background-color: #fff;
-  -webkit-transform: translate3d(0, -200%, 0);
-     -moz-transform: translate3d(0, -200%, 0);
-      -ms-transform: translate3d(0, -200%, 0);
-       -o-transform: translate3d(0, -200%, 0);
-          transform: translate3d(0, -200%, 0);
-  -webkit-transition: transform 250ms ease-in-out;
-     -moz-transition: transform 250ms ease-in-out;
-      -ms-transition: transform 250ms ease-in-out;
-       -o-transition: transform 250ms ease-in-out;
-          transition: transform 250ms ease-in-out;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-  opacity: 1;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-  -webkit-transform: translate3d(0, 0, 0);
-     -moz-transform: translate3d(0, 0, 0);
-      -ms-transform: translate3d(0, 0, 0);
-       -o-transform: translate3d(0, 0, 0);
-          transform: translate3d(0, 0, 0);
-}
-
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-  border: solid 1px #ccc;
-  border-radius: 0.5em;
-  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
-
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-  display: block;
-  padding-top: 0.5em;
-  text-align: center;
-}
-
-.oo-ui-messageDialog-title {
-  font-size: 1.5em;
-  line-height: 1em;
-  color: #000;
-}
-
-.oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
-}
-
-.oo-ui-messageDialog-message-verbose {
-  font-size: 1.1em;
-  line-height: 1.5em;
-  text-align: left;
-}
-
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  border-right: solid 1px #e5e5e5;
-}
-
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-  border-right-width: 0;
-}
-
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  border-bottom: solid 1px #e5e5e5;
-}
-
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-  border-bottom-width: 0;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label {
-  padding: 0 2em;
-  line-height: 3.4em;
-  text-align: center;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
-  font-weight: bold;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-
-.oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.35em;
-  border-bottom: 1px solid #dddddd;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.35em;
-  padding: 2em 0;
-}
-
-.oo-ui-processDialog-navigation {
-  position: relative;
-  height: 3.35em;
-  padding: 0 1em;
-}
-
-.oo-ui-processDialog-location {
-  height: 3.35em;
-  padding: 0.25em 0;
-  text-align: center;
-  cursor: default;
-}
-
-.oo-ui-processDialog-title {
-  font-weight: bold;
-  line-height: 1.85em;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonedElement-button {
-  min-width: 1.85em;
-  min-height: 1.85em;
-  padding: 0.35em 0.75em;
-  border: 1px solid #dddddd;
-  border-radius: 4px;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labeledElement-label {
-  padding: 0 1em;
-  font-weight: bold;
-  line-height: 1.85em;
-  color: #777777;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconedElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconedElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconedElement-icon {
-  position: absolute;
-  margin-top: -0.125em;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  vertical-align: middle;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button {
-  border: 1px solid transparent;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-labeledElement-label {
-  color: #d11d13;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonedElement-button {
-  padding: 0.75em 0.35em;
-  border: none;
-  border-radius: 0;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button {
-  background-color: #347bff;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
-  color: #ffffff;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
-  left: 0.5em;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
-  padding-left: 2.25em;
-}
-
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
-  right: 0.5em;
-}
-
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
-  padding-right: 2.25em;
-}
-
-.oo-ui-processDialog-actions-other {
-  position: absolute;
-  bottom: 1em;
-}
-
-.oo-ui-processDialog > .oo-ui-window-frame {
-  min-height: 5em;
-}
-
-.oo-ui-processDialog-errors {
-  padding: 3em 3em 1.5em 3em;
-  text-align: center;
-  background-color: rgba(255, 255, 255, 0.9);
-}
-
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-  margin: 2em 1em 2em 1em;
-}
-
-.oo-ui-processDialog-errors-title {
-  margin-bottom: 2em;
-  font-size: 1.5em;
-  color: #000;
-}
-
-.oo-ui-processDialog-error {
-  padding: 1em;
-  margin: 1em;
-  text-align: left;
-  background-color: #fff7f7;
-  border: solid 1px #ff9e9e;
-  border-radius: 0.25em;
-}
-
-.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  width: 3.35em;
-  height: 3.35em;
-  background-size: 2em auto;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  padding: 0 0 1em;
-}
-
-.oo-ui-panelLayout {
-  padding: 1em 3.35em;
-}
-
-.oo-ui-optionWidget {
-  padding: 0.8em 1em 0.8em 3.35em;
-  font-weight: bold;
-  border-bottom: 1px solid #dddddd;
-}
-
-.oo-ui-optionWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label {
-  padding-right: 1.5em;
-}
-
-.oo-ui-optionWidget-level-0 {
-  padding-left: 3.5em;
-}
-
-.oo-ui-optionWidget-level-0 .oo-ui-iconedElement-icon {
-  left: 1em;
-}
-
-.oo-ui-optionWidget-level-1 {
-  padding-left: 5em;
-}
-
-.oo-ui-optionWidget-level-1 .oo-ui-iconedElement-icon {
-  left: 2.5em;
-}
-
-.oo-ui-optionWidget-level-2 {
-  padding-left: 6.5em;
-}
-
-.oo-ui-optionWidget-level-2 .oo-ui-iconedElement-icon {
-  left: 4em;
-}
-
-.oo-ui-buttonOptionWidget {
-  padding: 0;
-}
-
-.oo-ui-lookupWidget-menu {
-  background-color: #fff;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  color: #ffffff;
-  background: #347bff;
-}
-
-.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
-  background-size: 24px auto;
-}
-
-.oo-ui-menuSectionItemWidget {
-  font-weight: normal;
-  color: #777777;
-  border: none;
-}
-
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  padding: .8em 1em;
-}
-
-/* Icons */
-
-.oo-ui-icon-check {
-  background: #347bff;
-  background-image: /* @embed */ url(themes/agora/images/icons/check.svg);
-}
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/oojs-ui-agora.rtl.css b/resources/lib/oojs-ui/oojs-ui-agora.rtl.css
deleted file mode 100644 (file)
index fef9ba5..0000000
+++ /dev/null
@@ -1,420 +0,0 @@
-/*!
- * OOjs UI v0.1.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-07-22T21:39:24Z
- */
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  position: absolute;
-  left: 0;
-  right: 0;
-  overflow: hidden;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-dialog-content > .oo-ui-window-head {
-  top: 0;
-  z-index: 1;
-}
-
-.oo-ui-dialog-content > .oo-ui-window-body {
-  top: 0;
-  bottom: 0;
-  z-index: 2;
-}
-
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  bottom: 0;
-  z-index: 1;
-}
-
-.oo-ui-dialog-content > .oo-ui-window-overlay {
-  z-index: 3;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  background-color: rgba(255, 255, 255, 0.5);
-  opacity: 0;
-  -webkit-transition: opacity 250ms ease-in-out;
-     -moz-transition: opacity 250ms ease-in-out;
-      -ms-transition: opacity 250ms ease-in-out;
-       -o-transition: opacity 250ms ease-in-out;
-          transition: opacity 250ms ease-in-out;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 1em;
-  bottom: 1em;
-  background-color: #fff;
-  -webkit-transform: translate3d(0, -200%, 0);
-     -moz-transform: translate3d(0, -200%, 0);
-      -ms-transform: translate3d(0, -200%, 0);
-       -o-transform: translate3d(0, -200%, 0);
-          transform: translate3d(0, -200%, 0);
-  -webkit-transition: transform 250ms ease-in-out;
-     -moz-transition: transform 250ms ease-in-out;
-      -ms-transition: transform 250ms ease-in-out;
-       -o-transition: transform 250ms ease-in-out;
-          transition: transform 250ms ease-in-out;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-  opacity: 1;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-  -webkit-transform: translate3d(0, 0, 0);
-     -moz-transform: translate3d(0, 0, 0);
-      -ms-transform: translate3d(0, 0, 0);
-       -o-transform: translate3d(0, 0, 0);
-          transform: translate3d(0, 0, 0);
-}
-
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-  border: solid 1px #ccc;
-  border-radius: 0.5em;
-  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
-
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-  display: block;
-  padding-top: 0.5em;
-  text-align: center;
-}
-
-.oo-ui-messageDialog-title {
-  font-size: 1.5em;
-  line-height: 1em;
-  color: #000;
-}
-
-.oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
-}
-
-.oo-ui-messageDialog-message-verbose {
-  font-size: 1.1em;
-  line-height: 1.5em;
-  text-align: right;
-}
-
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  border-left: solid 1px #e5e5e5;
-}
-
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-  border-left-width: 0;
-}
-
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  border-bottom: solid 1px #e5e5e5;
-}
-
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-  border-bottom-width: 0;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label {
-  padding: 0 2em;
-  line-height: 3.4em;
-  text-align: center;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
-  font-weight: bold;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-
-.oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.35em;
-  border-bottom: 1px solid #dddddd;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.35em;
-  padding: 2em 0;
-}
-
-.oo-ui-processDialog-navigation {
-  position: relative;
-  height: 3.35em;
-  padding: 0 1em;
-}
-
-.oo-ui-processDialog-location {
-  height: 3.35em;
-  padding: 0.25em 0;
-  text-align: center;
-  cursor: default;
-}
-
-.oo-ui-processDialog-title {
-  font-weight: bold;
-  line-height: 1.85em;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonedElement-button {
-  min-width: 1.85em;
-  min-height: 1.85em;
-  padding-top: 0.75em;
-  padding-bottom: 0.75em;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labeledElement-label {
-  padding: 0 1em;
-  line-height: 1.85em;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconedElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconedElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconedElement-icon {
-  position: absolute;
-  margin-top: -0.125em;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
-  margin: 0.75em 0.75em 0.75em 0;
-  border: solid 1px #ccc;
-  border-radius: 0.25em;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  padding: 0;
-  vertical-align: middle;
-}
-
-.oo-ui-processDialog-actions-safe.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  margin: 0.75em;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget: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 {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
-  margin: 0.75em;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  /* Adjust for border so text aligns with title */
-
-  margin: -1px;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
-  font-weight: bold;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
-  right: 0.5em;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
-  padding-right: 2.25em;
-}
-
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
-  left: 0.5em;
-}
-
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
-  padding-left: 2.25em;
-}
-
-.oo-ui-processDialog > .oo-ui-window-frame {
-  min-height: 5em;
-}
-
-.oo-ui-processDialog-errors {
-  padding: 3em 3em 1.5em 3em;
-  text-align: center;
-  background-color: rgba(255, 255, 255, 0.9);
-}
-
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-  margin: 2em 1em 2em 1em;
-}
-
-.oo-ui-processDialog-errors-title {
-  margin-bottom: 2em;
-  font-size: 1.5em;
-  color: #000;
-}
-
-.oo-ui-processDialog-error {
-  padding: 1em;
-  margin: 1em;
-  text-align: right;
-  background-color: #fff7f7;
-  border: solid 1px #ff9e9e;
-  border-radius: 0.25em;
-}
-
-.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  width: 3.35em;
-  height: 3.35em;
-  background-size: 2em auto;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  padding: 0 0 1em;
-}
-
-.oo-ui-optionWidget {
-  padding: 0.8em 3.35em 0.8em 1em;
-  font-weight: bold;
-  border-bottom: 1px solid #dddddd;
-}
-
-.oo-ui-optionWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label {
-  padding-left: 1.5em;
-}
-
-.oo-ui-optionWidget-level-0 {
-  padding-right: 3.5em;
-}
-
-.oo-ui-optionWidget-level-0 .oo-ui-iconedElement-icon {
-  right: 1em;
-}
-
-.oo-ui-optionWidget-level-1 {
-  padding-right: 5em;
-}
-
-.oo-ui-optionWidget-level-1 .oo-ui-iconedElement-icon {
-  right: 2.5em;
-}
-
-.oo-ui-optionWidget-level-2 {
-  padding-right: 6.5em;
-}
-
-.oo-ui-optionWidget-level-2 .oo-ui-iconedElement-icon {
-  right: 4em;
-}
-
-.oo-ui-buttonOptionWidget {
-  padding: 0;
-}
-
-.oo-ui-lookupWidget-menu {
-  background-color: #fff;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  color: #ffffff;
-  background: #347bff;
-}
-
-.oo-ui-menuSectionItemWidget {
-  font-weight: normal;
-  color: #777777;
-  border: none;
-}
-
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  padding: .8em 1em;
-}
-
-/* Icons */
-
-.oo-ui-icon-check {
-  background: #347bff;
-  background-image: /* @embed */ url(themes/agora/images/icons/check.svg);
-}
\ No newline at end of file
index c53772e..a8f1e8e 100644 (file)
 /*!
- * OOjs UI v0.1.0-pre (0e50d2e336)
+ * OOjs UI v0.1.0-pre (837b2f733e)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-08-06T12:56:55Z
+ * Date: 2014-10-11T01:05:40Z
  */
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  position: absolute;
-  right: 0;
-  left: 0;
-  overflow: hidden;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+/* @noflip */
+.oo-ui-rtl {
+       direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+       direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       cursor: pointer;
+       display: inline-block;
+       vertical-align: middle;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+       display: inline-block;
+       position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       display: inline-block;
+       vertical-align: top;
+       text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       color: #333333;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-right: -0.75em;
+       margin-left: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-left: 0;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       opacity: 0.8;
+       width: 1.9em;
+       height: 1.9em;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
+       /*.oo-ui-transition(opacity 200ms);*/
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
+       outline: none;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
+       opacity: 1;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+       color: #000000;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #333333;
+       margin-left: 0.25em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #087ecc;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #76ab36;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #d45353;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #cccccc;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       margin: 0.1em 0;
+       padding: 0.2em 0.8em;
+       border-radius: 0.3em;
+       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+       border: 1px #c9c9c9 solid;
+       -webkit-transition: border-color 100ms ease-in-out;
+          -moz-transition: border-color 100ms ease-in-out;
+           -ms-transition: border-color 100ms ease-in-out;
+            -o-transition: border-color 100ms ease-in-out;
+               transition: border-color 100ms ease-in-out;
+       background: #eeeeee;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
+       border-color: #aaaaaa;
+       outline: none;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       line-height: 1.9em;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+       color: black;
+       border-color: #c9c9c9;
+       background: #eeeeee;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: -0.5em;
+       margin-right: -0.5em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: -0.5em;
+       margin-right: 0.3em;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
+       border: solid 1px #a6cee1;
+       background: #cde7f4;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
+       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+       border-color: #9dc2d4;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       border: solid 1px #a6cee1;
+       background: #cde7f4;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+       border: solid 1px #b8d892;
+       background: #daf0be;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
+       background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+       background-image:    -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+       background-image:     -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+       background-image:      -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+       background-image:         linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+       border-color: #adcb89;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       border: solid 1px #b8d892;
+       background: #daf0be;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
+       background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+       background-image:    -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+       background-image:     -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+       background-image:      -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+       background-image:         linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+       color: #d45353;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       opacity: 0.5;
+       box-shadow: none;
+       color: #333333;
+       background: #eeeeee;
+       border-color: #cccccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:focus {
+       border-color: #cccccc;
+       box-shadow: none;
+}
+.oo-ui-clippableElement-clippable {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+       overflow-y: hidden;
 }
-
-.oo-ui-dialog-content > .oo-ui-window-head {
-  top: 0;
-  z-index: 1;
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
 }
-
-.oo-ui-dialog-content > .oo-ui-window-body {
-  top: 0;
-  bottom: 0;
-  z-index: 2;
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
 }
-
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  bottom: 0;
-  z-index: 1;
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+       padding: 2em;
 }
-
-.oo-ui-dialog-content > .oo-ui-window-overlay {
-  z-index: 3;
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 3em;
+       overflow-y: auto;
 }
-
-.oo-ui-frame-content {
-  font-family: sans-serif;
-  font-size: 0.8em;
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
 }
-
-.oo-ui-toolbar-bar {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  border-bottom: solid 1px #ccc;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       padding: 1.5em;
 }
-
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-  background: none;
-  border: none;
+.oo-ui-bookletLayout-outlinePanel {
+       border-right: solid 1px #dddddd;
 }
-
-.oo-ui-toolbar-shadow {
-  bottom: -9px;
-  height: 9px;
-  background-image: /* @embed */ url(images/toolbar-shadow.png);
-  opacity: 0.125;
-  -webkit-transition: opacity 500ms ease-in-out;
-     -moz-transition: opacity 500ms ease-in-out;
-      -ms-transition: opacity 500ms ease-in-out;
-       -o-transition: opacity 500ms ease-in-out;
-          transition: opacity 500ms ease-in-out;
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+       box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
 }
-
-.oo-ui-toolGroup {
-  border: solid 1px transparent;
-  border-radius: 0.25em;
-  -webkit-transition: border-color 300ms ease-in-out;
-     -moz-transition: border-color 300ms ease-in-out;
-      -ms-transition: border-color 300ms ease-in-out;
-       -o-transition: border-color 300ms ease-in-out;
-          transition: border-color 300ms ease-in-out;
+.oo-ui-fieldLayout {
+       margin-bottom: 1em;
 }
-
-.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.1);
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+       content: " ";
+       display: table;
 }
-
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #000;
+.oo-ui-fieldLayout:after {
+       clear: both;
 }
-
-.oo-ui-window-content {
-  background: transparent;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       display: block;
+       float: left;
 }
-
-.oo-ui-window-overlay {
-  font-family: sans-serif;
-  font-size: 1em;
-  line-height: 1.5em;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       display: block;
+       float: left;
 }
-
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  background-color: rgba(255, 255, 255, 0.5);
-  opacity: 0;
-  -webkit-transition: opacity 250ms ease-in-out;
-     -moz-transition: opacity 250ms ease-in-out;
-      -ms-transition: opacity 250ms ease-in-out;
-       -o-transition: opacity 250ms ease-in-out;
-          transition: opacity 250ms ease-in-out;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       text-align: right;
 }
-
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 1em;
-  bottom: 1em;
-  background-color: #fff;
-  -webkit-transform: scale(0.5);
-     -moz-transform: scale(0.5);
-      -ms-transform: scale(0.5);
-       -o-transform: scale(0.5);
-          transform: scale(0.5);
-  -webkit-transition: all 250ms ease-in-out;
-     -moz-transition: all 250ms ease-in-out;
-      -ms-transition: all 250ms ease-in-out;
-       -o-transition: all 250ms ease-in-out;
-          transition: all 250ms ease-in-out;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
 }
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-  opacity: 1;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       display: inline-block;
+       vertical-align: middle;
 }
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-  -webkit-transform: scale(1);
-     -moz-transform: scale(1);
-      -ms-transform: scale(1);
-       -o-transform: scale(1);
-          transform: scale(1);
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       display: inline-block;
 }
-
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-  border: solid 1px #ccc;
-  border-radius: 0.5em;
-  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       z-index: 1;
 }
-
-.oo-ui-messageDialog-content .oo-ui-window-body {
-  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+       float: right;
 }
-
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-  display: block;
-  padding-top: 0.5em;
-  text-align: center;
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+       padding: 0.5em 0.75em;
 }
-
-.oo-ui-messageDialog-title {
-  font-size: 1.5em;
-  line-height: 1em;
-  color: #000;
+.oo-ui-fieldLayout:last-child {
+       margin-bottom: 0;
 }
-
-.oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       padding-top: 0.5em;
+       margin-right: 5%;
+       width: 35%;
 }
-
-.oo-ui-messageDialog-message-verbose {
-  font-size: 1.1em;
-  line-height: 1.5em;
-  text-align: left;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       width: 60%;
 }
-
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  border-right: solid 1px #e5e5e5;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       padding: 0.75em 0.5em 0.5em 0.5em;
 }
-
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-  border-right-width: 0;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       padding: 0.5em 0;
 }
-
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  border-bottom: solid 1px #e5e5e5;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       padding: 0.5em 0;
 }
-
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-  border-bottom-width: 0;
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-top: 0.25em;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label {
-  padding: 0 2em;
-  line-height: 3.4em;
-  text-align: center;
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+       color: #cccccc;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
+.oo-ui-fieldsetLayout {
+       position: relative;
+       margin: 0;
+       padding: 0;
+       border: none;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       display: block;
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+       margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+       font-size: 1.5em;
+       margin-bottom: 0.5em;
+       padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+       padding-left: 1.75em;
+       line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       left: 0;
+       top: 0.25em;
+       width: 2em;
+       height: 2em;
+}
+.oo-ui-gridLayout {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-panelLayout {
+       position: relative;
+}
+.oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
+.oo-ui-panelLayout-padded {
+       padding: 1.25em;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+       display: none;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+       display: block;
+       position: relative;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
-  font-weight: bold;
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+       z-index: 4;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
+.oo-ui-popupTool .oo-ui-popupWidget {
+       margin-left: 1.25em;
+       font-size: 0.8em;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
+.oo-ui-toolGroup {
+       display: inline-block;
+       vertical-align: middle;
+       margin: 0.3em;
+       border-radius: 0.25em;
+       border: solid 1px transparent;
+       -webkit-transition: border-color 300ms ease-in-out;
+          -moz-transition: border-color 300ms ease-in-out;
+           -ms-transition: border-color 300ms ease-in-out;
+            -o-transition: border-color 300ms ease-in-out;
+               transition: border-color 300ms ease-in-out;
+}
+.oo-ui-toolGroup-empty {
+       display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-position: center center;
+       background-repeat: no-repeat;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
+.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
+       border-color: rgba(0, 0, 0, 0.1);
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #000000;
 }
-
-.oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.4em;
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+       display: none;
 }
-
-.oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.4em;
-  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+.oo-ui-barToolGroup .oo-ui-tool {
+       display: inline-block;
+       position: relative;
+       vertical-align: top;
 }
-
-.oo-ui-processDialog-navigation {
-  position: relative;
-  height: 3.4em;
-  padding: 0 1em;
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       display: block;
 }
-
-.oo-ui-processDialog-location {
-  height: 1.9em;
-  padding: 0.25em 0;
-  text-align: center;
-  cursor: default;
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: block;
 }
-
-.oo-ui-processDialog-title {
-  font-weight: bold;
-  line-height: 1.9em;
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: none;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonedElement-button {
-  min-width: 1.9em;
-  min-height: 1.9em;
-  padding-top: 0.75em;
-  padding-bottom: 0.75em;
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labeledElement-label {
-  padding: 0 1em;
-  line-height: 1.9em;
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+       display: none;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconedElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconedElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconedElement-icon {
-  position: absolute;
-  margin-top: -0.125em;
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+       cursor: pointer;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
-  margin: 0.75em 0 0.75em 0.75em;
+.oo-ui-barToolGroup .oo-ui-tool {
+       margin: -1px 0 -1px -1px;
+       border: solid 1px transparent;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  padding: 0;
-  vertical-align: middle;
+.oo-ui-barToolGroup .oo-ui-tool:first-child {
+       border-top-left-radius: 0.25em;
+       border-bottom-left-radius: 0.25em;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
+.oo-ui-barToolGroup .oo-ui-tool:last-child {
+       margin-right: -1px;
+       border-top-right-radius: 0.25em;
+       border-bottom-right-radius: 0.25em;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       height: 1.5em;
+       padding: 0.25em;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
-  margin: 0.75em;
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 1.5em;
+       width: 1.5em;
+       opacity: 0.8;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  /* Adjust for border so text aligns with title */
-
-  margin: -1px;
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
+       border-color: rgba(0, 0, 0, 0.2);
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
+       border-color: rgba(0, 0, 0, 0.2);
+       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+       background: #f8fbfd;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
+.oo-ui-barToolGroup.oo-ui-widget-enabled .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-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
-  font-weight: bold;
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.8;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 1;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
+.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
+.oo-ui-popupToolGroup {
+       position: relative;
+       height: 2em;
+       min-width: 2.5em;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
-  left: 0.5em;
+.oo-ui-popupToolGroup-handle {
+       display: block;
+       cursor: pointer;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
-  padding-left: 2.25em;
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
 }
-
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
-  right: 0.5em;
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+       cursor: default;
 }
-
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
-  padding-right: 2.25em;
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       display: none;
+       position: absolute;
+       z-index: 4;
 }
-
-.oo-ui-processDialog > .oo-ui-window-frame {
-  min-height: 5em;
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+       background-repeat: no-repeat;
+       background-position: center center;
 }
-
-.oo-ui-processDialog-errors {
-  padding: 3em 3em 1.5em 3em;
-  text-align: center;
-  background-color: rgba(255, 255, 255, 0.9);
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+       display: block;
 }
-
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-  margin: 2em 1em 2em 1em;
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+       left: 0;
 }
-
-.oo-ui-processDialog-errors-title {
-  margin-bottom: 2em;
-  font-size: 1.5em;
-  color: #000;
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+       right: 0;
 }
-
-.oo-ui-processDialog-error {
-  padding: 1em;
-  margin: 1em;
-  text-align: left;
-  background-color: #fff7f7;
-  border: solid 1px #ff9e9e;
-  border-radius: 0.25em;
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
 }
-
-.oo-ui-buttonedElement > .oo-ui-buttonedElement-button {
-  color: #333;
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: inline-block;
+       vertical-align: middle;
 }
-
-.oo-ui-buttonedElement.oo-ui-indicatedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  width: 1.9em;
-  height: 1.9em;
-  opacity: 0.8;
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+       display: none;
 }
-
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-
-  /*.oo-ui-transition(opacity 200ms);*/
-
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+       min-width: 3.5em;
 }
-
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:hover > .oo-ui-iconedElement-icon,
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:focus > .oo-ui-iconedElement-icon {
-  opacity: 1;
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2em;
+       height: 2em;
+       opacity: 0.8;
 }
-
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:hover > .oo-ui-labeledElement-label,
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:focus > .oo-ui-labeledElement-label {
-  color: #000;
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
 }
-
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #333;
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
 }
-
-.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #087ecc;
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 1em;
 }
-
-.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #76ab36;
+.oo-ui-popupToolGroup-header {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 0.6em;
+       font-weight: bold;
 }
-
-.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-destructive > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #d45353;
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
+       border-bottom-left-radius: 0;
+       border-bottom-right-radius: 0;
+       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+       background: #f8fbfd;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-right: 2.25em;
 }
-
-.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       top: 2em;
+       margin: 0 -1px;
+       border: solid 1px #cccccc;
+       background-color: white;
+       box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
 }
-
-.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #ccc;
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 2em;
+       width: 2em;
+       margin-right: 0.25em;
 }
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button {
-  padding: 0.2em 0.8em;
-  margin: 0.1em 0;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  border: 1px #c9c9c9 solid;
-  border-radius: 0.3em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-  -webkit-transition: border-color 100ms ease-in-out;
-     -moz-transition: border-color 100ms ease-in-out;
-      -ms-transition: border-color 100ms ease-in-out;
-       -o-transition: border-color 100ms ease-in-out;
-          transition: border-color 100ms ease-in-out;
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       line-height: 2em;
+       font-size: 0.8em;
 }
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button:focus {
-  border-color: #aaa;
+.oo-ui-listToolGroup .oo-ui-tool {
+       display: inline-block;
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
 }
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  color: black;
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  border-color: #c9c9c9;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-iconedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  margin-right: -0.5em;
-  margin-left: -0.5em;
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-iconedElement.oo-ui-labeledElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  margin-right: 0.3em;
-  margin-left: -0.5em;
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+       padding: 0.25em;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button {
-  background: #cde7f4;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-  background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  border: solid 1px #a6cee1;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
+       border-color: rgba(0, 0, 0, 0.2);
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button:focus {
-  border-color: #9dc2d4;
+.oo-ui-listToolGroup .oo-ui-tool {
+       border: solid 1px transparent;
+       margin: -1px 0;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  background: #cde7f4;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  border: solid 1px #a6cee1;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       padding-right: 0.5em;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button {
-  background: #daf0be;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
-  background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  border: solid 1px #b8d892;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+       border-color: rgba(0, 0, 0, 0.1);
+       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+       background: #f8fbfd;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button:focus {
-  border-color: #adcb89;
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+       border-top-color: rgba(0, 0, 0, 0.1);
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  background: #daf0be;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
-  background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  border: solid 1px #b8d892;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
+       border-color: rgba(0, 0, 0, 0.2);
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-destructive > .oo-ui-buttonedElement-button {
-  color: #d45353;
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+       border-color: rgba(0, 0, 0, 0.2);
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  color: #333;
-  background: #eee;
-  border-color: #ccc;
-  opacity: 0.5;
-  box-shadow: none;
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.8;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:hover,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:hover,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button:focus,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:focus,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:focus {
-  border-color: #ccc;
-  box-shadow: none;
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 1;
 }
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  padding: 1.5em;
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #cccccc;
 }
-
-.oo-ui-bookletLayout-outlinePanel {
-  border-right: solid 1px #ddd;
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
 }
-
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+       color: #cccccc;
 }
-
-.oo-ui-fieldLayout-disabled .oo-ui-labeledElement-label {
-  color: #ccc;
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+       opacity: 0.2;
 }
-
-.oo-ui-fieldsetLayout {
-  border: none;
+.oo-ui-menuToolGroup {
+       border-color: rgba(0, 0, 0, 0.1);
 }
-
-.oo-ui-fieldsetLayout > .oo-ui-labeledElement-label {
-  font-size: 1.5em;
+.oo-ui-menuToolGroup .oo-ui-tool {
+       display: block;
 }
-
-.oo-ui-panelLayout-padded {
-  padding: 1.25em;
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
 }
-
-.oo-ui-barToolGroup .oo-ui-tool {
-  margin: -1px 0 -1px -1px;
-  border: solid 1px transparent;
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
 }
-
-.oo-ui-barToolGroup .oo-ui-tool:first-child {
-  border-bottom-left-radius: 0.25em;
-  border-top-left-radius: 0.25em;
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+       min-width: 8em;
 }
-
-.oo-ui-barToolGroup .oo-ui-tool:last-child {
-  margin-right: -1px;
-  border-top-right-radius: 0.25em;
-  border-bottom-right-radius: 0.25em;
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+       padding: 0.25em 0 0.25em 0;
 }
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.8;
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+       border-color: rgba(0, 0, 0, 0.2);
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+       border-color: rgba(0, 0, 0, 0.25);
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  border-color: rgba(0, 0, 0, 0.2);
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       padding: 0 1em 0 0.25em;
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .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-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-image: none;
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.8;
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+       background-color: #e1f3ff;
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 1;
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #cccccc;
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
 }
-
-.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+       color: #cccccc;
+       border-color: rgba(0, 0, 0, 0.05);
 }
-
-.oo-ui-listToolGroup .oo-ui-tool {
-  margin: -1px 0;
-  border: solid 1px transparent;
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+       opacity: 0.2;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  border-color: rgba(0, 0, 0, 0.1);
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+.oo-ui-toolbar {
+       clear: both;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-top-color: rgba(0, 0, 0, 0.1);
+.oo-ui-toolbar-bar {
+       line-height: 1em;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-toolbar-actions {
+       float: right;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-toolbar-tools {
+       display: inline;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.8;
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+       -webkit-touch-callout: default;
+       -webkit-user-select: all;
+          -moz-user-select: all;
+           -ms-user-select: all;
+               user-select: all;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 1;
+.oo-ui-toolbar-shadow {
+       background-position: left top;
+       background-repeat: repeat-x;
+       position: absolute;
+       width: 100%;
+       pointer-events: none;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
+.oo-ui-toolbar-bar {
+       border-bottom: solid 1px #cccccc;
+       background: #f8fbfd;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
+       background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+       background-image:    -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+       background-image:     -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+       background-image:      -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+       background-image:         linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
 }
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+       border: none;
+       background: none;
 }
-
-.oo-ui-listToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
+.oo-ui-toolbar-shadow {
+       background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
+       bottom: -9px;
+       height: 9px;
+       opacity: 0.125;
+       -webkit-transition: opacity 500ms ease-in-out;
+          -moz-transition: opacity 500ms ease-in-out;
+           -ms-transition: opacity 500ms ease-in-out;
+            -o-transition: opacity 500ms ease-in-out;
+               transition: opacity 500ms ease-in-out;
 }
-
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-optionWidget {
+       position: relative;
+       display: block;
+       cursor: pointer;
+       padding: 0.5em 2em 0.5em 3em;
+       border: none;
 }
-
-.oo-ui-menuToolGroup {
-  border-color: rgba(0, 0, 0, 0.1);
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       cursor: default;
 }
-
-.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       display: block;
+       white-space: nowrap;
+       text-overflow: ellipsis;
+       overflow: hidden;
 }
-
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-  border-color: rgba(0, 0, 0, 0.25);
+.oo-ui-optionWidget-highlighted {
+       background-color: #e1f3ff;
 }
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  background-color: #e1f3ff;
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       line-height: 1.5em;
 }
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
+       background-color: #a7dcff;
 }
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+       background-color: #a7dcff;
 }
-
-.oo-ui-menuToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
-  border-color: rgba(0, 0, 0, 0.05);
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       color: #cccccc;
 }
-
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       background-repeat: no-repeat;
+       background-position: center center;
 }
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  opacity: 0.8;
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       top: 50%;
+       width: 2em;
+       height: 2em;
+       margin-top: -1em;
 }
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  background-color: white;
-  border: solid 1px #ccc;
-  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+       left: 0.5em;
 }
-
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       right: 0.5em;
 }
-
-.oo-ui-optionWidget {
-  padding: 0.5em 2em 0.5em 3em;
+.oo-ui-buttonSelectWidget {
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 0.3em;
 }
-
-.oo-ui-optionWidget-highlighted {
-  background-color: #e1f3ff;
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-left: -1px;
 }
-
-.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
-  background-color: #a7dcff;
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
 }
-
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-  background-color: #a7dcff;
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
 }
-
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  color: #ccc;
+.oo-ui-buttonOptionWidget {
+       display: inline-block;
+       padding: 0;
+       background-color: transparent;
 }
-
-.oo-ui-menuWidget {
-  margin-top: -1px;
-  background: #fff;
-  border: solid 1px #ccc;
-  border-radius: 0 0 0.25em 0.25em;
-  box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       position: relative;
 }
-
-.oo-ui-popupWidget-popup {
-  background-color: #fff;
-  border: solid 1px #ccc;
-  border-radius: 0.25em;
-  box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       position: static;
+       display: inline-block;
+       vertical-align: middle;
 }
-
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  width: 15px;
-  height: 8px;
-  margin-left: -7px;
-  background-image: /* @embed */ url(images/anchor.svg);
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       height: 1.9em;
 }
-
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-     -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-      -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-       -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-          transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       height: 1.9em;
+       margin-top: 0;
 }
-
-.oo-ui-popupWidget-body {
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+       background-color: transparent;
+}
+.oo-ui-labelWidget {
+       display: inline-block;
+       padding: 0.5em 0;
+}
+.oo-ui-iconWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 1.9em;
+       width: 1.9em;
+       opacity: 0.8;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 1.9em;
+       width: 1.9em;
+       opacity: 0.8;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+       display: inline-block;
+       vertical-align: middle;
 }
-
 .oo-ui-buttonGroupWidget {
-  display: inline-block;
-  white-space: nowrap;
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 0.3em;
 }
-
-.oo-ui-buttonOptionWidget {
-  padding: 0;
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-bottom: -1px;
+       margin-left: -1px;
 }
-
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
 }
-
-.oo-ui-buttonSelectWidget {
-  border-radius: 0.3em;
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
 }
-
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
-  margin-left: -1px;
-  border-radius: 0;
+.oo-ui-toggleSwitchWidget {
+       position: relative;
+       display: inline-block;
+       vertical-align: middle;
+       overflow: hidden;
+       cursor: pointer;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       -webkit-transform: translateZ(0px);
+          -moz-transform: translateZ(0px);
+           -ms-transform: translateZ(0px);
+            -o-transform: translateZ(0px);
+               transform: translateZ(0px);
+       height: 2em;
+       width: 4em;
+       border-radius: 1em;
+       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
+       border: solid 1px #cccccc;
+       background: #eeeeee;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
 }
-
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonedElement-button {
-  margin-left: 0;
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+       cursor: default;
 }
-
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonedElement-button {
-  border-top-right-radius: 0.3em;
-  border-bottom-right-radius: 0.3em;
+.oo-ui-toggleSwitchWidget-grip {
+       position: absolute;
+       display: block;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
 }
-
-.oo-ui-inlineMenuWidget-handle {
-  border: solid 1px rgba(0, 0, 0, 0.1);
-  border-radius: 0.25em;
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       right: 0;
+       left: 0;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
 }
-
-.oo-ui-inlineMenuWidget-handle:hover {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: none;
 }
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  opacity: 0.8;
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+       opacity: 0.5;
 }
-
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  background-color: #f3f3f3;
-  border-color: #ddd;
+.oo-ui-toggleSwitchWidget-grip {
+       top: 0.25em;
+       left: 0.25em;
+       width: 1.5em;
+       height: 1.5em;
+       margin-top: -1px;
+       border-radius: 1em;
+       box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
+       border: 1px #c9c9c9 solid;
+       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+          -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+           -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+            -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+               transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+       background: #eeeeee;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
 }
-
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator {
-  opacity: 0.2;
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
+       border-color: #aaaaaa;
 }
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+       border-radius: 1em;
+       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+       -webkit-transition: opacity 200ms ease-in-out;
+          -moz-transition: opacity 200ms ease-in-out;
+           -ms-transition: opacity 200ms ease-in-out;
+            -o-transition: opacity 200ms ease-in-out;
+               transition: opacity 200ms ease-in-out;
+       background: #cde7f4;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
 }
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
-  background-color: #e1f3ff;
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+       opacity: 1;
 }
-
-.oo-ui-menuSectionItemWidget {
-  padding: 0.33em 0.75em;
-  color: #888;
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+       left: 2.25em;
+       margin-left: -2px;
 }
-
-.oo-ui-outlineControlsWidget {
-  background-color: #fff;
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: block;
+       opacity: 0;
 }
-
-.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+       left: 0.25em;
+       margin-left: 0;
 }
-
-.oo-ui-outlineItemWidget {
-  font-size: 1.1em;
+.oo-ui-actionWidget.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
 }
-
-.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label {
-  padding-right: 1.5em;
+.oo-ui-popupWidget {
+       position: absolute;
 }
-
-.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
-  opacity: 0.5;
+.oo-ui-popupWidget-popup {
+       position: relative;
+       overflow: hidden;
+       z-index: 1;
 }
-
-.oo-ui-outlineItemWidget-level-0 {
-  padding-left: 3.5em;
+.oo-ui-popupWidget-anchor {
+       display: none;
+       z-index: 1;
 }
-
-.oo-ui-outlineItemWidget-level-0 .oo-ui-iconedElement-icon {
-  left: 1em;
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+       display: block;
+       position: absolute;
+       top: 0;
+       background-repeat: no-repeat;
 }
-
-.oo-ui-outlineItemWidget-level-1 {
-  padding-left: 5em;
+.oo-ui-popupWidget-head {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
 }
-
-.oo-ui-outlineItemWidget-level-1 .oo-ui-iconedElement-icon {
-  left: 2.5em;
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       float: right;
 }
-
-.oo-ui-outlineItemWidget-level-2 {
-  padding-left: 6.5em;
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       float: left;
+       cursor: default;
 }
-
-.oo-ui-outlineItemWidget-level-2 .oo-ui-iconedElement-icon {
-  left: 4em;
+.oo-ui-popupWidget-body {
+       clear: both;
+       overflow: hidden;
 }
-
-.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-  background-color: #a7dcff;
+.oo-ui-popupWidget-popup {
+       border: solid 1px #cccccc;
+       border-radius: 0.25em;
+       background-color: #ffffff;
+       box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+       margin-top: 7px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+       content: "";
+       position: absolute;
+       width: 0;
+       height: 0;
+       border-style: solid;
+       border-color: transparent;
+       border-top: 0;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+       bottom: -8px;
+       left: -7px;
+       border-bottom-color: #aaaaaa;
+       border-width: 7px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+       bottom: -8px;
+       left: -6px;
+       border-bottom-color: #ffffff;
+       border-width: 6px;
 }
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-important {
-  font-weight: bold;
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+       -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+          -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+           -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+            -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+               transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
 }
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-placeholder {
-  font-style: italic;
+.oo-ui-popupWidget-head {
+       height: 2.5em;
 }
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon {
-  opacity: 0.5;
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       margin: 0.25em;
 }
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-labeledElement-label {
-  color: #777;
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       margin: 0.75em 1em;
 }
-
-.oo-ui-searchWidget-query {
-  box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
+.oo-ui-popupWidget-body {
+       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupWidget-body-padded {
+       padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+       position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+       position: absolute;
+       cursor: auto;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
+       left: 1em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       left: -1em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
+       left: 1.25em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       left: -1.25em;
 }
-
 .oo-ui-textInputWidget {
-  width: 20em;
+       position: relative;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       width: 20em;
 }
-
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
-  padding: 0.5em;
-  font-family: sans-serif;
-  font-size: 1em;
-  background-color: #fff;
-  border: solid 1px #ccc;
-  border-radius: 0.25em;
-  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
-  -webkit-transition: border-color 200ms, box-shadow 200ms;
-     -moz-transition: border-color 200ms, box-shadow 200ms;
-      -ms-transition: border-color 200ms, box-shadow 200ms;
-       -o-transition: border-color 200ms, box-shadow 200ms;
-          transition: border-color 200ms, box-shadow 200ms;
+       display: inline-block;
+       width: 100%;
+       resize: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       top: 0;
+       height: 100%;
+       background-repeat: no-repeat;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+       left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       padding: 0.5em;
+       font-size: 1em;
+       font-family: sans-serif;
+       background-color: #ffffff;
+       border: solid 1px #cccccc;
+       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
+       border-radius: 0.25em;
+       -webkit-transition: border-color 200ms, box-shadow 200ms;
+          -moz-transition: border-color 200ms, box-shadow 200ms;
+           -ms-transition: border-color 200ms, box-shadow 200ms;
+            -o-transition: border-color 200ms, box-shadow 200ms;
+               transition: border-color 200ms, box-shadow 200ms;
 }
-
 .oo-ui-textInputWidget-decorated input,
 .oo-ui-textInputWidget-decorated textarea {
-  padding-left: 2em;
+       padding-left: 2em;
 }
-
 .oo-ui-textInputWidget-icon {
-  width: 2em;
+       width: 2em;
 }
-
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-  border-color: #a7dcff;
-  outline: none;
-  box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
+       outline: none;
+       border-color: #a7dcff;
+       box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
 }
-
 .oo-ui-textInputWidget input[readonly],
 .oo-ui-textInputWidget textarea[readonly] {
-  color: #777;
-  text-shadow: 0 1px 1px #fff;
+       color: #777777;
+       text-shadow: 0 1px 1px #ffffff;
 }
-
-.oo-ui-textInputWidget-pending input,
-.oo-ui-textInputWidget-pending textarea {
-  background-color: transparent;
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
 }
-
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
 .oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
 .oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  background-color: #f3f3f3;
-  border-color: #ddd;
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
 }
-
-.oo-ui-toggleSwitchWidget {
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  border: solid 1px #ccc;
-  border-radius: 1em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+.oo-ui-textInputWidget .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
+       opacity: 0.8;
 }
-
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  opacity: 0.5;
+.oo-ui-textInputWidget.oo-ui-iconElement input,
+.oo-ui-textInputWidget.oo-ui-iconElement textarea {
+       padding-left: 2em;
 }
-
-.oo-ui-toggleSwitchWidget-grip {
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  border: 1px #c9c9c9 solid;
-  border-radius: 1em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-  box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
+.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       width: 2em;
+       background-position: right center;
 }
-
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
-  border-color: #aaa;
+.oo-ui-textInputWidget.oo-ui-indicatorElement input,
+.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
+       padding-right: 1.5em;
 }
-
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  background: #cde7f4;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  border-radius: 1em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       width: 1.5em;
+       background-position: left center;
 }
-
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-  opacity: 1;
+.oo-ui-menuWidget {
+       position: absolute;
+       background: #ffffff;
+       margin-top: -1px;
+       border: solid 1px #cccccc;
+       border-radius: 0 0 0.25em 0.25em;
+       box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-menuWidget input {
+       position: absolute;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+       opacity: 0;
+}
+.oo-ui-menuItemWidget {
+       position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+       background-color: #e1f3ff;
+}
+.oo-ui-menuSectionItemWidget {
+       cursor: default;
+       padding: 0.33em 0.75em;
+       color: #888888;
+}
+.oo-ui-inlineMenuWidget {
+       position: relative;
+       display: inline-block;
+       margin: 0.25em 0;
+       min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+       width: 100%;
+       display: inline-block;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+       z-index: 1;
+       width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+       cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+       height: 2.5em;
+       border: solid 1px rgba(0, 0, 0, 0.1);
+       border-radius: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle:hover {
+       border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       line-height: 2.5em;
+       margin: 0 0.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2.5em;
+       height: 2.5em;
+       opacity: 0.8;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-right: 2em;
+}
+.oo-ui-outlineItemWidget {
+       position: relative;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       font-size: 1.1em;
+       padding: 0.75em;
+}
+.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+       padding-right: 1.5em;
+}
+.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       opacity: 0.5;
+}
+.oo-ui-outlineItemWidget-level-0 {
+       padding-left: 3.5em;
+}
+.oo-ui-outlineItemWidget-level-0 .oo-ui-iconElement-icon {
+       left: 1em;
+}
+.oo-ui-outlineItemWidget-level-1 {
+       padding-left: 5em;
+}
+.oo-ui-outlineItemWidget-level-1 .oo-ui-iconElement-icon {
+       left: 2.5em;
+}
+.oo-ui-outlineItemWidget-level-2 {
+       padding-left: 6.5em;
+}
+.oo-ui-outlineItemWidget-level-2 .oo-ui-iconElement-icon {
+       left: 4em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
+       background-color: #a7dcff;
+       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-important {
+       font-weight: bold;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-placeholder {
+       font-style: italic;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
+       opacity: 0.5;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-outlineControlsWidget {
+       height: 3em;
+       background-color: #ffffff;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       float: left;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       float: left;
+       background-position: right center;
+       background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-movers {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       height: 2em;
+       margin: 0.5em;
+       padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       width: 1.5em;
+       height: 2em;
+       margin: 0.5em 0 0.5em 0.5em;
+       opacity: 0.2;
+}
+.oo-ui-outlineControlsWidget-items {
+       margin-left: 0;
+}
+.oo-ui-comboBoxWidget {
+       display: inline-block;
+       position: relative;
+       min-width: 20em;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+       width: 100%;
+       z-index: 1;
+}
+.oo-ui-comboBoxWidget-handle {
+       border: solid 1px rgba(0, 0, 0, 0.1);
+       border-radius: 0.25em;
+}
+.oo-ui-comboBoxWidget-handle:hover {
+       border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-comboBoxWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
+.oo-ui-comboBoxWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       cursor: default;
+       opacity: 0.2;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+       margin-top: -3px;
+}
+.oo-ui-searchWidget-query {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       width: 100%;
+}
+.oo-ui-searchWidget-results {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-searchWidget-query {
+       height: 4em;
+       padding: 0 1em;
+       box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       margin: 0.75em 0;
+}
+.oo-ui-searchWidget-results {
+       top: 4em;
+       padding: 1em;
+       line-height: 0;
+}
+.oo-ui-window {
+       line-height: 1em;
+}
+.oo-ui-window-frame {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+       margin: 0;
+       padding: 0;
+}
+.oo-ui-window-content:focus {
+       outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-window-body {
+       margin: 0;
+       padding: 0;
+       background: none;
+}
+.oo-ui-window-overlay {
+       position: absolute;
+       top: 0;
+       left: 0;
+}
+.oo-ui-window-isolated,
+.oo-ui-window-overlay {
+       background-color: transparent;
+       background-image: none;
+       font-family: sans-serif;
+       font-size: 0.8em;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       position: absolute;
+       left: 0;
+       right: 0;
+       overflow: hidden;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+       z-index: 1;
+       top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       z-index: 2;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       z-index: 1;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+       z-index: 3;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-messageDialog-actions-horizontal {
+       display: table;
+       table-layout: fixed;
+       width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       display: table-cell;
+       width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+       display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       display: block;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+       position: relative;
+       text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+       display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       position: relative;
+       top: auto;
+       bottom: auto;
+       display: inline;
+       white-space: nowrap;
+}
+.oo-ui-messageDialog-content .oo-ui-window-body {
+       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+       display: block;
+       text-align: center;
+       padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+       font-size: 1.5em;
+       line-height: 1em;
+       color: #000000;
+}
+.oo-ui-messageDialog-message {
+       font-size: 0.9em;
+       line-height: 1.25em;
+       color: #666666;
+}
+.oo-ui-messageDialog-message-verbose {
+       font-size: 1.1em;
+       line-height: 1.5em;
+       text-align: left;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       border-right: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+       border-right-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+       border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       text-align: center;
+       line-height: 3.4em;
+       padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+       background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+       font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+       background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+       background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+       background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+       overflow: hidden;
+       text-overflow: ellipsis;
+       white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+       display: inline;
+       padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+       white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+       left: 0;
+}
+.oo-ui-processDialog-actions-primary {
+       right: 0;
+}
+.oo-ui-processDialog-errors {
+       display: none;
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+       z-index: 2;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+       height: 3.4em;
+}
+.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+       top: 3.4em;
+       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+}
+.oo-ui-processDialog-navigation {
+       position: relative;
+       height: 3.4em;
+       padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+       padding: 0.75em 0;
+       height: 1.9em;
+       cursor: default;
+       text-align: center;
+}
+.oo-ui-processDialog-title {
+       font-weight: bold;
+       line-height: 1.9em;
+}
+.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 {
+       padding-top: 0.75em;
+       padding-bottom: 0.75em;
+       min-width: 1.9em;
+       min-height: 1.9em;
+}
+.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.9em;
+       padding: 0 1em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+       position: absolute;
+       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 0 0.75em 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;
+       vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget: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 {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .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 {
+       /* Adjust for border so text aligns with title */
+       margin: -1px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .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 {
+       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 {
+       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 {
+       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 {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       left: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-left: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       right: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-right: 2.25em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+       min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+       background-color: rgba(255, 255, 255, 0.9);
+       padding: 3em 3em 1.5em 3em;
+       text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+       margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+       font-size: 1.5em;
+       color: #000000;
+       margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+       text-align: left;
+       margin: 1em;
+       padding: 1em;
+       border: solid 1px #ff9e9e;
+       background-color: #fff7f7;
+       border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       position: fixed;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+       width: auto;
+       height: auto;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
+       padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+       position: absolute;
+       right: 0;
+       left: 0;
+       margin: auto;
+       overflow: hidden;
+       max-width: 100%;
+       max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+       width: 100%;
+       height: 100%;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       background-color: rgba(255, 255, 255, 0.5);
+       opacity: 0;
+       -webkit-transition: opacity 250ms ease-in-out;
+          -moz-transition: opacity 250ms ease-in-out;
+           -ms-transition: opacity 250ms ease-in-out;
+            -o-transition: opacity 250ms ease-in-out;
+               transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       top: 1em;
+       bottom: 1em;
+       background-color: #ffffff;
+       -webkit-transform: scale(0.5);
+          -moz-transform: scale(0.5);
+           -ms-transform: scale(0.5);
+            -o-transform: scale(0.5);
+               transform: scale(0.5);
+       -webkit-transition: all 250ms ease-in-out;
+          -moz-transition: all 250ms ease-in-out;
+           -ms-transition: all 250ms ease-in-out;
+            -o-transition: all 250ms ease-in-out;
+               transition: all 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+       opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       -webkit-transform: scale(1);
+          -moz-transform: scale(1);
+           -ms-transform: scale(1);
+            -o-transform: scale(1);
+               transform: scale(1);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+       border: solid 1px #cccccc;
+       border-radius: 0.5em;
+       box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
 }
 
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: block;
-  opacity: 0;
-}
\ No newline at end of file
+.oo-ui-icon-add {
+       background-image: /* @embed */ url(themes/apex/images/icons/add.png);
+}
+.oo-ui-icon-advanced {
+       background-image: /* @embed */ url(themes/apex/images/icons/advanced.png);
+}
+.oo-ui-icon-alert {
+       background-image: /* @embed */ url(themes/apex/images/icons/alert.png);
+}
+.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/apex/images/icons/check.png);
+}
+.oo-ui-icon-clear {
+       background-image: /* @embed */ url(themes/apex/images/icons/clear.png);
+}
+.oo-ui-icon-close {
+       background-image: /* @embed */ url(themes/apex/images/icons/close.png);
+}
+.oo-ui-icon-code {
+       background-image: /* @embed */ url(themes/apex/images/icons/code.png);
+}
+.oo-ui-icon-collapse {
+       background-image: /* @embed */ url(themes/apex/images/icons/collapse.png);
+}
+.oo-ui-icon-comment {
+       background-image: /* @embed */ url(themes/apex/images/icons/comment.png);
+}
+.oo-ui-icon-expand {
+       background-image: /* @embed */ url(themes/apex/images/icons/expand.png);
+}
+.oo-ui-icon-help {
+       background-image: /* @embed */ url(themes/apex/images/icons/help.png);
+}
+.oo-ui-icon-info {
+       background-image: /* @embed */ url(themes/apex/images/icons/info.png);
+}
+.oo-ui-icon-link {
+       background-image: /* @embed */ url(themes/apex/images/icons/link.png);
+}
+.oo-ui-icon-menu {
+       background-image: /* @embed */ url(themes/apex/images/icons/menu.png);
+}
+.oo-ui-icon-next {
+       background-image: /* @embed */ url(themes/apex/images/icons/move-ltr.png);
+}
+.oo-ui-icon-picture {
+       background-image: /* @embed */ url(themes/apex/images/icons/picture.png);
+}
+.oo-ui-icon-previous {
+       background-image: /* @embed */ url(themes/apex/images/icons/move-rtl.png);
+}
+.oo-ui-icon-redo {
+       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-ltr.png);
+}
+.oo-ui-icon-remove {
+       background-image: /* @embed */ url(themes/apex/images/icons/remove.png);
+}
+.oo-ui-icon-search {
+       background-image: /* @embed */ url(themes/apex/images/icons/search.png);
+}
+.oo-ui-icon-settings {
+       background-image: /* @embed */ url(themes/apex/images/icons/settings.png);
+}
+.oo-ui-icon-tag {
+       background-image: /* @embed */ url(themes/apex/images/icons/tag.png);
+}
+.oo-ui-icon-undo {
+       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-rtl.png);
+}
+.oo-ui-icon-window {
+       background-image: /* @embed */ url(themes/apex/images/icons/window.png);
+}
+.oo-ui-indicator-alert {
+       background-image: /* @embed */ url(themes/apex/images/indicators/alert.png);
+}
+.oo-ui-indicator-up {
+       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-up.png);
+}
+.oo-ui-indicator-down {
+       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-down.png);
+}
+.oo-ui-indicator-next {
+       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-ltr.png);
+}
+.oo-ui-indicator-previous {
+       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-rtl.png);
+}
+.oo-ui-indicator-required {
+       background-image: /* @embed */ url(themes/apex/images/indicators/required.png);
+}
+.oo-ui-texture-pending {
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
+.oo-ui-texture-transparency {
+       background-image: /* @embed */ url(themes/apex/images/textures/transparency.png);
+}
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.js b/resources/lib/oojs-ui/oojs-ui-apex.js
new file mode 100644 (file)
index 0000000..3835239
--- /dev/null
@@ -0,0 +1,13 @@
+/*!
+ * OOjs UI v0.1.0-pre (837b2f733e)
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-10-11T01:05:29Z
+ */
+/* Instantiation */
+
+OO.ui.theme = new OO.ui.Theme();
index 3cbb677..7dd7b61 100644 (file)
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-07-22T21:39:24Z
+ * Date: 2014-09-11T19:39:50Z
  */
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
+/*
+ * Blank theme mixins.
+ *
+ * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
+ * additional rules to the base styles.
+ */
+/*
+ * Base styles.
+ *
+ * Themes should include this file after defining their variables and mixins.
+ */
+/* @noflip */
+.oo-ui-rtl {
+  direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+  direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  cursor: pointer;
+  display: inline-block;
+  vertical-align: middle;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+  display: inline-block;
+  position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  display: inline-block;
+  vertical-align: top;
+  text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  color: #333;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  margin-left: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  opacity: 0.8;
+  width: 1.9em;
+  height: 1.9em;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
+  /*.oo-ui-transition(opacity 200ms);*/
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
+  opacity: 1;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+  color: #000;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #333;
+  margin-right: 0.25em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #087ecc;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #76ab36;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #d45353;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #ccc;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  margin: 0.1em 0;
+  padding: 0.2em 0.8em;
+  border-radius: 0.3em;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+  border: 1px #c9c9c9 solid;
+  -webkit-transition: border-color 100ms ease-in-out;
+  -moz-transition: border-color 100ms ease-in-out;
+  -ms-transition: border-color 100ms ease-in-out;
+  -o-transition: border-color 100ms ease-in-out;
+  transition: border-color 100ms ease-in-out;
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
+  border-color: #aaa;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  line-height: 1.9em;
+}
+.oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+  color: black;
+  border-color: #c9c9c9;
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: -0.5em;
+  margin-left: -0.5em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: -0.5em;
+  margin-left: 0.3em;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
+  border: solid 1px #a6cee1;
+  background: #cde7f4;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
+  background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+  border-color: #9dc2d4;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  border: solid 1px #a6cee1;
+  background: #cde7f4;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+  border: solid 1px #b8d892;
+  background: #daf0be;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
+  background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+  border-color: #adcb89;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  border: solid 1px #b8d892;
+  background: #daf0be;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
+  background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+  color: #d45353;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  opacity: 0.5;
+  box-shadow: none;
+  color: #333;
+  background: #eee;
+  border-color: #ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:focus {
+  border-color: #ccc;
+  box-shadow: none;
+}
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 3em;
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 1.5em;
+}
+.oo-ui-bookletLayout-outlinePanel {
+  border-left: solid 1px #ddd;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  content: " ";
+  display: table;
+}
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  text-align: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+  z-index: 1;
+}
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  padding-top: 0.5em;
+  margin-left: 5%;
+  width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+  color: #ccc;
+}
+.oo-ui-fieldsetLayout {
+  position: relative;
+  margin: 0;
+  padding: 0;
+  border: none;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  display: block;
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+  font-size: 1.5em;
+  margin-bottom: 0.5em;
+  padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+  padding-right: 1.75em;
+  line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  right: 0;
+  top: 0.25em;
+  width: 2em;
+  height: 2em;
+}
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout {
+  position: relative;
+}
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout-padded {
+  padding: 1.25em;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  display: block;
+  position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+  z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-right: 1.25em;
+  font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+  display: inline-block;
+  vertical-align: middle;
+  margin: 0.3em;
+  border-radius: 0.25em;
+  border: solid 1px transparent;
+  -webkit-transition: border-color 300ms ease-in-out;
+  -moz-transition: border-color 300ms ease-in-out;
+  -ms-transition: border-color 300ms ease-in-out;
+  -o-transition: border-color 300ms ease-in-out;
+  transition: border-color 300ms ease-in-out;
+}
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #000;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+  display: inline-block;
+  position: relative;
+  vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+  margin: -1px -1px -1px 0;
+  border: solid 1px transparent;
+}
+.oo-ui-barToolGroup .oo-ui-tool:first-child {
+  border-top-right-radius: 0.25em;
+  border-bottom-right-radius: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool:last-child {
+  margin-left: -1px;
+  border-top-left-radius: 0.25em;
+  border-bottom-left-radius: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  height: 1.5em;
+  padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 1.5em;
+  width: 1.5em;
+  opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-color: rgba(0, 0, 0, 0.2);
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-right-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .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-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
   position: absolute;
-  left: 0;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  display: none;
+  position: absolute;
+  z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
   right: 0;
-  overflow: hidden;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+  left: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+  min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2em;
+  height: 2em;
+  opacity: 0.8;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 0.6em;
+  font-weight: bold;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-left: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 2em;
+  margin: 0 -1px;
+  border: solid 1px #ccc;
+  background-color: white;
+  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 2em;
+  width: 2em;
+  margin-left: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  line-height: 2em;
+  font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em;
+}
+.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  border: solid 1px transparent;
+  margin: -1px 0;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  padding-left: 0.5em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-color: rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-top-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.8;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 1;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-menuToolGroup {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: none;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: /* @embed */ url(images/icons/check.svg);
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  padding: 0 0.25em 0 1em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  background-color: #e1f3ff;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+  border-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-toolbar {
+  clear: both;
+}
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+  float: left;
+}
+.oo-ui-toolbar-tools {
+  display: inline;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-touch-callout: default;
+  -webkit-user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
+}
+.oo-ui-toolbar-shadow {
+  background-position: right top;
+  background-repeat: repeat-x;
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+  border-bottom: solid 1px #ccc;
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+  border: none;
+  background: none;
+}
+.oo-ui-toolbar-shadow {
+  background-image: /* @embed */ url(images/toolbar-shadow.png);
+  bottom: -9px;
+  height: 9px;
+  opacity: 0.125;
+  -webkit-transition: opacity 500ms ease-in-out;
+  -moz-transition: opacity 500ms ease-in-out;
+  -ms-transition: opacity 500ms ease-in-out;
+  -o-transition: opacity 500ms ease-in-out;
+  transition: opacity 500ms ease-in-out;
+}
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  cursor: pointer;
+  padding: 0.5em 3em 0.5em 2em;
+  border: none;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.oo-ui-optionWidget-highlighted {
+  background-color: #e1f3ff;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  line-height: 1.5em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
+  background-color: #a7dcff;
+}
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+  background-color: #a7dcff;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  color: #ccc;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  left: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+  border-radius: 0.3em;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-right: -1px;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
 }
-
-.oo-ui-dialog-content > .oo-ui-window-head {
-  top: 0;
-  z-index: 1;
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
 }
-
-.oo-ui-dialog-content > .oo-ui-window-body {
-  top: 0;
-  bottom: 0;
-  z-index: 2;
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  padding: 0;
+  background-color: transparent;
 }
-
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  bottom: 0;
-  z-index: 1;
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  position: relative;
 }
-
-.oo-ui-dialog-content > .oo-ui-window-overlay {
-  z-index: 3;
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  position: static;
+  display: inline-block;
+  vertical-align: middle;
 }
-
-.oo-ui-frame-content {
-  font-family: sans-serif;
-  font-size: 0.8em;
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  height: 1.9em;
 }
-
-.oo-ui-toolbar-bar {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  border-bottom: solid 1px #ccc;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  height: 1.9em;
+  margin-top: 0;
 }
-
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-  background: none;
-  border: none;
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+  background-color: transparent;
 }
-
-.oo-ui-toolbar-shadow {
-  bottom: -9px;
-  height: 9px;
-  background-image: /* @embed */ url(images/toolbar-shadow.png);
-  opacity: 0.125;
-  -webkit-transition: opacity 500ms ease-in-out;
-     -moz-transition: opacity 500ms ease-in-out;
-      -ms-transition: opacity 500ms ease-in-out;
-       -o-transition: opacity 500ms ease-in-out;
-          transition: opacity 500ms ease-in-out;
+.oo-ui-labelWidget {
+  display: inline-block;
+  padding: 0.5em 0;
 }
-
-.oo-ui-toolGroup {
-  border: solid 1px transparent;
-  border-radius: 0.25em;
-  -webkit-transition: border-color 300ms ease-in-out;
-     -moz-transition: border-color 300ms ease-in-out;
-      -ms-transition: border-color 300ms ease-in-out;
-       -o-transition: border-color 300ms ease-in-out;
-          transition: border-color 300ms ease-in-out;
+.oo-ui-iconWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
 }
-
-.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.1);
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
 }
-
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #000;
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
 }
-
-.oo-ui-window-content {
-  background: transparent;
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
 }
-
-.oo-ui-window-overlay {
-  font-family: sans-serif;
-  font-size: 1em;
-  line-height: 1.5em;
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
 }
-
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  background-color: rgba(255, 255, 255, 0.5);
-  opacity: 0;
-  -webkit-transition: opacity 250ms ease-in-out;
-     -moz-transition: opacity 250ms ease-in-out;
-      -ms-transition: opacity 250ms ease-in-out;
-       -o-transition: opacity 250ms ease-in-out;
-          transition: opacity 250ms ease-in-out;
+.oo-ui-buttonGroupWidget {
+  display: inline-block;
+  white-space: nowrap;
+  border-radius: 0.3em;
 }
-
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 1em;
-  bottom: 1em;
-  background-color: #fff;
-  -webkit-transform: scale(0.5);
-     -moz-transform: scale(0.5);
-      -ms-transform: scale(0.5);
-       -o-transform: scale(0.5);
-          transform: scale(0.5);
-  -webkit-transition: all 250ms ease-in-out;
-     -moz-transition: all 250ms ease-in-out;
-      -ms-transition: all 250ms ease-in-out;
-       -o-transition: all 250ms ease-in-out;
-          transition: all 250ms ease-in-out;
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-bottom: -1px;
+  margin-right: -1px;
 }
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-  opacity: 1;
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
 }
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-  -webkit-transform: scale(1);
-     -moz-transform: scale(1);
-      -ms-transform: scale(1);
-       -o-transform: scale(1);
-          transform: scale(1);
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
 }
-
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  overflow: hidden;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transform: translateZ(0px);
+  -moz-transform: translateZ(0px);
+  -ms-transform: translateZ(0px);
+  -o-transform: translateZ(0px);
+  transform: translateZ(0px);
+  height: 2em;
+  width: 4em;
+  border-radius: 1em;
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
   border: solid 1px #ccc;
-  border-radius: 0.5em;
-  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
 }
-
-.oo-ui-messageDialog-content .oo-ui-window-body {
-  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
 }
-
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
   display: block;
-  padding-top: 0.5em;
-  text-align: center;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
-
-.oo-ui-messageDialog-title {
-  font-size: 1.5em;
-  line-height: 1em;
-  color: #000;
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
-
-.oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
 }
-
-.oo-ui-messageDialog-message-verbose {
-  font-size: 1.1em;
-  line-height: 1.5em;
-  text-align: right;
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  opacity: 0.5;
 }
-
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  border-left: solid 1px #e5e5e5;
+.oo-ui-toggleSwitchWidget-grip {
+  top: 0.25em;
+  right: 0.25em;
+  width: 1.5em;
+  height: 1.5em;
+  margin-top: -1px;
+  border-radius: 1em;
+  box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
+  border: 1px #c9c9c9 solid;
+  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
 }
-
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-  border-left-width: 0;
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
+  border-color: #aaa;
 }
-
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  border-bottom: solid 1px #e5e5e5;
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  border-radius: 1em;
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+  -webkit-transition: opacity 200ms ease-in-out;
+  -moz-transition: opacity 200ms ease-in-out;
+  -ms-transition: opacity 200ms ease-in-out;
+  -o-transition: opacity 200ms ease-in-out;
+  transition: opacity 200ms ease-in-out;
+  background: #cde7f4;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
 }
-
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-  border-bottom-width: 0;
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+  opacity: 1;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label {
-  padding: 0 2em;
-  line-height: 3.4em;
-  text-align: center;
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  right: 2.25em;
+  margin-right: -2px;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: block;
+  opacity: 0;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  right: 0.25em;
+  margin-right: 0;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  overflow: hidden;
+  z-index: 1;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
+.oo-ui-popupWidget-anchor {
+  display: none;
+  z-index: 1;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
-  font-weight: bold;
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  display: block;
+  position: absolute;
+  background-repeat: no-repeat;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
+.oo-ui-popupWidget-head {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: left;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  float: right;
+  cursor: default;
 }
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
+.oo-ui-popupWidget-body {
+  clear: both;
+  overflow: hidden;
 }
-
-.oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.4em;
+.oo-ui-popupWidget-popup {
+  border: solid 1px #ccc;
+  border-radius: 0.25em;
+  background-color: #fff;
+  box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
 }
-
-.oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.4em;
-  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+  margin-top: 7px;
 }
-
-.oo-ui-processDialog-navigation {
-  position: relative;
-  height: 3.4em;
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  width: 15px;
+  height: 8px;
+  margin-right: -7px;
+  background-image: /* @embed */ url(images/anchor.svg);
+}
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+}
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupWidget-body-padded {
   padding: 0 1em;
 }
-
-.oo-ui-processDialog-location {
-  height: 1.9em;
-  padding: 0.25em 0;
-  text-align: center;
-  cursor: default;
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  right: 1em;
+  cursor: auto;
+}
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 20em;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  resize: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
-
-.oo-ui-processDialog-title {
-  font-weight: bold;
-  line-height: 1.9em;
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+  background-repeat: no-repeat;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+  right: 0;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonedElement-button {
-  min-width: 1.9em;
-  min-height: 1.9em;
-  padding-top: 0.75em;
-  padding-bottom: 0.75em;
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  left: 0;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labeledElement-label {
-  padding: 0 1em;
-  line-height: 1.9em;
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: 0.5em;
+  font-size: 1em;
+  font-family: sans-serif;
+  background-color: #fff;
+  border: solid 1px #ccc;
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+  border-radius: 0.25em;
+  -webkit-transition: border-color 200ms, box-shadow 200ms;
+  -moz-transition: border-color 200ms, box-shadow 200ms;
+  -ms-transition: border-color 200ms, box-shadow 200ms;
+  -o-transition: border-color 200ms, box-shadow 200ms;
+  transition: border-color 200ms, box-shadow 200ms;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconedElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconedElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconedElement-icon {
-  position: absolute;
-  margin-top: -0.125em;
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+  padding-right: 2em;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
-  margin: 0.75em 0.75em 0.75em 0;
+.oo-ui-textInputWidget-icon {
+  width: 2em;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  padding: 0;
-  vertical-align: middle;
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+  outline: none;
+  border-color: #a7dcff;
+  box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
+.oo-ui-textInputWidget input[readonly],
+.oo-ui-textInputWidget textarea[readonly] {
+  color: #777;
+  text-shadow: 0 1px 1px #fff;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
+.oo-ui-textInputWidget-pending input,
+.oo-ui-textInputWidget-pending textarea {
+  background-color: transparent;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed {
-  margin: 0.75em;
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #ddd;
+  background-color: #f3f3f3;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  /* Adjust for border so text aligns with title */
-
-  margin: -1px;
+.oo-ui-textInputWidget .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
+  opacity: 0.8;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
+.oo-ui-textInputWidget.oo-ui-iconElement input,
+.oo-ui-textInputWidget.oo-ui-iconElement textarea {
+  padding-right: 2em;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
+.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  width: 2em;
+  background-position: left center;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label {
-  font-weight: bold;
+.oo-ui-textInputWidget.oo-ui-indicatorElement input,
+.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
+  padding-left: 1.5em;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
+.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  width: 1.5em;
+  background-position: right center;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
+.oo-ui-menuWidget {
+  position: absolute;
+  background: #fff;
+  margin-top: -1px;
+  border: solid 1px #ccc;
+  border-radius: 0 0 0.25em 0.25em;
+  box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
+.oo-ui-menuItemWidget {
+  position: relative;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
-  right: 0.5em;
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+  display: none;
 }
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
-  padding-right: 2.25em;
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
 }
-
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon {
-  left: 0.5em;
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+  display: block;
 }
-
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label {
-  padding-left: 2.25em;
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
 }
-
-.oo-ui-processDialog > .oo-ui-window-frame {
-  min-height: 5em;
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+  background-color: #e1f3ff;
 }
-
-.oo-ui-processDialog-errors {
-  padding: 3em 3em 1.5em 3em;
-  text-align: center;
-  background-color: rgba(255, 255, 255, 0.9);
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+  padding: 0.33em 0.75em;
+  color: #888;
 }
-
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-  margin: 2em 1em 2em 1em;
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  margin: 0.25em 0;
+  min-width: 20em;
 }
-
-.oo-ui-processDialog-errors-title {
-  margin-bottom: 2em;
-  font-size: 1.5em;
-  color: #000;
+.oo-ui-inlineMenuWidget-handle {
+  width: 100%;
+  display: inline-block;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
-
-.oo-ui-processDialog-error {
-  padding: 1em;
-  margin: 1em;
-  text-align: right;
-  background-color: #fff7f7;
-  border: solid 1px #ff9e9e;
-  border-radius: 0.25em;
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
 }
-
-.oo-ui-buttonedElement > .oo-ui-buttonedElement-button {
-  color: #333;
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
 }
-
-.oo-ui-buttonedElement.oo-ui-indicatedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  width: 1.9em;
-  height: 1.9em;
-  opacity: 0.8;
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
 }
-
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-
-  /*.oo-ui-transition(opacity 200ms);*/
-
+.oo-ui-inlineMenuWidget-handle {
+  height: 2.5em;
+  border: solid 1px rgba(0, 0, 0, 0.1);
+  border-radius: 0.25em;
 }
-
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:hover > .oo-ui-iconedElement-icon,
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:focus > .oo-ui-iconedElement-icon {
-  opacity: 1;
+.oo-ui-inlineMenuWidget-handle:hover {
+  border-color: rgba(0, 0, 0, 0.2);
 }
-
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:hover > .oo-ui-labeledElement-label,
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button:focus > .oo-ui-labeledElement-label {
-  color: #000;
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
 }
-
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #333;
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
 }
-
-.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #087ecc;
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  line-height: 2.5em;
+  margin: 0 0.5em;
 }
-
-.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #76ab36;
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+  opacity: 0.8;
 }
-
-.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-destructive > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #d45353;
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #ddd;
+  background-color: #f3f3f3;
 }
-
-.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
   opacity: 0.2;
 }
-
-.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  color: #ccc;
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
 }
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button {
-  padding: 0.2em 0.8em;
-  margin: 0.1em 0;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  border: 1px #c9c9c9 solid;
-  border-radius: 0.3em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-  -webkit-transition: border-color 100ms ease-in-out;
-     -moz-transition: border-color 100ms ease-in-out;
-      -ms-transition: border-color 100ms ease-in-out;
-       -o-transition: border-color 100ms ease-in-out;
-          transition: border-color 100ms ease-in-out;
-}
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button:focus {
-  border-color: #aaa;
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-left: 2em;
 }
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  color: black;
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  border-color: #c9c9c9;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+.oo-ui-outlineItemWidget {
+  position: relative;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  font-size: 1.1em;
+  padding: 0.75em;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-iconedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  margin-left: -0.5em;
-  margin-right: -0.5em;
+.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+  padding-left: 1.5em;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-iconedElement.oo-ui-labeledElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  margin-left: 0.3em;
-  margin-right: -0.5em;
+.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  opacity: 0.5;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button {
-  background: #cde7f4;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-  background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  border: solid 1px #a6cee1;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+.oo-ui-outlineItemWidget-level-0 {
+  padding-right: 3.5em;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button:focus {
-  border-color: #9dc2d4;
+.oo-ui-outlineItemWidget-level-0 .oo-ui-iconElement-icon {
+  right: 1em;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  background: #cde7f4;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  border: solid 1px #a6cee1;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+.oo-ui-outlineItemWidget-level-1 {
+  padding-right: 5em;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button {
-  background: #daf0be;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
-  background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  border: solid 1px #b8d892;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
+.oo-ui-outlineItemWidget-level-1 .oo-ui-iconElement-icon {
+  right: 2.5em;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button:focus {
-  border-color: #adcb89;
+.oo-ui-outlineItemWidget-level-2 {
+  padding-right: 6.5em;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  background: #daf0be;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
-  background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  border: solid 1px #b8d892;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
+.oo-ui-outlineItemWidget-level-2 .oo-ui-iconElement-icon {
+  right: 4em;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-destructive > .oo-ui-buttonedElement-button {
-  color: #d45353;
+.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
+  background-color: #a7dcff;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  color: #333;
-  background: #eee;
-  border-color: #ccc;
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-important {
+  font-weight: bold;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-placeholder {
+  font-style: italic;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
   opacity: 0.5;
-  box-shadow: none;
 }
-
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button:hover,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:hover,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:hover,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button:focus,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active:focus,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed:focus {
-  border-color: #ccc;
-  box-shadow: none;
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
+  color: #777;
 }
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  padding: 1.5em;
+.oo-ui-outlineControlsWidget {
+  height: 3em;
+  background-color: #fff;
 }
-
-.oo-ui-bookletLayout-outlinePanel {
-  border-left: solid 1px #ddd;
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
-
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  float: right;
+  background-position: left center;
+  background-repeat: no-repeat;
 }
-
-.oo-ui-fieldLayout-disabled .oo-ui-labeledElement-label {
-  color: #ccc;
+.oo-ui-outlineControlsWidget-items {
+  float: right;
 }
-
-.oo-ui-fieldsetLayout {
-  border: none;
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+  float: right;
 }
-
-.oo-ui-fieldsetLayout > .oo-ui-labeledElement-label {
-  font-size: 1.5em;
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
 }
-
-.oo-ui-panelLayout-padded {
-  padding: 1.25em;
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: left;
 }
-
-.oo-ui-barToolGroup .oo-ui-tool {
-  margin: -1px -1px -1px 0;
-  border: solid 1px transparent;
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  height: 2em;
+  margin: 0.5em;
+  padding: 0;
 }
-
-.oo-ui-barToolGroup .oo-ui-tool:first-child {
-  border-bottom-right-radius: 0.25em;
-  border-top-right-radius: 0.25em;
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  width: 1.5em;
+  height: 2em;
+  margin: 0.5em 0.5em 0.5em 0;
+  opacity: 0.2;
 }
-
-.oo-ui-barToolGroup .oo-ui-tool:last-child {
-  margin-left: -1px;
-  border-top-left-radius: 0.25em;
-  border-bottom-left-radius: 0.25em;
+.oo-ui-outlineControlsWidget-items {
+  margin-right: 0;
 }
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.8;
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+  z-index: 1;
+  min-width: 20em;
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget-handle {
+  border: solid 1px rgba(0, 0, 0, 0.1);
+  border-radius: 0.25em;
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget-handle:hover {
   border-color: rgba(0, 0, 0, 0.2);
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-right-color: rgba(0, 0, 0, 0.1);
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  cursor: default;
   opacity: 0.2;
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.8;
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 1;
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
 }
-
-.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-searchWidget-results {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+  overflow-x: hidden;
+  overflow-y: auto;
 }
-
-.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-searchWidget-query {
+  height: 4em;
+  padding: 0 1em;
+  box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
 }
-
-.oo-ui-listToolGroup .oo-ui-tool {
-  margin: -1px 0;
-  border: solid 1px transparent;
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  margin: 0.75em 0;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  border-color: rgba(0, 0, 0, 0.1);
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+.oo-ui-searchWidget-results {
+  top: 4em;
+  padding: 1em;
+  line-height: 0;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-top-color: rgba(0, 0, 0, 0.1);
+.oo-ui-window {
+  line-height: 1em;
+  /* Content div takes focus when opened, so hide outline */
 }
-
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-window-frame {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.8;
+.oo-ui-window-content:focus {
+  outline: none;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 1;
+.oo-ui-window-head,
+.oo-ui-window-foot {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
+.oo-ui-window-body {
+  margin: 0;
+  padding: 0;
+  background: none;
 }
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  right: 0;
 }
-
-.oo-ui-listToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
+.oo-ui-window-isolated {
+  background-color: transparent;
+  background-image: none;
+  font-family: sans-serif;
+  font-size: 0.8em;
 }
-
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  position: absolute;
+  right: 0;
+  left: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
-
-.oo-ui-menuToolGroup {
-  border-color: rgba(0, 0, 0, 0.1);
+.oo-ui-dialog-content > .oo-ui-window-head {
+  z-index: 1;
+  top: 0;
 }
-
-.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-dialog-content > .oo-ui-window-body {
+  z-index: 2;
+  top: 0;
+  bottom: 0;
 }
-
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-  border-color: rgba(0, 0, 0, 0.25);
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  z-index: 1;
+  bottom: 0;
 }
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  background-color: #e1f3ff;
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+  z-index: 3;
 }
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
+.oo-ui-dialog-content > .oo-ui-window-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
 }
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-messageDialog-actions-horizontal {
+  display: table;
+  table-layout: fixed;
+  width: 100%;
 }
-
-.oo-ui-menuToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
-  border-color: rgba(0, 0, 0, 0.05);
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  display: table-cell;
+  width: 1%;
 }
-
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.oo-ui-messageDialog-actions-vertical {
+  display: block;
 }
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  opacity: 0.8;
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
 }
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  background-color: white;
-  border: solid 1px #ccc;
-  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+  position: relative;
+  text-align: center;
 }
-
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
-  background: #f8fbfd;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  border-bottom-left-radius: 0;
-  border-bottom-right-radius: 0;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  display: block;
 }
-
-.oo-ui-optionWidget {
-  padding: 0.5em 3em 0.5em 2em;
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  position: relative;
+  top: auto;
+  bottom: auto;
+  display: inline;
+  white-space: nowrap;
 }
-
-.oo-ui-optionWidget-highlighted {
-  background-color: #e1f3ff;
+.oo-ui-messageDialog-content .oo-ui-window-body {
+  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
 }
-
-.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
-  background-color: #a7dcff;
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+  display: block;
+  text-align: center;
+  padding-top: 0.5em;
 }
-
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-  background-color: #a7dcff;
+.oo-ui-messageDialog-title {
+  font-size: 1.5em;
+  line-height: 1em;
+  color: #000;
 }
-
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  color: #ccc;
+.oo-ui-messageDialog-message {
+  font-size: 0.9em;
+  line-height: 1.25em;
+  color: #666;
 }
-
-.oo-ui-menuWidget {
-  margin-top: -1px;
-  background: #fff;
-  border: solid 1px #ccc;
-  border-radius: 0 0 0.25em 0.25em;
-  box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
+.oo-ui-messageDialog-message-verbose {
+  font-size: 1.1em;
+  line-height: 1.5em;
+  text-align: right;
 }
-
-.oo-ui-popupWidget-popup {
-  background-color: #fff;
-  border: solid 1px #ccc;
-  border-radius: 0.25em;
-  box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  border-left: solid 1px #e5e5e5;
 }
-
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  width: 15px;
-  height: 8px;
-  margin-right: -7px;
-  background-image: /* @embed */ url(images/anchor.svg);
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+  border-left-width: 0;
 }
-
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-     -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-      -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-       -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-          transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  border-bottom: solid 1px #e5e5e5;
 }
-
-.oo-ui-popupWidget-body {
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+  border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  text-align: center;
+  line-height: 3.4em;
+  padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
 }
-
-.oo-ui-buttonGroupWidget {
-  display: inline-block;
+.oo-ui-processDialog-location {
+  overflow: hidden;
+  text-overflow: ellipsis;
   white-space: nowrap;
 }
-
-.oo-ui-buttonOptionWidget {
+.oo-ui-processDialog-title {
+  display: inline;
   padding: 0;
 }
-
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
-}
-
-.oo-ui-buttonSelectWidget {
-  border-radius: 0.3em;
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+  white-space: nowrap;
 }
-
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
-  margin-right: -1px;
-  border-radius: 0;
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+  position: absolute;
+  top: 0;
+  bottom: 0;
 }
-
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonedElement-button {
-  margin-right: 0;
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
+.oo-ui-processDialog-actions-safe {
+  right: 0;
 }
-
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonedElement-button {
-  border-top-left-radius: 0.3em;
-  border-bottom-left-radius: 0.3em;
+.oo-ui-processDialog-actions-primary {
+  left: 0;
 }
-
-.oo-ui-inlineMenuWidget-handle {
-  border: solid 1px rgba(0, 0, 0, 0.1);
-  border-radius: 0.25em;
+.oo-ui-processDialog-errors {
+  display: none;
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  z-index: 2;
+  overflow-x: hidden;
+  overflow-y: auto;
 }
-
-.oo-ui-inlineMenuWidget-handle:hover {
-  border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-processDialog-content .oo-ui-window-head {
+  height: 3.4em;
 }
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  opacity: 0.8;
+.oo-ui-processDialog-content .oo-ui-window-body {
+  top: 3.4em;
+  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
 }
-
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  background-color: #f3f3f3;
-  border-color: #ddd;
+.oo-ui-processDialog-navigation {
+  position: relative;
+  height: 3.4em;
+  padding: 0 1em;
 }
-
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator {
-  opacity: 0.2;
+.oo-ui-processDialog-location {
+  padding: 0.75em 0;
+  height: 1.9em;
+  cursor: default;
+  text-align: center;
 }
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
+.oo-ui-processDialog-title {
+  font-weight: bold;
+  line-height: 1.9em;
 }
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
-  background-color: #e1f3ff;
+.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 {
+  padding-top: 0.75em;
+  padding-bottom: 0.75em;
+  min-width: 1.9em;
+  min-height: 1.9em;
 }
-
-.oo-ui-menuSectionItemWidget {
-  padding: 0.33em 0.75em;
-  color: #888;
+.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.9em;
+  padding: 0 1em;
 }
-
-.oo-ui-outlineControlsWidget {
-  background-color: #fff;
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+  position: absolute;
+  margin-top: -0.125em;
 }
-
-.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
-  opacity: 0.2;
+.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 0.75em 0.75em 0;
 }
-
-.oo-ui-outlineItemWidget {
-  font-size: 1.1em;
+.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;
+  vertical-align: middle;
 }
-
-.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label {
-  padding-left: 1.5em;
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
 }
-
-.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
-  opacity: 0.5;
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
 }
-
-.oo-ui-outlineItemWidget-level-0 {
-  padding-right: 3.5em;
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
+  margin: 0.75em;
 }
-
-.oo-ui-outlineItemWidget-level-0 .oo-ui-iconedElement-icon {
-  right: 1em;
+.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 {
+  /* Adjust for border so text aligns with title */
+  margin: -1px;
 }
-
-.oo-ui-outlineItemWidget-level-1 {
-  padding-right: 5em;
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
 }
-
-.oo-ui-outlineItemWidget-level-1 .oo-ui-iconedElement-icon {
-  right: 2.5em;
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
 }
-
-.oo-ui-outlineItemWidget-level-2 {
-  padding-right: 6.5em;
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  font-weight: bold;
 }
-
-.oo-ui-outlineItemWidget-level-2 .oo-ui-iconedElement-icon {
-  right: 4em;
+.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 {
+  background-color: rgba(118, 171, 54, 0.05);
 }
-
-.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-  background-color: #a7dcff;
+.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 {
+  background-color: rgba(118, 171, 54, 0.1);
 }
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-important {
-  font-weight: bold;
+.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 {
+  background-color: rgba(212, 83, 83, 0.05);
 }
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-placeholder {
-  font-style: italic;
+.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 {
+  background-color: rgba(212, 83, 83, 0.1);
 }
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon {
-  opacity: 0.5;
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  right: 0.5em;
 }
-
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-labeledElement-label {
-  color: #777;
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-right: 2.25em;
 }
-
-.oo-ui-searchWidget-query {
-  box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 0.5em;
 }
-
-.oo-ui-textInputWidget {
-  width: 20em;
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-left: 2.25em;
 }
-
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  padding: 0.5em;
-  font-family: sans-serif;
-  font-size: 1em;
-  background-color: #fff;
-  border: solid 1px #ccc;
-  border-radius: 0.25em;
-  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
-  -webkit-transition: border-color 200ms, box-shadow 200ms;
-     -moz-transition: border-color 200ms, box-shadow 200ms;
-      -ms-transition: border-color 200ms, box-shadow 200ms;
-       -o-transition: border-color 200ms, box-shadow 200ms;
-          transition: border-color 200ms, box-shadow 200ms;
+.oo-ui-processDialog > .oo-ui-window-frame {
+  min-height: 5em;
 }
-
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-  padding-right: 2em;
+.oo-ui-processDialog-errors {
+  background-color: rgba(255, 255, 255, 0.9);
+  padding: 3em 3em 1.5em 3em;
+  text-align: center;
 }
-
-.oo-ui-textInputWidget-icon {
-  width: 2em;
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+  margin: 2em 1em 2em 1em;
 }
-
-.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-  border-color: #a7dcff;
-  outline: none;
-  box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
+.oo-ui-processDialog-errors-title {
+  font-size: 1.5em;
+  color: #000;
+  margin-bottom: 2em;
 }
-
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
-  color: #777;
-  text-shadow: 0 1px 1px #fff;
+.oo-ui-processDialog-error {
+  text-align: right;
+  margin: 1em;
+  padding: 1em;
+  border: solid 1px #ff9e9e;
+  background-color: #fff7f7;
+  border-radius: 0.25em;
 }
-
-.oo-ui-textInputWidget-pending input,
-.oo-ui-textInputWidget-pending textarea {
-  background-color: transparent;
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  position: fixed;
+  width: 0;
+  height: 0;
+  overflow: hidden;
 }
-
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  background-color: #f3f3f3;
-  border-color: #ddd;
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+  width: auto;
+  height: auto;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  padding: 1em;
 }
-
-.oo-ui-toggleSwitchWidget {
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  border: solid 1px #ccc;
-  border-radius: 1em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+  position: fixed;
+  left: 0;
+  right: 0;
+  margin: auto;
+  overflow: hidden;
+  max-width: 100%;
+  max-height: 100%;
 }
-
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  opacity: 0.5;
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
 }
-
-.oo-ui-toggleSwitchWidget-grip {
-  background: #eeeeee;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  border: 1px #c9c9c9 solid;
-  border-radius: 1em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-  box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+  width: 100%;
+  height: 100%;
+  top: 0;
+  bottom: 0;
 }
-
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
-  border-color: #aaa;
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: opacity 250ms ease-in-out;
+  -moz-transition: opacity 250ms ease-in-out;
+  -ms-transition: opacity 250ms ease-in-out;
+  -o-transition: opacity 250ms ease-in-out;
+  transition: opacity 250ms ease-in-out;
 }
-
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  background: #cde7f4;
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  border-radius: 1em;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 1em;
+  bottom: 1em;
+  background-color: #fff;
+  -webkit-transform: scale(0.5);
+  -moz-transform: scale(0.5);
+  -ms-transform: scale(0.5);
+  -o-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transition: all 250ms ease-in-out;
+  -moz-transition: all 250ms ease-in-out;
+  -ms-transition: all 250ms ease-in-out;
+  -o-transition: all 250ms ease-in-out;
+  transition: all 250ms ease-in-out;
 }
-
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
   opacity: 1;
 }
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: block;
-  opacity: 0;
-}
\ No newline at end of file
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: scale(1);
+  -moz-transform: scale(1);
+  -ms-transform: scale(1);
+  -o-transform: scale(1);
+  transform: scale(1);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+  border: solid 1px #ccc;
+  border-radius: 0.5em;
+  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+}
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.svg.css b/resources/lib/oojs-ui/oojs-ui-apex.svg.css
new file mode 100644 (file)
index 0000000..8a70e54
--- /dev/null
@@ -0,0 +1,2086 @@
+/*!
+ * OOjs UI v0.1.0-pre (837b2f733e)
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-10-11T01:05:40Z
+ */
+/* @noflip */
+.oo-ui-rtl {
+       direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+       direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       cursor: pointer;
+       display: inline-block;
+       vertical-align: middle;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+       display: inline-block;
+       position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       display: inline-block;
+       vertical-align: top;
+       text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       color: #333333;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-right: -0.75em;
+       margin-left: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-left: 0;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       opacity: 0.8;
+       width: 1.9em;
+       height: 1.9em;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
+       /*.oo-ui-transition(opacity 200ms);*/
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
+       outline: none;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
+       opacity: 1;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+       color: #000000;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #333333;
+       margin-left: 0.25em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #087ecc;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #76ab36;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #d45353;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #cccccc;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       margin: 0.1em 0;
+       padding: 0.2em 0.8em;
+       border-radius: 0.3em;
+       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+       border: 1px #c9c9c9 solid;
+       -webkit-transition: border-color 100ms ease-in-out;
+          -moz-transition: border-color 100ms ease-in-out;
+           -ms-transition: border-color 100ms ease-in-out;
+            -o-transition: border-color 100ms ease-in-out;
+               transition: border-color 100ms ease-in-out;
+       background: #eeeeee;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
+       border-color: #aaaaaa;
+       outline: none;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       line-height: 1.9em;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+       color: black;
+       border-color: #c9c9c9;
+       background: #eeeeee;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: -0.5em;
+       margin-right: -0.5em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: -0.5em;
+       margin-right: 0.3em;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
+       border: solid 1px #a6cee1;
+       background: #cde7f4;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
+       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+       border-color: #9dc2d4;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       border: solid 1px #a6cee1;
+       background: #cde7f4;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+       border: solid 1px #b8d892;
+       background: #daf0be;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
+       background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+       background-image:    -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+       background-image:     -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+       background-image:      -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+       background-image:         linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+       border-color: #adcb89;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       border: solid 1px #b8d892;
+       background: #daf0be;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
+       background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+       background-image:    -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+       background-image:     -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+       background-image:      -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+       background-image:         linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+       color: #d45353;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       opacity: 0.5;
+       box-shadow: none;
+       color: #333333;
+       background: #eeeeee;
+       border-color: #cccccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:focus {
+       border-color: #cccccc;
+       box-shadow: none;
+}
+.oo-ui-clippableElement-clippable {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+       overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+       padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 3em;
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       padding: 1.5em;
+}
+.oo-ui-bookletLayout-outlinePanel {
+       border-right: solid 1px #dddddd;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+       box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-fieldLayout {
+       margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+       content: " ";
+       display: table;
+}
+.oo-ui-fieldLayout:after {
+       clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       display: block;
+       float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       display: block;
+       float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       text-align: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       z-index: 1;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+       float: right;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+       padding: 0.5em 0.75em;
+}
+.oo-ui-fieldLayout:last-child {
+       margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       padding-top: 0.5em;
+       margin-right: 5%;
+       width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+       color: #cccccc;
+}
+.oo-ui-fieldsetLayout {
+       position: relative;
+       margin: 0;
+       padding: 0;
+       border: none;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       display: block;
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+       margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+       font-size: 1.5em;
+       margin-bottom: 0.5em;
+       padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+       padding-left: 1.75em;
+       line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       left: 0;
+       top: 0.25em;
+       width: 2em;
+       height: 2em;
+}
+.oo-ui-gridLayout {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-panelLayout {
+       position: relative;
+}
+.oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-panelLayout-padded {
+       padding: 1.25em;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+       display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+       display: block;
+       position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+       z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+       margin-left: 1.25em;
+       font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+       display: inline-block;
+       vertical-align: middle;
+       margin: 0.3em;
+       border-radius: 0.25em;
+       border: solid 1px transparent;
+       -webkit-transition: border-color 300ms ease-in-out;
+          -moz-transition: border-color 300ms ease-in-out;
+           -ms-transition: border-color 300ms ease-in-out;
+            -o-transition: border-color 300ms ease-in-out;
+               transition: border-color 300ms ease-in-out;
+}
+.oo-ui-toolGroup-empty {
+       display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
+       border-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #000000;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+       display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+       display: inline-block;
+       position: relative;
+       vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+       cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+       margin: -1px 0 -1px -1px;
+       border: solid 1px transparent;
+}
+.oo-ui-barToolGroup .oo-ui-tool:first-child {
+       border-top-left-radius: 0.25em;
+       border-bottom-left-radius: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool:last-child {
+       margin-right: -1px;
+       border-top-right-radius: 0.25em;
+       border-bottom-right-radius: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       height: 1.5em;
+       padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 1.5em;
+       width: 1.5em;
+       opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
+       border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
+       border-color: rgba(0, 0, 0, 0.2);
+       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+       background: #f8fbfd;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .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-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .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-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-popupToolGroup {
+       position: relative;
+       height: 2em;
+       min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+       display: block;
+       cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+       cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       display: none;
+       position: absolute;
+       z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+       display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+       left: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+       right: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+       min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2em;
+       height: 2em;
+       opacity: 0.8;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 0.6em;
+       font-weight: bold;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
+       border-bottom-left-radius: 0;
+       border-bottom-right-radius: 0;
+       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+       background: #f8fbfd;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-right: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       top: 2em;
+       margin: 0 -1px;
+       border: solid 1px #cccccc;
+       background-color: white;
+       box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 2em;
+       width: 2em;
+       margin-right: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       line-height: 2em;
+       font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+       display: inline-block;
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+       padding: 0.25em;
+}
+.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
+       border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+       border: solid 1px transparent;
+       margin: -1px 0;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       padding-right: 0.5em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+       border-color: rgba(0, 0, 0, 0.1);
+       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+       background: #f8fbfd;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+       border-top-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
+       border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+       border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.8;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 1;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #cccccc;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+       color: #cccccc;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-menuToolGroup {
+       border-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+       display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+       min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+       padding: 0.25em 0 0.25em 0;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+       border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+       border-color: rgba(0, 0, 0, 0.25);
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       padding: 0 1em 0 0.25em;
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-image: none;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+       background-color: #e1f3ff;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #cccccc;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+       color: #cccccc;
+       border-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-toolbar {
+       clear: both;
+}
+.oo-ui-toolbar-bar {
+       line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+       float: right;
+}
+.oo-ui-toolbar-tools {
+       display: inline;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+       -webkit-touch-callout: default;
+       -webkit-user-select: all;
+          -moz-user-select: all;
+           -ms-user-select: all;
+               user-select: all;
+}
+.oo-ui-toolbar-shadow {
+       background-position: left top;
+       background-repeat: repeat-x;
+       position: absolute;
+       width: 100%;
+       pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+       border-bottom: solid 1px #cccccc;
+       background: #f8fbfd;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
+       background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+       background-image:    -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+       background-image:     -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+       background-image:      -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+       background-image:         linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+       border: none;
+       background: none;
+}
+.oo-ui-toolbar-shadow {
+       background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
+       bottom: -9px;
+       height: 9px;
+       opacity: 0.125;
+       -webkit-transition: opacity 500ms ease-in-out;
+          -moz-transition: opacity 500ms ease-in-out;
+           -ms-transition: opacity 500ms ease-in-out;
+            -o-transition: opacity 500ms ease-in-out;
+               transition: opacity 500ms ease-in-out;
+}
+.oo-ui-optionWidget {
+       position: relative;
+       display: block;
+       cursor: pointer;
+       padding: 0.5em 2em 0.5em 3em;
+       border: none;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       display: block;
+       white-space: nowrap;
+       text-overflow: ellipsis;
+       overflow: hidden;
+}
+.oo-ui-optionWidget-highlighted {
+       background-color: #e1f3ff;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       line-height: 1.5em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
+       background-color: #a7dcff;
+}
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+       background-color: #a7dcff;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       color: #cccccc;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       top: 50%;
+       width: 2em;
+       height: 2em;
+       margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+       left: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       right: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 0.3em;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-left: -1px;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+.oo-ui-buttonOptionWidget {
+       display: inline-block;
+       padding: 0;
+       background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       position: static;
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       height: 1.9em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       height: 1.9em;
+       margin-top: 0;
+}
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+       background-color: transparent;
+}
+.oo-ui-labelWidget {
+       display: inline-block;
+       padding: 0.5em 0;
+}
+.oo-ui-iconWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 1.9em;
+       width: 1.9em;
+       opacity: 0.8;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 1.9em;
+       width: 1.9em;
+       opacity: 0.8;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-bottom: -1px;
+       margin-left: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+       position: relative;
+       display: inline-block;
+       vertical-align: middle;
+       overflow: hidden;
+       cursor: pointer;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       -webkit-transform: translateZ(0px);
+          -moz-transform: translateZ(0px);
+           -ms-transform: translateZ(0px);
+            -o-transform: translateZ(0px);
+               transform: translateZ(0px);
+       height: 2em;
+       width: 4em;
+       border-radius: 1em;
+       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
+       border: solid 1px #cccccc;
+       background: #eeeeee;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       position: absolute;
+       display: block;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       right: 0;
+       left: 0;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: none;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+       opacity: 0.5;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       top: 0.25em;
+       left: 0.25em;
+       width: 1.5em;
+       height: 1.5em;
+       margin-top: -1px;
+       border-radius: 1em;
+       box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
+       border: 1px #c9c9c9 solid;
+       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+          -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+           -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+            -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+               transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+       background: #eeeeee;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
+       border-color: #aaaaaa;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+       border-radius: 1em;
+       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+       -webkit-transition: opacity 200ms ease-in-out;
+          -moz-transition: opacity 200ms ease-in-out;
+           -ms-transition: opacity 200ms ease-in-out;
+            -o-transition: opacity 200ms ease-in-out;
+               transition: opacity 200ms ease-in-out;
+       background: #cde7f4;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+       opacity: 1;
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+       left: 2.25em;
+       margin-left: -2px;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: block;
+       opacity: 0;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+       left: 0.25em;
+       margin-left: 0;
+}
+.oo-ui-actionWidget.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
+.oo-ui-popupWidget {
+       position: absolute;
+}
+.oo-ui-popupWidget-popup {
+       position: relative;
+       overflow: hidden;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+       display: none;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+       display: block;
+       position: absolute;
+       top: 0;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       float: left;
+       cursor: default;
+}
+.oo-ui-popupWidget-body {
+       clear: both;
+       overflow: hidden;
+}
+.oo-ui-popupWidget-popup {
+       border: solid 1px #cccccc;
+       border-radius: 0.25em;
+       background-color: #ffffff;
+       box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+       margin-top: 7px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+       content: "";
+       position: absolute;
+       width: 0;
+       height: 0;
+       border-style: solid;
+       border-color: transparent;
+       border-top: 0;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+       bottom: -8px;
+       left: -7px;
+       border-bottom-color: #aaaaaa;
+       border-width: 7px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+       bottom: -8px;
+       left: -6px;
+       border-bottom-color: #ffffff;
+       border-width: 6px;
+}
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+       -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+          -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+           -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+            -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+               transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+}
+.oo-ui-popupWidget-head {
+       height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body {
+       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupWidget-body-padded {
+       padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+       position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+       position: absolute;
+       cursor: auto;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
+       left: 1em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       left: -1em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
+       left: 1.25em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       left: -1.25em;
+}
+.oo-ui-textInputWidget {
+       position: relative;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       width: 20em;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       display: inline-block;
+       width: 100%;
+       resize: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       top: 0;
+       height: 100%;
+       background-repeat: no-repeat;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+       left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       padding: 0.5em;
+       font-size: 1em;
+       font-family: sans-serif;
+       background-color: #ffffff;
+       border: solid 1px #cccccc;
+       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
+       border-radius: 0.25em;
+       -webkit-transition: border-color 200ms, box-shadow 200ms;
+          -moz-transition: border-color 200ms, box-shadow 200ms;
+           -ms-transition: border-color 200ms, box-shadow 200ms;
+            -o-transition: border-color 200ms, box-shadow 200ms;
+               transition: border-color 200ms, box-shadow 200ms;
+}
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+       padding-left: 2em;
+}
+.oo-ui-textInputWidget-icon {
+       width: 2em;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+       outline: none;
+       border-color: #a7dcff;
+       box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
+.oo-ui-textInputWidget input[readonly],
+.oo-ui-textInputWidget textarea[readonly] {
+       color: #777777;
+       text-shadow: 0 1px 1px #ffffff;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
+}
+.oo-ui-textInputWidget .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
+       opacity: 0.8;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement input,
+.oo-ui-textInputWidget.oo-ui-iconElement textarea {
+       padding-left: 2em;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       width: 2em;
+       background-position: right center;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement input,
+.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
+       padding-right: 1.5em;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       width: 1.5em;
+       background-position: left center;
+}
+.oo-ui-menuWidget {
+       position: absolute;
+       background: #ffffff;
+       margin-top: -1px;
+       border: solid 1px #cccccc;
+       border-radius: 0 0 0.25em 0.25em;
+       box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-menuWidget input {
+       position: absolute;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+       opacity: 0;
+}
+.oo-ui-menuItemWidget {
+       position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+       background-color: #e1f3ff;
+}
+.oo-ui-menuSectionItemWidget {
+       cursor: default;
+       padding: 0.33em 0.75em;
+       color: #888888;
+}
+.oo-ui-inlineMenuWidget {
+       position: relative;
+       display: inline-block;
+       margin: 0.25em 0;
+       min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+       width: 100%;
+       display: inline-block;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+       z-index: 1;
+       width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+       cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+       height: 2.5em;
+       border: solid 1px rgba(0, 0, 0, 0.1);
+       border-radius: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle:hover {
+       border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       line-height: 2.5em;
+       margin: 0 0.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2.5em;
+       height: 2.5em;
+       opacity: 0.8;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-right: 2em;
+}
+.oo-ui-outlineItemWidget {
+       position: relative;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       font-size: 1.1em;
+       padding: 0.75em;
+}
+.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+       padding-right: 1.5em;
+}
+.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       opacity: 0.5;
+}
+.oo-ui-outlineItemWidget-level-0 {
+       padding-left: 3.5em;
+}
+.oo-ui-outlineItemWidget-level-0 .oo-ui-iconElement-icon {
+       left: 1em;
+}
+.oo-ui-outlineItemWidget-level-1 {
+       padding-left: 5em;
+}
+.oo-ui-outlineItemWidget-level-1 .oo-ui-iconElement-icon {
+       left: 2.5em;
+}
+.oo-ui-outlineItemWidget-level-2 {
+       padding-left: 6.5em;
+}
+.oo-ui-outlineItemWidget-level-2 .oo-ui-iconElement-icon {
+       left: 4em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
+       background-color: #a7dcff;
+       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-important {
+       font-weight: bold;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-placeholder {
+       font-style: italic;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
+       opacity: 0.5;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-outlineControlsWidget {
+       height: 3em;
+       background-color: #ffffff;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       float: left;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       float: left;
+       background-position: right center;
+       background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-movers {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       height: 2em;
+       margin: 0.5em;
+       padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       width: 1.5em;
+       height: 2em;
+       margin: 0.5em 0 0.5em 0.5em;
+       opacity: 0.2;
+}
+.oo-ui-outlineControlsWidget-items {
+       margin-left: 0;
+}
+.oo-ui-comboBoxWidget {
+       display: inline-block;
+       position: relative;
+       min-width: 20em;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+       width: 100%;
+       z-index: 1;
+}
+.oo-ui-comboBoxWidget-handle {
+       border: solid 1px rgba(0, 0, 0, 0.1);
+       border-radius: 0.25em;
+}
+.oo-ui-comboBoxWidget-handle:hover {
+       border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-comboBoxWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
+.oo-ui-comboBoxWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       cursor: default;
+       opacity: 0.2;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+       margin-top: -3px;
+}
+.oo-ui-searchWidget-query {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       width: 100%;
+}
+.oo-ui-searchWidget-results {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-searchWidget-query {
+       height: 4em;
+       padding: 0 1em;
+       box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       margin: 0.75em 0;
+}
+.oo-ui-searchWidget-results {
+       top: 4em;
+       padding: 1em;
+       line-height: 0;
+}
+.oo-ui-window {
+       line-height: 1em;
+}
+.oo-ui-window-frame {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+       margin: 0;
+       padding: 0;
+}
+.oo-ui-window-content:focus {
+       outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-window-body {
+       margin: 0;
+       padding: 0;
+       background: none;
+}
+.oo-ui-window-overlay {
+       position: absolute;
+       top: 0;
+       left: 0;
+}
+.oo-ui-window-isolated,
+.oo-ui-window-overlay {
+       background-color: transparent;
+       background-image: none;
+       font-family: sans-serif;
+       font-size: 0.8em;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       position: absolute;
+       left: 0;
+       right: 0;
+       overflow: hidden;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+       z-index: 1;
+       top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       z-index: 2;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       z-index: 1;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+       z-index: 3;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-messageDialog-actions-horizontal {
+       display: table;
+       table-layout: fixed;
+       width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       display: table-cell;
+       width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+       display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       display: block;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+       position: relative;
+       text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+       display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       position: relative;
+       top: auto;
+       bottom: auto;
+       display: inline;
+       white-space: nowrap;
+}
+.oo-ui-messageDialog-content .oo-ui-window-body {
+       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+       display: block;
+       text-align: center;
+       padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+       font-size: 1.5em;
+       line-height: 1em;
+       color: #000000;
+}
+.oo-ui-messageDialog-message {
+       font-size: 0.9em;
+       line-height: 1.25em;
+       color: #666666;
+}
+.oo-ui-messageDialog-message-verbose {
+       font-size: 1.1em;
+       line-height: 1.5em;
+       text-align: left;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       border-right: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+       border-right-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+       border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       text-align: center;
+       line-height: 3.4em;
+       padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+       background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+       font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+       background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+       background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+       background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+       overflow: hidden;
+       text-overflow: ellipsis;
+       white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+       display: inline;
+       padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+       white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+       left: 0;
+}
+.oo-ui-processDialog-actions-primary {
+       right: 0;
+}
+.oo-ui-processDialog-errors {
+       display: none;
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+       z-index: 2;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+       height: 3.4em;
+}
+.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+       top: 3.4em;
+       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+}
+.oo-ui-processDialog-navigation {
+       position: relative;
+       height: 3.4em;
+       padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+       padding: 0.75em 0;
+       height: 1.9em;
+       cursor: default;
+       text-align: center;
+}
+.oo-ui-processDialog-title {
+       font-weight: bold;
+       line-height: 1.9em;
+}
+.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 {
+       padding-top: 0.75em;
+       padding-bottom: 0.75em;
+       min-width: 1.9em;
+       min-height: 1.9em;
+}
+.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.9em;
+       padding: 0 1em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+       position: absolute;
+       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 0 0.75em 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;
+       vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget: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 {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .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 {
+       /* Adjust for border so text aligns with title */
+       margin: -1px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .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 {
+       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 {
+       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 {
+       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 {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       left: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-left: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       right: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-right: 2.25em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+       min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+       background-color: rgba(255, 255, 255, 0.9);
+       padding: 3em 3em 1.5em 3em;
+       text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+       margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+       font-size: 1.5em;
+       color: #000000;
+       margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+       text-align: left;
+       margin: 1em;
+       padding: 1em;
+       border: solid 1px #ff9e9e;
+       background-color: #fff7f7;
+       border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       position: fixed;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+       width: auto;
+       height: auto;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
+       padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+       position: absolute;
+       right: 0;
+       left: 0;
+       margin: auto;
+       overflow: hidden;
+       max-width: 100%;
+       max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+       width: 100%;
+       height: 100%;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       background-color: rgba(255, 255, 255, 0.5);
+       opacity: 0;
+       -webkit-transition: opacity 250ms ease-in-out;
+          -moz-transition: opacity 250ms ease-in-out;
+           -ms-transition: opacity 250ms ease-in-out;
+            -o-transition: opacity 250ms ease-in-out;
+               transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       top: 1em;
+       bottom: 1em;
+       background-color: #ffffff;
+       -webkit-transform: scale(0.5);
+          -moz-transform: scale(0.5);
+           -ms-transform: scale(0.5);
+            -o-transform: scale(0.5);
+               transform: scale(0.5);
+       -webkit-transition: all 250ms ease-in-out;
+          -moz-transition: all 250ms ease-in-out;
+           -ms-transition: all 250ms ease-in-out;
+            -o-transition: all 250ms ease-in-out;
+               transition: all 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+       opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       -webkit-transform: scale(1);
+          -moz-transform: scale(1);
+           -ms-transform: scale(1);
+            -o-transform: scale(1);
+               transform: scale(1);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+       border: solid 1px #cccccc;
+       border-radius: 0.5em;
+       box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+}
+
+.oo-ui-icon-add {
+       background-image: /* @embed */ url(themes/apex/images/icons/add.svg);
+}
+.oo-ui-icon-advanced {
+       background-image: /* @embed */ url(themes/apex/images/icons/advanced.svg);
+}
+.oo-ui-icon-alert {
+       background-image: /* @embed */ url(themes/apex/images/icons/alert.svg);
+}
+.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
+}
+.oo-ui-icon-clear {
+       background-image: /* @embed */ url(themes/apex/images/icons/clear.svg);
+}
+.oo-ui-icon-close {
+       background-image: /* @embed */ url(themes/apex/images/icons/close.svg);
+}
+.oo-ui-icon-code {
+       background-image: /* @embed */ url(themes/apex/images/icons/code.svg);
+}
+.oo-ui-icon-collapse {
+       background-image: /* @embed */ url(themes/apex/images/icons/collapse.svg);
+}
+.oo-ui-icon-comment {
+       background-image: /* @embed */ url(themes/apex/images/icons/comment.svg);
+}
+.oo-ui-icon-expand {
+       background-image: /* @embed */ url(themes/apex/images/icons/expand.svg);
+}
+.oo-ui-icon-help {
+       background-image: /* @embed */ url(themes/apex/images/icons/help.svg);
+}
+.oo-ui-icon-info {
+       background-image: /* @embed */ url(themes/apex/images/icons/info.svg);
+}
+.oo-ui-icon-link {
+       background-image: /* @embed */ url(themes/apex/images/icons/link.svg);
+}
+.oo-ui-icon-menu {
+       background-image: /* @embed */ url(themes/apex/images/icons/menu.svg);
+}
+.oo-ui-icon-next {
+       background-image: /* @embed */ url(themes/apex/images/icons/move-ltr.svg);
+}
+.oo-ui-icon-picture {
+       background-image: /* @embed */ url(themes/apex/images/icons/picture.svg);
+}
+.oo-ui-icon-previous {
+       background-image: /* @embed */ url(themes/apex/images/icons/move-rtl.svg);
+}
+.oo-ui-icon-redo {
+       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-ltr.svg);
+}
+.oo-ui-icon-remove {
+       background-image: /* @embed */ url(themes/apex/images/icons/remove.svg);
+}
+.oo-ui-icon-search {
+       background-image: /* @embed */ url(themes/apex/images/icons/search.svg);
+}
+.oo-ui-icon-settings {
+       background-image: /* @embed */ url(themes/apex/images/icons/settings.svg);
+}
+.oo-ui-icon-tag {
+       background-image: /* @embed */ url(themes/apex/images/icons/tag.svg);
+}
+.oo-ui-icon-undo {
+       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-rtl.svg);
+}
+.oo-ui-icon-window {
+       background-image: /* @embed */ url(themes/apex/images/icons/window.svg);
+}
+.oo-ui-indicator-alert {
+       background-image: /* @embed */ url(themes/apex/images/indicators/alert.svg);
+}
+.oo-ui-indicator-up {
+       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-up.svg);
+}
+.oo-ui-indicator-down {
+       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-down.svg);
+}
+.oo-ui-indicator-next {
+       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-ltr.svg);
+}
+.oo-ui-indicator-previous {
+       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-rtl.svg);
+}
+.oo-ui-indicator-required {
+       background-image: /* @embed */ url(themes/apex/images/indicators/required.svg);
+}
+.oo-ui-texture-pending {
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
+.oo-ui-texture-transparency {
+       background-image: /* @embed */ url(themes/apex/images/textures/transparency.svg);
+}
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.svg.rtl.css b/resources/lib/oojs-ui/oojs-ui-apex.svg.rtl.css
new file mode 100644 (file)
index 0000000..4ea3271
--- /dev/null
@@ -0,0 +1,2079 @@
+/*!
+ * OOjs UI v0.1.0
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-09-24T23:21:42Z
+ */
+/* @noflip */
+.oo-ui-rtl {
+  direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+  direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  cursor: pointer;
+  display: inline-block;
+  vertical-align: middle;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+  display: inline-block;
+  position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  display: inline-block;
+  vertical-align: top;
+  text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  color: #333;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  margin-left: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  opacity: 0.8;
+  width: 1.9em;
+  height: 1.9em;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
+  /*.oo-ui-transition(opacity 200ms);*/
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
+  opacity: 1;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+  color: #000;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #333;
+  margin-right: 0.25em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #087ecc;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #76ab36;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #d45353;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #ccc;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  margin: 0.1em 0;
+  padding: 0.2em 0.8em;
+  border-radius: 0.3em;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+  border: 1px #c9c9c9 solid;
+  -webkit-transition: border-color 100ms ease-in-out;
+  -moz-transition: border-color 100ms ease-in-out;
+  -ms-transition: border-color 100ms ease-in-out;
+  -o-transition: border-color 100ms ease-in-out;
+  transition: border-color 100ms ease-in-out;
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
+  border-color: #aaa;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  line-height: 1.9em;
+}
+.oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+  color: black;
+  border-color: #c9c9c9;
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: -0.5em;
+  margin-left: -0.5em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: -0.5em;
+  margin-left: 0.3em;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
+  border: solid 1px #a6cee1;
+  background: #cde7f4;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
+  background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+  border-color: #9dc2d4;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  border: solid 1px #a6cee1;
+  background: #cde7f4;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+  border: solid 1px #b8d892;
+  background: #daf0be;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
+  background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+  border-color: #adcb89;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  border: solid 1px #b8d892;
+  background: #daf0be;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
+  background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+  color: #d45353;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  opacity: 0.5;
+  box-shadow: none;
+  color: #333;
+  background: #eee;
+  border-color: #ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:focus {
+  border-color: #ccc;
+  box-shadow: none;
+}
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 3em;
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 1.5em;
+}
+.oo-ui-bookletLayout-outlinePanel {
+  border-left: solid 1px #ddd;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  content: " ";
+  display: table;
+}
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  text-align: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+  z-index: 1;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+  float: left;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+  padding: 0.5em 0.75em;
+}
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  padding-top: 0.5em;
+  margin-left: 5%;
+  width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+  color: #ccc;
+}
+.oo-ui-fieldsetLayout {
+  position: relative;
+  margin: 0;
+  padding: 0;
+  border: none;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  display: block;
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+  font-size: 1.5em;
+  margin-bottom: 0.5em;
+  padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+  padding-right: 1.75em;
+  line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  right: 0;
+  top: 0.25em;
+  width: 2em;
+  height: 2em;
+}
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout {
+  position: relative;
+}
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout-padded {
+  padding: 1.25em;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  display: block;
+  position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+  z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-right: 1.25em;
+  font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+  display: inline-block;
+  vertical-align: middle;
+  margin: 0.3em;
+  border-radius: 0.25em;
+  border: solid 1px transparent;
+  -webkit-transition: border-color 300ms ease-in-out;
+  -moz-transition: border-color 300ms ease-in-out;
+  -ms-transition: border-color 300ms ease-in-out;
+  -o-transition: border-color 300ms ease-in-out;
+  transition: border-color 300ms ease-in-out;
+}
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #000;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+  display: inline-block;
+  position: relative;
+  vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+  margin: -1px -1px -1px 0;
+  border: solid 1px transparent;
+}
+.oo-ui-barToolGroup .oo-ui-tool:first-child {
+  border-top-right-radius: 0.25em;
+  border-bottom-right-radius: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool:last-child {
+  margin-left: -1px;
+  border-top-left-radius: 0.25em;
+  border-bottom-left-radius: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  height: 1.5em;
+  padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 1.5em;
+  width: 1.5em;
+  opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-color: rgba(0, 0, 0, 0.2);
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-right-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .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-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  display: none;
+  position: absolute;
+  z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+  right: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+  left: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+  min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2em;
+  height: 2em;
+  opacity: 0.8;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 0.6em;
+  font-weight: bold;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-left: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 2em;
+  margin: 0 -1px;
+  border: solid 1px #ccc;
+  background-color: white;
+  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 2em;
+  width: 2em;
+  margin-left: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  line-height: 2em;
+  font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em;
+}
+.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  border: solid 1px transparent;
+  margin: -1px 0;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  padding-left: 0.5em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-color: rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-top-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.8;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 1;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-menuToolGroup {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  padding: 0 0.25em 0 1em;
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: none;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  background-color: #e1f3ff;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+  border-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-toolbar {
+  clear: both;
+}
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+  float: left;
+}
+.oo-ui-toolbar-tools {
+  display: inline;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-touch-callout: default;
+  -webkit-user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
+}
+.oo-ui-toolbar-shadow {
+  background-position: right top;
+  background-repeat: repeat-x;
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+  border-bottom: solid 1px #ccc;
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+  border: none;
+  background: none;
+}
+.oo-ui-toolbar-shadow {
+  /* @embed */
+  background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
+  bottom: -9px;
+  height: 9px;
+  opacity: 0.125;
+  -webkit-transition: opacity 500ms ease-in-out;
+  -moz-transition: opacity 500ms ease-in-out;
+  -ms-transition: opacity 500ms ease-in-out;
+  -o-transition: opacity 500ms ease-in-out;
+  transition: opacity 500ms ease-in-out;
+}
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  cursor: pointer;
+  padding: 0.5em 3em 0.5em 2em;
+  border: none;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.oo-ui-optionWidget-highlighted {
+  background-color: #e1f3ff;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  line-height: 1.5em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
+  background-color: #a7dcff;
+}
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+  background-color: #a7dcff;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  color: #ccc;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  left: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+  border-radius: 0.3em;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-right: -1px;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  padding: 0;
+  background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  position: static;
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  height: 1.9em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  height: 1.9em;
+  margin-top: 0;
+}
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+  background-color: transparent;
+}
+.oo-ui-labelWidget {
+  display: inline-block;
+  padding: 0.5em 0;
+}
+.oo-ui-iconWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+  display: inline-block;
+  white-space: nowrap;
+  border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-bottom: -1px;
+  margin-right: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  overflow: hidden;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transform: translateZ(0px);
+  -moz-transform: translateZ(0px);
+  -ms-transform: translateZ(0px);
+  -o-transform: translateZ(0px);
+  transform: translateZ(0px);
+  height: 2em;
+  width: 4em;
+  border-radius: 1em;
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+  border: solid 1px #ccc;
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  opacity: 0.5;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  top: 0.25em;
+  right: 0.25em;
+  width: 1.5em;
+  height: 1.5em;
+  margin-top: -1px;
+  border-radius: 1em;
+  box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
+  border: 1px #c9c9c9 solid;
+  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
+  border-color: #aaa;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  border-radius: 1em;
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+  -webkit-transition: opacity 200ms ease-in-out;
+  -moz-transition: opacity 200ms ease-in-out;
+  -ms-transition: opacity 200ms ease-in-out;
+  -o-transition: opacity 200ms ease-in-out;
+  transition: opacity 200ms ease-in-out;
+  background: #cde7f4;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+  opacity: 1;
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  right: 2.25em;
+  margin-right: -2px;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: block;
+  opacity: 0;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  right: 0.25em;
+  margin-right: 0;
+}
+.oo-ui-actionWidget.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  overflow: hidden;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+  display: none;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  display: block;
+  position: absolute;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  float: right;
+  cursor: default;
+}
+.oo-ui-popupWidget-body {
+  clear: both;
+  overflow: hidden;
+}
+.oo-ui-popupWidget-popup {
+  border: solid 1px #ccc;
+  border-radius: 0.25em;
+  background-color: #fff;
+  box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+  margin-top: 7px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+  content: "";
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-style: solid;
+  border-color: transparent;
+  border-top: 0;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+  bottom: -8px;
+  right: 11px;
+  border-bottom-color: #aaa;
+  border-width: 7px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+  bottom: -8px;
+  right: 12px;
+  border-bottom-color: #fff;
+  border-width: 6px;
+}
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+}
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupWidget-body-padded {
+  padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  right: 1em;
+  cursor: auto;
+}
+.oo-ui-popupButtonWidget > .oo-ui-popupWidget {
+  margin-right: -1em;
+}
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 20em;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  resize: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+  background-repeat: no-repeat;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+  right: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: 0.5em;
+  font-size: 1em;
+  font-family: sans-serif;
+  background-color: #fff;
+  border: solid 1px #ccc;
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+  border-radius: 0.25em;
+  -webkit-transition: border-color 200ms, box-shadow 200ms;
+  -moz-transition: border-color 200ms, box-shadow 200ms;
+  -ms-transition: border-color 200ms, box-shadow 200ms;
+  -o-transition: border-color 200ms, box-shadow 200ms;
+  transition: border-color 200ms, box-shadow 200ms;
+}
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+  padding-right: 2em;
+}
+.oo-ui-textInputWidget-icon {
+  width: 2em;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+  outline: none;
+  border-color: #a7dcff;
+  box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
+}
+.oo-ui-textInputWidget input[readonly],
+.oo-ui-textInputWidget textarea[readonly] {
+  color: #777;
+  text-shadow: 0 1px 1px #fff;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+  background-color: transparent;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #ddd;
+  background-color: #f3f3f3;
+}
+.oo-ui-textInputWidget .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
+  opacity: 0.8;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement input,
+.oo-ui-textInputWidget.oo-ui-iconElement textarea {
+  padding-right: 2em;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  width: 2em;
+  background-position: left center;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement input,
+.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
+  padding-left: 1.5em;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  width: 1.5em;
+  background-position: right center;
+}
+.oo-ui-menuWidget {
+  position: absolute;
+  background: #fff;
+  margin-top: -1px;
+  border: solid 1px #ccc;
+  border-radius: 0 0 0.25em 0.25em;
+  box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+}
+.oo-ui-menuItemWidget {
+  position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+  background-color: #e1f3ff;
+}
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+  padding: 0.33em 0.75em;
+  color: #888;
+}
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  margin: 0.25em 0;
+  min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+  width: 100%;
+  display: inline-block;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+  height: 2.5em;
+  border: solid 1px rgba(0, 0, 0, 0.1);
+  border-radius: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  line-height: 2.5em;
+  margin: 0 0.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+  opacity: 0.8;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #ddd;
+  background-color: #f3f3f3;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+  opacity: 0.2;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-left: 2em;
+}
+.oo-ui-outlineItemWidget {
+  position: relative;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  font-size: 1.1em;
+  padding: 0.75em;
+}
+.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+  padding-left: 1.5em;
+}
+.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  opacity: 0.5;
+}
+.oo-ui-outlineItemWidget-level-0 {
+  padding-right: 3.5em;
+}
+.oo-ui-outlineItemWidget-level-0 .oo-ui-iconElement-icon {
+  right: 1em;
+}
+.oo-ui-outlineItemWidget-level-1 {
+  padding-right: 5em;
+}
+.oo-ui-outlineItemWidget-level-1 .oo-ui-iconElement-icon {
+  right: 2.5em;
+}
+.oo-ui-outlineItemWidget-level-2 {
+  padding-right: 6.5em;
+}
+.oo-ui-outlineItemWidget-level-2 .oo-ui-iconElement-icon {
+  right: 4em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
+  background-color: #a7dcff;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-important {
+  font-weight: bold;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-placeholder {
+  font-style: italic;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
+  opacity: 0.5;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
+  color: #777;
+}
+.oo-ui-outlineControlsWidget {
+  height: 3em;
+  background-color: #fff;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  float: right;
+  background-position: left center;
+  background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  height: 2em;
+  margin: 0.5em;
+  padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  width: 1.5em;
+  height: 2em;
+  margin: 0.5em 0.5em 0.5em 0;
+  opacity: 0.2;
+}
+.oo-ui-outlineControlsWidget-items {
+  margin-right: 0;
+}
+.oo-ui-comboBoxWidget {
+  display: inline-block;
+  position: relative;
+  min-width: 20em;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+  width: 100%;
+  z-index: 1;
+}
+.oo-ui-comboBoxWidget-handle {
+  border: solid 1px rgba(0, 0, 0, 0.1);
+  border-radius: 0.25em;
+}
+.oo-ui-comboBoxWidget-handle:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-comboBoxWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
+.oo-ui-comboBoxWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  cursor: default;
+  opacity: 0.2;
+}
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
+}
+.oo-ui-searchWidget-results {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-searchWidget-query {
+  height: 4em;
+  padding: 0 1em;
+  box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  margin: 0.75em 0;
+}
+.oo-ui-searchWidget-results {
+  top: 4em;
+  padding: 1em;
+  line-height: 0;
+}
+.oo-ui-window {
+  line-height: 1em;
+}
+.oo-ui-window-frame {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-window-content:focus {
+  outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-window-body {
+  margin: 0;
+  padding: 0;
+  background: none;
+}
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+.oo-ui-window-isolated {
+  background-color: transparent;
+  background-image: none;
+  font-family: sans-serif;
+  font-size: 0.8em;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  position: absolute;
+  right: 0;
+  left: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+  z-index: 1;
+  top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-head.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+  z-index: 2;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  z-index: 1;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+  z-index: 3;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-messageDialog-actions-horizontal {
+  display: table;
+  table-layout: fixed;
+  width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  display: table-cell;
+  width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+  display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+  position: relative;
+  text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  position: relative;
+  top: auto;
+  bottom: auto;
+  display: inline;
+  white-space: nowrap;
+}
+.oo-ui-messageDialog-content .oo-ui-window-body {
+  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+  display: block;
+  text-align: center;
+  padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+  font-size: 1.5em;
+  line-height: 1em;
+  color: #000;
+}
+.oo-ui-messageDialog-message {
+  font-size: 0.9em;
+  line-height: 1.25em;
+  color: #666;
+}
+.oo-ui-messageDialog-message-verbose {
+  font-size: 1.1em;
+  line-height: 1.5em;
+  text-align: right;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  border-left: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+  border-left-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+  border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  text-align: center;
+  line-height: 3.4em;
+  padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+  display: inline;
+  padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+  white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+  right: 0;
+}
+.oo-ui-processDialog-actions-primary {
+  left: 0;
+}
+.oo-ui-processDialog-errors {
+  display: none;
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  z-index: 2;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+  height: 3.4em;
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+  top: 3.4em;
+  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+}
+.oo-ui-processDialog-navigation {
+  position: relative;
+  height: 3.4em;
+  padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+  padding: 0.75em 0;
+  height: 1.9em;
+  cursor: default;
+  text-align: center;
+}
+.oo-ui-processDialog-title {
+  font-weight: bold;
+  line-height: 1.9em;
+}
+.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 {
+  padding-top: 0.75em;
+  padding-bottom: 0.75em;
+  min-width: 1.9em;
+  min-height: 1.9em;
+}
+.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.9em;
+  padding: 0 1em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+  position: absolute;
+  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 0.75em 0.75em 0;
+}
+.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;
+  vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget: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 {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .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 {
+  /* Adjust for border so text aligns with title */
+  margin: -1px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .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 {
+  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 {
+  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 {
+  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 {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-right: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-left: 2.25em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+  min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+  background-color: rgba(255, 255, 255, 0.9);
+  padding: 3em 3em 1.5em 3em;
+  text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+  margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+  font-size: 1.5em;
+  color: #000;
+  margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+  text-align: right;
+  margin: 1em;
+  padding: 1em;
+  border: solid 1px #ff9e9e;
+  background-color: #fff7f7;
+  border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  position: fixed;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+  width: auto;
+  height: auto;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+  position: absolute;
+  left: 0;
+  right: 0;
+  margin: auto;
+  overflow: hidden;
+  max-width: 100%;
+  max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+  width: 100%;
+  height: 100%;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: opacity 250ms ease-in-out;
+  -moz-transition: opacity 250ms ease-in-out;
+  -ms-transition: opacity 250ms ease-in-out;
+  -o-transition: opacity 250ms ease-in-out;
+  transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 1em;
+  bottom: 1em;
+  background-color: #fff;
+  -webkit-transform: scale(0.5);
+  -moz-transform: scale(0.5);
+  -ms-transform: scale(0.5);
+  -o-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transition: all 250ms ease-in-out;
+  -moz-transition: all 250ms ease-in-out;
+  -ms-transition: all 250ms ease-in-out;
+  -o-transition: all 250ms ease-in-out;
+  transition: all 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+  opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: scale(1);
+  -moz-transform: scale(1);
+  -ms-transform: scale(1);
+  -o-transform: scale(1);
+  transform: scale(1);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+  border: solid 1px #ccc;
+  border-radius: 0.5em;
+  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+}
+
+.oo-ui-icon-add {
+  background-image: /* @embed */ url(themes/apex/images/icons/add.svg);
+}
+.oo-ui-icon-advanced {
+  background-image: /* @embed */ url(themes/apex/images/icons/advanced.svg);
+}
+.oo-ui-icon-alert {
+  background-image: /* @embed */ url(themes/apex/images/icons/alert.svg);
+}
+.oo-ui-icon-check {
+  background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
+}
+.oo-ui-icon-clear {
+  background-image: /* @embed */ url(themes/apex/images/icons/clear.svg);
+}
+.oo-ui-icon-close {
+  background-image: /* @embed */ url(themes/apex/images/icons/close.svg);
+}
+.oo-ui-icon-code {
+  background-image: /* @embed */ url(themes/apex/images/icons/code.svg);
+}
+.oo-ui-icon-collapse {
+  background-image: /* @embed */ url(themes/apex/images/icons/collapse.svg);
+}
+.oo-ui-icon-comment {
+  background-image: /* @embed */ url(themes/apex/images/icons/comment.svg);
+}
+.oo-ui-icon-expand {
+  background-image: /* @embed */ url(themes/apex/images/icons/expand.svg);
+}
+.oo-ui-icon-help {
+  background-image: /* @embed */ url(themes/apex/images/icons/help.svg);
+}
+.oo-ui-icon-info {
+  background-image: /* @embed */ url(themes/apex/images/icons/info.svg);
+}
+.oo-ui-icon-link {
+  background-image: /* @embed */ url(themes/apex/images/icons/link.svg);
+}
+.oo-ui-icon-menu {
+  background-image: /* @embed */ url(themes/apex/images/icons/menu.svg);
+}
+.oo-ui-icon-next {
+  background-image: /* @embed */ url(themes/apex/images/icons/move-rtl.svg);
+}
+.oo-ui-icon-picture {
+  background-image: /* @embed */ url(themes/apex/images/icons/picture.svg);
+}
+.oo-ui-icon-previous {
+  background-image: /* @embed */ url(themes/apex/images/icons/move-ltr.svg);
+}
+.oo-ui-icon-redo {
+  background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-rtl.svg);
+}
+.oo-ui-icon-remove {
+  background-image: /* @embed */ url(themes/apex/images/icons/remove.svg);
+}
+.oo-ui-icon-search {
+  background-image: /* @embed */ url(themes/apex/images/icons/search.svg);
+}
+.oo-ui-icon-settings {
+  background-image: /* @embed */ url(themes/apex/images/icons/settings.svg);
+}
+.oo-ui-icon-tag {
+  background-image: /* @embed */ url(themes/apex/images/icons/tag.svg);
+}
+.oo-ui-icon-undo {
+  background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-ltr.svg);
+}
+.oo-ui-icon-window {
+  background-image: /* @embed */ url(themes/apex/images/icons/window.svg);
+}
+.oo-ui-indicator-alert {
+  background-image: /* @embed */ url(themes/apex/images/indicators/alert.svg);
+}
+.oo-ui-indicator-up {
+  background-image: /* @embed */ url(themes/apex/images/indicators/arrow-up.svg);
+}
+.oo-ui-indicator-down {
+  background-image: /* @embed */ url(themes/apex/images/indicators/arrow-down.svg);
+}
+.oo-ui-indicator-next {
+  background-image: /* @embed */ url(themes/apex/images/indicators/arrow-rtl.svg);
+}
+.oo-ui-indicator-previous {
+  background-image: /* @embed */ url(themes/apex/images/indicators/arrow-ltr.svg);
+}
+.oo-ui-indicator-required {
+  background-image: /* @embed */ url(themes/apex/images/indicators/required.svg);
+}
+.oo-ui-texture-pending {
+  background-image: /* @embed */ url(themes/apex/images/textures/pending.svg);
+}
+.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(themes/apex/images/textures/transparency.svg);
+}
+@-webkit-keyframes oo-ui-animate-texture-pending {
+  from {
+    background-position: 100% 0%;
+  }
+  to {
+    background-position: 0% 0%;
+  }
+}
+@keyframes oo-ui-animate-pending {
+  from {
+    background-position: 100% 0%;
+  }
+  to {
+    background-position: 0% 0%;
+  }
+}
+.oo-ui-texture-pending {
+  background-position: 100% 0%;
+  -webkit-animation: oo-ui-animate-texture-pending 30s linear 0 infinite;
+  animation: oo-ui-animate-texture-pending 30s linear 0 infinite;
+}
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.css b/resources/lib/oojs-ui/oojs-ui-mediawiki.css
new file mode 100644 (file)
index 0000000..f18c048
--- /dev/null
@@ -0,0 +1,2036 @@
+/*!
+ * OOjs UI v0.1.0-pre (837b2f733e)
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-10-11T01:05:40Z
+ */
+/* @noflip */
+.oo-ui-rtl {
+       direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+       direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       cursor: pointer;
+       display: inline-block;
+       vertical-align: middle;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+       display: inline-block;
+       position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       display: inline-block;
+       vertical-align: top;
+       text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       font-weight: bold;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-right: -0.75em;
+       margin-left: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-left: 0;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       width: 2.2em;
+       height: 2.2em;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #dddddd;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
+       outline: none;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       margin-left: 0.25em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #757575;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #444444;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+       color: #598ad1;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #015ccc;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+       color: #00c697;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #008c6d;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+       color: #e81915;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #a7170f;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       margin: 0.1em 0;
+       padding: 0.3em 1.2em;
+       border-radius: 0.3em;
+       -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+          -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+           -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+            -o-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+               transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
+       outline: none;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       line-height: 2.2em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: -0.5em;
+       margin-right: -0.5em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: -0.5em;
+       margin-right: 0.3em;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       color: #dddddd;
+       background: #ffffff;
+       border: solid 1px #cdcdcd;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
+       color: #757575;
+       background-color: #ffffff;
+       border: solid 1px #cdcdcd;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+       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);
+       border-color: #aaaaaa;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       background-color: #d0d0d0;
+       border-color: #d0d0d0;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
+       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+       color: #ffffff;
+       background-color: #0274ff;
+       border-color: #0274ff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 -0.2em 0 0 #015ccc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       background-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+       color: #ffffff;
+       background-color: #00af89;
+       border-color: #00af89;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       background-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+       color: #ffffff;
+       background-color: #d11d13;
+       border-color: #d11d13;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       background-color: #a7170f;
+}
+.oo-ui-clippableElement-clippable {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+       overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+       padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 3em;
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       padding: 1.5em;
+}
+.oo-ui-bookletLayout-outlinePanel {
+       border-right: solid 1px #dddddd;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+       box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-fieldLayout {
+       margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+       content: " ";
+       display: table;
+}
+.oo-ui-fieldLayout:after {
+       clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       display: block;
+       float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       display: block;
+       float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       text-align: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       z-index: 1;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+       float: right;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+       padding: 0.5em 0.75em;
+}
+.oo-ui-fieldLayout:last-child {
+       margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       padding-top: 0.5em;
+       margin-right: 5%;
+       width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+       color: #cccccc;
+}
+.oo-ui-fieldsetLayout {
+       position: relative;
+       margin: 0;
+       padding: 0;
+       border: none;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       display: block;
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+       margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+       font-size: 1.5em;
+       margin-bottom: 0.5em;
+       padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+       padding-left: 1.75em;
+       line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       left: 0;
+       top: 0.25em;
+       width: 2em;
+       height: 2em;
+}
+.oo-ui-gridLayout {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-panelLayout {
+       position: relative;
+}
+.oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-panelLayout-padded {
+       padding: 1.25em;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+       display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+       display: block;
+       position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+       z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+       margin-left: 1.25em;
+       font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+       display: inline-block;
+       vertical-align: middle;
+       margin: 0.3em;
+}
+.oo-ui-toolGroup-empty {
+       display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #000000;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+       display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+       display: inline-block;
+       position: relative;
+       vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+       cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       height: 1.5em;
+       padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 1.5em;
+       width: 1.5em;
+       opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
+       background-color: #eeeeee;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .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-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-popupToolGroup {
+       position: relative;
+       height: 2em;
+       min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+       display: block;
+       cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+       cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       display: none;
+       position: absolute;
+       z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+       display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+       left: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+       right: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+       min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2em;
+       height: 2em;
+       opacity: 0.8;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 0.6em;
+       font-weight: bold;
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-right: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       top: 2em;
+       background-color: white;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 2em;
+       width: 2em;
+       margin-right: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       line-height: 2em;
+       font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+       display: inline-block;
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+       padding: 0 0.25em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       padding-right: 0.5em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+       background-color: #eeeeee;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #cccccc;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+       color: #cccccc;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+       padding: 0.25em 0 0.25em 0;
+       border: 1px solid #aaaaaa;
+       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);
+}
+.oo-ui-menuToolGroup {
+       border: solid 1px #cccccc;
+       border-radius: 0.1em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+       display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+       min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+       margin-left: -1px;
+       padding: 0.25em 0 0.25em 0;
+       border: 1px solid #aaaaaa;
+       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);
+}
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+       border-color: #aaaaaa;
+}
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+       border-color: #aaaaaa;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       padding: 0 1em 0 0.25em;
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-image: none;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+       background-color: #e1f3ff;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #cccccc;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+       color: #cccccc;
+       border-color: #cccccc;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-toolbar {
+       clear: both;
+}
+.oo-ui-toolbar-bar {
+       line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+       float: right;
+}
+.oo-ui-toolbar-tools {
+       display: inline;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+       -webkit-touch-callout: default;
+       -webkit-user-select: all;
+          -moz-user-select: all;
+           -ms-user-select: all;
+               user-select: all;
+}
+.oo-ui-toolbar-shadow {
+       background-position: left top;
+       background-repeat: repeat-x;
+       position: absolute;
+       width: 100%;
+       pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+       border-bottom: solid 1px #cccccc;
+       background: #ffffff;
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+       border: none;
+       background: none;
+}
+.oo-ui-toolbar-shadow {
+       display: none;
+}
+.oo-ui-selectWidget {
+       border-radius: 0.3em;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-left: -1px;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+.oo-ui-optionWidget {
+       position: relative;
+       display: block;
+       cursor: pointer;
+       padding: 0.5em 2em 0.5em 3em;
+       border: none;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       display: block;
+       white-space: nowrap;
+       text-overflow: ellipsis;
+       overflow: hidden;
+}
+.oo-ui-optionWidget-highlighted {
+       background-color: #eeeeee;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       line-height: 1.5em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected,
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+       background-color: #a7dcff;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       color: #cccccc;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       top: 50%;
+       width: 2em;
+       height: 2em;
+       margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+       left: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       right: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 0.3em;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-left: -1px;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+.oo-ui-buttonOptionWidget {
+       display: inline-block;
+       padding: 0;
+       background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       position: static;
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       height: 2.2em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       height: 2.2em;
+       margin-top: 0;
+}
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+       background-color: transparent;
+}
+.oo-ui-labelWidget {
+       display: inline-block;
+}
+.oo-ui-iconWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 2.2em;
+       width: 2.2em;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 2.2em;
+       width: 2.2em;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-bottom: -1px;
+       margin-left: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+       position: relative;
+       display: inline-block;
+       vertical-align: middle;
+       overflow: hidden;
+       cursor: pointer;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       -webkit-transform: translateZ(0px);
+          -moz-transform: translateZ(0px);
+           -ms-transform: translateZ(0px);
+            -o-transform: translateZ(0px);
+               transform: translateZ(0px);
+       height: 2em;
+       width: 4em;
+       border-radius: 1em;
+       border: 1px #dddddd solid;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       position: absolute;
+       display: block;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       right: 0;
+       left: 0;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: none;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       top: 0.25em;
+       left: 0.25em;
+       width: 1.5em;
+       height: 1.5em;
+       margin-top: -1px;
+       border-radius: 1em;
+       border: 1px #dddddd solid;
+       background-color: #f7f7f7;
+       -webkit-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+          -moz-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+           -ms-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+            -o-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+               transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+}
+.oo-ui-toggleSwitchWidget-glow {
+       border-radius: 1em;
+       background-color: #f7f7f7;
+       -webkit-transition: background-color 0.1s ease-in-out;
+          -moz-transition: background-color 0.1s ease-in-out;
+           -ms-transition: background-color 0.1s ease-in-out;
+            -o-transition: background-color 0.1s ease-in-out;
+               transition: background-color 0.1s ease-in-out;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+       left: 2.25em;
+       margin-left: -2px;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: block;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+       left: 0.25em;
+       margin-left: 0;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
+       border: 1px #cccccc solid;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
+       border-color: #aaaaaa;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip {
+       background-color: #ffffff;
+       border-color: #aaaaaa;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+       background-color: #d0d0d0;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       background-color: #ffffff;
+}
+.oo-ui-actionWidget.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-popupWidget {
+       position: absolute;
+}
+.oo-ui-popupWidget-popup {
+       position: relative;
+       overflow: hidden;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+       display: none;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+       display: block;
+       position: absolute;
+       top: 0;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       float: left;
+       cursor: default;
+}
+.oo-ui-popupWidget-body {
+       clear: both;
+       overflow: hidden;
+}
+.oo-ui-popupWidget-popup {
+       border: solid 1px #aaaaaa;
+       border-radius: 0.2em;
+       background-color: #ffffff;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+       margin-top: 7px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+       content: "";
+       position: absolute;
+       width: 0;
+       height: 0;
+       border-style: solid;
+       border-color: transparent;
+       border-top: 0;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+       bottom: -8px;
+       left: -13px;
+       border-bottom-color: #888888;
+       border-width: 13px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+       bottom: -8px;
+       left: -12px;
+       border-bottom-color: #ffffff;
+       border-width: 12px;
+}
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+       -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+          -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+           -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+            -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+               transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+}
+.oo-ui-popupWidget-head {
+       height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body {
+       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupWidget-body-padded {
+       padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+       position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+       position: absolute;
+       cursor: auto;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
+       left: 1em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       left: -1em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
+       left: 1.75em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       left: -1.75em;
+}
+.oo-ui-textInputWidget {
+       position: relative;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       width: 20em;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       display: inline-block;
+       width: 100%;
+       resize: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       top: 0;
+       height: 100%;
+       background-repeat: no-repeat;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+       left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       padding: 0.5em 0.5em 0.5em 0.9em;
+       margin: 0;
+       font-size: 1em;
+       font-family: sans-serif;
+       background-color: #ffffff;
+       border: solid 1px #cccccc;
+       box-shadow: inset 0 0 0 0 #0274ff;
+       border-radius: 0.1em;
+       -webkit-transition: box-shadow 0.1s;
+          -moz-transition: box-shadow 0.1s;
+           -ms-transition: box-shadow 0.1s;
+            -o-transition: box-shadow 0.1s;
+               transition: box-shadow 0.1s;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+       padding-left: 2em;
+}
+.oo-ui-textInputWidget-icon {
+       width: 2em;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+       outline: none;
+       border-color: #aaaaaa;
+       box-shadow: inset 0.4em 0 0 0 #0274ff;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-textInputWidget input[readonly],
+.oo-ui-textInputWidget textarea[readonly] {
+       color: #777777;
+       text-shadow: 0 1px 1px #ffffff;
+}
+.oo-ui-textInputWidget input[readonly]:focus,
+.oo-ui-textInputWidget textarea[readonly]:focus {
+       box-shadow: inset 0.4em 0 0 0 #cccccc;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement input,
+.oo-ui-textInputWidget.oo-ui-iconElement textarea {
+       padding-left: 2.4em;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       left: 0.4em;
+       width: 2em;
+       height: 100%;
+       background-position: right center;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement input,
+.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
+       padding-right: 2.2em;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       width: 1.6em;
+       height: 100%;
+       background-position: left center;
+}
+.oo-ui-menuWidget {
+       position: absolute;
+       background: #ffffff;
+       margin-top: -1px;
+       border: solid 1px #aaaaaa;
+       border-radius: 0 0 0.1em 0.1em;
+       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);
+}
+.oo-ui-menuWidget input {
+       position: absolute;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+       opacity: 0;
+}
+.oo-ui-menuItemWidget {
+       position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted {
+       background-color: #eeeeee;
+}
+.oo-ui-menuSectionItemWidget {
+       cursor: default;
+       padding: 0.33em 0.75em;
+       color: #888888;
+}
+.oo-ui-inlineMenuWidget {
+       position: relative;
+       display: inline-block;
+       margin: 0.25em 0;
+       min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+       width: 100%;
+       display: inline-block;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+       z-index: 1;
+       width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+       cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+       height: 2.5em;
+       border: solid 1px #cccccc;
+       border-radius: 0.1em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       line-height: 2.5em;
+       margin: 0 1em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2.5em;
+       height: 2.5em;
+}
+.oo-ui-inlineMenuWidget:hover .oo-ui-inlineMenuWidget-handle {
+       border-color: #aaaaaa;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-right: 2em;
+}
+.oo-ui-inlineMenuWidget .oo-ui-selectWidget {
+       border-top-color: #ffffff;
+}
+.oo-ui-outlineItemWidget {
+       position: relative;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       float: left;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       float: left;
+       background-position: right center;
+       background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-movers {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-comboBoxWidget {
+       display: inline-block;
+       position: relative;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+       width: 100%;
+       z-index: 1;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget input,
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget textarea {
+       height: 2.35em;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement {
+       padding-right: 2.2em;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       width: 2.2em;
+       background-position: center center;
+       border: solid 1px #cccccc;
+       border-left: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-searchWidget-query {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       width: 100%;
+}
+.oo-ui-searchWidget-results {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-window {
+       line-height: 1em;
+}
+.oo-ui-window-frame {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+       margin: 0;
+       padding: 0;
+}
+.oo-ui-window-content:focus {
+       outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-window-body {
+       margin: 0;
+       padding: 0;
+       background: none;
+}
+.oo-ui-window-overlay {
+       position: absolute;
+       top: 0;
+       left: 0;
+}
+.oo-ui-window-isolated,
+.oo-ui-window-overlay {
+       background: transparent;
+       font-family: sans-serif;
+       font-size: 0.8em;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       position: absolute;
+       left: 0;
+       right: 0;
+       overflow: hidden;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+       z-index: 1;
+       top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       z-index: 2;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       z-index: 1;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+       z-index: 3;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       box-shadow: 0 0 1px 0 #aaaaaa;
+}
+.oo-ui-messageDialog-actions-horizontal {
+       display: table;
+       table-layout: fixed;
+       width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       display: table-cell;
+       width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+       display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       display: block;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+       position: relative;
+       text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+       display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       position: relative;
+       top: auto;
+       bottom: auto;
+       display: inline;
+       white-space: nowrap;
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+       display: block;
+       text-align: center;
+       padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+       font-size: 1.5em;
+       line-height: 1em;
+       color: #000000;
+}
+.oo-ui-messageDialog-message {
+       font-size: 0.9em;
+       line-height: 1.25em;
+       color: #666666;
+}
+.oo-ui-messageDialog-message-verbose {
+       font-size: 1.1em;
+       line-height: 1.5em;
+       text-align: left;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       border-right: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+       border-right-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+       border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       text-align: center;
+       line-height: 3.4em;
+       padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+       background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+       font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+       background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+       background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+       background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+       overflow: hidden;
+       text-overflow: ellipsis;
+       white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+       display: inline;
+       padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+       white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+       left: 0;
+}
+.oo-ui-processDialog-actions-primary {
+       right: 0;
+}
+.oo-ui-processDialog-errors {
+       display: none;
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+       z-index: 2;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+       height: 3.4em;
+}
+.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+       top: 3.4em;
+       box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
+}
+.oo-ui-processDialog-navigation {
+       position: relative;
+       height: 3.4em;
+       padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+       padding: 0.75em 0;
+       height: 1.9em;
+       cursor: default;
+       text-align: center;
+}
+.oo-ui-processDialog-title {
+       font-weight: bold;
+       line-height: 1.9em;
+}
+.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 {
+       padding-top: 0.75em;
+       padding-bottom: 0.75em;
+       min-width: 1.9em;
+       min-height: 1.9em;
+}
+.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.9em;
+       padding: 0 1em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+       position: absolute;
+       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 0 0.75em 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;
+       vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget: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 {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .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 {
+       /* Adjust for border so text aligns with title */
+       margin: -1px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .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 {
+       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 {
+       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 {
+       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 {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       left: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-left: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       right: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-right: 2.25em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+       min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+       background-color: rgba(255, 255, 255, 0.9);
+       padding: 3em 3em 1.5em 3em;
+       text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+       margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+       font-size: 1.5em;
+       color: #000000;
+       margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+       text-align: left;
+       margin: 1em;
+       padding: 1em;
+       border: solid 1px #ff9e9e;
+       background-color: #fff7f7;
+       border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       position: fixed;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+       width: auto;
+       height: auto;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
+       padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+       position: absolute;
+       right: 0;
+       left: 0;
+       margin: auto;
+       overflow: hidden;
+       max-width: 100%;
+       max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+       width: 100%;
+       height: 100%;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       background-color: rgba(255, 255, 255, 0.5);
+       opacity: 0;
+       -webkit-transition: opacity 250ms ease-in-out;
+          -moz-transition: opacity 250ms ease-in-out;
+           -ms-transition: opacity 250ms ease-in-out;
+            -o-transition: opacity 250ms ease-in-out;
+               transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       top: 1em;
+       bottom: 1em;
+       background-color: #ffffff;
+       -webkit-transform: scale(0.5);
+          -moz-transform: scale(0.5);
+           -ms-transform: scale(0.5);
+            -o-transform: scale(0.5);
+               transform: scale(0.5);
+       -webkit-transition: all 250ms ease-in-out;
+          -moz-transition: all 250ms ease-in-out;
+           -ms-transition: all 250ms ease-in-out;
+            -o-transition: all 250ms ease-in-out;
+               transition: all 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+       opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       -webkit-transform: scale(1);
+          -moz-transform: scale(1);
+           -ms-transform: scale(1);
+            -o-transform: scale(1);
+               transform: scale(1);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+       border: solid 1px #aaaaaa;
+       border-radius: 0.2em;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-icon-add {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/add.png);
+}
+.oo-ui-image-constructive .oo-ui-icon-add,
+.oo-ui-image-constructive.oo-ui-icon-add {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/add-constructive.png);
+}
+.oo-ui-image-invert .oo-ui-icon-add,
+.oo-ui-image-invert.oo-ui-icon-add {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/add-invert.png);
+}
+.oo-ui-icon-advanced {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced.png);
+}
+.oo-ui-image-invert .oo-ui-icon-advanced,
+.oo-ui-image-invert.oo-ui-icon-advanced {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced-invert.png);
+}
+.oo-ui-icon-alert {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/alert.png);
+}
+.oo-ui-image-invert .oo-ui-icon-alert,
+.oo-ui-image-invert.oo-ui-icon-alert {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/alert-invert.png);
+}
+.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check.png);
+}
+.oo-ui-image-primary .oo-ui-icon-check,
+.oo-ui-image-primary.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-primary.png);
+}
+.oo-ui-image-invert .oo-ui-icon-check,
+.oo-ui-image-invert.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-invert.png);
+}
+.oo-ui-icon-clear {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/clear.png);
+}
+.oo-ui-image-invert .oo-ui-icon-clear,
+.oo-ui-image-invert.oo-ui-icon-clear {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/clear-invert.png);
+}
+.oo-ui-icon-close {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/close.png);
+}
+.oo-ui-image-invert .oo-ui-icon-close,
+.oo-ui-image-invert.oo-ui-icon-close {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/close-invert.png);
+}
+.oo-ui-icon-code {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/code.png);
+}
+.oo-ui-image-invert .oo-ui-icon-code,
+.oo-ui-image-invert.oo-ui-icon-code {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/code-invert.png);
+}
+.oo-ui-icon-collapse {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse.png);
+}
+.oo-ui-image-invert .oo-ui-icon-collapse,
+.oo-ui-image-invert.oo-ui-icon-collapse {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse-invert.png);
+}
+.oo-ui-icon-comment {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/comment.png);
+}
+.oo-ui-image-invert .oo-ui-icon-comment,
+.oo-ui-image-invert.oo-ui-icon-comment {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/comment-invert.png);
+}
+.oo-ui-icon-expand {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/expand.png);
+}
+.oo-ui-image-invert .oo-ui-icon-expand,
+.oo-ui-image-invert.oo-ui-icon-expand {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/expand-invert.png);
+}
+.oo-ui-icon-help {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/help.png);
+}
+.oo-ui-image-invert .oo-ui-icon-help,
+.oo-ui-image-invert.oo-ui-icon-help {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/help-invert.png);
+}
+.oo-ui-icon-info {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/info.png);
+}
+.oo-ui-image-invert .oo-ui-icon-info,
+.oo-ui-image-invert.oo-ui-icon-info {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/info-invert.png);
+}
+.oo-ui-icon-link {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/link.png);
+}
+.oo-ui-image-invert .oo-ui-icon-link,
+.oo-ui-image-invert.oo-ui-icon-link {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/link-invert.png);
+}
+.oo-ui-icon-menu {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/menu.png);
+}
+.oo-ui-image-invert .oo-ui-icon-menu,
+.oo-ui-image-invert.oo-ui-icon-menu {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/menu-invert.png);
+}
+.oo-ui-icon-next {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr.png);
+}
+.oo-ui-image-invert .oo-ui-icon-next,
+.oo-ui-image-invert.oo-ui-icon-next {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr-invert.png);
+}
+.oo-ui-icon-picture {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/picture.png);
+}
+.oo-ui-image-invert .oo-ui-icon-picture,
+.oo-ui-image-invert.oo-ui-icon-picture {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/picture-invert.png);
+}
+.oo-ui-icon-previous {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl.png);
+}
+.oo-ui-image-invert .oo-ui-icon-previous,
+.oo-ui-image-invert.oo-ui-icon-previous {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl-invert.png);
+}
+.oo-ui-icon-redo {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr.png);
+}
+.oo-ui-image-invert .oo-ui-icon-redo,
+.oo-ui-image-invert.oo-ui-icon-redo {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr-invert.png);
+}
+.oo-ui-icon-remove {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove.png);
+}
+.oo-ui-image-destructive .oo-ui-icon-remove,
+.oo-ui-image-destructive.oo-ui-icon-remove {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-destructive.png);
+}
+.oo-ui-image-invert .oo-ui-icon-remove,
+.oo-ui-image-invert.oo-ui-icon-remove {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-invert.png);
+}
+.oo-ui-icon-search {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/search.png);
+}
+.oo-ui-image-invert .oo-ui-icon-search,
+.oo-ui-image-invert.oo-ui-icon-search {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/search-invert.png);
+}
+.oo-ui-icon-settings {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/settings.png);
+}
+.oo-ui-image-invert .oo-ui-icon-settings,
+.oo-ui-image-invert.oo-ui-icon-settings {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/settings-invert.png);
+}
+.oo-ui-icon-tag {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/tag.png);
+}
+.oo-ui-image-invert .oo-ui-icon-tag,
+.oo-ui-image-invert.oo-ui-icon-tag {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/tag-invert.png);
+}
+.oo-ui-icon-undo {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl.png);
+}
+.oo-ui-image-invert .oo-ui-icon-undo,
+.oo-ui-image-invert.oo-ui-icon-undo {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl-invert.png);
+}
+.oo-ui-icon-window {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/window.png);
+}
+.oo-ui-image-invert .oo-ui-icon-window,
+.oo-ui-image-invert.oo-ui-icon-window {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/window-invert.png);
+}
+.oo-ui-indicator-alert {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-alert,
+.oo-ui-image-invert.oo-ui-indicator-alert {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert-invert.png);
+}
+.oo-ui-indicator-up {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-up,
+.oo-ui-image-invert.oo-ui-indicator-up {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up-invert.png);
+}
+.oo-ui-indicator-down {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-down,
+.oo-ui-image-invert.oo-ui-indicator-down {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down-invert.png);
+}
+.oo-ui-indicator-next {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-next,
+.oo-ui-image-invert.oo-ui-indicator-next {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr-invert.png);
+}
+.oo-ui-indicator-previous {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-previous,
+.oo-ui-image-invert.oo-ui-indicator-previous {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl-invert.png);
+}
+.oo-ui-indicator-required {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/required.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-required,
+.oo-ui-image-invert.oo-ui-indicator-required {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/required-invert.png);
+}
+.oo-ui-texture-pending {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-texture-transparency {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency.png);
+}
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.js b/resources/lib/oojs-ui/oojs-ui-mediawiki.js
new file mode 100644 (file)
index 0000000..9c1ca57
--- /dev/null
@@ -0,0 +1,68 @@
+/*!
+ * OOjs UI v0.1.0-pre (837b2f733e)
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-10-11T01:05:29Z
+ */
+/**
+ * @class
+ * @extends {OO.ui.Theme}
+ *
+ * @constructor
+ */
+OO.ui.MediaWikiTheme = function OoUiMediaWikiTheme() {
+       // Parent constructor
+       OO.ui.MediaWikiTheme.super.call( this );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.MediaWikiTheme, OO.ui.Theme );
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
+       // Parent method
+       var variant,
+               variants = {
+                       invert: false,
+                       primary: false,
+                       constructive: false,
+                       destructive: false
+               },
+               // Parent method
+               classes = OO.ui.MediaWikiTheme.super.prototype.getElementClasses.call( this, element );
+
+       if ( element.isFramed && element.hasFlag ) {
+               if ( element.isFramed() ) {
+                       if (
+                               element.hasFlag( 'primary' ) ||
+                               element.hasFlag( 'constructive' ) ||
+                               element.hasFlag( 'destructive' )
+                       ) {
+                               variants.invert = true;
+                       }
+               } else {
+                       variants.primary = element.hasFlag( 'primary' );
+                       variants.constructive = element.hasFlag( 'constructive' );
+                       variants.destructive = element.hasFlag( 'destructive' );
+               }
+       }
+
+       for ( variant in variants ) {
+               classes[variants[variant] ? 'on' : 'off'].push( 'oo-ui-image-' + variant );
+       }
+
+       return classes;
+};
+
+/* Instantiation */
+
+OO.ui.theme = new OO.ui.MediaWikiTheme();
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.rtl.css b/resources/lib/oojs-ui/oojs-ui-mediawiki.rtl.css
new file mode 100644 (file)
index 0000000..e2acb0f
--- /dev/null
@@ -0,0 +1,1997 @@
+/*!
+ * OOjs UI v0.1.0
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-09-24T23:21:42Z
+ */
+/* @noflip */
+.oo-ui-rtl {
+  direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+  direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  cursor: pointer;
+  display: inline-block;
+  vertical-align: middle;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+  display: inline-block;
+  position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  display: inline-block;
+  vertical-align: top;
+  text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  font-weight: bold;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  margin-left: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  width: 2.2em;
+  height: 2.2em;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  opacity: 0.2;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #ddd;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  margin-right: 0.25em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #757575;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #444444;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+  color: #598ad1;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #015ccc;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+  color: #00c697;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #008c6d;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+  color: #e81915;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #a7170f;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  margin: 0.1em 0;
+  padding: 0.3em 1.2em;
+  border-radius: 0.3em;
+  -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+  -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+  -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+  -o-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+  transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  line-height: 2.2em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: -0.5em;
+  margin-left: -0.5em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: -0.5em;
+  margin-left: 0.3em;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  color: #ddd;
+  background: #fff;
+  border: solid 1px #cdcdcd;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
+  color: #757575;
+  background-color: #fff;
+  border: solid 1px #cdcdcd;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+  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);
+  border-color: #aaa;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  background-color: #d0d0d0;
+  border-color: #d0d0d0;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
+  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+  color: #fff;
+  background-color: #0274ff;
+  border-color: #0274ff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+  box-shadow: inset 0 -0.2em 0 0 #015ccc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+  border-bottom-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  background-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+  color: #fff;
+  background-color: #00af89;
+  border-color: #00af89;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+  box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+  border-bottom-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  background-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+  color: #fff;
+  background-color: #d11d13;
+  border-color: #d11d13;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+  box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+  border-bottom-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  background-color: #a7170f;
+}
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 3em;
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 1.5em;
+}
+.oo-ui-bookletLayout-outlinePanel {
+  border-left: solid 1px #ddd;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  content: " ";
+  display: table;
+}
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  text-align: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+  z-index: 1;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+  float: left;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+  padding: 0.5em 0.75em;
+}
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  padding-top: 0.5em;
+  margin-left: 5%;
+  width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+  color: #ccc;
+}
+.oo-ui-fieldsetLayout {
+  position: relative;
+  margin: 0;
+  padding: 0;
+  border: none;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  display: block;
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+  font-size: 1.5em;
+  margin-bottom: 0.5em;
+  padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+  padding-right: 1.75em;
+  line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  right: 0;
+  top: 0.25em;
+  width: 2em;
+  height: 2em;
+}
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout {
+  position: relative;
+}
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout-padded {
+  padding: 1.25em;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  display: block;
+  position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+  z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-right: 1.25em;
+  font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+  display: inline-block;
+  vertical-align: middle;
+  margin: 0.3em;
+}
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #000;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+  display: inline-block;
+  position: relative;
+  vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  height: 1.5em;
+  padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 1.5em;
+  width: 1.5em;
+  opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
+  background-color: #eee;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .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-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  display: none;
+  position: absolute;
+  z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+  right: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+  left: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+  min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2em;
+  height: 2em;
+  opacity: 0.8;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 0.6em;
+  font-weight: bold;
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-left: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 2em;
+  background-color: white;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 2em;
+  width: 2em;
+  margin-left: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  line-height: 2em;
+  font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  padding: 0 0.25em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  padding-left: 0.5em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+  background-color: #eee;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+  border: 1px solid #aaa;
+  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);
+}
+.oo-ui-menuToolGroup {
+  border: solid 1px #ccc;
+  border-radius: 0.1em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  margin-right: -1px;
+  padding: 0.25em 0 0.25em 0;
+  border: 1px solid #aaa;
+  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);
+}
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+  border-color: #aaa;
+}
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+  border-color: #aaa;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  padding: 0 0.25em 0 1em;
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: none;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  background-color: #e1f3ff;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+  border-color: #ccc;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-toolbar {
+  clear: both;
+}
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+  float: left;
+}
+.oo-ui-toolbar-tools {
+  display: inline;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-touch-callout: default;
+  -webkit-user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
+}
+.oo-ui-toolbar-shadow {
+  background-position: right top;
+  background-repeat: repeat-x;
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+  border-bottom: solid 1px #ccc;
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+  border: none;
+  background: none;
+}
+.oo-ui-toolbar-shadow {
+  display: none;
+}
+.oo-ui-selectWidget {
+  border-radius: 0.3em;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-right: -1px;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  cursor: pointer;
+  padding: 0.5em 3em 0.5em 2em;
+  border: none;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.oo-ui-optionWidget-highlighted {
+  background-color: #eee;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  line-height: 1.5em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
+  background-color: #a7dcff;
+}
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+  background-color: #a7dcff;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  color: #ccc;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  left: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+  border-radius: 0.3em;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-right: -1px;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  padding: 0;
+  background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  position: static;
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  height: 2.2em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  height: 2.2em;
+  margin-top: 0;
+}
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+  background-color: transparent;
+}
+.oo-ui-labelWidget {
+  display: inline-block;
+}
+.oo-ui-iconWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 2.2em;
+  width: 2.2em;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 2.2em;
+  width: 2.2em;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+  display: inline-block;
+  white-space: nowrap;
+  border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-bottom: -1px;
+  margin-right: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  overflow: hidden;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transform: translateZ(0px);
+  -moz-transform: translateZ(0px);
+  -ms-transform: translateZ(0px);
+  -o-transform: translateZ(0px);
+  transform: translateZ(0px);
+  height: 2em;
+  width: 4em;
+  border-radius: 1em;
+  border: 1px #ddd solid;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  top: 0.25em;
+  right: 0.25em;
+  width: 1.5em;
+  height: 1.5em;
+  margin-top: -1px;
+  border-radius: 1em;
+  border: 1px #ddd solid;
+  background-color: #f7f7f7;
+  -webkit-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
+  -moz-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
+  -ms-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
+  -o-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
+  transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
+}
+.oo-ui-toggleSwitchWidget-glow {
+  border-radius: 1em;
+  background-color: #f7f7f7;
+  -webkit-transition: background-color 0.1s ease-in-out;
+  -moz-transition: background-color 0.1s ease-in-out;
+  -ms-transition: background-color 0.1s ease-in-out;
+  -o-transition: background-color 0.1s ease-in-out;
+  transition: background-color 0.1s ease-in-out;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  right: 2.25em;
+  margin-right: -2px;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: block;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  right: 0.25em;
+  margin-right: 0;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
+  border: 1px #ccc solid;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
+  border-color: #aaa;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip {
+  background-color: #fff;
+  border-color: #aaa;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+  background-color: #d0d0d0;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  background-color: #fff;
+}
+.oo-ui-actionWidget.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  overflow: hidden;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+  display: none;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  display: block;
+  position: absolute;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  float: right;
+  cursor: default;
+}
+.oo-ui-popupWidget-body {
+  clear: both;
+  overflow: hidden;
+}
+.oo-ui-popupWidget-popup {
+  border: solid 1px #aaa;
+  border-radius: 0.2em;
+  background-color: #fff;
+  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+  margin-top: 7px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+  content: "";
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-style: solid;
+  border-color: transparent;
+  border-top: 0;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+  bottom: -8px;
+  right: 11px;
+  border-bottom-color: #888;
+  border-width: 13px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+  bottom: -8px;
+  right: 12px;
+  border-bottom-color: #fff;
+  border-width: 12px;
+}
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+}
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupWidget-body-padded {
+  padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  right: 1em;
+  cursor: auto;
+}
+.oo-ui-popupButtonWidget > .oo-ui-popupWidget {
+  margin-right: -1em;
+}
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 20em;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  resize: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+  background-repeat: no-repeat;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+  right: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: 0.5em 0.9em 0.5em 0.5em;
+  margin: 0;
+  font-size: 1em;
+  font-family: sans-serif;
+  background-color: #fff;
+  border: solid 1px #ccc;
+  box-shadow: inset 0 0 0 0 #0274FF;
+  border-radius: 0.1em;
+  -webkit-transition: box-shadow 0.1s;
+  -moz-transition: box-shadow 0.1s;
+  -ms-transition: box-shadow 0.1s;
+  -o-transition: box-shadow 0.1s;
+  transition: box-shadow 0.1s;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+  padding-right: 2em;
+}
+.oo-ui-textInputWidget-icon {
+  width: 2em;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+  outline: none;
+  border-color: #aaa;
+  box-shadow: inset 0.4em 0 0 0 #0274ff;
+}
+.oo-ui-textInputWidget input[readonly],
+.oo-ui-textInputWidget textarea[readonly] {
+  color: #777;
+  text-shadow: 0 1px 1px #fff;
+}
+.oo-ui-textInputWidget input[readonly]:focus,
+.oo-ui-textInputWidget textarea[readonly]:focus {
+  box-shadow: inset 0.4em 0 0 0 #ccc;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+  background-color: transparent;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #ddd;
+  background-color: #f3f3f3;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement input,
+.oo-ui-textInputWidget.oo-ui-iconElement textarea {
+  padding-right: 2.4em;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  right: 0.4em;
+  width: 2em;
+  height: 100%;
+  background-position: left center;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement input,
+.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
+  padding-left: 2.2em;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  width: 1.6em;
+  height: 100%;
+  background-position: right center;
+}
+.oo-ui-menuWidget {
+  position: absolute;
+  background: #fff;
+  margin-top: -1px;
+  border: solid 1px #aaa;
+  border-radius: 0 0 0.1em 0.1em;
+  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);
+}
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+}
+.oo-ui-menuItemWidget {
+  position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+  background-color: #eee;
+}
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+  padding: 0.33em 0.75em;
+  color: #888;
+}
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  margin: 0.25em 0;
+  min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+  width: 100%;
+  display: inline-block;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+  height: 2.5em;
+  border: solid 1px #ccc;
+  border-radius: 0.1em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  line-height: 2.5em;
+  margin: 0 1em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+}
+.oo-ui-inlineMenuWidget:hover .oo-ui-inlineMenuWidget-handle {
+  border-color: #aaa;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #ddd;
+  background-color: #f3f3f3;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+  opacity: 0.2;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-left: 2em;
+}
+.oo-ui-inlineMenuWidget .oo-ui-selectWidget {
+  border-top-color: #fff;
+}
+.oo-ui-outlineItemWidget {
+  position: relative;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  float: right;
+  background-position: left center;
+  background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-comboBoxWidget {
+  display: inline-block;
+  position: relative;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+  width: 100%;
+  z-index: 1;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget input,
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget textarea {
+  height: 2.35em;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement {
+  padding-left: 2.2em;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  width: 2.2em;
+  background-position: center center;
+  border: solid 1px #ccc;
+  border-right: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
+}
+.oo-ui-searchWidget-results {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-window {
+  line-height: 1em;
+}
+.oo-ui-window-frame {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-window-content:focus {
+  outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-window-body {
+  margin: 0;
+  padding: 0;
+  background: none;
+}
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+.oo-ui-window-isolated {
+  background: transparent;
+  font-family: sans-serif;
+  font-size: 0.8em;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  position: absolute;
+  right: 0;
+  left: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+  z-index: 1;
+  top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-head.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+  z-index: 2;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  z-index: 1;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+  z-index: 3;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+  box-shadow: 0 0 1px 0 #aaa;
+}
+.oo-ui-messageDialog-actions-horizontal {
+  display: table;
+  table-layout: fixed;
+  width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  display: table-cell;
+  width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+  display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+  position: relative;
+  text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  position: relative;
+  top: auto;
+  bottom: auto;
+  display: inline;
+  white-space: nowrap;
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+  display: block;
+  text-align: center;
+  padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+  font-size: 1.5em;
+  line-height: 1em;
+  color: #000;
+}
+.oo-ui-messageDialog-message {
+  font-size: 0.9em;
+  line-height: 1.25em;
+  color: #666;
+}
+.oo-ui-messageDialog-message-verbose {
+  font-size: 1.1em;
+  line-height: 1.5em;
+  text-align: right;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  border-left: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+  border-left-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+  border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  text-align: center;
+  line-height: 3.4em;
+  padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+  display: inline;
+  padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+  white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+  right: 0;
+}
+.oo-ui-processDialog-actions-primary {
+  left: 0;
+}
+.oo-ui-processDialog-errors {
+  display: none;
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  z-index: 2;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+  height: 3.4em;
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+  top: 3.4em;
+  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
+}
+.oo-ui-processDialog-navigation {
+  position: relative;
+  height: 3.4em;
+  padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+  padding: 0.75em 0;
+  height: 1.9em;
+  cursor: default;
+  text-align: center;
+}
+.oo-ui-processDialog-title {
+  font-weight: bold;
+  line-height: 1.9em;
+}
+.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 {
+  padding-top: 0.75em;
+  padding-bottom: 0.75em;
+  min-width: 1.9em;
+  min-height: 1.9em;
+}
+.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.9em;
+  padding: 0 1em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+  position: absolute;
+  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 0.75em 0.75em 0;
+}
+.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;
+  vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget: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 {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .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 {
+  /* Adjust for border so text aligns with title */
+  margin: -1px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .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 {
+  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 {
+  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 {
+  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 {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-right: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-left: 2.25em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+  min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+  background-color: rgba(255, 255, 255, 0.9);
+  padding: 3em 3em 1.5em 3em;
+  text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+  margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+  font-size: 1.5em;
+  color: #000;
+  margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+  text-align: right;
+  margin: 1em;
+  padding: 1em;
+  border: solid 1px #ff9e9e;
+  background-color: #fff7f7;
+  border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  position: fixed;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+  width: auto;
+  height: auto;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+  position: absolute;
+  left: 0;
+  right: 0;
+  margin: auto;
+  overflow: hidden;
+  max-width: 100%;
+  max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+  width: 100%;
+  height: 100%;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: opacity 250ms ease-in-out;
+  -moz-transition: opacity 250ms ease-in-out;
+  -ms-transition: opacity 250ms ease-in-out;
+  -o-transition: opacity 250ms ease-in-out;
+  transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 1em;
+  bottom: 1em;
+  background-color: #fff;
+  -webkit-transform: scale(0.5);
+  -moz-transform: scale(0.5);
+  -ms-transform: scale(0.5);
+  -o-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transition: all 250ms ease-in-out;
+  -moz-transition: all 250ms ease-in-out;
+  -ms-transition: all 250ms ease-in-out;
+  -o-transition: all 250ms ease-in-out;
+  transition: all 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+  opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: scale(1);
+  -moz-transform: scale(1);
+  -ms-transform: scale(1);
+  -o-transform: scale(1);
+  transform: scale(1);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+  border: solid 1px #aaa;
+  border-radius: 0.2em;
+  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-icon-add {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/add.png);
+}
+.oo-ui-image-invert .oo-ui-icon-add,
+.oo-ui-image-invert.oo-ui-icon-add {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/add-invert.png);
+}
+.oo-ui-icon-advanced {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced.png);
+}
+.oo-ui-image-invert .oo-ui-icon-advanced,
+.oo-ui-image-invert.oo-ui-icon-advanced {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced-invert.png);
+}
+.oo-ui-icon-alert {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/alert.png);
+}
+.oo-ui-image-invert .oo-ui-icon-alert,
+.oo-ui-image-invert.oo-ui-icon-alert {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/alert-invert.png);
+}
+.oo-ui-icon-check {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/check.png);
+}
+.oo-ui-image-invert .oo-ui-icon-check,
+.oo-ui-image-invert.oo-ui-icon-check {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/check-invert.png);
+}
+.oo-ui-icon-clear {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/clear.png);
+}
+.oo-ui-image-invert .oo-ui-icon-clear,
+.oo-ui-image-invert.oo-ui-icon-clear {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/clear-invert.png);
+}
+.oo-ui-icon-close {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/close.png);
+}
+.oo-ui-image-invert .oo-ui-icon-close,
+.oo-ui-image-invert.oo-ui-icon-close {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/close-invert.png);
+}
+.oo-ui-icon-code {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/code.png);
+}
+.oo-ui-image-invert .oo-ui-icon-code,
+.oo-ui-image-invert.oo-ui-icon-code {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/code-invert.png);
+}
+.oo-ui-icon-collapse {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse.png);
+}
+.oo-ui-image-invert .oo-ui-icon-collapse,
+.oo-ui-image-invert.oo-ui-icon-collapse {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse-invert.png);
+}
+.oo-ui-icon-comment {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/comment.png);
+}
+.oo-ui-image-invert .oo-ui-icon-comment,
+.oo-ui-image-invert.oo-ui-icon-comment {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/comment-invert.png);
+}
+.oo-ui-icon-expand {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/expand.png);
+}
+.oo-ui-image-invert .oo-ui-icon-expand,
+.oo-ui-image-invert.oo-ui-icon-expand {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/expand-invert.png);
+}
+.oo-ui-icon-help {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/help.png);
+}
+.oo-ui-image-invert .oo-ui-icon-help,
+.oo-ui-image-invert.oo-ui-icon-help {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/help-invert.png);
+}
+.oo-ui-icon-info {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/info.png);
+}
+.oo-ui-image-invert .oo-ui-icon-info,
+.oo-ui-image-invert.oo-ui-icon-info {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/info-invert.png);
+}
+.oo-ui-icon-link {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/link.png);
+}
+.oo-ui-image-invert .oo-ui-icon-link,
+.oo-ui-image-invert.oo-ui-icon-link {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/link-invert.png);
+}
+.oo-ui-icon-menu {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/menu.png);
+}
+.oo-ui-image-invert .oo-ui-icon-menu,
+.oo-ui-image-invert.oo-ui-icon-menu {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/menu-invert.png);
+}
+.oo-ui-icon-next {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl.png);
+}
+.oo-ui-image-invert .oo-ui-icon-next,
+.oo-ui-image-invert.oo-ui-icon-next {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl-invert.png);
+}
+.oo-ui-icon-picture {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/picture.png);
+}
+.oo-ui-image-invert .oo-ui-icon-picture,
+.oo-ui-image-invert.oo-ui-icon-picture {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/picture-invert.png);
+}
+.oo-ui-icon-previous {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr.png);
+}
+.oo-ui-image-invert .oo-ui-icon-previous,
+.oo-ui-image-invert.oo-ui-icon-previous {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr-invert.png);
+}
+.oo-ui-icon-redo {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl.png);
+}
+.oo-ui-image-invert .oo-ui-icon-redo,
+.oo-ui-image-invert.oo-ui-icon-redo {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl-invert.png);
+}
+.oo-ui-icon-remove {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/remove.png);
+}
+.oo-ui-image-invert .oo-ui-icon-remove,
+.oo-ui-image-invert.oo-ui-icon-remove {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-invert.png);
+}
+.oo-ui-icon-search {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/search.png);
+}
+.oo-ui-image-invert .oo-ui-icon-search,
+.oo-ui-image-invert.oo-ui-icon-search {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/search-invert.png);
+}
+.oo-ui-icon-settings {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/settings.png);
+}
+.oo-ui-image-invert .oo-ui-icon-settings,
+.oo-ui-image-invert.oo-ui-icon-settings {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/settings-invert.png);
+}
+.oo-ui-icon-tag {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/tag.png);
+}
+.oo-ui-image-invert .oo-ui-icon-tag,
+.oo-ui-image-invert.oo-ui-icon-tag {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/tag-invert.png);
+}
+.oo-ui-icon-undo {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr.png);
+}
+.oo-ui-image-invert .oo-ui-icon-undo,
+.oo-ui-image-invert.oo-ui-icon-undo {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr-invert.png);
+}
+.oo-ui-icon-window {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/window.png);
+}
+.oo-ui-image-invert .oo-ui-icon-window,
+.oo-ui-image-invert.oo-ui-icon-window {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/window-invert.png);
+}
+.oo-ui-indicator-alert {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-alert,
+.oo-ui-image-invert.oo-ui-indicator-alert {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert-invert.png);
+}
+.oo-ui-indicator-up {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-up,
+.oo-ui-image-invert.oo-ui-indicator-up {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up-invert.png);
+}
+.oo-ui-indicator-down {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-down,
+.oo-ui-image-invert.oo-ui-indicator-down {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down-invert.png);
+}
+.oo-ui-indicator-next {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-next,
+.oo-ui-image-invert.oo-ui-indicator-next {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl-invert.png);
+}
+.oo-ui-indicator-previous {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-previous,
+.oo-ui-image-invert.oo-ui-indicator-previous {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr-invert.png);
+}
+.oo-ui-indicator-required {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/required.png);
+}
+.oo-ui-image-invert .oo-ui-indicator-required,
+.oo-ui-image-invert.oo-ui-indicator-required {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/required-invert.png);
+}
+.oo-ui-texture-pending {
+  background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency.png);
+}
+.oo-ui-image-invert .oo-ui-texture-transparency,
+.oo-ui-image-invert.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency-invert.png);
+}
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css b/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css
new file mode 100644 (file)
index 0000000..2888159
--- /dev/null
@@ -0,0 +1,2036 @@
+/*!
+ * OOjs UI v0.1.0-pre (837b2f733e)
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-10-11T01:05:40Z
+ */
+/* @noflip */
+.oo-ui-rtl {
+       direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+       direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       cursor: pointer;
+       display: inline-block;
+       vertical-align: middle;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+       display: inline-block;
+       position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       display: inline-block;
+       vertical-align: top;
+       text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       font-weight: bold;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-right: -0.75em;
+       margin-left: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-left: 0;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       width: 2.2em;
+       height: 2.2em;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #dddddd;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
+       outline: none;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       margin-left: 0.25em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #757575;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #444444;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+       color: #598ad1;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #015ccc;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+       color: #00c697;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #008c6d;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+       color: #e81915;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #a7170f;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       margin: 0.1em 0;
+       padding: 0.3em 1.2em;
+       border-radius: 0.3em;
+       -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+          -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+           -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+            -o-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+               transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
+       outline: none;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       line-height: 2.2em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: -0.5em;
+       margin-right: -0.5em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: -0.5em;
+       margin-right: 0.3em;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       color: #dddddd;
+       background: #ffffff;
+       border: solid 1px #cdcdcd;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
+       color: #757575;
+       background-color: #ffffff;
+       border: solid 1px #cdcdcd;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+       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);
+       border-color: #aaaaaa;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       background-color: #d0d0d0;
+       border-color: #d0d0d0;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
+       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+       color: #ffffff;
+       background-color: #0274ff;
+       border-color: #0274ff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 -0.2em 0 0 #015ccc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       background-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+       color: #ffffff;
+       background-color: #00af89;
+       border-color: #00af89;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       background-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+       text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+       color: #ffffff;
+       background-color: #d11d13;
+       border-color: #d11d13;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       background-color: #a7170f;
+}
+.oo-ui-clippableElement-clippable {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+       overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+       padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 3em;
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       padding: 1.5em;
+}
+.oo-ui-bookletLayout-outlinePanel {
+       border-right: solid 1px #dddddd;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+       box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-fieldLayout {
+       margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+       content: " ";
+       display: table;
+}
+.oo-ui-fieldLayout:after {
+       clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       display: block;
+       float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       display: block;
+       float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       text-align: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       z-index: 1;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+       float: right;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+       padding: 0.5em 0.75em;
+}
+.oo-ui-fieldLayout:last-child {
+       margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       padding-top: 0.5em;
+       margin-right: 5%;
+       width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+       color: #cccccc;
+}
+.oo-ui-fieldsetLayout {
+       position: relative;
+       margin: 0;
+       padding: 0;
+       border: none;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       display: block;
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+       margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+       font-size: 1.5em;
+       margin-bottom: 0.5em;
+       padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+       padding-left: 1.75em;
+       line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       left: 0;
+       top: 0.25em;
+       width: 2em;
+       height: 2em;
+}
+.oo-ui-gridLayout {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-panelLayout {
+       position: relative;
+}
+.oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-panelLayout-padded {
+       padding: 1.25em;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+       display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+       display: block;
+       position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+       z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+       margin-left: 1.25em;
+       font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+       display: inline-block;
+       vertical-align: middle;
+       margin: 0.3em;
+}
+.oo-ui-toolGroup-empty {
+       display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #000000;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+       display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+       display: inline-block;
+       position: relative;
+       vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+       cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       height: 1.5em;
+       padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 1.5em;
+       width: 1.5em;
+       opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
+       background-color: #eeeeee;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .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-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-popupToolGroup {
+       position: relative;
+       height: 2em;
+       min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+       display: block;
+       cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+       cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       display: none;
+       position: absolute;
+       z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+       display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+       left: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+       right: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+       min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2em;
+       height: 2em;
+       opacity: 0.8;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 0.6em;
+       font-weight: bold;
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-right: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       top: 2em;
+       background-color: white;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 2em;
+       width: 2em;
+       margin-right: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       line-height: 2em;
+       font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+       display: inline-block;
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+       padding: 0 0.25em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       padding-right: 0.5em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+       background-color: #eeeeee;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #cccccc;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+       color: #cccccc;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+       padding: 0.25em 0 0.25em 0;
+       border: 1px solid #aaaaaa;
+       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);
+}
+.oo-ui-menuToolGroup {
+       border: solid 1px #cccccc;
+       border-radius: 0.1em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+       display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+       min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+       margin-left: -1px;
+       padding: 0.25em 0 0.25em 0;
+       border: 1px solid #aaaaaa;
+       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);
+}
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+       border-color: #aaaaaa;
+}
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+       border-color: #aaaaaa;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       padding: 0 1em 0 0.25em;
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-image: none;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+       background-color: #e1f3ff;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #cccccc;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+       color: #cccccc;
+       border-color: #cccccc;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-toolbar {
+       clear: both;
+}
+.oo-ui-toolbar-bar {
+       line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+       float: right;
+}
+.oo-ui-toolbar-tools {
+       display: inline;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+       -webkit-touch-callout: default;
+       -webkit-user-select: all;
+          -moz-user-select: all;
+           -ms-user-select: all;
+               user-select: all;
+}
+.oo-ui-toolbar-shadow {
+       background-position: left top;
+       background-repeat: repeat-x;
+       position: absolute;
+       width: 100%;
+       pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+       border-bottom: solid 1px #cccccc;
+       background: #ffffff;
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+       border: none;
+       background: none;
+}
+.oo-ui-toolbar-shadow {
+       display: none;
+}
+.oo-ui-selectWidget {
+       border-radius: 0.3em;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-left: -1px;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+.oo-ui-optionWidget {
+       position: relative;
+       display: block;
+       cursor: pointer;
+       padding: 0.5em 2em 0.5em 3em;
+       border: none;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       display: block;
+       white-space: nowrap;
+       text-overflow: ellipsis;
+       overflow: hidden;
+}
+.oo-ui-optionWidget-highlighted {
+       background-color: #eeeeee;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       line-height: 1.5em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected,
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+       background-color: #a7dcff;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       color: #cccccc;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       top: 50%;
+       width: 2em;
+       height: 2em;
+       margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+       left: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       right: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 0.3em;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-left: -1px;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+.oo-ui-buttonOptionWidget {
+       display: inline-block;
+       padding: 0;
+       background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       position: static;
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       height: 2.2em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       height: 2.2em;
+       margin-top: 0;
+}
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+       background-color: transparent;
+}
+.oo-ui-labelWidget {
+       display: inline-block;
+}
+.oo-ui-iconWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 2.2em;
+       width: 2.2em;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 2.2em;
+       width: 2.2em;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-bottom: -1px;
+       margin-left: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+       position: relative;
+       display: inline-block;
+       vertical-align: middle;
+       overflow: hidden;
+       cursor: pointer;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       -webkit-transform: translateZ(0px);
+          -moz-transform: translateZ(0px);
+           -ms-transform: translateZ(0px);
+            -o-transform: translateZ(0px);
+               transform: translateZ(0px);
+       height: 2em;
+       width: 4em;
+       border-radius: 1em;
+       border: 1px #dddddd solid;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       position: absolute;
+       display: block;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       right: 0;
+       left: 0;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: none;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       top: 0.25em;
+       left: 0.25em;
+       width: 1.5em;
+       height: 1.5em;
+       margin-top: -1px;
+       border-radius: 1em;
+       border: 1px #dddddd solid;
+       background-color: #f7f7f7;
+       -webkit-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+          -moz-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+           -ms-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+            -o-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+               transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+}
+.oo-ui-toggleSwitchWidget-glow {
+       border-radius: 1em;
+       background-color: #f7f7f7;
+       -webkit-transition: background-color 0.1s ease-in-out;
+          -moz-transition: background-color 0.1s ease-in-out;
+           -ms-transition: background-color 0.1s ease-in-out;
+            -o-transition: background-color 0.1s ease-in-out;
+               transition: background-color 0.1s ease-in-out;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+       left: 2.25em;
+       margin-left: -2px;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: block;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+       left: 0.25em;
+       margin-left: 0;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
+       border: 1px #cccccc solid;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
+       border-color: #aaaaaa;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip {
+       background-color: #ffffff;
+       border-color: #aaaaaa;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+       background-color: #d0d0d0;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       background-color: #ffffff;
+}
+.oo-ui-actionWidget.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-popupWidget {
+       position: absolute;
+}
+.oo-ui-popupWidget-popup {
+       position: relative;
+       overflow: hidden;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+       display: none;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+       display: block;
+       position: absolute;
+       top: 0;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       float: left;
+       cursor: default;
+}
+.oo-ui-popupWidget-body {
+       clear: both;
+       overflow: hidden;
+}
+.oo-ui-popupWidget-popup {
+       border: solid 1px #aaaaaa;
+       border-radius: 0.2em;
+       background-color: #ffffff;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+       margin-top: 7px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+       content: "";
+       position: absolute;
+       width: 0;
+       height: 0;
+       border-style: solid;
+       border-color: transparent;
+       border-top: 0;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+       bottom: -8px;
+       left: -13px;
+       border-bottom-color: #888888;
+       border-width: 13px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+       bottom: -8px;
+       left: -12px;
+       border-bottom-color: #ffffff;
+       border-width: 12px;
+}
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+       -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+          -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+           -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+            -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+               transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+}
+.oo-ui-popupWidget-head {
+       height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body {
+       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupWidget-body-padded {
+       padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+       position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+       position: absolute;
+       cursor: auto;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
+       left: 1em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       left: -1em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
+       left: 1.75em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       left: -1.75em;
+}
+.oo-ui-textInputWidget {
+       position: relative;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       width: 20em;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       display: inline-block;
+       width: 100%;
+       resize: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       top: 0;
+       height: 100%;
+       background-repeat: no-repeat;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+       left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       padding: 0.5em 0.5em 0.5em 0.9em;
+       margin: 0;
+       font-size: 1em;
+       font-family: sans-serif;
+       background-color: #ffffff;
+       border: solid 1px #cccccc;
+       box-shadow: inset 0 0 0 0 #0274ff;
+       border-radius: 0.1em;
+       -webkit-transition: box-shadow 0.1s;
+          -moz-transition: box-shadow 0.1s;
+           -ms-transition: box-shadow 0.1s;
+            -o-transition: box-shadow 0.1s;
+               transition: box-shadow 0.1s;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+       padding-left: 2em;
+}
+.oo-ui-textInputWidget-icon {
+       width: 2em;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+       outline: none;
+       border-color: #aaaaaa;
+       box-shadow: inset 0.4em 0 0 0 #0274ff;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-textInputWidget input[readonly],
+.oo-ui-textInputWidget textarea[readonly] {
+       color: #777777;
+       text-shadow: 0 1px 1px #ffffff;
+}
+.oo-ui-textInputWidget input[readonly]:focus,
+.oo-ui-textInputWidget textarea[readonly]:focus {
+       box-shadow: inset 0.4em 0 0 0 #cccccc;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement input,
+.oo-ui-textInputWidget.oo-ui-iconElement textarea {
+       padding-left: 2.4em;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       left: 0.4em;
+       width: 2em;
+       height: 100%;
+       background-position: right center;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement input,
+.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
+       padding-right: 2.2em;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       width: 1.6em;
+       height: 100%;
+       background-position: left center;
+}
+.oo-ui-menuWidget {
+       position: absolute;
+       background: #ffffff;
+       margin-top: -1px;
+       border: solid 1px #aaaaaa;
+       border-radius: 0 0 0.1em 0.1em;
+       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);
+}
+.oo-ui-menuWidget input {
+       position: absolute;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+       opacity: 0;
+}
+.oo-ui-menuItemWidget {
+       position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted {
+       background-color: #eeeeee;
+}
+.oo-ui-menuSectionItemWidget {
+       cursor: default;
+       padding: 0.33em 0.75em;
+       color: #888888;
+}
+.oo-ui-inlineMenuWidget {
+       position: relative;
+       display: inline-block;
+       margin: 0.25em 0;
+       min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+       width: 100%;
+       display: inline-block;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+       z-index: 1;
+       width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+       cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+       height: 2.5em;
+       border: solid 1px #cccccc;
+       border-radius: 0.1em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       line-height: 2.5em;
+       margin: 0 1em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2.5em;
+       height: 2.5em;
+}
+.oo-ui-inlineMenuWidget:hover .oo-ui-inlineMenuWidget-handle {
+       border-color: #aaaaaa;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-right: 2em;
+}
+.oo-ui-inlineMenuWidget .oo-ui-selectWidget {
+       border-top-color: #ffffff;
+}
+.oo-ui-outlineItemWidget {
+       position: relative;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       float: left;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       float: left;
+       background-position: right center;
+       background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-movers {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-comboBoxWidget {
+       display: inline-block;
+       position: relative;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+       width: 100%;
+       z-index: 1;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget input,
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget textarea {
+       height: 2.35em;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement {
+       padding-right: 2.2em;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       width: 2.2em;
+       background-position: center center;
+       border: solid 1px #cccccc;
+       border-left: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-searchWidget-query {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       width: 100%;
+}
+.oo-ui-searchWidget-results {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-window {
+       line-height: 1em;
+}
+.oo-ui-window-frame {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+       margin: 0;
+       padding: 0;
+}
+.oo-ui-window-content:focus {
+       outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-window-body {
+       margin: 0;
+       padding: 0;
+       background: none;
+}
+.oo-ui-window-overlay {
+       position: absolute;
+       top: 0;
+       left: 0;
+}
+.oo-ui-window-isolated,
+.oo-ui-window-overlay {
+       background: transparent;
+       font-family: sans-serif;
+       font-size: 0.8em;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       position: absolute;
+       left: 0;
+       right: 0;
+       overflow: hidden;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+       z-index: 1;
+       top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       z-index: 2;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       z-index: 1;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+       z-index: 3;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       box-shadow: 0 0 1px 0 #aaaaaa;
+}
+.oo-ui-messageDialog-actions-horizontal {
+       display: table;
+       table-layout: fixed;
+       width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       display: table-cell;
+       width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+       display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       display: block;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+       position: relative;
+       text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+       display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       position: relative;
+       top: auto;
+       bottom: auto;
+       display: inline;
+       white-space: nowrap;
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+       display: block;
+       text-align: center;
+       padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+       font-size: 1.5em;
+       line-height: 1em;
+       color: #000000;
+}
+.oo-ui-messageDialog-message {
+       font-size: 0.9em;
+       line-height: 1.25em;
+       color: #666666;
+}
+.oo-ui-messageDialog-message-verbose {
+       font-size: 1.1em;
+       line-height: 1.5em;
+       text-align: left;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       border-right: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+       border-right-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+       border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       text-align: center;
+       line-height: 3.4em;
+       padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+       background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+       font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+       background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+       background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+       background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+       overflow: hidden;
+       text-overflow: ellipsis;
+       white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+       display: inline;
+       padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+       white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+       left: 0;
+}
+.oo-ui-processDialog-actions-primary {
+       right: 0;
+}
+.oo-ui-processDialog-errors {
+       display: none;
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+       z-index: 2;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+       height: 3.4em;
+}
+.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+       top: 3.4em;
+       box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
+}
+.oo-ui-processDialog-navigation {
+       position: relative;
+       height: 3.4em;
+       padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+       padding: 0.75em 0;
+       height: 1.9em;
+       cursor: default;
+       text-align: center;
+}
+.oo-ui-processDialog-title {
+       font-weight: bold;
+       line-height: 1.9em;
+}
+.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 {
+       padding-top: 0.75em;
+       padding-bottom: 0.75em;
+       min-width: 1.9em;
+       min-height: 1.9em;
+}
+.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.9em;
+       padding: 0 1em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+       position: absolute;
+       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 0 0.75em 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;
+       vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget: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 {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .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 {
+       /* Adjust for border so text aligns with title */
+       margin: -1px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .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 {
+       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 {
+       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 {
+       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 {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       left: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-left: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       right: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-right: 2.25em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+       min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+       background-color: rgba(255, 255, 255, 0.9);
+       padding: 3em 3em 1.5em 3em;
+       text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+       margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+       font-size: 1.5em;
+       color: #000000;
+       margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+       text-align: left;
+       margin: 1em;
+       padding: 1em;
+       border: solid 1px #ff9e9e;
+       background-color: #fff7f7;
+       border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       position: fixed;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+       width: auto;
+       height: auto;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
+       padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+       position: absolute;
+       right: 0;
+       left: 0;
+       margin: auto;
+       overflow: hidden;
+       max-width: 100%;
+       max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+       width: 100%;
+       height: 100%;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       background-color: rgba(255, 255, 255, 0.5);
+       opacity: 0;
+       -webkit-transition: opacity 250ms ease-in-out;
+          -moz-transition: opacity 250ms ease-in-out;
+           -ms-transition: opacity 250ms ease-in-out;
+            -o-transition: opacity 250ms ease-in-out;
+               transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       top: 1em;
+       bottom: 1em;
+       background-color: #ffffff;
+       -webkit-transform: scale(0.5);
+          -moz-transform: scale(0.5);
+           -ms-transform: scale(0.5);
+            -o-transform: scale(0.5);
+               transform: scale(0.5);
+       -webkit-transition: all 250ms ease-in-out;
+          -moz-transition: all 250ms ease-in-out;
+           -ms-transition: all 250ms ease-in-out;
+            -o-transition: all 250ms ease-in-out;
+               transition: all 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+       opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       -webkit-transform: scale(1);
+          -moz-transform: scale(1);
+           -ms-transform: scale(1);
+            -o-transform: scale(1);
+               transform: scale(1);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+       border: solid 1px #aaaaaa;
+       border-radius: 0.2em;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-icon-add {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/add.svg);
+}
+.oo-ui-image-constructive .oo-ui-icon-add,
+.oo-ui-image-constructive.oo-ui-icon-add {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/add-constructive.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-add,
+.oo-ui-image-invert.oo-ui-icon-add {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/add-invert.svg);
+}
+.oo-ui-icon-advanced {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-advanced,
+.oo-ui-image-invert.oo-ui-icon-advanced {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced-invert.svg);
+}
+.oo-ui-icon-alert {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/alert.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-alert,
+.oo-ui-image-invert.oo-ui-icon-alert {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/alert-invert.svg);
+}
+.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
+}
+.oo-ui-image-primary .oo-ui-icon-check,
+.oo-ui-image-primary.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-primary.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-check,
+.oo-ui-image-invert.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-invert.svg);
+}
+.oo-ui-icon-clear {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/clear.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-clear,
+.oo-ui-image-invert.oo-ui-icon-clear {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/clear-invert.svg);
+}
+.oo-ui-icon-close {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/close.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-close,
+.oo-ui-image-invert.oo-ui-icon-close {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/close-invert.svg);
+}
+.oo-ui-icon-code {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/code.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-code,
+.oo-ui-image-invert.oo-ui-icon-code {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/code-invert.svg);
+}
+.oo-ui-icon-collapse {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-collapse,
+.oo-ui-image-invert.oo-ui-icon-collapse {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse-invert.svg);
+}
+.oo-ui-icon-comment {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/comment.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-comment,
+.oo-ui-image-invert.oo-ui-icon-comment {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/comment-invert.svg);
+}
+.oo-ui-icon-expand {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/expand.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-expand,
+.oo-ui-image-invert.oo-ui-icon-expand {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/expand-invert.svg);
+}
+.oo-ui-icon-help {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/help.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-help,
+.oo-ui-image-invert.oo-ui-icon-help {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/help-invert.svg);
+}
+.oo-ui-icon-info {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/info.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-info,
+.oo-ui-image-invert.oo-ui-icon-info {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/info-invert.svg);
+}
+.oo-ui-icon-link {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/link.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-link,
+.oo-ui-image-invert.oo-ui-icon-link {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/link-invert.svg);
+}
+.oo-ui-icon-menu {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/menu.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-menu,
+.oo-ui-image-invert.oo-ui-icon-menu {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/menu-invert.svg);
+}
+.oo-ui-icon-next {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-next,
+.oo-ui-image-invert.oo-ui-icon-next {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr-invert.svg);
+}
+.oo-ui-icon-picture {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/picture.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-picture,
+.oo-ui-image-invert.oo-ui-icon-picture {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/picture-invert.svg);
+}
+.oo-ui-icon-previous {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-previous,
+.oo-ui-image-invert.oo-ui-icon-previous {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl-invert.svg);
+}
+.oo-ui-icon-redo {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-redo,
+.oo-ui-image-invert.oo-ui-icon-redo {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg);
+}
+.oo-ui-icon-remove {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove.svg);
+}
+.oo-ui-image-destructive .oo-ui-icon-remove,
+.oo-ui-image-destructive.oo-ui-icon-remove {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-destructive.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-remove,
+.oo-ui-image-invert.oo-ui-icon-remove {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-invert.svg);
+}
+.oo-ui-icon-search {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/search.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-search,
+.oo-ui-image-invert.oo-ui-icon-search {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/search-invert.svg);
+}
+.oo-ui-icon-settings {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/settings.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-settings,
+.oo-ui-image-invert.oo-ui-icon-settings {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/settings-invert.svg);
+}
+.oo-ui-icon-tag {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/tag.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-tag,
+.oo-ui-image-invert.oo-ui-icon-tag {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/tag-invert.svg);
+}
+.oo-ui-icon-undo {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-undo,
+.oo-ui-image-invert.oo-ui-icon-undo {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg);
+}
+.oo-ui-icon-window {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/window.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-window,
+.oo-ui-image-invert.oo-ui-icon-window {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/window-invert.svg);
+}
+.oo-ui-indicator-alert {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-alert,
+.oo-ui-image-invert.oo-ui-indicator-alert {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert-invert.svg);
+}
+.oo-ui-indicator-up {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-up,
+.oo-ui-image-invert.oo-ui-indicator-up {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up-invert.svg);
+}
+.oo-ui-indicator-down {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-down,
+.oo-ui-image-invert.oo-ui-indicator-down {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down-invert.svg);
+}
+.oo-ui-indicator-next {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-next,
+.oo-ui-image-invert.oo-ui-indicator-next {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr-invert.svg);
+}
+.oo-ui-indicator-previous {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-previous,
+.oo-ui-image-invert.oo-ui-indicator-previous {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl-invert.svg);
+}
+.oo-ui-indicator-required {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/required.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-required,
+.oo-ui-image-invert.oo-ui-indicator-required {
+       background-image: /* @embed */ url(themes/mediawiki/images/indicators/required-invert.svg);
+}
+.oo-ui-texture-pending {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-texture-transparency {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency.svg);
+}
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.rtl.css b/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.rtl.css
new file mode 100644 (file)
index 0000000..17d89ec
--- /dev/null
@@ -0,0 +1,1997 @@
+/*!
+ * OOjs UI v0.1.0
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-09-24T23:21:42Z
+ */
+/* @noflip */
+.oo-ui-rtl {
+  direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+  direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  cursor: pointer;
+  display: inline-block;
+  vertical-align: middle;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+  display: inline-block;
+  position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  display: inline-block;
+  vertical-align: top;
+  text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  font-weight: bold;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  margin-left: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  width: 2.2em;
+  height: 2.2em;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  opacity: 0.2;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #ddd;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  margin-right: 0.25em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #757575;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #444444;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+  color: #598ad1;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #015ccc;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+  color: #00c697;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #008c6d;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+  color: #e81915;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #a7170f;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  margin: 0.1em 0;
+  padding: 0.3em 1.2em;
+  border-radius: 0.3em;
+  -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+  -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+  -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+  -o-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+  transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  line-height: 2.2em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: -0.5em;
+  margin-left: -0.5em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: -0.5em;
+  margin-left: 0.3em;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  color: #ddd;
+  background: #fff;
+  border: solid 1px #cdcdcd;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
+  color: #757575;
+  background-color: #fff;
+  border: solid 1px #cdcdcd;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+  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);
+  border-color: #aaa;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  background-color: #d0d0d0;
+  border-color: #d0d0d0;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
+  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+  color: #fff;
+  background-color: #0274ff;
+  border-color: #0274ff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+  box-shadow: inset 0 -0.2em 0 0 #015ccc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+  border-bottom-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  background-color: #015ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+  color: #fff;
+  background-color: #00af89;
+  border-color: #00af89;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+  box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+  border-bottom-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  background-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
+  color: #fff;
+  background-color: #d11d13;
+  border-color: #d11d13;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+  box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+  border-bottom-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  background-color: #a7170f;
+}
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 3em;
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 1.5em;
+}
+.oo-ui-bookletLayout-outlinePanel {
+  border-left: solid 1px #ddd;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  content: " ";
+  display: table;
+}
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  text-align: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+  z-index: 1;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+  float: left;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+  padding: 0.5em 0.75em;
+}
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  padding-top: 0.5em;
+  margin-left: 5%;
+  width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+  color: #ccc;
+}
+.oo-ui-fieldsetLayout {
+  position: relative;
+  margin: 0;
+  padding: 0;
+  border: none;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  display: block;
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+  font-size: 1.5em;
+  margin-bottom: 0.5em;
+  padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+  padding-right: 1.75em;
+  line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  right: 0;
+  top: 0.25em;
+  width: 2em;
+  height: 2em;
+}
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout {
+  position: relative;
+}
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout-padded {
+  padding: 1.25em;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  display: block;
+  position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+  z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-right: 1.25em;
+  font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+  display: inline-block;
+  vertical-align: middle;
+  margin: 0.3em;
+}
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #000;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+  display: inline-block;
+  position: relative;
+  vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  height: 1.5em;
+  padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 1.5em;
+  width: 1.5em;
+  opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
+  background-color: #eee;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .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-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  display: none;
+  position: absolute;
+  z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+  right: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+  left: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+  min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2em;
+  height: 2em;
+  opacity: 0.8;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 0.6em;
+  font-weight: bold;
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-left: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 2em;
+  background-color: white;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 2em;
+  width: 2em;
+  margin-left: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  line-height: 2em;
+  font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  padding: 0 0.25em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  padding-left: 0.5em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+  background-color: #eee;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+  border: 1px solid #aaa;
+  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);
+}
+.oo-ui-menuToolGroup {
+  border: solid 1px #ccc;
+  border-radius: 0.1em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  margin-right: -1px;
+  padding: 0.25em 0 0.25em 0;
+  border: 1px solid #aaa;
+  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);
+}
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+  border-color: #aaa;
+}
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+  border-color: #aaa;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  padding: 0 0.25em 0 1em;
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: none;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  background-color: #e1f3ff;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+  border-color: #ccc;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-toolbar {
+  clear: both;
+}
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+  float: left;
+}
+.oo-ui-toolbar-tools {
+  display: inline;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-touch-callout: default;
+  -webkit-user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
+}
+.oo-ui-toolbar-shadow {
+  background-position: right top;
+  background-repeat: repeat-x;
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+  border-bottom: solid 1px #ccc;
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+  border: none;
+  background: none;
+}
+.oo-ui-toolbar-shadow {
+  display: none;
+}
+.oo-ui-selectWidget {
+  border-radius: 0.3em;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-right: -1px;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  cursor: pointer;
+  padding: 0.5em 3em 0.5em 2em;
+  border: none;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.oo-ui-optionWidget-highlighted {
+  background-color: #eee;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  line-height: 1.5em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
+  background-color: #a7dcff;
+}
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+  background-color: #a7dcff;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  color: #ccc;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  left: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+  border-radius: 0.3em;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-right: -1px;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  padding: 0;
+  background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  position: static;
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  height: 2.2em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  height: 2.2em;
+  margin-top: 0;
+}
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+  background-color: transparent;
+}
+.oo-ui-labelWidget {
+  display: inline-block;
+}
+.oo-ui-iconWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 2.2em;
+  width: 2.2em;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 2.2em;
+  width: 2.2em;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+  display: inline-block;
+  white-space: nowrap;
+  border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-bottom: -1px;
+  margin-right: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  overflow: hidden;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transform: translateZ(0px);
+  -moz-transform: translateZ(0px);
+  -ms-transform: translateZ(0px);
+  -o-transform: translateZ(0px);
+  transform: translateZ(0px);
+  height: 2em;
+  width: 4em;
+  border-radius: 1em;
+  border: 1px #ddd solid;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  top: 0.25em;
+  right: 0.25em;
+  width: 1.5em;
+  height: 1.5em;
+  margin-top: -1px;
+  border-radius: 1em;
+  border: 1px #ddd solid;
+  background-color: #f7f7f7;
+  -webkit-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
+  -moz-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
+  -ms-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
+  -o-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
+  transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
+}
+.oo-ui-toggleSwitchWidget-glow {
+  border-radius: 1em;
+  background-color: #f7f7f7;
+  -webkit-transition: background-color 0.1s ease-in-out;
+  -moz-transition: background-color 0.1s ease-in-out;
+  -ms-transition: background-color 0.1s ease-in-out;
+  -o-transition: background-color 0.1s ease-in-out;
+  transition: background-color 0.1s ease-in-out;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  right: 2.25em;
+  margin-right: -2px;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: block;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  right: 0.25em;
+  margin-right: 0;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
+  border: 1px #ccc solid;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
+  border-color: #aaa;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip {
+  background-color: #fff;
+  border-color: #aaa;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+  background-color: #d0d0d0;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  background-color: #fff;
+}
+.oo-ui-actionWidget.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  overflow: hidden;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+  display: none;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  display: block;
+  position: absolute;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  float: right;
+  cursor: default;
+}
+.oo-ui-popupWidget-body {
+  clear: both;
+  overflow: hidden;
+}
+.oo-ui-popupWidget-popup {
+  border: solid 1px #aaa;
+  border-radius: 0.2em;
+  background-color: #fff;
+  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+  margin-top: 7px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+  content: "";
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-style: solid;
+  border-color: transparent;
+  border-top: 0;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+  bottom: -8px;
+  right: 11px;
+  border-bottom-color: #888;
+  border-width: 13px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+  bottom: -8px;
+  right: 12px;
+  border-bottom-color: #fff;
+  border-width: 12px;
+}
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+  transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
+}
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupWidget-body-padded {
+  padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  right: 1em;
+  cursor: auto;
+}
+.oo-ui-popupButtonWidget > .oo-ui-popupWidget {
+  margin-right: -1em;
+}
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 20em;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  resize: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+  background-repeat: no-repeat;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+  right: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: 0.5em 0.9em 0.5em 0.5em;
+  margin: 0;
+  font-size: 1em;
+  font-family: sans-serif;
+  background-color: #fff;
+  border: solid 1px #ccc;
+  box-shadow: inset 0 0 0 0 #0274FF;
+  border-radius: 0.1em;
+  -webkit-transition: box-shadow 0.1s;
+  -moz-transition: box-shadow 0.1s;
+  -ms-transition: box-shadow 0.1s;
+  -o-transition: box-shadow 0.1s;
+  transition: box-shadow 0.1s;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+  padding-right: 2em;
+}
+.oo-ui-textInputWidget-icon {
+  width: 2em;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+  outline: none;
+  border-color: #aaa;
+  box-shadow: inset 0.4em 0 0 0 #0274ff;
+}
+.oo-ui-textInputWidget input[readonly],
+.oo-ui-textInputWidget textarea[readonly] {
+  color: #777;
+  text-shadow: 0 1px 1px #fff;
+}
+.oo-ui-textInputWidget input[readonly]:focus,
+.oo-ui-textInputWidget textarea[readonly]:focus {
+  box-shadow: inset 0.4em 0 0 0 #ccc;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+  background-color: transparent;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #ddd;
+  background-color: #f3f3f3;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement input,
+.oo-ui-textInputWidget.oo-ui-iconElement textarea {
+  padding-right: 2.4em;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  right: 0.4em;
+  width: 2em;
+  height: 100%;
+  background-position: left center;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement input,
+.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
+  padding-left: 2.2em;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  width: 1.6em;
+  height: 100%;
+  background-position: right center;
+}
+.oo-ui-menuWidget {
+  position: absolute;
+  background: #fff;
+  margin-top: -1px;
+  border: solid 1px #aaa;
+  border-radius: 0 0 0.1em 0.1em;
+  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);
+}
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+}
+.oo-ui-menuItemWidget {
+  position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+  background-color: #eee;
+}
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+  padding: 0.33em 0.75em;
+  color: #888;
+}
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  margin: 0.25em 0;
+  min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+  width: 100%;
+  display: inline-block;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+  height: 2.5em;
+  border: solid 1px #ccc;
+  border-radius: 0.1em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  line-height: 2.5em;
+  margin: 0 1em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+}
+.oo-ui-inlineMenuWidget:hover .oo-ui-inlineMenuWidget-handle {
+  border-color: #aaa;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #ddd;
+  background-color: #f3f3f3;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+  opacity: 0.2;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-left: 2em;
+}
+.oo-ui-inlineMenuWidget .oo-ui-selectWidget {
+  border-top-color: #fff;
+}
+.oo-ui-outlineItemWidget {
+  position: relative;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  float: right;
+  background-position: left center;
+  background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-comboBoxWidget {
+  display: inline-block;
+  position: relative;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+  width: 100%;
+  z-index: 1;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget input,
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget textarea {
+  height: 2.35em;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement {
+  padding-left: 2.2em;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  width: 2.2em;
+  background-position: center center;
+  border: solid 1px #ccc;
+  border-right: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
+}
+.oo-ui-searchWidget-results {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-window {
+  line-height: 1em;
+}
+.oo-ui-window-frame {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-window-content:focus {
+  outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-window-body {
+  margin: 0;
+  padding: 0;
+  background: none;
+}
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+.oo-ui-window-isolated {
+  background: transparent;
+  font-family: sans-serif;
+  font-size: 0.8em;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  position: absolute;
+  right: 0;
+  left: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+  z-index: 1;
+  top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-head.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+  z-index: 2;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  z-index: 1;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+  z-index: 3;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+  box-shadow: 0 0 1px 0 #aaa;
+}
+.oo-ui-messageDialog-actions-horizontal {
+  display: table;
+  table-layout: fixed;
+  width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  display: table-cell;
+  width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+  display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+  position: relative;
+  text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  position: relative;
+  top: auto;
+  bottom: auto;
+  display: inline;
+  white-space: nowrap;
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+  display: block;
+  text-align: center;
+  padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+  font-size: 1.5em;
+  line-height: 1em;
+  color: #000;
+}
+.oo-ui-messageDialog-message {
+  font-size: 0.9em;
+  line-height: 1.25em;
+  color: #666;
+}
+.oo-ui-messageDialog-message-verbose {
+  font-size: 1.1em;
+  line-height: 1.5em;
+  text-align: right;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  border-left: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+  border-left-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+  border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  text-align: center;
+  line-height: 3.4em;
+  padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+  display: inline;
+  padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+  white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+  right: 0;
+}
+.oo-ui-processDialog-actions-primary {
+  left: 0;
+}
+.oo-ui-processDialog-errors {
+  display: none;
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  z-index: 2;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+  height: 3.4em;
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+  top: 3.4em;
+  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
+}
+.oo-ui-processDialog-navigation {
+  position: relative;
+  height: 3.4em;
+  padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+  padding: 0.75em 0;
+  height: 1.9em;
+  cursor: default;
+  text-align: center;
+}
+.oo-ui-processDialog-title {
+  font-weight: bold;
+  line-height: 1.9em;
+}
+.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 {
+  padding-top: 0.75em;
+  padding-bottom: 0.75em;
+  min-width: 1.9em;
+  min-height: 1.9em;
+}
+.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.9em;
+  padding: 0 1em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+  position: absolute;
+  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 0.75em 0.75em 0;
+}
+.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;
+  vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget: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 {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .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 {
+  /* Adjust for border so text aligns with title */
+  margin: -1px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .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 {
+  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 {
+  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 {
+  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 {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-right: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-left: 2.25em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+  min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+  background-color: rgba(255, 255, 255, 0.9);
+  padding: 3em 3em 1.5em 3em;
+  text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+  margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+  font-size: 1.5em;
+  color: #000;
+  margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+  text-align: right;
+  margin: 1em;
+  padding: 1em;
+  border: solid 1px #ff9e9e;
+  background-color: #fff7f7;
+  border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  position: fixed;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+  width: auto;
+  height: auto;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+  position: absolute;
+  left: 0;
+  right: 0;
+  margin: auto;
+  overflow: hidden;
+  max-width: 100%;
+  max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+  width: 100%;
+  height: 100%;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: opacity 250ms ease-in-out;
+  -moz-transition: opacity 250ms ease-in-out;
+  -ms-transition: opacity 250ms ease-in-out;
+  -o-transition: opacity 250ms ease-in-out;
+  transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 1em;
+  bottom: 1em;
+  background-color: #fff;
+  -webkit-transform: scale(0.5);
+  -moz-transform: scale(0.5);
+  -ms-transform: scale(0.5);
+  -o-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transition: all 250ms ease-in-out;
+  -moz-transition: all 250ms ease-in-out;
+  -ms-transition: all 250ms ease-in-out;
+  -o-transition: all 250ms ease-in-out;
+  transition: all 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+  opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: scale(1);
+  -moz-transform: scale(1);
+  -ms-transform: scale(1);
+  -o-transform: scale(1);
+  transform: scale(1);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+  border: solid 1px #aaa;
+  border-radius: 0.2em;
+  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+}
+
+.oo-ui-icon-add {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/add.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-add,
+.oo-ui-image-invert.oo-ui-icon-add {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/add-invert.svg);
+}
+.oo-ui-icon-advanced {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-advanced,
+.oo-ui-image-invert.oo-ui-icon-advanced {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced-invert.svg);
+}
+.oo-ui-icon-alert {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/alert.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-alert,
+.oo-ui-image-invert.oo-ui-icon-alert {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/alert-invert.svg);
+}
+.oo-ui-icon-check {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-check,
+.oo-ui-image-invert.oo-ui-icon-check {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/check-invert.svg);
+}
+.oo-ui-icon-clear {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/clear.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-clear,
+.oo-ui-image-invert.oo-ui-icon-clear {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/clear-invert.svg);
+}
+.oo-ui-icon-close {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/close.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-close,
+.oo-ui-image-invert.oo-ui-icon-close {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/close-invert.svg);
+}
+.oo-ui-icon-code {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/code.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-code,
+.oo-ui-image-invert.oo-ui-icon-code {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/code-invert.svg);
+}
+.oo-ui-icon-collapse {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-collapse,
+.oo-ui-image-invert.oo-ui-icon-collapse {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse-invert.svg);
+}
+.oo-ui-icon-comment {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/comment.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-comment,
+.oo-ui-image-invert.oo-ui-icon-comment {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/comment-invert.svg);
+}
+.oo-ui-icon-expand {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/expand.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-expand,
+.oo-ui-image-invert.oo-ui-icon-expand {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/expand-invert.svg);
+}
+.oo-ui-icon-help {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/help.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-help,
+.oo-ui-image-invert.oo-ui-icon-help {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/help-invert.svg);
+}
+.oo-ui-icon-info {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/info.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-info,
+.oo-ui-image-invert.oo-ui-icon-info {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/info-invert.svg);
+}
+.oo-ui-icon-link {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/link.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-link,
+.oo-ui-image-invert.oo-ui-icon-link {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/link-invert.svg);
+}
+.oo-ui-icon-menu {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/menu.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-menu,
+.oo-ui-image-invert.oo-ui-icon-menu {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/menu-invert.svg);
+}
+.oo-ui-icon-next {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-next,
+.oo-ui-image-invert.oo-ui-icon-next {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl-invert.svg);
+}
+.oo-ui-icon-picture {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/picture.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-picture,
+.oo-ui-image-invert.oo-ui-icon-picture {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/picture-invert.svg);
+}
+.oo-ui-icon-previous {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-previous,
+.oo-ui-image-invert.oo-ui-icon-previous {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr-invert.svg);
+}
+.oo-ui-icon-redo {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-redo,
+.oo-ui-image-invert.oo-ui-icon-redo {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg);
+}
+.oo-ui-icon-remove {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/remove.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-remove,
+.oo-ui-image-invert.oo-ui-icon-remove {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-invert.svg);
+}
+.oo-ui-icon-search {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/search.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-search,
+.oo-ui-image-invert.oo-ui-icon-search {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/search-invert.svg);
+}
+.oo-ui-icon-settings {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/settings.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-settings,
+.oo-ui-image-invert.oo-ui-icon-settings {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/settings-invert.svg);
+}
+.oo-ui-icon-tag {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/tag.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-tag,
+.oo-ui-image-invert.oo-ui-icon-tag {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/tag-invert.svg);
+}
+.oo-ui-icon-undo {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-undo,
+.oo-ui-image-invert.oo-ui-icon-undo {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg);
+}
+.oo-ui-icon-window {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/window.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-window,
+.oo-ui-image-invert.oo-ui-icon-window {
+  background-image: /* @embed */ url(themes/mediawiki/images/icons/window-invert.svg);
+}
+.oo-ui-indicator-alert {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-alert,
+.oo-ui-image-invert.oo-ui-indicator-alert {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert-invert.svg);
+}
+.oo-ui-indicator-up {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-up,
+.oo-ui-image-invert.oo-ui-indicator-up {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up-invert.svg);
+}
+.oo-ui-indicator-down {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-down,
+.oo-ui-image-invert.oo-ui-indicator-down {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down-invert.svg);
+}
+.oo-ui-indicator-next {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-next,
+.oo-ui-image-invert.oo-ui-indicator-next {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl-invert.svg);
+}
+.oo-ui-indicator-previous {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-previous,
+.oo-ui-image-invert.oo-ui-indicator-previous {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr-invert.svg);
+}
+.oo-ui-indicator-required {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/required.svg);
+}
+.oo-ui-image-invert .oo-ui-indicator-required,
+.oo-ui-image-invert.oo-ui-indicator-required {
+  background-image: /* @embed */ url(themes/mediawiki/images/indicators/required-invert.svg);
+}
+.oo-ui-texture-pending {
+  background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency.svg);
+}
+.oo-ui-image-invert .oo-ui-texture-transparency,
+.oo-ui-image-invert.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency-invert.svg);
+}
diff --git a/resources/lib/oojs-ui/oojs-ui-minerva.css b/resources/lib/oojs-ui/oojs-ui-minerva.css
new file mode 100644 (file)
index 0000000..9d39fdb
--- /dev/null
@@ -0,0 +1,1374 @@
+/*!
+ * OOjs UI v0.1.0-pre (837b2f733e)
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-10-11T01:05:40Z
+ */
+/* @noflip */
+.oo-ui-rtl {
+       direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+       direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       cursor: pointer;
+       display: inline-block;
+       vertical-align: middle;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+       display: inline-block;
+       position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       display: inline-block;
+       vertical-align: top;
+       text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-right: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       width: 3.35em;
+       height: 3.35em;
+       background-size: 2em auto;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       margin-left: 0.25em;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       line-height: 1.9em;
+}
+.oo-ui-clippableElement-clippable {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+       overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+       padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 3em;
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       padding: 0 0 1em;
+}
+.oo-ui-fieldLayout {
+       margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+       content: " ";
+       display: table;
+}
+.oo-ui-fieldLayout:after {
+       clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       display: block;
+       float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       display: block;
+       float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       text-align: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       z-index: 1;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+       float: right;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+       padding: 0.5em 0.75em;
+}
+.oo-ui-fieldLayout:last-child {
+       margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       padding-top: 0.5em;
+       margin-right: 5%;
+       width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+       color: #cccccc;
+}
+.oo-ui-fieldsetLayout {
+       position: relative;
+       margin: 0;
+       padding: 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       display: block;
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+       margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+       margin-bottom: 0.5em;
+       padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+       padding-left: 1.75em;
+       line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       left: 0;
+       top: 0.25em;
+       width: 2em;
+       height: 2em;
+}
+.oo-ui-gridLayout {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-panelLayout {
+       position: relative;
+       padding: 1em 3.35em;
+}
+.oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+       display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+       display: block;
+       position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+       z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+       margin-left: 1.25em;
+       font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+       display: inline-block;
+       vertical-align: middle;
+       margin: 0.3em;
+}
+.oo-ui-toolGroup-empty {
+       display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+       display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+       display: inline-block;
+       position: relative;
+       vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+       cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       height: 1.5em;
+       padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 1.5em;
+       width: 1.5em;
+}
+.oo-ui-popupToolGroup {
+       position: relative;
+       height: 2em;
+       min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+       display: block;
+       cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+       cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       display: none;
+       position: absolute;
+       z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+       display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+       left: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+       right: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+       min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2em;
+       height: 2em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 0.6em;
+       font-weight: bold;
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-right: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       top: 2.3em;
+       margin: 0 -1px;
+       border: solid 1px #dddddd;
+       background-color: white;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 2em;
+       width: 2em;
+       margin-right: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       line-height: 2em;
+       font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+       display: inline-block;
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+       padding: 0.25em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       padding-right: 0.5em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+       display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+       min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+       padding: 0.25em 0 0.25em 0;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       padding: 0 1em 0 0.25em;
+}
+.oo-ui-toolbar {
+       clear: both;
+}
+.oo-ui-toolbar-bar {
+       line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+       float: right;
+}
+.oo-ui-toolbar-tools {
+       display: inline;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+       -webkit-touch-callout: default;
+       -webkit-user-select: all;
+          -moz-user-select: all;
+           -ms-user-select: all;
+               user-select: all;
+}
+.oo-ui-toolbar-shadow {
+       background-position: left top;
+       background-repeat: repeat-x;
+       position: absolute;
+       width: 100%;
+       pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+       border-bottom: solid 1px #dddddd;
+       background: white;
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+       border: none;
+       background: none;
+}
+.oo-ui-selectWidget {
+       margin: 0;
+       padding: 0;
+}
+.oo-ui-optionWidget {
+       position: relative;
+       display: block;
+       cursor: pointer;
+       padding: 0.8em 1em 0.8em 3.35em;
+       border: none;
+       font-weight: bold;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       display: block;
+       white-space: nowrap;
+       text-overflow: ellipsis;
+       overflow: hidden;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       line-height: 1.5em;
+}
+.oo-ui-optionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+       padding-right: 1.5em;
+}
+.oo-ui-optionWidget-level-0 {
+       padding-left: 3.5em;
+}
+.oo-ui-optionWidget-level-0 .oo-ui-iconElement-icon {
+       left: 1em;
+}
+.oo-ui-optionWidget-level-1 {
+       padding-left: 5em;
+}
+.oo-ui-optionWidget-level-1 .oo-ui-iconElement-icon {
+       left: 2.5em;
+}
+.oo-ui-optionWidget-level-2 {
+       padding-left: 6.5em;
+}
+.oo-ui-optionWidget-level-2 .oo-ui-iconElement-icon {
+       left: 4em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       top: 50%;
+       width: 2em;
+       height: 2em;
+       margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+       left: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       right: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+       display: inline-block;
+       white-space: nowrap;
+}
+.oo-ui-buttonOptionWidget {
+       display: inline-block;
+       padding: 0;
+       background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       position: static;
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       height: 1.9em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       height: 1.9em;
+       margin-top: 0;
+}
+.oo-ui-labelWidget {
+       display: inline-block;
+       padding: 0.5em 0;
+}
+.oo-ui-iconWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 1.9em;
+       width: 1.9em;
+       opacity: 0.8;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 1.9em;
+       width: 1.9em;
+       opacity: 0.8;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+       border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-bottom: -1px;
+       margin-left: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+       position: relative;
+       display: inline-block;
+       vertical-align: middle;
+       overflow: hidden;
+       cursor: pointer;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       -webkit-transform: translateZ(0px);
+          -moz-transform: translateZ(0px);
+           -ms-transform: translateZ(0px);
+            -o-transform: translateZ(0px);
+               transform: translateZ(0px);
+       height: 2em;
+       width: 4em;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       position: absolute;
+       display: block;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       right: 0;
+       left: 0;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: none;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       top: 0.25em;
+       left: 0.25em;
+       width: 1.5em;
+       height: 1.5em;
+       margin-top: -1px;
+       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+          -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+           -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+            -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+               transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+       -webkit-transition: opacity 200ms ease-in-out;
+          -moz-transition: opacity 200ms ease-in-out;
+           -ms-transition: opacity 200ms ease-in-out;
+            -o-transition: opacity 200ms ease-in-out;
+               transition: opacity 200ms ease-in-out;
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+       left: 2.25em;
+       margin-left: -2px;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+       left: 0.25em;
+       margin-left: 0;
+}
+.oo-ui-popupWidget {
+       position: absolute;
+}
+.oo-ui-popupWidget-popup {
+       position: relative;
+       overflow: hidden;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+       display: none;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+       display: block;
+       position: absolute;
+       top: 0;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       float: left;
+       cursor: default;
+}
+.oo-ui-popupWidget-body {
+       clear: both;
+       overflow: hidden;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+       margin-top: 7px;
+}
+.oo-ui-popupWidget-head {
+       height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body-padded {
+       padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+       position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+       position: absolute;
+       cursor: auto;
+}
+.oo-ui-lookupInputWidget-menu {
+       background-color: #ffffff;
+}
+.oo-ui-textInputWidget {
+       position: relative;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       display: inline-block;
+       width: 100%;
+       resize: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       top: 0;
+       height: 100%;
+       background-repeat: no-repeat;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+       left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       padding: 0.8em 1em;
+}
+.oo-ui-menuWidget {
+       position: absolute;
+       background: white;
+       border: solid 1px #dddddd;
+}
+.oo-ui-menuWidget input {
+       position: absolute;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+       opacity: 0;
+}
+.oo-ui-menuItemWidget {
+       position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background: #347bff;
+       color: #ffffff;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+       background-size: 24px auto;
+}
+.oo-ui-menuSectionItemWidget {
+       cursor: default;
+       font-weight: normal;
+       color: #777777;
+       border: none;
+}
+.oo-ui-inlineMenuWidget {
+       position: relative;
+       display: inline-block;
+       margin: 0.25em 0;
+       min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+       width: 100%;
+       display: inline-block;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+       z-index: 1;
+       width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+       cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+       height: 2.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2.5em;
+       height: 2.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       line-height: 2.5em;
+       margin: 0 0.5em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-right: 2em;
+}
+.oo-ui-outlineItemWidget {
+       position: relative;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       padding: 0.75em;
+}
+.oo-ui-outlineControlsWidget {
+       height: 3em;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       float: left;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       float: left;
+       background-position: right center;
+       background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-movers {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       height: 2em;
+       margin: 0.5em;
+       padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       width: 1.5em;
+       height: 2em;
+       margin: 0.5em 0 0.5em 0.5em;
+}
+.oo-ui-outlineControlsWidget-items {
+       margin-left: 0;
+}
+.oo-ui-comboBoxWidget {
+       display: inline-block;
+       position: relative;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+       width: 100%;
+       z-index: 1;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+       min-width: 20em;
+}
+.oo-ui-searchWidget-query {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       width: 100%;
+}
+.oo-ui-searchWidget-results {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-searchWidget-query {
+       height: 4em;
+       padding: 0 1em;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       margin: 0.75em 0;
+}
+.oo-ui-searchWidget-results {
+       top: 4em;
+       padding: 1em;
+       line-height: 0;
+}
+.oo-ui-window {
+       line-height: 1em;
+}
+.oo-ui-window-frame {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+       margin: 0;
+       padding: 0;
+}
+.oo-ui-window-content:focus {
+       outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-window-body {
+       margin: 0;
+       padding: 0;
+       background: none;
+}
+.oo-ui-window-overlay {
+       position: absolute;
+       top: 0;
+       left: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       position: absolute;
+       left: 0;
+       right: 0;
+       overflow: hidden;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+       z-index: 1;
+       top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       z-index: 2;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       z-index: 1;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+       z-index: 3;
+}
+.oo-ui-messageDialog-actions-horizontal {
+       display: table;
+       table-layout: fixed;
+       width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       display: table-cell;
+       width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+       display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       display: block;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+       position: relative;
+       text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+       display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       position: relative;
+       top: auto;
+       bottom: auto;
+       display: inline;
+       white-space: nowrap;
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+       display: block;
+       text-align: center;
+       padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+       font-size: 1.5em;
+       line-height: 1em;
+       color: #000000;
+}
+.oo-ui-messageDialog-message {
+       font-size: 0.9em;
+       line-height: 1.25em;
+       color: #666666;
+}
+.oo-ui-messageDialog-message-verbose {
+       font-size: 1.1em;
+       line-height: 1.5em;
+       text-align: left;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       border-right: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+       border-right-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+       border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       text-align: center;
+       line-height: 3.4em;
+       padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+       background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+       font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+       background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+       background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+       background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+       overflow: hidden;
+       text-overflow: ellipsis;
+       white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+       display: inline;
+       padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+       white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+       left: 0;
+}
+.oo-ui-processDialog-actions-primary {
+       right: 0;
+}
+.oo-ui-processDialog-errors {
+       display: none;
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+       z-index: 2;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+       height: 3.35em;
+       border-bottom: 1px solid #dddddd;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+       top: 3.35em;
+       padding: 2em 0;
+}
+.oo-ui-processDialog-navigation {
+       position: relative;
+       height: 3.35em;
+       padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+       padding: 0.75em 0;
+       height: 1.85em;
+       cursor: default;
+       text-align: center;
+}
+.oo-ui-processDialog-title {
+       font-weight: bold;
+       line-height: 1.85em;
+}
+.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 {
+       padding: 0.35em 0.75em;
+       min-width: 1.85em;
+       min-height: 1.85em;
+       border: 1px solid #dddddd;
+       border-radius: 4px;
+}
+.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.85em;
+       padding: 0 1em;
+       font-weight: bold;
+       color: #777777;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+       position: absolute;
+       margin-top: -0.125em;
+}
+.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 {
+       vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button {
+       border: 1px solid transparent;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label {
+       color: #d11d13;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button {
+       padding: 0.75em 0.35em;
+       border: none;
+       border-radius: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {
+       background-color: #347bff;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+       color: #ffffff;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       left: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-left: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       right: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-right: 2.25em;
+}
+.oo-ui-processDialog-actions-other {
+       position: absolute;
+       bottom: 1em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+       min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+       background-color: rgba(255, 255, 255, 0.9);
+       padding: 3em 3em 1.5em 3em;
+       text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+       margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+       font-size: 1.5em;
+       color: #000000;
+       margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+       text-align: left;
+       margin: 1em;
+       padding: 1em;
+       border: solid 1px #ff9e9e;
+       background-color: #fff7f7;
+       border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       position: fixed;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+       width: auto;
+       height: auto;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
+       padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+       position: absolute;
+       right: 0;
+       left: 0;
+       margin: auto;
+       overflow: hidden;
+       max-width: 100%;
+       max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+       width: 100%;
+       height: 100%;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       background-color: rgba(255, 255, 255, 0.5);
+       opacity: 0;
+       -webkit-transition: opacity 250ms ease-in-out;
+          -moz-transition: opacity 250ms ease-in-out;
+           -ms-transition: opacity 250ms ease-in-out;
+            -o-transition: opacity 250ms ease-in-out;
+               transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       top: 0;
+       bottom: 0;
+       background-color: #ffffff;
+       -webkit-transform: translate3d(0, -200%, 0);
+          -moz-transform: translate3d(0, -200%, 0);
+           -ms-transform: translate3d(0, -200%, 0);
+            -o-transform: translate3d(0, -200%, 0);
+               transform: translate3d(0, -200%, 0);
+       -webkit-transition: transform 250ms ease-in-out;
+          -moz-transition: transform 250ms ease-in-out;
+           -ms-transition: transform 250ms ease-in-out;
+            -o-transition: transform 250ms ease-in-out;
+               transition: transform 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+       opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       -webkit-transform: translate3d(0, 0, 0);
+          -moz-transform: translate3d(0, 0, 0);
+           -ms-transform: translate3d(0, 0, 0);
+            -o-transform: translate3d(0, 0, 0);
+               transform: translate3d(0, 0, 0);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+       border: solid 1px #cccccc;
+       border-radius: 0.5em;
+       box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+}
+
+.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/minerva/images/icons/check.png);
+}
+.oo-ui-image-invert .oo-ui-icon-check,
+.oo-ui-image-invert.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/minerva/images/icons/check-invert.png);
+}
diff --git a/resources/lib/oojs-ui/oojs-ui-minerva.js b/resources/lib/oojs-ui/oojs-ui-minerva.js
new file mode 100644 (file)
index 0000000..3835239
--- /dev/null
@@ -0,0 +1,13 @@
+/*!
+ * OOjs UI v0.1.0-pre (837b2f733e)
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-10-11T01:05:29Z
+ */
+/* Instantiation */
+
+OO.ui.theme = new OO.ui.Theme();
diff --git a/resources/lib/oojs-ui/oojs-ui-minerva.rtl.css b/resources/lib/oojs-ui/oojs-ui-minerva.rtl.css
new file mode 100644 (file)
index 0000000..e452952
--- /dev/null
@@ -0,0 +1,1381 @@
+/*!
+ * OOjs UI v0.1.0
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-09-11T19:39:50Z
+ */
+/*
+ * Blank theme mixins.
+ *
+ * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
+ * additional rules to the base styles.
+ */
+/*
+ * Base styles.
+ *
+ * Themes should include this file after defining their variables and mixins.
+ */
+/* @noflip */
+.oo-ui-rtl {
+  direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+  direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  cursor: pointer;
+  display: inline-block;
+  vertical-align: middle;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+  display: inline-block;
+  position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  display: inline-block;
+  vertical-align: top;
+  text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  margin-left: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  width: 3.35em;
+  height: 3.35em;
+  background-size: 2em auto;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  margin-right: 0.25em;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  line-height: 1.9em;
+}
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 3em;
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 0 0 1em;
+}
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  content: " ";
+  display: table;
+}
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  text-align: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+  z-index: 1;
+}
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  padding-top: 0.5em;
+  margin-left: 5%;
+  width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+  color: #ccc;
+}
+.oo-ui-fieldsetLayout {
+  position: relative;
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  display: block;
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+  margin-bottom: 0.5em;
+  padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+  padding-right: 1.75em;
+  line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  right: 0;
+  top: 0.25em;
+  width: 2em;
+  height: 2em;
+}
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout {
+  position: relative;
+  padding: 1em 3.35em;
+}
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  display: block;
+  position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+  z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-right: 1.25em;
+  font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+  display: inline-block;
+  vertical-align: middle;
+  margin: 0.3em;
+}
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+  display: inline-block;
+  position: relative;
+  vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  height: 1.5em;
+  padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 1.5em;
+  width: 1.5em;
+}
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  display: none;
+  position: absolute;
+  z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+  right: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+  left: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+  min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2em;
+  height: 2em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 0.6em;
+  font-weight: bold;
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-left: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 2.3em;
+  margin: 0 -1px;
+  border: solid 1px #dddddd;
+  background-color: white;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 2em;
+  width: 2em;
+  margin-left: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  line-height: 2em;
+  font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  padding-left: 0.5em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: none;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: /* @embed */ url(images/icons/check.svg);
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  padding: 0 0.25em 0 1em;
+}
+.oo-ui-toolbar {
+  clear: both;
+}
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+  float: left;
+}
+.oo-ui-toolbar-tools {
+  display: inline;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-touch-callout: default;
+  -webkit-user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
+}
+.oo-ui-toolbar-shadow {
+  background-position: right top;
+  background-repeat: repeat-x;
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+  border-bottom: solid 1px #dddddd;
+  background: white;
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+  border: none;
+  background: none;
+}
+.oo-ui-selectWidget {
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  cursor: pointer;
+  padding: 0.8em 3.35em 0.8em 1em;
+  border: none;
+  font-weight: bold;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  line-height: 1.5em;
+}
+.oo-ui-optionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+  padding-left: 1.5em;
+}
+.oo-ui-optionWidget-level-0 {
+  padding-right: 3.5em;
+}
+.oo-ui-optionWidget-level-0 .oo-ui-iconElement-icon {
+  right: 1em;
+}
+.oo-ui-optionWidget-level-1 {
+  padding-right: 5em;
+}
+.oo-ui-optionWidget-level-1 .oo-ui-iconElement-icon {
+  right: 2.5em;
+}
+.oo-ui-optionWidget-level-2 {
+  padding-right: 6.5em;
+}
+.oo-ui-optionWidget-level-2 .oo-ui-iconElement-icon {
+  right: 4em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  left: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+}
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  padding: 0;
+  background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  position: static;
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  height: 1.9em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  height: 1.9em;
+  margin-top: 0;
+}
+.oo-ui-labelWidget {
+  display: inline-block;
+  padding: 0.5em 0;
+}
+.oo-ui-iconWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+  border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-bottom: -1px;
+  margin-right: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  overflow: hidden;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transform: translateZ(0px);
+  -moz-transform: translateZ(0px);
+  -ms-transform: translateZ(0px);
+  -o-transform: translateZ(0px);
+  transform: translateZ(0px);
+  height: 2em;
+  width: 4em;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  top: 0.25em;
+  right: 0.25em;
+  width: 1.5em;
+  height: 1.5em;
+  margin-top: -1px;
+  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  -webkit-transition: opacity 200ms ease-in-out;
+  -moz-transition: opacity 200ms ease-in-out;
+  -ms-transition: opacity 200ms ease-in-out;
+  -o-transition: opacity 200ms ease-in-out;
+  transition: opacity 200ms ease-in-out;
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  right: 2.25em;
+  margin-right: -2px;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  right: 0.25em;
+  margin-right: 0;
+}
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  overflow: hidden;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+  display: none;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  display: block;
+  position: absolute;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  float: right;
+  cursor: default;
+}
+.oo-ui-popupWidget-body {
+  clear: both;
+  overflow: hidden;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+  margin-top: 7px;
+}
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body-padded {
+  padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  right: 1em;
+  cursor: auto;
+}
+.oo-ui-lookupInputWidget-menu {
+  background-color: #fff;
+}
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  resize: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+  background-repeat: no-repeat;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+  right: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: .8em 1em;
+}
+.oo-ui-menuWidget {
+  position: absolute;
+  background: white;
+  border: solid 1px #dddddd;
+}
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+}
+.oo-ui-menuItemWidget {
+  position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background: #347bff;
+  color: #ffffff;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+  background-size: 24px auto;
+}
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+  font-weight: normal;
+  color: #777777;
+  border: none;
+}
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  margin: 0.25em 0;
+  min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+  width: 100%;
+  display: inline-block;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+  height: 2.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  line-height: 2.5em;
+  margin: 0 0.5em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-left: 2em;
+}
+.oo-ui-outlineItemWidget {
+  position: relative;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  padding: 0.75em;
+}
+.oo-ui-outlineControlsWidget {
+  height: 3em;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  float: right;
+  background-position: left center;
+  background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  height: 2em;
+  margin: 0.5em;
+  padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  width: 1.5em;
+  height: 2em;
+  margin: 0.5em 0.5em 0.5em 0;
+}
+.oo-ui-outlineControlsWidget-items {
+  margin-right: 0;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+  z-index: 1;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget > .oo-ui-selectWidget {
+  min-width: 20em;
+}
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
+}
+.oo-ui-searchWidget-results {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-searchWidget-query {
+  height: 4em;
+  padding: 0 1em;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  margin: 0.75em 0;
+}
+.oo-ui-searchWidget-results {
+  top: 4em;
+  padding: 1em;
+  line-height: 0;
+}
+.oo-ui-window {
+  line-height: 1em;
+  /* Content div takes focus when opened, so hide outline */
+}
+.oo-ui-window-frame {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-window-content:focus {
+  outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-window-body {
+  margin: 0;
+  padding: 0;
+  background: none;
+}
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  position: absolute;
+  right: 0;
+  left: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+  z-index: 1;
+  top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+  z-index: 2;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  z-index: 1;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+  z-index: 3;
+}
+.oo-ui-messageDialog-actions-horizontal {
+  display: table;
+  table-layout: fixed;
+  width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  display: table-cell;
+  width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+  display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+  position: relative;
+  text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  position: relative;
+  top: auto;
+  bottom: auto;
+  display: inline;
+  white-space: nowrap;
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+  display: block;
+  text-align: center;
+  padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+  font-size: 1.5em;
+  line-height: 1em;
+  color: #000;
+}
+.oo-ui-messageDialog-message {
+  font-size: 0.9em;
+  line-height: 1.25em;
+  color: #666;
+}
+.oo-ui-messageDialog-message-verbose {
+  font-size: 1.1em;
+  line-height: 1.5em;
+  text-align: right;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  border-left: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+  border-left-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+  border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  text-align: center;
+  line-height: 3.4em;
+  padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+  display: inline;
+  padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+  white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+  right: 0;
+}
+.oo-ui-processDialog-actions-primary {
+  left: 0;
+}
+.oo-ui-processDialog-errors {
+  display: none;
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  z-index: 2;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+  height: 3.35em;
+  border-bottom: 1px solid #dddddd;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+  top: 3.35em;
+  padding: 2em 0;
+}
+.oo-ui-processDialog-navigation {
+  position: relative;
+  height: 3.35em;
+  padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+  padding: 0.75em 0;
+  height: 1.85em;
+  cursor: default;
+  text-align: center;
+}
+.oo-ui-processDialog-title {
+  font-weight: bold;
+  line-height: 1.85em;
+}
+.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 {
+  padding: 0.35em 0.75em;
+  min-width: 1.85em;
+  min-height: 1.85em;
+  border: 1px solid #dddddd;
+  border-radius: 4px;
+}
+.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.85em;
+  padding: 0 1em;
+  font-weight: bold;
+  color: #777777;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+  position: absolute;
+  margin-top: -0.125em;
+}
+.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 {
+  vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button {
+  border: 1px solid transparent;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label {
+  color: #d11d13;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  padding: 0.75em 0.35em;
+  border: none;
+  border-radius: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {
+  background-color: #347bff;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  color: #ffffff;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-right: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-left: 2.25em;
+}
+.oo-ui-processDialog-actions-other {
+  position: absolute;
+  bottom: 1em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+  min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+  background-color: rgba(255, 255, 255, 0.9);
+  padding: 3em 3em 1.5em 3em;
+  text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+  margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+  font-size: 1.5em;
+  color: #000;
+  margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+  text-align: right;
+  margin: 1em;
+  padding: 1em;
+  border: solid 1px #ff9e9e;
+  background-color: #fff7f7;
+  border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  position: fixed;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+  width: auto;
+  height: auto;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+  position: fixed;
+  left: 0;
+  right: 0;
+  margin: auto;
+  overflow: hidden;
+  max-width: 100%;
+  max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+  width: 100%;
+  height: 100%;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: opacity 250ms ease-in-out;
+  -moz-transition: opacity 250ms ease-in-out;
+  -ms-transition: opacity 250ms ease-in-out;
+  -o-transition: opacity 250ms ease-in-out;
+  transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 0;
+  bottom: 0;
+  background-color: #fff;
+  -webkit-transform: translate3d(0, -200%, 0);
+  -moz-transform: translate3d(0, -200%, 0);
+  -ms-transform: translate3d(0, -200%, 0);
+  -o-transform: translate3d(0, -200%, 0);
+  transform: translate3d(0, -200%, 0);
+  -webkit-transition: transform 250ms ease-in-out;
+  -moz-transition: transform 250ms ease-in-out;
+  -ms-transition: transform 250ms ease-in-out;
+  -o-transition: transform 250ms ease-in-out;
+  transition: transform 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+  opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: translate3d(0, 0, 0);
+  -moz-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  -o-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+  border: solid 1px #ccc;
+  border-radius: 0.5em;
+  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+}
+
+/*
+ * Blank theme mixins.
+ *
+ * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
+ * additional rules to the base styles.
+ */
+.oo-ui-icon-check {
+  background-image: /* @embed */ url(themes/minerva/images/icons/check.png);
+  background: #347bff;
+}
diff --git a/resources/lib/oojs-ui/oojs-ui-minerva.svg.css b/resources/lib/oojs-ui/oojs-ui-minerva.svg.css
new file mode 100644 (file)
index 0000000..3f671e0
--- /dev/null
@@ -0,0 +1,1374 @@
+/*!
+ * OOjs UI v0.1.0-pre (837b2f733e)
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-10-11T01:05:40Z
+ */
+/* @noflip */
+.oo-ui-rtl {
+       direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+       direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       cursor: pointer;
+       display: inline-block;
+       vertical-align: middle;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+       display: inline-block;
+       position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       display: inline-block;
+       vertical-align: top;
+       text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-right: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       width: 3.35em;
+       height: 3.35em;
+       background-size: 2em auto;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       margin-left: 0.25em;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       line-height: 1.9em;
+}
+.oo-ui-clippableElement-clippable {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+       overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+       padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 3em;
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+       padding: 0 0 1em;
+}
+.oo-ui-fieldLayout {
+       margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+       content: " ";
+       display: table;
+}
+.oo-ui-fieldLayout:after {
+       clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       display: block;
+       float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       display: block;
+       float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       text-align: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       z-index: 1;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+       float: right;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+       padding: 0.5em 0.75em;
+}
+.oo-ui-fieldLayout:last-child {
+       margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+       padding-top: 0.5em;
+       margin-right: 5%;
+       width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+       width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+       padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+       color: #cccccc;
+}
+.oo-ui-fieldsetLayout {
+       position: relative;
+       margin: 0;
+       padding: 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       display: block;
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+       margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+       margin-bottom: 0.5em;
+       padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+       padding-left: 1.75em;
+       line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       left: 0;
+       top: 0.25em;
+       width: 2em;
+       height: 2em;
+}
+.oo-ui-gridLayout {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-panelLayout {
+       position: relative;
+       padding: 1em 3.35em;
+}
+.oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+       display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+       display: block;
+       position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+       z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+       margin-left: 1.25em;
+       font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+       display: inline-block;
+       vertical-align: middle;
+       margin: 0.3em;
+}
+.oo-ui-toolGroup-empty {
+       display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+       display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+       display: inline-block;
+       position: relative;
+       vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+       cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+       height: 1.5em;
+       padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 1.5em;
+       width: 1.5em;
+}
+.oo-ui-popupToolGroup {
+       position: relative;
+       height: 2em;
+       min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+       display: block;
+       cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+       cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       display: none;
+       position: absolute;
+       z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+       display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+       left: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+       right: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+       min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2em;
+       height: 2em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 0.6em;
+       font-weight: bold;
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-right: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       top: 2.3em;
+       margin: 0 -1px;
+       border: solid 1px #dddddd;
+       background-color: white;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 2em;
+       width: 2em;
+       margin-right: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       line-height: 2em;
+       font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+       display: inline-block;
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+       padding: 0.25em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       padding-right: 0.5em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+       display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       display: block;
+       cursor: pointer;
+       white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+       min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+       padding: 0.25em 0 0.25em 0;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       padding: 0 1em 0 0.25em;
+}
+.oo-ui-toolbar {
+       clear: both;
+}
+.oo-ui-toolbar-bar {
+       line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+       float: right;
+}
+.oo-ui-toolbar-tools {
+       display: inline;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+       -webkit-touch-callout: default;
+       -webkit-user-select: all;
+          -moz-user-select: all;
+           -ms-user-select: all;
+               user-select: all;
+}
+.oo-ui-toolbar-shadow {
+       background-position: left top;
+       background-repeat: repeat-x;
+       position: absolute;
+       width: 100%;
+       pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+       border-bottom: solid 1px #dddddd;
+       background: white;
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+       border: none;
+       background: none;
+}
+.oo-ui-selectWidget {
+       margin: 0;
+       padding: 0;
+}
+.oo-ui-optionWidget {
+       position: relative;
+       display: block;
+       cursor: pointer;
+       padding: 0.8em 1em 0.8em 3.35em;
+       border: none;
+       font-weight: bold;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       display: block;
+       white-space: nowrap;
+       text-overflow: ellipsis;
+       overflow: hidden;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       line-height: 1.5em;
+}
+.oo-ui-optionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+       padding-right: 1.5em;
+}
+.oo-ui-optionWidget-level-0 {
+       padding-left: 3.5em;
+}
+.oo-ui-optionWidget-level-0 .oo-ui-iconElement-icon {
+       left: 1em;
+}
+.oo-ui-optionWidget-level-1 {
+       padding-left: 5em;
+}
+.oo-ui-optionWidget-level-1 .oo-ui-iconElement-icon {
+       left: 2.5em;
+}
+.oo-ui-optionWidget-level-2 {
+       padding-left: 6.5em;
+}
+.oo-ui-optionWidget-level-2 .oo-ui-iconElement-icon {
+       left: 4em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       top: 50%;
+       width: 2em;
+       height: 2em;
+       margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+       left: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       right: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+       display: inline-block;
+       white-space: nowrap;
+}
+.oo-ui-buttonOptionWidget {
+       display: inline-block;
+       padding: 0;
+       background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       position: static;
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       height: 1.9em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       height: 1.9em;
+       margin-top: 0;
+}
+.oo-ui-labelWidget {
+       display: inline-block;
+       padding: 0.5em 0;
+}
+.oo-ui-iconWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 1.9em;
+       width: 1.9em;
+       opacity: 0.8;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 1.9em;
+       width: 1.9em;
+       opacity: 0.8;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+       border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-bottom: -1px;
+       margin-left: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 0.3em;
+       border-top-left-radius: 0.3em;
+       margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 0.3em;
+       border-top-right-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+       position: relative;
+       display: inline-block;
+       vertical-align: middle;
+       overflow: hidden;
+       cursor: pointer;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       -webkit-transform: translateZ(0px);
+          -moz-transform: translateZ(0px);
+           -ms-transform: translateZ(0px);
+            -o-transform: translateZ(0px);
+               transform: translateZ(0px);
+       height: 2em;
+       width: 4em;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       position: absolute;
+       display: block;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       right: 0;
+       left: 0;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: none;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       top: 0.25em;
+       left: 0.25em;
+       width: 1.5em;
+       height: 1.5em;
+       margin-top: -1px;
+       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+          -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+           -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+            -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+               transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+       -webkit-transition: opacity 200ms ease-in-out;
+          -moz-transition: opacity 200ms ease-in-out;
+           -ms-transition: opacity 200ms ease-in-out;
+            -o-transition: opacity 200ms ease-in-out;
+               transition: opacity 200ms ease-in-out;
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+       left: 2.25em;
+       margin-left: -2px;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+       left: 0.25em;
+       margin-left: 0;
+}
+.oo-ui-popupWidget {
+       position: absolute;
+}
+.oo-ui-popupWidget-popup {
+       position: relative;
+       overflow: hidden;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+       display: none;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+       display: block;
+       position: absolute;
+       top: 0;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       float: left;
+       cursor: default;
+}
+.oo-ui-popupWidget-body {
+       clear: both;
+       overflow: hidden;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+       margin-top: 7px;
+}
+.oo-ui-popupWidget-head {
+       height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body-padded {
+       padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+       position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+       position: absolute;
+       cursor: auto;
+}
+.oo-ui-lookupInputWidget-menu {
+       background-color: #ffffff;
+}
+.oo-ui-textInputWidget {
+       position: relative;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       display: inline-block;
+       width: 100%;
+       resize: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       top: 0;
+       height: 100%;
+       background-repeat: no-repeat;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+       left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       padding: 0.8em 1em;
+}
+.oo-ui-menuWidget {
+       position: absolute;
+       background: white;
+       border: solid 1px #dddddd;
+}
+.oo-ui-menuWidget input {
+       position: absolute;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+       opacity: 0;
+}
+.oo-ui-menuItemWidget {
+       position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+       background: #347bff;
+       color: #ffffff;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+       background-size: 24px auto;
+}
+.oo-ui-menuSectionItemWidget {
+       cursor: default;
+       font-weight: normal;
+       color: #777777;
+       border: none;
+}
+.oo-ui-inlineMenuWidget {
+       position: relative;
+       display: inline-block;
+       margin: 0.25em 0;
+       min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+       width: 100%;
+       display: inline-block;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+       z-index: 1;
+       width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+       cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+       height: 2.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 2.5em;
+       height: 2.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       line-height: 2.5em;
+       margin: 0 0.5em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+       margin-right: 2em;
+}
+.oo-ui-outlineItemWidget {
+       position: relative;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       padding: 0.75em;
+}
+.oo-ui-outlineControlsWidget {
+       height: 3em;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       float: left;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       float: left;
+       background-position: right center;
+       background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-movers {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       height: 2em;
+       margin: 0.5em;
+       padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       width: 1.5em;
+       height: 2em;
+       margin: 0.5em 0 0.5em 0.5em;
+}
+.oo-ui-outlineControlsWidget-items {
+       margin-left: 0;
+}
+.oo-ui-comboBoxWidget {
+       display: inline-block;
+       position: relative;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+       width: 100%;
+       z-index: 1;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+       min-width: 20em;
+}
+.oo-ui-searchWidget-query {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       width: 100%;
+}
+.oo-ui-searchWidget-results {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-searchWidget-query {
+       height: 4em;
+       padding: 0 1em;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       margin: 0.75em 0;
+}
+.oo-ui-searchWidget-results {
+       top: 4em;
+       padding: 1em;
+       line-height: 0;
+}
+.oo-ui-window {
+       line-height: 1em;
+}
+.oo-ui-window-frame {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+       margin: 0;
+       padding: 0;
+}
+.oo-ui-window-content:focus {
+       outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-window-body {
+       margin: 0;
+       padding: 0;
+       background: none;
+}
+.oo-ui-window-overlay {
+       position: absolute;
+       top: 0;
+       left: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       position: absolute;
+       left: 0;
+       right: 0;
+       overflow: hidden;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+       z-index: 1;
+       top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       z-index: 2;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       z-index: 1;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+       z-index: 3;
+}
+.oo-ui-messageDialog-actions-horizontal {
+       display: table;
+       table-layout: fixed;
+       width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       display: table-cell;
+       width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+       display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       display: block;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+       position: relative;
+       text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+       display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       position: relative;
+       top: auto;
+       bottom: auto;
+       display: inline;
+       white-space: nowrap;
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+       display: block;
+       text-align: center;
+       padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+       font-size: 1.5em;
+       line-height: 1em;
+       color: #000000;
+}
+.oo-ui-messageDialog-message {
+       font-size: 0.9em;
+       line-height: 1.25em;
+       color: #666666;
+}
+.oo-ui-messageDialog-message-verbose {
+       font-size: 1.1em;
+       line-height: 1.5em;
+       text-align: left;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       border-right: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+       border-right-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+       border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       text-align: center;
+       line-height: 3.4em;
+       padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+       background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+       font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+       background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+       background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+       background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+       overflow: hidden;
+       text-overflow: ellipsis;
+       white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+       display: inline;
+       padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+       white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+       left: 0;
+}
+.oo-ui-processDialog-actions-primary {
+       right: 0;
+}
+.oo-ui-processDialog-errors {
+       display: none;
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+       z-index: 2;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+       height: 3.35em;
+       border-bottom: 1px solid #dddddd;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+       top: 3.35em;
+       padding: 2em 0;
+}
+.oo-ui-processDialog-navigation {
+       position: relative;
+       height: 3.35em;
+       padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+       padding: 0.75em 0;
+       height: 1.85em;
+       cursor: default;
+       text-align: center;
+}
+.oo-ui-processDialog-title {
+       font-weight: bold;
+       line-height: 1.85em;
+}
+.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 {
+       padding: 0.35em 0.75em;
+       min-width: 1.85em;
+       min-height: 1.85em;
+       border: 1px solid #dddddd;
+       border-radius: 4px;
+}
+.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.85em;
+       padding: 0 1em;
+       font-weight: bold;
+       color: #777777;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+       position: absolute;
+       margin-top: -0.125em;
+}
+.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 {
+       vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button {
+       border: 1px solid transparent;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label {
+       color: #d11d13;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button {
+       padding: 0.75em 0.35em;
+       border: none;
+       border-radius: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {
+       background-color: #347bff;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+       color: #ffffff;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       left: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-left: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       right: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+       padding-right: 2.25em;
+}
+.oo-ui-processDialog-actions-other {
+       position: absolute;
+       bottom: 1em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+       min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+       background-color: rgba(255, 255, 255, 0.9);
+       padding: 3em 3em 1.5em 3em;
+       text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+       margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+       font-size: 1.5em;
+       color: #000000;
+       margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+       text-align: left;
+       margin: 1em;
+       padding: 1em;
+       border: solid 1px #ff9e9e;
+       background-color: #fff7f7;
+       border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       position: fixed;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+       width: auto;
+       height: auto;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
+       padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+       position: absolute;
+       right: 0;
+       left: 0;
+       margin: auto;
+       overflow: hidden;
+       max-width: 100%;
+       max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+       width: 100%;
+       height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+       width: 100%;
+       height: 100%;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       background-color: rgba(255, 255, 255, 0.5);
+       opacity: 0;
+       -webkit-transition: opacity 250ms ease-in-out;
+          -moz-transition: opacity 250ms ease-in-out;
+           -ms-transition: opacity 250ms ease-in-out;
+            -o-transition: opacity 250ms ease-in-out;
+               transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       top: 0;
+       bottom: 0;
+       background-color: #ffffff;
+       -webkit-transform: translate3d(0, -200%, 0);
+          -moz-transform: translate3d(0, -200%, 0);
+           -ms-transform: translate3d(0, -200%, 0);
+            -o-transform: translate3d(0, -200%, 0);
+               transform: translate3d(0, -200%, 0);
+       -webkit-transition: transform 250ms ease-in-out;
+          -moz-transition: transform 250ms ease-in-out;
+           -ms-transition: transform 250ms ease-in-out;
+            -o-transition: transform 250ms ease-in-out;
+               transition: transform 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+       opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       -webkit-transform: translate3d(0, 0, 0);
+          -moz-transform: translate3d(0, 0, 0);
+           -ms-transform: translate3d(0, 0, 0);
+            -o-transform: translate3d(0, 0, 0);
+               transform: translate3d(0, 0, 0);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+       border: solid 1px #cccccc;
+       border-radius: 0.5em;
+       box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+}
+
+.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/minerva/images/icons/check.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-check,
+.oo-ui-image-invert.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/minerva/images/icons/check-invert.svg);
+}
diff --git a/resources/lib/oojs-ui/oojs-ui-minerva.svg.rtl.css b/resources/lib/oojs-ui/oojs-ui-minerva.svg.rtl.css
new file mode 100644 (file)
index 0000000..513f2a7
--- /dev/null
@@ -0,0 +1,1381 @@
+/*!
+ * OOjs UI v0.1.0
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2014-09-24T23:21:42Z
+ */
+/* @noflip */
+.oo-ui-rtl {
+  direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+  direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  cursor: pointer;
+  display: inline-block;
+  vertical-align: middle;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+  display: inline-block;
+  position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  display: inline-block;
+  vertical-align: top;
+  text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-right: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  margin-left: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  width: 3.35em;
+  height: 3.35em;
+  background-size: 2em auto;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  margin-right: 0.25em;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  line-height: 1.9em;
+}
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 3em;
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 0 0 1em;
+}
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  content: " ";
+  display: table;
+}
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  text-align: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+  z-index: 1;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+  float: left;
+}
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
+  padding: 0.5em 0.75em;
+}
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  padding-top: 0.5em;
+  margin-left: 5%;
+  width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+  color: #ccc;
+}
+.oo-ui-fieldsetLayout {
+  position: relative;
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  display: block;
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+  margin-bottom: 0.5em;
+  padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+  padding-right: 1.75em;
+  line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  right: 0;
+  top: 0.25em;
+  width: 2em;
+  height: 2em;
+}
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout {
+  position: relative;
+  padding: 1em 3.35em;
+}
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  display: block;
+  position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+  z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-right: 1.25em;
+  font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+  display: inline-block;
+  vertical-align: middle;
+  margin: 0.3em;
+}
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+  display: inline-block;
+  position: relative;
+  vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  height: 1.5em;
+  padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 1.5em;
+  width: 1.5em;
+}
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  display: none;
+  position: absolute;
+  z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+  right: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+  left: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+  min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2em;
+  height: 2em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 0.6em;
+  font-weight: bold;
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-left: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 2.3em;
+  margin: 0 -1px;
+  border: solid 1px #dddddd;
+  background-color: white;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 2em;
+  width: 2em;
+  margin-left: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  line-height: 2em;
+  font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  padding-left: 0.5em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  padding: 0 0.25em 0 1em;
+}
+.oo-ui-toolbar {
+  clear: both;
+}
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+  float: left;
+}
+.oo-ui-toolbar-tools {
+  display: inline;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-touch-callout: default;
+  -webkit-user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
+}
+.oo-ui-toolbar-shadow {
+  background-position: right top;
+  background-repeat: repeat-x;
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+  border-bottom: solid 1px #dddddd;
+  background: white;
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+  border: none;
+  background: none;
+}
+.oo-ui-selectWidget {
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  cursor: pointer;
+  padding: 0.8em 3.35em 0.8em 1em;
+  border: none;
+  font-weight: bold;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  line-height: 1.5em;
+}
+.oo-ui-optionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+  padding-left: 1.5em;
+}
+.oo-ui-optionWidget-level-0 {
+  padding-right: 3.5em;
+}
+.oo-ui-optionWidget-level-0 .oo-ui-iconElement-icon {
+  right: 1em;
+}
+.oo-ui-optionWidget-level-1 {
+  padding-right: 5em;
+}
+.oo-ui-optionWidget-level-1 .oo-ui-iconElement-icon {
+  right: 2.5em;
+}
+.oo-ui-optionWidget-level-2 {
+  padding-right: 6.5em;
+}
+.oo-ui-optionWidget-level-2 .oo-ui-iconElement-icon {
+  right: 4em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  left: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+}
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  padding: 0;
+  background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  position: static;
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  height: 1.9em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  height: 1.9em;
+  margin-top: 0;
+}
+.oo-ui-labelWidget {
+  display: inline-block;
+  padding: 0.5em 0;
+}
+.oo-ui-iconWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+  border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-bottom: -1px;
+  margin-right: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  margin-right: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  overflow: hidden;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transform: translateZ(0px);
+  -moz-transform: translateZ(0px);
+  -ms-transform: translateZ(0px);
+  -o-transform: translateZ(0px);
+  transform: translateZ(0px);
+  height: 2em;
+  width: 4em;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  top: 0.25em;
+  right: 0.25em;
+  width: 1.5em;
+  height: 1.5em;
+  margin-top: -1px;
+  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+  transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  -webkit-transition: opacity 200ms ease-in-out;
+  -moz-transition: opacity 200ms ease-in-out;
+  -ms-transition: opacity 200ms ease-in-out;
+  -o-transition: opacity 200ms ease-in-out;
+  transition: opacity 200ms ease-in-out;
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  right: 2.25em;
+  margin-right: -2px;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  right: 0.25em;
+  margin-right: 0;
+}
+.oo-ui-actionWidget.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  overflow: hidden;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+  display: none;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  display: block;
+  position: absolute;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  float: right;
+  cursor: default;
+}
+.oo-ui-popupWidget-body {
+  clear: both;
+  overflow: hidden;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+  margin-top: 7px;
+}
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body-padded {
+  padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  right: 1em;
+  cursor: auto;
+}
+.oo-ui-lookupInputWidget-menu {
+  background-color: #fff;
+}
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  resize: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+  background-repeat: no-repeat;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+  right: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: .8em 1em;
+}
+.oo-ui-menuWidget {
+  position: absolute;
+  background: white;
+  border: solid 1px #dddddd;
+}
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+}
+.oo-ui-menuItemWidget {
+  position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background: #347bff;
+  color: #ffffff;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+  background-size: 24px auto;
+}
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+  font-weight: normal;
+  color: #777777;
+  border: none;
+}
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  margin: 0.25em 0;
+  min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+  width: 100%;
+  display: inline-block;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+  height: 2.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+  left: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  right: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  line-height: 2.5em;
+  margin: 0 0.5em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-right: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-left: 2em;
+}
+.oo-ui-outlineItemWidget {
+  position: relative;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  padding: 0.75em;
+}
+.oo-ui-outlineControlsWidget {
+  height: 3em;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  float: right;
+  background-position: left center;
+  background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  height: 2em;
+  margin: 0.5em;
+  padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  width: 1.5em;
+  height: 2em;
+  margin: 0.5em 0.5em 0.5em 0;
+}
+.oo-ui-outlineControlsWidget-items {
+  margin-right: 0;
+}
+.oo-ui-comboBoxWidget {
+  display: inline-block;
+  position: relative;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+  width: 100%;
+  z-index: 1;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+  min-width: 20em;
+}
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
+}
+.oo-ui-searchWidget-results {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-searchWidget-query {
+  height: 4em;
+  padding: 0 1em;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  margin: 0.75em 0;
+}
+.oo-ui-searchWidget-results {
+  top: 4em;
+  padding: 1em;
+  line-height: 0;
+}
+.oo-ui-window {
+  line-height: 1em;
+}
+.oo-ui-window-frame {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-window-content:focus {
+  outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-window-body {
+  margin: 0;
+  padding: 0;
+  background: none;
+}
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  position: absolute;
+  right: 0;
+  left: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+  z-index: 1;
+  top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-head.oo-ui-pendingElement-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+  z-index: 2;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  z-index: 1;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+  z-index: 3;
+}
+.oo-ui-messageDialog-actions-horizontal {
+  display: table;
+  table-layout: fixed;
+  width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  display: table-cell;
+  width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+  display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+  position: relative;
+  text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  position: relative;
+  top: auto;
+  bottom: auto;
+  display: inline;
+  white-space: nowrap;
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+  display: block;
+  text-align: center;
+  padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+  font-size: 1.5em;
+  line-height: 1em;
+  color: #000;
+}
+.oo-ui-messageDialog-message {
+  font-size: 0.9em;
+  line-height: 1.25em;
+  color: #666;
+}
+.oo-ui-messageDialog-message-verbose {
+  font-size: 1.1em;
+  line-height: 1.5em;
+  text-align: right;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  border-left: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+  border-left-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+  border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  text-align: center;
+  line-height: 3.4em;
+  padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+  display: inline;
+  padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+  white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+  right: 0;
+}
+.oo-ui-processDialog-actions-primary {
+  left: 0;
+}
+.oo-ui-processDialog-errors {
+  display: none;
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  z-index: 2;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+  height: 3.35em;
+  border-bottom: 1px solid #dddddd;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+  top: 3.35em;
+  padding: 2em 0;
+}
+.oo-ui-processDialog-navigation {
+  position: relative;
+  height: 3.35em;
+  padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+  padding: 0.75em 0;
+  height: 1.85em;
+  cursor: default;
+  text-align: center;
+}
+.oo-ui-processDialog-title {
+  font-weight: bold;
+  line-height: 1.85em;
+}
+.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 {
+  padding: 0.35em 0.75em;
+  min-width: 1.85em;
+  min-height: 1.85em;
+  border: 1px solid #dddddd;
+  border-radius: 4px;
+}
+.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.85em;
+  padding: 0 1em;
+  font-weight: bold;
+  color: #777777;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+  position: absolute;
+  margin-top: -0.125em;
+}
+.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 {
+  vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button {
+  border: 1px solid transparent;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label {
+  color: #d11d13;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  padding: 0.75em 0.35em;
+  border: none;
+  border-radius: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {
+  background-color: #347bff;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  color: #ffffff;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-right: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-left: 2.25em;
+}
+.oo-ui-processDialog-actions-other {
+  position: absolute;
+  bottom: 1em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+  min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+  background-color: rgba(255, 255, 255, 0.9);
+  padding: 3em 3em 1.5em 3em;
+  text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+  margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+  font-size: 1.5em;
+  color: #000;
+  margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+  text-align: right;
+  margin: 1em;
+  padding: 1em;
+  border: solid 1px #ff9e9e;
+  background-color: #fff7f7;
+  border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  position: fixed;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+  width: auto;
+  height: auto;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+  position: absolute;
+  left: 0;
+  right: 0;
+  margin: auto;
+  overflow: hidden;
+  max-width: 100%;
+  max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+  width: 100%;
+  height: 100%;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: opacity 250ms ease-in-out;
+  -moz-transition: opacity 250ms ease-in-out;
+  -ms-transition: opacity 250ms ease-in-out;
+  -o-transition: opacity 250ms ease-in-out;
+  transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 0;
+  bottom: 0;
+  background-color: #fff;
+  -webkit-transform: translate3d(0, -200%, 0);
+  -moz-transform: translate3d(0, -200%, 0);
+  -ms-transform: translate3d(0, -200%, 0);
+  -o-transform: translate3d(0, -200%, 0);
+  transform: translate3d(0, -200%, 0);
+  -webkit-transition: transform 250ms ease-in-out;
+  -moz-transition: transform 250ms ease-in-out;
+  -ms-transition: transform 250ms ease-in-out;
+  -o-transition: transform 250ms ease-in-out;
+  transition: transform 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+  opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: translate3d(0, 0, 0);
+  -moz-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  -o-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+  border: solid 1px #ccc;
+  border-radius: 0.5em;
+  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+}
+
+.oo-ui-icon-check {
+  background-image: /* @embed */ url(themes/minerva/images/icons/check.svg);
+}
+.oo-ui-image-invert .oo-ui-icon-check,
+.oo-ui-image-invert.oo-ui-icon-check {
+  background-image: /* @embed */ url(themes/minerva/images/icons/check-invert.svg);
+}
diff --git a/resources/lib/oojs-ui/oojs-ui.css b/resources/lib/oojs-ui/oojs-ui.css
deleted file mode 100644 (file)
index fa07706..0000000
+++ /dev/null
@@ -1,1159 +0,0 @@
-/*!
- * OOjs UI v0.1.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: Fri May 30 2014 12:12:37 GMT-0700 (PDT)
- */
-
-/* Textures */
-
-.oo-ui-texture-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-
-.oo-ui-texture-transparency {
-  background-image: /* @embed */ url(images/textures/transparency.png);
-}
-
-/* RTL Definitions */
-
-/* @noflip */
-
-.oo-ui-rtl {
-  direction: rtl;
-}
-
-/* @noflip */
-
-.oo-ui-ltr {
-  direction: ltr;
-}
-
-.oo-ui-dialog {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: 1em;
-  line-height: 1em;
-  /* Fix for strange opacity-related rendering issues.
-          CAUTION: -webkit-backface-visibility: hidden; is EXTREMELY DANGEROUS.
-          If applied to a VE surface directly, it will break selection of
-          FocusableNodes, and in the past it's caused transparent PNGs to
-          render as opaque black images. For some reason applying it to the dialog
-          wrapper in the main document fixes opacity-related behavior in the iframe
-          document, but doesn't break the surface inside the iframe. */
-
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden;
-}
-
-.oo-ui-dialog > .oo-ui-window-frame {
-  position: fixed;
-  right: 0;
-  left: 0;
-  min-height: 12em;
-  margin: auto;
-  overflow: hidden;
-}
-
-.oo-ui-dialog > .oo-ui-window-frame .oo-ui-frame {
-  width: 100%;
-  height: 100%;
-}
-
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed {
-  float: left;
-}
-
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-primary,
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-constructive,
-.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-destructive {
-  float: right;
-}
-
-.oo-ui-dialog-content-footless .oo-ui-window-foot {
-  display: none;
-}
-
-.oo-ui-frame {
-  padding: 0;
-  margin: 0;
-}
-
-.oo-ui-frame-body {
-  padding: 0;
-  margin: 0;
-  background: none;
-}
-
-.oo-ui-frame-content:focus {
-  outline: none;
-}
-
-.oo-ui-toolbar {
-  clear: both;
-}
-
-.oo-ui-toolbar-bar {
-  line-height: 1em;
-}
-
-.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
-  position: absolute;
-}
-
-.oo-ui-toolbar-actions {
-  float: right;
-}
-
-.oo-ui-toolbar-tools {
-  float: left;
-}
-
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-  -webkit-user-select: all;
-     -moz-user-select: all;
-      -ms-user-select: all;
-          user-select: all;
-  -webkit-touch-callout: default;
-}
-
-.oo-ui-toolbar-shadow {
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-  background-position: left top;
-  background-repeat: repeat-x;
-}
-
-.oo-ui-toolGroup {
-  display: inline-block;
-  margin: 0.3em;
-  vertical-align: middle;
-}
-
-.oo-ui-toolGroup-empty {
-  display: none;
-}
-
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-window-head {
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-window-icon {
-  float: left;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-window-title {
-  float: left;
-  white-space: nowrap;
-  cursor: default;
-}
-
-.oo-ui-window-overlay {
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-
-.oo-ui-buttonedElement .oo-ui-buttonedElement-button {
-  display: inline-block;
-  vertical-align: middle;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  display: none;
-  margin-left: 0;
-}
-
-.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
-  display: none;
-  margin-right: -0.75em;
-}
-
-.oo-ui-buttonedElement.oo-ui-widget-disabled .oo-ui-buttonedElement-button {
-  cursor: default;
-}
-
-.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-buttonedElement-frameless {
-  position: relative;
-  display: inline-block;
-}
-
-.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  display: inline-block;
-  margin-left: 0.25em;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  display: inline-block;
-  text-align: center;
-  vertical-align: top;
-}
-
-.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  display: inline-block;
-  line-height: 1.9em;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  cursor: default;
-}
-
-.oo-ui-clippableElement-clippable {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 3em;
-  left: 0;
-  overflow-y: auto;
-}
-
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-
-.oo-ui-fieldLayout {
-  margin-bottom: 1em;
-}
-
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
-}
-
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-  display: table;
-  content: " ";
-}
-
-.oo-ui-fieldLayout:after {
-  clear: both;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labeledElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-  display: block;
-  float: left;
-  width: 35%;
-  padding-top: 0.5em;
-  margin-right: 5%;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  display: block;
-  float: left;
-  width: 60%;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-  text-align: right;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labeledElement-label {
-  display: inline-block;
-  padding: 0.75em 0.5em 0.5em 0.5em;
-  vertical-align: middle;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  display: inline-block;
-  padding: 0.5em 0;
-  vertical-align: middle;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labeledElement-label {
-  padding: 0.5em 0;
-}
-
-.oo-ui-fieldsetLayout {
-  position: relative;
-  padding: 0;
-  margin: 0;
-}
-
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-  margin-top: 2em;
-}
-
-.oo-ui-fieldsetLayout-labeled {
-  margin-top: -0.75em;
-}
-
-.oo-ui-fieldsetLayout > .oo-ui-labeledElement-label {
-  padding: 0.25em 0;
-  margin-bottom: 0.5em;
-}
-
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-labeledElement-label {
-  padding-left: 1.75em;
-  line-height: 1.33em;
-}
-
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0.25em;
-  left: 0;
-  display: block;
-  width: 2em;
-  height: 2em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-gridLayout {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-
-.oo-ui-labelWidget {
-  padding: 0.5em 0;
-}
-
-.oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-  display: none;
-}
-
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-  position: relative;
-  display: block;
-}
-
-.oo-ui-barToolGroup > .oo-ui-iconedElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labeledElement-label {
-  display: none;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool {
-  position: relative;
-  display: inline-block;
-  vertical-align: top;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  display: block;
-  height: 1.5em;
-  padding: 0.25em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  display: block;
-  width: 1.5em;
-  height: 1.5em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: none;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-  cursor: pointer;
-}
-
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  display: block;
-  padding-right: 0.5em;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-  min-width: 8em;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool {
-  display: block;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  display: block;
-  padding: 0.25em 1em 0.25em 0.25em;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-image: none;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-image: /* @embed */ url(images/icons/check.png);
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-popupToolGroup {
-  position: relative;
-  height: 2em;
-  min-width: 2.5em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement {
-  min-width: 3.5em;
-}
-
-.oo-ui-popupToolGroup-handle {
-  display: block;
-  cursor: pointer;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0;
-  width: 2em;
-  height: 2em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator {
-  right: 0;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  left: 0.25em;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin: 0 1em;
-  font-size: 0.8em;
-  line-height: 2.6em;
-}
-
-.oo-ui-popupToolGroup-header {
-  margin: 0 0.6em;
-  font-size: 0.8em;
-  font-weight: bold;
-  line-height: 2.6em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-  cursor: default;
-}
-
-.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin-left: 3em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin-right: 2.25em;
-}
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  position: absolute;
-  top: 2em;
-  left: -1px;
-  z-index: 4;
-  display: none;
-}
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-  display: block;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  display: inline-block;
-  width: 2em;
-  height: 2em;
-  margin-right: 0.25em;
-  vertical-align: middle;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: inline-block;
-  font-size: 0.8em;
-  line-height: 2em;
-  vertical-align: middle;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-
-.oo-ui-popupTool .oo-ui-popupWidget {
-  margin-left: 1.25em;
-  font-size: 0.8em;
-}
-
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-tail {
-  z-index: 4;
-}
-
-.oo-ui-iconWidget {
-  display: inline-block;
-  width: 1.9em;
-  height: 1.9em;
-  line-height: 2.5em;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  opacity: 0.8;
-}
-
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-
-.oo-ui-indicatorWidget {
-  display: inline-block;
-  width: 1.9em;
-  height: 1.9em;
-  line-height: 2.5em;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  opacity: 0.8;
-}
-
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-
-.oo-ui-selectWidget {
-  padding: 0;
-  margin: 0;
-  list-style: none;
-}
-
-.oo-ui-optionWidget {
-  position: relative;
-  display: block;
-  margin: 0;
-  list-style: none;
-  cursor: pointer;
-  border: none;
-}
-
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-
-.oo-ui-optionWidget .oo-ui-labeledElement-label {
-  display: block;
-  overflow: hidden;
-  line-height: 1.5em;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.oo-ui-optionWidget .oo-ui-iconedElement-icon,
-.oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
-  position: absolute;
-  top: 50%;
-  width: 2em;
-  height: 2em;
-  margin-top: -1em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-optionWidget .oo-ui-iconedElement-icon {
-  left: 0.5em;
-}
-
-.oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
-  right: 0.5em;
-}
-
-.oo-ui-menuWidget {
-  position: absolute;
-}
-
-.oo-ui-menuWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
-
-.oo-ui-popupWidget-popup {
-  position: absolute;
-  overflow: hidden;
-}
-
-.oo-ui-popupWidget-tail {
-  display: none;
-}
-
-.oo-ui-popupWidget-tailed .oo-ui-popupWidget-popup {
-  margin-top: 7px;
-}
-
-.oo-ui-popupWidget-tailed .oo-ui-popupWidget-tail {
-  position: absolute;
-  display: block;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupWidget-head {
-  height: 2.5em;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  float: right;
-  margin: 0.25em;
-}
-
-.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
-  float: left;
-  margin: 0.75em 1em;
-  cursor: default;
-}
-
-.oo-ui-popupWidget-body {
-  clear: both;
-}
-
-.oo-ui-buttonGroupWidget {
-  border-radius: 0.3em;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  margin-bottom: -1px;
-  margin-left: -1px;
-  border-radius: 0;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
-  margin-left: 0;
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
-  border-top-right-radius: 0.3em;
-  border-bottom-right-radius: 0.3em;
-}
-
-.oo-ui-buttonOptionWidget {
-  display: inline-block;
-  background-color: transparent;
-}
-
-.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
-  position: relative;
-  height: 1.9em;
-}
-
-.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
-  position: static;
-  display: inline-block;
-  height: 1.9em;
-  margin-top: 0;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonSelectWidget {
-  display: inline-block;
-  white-space: nowrap;
-}
-
-.oo-ui-buttonWidget {
-  display: inline-block;
-  vertical-align: middle;
-}
-
-.oo-ui-inlineMenuWidget {
-  position: relative;
-  display: inline-block;
-  min-width: 20em;
-  margin: 0.25em 0;
-}
-
-.oo-ui-inlineMenuWidget-handle {
-  display: inline-block;
-  width: 100%;
-  height: 2.5em;
-  cursor: pointer;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0;
-  width: 2.5em;
-  height: 2.5em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator {
-  right: 0;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  left: 0.25em;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin: 0 0.5em;
-  line-height: 2.5em;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin-left: 3em;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin-right: 2em;
-}
-
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-  z-index: 1;
-  width: 100%;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  cursor: default;
-}
-
-.oo-ui-menuItemWidget {
-  position: relative;
-}
-
-.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
-  display: none;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
-  display: block;
-}
-
-.oo-ui-menuSectionItemWidget {
-  cursor: default;
-}
-
-.oo-ui-outlineControlsWidget {
-  height: 3em;
-}
-
-.oo-ui-outlineControlsWidget-adders,
-.oo-ui-outlineControlsWidget-movers {
-  float: left;
-  height: 2em;
-  padding: 0;
-  margin: 0.5em;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
-  float: left;
-  width: 1.5em;
-  height: 2em;
-  margin: 0.5em 0 0.5em 0.5em;
-  background-position: right center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-outlineControlsWidget-adders {
-  float: left;
-  margin-left: 0;
-}
-
-.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget {
-  float: left;
-}
-
-.oo-ui-outlineControlsWidget-movers {
-  float: right;
-}
-
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-  float: right;
-}
-
-.oo-ui-outlineItemWidget {
-  position: relative;
-  padding: 0.75em;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-popupButtonWidget {
-  position: relative;
-}
-
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
-  left: 1em;
-  cursor: auto;
-}
-
-.oo-ui-searchWidget-query {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  height: 4em;
-  padding: 0 1em;
-}
-
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  width: 100%;
-  margin: 0.75em 0;
-}
-
-.oo-ui-searchWidget-results {
-  position: absolute;
-  top: 4em;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: 1em;
-  overflow-x: hidden;
-  overflow-y: auto;
-  line-height: 0;
-}
-
-.oo-ui-textInputWidget {
-  position: relative;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  resize: none;
-}
-
-.oo-ui-textInputWidget-icon {
-  position: absolute;
-  top: 0;
-  left: 0;
-  height: 100%;
-  background-position: right center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-toggleSwitchWidget {
-  position: relative;
-  display: inline-block;
-  width: 4em;
-  height: 2em;
-  overflow: hidden;
-  vertical-align: middle;
-  cursor: pointer;
-  -webkit-transform: translateZ(0);
-     -moz-transform: translateZ(0);
-      -ms-transform: translateZ(0);
-       -o-transform: translateZ(0);
-          transform: translateZ(0);
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-
-.oo-ui-toggleSwitchWidget-grip {
-  position: absolute;
-  top: 0.25em;
-  left: 0.25em;
-  display: block;
-  width: 1.5em;
-  height: 1.5em;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-     -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-      -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-       -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-          transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-}
-
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  -webkit-transition: opacity 200ms ease-in-out;
-     -moz-transition: opacity 200ms ease-in-out;
-      -ms-transition: opacity 200ms ease-in-out;
-       -o-transition: opacity 200ms ease-in-out;
-          transition: opacity 200ms ease-in-out;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-  left: 2.25em;
-  margin-left: -2px;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-  left: 0.25em;
-  margin-left: 0;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: none;
-}
-
-/* Icons */
-
-.oo-ui-icon-add-item {
-  background-image: /* @embed */ url(images/icons/add-item.png);
-}
-
-.oo-ui-icon-advanced {
-  background-image: /* @embed */ url(images/icons/advanced.png);
-}
-
-.oo-ui-icon-alert {
-  background-image: /* @embed */ url(images/icons/alert.png);
-}
-
-.oo-ui-icon-check {
-  background-image: /* @embed */ url(images/icons/check.png);
-}
-
-.oo-ui-icon-clear {
-  background-image: /* @embed */ url(images/icons/clear.png);
-}
-
-.oo-ui-icon-close {
-  background-image: /* @embed */ url(images/icons/close.png);
-}
-
-.oo-ui-icon-code {
-  background-image: /* @embed */ url(images/icons/code.png);
-}
-
-.oo-ui-icon-collapse {
-  background-image: /* @embed */ url(images/icons/collapse.png);
-}
-
-.oo-ui-icon-comment {
-  background-image: /* @embed */ url(images/icons/comment.png);
-}
-
-.oo-ui-icon-expand {
-  background-image: /* @embed */ url(images/icons/expand.png);
-}
-
-.oo-ui-icon-help {
-  background-image: /* @embed */ url(images/icons/help.png);
-}
-
-.oo-ui-icon-info {
-  background-image: /* @embed */ url(images/icons/info.png);
-}
-
-.oo-ui-icon-link {
-  background-image: /* @embed */ url(images/icons/link.png);
-}
-
-.oo-ui-icon-menu {
-  background-image: /* @embed */ url(images/icons/menu.png);
-}
-
-.oo-ui-icon-next {
-  background-image: /* @embed */ url(images/icons/move-ltr.png);
-}
-
-.oo-ui-icon-picture {
-  background-image: /* @embed */ url(images/icons/picture.png);
-}
-
-.oo-ui-icon-previous {
-  background-image: /* @embed */ url(images/icons/move-rtl.png);
-}
-
-.oo-ui-icon-redo {
-  background-image: /* @embed */ url(images/icons/arched-arrow-ltr.png);
-}
-
-.oo-ui-icon-remove {
-  background-image: /* @embed */ url(images/icons/remove.png);
-}
-
-.oo-ui-icon-search {
-  background-image: /* @embed */ url(images/icons/search.png);
-}
-
-.oo-ui-icon-settings {
-  background-image: /* @embed */ url(images/icons/settings.png);
-}
-
-.oo-ui-icon-tag {
-  background-image: /* @embed */ url(images/icons/tag.png);
-}
-
-.oo-ui-icon-undo {
-  background-image: /* @embed */ url(images/icons/arched-arrow-rtl.png);
-}
-
-.oo-ui-icon-window {
-  background-image: /* @embed */ url(images/icons/window.png);
-}
-
-/* Indicators */
-
-.oo-ui-indicator-alert {
-  background-image: /* @embed */ url(images/indicators/alert.png);
-}
-
-.oo-ui-indicator-down {
-  background-image: /* @embed */ url(images/indicators/down.png);
-}
-
-.oo-ui-indicator-required {
-  background-image: /* @embed */ url(images/indicators/required.png);
-}
-
-.oo-ui-indicator-up {
-  background-image: /* @embed */ url(images/indicators/up.png);
-}
\ No newline at end of file
index 6f63575..f98f3f3 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (0e50d2e336)
+ * OOjs UI v0.1.0-pre (837b2f733e)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-08-06T12:56:55Z
+ * Date: 2014-10-11T01:05:29Z
  */
 ( function ( OO ) {
 
@@ -188,6 +188,90 @@ OO.ui.getLocalValue = function ( obj, lang, fallback ) {
 
 } )();
 
+/**
+ * Element that can be marked as pending.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.PendingElement = function OoUiPendingElement( config ) {
+       // Config initialisation
+       config = config || {};
+
+       // Properties
+       this.pending = 0;
+       this.$pending = null;
+
+       // Initialisation
+       this.setPendingElement( config.$pending || this.$element );
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.PendingElement );
+
+/* Methods */
+
+/**
+ * Set the pending element (and clean up any existing one).
+ *
+ * @param {jQuery} $pending The element to set to pending.
+ */
+OO.ui.PendingElement.prototype.setPendingElement = function ( $pending ) {
+       if ( this.$pending ) {
+               this.$pending.removeClass( 'oo-ui-pendingElement-pending' );
+       }
+
+       this.$pending = $pending;
+       if ( this.pending > 0 ) {
+               this.$pending.addClass( 'oo-ui-pendingElement-pending' );
+       }
+};
+
+/**
+ * Check if input is pending.
+ *
+ * @return {boolean}
+ */
+OO.ui.PendingElement.prototype.isPending = function () {
+       return !!this.pending;
+};
+
+/**
+ * Increase the pending stack.
+ *
+ * @chainable
+ */
+OO.ui.PendingElement.prototype.pushPending = function () {
+       if ( this.pending === 0 ) {
+               this.$pending.addClass( 'oo-ui-pendingElement-pending' );
+               this.updateThemeClasses();
+       }
+       this.pending++;
+
+       return this;
+};
+
+/**
+ * Reduce the pending stack.
+ *
+ * Clamped at zero.
+ *
+ * @chainable
+ */
+OO.ui.PendingElement.prototype.popPending = function () {
+       if ( this.pending === 1 ) {
+               this.$pending.removeClass( 'oo-ui-pendingElement-pending' );
+               this.updateThemeClasses();
+       }
+       this.pending = Math.max( 0, this.pending - 1 );
+
+       return this;
+};
+
 /**
  * List of actions.
  *
@@ -617,6 +701,10 @@ OO.ui.Element = function OoUiElement( config ) {
        this.$ = config.$ || OO.ui.Element.getJQuery( document );
        this.$element = this.$( this.$.context.createElement( this.getTagName() ) );
        this.elementGroup = null;
+       this.debouncedUpdateThemeClassesHandler = OO.ui.bind(
+               this.debouncedUpdateThemeClasses, this
+       );
+       this.updateThemeClassesPending = false;
 
        // Initialization
        if ( $.isArray( config.classes ) ) {
@@ -654,18 +742,19 @@ OO.ui.Element.static.tagName = 'div';
  *
  * @static
  * @param {jQuery|HTMLElement|HTMLDocument|Window} context Context to bind the function to
- * @param {OO.ui.Frame} [frame] Frame of the document context
+ * @param {jQuery} [$iframe] HTML iframe element that contains the document, omit if document is
+ *   not in an iframe
  * @return {Function} Bound jQuery function
  */
-OO.ui.Element.getJQuery = function ( context, frame ) {
+OO.ui.Element.getJQuery = function ( context, $iframe ) {
        function wrapper( selector ) {
                return $( selector, wrapper.context );
        }
 
        wrapper.context = this.getDocument( context );
 
-       if ( frame ) {
-               wrapper.frame = frame;
+       if ( $iframe ) {
+               wrapper.$iframe = $iframe;
        }
 
        return wrapper;
@@ -868,7 +957,7 @@ OO.ui.Element.getDimensions = function ( el ) {
  * @static
  * @param {HTMLElement} el Element to find scrollable container for
  * @param {string} [dimension] Dimension of scrolling to look for; `x`, `y` or omit for either
- * @return {HTMLElement|Window} Closest scrollable container
+ * @return {HTMLElement} Closest scrollable container
  */
 OO.ui.Element.getClosestScrollableContainer = function ( el, dimension ) {
        var i, val,
@@ -966,8 +1055,59 @@ OO.ui.Element.scrollIntoView = function ( el, config ) {
        }
 };
 
+/**
+ * Bind a handler for an event on a DOM element.
+ *
+ * Used to be for working around a jQuery bug (jqbug.com/14180),
+ * but obsolete as of jQuery 1.11.0.
+ *
+ * @static
+ * @deprecated Use jQuery#on instead.
+ * @param {HTMLElement|jQuery} el DOM element
+ * @param {string} event Event to bind
+ * @param {Function} callback Callback to call when the event fires
+ */
+OO.ui.Element.onDOMEvent = function ( el, event, callback ) {
+       $( el ).on( event, callback );
+};
+
+/**
+ * Unbind a handler bound with #static-method-onDOMEvent.
+ *
+ * @deprecated Use jQuery#off instead.
+ * @static
+ * @param {HTMLElement|jQuery} el DOM element
+ * @param {string} event Event to unbind
+ * @param {Function} [callback] Callback to unbind
+ */
+OO.ui.Element.offDOMEvent = function ( el, event, callback ) {
+       $( el ).off( event, callback );
+};
+
 /* Methods */
 
+/**
+ * Update the theme-provided classes.
+ *
+ * @localdoc This is called in element mixins and widget classes anytime state changes.
+ *   Updating is debounced, minimizing overhead of changing multiple attributes and
+ *   guaranteeing that theme updates do not occur within an element's constructor
+ */
+OO.ui.Element.prototype.updateThemeClasses = function () {
+       if ( !this.updateThemeClassesPending ) {
+               this.updateThemeClassesPending = true;
+               setTimeout( this.debouncedUpdateThemeClassesHandler );
+       }
+};
+
+/**
+ * @private
+ */
+OO.ui.Element.prototype.debouncedUpdateThemeClasses = function () {
+       OO.ui.theme.updateElementClasses( this );
+       this.updateThemeClassesPending = false;
+};
+
 /**
  * Get the HTML tag name.
  *
@@ -1063,404 +1203,127 @@ OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
        OO.ui.Element.offDOMEvent( this.$element, event, callback );
 };
 
-( function () {
-       /**
-        * Bind a handler for an event on a DOM element.
-        *
-        * Used to be for working around a jQuery bug (jqbug.com/14180),
-        * but obsolete as of jQuery 1.11.0.
-        *
-        * @static
-        * @deprecated Use jQuery#on instead.
-        * @param {HTMLElement|jQuery} el DOM element
-        * @param {string} event Event to bind
-        * @param {Function} callback Callback to call when the event fires
-        */
-       OO.ui.Element.onDOMEvent = function ( el, event, callback ) {
-               $( el ).on( event, callback );
-       };
+/**
+ * Container for elements.
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.Layout = function OoUiLayout( config ) {
+       // Initialize config
+       config = config || {};
 
-       /**
-        * Unbind a handler bound with #static-method-onDOMEvent.
-        *
-        * @deprecated Use jQuery#off instead.
-        * @static
-        * @param {HTMLElement|jQuery} el DOM element
-        * @param {string} event Event to unbind
-        * @param {Function} [callback] Callback to unbind
-        */
-       OO.ui.Element.offDOMEvent = function ( el, event, callback ) {
-               $( el ).off( event, callback );
-       };
-}() );
+       // Parent constructor
+       OO.ui.Layout.super.call( this, config );
+
+       // Mixin constructors
+       OO.EventEmitter.call( this );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-layout' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.Layout, OO.ui.Element );
+OO.mixinClass( OO.ui.Layout, OO.EventEmitter );
 
 /**
- * Embedded iframe with the same styles as its parent.
+ * User interface control.
  *
+ * @abstract
  * @class
  * @extends OO.ui.Element
  * @mixins OO.EventEmitter
  *
  * @constructor
  * @param {Object} [config] Configuration options
+ * @cfg {boolean} [disabled=false] Disable
  */
-OO.ui.Frame = function OoUiFrame( config ) {
+OO.ui.Widget = function OoUiWidget( config ) {
+       // Initialize config
+       config = $.extend( { disabled: false }, config );
+
        // Parent constructor
-       OO.ui.Frame.super.call( this, config );
+       OO.ui.Widget.super.call( this, config );
 
        // Mixin constructors
        OO.EventEmitter.call( this );
 
        // Properties
-       this.loading = null;
-       this.config = config;
-       this.dir = null;
-
-       // Initialize
-       this.$element
-               .addClass( 'oo-ui-frame' )
-               .attr( { frameborder: 0, scrolling: 'no' } );
+       this.visible = true;
+       this.disabled = null;
+       this.wasDisabled = null;
 
+       // Initialization
+       this.$element.addClass( 'oo-ui-widget' );
+       this.setDisabled( !!config.disabled );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.Frame, OO.ui.Element );
-OO.mixinClass( OO.ui.Frame, OO.EventEmitter );
+OO.inheritClass( OO.ui.Widget, OO.ui.Element );
+OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
 
-/* Static Properties */
+/* Events */
 
 /**
- * @static
- * @inheritdoc
+ * @event disable
+ * @param {boolean} disabled Widget is disabled
  */
-OO.ui.Frame.static.tagName = 'iframe';
-
-/* Events */
 
 /**
- * @event load
+ * @event toggle
+ * @param {boolean} visible Widget is visible
  */
 
-/* Static Methods */
+/* Methods */
 
 /**
- * Transplant the CSS styles from as parent document to a frame's document.
+ * Check if the widget is disabled.
  *
- * This loops over the style sheets in the parent document, and copies their nodes to the
- * frame's document. It then polls the document to see when all styles have loaded, and once they
- * have, resolves the promise.
+ * @param {boolean} Button is disabled
+ */
+OO.ui.Widget.prototype.isDisabled = function () {
+       return this.disabled;
+};
+
+/**
+ * Check if widget is visible.
  *
- * If the styles still haven't loaded after a long time (5 seconds by default), we give up waiting
- * and resolve the promise anyway. This protects against cases like a display: none; iframe in
- * Firefox, where the styles won't load until the iframe becomes visible.
+ * @return {boolean} Widget is visible
+ */
+OO.ui.Widget.prototype.isVisible = function () {
+       return this.visible;
+};
+
+/**
+ * Set the disabled state of the widget.
  *
- * For details of how we arrived at the strategy used in this function, see #load.
+ * This should probably change the widgets' appearance and prevent it from being used.
  *
- * @static
- * @inheritable
- * @param {HTMLDocument} parentDoc Document to transplant styles from
- * @param {HTMLDocument} frameDoc Document to transplant styles to
- * @param {number} [timeout=5000] How long to wait before giving up (in ms). If 0, never give up.
- * @return {jQuery.Promise} Promise resolved when styles have loaded
+ * @param {boolean} disabled Disable widget
+ * @chainable
  */
-OO.ui.Frame.static.transplantStyles = function ( parentDoc, frameDoc, timeout ) {
-       var i, numSheets, styleNode, newNode, timeoutID, pollNodeId, $pendingPollNodes,
-               $pollNodes = $( [] ),
-               // Fake font-family value
-               fontFamily = 'oo-ui-frame-transplantStyles-loaded',
-               deferred = $.Deferred();
-
-       for ( i = 0, numSheets = parentDoc.styleSheets.length; i < numSheets; i++ ) {
-               styleNode = parentDoc.styleSheets[i].ownerNode;
-               if ( styleNode.disabled ) {
-                       continue;
-               }
-               if ( styleNode.nodeName.toLowerCase() === 'link' ) {
-                       // External stylesheet
-                       // Create a node with a unique ID that we're going to monitor to see when the CSS
-                       // has loaded
-                       pollNodeId = 'oo-ui-frame-transplantStyles-loaded-' + i;
-                       $pollNodes = $pollNodes.add( $( '<div>', frameDoc )
-                               .attr( 'id', pollNodeId )
-                               .appendTo( frameDoc.body )
-                       );
-
-                       // Add <style>@import url(...); #pollNodeId { font-family: ... }</style>
-                       // The font-family rule will only take effect once the @import finishes
-                       newNode = frameDoc.createElement( 'style' );
-                       newNode.textContent = '@import url(' + styleNode.href + ');\n' +
-                               '#' + pollNodeId + ' { font-family: ' + fontFamily + '; }';
-               } else {
-                       // Not an external stylesheet, or no polling required; just copy the node over
-                       newNode = frameDoc.importNode( styleNode, true );
-               }
-               frameDoc.head.appendChild( newNode );
-       }
-
-       // Poll every 100ms until all external stylesheets have loaded
-       $pendingPollNodes = $pollNodes;
-       timeoutID = setTimeout( function pollExternalStylesheets() {
-               while (
-                       $pendingPollNodes.length > 0 &&
-                       $pendingPollNodes.eq( 0 ).css( 'font-family' ) === fontFamily
-               ) {
-                       $pendingPollNodes = $pendingPollNodes.slice( 1 );
-               }
+OO.ui.Widget.prototype.setDisabled = function ( disabled ) {
+       var isDisabled;
 
-               if ( $pendingPollNodes.length === 0 ) {
-                       // We're done!
-                       if ( timeoutID !== null ) {
-                               timeoutID = null;
-                               $pollNodes.remove();
-                               deferred.resolve();
-                       }
-               } else {
-                       timeoutID = setTimeout( pollExternalStylesheets, 100 );
-               }
-       }, 100 );
-       // ...but give up after a while
-       if ( timeout !== 0 ) {
-               setTimeout( function () {
-                       if ( timeoutID ) {
-                               clearTimeout( timeoutID );
-                               timeoutID = null;
-                               $pollNodes.remove();
-                               deferred.reject();
-                       }
-               }, timeout || 5000 );
+       this.disabled = !!disabled;
+       isDisabled = this.isDisabled();
+       if ( isDisabled !== this.wasDisabled ) {
+               this.$element.toggleClass( 'oo-ui-widget-disabled', isDisabled );
+               this.$element.toggleClass( 'oo-ui-widget-enabled', !isDisabled );
+               this.emit( 'disable', isDisabled );
+               this.updateThemeClasses();
        }
+       this.wasDisabled = isDisabled;
 
-       return deferred.promise();
-};
-
-/* Methods */
-
-/**
- * Load the frame contents.
- *
- * Once the iframe's stylesheets are loaded, the `load` event will be emitted and the returned
- * promise will be resolved. Calling while loading will return a promise but not trigger a new
- * loading cycle. Calling after loading is complete will return a promise that's already been
- * resolved.
- *
- * Sounds simple right? Read on...
- *
- * When you create a dynamic iframe using open/write/close, the window.load event for the
- * iframe is triggered when you call close, and there's no further load event to indicate that
- * everything is actually loaded.
- *
- * In Chrome, stylesheets don't show up in document.styleSheets until they have loaded, so we could
- * just poll that array and wait for it to have the right length. However, in Firefox, stylesheets
- * are added to document.styleSheets immediately, and the only way you can determine whether they've
- * loaded is to attempt to access .cssRules and wait for that to stop throwing an exception. But
- * cross-domain stylesheets never allow .cssRules to be accessed even after they have loaded.
- *
- * The workaround is to change all `<link href="...">` tags to `<style>@import url(...)</style>` tags.
- * Because `@import` is blocking, Chrome won't add the stylesheet to document.styleSheets until
- * the `@import` has finished, and Firefox won't allow .cssRules to be accessed until the `@import`
- * has finished. And because the contents of the `<style>` tag are from the same origin, accessing
- * .cssRules is allowed.
- *
- * However, now that we control the styles we're injecting, we might as well do away with
- * browser-specific polling hacks like document.styleSheets and .cssRules, and instead inject
- * `<style>@import url(...); #foo { font-family: someValue; }</style>`, then create `<div id="foo">`
- * and wait for its font-family to change to someValue. Because `@import` is blocking, the font-family
- * rule is not applied until after the `@import` finishes.
- *
- * All this stylesheet injection and polling magic is in #transplantStyles.
- *
- * @return {jQuery.Promise} Promise resolved when loading is complete
- * @fires load
- */
-OO.ui.Frame.prototype.load = function () {
-       var win, doc,
-               frame = this;
-
-       // Return existing promise if already loading or loaded
-       if ( this.loading ) {
-               return this.loading.promise();
-       }
-
-       // Load the frame
-       this.loading = $.Deferred();
-
-       win = this.$element.prop( 'contentWindow' );
-       doc = win.document;
-
-       // Cache directionality
-       this.dir = OO.ui.Element.getDir( this.$element ) || 'ltr';
-
-       // Initialize contents
-       doc.open();
-       // The following classes can be used here:
-       // oo-ui-ltr
-       // oo-ui-rtl
-       doc.write(
-               '<!doctype html>' +
-               '<html>' +
-                       '<body class="oo-ui-frame-content oo-ui-' + this.getDir() + '" dir="' + this.getDir() + '">' +
-                       '</body>' +
-               '</html>'
-       );
-       doc.close();
-
-       // Properties
-       this.$ = OO.ui.Element.getJQuery( doc, this );
-       this.$content = this.$( '.oo-ui-frame-content' ).attr( 'tabIndex', 0 );
-       this.$document = this.$( doc );
-
-       // Initialization
-       this.constructor.static.transplantStyles( this.getElementDocument(), this.$document[0] )
-               .always( function () {
-                       frame.emit( 'load' );
-                       frame.loading.resolve();
-               } );
-
-       return this.loading.promise();
-};
-
-/**
- * Set the size of the frame.
- *
- * @param {number} width Frame width in pixels
- * @param {number} height Frame height in pixels
- * @chainable
- */
-OO.ui.Frame.prototype.setSize = function ( width, height ) {
-       this.$element.css( { width: width, height: height } );
-       return this;
-};
-
-/**
- * Get the directionality of the frame
- *
- * @return {string} Directionality, 'ltr' or 'rtl'
- */
-OO.ui.Frame.prototype.getDir = function () {
-       return this.dir;
-};
-
-/**
- * Container for elements.
- *
- * @abstract
- * @class
- * @extends OO.ui.Element
- * @mixins OO.EventEmitter
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.Layout = function OoUiLayout( config ) {
-       // Initialize config
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.Layout.super.call( this, config );
-
-       // Mixin constructors
-       OO.EventEmitter.call( this );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-layout' );
-};
-
-/* Setup */
-
-OO.inheritClass( OO.ui.Layout, OO.ui.Element );
-OO.mixinClass( OO.ui.Layout, OO.EventEmitter );
-
-/**
- * User interface control.
- *
- * @abstract
- * @class
- * @extends OO.ui.Element
- * @mixins OO.EventEmitter
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {boolean} [disabled=false] Disable
- */
-OO.ui.Widget = function OoUiWidget( config ) {
-       // Initialize config
-       config = $.extend( { disabled: false }, config );
-
-       // Parent constructor
-       OO.ui.Widget.super.call( this, config );
-
-       // Mixin constructors
-       OO.EventEmitter.call( this );
-
-       // Properties
-       this.visible = true;
-       this.disabled = null;
-       this.wasDisabled = null;
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-widget' );
-       this.setDisabled( !!config.disabled );
-};
-
-/* Setup */
-
-OO.inheritClass( OO.ui.Widget, OO.ui.Element );
-OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
-
-/* Events */
-
-/**
- * @event disable
- * @param {boolean} disabled Widget is disabled
- */
-
-/**
- * @event toggle
- * @param {boolean} visible Widget is visible
- */
-
-/* Methods */
-
-/**
- * Check if the widget is disabled.
- *
- * @param {boolean} Button is disabled
- */
-OO.ui.Widget.prototype.isDisabled = function () {
-       return this.disabled;
-};
-
-/**
- * Check if widget is visible.
- *
- * @return {boolean} Widget is visible
- */
-OO.ui.Widget.prototype.isVisible = function () {
-       return this.visible;
-};
-
-/**
- * Set the disabled state of the widget.
- *
- * This should probably change the widgets' appearance and prevent it from being used.
- *
- * @param {boolean} disabled Disable widget
- * @chainable
- */
-OO.ui.Widget.prototype.setDisabled = function ( disabled ) {
-       var isDisabled;
-
-       this.disabled = !!disabled;
-       isDisabled = this.isDisabled();
-       if ( isDisabled !== this.wasDisabled ) {
-               this.$element.toggleClass( 'oo-ui-widget-disabled', isDisabled );
-               this.$element.toggleClass( 'oo-ui-widget-enabled', !isDisabled );
-               this.emit( 'disable', isDisabled );
-       }
-       this.wasDisabled = isDisabled;
-
-       return this;
+       return this;
 };
 
 /**
@@ -1528,15 +1391,12 @@ OO.ui.Widget.prototype.updateDisabled = function () {
  * If the requested size is not recognized, the window manager will choose a sensible fallback.
  *
  * @constructor
- * @param {OO.ui.WindowManager} manager Manager of window
  * @param {Object} [config] Configuration options
  * @cfg {string} [size] Symbolic name of dialog size, `small`, `medium`, `large` or `full`; omit to
  *   use #static-size
  * @fires initialize
  */
-OO.ui.Window = function OoUiWindow( manager, config ) {
-       var win = this;
-
+OO.ui.Window = function OoUiWindow( config ) {
        // Configuration initialization
        config = config || {};
 
@@ -1546,46 +1406,27 @@ OO.ui.Window = function OoUiWindow( manager, config ) {
        // Mixin constructors
        OO.EventEmitter.call( this );
 
-       if ( !( manager instanceof OO.ui.WindowManager ) ) {
-               throw new Error( 'Cannot construct window: window must have a manager' );
-       }
-
        // Properties
-       this.manager = manager;
+       this.manager = null;
        this.initialized = false;
        this.visible = false;
        this.opening = null;
        this.closing = null;
        this.opened = null;
        this.timing = null;
+       this.loading = null;
        this.size = config.size || this.constructor.static.size;
-       this.frame = new OO.ui.Frame( { $: this.$ } );
        this.$frame = this.$( '<div>' );
-       this.$ = function () {
-               throw new Error( 'this.$() cannot be used until the frame has been initialized.' );
-       };
+       this.$overlay = this.$( '<div>' );
 
        // Initialization
        this.$element
                .addClass( 'oo-ui-window' )
-               // Hide the window using visibility: hidden; while the iframe is still loading
-               // Can't use display: none; because that prevents the iframe from loading in Firefox
-               .css( 'visibility', 'hidden' )
-               .append( this.$frame );
-       this.$frame
-               .addClass( 'oo-ui-window-frame' )
-               .append( this.frame.$element );
+               .append( this.$frame, this.$overlay );
+       this.$frame.addClass( 'oo-ui-window-frame' );
+       this.$overlay.addClass( 'oo-ui-window-overlay' );
 
-       // Events
-       this.frame.on( 'load', function () {
-               win.initialize();
-               win.initialized = true;
-               // Undo the visibility: hidden; hack and apply display: none;
-               // We can do this safely now that the iframe has initialized
-               // (don't do this from within #initialize because it has to happen
-               // after the all subclasses have been handled as well).
-               win.$element.hide().css( 'visibility', '' );
-       } );
+       // NOTE: Additional intitialization will occur when #setManager is called
 };
 
 /* Setup */
@@ -1593,13 +1434,6 @@ OO.ui.Window = function OoUiWindow( manager, config ) {
 OO.inheritClass( OO.ui.Window, OO.ui.Element );
 OO.mixinClass( OO.ui.Window, OO.EventEmitter );
 
-/* Events */
-
-/**
- * @event resize
- * @param {string} size Symbolic size name, e.g. 'small', 'medium', 'large', 'full'
- */
-
 /* Static Properties */
 
 /**
@@ -1613,38 +1447,180 @@ OO.mixinClass( OO.ui.Window, OO.EventEmitter );
  */
 OO.ui.Window.static.size = 'medium';
 
-/* Methods */
+/* Static Methods */
 
 /**
- * Check if window has been initialized.
+ * Transplant the CSS styles from as parent document to a frame's document.
  *
- * @return {boolean} Window has been initialized
- */
-OO.ui.Window.prototype.isInitialized = function () {
-       return this.initialized;
-};
-
-/**
- * Check if window is visible.
+ * This loops over the style sheets in the parent document, and copies their nodes to the
+ * frame's document. It then polls the document to see when all styles have loaded, and once they
+ * have, resolves the promise.
  *
- * @return {boolean} Window is visible
- */
-OO.ui.Window.prototype.isVisible = function () {
-       return this.visible;
-};
-
-/**
- * Check if window is opening.
+ * If the styles still haven't loaded after a long time (5 seconds by default), we give up waiting
+ * and resolve the promise anyway. This protects against cases like a display: none; iframe in
+ * Firefox, where the styles won't load until the iframe becomes visible.
  *
- * This is a wrapper around OO.ui.WindowManager#isOpening.
+ * For details of how we arrived at the strategy used in this function, see #load.
  *
- * @return {boolean} Window is opening
+ * @static
+ * @inheritable
+ * @param {HTMLDocument} parentDoc Document to transplant styles from
+ * @param {HTMLDocument} frameDoc Document to transplant styles to
+ * @param {number} [timeout=5000] How long to wait before giving up (in ms). If 0, never give up.
+ * @return {jQuery.Promise} Promise resolved when styles have loaded
  */
-OO.ui.Window.prototype.isOpening = function () {
-       return this.manager.isOpening( this );
-};
+OO.ui.Window.static.transplantStyles = function ( parentDoc, frameDoc, timeout ) {
+       var i, numSheets, styleNode, styleText, newNode, timeoutID, pollNodeId, $pendingPollNodes,
+               $pollNodes = $( [] ),
+               // Fake font-family value
+               fontFamily = 'oo-ui-frame-transplantStyles-loaded',
+               nextIndex = parentDoc.oouiFrameTransplantStylesNextIndex || 0,
+               deferred = $.Deferred();
 
-/**
+       for ( i = 0, numSheets = parentDoc.styleSheets.length; i < numSheets; i++ ) {
+               styleNode = parentDoc.styleSheets[i].ownerNode;
+               if ( styleNode.disabled ) {
+                       continue;
+               }
+
+               if ( styleNode.nodeName.toLowerCase() === 'link' ) {
+                       // External stylesheet; use @import
+                       styleText = '@import url(' + styleNode.href + ');';
+               } else {
+                       // Internal stylesheet; just copy the text
+                       // For IE10 we need to fall back to .cssText, BUT that's undefined in
+                       // other browsers, so fall back to '' rather than 'undefined'
+                       styleText = styleNode.textContent || parentDoc.styleSheets[i].cssText || '';
+               }
+
+               // Create a node with a unique ID that we're going to monitor to see when the CSS
+               // has loaded
+               if ( styleNode.oouiFrameTransplantStylesId ) {
+                       // If we're nesting transplantStyles operations and this node already has
+                       // a CSS rule to wait for loading, reuse it
+                       pollNodeId = styleNode.oouiFrameTransplantStylesId;
+               } else {
+                       // Otherwise, create a new ID
+                       pollNodeId = 'oo-ui-frame-transplantStyles-loaded-' + nextIndex;
+                       nextIndex++;
+
+                       // Add #pollNodeId { font-family: ... } to the end of the stylesheet / after the @import
+                       // The font-family rule will only take effect once the @import finishes
+                       styleText += '\n' + '#' + pollNodeId + ' { font-family: ' + fontFamily + '; }';
+               }
+
+               // Create a node with id=pollNodeId
+               $pollNodes = $pollNodes.add( $( '<div>', frameDoc )
+                       .attr( 'id', pollNodeId )
+                       .appendTo( frameDoc.body )
+               );
+
+               // Add our modified CSS as a <style> tag
+               newNode = frameDoc.createElement( 'style' );
+               newNode.textContent = styleText;
+               newNode.oouiFrameTransplantStylesId = pollNodeId;
+               frameDoc.head.appendChild( newNode );
+       }
+       frameDoc.oouiFrameTransplantStylesNextIndex = nextIndex;
+
+       // Poll every 100ms until all external stylesheets have loaded
+       $pendingPollNodes = $pollNodes;
+       timeoutID = setTimeout( function pollExternalStylesheets() {
+               while (
+                       $pendingPollNodes.length > 0 &&
+                       $pendingPollNodes.eq( 0 ).css( 'font-family' ) === fontFamily
+               ) {
+                       $pendingPollNodes = $pendingPollNodes.slice( 1 );
+               }
+
+               if ( $pendingPollNodes.length === 0 ) {
+                       // We're done!
+                       if ( timeoutID !== null ) {
+                               timeoutID = null;
+                               $pollNodes.remove();
+                               deferred.resolve();
+                       }
+               } else {
+                       timeoutID = setTimeout( pollExternalStylesheets, 100 );
+               }
+       }, 100 );
+       // ...but give up after a while
+       if ( timeout !== 0 ) {
+               setTimeout( function () {
+                       if ( timeoutID ) {
+                               clearTimeout( timeoutID );
+                               timeoutID = null;
+                               $pollNodes.remove();
+                               deferred.reject();
+                       }
+               }, timeout || 5000 );
+       }
+
+       return deferred.promise();
+};
+
+/* Methods */
+
+/**
+ * Handle mouse down events.
+ *
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.Window.prototype.onMouseDown = function ( e ) {
+       // Prevent clicking on the click-block from stealing focus
+       if ( e.target === this.$element[0] ) {
+               return false;
+       }
+};
+
+/**
+ * Check if window has been initialized.
+ *
+ * @return {boolean} Window has been initialized
+ */
+OO.ui.Window.prototype.isInitialized = function () {
+       return this.initialized;
+};
+
+/**
+ * Check if window is visible.
+ *
+ * @return {boolean} Window is visible
+ */
+OO.ui.Window.prototype.isVisible = function () {
+       return this.visible;
+};
+
+/**
+ * Check if window is loading.
+ *
+ * @return {boolean} Window is loading
+ */
+OO.ui.Window.prototype.isLoading = function () {
+       return this.loading && this.loading.state() === 'pending';
+};
+
+/**
+ * Check if window is loaded.
+ *
+ * @return {boolean} Window is loaded
+ */
+OO.ui.Window.prototype.isLoaded = function () {
+       return this.loading && this.loading.state() === 'resolved';
+};
+
+/**
+ * Check if window is opening.
+ *
+ * This is a wrapper around OO.ui.WindowManager#isOpening.
+ *
+ * @return {boolean} Window is opening
+ */
+OO.ui.Window.prototype.isOpening = function () {
+       return this.manager.isOpening( this );
+};
+
+/**
  * Check if window is closing.
  *
  * This is a wrapper around OO.ui.WindowManager#isClosing.
@@ -1675,15 +1651,6 @@ OO.ui.Window.prototype.getManager = function () {
        return this.manager;
 };
 
-/**
- * Get the window frame.
- *
- * @return {OO.ui.Frame} Frame of window
- */
-OO.ui.Window.prototype.getFrame = function () {
-       return this.frame;
-};
-
 /**
  * Get the window size.
  *
@@ -1699,23 +1666,41 @@ OO.ui.Window.prototype.getSize = function () {
  * @return {number} Content height
  */
 OO.ui.Window.prototype.getContentHeight = function () {
+       // Temporarily resize the frame so getBodyHeight() can use scrollHeight measurements
+       var bodyHeight, oldHeight = this.$frame[0].style.height;
+       this.$frame[0].style.height = '1px';
+       bodyHeight = this.getBodyHeight();
+       this.$frame[0].style.height = oldHeight;
+
        return Math.round(
                // Add buffer for border
-               ( ( this.$frame.outerHeight() - this.$frame.innerHeight() ) * 2 ) +
-               // Height of contents
-               ( this.$head.outerHeight( true ) + this.getBodyHeight() + this.$foot.outerHeight( true ) )
+               ( this.$frame.outerHeight() - this.$frame.innerHeight() ) +
+               // Use combined heights of children
+               ( this.$head.outerHeight( true ) + bodyHeight + this.$foot.outerHeight( true ) )
        );
 };
 
 /**
  * Get the height of the dialog contents.
  *
+ * When this function is called, the dialog will temporarily have been resized
+ * to height=1px, so .scrollHeight measurements can be taken accurately.
+ *
  * @return {number} Height of content
  */
 OO.ui.Window.prototype.getBodyHeight = function () {
        return this.$body[0].scrollHeight;
 };
 
+/**
+ * Get the directionality of the frame
+ *
+ * @return {string} Directionality, 'ltr' or 'rtl'
+ */
+OO.ui.Window.prototype.getDir = function () {
+       return this.dir;
+};
+
 /**
  * Get a process for setting up a window for use.
  *
@@ -1784,6 +1769,76 @@ OO.ui.Window.prototype.getTeardownProcess = function () {
        return new OO.ui.Process();
 };
 
+/**
+ * Toggle visibility of window.
+ *
+ * If the window is isolated and hasn't fully loaded yet, the visiblity property will be used
+ * instead of display.
+ *
+ * @param {boolean} [show] Make window visible, omit to toggle visibility
+ * @fires visible
+ * @chainable
+ */
+OO.ui.Window.prototype.toggle = function ( show ) {
+       show = show === undefined ? !this.visible : !!show;
+
+       if ( show !== this.isVisible() ) {
+               this.visible = show;
+
+               if ( this.isolated && !this.isLoaded() ) {
+                       // Hide the window using visibility instead of display until loading is complete
+                       // Can't use display: none; because that prevents the iframe from loading in Firefox
+                       this.$element.css( 'visibility', show ? 'visible' : 'hidden' );
+               } else {
+                       this.$element.toggle( show ).css( 'visibility', '' );
+               }
+               this.emit( 'toggle', show );
+       }
+
+       return this;
+};
+
+/**
+ * Set the window manager.
+ *
+ * This must be called before initialize. Calling it more than once will cause an error.
+ *
+ * @param {OO.ui.WindowManager} manager Manager for this window
+ * @throws {Error} If called more than once
+ * @chainable
+ */
+OO.ui.Window.prototype.setManager = function ( manager ) {
+       if ( this.manager ) {
+               throw new Error( 'Cannot set window manager, window already has a manager' );
+       }
+
+       // Properties
+       this.manager = manager;
+       this.isolated = manager.shouldIsolate();
+
+       // Initialization
+       if ( this.isolated ) {
+               this.$iframe = this.$( '<iframe>' );
+               this.$iframe.attr( { frameborder: 0, scrolling: 'no' } );
+               this.$frame.append( this.$iframe );
+               this.$ = function () {
+                       throw new Error( 'this.$() cannot be used until the frame has been initialized.' );
+               };
+               // WARNING: Do not use this.$ again until #initialize is called
+       } else {
+               this.$content = this.$( '<div>' );
+               this.$document = $( this.getElementDocument() );
+               this.$content.addClass( 'oo-ui-window-content' );
+               this.$frame.append( this.$content );
+       }
+       this.toggle( false );
+
+       // Figure out directionality:
+       this.dir = OO.ui.Element.getDir( this.$iframe || this.$content ) || 'ltr';
+
+       return this;
+};
+
 /**
  * Set the window size.
  *
@@ -1833,24 +1888,27 @@ OO.ui.Window.prototype.setDimensions = function ( dim ) {
  *
  * Once this method is called, this.$ can be used to create elements within the frame.
  *
+ * @throws {Error} If not attached to a manager
  * @chainable
  */
 OO.ui.Window.prototype.initialize = function () {
+       if ( !this.manager ) {
+               throw new Error( 'Cannot initialize window, must be attached to a manager' );
+       }
+
        // Properties
-       this.$ = this.frame.$;
        this.$head = this.$( '<div>' );
        this.$body = this.$( '<div>' );
        this.$foot = this.$( '<div>' );
-       this.$overlay = this.$( '<div>' );
+
+       // Events
+       this.$element.on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) );
 
        // Initialization
        this.$head.addClass( 'oo-ui-window-head' );
        this.$body.addClass( 'oo-ui-window-body' );
        this.$foot.addClass( 'oo-ui-window-foot' );
-       this.$overlay.addClass( 'oo-ui-window-overlay' );
-       this.frame.$content
-               .addClass( 'oo-ui-window-content' )
-               .append( this.$head, this.$body, this.$foot, this.$overlay );
+       this.$content.append( this.$head, this.$body, this.$foot );
 
        return this;
 };
@@ -1882,18 +1940,6 @@ OO.ui.Window.prototype.close = function ( data ) {
        return this.manager.closeWindow( this, data );
 };
 
-/**
- * Load window.
- *
- * This is called by OO.ui.WindowManager durring window adding, and should not be called directly
- * by other systems.
- *
- * @return {jQuery.Promise} Promise resolved when window is loaded
- */
-OO.ui.Window.prototype.load = function () {
-       return this.frame.load();
-};
-
 /**
  * Setup window.
  *
@@ -1910,10 +1956,9 @@ OO.ui.Window.prototype.setup = function ( data ) {
        this.$element.show();
        this.visible = true;
        this.getSetupProcess( data ).execute().done( function () {
-               win.manager.updateWindowSize( win );
                // Force redraw by asking the browser to measure the elements' widths
                win.$element.addClass( 'oo-ui-window-setup' ).width();
-               win.frame.$content.addClass( 'oo-ui-window-content-setup' ).width();
+               win.$content.addClass( 'oo-ui-window-content-setup' ).width();
                deferred.resolve();
        } );
 
@@ -1933,11 +1978,11 @@ OO.ui.Window.prototype.ready = function ( data ) {
        var win = this,
                deferred = $.Deferred();
 
-       this.frame.$content[0].focus();
+       this.$content.focus();
        this.getReadyProcess( data ).execute().done( function () {
                // Force redraw by asking the browser to measure the elements' widths
                win.$element.addClass( 'oo-ui-window-ready' ).width();
-               win.frame.$content.addClass( 'oo-ui-window-content-ready' ).width();
+               win.$content.addClass( 'oo-ui-window-content-ready' ).width();
                deferred.resolve();
        } );
 
@@ -1958,13 +2003,17 @@ OO.ui.Window.prototype.hold = function ( data ) {
                deferred = $.Deferred();
 
        this.getHoldProcess( data ).execute().done( function () {
-               var $focused = win.frame.$content.find( ':focus' );
-               if ( $focused.length ) {
-                       $focused[0].blur();
+               // Get the focused element within the window's content
+               var $focus = win.$content.find( OO.ui.Element.getDocument( win.$content ).activeElement );
+
+               // Blur the focused element
+               if ( $focus.length ) {
+                       $focus[0].blur();
                }
+
                // Force redraw by asking the browser to measure the elements' widths
                win.$element.removeClass( 'oo-ui-window-ready' ).width();
-               win.frame.$content.removeClass( 'oo-ui-window-content-ready' ).width();
+               win.$content.removeClass( 'oo-ui-window-content-ready' ).width();
                deferred.resolve();
        } );
 
@@ -1987,7 +2036,7 @@ OO.ui.Window.prototype.teardown = function ( data ) {
        this.getTeardownProcess( data ).execute().done( function () {
                // Force redraw by asking the browser to measure the elements' widths
                win.$element.removeClass( 'oo-ui-window-setup' ).width();
-               win.frame.$content.removeClass( 'oo-ui-window-content-setup' ).width();
+               win.$content.removeClass( 'oo-ui-window-content-setup' ).width();
                win.$element.hide();
                win.visible = false;
                deferred.resolve();
@@ -1996,6 +2045,104 @@ OO.ui.Window.prototype.teardown = function ( data ) {
        return deferred.promise();
 };
 
+/**
+ * Load the frame contents.
+ *
+ * Once the iframe's stylesheets are loaded, the `load` event will be emitted and the returned
+ * promise will be resolved. Calling while loading will return a promise but not trigger a new
+ * loading cycle. Calling after loading is complete will return a promise that's already been
+ * resolved.
+ *
+ * Sounds simple right? Read on...
+ *
+ * When you create a dynamic iframe using open/write/close, the window.load event for the
+ * iframe is triggered when you call close, and there's no further load event to indicate that
+ * everything is actually loaded.
+ *
+ * In Chrome, stylesheets don't show up in document.styleSheets until they have loaded, so we could
+ * just poll that array and wait for it to have the right length. However, in Firefox, stylesheets
+ * are added to document.styleSheets immediately, and the only way you can determine whether they've
+ * loaded is to attempt to access .cssRules and wait for that to stop throwing an exception. But
+ * cross-domain stylesheets never allow .cssRules to be accessed even after they have loaded.
+ *
+ * The workaround is to change all `<link href="...">` tags to `<style>@import url(...)</style>`
+ * tags. Because `@import` is blocking, Chrome won't add the stylesheet to document.styleSheets
+ * until the `@import` has finished, and Firefox won't allow .cssRules to be accessed until the
+ * `@import` has finished. And because the contents of the `<style>` tag are from the same origin,
+ * accessing .cssRules is allowed.
+ *
+ * However, now that we control the styles we're injecting, we might as well do away with
+ * browser-specific polling hacks like document.styleSheets and .cssRules, and instead inject
+ * `<style>@import url(...); #foo { font-family: someValue; }</style>`, then create `<div id="foo">`
+ * and wait for its font-family to change to someValue. Because `@import` is blocking, the
+ * font-family rule is not applied until after the `@import` finishes.
+ *
+ * All this stylesheet injection and polling magic is in #transplantStyles.
+ *
+ * @return {jQuery.Promise} Promise resolved when loading is complete
+ * @fires load
+ */
+OO.ui.Window.prototype.load = function () {
+       var sub, doc, loading,
+               win = this;
+
+       // Non-isolated windows are already "loaded"
+       if ( !this.loading && !this.isolated ) {
+               this.loading = $.Deferred().resolve();
+               this.initialize();
+               // Set initialized state after so sub-classes aren't confused by it being set by calling
+               // their parent initialize method
+               this.initialized = true;
+       }
+
+       // Return existing promise if already loading or loaded
+       if ( this.loading ) {
+               return this.loading.promise();
+       }
+
+       // Load the frame
+       loading = this.loading = $.Deferred();
+       sub = this.$iframe.prop( 'contentWindow' );
+       doc = sub.document;
+
+       // Initialize contents
+       doc.open();
+       doc.write(
+               '<!doctype html>' +
+               '<html>' +
+                       '<body class="oo-ui-window-isolated oo-ui-' + this.dir + '"' +
+                               ' style="direction:' + this.dir + ';" dir="' + this.dir + '">' +
+                               '<div class="oo-ui-window-content"></div>' +
+                       '</body>' +
+               '</html>'
+       );
+       doc.close();
+
+       // Properties
+       this.$ = OO.ui.Element.getJQuery( doc, this.$iframe );
+       this.$content = this.$( '.oo-ui-window-content' ).attr( 'tabIndex', 0 );
+       this.$document = this.$( doc );
+
+       // Initialization
+       this.constructor.static.transplantStyles( this.getElementDocument(), this.$document[0] )
+               .always( function () {
+                       // Initialize isolated windows
+                       win.initialize();
+                       // Set initialized state after so sub-classes aren't confused by it being set by calling
+                       // their parent initialize method
+                       win.initialized = true;
+                       // Undo the visibility: hidden; hack and apply display: none;
+                       // We can do this safely now that the iframe has initialized
+                       // (don't do this from within #initialize because it has to happen
+                       // after the all subclasses have been handled as well).
+                       win.toggle( win.isVisible() );
+
+                       loading.resolve();
+               } );
+
+       return loading.promise();
+};
+
 /**
  * Base class for all dialogs.
  *
@@ -2020,20 +2167,22 @@ OO.ui.Window.prototype.teardown = function ( data ) {
  * @abstract
  * @class
  * @extends OO.ui.Window
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.PendingElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
  */
-OO.ui.Dialog = function OoUiDialog( manager, config ) {
+OO.ui.Dialog = function OoUiDialog( config ) {
        // Parent constructor
-       OO.ui.Dialog.super.call( this, manager, config );
+       OO.ui.Dialog.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.PendingElement.call( this );
 
        // Properties
        this.actions = new OO.ui.ActionSet();
        this.attachedActions = [];
        this.currentAction = null;
-       this.pending = 0;
 
        // Events
        this.actions.connect( this, {
@@ -2051,6 +2200,7 @@ OO.ui.Dialog = function OoUiDialog( manager, config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.Dialog, OO.ui.Window );
+OO.mixinClass( OO.ui.Dialog, OO.ui.PendingElement );
 
 /* Static Properties */
 
@@ -2100,7 +2250,7 @@ OO.ui.Dialog.static.escapable = true;
  *
  * @param {jQuery.Event} e Key down event
  */
-OO.ui.Dialog.prototype.onFrameDocumentKeyDown = function ( e ) {
+OO.ui.Dialog.prototype.onDocumentKeyDown = function ( e ) {
        if ( e.which === OO.ui.Keys.ESCAPE ) {
                this.close();
                return false;
@@ -2138,15 +2288,6 @@ OO.ui.Dialog.prototype.onActionsChange = function () {
        }
 };
 
-/**
- * Check if input is pending.
- *
- * @return {boolean}
- */
-OO.ui.Dialog.prototype.isPending = function () {
-       return !!this.pending;
-};
-
 /**
  * Get set of actions.
  *
@@ -2181,7 +2322,7 @@ OO.ui.Dialog.prototype.getActionProcess = function ( action ) {
  * @inheritdoc
  *
  * @param {Object} [data] Dialog opening data
- * @param {jQuery|string|Function|null} [data.label] Dialog label, omit to use #static-label
+ * @param {jQuery|string|Function|null} [data.title] Dialog title, omit to use #static-title
  * @param {Object[]} [data.actions] List of OO.ui.ActionWidget configuration options for each
  *   action item, omit to use #static-actions
  */
@@ -2232,11 +2373,12 @@ OO.ui.Dialog.prototype.initialize = function () {
 
        // Events
        if ( this.constructor.static.escapable ) {
-               this.frame.$document.on( 'keydown', OO.ui.bind( this.onFrameDocumentKeyDown, this ) );
+               this.$document.on( 'keydown', OO.ui.bind( this.onDocumentKeyDown, this ) );
        }
 
        // Initialization
-       this.frame.$content.addClass( 'oo-ui-dialog-content' );
+       this.$content.addClass( 'oo-ui-dialog-content' );
+       this.setPendingElement( this.$head );
 };
 
 /**
@@ -2275,39 +2417,7 @@ OO.ui.Dialog.prototype.executeAction = function ( action ) {
 };
 
 /**
- * Increase the pending stack.
- *
- * @chainable
- */
-OO.ui.Dialog.prototype.pushPending = function () {
-       if ( this.pending === 0 ) {
-               this.frame.$content.addClass( 'oo-ui-actionDialog-content-pending' );
-               this.$head.addClass( 'oo-ui-texture-pending' );
-       }
-       this.pending++;
-
-       return this;
-};
-
-/**
- * Reduce the pending stack.
- *
- * Clamped at zero.
- *
- * @chainable
- */
-OO.ui.Dialog.prototype.popPending = function () {
-       if ( this.pending === 1 ) {
-               this.frame.$content.removeClass( 'oo-ui-actionDialog-content-pending' );
-               this.$head.removeClass( 'oo-ui-texture-pending' );
-       }
-       this.pending = Math.max( 0, this.pending - 1 );
-
-       return this;
-};
-
-/**
- * Collection of windows.
+ * Collection of windows.
  *
  * @class
  * @extends OO.ui.Element
@@ -2346,6 +2456,7 @@ OO.ui.Dialog.prototype.popPending = function () {
  *
  * @constructor
  * @param {Object} [config] Configuration options
+ * @cfg {boolean} [isolate] Configure managed windows to isolate their content using inline frames
  * @cfg {OO.Factory} [factory] Window factory to use for automatic instantiation
  * @cfg {boolean} [modal=true] Prevent interaction outside the dialog
  */
@@ -2362,10 +2473,13 @@ OO.ui.WindowManager = function OoUiWindowManager( config ) {
        // Properties
        this.factory = config.factory;
        this.modal = config.modal === undefined || !!config.modal;
+       this.isolate = !!config.isolate;
        this.windows = {};
        this.opening = null;
        this.opened = null;
        this.closing = null;
+       this.preparingToOpen = null;
+       this.preparingToClose = null;
        this.size = null;
        this.currentWindow = null;
        this.$ariaHidden = null;
@@ -2376,9 +2490,6 @@ OO.ui.WindowManager = function OoUiWindowManager( config ) {
        this.onWindowMouseWheelHandler = OO.ui.bind( this.onWindowMouseWheel, this );
        this.onDocumentKeyDownHandler = OO.ui.bind( this.onDocumentKeyDown, this );
 
-       // Events
-       this.$element.on( 'mousedown', false );
-
        // Initialization
        this.$element
                .addClass( 'oo-ui-windowManager' )
@@ -2419,6 +2530,13 @@ OO.mixinClass( OO.ui.WindowManager, OO.EventEmitter );
  * @param {Object} data Window closing data
  */
 
+/**
+ * Window was resized.
+ *
+ * @event resize
+ * @param {OO.ui.Window} win Window that was resized
+ */
+
 /* Static Properties */
 
 /**
@@ -2535,6 +2653,17 @@ OO.ui.WindowManager.prototype.isOpened = function ( win ) {
        return win === this.currentWindow && !!this.opened && this.opened.state() === 'pending';
 };
 
+/**
+ * Check if window contents should be isolated.
+ *
+ * Window content isolation is done using inline frames.
+ *
+ * @return {boolean} Window contents should be isolated
+ */
+OO.ui.WindowManager.prototype.shouldIsolate = function () {
+       return this.isolate;
+};
+
 /**
  * Check if a window is being managed.
  *
@@ -2603,8 +2732,7 @@ OO.ui.WindowManager.prototype.getTeardownDelay = function () {
  * If window is not yet instantiated, it will be instantiated and added automatically.
  *
  * @param {string} name Symbolic window name
- * @return {jQuery.Promise} Promise resolved when window is ready to be accessed; when resolved the
- *   first argument is an OO.ui.Window; when rejected the first argument is an OO.ui.Error
+ * @return {jQuery.Promise} Promise resolved with matching window, or rejected with an OO.ui.Error
  * @throws {Error} If the symbolic name is unrecognized by the factory
  * @throws {Error} If the symbolic name unrecognized as a managed window
  */
@@ -2620,10 +2748,8 @@ OO.ui.WindowManager.prototype.getWindow = function ( name ) {
                                ) );
                        } else {
                                win = this.factory.create( name, this, { $: this.$ } );
-                               this.addWindows( [ win ] ).then(
-                                       OO.ui.bind( deferred.resolve, deferred, win ),
-                                       deferred.reject
-                               );
+                               this.addWindows( [ win ] );
+                               deferred.resolve( win );
                        }
                } else {
                        deferred.reject( new OO.ui.Error(
@@ -2672,46 +2798,41 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
                opening.reject( new OO.ui.Error(
                        'Cannot open window: window is not attached to manager'
                ) );
+       } else if ( this.preparingToOpen || this.opening || this.opened ) {
+               opening.reject( new OO.ui.Error(
+                       'Cannot open window: another window is opening or open'
+               ) );
        }
 
        // Window opening
        if ( opening.state() !== 'rejected' ) {
-               // Begin loading the window if it's not loaded already - may take noticable time and we want
-               // too do this in paralell with any preparatory actions
-               preparing.push( win.load() );
-
-               if ( this.opening || this.opened ) {
-                       // If a window is currently opening or opened, close it first
-                       preparing.push( this.closeWindow( this.currentWindow ) );
-               } else if ( this.closing ) {
+               // Begin loading the window if it's not loading or loaded already - may take noticable time
+               // and we want to do this in paralell with any other preparatory actions
+               if ( !win.isLoading() && !win.isLoaded() ) {
+                       // Finish initializing the window (must be done after manager is attached to DOM)
+                       win.setManager( this );
+                       preparing.push( win.load() );
+               }
+
+               if ( this.closing ) {
                        // If a window is currently closing, wait for it to complete
                        preparing.push( this.closing );
                }
 
-               $.when.apply( $, preparing ).done( function () {
+               this.preparingToOpen = $.when.apply( $, preparing );
+               // Ensure handlers get called after preparingToOpen is set
+               this.preparingToOpen.done( function () {
                        if ( manager.modal ) {
-                               manager.$( manager.getElementDocument() ).on( {
-                                       // Prevent scrolling by keys in top-level window
-                                       keydown: manager.onDocumentKeyDownHandler
-                               } );
-                               manager.$( manager.getElementWindow() ).on( {
-                                       // Prevent scrolling by wheel in top-level window
-                                       mousewheel: manager.onWindowMouseWheelHandler,
-                                       // Start listening for top-level window dimension changes
-                                       'orientationchange resize': manager.onWindowResizeHandler
-                               } );
-                               // Hide other content from screen readers
-                               manager.$ariaHidden = $( 'body' )
-                                       .children()
-                                       .not( manager.$element.parentsUntil( 'body' ).last() )
-                                       .attr( 'aria-hidden', '' );
+                               manager.toggleGlobalEvents( true );
+                               manager.toggleAriaIsolation( true );
                        }
                        manager.currentWindow = win;
                        manager.opening = opening;
+                       manager.preparingToOpen = null;
                        manager.emit( 'opening', win, opening, data );
-                       manager.updateWindowSize( win );
                        setTimeout( function () {
                                win.setup( data ).then( function () {
+                                       manager.updateWindowSize( win );
                                        manager.opening.notify( { state: 'setup' } );
                                        setTimeout( function () {
                                                win.ready( data ).then( function () {
@@ -2726,7 +2847,7 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
                } );
        }
 
-       return opening;
+       return opening.promise();
 };
 
 /**
@@ -2734,7 +2855,7 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
  *
  * @param {OO.ui.Window|string} win Window object or symbolic name of window to close
  * @param {Object} [data] Window closing data
- * @return {jQuery.Promise} Promise resolved when window is done opening; see {@link #event-closing}
+ * @return {jQuery.Promise} Promise resolved when window is done closing; see {@link #event-closing}
  *   for more details about the `closing` promise
  * @throws {Error} If no window by that name is being managed
  * @fires closing
@@ -2761,7 +2882,7 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
                closing.reject( new OO.ui.Error(
                        'Cannot close window: window already closed with different data'
                ) );
-       } else if ( this.closing ) {
+       } else if ( this.preparingToClose || this.closing ) {
                closing.reject( new OO.ui.Error(
                        'Cannot close window: window already closing with different data'
                ) );
@@ -2774,9 +2895,11 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
                        preparing.push( this.opening );
                }
 
-               // Close the window
-               $.when.apply( $, preparing ).done( function () {
+               this.preparingToClose = $.when.apply( $, preparing );
+               // Ensure handlers get called after preparingToClose is set
+               this.preparingToClose.done( function () {
                        manager.closing = closing;
+                       manager.preparingToClose = null;
                        manager.emit( 'closing', win, closing, data );
                        manager.opened = null;
                        opened.resolve( closing.promise(), data );
@@ -2787,21 +2910,8 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
                                                win.teardown( data ).then( function () {
                                                        closing.notify( { state: 'teardown' } );
                                                        if ( manager.modal ) {
-                                                               manager.$( manager.getElementDocument() ).off( {
-                                                                       // Allow scrolling by keys in top-level window
-                                                                       keydown: manager.onDocumentKeyDownHandler
-                                                               } );
-                                                               manager.$( manager.getElementWindow() ).off( {
-                                                                       // Allow scrolling by wheel in top-level window
-                                                                       mousewheel: manager.onWindowMouseWheelHandler,
-                                                                       // Stop listening for top-level window dimension changes
-                                                                       'orientationchange resize': manager.onWindowResizeHandler
-                                                               } );
-                                                       }
-                                                       // Restore screen reader visiblity
-                                                       if ( manager.$ariaHidden ) {
-                                                               manager.$ariaHidden.removeAttr( 'aria-hidden' );
-                                                               manager.$ariaHidden = null;
+                                                               manager.toggleGlobalEvents( false );
+                                                               manager.toggleAriaIsolation( false );
                                                        }
                                                        manager.closing = null;
                                                        manager.currentWindow = null;
@@ -2813,23 +2923,18 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
                } );
        }
 
-       return closing;
+       return closing.promise();
 };
 
 /**
  * Add windows.
  *
- * If the window manager is attached to the DOM then windows will be automatically loaded as they
- * are added.
- *
  * @param {Object.<string,OO.ui.Window>|OO.ui.Window[]} windows Windows to add
- * @return {jQuery.Promise} Promise resolved when all windows are added
  * @throws {Error} If one of the windows being added without an explicit symbolic name does not have
  *   a statically configured symbolic name
  */
 OO.ui.WindowManager.prototype.addWindows = function ( windows ) {
-       var i, len, win, name, list,
-               promises = [];
+       var i, len, win, name, list;
 
        if ( $.isArray( windows ) ) {
                // Convert to map of windows by looking up symbolic names from static configuration
@@ -2850,13 +2955,7 @@ OO.ui.WindowManager.prototype.addWindows = function ( windows ) {
                win = list[name];
                this.windows[name] = win;
                this.$element.append( win.$element );
-
-               if ( this.isElementAttached() ) {
-                       promises.push( win.load() );
-               }
        }
-
-       return $.when.apply( $, promises );
 };
 
 /**
@@ -2928,9 +3027,89 @@ OO.ui.WindowManager.prototype.updateWindowSize = function ( win ) {
        this.$element.toggleClass( 'oo-ui-windowManager-floating', size !== 'full' );
        win.setDimensions( sizes[size] );
 
+       this.emit( 'resize', win );
+
+       return this;
+};
+
+/**
+ * Bind or unbind global events for scrolling.
+ *
+ * @param {boolean} [on] Bind global events
+ * @chainable
+ */
+OO.ui.WindowManager.prototype.toggleGlobalEvents = function ( on ) {
+       on = on === undefined ? !!this.globalEvents : !!on;
+
+       if ( on ) {
+               if ( !this.globalEvents ) {
+                       this.$( this.getElementDocument() ).on( {
+                               // Prevent scrolling by keys in top-level window
+                               keydown: this.onDocumentKeyDownHandler
+                       } );
+                       this.$( this.getElementWindow() ).on( {
+                               // Prevent scrolling by wheel in top-level window
+                               mousewheel: this.onWindowMouseWheelHandler,
+                               // Start listening for top-level window dimension changes
+                               'orientationchange resize': this.onWindowResizeHandler
+                       } );
+                       this.globalEvents = true;
+               }
+       } else if ( this.globalEvents ) {
+               // Unbind global events
+               this.$( this.getElementDocument() ).off( {
+                       // Allow scrolling by keys in top-level window
+                       keydown: this.onDocumentKeyDownHandler
+               } );
+               this.$( this.getElementWindow() ).off( {
+                       // Allow scrolling by wheel in top-level window
+                       mousewheel: this.onWindowMouseWheelHandler,
+                       // Stop listening for top-level window dimension changes
+                       'orientationchange resize': this.onWindowResizeHandler
+               } );
+               this.globalEvents = false;
+       }
+
+       return this;
+};
+
+/**
+ * Toggle screen reader visibility of content other than the window manager.
+ *
+ * @param {boolean} [isolate] Make only the window manager visible to screen readers
+ * @chainable
+ */
+OO.ui.WindowManager.prototype.toggleAriaIsolation = function ( isolate ) {
+       isolate = isolate === undefined ? !this.$ariaHidden : !!isolate;
+
+       if ( isolate ) {
+               if ( !this.$ariaHidden ) {
+                       // Hide everything other than the window manager from screen readers
+                       this.$ariaHidden = $( 'body' )
+                               .children()
+                               .not( this.$element.parentsUntil( 'body' ).last() )
+                               .attr( 'aria-hidden', '' );
+               }
+       } else if ( this.$ariaHidden ) {
+               // Restore screen reader visiblity
+               this.$ariaHidden.removeAttr( 'aria-hidden' );
+               this.$ariaHidden = null;
+       }
+
        return this;
 };
 
+/**
+ * Destroy window manager.
+ *
+ * Windows will not be closed, only removed from the DOM.
+ */
+OO.ui.WindowManager.prototype.destroy = function () {
+       this.toggleGlobalEvents( false );
+       this.toggleAriaIsolation( false );
+       this.$element.remove();
+};
+
 /**
  * @abstract
  * @class
@@ -3295,6 +3474,55 @@ OO.ui.ToolGroupFactory.static.getDefaultClasses = function () {
        ];
 };
 
+/**
+ * Theme logic.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.Theme = function OoUiTheme( config ) {
+       // Initialize config
+       config = config || {};
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.Theme );
+
+/* Methods */
+
+/**
+ * Get a list of classes to be applied to a widget.
+ *
+ * @localdoc The 'on' and 'off' lists combined MUST contain keys for all classes the theme adds or
+ *   removes, otherwise state transitions will not work properly.
+ *
+ * @param {OO.ui.Element} element Element for which to get classes
+ * @return {Object.<string,string[]>} Categorized class names with `on` and `off` lists
+ */
+OO.ui.Theme.prototype.getElementClasses = function ( /* element */ ) {
+       return { on: [], off: [] };
+};
+
+/**
+ * Update CSS classes provided by the theme.
+ *
+ * For elements with theme logic hooks, this should be called anytime there's a state change.
+ *
+ * @param {OO.ui.Element} Element for which to update classes
+ * @return {Object.<string,string[]>} Categorized class names with `on` and `off` lists
+ */
+OO.ui.Theme.prototype.updateElementClasses = function ( element ) {
+       var classes = this.getElementClasses( element );
+
+       element.$element
+               .removeClass( classes.off.join( ' ' ) )
+               .addClass( classes.on.join( ' ' ) );
+};
+
 /**
  * Element with a button.
  *
@@ -3305,39 +3533,36 @@ OO.ui.ToolGroupFactory.static.getDefaultClasses = function () {
  * @class
  *
  * @constructor
- * @param {jQuery} $button Button node, assigned to #$button
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$button] Button node, assigned to #$button, omit to use a generated `<a>`
  * @cfg {boolean} [framed=true] Render button with a frame
  * @cfg {number} [tabIndex=0] Button's tab index, use null to have no tabIndex
  * @cfg {string} [accessKey] Button's access key
  */
-OO.ui.ButtonedElement = function OoUiButtonedElement( $button, config ) {
+OO.ui.ButtonElement = function OoUiButtonElement( config ) {
        // Configuration initialization
        config = config || {};
 
        // Properties
-       this.$button = $button;
-       this.tabIndex = null;
+       this.$button = null;
        this.framed = null;
+       this.tabIndex = null;
+       this.accessKey = null;
        this.active = false;
        this.onMouseUpHandler = OO.ui.bind( this.onMouseUp, this );
-
-       // Events
-       this.$button.on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) );
+       this.onMouseDownHandler = OO.ui.bind( this.onMouseDown, this );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-buttonedElement' );
-       this.$button
-               .addClass( 'oo-ui-buttonedElement-button' )
-               .attr( 'role', 'button' );
+       this.$element.addClass( 'oo-ui-buttonElement' );
+       this.toggleFramed( config.framed === undefined || config.framed );
        this.setTabIndex( config.tabIndex || 0 );
        this.setAccessKey( config.accessKey );
-       this.toggleFramed( config.framed === undefined || config.framed );
+       this.setButtonElement( config.$button || this.$( '<a>' ) );
 };
 
 /* Setup */
 
-OO.initClass( OO.ui.ButtonedElement );
+OO.initClass( OO.ui.ButtonElement );
 
 /* Static Properties */
 
@@ -3348,26 +3573,43 @@ OO.initClass( OO.ui.ButtonedElement );
  * @inheritable
  * @property {boolean}
  */
-OO.ui.ButtonedElement.static.cancelButtonMouseDownEvents = true;
+OO.ui.ButtonElement.static.cancelButtonMouseDownEvents = true;
 
 /* Methods */
 
+/**
+ * Set the button element.
+ *
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $button Element to use as button
+ */
+OO.ui.ButtonElement.prototype.setButtonElement = function ( $button ) {
+       if ( this.$button ) {
+               this.$button
+                       .removeClass( 'oo-ui-buttonElement-button' )
+                       .removeAttr( 'role accesskey tabindex' )
+                       .off( this.onMouseDownHandler );
+       }
+
+       this.$button = $button
+               .addClass( 'oo-ui-buttonElement-button' )
+               .attr( { role: 'button', accesskey: this.accessKey, tabindex: this.tabIndex } )
+               .on( 'mousedown', this.onMouseDownHandler );
+};
+
 /**
  * Handles mouse down events.
  *
  * @param {jQuery.Event} e Mouse down event
  */
-OO.ui.ButtonedElement.prototype.onMouseDown = function ( e ) {
+OO.ui.ButtonElement.prototype.onMouseDown = function ( e ) {
        if ( this.isDisabled() || e.which !== 1 ) {
                return false;
        }
-       // tabIndex should generally be interacted with via the property, but it's not possible to
-       // reliably unset a tabIndex via a property so we use the (lowercase) "tabindex" attribute
-       this.tabIndex = this.$button.attr( 'tabindex' );
-       this.$button
-               // Remove the tab-index while the button is down to prevent the button from stealing focus
-               .removeAttr( 'tabindex' )
-               .addClass( 'oo-ui-buttonedElement-pressed' );
+       // Remove the tab-index while the button is down to prevent the button from stealing focus
+       this.$button.removeAttr( 'tabindex' );
+       this.$element.addClass( 'oo-ui-buttonElement-pressed' );
        // Run the mouseup handler no matter where the mouse is when the button is let go, so we can
        // reliably reapply the tabindex and remove the pressed class
        this.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );
@@ -3382,31 +3624,40 @@ OO.ui.ButtonedElement.prototype.onMouseDown = function ( e ) {
  *
  * @param {jQuery.Event} e Mouse up event
  */
-OO.ui.ButtonedElement.prototype.onMouseUp = function ( e ) {
+OO.ui.ButtonElement.prototype.onMouseUp = function ( e ) {
        if ( this.isDisabled() || e.which !== 1 ) {
                return false;
        }
-       this.$button
-               // Restore the tab-index after the button is up to restore the button's accesssibility
-               .attr( 'tabindex', this.tabIndex )
-               .removeClass( 'oo-ui-buttonedElement-pressed' );
+       // Restore the tab-index after the button is up to restore the button's accesssibility
+       this.$button.attr( 'tabindex', this.tabIndex );
+       this.$element.removeClass( 'oo-ui-buttonElement-pressed' );
        // Stop listening for mouseup, since we only needed this once
        this.getElementDocument().removeEventListener( 'mouseup', this.onMouseUpHandler, true );
 };
 
+/**
+ * Check if button has a frame.
+ *
+ * @return {boolean} Button is framed
+ */
+OO.ui.ButtonElement.prototype.isFramed = function () {
+       return this.framed;
+};
+
 /**
  * Toggle frame.
  *
  * @param {boolean} [framed] Make button framed, omit to toggle
  * @chainable
  */
-OO.ui.ButtonedElement.prototype.toggleFramed = function ( framed ) {
+OO.ui.ButtonElement.prototype.toggleFramed = function ( framed ) {
        framed = framed === undefined ? !this.framed : !!framed;
        if ( framed !== this.framed ) {
                this.framed = framed;
                this.$element
-                       .toggleClass( 'oo-ui-buttonedElement-frameless', !framed )
-                       .toggleClass( 'oo-ui-buttonedElement-framed', framed );
+                       .toggleClass( 'oo-ui-buttonElement-frameless', !framed )
+                       .toggleClass( 'oo-ui-buttonElement-framed', framed );
+               this.updateThemeClasses();
        }
 
        return this;
@@ -3418,27 +3669,43 @@ OO.ui.ButtonedElement.prototype.toggleFramed = function ( framed ) {
  * @param {number|null} tabIndex Button's tab index, use null to remove
  * @chainable
  */
-OO.ui.ButtonedElement.prototype.setTabIndex = function ( tabIndex ) {
-       if ( typeof tabIndex === 'number' && tabIndex >= 0 ) {
-               this.$button.attr( 'tabindex', tabIndex );
-       } else {
-               this.$button.removeAttr( 'tabindex' );
+OO.ui.ButtonElement.prototype.setTabIndex = function ( tabIndex ) {
+       tabIndex = typeof tabIndex === 'number' && tabIndex >= 0 ? tabIndex : null;
+
+       if ( this.tabIndex !== tabIndex ) {
+               if ( this.$button ) {
+                       if ( tabIndex !== null ) {
+                               this.$button.attr( 'tabindex', tabIndex );
+                       } else {
+                               this.$button.removeAttr( 'tabindex' );
+                       }
+               }
+               this.tabIndex = tabIndex;
        }
+
        return this;
 };
 
 /**
- * Set access key
+ * Set access key.
  *
  * @param {string} accessKey Button's access key, use empty string to remove
  * @chainable
  */
-OO.ui.ButtonedElement.prototype.setAccessKey = function ( accessKey ) {
-       if ( typeof accessKey === 'string' && accessKey.length ) {
-               this.$button.attr( 'accesskey', accessKey );
-       } else {
-               this.$button.removeAttr( 'accesskey' );
+OO.ui.ButtonElement.prototype.setAccessKey = function ( accessKey ) {
+       accessKey = typeof accessKey === 'string' && accessKey.length ? accessKey : null;
+
+       if ( this.accessKey !== accessKey ) {
+               if ( this.$button ) {
+                       if ( accessKey !== null ) {
+                               this.$button.attr( 'accesskey', accessKey );
+                       } else {
+                               this.$button.removeAttr( 'accesskey' );
+                       }
+               }
+               this.accessKey = accessKey;
        }
+
        return this;
 };
 
@@ -3448,366 +3715,130 @@ OO.ui.ButtonedElement.prototype.setAccessKey = function ( accessKey ) {
  * @param {boolean} [value] Make button active
  * @chainable
  */
-OO.ui.ButtonedElement.prototype.setActive = function ( value ) {
-       this.$button.toggleClass( 'oo-ui-buttonedElement-active', !!value );
+OO.ui.ButtonElement.prototype.setActive = function ( value ) {
+       this.$element.toggleClass( 'oo-ui-buttonElement-active', !!value );
        return this;
 };
 
 /**
- * Element that can be automatically clipped to visible boundaies.
+ * Element containing a sequence of child elements.
  *
  * @abstract
  * @class
  *
  * @constructor
- * @param {jQuery} $clippable Nodes to clip, assigned to #$clippable
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$group] Container node, assigned to #$group, omit to use a generated `<div>`
  */
-OO.ui.ClippableElement = function OoUiClippableElement( $clippable, config ) {
-       // Configuration initialization
+OO.ui.GroupElement = function OoUiGroupElement( config ) {
+       // Configuration
        config = config || {};
 
        // Properties
-       this.$clippable = $clippable;
-       this.clipping = false;
-       this.clipped = false;
-       this.$clippableContainer = null;
-       this.$clippableScroller = null;
-       this.$clippableWindow = null;
-       this.idealWidth = null;
-       this.idealHeight = null;
-       this.onClippableContainerScrollHandler = OO.ui.bind( this.clip, this );
-       this.onClippableWindowResizeHandler = OO.ui.bind( this.clip, this );
+       this.$group = null;
+       this.items = [];
+       this.aggregateItemEvents = {};
 
        // Initialization
-       this.$clippable.addClass( 'oo-ui-clippableElement-clippable' );
+       this.setGroupElement( config.$group || this.$( '<div>' ) );
 };
 
 /* Methods */
 
 /**
- * Set clipping.
+ * Set the group element.
  *
- * @param {boolean} value Enable clipping
- * @chainable
+ * If an element is already set, items will be moved to the new element.
+ *
+ * @param {jQuery} $group Element to use as group
  */
-OO.ui.ClippableElement.prototype.setClipping = function ( value ) {
-       value = !!value;
+OO.ui.GroupElement.prototype.setGroupElement = function ( $group ) {
+       var i, len;
 
-       if ( this.clipping !== value ) {
-               this.clipping = value;
-               if ( this.clipping ) {
-                       this.$clippableContainer = this.$( this.getClosestScrollableElementContainer() );
-                       // If the clippable container is the body, we have to listen to scroll events and check
-                       // jQuery.scrollTop on the window because of browser inconsistencies
-                       this.$clippableScroller = this.$clippableContainer.is( 'body' ) ?
-                               this.$( OO.ui.Element.getWindow( this.$clippableContainer ) ) :
-                               this.$clippableContainer;
-                       this.$clippableScroller.on( 'scroll', this.onClippableContainerScrollHandler );
-                       this.$clippableWindow = this.$( this.getElementWindow() )
-                               .on( 'resize', this.onClippableWindowResizeHandler );
-                       // Initial clip after visible
-                       setTimeout( OO.ui.bind( this.clip, this ) );
-               } else {
-                       this.$clippableContainer = null;
-                       this.$clippableScroller.off( 'scroll', this.onClippableContainerScrollHandler );
-                       this.$clippableScroller = null;
-                       this.$clippableWindow.off( 'resize', this.onClippableWindowResizeHandler );
-                       this.$clippableWindow = null;
-               }
+       this.$group = $group;
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               this.$group.append( this.items[i].$element );
        }
-
-       return this;
 };
 
 /**
- * Check if the element will be clipped to fit the visible area of the nearest scrollable container.
+ * Check if there are no items.
  *
- * @return {boolean} Element will be clipped to the visible area
+ * @return {boolean} Group is empty
  */
-OO.ui.ClippableElement.prototype.isClipping = function () {
-       return this.clipping;
+OO.ui.GroupElement.prototype.isEmpty = function () {
+       return !this.items.length;
 };
 
 /**
- * Check if the bottom or right of the element is being clipped by the nearest scrollable container.
+ * Get items.
  *
- * @return {boolean} Part of the element is being clipped
+ * @return {OO.ui.Element[]} Items
  */
-OO.ui.ClippableElement.prototype.isClipped = function () {
-       return this.clipped;
+OO.ui.GroupElement.prototype.getItems = function () {
+       return this.items.slice( 0 );
 };
 
 /**
- * Set the ideal size.
+ * Add an aggregate item event.
  *
- * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix
- * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix
+ * Aggregated events are listened to on each item and then emitted by the group under a new name,
+ * and with an additional leading parameter containing the item that emitted the original event.
+ * Other arguments that were emitted from the original event are passed through.
+ *
+ * @param {Object.<string,string|null>} events Aggregate events emitted by group, keyed by item
+ *   event, use null value to remove aggregation
+ * @throws {Error} If aggregation already exists
  */
-OO.ui.ClippableElement.prototype.setIdealSize = function ( width, height ) {
-       this.idealWidth = width;
-       this.idealHeight = height;
+OO.ui.GroupElement.prototype.aggregate = function ( events ) {
+       var i, len, item, add, remove, itemEvent, groupEvent;
+
+       for ( itemEvent in events ) {
+               groupEvent = events[itemEvent];
+
+               // Remove existing aggregated event
+               if ( itemEvent in this.aggregateItemEvents ) {
+                       // Don't allow duplicate aggregations
+                       if ( groupEvent ) {
+                               throw new Error( 'Duplicate item event aggregation for ' + itemEvent );
+                       }
+                       // Remove event aggregation from existing items
+                       for ( i = 0, len = this.items.length; i < len; i++ ) {
+                               item = this.items[i];
+                               if ( item.connect && item.disconnect ) {
+                                       remove = {};
+                                       remove[itemEvent] = [ 'emit', groupEvent, item ];
+                                       item.disconnect( this, remove );
+                               }
+                       }
+                       // Prevent future items from aggregating event
+                       delete this.aggregateItemEvents[itemEvent];
+               }
+
+               // Add new aggregate event
+               if ( groupEvent ) {
+                       // Make future items aggregate event
+                       this.aggregateItemEvents[itemEvent] = groupEvent;
+                       // Add event aggregation to existing items
+                       for ( i = 0, len = this.items.length; i < len; i++ ) {
+                               item = this.items[i];
+                               if ( item.connect && item.disconnect ) {
+                                       add = {};
+                                       add[itemEvent] = [ 'emit', groupEvent, item ];
+                                       item.connect( this, add );
+                               }
+                       }
+               }
+       }
 };
 
 /**
- * Clip element to visible boundaries and allow scrolling when needed.
+ * Add items.
  *
- * Element will be clipped the bottom or right of the element is within 10px of the edge of, or
- * overlapped by, the visible area of the nearest scrollable container.
+ * Adding an existing item (by value) will move it.
  *
- * @chainable
- */
-OO.ui.ClippableElement.prototype.clip = function () {
-       if ( !this.clipping ) {
-               // this.$clippableContainer and this.$clippableWindow are null, so the below will fail
-               return this;
-       }
-
-       var buffer = 10,
-               cOffset = this.$clippable.offset(),
-               $container = this.$clippableContainer.is( 'body' ) ? this.$clippableWindow : this.$clippableContainer,
-               ccOffset = $container.offset() || { top: 0, left: 0 },
-               ccHeight = $container.innerHeight() - buffer,
-               ccWidth = $container.innerWidth() - buffer,
-               scrollTop = this.$clippableScroller.scrollTop(),
-               scrollLeft = this.$clippableScroller.scrollLeft(),
-               desiredWidth = ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
-               desiredHeight = ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
-               naturalWidth = this.$clippable.prop( 'scrollWidth' ),
-               naturalHeight = this.$clippable.prop( 'scrollHeight' ),
-               clipWidth = desiredWidth < naturalWidth,
-               clipHeight = desiredHeight < naturalHeight;
-
-       if ( clipWidth ) {
-               this.$clippable.css( { overflowX: 'auto', width: desiredWidth } );
-       } else {
-               this.$clippable.css( 'width', this.idealWidth || '' );
-               this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
-               this.$clippable.css( 'overflowX', '' );
-       }
-       if ( clipHeight ) {
-               this.$clippable.css( { overflowY: 'auto', height: desiredHeight } );
-       } else {
-               this.$clippable.css( 'height', this.idealHeight || '' );
-               this.$clippable.height(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
-               this.$clippable.css( 'overflowY', '' );
-       }
-
-       this.clipped = clipWidth || clipHeight;
-
-       return this;
-};
-
-/**
- * Element with named flags that can be added, removed, listed and checked.
- *
- * A flag, when set, adds a CSS class on the `$element` by combing `oo-ui-flaggableElement-` with
- * the flag name. Flags are primarily useful for styling.
- *
- * @abstract
- * @class
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string[]} [flags=[]] Styling flags, e.g. 'primary', 'destructive' or 'constructive'
- */
-OO.ui.FlaggableElement = function OoUiFlaggableElement( config ) {
-       // Config initialization
-       config = config || {};
-
-       // Properties
-       this.flags = {};
-
-       // Initialization
-       this.setFlags( config.flags );
-};
-
-/* Events */
-
-/**
- * @event flag
- * @param {Object.<string,boolean>} changes Object keyed by flag name containing boolean
- *   added/removed properties
- */
-
-/* Methods */
-
-/**
- * Check if a flag is set.
- *
- * @param {string} flag Name of flag
- * @return {boolean} Has flag
- */
-OO.ui.FlaggableElement.prototype.hasFlag = function ( flag ) {
-       return flag in this.flags;
-};
-
-/**
- * Get the names of all flags set.
- *
- * @return {string[]} flags Flag names
- */
-OO.ui.FlaggableElement.prototype.getFlags = function () {
-       return Object.keys( this.flags );
-};
-
-/**
- * Clear all flags.
- *
- * @chainable
- * @fires flag
- */
-OO.ui.FlaggableElement.prototype.clearFlags = function () {
-       var flag,
-               changes = {},
-               classPrefix = 'oo-ui-flaggableElement-';
-
-       for ( flag in this.flags ) {
-               changes[flag] = false;
-               delete this.flags[flag];
-               this.$element.removeClass( classPrefix + flag );
-       }
-
-       this.emit( 'flag', changes );
-
-       return this;
-};
-
-/**
- * Add one or more flags.
- *
- * @param {string|string[]|Object.<string, boolean>} flags One or more flags to add, or an object
- *  keyed by flag name containing boolean set/remove instructions.
- * @chainable
- * @fires flag
- */
-OO.ui.FlaggableElement.prototype.setFlags = function ( flags ) {
-       var i, len, flag,
-               changes = {},
-               classPrefix = 'oo-ui-flaggableElement-';
-
-       if ( typeof flags === 'string' ) {
-               // Set
-               this.flags[flags] = true;
-               this.$element.addClass( classPrefix + flags );
-       } else if ( $.isArray( flags ) ) {
-               for ( i = 0, len = flags.length; i < len; i++ ) {
-                       flag = flags[i];
-                       // Set
-                       changes[flag] = true;
-                       this.flags[flag] = true;
-                       this.$element.addClass( classPrefix + flag );
-               }
-       } else if ( OO.isPlainObject( flags ) ) {
-               for ( flag in flags ) {
-                       if ( flags[flag] ) {
-                               // Set
-                               changes[flag] = true;
-                               this.flags[flag] = true;
-                               this.$element.addClass( classPrefix + flag );
-                       } else {
-                               // Remove
-                               changes[flag] = false;
-                               delete this.flags[flag];
-                               this.$element.removeClass( classPrefix + flag );
-                       }
-               }
-       }
-
-       this.emit( 'flag', changes );
-
-       return this;
-};
-
-/**
- * Element containing a sequence of child elements.
- *
- * @abstract
- * @class
- *
- * @constructor
- * @param {jQuery} $group Container node, assigned to #$group
- * @param {Object} [config] Configuration options
- */
-OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
-       // Configuration
-       config = config || {};
-
-       // Properties
-       this.$group = $group;
-       this.items = [];
-       this.aggregateItemEvents = {};
-};
-
-/* Methods */
-
-/**
- * Get items.
- *
- * @return {OO.ui.Element[]} Items
- */
-OO.ui.GroupElement.prototype.getItems = function () {
-       return this.items.slice( 0 );
-};
-
-/**
- * Add an aggregate item event.
- *
- * Aggregated events are listened to on each item and then emitted by the group under a new name,
- * and with an additional leading parameter containing the item that emitted the original event.
- * Other arguments that were emitted from the original event are passed through.
- *
- * @param {Object.<string,string|null>} events Aggregate events emitted by group, keyed by item
- *   event, use null value to remove aggregation
- * @throws {Error} If aggregation already exists
- */
-OO.ui.GroupElement.prototype.aggregate = function ( events ) {
-       var i, len, item, add, remove, itemEvent, groupEvent;
-
-       for ( itemEvent in events ) {
-               groupEvent = events[itemEvent];
-
-               // Remove existing aggregated event
-               if ( itemEvent in this.aggregateItemEvents ) {
-                       // Don't allow duplicate aggregations
-                       if ( groupEvent ) {
-                               throw new Error( 'Duplicate item event aggregation for ' + itemEvent );
-                       }
-                       // Remove event aggregation from existing items
-                       for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               item = this.items[i];
-                               if ( item.connect && item.disconnect ) {
-                                       remove = {};
-                                       remove[itemEvent] = [ 'emit', groupEvent, item ];
-                                       item.disconnect( this, remove );
-                               }
-                       }
-                       // Prevent future items from aggregating event
-                       delete this.aggregateItemEvents[itemEvent];
-               }
-
-               // Add new aggregate event
-               if ( groupEvent ) {
-                       // Make future items aggregate event
-                       this.aggregateItemEvents[itemEvent] = groupEvent;
-                       // Add event aggregation to existing items
-                       for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               item = this.items[i];
-                               if ( item.connect && item.disconnect ) {
-                                       add = {};
-                                       add[itemEvent] = [ 'emit', groupEvent, item ];
-                                       item.connect( this, add );
-                               }
-                       }
-               }
-       }
-};
-
-/**
- * Add items.
- *
- * @param {OO.ui.Element[]} items Item
- * @param {number} [index] Index to insert items at
+ * @param {OO.ui.Element[]} items Item
+ * @param {number} [index] Index to insert items at
  * @chainable
  */
 OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
@@ -3930,28 +3961,31 @@ OO.ui.GroupElement.prototype.clearItems = function () {
  * @class
  *
  * @constructor
- * @param {jQuery} $icon Icon node, assigned to #$icon
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$icon] Icon node, assigned to #$icon, omit to use a generated `<span>`
  * @cfg {Object|string} [icon=''] Symbolic icon name, or map of icon names keyed by language ID;
  *  use the 'default' key to specify the icon to be used when there is no icon in the user's
  *  language
+ * @cfg {string} [iconTitle] Icon title text or a function that returns text
  */
-OO.ui.IconedElement = function OoUiIconedElement( $icon, config ) {
+OO.ui.IconElement = function OoUiIconElement( config ) {
        // Config intialization
        config = config || {};
 
        // Properties
-       this.$icon = $icon;
+       this.$icon = null;
        this.icon = null;
+       this.iconTitle = null;
 
        // Initialization
-       this.$icon.addClass( 'oo-ui-iconedElement-icon' );
        this.setIcon( config.icon || this.constructor.static.icon );
+       this.setIconTitle( config.iconTitle || this.constructor.static.iconTitle );
+       this.setIconElement( config.$icon || this.$( '<span>' ) );
 };
 
 /* Setup */
 
-OO.initClass( OO.ui.IconedElement );
+OO.initClass( OO.ui.IconElement );
 
 /* Static Properties */
 
@@ -3972,365 +4006,891 @@ OO.initClass( OO.ui.IconedElement );
  *  use the 'default' key to specify the icon to be used when there is no icon in the user's
  *  language
  */
-OO.ui.IconedElement.static.icon = null;
+OO.ui.IconElement.static.icon = null;
+
+/**
+ * Icon title.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function|null} Icon title text, a function that returns text or null for no
+ *  icon title
+ */
+OO.ui.IconElement.static.iconTitle = null;
 
 /* Methods */
 
+/**
+ * Set the icon element.
+ *
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $icon Element to use as icon
+ */
+OO.ui.IconElement.prototype.setIconElement = function ( $icon ) {
+       if ( this.$icon ) {
+               this.$icon
+                       .removeClass( 'oo-ui-iconElement-icon oo-ui-icon-' + this.icon )
+                       .removeAttr( 'title' );
+       }
+
+       this.$icon = $icon
+               .addClass( 'oo-ui-iconElement-icon' )
+               .toggleClass( 'oo-ui-icon-' + this.icon, !!this.icon );
+       if ( this.iconTitle !== null ) {
+               this.$icon.attr( 'title', this.iconTitle );
+       }
+};
+
 /**
  * Set icon.
  *
- * @param {Object|string} icon Symbolic icon name, or map of icon names keyed by language ID;
- *  use the 'default' key to specify the icon to be used when there is no icon in the user's
- *  language
+ * @param {Object|string|null} icon Symbolic icon name, or map of icon names keyed by language ID;
+ *  use the 'default' key to specify the icon to be used when there is no icon in the user's
+ *  language, use null to remove icon
+ * @chainable
+ */
+OO.ui.IconElement.prototype.setIcon = function ( icon ) {
+       icon = OO.isPlainObject( icon ) ? OO.ui.getLocalValue( icon, null, 'default' ) : icon;
+       icon = typeof icon === 'string' && icon.trim().length ? icon.trim() : null;
+
+       if ( this.icon !== icon ) {
+               if ( this.$icon ) {
+                       if ( this.icon !== null ) {
+                               this.$icon.removeClass( 'oo-ui-icon-' + this.icon );
+                       }
+                       if ( icon !== null ) {
+                               this.$icon.addClass( 'oo-ui-icon-' + icon );
+                       }
+               }
+               this.icon = icon;
+       }
+
+       this.$element.toggleClass( 'oo-ui-iconElement', !!this.icon );
+       this.updateThemeClasses();
+
+       return this;
+};
+
+/**
+ * Set icon title.
+ *
+ * @param {string|Function|null} icon Icon title text, a function that returns text or null
+ *  for no icon title
+ * @chainable
+ */
+OO.ui.IconElement.prototype.setIconTitle = function ( iconTitle ) {
+       iconTitle = typeof iconTitle === 'function' ||
+               ( typeof iconTitle === 'string' && iconTitle.length ) ?
+                       OO.ui.resolveMsg( iconTitle ) : null;
+
+       if ( this.iconTitle !== iconTitle ) {
+               this.iconTitle = iconTitle;
+               if ( this.$icon ) {
+                       if ( this.iconTitle !== null ) {
+                               this.$icon.attr( 'title', iconTitle );
+                       } else {
+                               this.$icon.removeAttr( 'title' );
+                       }
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Get icon.
+ *
+ * @return {string} Icon
+ */
+OO.ui.IconElement.prototype.getIcon = function () {
+       return this.icon;
+};
+
+/**
+ * Element containing an indicator.
+ *
+ * Indicators are graphics, smaller than normal text. They can be used to describe unique status or
+ * behavior. Indicators should only be used in exceptional cases; such as a button that opens a menu
+ * instead of performing an action directly, or an item in a list which has errors that need to be
+ * resolved.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$indicator] Indicator node, assigned to #$indicator, omit to use a generated
+ *   `<span>`
+ * @cfg {string} [indicator] Symbolic indicator name
+ * @cfg {string} [indicatorTitle] Indicator title text or a function that returns text
+ */
+OO.ui.IndicatorElement = function OoUiIndicatorElement( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.$indicator = null;
+       this.indicator = null;
+       this.indicatorTitle = null;
+
+       // Initialization
+       this.setIndicator( config.indicator || this.constructor.static.indicator );
+       this.setIndicatorTitle( config.indicatorTitle || this.constructor.static.indicatorTitle );
+       this.setIndicatorElement( config.$indicator || this.$( '<span>' ) );
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.IndicatorElement );
+
+/* Static Properties */
+
+/**
+ * indicator.
+ *
+ * @static
+ * @inheritable
+ * @property {string|null} Symbolic indicator name or null for no indicator
+ */
+OO.ui.IndicatorElement.static.indicator = null;
+
+/**
+ * Indicator title.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function|null} Indicator title text, a function that returns text or null for no
+ *  indicator title
+ */
+OO.ui.IndicatorElement.static.indicatorTitle = null;
+
+/* Methods */
+
+/**
+ * Set the indicator element.
+ *
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $indicator Element to use as indicator
+ */
+OO.ui.IndicatorElement.prototype.setIndicatorElement = function ( $indicator ) {
+       if ( this.$indicator ) {
+               this.$indicator
+                       .removeClass( 'oo-ui-indicatorElement-indicator oo-ui-indicator-' + this.indicator )
+                       .removeAttr( 'title' );
+       }
+
+       this.$indicator = $indicator
+               .addClass( 'oo-ui-indicatorElement-indicator' )
+               .toggleClass( 'oo-ui-indicator-' + this.indicator, !!this.indicator );
+       if ( this.indicatorTitle !== null ) {
+               this.$indicatorTitle.attr( 'title', this.indicatorTitle );
+       }
+};
+
+/**
+ * Set indicator.
+ *
+ * @param {string|null} indicator Symbolic name of indicator to use or null for no indicator
+ * @chainable
+ */
+OO.ui.IndicatorElement.prototype.setIndicator = function ( indicator ) {
+       indicator = typeof indicator === 'string' && indicator.length ? indicator.trim() : null;
+
+       if ( this.indicator !== indicator ) {
+               if ( this.$indicator ) {
+                       if ( this.indicator !== null ) {
+                               this.$indicator.removeClass( 'oo-ui-indicator-' + this.indicator );
+                       }
+                       if ( indicator !== null ) {
+                               this.$indicator.addClass( 'oo-ui-indicator-' + indicator );
+                       }
+               }
+               this.indicator = indicator;
+       }
+
+       this.$element.toggleClass( 'oo-ui-indicatorElement', !!this.indicator );
+       this.updateThemeClasses();
+
+       return this;
+};
+
+/**
+ * Set indicator title.
+ *
+ * @param {string|Function|null} indicator Indicator title text, a function that returns text or
+ *   null for no indicator title
+ * @chainable
+ */
+OO.ui.IndicatorElement.prototype.setIndicatorTitle = function ( indicatorTitle ) {
+       indicatorTitle = typeof indicatorTitle === 'function' ||
+               ( typeof indicatorTitle === 'string' && indicatorTitle.length ) ?
+                       OO.ui.resolveMsg( indicatorTitle ) : null;
+
+       if ( this.indicatorTitle !== indicatorTitle ) {
+               this.indicatorTitle = indicatorTitle;
+               if ( this.$indicator ) {
+                       if ( this.indicatorTitle !== null ) {
+                               this.$indicator.attr( 'title', indicatorTitle );
+                       } else {
+                               this.$indicator.removeAttr( 'title' );
+                       }
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Get indicator.
+ *
+ * @return {string} title Symbolic name of indicator
+ */
+OO.ui.IndicatorElement.prototype.getIndicator = function () {
+       return this.indicator;
+};
+
+/**
+ * Get indicator title.
+ *
+ * @return {string} Indicator title text
+ */
+OO.ui.IndicatorElement.prototype.getIndicatorTitle = function () {
+       return this.indicatorTitle;
+};
+
+/**
+ * Element containing a label.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$label] Label node, assigned to #$label, omit to use a generated `<span>`
+ * @cfg {jQuery|string|Function} [label] Label nodes, text or a function that returns nodes or text
+ * @cfg {boolean} [autoFitLabel=true] Whether to fit the label or not.
+ */
+OO.ui.LabelElement = function OoUiLabelElement( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.$label = null;
+       this.label = null;
+       this.autoFitLabel = config.autoFitLabel === undefined || !!config.autoFitLabel;
+
+       // Initialization
+       this.setLabel( config.label || this.constructor.static.label );
+       this.setLabelElement( config.$label || this.$( '<span>' ) );
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.LabelElement );
+
+/* Static Properties */
+
+/**
+ * Label.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function|null} Label text; a function that returns nodes or text; or null for
+ *  no label
+ */
+OO.ui.LabelElement.static.label = null;
+
+/* Methods */
+
+/**
+ * Set the label element.
+ *
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $label Element to use as label
+ */
+OO.ui.LabelElement.prototype.setLabelElement = function ( $label ) {
+       if ( this.$label ) {
+               this.$label.removeClass( 'oo-ui-labelElement-label' ).empty();
+       }
+
+       this.$label = $label.addClass( 'oo-ui-labelElement-label' );
+       this.setLabelContent( this.label );
+};
+
+/**
+ * Set the label.
+ *
+ * An empty string will result in the label being hidden. A string containing only whitespace will
+ * be converted to a single &nbsp;
+ *
+ * @param {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
+ *  text; or null for no label
+ * @chainable
+ */
+OO.ui.LabelElement.prototype.setLabel = function ( label ) {
+       label = typeof label === 'function' ? OO.ui.resolveMsg( label ) : label;
+       label = ( typeof label === 'string' && label.length ) || label instanceof jQuery ? label : null;
+
+       if ( this.label !== label ) {
+               if ( this.$label ) {
+                       this.setLabelContent( label );
+               }
+               this.label = label;
+       }
+
+       this.$element.toggleClass( 'oo-ui-labelElement', !!this.label );
+
+       return this;
+};
+
+/**
+ * Get the label.
+ *
+ * @return {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
+ *  text; or null for no label
+ */
+OO.ui.LabelElement.prototype.getLabel = function () {
+       return this.label;
+};
+
+/**
+ * Fit the label.
+ *
+ * @chainable
+ */
+OO.ui.LabelElement.prototype.fitLabel = function () {
+       if ( this.$label && this.$label.autoEllipsis && this.autoFitLabel ) {
+               this.$label.autoEllipsis( { hasSpan: false, tooltip: true } );
+       }
+
+       return this;
+};
+
+/**
+ * Set the content of the label.
+ *
+ * Do not call this method until after the label element has been set by #setLabelElement.
+ *
+ * @private
+ * @param {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
+ *  text; or null for no label
+ */
+OO.ui.LabelElement.prototype.setLabelContent = function ( label ) {
+       if ( typeof label === 'string' ) {
+               if ( label.match( /^\s*$/ ) ) {
+                       // Convert whitespace only string to a single non-breaking space
+                       this.$label.html( '&nbsp;' );
+               } else {
+                       this.$label.text( label );
+               }
+       } else if ( label instanceof jQuery ) {
+               this.$label.empty().append( label );
+       } else {
+               this.$label.empty();
+       }
+       this.$label.css( 'display', !label ? 'none' : '' );
+};
+
+/**
+ * Element containing an OO.ui.PopupWidget object.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {Object} [popup] Configuration to pass to popup
+ * @cfg {boolean} [autoClose=true] Popup auto-closes when it loses focus
+ */
+OO.ui.PopupElement = function OoUiPopupElement( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.popup = new OO.ui.PopupWidget( $.extend(
+               { autoClose: true },
+               config.popup,
+               { $: this.$, $autoCloseIgnore: this.$element }
+       ) );
+};
+
+/* Methods */
+
+/**
+ * Get popup.
+ *
+ * @return {OO.ui.PopupWidget} Popup widget
+ */
+OO.ui.PopupElement.prototype.getPopup = function () {
+       return this.popup;
+};
+
+/**
+ * Element with named flags that can be added, removed, listed and checked.
+ *
+ * A flag, when set, adds a CSS class on the `$element` by combining `oo-ui-flaggedElement-` with
+ * the flag name. Flags are primarily useful for styling.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string[]} [flags=[]] Styling flags, e.g. 'primary', 'destructive' or 'constructive'
+ * @cfg {jQuery} [$flagged] Flagged node, assigned to #$flagged, omit to use #$element
+ */
+OO.ui.FlaggedElement = function OoUiFlaggedElement( config ) {
+       // Config initialization
+       config = config || {};
+
+       // Properties
+       this.flags = {};
+       this.$flagged = null;
+
+       // Initialization
+       this.setFlags( config.flags );
+       this.setFlaggedElement( config.$flagged || this.$element );
+};
+
+/* Events */
+
+/**
+ * @event flag
+ * @param {Object.<string,boolean>} changes Object keyed by flag name containing boolean
+ *   added/removed properties
+ */
+
+/* Methods */
+
+/**
+ * Set the flagged element.
+ *
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $flagged Element to add flags to
+ */
+OO.ui.FlaggedElement.prototype.setFlaggedElement = function ( $flagged ) {
+       var classNames = Object.keys( this.flags ).map( function ( flag ) {
+               return 'oo-ui-flaggedElement-' + flag;
+       } ).join( ' ' );
+
+       if ( this.$flagged ) {
+               this.$flagged.removeClass( classNames );
+       }
+
+       this.$flagged = $flagged.addClass( classNames );
+};
+
+/**
+ * Check if a flag is set.
+ *
+ * @param {string} flag Name of flag
+ * @return {boolean} Has flag
+ */
+OO.ui.FlaggedElement.prototype.hasFlag = function ( flag ) {
+       return flag in this.flags;
+};
+
+/**
+ * Get the names of all flags set.
+ *
+ * @return {string[]} flags Flag names
+ */
+OO.ui.FlaggedElement.prototype.getFlags = function () {
+       return Object.keys( this.flags );
+};
+
+/**
+ * Clear all flags.
+ *
  * @chainable
+ * @fires flag
  */
-OO.ui.IconedElement.prototype.setIcon = function ( icon ) {
-       icon = OO.isPlainObject( icon ) ? OO.ui.getLocalValue( icon, null, 'default' ) : icon;
+OO.ui.FlaggedElement.prototype.clearFlags = function () {
+       var flag, className,
+               changes = {},
+               remove = [],
+               classPrefix = 'oo-ui-flaggedElement-';
 
-       if ( this.icon ) {
-               this.$icon.removeClass( 'oo-ui-icon-' + this.icon );
+       for ( flag in this.flags ) {
+               className = classPrefix + flag;
+               changes[flag] = false;
+               delete this.flags[flag];
+               remove.push( className );
        }
-       if ( typeof icon === 'string' ) {
-               icon = icon.trim();
-               if ( icon.length ) {
-                       this.$icon.addClass( 'oo-ui-icon-' + icon );
-                       this.icon = icon;
-               }
+
+       if ( this.$flagged ) {
+               this.$flagged.removeClass( remove.join( ' ' ) );
        }
-       this.$element.toggleClass( 'oo-ui-iconedElement', !!this.icon );
+
+       this.updateThemeClasses();
+       this.emit( 'flag', changes );
 
        return this;
 };
 
 /**
- * Get icon.
+ * Add one or more flags.
  *
- * @return {string} Icon
+ * @param {string|string[]|Object.<string, boolean>} flags One or more flags to add, or an object
+ *  keyed by flag name containing boolean set/remove instructions.
+ * @chainable
+ * @fires flag
  */
-OO.ui.IconedElement.prototype.getIcon = function () {
-       return this.icon;
+OO.ui.FlaggedElement.prototype.setFlags = function ( flags ) {
+       var i, len, flag, className,
+               changes = {},
+               add = [],
+               remove = [],
+               classPrefix = 'oo-ui-flaggedElement-';
+
+       if ( typeof flags === 'string' ) {
+               className = classPrefix + flags;
+               // Set
+               if ( !this.flags[flags] ) {
+                       this.flags[flags] = true;
+                       add.push( className );
+               }
+       } else if ( $.isArray( flags ) ) {
+               for ( i = 0, len = flags.length; i < len; i++ ) {
+                       flag = flags[i];
+                       className = classPrefix + flag;
+                       // Set
+                       if ( !this.flags[flag] ) {
+                               changes[flag] = true;
+                               this.flags[flag] = true;
+                               add.push( className );
+                       }
+               }
+       } else if ( OO.isPlainObject( flags ) ) {
+               for ( flag in flags ) {
+                       className = classPrefix + flag;
+                       if ( flags[flag] ) {
+                               // Set
+                               if ( !this.flags[flag] ) {
+                                       changes[flag] = true;
+                                       this.flags[flag] = true;
+                                       add.push( className );
+                               }
+                       } else {
+                               // Remove
+                               if ( this.flags[flag] ) {
+                                       changes[flag] = false;
+                                       delete this.flags[flag];
+                                       remove.push( className );
+                               }
+                       }
+               }
+       }
+
+       if ( this.$flagged ) {
+               this.$flagged
+                       .addClass( add.join( ' ' ) )
+                       .removeClass( remove.join( ' ' ) );
+       }
+
+       this.updateThemeClasses();
+       this.emit( 'flag', changes );
+
+       return this;
 };
 
 /**
- * Element containing an indicator.
+ * Element with a title.
  *
- * Indicators are graphics, smaller than normal text. They can be used to describe unique status or
- * behavior. Indicators should only be used in exceptional cases; such as a button that opens a menu
- * instead of performing an action directly, or an item in a list which has errors that need to be
- * resolved.
+ * Titles are rendered by the browser and are made visible when hovering the element. Titles are
+ * not visible on touch devices.
  *
  * @abstract
  * @class
  *
  * @constructor
- * @param {jQuery} $indicator Indicator node, assigned to #$indicator
  * @param {Object} [config] Configuration options
- * @cfg {string} [indicator] Symbolic indicator name
- * @cfg {string} [indicatorTitle] Indicator title text or a function that return text
+ * @cfg {jQuery} [$titled] Titled node, assigned to #$titled, omit to use #$element
+ * @cfg {string|Function} [title] Title text or a function that returns text
  */
-OO.ui.IndicatedElement = function OoUiIndicatedElement( $indicator, config ) {
+OO.ui.TitledElement = function OoUiTitledElement( config ) {
        // Config intialization
        config = config || {};
 
        // Properties
-       this.$indicator = $indicator;
-       this.indicator = null;
-       this.indicatorLabel = null;
+       this.$titled = null;
+       this.title = null;
 
        // Initialization
-       this.$indicator.addClass( 'oo-ui-indicatedElement-indicator' );
-       this.setIndicator( config.indicator || this.constructor.static.indicator );
-       this.setIndicatorTitle( config.indicatorTitle || this.constructor.static.indicatorTitle );
+       this.setTitle( config.title || this.constructor.static.title );
+       this.setTitledElement( config.$titled || this.$element );
 };
 
 /* Setup */
 
-OO.initClass( OO.ui.IndicatedElement );
+OO.initClass( OO.ui.TitledElement );
 
 /* Static Properties */
 
 /**
- * indicator.
- *
- * @static
- * @inheritable
- * @property {string|null} Symbolic indicator name or null for no indicator
- */
-OO.ui.IndicatedElement.static.indicator = null;
-
-/**
- * Indicator title.
+ * Title.
  *
  * @static
  * @inheritable
- * @property {string|Function|null} Indicator title text, a function that return text or null for no
- *  indicator title
+ * @property {string|Function} Title text or a function that returns text
  */
-OO.ui.IndicatedElement.static.indicatorTitle = null;
+OO.ui.TitledElement.static.title = null;
 
 /* Methods */
 
 /**
- * Set indicator.
+ * Set the titled element.
  *
- * @param {string|null} indicator Symbolic name of indicator to use or null for no indicator
- * @chainable
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $titled Element to set title on
  */
-OO.ui.IndicatedElement.prototype.setIndicator = function ( indicator ) {
-       if ( this.indicator ) {
-               this.$indicator.removeClass( 'oo-ui-indicator-' + this.indicator );
-               this.indicator = null;
-       }
-       if ( typeof indicator === 'string' ) {
-               indicator = indicator.trim();
-               if ( indicator.length ) {
-                       this.$indicator.addClass( 'oo-ui-indicator-' + indicator );
-                       this.indicator = indicator;
-               }
+OO.ui.TitledElement.prototype.setTitledElement = function ( $titled ) {
+       if ( this.$titled ) {
+               this.$titled.removeAttr( 'title' );
        }
-       this.$element.toggleClass( 'oo-ui-indicatedElement', !!this.indicator );
 
-       return this;
+       this.$titled = $titled;
+       if ( this.title ) {
+               this.$titled.attr( 'title', this.title );
+       }
 };
 
 /**
- * Set indicator label.
+ * Set title.
  *
- * @param {string|Function|null} indicator Indicator title text, a function that return text or null
- *  for no indicator title
+ * @param {string|Function|null} title Title text, a function that returns text or null for no title
  * @chainable
  */
-OO.ui.IndicatedElement.prototype.setIndicatorTitle = function ( indicatorTitle ) {
-       this.indicatorTitle = indicatorTitle = OO.ui.resolveMsg( indicatorTitle );
+OO.ui.TitledElement.prototype.setTitle = function ( title ) {
+       title = typeof title === 'string' ? OO.ui.resolveMsg( title ) : null;
 
-       if ( typeof indicatorTitle === 'string' && indicatorTitle.length ) {
-               this.$indicator.attr( 'title', indicatorTitle );
-       } else {
-               this.$indicator.removeAttr( 'title' );
+       if ( this.title !== title ) {
+               if ( this.$titled ) {
+                       if ( title !== null ) {
+                               this.$titled.attr( 'title', title );
+                       } else {
+                               this.$titled.removeAttr( 'title' );
+                       }
+               }
+               this.title = title;
        }
 
        return this;
 };
 
 /**
- * Get indicator.
+ * Get title.
  *
- * @return {string} title Symbolic name of indicator
+ * @return {string} Title string
  */
-OO.ui.IndicatedElement.prototype.getIndicator = function () {
-       return this.indicator;
+OO.ui.TitledElement.prototype.getTitle = function () {
+       return this.title;
 };
 
 /**
- * Get indicator title.
+ * Element that can be automatically clipped to visible boundaries.
  *
- * @return {string} Indicator title text
- */
-OO.ui.IndicatedElement.prototype.getIndicatorTitle = function () {
-       return this.indicatorTitle;
-};
-
-/**
- * Element containing a label.
+ * Whenever the element's natural height changes, you have to call
+ * #clip to make sure it's still clipping correctly.
  *
  * @abstract
  * @class
  *
  * @constructor
- * @param {jQuery} $label Label node, assigned to #$label
  * @param {Object} [config] Configuration options
- * @cfg {jQuery|string|Function} [label] Label nodes, text or a function that returns nodes or text
- * @cfg {boolean} [autoFitLabel=true] Whether to fit the label or not.
+ * @cfg {jQuery} [$clippable] Nodes to clip, assigned to #$clippable, omit to use #$element
  */
-OO.ui.LabeledElement = function OoUiLabeledElement( $label, config ) {
-       // Config intialization
+OO.ui.ClippableElement = function OoUiClippableElement( config ) {
+       // Configuration initialization
        config = config || {};
 
        // Properties
-       this.$label = $label;
-       this.label = null;
+       this.$clippable = null;
+       this.clipping = false;
+       this.clippedHorizontally = false;
+       this.clippedVertically = false;
+       this.$clippableContainer = null;
+       this.$clippableScroller = null;
+       this.$clippableWindow = null;
+       this.idealWidth = null;
+       this.idealHeight = null;
+       this.onClippableContainerScrollHandler = OO.ui.bind( this.clip, this );
+       this.onClippableWindowResizeHandler = OO.ui.bind( this.clip, this );
 
        // Initialization
-       this.$label.addClass( 'oo-ui-labeledElement-label' );
-       this.setLabel( config.label || this.constructor.static.label );
-       this.autoFitLabel = config.autoFitLabel === undefined || !!config.autoFitLabel;
+       this.setClippableElement( config.$clippable || this.$element );
 };
 
-/* Setup */
-
-OO.initClass( OO.ui.LabeledElement );
-
-/* Static Properties */
+/* Methods */
 
 /**
- * Label.
+ * Set clippable element.
  *
- * @static
- * @inheritable
- * @property {string|Function|null} Label text; a function that returns a nodes or text; or null for
- *  no label
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $clippable Element to make clippable
  */
-OO.ui.LabeledElement.static.label = null;
+OO.ui.ClippableElement.prototype.setClippableElement = function ( $clippable ) {
+       if ( this.$clippable ) {
+               this.$clippable.removeClass( 'oo-ui-clippableElement-clippable' );
+               this.$clippable.css( { width: '', height: '' } );
+               this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
+               this.$clippable.css( { overflowX: '', overflowY: '' } );
+       }
 
-/* Methods */
+       this.$clippable = $clippable.addClass( 'oo-ui-clippableElement-clippable' );
+       this.clip();
+};
 
 /**
- * Set the label.
+ * Toggle clipping.
  *
- * An empty string will result in the label being hidden. A string containing only whitespace will
- * be converted to a single &nbsp;
+ * Do not turn clipping on until after the element is attached to the DOM and visible.
  *
- * @param {jQuery|string|Function|null} label Label nodes; text; a function that retuns nodes or
- *  text; or null for no label
+ * @param {boolean} [clipping] Enable clipping, omit to toggle
  * @chainable
  */
-OO.ui.LabeledElement.prototype.setLabel = function ( label ) {
-       var empty = false;
+OO.ui.ClippableElement.prototype.toggleClipping = function ( clipping ) {
+       clipping = clipping === undefined ? !this.clipping : !!clipping;
 
-       this.label = label = OO.ui.resolveMsg( label ) || null;
-       if ( typeof label === 'string' && label.length ) {
-               if ( label.match( /^\s*$/ ) ) {
-                       // Convert whitespace only string to a single non-breaking space
-                       this.$label.html( '&nbsp;' );
+       if ( this.clipping !== clipping ) {
+               this.clipping = clipping;
+               if ( clipping ) {
+                       this.$clippableContainer = this.$( this.getClosestScrollableElementContainer() );
+                       // If the clippable container is the body, we have to listen to scroll events and check
+                       // jQuery.scrollTop on the window because of browser inconsistencies
+                       this.$clippableScroller = this.$clippableContainer.is( 'body' ) ?
+                               this.$( OO.ui.Element.getWindow( this.$clippableContainer ) ) :
+                               this.$clippableContainer;
+                       this.$clippableScroller.on( 'scroll', this.onClippableContainerScrollHandler );
+                       this.$clippableWindow = this.$( this.getElementWindow() )
+                               .on( 'resize', this.onClippableWindowResizeHandler );
+                       // Initial clip after visible
+                       this.clip();
                } else {
-                       this.$label.text( label );
+                       this.$clippable.css( { width: '', height: '' } );
+                       this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
+                       this.$clippable.css( { overflowX: '', overflowY: '' } );
+
+                       this.$clippableContainer = null;
+                       this.$clippableScroller.off( 'scroll', this.onClippableContainerScrollHandler );
+                       this.$clippableScroller = null;
+                       this.$clippableWindow.off( 'resize', this.onClippableWindowResizeHandler );
+                       this.$clippableWindow = null;
                }
-       } else if ( label instanceof jQuery ) {
-               this.$label.empty().append( label );
-       } else {
-               this.$label.empty();
-               empty = true;
        }
-       this.$element.toggleClass( 'oo-ui-labeledElement', !empty );
-       this.$label.css( 'display', empty ? 'none' : '' );
 
        return this;
 };
 
 /**
- * Get the label.
+ * Check if the element will be clipped to fit the visible area of the nearest scrollable container.
  *
- * @return {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
- *  text; or null for no label
+ * @return {boolean} Element will be clipped to the visible area
  */
-OO.ui.LabeledElement.prototype.getLabel = function () {
-       return this.label;
+OO.ui.ClippableElement.prototype.isClipping = function () {
+       return this.clipping;
 };
 
 /**
- * Fit the label.
+ * Check if the bottom or right of the element is being clipped by the nearest scrollable container.
  *
- * @chainable
+ * @return {boolean} Part of the element is being clipped
  */
-OO.ui.LabeledElement.prototype.fitLabel = function () {
-       if ( this.$label.autoEllipsis && this.autoFitLabel ) {
-               this.$label.autoEllipsis( { hasSpan: false, tooltip: true } );
-       }
-       return this;
+OO.ui.ClippableElement.prototype.isClipped = function () {
+       return this.clippedHorizontally || this.clippedVertically;
 };
 
 /**
- * Element containing an OO.ui.PopupWidget object.
+ * Check if the right of the element is being clipped by the nearest scrollable container.
  *
- * @abstract
- * @class
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {Object} [popup] Configuration to pass to popup
- * @cfg {boolean} [autoClose=true] Popup auto-closes when it loses focus
+ * @return {boolean} Part of the element is being clipped
  */
-OO.ui.PopuppableElement = function OoUiPopuppableElement( config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Properties
-       this.popup = new OO.ui.PopupWidget( $.extend(
-               { autoClose: true },
-               config.popup,
-               { $: this.$, $autoCloseIgnore: this.$element }
-       ) );
+OO.ui.ClippableElement.prototype.isClippedHorizontally = function () {
+       return this.clippedHorizontally;
 };
 
-/* Methods */
-
 /**
- * Get popup.
+ * Check if the bottom of the element is being clipped by the nearest scrollable container.
  *
- * @return {OO.ui.PopupWidget} Popup widget
+ * @return {boolean} Part of the element is being clipped
  */
-OO.ui.PopuppableElement.prototype.getPopup = function () {
-       return this.popup;
+OO.ui.ClippableElement.prototype.isClippedVertically = function () {
+       return this.clippedVertically;
 };
 
 /**
- * Element with a title.
- *
- * Titles are rendered by the browser and are made visible when hovering the element. Titles are
- * not visible on touch devices.
- *
- * @abstract
- * @class
+ * Set the ideal size. These are the dimensions the element will have when it's not being clipped.
  *
- * @constructor
- * @param {jQuery} $label Titled node, assigned to #$titled
- * @param {Object} [config] Configuration options
- * @cfg {string|Function} [title] Title text or a function that returns text
+ * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix
+ * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix
  */
-OO.ui.TitledElement = function OoUiTitledElement( $titled, config ) {
-       // Config intialization
-       config = config || {};
-
-       // Properties
-       this.$titled = $titled;
-       this.title = null;
+OO.ui.ClippableElement.prototype.setIdealSize = function ( width, height ) {
+       this.idealWidth = width;
+       this.idealHeight = height;
 
-       // Initialization
-       this.setTitle( config.title || this.constructor.static.title );
+       if ( !this.clipping ) {
+               // Update dimensions
+               this.$clippable.css( { width: width, height: height } );
+       }
+       // While clipping, idealWidth and idealHeight are not considered
 };
 
-/* Setup */
-
-OO.initClass( OO.ui.TitledElement );
-
-/* Static Properties */
-
 /**
- * Title.
+ * Clip element to visible boundaries and allow scrolling when needed. Call this method when
+ * the element's natural height changes.
  *
- * @static
- * @inheritable
- * @property {string|Function} Title text or a function that returns text
- */
-OO.ui.TitledElement.static.title = null;
-
-/* Methods */
-
-/**
- * Set title.
+ * Element will be clipped the bottom or right of the element is within 10px of the edge of, or
+ * overlapped by, the visible area of the nearest scrollable container.
  *
- * @param {string|Function|null} title Title text, a function that returns text or null for no title
  * @chainable
  */
-OO.ui.TitledElement.prototype.setTitle = function ( title ) {
-       this.title = title = OO.ui.resolveMsg( title ) || null;
+OO.ui.ClippableElement.prototype.clip = function () {
+       if ( !this.clipping ) {
+               // this.$clippableContainer and this.$clippableWindow are null, so the below will fail
+               return this;
+       }
+
+       var buffer = 10,
+               cOffset = this.$clippable.offset(),
+               $container = this.$clippableContainer.is( 'body' ) ?
+                       this.$clippableWindow : this.$clippableContainer,
+               ccOffset = $container.offset() || { top: 0, left: 0 },
+               ccHeight = $container.innerHeight() - buffer,
+               ccWidth = $container.innerWidth() - buffer,
+               scrollTop = this.$clippableScroller.scrollTop(),
+               scrollLeft = this.$clippableScroller.scrollLeft(),
+               desiredWidth = ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
+               desiredHeight = ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
+               naturalWidth = this.$clippable.prop( 'scrollWidth' ),
+               naturalHeight = this.$clippable.prop( 'scrollHeight' ),
+               clipWidth = desiredWidth < naturalWidth,
+               clipHeight = desiredHeight < naturalHeight;
 
-       if ( typeof title === 'string' && title.length ) {
-               this.$titled.attr( 'title', title );
+       if ( clipWidth ) {
+               this.$clippable.css( { overflowX: 'scroll', width: desiredWidth } );
        } else {
-               this.$titled.removeAttr( 'title' );
+               this.$clippable.css( 'width', this.idealWidth || '' );
+               this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
+               this.$clippable.css( 'overflowX', '' );
+       }
+       if ( clipHeight ) {
+               this.$clippable.css( { overflowY: 'scroll', height: desiredHeight } );
+       } else {
+               this.$clippable.css( 'height', this.idealHeight || '' );
+               this.$clippable.height(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
+               this.$clippable.css( 'overflowY', '' );
        }
 
-       return this;
-};
+       this.clippedHorizontally = clipWidth;
+       this.clippedVertically = clipHeight;
 
-/**
- * Get title.
- *
- * @return {string} Title string
- */
-OO.ui.TitledElement.prototype.getTitle = function () {
-       return this.title;
+       return this;
 };
 
 /**
@@ -4339,7 +4899,8 @@ OO.ui.TitledElement.prototype.getTitle = function () {
  * @abstract
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.FlaggedElement
  *
  * @constructor
  * @param {OO.ui.ToolGroup} toolGroup
@@ -4354,7 +4915,8 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
        OO.ui.Tool.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.FlaggedElement.call( this, config );
 
        // Properties
        this.toolGroup = toolGroup;
@@ -4387,7 +4949,8 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.Tool, OO.ui.Widget );
-OO.mixinClass( OO.ui.Tool, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.Tool, OO.ui.IconElement );
+OO.mixinClass( OO.ui.Tool, OO.ui.FlaggedElement );
 
 /* Events */
 
@@ -4611,7 +5174,7 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
 
        // Mixin constructors
        OO.EventEmitter.call( this );
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+       OO.ui.GroupElement.call( this, config );
 
        // Properties
        this.toolFactory = toolFactory;
@@ -4720,7 +5283,7 @@ OO.ui.Toolbar.prototype.setup = function ( groups ) {
                                group.type = 'list';
                        }
                        if ( group.label === undefined ) {
-                               group.label = 'ooui-toolbar-more';
+                               group.label = OO.ui.msg( 'ooui-toolbar-more' );
                        }
                }
                // Check type has been registered
@@ -4826,7 +5389,7 @@ OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {
        OO.ui.ToolGroup.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+       OO.ui.GroupElement.call( this, config );
 
        // Properties
        this.toolbar = toolbar;
@@ -5130,9 +5693,9 @@ OO.ui.ToolGroup.prototype.destroy = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  */
-OO.ui.MessageDialog = function OoUiMessageDialog( manager, config ) {
+OO.ui.MessageDialog = function OoUiMessageDialog( config ) {
        // Parent constructor
-       OO.ui.MessageDialog.super.call( this, manager, config );
+       OO.ui.MessageDialog.super.call( this, config );
 
        // Properties
        this.verticalActionLayout = null;
@@ -5278,7 +5841,7 @@ OO.ui.MessageDialog.prototype.initialize = function () {
 
        // Initialization
        this.title.$element.addClass( 'oo-ui-messageDialog-title' );
-       this.frame.$content.addClass( 'oo-ui-messageDialog-content' );
+       this.$content.addClass( 'oo-ui-messageDialog-content' );
        this.container.$element.append( this.text.$element );
        this.text.$element.append( this.title.$element, this.message.$element );
        this.$body.append( this.container.$element );
@@ -5366,9 +5929,9 @@ OO.ui.MessageDialog.prototype.fitActions = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  */
-OO.ui.ProcessDialog = function OoUiProcessDialog( manager, config ) {
+OO.ui.ProcessDialog = function OoUiProcessDialog( config ) {
        // Parent constructor
-       OO.ui.ProcessDialog.super.call( this, manager, config );
+       OO.ui.ProcessDialog.super.call( this, config );
 
        // Initialization
        this.$element.addClass( 'oo-ui-processDialog' );
@@ -5451,7 +6014,7 @@ OO.ui.ProcessDialog.prototype.initialize = function () {
        this.$errors
                .addClass( 'oo-ui-processDialog-errors' )
                .append( this.$errorsTitle, this.dismissButton.$element, this.retryButton.$element );
-       this.frame.$content
+       this.$content
                .addClass( 'oo-ui-processDialog-content' )
                .append( this.$errors );
        this.$navigation
@@ -5986,7 +6549,7 @@ OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
  *
  * @class
  * @extends OO.ui.Layout
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.LabelElement
  *
  * Available label alignment modes include:
  *  - left: Label is before the field and aligned away from it, best for when the user will be
@@ -6005,7 +6568,6 @@ OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
  * @cfg {string} [help] Explanatory text shown as a '?' icon.
  */
 OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
-       var popupButtonWidget;
        // Config initialization
        config = $.extend( { align: 'left' }, config );
 
@@ -6013,27 +6575,29 @@ OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
        OO.ui.FieldLayout.super.call( this, config );
 
        // Mixin constructors
-       this.$help = this.$( '<div>' );
-       OO.ui.LabeledElement.call( this, this.$( '<label>' ), config );
-       if ( config.help ) {
-               popupButtonWidget = new OO.ui.PopupButtonWidget( $.extend(
-                       {
-                               $: this.$,
-                               frameless: true,
-                               icon: 'info',
-                               title: config.help
-                       },
-                       config,
-                       { label: null }
-               ) );
-               popupButtonWidget.getPopup().$body.append( this.getElementDocument().createTextNode( config.help ) );
-               this.$help = popupButtonWidget.$element;
-       }
+       OO.ui.LabelElement.call( this, config );
 
        // Properties
        this.$field = this.$( '<div>' );
        this.field = field;
        this.align = null;
+       if ( config.help ) {
+               this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       $: this.$,
+                       classes: [ 'oo-ui-fieldLayout-help' ],
+                       framed: false,
+                       icon: 'info'
+               } );
+
+               this.popupButtonWidget.getPopup().$body.append(
+                       this.$( '<div>' )
+                               .text( config.help )
+                               .addClass( 'oo-ui-fieldLayout-help-content' )
+               );
+               this.$help = this.popupButtonWidget.$element;
+       } else {
+               this.$help = this.$( [] );
+       }
 
        // Events
        if ( this.field instanceof OO.ui.InputWidget ) {
@@ -6053,7 +6617,7 @@ OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.FieldLayout, OO.ui.Layout );
-OO.mixinClass( OO.ui.FieldLayout, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.FieldLayout, OO.ui.LabelElement );
 
 /* Methods */
 
@@ -6126,8 +6690,8 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
  *
  * @class
  * @extends OO.ui.Layout
- * @mixins OO.ui.LabeledElement
- * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.LabelElement
+ * @mixins OO.ui.IconElement
  * @mixins OO.ui.GroupElement
  *
  * @constructor
@@ -6143,9 +6707,9 @@ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
        OO.ui.FieldsetLayout.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<div>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<div>' ), config );
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.GroupElement.call( this, config );
 
        // Initialization
        this.$element
@@ -6159,8 +6723,8 @@ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.FieldsetLayout, OO.ui.Layout );
-OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.IconElement );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.GroupElement );
 
 /* Static Properties */
@@ -6553,7 +7117,7 @@ OO.ui.StackLayout = function OoUiStackLayout( config ) {
        OO.ui.StackLayout.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$element, config );
+       OO.ui.GroupElement.call( this, $.extend( {}, config, { $group: this.$element } ) );
 
        // Properties
        this.currentItem = null;
@@ -6739,9 +7303,9 @@ OO.ui.BarToolGroup.static.name = 'bar';
  * @abstract
  * @class
  * @extends OO.ui.ToolGroup
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.IndicatorElement
+ * @mixins OO.ui.LabelElement
  * @mixins OO.ui.TitledElement
  * @mixins OO.ui.ClippableElement
  *
@@ -6758,11 +7322,11 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        OO.ui.PopupToolGroup.super.call( this, toolbar, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.TitledElement.call( this, this.$element, config );
-       OO.ui.ClippableElement.call( this, this.$group, config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.IndicatorElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.TitledElement.call( this, config );
+       OO.ui.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );
 
        // Properties
        this.active = false;
@@ -6798,9 +7362,9 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.PopupToolGroup, OO.ui.ToolGroup );
-OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IndicatedElement );
-OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IconElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IndicatorElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.TitledElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.ClippableElement );
 
@@ -6877,13 +7441,25 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
        if ( this.active !== value ) {
                this.active = value;
                if ( value ) {
-                       this.setClipping( true );
-                       this.$element.addClass( 'oo-ui-popupToolGroup-active' );
                        this.getElementDocument().addEventListener( 'mouseup', this.onBlurHandler, true );
+
+                       // Try anchoring the popup to the left first
+                       this.$element.addClass( 'oo-ui-popupToolGroup-active oo-ui-popupToolGroup-left' );
+                       this.toggleClipping( true );
+                       if ( this.isClippedHorizontally() ) {
+                               // Anchoring to the left caused the popup to clip, so anchor it to the right instead
+                               this.toggleClipping( false );
+                               this.$element
+                                       .removeClass( 'oo-ui-popupToolGroup-left' )
+                                       .addClass( 'oo-ui-popupToolGroup-right' );
+                               this.toggleClipping( true );
+                       }
                } else {
-                       this.setClipping( false );
-                       this.$element.removeClass( 'oo-ui-popupToolGroup-active' );
                        this.getElementDocument().removeEventListener( 'mouseup', this.onBlurHandler, true );
+                       this.$element.removeClass(
+                               'oo-ui-popupToolGroup-active oo-ui-popupToolGroup-left  oo-ui-popupToolGroup-right'
+                       );
+                       this.toggleClipping( false );
                }
        }
 };
@@ -6977,7 +7553,7 @@ OO.ui.MenuToolGroup.prototype.onUpdateState = function () {
  * @abstract
  * @class
  * @extends OO.ui.Tool
- * @mixins OO.ui.PopuppableElement
+ * @mixins OO.ui.PopupElement
  *
  * @constructor
  * @param {OO.ui.Toolbar} toolbar
@@ -6988,7 +7564,7 @@ OO.ui.PopupTool = function OoUiPopupTool( toolbar, config ) {
        OO.ui.PopupTool.super.call( this, toolbar, config );
 
        // Mixin constructors
-       OO.ui.PopuppableElement.call( this, config );
+       OO.ui.PopupElement.call( this, config );
 
        // Initialization
        this.$element
@@ -6999,7 +7575,7 @@ OO.ui.PopupTool = function OoUiPopupTool( toolbar, config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.PopupTool, OO.ui.Tool );
-OO.mixinClass( OO.ui.PopupTool, OO.ui.PopuppableElement );
+OO.mixinClass( OO.ui.PopupTool, OO.ui.PopupElement );
 
 /* Methods */
 
@@ -7035,12 +7611,11 @@ OO.ui.PopupTool.prototype.onUpdateState = function () {
  * @extends OO.ui.GroupElement
  *
  * @constructor
- * @param {jQuery} $group Container node, assigned to #$group
  * @param {Object} [config] Configuration options
  */
-OO.ui.GroupWidget = function OoUiGroupWidget( $element, config ) {
+OO.ui.GroupWidget = function OoUiGroupWidget( config ) {
        // Parent constructor
-       OO.ui.GroupWidget.super.call( this, $element, config );
+       OO.ui.GroupWidget.super.call( this, config );
 };
 
 /* Setup */
@@ -7133,7 +7708,7 @@ OO.ui.ItemWidget.prototype.setElementGroup = function ( group ) {
  * @constructor
  * @param {OO.ui.TextInputWidget} input Input widget
  * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$overlay=this.$( 'body' )] Overlay layer
+ * @cfg {jQuery} [$overlay] Overlay layer; defaults to the current window's overlay.
  */
 OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
        // Config intialization
@@ -7141,7 +7716,10 @@ OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
 
        // Properties
        this.lookupInput = input;
-       this.$overlay = config.$overlay || this.$( 'body,.oo-ui-window-overlay' ).last();
+       this.$overlay = config.$overlay || ( this.$.$iframe || this.$element ).closest( '.oo-ui-window' ).children( '.oo-ui-window-overlay' );
+       if ( this.$overlay.length === 0 ) {
+               this.$overlay = this.$( 'body' );
+       }
        this.lookupMenu = new OO.ui.TextInputMenuWidget( this, {
                $: OO.ui.Element.getJQuery( this.$overlay ),
                input: this.lookupInput,
@@ -7366,7 +7944,7 @@ OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.GroupElement
- * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.IconElement
  *
  * @constructor
  * @param {OO.ui.OutlineWidget} outline Outline to control
@@ -7374,14 +7952,14 @@ OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
  */
 OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, config ) {
        // Configuration initialization
-       config = $.extend( { icon: 'add-item' }, config );
+       config = $.extend( { icon: 'add' }, config );
 
        // Parent constructor
        OO.ui.OutlineControlsWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
-       OO.ui.IconedElement.call( this, this.$( '<div>' ), config );
+       OO.ui.GroupElement.call( this, config );
+       OO.ui.IconElement.call( this, config );
 
        // Properties
        this.outline = outline;
@@ -7428,7 +8006,7 @@ OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, confi
 
 OO.inheritClass( OO.ui.OutlineControlsWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.GroupElement );
-OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.IconElement );
 
 /* Events */
 
@@ -7551,7 +8129,7 @@ OO.ui.ButtonGroupWidget = function OoUiButtonGroupWidget( config ) {
        OO.ui.ButtonGroupWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$element, config );
+       OO.ui.GroupElement.call( this, $.extend( {}, config, { $group: this.$element } ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-buttonGroupWidget' );
@@ -7570,12 +8148,12 @@ OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.ButtonedElement
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.ButtonElement
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.IndicatorElement
+ * @mixins OO.ui.LabelElement
  * @mixins OO.ui.TitledElement
- * @mixins OO.ui.FlaggableElement
+ * @mixins OO.ui.FlaggedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -7590,12 +8168,12 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
        OO.ui.ButtonWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.ButtonedElement.call( this, this.$( '<a>' ), config );
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.TitledElement.call( this, this.$button, config );
-       OO.ui.FlaggableElement.call( this, config );
+       OO.ui.ButtonElement.call( this, config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.IndicatorElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.TitledElement.call( this, config, $.extend( {}, config, { $titled: this.$button } ) );
+       OO.ui.FlaggedElement.call( this, config );
 
        // Properties
        this.href = null;
@@ -7620,12 +8198,12 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.ButtonWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.ButtonedElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IndicatedElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.ButtonElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IconElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IndicatorElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.ButtonWidget, OO.ui.TitledElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.FlaggableElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.FlaggedElement );
 
 /* Events */
 
@@ -7732,11 +8310,13 @@ OO.ui.ButtonWidget.prototype.setTarget = function ( target ) {
  *
  * @class
  * @extends OO.ui.ButtonWidget
+ * @mixins OO.ui.PendingElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {string} [action] Symbolic action name
  * @cfg {string[]} [modes] Symbolic mode names
+ * @cfg {boolean} [framed=false] Render button with a frame
  */
 OO.ui.ActionWidget = function OoUiActionWidget( config ) {
        // Config intialization
@@ -7745,6 +8325,9 @@ OO.ui.ActionWidget = function OoUiActionWidget( config ) {
        // Parent constructor
        OO.ui.ActionWidget.super.call( this, config );
 
+       // Mixin constructors
+       OO.ui.PendingElement.call( this, config );
+
        // Properties
        this.action = config.action || '';
        this.modes = config.modes || [];
@@ -7758,6 +8341,7 @@ OO.ui.ActionWidget = function OoUiActionWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.ActionWidget, OO.ui.ButtonWidget );
+OO.mixinClass( OO.ui.ActionWidget, OO.ui.PendingElement );
 
 /* Events */
 
@@ -7822,7 +8406,7 @@ OO.ui.ActionWidget.prototype.propagateResize = function () {
  */
 OO.ui.ActionWidget.prototype.setIcon = function () {
        // Mixin method
-       OO.ui.IconedElement.prototype.setIcon.apply( this, arguments );
+       OO.ui.IconElement.prototype.setIcon.apply( this, arguments );
        this.propagateResize();
 
        return this;
@@ -7833,7 +8417,7 @@ OO.ui.ActionWidget.prototype.setIcon = function () {
  */
 OO.ui.ActionWidget.prototype.setLabel = function () {
        // Mixin method
-       OO.ui.LabeledElement.prototype.setLabel.apply( this, arguments );
+       OO.ui.LabelElement.prototype.setLabel.apply( this, arguments );
        this.propagateResize();
 
        return this;
@@ -7844,7 +8428,7 @@ OO.ui.ActionWidget.prototype.setLabel = function () {
  */
 OO.ui.ActionWidget.prototype.setFlags = function () {
        // Mixin method
-       OO.ui.FlaggableElement.prototype.setFlags.apply( this, arguments );
+       OO.ui.FlaggedElement.prototype.setFlags.apply( this, arguments );
        this.propagateResize();
 
        return this;
@@ -7855,7 +8439,7 @@ OO.ui.ActionWidget.prototype.setFlags = function () {
  */
 OO.ui.ActionWidget.prototype.clearFlags = function () {
        // Mixin method
-       OO.ui.FlaggableElement.prototype.clearFlags.apply( this, arguments );
+       OO.ui.FlaggedElement.prototype.clearFlags.apply( this, arguments );
        this.propagateResize();
 
        return this;
@@ -7880,7 +8464,7 @@ OO.ui.ActionWidget.prototype.toggle = function () {
  *
  * @class
  * @extends OO.ui.ButtonWidget
- * @mixins OO.ui.PopuppableElement
+ * @mixins OO.ui.PopupElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -7890,7 +8474,7 @@ OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
        OO.ui.PopupButtonWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.PopuppableElement.call( this, config );
+       OO.ui.PopupElement.call( this, config );
 
        // Initialization
        this.$element
@@ -7901,7 +8485,7 @@ OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.PopupButtonWidget, OO.ui.ButtonWidget );
-OO.mixinClass( OO.ui.PopupButtonWidget, OO.ui.PopuppableElement );
+OO.mixinClass( OO.ui.PopupButtonWidget, OO.ui.PopupElement );
 
 /* Methods */
 
@@ -7986,9 +8570,11 @@ OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
 /**
  * Icon widget.
  *
+ * See OO.ui.IconElement for more information.
+ *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.IconElement
  * @mixins OO.ui.TitledElement
  *
  * @constructor
@@ -8002,8 +8588,8 @@ OO.ui.IconWidget = function OoUiIconWidget( config ) {
        OO.ui.IconWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$element, config );
-       OO.ui.TitledElement.call( this, this.$element, config );
+       OO.ui.IconElement.call( this, $.extend( {}, config, { $icon: this.$element } ) );
+       OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$element } ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-iconWidget' );
@@ -8012,7 +8598,7 @@ OO.ui.IconWidget = function OoUiIconWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.IconWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.IconWidget, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.IconWidget, OO.ui.IconElement );
 OO.mixinClass( OO.ui.IconWidget, OO.ui.TitledElement );
 
 /* Static Properties */
@@ -8022,11 +8608,11 @@ OO.ui.IconWidget.static.tagName = 'span';
 /**
  * Indicator widget.
  *
- * See OO.ui.IndicatedElement for more information.
+ * See OO.ui.IndicatorElement for more information.
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.IndicatorElement
  * @mixins OO.ui.TitledElement
  *
  * @constructor
@@ -8040,8 +8626,8 @@ OO.ui.IndicatorWidget = function OoUiIndicatorWidget( config ) {
        OO.ui.IndicatorWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.IndicatedElement.call( this, this.$element, config );
-       OO.ui.TitledElement.call( this, this.$element, config );
+       OO.ui.IndicatorElement.call( this, $.extend( {}, config, { $indicator: this.$element } ) );
+       OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$element } ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-indicatorWidget' );
@@ -8050,7 +8636,7 @@ OO.ui.IndicatorWidget = function OoUiIndicatorWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.IndicatorWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.IndicatorElement );
 OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.TitledElement );
 
 /* Static Properties */
@@ -8063,13 +8649,13 @@ OO.ui.IndicatorWidget.static.tagName = 'span';
  * Inline menus provide a control for accessing a menu and compose a menu within the widget, which
  * can be accessed using the #getMenu method.
  *
- * Use with OO.ui.MenuOptionWidget.
+ * Use with OO.ui.MenuItemWidget.
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.IndicatorElement
+ * @mixins OO.ui.LabelElement
  * @mixins OO.ui.TitledElement
  *
  * @constructor
@@ -8084,10 +8670,10 @@ OO.ui.InlineMenuWidget = function OoUiInlineMenuWidget( config ) {
        OO.ui.InlineMenuWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.TitledElement.call( this, this.$label, config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.IndicatorElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$label } ) );
 
        // Properties
        this.menu = new OO.ui.MenuWidget( $.extend( { $: this.$, widget: this }, config.menu ) );
@@ -8109,9 +8695,9 @@ OO.ui.InlineMenuWidget = function OoUiInlineMenuWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.InlineMenuWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IndicatedElement );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IconElement );
+OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IndicatorElement );
+OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.TitledElement );
 
 /* Methods */
@@ -8174,6 +8760,7 @@ OO.ui.InlineMenuWidget.prototype.onClick = function ( e ) {
  * @abstract
  * @class
  * @extends OO.ui.Widget
+ * @mixins OO.ui.FlaggedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -8189,6 +8776,9 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
        // Parent constructor
        OO.ui.InputWidget.super.call( this, config );
 
+       // Mixin constructors
+       OO.ui.FlaggedElement.call( this, config );
+
        // Properties
        this.$input = this.getInputElement( config );
        this.value = '';
@@ -8210,6 +8800,7 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.InputWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.InputWidget, OO.ui.FlaggedElement );
 
 /* Events */
 
@@ -8448,45 +9039,52 @@ OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
  *
  * @class
  * @extends OO.ui.InputWidget
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.IndicatorElement
+ * @mixins OO.ui.PendingElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {string} [placeholder] Placeholder text
- * @cfg {string} [icon] Symbolic name of icon
  * @cfg {boolean} [multiline=false] Allow multiple lines of text
  * @cfg {boolean} [autosize=false] Automatically resize to fit content
  * @cfg {boolean} [maxRows=10] Maximum number of rows to make visible when autosizing
+ * @cfg {RegExp|string} [validate] Regular expression (or symbolic name referencing
+ *  one, see #static-validationPatterns)
  */
 OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
-       var widget = this;
-       config = $.extend( { maxRows: 10 }, config );
+       // Configuration initialization
+       config = config || {};
 
        // Parent constructor
        OO.ui.TextInputWidget.super.call( this, config );
 
+       // Mixin constructors
+       OO.ui.IconElement.call( this, config );
+       OO.ui.IndicatorElement.call( this, config );
+       OO.ui.PendingElement.call( this, config );
+
        // Properties
-       this.pending = 0;
        this.multiline = !!config.multiline;
        this.autosize = !!config.autosize;
-       this.maxRows = config.maxRows;
+       this.maxRows = config.maxRows !== undefined ? config.maxRows : 10;
+       this.validate = null;
+
+       this.setValidation( config.validate );
 
        // Events
-       this.$input.on( 'keypress', OO.ui.bind( this.onKeyPress, this ) );
+       this.$input.on( {
+               keypress: OO.ui.bind( this.onKeyPress, this ),
+               blur: OO.ui.bind( this.setValidityFlag, this )
+       } );
        this.$element.on( 'DOMNodeInsertedIntoDocument', OO.ui.bind( this.onElementAttach, this ) );
+       this.$icon.on( 'mousedown', OO.ui.bind( this.onIconMouseDown, this ) );
+       this.$indicator.on( 'mousedown', OO.ui.bind( this.onIndicatorMouseDown, this ) );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-textInputWidget' );
-       if ( config.icon ) {
-               this.$element.addClass( 'oo-ui-textInputWidget-decorated' );
-               this.$element.append(
-                       this.$( '<span>' )
-                               .addClass( 'oo-ui-textInputWidget-icon oo-ui-icon-' + config.icon )
-                               .mousedown( function () {
-                                       widget.$input[0].focus();
-                                       return false;
-                               } )
-               );
-       }
+       this.$element
+               .addClass( 'oo-ui-textInputWidget' )
+               .append( this.$icon, this.$indicator );
        if ( config.placeholder ) {
                this.$input.attr( 'placeholder', config.placeholder );
        }
@@ -8496,6 +9094,16 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.TextInputWidget, OO.ui.InputWidget );
+OO.mixinClass( OO.ui.TextInputWidget, OO.ui.IconElement );
+OO.mixinClass( OO.ui.TextInputWidget, OO.ui.IndicatorElement );
+OO.mixinClass( OO.ui.TextInputWidget, OO.ui.PendingElement );
+
+/* Static properties */
+
+OO.ui.TextInputWidget.static.validationPatterns = {
+       'non-empty': /.+/,
+       integer: /^\d+$/
+};
 
 /* Events */
 
@@ -8507,8 +9115,48 @@ OO.inheritClass( OO.ui.TextInputWidget, OO.ui.InputWidget );
  * @event enter
  */
 
+/**
+ * User clicks the icon.
+ *
+ * @event icon
+ */
+
+/**
+ * User clicks the indicator.
+ *
+ * @event indicator
+ */
+
 /* Methods */
 
+/**
+ * Handle icon mouse down events.
+ *
+ * @param {jQuery.Event} e Mouse down event
+ * @fires icon
+ */
+OO.ui.TextInputWidget.prototype.onIconMouseDown = function ( e ) {
+       if ( e.which === 1 ) {
+               this.$input[0].focus();
+               this.emit( 'icon' );
+               return false;
+       }
+};
+
+/**
+ * Handle indicator mouse down events.
+ *
+ * @param {jQuery.Event} e Mouse down event
+ * @fires indicator
+ */
+OO.ui.TextInputWidget.prototype.onIndicatorMouseDown = function ( e ) {
+       if ( e.which === 1 ) {
+               this.$input[0].focus();
+               this.emit( 'indicator' );
+               return false;
+       }
+};
+
 /**
  * Handle key press events.
  *
@@ -8547,6 +9195,7 @@ OO.ui.TextInputWidget.prototype.setValue = function ( value ) {
        // Parent method
        OO.ui.TextInputWidget.super.prototype.setValue.call( this, value );
 
+       this.setValidityFlag();
        this.adjustSize();
        return this;
 };
@@ -8559,31 +9208,34 @@ OO.ui.TextInputWidget.prototype.setValue = function ( value ) {
  * @chainable
  */
 OO.ui.TextInputWidget.prototype.adjustSize = function () {
-       var $clone, scrollHeight, innerHeight, outerHeight, maxInnerHeight, idealHeight;
+       var $clone, scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError, idealHeight;
 
        if ( this.multiline && this.autosize ) {
                $clone = this.$input.clone()
                        .val( this.$input.val() )
+                       // Set inline height property to 0 to measure scroll height
                        .css( { height: 0 } )
                        .insertAfter( this.$input );
-               // Set inline height property to 0 to measure scroll height
                scrollHeight = $clone[0].scrollHeight;
                // Remove inline height property to measure natural heights
                $clone.css( 'height', '' );
                innerHeight = $clone.innerHeight();
                outerHeight = $clone.outerHeight();
                // Measure max rows height
-               $clone.attr( 'rows', this.maxRows ).css( 'height', 'auto' );
+               $clone.attr( 'rows', this.maxRows ).css( 'height', 'auto' ).val( '' );
                maxInnerHeight = $clone.innerHeight();
-               $clone.removeAttr( 'rows' ).css( 'height', '' );
+               // Difference between reported innerHeight and scrollHeight with no scrollbars present
+               // Equals 1 on Blink-based browsers and 0 everywhere else
+               measurementError = maxInnerHeight - $clone[0].scrollHeight;
                $clone.remove();
-               idealHeight = Math.min( maxInnerHeight, scrollHeight );
+               idealHeight = Math.min( maxInnerHeight, scrollHeight + measurementError );
                // Only apply inline height when expansion beyond natural height is needed
-               this.$input.css(
-                       'height',
+               if ( idealHeight > innerHeight ) {
                        // Use the difference between the inner and outer height as a buffer
-                       idealHeight > outerHeight ? idealHeight + ( outerHeight - innerHeight ) : ''
-               );
+                       this.$input.css( 'height', idealHeight + ( outerHeight - innerHeight ) );
+               } else {
+                       this.$input.css( 'height', '' );
+               }
        }
        return this;
 };
@@ -8619,53 +9271,169 @@ OO.ui.TextInputWidget.prototype.isAutosizing = function () {
 };
 
 /**
- * Check if input is pending.
+ * Select the contents of the input.
  *
- * @return {boolean}
+ * @chainable
  */
-OO.ui.TextInputWidget.prototype.isPending = function () {
-       return !!this.pending;
+OO.ui.TextInputWidget.prototype.select = function () {
+       this.$input.select();
+       return this;
 };
 
 /**
- * Increase the pending stack.
- *
- * @chainable
+ * Sets the validation pattern to use.
+ * @param validate {RegExp|string|null} Regular expression (or symbolic name referencing
+ *  one, see #static-validationPatterns)
  */
-OO.ui.TextInputWidget.prototype.pushPending = function () {
-       if ( this.pending === 0 ) {
-               this.$element.addClass( 'oo-ui-textInputWidget-pending' );
-               this.$input.addClass( 'oo-ui-texture-pending' );
+OO.ui.TextInputWidget.prototype.setValidation = function ( validate ) {
+       if ( validate instanceof RegExp ) {
+               this.validate = validate;
+       } else {
+               this.validate = this.constructor.static.validationPatterns[validate] || /.*/;
        }
-       this.pending++;
+};
 
-       return this;
+/**
+ * Sets the 'invalid' flag appropriately.
+ */
+OO.ui.TextInputWidget.prototype.setValidityFlag = function () {
+       this.isValid().done( OO.ui.bind( function ( valid ) {
+               this.setFlags( { invalid: !valid } );
+       }, this ) );
 };
 
 /**
- * Reduce the pending stack.
+ * Returns whether or not the current value is considered valid, according to the
+ * supplied validation pattern.
  *
- * Clamped at zero.
+ * @return {jQuery.Deferred}
+ */
+OO.ui.TextInputWidget.prototype.isValid = function () {
+       return $.Deferred().resolve( !!this.getValue().match( this.validate ) ).promise();
+};
+
+/**
+ * Text input with a menu of optional values.
  *
- * @chainable
+ * @class
+ * @extends OO.ui.Widget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {Object} [menu] Configuration options to pass to menu widget
+ * @cfg {Object} [input] Configuration options to pass to input widget
+ * @cfg {jQuery} [$overlay] Overlay layer; defaults to the current window's overlay.
  */
-OO.ui.TextInputWidget.prototype.popPending = function () {
-       if ( this.pending === 1 ) {
-               this.$element.removeClass( 'oo-ui-textInputWidget-pending' );
-               this.$input.removeClass( 'oo-ui-texture-pending' );
+OO.ui.ComboBoxWidget = function OoUiComboBoxWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.ComboBoxWidget.super.call( this, config );
+
+       // Properties
+       this.$overlay = config.$overlay || ( this.$.$iframe || this.$element ).closest( '.oo-ui-window' ).children( '.oo-ui-window-overlay' );
+       if ( this.$overlay.length === 0 ) {
+               this.$overlay = this.$( 'body' );
        }
-       this.pending = Math.max( 0, this.pending - 1 );
+       this.input = new OO.ui.TextInputWidget( $.extend(
+               { $: this.$, indicator: 'down', disabled: this.isDisabled() },
+               config.input
+       ) );
+       this.menu = new OO.ui.TextInputMenuWidget( this.input, $.extend(
+               { $: this.$, widget: this, input: this.input, disabled: this.isDisabled() },
+               config.menu
+       ) );
 
-       return this;
+       // Events
+       this.input.connect( this, {
+               change: 'onInputChange',
+               indicator: 'onInputIndicator',
+               enter: 'onInputEnter'
+       } );
+       this.menu.connect( this, {
+               choose: 'onMenuChoose',
+               add: 'onMenuItemsChange',
+               remove: 'onMenuItemsChange'
+       } );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-comboBoxWidget' ).append( this.input.$element );
+       this.$overlay.append( this.menu.$element );
+       this.onMenuItemsChange();
 };
 
+/* Setup */
+
+OO.inheritClass( OO.ui.ComboBoxWidget, OO.ui.Widget );
+
+/* Methods */
+
 /**
- * Select the contents of the input.
+ * Handle input change events.
  *
- * @chainable
+ * @param {string} value New value
  */
-OO.ui.TextInputWidget.prototype.select = function () {
-       this.$input.select();
+OO.ui.ComboBoxWidget.prototype.onInputChange = function ( value ) {
+       var match = this.menu.getItemFromData( value );
+
+       this.menu.selectItem( match );
+
+       if ( !this.isDisabled() ) {
+               this.menu.toggle( true );
+       }
+};
+
+/**
+ * Handle input indicator events.
+ */
+OO.ui.ComboBoxWidget.prototype.onInputIndicator = function () {
+       if ( !this.isDisabled() ) {
+               this.menu.toggle();
+       }
+};
+
+/**
+ * Handle input enter events.
+ */
+OO.ui.ComboBoxWidget.prototype.onInputEnter = function () {
+       if ( !this.isDisabled() ) {
+               this.menu.toggle( false );
+       }
+};
+
+/**
+ * Handle menu choose events.
+ *
+ * @param {OO.ui.OptionWidget} item Chosen item
+ */
+OO.ui.ComboBoxWidget.prototype.onMenuChoose = function ( item ) {
+       if ( item ) {
+               this.input.setValue( item.getData() );
+       }
+};
+
+/**
+ * Handle menu item change events.
+ */
+OO.ui.ComboBoxWidget.prototype.onMenuItemsChange = function () {
+       this.$element.toggleClass( 'oo-ui-comboBoxWidget-empty', this.menu.isEmpty() );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ComboBoxWidget.prototype.setDisabled = function ( disabled ) {
+       // Parent method
+       OO.ui.ComboBoxWidget.super.prototype.setDisabled.call( this, disabled );
+
+       if ( this.input ) {
+               this.input.setDisabled( this.isDisabled() );
+       }
+       if ( this.menu ) {
+               this.menu.setDisabled( this.isDisabled() );
+       }
+
        return this;
 };
 
@@ -8674,7 +9442,7 @@ OO.ui.TextInputWidget.prototype.select = function () {
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.LabelElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -8687,7 +9455,8 @@ OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
        OO.ui.LabelWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.LabeledElement.call( this, this.$element, config );
+       OO.ui.LabelElement.call( this, $.extend( {}, config, { $label: this.$element } ) );
+       OO.ui.TitledElement.call( this, config );
 
        // Properties
        this.input = config.input;
@@ -8704,11 +9473,12 @@ OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.LabelWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.LabelWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.LabelWidget, OO.ui.LabelElement );
+OO.mixinClass( OO.ui.LabelWidget, OO.ui.TitledElement );
 
 /* Static Properties */
 
-OO.ui.LabelWidget.static.tagName = 'label';
+OO.ui.LabelWidget.static.tagName = 'span';
 
 /* Methods */
 
@@ -8727,8 +9497,8 @@ OO.ui.LabelWidget.prototype.onClick = function () {
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.LabeledElement
- * @mixins OO.ui.FlaggableElement
+ * @mixins OO.ui.LabelElement
+ * @mixins OO.ui.FlaggedElement
  *
  * @constructor
  * @param {Mixed} data Option data
@@ -8744,8 +9514,8 @@ OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
 
        // Mixin constructors
        OO.ui.ItemWidget.call( this );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.FlaggableElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.FlaggedElement.call( this, config );
 
        // Properties
        this.data = data;
@@ -8769,13 +9539,11 @@ OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
 
 OO.inheritClass( OO.ui.OptionWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.OptionWidget, OO.ui.ItemWidget );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.LabeledElement );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.FlaggableElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.LabelElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.FlaggedElement );
 
 /* Static Properties */
 
-OO.ui.OptionWidget.static.tagName = 'li';
-
 OO.ui.OptionWidget.static.selectable = true;
 
 OO.ui.OptionWidget.static.highlightable = true;
@@ -8853,6 +9621,7 @@ OO.ui.OptionWidget.prototype.setSelected = function ( state ) {
                if ( state && this.constructor.static.scrollIntoViewOnSelect ) {
                        this.scrollElementIntoView();
                }
+               this.updateThemeClasses();
        }
        return this;
 };
@@ -8867,6 +9636,7 @@ OO.ui.OptionWidget.prototype.setHighlighted = function ( state ) {
        if ( this.constructor.static.highlightable ) {
                this.highlighted = !!state;
                this.$element.toggleClass( 'oo-ui-optionWidget-highlighted', state );
+               this.updateThemeClasses();
        }
        return this;
 };
@@ -8881,6 +9651,7 @@ OO.ui.OptionWidget.prototype.setPressed = function ( state ) {
        if ( this.constructor.static.pressable ) {
                this.pressed = !!state;
                this.$element.toggleClass( 'oo-ui-optionWidget-pressed', state );
+               this.updateThemeClasses();
        }
        return this;
 };
@@ -8931,8 +9702,8 @@ OO.ui.OptionWidget.prototype.getData = function () {
  *
  * @class
  * @extends OO.ui.OptionWidget
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.IndicatorElement
  *
  * @constructor
  * @param {Mixed} data Option data
@@ -8943,8 +9714,8 @@ OO.ui.DecoratedOptionWidget = function OoUiDecoratedOptionWidget( data, config )
        OO.ui.DecoratedOptionWidget.super.call( this, data, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.IndicatorElement.call( this, config );
 
        // Initialization
        this.$element
@@ -8956,8 +9727,8 @@ OO.ui.DecoratedOptionWidget = function OoUiDecoratedOptionWidget( data, config )
 /* Setup */
 
 OO.inheritClass( OO.ui.DecoratedOptionWidget, OO.ui.OptionWidget );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.IconElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.IndicatorElement );
 
 /**
  * Option widget that looks like a button.
@@ -8966,7 +9737,7 @@ OO.mixinClass( OO.ui.OptionWidget, OO.ui.IndicatedElement );
  *
  * @class
  * @extends OO.ui.DecoratedOptionWidget
- * @mixins OO.ui.ButtonedElement
+ * @mixins OO.ui.ButtonElement
  *
  * @constructor
  * @param {Mixed} data Option data
@@ -8977,7 +9748,7 @@ OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( data, config ) {
        OO.ui.ButtonOptionWidget.super.call( this, data, config );
 
        // Mixin constructors
-       OO.ui.ButtonedElement.call( this, this.$( '<a>' ), config );
+       OO.ui.ButtonElement.call( this, config );
 
        // Initialization
        this.$element.addClass( 'oo-ui-buttonOptionWidget' );
@@ -8988,7 +9759,7 @@ OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( data, config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.ButtonOptionWidget, OO.ui.DecoratedOptionWidget );
-OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.ButtonedElement );
+OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.ButtonElement );
 
 /* Static Properties */
 
@@ -9151,6 +9922,7 @@ OO.ui.OutlineItemWidget.prototype.getLevel = function () {
  */
 OO.ui.OutlineItemWidget.prototype.setMovable = function ( movable ) {
        this.movable = !!movable;
+       this.updateThemeClasses();
        return this;
 };
 
@@ -9164,6 +9936,7 @@ OO.ui.OutlineItemWidget.prototype.setMovable = function ( movable ) {
  */
 OO.ui.OutlineItemWidget.prototype.setRemovable = function ( removable ) {
        this.removable = !!removable;
+       this.updateThemeClasses();
        return this;
 };
 
@@ -9186,6 +9959,7 @@ OO.ui.OutlineItemWidget.prototype.setLevel = function ( level ) {
                        this.$element.removeClass( levelClass + i );
                }
        }
+       this.updateThemeClasses();
 
        return this;
 };
@@ -9195,7 +9969,7 @@ OO.ui.OutlineItemWidget.prototype.setLevel = function ( level ) {
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.LabelElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -9218,16 +9992,16 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        OO.ui.PopupWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.LabeledElement.call( this, this.$( '<div>' ), config );
-       OO.ui.ClippableElement.call( this, this.$( '<div>' ), config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.ClippableElement.call( this, config );
 
        // Properties
        this.visible = false;
        this.$popup = this.$( '<div>' );
        this.$head = this.$( '<div>' );
-       this.$body = this.$clippable;
+       this.$body = this.$( '<div>' );
        this.$anchor = this.$( '<div>' );
-       this.$container = config.$container || this.$( 'body' );
+       this.$container = config.$container; // If undefined, will be computed lazily in updateDimensions()
        this.autoClose = !!config.autoClose;
        this.$autoCloseIgnore = config.$autoCloseIgnore;
        this.transitionTimeout = null;
@@ -9265,12 +10039,13 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        if ( config.padded ) {
                this.$body.addClass( 'oo-ui-popupWidget-body-padded' );
        }
+       this.setClippableElement( this.$body );
 };
 
 /* Setup */
 
 OO.inheritClass( OO.ui.PopupWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.PopupWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.PopupWidget, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.PopupWidget, OO.ui.ClippableElement );
 
 /* Events */
@@ -9364,13 +10139,13 @@ OO.ui.PopupWidget.prototype.toggle = function ( show ) {
 
        if ( change ) {
                if ( show ) {
-                       this.setClipping( true );
                        if ( this.autoClose ) {
                                this.bindMouseDownListener();
                        }
                        this.updateDimensions();
+                       this.toggleClipping( true );
                } else {
-                       this.setClipping( false );
+                       this.toggleClipping( false );
                        if ( this.autoClose ) {
                                this.unbindMouseDownListener();
                        }
@@ -9408,26 +10183,37 @@ OO.ui.PopupWidget.prototype.setSize = function ( width, height, transition ) {
  * @chainable
  */
 OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
-       var widget = this,
-               padding = 10,
-               originOffset = Math.round( this.$element.offset().left ),
-               containerLeft = Math.round( this.$container.offset().left ),
-               containerWidth = this.$container.innerWidth(),
-               containerRight = containerLeft + containerWidth,
-               popupOffset = this.width * ( { left: 0, center: -0.5, right: -1 } )[this.align],
-               anchorWidth = this.$anchor.width(),
-               popupLeft = popupOffset - padding,
-               popupRight = popupOffset + padding + this.width + padding,
-               overlapLeft = ( originOffset + popupLeft ) - containerLeft,
-               overlapRight = containerRight - ( originOffset + popupRight );
+       var popupOffset, originOffset, containerLeft, containerWidth, containerRight,
+               popupLeft, popupRight, overlapLeft, overlapRight, anchorWidth,
+               widget = this,
+               padding = 10;
 
-       // Prevent transition from being interrupted
-       clearTimeout( this.transitionTimeout );
-       if ( transition ) {
-               // Enable transition
-               this.$element.addClass( 'oo-ui-popupWidget-transitioning' );
+       if ( !this.$container ) {
+               // Lazy-initialize $container if not specified in constructor
+               this.$container = this.$( this.getClosestScrollableElementContainer() );
        }
 
+       // Set height and width before measuring things, since it might cause our measurements
+       // to change (e.g. due to scrollbars appearing or disappearing)
+       this.$popup.css( {
+               width: this.width,
+               height: this.height !== null ? this.height : 'auto'
+       } );
+
+       // Compute initial popupOffset based on alignment
+       popupOffset = this.width * ( { left: 0, center: -0.5, right: -1 } )[this.align];
+
+       // Figure out if this will cause the popup to go beyond the edge of the container
+       originOffset = Math.round( this.$element.offset().left );
+       containerLeft = Math.round( this.$container.offset().left );
+       containerWidth = this.$container.innerWidth();
+       containerRight = containerLeft + containerWidth;
+       popupLeft = popupOffset - padding;
+       popupRight = popupOffset + padding + this.width + padding;
+       overlapLeft = ( originOffset + popupLeft ) - containerLeft;
+       overlapRight = containerRight - ( originOffset + popupRight );
+
+       // Adjust offset to make the popup not go beyond the edge, if needed
        if ( overlapRight < 0 ) {
                popupOffset += overlapRight;
        } else if ( overlapLeft < 0 ) {
@@ -9435,18 +10221,22 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
        }
 
        // Adjust offset to avoid anchor being rendered too close to the edge
+       anchorWidth = this.$anchor.width();
        if ( this.align === 'right' ) {
                popupOffset += anchorWidth;
        } else if ( this.align === 'left' ) {
                popupOffset -= anchorWidth;
        }
 
-       // Position body relative to anchor and resize
-       this.$popup.css( {
-               left: popupOffset,
-               width: this.width,
-               height: this.height !== null ? this.height : 'auto'
-       } );
+       // Prevent transition from being interrupted
+       clearTimeout( this.transitionTimeout );
+       if ( transition ) {
+               // Enable transition
+               this.$element.addClass( 'oo-ui-popupWidget-transitioning' );
+       }
+
+       // Position body relative to anchor
+       this.$popup.css( 'margin-left', popupOffset );
 
        if ( transition ) {
                // Prevent transitioning after transition is complete
@@ -9458,6 +10248,9 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
                this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
        }
 
+       // Reevaluate clipping state since we've relocated and resized the popup
+       this.clip();
+
        return this;
 };
 
@@ -9619,7 +10412,7 @@ OO.ui.SearchWidget.prototype.getResults = function () {
 /**
  * Generic selection of options.
  *
- * Items can contain any rendering, and are uniquely identified by a has of thier data. Any widget
+ * Items can contain any rendering, and are uniquely identified by a hash of their data. Any widget
  * that provides options, from which the user must choose one, should be built on this class.
  *
  * Use together with OO.ui.OptionWidget.
@@ -9640,7 +10433,7 @@ OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
        OO.ui.SelectWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.GroupWidget.call( this, this.$element, config );
+       OO.ui.GroupWidget.call( this, $.extend( {}, config, { $group: this.$element } ) );
 
        // Properties
        this.pressed = false;
@@ -9704,10 +10497,6 @@ OO.mixinClass( OO.ui.SelectWidget, OO.ui.GroupWidget );
  * @param {OO.ui.OptionWidget[]} items Removed items
  */
 
-/* Static Properties */
-
-OO.ui.SelectWidget.static.tagName = 'ul';
-
 /* Methods */
 
 /**
@@ -10017,7 +10806,7 @@ OO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direct
                        // Default to n-1 instead of -1, if nothing is selected let's start at the end
                        Math.min( index, len );
 
-       while ( true ) {
+       while ( len !== 0 ) {
                i = ( i + inc + len ) % len;
                item = this.items[i];
                if ( item instanceof OO.ui.OptionWidget && item.isSelectable() ) {
@@ -10189,7 +10978,7 @@ OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
        OO.ui.MenuWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.ClippableElement.call( this, this.$group, config );
+       OO.ui.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );
 
        // Properties
        this.flashing = false;
@@ -10328,13 +11117,7 @@ OO.ui.MenuWidget.prototype.chooseItem = function ( item ) {
 };
 
 /**
- * Add items.
- *
- * Adding an existing item (by value) will move it.
- *
- * @param {OO.ui.MenuItemWidget[]} items Items to add
- * @param {number} [index] Index to insert items after
- * @chainable
+ * @inheritdoc
  */
 OO.ui.MenuWidget.prototype.addItems = function ( items, index ) {
        var i, len, item;
@@ -10350,13 +11133,42 @@ OO.ui.MenuWidget.prototype.addItems = function ( items, index ) {
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[i];
                if ( this.isVisible() ) {
-                       // Defer fitting label until
+                       // Defer fitting label until item has been attached
                        item.fitLabel();
                } else {
                        this.newItems.push( item );
                }
        }
 
+       // Reevaluate clipping
+       this.clip();
+
+       return this;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuWidget.prototype.removeItems = function ( items ) {
+       // Parent method
+       OO.ui.MenuWidget.super.prototype.removeItems.call( this, items );
+
+       // Reevaluate clipping
+       this.clip();
+
+       return this;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuWidget.prototype.clearItems = function () {
+       // Parent method
+       OO.ui.MenuWidget.super.prototype.clearItems.call( this );
+
+       // Reevaluate clipping
+       this.clip();
+
        return this;
 };
 
@@ -10364,7 +11176,7 @@ OO.ui.MenuWidget.prototype.addItems = function ( items, index ) {
  * @inheritdoc
  */
 OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
-       visible = !!visible && !!this.items.length;
+       visible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;
 
        var i, len,
                change = visible !== this.isVisible();
@@ -10387,7 +11199,7 @@ OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
                                }
                                this.newItems = null;
                        }
-                       this.setClipping( true );
+                       this.toggleClipping( true );
 
                        // Auto-hide
                        if ( this.autoHide ) {
@@ -10404,7 +11216,7 @@ OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
                        this.getElementDocument().removeEventListener(
                                'mousedown', this.onDocumentMouseDownHandler, true
                        );
-                       this.setClipping( false );
+                       this.toggleClipping( false );
                }
        }
 
@@ -10414,8 +11226,8 @@ OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
 /**
  * Menu for a text input widget.
  *
- * This menu is specially designed to be positioned beneeth the text input widget. Even if the input
- * is in a different frame, the menu's position is automatically calulated and maintained when the
+ * This menu is specially designed to be positioned beneath the text input widget. Even if the input
+ * is in a different frame, the menu's position is automatically calculated and maintained when the
  * menu is toggled or the window is resized.
  *
  * @class
@@ -10462,6 +11274,13 @@ OO.ui.TextInputMenuWidget.prototype.toggle = function ( visible ) {
 
        var 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();
+       }
+
        // Parent method
        OO.ui.TextInputMenuWidget.super.prototype.toggle.call( this, visible );
 
@@ -10473,6 +11292,7 @@ OO.ui.TextInputMenuWidget.prototype.toggle = function ( visible ) {
                        this.$( this.getElementWindow() ).off( 'resize', this.onWindowResizeHandler );
                }
        }
+
        return this;
 };
 
@@ -10489,10 +11309,10 @@ OO.ui.TextInputMenuWidget.prototype.position = function () {
        // Position under input
        dimensions.top += $container.height();
 
-       // Compensate for frame position if in a differnt frame
-       if ( this.input.$.frame && this.input.$.context !== this.$element[0].ownerDocument ) {
+       // Compensate for frame position if in a different frame
+       if ( this.input.$.$iframe && this.input.$.context !== this.$element[0].ownerDocument ) {
                frameOffset = OO.ui.Element.getRelativePosition(
-                       this.input.$.frame.$element, this.$element.offsetParent()
+                       this.input.$.$iframe, this.$element.offsetParent()
                );
                dimensions.left += frameOffset.left;
                dimensions.top += frameOffset.top;
@@ -10501,12 +11321,14 @@ OO.ui.TextInputMenuWidget.prototype.position = function () {
                if ( this.$element.css( 'direction' ) === 'rtl' ) {
                        dimensions.right = this.$element.parent().position().left -
                                $container.width() - dimensions.left;
-                       // Erase the value for 'left':
+                       // Erase the value for 'left'
                        delete dimensions.left;
                }
        }
        this.$element.css( dimensions );
        this.setIdealSize( $container.width() );
+       // We updated the position, so re-evaluate the clipping state
+       this.clip();
 
        return this;
 };
index deca745..7f1fa34 100644 (file)
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-07-22T21:39:24Z
+ * Date: 2014-09-11T19:39:50Z
+ */
+/*
+ * Blank theme mixins.
+ *
+ * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
+ * additional rules to the base styles.
  */
-/* Textures */
-
-.oo-ui-texture-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-
-.oo-ui-texture-transparency {
-  background-image: /* @embed */ url(images/textures/transparency.png);
-}
-
-/* RTL Definitions */
-
-/* @noflip */
-
-.oo-ui-rtl {
-  direction: rtl;
-}
-
-/* @noflip */
-
-.oo-ui-ltr {
-  direction: ltr;
-}
-
-.oo-ui-frame {
-  padding: 0;
-  margin: 0;
-}
-
-.oo-ui-frame-body {
-  padding: 0;
-  margin: 0;
-  background: none;
-}
-
-.oo-ui-frame-content:focus {
-  outline: none;
-}
-
-.oo-ui-toolbar {
-  clear: both;
-}
-
-.oo-ui-toolbar-bar {
-  line-height: 1em;
-}
-
-.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
-  position: absolute;
-}
-
-.oo-ui-toolbar-actions {
-  float: left;
-}
-
-.oo-ui-toolbar-tools {
-  float: right;
-}
-
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-  -webkit-user-select: all;
-     -moz-user-select: all;
-      -ms-user-select: all;
-          user-select: all;
-  -webkit-touch-callout: default;
-}
-
-.oo-ui-toolbar-shadow {
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-  background-position: right top;
-  background-repeat: repeat-x;
-}
-
-.oo-ui-toolGroup {
-  display: inline-block;
-  margin: 0.3em;
-  vertical-align: middle;
-}
-
-.oo-ui-toolGroup-empty {
-  display: none;
-}
-
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-window {
-  line-height: 1em;
-}
-
-.oo-ui-window > .oo-ui-window-frame {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-window > .oo-ui-window-frame > .oo-ui-frame {
-  width: 100%;
-  height: 100%;
-}
-
-.oo-ui-window-head,
-.oo-ui-window-foot {
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-window-overlay {
-  position: absolute;
-  top: 0;
-  right: 0;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  position: fixed;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  width: auto;
-  height: auto;
-  padding: 1em;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-  position: fixed;
-  left: 0;
-  right: 0;
-  max-width: 100%;
-  max-height: 100%;
-  margin: auto;
-  overflow: hidden;
-}
-
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 0;
-  bottom: 0;
-  width: 100%;
-  height: 100%;
-}
-
-.oo-ui-messageDialog-actions-horizontal {
-  display: table;
-  width: 100%;
-  table-layout: fixed;
-}
-
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  display: table-cell;
-  width: 1%;
-}
-
-.oo-ui-messageDialog-actions-vertical {
-  display: block;
-}
-
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  position: relative;
-  text-align: center;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonedElement-button {
-  display: block;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label {
-  position: relative;
-  top: auto;
-  bottom: auto;
-  display: inline;
-  white-space: nowrap;
-}
-
-.oo-ui-processDialog-location {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.oo-ui-processDialog-title {
-  display: inline;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-  white-space: nowrap;
-}
-
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-}
-
-.oo-ui-processDialog-actions-safe {
-  right: 0;
-}
-
-.oo-ui-processDialog-actions-primary {
-  left: 0;
-}
-
-.oo-ui-processDialog-errors {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  z-index: 2;
-  display: none;
-  padding: 3em 3em 1.5em 3em;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.oo-ui-buttonedElement > .oo-ui-buttonedElement-button {
-  display: inline-block;
-  vertical-align: middle;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-buttonedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  display: none;
-  margin-right: 0;
-}
-
-.oo-ui-buttonedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
-  display: none;
-  margin-left: -0.75em;
-}
-
-.oo-ui-buttonedElement.oo-ui-widget-disabled > .oo-ui-buttonedElement-button {
-  cursor: default;
-}
-
-.oo-ui-buttonedElement.oo-ui-indicatedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-buttonedElement-frameless {
-  position: relative;
-  display: inline-block;
-}
-
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  display: inline-block;
-  margin-right: 0.25em;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button {
-  display: inline-block;
-  text-align: center;
-  vertical-align: top;
-}
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  display: inline-block;
-  line-height: 1.9em;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  cursor: default;
-}
-
-.oo-ui-clippableElement-clippable {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 3em;
-  right: 0;
-  overflow-y: auto;
-}
-
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  position: absolute;
-  left: 0;
-  bottom: 0;
-  right: 0;
-}
-
-.oo-ui-fieldLayout {
-  margin-bottom: 1em;
-}
-
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
-}
-
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-  display: table;
-  content: " ";
-}
-
-.oo-ui-fieldLayout:after {
-  clear: both;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labeledElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-  display: block;
-  float: right;
-  width: 35%;
-  padding-top: 0.5em;
-  margin-left: 5%;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  display: block;
-  float: right;
-  width: 60%;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-  text-align: left;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labeledElement-label {
-  display: inline-block;
-  padding: 0.75em 0.5em 0.5em 0.5em;
-  vertical-align: middle;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  display: inline-block;
-  padding: 0.5em 0;
-  vertical-align: middle;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labeledElement-label {
-  display: inline-block;
-  padding: 0.5em 0;
-}
-
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  margin-top: 0.25em;
-}
-
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-  z-index: 1;
-}
-
-.oo-ui-fieldsetLayout {
-  position: relative;
-  padding: 0;
-  margin: 0;
-}
-
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-  margin-top: 2em;
-}
-
-.oo-ui-fieldsetLayout-labeled {
-  margin-top: -0.75em;
-}
-
-.oo-ui-fieldsetLayout > .oo-ui-labeledElement-label {
-  padding: 0.25em 0;
-  margin-bottom: 0.5em;
-}
-
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-labeledElement-label {
-  padding-right: 1.75em;
-  line-height: 1.33em;
-}
-
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0.25em;
-  right: 0;
-  display: block;
-  width: 2em;
-  height: 2em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-gridLayout {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-}
-
-.oo-ui-labelWidget {
-  display: inline-block;
-  padding: 0.5em 0;
-}
-
-.oo-ui-panelLayout {
-  position: relative;
-}
-
-.oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-
-.oo-ui-panelLayout-expanded {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-}
-
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-  display: none;
-}
-
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-  position: relative;
-  display: block;
-}
-
-.oo-ui-barToolGroup > .oo-ui-iconedElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labeledElement-label {
-  display: none;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool {
-  position: relative;
-  display: inline-block;
-  vertical-align: top;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  display: block;
-  height: 1.5em;
-  padding: 0.25em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  display: block;
-  width: 1.5em;
-  height: 1.5em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: none;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-  cursor: pointer;
-}
-
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  display: block;
-  padding-left: 0.5em;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-  min-width: 8em;
-}
-
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em 0 0.25em 0;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool {
-  display: block;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  display: block;
-  padding: 0 0.25em 0 1em;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-image: none;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-image: /* @embed */ url(images/icons/check.svg);
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-popupToolGroup {
-  position: relative;
-  height: 2em;
-  min-width: 2.5em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement {
-  min-width: 3.5em;
-}
-
-.oo-ui-popupToolGroup-handle {
-  display: block;
-  cursor: pointer;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0;
-  width: 2em;
-  height: 2em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator {
-  left: 0;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  right: 0.25em;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin: 0 1em;
-  font-size: 0.8em;
-  line-height: 2.6em;
-}
-
-.oo-ui-popupToolGroup-header {
-  margin: 0 0.6em;
-  font-size: 0.8em;
-  font-weight: bold;
-  line-height: 2.6em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-  cursor: default;
-}
-
-.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin-right: 3em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin-left: 2.25em;
-}
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  position: absolute;
-  top: 2em;
-  right: -1px;
-  z-index: 4;
-  display: none;
-}
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-  display: block;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  display: inline-block;
-  width: 2em;
-  height: 2em;
-  margin-left: 0.25em;
-  vertical-align: middle;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: inline-block;
-  font-size: 0.8em;
-  line-height: 2em;
-  vertical-align: middle;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-
-.oo-ui-popupTool .oo-ui-popupWidget {
-  margin-right: 1.25em;
-  font-size: 0.8em;
-}
-
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-  z-index: 4;
-}
-
-.oo-ui-iconWidget {
-  display: inline-block;
-  width: 1.9em;
-  height: 1.9em;
-  line-height: 2.5em;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  opacity: 0.8;
-}
-
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-
-.oo-ui-indicatorWidget {
-  display: inline-block;
-  width: 1.9em;
-  height: 1.9em;
-  line-height: 2.5em;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  opacity: 0.8;
-}
-
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-
-.oo-ui-selectWidget {
-  padding: 0;
-  margin: 0;
-  list-style: none;
-}
-
-.oo-ui-optionWidget {
-  position: relative;
-  display: block;
-  margin: 0;
-  list-style: none;
-  cursor: pointer;
-  border: none;
-}
-
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-
-.oo-ui-optionWidget .oo-ui-labeledElement-label {
-  display: block;
-  overflow: hidden;
-  line-height: 1.5em;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator {
-  position: absolute;
-  top: 50%;
-  width: 2em;
-  height: 2em;
-  margin-top: -1em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon {
-  right: 0.5em;
-}
-
-.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator {
-  left: 0.5em;
-}
-
-.oo-ui-menuWidget {
-  position: absolute;
-}
-
-.oo-ui-menuWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
-
-.oo-ui-popupWidget-popup {
-  position: absolute;
-  z-index: 1;
-  overflow: hidden;
-}
-
-.oo-ui-popupWidget-anchor {
-  z-index: 1;
-  display: none;
-}
-
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-  margin-top: 7px;
-}
-
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  position: absolute;
-  display: block;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupWidget-head {
-  height: 2.5em;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  float: left;
-  margin: 0.25em;
-}
-
-.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
-  float: right;
-  margin: 0.75em 1em;
-  cursor: default;
-}
-
-.oo-ui-popupWidget-body {
-  overflow: hidden;
-  clear: both;
-}
-
-.oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
-}
-
-.oo-ui-buttonGroupWidget {
-  border-radius: 0.3em;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  margin-bottom: -1px;
-  margin-right: -1px;
-  border-radius: 0;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
-  margin-right: 0;
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
-  border-top-left-radius: 0.3em;
-  border-bottom-left-radius: 0.3em;
-}
-
-.oo-ui-buttonOptionWidget {
-  display: inline-block;
-  background-color: transparent;
-}
-
-.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
-  position: relative;
-  height: 1.9em;
-}
-
-.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
-  position: static;
-  display: inline-block;
-  height: 1.9em;
-  margin-top: 0;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonSelectWidget {
-  display: inline-block;
-  white-space: nowrap;
-}
-
-.oo-ui-buttonWidget {
-  display: inline-block;
-  vertical-align: middle;
-}
-
-.oo-ui-inlineMenuWidget {
-  position: relative;
-  display: inline-block;
-  min-width: 20em;
-  margin: 0.25em 0;
-}
-
-.oo-ui-inlineMenuWidget-handle {
-  display: inline-block;
-  width: 100%;
-  height: 2.5em;
-  cursor: pointer;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0;
-  width: 2.5em;
-  height: 2.5em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator {
-  left: 0;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  right: 0.25em;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin: 0 0.5em;
-  line-height: 2.5em;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin-right: 3em;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin-left: 2em;
-}
-
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-  z-index: 1;
-  width: 100%;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  cursor: default;
-}
-
-.oo-ui-menuItemWidget {
-  position: relative;
-}
-
-.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
-  display: none;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
-  display: block;
-}
-
-.oo-ui-menuSectionItemWidget {
-  cursor: default;
-}
-
-.oo-ui-outlineControlsWidget {
-  height: 3em;
-}
-
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  float: right;
-  height: 2em;
-  padding: 0;
-  margin: 0.5em;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
-  float: right;
-  width: 1.5em;
-  height: 2em;
-  margin: 0.5em 0.5em 0.5em 0;
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-outlineControlsWidget-items {
-  float: right;
-  margin-right: 0;
-}
-
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-  float: right;
-}
-
-.oo-ui-outlineControlsWidget-movers {
-  float: left;
-}
-
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-  float: left;
-}
-
-.oo-ui-outlineItemWidget {
-  position: relative;
-  padding: 0.75em;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-popupButtonWidget {
-  position: relative;
-}
-
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
-  right: 1em;
-  cursor: auto;
-}
-
-.oo-ui-searchWidget-query {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  height: 4em;
-  padding: 0 1em;
-}
-
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  width: 100%;
-  margin: 0.75em 0;
-}
-
-.oo-ui-searchWidget-results {
-  position: absolute;
-  top: 4em;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  padding: 1em;
-  overflow-x: hidden;
-  overflow-y: auto;
-  line-height: 0;
-}
-
-.oo-ui-textInputWidget {
-  position: relative;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  resize: none;
-}
-
-.oo-ui-textInputWidget-icon {
-  position: absolute;
-  top: 0;
-  right: 0;
-  height: 100%;
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-toggleSwitchWidget {
-  position: relative;
-  display: inline-block;
-  width: 4em;
-  height: 2em;
-  overflow: hidden;
-  vertical-align: middle;
-  cursor: pointer;
-  -webkit-transform: translateZ(0);
-     -moz-transform: translateZ(0);
-      -ms-transform: translateZ(0);
-       -o-transform: translateZ(0);
-          transform: translateZ(0);
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-
-.oo-ui-toggleSwitchWidget-grip {
-  position: absolute;
-  top: 0.25em;
-  right: 0.25em;
-  display: block;
-  width: 1.5em;
-  height: 1.5em;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-     -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-      -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-       -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-          transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-}
-
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  -webkit-transition: opacity 200ms ease-in-out;
-     -moz-transition: opacity 200ms ease-in-out;
-      -ms-transition: opacity 200ms ease-in-out;
-       -o-transition: opacity 200ms ease-in-out;
-          transition: opacity 200ms ease-in-out;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-  right: 2.25em;
-  margin-right: -2px;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-  right: 0.25em;
-  margin-right: 0;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: none;
-}
-
-/* Icons */
-
 .oo-ui-icon-add-item {
   background-image: /* @embed */ url(images/icons/add-item.png);
 }
-
 .oo-ui-icon-advanced {
   background-image: /* @embed */ url(images/icons/advanced.png);
 }
-
 .oo-ui-icon-alert {
   background-image: /* @embed */ url(images/icons/alert.png);
 }
-
 .oo-ui-icon-check {
   background-image: /* @embed */ url(images/icons/check.png);
 }
-
 .oo-ui-icon-clear {
   background-image: /* @embed */ url(images/icons/clear.png);
 }
-
 .oo-ui-icon-close {
   background-image: /* @embed */ url(images/icons/close.png);
 }
-
 .oo-ui-icon-code {
   background-image: /* @embed */ url(images/icons/code.png);
 }
-
 .oo-ui-icon-collapse {
   background-image: /* @embed */ url(images/icons/collapse.png);
 }
-
 .oo-ui-icon-comment {
   background-image: /* @embed */ url(images/icons/comment.png);
 }
-
 .oo-ui-icon-expand {
   background-image: /* @embed */ url(images/icons/expand.png);
 }
-
 .oo-ui-icon-help {
   background-image: /* @embed */ url(images/icons/help.png);
 }
-
 .oo-ui-icon-info {
   background-image: /* @embed */ url(images/icons/info.png);
 }
-
 .oo-ui-icon-link {
   background-image: /* @embed */ url(images/icons/link.png);
 }
-
 .oo-ui-icon-menu {
   background-image: /* @embed */ url(images/icons/menu.png);
 }
-
 .oo-ui-icon-next {
   background-image: /* @embed */ url(images/icons/move-rtl.png);
 }
-
 .oo-ui-icon-picture {
   background-image: /* @embed */ url(images/icons/picture.png);
 }
-
 .oo-ui-icon-previous {
   background-image: /* @embed */ url(images/icons/move-ltr.png);
 }
-
 .oo-ui-icon-redo {
   background-image: /* @embed */ url(images/icons/arched-arrow-rtl.png);
 }
-
 .oo-ui-icon-remove {
   background-image: /* @embed */ url(images/icons/remove.png);
 }
-
 .oo-ui-icon-search {
   background-image: /* @embed */ url(images/icons/search.png);
 }
-
 .oo-ui-icon-settings {
   background-image: /* @embed */ url(images/icons/settings.png);
 }
-
 .oo-ui-icon-tag {
   background-image: /* @embed */ url(images/icons/tag.png);
 }
-
 .oo-ui-icon-undo {
   background-image: /* @embed */ url(images/icons/arched-arrow-ltr.png);
 }
-
 .oo-ui-icon-window {
   background-image: /* @embed */ url(images/icons/window.png);
 }
-
-/* Indicators */
-
 .oo-ui-indicator-alert {
   background-image: /* @embed */ url(images/indicators/alert.png);
 }
-
 .oo-ui-indicator-down {
   background-image: /* @embed */ url(images/indicators/arrow-down.png);
 }
-
 .oo-ui-indicator-next {
   background-image: /* @embed */ url(images/indicators/arrow-rtl.png);
 }
-
 .oo-ui-indicator-previous {
   background-image: /* @embed */ url(images/indicators/arrow-ltr.png);
 }
-
 .oo-ui-indicator-required {
   background-image: /* @embed */ url(images/indicators/required.png);
 }
-
 .oo-ui-indicator-up {
   background-image: /* @embed */ url(images/indicators/arrow-up.png);
-}
\ No newline at end of file
+}
+.oo-ui-texture-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(images/textures/transparency.png);
+}
diff --git a/resources/lib/oojs-ui/oojs-ui.svg.css b/resources/lib/oojs-ui/oojs-ui.svg.css
deleted file mode 100644 (file)
index aa5e6ac..0000000
+++ /dev/null
@@ -1,1262 +0,0 @@
-/*!
- * OOjs UI v0.1.0-pre (0e50d2e336)
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-08-06T12:56:55Z
- */
-/* Textures */
-
-.oo-ui-texture-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-
-.oo-ui-texture-transparency {
-  background-image: /* @embed */ url(images/textures/transparency.png);
-}
-
-/* RTL Definitions */
-
-/* @noflip */
-
-.oo-ui-rtl {
-  direction: rtl;
-}
-
-/* @noflip */
-
-.oo-ui-ltr {
-  direction: ltr;
-}
-
-.oo-ui-frame {
-  padding: 0;
-  margin: 0;
-}
-
-.oo-ui-frame-content {
-  padding: 0;
-  margin: 0;
-}
-
-.oo-ui-frame-content:focus {
-  outline: none;
-}
-
-.oo-ui-toolbar {
-  clear: both;
-}
-
-.oo-ui-toolbar-bar {
-  line-height: 1em;
-}
-
-.oo-ui-toolbar-actions {
-  float: right;
-}
-
-.oo-ui-toolbar-tools {
-  float: left;
-}
-
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-  -webkit-user-select: all;
-     -moz-user-select: all;
-      -ms-user-select: all;
-          user-select: all;
-  -webkit-touch-callout: default;
-}
-
-.oo-ui-toolbar-shadow {
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-  background-position: left top;
-  background-repeat: repeat-x;
-}
-
-.oo-ui-toolGroup {
-  display: inline-block;
-  margin: 0.3em;
-  vertical-align: middle;
-}
-
-.oo-ui-toolGroup-empty {
-  display: none;
-}
-
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-window {
-  line-height: 1em;
-}
-
-.oo-ui-window > .oo-ui-window-frame {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-window > .oo-ui-window-frame > .oo-ui-frame {
-  width: 100%;
-  height: 100%;
-}
-
-.oo-ui-window-head,
-.oo-ui-window-foot {
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-window-overlay {
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  position: fixed;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  width: auto;
-  height: auto;
-  padding: 1em;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-  position: fixed;
-  right: 0;
-  left: 0;
-  max-width: 100%;
-  max-height: 100%;
-  margin: auto;
-  overflow: hidden;
-}
-
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 0;
-  bottom: 0;
-  width: 100%;
-  height: 100%;
-}
-
-.oo-ui-messageDialog-actions-horizontal {
-  display: table;
-  width: 100%;
-  table-layout: fixed;
-}
-
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  display: table-cell;
-  width: 1%;
-}
-
-.oo-ui-messageDialog-actions-vertical {
-  display: block;
-}
-
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  position: relative;
-  text-align: center;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonedElement-button {
-  display: block;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label {
-  position: relative;
-  top: auto;
-  bottom: auto;
-  display: inline;
-  white-space: nowrap;
-}
-
-.oo-ui-processDialog-location {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.oo-ui-processDialog-title {
-  display: inline;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-  white-space: nowrap;
-}
-
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-}
-
-.oo-ui-processDialog-actions-safe {
-  left: 0;
-}
-
-.oo-ui-processDialog-actions-primary {
-  right: 0;
-}
-
-.oo-ui-processDialog-errors {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 2;
-  display: none;
-  padding: 3em 3em 1.5em 3em;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.oo-ui-buttonedElement > .oo-ui-buttonedElement-button {
-  display: inline-block;
-  vertical-align: middle;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-buttonedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  display: none;
-  margin-left: 0;
-}
-
-.oo-ui-buttonedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
-  display: none;
-  margin-right: -0.75em;
-}
-
-.oo-ui-buttonedElement.oo-ui-widget-disabled > .oo-ui-buttonedElement-button {
-  cursor: default;
-}
-
-.oo-ui-buttonedElement.oo-ui-indicatedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-buttonedElement-frameless {
-  position: relative;
-  display: inline-block;
-}
-
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  display: inline-block;
-  margin-left: 0.25em;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button {
-  display: inline-block;
-  text-align: center;
-  vertical-align: top;
-}
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  display: inline-block;
-  line-height: 1.9em;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  cursor: default;
-}
-
-.oo-ui-clippableElement-clippable {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 3em;
-  left: 0;
-  overflow-y: auto;
-}
-
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-
-.oo-ui-fieldLayout {
-  margin-bottom: 1em;
-}
-
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
-}
-
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-  display: table;
-  content: " ";
-}
-
-.oo-ui-fieldLayout:after {
-  clear: both;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labeledElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-  display: block;
-  float: left;
-  width: 35%;
-  padding-top: 0.5em;
-  margin-right: 5%;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  display: block;
-  float: left;
-  width: 60%;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-  text-align: right;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labeledElement-label {
-  display: inline-block;
-  padding: 0.75em 0.5em 0.5em 0.5em;
-  vertical-align: middle;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  display: inline-block;
-  padding: 0.5em 0;
-  vertical-align: middle;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labeledElement-label {
-  display: inline-block;
-  padding: 0.5em 0;
-}
-
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  margin-top: 0.25em;
-}
-
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-  z-index: 1;
-}
-
-.oo-ui-fieldsetLayout {
-  position: relative;
-  padding: 0;
-  margin: 0;
-}
-
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-  margin-top: 2em;
-}
-
-.oo-ui-fieldsetLayout > .oo-ui-labeledElement-label {
-  padding: 0.25em 0;
-  margin-bottom: 0.5em;
-}
-
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-labeledElement-label {
-  padding-left: 1.75em;
-  line-height: 1.33em;
-}
-
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0.25em;
-  left: 0;
-  display: block;
-  width: 2em;
-  height: 2em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-gridLayout {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-
-.oo-ui-labelWidget {
-  display: inline-block;
-  padding: 0.5em 0;
-}
-
-.oo-ui-panelLayout {
-  position: relative;
-}
-
-.oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-
-.oo-ui-panelLayout-expanded {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-  display: none;
-}
-
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-  position: relative;
-  display: block;
-}
-
-.oo-ui-barToolGroup > .oo-ui-iconedElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labeledElement-label {
-  display: none;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool {
-  position: relative;
-  display: inline-block;
-  vertical-align: top;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  display: block;
-  height: 1.5em;
-  padding: 0.25em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  display: block;
-  width: 1.5em;
-  height: 1.5em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: none;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-  cursor: pointer;
-}
-
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  display: block;
-  padding-right: 0.5em;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-  min-width: 8em;
-}
-
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em 0 0.25em 0;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool {
-  display: block;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  display: block;
-  padding: 0 1em 0 0.25em;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-image: none;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-image: /* @embed */ url(images/icons/check.svg);
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-popupToolGroup {
-  position: relative;
-  height: 2em;
-  min-width: 2.5em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement {
-  min-width: 3.5em;
-}
-
-.oo-ui-popupToolGroup-handle {
-  display: block;
-  cursor: pointer;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0;
-  width: 2em;
-  height: 2em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator {
-  right: 0;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  left: 0.25em;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin: 0 1em;
-  font-size: 0.8em;
-  line-height: 2.6em;
-}
-
-.oo-ui-popupToolGroup-header {
-  margin: 0 0.6em;
-  font-size: 0.8em;
-  font-weight: bold;
-  line-height: 2.6em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-  cursor: default;
-}
-
-.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin-left: 3em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin-right: 2.25em;
-}
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  position: absolute;
-  top: 2em;
-  left: -1px;
-  z-index: 4;
-  display: none;
-}
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-  display: block;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  display: inline-block;
-  width: 2em;
-  height: 2em;
-  margin-right: 0.25em;
-  vertical-align: middle;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: inline-block;
-  font-size: 0.8em;
-  line-height: 2em;
-  vertical-align: middle;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-
-.oo-ui-popupTool .oo-ui-popupWidget {
-  margin-left: 1.25em;
-  font-size: 0.8em;
-}
-
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-  z-index: 4;
-}
-
-.oo-ui-iconWidget {
-  display: inline-block;
-  width: 1.9em;
-  height: 1.9em;
-  line-height: 2.5em;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  opacity: 0.8;
-}
-
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-
-.oo-ui-indicatorWidget {
-  display: inline-block;
-  width: 1.9em;
-  height: 1.9em;
-  line-height: 2.5em;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  opacity: 0.8;
-}
-
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-
-.oo-ui-selectWidget {
-  padding: 0;
-  margin: 0;
-  list-style: none;
-}
-
-.oo-ui-optionWidget {
-  position: relative;
-  display: block;
-  margin: 0;
-  list-style: none;
-  cursor: pointer;
-  border: none;
-}
-
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-
-.oo-ui-optionWidget .oo-ui-labeledElement-label {
-  display: block;
-  overflow: hidden;
-  line-height: 1.5em;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator {
-  position: absolute;
-  top: 50%;
-  width: 2em;
-  height: 2em;
-  margin-top: -1em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon {
-  left: 0.5em;
-}
-
-.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator {
-  right: 0.5em;
-}
-
-.oo-ui-menuWidget {
-  position: absolute;
-}
-
-.oo-ui-menuWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
-
-.oo-ui-popupWidget-popup {
-  position: absolute;
-  z-index: 1;
-  overflow: hidden;
-}
-
-.oo-ui-popupWidget-anchor {
-  z-index: 1;
-  display: none;
-}
-
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-  margin-top: 7px;
-}
-
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  position: absolute;
-  display: block;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupWidget-head {
-  height: 2.5em;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  float: right;
-  margin: 0.25em;
-}
-
-.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
-  float: left;
-  margin: 0.75em 1em;
-  cursor: default;
-}
-
-.oo-ui-popupWidget-body {
-  overflow: hidden;
-  clear: both;
-}
-
-.oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
-}
-
-.oo-ui-buttonGroupWidget {
-  border-radius: 0.3em;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  margin-bottom: -1px;
-  margin-left: -1px;
-  border-radius: 0;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
-  margin-left: 0;
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
-  border-top-right-radius: 0.3em;
-  border-bottom-right-radius: 0.3em;
-}
-
-.oo-ui-buttonOptionWidget {
-  display: inline-block;
-  background-color: transparent;
-}
-
-.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
-  position: relative;
-  height: 1.9em;
-}
-
-.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
-  position: static;
-  display: inline-block;
-  height: 1.9em;
-  margin-top: 0;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonSelectWidget {
-  display: inline-block;
-  white-space: nowrap;
-}
-
-.oo-ui-buttonWidget {
-  display: inline-block;
-  vertical-align: middle;
-}
-
-.oo-ui-inlineMenuWidget {
-  position: relative;
-  display: inline-block;
-  min-width: 20em;
-  margin: 0.25em 0;
-}
-
-.oo-ui-inlineMenuWidget-handle {
-  display: inline-block;
-  width: 100%;
-  height: 2.5em;
-  cursor: pointer;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0;
-  width: 2.5em;
-  height: 2.5em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator {
-  right: 0;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  left: 0.25em;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin: 0 0.5em;
-  line-height: 2.5em;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin-left: 3em;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin-right: 2em;
-}
-
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-  z-index: 1;
-  width: 100%;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  cursor: default;
-}
-
-.oo-ui-menuItemWidget {
-  position: relative;
-}
-
-.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
-  display: none;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
-  display: block;
-}
-
-.oo-ui-menuSectionItemWidget {
-  cursor: default;
-}
-
-.oo-ui-outlineControlsWidget {
-  height: 3em;
-}
-
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  float: left;
-  height: 2em;
-  padding: 0;
-  margin: 0.5em;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
-  float: left;
-  width: 1.5em;
-  height: 2em;
-  margin: 0.5em 0 0.5em 0.5em;
-  background-position: right center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-outlineControlsWidget-items {
-  float: left;
-  margin-left: 0;
-}
-
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-  float: left;
-}
-
-.oo-ui-outlineControlsWidget-movers {
-  float: right;
-}
-
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-  float: right;
-}
-
-.oo-ui-outlineItemWidget {
-  position: relative;
-  padding: 0.75em;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-popupButtonWidget {
-  position: relative;
-}
-
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
-  left: 1em;
-  cursor: auto;
-}
-
-.oo-ui-searchWidget-query {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  height: 4em;
-  padding: 0 1em;
-}
-
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  width: 100%;
-  margin: 0.75em 0;
-}
-
-.oo-ui-searchWidget-results {
-  position: absolute;
-  top: 4em;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: 1em;
-  overflow-x: hidden;
-  overflow-y: auto;
-  line-height: 0;
-}
-
-.oo-ui-textInputWidget {
-  position: relative;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  resize: none;
-}
-
-.oo-ui-textInputWidget-icon {
-  position: absolute;
-  top: 0;
-  left: 0;
-  height: 100%;
-  background-position: right center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-toggleSwitchWidget {
-  position: relative;
-  display: inline-block;
-  width: 4em;
-  height: 2em;
-  overflow: hidden;
-  vertical-align: middle;
-  cursor: pointer;
-  -webkit-transform: translateZ(0);
-     -moz-transform: translateZ(0);
-      -ms-transform: translateZ(0);
-       -o-transform: translateZ(0);
-          transform: translateZ(0);
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-
-.oo-ui-toggleSwitchWidget-grip {
-  position: absolute;
-  top: 0.25em;
-  left: 0.25em;
-  display: block;
-  width: 1.5em;
-  height: 1.5em;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-     -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-      -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-       -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-          transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-}
-
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  -webkit-transition: opacity 200ms ease-in-out;
-     -moz-transition: opacity 200ms ease-in-out;
-      -ms-transition: opacity 200ms ease-in-out;
-       -o-transition: opacity 200ms ease-in-out;
-          transition: opacity 200ms ease-in-out;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-  left: 2.25em;
-  margin-left: -2px;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-  left: 0.25em;
-  margin-left: 0;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: none;
-}
-
-/* Icons */
-
-.oo-ui-icon-add-item {
-  background-image: /* @embed */ url(images/icons/add-item.svg);
-}
-
-.oo-ui-icon-advanced {
-  background-image: /* @embed */ url(images/icons/advanced.svg);
-}
-
-.oo-ui-icon-alert {
-  background-image: /* @embed */ url(images/icons/alert.svg);
-}
-
-.oo-ui-icon-check {
-  background-image: /* @embed */ url(images/icons/check.svg);
-}
-
-.oo-ui-icon-clear {
-  background-image: /* @embed */ url(images/icons/clear.svg);
-}
-
-.oo-ui-icon-close {
-  background-image: /* @embed */ url(images/icons/close.svg);
-}
-
-.oo-ui-icon-code {
-  background-image: /* @embed */ url(images/icons/code.svg);
-}
-
-.oo-ui-icon-collapse {
-  background-image: /* @embed */ url(images/icons/collapse.svg);
-}
-
-.oo-ui-icon-comment {
-  background-image: /* @embed */ url(images/icons/comment.svg);
-}
-
-.oo-ui-icon-expand {
-  background-image: /* @embed */ url(images/icons/expand.svg);
-}
-
-.oo-ui-icon-help {
-  background-image: /* @embed */ url(images/icons/help.svg);
-}
-
-.oo-ui-icon-info {
-  background-image: /* @embed */ url(images/icons/info.svg);
-}
-
-.oo-ui-icon-link {
-  background-image: /* @embed */ url(images/icons/link.svg);
-}
-
-.oo-ui-icon-menu {
-  background-image: /* @embed */ url(images/icons/menu.svg);
-}
-
-.oo-ui-icon-next {
-  background-image: /* @embed */ url(images/icons/move-ltr.svg);
-}
-
-.oo-ui-icon-picture {
-  background-image: /* @embed */ url(images/icons/picture.svg);
-}
-
-.oo-ui-icon-previous {
-  background-image: /* @embed */ url(images/icons/move-rtl.svg);
-}
-
-.oo-ui-icon-redo {
-  background-image: /* @embed */ url(images/icons/arched-arrow-ltr.svg);
-}
-
-.oo-ui-icon-remove {
-  background-image: /* @embed */ url(images/icons/remove.svg);
-}
-
-.oo-ui-icon-search {
-  background-image: /* @embed */ url(images/icons/search.svg);
-}
-
-.oo-ui-icon-settings {
-  background-image: /* @embed */ url(images/icons/settings.svg);
-}
-
-.oo-ui-icon-tag {
-  background-image: /* @embed */ url(images/icons/tag.svg);
-}
-
-.oo-ui-icon-undo {
-  background-image: /* @embed */ url(images/icons/arched-arrow-rtl.svg);
-}
-
-.oo-ui-icon-window {
-  background-image: /* @embed */ url(images/icons/window.svg);
-}
-
-/* Indicators */
-
-.oo-ui-indicator-alert {
-  background-image: /* @embed */ url(images/indicators/alert.svg);
-}
-
-.oo-ui-indicator-down {
-  background-image: /* @embed */ url(images/indicators/arrow-down.svg);
-}
-
-.oo-ui-indicator-next {
-  background-image: /* @embed */ url(images/indicators/arrow-ltr.svg);
-}
-
-.oo-ui-indicator-previous {
-  background-image: /* @embed */ url(images/indicators/arrow-rtl.svg);
-}
-
-.oo-ui-indicator-required {
-  background-image: /* @embed */ url(images/indicators/required.svg);
-}
-
-.oo-ui-indicator-up {
-  background-image: /* @embed */ url(images/indicators/arrow-up.svg);
-}
\ No newline at end of file
index 9a7fe08..5a78d6b 100644 (file)
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-07-22T21:39:24Z
+ * Date: 2014-09-11T19:39:50Z
+ */
+/*
+ * Blank theme mixins.
+ *
+ * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
+ * additional rules to the base styles.
  */
-/* Textures */
-
-.oo-ui-texture-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-
-.oo-ui-texture-transparency {
-  background-image: /* @embed */ url(images/textures/transparency.png);
-}
-
-/* RTL Definitions */
-
-/* @noflip */
-
-.oo-ui-rtl {
-  direction: rtl;
-}
-
-/* @noflip */
-
-.oo-ui-ltr {
-  direction: ltr;
-}
-
-.oo-ui-frame {
-  padding: 0;
-  margin: 0;
-}
-
-.oo-ui-frame-body {
-  padding: 0;
-  margin: 0;
-  background: none;
-}
-
-.oo-ui-frame-content:focus {
-  outline: none;
-}
-
-.oo-ui-toolbar {
-  clear: both;
-}
-
-.oo-ui-toolbar-bar {
-  line-height: 1em;
-}
-
-.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
-  position: absolute;
-}
-
-.oo-ui-toolbar-actions {
-  float: left;
-}
-
-.oo-ui-toolbar-tools {
-  float: right;
-}
-
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-  -webkit-user-select: all;
-     -moz-user-select: all;
-      -ms-user-select: all;
-          user-select: all;
-  -webkit-touch-callout: default;
-}
-
-.oo-ui-toolbar-shadow {
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-  background-position: right top;
-  background-repeat: repeat-x;
-}
-
-.oo-ui-toolGroup {
-  display: inline-block;
-  margin: 0.3em;
-  vertical-align: middle;
-}
-
-.oo-ui-toolGroup-empty {
-  display: none;
-}
-
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-window {
-  line-height: 1em;
-}
-
-.oo-ui-window > .oo-ui-window-frame {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-window > .oo-ui-window-frame > .oo-ui-frame {
-  width: 100%;
-  height: 100%;
-}
-
-.oo-ui-window-head,
-.oo-ui-window-foot {
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-window-overlay {
-  position: absolute;
-  top: 0;
-  right: 0;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  position: fixed;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  width: auto;
-  height: auto;
-  padding: 1em;
-}
-
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-  position: fixed;
-  left: 0;
-  right: 0;
-  max-width: 100%;
-  max-height: 100%;
-  margin: auto;
-  overflow: hidden;
-}
-
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 0;
-  bottom: 0;
-  width: 100%;
-  height: 100%;
-}
-
-.oo-ui-messageDialog-actions-horizontal {
-  display: table;
-  width: 100%;
-  table-layout: fixed;
-}
-
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  display: table-cell;
-  width: 1%;
-}
-
-.oo-ui-messageDialog-actions-vertical {
-  display: block;
-}
-
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  position: relative;
-  text-align: center;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonedElement-button {
-  display: block;
-}
-
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label {
-  position: relative;
-  top: auto;
-  bottom: auto;
-  display: inline;
-  white-space: nowrap;
-}
-
-.oo-ui-processDialog-location {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.oo-ui-processDialog-title {
-  display: inline;
-}
-
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-  white-space: nowrap;
-}
-
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-}
-
-.oo-ui-processDialog-actions-safe {
-  right: 0;
-}
-
-.oo-ui-processDialog-actions-primary {
-  left: 0;
-}
-
-.oo-ui-processDialog-errors {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  z-index: 2;
-  display: none;
-  padding: 3em 3em 1.5em 3em;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.oo-ui-buttonedElement > .oo-ui-buttonedElement-button {
-  display: inline-block;
-  vertical-align: middle;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-buttonedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  display: none;
-  margin-right: 0;
-}
-
-.oo-ui-buttonedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
-  display: none;
-  margin-left: -0.75em;
-}
-
-.oo-ui-buttonedElement.oo-ui-widget-disabled > .oo-ui-buttonedElement-button {
-  cursor: default;
-}
-
-.oo-ui-buttonedElement.oo-ui-indicatedElement > .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
-.oo-ui-buttonedElement.oo-ui-iconedElement > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-buttonedElement-frameless {
-  position: relative;
-  display: inline-block;
-}
-
-.oo-ui-buttonedElement-frameless > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  display: inline-block;
-  margin-right: 0.25em;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button {
-  display: inline-block;
-  text-align: center;
-  vertical-align: top;
-}
-
-.oo-ui-buttonedElement-framed > .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
-  display: inline-block;
-  line-height: 1.9em;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
-.oo-ui-buttonedElement-framed.oo-ui-widget-disabled > .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
-  cursor: default;
-}
-
-.oo-ui-clippableElement-clippable {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 3em;
-  right: 0;
-  overflow-y: auto;
-}
-
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  position: absolute;
-  left: 0;
-  bottom: 0;
-  right: 0;
-}
-
-.oo-ui-fieldLayout {
-  margin-bottom: 1em;
-}
-
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
-}
-
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-  display: table;
-  content: " ";
-}
-
-.oo-ui-fieldLayout:after {
-  clear: both;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labeledElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-  display: block;
-  float: right;
-  width: 35%;
-  padding-top: 0.5em;
-  margin-left: 5%;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  display: block;
-  float: right;
-  width: 60%;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
-  text-align: left;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labeledElement-label {
-  display: inline-block;
-  padding: 0.75em 0.5em 0.5em 0.5em;
-  vertical-align: middle;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  display: inline-block;
-  padding: 0.5em 0;
-  vertical-align: middle;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labeledElement-label {
-  display: inline-block;
-  padding: 0.5em 0;
-}
-
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
-  margin-top: 0.25em;
-}
-
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-  z-index: 1;
-}
-
-.oo-ui-fieldsetLayout {
-  position: relative;
-  padding: 0;
-  margin: 0;
-}
-
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-  margin-top: 2em;
-}
-
-.oo-ui-fieldsetLayout-labeled {
-  margin-top: -0.75em;
-}
-
-.oo-ui-fieldsetLayout > .oo-ui-labeledElement-label {
-  padding: 0.25em 0;
-  margin-bottom: 0.5em;
-}
-
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-labeledElement-label {
-  padding-right: 1.75em;
-  line-height: 1.33em;
-}
-
-.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0.25em;
-  right: 0;
-  display: block;
-  width: 2em;
-  height: 2em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-gridLayout {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-}
-
-.oo-ui-labelWidget {
-  display: inline-block;
-  padding: 0.5em 0;
-}
-
-.oo-ui-panelLayout {
-  position: relative;
-}
-
-.oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-
-.oo-ui-panelLayout-expanded {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-}
-
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-  display: none;
-}
-
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-  position: relative;
-  display: block;
-}
-
-.oo-ui-barToolGroup > .oo-ui-iconedElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labeledElement-label {
-  display: none;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool {
-  position: relative;
-  display: inline-block;
-  vertical-align: top;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  display: block;
-  height: 1.5em;
-  padding: 0.25em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  display: block;
-  width: 1.5em;
-  height: 1.5em;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: none;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-  cursor: pointer;
-}
-
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  display: block;
-  padding-left: 0.5em;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-  min-width: 8em;
-}
-
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em 0 0.25em 0;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool {
-  display: block;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  display: block;
-  padding: 0 0.25em 0 1em;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-image: none;
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  background-image: /* @embed */ url(images/icons/check.svg);
-}
-
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-
-.oo-ui-popupToolGroup {
-  position: relative;
-  height: 2em;
-  min-width: 2.5em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement {
-  min-width: 3.5em;
-}
-
-.oo-ui-popupToolGroup-handle {
-  display: block;
-  cursor: pointer;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0;
-  width: 2em;
-  height: 2em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator {
-  left: 0;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
-  right: 0.25em;
-}
-
-.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin: 0 1em;
-  font-size: 0.8em;
-  line-height: 2.6em;
-}
-
-.oo-ui-popupToolGroup-header {
-  margin: 0 0.6em;
-  font-size: 0.8em;
-  font-weight: bold;
-  line-height: 2.6em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-  cursor: default;
-}
-
-.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin-right: 3em;
-}
-
-.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
-  margin-left: 2.25em;
-}
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  position: absolute;
-  top: 2em;
-  right: -1px;
-  z-index: 4;
-  display: none;
-}
-
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-  display: block;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
-  display: inline-block;
-  width: 2em;
-  height: 2em;
-  margin-left: 0.25em;
-  vertical-align: middle;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: inline-block;
-  font-size: 0.8em;
-  line-height: 2em;
-  vertical-align: middle;
-}
-
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-
-.oo-ui-popupTool .oo-ui-popupWidget {
-  margin-right: 1.25em;
-  font-size: 0.8em;
-}
-
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-  z-index: 4;
-}
-
-.oo-ui-iconWidget {
-  display: inline-block;
-  width: 1.9em;
-  height: 1.9em;
-  line-height: 2.5em;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  opacity: 0.8;
-}
-
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-
-.oo-ui-indicatorWidget {
-  display: inline-block;
-  width: 1.9em;
-  height: 1.9em;
-  line-height: 2.5em;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  opacity: 0.8;
-}
-
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-
-.oo-ui-selectWidget {
-  padding: 0;
-  margin: 0;
-  list-style: none;
-}
-
-.oo-ui-optionWidget {
-  position: relative;
-  display: block;
-  margin: 0;
-  list-style: none;
-  cursor: pointer;
-  border: none;
-}
-
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-
-.oo-ui-optionWidget .oo-ui-labeledElement-label {
-  display: block;
-  overflow: hidden;
-  line-height: 1.5em;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator {
-  position: absolute;
-  top: 50%;
-  width: 2em;
-  height: 2em;
-  margin-top: -1em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon {
-  right: 0.5em;
-}
-
-.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator {
-  left: 0.5em;
-}
-
-.oo-ui-menuWidget {
-  position: absolute;
-}
-
-.oo-ui-menuWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
-
-.oo-ui-popupWidget-popup {
-  position: absolute;
-  z-index: 1;
-  overflow: hidden;
-}
-
-.oo-ui-popupWidget-anchor {
-  z-index: 1;
-  display: none;
-}
-
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-  margin-top: 7px;
-}
-
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  position: absolute;
-  display: block;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-popupWidget-head {
-  height: 2.5em;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  float: left;
-  margin: 0.25em;
-}
-
-.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
-  float: right;
-  margin: 0.75em 1em;
-  cursor: default;
-}
-
-.oo-ui-popupWidget-body {
-  overflow: hidden;
-  clear: both;
-}
-
-.oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
-}
-
-.oo-ui-buttonGroupWidget {
-  border-radius: 0.3em;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
-  margin-bottom: -1px;
-  margin-right: -1px;
-  border-radius: 0;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
-  margin-right: 0;
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-}
-
-.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
-  border-top-left-radius: 0.3em;
-  border-bottom-left-radius: 0.3em;
-}
-
-.oo-ui-buttonOptionWidget {
-  display: inline-block;
-  background-color: transparent;
-}
-
-.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
-  position: relative;
-  height: 1.9em;
-}
-
-.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
-  position: static;
-  display: inline-block;
-  height: 1.9em;
-  margin-top: 0;
-  vertical-align: middle;
-}
-
-.oo-ui-buttonSelectWidget {
-  display: inline-block;
-  white-space: nowrap;
-}
-
-.oo-ui-buttonWidget {
-  display: inline-block;
-  vertical-align: middle;
-}
-
-.oo-ui-inlineMenuWidget {
-  position: relative;
-  display: inline-block;
-  min-width: 20em;
-  margin: 0.25em 0;
-}
-
-.oo-ui-inlineMenuWidget-handle {
-  display: inline-block;
-  width: 100%;
-  height: 2.5em;
-  cursor: pointer;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  position: absolute;
-  top: 0;
-  width: 2.5em;
-  height: 2.5em;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator {
-  left: 0;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
-  right: 0.25em;
-}
-
-.oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin: 0 0.5em;
-  line-height: 2.5em;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin-right: 3em;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
-  margin-left: 2em;
-}
-
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-  z-index: 1;
-  width: 100%;
-}
-
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  cursor: default;
-}
-
-.oo-ui-menuItemWidget {
-  position: relative;
-}
-
-.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
-  display: none;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
-  display: block;
-}
-
-.oo-ui-menuSectionItemWidget {
-  cursor: default;
-}
-
-.oo-ui-outlineControlsWidget {
-  height: 3em;
-}
-
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  float: right;
-  height: 2em;
-  padding: 0;
-  margin: 0.5em;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
-  float: right;
-  width: 1.5em;
-  height: 2em;
-  margin: 0.5em 0.5em 0.5em 0;
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-outlineControlsWidget-items {
-  float: right;
-  margin-right: 0;
-}
-
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-  float: right;
-}
-
-.oo-ui-outlineControlsWidget-movers {
-  float: left;
-}
-
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-  float: left;
-}
-
-.oo-ui-outlineItemWidget {
-  position: relative;
-  padding: 0.75em;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-popupButtonWidget {
-  position: relative;
-}
-
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
-  right: 1em;
-  cursor: auto;
-}
-
-.oo-ui-searchWidget-query {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  height: 4em;
-  padding: 0 1em;
-}
-
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  width: 100%;
-  margin: 0.75em 0;
-}
-
-.oo-ui-searchWidget-results {
-  position: absolute;
-  top: 4em;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  padding: 1em;
-  overflow-x: hidden;
-  overflow-y: auto;
-  line-height: 0;
-}
-
-.oo-ui-textInputWidget {
-  position: relative;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  resize: none;
-}
-
-.oo-ui-textInputWidget-icon {
-  position: absolute;
-  top: 0;
-  right: 0;
-  height: 100%;
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-
-.oo-ui-toggleSwitchWidget {
-  position: relative;
-  display: inline-block;
-  width: 4em;
-  height: 2em;
-  overflow: hidden;
-  vertical-align: middle;
-  cursor: pointer;
-  -webkit-transform: translateZ(0);
-     -moz-transform: translateZ(0);
-      -ms-transform: translateZ(0);
-       -o-transform: translateZ(0);
-          transform: translateZ(0);
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-
-.oo-ui-toggleSwitchWidget-grip {
-  position: absolute;
-  top: 0.25em;
-  right: 0.25em;
-  display: block;
-  width: 1.5em;
-  height: 1.5em;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-     -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-      -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-       -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-          transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-}
-
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  -webkit-transition: opacity 200ms ease-in-out;
-     -moz-transition: opacity 200ms ease-in-out;
-      -ms-transition: opacity 200ms ease-in-out;
-       -o-transition: opacity 200ms ease-in-out;
-          transition: opacity 200ms ease-in-out;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-touch-callout: none;
-}
-
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-  right: 2.25em;
-  margin-right: -2px;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-  right: 0.25em;
-  margin-right: 0;
-}
-
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: none;
-}
-
-/* Icons */
-
 .oo-ui-icon-add-item {
   background-image: /* @embed */ url(images/icons/add-item.svg);
 }
-
 .oo-ui-icon-advanced {
   background-image: /* @embed */ url(images/icons/advanced.svg);
 }
-
 .oo-ui-icon-alert {
   background-image: /* @embed */ url(images/icons/alert.svg);
 }
-
 .oo-ui-icon-check {
   background-image: /* @embed */ url(images/icons/check.svg);
 }
-
 .oo-ui-icon-clear {
   background-image: /* @embed */ url(images/icons/clear.svg);
 }
-
 .oo-ui-icon-close {
   background-image: /* @embed */ url(images/icons/close.svg);
 }
-
 .oo-ui-icon-code {
   background-image: /* @embed */ url(images/icons/code.svg);
 }
-
 .oo-ui-icon-collapse {
   background-image: /* @embed */ url(images/icons/collapse.svg);
 }
-
 .oo-ui-icon-comment {
   background-image: /* @embed */ url(images/icons/comment.svg);
 }
-
 .oo-ui-icon-expand {
   background-image: /* @embed */ url(images/icons/expand.svg);
 }
-
 .oo-ui-icon-help {
   background-image: /* @embed */ url(images/icons/help.svg);
 }
-
 .oo-ui-icon-info {
   background-image: /* @embed */ url(images/icons/info.svg);
 }
-
 .oo-ui-icon-link {
   background-image: /* @embed */ url(images/icons/link.svg);
 }
-
 .oo-ui-icon-menu {
   background-image: /* @embed */ url(images/icons/menu.svg);
 }
-
 .oo-ui-icon-next {
   background-image: /* @embed */ url(images/icons/move-rtl.svg);
 }
-
 .oo-ui-icon-picture {
   background-image: /* @embed */ url(images/icons/picture.svg);
 }
-
 .oo-ui-icon-previous {
   background-image: /* @embed */ url(images/icons/move-ltr.svg);
 }
-
 .oo-ui-icon-redo {
   background-image: /* @embed */ url(images/icons/arched-arrow-rtl.svg);
 }
-
 .oo-ui-icon-remove {
   background-image: /* @embed */ url(images/icons/remove.svg);
 }
-
 .oo-ui-icon-search {
   background-image: /* @embed */ url(images/icons/search.svg);
 }
-
 .oo-ui-icon-settings {
   background-image: /* @embed */ url(images/icons/settings.svg);
 }
-
 .oo-ui-icon-tag {
   background-image: /* @embed */ url(images/icons/tag.svg);
 }
-
 .oo-ui-icon-undo {
   background-image: /* @embed */ url(images/icons/arched-arrow-ltr.svg);
 }
-
 .oo-ui-icon-window {
   background-image: /* @embed */ url(images/icons/window.svg);
 }
-
-/* Indicators */
-
 .oo-ui-indicator-alert {
   background-image: /* @embed */ url(images/indicators/alert.svg);
 }
-
 .oo-ui-indicator-down {
   background-image: /* @embed */ url(images/indicators/arrow-down.svg);
 }
-
 .oo-ui-indicator-next {
   background-image: /* @embed */ url(images/indicators/arrow-rtl.svg);
 }
-
 .oo-ui-indicator-previous {
   background-image: /* @embed */ url(images/indicators/arrow-ltr.svg);
 }
-
 .oo-ui-indicator-required {
   background-image: /* @embed */ url(images/indicators/required.svg);
 }
-
 .oo-ui-indicator-up {
   background-image: /* @embed */ url(images/indicators/arrow-up.svg);
-}
\ No newline at end of file
+}
+.oo-ui-texture-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(images/textures/transparency.svg);
+}
diff --git a/resources/lib/oojs-ui/themes/agora/images/icons/check.svg b/resources/lib/oojs-ui/themes/agora/images/icons/check.svg
deleted file mode 100644 (file)
index 6a91939..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        width="44.075px" height="44.076px" viewBox="0 0 44.075 44.076" enable-background="new 0 0 44.075 44.076" xml:space="preserve">\r
-<polygon fill="#FFFFFF" points="41.673,12.657 15.385,37.159 15.201,36.961 10.037,31.424 2.402,23.239 8.057,17.962 15.693,26.157 \r
-       36.319,6.917 "/>\r
-</svg>\r
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/add.svg b/resources/lib/oojs-ui/themes/apex/images/icons/add.svg
new file mode 100644 (file)
index 0000000..29e5dba
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="add">
+        <path id="plus" d="M13 8h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/advanced.svg b/resources/lib/oojs-ui/themes/apex/images/icons/advanced.svg
new file mode 100644 (file)
index 0000000..201b4d7
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="settings">
+        <path id="gear" d="M20.869 13.476c.079-.482.131-.972.131-1.476s-.052-.994-.131-1.476l-2.463-.259c-.149-.556-.367-1.082-.648-1.57l1.558-1.924c-.576-.806-1.281-1.511-2.087-2.087l-1.924 1.558c-.488-.281-1.015-.499-1.57-.648l-.259-2.463c-.482-.079-.972-.131-1.476-.131s-.994.052-1.476.131l-.259 2.463c-.555.149-1.081.367-1.57.648l-1.924-1.557c-.805.576-1.51 1.281-2.086 2.086l1.558 1.924c-.281.488-.499 1.015-.648 1.57l-2.463.259c-.08.482-.132.972-.132 1.476s.052.994.131 1.476l2.463.259c.149.556.367 1.082.648 1.57l-1.558 1.924c.576.806 1.281 1.511 2.087 2.087l1.924-1.558c.488.281 1.015.499 1.57.648l.259 2.463c.482.079.972.131 1.476.131s.994-.052 1.476-.131l.259-2.463c.556-.149 1.082-.367 1.57-.648l1.924 1.558c.806-.576 1.511-1.281 2.087-2.087l-1.558-1.924c.281-.488.499-1.015.648-1.57l2.463-.259zm-8.869 2.522c-2.209 0-3.998-1.789-3.998-3.998s1.789-3.998 3.998-3.998 3.998 1.789 3.998 3.998-1.789 3.998-3.998 3.998z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/alert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/alert.svg
new file mode 100644 (file)
index 0000000..f0c6522
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="alert">
+        <path id="point" d="M11 16h2v2h-2z"/>
+        <path id="stroke" d="M13.516 10h-3l.484 5h2z"/>
+        <path id="triangle" d="M12.017 5.974l7.519 13.026h-15.04l7.521-13.026m0-2.474c-.544 0-1.088.357-1.5 1.071l-7.985 13.831c-.825 1.429-.15 2.598 1.5 2.598h15.968c1.65 0 2.325-1.169 1.5-2.599l-7.983-13.829c-.413-.715-.956-1.072-1.5-1.072z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.svg
new file mode 100644 (file)
index 0000000..8a670ef
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="arched-arrow-ltr">
+        <path id="arrow" d="M19.925 14.937l-2.391-6.901-1.48 2.329c-.964-.845-2.699-1.85-5.513-1.823-4.887.046-6.524 4.244-6.524 4.244s2.753-2.639 6.925-1.949c1.729.286 3.007 1.206 3.675 1.791l-1.474 2.319 6.782-.01z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.svg
new file mode 100644 (file)
index 0000000..01fc216
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="arched-arrow-rtl">
+        <path id="arrow" d="M13.401 8.542c-2.814-.027-4.549.978-5.513 1.823l-1.48-2.329-2.391 6.901 6.782.009-1.474-2.319c.668-.584 1.945-1.504 3.675-1.791 4.172-.69 6.925 1.949 6.925 1.949s-1.637-4.197-6.524-4.243z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/check.svg b/resources/lib/oojs-ui/themes/apex/images/icons/check.svg
new file mode 100644 (file)
index 0000000..8d4a1f8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
+    <g id="check">
+        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clear.svg
new file mode 100644 (file)
index 0000000..0dcde9d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="clear">
+        <path id="circle-with-strike" d="M11.999 5.022c-3.853 0-6.977 3.124-6.977 6.978 0 3.853 3.124 6.978 6.977 6.978 3.854 0 6.979-3.125 6.979-6.978 0-3.854-3.125-6.978-6.979-6.978zm-5.113 6.978c0-1.092.572-3.25.93-2.929l7.113 7.113c.488.525-1.837.931-2.93.931-2.825-.001-5.113-2.291-5.113-5.115zm9.298 2.929l-7.114-7.113c-.445-.483 1.837-.931 2.929-.931 2.827 0 5.115 2.289 5.115 5.114 0 1.093-.364 3.543-.93 2.93z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/close.svg b/resources/lib/oojs-ui/themes/apex/images/icons/close.svg
new file mode 100644 (file)
index 0000000..1345e86
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="close">
+        <path id="x" d="M18.717 6.697l-1.414-1.414-5.303 5.303-5.303-5.303-1.414 1.414 5.303 5.303-5.303 5.303 1.414 1.414 5.303-5.303 5.303 5.303 1.414-1.414-5.303-5.303z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/code.svg b/resources/lib/oojs-ui/themes/apex/images/icons/code.svg
new file mode 100644 (file)
index 0000000..32f140d
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+    <g id="code">
+        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1v-2.386c0-.514.024-.896.073-1.142.054-.252.139-.463.257-.633.204-.279.473-.475.808-.584.335-.115.872-.255 1.835-.255h1.027v1h-.752c-.457 0-.77.191-.936.408-.167.215-.312.445-.312 1.068v1.857c0 .729-.041 1.18-.244 1.493-.2.307-.562.529-1.09.667.535.155.9.385 1.096.688.199.303.238.757.238 1.484v1.862c0 .619.145.848.312 1.062.166.22.479.407.936.407l.752.004v1h-1.027c-.963 0-1.5-.133-1.835-.248-.335-.109-.604-.307-.808-.591-.118-.165-.203-.374-.257-.625-.049-.253-.073-.636-.073-1.149v-2.387c0-1 0-1-1-1h-1z"/>
+        <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/collapse.svg b/resources/lib/oojs-ui/themes/apex/images/icons/collapse.svg
new file mode 100644 (file)
index 0000000..55aa8f8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="collapse">
+        <path id="arrow" d="M6.697 15.714l5.303-5.302 5.303 5.302 1.414-1.414-6.717-6.717-6.717 6.717z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/comment.svg b/resources/lib/oojs-ui/themes/apex/images/icons/comment.svg
new file mode 100644 (file)
index 0000000..0ae7e63
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="comment">
+        <path id="speech-bubble" d="M15 6h-6c-1.657 0-3 1.344-3 3v4c0 1.656 1.343 3 3 3v3l3-3h3c1.657 0 3-1.344 3-3v-4c0-1.656-1.343-3-3-3z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/expand.svg b/resources/lib/oojs-ui/themes/apex/images/icons/expand.svg
new file mode 100644 (file)
index 0000000..7666b41
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="expand">
+        <path id="arrow" d="M17.303 8.283l-5.303 5.303-5.303-5.303-1.414 1.414 6.717 6.717 6.717-6.717z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/help.svg b/resources/lib/oojs-ui/themes/apex/images/icons/help.svg
new file mode 100644 (file)
index 0000000..bb2545c
--- /dev/null
@@ -0,0 +1,10 @@
+<?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="help">
+        <path id="circle" d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/>
+        <g id="question-mark">
+            <path id="top" d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/>
+            <path id="bottom" d="M11 16h2v2h-2z"/>
+        </g>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/info.svg b/resources/lib/oojs-ui/themes/apex/images/icons/info.svg
new file mode 100644 (file)
index 0000000..9c0d1cb
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
+    <g id="info">
+        <path id="circled-i" d="M11.499 17c-3.036 0-5.499-2.464-5.499-5.5 0-3.037 2.462-5.5 5.499-5.5 3.037 0 5.501 2.462 5.501 5.5 0 3.036-2.464 5.5-5.501 5.5zm.002-12c-3.591 0-6.501 2.91-6.501 6.5s2.91 6.5 6.501 6.5c3.588 0 6.499-2.911 6.499-6.5s-2.911-6.5-6.499-6.5zM12 10v4h1v1h-3v-1h1v-3h-1v-1zM11 8h1v1h-1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/link.svg b/resources/lib/oojs-ui/themes/apex/images/icons/link.svg
new file mode 100644 (file)
index 0000000..dbae341
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="link">
+        <path id="right" d="M19.188 12.001c0 1.1-.891 2.015-1.988 2.015l-4.195-.015c.538 1.088.963 1.999 1.997 1.999h3c1.656 0 2.998-2.343 2.998-4s-1.342-4-2.998-4h-3c-1.034 0-1.459.911-1.998 1.999l4.195-.015c1.098 0 1.989.917 1.989 2.017z"/>
+        <path id="center" d="M8 12c0 .535.42 1 .938 1h6.109c.518 0 .938-.465.938-1 0-.534-.42-1-.938-1h-6.109c-.518 0-.938.466-.938 1z"/>
+        <path id="left" d="M4.816 11.999c0-1.1.891-2.015 1.988-2.015l4.196.015c-.539-1.088-.964-1.999-1.998-1.999h-3c-1.656 0-2.998 2.343-2.998 4s1.342 4 2.998 4h3c1.034 0 1.459-.911 1.998-1.999l-4.195.015c-1.098 0-1.989-.917-1.989-2.017z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/menu.svg b/resources/lib/oojs-ui/themes/apex/images/icons/menu.svg
new file mode 100644 (file)
index 0000000..50ac8a3
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="menu">
+        <path id="lines" d="M6 15h12c.553 0 1 .447 1 1v1c0 .553-.447 1-1 1h-12c-.553 0-1-.447-1-1v-1c0-.553.447-1 1-1zm-1-4v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1zm0-5v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.svg
new file mode 100644 (file)
index 0000000..51e6611
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="move-ltr">
+        <path id="arrow" d="M8.935 7.181l5.302 5.302-5.302 5.303 1.414 1.414 6.716-6.717-6.716-6.716z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.svg
new file mode 100644 (file)
index 0000000..bcee09d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="move-rtl">
+        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.414-6.716 6.716 6.716 6.717z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/picture.svg b/resources/lib/oojs-ui/themes/apex/images/icons/picture.svg
new file mode 100644 (file)
index 0000000..7400bca
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="picture">
+        <path id="frame" d="M18 4h-12c-2-.007-3 .993-3 2.993l.014 9.007c-.014 2 .986 2.988 2.986 3h12c2-.012 2.994-1 3-3.006v-9.001c-.006-2-1-3-3-2.993zm1 13h-14v-11h14v11z"/>
+        <path id="mountains" d="M6 13.5l3.5-3.5 2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12z"/>
+        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172 2.938-2.016 2.5 2v-4h-12z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/remove.svg b/resources/lib/oojs-ui/themes/apex/images/icons/remove.svg
new file mode 100644 (file)
index 0000000..6ad7917
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="remove">
+        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0h-1v6h1v-6zm4 0h-1v6h1v-6zm0-4v-1h-5v1h-3v3h1v7.966l1 1.031v-.074.077h6.984l.016-.018v.015l1-1.031v-7.966h1v-3h-3zm1 11h-7v-8h7v8zm1-9h-9v-1h9v1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search.svg b/resources/lib/oojs-ui/themes/apex/images/icons/search.svg
new file mode 100644 (file)
index 0000000..e4db4f0
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="search">
+        <path id="magnifying-glass" d="M16.021 15.96l-2.374-2.375-.169-.099c.403-.566.643-1.26.643-2.009-.001-1.92-1.558-3.477-3.477-3.477-1.921 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.749 0 1.442-.239 2.01-.643l.098.169 2.375 2.374c.19.189.543.143.79-.104s.293-.601.104-.791zm-5.377-2.27c-1.221 0-2.213-.991-2.213-2.213 0-1.221.992-2.213 2.213-2.213 1.222 0 2.213.992 2.213 2.213-.001 1.222-.992 2.213-2.213 2.213z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/settings.svg b/resources/lib/oojs-ui/themes/apex/images/icons/settings.svg
new file mode 100644 (file)
index 0000000..9fa0a4b
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
+    <g id="settings">
+        <path id="gear" d="M3 4h3v2h-3zM12 4h9v2h-9zM8 3h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 11h9v2h-9zM18 11h3v2h-3zM14 10h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 18h6v2h-6zM15 18h6v2h-6zM11 17h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/tag.svg b/resources/lib/oojs-ui/themes/apex/images/icons/tag.svg
new file mode 100644 (file)
index 0000000..534824c
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="tag">
+        <path d="M18.748 11.717c.389.389.389 1.025 0 1.414l-4.949 4.95c-.389.389-1.025.389-1.414 0l-6.01-6.01c-.389-.389-.707-1.157-.707-1.707l-.001-4.364c0-.55.45-1 1-1h4.364c.55 0 1.318.318 1.707.707l6.01 6.01zm-10.644-4.261c-.579.576-.578 1.514-.001 2.093.578.577 1.516.577 2.095.001.576-.578.576-1.517 0-2.095-.581-.576-1.518-.577-2.094.001z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/window.svg b/resources/lib/oojs-ui/themes/apex/images/icons/window.svg
new file mode 100644 (file)
index 0000000..cd3b76c
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="window">
+        <path id="title" d="M7 10h10v1h-10z"/>
+        <path id="frame" d="M16 19h-8c-2.206 0-4-1.794-4-4v-6c0-2.206 1.794-4 4-4h8c2.206 0 4 1.794 4 4v6c0 2.206-1.794 4-4 4zm-8-12c-1.103 0-2 .897-2 2v6c0 1.103.897 2 2 2h8c1.103 0 2-.897 2-2v-6c0-1.103-.897-2-2-2h-8z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/alert.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/alert.svg
new file mode 100644 (file)
index 0000000..d9dc6a8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="alert">
+        <path d="M6 12c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2v-5h-2zm0 3h2v-2h-2z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.svg
new file mode 100644 (file)
index 0000000..bfa8ef0
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="down">
+        <path id="arrow" d="M2 3l3.5 6 3.5-6z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.svg
new file mode 100644 (file)
index 0000000..aeca27a
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="ltr">
+        <path id="arrow" d="M3 9v-7l6 3.5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.svg
new file mode 100644 (file)
index 0000000..eba0099
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="rtl">
+        <path id="arrow" d="M3 5.5l6 3.5v-7z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.svg
new file mode 100644 (file)
index 0000000..4b01bb0
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="up">
+        <path id="arrow" d="M5.5 2l-3.5 6h7z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/required.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/required.svg
new file mode 100644 (file)
index 0000000..969fa2d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="required">
+        <path d="M5 1h2v10h-2zM9.83 2.634l1 1.732-8.66 5-1-1.732zM1.17 4.366l1-1.732 8.66 5-1 1.732z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/textures/pending.gif b/resources/lib/oojs-ui/themes/apex/images/textures/pending.gif
new file mode 100644 (file)
index 0000000..1194eed
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/textures/pending.gif differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/textures/transparency.svg b/resources/lib/oojs-ui/themes/apex/images/textures/transparency.svg
new file mode 100644 (file)
index 0000000..63a0b57
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="16" height="16" viewBox="0, 0, 16, 16">
+       <g id="transparency">
+               <path d="M0,0 L8,0 L8,8 L0,8 z" fill="#CCCCCC"/>
+               <path d="M8,8 L16,8 L16,16 L8,16 z" fill="#CCCCCC"/>
+               <path d="M8,0 L16,0 L16,8 L8,8 z" fill="#FFFFFF"/>
+               <path d="M0,8 L8,8 L8,16 L0,16 z" fill="#FFFFFF"/>
+       </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png b/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png
new file mode 100644 (file)
index 0000000..97e8d13
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.svg
new file mode 100644 (file)
index 0000000..cfbb6d8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00C697 }</style>
+    <g id="add">
+        <path id="plus" d="M13 8h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-invert.svg
new file mode 100644 (file)
index 0000000..93a1c6e
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="add">
+        <path id="plus" d="M13 8h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/add.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/add.svg
new file mode 100644 (file)
index 0000000..29e5dba
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="add">
+        <path id="plus" d="M13 8h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.svg
new file mode 100644 (file)
index 0000000..c3e43d1
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="settings">
+        <path id="gear" d="M20.869 13.476c.079-.482.131-.972.131-1.476s-.052-.994-.131-1.476l-2.463-.259c-.149-.556-.367-1.082-.648-1.57l1.558-1.924c-.576-.806-1.281-1.511-2.087-2.087l-1.924 1.558c-.488-.281-1.015-.499-1.57-.648l-.259-2.463c-.482-.079-.972-.131-1.476-.131s-.994.052-1.476.131l-.259 2.463c-.555.149-1.081.367-1.57.648l-1.924-1.557c-.805.576-1.51 1.281-2.086 2.086l1.558 1.924c-.281.488-.499 1.015-.648 1.57l-2.463.259c-.08.482-.132.972-.132 1.476s.052.994.131 1.476l2.463.259c.149.556.367 1.082.648 1.57l-1.558 1.924c.576.806 1.281 1.511 2.087 2.087l1.924-1.558c.488.281 1.015.499 1.57.648l.259 2.463c.482.079.972.131 1.476.131s.994-.052 1.476-.131l.259-2.463c.556-.149 1.082-.367 1.57-.648l1.924 1.558c.806-.576 1.511-1.281 2.087-2.087l-1.558-1.924c.281-.488.499-1.015.648-1.57l2.463-.259zm-8.869 2.522c-2.209 0-3.998-1.789-3.998-3.998s1.789-3.998 3.998-3.998 3.998 1.789 3.998 3.998-1.789 3.998-3.998 3.998z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced.svg
new file mode 100644 (file)
index 0000000..201b4d7
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="settings">
+        <path id="gear" d="M20.869 13.476c.079-.482.131-.972.131-1.476s-.052-.994-.131-1.476l-2.463-.259c-.149-.556-.367-1.082-.648-1.57l1.558-1.924c-.576-.806-1.281-1.511-2.087-2.087l-1.924 1.558c-.488-.281-1.015-.499-1.57-.648l-.259-2.463c-.482-.079-.972-.131-1.476-.131s-.994.052-1.476.131l-.259 2.463c-.555.149-1.081.367-1.57.648l-1.924-1.557c-.805.576-1.51 1.281-2.086 2.086l1.558 1.924c-.281.488-.499 1.015-.648 1.57l-2.463.259c-.08.482-.132.972-.132 1.476s.052.994.131 1.476l2.463.259c.149.556.367 1.082.648 1.57l-1.558 1.924c.576.806 1.281 1.511 2.087 2.087l1.924-1.558c.488.281 1.015.499 1.57.648l.259 2.463c.482.079.972.131 1.476.131s.994-.052 1.476-.131l.259-2.463c.556-.149 1.082-.367 1.57-.648l1.924 1.558c.806-.576 1.511-1.281 2.087-2.087l-1.558-1.924c.281-.488.499-1.015.648-1.57l2.463-.259zm-8.869 2.522c-2.209 0-3.998-1.789-3.998-3.998s1.789-3.998 3.998-3.998 3.998 1.789 3.998 3.998-1.789 3.998-3.998 3.998z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-invert.svg
new file mode 100644 (file)
index 0000000..715a3f5
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="alert">
+        <path id="point" d="M11 16h2v2h-2z"/>
+        <path id="stroke" d="M13.516 10h-3l.484 5h2z"/>
+        <path id="triangle" d="M12.017 5.974l7.519 13.026h-15.04l7.521-13.026m0-2.474c-.544 0-1.088.357-1.5 1.071l-7.985 13.831c-.825 1.429-.15 2.598 1.5 2.598h15.968c1.65 0 2.325-1.169 1.5-2.599l-7.983-13.829c-.413-.715-.956-1.072-1.5-1.072z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/alert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/alert.svg
new file mode 100644 (file)
index 0000000..f0c6522
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="alert">
+        <path id="point" d="M11 16h2v2h-2z"/>
+        <path id="stroke" d="M13.516 10h-3l.484 5h2z"/>
+        <path id="triangle" d="M12.017 5.974l7.519 13.026h-15.04l7.521-13.026m0-2.474c-.544 0-1.088.357-1.5 1.071l-7.985 13.831c-.825 1.429-.15 2.598 1.5 2.598h15.968c1.65 0 2.325-1.169 1.5-2.599l-7.983-13.829c-.413-.715-.956-1.072-1.5-1.072z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg
new file mode 100644 (file)
index 0000000..1874597
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="arched-arrow-ltr">
+        <path id="arrow" d="M19.925 14.937l-2.391-6.901-1.48 2.329c-.964-.845-2.699-1.85-5.513-1.823-4.887.046-6.524 4.244-6.524 4.244s2.753-2.639 6.925-1.949c1.729.286 3.007 1.206 3.675 1.791l-1.474 2.319 6.782-.01z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr.svg
new file mode 100644 (file)
index 0000000..8a670ef
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="arched-arrow-ltr">
+        <path id="arrow" d="M19.925 14.937l-2.391-6.901-1.48 2.329c-.964-.845-2.699-1.85-5.513-1.823-4.887.046-6.524 4.244-6.524 4.244s2.753-2.639 6.925-1.949c1.729.286 3.007 1.206 3.675 1.791l-1.474 2.319 6.782-.01z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg
new file mode 100644 (file)
index 0000000..75b23b4
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="arched-arrow-rtl">
+        <path id="arrow" d="M13.401 8.542c-2.814-.027-4.549.978-5.513 1.823l-1.48-2.329-2.391 6.901 6.782.009-1.474-2.319c.668-.584 1.945-1.504 3.675-1.791 4.172-.69 6.925 1.949 6.925 1.949s-1.637-4.197-6.524-4.243z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl.svg
new file mode 100644 (file)
index 0000000..01fc216
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="arched-arrow-rtl">
+        <path id="arrow" d="M13.401 8.542c-2.814-.027-4.549.978-5.513 1.823l-1.48-2.329-2.391 6.901 6.782.009-1.474-2.319c.668-.584 1.945-1.504 3.675-1.791 4.172-.69 6.925 1.949 6.925 1.949s-1.637-4.197-6.524-4.243z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-invert.svg
new file mode 100644 (file)
index 0000000..3e42ba8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24"><style>* { fill: #FFFFFF }</style>
+    <g id="check">
+        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-primary.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-primary.svg
new file mode 100644 (file)
index 0000000..6139b58
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24"><style>* { fill: #598AD1 }</style>
+    <g id="check">
+        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check.svg
new file mode 100644 (file)
index 0000000..8d4a1f8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
+    <g id="check">
+        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/clear-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/clear-invert.svg
new file mode 100644 (file)
index 0000000..6d3bc58
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="clear">
+        <path id="circle-with-strike" d="M11.999 5.022c-3.853 0-6.977 3.124-6.977 6.978 0 3.853 3.124 6.978 6.977 6.978 3.854 0 6.979-3.125 6.979-6.978 0-3.854-3.125-6.978-6.979-6.978zm-5.113 6.978c0-1.092.572-3.25.93-2.929l7.113 7.113c.488.525-1.837.931-2.93.931-2.825-.001-5.113-2.291-5.113-5.115zm9.298 2.929l-7.114-7.113c-.445-.483 1.837-.931 2.929-.931 2.827 0 5.115 2.289 5.115 5.114 0 1.093-.364 3.543-.93 2.93z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/clear.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/clear.svg
new file mode 100644 (file)
index 0000000..0dcde9d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="clear">
+        <path id="circle-with-strike" d="M11.999 5.022c-3.853 0-6.977 3.124-6.977 6.978 0 3.853 3.124 6.978 6.977 6.978 3.854 0 6.979-3.125 6.979-6.978 0-3.854-3.125-6.978-6.979-6.978zm-5.113 6.978c0-1.092.572-3.25.93-2.929l7.113 7.113c.488.525-1.837.931-2.93.931-2.825-.001-5.113-2.291-5.113-5.115zm9.298 2.929l-7.114-7.113c-.445-.483 1.837-.931 2.929-.931 2.827 0 5.115 2.289 5.115 5.114 0 1.093-.364 3.543-.93 2.93z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg
new file mode 100644 (file)
index 0000000..0305027
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="close">
+        <path id="x" d="M18.717 6.697l-1.414-1.414-5.303 5.303-5.303-5.303-1.414 1.414 5.303 5.303-5.303 5.303 1.414 1.414 5.303-5.303 5.303 5.303 1.414-1.414-5.303-5.303z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg
new file mode 100644 (file)
index 0000000..1345e86
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="close">
+        <path id="x" d="M18.717 6.697l-1.414-1.414-5.303 5.303-5.303-5.303-1.414 1.414 5.303 5.303-5.303 5.303 1.414 1.414 5.303-5.303 5.303 5.303 1.414-1.414-5.303-5.303z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/code-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/code-invert.svg
new file mode 100644 (file)
index 0000000..bc4ae94
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="code">
+        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1v-2.386c0-.514.024-.896.073-1.142.054-.252.139-.463.257-.633.204-.279.473-.475.808-.584.335-.115.872-.255 1.835-.255h1.027v1h-.752c-.457 0-.77.191-.936.408-.167.215-.312.445-.312 1.068v1.857c0 .729-.041 1.18-.244 1.493-.2.307-.562.529-1.09.667.535.155.9.385 1.096.688.199.303.238.757.238 1.484v1.862c0 .619.145.848.312 1.062.166.22.479.407.936.407l.752.004v1h-1.027c-.963 0-1.5-.133-1.835-.248-.335-.109-.604-.307-.808-.591-.118-.165-.203-.374-.257-.625-.049-.253-.073-.636-.073-1.149v-2.387c0-1 0-1-1-1h-1z"/>
+        <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/code.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/code.svg
new file mode 100644 (file)
index 0000000..32f140d
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+    <g id="code">
+        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1v-2.386c0-.514.024-.896.073-1.142.054-.252.139-.463.257-.633.204-.279.473-.475.808-.584.335-.115.872-.255 1.835-.255h1.027v1h-.752c-.457 0-.77.191-.936.408-.167.215-.312.445-.312 1.068v1.857c0 .729-.041 1.18-.244 1.493-.2.307-.562.529-1.09.667.535.155.9.385 1.096.688.199.303.238.757.238 1.484v1.862c0 .619.145.848.312 1.062.166.22.479.407.936.407l.752.004v1h-1.027c-.963 0-1.5-.133-1.835-.248-.335-.109-.604-.307-.808-.591-.118-.165-.203-.374-.257-.625-.049-.253-.073-.636-.073-1.149v-2.387c0-1 0-1-1-1h-1z"/>
+        <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/collapse-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/collapse-invert.svg
new file mode 100644 (file)
index 0000000..451e0fe
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="collapse">
+        <path id="arrow" d="M6.697 15.714l5.303-5.302 5.303 5.302 1.414-1.414-6.717-6.717-6.717 6.717z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/collapse.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/collapse.svg
new file mode 100644 (file)
index 0000000..55aa8f8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="collapse">
+        <path id="arrow" d="M6.697 15.714l5.303-5.302 5.303 5.302 1.414-1.414-6.717-6.717-6.717 6.717z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/comment-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/comment-invert.svg
new file mode 100644 (file)
index 0000000..b6152fe
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="comment">
+        <path id="speech-bubble" d="M15 6h-6c-1.657 0-3 1.344-3 3v4c0 1.656 1.343 3 3 3v3l3-3h3c1.657 0 3-1.344 3-3v-4c0-1.656-1.343-3-3-3z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/comment.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/comment.svg
new file mode 100644 (file)
index 0000000..0ae7e63
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="comment">
+        <path id="speech-bubble" d="M15 6h-6c-1.657 0-3 1.344-3 3v4c0 1.656 1.343 3 3 3v3l3-3h3c1.657 0 3-1.344 3-3v-4c0-1.656-1.343-3-3-3z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/expand-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/expand-invert.svg
new file mode 100644 (file)
index 0000000..a3cadb4
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="expand">
+        <path id="arrow" d="M17.303 8.283l-5.303 5.303-5.303-5.303-1.414 1.414 6.717 6.717 6.717-6.717z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/expand.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/expand.svg
new file mode 100644 (file)
index 0000000..7666b41
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="expand">
+        <path id="arrow" d="M17.303 8.283l-5.303 5.303-5.303-5.303-1.414 1.414 6.717 6.717 6.717-6.717z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-invert.svg
new file mode 100644 (file)
index 0000000..3670661
--- /dev/null
@@ -0,0 +1,10 @@
+<?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="help">
+        <path id="circle" d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/>
+        <g id="question-mark">
+            <path id="top" d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/>
+            <path id="bottom" d="M11 16h2v2h-2z"/>
+        </g>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help.svg
new file mode 100644 (file)
index 0000000..bb2545c
--- /dev/null
@@ -0,0 +1,10 @@
+<?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="help">
+        <path id="circle" d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/>
+        <g id="question-mark">
+            <path id="top" d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/>
+            <path id="bottom" d="M11 16h2v2h-2z"/>
+        </g>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/info-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/info-invert.svg
new file mode 100644 (file)
index 0000000..be4d2c7
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24"><style>* { fill: #FFFFFF }</style>
+    <g id="info">
+        <path id="circled-i" d="M11.499 17c-3.036 0-5.499-2.464-5.499-5.5 0-3.037 2.462-5.5 5.499-5.5 3.037 0 5.501 2.462 5.501 5.5 0 3.036-2.464 5.5-5.501 5.5zm.002-12c-3.591 0-6.501 2.91-6.501 6.5s2.91 6.5 6.501 6.5c3.588 0 6.499-2.911 6.499-6.5s-2.911-6.5-6.499-6.5zM12 10v4h1v1h-3v-1h1v-3h-1v-1zM11 8h1v1h-1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/info.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/info.svg
new file mode 100644 (file)
index 0000000..9c0d1cb
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
+    <g id="info">
+        <path id="circled-i" d="M11.499 17c-3.036 0-5.499-2.464-5.499-5.5 0-3.037 2.462-5.5 5.499-5.5 3.037 0 5.501 2.462 5.501 5.5 0 3.036-2.464 5.5-5.501 5.5zm.002-12c-3.591 0-6.501 2.91-6.501 6.5s2.91 6.5 6.501 6.5c3.588 0 6.499-2.911 6.499-6.5s-2.911-6.5-6.499-6.5zM12 10v4h1v1h-3v-1h1v-3h-1v-1zM11 8h1v1h-1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/link-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/link-invert.svg
new file mode 100644 (file)
index 0000000..01ce113
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="link">
+        <path id="right" d="M19.188 12.001c0 1.1-.891 2.015-1.988 2.015l-4.195-.015c.538 1.088.963 1.999 1.997 1.999h3c1.656 0 2.998-2.343 2.998-4s-1.342-4-2.998-4h-3c-1.034 0-1.459.911-1.998 1.999l4.195-.015c1.098 0 1.989.917 1.989 2.017z"/>
+        <path id="center" d="M8 12c0 .535.42 1 .938 1h6.109c.518 0 .938-.465.938-1 0-.534-.42-1-.938-1h-6.109c-.518 0-.938.466-.938 1z"/>
+        <path id="left" d="M4.816 11.999c0-1.1.891-2.015 1.988-2.015l4.196.015c-.539-1.088-.964-1.999-1.998-1.999h-3c-1.656 0-2.998 2.343-2.998 4s1.342 4 2.998 4h3c1.034 0 1.459-.911 1.998-1.999l-4.195.015c-1.098 0-1.989-.917-1.989-2.017z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/link.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/link.svg
new file mode 100644 (file)
index 0000000..dbae341
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="link">
+        <path id="right" d="M19.188 12.001c0 1.1-.891 2.015-1.988 2.015l-4.195-.015c.538 1.088.963 1.999 1.997 1.999h3c1.656 0 2.998-2.343 2.998-4s-1.342-4-2.998-4h-3c-1.034 0-1.459.911-1.998 1.999l4.195-.015c1.098 0 1.989.917 1.989 2.017z"/>
+        <path id="center" d="M8 12c0 .535.42 1 .938 1h6.109c.518 0 .938-.465.938-1 0-.534-.42-1-.938-1h-6.109c-.518 0-.938.466-.938 1z"/>
+        <path id="left" d="M4.816 11.999c0-1.1.891-2.015 1.988-2.015l4.196.015c-.539-1.088-.964-1.999-1.998-1.999h-3c-1.656 0-2.998 2.343-2.998 4s1.342 4 2.998 4h3c1.034 0 1.459-.911 1.998-1.999l-4.195.015c-1.098 0-1.989-.917-1.989-2.017z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.svg
new file mode 100644 (file)
index 0000000..dddbbb8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="menu">
+        <path id="lines" d="M6 15h12c.553 0 1 .447 1 1v1c0 .553-.447 1-1 1h-12c-.553 0-1-.447-1-1v-1c0-.553.447-1 1-1zm-1-4v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1zm0-5v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.svg
new file mode 100644 (file)
index 0000000..50ac8a3
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="menu">
+        <path id="lines" d="M6 15h12c.553 0 1 .447 1 1v1c0 .553-.447 1-1 1h-12c-.553 0-1-.447-1-1v-1c0-.553.447-1 1-1zm-1-4v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1zm0-5v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr-invert.svg
new file mode 100644 (file)
index 0000000..10f0c4e
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="move-ltr">
+        <path id="arrow" d="M8.935 7.181l5.302 5.302-5.302 5.303 1.414 1.414 6.716-6.717-6.716-6.716z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr.svg
new file mode 100644 (file)
index 0000000..51e6611
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="move-ltr">
+        <path id="arrow" d="M8.935 7.181l5.302 5.302-5.302 5.303 1.414 1.414 6.716-6.717-6.716-6.716z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-invert.svg
new file mode 100644 (file)
index 0000000..002ec0f
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="move-rtl">
+        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.414-6.716 6.716 6.716 6.717z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl.svg
new file mode 100644 (file)
index 0000000..bcee09d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="move-rtl">
+        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.414-6.716 6.716 6.716 6.717z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.svg
new file mode 100644 (file)
index 0000000..55e0b7f
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="picture">
+        <path id="frame" d="M18 4h-12c-2-.007-3 .993-3 2.993l.014 9.007c-.014 2 .986 2.988 2.986 3h12c2-.012 2.994-1 3-3.006v-9.001c-.006-2-1-3-3-2.993zm1 13h-14v-11h14v11z"/>
+        <path id="mountains" d="M6 13.5l3.5-3.5 2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12z"/>
+        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172 2.938-2.016 2.5 2v-4h-12z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.svg
new file mode 100644 (file)
index 0000000..7400bca
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="picture">
+        <path id="frame" d="M18 4h-12c-2-.007-3 .993-3 2.993l.014 9.007c-.014 2 .986 2.988 2.986 3h12c2-.012 2.994-1 3-3.006v-9.001c-.006-2-1-3-3-2.993zm1 13h-14v-11h14v11z"/>
+        <path id="mountains" d="M6 13.5l3.5-3.5 2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12z"/>
+        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172 2.938-2.016 2.5 2v-4h-12z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-destructive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-destructive.svg
new file mode 100644 (file)
index 0000000..be51bea
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #E81915 }</style>
+    <g id="remove">
+        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0h-1v6h1v-6zm4 0h-1v6h1v-6zm0-4v-1h-5v1h-3v3h1v7.966l1 1.031v-.074.077h6.984l.016-.018v.015l1-1.031v-7.966h1v-3h-3zm1 11h-7v-8h7v8zm1-9h-9v-1h9v1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-invert.svg
new file mode 100644 (file)
index 0000000..ddc352f
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="remove">
+        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0h-1v6h1v-6zm4 0h-1v6h1v-6zm0-4v-1h-5v1h-3v3h1v7.966l1 1.031v-.074.077h6.984l.016-.018v.015l1-1.031v-7.966h1v-3h-3zm1 11h-7v-8h7v8zm1-9h-9v-1h9v1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove.svg
new file mode 100644 (file)
index 0000000..6ad7917
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="remove">
+        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0h-1v6h1v-6zm4 0h-1v6h1v-6zm0-4v-1h-5v1h-3v3h1v7.966l1 1.031v-.074.077h6.984l.016-.018v.015l1-1.031v-7.966h1v-3h-3zm1 11h-7v-8h7v8zm1-9h-9v-1h9v1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/search-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/search-invert.svg
new file mode 100644 (file)
index 0000000..5ae4952
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="search">
+        <path id="magnifying-glass" d="M16.021 15.96l-2.374-2.375-.169-.099c.403-.566.643-1.26.643-2.009-.001-1.92-1.558-3.477-3.477-3.477-1.921 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.749 0 1.442-.239 2.01-.643l.098.169 2.375 2.374c.19.189.543.143.79-.104s.293-.601.104-.791zm-5.377-2.27c-1.221 0-2.213-.991-2.213-2.213 0-1.221.992-2.213 2.213-2.213 1.222 0 2.213.992 2.213 2.213-.001 1.222-.992 2.213-2.213 2.213z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/search.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/search.svg
new file mode 100644 (file)
index 0000000..e4db4f0
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="search">
+        <path id="magnifying-glass" d="M16.021 15.96l-2.374-2.375-.169-.099c.403-.566.643-1.26.643-2.009-.001-1.92-1.558-3.477-3.477-3.477-1.921 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.749 0 1.442-.239 2.01-.643l.098.169 2.375 2.374c.19.189.543.143.79-.104s.293-.601.104-.791zm-5.377-2.27c-1.221 0-2.213-.991-2.213-2.213 0-1.221.992-2.213 2.213-2.213 1.222 0 2.213.992 2.213 2.213-.001 1.222-.992 2.213-2.213 2.213z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/settings-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/settings-invert.svg
new file mode 100644 (file)
index 0000000..d7ad1e5
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24"><style>* { fill: #FFFFFF }</style>
+    <g id="settings">
+        <path id="gear" d="M3 4h3v2h-3zM12 4h9v2h-9zM8 3h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 11h9v2h-9zM18 11h3v2h-3zM14 10h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 18h6v2h-6zM15 18h6v2h-6zM11 17h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/settings.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/settings.svg
new file mode 100644 (file)
index 0000000..9fa0a4b
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
+    <g id="settings">
+        <path id="gear" d="M3 4h3v2h-3zM12 4h9v2h-9zM8 3h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 11h9v2h-9zM18 11h3v2h-3zM14 10h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 18h6v2h-6zM15 18h6v2h-6zM11 17h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-invert.svg
new file mode 100644 (file)
index 0000000..e573429
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="tag">
+        <path d="M18.748 11.717c.389.389.389 1.025 0 1.414l-4.949 4.95c-.389.389-1.025.389-1.414 0l-6.01-6.01c-.389-.389-.707-1.157-.707-1.707l-.001-4.364c0-.55.45-1 1-1h4.364c.55 0 1.318.318 1.707.707l6.01 6.01zm-10.644-4.261c-.579.576-.578 1.514-.001 2.093.578.577 1.516.577 2.095.001.576-.578.576-1.517 0-2.095-.581-.576-1.518-.577-2.094.001z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag.svg
new file mode 100644 (file)
index 0000000..534824c
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="tag">
+        <path d="M18.748 11.717c.389.389.389 1.025 0 1.414l-4.949 4.95c-.389.389-1.025.389-1.414 0l-6.01-6.01c-.389-.389-.707-1.157-.707-1.707l-.001-4.364c0-.55.45-1 1-1h4.364c.55 0 1.318.318 1.707.707l6.01 6.01zm-10.644-4.261c-.579.576-.578 1.514-.001 2.093.578.577 1.516.577 2.095.001.576-.578.576-1.517 0-2.095-.581-.576-1.518-.577-2.094.001z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/window-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/window-invert.svg
new file mode 100644 (file)
index 0000000..0aeb616
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="window">
+        <path id="title" d="M7 10h10v1h-10z"/>
+        <path id="frame" d="M16 19h-8c-2.206 0-4-1.794-4-4v-6c0-2.206 1.794-4 4-4h8c2.206 0 4 1.794 4 4v6c0 2.206-1.794 4-4 4zm-8-12c-1.103 0-2 .897-2 2v6c0 1.103.897 2 2 2h8c1.103 0 2-.897 2-2v-6c0-1.103-.897-2-2-2h-8z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/window.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/window.svg
new file mode 100644 (file)
index 0000000..cd3b76c
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="window">
+        <path id="title" d="M7 10h10v1h-10z"/>
+        <path id="frame" d="M16 19h-8c-2.206 0-4-1.794-4-4v-6c0-2.206 1.794-4 4-4h8c2.206 0 4 1.794 4 4v6c0 2.206-1.794 4-4 4zm-8-12c-1.103 0-2 .897-2 2v6c0 1.103.897 2 2 2h8c1.103 0 2-.897 2-2v-6c0-1.103-.897-2-2-2h-8z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-invert.svg
new file mode 100644 (file)
index 0000000..cd66649
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+    <g id="alert">
+        <path d="M6 12c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2v-5h-2zm0 3h2v-2h-2z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert.svg
new file mode 100644 (file)
index 0000000..d9dc6a8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="alert">
+        <path d="M6 12c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2v-5h-2zm0 3h2v-2h-2z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.svg
new file mode 100644 (file)
index 0000000..31a561a
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+    <g id="ltr">
+        <path id="arrow" d="M12.008,3.034 L11.545,2.567 C11.095,2.121 10.359,2.122 9.908,2.567 L6.003,6.424 L2.087,2.559 C1.637,2.113 0.911,2.129 0.461,2.576 L-0.001,3.034 L6.003,9 L6.003,8.991 L6.003,9 L12.008,3.034"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.svg
new file mode 100644 (file)
index 0000000..d64695f
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="ltr">
+        <path id="arrow" d="M12.008,3.034 L11.545,2.567 C11.095,2.121 10.359,2.122 9.908,2.567 L6.003,6.424 L2.087,2.559 C1.637,2.113 0.911,2.129 0.461,2.576 L-0.001,3.034 L6.003,9 L6.003,8.991 L6.003,9 L12.008,3.034"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.svg
new file mode 100644 (file)
index 0000000..5816c08
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+    <g id="ltr">
+        <path id="arrow" d="M3.972,-0.005 L3.503,0.458 C3.058,0.908 3.058,1.644 3.503,2.095 L7.36,6 L3.495,9.915 C3.05,10.365 3.065,11.091 3.513,11.541 L3.972,12.004 L9.938,6 L9.929,6 L9.938,6 L3.972,-0.005"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.svg
new file mode 100644 (file)
index 0000000..7bccea1
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="ltr">
+        <path id="arrow" d="M3.972,-0.005 L3.503,0.458 C3.058,0.908 3.058,1.644 3.503,2.095 L7.36,6 L3.495,9.915 C3.05,10.365 3.065,11.091 3.513,11.541 L3.972,12.004 L9.938,6 L9.929,6 L9.938,6 L3.972,-0.005"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.svg
new file mode 100644 (file)
index 0000000..01e40d7
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+    <g id="rtl">
+        <path id="arrow" d="M7.979,12.004 L8.448,11.541 C8.893,11.091 8.893,10.355 8.448,9.904 L4.59,5.999 L8.455,2.084 C8.9,1.634 8.885,0.908 8.437,0.458 L7.979,-0.005 L2.013,5.999 L2.022,5.999 L2.013,5.999 L7.979,12.004"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.svg
new file mode 100644 (file)
index 0000000..304c516
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="rtl">
+        <path id="arrow" d="M7.979,12.004 L8.448,11.541 C8.893,11.091 8.893,10.355 8.448,9.904 L4.59,5.999 L8.455,2.084 C8.9,1.634 8.885,0.908 8.437,0.458 L7.979,-0.005 L2.013,5.999 L2.022,5.999 L2.013,5.999 L7.979,12.004"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.svg
new file mode 100644 (file)
index 0000000..e880711
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+    <g id="up">
+        <path id="arrow" d="M-0.001,7.99 L0.462,8.459 C0.912,8.904 1.648,8.904 2.099,8.459 L6.004,4.601 L9.919,8.467 C10.369,8.912 11.095,8.897 11.545,8.449 L12.008,7.99 L6.004,2.024 L6.004,2.033 L6.004,2.024 L-0.001,7.99"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.svg
new file mode 100644 (file)
index 0000000..4769526
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="up">
+        <path id="arrow" d="M-0.001,7.99 L0.462,8.459 C0.912,8.904 1.648,8.904 2.099,8.459 L6.004,4.601 L9.919,8.467 C10.369,8.912 11.095,8.897 11.545,8.449 L12.008,7.99 L6.004,2.024 L6.004,2.033 L6.004,2.024 L-0.001,7.99"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-invert.svg
new file mode 100644 (file)
index 0000000..30baa50
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+    <g id="required">
+        <path d="M5 1h2v10h-2zM9.83 2.634l1 1.732-8.66 5-1-1.732zM1.17 4.366l1-1.732 8.66 5-1 1.732z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required.svg
new file mode 100644 (file)
index 0000000..969fa2d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="required">
+        <path d="M5 1h2v10h-2zM9.83 2.634l1 1.732-8.66 5-1-1.732zM1.17 4.366l1-1.732 8.66 5-1 1.732z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/textures/pending.gif b/resources/lib/oojs-ui/themes/mediawiki/images/textures/pending.gif
new file mode 100644 (file)
index 0000000..1194eed
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/textures/pending.gif differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/textures/transparency.svg b/resources/lib/oojs-ui/themes/mediawiki/images/textures/transparency.svg
new file mode 100644 (file)
index 0000000..63a0b57
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="16" height="16" viewBox="0, 0, 16, 16">
+       <g id="transparency">
+               <path d="M0,0 L8,0 L8,8 L0,8 z" fill="#CCCCCC"/>
+               <path d="M8,8 L16,8 L16,16 L8,16 z" fill="#CCCCCC"/>
+               <path d="M8,0 L16,0 L16,8 L8,8 z" fill="#FFFFFF"/>
+               <path d="M0,8 L8,8 L8,16 L0,16 z" fill="#FFFFFF"/>
+       </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/minerva/images/icons/check-invert.svg b/resources/lib/oojs-ui/themes/minerva/images/icons/check-invert.svg
new file mode 100644 (file)
index 0000000..12d7f0d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0, 0, 44, 44"><style>* { fill: #FFFFFF }</style>
+    <g id="check">
+        <path id="mark" d="M41.634,12.619 L15.347,37.121 L15.163,36.923 L9.999,31.386 L2.364,23.201 L8.019,17.924 L15.655,26.119 L36.281,6.879 z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/minerva/images/icons/check.svg b/resources/lib/oojs-ui/themes/minerva/images/icons/check.svg
new file mode 100644 (file)
index 0000000..248c636
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0, 0, 44, 44">
+    <g id="check">
+        <path id="mark" d="M41.634,12.619 L15.347,37.121 L15.163,36.923 L9.999,31.386 L2.364,23.201 L8.019,17.924 L15.655,26.119 L36.281,6.879 z"/>
+    </g>
+</svg>
index 8be7665..c62df22 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.0.11
+ * OOjs v1.1.1 optimised for jQuery
  * https://www.mediawiki.org/wiki/OOjs
  *
  * Copyright 2011-2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-07-23T20:15:47Z
+ * Date: 2014-09-11T00:40:09Z
  */
 ( function ( global ) {
 
@@ -37,16 +37,16 @@ oo.initClass = function ( fn ) {
 };
 
 /**
- * Utility for common usage of Object#create for inheriting from one
- * prototype to another.
+ * Inherit from prototype to another using Object#create.
  *
  * Beware: This redefines the prototype, call before setting your prototypes.
+ *
  * Beware: This redefines the prototype, can only be called once on a function.
- *  If called multiple times on the same function, the previous prototype is lost.
- *  This is how prototypal inheritance works, it can only be one straight chain
- *  (just like classical inheritance in PHP for example). If you need to work with
- *  multiple constructors consider storing an instance of the other constructor in a
- *  property instead, or perhaps use a mixin (see OO.mixinClass).
+ * If called multiple times on the same function, the previous prototype is lost.
+ * This is how prototypal inheritance works, it can only be one straight chain
+ * (just like classical inheritance in PHP for example). If you need to work with
+ * multiple constructors consider storing an instance of the other constructor in a
+ * property instead, or perhaps use a mixin (see OO.mixinClass).
  *
  *     function Thing() {}
  *     Thing.prototype.exists = function () {};
@@ -103,13 +103,15 @@ oo.inheritClass = function ( targetFn, originFn ) {
 };
 
 /**
- * Utility to copy over *own* prototype properties of a mixin.
+ * Copy over *own* prototype properties of a mixin.
+ *
  * The 'constructor' (whether implicit or explicit) is not copied over.
  *
  * This does not create inheritance to the origin. If inheritance is needed
  * use oo.inheritClass instead.
  *
  * Beware: This can redefine a prototype property, call before setting your prototypes.
+ *
  * Beware: Don't call before oo.inheritClass.
  *
  *     function Foo() {}
@@ -216,14 +218,16 @@ oo.getObjectValues = function ( obj ) {
 };
 
 /**
- * Recursively compares properties between two objects.
+ * Recursively compare properties between two objects.
  *
  * A false result may be caused by property inequality or by properties in one object missing from
  * the other. An asymmetrical test may also be performed, which checks only that properties in the
  * first object are present in the second object, but not the inverse.
  *
- * @param {Object} a First object to compare
- * @param {Object} b Second object to compare
+ * If either a or b is null or undefined it will be treated as an empty object.
+ *
+ * @param {Object|undefined|null} a First object to compare
+ * @param {Object|undefined|null} b Second object to compare
  * @param {boolean} [asymmetrical] Whether to check only that b contains values from a
  * @return {boolean} If the objects contain the same values as each other
  */
@@ -234,6 +238,9 @@ oo.compare = function ( a, b, asymmetrical ) {
                return true;
        }
 
+       a = a || {};
+       b = b || {};
+
        for ( k in a ) {
                if ( !hasOwn.call( a, k ) ) {
                        // Support es3-shim: Without this filter, comparing [] to {} will be false in ES3
@@ -246,7 +253,10 @@ oo.compare = function ( a, b, asymmetrical ) {
                aType = typeof aValue;
                bType = typeof bValue;
                if ( aType !== bType ||
-                       ( ( aType === 'string' || aType === 'number' ) && aValue !== bValue ) ||
+                       (
+                               ( aType === 'string' || aType === 'number' || aType === 'boolean' ) &&
+                               aValue !== bValue
+                       ) ||
                        ( aValue === Object( aValue ) && !oo.compare( aValue, bValue, asymmetrical ) ) ) {
                        return false;
                }
@@ -261,41 +271,46 @@ oo.compare = function ( a, b, asymmetrical ) {
  * Copies are deep, and will either be an object or an array depending on `source`.
  *
  * @param {Object} source Object to copy
- * @param {Function} [callback] Applied to leaf values before they added to the clone
+ * @param {Function} [leafCallback] Applied to leaf values after they are cloned but before they are added to the clone
+ * @param {Function} [nodeCallback] Applied to all values before they are cloned.  If the nodeCallback returns a value other than undefined, the returned value is used instead of attempting to clone.
  * @return {Object} Copy of source object
  */
-oo.copy = function ( source, callback ) {
-       var key, sourceValue, sourceType, destination;
-
-       if ( typeof source.clone === 'function' ) {
-               return source.clone();
+oo.copy = function ( source, leafCallback, nodeCallback ) {
+       var key, destination;
+
+       if ( nodeCallback ) {
+               // Extensibility: check before attempting to clone source.
+               destination = nodeCallback( source );
+               if ( destination !== undefined ) {
+                       return destination;
+               }
        }
 
-       destination = Array.isArray( source ) ? new Array( source.length ) : {};
+       if ( Array.isArray( source ) ) {
+               // Array (fall through)
+               destination = new Array( source.length );
+       } else if ( source && typeof source.clone === 'function' ) {
+               // Duck type object with custom clone method
+               return leafCallback ? leafCallback( source.clone() ) : source.clone();
+       } else if ( source && typeof source.cloneNode === 'function' ) {
+               // DOM Node
+               return leafCallback ?
+                       leafCallback( source.cloneNode( true ) ) :
+                       source.cloneNode( true );
+       } else if ( oo.isPlainObject( source ) ) {
+               // Plain objects (fall through)
+               destination = {};
+       } else {
+               // Non-plain objects (incl. functions) and primitive values
+               return leafCallback ? leafCallback( source ) : source;
+       }
 
+       // source is an array or a plain object
        for ( key in source ) {
-               sourceValue = source[key];
-               sourceType = typeof sourceValue;
-               if ( Array.isArray( sourceValue ) ) {
-                       // Array
-                       destination[key] = oo.copy( sourceValue, callback );
-               } else if ( sourceValue && typeof sourceValue.clone === 'function' ) {
-                       // Duck type object with custom clone method
-                       destination[key] = callback ?
-                               callback( sourceValue.clone() ) : sourceValue.clone();
-               } else if ( sourceValue && typeof sourceValue.cloneNode === 'function' ) {
-                       // DOM Node
-                       destination[key] = callback ?
-                               callback( sourceValue.cloneNode( true ) ) : sourceValue.cloneNode( true );
-               } else if ( oo.isPlainObject( sourceValue ) ) {
-                       // Plain objects
-                       destination[key] = oo.copy( sourceValue, callback );
-               } else {
-                       // Non-plain objects (incl. functions) and primitive values
-                       destination[key] = callback ? callback( sourceValue ) : sourceValue;
-               }
+               destination[key] = oo.copy( source[key], leafCallback, nodeCallback );
        }
 
+       // This is an internal node, so we don't apply the leafCallback.
        return destination;
 };
 
@@ -320,7 +335,7 @@ oo.getHash = function ( val ) {
 };
 
 /**
- * Helper function for OO.getHash which sorts objects by key.
+ * Sort objects by key (helper function for OO.getHash).
  *
  * This is a callback passed into JSON.stringify.
  *
@@ -450,231 +465,261 @@ oo.isPlainObject = $.isPlainObject;
 
 /*global hasOwn */
 
-/**
- * @class OO.EventEmitter
- *
- * @constructor
- */
-oo.EventEmitter = function OoEventEmitter() {
-       // Properties
+( function () {
 
        /**
-        * Storage of bound event handlers by event name.
+        * @class OO.EventEmitter
         *
-        * @property
+        * @constructor
         */
-       this.bindings = {};
-};
+       oo.EventEmitter = function OoEventEmitter() {
+               // Properties
 
-/* Methods */
+               /**
+                * Storage of bound event handlers by event name.
+                *
+                * @property
+                */
+               this.bindings = {};
+       };
 
-/**
- * Add a listener to events of a specific event.
- *
- * @param {string} event Type of event to listen to
- * @param {Function} callback Function to call when event occurs
- * @param {Array} [args] Arguments to pass to listener, will be prepended to emitted arguments
- * @param {Object} [context=null] Object to use as context for callback function or call method on
- * @throws {Error} Listener argument is not a function or method name
- * @chainable
- */
-oo.EventEmitter.prototype.on = function ( event, callback, args, context ) {
-       var bindings;
+       oo.initClass( oo.EventEmitter );
 
-       // Validate callback
-       if ( typeof callback !== 'function' ) {
-               throw new Error( 'Invalid callback. Function or method name expected.' );
-       }
-       // Fallback to null context
-       if ( arguments.length < 4 ) {
-               context = null;
-       }
-       if ( hasOwn.call( this.bindings, event ) ) {
-               bindings = this.bindings[event];
-       } else {
-               // Auto-initialize bindings list
-               bindings = this.bindings[event] = [];
+       /* Private helper functions */
+
+       /**
+        * Validate a function or method call in a context
+        *
+        * For a method name, check that it names a function in the context object
+        *
+        * @private
+        * @param {Function|string} method Function or method name
+        * @param {Mixed} context The context of the call
+        * @throws {Error} A method name is given but there is no context
+        * @throws {Error} In the context object, no property exists with the given name
+        * @throws {Error} In the context object, the named property is not a function
+        */
+       function validateMethod( method, context ) {
+               // Validate method and context
+               if ( typeof method === 'string' ) {
+                       // Validate method
+                       if ( context === undefined || context === null ) {
+                               throw new Error( 'Method name "' + method + '" has no context.' );
+                       }
+                       if ( !( method in context ) ) {
+                               // Technically the method does not need to exist yet: it could be
+                               // added before call time. But this probably signals a typo.
+                               throw new Error( 'Method not found: "' + method + '"' );
+                       }
+                       if ( typeof context[method] !== 'function' ) {
+                               // Technically the property could be replaced by a function before
+                               // call time. But this probably signals a typo.
+                               throw new Error( 'Property "' + method + '" is not a function' );
+                       }
+               } else if ( typeof method !== 'function' ) {
+                       throw new Error( 'Invalid callback. Function or method name expected.' );
+               }
        }
-       // Add binding
-       bindings.push( {
-               callback: callback,
-               args: args,
-               context: context
-       } );
-       return this;
-};
 
-/**
- * Adds a one-time listener to a specific event.
- *
- * @param {string} event Type of event to listen to
- * @param {Function} listener Listener to call when event occurs
- * @chainable
- */
-oo.EventEmitter.prototype.once = function ( event, listener ) {
-       var eventEmitter = this,
-               listenerWrapper = function () {
-                       eventEmitter.off( event, listenerWrapper );
-                       listener.apply( eventEmitter, Array.prototype.slice.call( arguments, 0 ) );
-               };
-       return this.on( event, listenerWrapper );
-};
+       /* Methods */
 
-/**
- * Remove a specific listener from a specific event.
- *
- * @param {string} event Type of event to remove listener from
- * @param {Function} [callback] Listener to remove, omit to remove all
- * @param {Object} [context=null] Object used context for callback function or method
- * @chainable
- * @throws {Error} Listener argument is not a function
- */
-oo.EventEmitter.prototype.off = function ( event, callback, context ) {
-       var i, bindings;
+       /**
+        * Add a listener to events of a specific event.
+        *
+        * The listener can be a function or the string name of a method; if the latter, then the
+        * name lookup happens at the time the listener is called.
+        *
+        * @param {string} event Type of event to listen to
+        * @param {Function|string} method Function or method name to call when event occurs
+        * @param {Array} [args] Arguments to pass to listener, will be prepended to emitted arguments
+        * @param {Object} [context=null] Context object for function or method call
+        * @throws {Error} Listener argument is not a function or a valid method name
+        * @chainable
+        */
+       oo.EventEmitter.prototype.on = function ( event, method, args, context ) {
+               var bindings;
 
-       if ( arguments.length === 1 ) {
-               // Remove all bindings for event
-               delete this.bindings[event];
-       } else {
-               if ( typeof callback !== 'function' ) {
-                       throw new Error( 'Invalid callback. Function expected.' );
+               validateMethod( method, context );
+
+               if ( hasOwn.call( this.bindings, event ) ) {
+                       bindings = this.bindings[event];
+               } else {
+                       // Auto-initialize bindings list
+                       bindings = this.bindings[event] = [];
+               }
+               // Add binding
+               bindings.push( {
+                       method: method,
+                       args: args,
+                       context: ( arguments.length < 4 ) ? null : context
+               } );
+               return this;
+       };
+
+       /**
+        * Add a one-time listener to a specific event.
+        *
+        * @param {string} event Type of event to listen to
+        * @param {Function} listener Listener to call when event occurs
+        * @chainable
+        */
+       oo.EventEmitter.prototype.once = function ( event, listener ) {
+               var eventEmitter = this,
+                       listenerWrapper = function () {
+                               eventEmitter.off( event, listenerWrapper );
+                               listener.apply( eventEmitter, Array.prototype.slice.call( arguments, 0 ) );
+                       };
+               return this.on( event, listenerWrapper );
+       };
+
+       /**
+        * Remove a specific listener from a specific event.
+        *
+        * @param {string} event Type of event to remove listener from
+        * @param {Function|string} [method] Listener to remove. Must be in the same form as was passed
+        * to "on". Omit to remove all listeners.
+        * @param {Object} [context=null] Context object function or method call
+        * @chainable
+        * @throws {Error} Listener argument is not a function or a valid method name
+        */
+       oo.EventEmitter.prototype.off = function ( event, method, context ) {
+               var i, bindings;
+
+               if ( arguments.length === 1 ) {
+                       // Remove all bindings for event
+                       delete this.bindings[event];
+                       return this;
                }
+
+               validateMethod( method, context );
+
                if ( !( event in this.bindings ) || !this.bindings[event].length ) {
                        // No matching bindings
                        return this;
                }
-               // Fallback to null context
+
+               // Default to null context
                if ( arguments.length < 3 ) {
                        context = null;
                }
+
                // Remove matching handlers
                bindings = this.bindings[event];
                i = bindings.length;
                while ( i-- ) {
-                       if ( bindings[i].callback === callback && bindings[i].context === context ) {
+                       if ( bindings[i].method === method && bindings[i].context === context ) {
                                bindings.splice( i, 1 );
                        }
                }
+
                // Cleanup if now empty
                if ( bindings.length === 0 ) {
                        delete this.bindings[event];
                }
-       }
-       return this;
-};
-
-/**
- * Emit an event.
- *
- * TODO: Should this be chainable? What is the usefulness of the boolean
- * return value here?
- *
- * @param {string} event Type of event
- * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
- * @return {boolean} If event was handled by at least one listener
- */
-oo.EventEmitter.prototype.emit = function ( event ) {
-       var i, len, binding, bindings, args;
-
-       if ( event in this.bindings ) {
-               // Slicing ensures that we don't get tripped up by event handlers that add/remove bindings
-               bindings = this.bindings[event].slice();
-               args = Array.prototype.slice.call( arguments, 1 );
-               for ( i = 0, len = bindings.length; i < len; i++ ) {
-                       binding = bindings[i];
-                       binding.callback.apply(
-                               binding.context,
-                               binding.args ? binding.args.concat( args ) : args
-                       );
-               }
-               return true;
-       }
-       return false;
-};
+               return this;
+       };
 
-/**
- * Connect event handlers to an object.
- *
- * @param {Object} context Object to call methods on when events occur
- * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} methods List of
- *  event bindings keyed by event name containing either method names, functions or arrays containing
- *  method name or function followed by a list of arguments to be passed to callback before emitted
- *  arguments
- * @chainable
- */
-oo.EventEmitter.prototype.connect = function ( context, methods ) {
-       var method, callback, args, event;
-
-       for ( event in methods ) {
-               method = methods[event];
-               // Allow providing additional args
-               if ( Array.isArray( method ) ) {
-                       args = method.slice( 1 );
-                       method = method[0];
-               } else {
-                       args = [];
-               }
-               // Allow callback to be a method name
-               if ( typeof method === 'string' ) {
-                       // Validate method
-                       if ( !context[method] || typeof context[method] !== 'function' ) {
-                               throw new Error( 'Method not found: ' + method );
+       /**
+        * Emit an event.
+        *
+        * TODO: Should this be chainable? What is the usefulness of the boolean
+        * return value here?
+        *
+        * @param {string} event Type of event
+        * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
+        * @return {boolean} If event was handled by at least one listener
+        */
+       oo.EventEmitter.prototype.emit = function ( event ) {
+               var i, len, binding, bindings, args, method;
+
+               if ( event in this.bindings ) {
+                       // Slicing ensures that we don't get tripped up by event handlers that add/remove bindings
+                       bindings = this.bindings[event].slice();
+                       args = Array.prototype.slice.call( arguments, 1 );
+                       for ( i = 0, len = bindings.length; i < len; i++ ) {
+                               binding = bindings[i];
+                               if ( typeof binding.method === 'string' ) {
+                                       // Lookup method by name (late binding)
+                                       method = binding.context[ binding.method ];
+                               } else {
+                                       method = binding.method;
+                               }
+                               method.apply(
+                                       binding.context,
+                                       binding.args ? binding.args.concat( args ) : args
+                               );
                        }
-                       // Resolve to function
-                       callback = context[method];
-               } else {
-                       callback = method;
+                       return true;
                }
-               // Add binding
-               this.on.apply( this, [ event, callback, args, context ] );
-       }
-       return this;
-};
+               return false;
+       };
 
-/**
- * Disconnect event handlers from an object.
- *
- * @param {Object} context Object to disconnect methods from
- * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} [methods] List of
- * event bindings keyed by event name containing either method names or functions
- * @chainable
- */
-oo.EventEmitter.prototype.disconnect = function ( context, methods ) {
-       var i, method, callback, event, bindings;
+       /**
+        * Connect event handlers to an object.
+        *
+        * @param {Object} context Object to call methods on when events occur
+        * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} methods List of
+        *  event bindings keyed by event name containing either method names, functions or arrays containing
+        *  method name or function followed by a list of arguments to be passed to callback before emitted
+        *  arguments
+        * @chainable
+        */
+       oo.EventEmitter.prototype.connect = function ( context, methods ) {
+               var method, args, event;
 
-       if ( methods ) {
-               // Remove specific connections to the context
                for ( event in methods ) {
                        method = methods[event];
-                       if ( typeof method === 'string' ) {
-                               // Validate method
-                               if ( !context[method] || typeof context[method] !== 'function' ) {
-                                       throw new Error( 'Method not found: ' + method );
-                               }
-                               // Resolve to function
-                               callback = context[method];
+                       // Allow providing additional args
+                       if ( Array.isArray( method ) ) {
+                               args = method.slice( 1 );
+                               method = method[0];
                        } else {
-                               callback = method;
+                               args = [];
                        }
-                       this.off( event, callback, context );
+                       // Add binding
+                       this.on( event, method, args, context );
                }
-       } else {
-               // Remove all connections to the context
-               for ( event in this.bindings ) {
-                       bindings = this.bindings[event];
-                       i = bindings.length;
-                       while ( i-- ) {
-                               // bindings[i] may have been removed by the previous step's
-                               // this.off so check it still exists
-                               if ( bindings[i] && bindings[i].context === context ) {
-                                       this.off( event, bindings[i].callback, context );
+               return this;
+       };
+
+       /**
+        * Disconnect event handlers from an object.
+        *
+        * @param {Object} context Object to disconnect methods from
+        * @param {Object.<string,string>|Object.<string,Function>|Object.<string,Array>} [methods] List of
+        * event bindings keyed by event name. Values can be either method names or functions, but must be
+        * consistent with those used in the corresponding call to "connect".
+        * @chainable
+        */
+       oo.EventEmitter.prototype.disconnect = function ( context, methods ) {
+               var i, event, bindings;
+
+               if ( methods ) {
+                       // Remove specific connections to the context
+                       for ( event in methods ) {
+                               this.off( event, methods[event], context );
+                       }
+               } else {
+                       // Remove all connections to the context
+                       for ( event in this.bindings ) {
+                               bindings = this.bindings[event];
+                               i = bindings.length;
+                               while ( i-- ) {
+                                       // bindings[i] may have been removed by the previous step's
+                                       // this.off so check it still exists
+                                       if ( bindings[i] && bindings[i].context === context ) {
+                                               this.off( event, bindings[i].method, context );
+                                       }
                                }
                        }
                }
-       }
 
-       return this;
-};
+               return this;
+       };
+
+}() );
+
+/*global hasOwn */
 
 /**
  * @class OO.Registry
@@ -737,7 +782,9 @@ oo.Registry.prototype.register = function ( name, data ) {
  * @return {Mixed|undefined} Data associated with symbolic name
  */
 oo.Registry.prototype.lookup = function ( name ) {
-       return this.registry[name];
+       if ( hasOwn.call( this.registry, name ) ) {
+               return this.registry[name];
+       }
 };
 
 /**
@@ -802,12 +849,12 @@ oo.Factory.prototype.register = function ( constructor ) {
  * @throws {Error} Unknown object name
  */
 oo.Factory.prototype.create = function ( name ) {
-       var args, obj, constructor;
+       var args, obj,
+               constructor = this.lookup( name );
 
-       if ( !this.registry.hasOwnProperty( name ) ) {
+       if ( !constructor ) {
                throw new Error( 'No class registered by that name: ' + name );
        }
-       constructor = this.registry[name];
 
        // Convert arguments to array and shift the first argument (name) off
        args = Array.prototype.slice.call( arguments, 1 );
diff --git a/resources/src/jquery.json-deprecate.js b/resources/src/jquery.json-deprecate.js
deleted file mode 100644 (file)
index f38decd..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-( function ( mw, $ ) {
-       // @deprecated since 1.24.  The 'jquery.json' module will be removed in MW 1.25.  Use the 'json' module.
-
-       mw.log.deprecate( $, 'toJSON', $.toJSON, 'Use JSON.stringify instead (module "json" for polyfill).' );
-       mw.log.deprecate( $, 'evalJSON', $.evalJSON, 'Use JSON.parse instead (module "json" for polyfill).' );
-       mw.log.deprecate( $, 'secureEvalJSON', $.secureEvalJSON, 'Use JSON.parse instead (module "json" for polyfill).' );
-       mw.log.deprecate( $, 'quoteString', $.quoteString, 'Use JSON.stringify instead (module "json" for polyfill).' );
-}( mediaWiki, jQuery ) );
index 061f5d6..9a196b5 100644 (file)
@@ -108,7 +108,7 @@ $.fn.autoEllipsis = function ( options ) {
                                        r = trimmableText.length;
                                        do {
                                                m = Math.ceil( ( l + r ) / 2 );
-                                               $trimmableText.text( trimmableText.substr( 0, m ) + '...' );
+                                               $trimmableText.text( trimmableText.slice( 0, m ) + '...' );
                                                if ( $trimmableText.width() + pw > w ) {
                                                        // Text is too long
                                                        r = m - 1;
@@ -116,7 +116,7 @@ $.fn.autoEllipsis = function ( options ) {
                                                        l = m;
                                                }
                                        } while ( l < r );
-                                       $trimmableText.text( trimmableText.substr( 0, l ) + '...' );
+                                       $trimmableText.text( trimmableText.slice( 0, l ) + '...' );
                                        break;
                                case 'center':
                                        // TODO: Use binary search like for 'right'
@@ -124,7 +124,7 @@ $.fn.autoEllipsis = function ( options ) {
                                        // Begin with making the end shorter
                                        side = 1;
                                        while ( $trimmableText.outerWidth() + pw > w && i[0] > 0 ) {
-                                               $trimmableText.text( trimmableText.substr( 0, i[0] ) + '...' + trimmableText.substr( i[1] ) );
+                                               $trimmableText.text( trimmableText.slice( 0, i[0] ) + '...' + trimmableText.slice( i[1] ) );
                                                // Alternate between trimming the end and begining
                                                if ( side === 0 ) {
                                                        // Make the begining shorter
@@ -141,7 +141,7 @@ $.fn.autoEllipsis = function ( options ) {
                                        // TODO: Use binary search like for 'right'
                                        r = 0;
                                        while ( $trimmableText.outerWidth() + pw > w && r < trimmableText.length ) {
-                                               $trimmableText.text( '...' + trimmableText.substr( r ) );
+                                               $trimmableText.text( '...' + trimmableText.slice( r ) );
                                                r++;
                                        }
                                        break;
index de05fdf..5551232 100644 (file)
 
                inpParts = [
                        // Same start
-                       newVal.substring( 0, startMatches ),
+                       newVal.slice( 0, startMatches ),
                        // Inserted content
-                       newVal.substring( startMatches, newVal.length - endMatches ),
+                       newVal.slice( startMatches, newVal.length - endMatches ),
                        // Same end
-                       newVal.substring( newVal.length - endMatches )
+                       newVal.slice( newVal.length - endMatches )
                ];
 
                // Chop off characters from the end of the "inserted content" string
index 4b80d95..339e65a 100644 (file)
@@ -36,6 +36,7 @@
         * @param {Function} [options.handler] Callback to fire when the action is confirmed (user clicks
         *     the 'Yes' button).
         * @param {string} [options.i18n] Text to use for interface elements.
+        * @param {string} [options.i18n.space] Word separator to place between the three text messages.
         * @param {string} [options.i18n.confirm] Text to use for the confirmation question.
         * @param {string} [options.i18n.yes] Text to use for the 'Yes' button.
         * @param {string} [options.i18n.no] Text to use for the 'No' button.
 
                                $interface = $( '<span>' )
                                        .addClass( 'jquery-confirmable-interface' )
-                                       .append( $text, $buttonYes, $buttonNo );
+                                       .append( $text, options.i18n.space, $buttonYes, options.i18n.space, $buttonNo );
                                $interface = options.wrapperCallback( $interface );
 
                                // Render offscreen to measure real width
                buttonCallback: identity,
                handler: null,
                i18n: {
+                       space: ' ',
                        confirm: 'Are you sure?',
                        yes: 'Yes',
                        no: 'No'
index 7ac04f4..d4a106e 100644 (file)
@@ -6,6 +6,7 @@
 
 ( function ( mw, $ ) {
        $.fn.confirmable.defaultOptions.i18n = {
+               space: mw.message( 'word-separator' ).text(),
                confirm: mw.message( 'confirmable-confirm', mw.user ).text(),
                yes: mw.message( 'confirmable-yes' ).text(),
                no: mw.message( 'confirmable-no' ).text()
index 1881085..d7024cc 100644 (file)
@@ -51,7 +51,7 @@ jQuery._farbtastic = function (container, callback) {
                $('*', e).each(function () {
                        if (this.currentStyle.backgroundImage != 'none') {
                                var image = this.currentStyle.backgroundImage;
-                               image = this.currentStyle.backgroundImage.substring(5, image.length - 2);
+                               image = this.currentStyle.backgroundImage.slice(5, image.length - 2);
                                $(this).css({
                                        'backgroundImage': 'none',
                                        'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
index 71b083b..4ecfeb8 100644 (file)
@@ -110,7 +110,7 @@ $.matchSrcSet = function ( devicePixelRatio, srcset ) {
                bits = candidate.split( / +/ );
                src = bits[0];
                if ( bits.length > 1 && bits[1].charAt( bits[1].length - 1 ) === 'x' ) {
-                       ratioStr = bits[1].substr( 0, bits[1].length - 1 );
+                       ratioStr = bits[1].slice( 0, -1 );
                        ratio = parseFloat( ratioStr );
                        if ( ratio <= devicePixelRatio && ratio > selectedRatio ) {
                                selectedRatio = ratio;
index cdcb8fb..dc7aaa4 100644 (file)
@@ -12,7 +12,7 @@
                                        '' : str.toString().replace( /\s+$/, '' );
                },
                ucFirst: function ( str ) {
-                       return str.charAt( 0 ).toUpperCase() + str.substr( 1 );
+                       return str.charAt( 0 ).toUpperCase() + str.slice( 1 );
                },
                escapeRE: function ( str ) {
                        return str.replace ( /([\\{}()|.?*+\-\^$\[\]])/g, '\\$1' );
index 289cd22..8d440fd 100644 (file)
                                                } else {
                                                        while ( selText.charAt( selText.length - 1 ) === ' ' ) {
                                                                // Exclude ending space char
-                                                               selText = selText.substring( 0, selText.length - 1 );
+                                                               selText = selText.slice( 0, -1 );
                                                                post += ' ';
                                                        }
                                                        while ( selText.charAt( 0 ) === ' ' ) {
                                                                // Exclude prepending space char
-                                                               selText = selText.substring( 1, selText.length );
+                                                               selText = selText.slice( 1 );
                                                                pre = ' ' + pre;
                                                        }
                                                }
                                                                        post += '\n';
                                                                }
                                                        }
-                                                       this.value = this.value.substring( 0, startPos ) + insertText +
-                                                               this.value.substring( endPos, this.value.length );
+                                                       this.value = this.value.slice( 0, startPos ) + insertText +
+                                                               this.value.slice( endPos );
                                                        // Setting this.value scrolls the textarea to the top, restore the scroll position
                                                        this.scrollTop = scrollTop;
                                                        if ( window.opera ) {
diff --git a/resources/src/mediawiki.action/images/nextredirect-ltr.png b/resources/src/mediawiki.action/images/nextredirect-ltr.png
new file mode 100644 (file)
index 0000000..cd657c3
Binary files /dev/null and b/resources/src/mediawiki.action/images/nextredirect-ltr.png differ
diff --git a/resources/src/mediawiki.action/images/nextredirect-rtl.png b/resources/src/mediawiki.action/images/nextredirect-rtl.png
new file mode 100644 (file)
index 0000000..b788f33
Binary files /dev/null and b/resources/src/mediawiki.action/images/nextredirect-rtl.png differ
diff --git a/resources/src/mediawiki.action/images/redirect-ltr.png b/resources/src/mediawiki.action/images/redirect-ltr.png
new file mode 100644 (file)
index 0000000..695f2a1
Binary files /dev/null and b/resources/src/mediawiki.action/images/redirect-ltr.png differ
diff --git a/resources/src/mediawiki.action/images/redirect-rtl.png b/resources/src/mediawiki.action/images/redirect-rtl.png
new file mode 100644 (file)
index 0000000..c954a2a
Binary files /dev/null and b/resources/src/mediawiki.action/images/redirect-rtl.png differ
diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.css b/resources/src/mediawiki.action/mediawiki.action.edit.css
new file mode 100644 (file)
index 0000000..45ba543
--- /dev/null
@@ -0,0 +1,18 @@
+/*!
+ * Styles for elements of the editing form, loaded only when JavaScript is enabled.
+ */
+
+.mw-toolbar-editbutton {
+       width: 23px;
+       height: 22px;
+       cursor: pointer;
+       vertical-align: middle;
+       /* Cross-browser inline-block */
+       /* Firefox 2 */
+       display: -moz-inline-block;
+       /* Modern browsers */
+       display: inline-block;
+       /* IE7 */
+       zoom: 1;
+       *display: inline;
+}
index b565440..6b33012 100644 (file)
@@ -5,54 +5,37 @@
        'use strict';
 
        $( function () {
-               var savedWindowOnBeforeUnload,
-                       $wpTextbox1 = $( '#wpTextbox1' ),
-                       $wpSummary = $( '#wpSummary' );
+               var allowCloseWindow,
+                       $textBox = $( '#wpTextbox1' ),
+                       $summary = $( '#wpSummary' ),
+                       $both = $textBox.add( $summary );
+
                // Check if EditWarning is enabled and if we need it
-               if ( $wpTextbox1.length === 0 ) {
+               if ( !mw.user.options.get( 'useeditwarning' ) ) {
                        return true;
                }
-               // Get the original values of some form elements
-               $wpTextbox1.add( $wpSummary ).each( function () {
-                       $( this ).data( 'origtext', $( this ).val() );
+
+               // Save the original value of the text fields
+               $both.each( function ( index, element ) {
+                       var $element = $( element );
+                       $element.data( 'origtext', $element.textSelection( 'getContents' ) );
                } );
-               $( window )
-                       .on( 'beforeunload.editwarning', function () {
-                               var retval;
 
-                               // Check if the current values of some form elements are the same as
-                               // the original values
-                               if (
-                                       mw.config.get( 'wgAction' ) === 'submit' ||
-                                               $wpTextbox1.data( 'origtext' ) !== $wpTextbox1.textSelection( 'getContents' ) ||
-                                               $wpSummary.data( 'origtext' ) !== $wpSummary.textSelection( 'getContents' )
-                               ) {
-                                       // Return our message
-                                       retval = mw.msg( 'editwarning-warning' );
-                               }
+               allowCloseWindow = mw.confirmCloseWindow( {
+                       test: function () {
+                               // We use .textSelection, because editors might not have updated the form yet.
+                               return mw.config.get( 'wgAction' ) === 'submit' ||
+                                       $textBox.data( 'origtext' ) !== $textBox.textSelection( 'getContents' ) ||
+                                       $summary.data( 'origtext' ) !== $summary.textSelection( 'getContents' );
+                       },
 
-                               // Unset the onbeforeunload handler so we don't break page caching in Firefox
-                               savedWindowOnBeforeUnload = window.onbeforeunload;
-                               window.onbeforeunload = null;
-                               if ( retval !== undefined ) {
-                                       // ...but if the user chooses not to leave the page, we need to rebind it
-                                       setTimeout( function () {
-                                               window.onbeforeunload = savedWindowOnBeforeUnload;
-                                       }, 1 );
-                                       return retval;
-                               }
-                       } )
-                       .on( 'pageshow.editwarning', function () {
-                               // Re-add onbeforeunload handler
-                               if ( !window.onbeforeunload ) {
-                                       window.onbeforeunload = savedWindowOnBeforeUnload;
-                               }
-                       } );
+                       message: mw.msg( 'editwarning-warning' ),
+                       namespace: 'editwarning'
+               } );
 
                // Add form submission handler
                $( '#editform' ).submit( function () {
-                       // Unbind our handlers
-                       $( window ).off( '.editwarning' );
+                       allowCloseWindow();
                } );
        } );
 
index 0481b6a..f88b836 100644 (file)
-/**
- * Interface for the classic edit toolbar.
- *
- * @class mw.toolbar
- * @singleton
+/*!
+ * Scripts for action=edit
  */
 ( function ( mw, $ ) {
-       var toolbar, isReady, $toolbar, queue, slice, $currentFocused;
-
-       /**
-        * Internal helper that does the actual insertion of the button into the toolbar.
-        *
-        * See #addButton for parameter documentation.
-        *
-        * @private
-        */
-       function insertButton( b, speedTip, tagOpen, tagClose, sampleText, imageId ) {
-               // Backwards compatibility
-               if ( typeof b !== 'object' ) {
-                       b = {
-                               imageFile: b,
-                               speedTip: speedTip,
-                               tagOpen: tagOpen,
-                               tagClose: tagClose,
-                               sampleText: sampleText,
-                               imageId: imageId
-                       };
-               }
-               var $image = $( '<img>' ).attr( {
-                       width: 23,
-                       height: 22,
-                       src: b.imageFile,
-                       alt: b.speedTip,
-                       title: b.speedTip,
-                       id: b.imageId || undefined,
-                       'class': 'mw-toolbar-editbutton'
-               } ).click( function () {
-                       toolbar.insertTags( b.tagOpen, b.tagClose, b.sampleText );
-                       return false;
-               } );
-
-               $toolbar.append( $image );
-       }
-
-       isReady = false;
-       $toolbar = false;
-       /**
-        * @private
-        * @property {Array}
-        * Contains button objects (and for backwards compatibilty, it can
-        * also contains an arguments array for insertButton).
-        */
-       queue = [];
-       slice = queue.slice;
-
-       toolbar = {
-
-               /**
-                * Add buttons to the toolbar.
-                *
-                * Takes care of race conditions and time-based dependencies
-                * by placing buttons in a queue if this method is called before
-                * the toolbar is created.
-                *
-                * For compatiblity, passing the properties listed below as separate arguments
-                * (in the listed order) is also supported.
-                *
-                * @param {Object} button Object with the following properties:
-                * @param {string} button.imageFile
-                * @param {string} button.speedTip
-                * @param {string} button.tagOpen
-                * @param {string} button.tagClose
-                * @param {string} button.sampleText
-                * @param {string} [button.imageId]
-                */
-               addButton: function () {
-                       if ( isReady ) {
-                               insertButton.apply( toolbar, arguments );
-                       } else {
-                               // Convert arguments list to array
-                               queue.push( slice.call( arguments ) );
-                       }
-               },
-               /**
-                * Example usage:
-                *     addButtons( [ { .. }, { .. }, { .. } ] );
-                *     addButtons( { .. }, { .. } );
-                *
-                * @param {Object|Array...} [buttons] An array of button objects or the first
-                *  button object in a list of variadic arguments.
-                */
-               addButtons: function ( buttons ) {
-                       if ( !$.isArray( buttons ) ) {
-                               buttons = slice.call( arguments );
-                       }
-                       if ( isReady ) {
-                               $.each( buttons, function () {
-                                       insertButton( this );
-                               } );
-                       } else {
-                               // Push each button into the queue
-                               queue.push.apply( queue, buttons );
-                       }
-               },
-
-               /**
-                * Apply tagOpen/tagClose to selection in currently focused textarea.
-                *
-                * Uses `sampleText` if selection is empty.
-                *
-                * @param {string} tagOpen
-                * @param {string} tagClose
-                * @param {string} sampleText
-                */
-               insertTags: function ( tagOpen, tagClose, sampleText ) {
-                       if ( $currentFocused && $currentFocused.length ) {
-                               $currentFocused.textSelection(
-                                       'encapsulateSelection', {
-                                               pre: tagOpen,
-                                               peri: sampleText,
-                                               post: tagClose
-                                       }
-                               );
-                       }
-               },
-
-               // For backwards compatibility,
-               // Called from EditPage.php, maybe in other places as well.
-               init: function () {}
-       };
-
-       // Legacy (for compatibility with the code previously in skins/common.edit.js)
-       mw.log.deprecate( window, 'addButton', toolbar.addButton, 'Use mw.toolbar.addButton instead.' );
-       mw.log.deprecate( window, 'insertTags', toolbar.insertTags, 'Use mw.toolbar.insertTags instead.' );
-
-       // Expose API publicly
-       mw.toolbar = toolbar;
 
        $( function () {
-               var i, b, editBox, scrollTop, $editForm;
-
-               // Used to determine where to insert tags
-               $currentFocused = $( '#wpTextbox1' );
-
-               // Populate the selector cache for $toolbar
-               $toolbar = $( '#toolbar' );
-
-               for ( i = 0; i < queue.length; i++ ) {
-                       b = queue[i];
-                       if ( $.isArray( b ) ) {
-                               // Forwarded arguments array from mw.toolbar.addButton
-                               insertButton.apply( toolbar, b );
-                       } else {
-                               // Raw object from mw.toolbar.addButtons
-                               insertButton( b );
-                       }
-               }
-
-               // Clear queue
-               queue.length = 0;
-
-               // This causes further calls to addButton to go to insertion directly
-               // instead of to the queue.
-               // It is important that this is after the one and only loop through
-               // the the queue
-               isReady = true;
+               var editBox, scrollTop, $editForm;
 
                // Make sure edit summary does not exceed byte limit
                $( '#wpSummary' ).byteLimit( 255 );
                                scrollTop.value = editBox.scrollTop;
                        } );
                }
-
-               // Apply to dynamically created textboxes as well as normal ones
-               $( document ).on( 'focus', 'textarea, input:text', function () {
-                       $currentFocused = $( this );
-               } );
        } );
 
 }( mediaWiki, jQuery ) );
index 7148b96..4209aa1 100644 (file)
@@ -8,14 +8,6 @@
        display: block;
 }
 
-.editOptions {
-       background-color: #F0F0F0;
-       border: 1px solid silver;
-       border-top: none;
-       padding: 1em 1em 1.5em 1em;
-       margin-bottom: 2em;
-}
-
 /* Adjustments to edit form elements */
 .editCheckboxes {
        margin-bottom: 1em;
index afe9246..092a597 100644 (file)
@@ -2,7 +2,6 @@
 ** Diff rendering
 */
 table.diff {
-       background-color: white;
        border: none;
        border-spacing: 4px;
        margin: 0;
index 2ded40c..3c22851 100644 (file)
@@ -4,9 +4,12 @@
 ( function ( mw, $ ) {
        $( function () {
                mw.util.$content.dblclick( function ( e ) {
-                       e.preventDefault();
-                       // Trigger native HTMLElement click instead of opening URL (bug 43052)
-                       $( '#ca-edit a' ).get( 0 ).click();
+                       // Recheck preference so extensions can do a hack to disable this code.
+                       if ( parseInt( mw.user.options.get( 'editondblclick' ), 10 ) ) {
+                               e.preventDefault();
+                               // Trigger native HTMLElement click instead of opening URL (bug 43052)
+                               $( '#ca-edit a' ).get( 0 ).click();
+                       }
                } );
        } );
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.metadata.css b/resources/src/mediawiki.action/mediawiki.action.view.metadata.css
new file mode 100644 (file)
index 0000000..2c8d2e6
--- /dev/null
@@ -0,0 +1,6 @@
+/*!
+ * Hide collapsable rows in a collapsed table.
+ */
+table.collapsed tr.collapsable {
+       display: none;
+}
index 712cf29..25b5acc 100644 (file)
@@ -4,9 +4,7 @@
  * Add an expand/collapse link and collapse by default if set to
  * (with JS disabled, user will see all items)
  *
- * See also:
- * - ImagePage.php#makeMetadataTable (creates the HTML)
- * - skins/common/shared.css (hides tr.collapsable inside table.collapsed)
+ * See also ImagePage.php#makeMetadataTable (creates the HTML)
  */
 ( function ( mw, $ ) {
        $( function () {
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.redirect.js b/resources/src/mediawiki.action/mediawiki.action.view.redirect.js
new file mode 100644 (file)
index 0000000..52e0d4e
--- /dev/null
@@ -0,0 +1,65 @@
+/*!
+ * JavaScript to update page URL when a redirect is viewed, ensuring that the
+ * page is scrolled to the id when it's a redirect with fragment.
+ *
+ * This is loaded in the top queue, so avoid unnecessary dependencies
+ * like mediawiki.Title or mediawiki.Uri.
+ */
+( function ( mw, $ ) {
+       var profile = $.client.profile(),
+               canonical = mw.config.get( 'wgInternalRedirectTargetUrl' ),
+               fragment = null,
+               shouldChangeFragment, index;
+
+       // Clear internal mw.config entries, so that no one tries to depend on them
+       mw.config.set( 'wgInternalRedirectTargetUrl', null );
+
+       index = canonical.indexOf( '#' );
+       if ( index !== -1 ) {
+               fragment = canonical.slice( index );
+       }
+
+       // Never override the fragment if the user intended to look at a different section
+       shouldChangeFragment = fragment && !location.hash;
+
+       // Replace the whole URL if possible, otherwise just change the fragment
+       if ( canonical && history.replaceState ) {
+               if ( !shouldChangeFragment ) {
+                       // If the current page view has a fragment already, don't override it
+                       canonical = canonical.replace( /#.*$/, '' );
+                       canonical += location.hash;
+               }
+
+               // This will also cause the browser to scroll to given fragment
+               history.replaceState( /*data=*/ history.state, /*title=*/ document.title, /*url=*/ canonical );
+
+               // …except for IE 10 and 11. Prod it with a location.hash change.
+               if ( shouldChangeFragment && profile.name === 'msie' && profile.versionNumber >= 10 ) {
+                       location.hash = fragment;
+               }
+
+       } else if ( shouldChangeFragment ) {
+               if ( profile.layout === 'webkit' && profile.layoutVersion < 420 ) {
+                       // Released Safari w/ WebKit 418.9.1 messes up horribly
+                       // Nightlies of 420+ are ok
+                       return;
+               }
+
+               location.hash = fragment;
+       }
+
+       if ( shouldChangeFragment && profile.layout === 'gecko' ) {
+               // Mozilla needs to wait until after load, otherwise the window doesn't
+               // scroll.  See <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>.
+               // There's no obvious way to detect this programmatically, so we use
+               // version-testing.  If Firefox fixes the bug, they'll jump twice, but
+               // better twice than not at all, so make the fix hit future versions as
+               // well.
+               $( function () {
+                       if ( location.hash === fragment ) {
+                               location.hash = fragment;
+                       }
+               } );
+       }
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css b/resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css
new file mode 100644 (file)
index 0000000..fdbb655
--- /dev/null
@@ -0,0 +1,53 @@
+/*!
+ * Display neat icons on redirect pages.
+ */
+
+/* Hide, but keep accessible for screen-readers. */
+.redirectMsg p {
+       overflow: hidden;
+       height: 0;
+       zoom: 1;
+}
+
+.redirectText {
+       list-style: none none;
+       display: inline;
+       /* shared.css has some very weird directionality-specific rules for 'ul' we need to override,
+          search for "Correct directionality when page dir is different from site/user dir" */
+       margin: 0 !important;
+       padding: 0 !important;
+}
+
+/* @noflip */
+.mw-content-ltr .redirectText li {
+       display: inline;
+       margin: 0;
+       padding: 0;
+       padding-left: 42px;
+       /* @embed */
+       background: url(images/nextredirect-ltr.png) bottom left no-repeat;
+}
+
+/* @noflip */
+.mw-content-ltr .redirectText li:first-child {
+       padding-left: 47px;
+       /* @embed */
+       background: url(images/redirect-ltr.png) bottom left no-repeat;
+}
+
+/* @noflip */
+.mw-content-rtl .redirectText li {
+       display: inline;
+       margin: 0;
+       padding: 0;
+       padding-right: 42px;
+       /* @embed */
+       background: url(images/nextredirect-rtl.png) bottom right no-repeat;
+}
+
+/* @noflip */
+.mw-content-rtl .redirectText li:first-child {
+       padding-right: 47px;
+       /* @embed */
+       background: url(images/redirect-rtl.png) bottom right no-repeat;
+}
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.redirectToFragment.js b/resources/src/mediawiki.action/mediawiki.action.view.redirectToFragment.js
deleted file mode 100644 (file)
index cbfd7b5..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*!
- * JavaScript to scroll the page to an id, when a redirect with fragment is viewed.
- */
-( function ( mw, $ ) {
-       var profile = $.client.profile(),
-               fragment = mw.config.get( 'wgRedirectToFragment' );
-
-       if ( fragment === null ) {
-               // nothing to do
-               return;
-       }
-
-       if ( profile.layout === 'webkit' && profile.layoutVersion < 420 ) {
-               // Released Safari w/ WebKit 418.9.1 messes up horribly
-               // Nightlies of 420+ are ok
-               return;
-       }
-       if ( !window.location.hash ) {
-               window.location.hash = fragment;
-
-               // Mozilla needs to wait until after load, otherwise the window doesn't
-               // scroll.  See <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>.
-               // There's no obvious way to detect this programmatically, so we use
-               // version-testing.  If Firefox fixes the bug, they'll jump twice, but
-               // better twice than not at all, so make the fix hit future versions as
-               // well.
-               if ( profile.layout === 'gecko' ) {
-                       $( function () {
-                               if ( window.location.hash === fragment ) {
-                                       window.location.hash = fragment;
-                               }
-                       } );
-               }
-       }
-}( mediaWiki, jQuery ) );
index 7dd9730..14077e0 100644 (file)
@@ -3,29 +3,21 @@
  */
 ( function ( mw, $ ) {
 
-       var msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.';
        $.extend( mw.Api.prototype, {
                /**
                 * Determine if a category exists.
                 *
                 * @param {mw.Title|string} title
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
                 * @return {jQuery.Promise}
                 * @return {Function} return.done
                 * @return {boolean} return.done.isCategory Whether the category exists.
                 */
-               isCategory: function ( title, ok, err ) {
+               isCategory: function ( title ) {
                        var apiPromise = this.get( {
                                prop: 'categoryinfo',
                                titles: String( title )
                        } );
 
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-
                        return apiPromise
                                .then( function ( data ) {
                                        var exists = false;
@@ -38,8 +30,6 @@
                                        }
                                        return exists;
                                } )
-                               .done( ok )
-                               .fail( err )
                                .promise( { abort: apiPromise.abort } );
                },
 
                 * E.g. given "Foo", return "Food", "Foolish people", "Foosball tables"...
                 *
                 * @param {string} prefix Prefix to match.
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
                 * @return {jQuery.Promise}
                 * @return {Function} return.done
                 * @return {string[]} return.done.categories Matched categories
                 */
-               getCategoriesByPrefix: function ( prefix, ok, err ) {
+               getCategoriesByPrefix: function ( prefix ) {
                        // Fetch with allpages to only get categories that have a corresponding description page.
                        var apiPromise = this.get( {
                                list: 'allpages',
                                apnamespace: mw.config.get( 'wgNamespaceIds' ).category
                        } );
 
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-
                        return apiPromise
                                .then( function ( data ) {
                                        var texts = [];
@@ -78,8 +61,6 @@
                                        }
                                        return texts;
                                } )
-                               .done( ok )
-                               .fail( err )
                                .promise( { abort: apiPromise.abort } );
                },
 
                 * Get the categories that a particular page on the wiki belongs to.
                 *
                 * @param {mw.Title|string} title
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
-                * @param {boolean} [async=true] Asynchronousness (deprecated)
                 * @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, ok, err, async ) {
+               getCategories: function ( title ) {
                        var apiPromise = this.get( {
                                prop: 'categories',
                                titles: String( title )
-                       }, {
-                               async: async === undefined ? true : async
                        } );
 
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-                       if ( async !== undefined ) {
-                               mw.track( 'mw.deprecate', 'api.async' );
-                               mw.log.warn(
-                                       'Use of mediawiki.api async=false param is deprecated. ' +
-                                       'The sychronous mode will be removed in the future.'
-                               );
-                       }
-
                        return apiPromise
                                .then( function ( data ) {
                                        var titles = false;
                                        }
                                        return titles;
                                } )
-                               .done( ok )
-                               .fail( err )
                                .promise( { abort: apiPromise.abort } );
                }
        } );
index e88ae5e..dbe45bf 100644 (file)
@@ -3,7 +3,6 @@
  */
 ( function ( mw, $ ) {
 
-       var msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.';
        $.extend( mw.Api.prototype, {
 
                /**
                 * cached token and start over.
                 *
                 * @param {Object} params API parameters
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
                 * @return {jQuery.Promise} See #post
                 */
-               postWithEditToken: function ( params, ok, err ) {
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-
-                       return this.postWithToken( 'edit', params ).done( ok ).fail( err );
+               postWithEditToken: function ( params ) {
+                       return this.postWithToken( 'edit', params );
                },
 
                /**
                 * API helper to grab an edit token.
                 *
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
                 * @return {jQuery.Promise}
                 * @return {Function} return.done
                 * @return {string} return.done.token Received token.
                 */
-               getEditToken: function ( ok, err ) {
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-
-                       return this.getToken( 'edit' ).done( ok ).fail( err );
+               getEditToken: function () {
+                       return this.getToken( 'edit' );
                },
 
                /**
                 * @param {string} header
                 * @param {string} message wikitext message
                 * @param {Object} [additionalParams] Additional API parameters, e.g. `{ redirect: true }`
-                * @param {Function} [ok] Success handler (deprecated)
-                * @param {Function} [err] Error handler (deprecated)
                 * @return {jQuery.Promise}
                 */
-               newSection: function ( title, header, message, additionalParams, ok, err ) {
-                       // Until we remove 'ok' and 'err' parameters, we have to support code that passes them,
-                       // but not additionalParams...
-                       if ( $.isFunction( additionalParams ) ) {
-                               err = ok;
-                               ok = additionalParams;
-                               additionalParams = undefined;
-                       }
-
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                       }
-
+               newSection: function ( title, header, message, additionalParams ) {
                        return this.postWithEditToken( $.extend( {
                                action: 'edit',
                                section: 'new',
-                               format: 'json',
                                title: String( title ),
                                summary: header,
                                text: message
-                       }, additionalParams ) ).done( ok ).fail( err );
+                       }, additionalParams ) );
                }
        } );
 
index f8dc836..bb0642e 100644 (file)
 
        mw.Api.prototype = {
 
-               /**
-                * Normalize the ajax options for compatibility and/or convenience methods.
-                *
-                * @param {Object} [arg] An object contaning one or more of options.ajax.
-                * @return {Object} Normalized ajax options.
-                */
-               normalizeAjaxOptions: function ( arg ) {
-                       // Arg argument is usually empty
-                       // (before MW 1.20 it was used to pass ok callbacks)
-                       var opts = arg || {};
-                       // Options can also be a success callback handler
-                       if ( typeof arg === 'function' ) {
-                               opts = { ok: arg };
-                       }
-                       return opts;
-               },
-
                /**
                 * Perform API get request
                 *
                 * @param {Object} parameters
-                * @param {Object|Function} [ajaxOptions]
+                * @param {Object} [ajaxOptions]
                 * @return {jQuery.Promise}
                 */
                get: function ( parameters, ajaxOptions ) {
-                       ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
+                       ajaxOptions = ajaxOptions || {};
                        ajaxOptions.type = 'GET';
                        return this.ajax( parameters, ajaxOptions );
                },
                 * TODO: Post actions for non-local hostnames will need proxy.
                 *
                 * @param {Object} parameters
-                * @param {Object|Function} [ajaxOptions]
+                * @param {Object} [ajaxOptions]
                 * @return {jQuery.Promise}
                 */
                post: function ( parameters, ajaxOptions ) {
-                       ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
+                       ajaxOptions = ajaxOptions || {};
                        ajaxOptions.type = 'POST';
                        return this.ajax( parameters, ajaxOptions );
                },
                ajax: function ( parameters, ajaxOptions ) {
                        var token,
                                apiDeferred = $.Deferred(),
-                               msg = 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.',
                                xhr, key, formData;
 
                        parameters = $.extend( {}, this.defaults.parameters, parameters );
                                }
                        }
 
-                       // Backwards compatibility: Before MediaWiki 1.20,
-                       // callbacks were done with the 'ok' and 'err' property in ajaxOptions.
-                       if ( ajaxOptions.ok ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                               apiDeferred.done( ajaxOptions.ok );
-                               delete ajaxOptions.ok;
-                       }
-                       if ( ajaxOptions.err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( msg );
-                               apiDeferred.fail( ajaxOptions.err );
-                               delete ajaxOptions.err;
-                       }
-
                        // Make the AJAX request
                        xhr = $.ajax( ajaxOptions )
                                // If AJAX fails, reject API call with error code 'http'
 
                        // Return the Promise
                        return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
-                               if ( code !== 'abort' ) {
+                               if ( !( code === 'http' && details && details.textStatus === 'abort' ) ) {
                                        mw.log( 'mw.Api error: ', code, details );
                                }
                        } );
                postWithToken: function ( tokenType, params, ajaxOptions ) {
                        var api = this;
 
-                       // Do not allow deprecated ok-callback
-                       // FIXME: Remove this check when the deprecated ok-callback is removed in #post
-                       if ( $.isFunction( ajaxOptions ) ) {
-                               ajaxOptions = undefined;
-                       }
-
-                       return api.getToken( tokenType ).then( function ( token ) {
+                       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
                                                                params.token = undefined;
 
                                                        // Try again, once
-                                                       return api.getToken( tokenType ).then( function ( token ) {
+                                                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
                                                                params.token = token;
                                                                return api.post( params, ajaxOptions );
                                                        } );
                /**
                 * 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 ) {
+               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 } );
+                               apiPromise = this.get( { action: 'tokens', type: type, assert: assert } );
 
                                d = apiPromise
                                        .then( function ( data ) {
index b1f1d2b..2dcf807 100644 (file)
@@ -8,31 +8,21 @@
                 * Convenience method for 'action=parse'.
                 *
                 * @param {string} wikitext
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
                 * @return {jQuery.Promise}
                 * @return {Function} return.done
                 * @return {string} return.done.data Parsed HTML of `wikitext`.
                 */
-               parse: function ( wikitext, ok, err ) {
+               parse: function ( wikitext ) {
                        var apiPromise = this.get( {
                                action: 'parse',
                                contentmodel: 'wikitext',
                                text: wikitext
                        } );
 
-                       // Backwards compatibility (< MW 1.20)
-                       if ( ok || err ) {
-                               mw.track( 'mw.deprecate', 'api.cbParam' );
-                               mw.log.warn( 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.' );
-                       }
-
                        return apiPromise
                                .then( function ( data ) {
                                        return data.parse.text['*'];
                                } )
-                               .done( ok )
-                               .fail( err )
                                .promise( { abort: apiPromise.abort } );
                }
        } );
index af2dee1..40ba136 100644 (file)
@@ -12,8 +12,6 @@
         * @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.
-        * @param {Function} [ok] Success callback (deprecated)
-        * @param {Function} [err] Error callback (deprecated)
         * @return {jQuery.Promise}
         * @return {Function} return.done
         * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
@@ -22,7 +20,7 @@
         * @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, ok, err, addParams ) {
+       function doWatchInternal( pages, addParams ) {
                // XXX: Parameter addParams is undocumented because we inherit this
                // documentation in the public method...
                var apiPromise = this.postWithToken( 'watch',
                        )
                );
 
-               // Backwards compatibility (< MW 1.20)
-               if ( ok || err ) {
-                       mw.track( 'mw.deprecate', 'api.cbParam' );
-                       mw.log.warn( 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.' );
-               }
-
                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];
                        } )
-                       .done( ok )
-                       .fail( err )
                        .promise( { abort: apiPromise.abort } );
        }
 
                 *
                 * @inheritdoc #doWatchInternal
                 */
-               watch: function ( pages, ok, err ) {
-                       return doWatchInternal.call( this, pages, ok, err );
+               watch: function ( pages ) {
+                       return doWatchInternal.call( this, pages );
                },
+
                /**
                 * Convenience method for `action=watch&unwatch=1`.
                 *
                 * @inheritdoc #doWatchInternal
                 */
-               unwatch: function ( pages, ok, err ) {
-                       return doWatchInternal.call( this, pages, ok, err, { unwatch: 1 } );
+               unwatch: function ( pages ) {
+                       return doWatchInternal.call( this, pages, { unwatch: 1 } );
                }
        } );
 
index 2382aae..453a675 100644 (file)
@@ -34,7 +34,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        break;
                case 'illative':
                        // Double the last letter and add 'n'
-                       word += word.substr(  word.length - 1 ) + 'n';
+                       word += word.slice( -1 ) + 'n';
                        break;
                case 'inessive':
                        word += ( aou ? 'ssa' : 'ssä' );
index 48351bc..d1eba43 100644 (file)
@@ -11,17 +11,17 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                case 'prefixed':
                case 'תחילית': // the same word in Hebrew
                        // Duplicate prefixed "Waw", but only if it's not already double
-                       if ( word.substr( 0, 1 ) === 'ו' && word.substr( 0, 2 ) !== 'וו' ) {
+                       if ( word.slice( 0, 1 ) === 'ו' && word.slice( 0, 2 ) !== 'וו' ) {
                                word = 'ו' + word;
                        }
 
                        // Remove the "He" if prefixed
-                       if ( word.substr( 0, 1 ) === 'ה' ) {
-                               word = word.substr( 1, word.length );
+                       if ( word.slice( 0, 1 ) === 'ה' ) {
+                               word = word.slice( 1 );
                        }
 
                        // Add a hyphen (maqaf) before numbers and non-Hebrew letters
-                       if ( word.substr( 0, 1 ) < 'א' ||  word.substr( 0, 1 ) > 'ת' ) {
+                       if ( word.slice( 0, 1 ) < 'א' ||  word.slice( 0, 1 ) > 'ת' ) {
                                word = '־' + word;
                        }
        }
index ae16f24..9cae360 100644 (file)
@@ -14,12 +14,12 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
 
        switch ( form ) {
                case 'genitive': // սեռական հոլով
-                       if ( word.substr( -1 ) === 'ա' ) {
-                               word = word.substr( 0, word.length - 1 ) + 'այի';
-                       } else if ( word.substr( -1 ) === 'ո' ) {
-                               word = word.substr( 0, word.length - 1 ) + 'ոյի';
-                       } else if ( word.substr( -4 ) === 'գիրք' ) {
-                               word = word.substr( 0, word.length - 4 ) + 'գրքի';
+                       if ( word.slice( -1 ) === 'ա' ) {
+                               word = word.slice( 0, -1 ) + 'այի';
+                       } else if ( word.slice( -1 ) === 'ո' ) {
+                               word = word.slice( 0, -1 ) + 'ոյի';
+                       } else if ( word.slice( -4 ) === 'գիրք' ) {
+                               word = word.slice( 0, -4 ) + 'գրքի';
                        } else {
                                word = word + 'ի';
                        }
index bdf59be..787be36 100644 (file)
@@ -19,7 +19,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        }
        // Checking if the $word is in plural form
        if ( word.match( /тæ$/i ) ) {
-               word = word.substring( 0, word.length - 1 );
+               word = word.slice( 0, -1 );
                endAllative = 'æм';
        }
        // Works if word is in singular form.
@@ -30,7 +30,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        // Checking if word ends on 'у'. 'У' can be either consonant 'W' or vowel 'U' in cyrillic Ossetic.
        // Examples: {{grammar:genitive|аунеу}} = аунеуы, {{grammar:genitive|лæппу}} = лæппуйы.
        else if ( word.match( /у$/i ) ) {
-               if ( !word.substring( word.length - 2, word.length - 1 ).match( /[аæеёиоыэюя]$/i ) ) {
+               if ( !word.slice( -2, -1 ).match( /[аæеёиоыэюя]$/i ) ) {
                        jot = 'й';
                }
        } else if ( !word.match( /[бвгджзйклмнопрстфхцчшщьъ]$/i ) ) {
index b6ba59f..2077b6b 100644 (file)
@@ -15,41 +15,41 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        }
        switch ( form ) {
                case 'genitive': // родительный падеж
-                       if ( word.substr( word.length - 1 ) === 'ь' ) {
-                               word = word.substr(0, word.length - 1 ) + 'я';
-                       } else if ( word.substr( word.length - 2 ) === 'ия' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ии';
-                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ки';
-                       } else if ( word.substr( word.length - 2 )  === 'ти' ) {
-                               word = word.substr(0, word.length - 2 ) + 'тей';
-                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
-                               word = word.substr(0, word.length - 2 ) + 'дов';
-                       } else if ( word.substr( word.length - 1 ) === 'д' ) {
-                               word = word.substr(0, word.length - 1 ) + 'да';
-                       } else if ( word.substr( word.length - 3 ) === 'ные' ) {
-                               word = word.substr(0, word.length - 3 ) + 'ных';
-                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
-                               word = word.substr(0, word.length - 3 ) + 'ника';
+                       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( -1 ) === 'д' ) {
+                               word = word.slice( 0, -1 ) + 'да';
+                       } else if ( word.slice( -3 ) === 'ные' ) {
+                               word = word.slice( 0, -3 ) + 'ных';
+                       } else if ( word.slice( -3 ) === 'ник' ) {
+                               word = word.slice( 0, -3 ) + 'ника';
                        }
                        break;
                case 'prepositional': // предложный падеж
-                       if ( word.substr( word.length - 1 ) === 'ь' ) {
-                               word = word.substr(0, word.length - 1 ) + 'е';
-                       } else if ( word.substr( word.length - 2 ) === 'ия' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ии';
-                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ке';
-                       } else if ( word.substr( word.length - 2 )  === 'ти' ) {
-                               word = word.substr(0, word.length - 2 ) + 'тях';
-                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
-                               word = word.substr(0, word.length - 2 ) + 'дах';
-                       } else if ( word.substr( word.length - 1 ) === 'д' ) {
-                               word = word.substr(0, word.length - 1 ) + 'де';
-                       } else if ( word.substr( word.length - 3 ) === 'ные' ) {
-                               word = word.substr(0, word.length - 3 ) + 'ных';
-                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
-                               word = word.substr(0, word.length - 3 ) + 'нике';
+                       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( -1 ) === 'д' ) {
+                               word = word.slice( 0, -1 ) + 'де';
+                       } else if ( word.slice( -3 ) === 'ные' ) {
+                               word = word.slice( 0, -3 ) + 'ных';
+                       } else if ( word.slice( -3 ) === 'ник' ) {
+                               word = word.slice( 0, -3 ) + 'нике';
                        }
                        break;
        }
index 69f7ec5..550a388 100644 (file)
@@ -9,26 +9,26 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        }
        switch ( form ) {
                case 'genitive': // родовий відмінок
-                       if ( word.substr( word.length - 4 ) !== 'вікі' && word.substr( word.length - 4 ) !== 'Вікі' ) {
-                               if ( word.substr( word.length - 1 ) === 'ь' ) {
-                                       word = word.substr(0, word.length - 1 ) + 'я';
-                               } else if ( word.substr( word.length - 2 ) === 'ія' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'ії';
-                               } else if ( word.substr( word.length - 2 ) === 'ка' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'ки';
-                               } else if ( word.substr( word.length - 2 ) === 'ти' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'тей';
-                               } else if ( word.substr( word.length - 2 ) === 'ды' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'дов';
-                               } else if ( word.substr( word.length - 3 ) === 'ник' ) {
-                                       word = word.substr(0, word.length - 3 ) + 'ника';
+                       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 ) + 'ника';
                                }
                        }
                        break;
                case 'accusative': // знахідний відмінок
-                       if ( word.substr( word.length - 4 ) !== 'вікі' && word.substr( word.length - 4 ) !== 'Вікі' ) {
-                               if ( word.substr( word.length - 2 ) === 'ія' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'ію';
+                       if ( word.slice( -4 ) !== 'вікі' && word.slice( -4 ) !== 'Вікі' ) {
+                               if ( word.slice( -2 ) === 'ія' ) {
+                                       word = word.slice(0, -2 ) + 'ію';
                                }
                        }
                        break;
diff --git a/resources/src/mediawiki.language/mediawiki.language.fallback.js b/resources/src/mediawiki.language/mediawiki.language.fallback.js
new file mode 100644 (file)
index 0000000..b1bab02
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Language-fallback-chain-related utilities for mediawiki.language.
+ */
+( function ( mw, $ ) {
+       /**
+        * @class mw.language
+        */
+
+       $.extend( mw.language, {
+
+               /**
+                * Get the language fallback chain for current UI language (not including the language itself).
+                *
+                * @return {string[]} List of language keys, e.g. `['de', 'en']`
+                */
+               getFallbackLanguages: function () {
+                       return mw.language.getData(
+                               mw.config.get( 'wgUserLanguage' ),
+                               'fallbackLanguages'
+                       ) || [];
+               },
+
+               /**
+                * Get the language fallback chain for current UI language, including the language itself.
+                *
+                * @return {string[]} List of language keys, e.g. `['pfl', de', 'en']`
+                */
+               getFallbackLanguageChain: function () {
+                       return [ mw.config.get( 'wgUserLanguage' ) ]
+                               .concat( mw.language.getFallbackLanguages() );
+               }
+
+       } );
+
+}( mediaWiki, jQuery ) );
index 5b9afcf..df95d75 100644 (file)
@@ -35,6 +35,7 @@
                 *  - `grammarForms`
                 *  - `pluralRules`
                 *  - `digitGroupingPattern`
+                *  - `fallbackLanguages`
                 *
                 * @property
                 */
index a0b5569..dceae11 100644 (file)
@@ -40,39 +40,18 @@ $.extend( mw.language, {
         *
         * @param {number} count Non-localized quantifier
         * @param {Array} forms List of plural forms
+        * @param {Object} [explicitPluralForms] List of explicit plural forms
         * @return {string} Correct form for quantifier in this language
         */
-       convertPlural: function ( count, forms ) {
+       convertPlural: function ( count, forms, explicitPluralForms ) {
                var pluralRules,
-                       formCount,
-                       form,
-                       index,
-                       equalsPosition,
                        pluralFormIndex = 0;
 
-               if ( !forms || forms.length === 0 ) {
-                       return '';
-               }
-
-               // Handle for explicit n= forms
-               for ( index = 0; index < forms.length; index++ ) {
-                       form = forms[index];
-                       if ( /^\d+=/.test( form ) ) {
-                               equalsPosition = form.indexOf( '=' );
-                               formCount = parseInt( form.substring( 0, equalsPosition ), 10 );
-                               if ( formCount === count ) {
-                                       return form.substr( equalsPosition + 1 );
-                               }
-                               forms[index] = undefined;
-                       }
+               if ( explicitPluralForms && explicitPluralForms[count] ) {
+                       return explicitPluralForms[count];
                }
 
-               // Remove explicit plural forms from the forms.
-               forms = $.map( forms, function ( form ) {
-                       return form;
-               } );
-
-               if ( forms.length === 0 ) {
+               if ( !forms || forms.length === 0 ) {
                        return '';
                }
 
@@ -144,8 +123,28 @@ $.extend( mw.language, {
                        return grammarForms[form][word] || word;
                }
                return word;
-       }
+       },
 
+       /**
+        * Turn a list of string into a simple list using commas and 'and'.
+        *
+        * See Language::listToText in languages/Language.php
+        *
+        * @param {string[]} list
+        * @return {string}
+        */
+       listToText: function ( list ) {
+               var text = '', i = 0;
+               for ( ; i < list.length; i++ ) {
+                       text += list[i];
+                       if ( list.length - 2 === i ) {
+                               text += mw.msg( 'and' ) + mw.msg( 'word-separator' );
+                       } else if ( list.length - 1 !== i ) {
+                               text += mw.msg( 'comma-separator' );
+                       }
+               }
+               return text;
+       }
 } );
 
 }( mediaWiki, jQuery ) );
index 56fa0da..a0b8141 100644 (file)
@@ -34,7 +34,7 @@
        }
 
        /**
-        * Efficiently replicate a string `n` times.
+        * Replicate a string 'n' times.
         *
         * @private
         * @param {string} str The string to replicate
@@ -47,9 +47,8 @@
                }
 
                var buf = [];
-               while (num) {
+               while ( num-- ) {
                        buf.push( str );
-                       str += str;
                }
                return buf.join( '' );
        }
 
                        // Truncate fractional
                        if ( maxPlaces < fractional.length ) {
-                               valueParts[1] = fractional.substr( 0, maxPlaces );
+                               valueParts[1] = fractional.slice( 0, maxPlaces );
                        }
                } else {
                        if ( valueParts[1] ) {
 
                        // Truncate whole
                        if ( patternDigits.indexOf( '#' ) === -1 ) {
-                               valueParts[0] = valueParts[0].substr( valueParts[0].length - padLength );
+                               valueParts[0] = valueParts[0].slice( valueParts[0].length - padLength );
                        }
                }
 
 
                if ( index !== -1 ) {
                        groupSize = patternParts[0].length - index - 1;
-                       remainder = patternParts[0].substr( 0, index );
+                       remainder = patternParts[0].slice( 0, index );
                        index = remainder.lastIndexOf( ',' );
                        if ( index !== -1 ) {
                                groupSize2 = remainder.length - index - 1;
                }
 
                for ( whole = valueParts[0]; whole; ) {
-                       off = whole.length - groupSize;
-
-                       pieces.push( ( off > 0 ) ? whole.substr( off ) : whole );
+                       off = groupSize ? whole.length - groupSize : 0;
+                       pieces.push( ( off > 0 ) ? whole.slice( off ) : whole );
                        whole = ( off > 0 ) ? whole.slice( 0, off ) : '';
 
                        if ( groupSize2 ) {
                                groupSize = groupSize2;
+                               groupSize2 = null;
                        }
                }
                valueParts[0] = pieces.reverse().join( options.group );
diff --git a/resources/src/mediawiki.legacy/ajax.js b/resources/src/mediawiki.legacy/ajax.js
new file mode 100644 (file)
index 0000000..6b9464a
--- /dev/null
@@ -0,0 +1,194 @@
+/**
+ * Remote Scripting Library
+ * Copyright 2005 modernmethod, inc
+ * Under the open source BSD license
+ * http://www.modernmethod.com/sajax/
+ */
+
+/*jshint camelcase:false */
+/*global alert */
+( function ( mw ) {
+
+/**
+ * if sajax_debug_mode is true, this function outputs given the message into
+ * the element with id = sajax_debug; if no such element exists in the document,
+ * it is injected.
+ */
+function debug( text ) {
+       if ( !window.sajax_debug_mode ) {
+               return false;
+       }
+
+       var b, m,
+               e = document.getElementById( 'sajax_debug' );
+
+       if ( !e ) {
+               e = document.createElement( 'p' );
+               e.className = 'sajax_debug';
+               e.id = 'sajax_debug';
+
+               b = document.getElementsByTagName( 'body' )[0];
+
+               if ( b.firstChild ) {
+                       b.insertBefore( e, b.firstChild );
+               } else {
+                       b.appendChild( e );
+               }
+       }
+
+       m = document.createElement( 'div' );
+       m.appendChild( document.createTextNode( text ) );
+
+       e.appendChild( m );
+
+       return true;
+}
+
+/**
+ * Compatibility wrapper for creating a new XMLHttpRequest object.
+ */
+function createXhr() {
+       debug( 'sajax_init_object() called..' );
+       var a;
+       try {
+               // Try the new style before ActiveX so we don't
+               // unnecessarily trigger warnings in IE 7 when
+               // set to prompt about ActiveX usage
+               a = new XMLHttpRequest();
+       } catch ( xhrE ) {
+               try {
+                       a = new window.ActiveXObject( 'Msxml2.XMLHTTP' );
+               } catch ( msXmlE ) {
+                       try {
+                               a = new window.ActiveXObject( 'Microsoft.XMLHTTP' );
+                       } catch ( msXhrE ) {
+                               a = null;
+                       }
+               }
+       }
+       if ( !a ) {
+               debug( 'Could not create connection object.' );
+       }
+
+       return a;
+}
+
+/**
+ * Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php
+ *   func_name - the name of the function to call. Must be registered in $wgAjaxExportList
+ *   args - an array of arguments to that function
+ *   target - the target that will handle the result of the call. If this is a function,
+ *            if will be called with the XMLHttpRequest as a parameter; if it's an input
+ *            element, its value will be set to the resultText; if it's another type of
+ *            element, its innerHTML will be set to the resultText.
+ *
+ * Example:
+ *    sajax_do_call( 'doFoo', [1, 2, 3], document.getElementById( 'showFoo' ) );
+ *
+ * This will call the doFoo function via MediaWiki's AjaxDispatcher, with
+ * (1, 2, 3) as the parameter list, and will show the result in the element
+ * with id = showFoo
+ */
+function doAjaxRequest( func_name, args, target ) {
+       var i, x, uri, post_data;
+       uri = mw.util.wikiScript() + '?action=ajax';
+       if ( window.sajax_request_type === 'GET' ) {
+               if ( uri.indexOf( '?' ) === -1 ) {
+                       uri = uri + '?rs=' + encodeURIComponent( func_name );
+               } else {
+                       uri = uri + '&rs=' + encodeURIComponent( func_name );
+               }
+               for ( i = 0; i < args.length; i++ ) {
+                       uri = uri + '&rsargs[]=' + encodeURIComponent( args[i] );
+               }
+               //uri = uri + '&rsrnd=' + new Date().getTime();
+               post_data = null;
+       } else {
+               post_data = 'rs=' + encodeURIComponent( func_name );
+               for ( i = 0; i < args.length; i++ ) {
+                       post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] );
+               }
+       }
+       x = createXhr();
+       if ( !x ) {
+               alert( 'AJAX not supported' );
+               return false;
+       }
+
+       try {
+               x.open( window.sajax_request_type, uri, true );
+       } catch ( e ) {
+               if ( location.hostname === 'localhost' ) {
+                       alert( 'Your browser blocks XMLHttpRequest to "localhost", try using a real hostname for development/testing.' );
+               }
+               throw e;
+       }
+       if ( window.sajax_request_type === 'POST' ) {
+               x.setRequestHeader( 'Method', 'POST ' + uri + ' HTTP/1.1' );
+               x.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
+       }
+       x.setRequestHeader( 'Pragma', 'cache=yes' );
+       x.setRequestHeader( 'Cache-Control', 'no-transform' );
+       x.onreadystatechange = function () {
+               if ( x.readyState !== 4 ) {
+                       return;
+               }
+
+               debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
+
+               //if ( x.status != 200 )
+               //      alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText );
+               //else
+
+               if ( typeof target === 'function' ) {
+                       target( x );
+               } else if ( typeof target === 'object' ) {
+                       if ( target.tagName === 'INPUT' ) {
+                               if ( x.status === 200 ) {
+                                       target.value = x.responseText;
+                               }
+                               //else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' );
+                       } else {
+                               if ( x.status === 200 ) {
+                                       target.innerHTML = x.responseText;
+                               } else {
+                                       target.innerHTML = '<div class="error">Error: ' + x.status +
+                                               ' ' + x.statusText + ' (' + x.responseText + ')</div>';
+                               }
+                       }
+               } else {
+                       alert( 'Bad target for sajax_do_call: not a function or object: ' + target );
+               }
+       };
+
+       debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
+       x.send( post_data );
+       debug( func_name + ' waiting..' );
+
+       return true;
+}
+
+/**
+ * @return {boolean} Whether the browser supports AJAX
+ */
+function wfSupportsAjax() {
+       var request = createXhr(),
+               supportsAjax = request ? true : false;
+
+       request = undefined;
+       return supportsAjax;
+}
+
+// Expose + Mark as deprecated
+var deprecationNotice = 'Sajax is deprecated, use jQuery.ajax or mediawiki.api instead.';
+
+// Variables
+mw.log.deprecate( window, 'sajax_debug_mode', false, deprecationNotice );
+mw.log.deprecate( window, 'sajax_request_type', 'GET', deprecationNotice );
+// Methods
+mw.log.deprecate( window, 'sajax_debug', debug, deprecationNotice );
+mw.log.deprecate( window, 'sajax_init_object', createXhr, deprecationNotice );
+mw.log.deprecate( window, 'sajax_do_call', doAjaxRequest, deprecationNotice );
+mw.log.deprecate( window, 'wfSupportsAjax', wfSupportsAjax, deprecationNotice );
+
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.legacy/commonPrint.css b/resources/src/mediawiki.legacy/commonPrint.css
new file mode 100644 (file)
index 0000000..830b02f
--- /dev/null
@@ -0,0 +1,435 @@
+/**
+ * MediaWiki Print style sheet for CSS2-capable browsers.
+ * Copyright Gabriel Wicke, http://www.aulinx.de/
+ *
+ * Derived from the plone (http://plone.org/) styles
+ * Copyright Alexander Limi
+ */
+
+/* Thanks to A List Apart (http://alistapart.com/) for useful extras */
+
+/**
+ * Hide all the elements irrelevant for printing
+ */
+.noprint,
+div#jump-to-nav,
+.mw-jump,
+div.top,
+div#column-one,
+#colophon,
+.mw-editsection,
+.mw-editsection-like,
+.toctoggle,
+#toc.tochidden,
+div#f-poweredbyico,
+div#f-copyrightico,
+li#viewcount,
+li#about,
+li#disclaimer,
+li#mobileview,
+li#privacy,
+#footer-places,
+.mw-hidden-catlinks,
+tr.mw-metadata-show-hide-extended,
+span.mw-filepage-other-resolutions,
+#filetoc,
+.usermessage,
+.patrollink,
+#mw-navigation,
+#siteNotice {
+       display: none;
+}
+
+/**
+ * Pagination
+ */
+.wikitable, .thumb, img {
+       page-break-inside: avoid;
+}
+
+h2, h3, h4, h5, h6 {
+       page-break-after: avoid;
+}
+
+p {
+       widows: 3;
+       orphans: 3;
+}
+
+/**
+ * Generic HTML elements
+ */
+body {
+       background: white;
+       color: black;
+       margin: 0;
+       padding: 0;
+}
+
+ul {
+       list-style-type: square;
+}
+
+h1, h2, h3, h4, h5, h6 {
+       font-weight: bold;
+}
+
+dt {
+       font-weight: bold;
+}
+
+p {
+       margin: 1em 0;
+       line-height: 1.2em;
+}
+
+pre, .mw-code {
+       border: 1pt dashed black;
+       white-space: pre;
+       font-size: 8pt;
+       overflow: auto;
+       padding: 1em 0;
+       background: white;
+       color: black;
+}
+
+/**
+ * MediaWiki-specific elements
+ */
+#globalWrapper {
+       width: 100% !important;
+       min-width: 0 !important;
+}
+
+.mw-body {
+       background: white;
+       border: none !important;
+       padding: 0 !important;
+       margin: 0 !important;
+       direction: ltr;
+       color: black;
+}
+
+#column-content {
+       margin: 0 !important;
+}
+
+#column-content .mw-body {
+       padding: 1em;
+       margin: 0 !important;
+}
+
+#toc {
+       border: 1px solid #aaaaaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       display: -moz-inline-block;
+       display: inline-block;
+       display: table;
+       /* IE7 and earlier */
+       zoom: 1;
+       *display: inline;
+}
+
+#footer {
+       background: white;
+       color: black;
+       margin-top: 1em;
+       border-top: 1px solid #AAA;
+       direction: ltr;
+}
+
+img {
+       border: none;
+       vertical-align: middle;
+}
+
+/* math */
+span.texhtml {
+       font-family: serif;
+}
+
+/**
+ * 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 {
+       content: " (" attr(href) ")";
+}
+
+/* Expand protocol-relative URLs for printing */
+.mw-body a.external.text[href^='//']:after,
+.mw-body a.external.autonumber[href^='//']:after {
+       content: " (https:" attr(href) ")";
+}
+
+/* MSIE/Win doesn't understand 'inherit' */
+a,
+a.external,
+a.new,
+a.stub {
+       color: black !important;
+       text-decoration: none !important;
+}
+
+/* Continue ... */
+a,
+a.external,
+a.new,
+a.stub {
+       color: inherit !important;
+       text-decoration: inherit !important;
+}
+
+/**
+ * Floating divs
+ */
+div.floatright {
+       float: right;
+       clear: right;
+       position: relative;
+       margin: 0.5em 0 0.8em 1.4em;
+}
+
+div.floatright p {
+       font-style: italic;
+}
+
+div.floatleft {
+       float: left;
+       clear: left;
+       position: relative;
+       margin: 0.5em 1.4em 0.8em 0;
+}
+
+div.floatleft p {
+       font-style: italic;
+}
+
+div.center {
+       text-align: center;
+}
+
+/**
+ * Thumbnails
+ */
+div.thumb {
+       border: none;
+       width: auto;
+       margin-top: 0.5em;
+       margin-bottom: 0.8em;
+       background-color: transparent;
+}
+
+div.thumbinner {
+       border: 1px solid #cccccc;
+       padding: 3px !important;
+       background-color: White;
+       font-size: 94%;
+       text-align: center;
+       overflow: hidden;
+}
+
+html .thumbimage {
+       border: 1px solid #cccccc;
+}
+
+html .thumbcaption {
+       border: none;
+       text-align: left;
+       line-height: 1.4em;
+       padding: 3px !important;
+       font-size: 94%;
+}
+
+div.magnify {
+       display: none;
+}
+
+/* @noflip */
+div.tright {
+       float: right;
+       clear: right;
+       margin: 0.5em 0 0.8em 1.4em;
+}
+
+/* @noflip */
+div.tleft {
+       float: left;
+       clear: left;
+       margin: 0.5em 1.4em 0.8em 0;
+}
+
+img.thumbborder {
+       border: 1px solid #dddddd;
+}
+
+/**
+ * Galleries (see shared.css for more info)
+ */
+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 rendering
+ */
+table.diff {
+       background: white;
+}
+
+td.diff-otitle {
+       background: #ffffff;
+}
+
+td.diff-ntitle {
+       background: #ffffff;
+}
+
+td.diff-addedline {
+       background: #ccffcc;
+       font-size: smaller;
+       border: solid 2px black;
+}
+
+td.diff-deletedline {
+       background: #ffffaa;
+       font-size: smaller;
+       border: dotted 2px black;
+}
+
+td.diff-context {
+       background: #eeeeee;
+       font-size: smaller;
+}
+
+.diffchange {
+       color: silver;
+       font-weight: bold;
+       text-decoration: underline;
+}
+
+/**
+ * Table rendering
+ * As on shared.css but with white background.
+ */
+table.wikitable,
+table.mw_metadata {
+       margin: 1em 0;
+       border: 1px #aaa solid;
+       background: white;
+       border-collapse: collapse;
+}
+
+table.wikitable > tr > th, table.wikitable > tr > td,
+table.wikitable > * > tr > th, table.wikitable > * > tr > td,
+.mw_metadata th, .mw_metadata td {
+       border: 1px #aaa solid;
+       padding: 0.2em;
+}
+
+table.wikitable > tr > th,
+table.wikitable > * > tr > th,
+.mw_metadata th {
+       text-align: center;
+       background: white;
+       font-weight: bold;
+}
+
+table.wikitable > caption,
+.mw_metadata caption {
+       font-weight: bold;
+}
+
+table.listing,
+table.listing td {
+       border: 1pt solid black;
+       border-collapse: collapse;
+}
+
+a.sortheader {
+       margin: 0 0.3em;
+}
+
+/**
+ * Categories
+ */
+.catlinks ul {
+       display: inline;
+       margin: 0;
+       padding: 0;
+       list-style: none;
+       list-style-type: none;
+       list-style-image: none;
+       vertical-align: middle !ie;
+}
+
+.catlinks li {
+       display: inline-block;
+       line-height: 1.15em;
+       padding: 0 .4em;
+       border-left: 1px solid #AAA;
+       margin: 0.1em 0;
+       zoom: 1;
+       display: inline !ie;
+}
+
+.catlinks li:first-child {
+       padding-left: .2em;
+       border-left: none;
+}
+
+.printfooter {
+       padding: 1em 0 1em 0;
+}
diff --git a/resources/src/mediawiki.legacy/images/ajax-loader.gif b/resources/src/mediawiki.legacy/images/ajax-loader.gif
new file mode 100644 (file)
index 0000000..72203fd
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/ajax-loader.gif differ
diff --git a/resources/src/mediawiki.legacy/images/checker.png b/resources/src/mediawiki.legacy/images/checker.png
new file mode 100644 (file)
index 0000000..3e9e3d0
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/checker.png differ
diff --git a/resources/src/mediawiki.legacy/images/feed-icon.png b/resources/src/mediawiki.legacy/images/feed-icon.png
new file mode 100644 (file)
index 0000000..00f49f6
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/feed-icon.png differ
diff --git a/resources/src/mediawiki.legacy/images/feed-icon.svg b/resources/src/mediawiki.legacy/images/feed-icon.svg
new file mode 100644 (file)
index 0000000..6e5f570
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 256 256"><defs><linearGradient x1=".085" y1=".085" x2=".915" y2=".915" id="a"><stop offset="0" stop-color="#E3702D"/><stop offset=".107" stop-color="#EA7D31"/><stop offset=".35" stop-color="#F69537"/><stop offset=".5" stop-color="#FB9E3A"/><stop offset=".702" stop-color="#EA7C31"/><stop offset=".887" stop-color="#DE642B"/><stop offset="1" stop-color="#D95B29"/></linearGradient></defs><rect width="256" height="256" rx="55" ry="55" fill="#CC5D15"/><rect width="246" height="246" rx="50" ry="50" x="5" y="5" fill="#F49C52"/><rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#a)"/><circle cx="68" cy="189" r="24" fill="#FFF"/><path d="M160 213h-34a82 82 0 0 0-82-82v-34a116 116 0 0 1 116 116zM184 213a140 140 0 0 0-140-140v-35a175 175 0 0 1 175 175z" fill="#FFF"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.legacy/images/help-question-hover.gif b/resources/src/mediawiki.legacy/images/help-question-hover.gif
new file mode 100644 (file)
index 0000000..515138d
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/help-question-hover.gif differ
diff --git a/resources/src/mediawiki.legacy/images/help-question.gif b/resources/src/mediawiki.legacy/images/help-question.gif
new file mode 100644 (file)
index 0000000..b4fc9c5
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/help-question.gif differ
diff --git a/resources/src/mediawiki.legacy/images/question.png b/resources/src/mediawiki.legacy/images/question.png
new file mode 100644 (file)
index 0000000..f7405d2
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/question.png differ
diff --git a/resources/src/mediawiki.legacy/images/question.svg b/resources/src/mediawiki.legacy/images/question.svg
new file mode 100644 (file)
index 0000000..98fbe8d
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="21.059" height="21.06"><path fill="#575757" d="M10.529 0c-5.814 0-10.529 4.714-10.529 10.529s4.715 10.53 10.529 10.53c5.816 0 10.529-4.715 10.529-10.53s-4.712-10.529-10.529-10.529zm-.002 16.767c-.861 0-1.498-.688-1.498-1.516 0-.862.637-1.534 1.498-1.534.828 0 1.5.672 1.5 1.534 0 .827-.672 1.516-1.5 1.516zm2.137-6.512c-.723.568-1 .931-1 1.739v.5h-2.205v-.603c0-1.517.449-2.136 1.154-2.688.707-.552 1.139-.845 1.139-1.637 0-.672-.414-1.051-1.24-1.051-.707 0-1.328.189-1.982.638l-1.051-1.807c.861-.604 1.93-1.034 3.342-1.034 1.912 0 3.516 1.051 3.516 3.066-.001 1.43-.794 2.188-1.673 2.877z"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.legacy/images/spinner.gif b/resources/src/mediawiki.legacy/images/spinner.gif
new file mode 100644 (file)
index 0000000..6146be4
Binary files /dev/null and b/resources/src/mediawiki.legacy/images/spinner.gif differ
diff --git a/resources/src/mediawiki.legacy/oldshared.css b/resources/src/mediawiki.legacy/oldshared.css
new file mode 100644 (file)
index 0000000..d92d3bb
--- /dev/null
@@ -0,0 +1,489 @@
+/**
+ * oldshared.css
+ * This file contains CSS settings common to Wikistandard, Nostalgia and
+ * CologneBlue, the old pre-Monobook skins
+ */
+
+/* For clarity, explicitly state some recommendations from
+ * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right
+ */
+
+h1 {
+       font-size: 2em;
+}
+
+h2 {
+       font-size: 1.5em;
+}
+
+h3 {
+       font-size: 1.17em;
+}
+
+h4 {
+       font-size: 1.11em;
+}
+
+h5 {
+       font-size: 1.05em;
+}
+
+h6 {
+       font-size: 1em;
+}
+
+h1, h2, h3, h4, h5, h6 {
+       font-weight: bolder;
+}
+
+/* Now the custom parts */
+
+#footer {
+       clear: both;
+}
+
+/* images */
+/* @noflip */
+div.floatright {
+       float: right;
+       clear: right;
+       margin: 0 0 1em 1em;
+}
+
+/* @noflip */
+div.floatright p {
+       font-style: italic;
+}
+
+/* @noflip */
+div.floatleft {
+       float: left;
+       clear: left;
+       margin: 0.3em 0.5em 0.5em 0;
+}
+
+/* @noflip */
+div.floatleft p {
+       font-style: italic;
+}
+
+/* table standards */
+table.rimage {
+       float: right;
+       margin-left: 1em;
+       margin-bottom: 1em;
+       text-align: center;
+       font-size: smaller;
+}
+
+/* thumbnails */
+div.thumb {
+       margin-bottom: .5em;
+       border-style: solid;
+       border-color: white;
+       width: auto;
+}
+
+div.thumbinner {
+       border: 1px solid #ccc;
+       padding: 3px;
+       background-color: #f9f9f9;
+       font-size: 94%;
+       text-align: center;
+       overflow: hidden;
+}
+
+html .thumbimage {
+       border: 1px solid #ccc;
+}
+
+html .thumbcaption {
+       border: none;
+       line-height: 1.4em;
+       padding: 3px;
+       font-size: 94%;
+       text-align: left;
+}
+
+div.magnify {
+       float: right;
+       margin-left: 3px;
+}
+
+div.magnify a {
+       display: block;
+       /* Hide the text… */
+       text-indent: 15px;
+       white-space: nowrap;
+       overflow: hidden;
+       /* …and replace it with the image */
+       width: 15px;
+       height: 11px;
+       /* @embed */
+       background: url(images/magnify-clip-ltr.png) center center no-repeat;
+       /* Don't annoy people who copy-paste everything too much */
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+/* @noflip */
+div.tright {
+       clear: right;
+       float: right;
+       border-width: .5em 0 .8em 1.4em;
+}
+
+/* @noflip */
+div.tleft {
+       float: left;
+       clear: left;
+       margin-right: .5em;
+       border-width: .5em 1.4em .8em 0;
+}
+
+img.thumbborder {
+       border: 1px solid #dddddd;
+}
+
+/* Page history styling */
+/* the auto-generated edit comments */
+.autocomment {
+       color: #4b4b4b;
+}
+
+img {
+       border: none;
+}
+
+#toc,
+.toc {
+       border: 1px solid #bba;
+       background-color: #f7f8ff;
+       padding: 5px;
+       font-size: 95%;
+       text-align: center;
+       display: -moz-inline-block;
+       display: inline-block;
+       display: table;
+
+       /* IE7 and earlier */
+       zoom: 1;
+       *display: inline;
+
+       padding: 7px;
+}
+
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+       border-collapse: collapse;
+}
+
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+       padding: 0;
+}
+
+#toc h2,
+.toc h2 {
+       display: inline;
+       border: none;
+       padding: 0;
+       font-size: 100%;
+       font-weight: bold;
+}
+
+#toc ul,
+.toc ul {
+       list-style-type: none;
+       list-style-image: none;
+       padding: 0;
+       text-align: left;
+}
+
+#toc ul ul,
+.toc ul ul {
+       margin: 0 0 0 2em;
+}
+
+#toc .toctoggle,
+.toc .toctoggle {
+       font-size: 94%;
+}
+
+.error {
+       color: red;
+       font-size: larger;
+}
+
+/* preference page with js-genrated toc */
+#preftoc {
+       float: left;
+       margin: 1em 1em 1em 1em;
+       width: 13em;
+}
+
+#preftoc li {
+       border: 1px solid White;
+}
+
+#preftoc li.selected {
+       background-color: #f9f9f9;
+       border: 1px dashed #aaaaaa;
+}
+
+#preftoc a,
+#preftoc a:active {
+       display: block;
+       color: #005189;
+}
+
+.mw-prefs-buttons {
+       clear: left;
+       float: left;
+       margin-top: 1em;
+}
+
+div.htmlform-tip {
+       font-size: 94%;
+       margin-top: 0.4em;
+       color: #666;
+}
+
+fieldset.prefsection {
+       margin-top: 1em;
+}
+
+fieldset.operaprefsection {
+       margin-left: 15em;
+}
+
+/* emulate center */
+.center {
+       width: 100%;
+       text-align: center;
+}
+
+*.center * {
+       margin-left: auto;
+       margin-right: auto;
+}
+
+/* small for tables and similar */
+.small {
+       font-size: 94%;
+}
+
+table.small {
+       font-size: 100%;
+}
+
+/* use this instead of #toc for page content */
+.toccolours {
+       border: 1px solid #aaaaaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       font-size: 95%;
+}
+
+#siteNotice {
+       border: 1px solid #aaaaaa;
+       padding-left: 0.5em;
+       padding-right: 0.5em;
+}
+
+.sharedUploadNotice {
+       font-style: italic;
+}
+
+span.unpatrolled {
+       font-weight: bold;
+       color: red;
+}
+
+span.updatedmarker {
+       color: black;
+       background-color: #00FF00;
+}
+
+div.gallerybox {
+       width: 150px;
+}
+
+span.comment {
+       font-style: italic;
+}
+
+span.changedby {
+       font-size: 95%;
+}
+
+.previewnote {
+       text-align: center;
+       color: #cc0000;
+}
+
+.editExternally {
+       border-style: solid;
+       border-width: 1px;
+       border-color: gray;
+       background: #ffffff;
+       padding: 3px;
+       margin-top: 0.5em;
+       float: left;
+       font-size: small;
+       text-align: center;
+}
+
+.editExternallyHelp {
+       font-style: italic;
+       color: gray;
+}
+
+li span.deleted {
+       text-decoration: line-through;
+       color: #888;
+       font-style: italic;
+}
+
+/* Classes for Exif data display */
+table.mw_metadata {
+       margin-left: 0.5em;
+}
+
+table.mw_metadata caption {
+       font-weight: bold;
+}
+
+table.mw_metadata th {
+       font-weight: normal;
+}
+
+table.mw_metadata td {
+       padding: 0.1em;
+}
+
+table.mw_metadata {
+       border: none;
+       border-collapse: collapse;
+}
+
+table.mw_metadata td,
+table.mw_metadata th {
+       border: 1px solid #aaaaaa;
+       padding-left: 4px;
+       padding-right: 4px;
+}
+
+table.mw_metadata th {
+       background-color: #f9f9f9;
+}
+
+table.mw_metadata td {
+       background-color: #fcfcfc;
+}
+
+table.mw_metadata td.spacer {
+       background: inherit;
+       border-top: none;
+       border-bottom: none;
+}
+
+.visualClear {
+       clear: both;
+}
+
+/* Allmessages table */
+#allmessagestable th {
+       background-color: #b2b2ff;
+}
+
+#allmessagestable tr.orig {
+       background-color: #ffe2e2;
+}
+
+#allmessagestable tr.new {
+       background-color: #e2ffe2;
+}
+
+#allmessagestable tr.def {
+       background-color: #f0f0ff;
+}
+
+#jump-to-nav {
+       display: none;
+}
+
+div.multipageimagenavbox {
+       border: solid 1px silver;
+       padding: 4px;
+       margin: 1em;
+       background: #f0f0f0;
+}
+
+div.multipageimagenavbox div.thumb {
+       border: none;
+       margin-left: 2em;
+       margin-right: 2em;
+}
+
+div.multipageimagenavbox hr {
+       margin: 6px;
+}
+
+table.multipageimage td {
+       text-align: center;
+}
+
+.templatesUsed {
+       margin-top: 1em;
+}
+
+.MediaTransformError {
+       border: thin solid #777;
+       background-color: #ccc;
+       padding: 0.1em;
+}
+
+.MediaTransformError td {
+       text-align: center;
+       vertical-align: middle;
+       font-size: 90%;
+}
+
+form#specialpages {
+       display: inline;
+}
+
+body {
+       direction: ltr;
+       unicode-bidi: embed;
+       background-color: #ffffec;
+}
+
+body.ns-0 {
+       background-color: white;
+}
+
+/** RTL specific CSS starts here **/
+
+/**
+ * Lists:
+ * The following lines don't have a visible effect on non-Gecko browsers
+ * They fix a problem with Gecko browsers rendering lists to the right of
+ * left-floated objects in an RTL layout.
+ */
+/* @noflip */
+html > body.rtl div#article ul {
+       display: table;
+}
+
+/* @noflip */
+html > body.rtl .mw-body ul#filetoc {
+       display: block;
+}
+
+/* RTL specific CSS ends here **/
diff --git a/resources/src/mediawiki.legacy/protect.js b/resources/src/mediawiki.legacy/protect.js
new file mode 100644 (file)
index 0000000..f9069b6
--- /dev/null
@@ -0,0 +1,240 @@
+( function ( mw, $ ) {
+
+var ProtectionForm = window.ProtectionForm = {
+       /**
+        * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
+        * on the protection form
+        */
+       init: function () {
+               var $cell = $( '<td>' ), $row = $( '<tr>' ).append( $cell );
+
+               if ( !$( '#mwProtectSet' ).length ) {
+                       return false;
+               }
+
+               if ( mw.config.get( 'wgCascadeableLevels' ) !== undefined ) {
+                       $( 'form#mw-Protect-Form' ).submit( this.toggleUnchainedInputs.bind( ProtectionForm, true ) );
+               }
+               this.getExpirySelectors().each( function () {
+                       $( this ).change( ProtectionForm.updateExpiryList.bind( ProtectionForm, this ) );
+               } );
+               this.getExpiryInputs().each( function () {
+                       $( this ).on( 'keyup change', ProtectionForm.updateExpiry.bind( ProtectionForm, this ) );
+               } );
+               this.getLevelSelectors().each( function () {
+                       $( this ).change( ProtectionForm.updateLevels.bind( ProtectionForm, this ) );
+               } );
+
+               $( '#mwProtectSet > tbody > tr:first' ).after( $row );
+
+               // If there is only one protection type, there is nothing to chain
+               if ( $( '[id ^= mw-protect-table-]' ).length > 1 ) {
+                       $cell.append(
+                               $( '<input>' )
+                                       .attr( { id: 'mwProtectUnchained', type: 'checkbox' } )
+                                       .click( this.onChainClick.bind( this ) )
+                                       .prop( 'checked', !this.areAllTypesMatching() ),
+                               document.createTextNode( ' ' ),
+                               $( '<label>' )
+                                       .attr( 'for', 'mwProtectUnchained' )
+                                       .text( mw.msg( 'protect-unchain-permissions' ) )
+                       );
+
+                       this.toggleUnchainedInputs( !this.areAllTypesMatching() );
+               }
+
+               $( '#mwProtect-reason' ).byteLimit( 180 );
+
+               this.updateCascadeCheckbox();
+       },
+
+       /**
+        * Sets the disabled attribute on the cascade checkbox depending on the current selected levels
+        */
+       updateCascadeCheckbox: function () {
+               this.getLevelSelectors().each( function () {
+                       if ( !ProtectionForm.isCascadeableLevel( $( this ).val() ) ) {
+                               $( '#mwProtect-cascade' ).prop( { checked: false, disabled: true } );
+                               return false;
+                       } else {
+                               $( '#mwProtect-cascade' ).prop( 'disabled', false );
+                       }
+               } );
+       },
+
+       /**
+        * Checks if a cerain protection level is cascadeable.
+        *
+        * @param {string} level
+        * @return {boolean}
+        */
+       isCascadeableLevel: function ( level ) {
+               return $.inArray( level, mw.config.get( 'wgCascadeableLevels' ) ) !== -1;
+       },
+
+       /**
+        * When protection levels are locked together, update the rest
+        * when one action's level changes
+        *
+        * @param {Element} source Level selector that changed
+        */
+       updateLevels: function ( source ) {
+               if ( !this.isUnchained() ) {
+                       this.setAllSelectors( source.selectedIndex );
+               }
+               this.updateCascadeCheckbox();
+       },
+
+       /**
+        * When protection levels are locked together, update the
+        * expiries when one changes
+        *
+        * @param {Element} source expiry input that changed
+        */
+
+       updateExpiry: function ( source ) {
+               if ( !this.isUnchained() ) {
+                       this.getExpiryInputs().each( function () {
+                               this.value = source.value;
+                       } );
+               }
+               if ( this.isUnchained() ) {
+                       $( '#' + source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' ) ).val( 'othertime' );
+               } else {
+                       this.getExpirySelectors().each( function () {
+                               this.value = 'othertime';
+                       } );
+               }
+       },
+
+       /**
+        * When protection levels are locked together, update the
+        * expiry lists when one changes and clear the custom inputs
+        *
+        * @param {Element} source Expiry selector that changed
+        */
+       updateExpiryList: function ( source ) {
+               if ( !this.isUnchained() ) {
+                       this.getExpirySelectors().each( function () {
+                               this.value = source.value;
+                       } );
+                       this.getExpiryInputs().each( function () {
+                               this.value = '';
+                       } );
+               }
+       },
+
+       /**
+        * Update chain status and enable/disable various bits of the UI
+        * when the user changes the "unlock move permissions" checkbox
+        */
+       onChainClick: function () {
+               this.toggleUnchainedInputs( this.isUnchained() );
+               if ( !this.isUnchained() ) {
+                       this.setAllSelectors( this.getMaxLevel() );
+               }
+               this.updateCascadeCheckbox();
+       },
+
+       /**
+        * Returns true if the named attribute in all objects in the given array are matching
+        *
+        * @param {Object[]} objects
+        * @param {string} attrName
+        * @return {boolean}
+        */
+       matchAttribute: function ( objects, attrName ) {
+               return $.map( objects, function ( object ) {
+                       return object[attrName];
+               } ).filter( function ( item, index, a ) {
+                       return index === a.indexOf( item );
+               } ).length === 1;
+       },
+
+       /**
+        * Are all actions protected at the same level, with the same expiry time?
+        *
+        * @return {boolean}
+        */
+       areAllTypesMatching: function () {
+               return this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' )
+                       && this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' )
+                       && this.matchAttribute( this.getExpiryInputs(), 'value' );
+       },
+
+       /**
+        * Is protection chaining off?
+        *
+        * @return {boolean}
+        */
+       isUnchained: function () {
+               var element = document.getElementById( 'mwProtectUnchained' );
+               return element
+                       ? element.checked
+                       : true; // No control, so we need to let the user set both levels
+       },
+
+       /**
+        * Find the highest protection level in any selector
+        * @return {number}
+        */
+       getMaxLevel: function () {
+               return Math.max.apply( Math, this.getLevelSelectors().map( function () {
+                       return this.selectedIndex;
+               } ) );
+       },
+
+       /**
+        * Protect all actions at the specified level
+        *
+        * @param {number} index Protection level
+        */
+       setAllSelectors: function ( index ) {
+               this.getLevelSelectors().each( function () {
+                       this.selectedIndex = index;
+               } );
+       },
+
+       /**
+        * Get a list of all protection selectors on the page
+        *
+        * @return {jQuery}
+        */
+       getLevelSelectors: function () {
+               return $( 'select[id ^= mwProtect-level-]' );
+       },
+
+       /**
+        * Get a list of all expiry inputs on the page
+        *
+        * @return {jQuery}
+        */
+       getExpiryInputs: function () {
+               return $( 'input[id ^= mwProtect-][id $= -expires]' );
+       },
+
+       /**
+        * Get a list of all expiry selector lists on the page
+        *
+        * @return {jQuery}
+        */
+       getExpirySelectors: function () {
+               return $( 'select[id ^= mwProtectExpirySelection-]' );
+       },
+
+       /**
+        * Enable/disable protection selectors and expiry inputs
+        *
+        * @param {boolean} val Enable?
+        */
+       toggleUnchainedInputs: function ( val ) {
+               var setDisabled = function () { this.disabled = !val; };
+               this.getLevelSelectors().slice( 1 ).each( setDisabled );
+               this.getExpiryInputs().slice( 1 ).each( setDisabled );
+               this.getExpirySelectors().slice( 1 ).each( setDisabled );
+       }
+};
+
+$( ProtectionForm.init.bind( ProtectionForm ) );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.legacy/shared.css b/resources/src/mediawiki.legacy/shared.css
new file mode 100644 (file)
index 0000000..0604773
--- /dev/null
@@ -0,0 +1,1167 @@
+/**
+ * CSS in this file is used by *all* skins (that have any CSS at all). Be
+ * careful what you put in here, since what looks good in one skin may not in
+ * another, but don't ignore the poor pre-Monobook users either.
+ */
+
+/* GENERAL CLASSES FOR DIRECTIONALITY SUPPORT */
+
+/**
+ * These classes should be used for text depending on the content direction.
+ * Content stuff like editsection, ul/ol and TOC depend on this.
+ */
+.mw-content-ltr {
+       /* @noflip */
+       direction: ltr;
+}
+
+.mw-content-rtl {
+       /* @noflip */
+       direction: rtl;
+}
+
+/* Most input fields should be in site direction */
+.sitedir-ltr textarea,
+.sitedir-ltr input {
+       /* @noflip */
+       direction: ltr;
+}
+
+.sitedir-rtl textarea,
+.sitedir-rtl input {
+       /* @noflip */
+       direction: rtl;
+}
+
+.mw-userlink {
+       unicode-bidi: embed;
+}
+
+/* User-Agent styles for new HTML5 elements */
+mark {
+       background-color: yellow;
+       color: black;
+}
+
+/* Helper for wbr element on IE 8+; in HTML5, but not supported by default as of IE 11. */
+/* Note canonical HTML5 styles recommend "content: \u200B", but this doesn't work as of IE 11. */
+wbr {
+       display: inline-block;
+}
+
+/* Input types that should follow user direction, like buttons */
+/* TODO: What about buttons in wikipage content ? */
+input[type="submit"],
+input[type="button"],
+input[type="reset"],
+input[type="file"] {
+       direction: ltr;
+}
+
+/* Override default values */
+textarea[dir="ltr"],
+input[dir="ltr"] {
+       /* @noflip */
+       direction: ltr;
+}
+
+textarea[dir="rtl"],
+input[dir="rtl"] {
+       /* @noflip */
+       direction: rtl;
+}
+
+/* Default style for semantic tags */
+abbr[title],
+.explain[title] {
+       border-bottom: 1px dotted;
+       cursor: help;
+}
+
+/* Colored watchlist and recent changes numbers */
+.mw-plusminus-pos {
+       color: #006400; /* dark green */
+}
+
+.mw-plusminus-neg {
+       color: #8b0000; /* dark red */
+}
+
+.mw-plusminus-null {
+       color: #aaa; /* gray */
+}
+
+/**
+ * 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 and username portions of RC entries */
+span.comment {
+       font-style: italic;
+}
+
+span.changedby {
+       font-size: 95%;
+}
+
+/* Math */
+.texvc {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+img.tex {
+       vertical-align: middle;
+}
+
+span.texhtml {
+       font-family: serif;
+}
+
+/**
+ * Add a bit of margin space between the preview and the toolbar.
+ * This replaces the ugly <p><br /></p> we used to insert into the page source
+ */
+#wikiPreview.ontop {
+       margin-bottom: 1em;
+}
+
+/* Stop floats from intruding into edit area in previews */
+#editform,
+#toolbar,
+#wpTextbox1 {
+       clear: both;
+}
+
+/**
+ * File description page
+ */
+
+div.mw-filepage-resolutioninfo {
+       font-size: smaller;
+}
+
+/**
+ * File histories
+ */
+h2#filehistory {
+       clear: both;
+}
+
+table.filehistory th,
+table.filehistory td {
+       vertical-align: top;
+}
+
+table.filehistory th {
+       text-align: left;
+}
+
+table.filehistory td.mw-imagepage-filesize,
+table.filehistory th.mw-imagepage-filesize {
+       white-space: nowrap;
+}
+
+table.filehistory td.filehistory-selected {
+       font-weight: bold;
+}
+
+/**
+ * Add a checkered background image on hover for file
+ * description pages. (bug 26470)
+ */
+.filehistory a img,
+#file img:hover {
+       /* @embed */
+       background: white url(images/checker.png) repeat;
+}
+
+/**
+ * rev_deleted stuff
+ */
+li span.deleted,
+span.history-deleted {
+       text-decoration: line-through;
+       color: #888;
+       font-style: italic;
+}
+
+/**
+ * Patrol stuff
+ */
+.not-patrolled {
+       background-color: #ffa;
+}
+
+.unpatrolled {
+       font-weight: bold;
+       color: red;
+}
+
+div.patrollink {
+       font-size: 75%;
+       text-align: right;
+}
+
+/**
+ * Forms
+ */
+td.mw-label {
+       text-align: right;
+}
+
+td.mw-input {
+       text-align: left;
+}
+
+td.mw-submit {
+       text-align: left;
+}
+
+td.mw-label {
+       vertical-align: top;
+}
+
+.prefsection td.mw-label {
+       width: 20%;
+}
+
+.prefsection table {
+       width: 100%;
+}
+
+.prefsection table.mw-htmlform-matrix {
+       width: auto;
+}
+
+.mw-icon-question {
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG).
+        * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
+       background-image: url(images/question.png);
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/question.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/question.svg);
+       background-repeat: no-repeat;
+       background-size: 13px 13px;
+       display: inline-block;
+       height: 13px;
+       width: 13px;
+       margin-left: 4px;
+}
+
+.mw-icon-question:lang(ar),
+.mw-icon-question:lang(fa),
+.mw-icon-question:lang(ur) {
+       -webkit-transform: scaleX(-1);
+       -ms-transform: scaleX(-1);
+       transform: scaleX(-1);
+}
+
+td.mw-submit {
+       white-space: nowrap;
+}
+
+table.mw-htmlform-nolabel td.mw-label {
+       width: 1px;
+}
+
+tr.mw-htmlform-vertical-label td.mw-label {
+       text-align: left !important;
+}
+
+.mw-htmlform-invalid-input td.mw-input input {
+       border-color: red;
+}
+
+.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
+       display: inline;
+       margin-right: 1em;
+       white-space: nowrap;
+}
+
+.mw-htmlform-matrix td {
+       padding-left: 0.5em;
+       padding-right: 0.5em;
+}
+
+input#wpSummary {
+       width: 80%;
+       margin-bottom: 1em;
+}
+
+/**
+ * Image captions.
+ *
+ * This is only meant to provide the most basic of styles, visual settings shouldn't be added here.
+ */
+
+/* @noflip */
+.mw-content-ltr .thumbcaption {
+       text-align: left;
+}
+
+/* @noflip */
+.mw-content-ltr .magnify {
+       float: right;
+}
+
+/* @noflip */
+.mw-content-rtl .thumbcaption {
+       text-align: right;
+}
+
+/* @noflip */
+.mw-content-rtl .magnify {
+       float: left;
+}
+
+/**
+ * Categories
+ */
+#catlinks {
+       /**
+        * Overrides text justification (user preference)
+        * See bug 31990
+        */
+       text-align: left;
+}
+
+.catlinks ul {
+       display: inline;
+       margin: 0;
+       padding: 0;
+       list-style: none;
+       list-style-type: none;
+       list-style-image: none;
+       vertical-align: middle !ie;
+}
+
+.catlinks li {
+       display: inline-block;
+       line-height: 1.25em;
+       border-left: 1px solid #AAA;
+       margin: 0.125em 0;
+       padding: 0 0.5em;
+       zoom: 1;
+       display: inline !ie;
+}
+
+.catlinks li:first-child {
+       padding-left: 0.25em;
+       border-left: none;
+}
+
+/* (bug 5346) make category redirects italic */
+.catlinks li a.mw-redirect {
+       font-style: italic;
+}
+
+/**
+ * Hidden categories
+ */
+.mw-hidden-cats-hidden {
+       display: none;
+}
+
+.catlinks-allhidden {
+       display: none;
+}
+
+/**
+ * Convenience links to edit block, delete and protect reasons
+ * and upload licenses
+ */
+p.mw-ipb-conveniencelinks,
+p.mw-protect-editreasons,
+p.mw-filedelete-editreasons,
+p.mw-delete-editreasons,
+p.mw-revdel-editreasons,
+p.mw-upload-editlicenses {
+       font-size: 90%;
+       text-align: right;
+}
+
+/* Page history styling */
+
+/* The auto-generated edit comments */
+.autocomment {
+       color: gray;
+}
+
+#pagehistory .history-user {
+       margin-left: 0.4em;
+       margin-right: 0.2em;
+}
+
+#pagehistory span.minor {
+       font-weight: bold;
+}
+
+#pagehistory li {
+       border: 1px solid white;
+}
+
+#pagehistory li.selected {
+       background-color: #f9f9f9;
+       border: 1px dashed #aaa;
+}
+
+.mw-history-revisiondelete-button, #mw-fileduplicatesearch-icon {
+       float: right;
+}
+
+/** Generic minor/bot/newpage styling (recent changes) */
+.newpage,
+.minoredit,
+.botedit {
+       font-weight: bold;
+}
+
+#shared-image-dup,
+#shared-image-conflict {
+       font-style: italic;
+}
+
+/**
+ * Recreating deleted page warning
+ * Reupload file warning
+ * Page protection warning
+ * incl. log entries for these warnings
+ */
+div.mw-warning-with-logexcerpt {
+       padding: 3px;
+       margin-bottom: 3px;
+       border: 2px solid #2F6FAB;
+       clear: both;
+}
+
+div.mw-warning-with-logexcerpt ul li {
+       font-size: 90%;
+}
+
+/* (show/hide) revision deletion links */
+span.mw-revdelundel-link,
+strong.mw-revdelundel-link {
+       font-size: 90%;
+}
+
+span.mw-revdelundel-hidden,
+input.mw-revdelundel-hidden {
+       visibility: hidden;
+}
+
+td.mw-revdel-checkbox,
+th.mw-revdel-checkbox {
+       padding-right: 10px;
+       text-align: center;
+}
+
+/* red links; see bug 36276 */
+a.new {
+       color: #BA0000;
+}
+
+/* feed links */
+a.feedlink {
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG).
+        * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
+       background-image: url(images/feed-icon.png);
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/feed-icon.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/feed-icon.svg);
+       background-position: center left;
+       background-repeat: no-repeat;
+       background-size: 12px 12px;
+       padding-left: 16px;
+}
+
+/* Plainlinks - this can be used to switch
+ * off special external link styling */
+.plainlinks a.external {
+       background: none !important;
+       padding: 0 !important;
+}
+
+/* External URLs should always be treated as LTR (bug 4330) */
+/* @noflip */ .rtl a.external.free,
+.rtl a.external.autonumber {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+/**
+ * wikitable class for skinning normal tables
+ * keep in sync with commonPrint.css
+ */
+table.wikitable {
+       margin: 1em 0;
+       background-color: #f9f9f9;
+       border: 1px #aaa solid;
+       border-collapse: collapse;
+       color: black;
+}
+
+table.wikitable > tr > th,
+table.wikitable > tr > td,
+table.wikitable > * > tr > th,
+table.wikitable > * > tr > td {
+       border: 1px #aaa solid;
+       padding: 0.2em;
+}
+
+table.wikitable > tr > th,
+table.wikitable > * > tr > th {
+       background-color: #f2f2f2;
+       text-align: center;
+}
+
+table.wikitable > caption {
+       font-weight: bold;
+}
+
+/* success and error messages */
+.error,
+.warning,
+.success {
+       font-size: larger;
+}
+
+.error {
+       color: #cc0000;
+}
+
+.warning {
+       color: #705000;
+}
+
+.success {
+       color: #009000;
+}
+
+.errorbox,
+.warningbox,
+.successbox {
+       border: 1px solid;
+       padding: .5em 1em;
+       margin-bottom: 1em;
+       display: -moz-inline-block;
+       display: inline-block;
+       zoom: 1;
+       *display: inline;
+}
+
+.errorbox h2,
+.warningbox h2,
+.successbox h2 {
+       font-size: 1em;
+       color: inherit;
+       font-weight: bold;
+       display: inline;
+       margin: 0 .5em 0 0;
+       border: none;
+}
+
+.errorbox {
+       color: #cc0000;
+       border-color: #fac5c5;
+       background-color: #fae3e3;
+}
+
+.warningbox {
+       color: #705000;
+       border-color: #fde29b;
+       background-color: #fdf1d1;
+}
+
+.successbox {
+       color: #009000;
+       border-color: #b7fdb5;
+       background-color: #e1fddf;
+}
+
+/* general info/warning box for SP */
+.mw-infobox {
+       border: 2px solid #ff7f00;
+       margin: 0.5em;
+       clear: left;
+       overflow: hidden;
+}
+
+.mw-infobox-left {
+       margin: 7px;
+       float: left;
+       width: 35px;
+}
+
+.mw-infobox-right {
+       margin: 0.5em 0.5em 0.5em 49px;
+}
+
+/* Note on preview page */
+.previewnote {
+       color: #c00;
+       margin-bottom: 1em;
+}
+
+.previewnote p {
+       text-indent: 3em;
+       margin: 0.8em 0;
+}
+
+.visualClear {
+       clear: both;
+}
+
+/**
+ * Data table style
+ *
+ * Transparent table with suddle borders
+ * and blue row-highlighting.
+ */
+.mw-datatable {
+       border-collapse: collapse;
+}
+
+.mw-datatable,
+.mw-datatable td,
+.mw-datatable th {
+       border: 1px solid #aaaaaa;
+       padding: 0 0.15em 0 0.15em;
+}
+
+.mw-datatable th {
+       background-color: #ddddff;
+}
+
+.mw-datatable td {
+       background-color: #ffffff;
+}
+
+.mw-datatable tr:hover td {
+       background-color: #eeeeff;
+}
+
+/* filetoc */
+ul#filetoc {
+       text-align: center;
+       border: 1px solid #aaaaaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       font-size: 95%;
+       margin-bottom: 0.5em;
+       margin-left: 0;
+       margin-right: 0;
+}
+
+#filetoc li {
+       display: inline;
+       list-style-type: none;
+       padding-right: 2em;
+}
+
+/* Classes for Exif data display */
+table.mw_metadata {
+       font-size: 0.8em;
+       margin-left: 0.5em;
+       margin-bottom: 0.5em;
+       width: 400px;
+}
+
+table.mw_metadata caption {
+       font-weight: bold;
+}
+
+table.mw_metadata th {
+       font-weight: normal;
+}
+
+table.mw_metadata td {
+       padding: 0.1em;
+}
+
+table.mw_metadata {
+       border: none;
+       border-collapse: collapse;
+}
+
+table.mw_metadata td,
+table.mw_metadata th {
+       text-align: center;
+       border: 1px solid #aaaaaa;
+       padding-left: 5px;
+       padding-right: 5px;
+}
+
+table.mw_metadata th {
+       background-color: #f9f9f9;
+}
+
+table.mw_metadata td {
+       background-color: #fcfcfc;
+}
+
+table.mw_metadata ul.metadata-langlist {
+       list-style-type: none;
+       list-style-image: none;
+       padding-right: 5px;
+       padding-left: 5px;
+       margin: 0;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+.mw-content-ltr ul,
+.mw-content-rtl .mw-content-ltr ul {
+       /* @noflip */
+       margin: 0.3em 0 0 1.6em;
+       padding: 0;
+}
+
+.mw-content-rtl ul,
+.mw-content-ltr .mw-content-rtl ul {
+       /* @noflip */
+       margin: 0.3em 1.6em 0 0;
+       padding: 0;
+}
+
+.mw-content-ltr ol,
+.mw-content-rtl .mw-content-ltr ol {
+       /* @noflip */
+       margin: 0.3em 0 0 3.2em;
+       padding: 0;
+}
+
+.mw-content-rtl ol,
+.mw-content-ltr .mw-content-rtl ol {
+       /* @noflip */
+       margin: 0.3em 3.2em 0 0;
+       padding: 0;
+}
+
+/* @noflip */
+.mw-content-ltr dd,
+.mw-content-rtl .mw-content-ltr dd {
+       margin-left: 1.6em;
+       margin-right: 0;
+}
+
+/* @noflip */
+.mw-content-rtl dd,
+.mw-content-ltr .mw-content-rtl dd {
+       margin-right: 1.6em;
+       margin-left: 0;
+}
+
+/* Galleries */
+/* These display attributes look nonsensical, but are needed to support IE and FF2 */
+/* Don't forget to update commonPrint.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;
+}
+
+.mw-ajax-loader {
+       /* @embed */
+       background-image: url(images/ajax-loader.gif);
+       background-position: center center;
+       background-repeat: no-repeat;
+       padding: 16px;
+       position: relative;
+       top: -16px;
+}
+
+.mw-small-spinner {
+       padding: 10px !important;
+       margin-right: 0.6em;
+       /* @embed */
+       background-image: url(images/spinner.gif);
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+
+/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */
+/* Languages like hi or ml require slightly more vertical space to show diacritics properly */
+h1:lang(anp),
+h1:lang(as),
+h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
+h1:lang(bho),
+h1:lang(bn),
+h1:lang(gu),
+h1:lang(hi),
+h1:lang(kn),
+h1:lang(ks),
+h1:lang(ml),
+h1:lang(mr),
+h1:lang(my),
+h1:lang(mai),
+h1:lang(ne),
+h1:lang(new),
+h1:lang(or),
+h1:lang(pa),
+h1:lang(pi),
+h1:lang(sa),
+h1:lang(ta),
+h1:lang(te) {
+       line-height: 1.6em !important;
+}
+
+h2:lang(anp), h3:lang(anp), h4:lang(anp), h5:lang(anp), h6:lang(anp),
+h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
+h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho),
+h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh),
+h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn),
+h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu),
+h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
+h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
+h2:lang(ks), h3:lang(ks), h4:lang(ks), h5:lang(ks), h6:lang(ks),
+h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
+h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
+h2:lang(my), h3:lang(my), h4:lang(my), h5:lang(my), h6:lang(my),
+h2:lang(mai), h3:lang(mai), h4:lang(mai), h5:lang(mai), h6:lang(mai),
+h2:lang(ne), h3:lang(ne), h4:lang(ne), h5:lang(ne), h6:lang(ne),
+h2:lang(new), h3:lang(new), h4:lang(new), h5:lang(new), h6:lang(new),
+h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
+h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
+h2:lang(pi), h3:lang(pi), h4:lang(pi), h5:lang(pi), h6:lang(pi),
+h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
+h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta),
+h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) {
+       line-height: 1.2em;
+}
+
+/* Localised ordered list numbering for some languages */
+ol:lang(bcc) li,
+ol:lang(bqi) li,
+ol:lang(fa) li,
+ol:lang(glk) li,
+ol:lang(kk-arab) li,
+ol:lang(mzn) li {
+       list-style-type: -moz-persian;
+       list-style-type: persian;
+}
+
+ol:lang(ckb) li {
+       list-style-type: -moz-arabic-indic;
+       list-style-type: arabic-indic;
+}
+
+ol:lang(hi) li,
+ol:lang(mr) li {
+       list-style-type: -moz-devanagari;
+       list-style-type: devanagari;
+}
+
+ol:lang(as) li,
+ol:lang(bn) li {
+       list-style-type: -moz-bengali;
+       list-style-type: bengali;
+}
+
+ol:lang(or) li {
+       list-style-type: -moz-oriya;
+       list-style-type: oriya;
+}
+
+#toc ul, .toc ul {
+       margin: .3em 0;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+/* @noflip */ .mw-content-ltr .toc ul,
+.mw-content-ltr #toc ul,
+.mw-content-rtl .mw-content-ltr .toc ul,
+.mw-content-rtl .mw-content-ltr #toc ul {
+       text-align: left;
+}
+
+/* @noflip */ .mw-content-rtl .toc ul,
+.mw-content-rtl #toc ul,
+.mw-content-ltr .mw-content-rtl .toc ul,
+.mw-content-ltr .mw-content-rtl #toc ul {
+       text-align: right;
+}
+
+/* @noflip */ .mw-content-ltr .toc ul ul,
+.mw-content-ltr #toc ul ul,
+.mw-content-rtl .mw-content-ltr .toc ul ul,
+.mw-content-rtl .mw-content-ltr #toc ul ul {
+       margin: 0 0 0 2em;
+}
+
+/* @noflip */ .mw-content-rtl .toc ul ul,
+.mw-content-rtl #toc ul ul,
+.mw-content-ltr .mw-content-rtl .toc ul ul,
+.mw-content-ltr .mw-content-rtl #toc ul ul {
+       margin: 0 2em 0 0;
+}
+
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+       direction: ltr;
+}
+
+/* tooltip styles */
+.mw-help-field-hint {
+       display: none;
+       margin-left: 2px;
+       margin-bottom: -8px;
+       padding: 0 0 0 15px;
+       /* @embed */
+       background-image: url(images/help-question.gif);
+       background-position: left center;
+       background-repeat: no-repeat;
+       cursor: pointer;
+       font-size: .8em;
+       text-decoration: underline;
+       color: #0645ad;
+}
+
+.mw-help-field-hint:hover {
+       /* @embed */
+       background-image: url(images/help-question-hover.gif);
+}
+
+.mw-help-field-data {
+       display: block;
+       background-color: #d6f3ff;
+       padding: 5px 8px 4px 8px;
+       border: 1px solid #5dc9f4;
+       margin-left: 20px;
+}
+
+#mw-clearyourcache,
+#mw-sitecsspreview,
+#mw-sitejspreview,
+#mw-usercsspreview,
+#mw-userjspreview {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+/* Correct user & content directionality when viewing a diff */
+.diff-currentversion-title,
+.diff {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+/* @noflip */ .diff-contentalign-right td {
+       direction: rtl;
+       unicode-bidi: embed;
+}
+
+/* @noflip */ .diff-contentalign-left td {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+.diff-multi,
+.diff-otitle,
+.diff-ntitle,
+.diff-lineno {
+       direction: ltr !important;
+       unicode-bidi: embed;
+}
+
+#mw-revision-info,
+#mw-revision-info-current,
+#mw-revision-nav {
+       direction: ltr;
+       display: inline;
+}
+
+/* Images */
+
+/* @noflip */ div.tright,
+div.floatright,
+table.floatright {
+       clear: right;
+       float: right;
+}
+
+/* @noflip */ div.tleft,
+div.floatleft,
+table.floatleft {
+       float: left;
+       clear: left;
+}
+
+div.floatright,
+table.floatright,
+div.floatleft,
+table.floatleft {
+       position: relative;
+}
+
+/* bug 12205 */
+#mw-credits a {
+       unicode-bidi: embed;
+}
+
+/* Accessibility */
+.mw-jump,
+#jump-to-nav {
+       overflow: hidden;
+       height: 0;
+       zoom: 1; /* http://webaim.org/techniques/skipnav/#iequirk */
+}
+
+/* Print footer should be hidden by default in screen. */
+.printfooter {
+       display: none;
+}
+
+/* For developers */
+.xdebug-error {
+       position: absolute;
+       z-index: 99;
+}
+
+.mw-editsection,
+.toctoggle,
+#jump-to-nav {
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+/* Display editsection links smaller and next to headings */
+.mw-editsection,
+.mw-editsection-like {
+       font-size: small;
+       font-weight: normal;
+       margin-left: 1em;
+       vertical-align: baseline;
+       /* Reset line-height; headings tend to have it set to larger values */
+       line-height: 1em;
+       /* As .mw-editsection is a <span> (inline element), it is treated as part */
+       /* of the heading content when selecting text by multiple clicks and thus */
+       /* selected together with heading content, despite the user-select: none; */
+       /* rule set above. This enforces non-selection without changing the look. */
+       display: inline-block;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+/* @noflip */
+.mw-content-ltr .mw-editsection,
+.mw-content-rtl .mw-content-ltr .mw-editsection {
+       margin-left: 1em;
+}
+
+/* @noflip */
+.mw-content-rtl .mw-editsection,
+.mw-content-ltr .mw-content-rtl .mw-editsection {
+       margin-right: 1em;
+}
+
+/* Prevent citations and subscripts from interfering with the line-height */
+sup,
+sub {
+       line-height: 1;
+}
diff --git a/resources/src/mediawiki.legacy/wikibits.js b/resources/src/mediawiki.legacy/wikibits.js
new file mode 100644 (file)
index 0000000..a403996
--- /dev/null
@@ -0,0 +1,204 @@
+/**
+ * MediaWiki legacy wikibits
+ */
+( function ( mw, $ ) {
+       var msg,
+               win = window,
+               ua = navigator.userAgent.toLowerCase(),
+               onloadFuncts = [];
+
+/**
+ * User-agent sniffing.
+ *
+ * @deprecated since 1.17 Use jquery.client instead
+ */
+
+msg = 'Use feature detection or module jquery.client instead.';
+
+mw.log.deprecate( win, 'clientPC', ua, msg );
+
+// Ignored dummy values
+mw.log.deprecate( win, 'is_gecko', false, msg );
+mw.log.deprecate( win, 'is_chrome_mac', false, msg );
+mw.log.deprecate( win, 'is_chrome', false, msg );
+mw.log.deprecate( win, 'webkit_version', false, msg );
+mw.log.deprecate( win, 'is_safari_win', false, msg );
+mw.log.deprecate( win, 'is_safari', false, msg );
+mw.log.deprecate( win, 'webkit_match', false, msg );
+mw.log.deprecate( win, 'is_ff2', false, msg );
+mw.log.deprecate( win, 'ff2_bugs', false, msg );
+mw.log.deprecate( win, 'is_ff2_win', false, msg );
+mw.log.deprecate( win, 'is_ff2_x11', false, msg );
+mw.log.deprecate( win, 'opera95_bugs', false, msg );
+mw.log.deprecate( win, 'opera7_bugs', false, msg );
+mw.log.deprecate( win, 'opera6_bugs', false, msg );
+mw.log.deprecate( win, 'is_opera_95', false, msg );
+mw.log.deprecate( win, 'is_opera_preseven', false, msg );
+mw.log.deprecate( win, 'is_opera', false, msg );
+mw.log.deprecate( win, 'ie6_bugs', false, msg );
+
+/**
+ * DOM utilities for handling of events, text nodes and selecting elements
+ *
+ * @deprecated since 1.17 Use jQuery instead
+ */
+msg = 'Use jQuery instead.';
+
+// Ignored dummy values
+mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
+mw.log.deprecate( win, 'onloadFuncts', [], msg );
+mw.log.deprecate( win, 'runOnloadHook', $.noop, msg );
+mw.log.deprecate( win, 'changeText', $.noop, msg );
+mw.log.deprecate( win, 'killEvt', $.noop, msg );
+mw.log.deprecate( win, 'addHandler', $.noop, msg );
+mw.log.deprecate( win, 'hookEvent', $.noop, msg );
+mw.log.deprecate( win, 'addClickHandler', $.noop, msg );
+mw.log.deprecate( win, 'removeHandler', $.noop, msg );
+mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg );
+mw.log.deprecate( win, 'getInnerText', function () { return ''; }, msg );
+
+// Run a function after the window onload event is fired
+mw.log.deprecate( win, 'addOnloadHook', function ( hookFunct ) {
+       if ( onloadFuncts ) {
+               onloadFuncts.push(hookFunct);
+       } else {
+               // If func queue is gone the event has happened already,
+               // run immediately instead of queueing.
+               hookFunct();
+       }
+}, msg );
+
+$( win ).on( 'load', function () {
+       var i, functs;
+
+       // Don't run twice
+       if ( !onloadFuncts ) {
+               return;
+       }
+
+       // Deference and clear onloadFuncts before running any
+       // hooks to make sure we don't miss any addOnloadHook
+       // calls.
+       functs = onloadFuncts.slice();
+       onloadFuncts = undefined;
+
+       // Execute the queued functions
+       for ( i = 0; i < functs.length; i++ ) {
+               functs[i]();
+       }
+} );
+
+/**
+ * Toggle checkboxes with shift selection
+ *
+ * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
+ */
+msg = 'Use jquery.checkboxShiftClick instead.';
+mw.log.deprecate( win, 'checkboxes', [], msg );
+mw.log.deprecate( win, 'lastCheckbox', null, msg );
+mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
+mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg );
+mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
+
+/**
+ * Add a button to the default editor toolbar
+ *
+ * @deprecated since 1.17 Use mw.toolbar instead
+ */
+mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
+mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
+
+/**
+ * Spinner creation, injection and removal
+ *
+ * @deprecated since 1.18 Use jquery.spinner instead
+ */
+mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
+mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
+
+/**
+ * Escape utilities
+ *
+ * @deprecated since 1.18 Use mw.html instead
+ */
+mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
+mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
+
+/**
+ * Display a message to the user
+ *
+ * @deprecated since 1.17 Use mediawiki.notify instead
+ * @param {string|HTMLElement} message To be put inside the message box
+ */
+mw.log.deprecate( win, 'jsMsg', function ( message ) {
+       if ( !arguments.length || message === '' || message === null ) {
+               return true;
+       }
+       if ( typeof message !== 'object' ) {
+               message = $.parseHTML( message );
+       }
+       mw.notify( message, { autoHide: true, tag: 'legacy' } );
+       return true;
+}, 'Use mediawiki.notify instead.' );
+
+/**
+ * Misc. utilities
+ *
+ * @deprecated since 1.17 Use mediawiki.util or jquery.accessKeyLabel instead
+ */
+msg = 'Use mediawiki.util instead.';
+mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
+mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
+msg = 'Use jquery.accessKeyLabel instead.';
+mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
+mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
+// mw.util.updateTooltipAccessKeys already generates a deprecation message.
+win.updateTooltipAccessKeys = function () {
+       return mw.util.updateTooltipAccessKeys.apply( null, arguments );
+};
+
+/**
+ * Wikipage import methods
+ */
+
+// included-scripts tracker
+win.loadedScripts = {};
+
+win.importScript = function ( page ) {
+       var uri = mw.config.get( 'wgScript' ) + '?title=' +
+               mw.util.wikiUrlencode( page ) +
+               '&action=raw&ctype=text/javascript';
+       return win.importScriptURI( uri );
+};
+
+win.importScriptURI = function ( url ) {
+       if ( win.loadedScripts[url] ) {
+               return null;
+       }
+       win.loadedScripts[url] = true;
+       var s = document.createElement( 'script' );
+       s.setAttribute( 'src', url );
+       s.setAttribute( 'type', 'text/javascript' );
+       document.getElementsByTagName( 'head' )[0].appendChild( s );
+       return s;
+};
+
+win.importStylesheet = function ( page ) {
+       var uri = mw.config.get( 'wgScript' ) + '?title=' +
+               mw.util.wikiUrlencode( page ) +
+               '&action=raw&ctype=text/css';
+       return win.importStylesheetURI( uri );
+};
+
+win.importStylesheetURI = function ( url, media ) {
+       var l = document.createElement( 'link' );
+       l.rel = 'stylesheet';
+       l.href = url;
+       if ( media ) {
+               l.media = media;
+       }
+       document.getElementsByTagName('head')[0].appendChild( l );
+       return l;
+};
+
+}( mediaWiki, jQuery ) );
index 8c28884..4a87b74 100644 (file)
  * See <http://lesscss.org/#-mixins> for more information about how to write mixins.
  */
 
-.background-image(@url) when (embeddable(@url)) {
-       background-image: embed(@url);
-       background-image: url(@url)!ie;
+.background-image(@url) {
+       background-image: e('/* @embed */') url(@url);
 }
 
-.background-image(@url) when not (embeddable(@url)) {
-       background-image: url(@url);
+.background-size(@width, @height) {
+       // Vendor prefix for certain older opera browsers e.g. nintendo ds
+       -o-background-size: @width @height;
+       // Vendor prefix is added to support Android 2
+       -webkit-background-size: @width @height;
+       background-size: @width @height;
 }
 
+
 .vertical-gradient(@startColor: gray, @endColor: white, @startPos: 0, @endPos: 100%) {
        background-color: @endColor;
        background-image: -moz-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Firefox 3.6+
  * We do not embed the fallback image on the assumption that the gain for old browsers
  * is not worth the harm done to modern ones.
  */
-.background-image-svg(@svg, @fallback) when (embeddable(@svg)) {
-       background-image: url(@fallback);
-       /* We don't need the !ie hack because this old IE uses the fallback already */
-       background-image: -webkit-linear-gradient(transparent, transparent), embed(@svg);
-       background-image: linear-gradient(transparent, transparent), embed(@svg);
-}
-
-.background-image-svg(@svg, @fallback) when not (embeddable(@svg)) {
+.background-image-svg(@svg, @fallback) {
        background-image: url(@fallback);
-       background-image: -webkit-linear-gradient(transparent, transparent), url(@svg);
-       background-image: linear-gradient(transparent, transparent), url(@svg);
-}
-
-/* Caution: Does not support localisable images */
-.list-style-image(@url) when (embeddable(@url)) {
-       list-style-image: embed(@url);
-       list-style-image: url(@url)!ie;
+       background-image: -webkit-linear-gradient(transparent, transparent), e('/* @embed */') url(@svg);
+       background-image: linear-gradient(transparent, transparent), e('/* @embed */') url(@svg);
 }
 
-.list-style-image(@url) when not (embeddable(@url)) {
-       list-style-image: url(@url);
+.list-style-image(@url) {
+       list-style-image: e('/* @embed */') url(@url);
 }
 
 .transition(@value) {
index 8a2741d..e91302b 100644 (file)
@@ -40,7 +40,7 @@
 // Text colors
 @colorText: @colorGray2;
 @colorTextLight: @colorGray6;
-@colorButtonText: @colorGray8;
+@colorButtonText: @colorGray5;
 @colorDisabledText: @colorGray12;
 @colorErrorText: #CC0000;
 
@@ -57,3 +57,6 @@
 @colorGrayLight: #ccc;
 @colorGrayLighter: #ddd;
 @colorGrayLightest: #eee;
+
+// Global border radius to be used to buttons and inputs
+@borderRadius: 2px;
index 83c2524..31c8fef 100644 (file)
@@ -1,12 +1,13 @@
-/* This is CLDRPluralRuleParser v1.1, ported to MediaWiki ResourceLoader */
+/* This is CLDRPluralRuleParser v1.1.3, ported to MediaWiki ResourceLoader */
 
 /**
 * CLDRPluralRuleParser.js
 * A parser engine for CLDR plural rules.
 *
-* Copyright 2012 GPLV3+, Santhosh Thottingal
+* Copyright 2012-2014 Santhosh Thottingal and other contributors
+* Released under the MIT license
+* http://opensource.org/licenses/MIT
 *
-* @version 0.1.0-alpha
 * @source https://github.com/santhoshtr/CLDRPluralRuleParser
 * @author Santhosh Thottingal <santhosh.thottingal@gmail.com>
 * @author Timo Tijhof
@@ -22,6 +23,8 @@
  */
 
 function pluralRuleParser(rule, number) {
+       'use strict';
+
        /*
        Syntax: see http://unicode.org/reports/tr35/#Language_Plural_Rules
        -----------------------------------------------------------------
@@ -44,14 +47,15 @@ function pluralRuleParser(rule, number) {
        decimalValue  = value ('.' value)?
        */
 
-       // we don't evaluate the samples section of the rule. Ignore it.
+       // We don't evaluate the samples section of the rule. Ignore it.
        rule = rule.split('@')[0].replace(/^\s*/, '').replace(/\s*$/, '');
 
        if (!rule.length) {
-               // empty rule or 'other' rule.
+               // Empty rule or 'other' rule.
                return true;
        }
-       // Indicates current position in the rule as we parse through it.
+
+       // Indicates the current position in the rule as we parse through it.
        // Shared among all parsing functions below.
        var pos = 0,
                operand,
@@ -87,15 +91,18 @@ function pluralRuleParser(rule, number) {
        debug('pluralRuleParser', rule, number);
 
        // Try parsers until one works, if none work return null
-
        function choice(parserSyntax) {
                return function() {
-                       for (var i = 0; i < parserSyntax.length; i++) {
-                               var result = parserSyntax[i]();
+                       var i, result;
+
+                       for (i = 0; i < parserSyntax.length; i++) {
+                               result = parserSyntax[i]();
+
                                if (result !== null) {
                                        return result;
                                }
                        }
+
                        return null;
                };
        }
@@ -103,46 +110,56 @@ function pluralRuleParser(rule, number) {
        // Try several parserSyntax-es in a row.
        // All must succeed; otherwise, return null.
        // This is the only eager one.
-
        function sequence(parserSyntax) {
-               var originalPos = pos;
-               var result = [];
-               for (var i = 0; i < parserSyntax.length; i++) {
-                       var res = parserSyntax[i]();
-                       if (res === null) {
+               var i, parserRes,
+                       originalPos = pos,
+                       result = [];
+
+               for (i = 0; i < parserSyntax.length; i++) {
+                       parserRes = parserSyntax[i]();
+
+                       if (parserRes === null) {
                                pos = originalPos;
+
                                return null;
                        }
-                       result.push(res);
+
+                       result.push(parserRes);
                }
+
                return result;
        }
 
        // Run the same parser over and over until it fails.
        // Must succeed a minimum of n times; otherwise, return null.
-
        function nOrMore(n, p) {
                return function() {
-                       var originalPos = pos;
-                       var result = [];
-                       var parsed = p();
+                       var originalPos = pos,
+                               result = [],
+                               parsed = p();
+
                        while (parsed !== null) {
                                result.push(parsed);
                                parsed = p();
                        }
+
                        if (result.length < n) {
                                pos = originalPos;
+
                                return null;
                        }
+
                        return result;
                };
        }
 
-       // Helpers -- just make parserSyntax out of simpler JS builtin types
+       // Helpers - just make parserSyntax out of simpler JS builtin types
        function makeStringParser(s) {
                var len = s.length;
+
                return function() {
                        var result = null;
+
                        if (rule.substr(pos, len) === s) {
                                result = s;
                                pos += len;
@@ -155,95 +172,122 @@ function pluralRuleParser(rule, number) {
        function makeRegexParser(regex) {
                return function() {
                        var matches = rule.substr(pos).match(regex);
+
                        if (matches === null) {
                                return null;
                        }
+
                        pos += matches[0].length;
+
                        return matches[0];
                };
        }
 
-       /*
-        * integer digits of n.
+       /**
+        * Integer digits of n.
         */
        function i() {
                var result = _i_();
+
                if (result === null) {
                        debug(' -- failed i', parseInt(number, 10));
+
                        return result;
                }
+
                result = parseInt(number, 10);
                debug(' -- passed i ', result);
+
                return result;
        }
 
-       /*
-        * absolute value of the source number (integer and decimals).
+       /**
+        * Absolute value of the source number (integer and decimals).
         */
        function n() {
                var result = _n_();
+
                if (result === null) {
                        debug(' -- failed n ', number);
+
                        return result;
                }
+
                result = parseFloat(number, 10);
                debug(' -- passed n ', result);
+
                return result;
        }
 
-       /*
-        * visible fractional digits in n, with trailing zeros.
+       /**
+        * Visible fractional digits in n, with trailing zeros.
         */
        function f() {
                var result = _f_();
+
                if (result === null) {
                        debug(' -- failed f ', number);
+
                        return result;
                }
+
                result = (number + '.').split('.')[1] || 0;
                debug(' -- passed f ', result);
+
                return result;
        }
 
-       /*
-        * visible fractional digits in n, without trailing zeros.
+       /**
+        * Visible fractional digits in n, without trailing zeros.
         */
        function t() {
                var result = _t_();
+
                if (result === null) {
                        debug(' -- failed t ', number);
+
                        return result;
                }
+
                result = (number + '.').split('.')[1].replace(/0$/, '') || 0;
                debug(' -- passed t ', result);
+
                return result;
        }
 
-       /*
-        * number of visible fraction digits in n, with trailing zeros.
+       /**
+        * Number of visible fraction digits in n, with trailing zeros.
         */
        function v() {
                var result = _v_();
+
                if (result === null) {
                        debug(' -- failed v ', number);
+
                        return result;
                }
+
                result = (number + '.').split('.')[1].length || 0;
                debug(' -- passed v ', result);
+
                return result;
        }
 
-       /*
-        * number of visible fraction digits in n, without trailing zeros.
+       /**
+        * Number of visible fraction digits in n, without trailing zeros.
         */
        function w() {
                var result = _w_();
+
                if (result === null) {
                        debug(' -- failed w ', number);
+
                        return result;
                }
+
                result = (number + '.').split('.')[1].replace(/0$/, '').length || 0;
                debug(' -- passed w ', result);
+
                return result;
        }
 
@@ -254,19 +298,27 @@ function pluralRuleParser(rule, number) {
        expression = choice([mod, operand]);
 
        function mod() {
-               var result = sequence([operand, whitespace, choice([_mod_, _percent_]), whitespace, value]);
+               var result = sequence(
+                       [operand, whitespace, choice([_mod_, _percent_]), whitespace, value]
+               );
+
                if (result === null) {
                        debug(' -- failed mod');
+
                        return null;
                }
+
                debug(' -- passed ' + parseInt(result[0], 10) + ' ' + result[2] + ' ' + parseInt(result[4], 10));
+
                return parseInt(result[0], 10) % parseInt(result[4], 10);
        }
 
        function not() {
                var result = sequence([whitespace, _not_]);
+
                if (result === null) {
                        debug(' -- failed not');
+
                        return null;
                }
 
@@ -276,120 +328,170 @@ function pluralRuleParser(rule, number) {
        // is_relation   = expr 'is' ('not')? value
        function is() {
                var result = sequence([expression, whitespace, choice([_is_]), whitespace, value]);
+
                if (result !== null) {
                        debug(' -- passed is : ' + result[0] + ' == ' + parseInt(result[4], 10));
+
                        return result[0] === parseInt(result[4], 10);
                }
+
                debug(' -- failed is');
+
                return null;
        }
 
        // is_relation   = expr 'is' ('not')? value
        function isnot() {
-               var result = sequence([expression, whitespace, choice([_isnot_, _isnot_sign_]), whitespace, value]);
+               var result = sequence(
+                       [expression, whitespace, choice([_isnot_, _isnot_sign_]), whitespace, value]
+               );
+
                if (result !== null) {
                        debug(' -- passed isnot: ' + result[0] + ' != ' + parseInt(result[4], 10));
+
                        return result[0] !== parseInt(result[4], 10);
                }
+
                debug(' -- failed isnot');
+
                return null;
        }
 
        function not_in() {
-               var result = sequence([expression, whitespace, _isnot_sign_, whitespace, rangeList]);
+               var i, range_list,
+                       result = sequence([expression, whitespace, _isnot_sign_, whitespace, rangeList]);
+
                if (result !== null) {
                        debug(' -- passed not_in: ' + result[0] + ' != ' + result[4]);
-                       var range_list = result[4];
-                       for (var i = 0; i < range_list.length; i++) {
+                       range_list = result[4];
+
+                       for (i = 0; i < range_list.length; i++) {
                                if (parseInt(range_list[i], 10) === parseInt(result[0], 10)) {
                                        return false;
                                }
                        }
+
                        return true;
                }
+
                debug(' -- failed not_in');
+
                return null;
        }
 
        // range_list    = (range | value) (',' range_list)*
        function rangeList() {
-               var result = sequence([choice([range, value]), nOrMore(0, rangeTail)]);
-               var resultList = [];
+               var result = sequence([choice([range, value]), nOrMore(0, rangeTail)]),
+                       resultList = [];
+
                if (result !== null) {
                        resultList = resultList.concat(result[0]);
+
                        if (result[1][0]) {
                                resultList = resultList.concat(result[1][0]);
                        }
+
                        return resultList;
                }
+
                debug(' -- failed rangeList');
+
                return null;
        }
 
        function rangeTail() {
                // ',' range_list
                var result = sequence([_comma_, rangeList]);
+
                if (result !== null) {
                        return result[1];
                }
+
                debug(' -- failed rangeTail');
+
                return null;
        }
 
        // range         = value'..'value
-
        function range() {
-               var i;
-               var result = sequence([value, _range_, value]);
+               var i, array, left, right,
+                       result = sequence([value, _range_, value]);
+
                if (result !== null) {
                        debug(' -- passed range');
-                       var array = [];
-                       var left = parseInt(result[0], 10);
-                       var right = parseInt(result[2], 10);
+
+                       array = [];
+                       left = parseInt(result[0], 10);
+                       right = parseInt(result[2], 10);
+
                        for (i = left; i <= right; i++) {
                                array.push(i);
                        }
+
                        return array;
                }
+
                debug(' -- failed range');
+
                return null;
        }
 
        function _in() {
+               var result, range_list, i;
+
                // in_relation   = expr ('not')? 'in' range_list
-               var result = sequence([expression, nOrMore(0, not), whitespace, choice([_in_, _equal_]), whitespace, rangeList]);
+               result = sequence(
+                       [expression, nOrMore(0, not), whitespace, choice([_in_, _equal_]), whitespace, rangeList]
+               );
+
                if (result !== null) {
                        debug(' -- passed _in:' + result);
-                       var range_list = result[5];
-                       for (var i = 0; i < range_list.length; i++) {
+
+                       range_list = result[5];
+
+                       for (i = 0; i < range_list.length; i++) {
                                if (parseInt(range_list[i], 10) === parseInt(result[0], 10)) {
                                        return (result[1][0] !== 'not');
                                }
                        }
+
                        return (result[1][0] === 'not');
                }
+
                debug(' -- failed _in ');
+
                return null;
        }
 
-       /*
-        * The difference between in and within is that in only includes integers in the specified range,
-        * while within includes all values.
+       /**
+        * The difference between "in" and "within" is that
+        * "in" only includes integers in the specified range,
+        * while "within" includes all values.
         */
-
        function within() {
+               var range_list, result;
+
                // within_relation = expr ('not')? 'within' range_list
-               var result = sequence([expression, nOrMore(0, not), whitespace, _within_, whitespace, rangeList]);
+               result = sequence(
+                       [expression, nOrMore(0, not), whitespace, _within_, whitespace, rangeList]
+               );
+
                if (result !== null) {
                        debug(' -- passed within');
-                       var range_list = result[5];
+
+                       range_list = result[5];
+
                        if ((result[0] >= parseInt(range_list[0], 10)) &&
                                (result[0] < parseInt(range_list[range_list.length - 1], 10))) {
+
                                return (result[1][0] !== 'not');
                        }
+
                        return (result[1][0] === 'not');
                }
+
                debug(' -- failed within ');
+
                return null;
        }
 
@@ -398,65 +500,83 @@ function pluralRuleParser(rule, number) {
 
        // and_condition = relation ('and' relation)*
        function and() {
-               var result = sequence([relation, nOrMore(0, andTail)]);
+               var i,
+                       result = sequence([relation, nOrMore(0, andTail)]);
+
                if (result) {
                        if (!result[0]) {
                                return false;
                        }
-                       for (var i = 0; i < result[1].length; i++) {
+
+                       for (i = 0; i < result[1].length; i++) {
                                if (!result[1][i]) {
                                        return false;
                                }
                        }
+
                        return true;
                }
+
                debug(' -- failed and');
+
                return null;
        }
 
        // ('and' relation)*
        function andTail() {
                var result = sequence([whitespace, _and_, whitespace, relation]);
+
                if (result !== null) {
                        debug(' -- passed andTail' + result);
+
                        return result[3];
                }
+
                debug(' -- failed andTail');
+
                return null;
 
        }
        //  ('or' and_condition)*
        function orTail() {
                var result = sequence([whitespace, _or_, whitespace, and]);
+
                if (result !== null) {
                        debug(' -- passed orTail: ' + result[3]);
+
                        return result[3];
                }
+
                debug(' -- failed orTail');
-               return null;
 
+               return null;
        }
 
        // condition     = and_condition ('or' and_condition)*
        function condition() {
-               var result = sequence([and, nOrMore(0, orTail)]);
+               var i,
+                       result = sequence([and, nOrMore(0, orTail)]);
+
                if (result) {
-                       for (var i = 0; i < result[1].length; i++) {
+                       for (i = 0; i < result[1].length; i++) {
                                if (result[1][i]) {
                                        return true;
                                }
                        }
-                       return result[0];
 
+                       return result[0];
                }
+
                return false;
        }
 
        result = condition();
-       /*
+
+       /**
         * For success, the pos must have gotten to the end of the rule
         * and returned a non-null.
-        * n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
+        * n.b. This is part of language infrastructure,
+        * so we do not throw an internationalizable message.
         */
        if (result === null) {
                throw new Error('Parse error at position ' + pos.toString() + ' for rule: ' + rule);
index 622e818..26c32a5 100644 (file)
@@ -2,23 +2,65 @@
  * Implement AJAX navigation for multi-page images so the user may browse without a full page reload.
  */
 ( function ( mw, $ ) {
-       var jqXhr, $multipageimage, $spinner;
+       var jqXhr, $multipageimage, $spinner,
+               cache = {}, cacheOrder = [];
 
-       /* Fetch the next page and use jQuery to swap the table.multipageimage contents.
+       /* Fetch the next page, caching up to 10 last-loaded pages.
         * @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).
+        * @return {jQuery.Promise}
         */
-       function loadPage( url, hist ) {
-               var $tr;
-               if ( jqXhr ) {
+       function fetchPageData( url ) {
+               if ( jqXhr && jqXhr.abort ) {
                        // Prevent race conditions and piling up pending requests
                        jqXhr.abort();
-                       jqXhr = undefined;
                }
+               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();
+               } );
 
-               // Add a new spinner if one doesn't already exist
-               if ( !$spinner ) {
+               // 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',
                        $multipageimage.empty().append( $spinner );
                }
 
-               // @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 ).done( function ( data ) {
-                       jqXhr = $spinner = undefined;
+               promise.done( function ( $contents ) {
+                       $spinner = undefined;
 
                        // Replace table contents
-                       $multipageimage.empty().append( $( data ).find( 'table.multipageimage' ).contents() );
+                       $multipageimage.empty().append( $contents.clone() );
 
                        bindPageNavigation( $multipageimage );
 
                                .extend( { title: mw.config.get( 'wgPageName' ), page: page } )
                                .toString();
 
-                       loadPage( uri );
+                       switchPage( uri );
                        e.preventDefault();
                } );
 
                $container.find( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
-                       loadPage( this.action + '?' + $( this ).serialize() );
+                       switchPage( this.action + '?' + $( this ).serialize() );
                        e.preventDefault();
                } );
        }
                        $( window ).on( 'popstate', function ( e ) {
                                var state = e.originalEvent.state;
                                if ( state && state.tag === 'mw-pagination' ) {
-                                       loadPage( location.href, true );
+                                       switchPage( location.href, true );
                                }
                        } );
                }
index a05a054..246cc81 100644 (file)
@@ -36,6 +36,7 @@
 
        // Things outside the wikipage content
        $( function () {
+               var $nodes;
 
                if ( !supportsPlaceholder ) {
                        // Exclude content to avoid hitting it twice for the (first) wikipage content
                }
 
                // Add accesskey hints to the tooltips
-               mw.util.updateTooltipAccessKeys();
+               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();
 
        } );
 
diff --git a/resources/src/mediawiki.skinning/content.css b/resources/src/mediawiki.skinning/content.css
new file mode 100644 (file)
index 0000000..7a41708
--- /dev/null
@@ -0,0 +1,227 @@
+/**
+ * MediaWiki style sheet for general styles on complex content
+ *
+ * Styles for complex things which are a standard part of page content
+ * (ie: the CSS classing built into the system), like the TOC.
+ */
+
+/* Table of Contents */
+#toc,
+.toc,
+.mw-warning {
+       border: 1px solid #aaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       font-size: 95%;
+}
+
+/**
+ * We want to display the ToC element with intrinsic width in block mode. The fit-content
+ * value for width is however not supported by large groups of browsers.
+ *
+ * We use display:table. Even though it should only contain other table-* display
+ * elements, there are no known problems with using this.
+ *
+ * Because IE < 8, FF 2 and other older browsers don't support display:table, we fallback to
+ * using inline-block mode, which features at least intrinsic width, but won't clear preceding
+ * inline elements. In practice inline elements surrounding the TOC are uncommon enough that
+ * this is an acceptable sacrifice.
+ */
+#toc,
+.toc {
+       display: -moz-inline-block;
+       display: inline-block;
+       display: table;
+
+       /* IE7 and earlier */
+       zoom: 1;
+       *display: inline;
+
+       padding: 7px;
+}
+
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+       border-collapse: collapse;
+}
+
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+       padding: 0;
+}
+
+#toc h2,
+.toc h2 {
+       display: inline;
+       border: none;
+       padding: 0;
+       font-size: 100%;
+       font-weight: bold;
+}
+
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+       text-align: center;
+}
+
+#toc ul,
+.toc ul {
+       list-style-type: none;
+       list-style-image: none;
+       margin-left: 0;
+       padding: 0;
+       text-align: left;
+}
+
+#toc ul ul,
+.toc ul ul {
+       margin: 0 0 0 2em;
+}
+
+#toc .toctoggle,
+.toc .toctoggle {
+       font-size: 94%;
+}
+
+.toccolours {
+       border: 1px solid #aaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       font-size: 95%;
+}
+
+/* Warning */
+.mw-warning {
+       margin-left: 50px;
+       margin-right: 50px;
+       text-align: center;
+}
+
+/* Images */
+/* @noflip */div.floatright, table.floatright {
+       margin: 0 0 .5em .5em;
+       border: 0;
+}
+
+div.floatright p {
+       font-style: italic;
+}
+
+/* @noflip */div.floatleft, table.floatleft {
+       margin: 0 .5em .5em 0;
+       border: 0;
+}
+
+div.floatleft p {
+       font-style: italic;
+}
+
+/* Thumbnails */
+div.thumb {
+       margin-bottom: .5em;
+       width: auto;
+       background-color: transparent;
+}
+
+div.thumbinner {
+       border: 1px solid #ccc;
+       padding: 3px;
+       background-color: #f9f9f9;
+       font-size: 94%;
+       text-align: center;
+       overflow: hidden;
+}
+
+html .thumbimage {
+       border: 1px solid #ccc;
+}
+
+html .thumbcaption {
+       border: none;
+       line-height: 1.4em;
+       padding: 3px;
+       font-size: 94%;
+       /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
+       text-align: left;
+}
+
+div.magnify {
+       /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
+       float: right;
+       margin-left: 3px;
+}
+
+div.magnify a {
+       display: block;
+       /* Hide the text… */
+       text-indent: 15px;
+       white-space: nowrap;
+       overflow: hidden;
+       /* …and replace it with the image */
+       width: 15px;
+       height: 11px;
+       /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
+       /* @embed */
+       background: url(images/magnify-clip-ltr.png) center center no-repeat;
+       /* Don't annoy people who copy-paste everything too much */
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+img.thumbborder {
+       border: 1px solid #dddddd;
+}
+
+/* Directionality-specific styles for thumbnails - their positioning depends on content language */
+
+/* @noflip */
+.mw-content-ltr .thumbcaption {
+       text-align: left;
+}
+
+/* @noflip */
+.mw-content-ltr .magnify {
+       float: right;
+       margin-left: 3px;
+       margin-right: 0;
+}
+
+/* @noflip */
+.mw-content-ltr div.magnify a {
+       /* @embed */
+       background-image: url(images/magnify-clip-ltr.png);
+}
+
+/* @noflip */
+.mw-content-rtl .thumbcaption {
+       text-align: right;
+}
+
+/* @noflip */
+.mw-content-rtl .magnify {
+       float: left;
+       margin-left: 0;
+       margin-right: 3px;
+}
+
+/* @noflip */
+.mw-content-rtl div.magnify a {
+       /* @embed */
+       background-image: url(images/magnify-clip-rtl.png);
+}
+
+/* @noflip */
+div.tright {
+       margin: .5em 0 1.3em 1.4em;
+}
+
+/* @noflip */
+div.tleft {
+       margin: .5em 1.4em 1.3em 0;
+}
diff --git a/resources/src/mediawiki.skinning/content.externallinks.css b/resources/src/mediawiki.skinning/content.externallinks.css
new file mode 100644 (file)
index 0000000..d23540d
--- /dev/null
@@ -0,0 +1,102 @@
+/*!
+ * Icons and colors for external links.
+ */
+
+/* Bug 66091 is blocking is from converting this file to LESS
+ * and using the .background-image-svg mixin. */
+
+/* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG).
+ * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
+
+.mw-body a.external,
+.link-https {
+       background: url(images/external-ltr.png) center right no-repeat;
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/external-ltr.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/external-ltr.svg);
+       padding-right: 15px;
+}
+
+.mw-body a.external[href^="mailto:"],
+.link-mailto {
+       background: url(images/mail.png) center right no-repeat;
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/mail.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/mail.svg);
+       padding-right: 15px;
+}
+
+.mw-body a.external[href^="ftp://"],
+.link-ftp {
+       background: url(images/ftp-ltr.png) center right no-repeat;
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/ftp-ltr.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/ftp-ltr.svg);
+       padding-right: 15px;
+}
+
+.mw-body a.external[href^="irc://"],
+.mw-body a.external[href^="ircs://"],
+.link-irc {
+       background: url(images/chat-ltr.png) center right no-repeat;
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/chat-ltr.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/chat-ltr.svg);
+       padding-right: 15px;
+}
+
+.mw-body a.external[href$=".ogg"], .mw-body a.external[href$=".OGG"],
+.mw-body a.external[href$=".mid"], .mw-body a.external[href$=".MID"],
+.mw-body a.external[href$=".midi"], .mw-body a.external[href$=".MIDI"],
+.mw-body a.external[href$=".mp3"], .mw-body a.external[href$=".MP3"],
+.mw-body a.external[href$=".wav"], .mw-body a.external[href$=".WAV"],
+.mw-body a.external[href$=".wma"], .mw-body a.external[href$=".WMA"],
+.link-audio {
+       background: url(images/audio-ltr.png) center right no-repeat;
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/audio-ltr.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/audio-ltr.svg);
+       padding-right: 15px;
+}
+
+.mw-body a.external[href$=".ogm"], .mw-body a.external[href$=".OGM"],
+.mw-body a.external[href$=".avi"], .mw-body a.external[href$=".AVI"],
+.mw-body a.external[href$=".mpeg"], .mw-body a.external[href$=".MPEG"],
+.mw-body a.external[href$=".mpg"], .mw-body a.external[href$=".MPG"],
+.link-video {
+       background: url(images/video.png) center right no-repeat;
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/video.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/video.svg);
+       padding-right: 15px;
+}
+
+.mw-body a.external[href$=".pdf"], .mw-body a.external[href$=".PDF"],
+.mw-body a.external[href*=".pdf#"], .mw-body a.external[href*=".PDF#"],
+.mw-body a.external[href*=".pdf?"], .mw-body a.external[href*=".PDF?"],
+.link-document {
+       background: url(images/document-ltr.png) center right no-repeat;
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/document-ltr.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/document-ltr.svg);
+       padding-right: 15px;
+}
+
+/* Interwiki styling */
+.mw-body a.extiw,
+.mw-body a.extiw:active {
+       color: #36b;
+}
+
+/* External link color */
+.mw-body a.external {
+       color: #36b;
+}
index 47c3526..a6515d2 100644 (file)
@@ -31,7 +31,7 @@
  * Styleguide 1.1.
  */
 span.reference {
-       font-size: smaller;
+       font-size: 80%;
        line-height: 1;
        vertical-align: super;
        unicode-bidi: -moz-isolate;
@@ -129,13 +129,3 @@ figure[typeof~='mw:Image/Frame'] > *:first-child > img,
 /* Hide the caption for frameless and plain floated images */
 figure[typeof~="mw:Image/Frameless"] > figcaption,
 figure[typeof~="mw:Image"] > figcaption { display: none }
-
-/*
- * Finally, some basic styling for Parsoid render testing.
- * Only Parsoid directly sets .mw-body-content directly on the body, so this
- * shouldn't affect anything else.
- */
-body.mw-body-content {
-       background-color: #fff;
-       padding: 0.8em;
-}
diff --git a/resources/src/mediawiki.skinning/elements.css b/resources/src/mediawiki.skinning/elements.css
new file mode 100755 (executable)
index 0000000..11962f8
--- /dev/null
@@ -0,0 +1,273 @@
+/**
+ * MediaWiki style sheet for general styles on basic content elements
+ *
+ * Styles for basic elements: links, lists, etc...
+ *
+ * This style sheet is used by the Monobook and Vector skins.
+ */
+
+/* Links */
+a {
+       text-decoration: none;
+       color: #0645ad;
+       background: none;
+}
+
+a:visited {
+       color: #0b0080;
+}
+
+a:active {
+       color: #faa700;
+}
+
+a:hover, a:focus {
+       text-decoration: underline;
+}
+
+a.stub {
+       color: #772233;
+}
+
+a.new, #p-personal a.new {
+       color: #ba0000;
+}
+
+a.new:visited, #p-personal a.new:visited {
+       color: #a55858;
+}
+
+/* Interwiki Styling */
+.mw-body a.extiw,
+.mw-body a.extiw:active {
+       color: #36b;
+}
+
+.mw-body a.extiw:visited {
+       color: #636;
+}
+
+.mw-body a.extiw:active {
+       color: #b63;
+}
+
+/* External links */
+.mw-body a.external {
+       color: #36b;
+}
+
+.mw-body a.external:visited {
+       color: #636; /* bug 3112 */
+}
+
+.mw-body a.external:active {
+       color: #b63;
+}
+
+/* Inline Elements */
+img {
+       border: none;
+       vertical-align: middle;
+}
+
+hr {
+       height: 1px;
+       color: #aaa;
+       background-color: #aaa;
+       border: 0;
+       margin: .2em 0;
+}
+
+/* Structural Elements */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+       color: black;
+       background: none;
+       font-weight: normal;
+       margin: 0;
+       overflow: hidden;
+       padding-top: .5em;
+       padding-bottom: .17em;
+       border-bottom: 1px solid #aaa;
+}
+
+h1 {
+       font-size: 188%;
+}
+
+h2 {
+       font-size: 150%;
+}
+
+h3,
+h4,
+h5,
+h6 {
+       border-bottom: none;
+       font-weight: bold;
+}
+
+h3 {
+       font-size: 128%;
+}
+
+h4 {
+       font-size: 116%;
+}
+
+h5 {
+       font-size: 108%;
+}
+
+h6 {
+       font-size: 100%;
+}
+
+/* Some space under the headers in the content area */
+h1,
+h2 {
+       margin-bottom: .6em;
+}
+
+h3,
+h4,
+h5 {
+       margin-bottom: .3em;
+}
+
+p {
+       margin: .4em 0 .5em 0;
+       line-height: 1.5em;
+}
+
+p img {
+       margin: 0;
+}
+
+ul {
+       line-height: 1.5em;
+       list-style-type: square;
+       margin: .3em 0 0 1.6em;
+       padding: 0;
+}
+
+ol {
+       line-height: 1.5em;
+       margin: .3em 0 0 3.2em;
+       padding: 0;
+       list-style-image: none;
+}
+
+li {
+       margin-bottom: .1em;
+}
+
+dt {
+       font-weight: bold;
+       margin-bottom: .1em;
+}
+
+dl {
+       margin-top: .2em;
+       margin-bottom: .5em;
+}
+
+dd {
+       line-height: 1.5em;
+       margin-left: 1.6em;
+       margin-bottom: .1em;
+}
+
+/* IE 6 and 7 lack support for quotes aroud the <q> element ('::before' and '::after'
+   pseudoelements, 'quotes' property). Let's italicize it instead (using the star hack). */
+q {
+       *font-style: italic;
+}
+
+pre, code, tt, kbd, samp, .mw-code {
+       /*
+        * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
+        * Specifying any valid, second value will trigger correct behavior without forcing a different font.
+        */
+       font-family: monospace, Courier;
+}
+
+code {
+       color: black;
+       background-color: #f9f9f9;
+       border: 1px solid #ddd;
+       border-radius: 2px;
+       padding: 1px 4px;
+}
+
+pre, .mw-code {
+       color: black;
+       background-color: #f9f9f9;
+       border: 1px solid #ddd;
+       padding: 1em;
+}
+
+/* Tables */
+table {
+       font-size: 100%;
+}
+
+/* Forms */
+fieldset {
+       border: 1px solid #2f6fab;
+       margin: 1em 0 1em 0;
+       padding: 0 1em 1em;
+       line-height: 1.5em;
+}
+
+fieldset.nested {
+       margin: 0 0 0.5em 0;
+       padding: 0 0.5em 0.5em;
+}
+
+legend {
+       padding: .5em;
+       font-size: 95%;
+}
+
+form {
+       border: none;
+       margin: 0;
+}
+
+textarea {
+       width: 100%;
+       padding: .1em;
+       display: block;
+       -moz-box-sizing: border-box;
+       -webkit-box-sizing: border-box;
+       box-sizing: border-box;
+}
+
+select {
+       vertical-align: top;
+}
+
+/* Emulate Center */
+.center {
+       width: 100%;
+       text-align: center;
+}
+
+*.center * {
+       margin-left: auto;
+       margin-right: auto;
+}
+
+/* Small for tables and similar */
+.small {
+       font-size: 94%;
+}
+
+table.small {
+       font-size: 100%;
+}
diff --git a/resources/src/mediawiki.skinning/images/audio-ltr.png b/resources/src/mediawiki.skinning/images/audio-ltr.png
new file mode 100644 (file)
index 0000000..8efc4f2
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/audio-ltr.png differ
diff --git a/resources/src/mediawiki.skinning/images/audio-ltr.svg b/resources/src/mediawiki.skinning/images/audio-ltr.svg
new file mode 100644 (file)
index 0000000..e27a5f5
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<g transform="translate(-36.467808,-258.39005)">
+<path style="opacity:1;fill:#3366bb;" d="m43.47,259.4-3,3-3,0,0,4,3,0,3,3zm-1,2.5,0,5-1.5-1.5-2.5,0,0-2,2.5,0z"/>
+<path style="opacity:1;fill:#15a5ea;" d="m43.9,262.5c0-0.6213,0.6213-1.243,1.243-0.6213,0,0,0.6213,0.6213,0.6213,2.485s-0.6213,2.485-0.6213,2.485c-0.6213,0.6213-1.243,0-1.243-0.6213,0,0,0.6213-0.6213,0.6213-1.864s-0.6213-1.864-0.6213-1.864z"/>
+<path style="opacity:1;fill:#15a5ea;" d="m45.76,261.2c0-0.6213,0.6213-1.243,1.243-0.6213,0,0,1.243,1.243,1.243,3.728s-1.243,3.728-1.243,3.728c-0.6213,0.6213-1.243,0-1.243-0.6213,0,0,1.243-1.243,1.243-3.107s-1.243-3.107-1.243-3.107z"/>
+</g>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/audio-rtl.png b/resources/src/mediawiki.skinning/images/audio-rtl.png
new file mode 100644 (file)
index 0000000..1afdf40
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/audio-rtl.png differ
diff --git a/resources/src/mediawiki.skinning/images/audio-rtl.svg b/resources/src/mediawiki.skinning/images/audio-rtl.svg
new file mode 100644 (file)
index 0000000..683bbcd
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<g transform="translate(-36.467808,-258.39005)">
+<path style="opacity:1;fill:#3366bb;" d="m42.47,259.4,3,3,3,0,0,4-3,0-3,3zm1,2.5,0,5,1.5-1.5,2.5,0,0-2-2.5,0z"/>
+<path style="opacity:1;fill:#15a5ea;" d="m42.04,262.5c0-0.6213-0.6213-1.243-1.243-0.6213,0,0-0.6213,0.6213-0.6213,2.485s0.6213,2.485,0.6213,2.485c0.6213,0.6213,1.243,0,1.243-0.6213,0,0-0.6213-0.6213-0.6213-1.864s0.6213-1.864,0.6213-1.864z"/>
+<path style="opacity:1;fill:#15a5ea;" d="m40.17,261.2c0-0.6213-0.6213-1.243-1.243-0.6213,0,0-1.243,1.243-1.243,3.728s1.243,3.728,1.243,3.728c0.6213,0.6213,1.243,0,1.243-0.6213,0,0-1.243-1.243-1.243-3.107s1.243-3.107,1.243-3.107z"/>
+</g>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/chat-ltr.png b/resources/src/mediawiki.skinning/images/chat-ltr.png
new file mode 100644 (file)
index 0000000..624ecec
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/chat-ltr.png differ
diff --git a/resources/src/mediawiki.skinning/images/chat-ltr.svg b/resources/src/mediawiki.skinning/images/chat-ltr.svg
new file mode 100644 (file)
index 0000000..bd5329e
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<g transform="translate(-36.467808,-258.39005)">
+<path style="opacity:1;fill:#3366bb;" d="m38.09,260.4-0.6213,0.6213,0,5.757,0.6213,0.6213,1.689,0-0.6213,2.728,4.311-2.728,4.379,0,0.6213-0.6213,0-5.757-0.6213-0.6213zm0.3787,1,9,0,0,5-4,0-2.902,1.897,0.9021-1.897-3,0z"/>
+</g>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/chat-rtl.png b/resources/src/mediawiki.skinning/images/chat-rtl.png
new file mode 100644 (file)
index 0000000..f90fa33
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/chat-rtl.png differ
diff --git a/resources/src/mediawiki.skinning/images/chat-rtl.svg b/resources/src/mediawiki.skinning/images/chat-rtl.svg
new file mode 100644 (file)
index 0000000..b86218f
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<g transform="translate(-36.467808,-258.39005)">
+<path style="opacity:1;fill:#3366bb;" d="m47.85,260.4,0.6213,0.6213,0,5.757-0.6213,0.6213-1.689,0,0.6213,2.728-4.311-2.728-4.379,0-0.6213-0.6213,0-5.757,0.6213-0.6213zm-0.3787,1-9,0,0,5,4,0,2.902,1.897-0.9021-1.897,3,0z"/>
+</g>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/document-ltr.png b/resources/src/mediawiki.skinning/images/document-ltr.png
new file mode 100644 (file)
index 0000000..4ea9373
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/document-ltr.png differ
diff --git a/resources/src/mediawiki.skinning/images/document-ltr.svg b/resources/src/mediawiki.skinning/images/document-ltr.svg
new file mode 100644 (file)
index 0000000..4396098
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<path style="opacity:1;fill:#15a5ea;" d="m7.5,2,0,3,2.5,0,1-1-2.5,0,0-3z"/>
+<path style="opacity:1;fill:#3366bb;" d="m3,1,0,10,8,0,0-7-2.5-3zm1,1,4,0,2,2.5,0,5.5-6,0z"/>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/document-rtl.png b/resources/src/mediawiki.skinning/images/document-rtl.png
new file mode 100644 (file)
index 0000000..c281677
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/document-rtl.png differ
diff --git a/resources/src/mediawiki.skinning/images/document-rtl.svg b/resources/src/mediawiki.skinning/images/document-rtl.svg
new file mode 100644 (file)
index 0000000..c37dadc
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<path style="opacity:1;fill:#15a5ea;" d="m5.5,2,0,3-2.5,0-1-1,2.5,0,0-3z"/>
+<path style="opacity:1;fill:#3366bb;" d="m10,1,0,10-8,0,0-7,2.5-3zm-1,1-4,0-2,2.5,0,5.5,6,0z"/>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/external link icons.svg b/resources/src/mediawiki.skinning/images/external link icons.svg
new file mode 100644 (file)
index 0000000..6a67993
--- /dev/null
@@ -0,0 +1,697 @@
+<?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="13"
+   height="110"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="external link icons.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="15.999999"
+     inkscape:cx="10.40536"
+     inkscape:cy="65.686256"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer5"
+     showgrid="true"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1283"
+     inkscape:window-height="711"
+     inkscape:window-x="1790"
+     inkscape:window-y="-6"
+     inkscape:window-maximized="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3246"
+       empspacing="4"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0px"
+       originy="-27.999997px" />
+  </sodipodi:namedview>
+  <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 />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="base"
+     style="display:none"
+     transform="translate(-505,-869.36218)">
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646"
+       width="13"
+       height="12.999996"
+       x="505"
+       y="885.36218" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646-4"
+       width="13"
+       height="12.999998"
+       x="505"
+       y="901.36218" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646-4-6"
+       width="13"
+       height="12.999996"
+       x="505"
+       y="917.36218"
+       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646-4-6-9"
+       width="13"
+       height="12.999996"
+       x="505"
+       y="933.36218" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646-4-6-6"
+       width="13"
+       height="12.999996"
+       x="505"
+       y="950.36218" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646-4-6-2"
+       width="13"
+       height="12.999998"
+       x="505"
+       y="966.36218" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       id="rect4646-44"
+       width="13"
+       height="12.999996"
+       x="505"
+       y="869.36218" />
+  </g>
+  <g
+     inkscape:label="sketch 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-505,-869.36218)"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507,870.36218 0,5 3,0 4,4 0,-13 -4,4 z"
+       id="path3194"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 517,869.36218 c 1,2 1,5 0,7"
+       id="path3196"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 520,867.36218 c 2,2 2,9 0,11"
+       id="path3198"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,989.90562 0,15.99988 13,0 0,-10.99988 -5,-5 z"
+       id="path3200"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 506.93861,918.90546 0,11.5 15,0 0,-11.5 z"
+       id="path3202"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 506.93861,918.90546 7.5,6 7.5,-6"
+       id="path3204"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,890.90546 3,0"
+       id="path3212"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,893.90546 3,0"
+       id="path3214"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,899.90546 3,0"
+       id="path3218"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,902.90546 3,0"
+       id="path3220"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 517.93861,890.90546 3,0"
+       id="path3222"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,896.90546 13,0"
+       id="path3224"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 517.93861,893.90546 3,0"
+       id="path3226"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 517.93861,899.90546 3,0"
+       id="path3230"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 517.93861,902.90546 3,0"
+       id="path3232"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 510.93861,890.90546 0,12 7,0 0,-12 z"
+       id="path3206"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,888.90546 0,16"
+       id="path3208"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 520.93861,888.90546 0,16"
+       id="path3210"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 515.93861,989.90562 0,5 5,0"
+       id="path3234"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 513.93861,969.40546 c -2,0 -5,0 -7,0 l 0,10.99995 11,5e-5 c 0,-2.33332 0,-4.66668 0,-7"
+       id="path3236"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none"
+       d="m 513.93861,976.40546 5,-4 3,3 0,-10 -10,0 3,3 -4,5"
+       id="path3242"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 506.93861,940.40546 15,0 0,10 -6,0 -6,4 1,-4 -4,0 z"
+       id="path3244"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 509.93861,972.40546 c 2,1 4,3 5,5"
+       id="path4641"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="sketch 2"
+     style="display:none"
+     transform="translate(0,-6.0000106)">
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 8.4921988,1.0623917 -4.0641234,4.064123 -3.2512987,0 0,5.6897733 3.2512987,0 4.0641234,4.064124 z m -1.6256494,4.064124 0,5.6897733 -1.6256493,-1.6256493 -2.438474,-1e-6 0,-2.438474 2.438474,1e-6 z"
+       id="path4755-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 9.3050235,5.1265157 c 0,-0.812824 0.8128245,-1.625649 1.6256495,-0.812824 0,0 0.812825,0.812824 0.812825,3.251298 0,2.4384743 -0.812825,3.2512993 -0.812825,3.2512993 -0.812825,0.812825 -1.6256495,0 -1.6256495,-0.812825 0,0 0.8128245,-0.8128243 0.8128245,-2.4384743 0,-1.625649 -0.8128245,-2.438474 -0.8128245,-2.438474 z"
+       id="path4760-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 11.743498,3.5008667 c 0,-0.812825 0.812824,-1.625649 1.625649,-0.812825 0,0 1.625649,1.62565 1.625649,4.876948 0,3.2512993 -1.625649,4.8769483 -1.625649,4.8769483 -0.812825,0.812825 -1.625649,0 -1.625649,-0.812824 0,0 1.625649,-1.62565 1.625649,-4.0641243 0,-2.438474 -1.625649,-4.064123 -1.625649,-4.064123 z"
+       id="path4762-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2.8024261,23.008658 0,0.812825 10.5667209,0 0,-0.812825 z"
+       id="path4772"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2.8024261,33.575379 10.5667209,0 0,-0.812825 -10.5667209,0 z"
+       id="path4774"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2.8024261,25.447132 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
+       id="path4782"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2.8024261,30.32408 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
+       id="path4778"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2.8024261,28.698431 10.5667209,0 0,-0.812825 -10.5667209,0 z"
+       id="path4780"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 5.2409001,27.479194 0,1.625649 5.6897729,0 0,-1.625649 z"
+       id="path4793"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 4.4280754,23.008658 0,10.56672 7.3154226,0 0,-10.56672 z m 1.6256494,1.625649 4.0641232,0 0,7.315422 -4.0641232,0 z"
+       id="path4768"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 1.9896014,21.383009 1.6256493,0 0,13.818019 -1.6256493,0 z"
+       id="path4764"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 12.556322,21.383009 1.62565,0 0,13.818019 -1.62565,0 z"
+       id="path4766"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 1.9896014,44.954923 6.096185,5.689773 6.0961856,-5.689773 -0.812825,-0.812825 -1.625649,0.813196 -3.6577116,3.251298 -3.657711,-3.251298 -1.6256493,-0.813196 z"
+       id="path4800-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 1.1767767,43.329273 0,11.379545 13.8180193,0 0,-11.379545 z m 1.6256494,1.625649 10.5667209,0 0,8.128247 -10.5667209,0 z"
+       id="path4795-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 1.9896014,62.024243 -0.8128247,0.812824 0,8.128247 0.8128247,0.812825 2.438474,0 -0.8128247,3.251297 5.6897728,-3.251297 4.8769485,0 0.812824,-0.812825 0,-8.128247 -0.812824,-0.812824 z m 0.8128247,1.625649 10.5667209,0 0,6.502598 -4.0641235,0 -3.5815088,2.133664 0.9144278,-2.133664 -3.8355164,0 z"
+       id="path4802-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 4.4280754,82.344856 10.5667206,0 0,10.56672 -3.251298,-3.25129 -3.2512992,2.43847 -0.8128247,-0.81282 4.0641239,-3.2513 1.625649,1.62565 0,-5.68978 -5.6897729,0 1.6256494,1.62565 -3.2512987,4.06413 -0.8128247,-0.81283 2.438474,-3.2513 z"
+       id="path4807-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 8.4921988,85.596156 -7.3154221,0 0,10.56672 10.5667213,0 0,-7.31542 -1.62565,0.81283 0,4.87694 -7.3154219,0 0,-7.31542 4.876948,0 z"
+       id="path4809-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 8.4921988,103.47831 0,4.87694 4.8769482,0 0,-1.62565 -3.251299,0 0,-3.25129 z"
+       id="path4818-67"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 1.9896014,102.66548 0,13.81802 12.1923706,0 0,-10.13799 -3.657711,-3.68003 z m 1.6256493,1.62565 6.5025973,0 2.438474,2.43847 0,8.12825 -8.9410713,0 z"
+       id="path4813-2"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 3.6152507,88.847456 c 0,-0.81282 0.8128247,-0.81282 0.8128247,-0.81282 2.438474,0.81282 4.0641234,2.43847 4.8769481,4.87694 0,0 0,0.81283 -0.8128247,0.81283 -1.6256494,-2.43847 -2.438474,-3.2513 -4.8769481,-4.87695 z"
+       id="path4822-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Layer"
+     style="display:none"
+     transform="translate(-10,-26.000007)">
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 19,20.999995 -4,4 -3,0 0,6 3,0 4,4 z m -1,2.5 0,9 -2.6,-2.5 -2.4,0 0,-4 2.5,0 z"
+       id="path4755"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none"
+       d="m 19.75,24.999995 c 0,-1 0.75,-1 0.75,-1 0,0 1.5,1.029412 1.5,3.5 0,2.470588 -1.5,3.5 -1.5,3.5 0,0 -0.75,0 -0.75,-1 0,0 1,-0.852941 1,-2.5 0,-1.647059 -1,-2.5 -1,-2.5 z"
+       id="path4760"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none"
+       d="m 22.25,23.999995 c 0,-1 0.75,-1 0.75,-1 0,0 2,1.205882 2,4.5 0,3.294118 -2,4.5 -2,4.5 0,0 -0.75,0 -0.75,-1 0,0 1.5,-1.029412 1.5,-3.5 0,-2.470588 -1.5,-3.5 -1.5,-3.5 z"
+       id="path4762"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 31.4375,79.875 -1,1 0,10 1,1 3,0 -1,4 7,-4 6,0 1,-1 0,-10 -1,-1 z m 1,2 13,0 0,8 -5,0 -4.40625,2.625 1.125,-2.625 -4.71875,0 z"
+       id="path4802"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 35.125,98.8125 13,0 0,13 -4,-4 -4,3 -1,-1 5,-4 2,2 0,-7 -7,0 2,2 -4,5 -1,-1 3,-4 z"
+       id="path4807"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 40.125,102.8125 -9,0 0,13 13,0 0,-9 -2,1 0,6 -9,0 0,-9 6,0 z"
+       id="path4809"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none"
+       d="m 34.125,106.8125 c 0,-1 1,-1 1,-1 3,1 5,3 6,6 0,0 0,1 -1,1 -2,-3 -3,-4 -6,-6 z"
+       id="path4822"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       d="m 12,50.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
+       id="rect4841"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       d="m 12,44.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
+       id="rect4843"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       d="m 12,52.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
+       id="rect4843-1"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       d="m 12,41.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
+       id="rect4843-17"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       d="m 12,47.499995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
+       id="rect4841-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <rect
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4835"
+       width="7"
+       height="2"
+       x="4"
+       y="27"
+       transform="translate(10,19.999995)" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 2,21 1,0 0,14 -1,0 z"
+       id="path4826"
+       inkscape:connector-curvature="0"
+       transform="translate(10,19.999995)"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 13,21 1,0 0,14 -1,0 z"
+       id="path4828"
+       inkscape:connector-curvature="0"
+       transform="translate(10,19.999995)"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 4,22 0,12 8,0 0,-12 z m 1,1 6,0 0,10 -6,0 z"
+       transform="translate(10,19.999995)"
+       id="path4830"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <rect
+       style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4837"
+       width="8"
+       height="1"
+       x="4"
+       y="22"
+       transform="translate(10,19.999995)" />
+    <rect
+       style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4839"
+       width="8"
+       height="1"
+       x="4"
+       y="33"
+       transform="translate(10,19.999995)" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none"
+       d="m 12,64.999995 6,5 6,-5 0.53033,-1.45299 -1.28033,0.45299 -5.25,4.5 -5.25,-4.5 -1.236136,-0.53033 z"
+       id="path4910"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 11,62.999995 0,10 14,0 0,-10 z m 1,1 12,0 0,8 -12,0 z"
+       id="path4905"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 19,121 0,5 5,0 -1,-1 -3,0 0,-3 z"
+       id="path4818-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 12,121 0,14 12,0 0,-10 -4,-4 z m 1,1 6.5,0 3.5,3.5 0,8.5 -10,0 z"
+       id="path4813-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Layer#1"
+     style="opacity:0.98999999"
+     transform="translate(0,-6.0000106)">
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 7,23.000004 -3,3 -3,0 0,4 3,0 3,3 z m -1,2.500001 0,5 -1.5,-1.500001 -2.5,0 0,-2 2.5,0 z"
+       id="path4755-9-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 7.4319858,26.075368 c 0,-0.621323 0.6213237,-1.242647 1.2426477,-0.621323 0,0 0.6213228,0.621323 0.6213228,2.485294 0,1.863971 -0.6213228,2.485294 -0.6213228,2.485294 -0.621324,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 0.6213237,-0.621324 0.6213237,-1.863971 0,-1.242648 -0.6213237,-1.863971 -0.6213237,-1.863971 z"
+       id="path4760-1-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 9.2959563,24.832721 c 0,-0.621324 0.6213228,-1.242647 1.2426477,-0.621324 0,0 1.242646,1.242648 1.242646,3.727942 0,2.485294 -1.242646,3.727941 -1.242646,3.727941 -0.6213249,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 1.2426477,-1.242647 1.2426477,-3.106618 0,-1.863971 -1.2426477,-3.106618 -1.2426477,-3.106618 z"
+       id="path4762-8-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+       d="m 2.4916056,40.000004 0,0.621323 8.0979164,0 0,-0.621323 z"
+       id="path4772-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+       d="m 2.4916056,48.000004 8.0979164,0 0,-0.621324 -8.0979164,0 z"
+       id="path4774-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+       d="m 2.4916056,41.919118 0,0.621323 1.8687499,0 0,-0.621323 z m 6.2291665,0 0,0.621323 1.8687499,0 0,-0.621323 z"
+       id="path4782-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+       d="m 2.4916056,45.589344 0,0.621322 1.8687499,0 0,-0.621322 z m 6.2291665,0 0,0.621322 1.8687499,0 0,-0.621322 z"
+       id="path4778-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+       d="m 2.4916056,44.404412 8.0979164,0 0,-0.621323 -8.0979164,0 z"
+       id="path4780-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 4.3603555,43.472427 0,1.242647 4.3604166,0 0,-1.242647 z"
+       id="path4793-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 4,40.000004 0,8 5,0 0,-8 z m 1,1 3,0 0,6 -3,0 z"
+       id="path4768-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2,39.000004 1,0 0,10 -1,0 z"
+       id="path4764-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 10,39.000004 1,0 0,10 -1,0 z"
+       id="path4766-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="M 1.8400738,58.055766 6.5000005,62.405031 11.159927,58.055766 10.538604,57.434442 9.2959563,58.056049 6.5000005,60.541343 3.7040445,58.056049 2.4613977,57.434442 z"
+       id="path4800-4-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 1,57.000008 0,8 11,0 0,-8 z m 1,1 9,0 0,6 -9,0 z"
+       id="path4795-8-2"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc"
+       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="M 1.6213238,72.000004 1,72.621328 l 0,5.757352 0.6213238,0.621324 1.6894529,0 L 2.6894528,81.727943 7,79.000004 l 4.378677,0 L 12,78.37868 12,72.621328 11.378677,72.000004 z m 0.3786762,1 9,0 0,5 -4,0 L 4.0978858,79.896603 5,78.000004 l -3,0 z"
+       id="path4802-8-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 5,88.000004 7,0 0,7 -2,-2 -3,2 0,-1 3,-2.249999 1,1 0,-3.750001 -3.75,0 1,1 -2.25,3 -1,0 2,-3 z"
+       id="path4807-5-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 7,90.000004 -5,0 0,8 8,0 0,-5 -1,0 0,4 -6,0 0,-6 4,0 z"
+       id="path4809-7-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 7.5,105.00001 0,3 2.5,0 1,-1 -2.5,0 0,-3 z"
+       id="path4818-67-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 3,104 0,10 8,1e-5 0,-7 -2.5,-3 z m 1,1 4,1e-5 2,2.50001 0,5.49999 -6,0 z"
+       id="path4813-2-2"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 4.0827206,92.533089 c 0,-0.621319 0.6213239,-0.621319 0.6213239,-0.621319 1.8639706,0.621319 3.1066175,1.863968 3.7279413,3.727935 0,0 0,0.621328 -0.6213238,0.621328 C 6.5680151,94.397065 5.9466913,93.775738 4.0827206,92.533089 z"
+       id="path4822-8-2"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
+       d="m 1,8.500006 0,7.5001 1,-0.9872 0,-6.0129 2,0 2,1 4,-2e-4 0,2.0002 1,0 0,-2.5 -0.5,-0.5002 -4.5,2e-4 -2,-1 -2.5,0 z"
+       id="path3209"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccccc" />
+    <path
+       style="fill:#16a4e8;fill-opacity:1;stroke:none;display:inline"
+       d="m 6,11.000106 -1,-10e-5 -2.5,0 -0.5,0.5 -1,4.5001 10,-10e-5 0,-4.4998 -0.5,-0.5 z m 0,1 4,-10e-5 0,3 -7.75,-1e-4 0.75,-3.0001 2,0 z"
+       id="path3215"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccccc" />
+    <path
+       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
+       d="m 2,17.000006 0,1 8,0 0,-1 z"
+       id="path3247"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
+       d="m 5,15.500006 0,2 2,0 0,-2 c 0,-0.5 -2,-0.5 -2,0 z"
+       id="path3249"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/external-ltr.png b/resources/src/mediawiki.skinning/images/external-ltr.png
new file mode 100644 (file)
index 0000000..75750ef
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/external-ltr.png differ
diff --git a/resources/src/mediawiki.skinning/images/external-ltr.svg b/resources/src/mediawiki.skinning/images/external-ltr.svg
new file mode 100644 (file)
index 0000000..e914b7d
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<g transform="translate(-36.467808,-258.39005)">
+<path style="opacity:1;fill:#3366bb;" d="m41.47,259.4,7,0,0,7-2-2-3,2,0-1,3-2.25,1,1,0-3.75-3.75,0,1,1-2.25,3-1,0,2-3z"/>
+<path style="opacity:1;fill:#3366bb;" d="m43.47,261.4-5,0,0,8,8,0,0-5-1,0,0,4-6,0,0-6,4,0z"/>
+<path style="opacity:1;fill:#15a5ea;" d="m40.55,263.9c0-0.6213,0.6213-0.6213,0.6213-0.6213,1.864,0.6213,3.107,1.864,3.728,3.728,0,0,0,0.6213-0.6213,0.6213-1.243-1.864-1.864-2.485-3.728-3.728z"/>
+</g>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/external-rtl.png b/resources/src/mediawiki.skinning/images/external-rtl.png
new file mode 100644 (file)
index 0000000..7b56aaa
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/external-rtl.png differ
diff --git a/resources/src/mediawiki.skinning/images/external-rtl.svg b/resources/src/mediawiki.skinning/images/external-rtl.svg
new file mode 100644 (file)
index 0000000..698c616
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<g transform="translate(-36.467808,-258.39005)">
+<path style="opacity:1;fill:#3366bb;" d="m44.47,259.4-7,0,0,7,2-2,3,2,0-1-3-2.25-1,1,0-3.75,3.75,0-1,1,2.25,3,1,0-2-3z"/>
+<path style="opacity:1;fill:#3366bb;" d="m42.47,261.4,5,0,0,8-8,0,0-5,1,0,0,4,6,0,0-6-4,0z"/>
+<path style="opacity:1;fill:#15a5ea;" d="m45.39,263.9c0-0.6213-0.6213-0.6213-0.6213-0.6213-1.864,0.6213-3.107,1.864-3.728,3.728l0.6213,0.6213c1.243-1.864,1.864-2.485,3.728-3.728z"/>
+</g>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/ftp-ltr.png b/resources/src/mediawiki.skinning/images/ftp-ltr.png
new file mode 100644 (file)
index 0000000..f940b06
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/ftp-ltr.png differ
diff --git a/resources/src/mediawiki.skinning/images/ftp-ltr.svg b/resources/src/mediawiki.skinning/images/ftp-ltr.svg
new file mode 100644 (file)
index 0000000..3a90c31
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<g transform="translate(-136.35715,-374.43362)">
+<path style="opacity:1;fill:#3465ba;" d="m137.4,376.9,0,7.5,1-0.9872,0-6.013,2,0,2,1,4-0.0002,0,2,1,0,0-2.5-0.5-0.5002-4.5,0.0002-2-1-2.5,0z"/>
+<path style="opacity:1;fill:#16a4e8;" d="m142.4,379.4-1-0.0001-2.5,0-0.5,0.5-1,4.5,10-0.0001,0-4.5-0.5-0.5zm0,1,4-0.0001,0,3-7.75-0.0001,0.75-3,2,0z"/>
+<path style="opacity:1;fill:#3465ba;" d="m138.4,385.4,0,1,8,0,0-1z"/>
+<path style="opacity:1;fill:#3465ba;" d="m141.4,383.9,0,2,2,0,0-2c0-0.5-2-0.5-2,0z"/>
+</g>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/ftp-rtl.png b/resources/src/mediawiki.skinning/images/ftp-rtl.png
new file mode 100644 (file)
index 0000000..ff76304
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/ftp-rtl.png differ
diff --git a/resources/src/mediawiki.skinning/images/ftp-rtl.svg b/resources/src/mediawiki.skinning/images/ftp-rtl.svg
new file mode 100644 (file)
index 0000000..29e4b44
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<g transform="translate(-136.35715,-374.43362)">
+<path style="opacity:1;fill:#3465ba;" d="m148.4,376.9,0,7.5-1-0.9872,0-6.013-2,0-2,1-4-0.0002,0,2-1,0,0-2.5,0.5-0.5002,4.5,0.0002,2-1,2.5,0z"/>
+<path style="opacity:1;fill:#16a4e8;" d="m143.4,379.4,1-0.0001,2.5,0,0.5,0.5,1,4.5-10-0.0001,0-4.5,0.5-0.5zm0,1-4-0.0001,0,3,7.75-0.0001-0.75-3-2,0z"/>
+<path style="opacity:1;fill:#3465ba;" d="m147.4,385.4,0,1-8,0,0-1z"/>
+<path style="opacity:1;fill:#3465ba;" d="m144.4,383.9,0,2-2,0,0-2c0-0.5,2-0.5,2,0z"/>
+</g>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png b/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png
new file mode 100644 (file)
index 0000000..00a9cee
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png differ
diff --git a/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png b/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png
new file mode 100644 (file)
index 0000000..ff85c07
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png differ
diff --git a/resources/src/mediawiki.skinning/images/mail.png b/resources/src/mediawiki.skinning/images/mail.png
new file mode 100644 (file)
index 0000000..5085611
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/mail.png differ
diff --git a/resources/src/mediawiki.skinning/images/mail.svg b/resources/src/mediawiki.skinning/images/mail.svg
new file mode 100644 (file)
index 0000000..5e534fe
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<g transform="translate(-36.47,-257.4)">
+<path style="fill:#15a5ea;" d="m38.31,261.4,4.66,4.349,4.66-4.349-0.6213-0.6213-1.243,0.6216-2.796,2.485-2.796-2.485-1.243-0.6216z"/>
+<path style="fill:#3366bb;" d="m37.47,260.4,0,8,11,0,0-8zm1,1,9,0,0,6-9,0z"/>
+</g>
+</svg>
diff --git a/resources/src/mediawiki.skinning/images/video.png b/resources/src/mediawiki.skinning/images/video.png
new file mode 100644 (file)
index 0000000..12f6545
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/video.png differ
diff --git a/resources/src/mediawiki.skinning/images/video.svg b/resources/src/mediawiki.skinning/images/video.svg
new file mode 100644 (file)
index 0000000..d52d0db
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="13" width="13" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<g transform="translate(-36.4678,-258.39)">
+<path style="opacity:1;fill-opacity:1;fill:#15a5ea;" d="m38.96,260.4,0,0.6213,8.098,0,0-0.6213z"/>
+<path style="opacity:1;fill-opacity:1;fill:#15a5ea;" d="m38.96,268.4,8.098,0,0-0.6213-8.098,0z"/>
+<path style="opacity:1;fill-opacity:1;fill:#15a5ea;" d="m38.96,262.3,0,0.6213,1.869,0,0-0.6213zm6.229,0,0,0.6213,1.869,0,0-0.6213z"/>
+<path style="opacity:1;fill-opacity:1;fill:#15a5ea;" d="m38.96,266,0,0.6213,1.869,0,0-0.6213zm6.229,0,0,0.6213,1.869,0,0-0.6213z"/>
+<path style="opacity:1;fill-opacity:1;fill:#15a5ea;" d="m38.96,264.8,8.098,0,0-0.6213-8.098,0z"/>
+<path style="opacity:1;fill:#15a5ea;" d="m40.83,263.9,0,1.243,4.36,0,0-1.243z"/>
+<path style="opacity:1;fill:#3366bb;" d="m40.47,260.4,0,8,5,0,0-8zm1,1,3,0,0,6-3,0z"/>
+<path style="opacity:1;fill:#3366bb;" d="m38.47,259.4,1,0,0,10-1,0z"/>
+<path style="opacity:1;fill:#3366bb;" d="m46.47,259.4,1,0,0,10-1,0z"/>
+</g>
+</svg>
diff --git a/resources/src/mediawiki.skinning/interface.css b/resources/src/mediawiki.skinning/interface.css
new file mode 100644 (file)
index 0000000..b57ee36
--- /dev/null
@@ -0,0 +1,76 @@
+/**
+ * MediaWiki style sheet for common core styles on interfaces
+ *
+ * Styles for the Monobook/Vector pattern of laying out common interfaces.
+ * These ids/classes are not built into the system,
+ * they are outputted by the actual MonoBook/Vector code by convention.
+ */
+
+/* Categories */
+.catlinks {
+       border: 1px solid #aaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       margin-top: 1em;
+       clear: both;
+}
+
+.editOptions {
+       background-color: #F0F0F0;
+       border: 1px solid silver;
+       border-top: none;
+       padding: 1em 1em 1.5em 1em;
+       margin-bottom: 2em;
+}
+
+.usermessage {
+       background-color: #ffce7b;
+       border: 1px solid #ffa500;
+       color: black;
+       font-weight: bold;
+       margin: 2em 0 1em;
+       padding: .5em 1em;
+       vertical-align: middle;
+}
+
+#siteNotice {
+       position: relative;
+       text-align: center;
+       margin: 0;
+}
+
+#localNotice {
+       margin-bottom: 0.9em;
+}
+
+.firstHeading {
+       margin-bottom: .1em;
+       /* These two rules hack around bug 2013 (fix for more limited bug 11325).
+        * When bug 2013 is fixed properly, they should be removed. */
+       line-height: 1.2em;
+       padding-bottom: 0;
+}
+
+/* Sub-navigation */
+#siteSub {
+       display: none;
+}
+
+#jump-to-nav {
+       /* Negate #contentSub's margin and replicate it so that the jump to links don't affect the spacing */
+       margin-top: -1.4em;
+       margin-bottom: 1.4em;
+}
+
+#contentSub,
+#contentSub2 {
+       font-size: 84%;
+       line-height: 1.2em;
+       margin: 0 0 1.4em 1em;
+       color: #545454;
+       width: auto;
+}
+
+span.subpages {
+       display: block;
+}
index 6b0bf99..55f2f89 100644 (file)
@@ -25,5 +25,9 @@
 
 .mw-changeslist-legend dd {
        margin-left: 1.5em;
+}
+
+.mw-changeslist-legend dt,
+.mw-changeslist-legend dd {
        line-height: 1.3em;
 }
index 0356fc7..d245726 100644 (file)
@@ -118,3 +118,8 @@ table.mw-userrights-groups * td,
 table.mw-userrights-groups * th {
        padding-right: 1.5em;
 }
+
+/* Special:Contributions */
+.mw-contributions-form select {
+       vertical-align: middle;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.import.js b/resources/src/mediawiki.special/mediawiki.special.import.js
new file mode 100644 (file)
index 0000000..a9a985e
--- /dev/null
@@ -0,0 +1,35 @@
+/*!
+ * JavaScript for Special:Import
+ */
+( function ( $ ) {
+       function updateImportSubprojectList() {
+               var $projectField = $( '#mw-import-table-interwiki #interwiki' ),
+                       $subprojectField = $projectField.parent().find( '#subproject' ),
+                       $selected = $projectField.find( ':selected' ),
+                       oldValue = $subprojectField.val(),
+                       option, options;
+
+               if ( $selected.attr( 'data-subprojects' ) ) {
+                       options = $.map( $selected.attr( 'data-subprojects' ).split( ' ' ), function ( el ) {
+                               option = document.createElement( 'option' );
+                               option.appendChild( document.createTextNode( el ) );
+                               option.setAttribute( 'value', el );
+                               if ( oldValue === el ) {
+                                       option.setAttribute( 'selected', 'selected' );
+                               }
+                               return option;
+                       } );
+                       $subprojectField.show().empty().append( options );
+               } else {
+                       $subprojectField.hide();
+               }
+       }
+
+       $( function () {
+               var $projectField = $( '#mw-import-table-interwiki #interwiki' );
+               if ( $projectField.length ) {
+                       $projectField.change( updateImportSubprojectList );
+                       updateImportSubprojectList();
+               }
+       } );
+}( jQuery ) );
index afb0905..e27e34a 100644 (file)
@@ -12,7 +12,7 @@
 
 /*
  * Hide, but keep accessible for screen-readers.
- * Like .mw-jump, #jump-to-nav from skins/common/shared.css
+ * Like .mw-jump, #jump-to-nav from shared.css
  */
 .mw-navigation-hint {
        overflow: hidden;
index e553f44..1f6429b 100644 (file)
@@ -5,7 +5,7 @@ jQuery( function ( $ ) {
        var $preftoc, $preferences, $fieldsets, $legends,
                hash, labelFunc,
                $tzSelect, $tzTextbox, $localtimeHolder, servertime,
-               $checkBoxes;
+               $checkBoxes, savedWindowOnBeforeUnload;
 
        labelFunc = function () {
                return this.id.replace( /^mw-prefsection/g, 'preftab' );
@@ -263,4 +263,43 @@ jQuery( function ( $ ) {
        $( '#mw-input-wpsearcheverything' ).change( function () {
                $checkBoxes.prop( 'disabled', $( this ).prop( 'checked' ) );
        } );
+
+       // Set up a message to notify users if they try to leave the page without
+       // saving.
+       $( '#mw-prefs-form' ).data( 'origdata', $( '#mw-prefs-form' ).serialize() );
+       $( window )
+               .on( 'beforeunload.prefswarning', function () {
+                       var retval;
+
+                       // Check if anything changed
+                       if ( $( '#mw-prefs-form' ).serialize() !== $( '#mw-prefs-form' ).data( 'origdata' ) ) {
+                               // Return our message
+                               retval = mediaWiki.msg( 'prefswarning-warning', mediaWiki.msg( 'saveprefs' ) );
+                       }
+
+                       // Unset the onbeforeunload handler so we don't break page caching in Firefox
+                       savedWindowOnBeforeUnload = window.onbeforeunload;
+                       window.onbeforeunload = null;
+                       if ( retval !== undefined ) {
+                               // ...but if the user chooses not to leave the page, we need to rebind it
+                               setTimeout( function () {
+                                       window.onbeforeunload = savedWindowOnBeforeUnload;
+                               }, 1 );
+                               return retval;
+                       }
+               } )
+               .on( 'pageshow.prefswarning', function () {
+                       // Re-add onbeforeunload handler
+                       if ( !window.onbeforeunload ) {
+                               window.onbeforeunload = savedWindowOnBeforeUnload;
+                       }
+               } );
+       $( '#mw-prefs-form' ).submit( function () {
+               // Unbind our beforeunload handler
+               $( window ).off( '.prefswarning' );
+       } );
+       $( '#mw-prefs-restoreprefs' ).click( function () {
+               // Unbind our beforeunload handler
+               $( window ).off( '.prefswarning' );
+       } );
 } );
index a4128f9..b27fe34 100644 (file)
@@ -39,8 +39,8 @@
                                var parts = $( this ).attr( 'href' ).split( 'search=' ),
                                        lastpart = '',
                                        prefix = 'search=';
-                               if ( parts.length > 1 && parts[1].indexOf( '&' ) >= 0 ) {
-                                       lastpart = parts[1].substring( parts[1].indexOf( '&' ) );
+                               if ( parts.length > 1 && parts[1].indexOf( '&' ) !== -1 ) {
+                                       lastpart = parts[1].slice( parts[1].indexOf( '&' ) );
                                } else {
                                        prefix = '&search=';
                                }
index 3c7ad52..04bc978 100644 (file)
 /**
  * JavaScript for Special:Upload
  *
- * Note that additional code still lives in skins/common/upload.js
- *
  * @private
  * @class mw.special.upload
  * @singleton
  */
 ( function ( mw, $ ) {
+       var ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
+               $license = $( '#wpLicense' ), uploadWarning, uploadLicense;
+
+       window.wgUploadWarningObj = uploadWarning = {
+               responseCache: { '': '&nbsp;' },
+               nameToCheck: '',
+               typing: false,
+               delay: 500, // ms
+               timeoutID: false,
+
+               keypress: function () {
+                       if ( !ajaxUploadDestCheck ) {
+                               return;
+                       }
+
+                       // Find file to upload
+                       if ( !$( '#wpDestFile' ).length || !$( '#wpDestFile-warning' ).length ) {
+                               return;
+                       }
+
+                       this.nameToCheck = $( '#wpDestFile' ).val();
+
+                       // Clear timer
+                       if ( this.timeoutID ) {
+                               clearTimeout( this.timeoutID );
+                       }
+                       // Check response cache
+                       if ( this.responseCache.hasOwnProperty( this.nameToCheck ) ) {
+                               this.setWarning( this.responseCache[this.nameToCheck] );
+                               return;
+                       }
+
+                       this.timeoutID = setTimeout( function () {
+                               uploadWarning.timeout();
+                       }, this.delay );
+               },
+
+               checkNow: function ( fname ) {
+                       if ( !ajaxUploadDestCheck ) {
+                               return;
+                       }
+                       if ( this.timeoutID ) {
+                               clearTimeout( this.timeoutID );
+                       }
+                       this.nameToCheck = fname;
+                       this.timeout();
+               },
+
+               timeout: function () {
+                       var $spinnerDestCheck;
+                       if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) {
+                               return;
+                       }
+                       $spinnerDestCheck = $.createSpinner().insertAfter( '#wpDestFile' );
+
+                       ( new mw.Api() ).get( {
+                               action: 'query',
+                               titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(),
+                               prop: 'imageinfo',
+                               iiprop: 'uploadwarning',
+                               indexpageids: ''
+                       } ).done( function ( result ) {
+                               var resultOut = '';
+                               if ( result.query ) {
+                                       resultOut = result.query.pages[result.query.pageids[0]].imageinfo[0];
+                               }
+                               $spinnerDestCheck.remove();
+                               uploadWarning.processResult( resultOut, uploadWarning.nameToCheck );
+                       } );
+               },
+
+               processResult: function ( result, fileName ) {
+                       this.setWarning( result.html );
+                       this.responseCache[fileName] = result.html;
+               },
+
+               setWarning: function ( warning ) {
+                       $( '#wpDestFile-warning' ).html( warning );
+
+                       // Set a value in the form indicating that the warning is acknowledged and
+                       // doesn't need to be redisplayed post-upload
+                       if ( !warning ) {
+                               $( '#wpDestFileWarningAck' ).val( '' );
+                       } else {
+                               $( '#wpDestFileWarningAck' ).val( '1' );
+                       }
+
+               }
+       };
+
+       uploadLicense = {
+
+               responseCache: { '': '' },
+
+               fetchPreview: function ( license ) {
+                       var $spinnerLicense;
+                       if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) {
+                               return;
+                       }
+                       if ( this.responseCache.hasOwnProperty( license ) ) {
+                               this.showPreview( this.responseCache[license] );
+                               return;
+                       }
+
+                       $spinnerLicense = $.createSpinner().insertAfter( '#wpLicense' );
+
+                       ( new mw.Api() ).get( {
+                               action: 'parse',
+                               text: '{{' + license + '}}',
+                               title: $( '#wpDestFile' ).val() || 'File:Sample.jpg',
+                               prop: 'text',
+                               pst: ''
+                       } ).done( function ( result ) {
+                               $spinnerLicense.remove();
+                               uploadLicense.processResult( result, license );
+                       } );
+               },
+
+               processResult: function ( result, license ) {
+                       this.responseCache[license] = result.parse.text['*'];
+                       this.showPreview( this.responseCache[license] );
+               },
+
+               showPreview: function ( preview ) {
+                       $( '#mw-license-preview' ).html( preview );
+               }
+
+       };
+
+       $( function () {
+               // Disable URL box if the URL copy upload source type is not selected
+               if ( !$( '#wpSourceTypeurl' ).prop( 'checked' ) ) {
+                       $( '#wpUploadFileURL' ).prop( 'disabled', true );
+               }
+
+               // AJAX wpDestFile warnings
+               if ( ajaxUploadDestCheck ) {
+                       // Insert an event handler that fetches upload warnings when wpDestFile
+                       // has been changed
+                       $( '#wpDestFile' ).change( function () {
+                               uploadWarning.checkNow( $( this ).val() );
+                       } );
+                       // Insert a row where the warnings will be displayed just below the
+                       // wpDestFile row
+                       $( '#mw-htmlform-description tbody' ).append(
+                               $( '<tr>' ).append(
+                                       $( '<td>' )
+                                               .attr( 'id', 'wpDestFile-warning' )
+                                               .attr( 'colspan', 2 )
+                               )
+                       );
+               }
+
+               if ( mw.config.get( 'wgAjaxLicensePreview' ) && $license.length ) {
+                       // License selector check
+                       $license.change( function () {
+                               // We might show a preview
+                               uploadLicense.fetchPreview( $license.val() );
+                       } );
+
+                       // License selector table row
+                       $license.closest( 'tr' ).after(
+                               $( '<tr>' ).append(
+                                       $( '<td>' ),
+                                       $( '<td>' ).attr( 'id', 'mw-license-preview' )
+                               )
+                       );
+               }
+
+               // fillDestFile setup
+               $.each( mw.config.get( 'wgUploadSourceIds' ), function ( index, sourceId ) {
+                       $( '#' + sourceId ).change( function () {
+                               var path, slash, backslash, fname;
+                               if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
+                                       return;
+                               }
+                               // Remove any previously flagged errors
+                               $( '#mw-upload-permitted' ).attr( 'class', '' );
+                               $( '#mw-upload-prohibited' ).attr( 'class', '' );
+
+                               path = $( this ).val();
+                               // Find trailing part
+                               slash = path.lastIndexOf( '/' );
+                               backslash = path.lastIndexOf( '\\' );
+                               if ( slash === -1 && backslash === -1 ) {
+                                       fname = path;
+                               } else if ( slash > backslash ) {
+                                       fname = path.slice( slash + 1 );
+                               } else {
+                                       fname = path.slice( backslash + 1 );
+                               }
+
+                               // Clear the filename if it does not have a valid extension.
+                               // URLs are less likely to have a useful extension, so don't include them in the
+                               // extension check.
+                               if (
+                                       mw.config.get( 'wgStrictFileExtensions' ) &&
+                                       mw.config.get( 'wgFileExtensions' ) &&
+                                       $( this ).attr( 'id' ) !== 'wpUploadFileURL'
+                               ) {
+                                       if (
+                                               fname.lastIndexOf( '.' ) === -1 ||
+                                               $.inArray(
+                                                       fname.slice( fname.lastIndexOf( '.' ) + 1 ).toLowerCase(),
+                                                       $.map( mw.config.get( 'wgFileExtensions' ), function ( element ) {
+                                                               return element.toLowerCase();
+                                                       } )
+                                               ) === -1
+                                       ) {
+                                               // Not a valid extension
+                                               // Clear the upload and set mw-upload-permitted to error
+                                               $( this ).val( '' );
+                                               $( '#mw-upload-permitted' ).attr( 'class', 'error' );
+                                               $( '#mw-upload-prohibited' ).attr( 'class', 'error' );
+                                               // Clear wpDestFile as well
+                                               $( '#wpDestFile' ).val( '' );
+
+                                               return false;
+                                       }
+                               }
+
+                               // Replace spaces by underscores
+                               fname = fname.replace( / /g, '_' );
+                               // Capitalise first letter if needed
+                               if ( mw.config.get( 'wgCapitalizeUploads' ) ) {
+                                       fname = fname.charAt( 0 ).toUpperCase().concat( fname.slice( 1 ) );
+                               }
+
+                               // Output result
+                               if ( $( '#wpDestFile' ).length ) {
+                                       // Call decodeURIComponent function to remove possible URL-encoded characters
+                                       // from the file name (bug 30390). Especially likely with upload-form-url.
+                                       // decodeURIComponent can throw an exception if input is invalid utf-8
+                                       try {
+                                               $( '#wpDestFile' ).val( decodeURIComponent( fname ) );
+                                       } catch ( err ) {
+                                               $( '#wpDestFile' ).val( fname );
+                                       }
+                                       uploadWarning.checkNow( fname );
+                               }
+                       } );
+               } );
+       } );
+
        // Add a preview to the upload form
        $( function () {
                /**
                }
        } );
 
+       $( function () {
+               // Prevent losing work
+               var allowCloseWindow,
+                       $uploadForm = $( '#mw-upload-form' );
+
+               if ( !mw.user.options.get( 'useeditwarning' ) ) {
+                       // If the user doesn't want edit warnings, don't set things up.
+                       return;
+               }
+
+               $uploadForm.data( 'origtext', $uploadForm.serialize() );
+
+               allowCloseWindow = mw.confirmCloseWindow( {
+                       test: function () {
+                               return $( '#wpUploadFile' ).get( 0 ).files.length !== 0 ||
+                                       $uploadForm.data( 'origtext' ) !== $uploadForm.serialize();
+                       },
+
+                       message: mw.msg( 'editwarning-warning' ),
+                       namespace: 'uploadwarning'
+               } );
+
+               $uploadForm.submit( function () {
+                       allowCloseWindow();
+               } );
+       } );
 }( mediaWiki, jQuery ) );
index b66f20e..28b1446 100644 (file)
@@ -43,6 +43,7 @@ section.mw-form-header {
        border: 1px solid #c9c9c9;
        padding: 10px;
        text-align: center;
+       margin-bottom: 15px;
 }
 
 .mw-createacct-captcha-assisted {
index 764e377..7c87d68 100644 (file)
@@ -12,3 +12,7 @@
 th.mw-version-ext-col-label {
        font-size: 0.9em;
 }
+
+.mw-version-ext-vcs-version {
+       unicode-bidi: embed;
+}
diff --git a/resources/src/mediawiki.toolbar/images/ar/button_bold.png b/resources/src/mediawiki.toolbar/images/ar/button_bold.png
new file mode 100644 (file)
index 0000000..e524f6c
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/ar/button_bold.png differ
diff --git a/resources/src/mediawiki.toolbar/images/ar/button_headline.png b/resources/src/mediawiki.toolbar/images/ar/button_headline.png
new file mode 100644 (file)
index 0000000..398e561
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/ar/button_headline.png differ
diff --git a/resources/src/mediawiki.toolbar/images/ar/button_italic.png b/resources/src/mediawiki.toolbar/images/ar/button_italic.png
new file mode 100644 (file)
index 0000000..6ec73e9
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/ar/button_italic.png differ
diff --git a/resources/src/mediawiki.toolbar/images/ar/button_link.png b/resources/src/mediawiki.toolbar/images/ar/button_link.png
new file mode 100644 (file)
index 0000000..c9c63f6
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/ar/button_link.png differ
diff --git a/resources/src/mediawiki.toolbar/images/ar/button_nowiki.png b/resources/src/mediawiki.toolbar/images/ar/button_nowiki.png
new file mode 100644 (file)
index 0000000..743ea61
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/ar/button_nowiki.png differ
diff --git a/resources/src/mediawiki.toolbar/images/be-tarask/button_bold.png b/resources/src/mediawiki.toolbar/images/be-tarask/button_bold.png
new file mode 100644 (file)
index 0000000..5c10cfe
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/be-tarask/button_bold.png differ
diff --git a/resources/src/mediawiki.toolbar/images/be-tarask/button_italic.png b/resources/src/mediawiki.toolbar/images/be-tarask/button_italic.png
new file mode 100644 (file)
index 0000000..72209d7
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/be-tarask/button_italic.png differ
diff --git a/resources/src/mediawiki.toolbar/images/be-tarask/button_link.png b/resources/src/mediawiki.toolbar/images/be-tarask/button_link.png
new file mode 100644 (file)
index 0000000..09c86fb
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/be-tarask/button_link.png differ
diff --git a/resources/src/mediawiki.toolbar/images/de/button_bold.png b/resources/src/mediawiki.toolbar/images/de/button_bold.png
new file mode 100644 (file)
index 0000000..367d5bc
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/de/button_bold.png differ
diff --git a/resources/src/mediawiki.toolbar/images/de/button_italic.png b/resources/src/mediawiki.toolbar/images/de/button_italic.png
new file mode 100644 (file)
index 0000000..fdd8c9f
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/de/button_italic.png differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_bold.png b/resources/src/mediawiki.toolbar/images/en/button_bold.png
new file mode 100644 (file)
index 0000000..75c3f10
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/en/button_bold.png differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_extlink.png b/resources/src/mediawiki.toolbar/images/en/button_extlink.png
new file mode 100644 (file)
index 0000000..458943c
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/en/button_extlink.png differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_headline.png b/resources/src/mediawiki.toolbar/images/en/button_headline.png
new file mode 100644 (file)
index 0000000..9cf751d
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/en/button_headline.png differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_hr.png b/resources/src/mediawiki.toolbar/images/en/button_hr.png
new file mode 100644 (file)
index 0000000..47e1ca4
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/en/button_hr.png differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_image.png b/resources/src/mediawiki.toolbar/images/en/button_image.png
new file mode 100644 (file)
index 0000000..6919296
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/en/button_image.png differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_italic.png b/resources/src/mediawiki.toolbar/images/en/button_italic.png
new file mode 100644 (file)
index 0000000..527fbd1
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/en/button_italic.png differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_link.png b/resources/src/mediawiki.toolbar/images/en/button_link.png
new file mode 100644 (file)
index 0000000..eb5634b
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/en/button_link.png differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_media.png b/resources/src/mediawiki.toolbar/images/en/button_media.png
new file mode 100644 (file)
index 0000000..4194ec1
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/en/button_media.png differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_nowiki.png b/resources/src/mediawiki.toolbar/images/en/button_nowiki.png
new file mode 100644 (file)
index 0000000..2ba818d
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/en/button_nowiki.png differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_sig.png b/resources/src/mediawiki.toolbar/images/en/button_sig.png
new file mode 100644 (file)
index 0000000..fe34b3f
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/en/button_sig.png differ
diff --git a/resources/src/mediawiki.toolbar/images/fa/button_bold.png b/resources/src/mediawiki.toolbar/images/fa/button_bold.png
new file mode 100644 (file)
index 0000000..c54d094
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/fa/button_bold.png differ
diff --git a/resources/src/mediawiki.toolbar/images/fa/button_headline.png b/resources/src/mediawiki.toolbar/images/fa/button_headline.png
new file mode 100644 (file)
index 0000000..9890d15
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/fa/button_headline.png differ
diff --git a/resources/src/mediawiki.toolbar/images/fa/button_italic.png b/resources/src/mediawiki.toolbar/images/fa/button_italic.png
new file mode 100644 (file)
index 0000000..33f91ed
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/fa/button_italic.png differ
diff --git a/resources/src/mediawiki.toolbar/images/fa/button_link.png b/resources/src/mediawiki.toolbar/images/fa/button_link.png
new file mode 100644 (file)
index 0000000..76b939e
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/fa/button_link.png differ
diff --git a/resources/src/mediawiki.toolbar/images/fa/button_nowiki.png b/resources/src/mediawiki.toolbar/images/fa/button_nowiki.png
new file mode 100644 (file)
index 0000000..743ea61
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/fa/button_nowiki.png differ
diff --git a/resources/src/mediawiki.toolbar/images/ksh/LICENSE b/resources/src/mediawiki.toolbar/images/ksh/LICENSE
new file mode 100644 (file)
index 0000000..47ecfe4
--- /dev/null
@@ -0,0 +1,7 @@
+
+button_italic.png
+-------------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_S_italic.png
+License: Public domain
+Author : Purodha Blissenbach, http://ksh.wikipedia.org/wiki/User:Purodha
+
diff --git a/resources/src/mediawiki.toolbar/images/ksh/button_italic.png b/resources/src/mediawiki.toolbar/images/ksh/button_italic.png
new file mode 100644 (file)
index 0000000..15496c0
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/ksh/button_italic.png differ
diff --git a/resources/src/mediawiki.toolbar/images/ru/LICENSE b/resources/src/mediawiki.toolbar/images/ru/LICENSE
new file mode 100644 (file)
index 0000000..bedcec6
--- /dev/null
@@ -0,0 +1,17 @@
+button_bold.png
+---------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_bold_ukr.png
+License: Public domain
+Author : Alexey Belomoev
+
+button_italic.png
+------------------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_italic_ukr.png
+License: Public domain
+Author : Alexey Belomoev
+
+button_link.png
+-----------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_internal_link_ukr.png
+License: GPL
+Author : Saproj, Erik Möller
diff --git a/resources/src/mediawiki.toolbar/images/ru/button_bold.png b/resources/src/mediawiki.toolbar/images/ru/button_bold.png
new file mode 100644 (file)
index 0000000..eae30d9
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/ru/button_bold.png differ
diff --git a/resources/src/mediawiki.toolbar/images/ru/button_italic.png b/resources/src/mediawiki.toolbar/images/ru/button_italic.png
new file mode 100644 (file)
index 0000000..b958d22
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/ru/button_italic.png differ
diff --git a/resources/src/mediawiki.toolbar/images/ru/button_link.png b/resources/src/mediawiki.toolbar/images/ru/button_link.png
new file mode 100644 (file)
index 0000000..12ad373
Binary files /dev/null and b/resources/src/mediawiki.toolbar/images/ru/button_link.png differ
diff --git a/resources/src/mediawiki.toolbar/toolbar.js b/resources/src/mediawiki.toolbar/toolbar.js
new file mode 100644 (file)
index 0000000..f9944b4
--- /dev/null
@@ -0,0 +1,202 @@
+/**
+ * Interface for the classic edit toolbar.
+ *
+ * @class mw.toolbar
+ * @singleton
+ */
+( function ( mw, $ ) {
+       var toolbar, isReady, $toolbar, queue, slice, $currentFocused;
+
+       /**
+        * Internal helper that does the actual insertion of the button into the toolbar.
+        *
+        * For backwards-compatibility, passing `imageFile`, `speedTip`, `tagOpen`, `tagClose`,
+        * `sampleText` and `imageId` as separate arguments (in this order) is also supported.
+        *
+        * @private
+        *
+        * @param {Object} button Object with the following properties.
+        *  You are required to provide *either* the `onClick` parameter, or the three parameters
+        *  `tagOpen`, `tagClose` and `sampleText`, but not both (they're mutually exclusive).
+        * @param {string} [button.imageFile] Image to use for the button.
+        * @param {string} button.speedTip Tooltip displayed when user mouses over the button.
+        * @param {Function} [button.onClick] Function to be executed when the button is clicked.
+        * @param {string} [button.tagOpen]
+        * @param {string} [button.tagClose]
+        * @param {string} [button.sampleText] Alternative to `onClick`. `tagOpen`, `tagClose` and
+        *  `sampleText` together provide the markup that should be inserted into page text at
+        *  current cursor position.
+        * @param {string} [button.imageId] `id` attribute of the button HTML element. Can be
+        *  used to define the image with CSS if it's not provided as `imageFile`.
+        */
+       function insertButton( button, speedTip, tagOpen, tagClose, sampleText, imageId ) {
+               var $button;
+
+               // Backwards compatibility
+               if ( typeof button !== 'object' ) {
+                       button = {
+                               imageFile: button,
+                               speedTip: speedTip,
+                               tagOpen: tagOpen,
+                               tagClose: tagClose,
+                               sampleText: sampleText,
+                               imageId: imageId
+                       };
+               }
+
+               if ( button.imageFile ) {
+                       $button = $( '<img>' ).attr( {
+                               src: button.imageFile,
+                               alt: button.speedTip,
+                               title: button.speedTip,
+                               id: button.imageId || undefined,
+                               'class': 'mw-toolbar-editbutton'
+                       } );
+               } else {
+                       $button = $( '<div>' ).attr( {
+                               title: button.speedTip,
+                               id: button.imageId || undefined,
+                               'class': 'mw-toolbar-editbutton'
+                       } );
+               }
+
+               $button.click( function ( e ) {
+                       if ( button.onClick !== undefined ) {
+                               button.onClick( e );
+                       } else {
+                               toolbar.insertTags( button.tagOpen, button.tagClose, button.sampleText );
+                       }
+
+                       return false;
+               } );
+
+               $toolbar.append( $button );
+       }
+
+       isReady = false;
+       $toolbar = false;
+
+       /**
+        * @private
+        * @property {Array}
+        * Contains button objects (and for backwards compatibilty, it can
+        * also contains an arguments array for insertButton).
+        */
+       queue = [];
+       slice = queue.slice;
+
+       toolbar = {
+
+               /**
+                * Add buttons to the toolbar.
+                *
+                * Takes care of race conditions and time-based dependencies by placing buttons in a queue if
+                * this method is called before the toolbar is created.
+                *
+                * For backwards-compatibility, passing `imageFile`, `speedTip`, `tagOpen`, `tagClose`,
+                * `sampleText` and `imageId` as separate arguments (in this order) is also supported.
+                *
+                * @inheritdoc #insertButton
+                */
+               addButton: function () {
+                       if ( isReady ) {
+                               insertButton.apply( toolbar, arguments );
+                       } else {
+                               // Convert arguments list to array
+                               queue.push( slice.call( arguments ) );
+                       }
+               },
+
+               /**
+                * Add multiple buttons to the toolbar (see also #addButton).
+                *
+                * Example usage:
+                *
+                *     addButtons( [ { .. }, { .. }, { .. } ] );
+                *     addButtons( { .. }, { .. } );
+                *
+                * @param {Object|Array...} [buttons] An array of button objects or the first
+                *  button object in a list of variadic arguments.
+                */
+               addButtons: function ( buttons ) {
+                       if ( !$.isArray( buttons ) ) {
+                               buttons = slice.call( arguments );
+                       }
+                       if ( isReady ) {
+                               $.each( buttons, function () {
+                                       insertButton( this );
+                               } );
+                       } else {
+                               // Push each button into the queue
+                               queue.push.apply( queue, buttons );
+                       }
+               },
+
+               /**
+                * Apply tagOpen/tagClose to selection in currently focused textarea.
+                *
+                * Uses `sampleText` if selection is empty.
+                *
+                * @param {string} tagOpen
+                * @param {string} tagClose
+                * @param {string} sampleText
+                */
+               insertTags: function ( tagOpen, tagClose, sampleText ) {
+                       if ( $currentFocused && $currentFocused.length ) {
+                               $currentFocused.textSelection(
+                                       'encapsulateSelection', {
+                                               pre: tagOpen,
+                                               peri: sampleText,
+                                               post: tagClose
+                                       }
+                               );
+                       }
+               }
+       };
+
+       // Legacy (for compatibility with the code previously in skins/common.edit.js)
+       mw.log.deprecate( window, 'addButton', toolbar.addButton, 'Use mw.toolbar.addButton instead.' );
+       mw.log.deprecate( window, 'insertTags', toolbar.insertTags, 'Use mw.toolbar.insertTags instead.' );
+
+       // For backwards compatibility. Used to be called from EditPage.php, maybe other places as well.
+       mw.log.deprecate( toolbar, 'init', $.noop );
+
+       // Expose API publicly
+       mw.toolbar = toolbar;
+
+       $( function () {
+               var i, button;
+
+               // Used to determine where to insert tags
+               $currentFocused = $( '#wpTextbox1' );
+
+               // Populate the selector cache for $toolbar
+               $toolbar = $( '#toolbar' );
+
+               for ( i = 0; i < queue.length; i++ ) {
+                       button = queue[i];
+                       if ( $.isArray( button ) ) {
+                               // Forwarded arguments array from mw.toolbar.addButton
+                               insertButton.apply( toolbar, button );
+                       } else {
+                               // Raw object from mw.toolbar.addButtons
+                               insertButton( button );
+                       }
+               }
+
+               // Clear queue
+               queue.length = 0;
+
+               // This causes further calls to addButton to go to insertion directly
+               // instead of to the queue.
+               // It is important that this is after the one and only loop through
+               // the the queue
+               isReady = true;
+
+               // Apply to dynamically created textboxes as well as normal ones
+               $( document ).on( 'focus', 'textarea, input:text', function () {
+                       $currentFocused = $( this );
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.toolbar/toolbar.less b/resources/src/mediawiki.toolbar/toolbar.less
new file mode 100644 (file)
index 0000000..d65b284
--- /dev/null
@@ -0,0 +1,42 @@
+@import "mediawiki.mixins";
+
+#mw-editbutton-bold {
+       .background-image("images/@{button-bold}");
+}
+
+#mw-editbutton-italic {
+       .background-image("images/@{button-italic}");
+}
+
+#mw-editbutton-link {
+       .background-image("images/@{button-link}");
+}
+
+#mw-editbutton-extlink {
+       .background-image("images/@{button-extlink}");
+}
+
+#mw-editbutton-headline {
+       .background-image("images/@{button-headline}");
+}
+
+#mw-editbutton-image {
+       .background-image("images/@{button-image}");
+}
+
+#mw-editbutton-media {
+       .background-image("images/@{button-media}");
+}
+
+#mw-editbutton-nowiki {
+       .background-image("images/@{button-nowiki}");
+}
+
+// Who decided to make only this single one different than the name of the data item?
+#mw-editbutton-signature {
+       .background-image("images/@{button-sig}");
+}
+
+#mw-editbutton-hr {
+       .background-image("images/@{button-hr}");
+}
index e1b258d..f0fb7b9 100644 (file)
@@ -3,13 +3,8 @@
 @import "mediawiki.ui/mixins";
 
 // Helpers
-.mw-ui-anchor( @mainColor ) {
-       // Make all context classes take the main color in IE6
-       .select-ie6-only& {
-               &:link, &:visited, &:hover, &:focus, &:active {
-                       color: @mainColor;
-               }
-       }
+.mixin-mw-ui-anchor-styles( @mainColor ) {
+       color: @mainColor;
 
        // Hover state
        &:hover {
                outline: none; // outline fix
        }
 
-       color: @mainColor;
-
        // Quiet mode is gray at first
        &.mw-ui-quiet {
-               .mw-ui-anchor-quiet( @mainColor );
+               .mixin-mw-ui-anchor-styles-quiet( @mainColor );
        }
 }
 
-.mw-ui-anchor-quiet( @mainColor ) {
-       color: @colorTextLight;
-       text-decoration: none;
+/*
+Anchors
 
-       &:hover {
-               color: @mainColor;
-       }
-       &:focus, &:active {
-               color: darken( @mainColor, @colorDarkenPercentage );
-       }
-}
+The anchor base type can be applied to A elements when a basic context styling needs to be given to a link, without
+having to assign it as a button type. mw-ui-anchor only changes the text color, and should not be used in combination
+with other base classes, such as mw-ui-button.
 
-/*
-Text & Anchors
+Markup:
+<a href="#" class="mw-ui-anchor mw-ui-progressive">Progressive</a>
+<a href="#" class="mw-ui-anchor mw-ui-constructive">Constructive</a>
+<a href="#" class="mw-ui-anchor mw-ui-destructive">Destructive</a>
 
-Allows you to give text a context as to the type of action it is indicating.
+.mw-ui-quiet - Quiet until interaction.
 
-Styleguide 6.
+Styleguide 6.2.
 */
 
+// Setup compound anchor selectors (such as .mw-ui-anchor.mw-ui-progressive)
+.mw-ui-anchor {
+       &.mw-ui-progressive {
+               .mixin-mw-ui-anchor-styles( @colorProgressive );
+       }
+
+       &.mw-ui-constructive {
+               .mixin-mw-ui-anchor-styles( @colorConstructive );
+       }
+
+       &.mw-ui-destructive {
+               .mixin-mw-ui-anchor-styles( @colorDestructive );
+       }
+}
+
 /*
-Guidelines
+Quiet anchors
 
-This context should only applied on elements without special behavior (DIV, SPAN, etc.), including A elements. These classes cannot be applied for styling purposes on other elements (such as form elements), except when used in combination with .mw-ui-button to alter a button context.
+Use quiet anchors when they are less important and alongside other progressive/destructive/progressive
+anchors. Use of quiet anchors is not recommended on mobile/tablet due to lack of hover state.
 
 Markup:
-<a href=# class="mw-ui-progressive {$modifiers}">Progressive</a>
-<a href=# class="mw-ui-constructive {$modifiers}">Constructive</a>
-<a href=# class="mw-ui-destructive {$modifiers}">Destructive</a>
+<a href="#" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet">Progressive</a>
+<a href="#" class="mw-ui-anchor mw-ui-constructive mw-ui-quiet">Constructive</a>
+<a href="#" class="mw-ui-anchor mw-ui-destructive mw-ui-quiet">Destructive</a>
 
-.mw-ui-quiet - Quiet until interaction.
-
-Styleguide 6.1.
+Styleguide 6.2.1.
 */
-.mw-ui-progressive {
-       .mw-ui-anchor( @colorProgressive );
-}
-.mw-ui-constructive {
-       .mw-ui-anchor( @colorConstructive );
-}
-.mw-ui-destructive {
-       .mw-ui-anchor( @colorDestructive );
-}
-.mw-ui-quiet {
-       .mw-ui-anchor-quiet( @colorTextLight );
+.mixin-mw-ui-anchor-styles-quiet( @mainColor ) {
+       color: @colorTextLight;
+       text-decoration: none;
+
+       &:hover {
+               color: @mainColor;
+       }
+       &:focus, &:active {
+               color: darken( @mainColor, @colorDarkenPercentage );
+       }
 }
index ebf4779..2512d49 100644 (file)
 //
 // Styleguide 2.
 
-@buttonBorderRadius: 3px;
 @transitionDuration: .1s;
 @transitionFunction: ease-in-out;
 
 // Neutral button styling
 //
 // Markup:
-// <button class="mw-ui-button">.mw-ui-button</button>
-// <button class="mw-ui-button" disabled>.mw-ui-button</button>
+// <div>
+//   <button class="mw-ui-button">.mw-ui-button</button>
+// </div>
+// <div>
+//   <button class="mw-ui-button" disabled>.mw-ui-button</button>
+// </div>
 //
 // Styleguide 2.1.
 .mw-ui-button {
+       // Inherit the font rather than apply user agent stylesheet (bug 70072)
+       font-family: inherit;
        font-size: 1em;
        // Container layout
        display: inline-block;
@@ -41,7 +46,8 @@
 
        // Container styling
        .button-colors(#FFF);
-       border-radius: @buttonBorderRadius;
+       border-radius: @borderRadius;
+       min-width: 4em;
 
        // Ensure that buttons and inputs are nicely aligned when they have differing heights
        vertical-align: middle;
        // using the mw-ui-big class.
        //
        // Markup:
-       // <button class="mw-ui-button mw-ui-big">.mw-ui-button</button>
-       // <button class="mw-ui-button mw-ui-progressive mw-ui-big">.mw-ui-progressive</button>
-       // <button class="mw-ui-button mw-ui-constructive mw-ui-big">.mw-ui-constructive</button>
-       // <button class="mw-ui-button mw-ui-destructive mw-ui-big">.mw-ui-destructive</button>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-big">.mw-ui-button</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-progressive mw-ui-big">.mw-ui-progressive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-constructive mw-ui-big">.mw-ui-constructive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-destructive mw-ui-big">.mw-ui-destructive</button>
+       // </div>
        //
        // Styleguide 2.1.6.
        &.mw-ui-big {
        // Some buttons might need to be stacked.
        //
        // Markup:
-       // <button class="mw-ui-button mw-ui-block">.mw-ui-button</button>
-       // <button class="mw-ui-button mw-ui-progressive mw-ui-block">.mw-ui-progressive</button>
-       // <button class="mw-ui-button mw-ui-constructive mw-ui-block">.mw-ui-constructive</button>
-       // <button class="mw-ui-button mw-ui-destructive mw-ui-block">.mw-ui-destructive</button>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-block">.mw-ui-button</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-progressive mw-ui-block">.mw-ui-progressive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-constructive mw-ui-block">.mw-ui-constructive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-destructive mw-ui-block">.mw-ui-destructive</button>
+       // </div>
        //
        // Styleguide 2.1.5.
        &.mw-ui-block {
        // .mw-ui-primary is deprecated, kept for compatibility.
        //
        // Markup:
-       // <button class="mw-ui-button mw-ui-progressive">.mw-ui-progressive</button>
-       // <button class="mw-ui-button mw-ui-progressive" disabled>.mw-ui-progressive</button>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-progressive">.mw-ui-progressive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-progressive" disabled>.mw-ui-progressive</button>
+       // </div>
        //
        // Styleguide 2.1.1.
        &.mw-ui-progressive,
        // e.g. save changes button
        //
        // Markup:
-       // <button class="mw-ui-button mw-ui-constructive">.mw-ui-constructive</button>
-       // <button class="mw-ui-button mw-ui-constructive" disabled>.mw-ui-constructive</button>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-constructive">.mw-ui-constructive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-constructive" disabled>.mw-ui-constructive</button>
+       // </div>
        //
        // Styleguide 2.1.2.
        &.mw-ui-constructive {
        // This should not be used for cancel buttons.
        //
        // Markup:
-       // <button class="mw-ui-button mw-ui-destructive">.mw-ui-destructive</button>
-       // <button class="mw-ui-button mw-ui-destructive" disabled>.mw-ui-destructive</button>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-destructive">.mw-ui-destructive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-destructive" disabled>.mw-ui-destructive</button>
+       // </div>
        //
        // Styleguide 2.1.3.
        &.mw-ui-destructive {
 
        // Quiet buttons
        //
-       // Use quiet buttons when they are less important and alongisde other progressive/destructive/progressive buttons.
+       // Use quiet buttons when they are less important and alongside other constructive/progressive/destructive buttons.
+       // Use of quiet buttons is not recommended on mobile/tablet due to lack of hover state.
        //
        // Markup:
-       // <button class="mw-ui-button mw-ui-quiet">.mw-ui-button</button>
-       // <button class="mw-ui-button mw-ui-constructive mw-ui-quiet">.mw-ui-constructive</button>
-       // <button class="mw-ui-button mw-ui-constructive mw-ui-quiet" disabled>.mw-ui-constructive</button>
-       // <button class="mw-ui-button mw-ui-destructive mw-ui-quiet">.mw-ui-destructive</button>
-       // <button class="mw-ui-button mw-ui-destructive mw-ui-quiet" disabled>.mw-ui-destructive</button>
-       // <button class="mw-ui-button mw-ui-progressive mw-ui-quiet">.mw-ui-progressive</button>
-       // <button class="mw-ui-button mw-ui-progressive mw-ui-quiet" disabled>.mw-ui-progressive</button>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-quiet">.mw-ui-button</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-constructive mw-ui-quiet">.mw-ui-constructive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-constructive mw-ui-quiet" disabled>.mw-ui-constructive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-destructive mw-ui-quiet">.mw-ui-destructive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-destructive mw-ui-quiet" disabled>.mw-ui-destructive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-progressive mw-ui-quiet">.mw-ui-progressive</button>
+       // </div>
+       // <div>
+       //   <button class="mw-ui-button mw-ui-progressive mw-ui-quiet" disabled>.mw-ui-progressive</button>
+       // </div>
        //
        // Styleguide 2.1.4.
        &.mw-ui-quiet {
@@ -209,12 +258,13 @@ a.mw-ui-button {
 //
 // Styleguide 2.2.
 .mw-ui-button-group > * {
+       min-width: 48px;
        border-radius: 0;
        float: left;
 
        &:first-child {
-               border-top-left-radius: @buttonBorderRadius;
-               border-bottom-left-radius: @buttonBorderRadius;
+               border-top-left-radius: @borderRadius;
+               border-bottom-left-radius: @borderRadius;
        }
 
        &:not(:first-child) {
@@ -222,7 +272,7 @@ a.mw-ui-button {
        }
 
        &:last-child{
-               border-top-right-radius: @buttonBorderRadius;
-               border-bottom-right-radius: @buttonBorderRadius;
+               border-top-right-radius: @borderRadius;
+               border-bottom-right-radius: @borderRadius;
        }
 }
index 6d6fdde..4204c29 100644 (file)
@@ -1,4 +1,5 @@
 @import "mediawiki.mixins";
+@import "mediawiki.ui/variables";
 
 // Checkbox
 //
 //   <input type="checkbox" id="kss-example-5"><label for="kss-example-5">Standard checkbox</label>
 // </div>
 // <div class="mw-ui-checkbox">
-//   <input type="checkbox" id="kss-example-5-2" disabled><label for="kss-example-5-2">Disabled checkbox</label>
+//   <input type="checkbox" id="kss-example-5-checked" checked><label for="kss-example-5-checked">Standard checked checkbox</label>
+// </div>
+// <div class="mw-ui-checkbox">
+//   <input type="checkbox" id="kss-example-5-disabled" disabled><label for="kss-example-5-disabled">Disabled checkbox</label>
+// </div>
+// <div class="mw-ui-checkbox">
+//   <input type="checkbox" id="kss-example-5-disabled-checked" disabled checked><label for="kss-example-5-disabled-checked">Disabled checked checkbox</label>
 // </div>
 //
 // Styleguide 5.
@@ -22,7 +29,7 @@
        vertical-align: middle;
 }
 
-@checkboxSize: 24px;
+@checkboxSize: 1.6em;
 
 // We use the not selector to cancel out styling on IE 8 and below
 .mw-ui-checkbox:not(#noop) {
                // ensure the invisible checkbox takes up the required width
                width: @checkboxSize;
                height: @checkboxSize;
+               // This is needed for Firefox mobile (See bug 71750 to workaround default Firefox stylesheet)
+               max-width: none;
 
                // the pseudo before element of the label after the checkbox now looks like a checkbox
                & + label {
+                       cursor: pointer;
+                       margin: 0 .4em;
+
                        &::before {
                                                content: '';
                                                position: absolute;
                                                left: 0;
                                                display: inline-block;
-                                               border-radius: 2px;
+                                               border-radius: @borderRadius;
                                                margin-right: 18px;
                                                width: @checkboxSize;
                                                height: @checkboxSize;
                                                background-color: #fff;
-                                               cursor: pointer;
                                                border: 1px solid grey;
                                        }
                }
                        + label {
                                &::before {
                                        .background-image-svg('images/checked.svg', 'images/checked.png');
+                                       .background-size( @checkboxSize, @checkboxSize );
                                        background-repeat: no-repeat;
                                        background-position: center top;
                                }
                        }
                }
 
-               @focusBottomBorderSize: 3px;
+               @focusBottomBorderSize: 0.2em;
                &:active,
                &:focus {
                        + label {
@@ -78,7 +90,7 @@
                                        content: '';
                                        position: absolute;
                                        width: @checkboxSize;
-                                       height: @checkboxSize - @focusBottomBorderSize + 1; // offset by bottom border
+                                       height: @checkboxSize - @focusBottomBorderSize + 0.08; // offset by bottom border
                                        // offset from the checkbox by 1px to account for left border
                                        left: 1px;
                                        border-bottom: solid @focusBottomBorderSize lightgrey;
                }
 
                // disabled checked boxes have a gray background
-               &:disabled + label::before {
-                       background-color: lightgrey;
+               &:disabled + label {
+                       cursor: default;
+
+                       &::before {
+                               background-color: lightgrey;
+                       }
                }
        }
 }
index 7c01350..592a309 100644 (file)
        //   </div>
        // </form>
        //
-       // Styleguide 3.1.
+       // Styleguide 3.2.
        .error,
        .errorbox,
        .warningbox,
                word-wrap: break-word;
        }
 
-       // Colours taken from those for .errorbox in skins/common/shared.css
+       // Colours taken from those for .errorbox in shared.css
        .error {
                color: #cc0000;
                border: 1px solid #fac5c5;
        // This specifies styling for individual field validation error messages.
        // Show them below the fields to prevent line break glitches, and leave
        // some space between the field and the error message box.
-       .mw-ui-vform-div .error, /* for backwards-compatibility, remove before 1.24 */
        .mw-ui-vform-field .error {
                display: block;
                margin-top: 5px;
 //
 // (We use a broad definition of 'field' here: a purely textual information
 // block is also a "field".)
-.mw-ui-vform-div, /* for backwards-compatibility, remove before 1.24 */
 .mw-ui-vform-field {
        display: block;
        margin: 0 0 15px;
diff --git a/resources/src/mediawiki.ui/components/icons.less b/resources/src/mediawiki.ui/components/icons.less
new file mode 100644 (file)
index 0000000..d85cc98
--- /dev/null
@@ -0,0 +1,86 @@
+@import "mediawiki.mixins";
+
+// Variables
+@iconSize: 1.4em;
+@gutterWidth: 1em;
+
+// Mixins
+.mixin-mw-ui-icon-bgimage(@iconSvg, @iconPng) {
+       &.mw-ui-icon:before {
+               .background-image-svg(@iconSvg, @iconPng);
+       }
+}
+
+// Icons
+//
+// To use icons you must be using a browser that supports pseudo elements.
+// This includes support for IE8.
+// http://caniuse.com/#feat=css-gencontent
+//
+// For elements that are intended to have both an icon and text, browsers that
+// do not support pseudo-selectors will degrade to text-only.
+//
+// However, icon-only elements do not yet degrade to text-only elements in these
+// browsers.
+//
+// Styleguide 4.
+
+.mw-ui-icon {
+       position: relative;
+       min-height: @iconSize;
+       min-width: @iconSize;
+
+       // Standalone icons
+       //
+       // Markup:
+       // <div class="mw-ui-icon mw-ui-icon-element mw-ui-icon-ok">OK</div>
+       // <div class="mw-ui-icon mw-ui-icon-element mw-ui-icon-ok mw-ui-button mw-ui-progressive">OK</div>
+       //
+       // Styleguide 4.1.1.
+       &.mw-ui-icon-element {
+               @width: @iconSize + ( 2 * @gutterWidth );
+
+               text-indent: -999px;
+               overflow: hidden;
+               width: @width;
+               min-width: @width;
+               max-width: @width;
+               &:before {
+                       left: 0;
+                       right: 0;
+                       position: absolute;
+                       margin: 0 @gutterWidth;
+               }
+       }
+
+       &:before {
+               background-position: 50% 50%;
+               float: left;
+               display: block;
+               background-repeat: no-repeat;
+               background-size: 100% auto;
+               position: relative;
+               min-height: @iconSize;
+               content: '';
+       }
+
+
+       // Icons with text
+       //
+       // Markup:
+       // <div class="mw-ui-icon mw-ui-icon-before mw-ui-icon-ok">OK</div>
+       // <div class="mw-ui-icon mw-ui-icon-before mw-ui-icon-ok mw-ui-progressive mw-ui-button">OK</div>
+       //
+       // Styleguide 4.1.2
+       &.mw-ui-icon-before {
+               &:before {
+                       width: @iconSize;
+                       margin-right: @gutterWidth;
+               }
+       }
+}
+
+// Icons
+.mw-ui-icon-ok {
+       .mixin-mw-ui-icon-bgimage('images/ok.svg', 'images/ok.png');
+}
diff --git a/resources/src/mediawiki.ui/components/images/ok.png b/resources/src/mediawiki.ui/components/images/ok.png
new file mode 100644 (file)
index 0000000..8a62f27
Binary files /dev/null and b/resources/src/mediawiki.ui/components/images/ok.png differ
diff --git a/resources/src/mediawiki.ui/components/images/ok.svg b/resources/src/mediawiki.ui/components/images/ok.svg
new file mode 100644 (file)
index 0000000..15bc296
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="142.282px" height="142.28px" viewBox="0 -11.785 142.282 142.28" enable-background="new 0 -11.785 142.282 142.28"
+        xml:space="preserve">
+<g>
+
+               <rect x="18.012" y="41.792" transform="matrix(0.6983 -0.7158 0.7158 0.6983 -17.1914 77.8785)" fill="#F0F0F0" width="131.56" height="35.083"/>
+
+               <rect x="2.416" y="64.455" transform="matrix(0.7158 0.6983 -0.6983 0.7158 67.7777 -2.5416)" fill="#F0F0F0" width="69.191" height="35.082"/>
+</g>
+</svg>
index 6996ab8..685ca4d 100644 (file)
        border: 1px solid @colorFieldBorder;
        .box-sizing(border-box);
        width: 100%;
-       padding: .3em .3em .3em .6em;
+       padding: .4em .3em .2em .6em;
        display: block;
        vertical-align: middle;
+       border-radius: @borderRadius;
        // Override user agent stylesheet properties. Instead use parent element.
        color: inherit;
        font-family: inherit;
                .field-placeholder-styling;
        }
 
+       // Remove red outline from inputs which have required field and invalid content.
+       // This is a Firefox only issue
+       // See https://developer.mozilla.org/en-US/docs/Web/CSS/:invalid
+       // This should be above :focus so focus behaviour takes preference
+       &:invalid {
+               box-shadow: none;
+       }
+
        &:focus {
-               box-shadow: inset .45em 0 0 #5088f7;
+               box-shadow: inset .45em 0 0 @colorProgressive;
                border-color: @colorGrayDark;
                // Remove focus glow on input[type="search"]
                outline: 0;
        }
+
+       &:disabled {
+               border-color: @colorGray14;
+               color: @colorGray12;
+       }
 }
 
 textarea.mw-ui-input {
@@ -77,6 +91,7 @@ textarea.mw-ui-input {
 // <button class="mw-ui-button mw-ui-constructive">go</button>
 //
 // Styleguide 1.2.
+input[type="number"],
 .mw-ui-input-inline {
        display: inline-block;
        width: auto;
@@ -114,3 +129,11 @@ input.mw-ui-input-large {
        font-weight: bold;
        line-height: 1.25em;
 }
+
+// Tablet and desktop specific styling tweaks.
+@media all and (min-width: 768px) {
+       // Make inline elements take up a sensible amount of the screen on wider devices.
+       .mw-ui-input-inline {
+               min-width: 320px;
+       }
+}
diff --git a/resources/src/mediawiki.ui/components/text.less b/resources/src/mediawiki.ui/components/text.less
new file mode 100644 (file)
index 0000000..500d42c
--- /dev/null
@@ -0,0 +1,40 @@
+@import "mediawiki.mixins";
+@import "mediawiki.ui/variables";
+@import "mediawiki.ui/mixins";
+
+/*
+Text & Anchors
+
+Allows you to give text a context as to the type of action it is indicating.
+
+Styleguide 6.
+*/
+
+/*
+Text
+
+Context classes may be used on elements with only plain-text content with the mw-ui-text base. When the context classes
+are used on interactive and block-level elements, the appropriate alternative base type classes should also be used. For
+example, mw-ui-anchor with A, or mw-ui-button with buttons.
+
+Markup:
+<span class="mw-ui-text mw-ui-progressive">Progressive</span>
+<span class="mw-ui-text mw-ui-constructive">Constructive</span>
+<span class="mw-ui-text mw-ui-destructive">Destructive</span>
+
+Styleguide 6.1.
+*/
+
+.mw-ui-text {
+       // The selector order is like this on purpose; IE6 ignores the second selector,
+       // so we don't want to accidentally apply this color on all mw-ui-CONTEXT classes
+       .mw-ui-progressive& {
+               color: @colorProgressive;
+       }
+       .mw-ui-constructive& {
+               color: @colorConstructive;
+       }
+       .mw-ui-destructive& {
+               color: @colorDestructive;
+       }
+}
\ No newline at end of file
diff --git a/resources/src/mediawiki/images/arrow-sort-ascending.png b/resources/src/mediawiki/images/arrow-sort-ascending.png
new file mode 100644 (file)
index 0000000..f2d339d
Binary files /dev/null and b/resources/src/mediawiki/images/arrow-sort-ascending.png differ
diff --git a/resources/src/mediawiki/images/arrow-sort-ascending.svg b/resources/src/mediawiki/images/arrow-sort-ascending.svg
new file mode 100644 (file)
index 0000000..1e7a094
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12"><path d="M1 10h10l-5-8.658z" fill="#00a"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki/images/arrow-sort-descending.png b/resources/src/mediawiki/images/arrow-sort-descending.png
new file mode 100644 (file)
index 0000000..8afbca9
Binary files /dev/null and b/resources/src/mediawiki/images/arrow-sort-descending.png differ
diff --git a/resources/src/mediawiki/images/arrow-sort-descending.svg b/resources/src/mediawiki/images/arrow-sort-descending.svg
new file mode 100644 (file)
index 0000000..cf11adb
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12"><path d="M1 2h10l-5 8.658z" fill="#00a"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png
new file mode 100644 (file)
index 0000000..2a64fd0
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png
new file mode 100644 (file)
index 0000000..78a493e
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png b/resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png
new file mode 100644 (file)
index 0000000..aa4fbf8
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png b/resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png
new file mode 100644 (file)
index 0000000..83df068
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png b/resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png
new file mode 100644 (file)
index 0000000..caf5033
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png b/resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png
new file mode 100644 (file)
index 0000000..52b32a5
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-forward-ltr.png b/resources/src/mediawiki/images/pager-arrow-forward-ltr.png
new file mode 100644 (file)
index 0000000..3f8fee3
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-forward-ltr.png differ
diff --git a/resources/src/mediawiki/images/pager-arrow-forward-rtl.png b/resources/src/mediawiki/images/pager-arrow-forward-rtl.png
new file mode 100644 (file)
index 0000000..f363bf6
Binary files /dev/null and b/resources/src/mediawiki/images/pager-arrow-forward-rtl.png differ
index 4387608..95b18a8 100644 (file)
                        namespace = NS_MAIN;
                        title = title
                                // Strip colon
-                               .substr( 1 )
+                               .slice( 1 )
                                // Trim underscores
                                .replace( rUnderscoreTrim, '' );
                }
                } else {
                        fragment = title
                                // Get segment starting after the hash
-                               .substr( i + 1 )
+                               .slice( i + 1 )
                                // Convert to text
                                // NB: Must not be trimmed ("Example#_foo" is not the same as "Example#foo")
                                .replace( /_/g, ' ' );
 
                        title = title
                                // Strip hash
-                               .substr( 0, i )
+                               .slice( 0, i )
                                // Trim underscores, again (strips "_" from "bar" in "Foo_bar_#quux")
                                .replace( rUnderscoreTrim, '' );
                }
                                title.indexOf( '../' ) === 0 ||
                                title.indexOf( '/./' ) !== -1 ||
                                title.indexOf( '/../' ) !== -1 ||
-                               title.substr( title.length - 2 ) === '/.' ||
-                               title.substr( title.length - 3 ) === '/..'
+                               title.slice( -2 ) === '/.' ||
+                               title.slice( -3 ) === '/..'
                        )
                ) {
                        return false;
                        // Extensions are the non-empty segment after the last dot
                        ext = null;
                } else {
-                       ext = title.substr( i + 1 );
-                       title = title.substr( 0, i );
+                       ext = title.slice( i + 1 );
+                       title = title.slice( 0, i );
                }
 
                return {
                        return text( this.getPrefixedDb() );
                },
 
+               /**
+                * Get the page name relative to a namespace
+                *
+                * Example:
+                *
+                * - "Foo:Bar" relative to the Foo namespace becomes "Bar".
+                * - "Bar" relative to any non-main namespace becomes ":Bar".
+                * - "Foo:Bar" relative to any namespace other than Foo stays "Foo:Bar".
+                *
+                * @param {number} namespace The namespace to be relative to
+                * @return {string}
+                */
+               getRelativeText: function ( namespace ) {
+                       if ( this.getNamespaceId() === namespace ) {
+                               return this.getMainText();
+                       } else if ( this.getNamespaceId() === NS_MAIN ) {
+                               return ':' + this.getPrefixedText();
+                       } else {
+                               return this.getPrefixedText();
+                       }
+               },
+
                /**
                 * Get the fragment (if any).
                 *
diff --git a/resources/src/mediawiki/mediawiki.apihelp.css b/resources/src/mediawiki/mediawiki.apihelp.css
new file mode 100644 (file)
index 0000000..d127232
--- /dev/null
@@ -0,0 +1,86 @@
+.apihelp-header {
+       clear: both;
+       margin-bottom: 0.1em;
+}
+
+div.apihelp-linktrail {
+       font-size: smaller;
+}
+
+.apihelp-block {
+       margin-top: 0.5em;
+}
+
+.apihelp-block-head {
+       font-weight: bold;
+}
+
+.apihelp-flags {
+       font-size: smaller;
+       float: right;
+       border: 1px solid black;
+       padding: 0.25em;
+       width: 20em;
+}
+
+.apihelp-deprecated, .apihelp-flag-deprecated,
+.apihelp-flag-internal strong {
+       font-weight: bold;
+       color: red;
+}
+
+.apihelp-empty {
+       color: #888;
+}
+
+.apihelp-help-urls ul {
+       list-style-image: none;
+       list-style-type: none;
+       margin-left: 0;
+}
+
+.apihelp-parameters dl,
+.apihelp-examples dl,
+.apihelp-permissions dl {
+       margin-left: 2em;
+}
+
+.apihelp-parameters dt {
+       float: left;
+       clear: left;
+       min-width: 10em;
+       white-space: nowrap;
+       line-height: 1.5em;
+}
+
+.apihelp-parameters dt:after {
+       content: ':\A0'
+}
+
+.apihelp-parameters dd {
+       margin: 0 0 0.5em 10em;
+       line-height: 1.5em;
+}
+
+.apihelp-parameters dd p:first-child {
+       margin-top: 0;
+}
+
+.apihelp-parameters dd.info {
+       margin-left: 12em;
+       text-indent: -2em;
+}
+
+.apihelp-examples dt {
+       font-weight: normal;
+}
+
+.api-main-links {
+       text-align: center;
+}
+.api-main-links ul:before {
+       content: '[';
+}
+.api-main-links ul:after {
+       content: ']';
+}
diff --git a/resources/src/mediawiki/mediawiki.apipretty.css b/resources/src/mediawiki/mediawiki.apipretty.css
new file mode 100644 (file)
index 0000000..fe5e634
--- /dev/null
@@ -0,0 +1,11 @@
+h1.firstHeading {
+       display: none;
+}
+
+.api-pretty-header {
+       font-size: small;
+}
+
+.api-pretty-content {
+       white-space: pre-wrap;
+}
diff --git a/resources/src/mediawiki/mediawiki.confirmCloseWindow.js b/resources/src/mediawiki/mediawiki.confirmCloseWindow.js
new file mode 100644 (file)
index 0000000..177367d
--- /dev/null
@@ -0,0 +1,64 @@
+( function ( mw, $ ) {
+       /**
+        * @method confirmCloseWindow
+        * @member mw
+        *
+        * Prevent the closing of a window with a confirm message (the onbeforeunload event seems to
+        * work in most browsers.)
+        *
+        * This supersedes any previous onbeforeunload handler. If there was a handler before, it is
+        * restored when you execute the returned function.
+        *
+        *     var allowCloseWindow = mw.confirmCloseWindow();
+        *     // ... do stuff that can't be interrupted ...
+        *     allowCloseWindow();
+        *
+        * @param {Object} [options]
+        * @param {string} [options.namespace] Namespace for the event registration
+        * @param {string} [options.message]
+        * @param {string} options.message.return The string message to show in the confirm dialog.
+        * @param {Function} [options.test]
+        * @param {boolean} [options.test.return=true] Whether to show the dialog to the user.
+        * @return {Function} Execute this when you want to allow the user to close the window
+        */
+       mw.confirmCloseWindow = function ( options ) {
+               var savedUnloadHandler,
+                       mainEventName = 'beforeunload',
+                       showEventName = 'pageshow';
+
+               options = $.extend( {
+                       message: mw.message( 'mwe-prevent-close' ).text(),
+                       test: function () { return true; }
+               }, options );
+
+               if ( options.namespace ) {
+                       mainEventName += '.' + options.namespace;
+                       showEventName += '.' + options.namespace;
+               }
+
+               $( window ).on( mainEventName, function () {
+                       if ( options.test() ) {
+                               // remove the handler while the alert is showing - otherwise breaks caching in Firefox (3?).
+                               // but if they continue working on this page, immediately re-register this handler
+                               savedUnloadHandler = window.onbeforeunload;
+                               window.onbeforeunload = null;
+                               setTimeout( function () {
+                                       window.onbeforeunload = savedUnloadHandler;
+                               }, 1 );
+
+                               // show an alert with this message
+                               return options.message;
+                       }
+               } ).on( showEventName, function () {
+                       // Re-add onbeforeunload handler
+                       if ( !window.onbeforeunload && savedUnloadHandler ) {
+                               window.onbeforeunload = savedUnloadHandler;
+                       }
+               } );
+
+               // return the function they can use to stop this
+               return function () {
+                       $( window ).off( mainEventName + ' ' + showEventName );
+               };
+       };
+} )( mediaWiki, jQuery );
index f56f0d9..4935984 100644 (file)
@@ -61,7 +61,7 @@
                 */
                switchPane: function ( e ) {
                        var currentPaneId = debug.$container.data( 'currentPane' ),
-                               requestedPaneId = $( this ).prop( 'id' ).substr( 9 ),
+                               requestedPaneId = $( this ).prop( 'id' ).slice( 9 ),
                                $currentPane = $( '#mw-debug-pane-' + currentPaneId ),
                                $requestedPane = $( '#mw-debug-pane-' + requestedPaneId ),
                                hovDone = false;
 
                        gitInfo = '';
                        if ( this.data.gitRevision !== false ) {
-                               gitInfo = '(' + this.data.gitRevision.substring( 0, 7 ) + ')';
+                               gitInfo = '(' + this.data.gitRevision.slice( 0, 7 ) + ')';
                                if ( this.data.gitViewUrl !== false ) {
                                        gitInfo = $( '<a>' )
                                                .attr( 'href', this.data.gitViewUrl )
                        }
 
                        bitDiv( 'phpversion' )
-                               .append( $( '<a href="//www.php.net/"></a>' ).text( 'PHP' ) )
+                               .append( $( this.data.phpEngine === 'HHVM'
+                                       ? '<a href="http://hhvm.com/">HHVM</a>'
+                                       : '<a href="https://php.net/">PHP</a>'
+                               ) )
                                .append( ': ' + this.data.phpVersion );
 
                        bitDiv( 'time' )
index 64ec6c3..04f7acd 100644 (file)
                        // only drop events if requested
                        dropThresholdPx = dropThresholdPx || 0;
 
-                       if ( !Array.prototype.map || !Array.prototype.reduce || !Array.prototype.filter ) {
-                               profile.container = profile.buildRequiresES5();
+                       if (
+                               !Array.prototype.map ||
+                               !Array.prototype.reduce ||
+                               !Array.prototype.filter ||
+                               !document.createElementNS ||
+                               !document.createElementNS.bind
+                       ) {
+                               profile.container = profile.buildRequiresBrowserFeatures();
                        } else if ( data.length === 0 ) {
                                profile.container = profile.buildNoData();
                        } else {
+                               // Initialize createSvgElement (now that we know we have
+                               // document.createElementNS and bind)
+                               this.createSvgElement = document.createElementNS.bind( document, 'http://www.w3.org/2000/svg' );
+
                                // generate a flyout
                                profile.data = new ProfileData( data, profile.width, mergeThresholdPx, dropThresholdPx );
                                // draw it
@@ -52,9 +62,9 @@
                        return profile.container;
                },
 
-               buildRequiresES5: function () {
+               buildRequiresBrowserFeatures: function () {
                        return $( '<div>' )
-                               .text( 'An ES5 compatible javascript engine is required for the profile visualization.' )
+                               .text( 'Certain browser features, including parts of ECMAScript 5 and document.createElementNS, are required for the profile visualization.' )
                                .get( 0 );
                },
 
 
                /**
                 * Creates DOM nodes appropriately namespaced for SVG.
+                * Initialized in init after checking support
                 *
                 * @param string tag to create
                 * @return DOMElement
                 */
-               createSvgElement: document.createElementNS
-                       ? document.createElementNS.bind( document, 'http://www.w3.org/2000/svg' )
-                       // throw a error for browsers which does not support document.createElementNS (IE<8)
-                       : function () { throw new Error( 'document.createElementNS not supported' ); },
+               createSvgElement: null,
 
                /**
                 * @param DOMElement|undefined
        ProfileData.groupOf = function ( label ) {
                var pos, prefix = 'Profile section ended by close(): ';
                if ( label.indexOf( prefix ) === 0 ) {
-                       label = label.substring( prefix.length );
+                       label = label.slice( prefix.length );
                }
 
                pos = [ '::', ':', '-' ].reduce( function ( result, separator ) {
                if ( pos === -1 ) {
                        return label;
                } else {
-                       return label.substring( 0, pos );
+                       return label.slice( 0, pos );
                }
        };
 
index 5027f7a..594800e 100644 (file)
        } );
 
        function enhance( $root ) {
+               var $matrixTooltips, $autocomplete;
 
                /**
                 * @ignore
                        } );
                }
 
-               var $matrixTooltips = $root.find( '.mw-htmlform-matrix .mw-htmlform-tooltip' );
+               $matrixTooltips = $root.find( '.mw-htmlform-matrix .mw-htmlform-tooltip' );
                if ( $matrixTooltips.length ) {
                        mw.loader.using( 'jquery.tipsy', function () {
                                $matrixTooltips.tipsy( { gravity: 's' } );
                        } );
                }
 
+               // Set up autocomplete fields
+               $autocomplete = $root.find( '.mw-htmlform-autocomplete' );
+               if ( $autocomplete.length ) {
+                       mw.loader.using( 'jquery.suggestions', function () {
+                               $autocomplete.suggestions( {
+                                       fetch: function ( val ) {
+                                               var $el = $( this );
+                                               $el.suggestions( 'suggestions',
+                                                       $.grep( $el.data( 'autocomplete' ), function ( v ) {
+                                                               return v.indexOf( val ) === 0;
+                                                       } )
+                                               );
+                                       }
+                               } );
+                       } );
+               }
+
                // Add/remove cloner clones without having to resubmit the form
                $root.find( '.mw-htmlform-cloner-delete-button' ).click( function ( ev ) {
                        ev.preventDefault();
index eda7689..8e9fc89 100644 (file)
                },
 
                /**
-                * Perform a substring search across the JavaScript and CSS source code
+                * Perform a string search across the JavaScript and CSS source code
                 * of all loaded modules and return an array of the names of the
                 * modules that matched.
                 *
index 3f778d8..3eaa6d2 100644 (file)
                         */
                        function makeRegexParser( regex ) {
                                return function () {
-                                       var matches = input.substr( pos ).match( regex );
+                                       var matches = input.slice( pos ).match( regex );
                                        if ( matches === null ) {
                                                return null;
                                        }
 
                                if ( parsedCloseTagResult === null ) {
                                        // Closing tag failed.  Return the start tag and contents.
-                                       return [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ]
+                                       return [ 'CONCAT', input.slice( startOpenTagPos, endOpenTagPos ) ]
                                                .concat( parsedHtmlContents );
                                }
 
                                        // parsed HTML link.
                                        //
                                        // Concatenate everything from the tag, flattening the contents.
-                                       result = [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ]
-                                               .concat( parsedHtmlContents, input.substring( startCloseTagPos, endCloseTagPos ) );
+                                       result = [ 'CONCAT', input.slice( startOpenTagPos, endOpenTagPos ) ]
+                                               .concat( parsedHtmlContents, input.slice( startCloseTagPos, endCloseTagPos ) );
                                }
 
                                return result;
                 * @return {string} selected pluralized form according to current language
                 */
                plural: function ( nodes ) {
-                       var forms, count;
+                       var forms, firstChild, firstChildText,
+                               explicitPluralForms = {}, explicitPluralFormNumber, formIndex, form, count;
+
                        count = parseFloat( this.language.convertNumber( nodes[0], true ) );
                        forms = nodes.slice( 1 );
-                       return forms.length ? this.language.convertPlural( count, forms ) : '';
+                       for ( formIndex = 0; formIndex < forms.length; formIndex++ ) {
+                               form = forms[formIndex];
+
+                               if ( form.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 ) {
+                                               firstChildText = firstChild.textContent;
+                                               if ( /^\d+=/.test( firstChildText ) ) {
+                                                       explicitPluralFormNumber = parseInt( firstChildText.split( /=/ )[0], 10 );
+                                                       // Use the digit part as key and rest of first text node and
+                                                       // rest of child nodes as value.
+                                                       firstChild.textContent = firstChildText.slice( firstChildText.indexOf( '=' ) + 1 );
+                                                       explicitPluralForms[explicitPluralFormNumber] = form;
+                                                       forms[formIndex] = undefined;
+                                               }
+                                       }
+                               } else if ( /^\d+=/.test( form ) ) {
+                                       // Simple explicit plural forms like 12=a dozen
+                                       explicitPluralFormNumber = parseInt( form.split( /=/ )[0], 10 );
+                                       explicitPluralForms[explicitPluralFormNumber] = form.slice( form.indexOf( '=' ) + 1 );
+                                       forms[formIndex] = undefined;
+                               }
+                       }
+
+                       // Remove explicit plural forms from the forms. They were set undefined in the above loop.
+                       forms = $.map( forms, function ( form ) {
+                               return form;
+                       } );
+
+                       return this.language.convertPlural( count, forms, explicitPluralForms );
                },
 
                /**
index d50fe48..e29c734 100644 (file)
                         */
                        var registry = {},
                                //
-                               // Mapping of sources, keyed by source-id, values are objects.
+                               // Mapping of sources, keyed by source-id, values are strings.
                                // Format:
                                //      {
-                               //              'sourceId': {
-                               //                      'loadScript': 'http://foo.bar/w/load.php'
-                               //              }
+                               //              'sourceId': 'http://foo.bar/w/load.php'
                                //      }
                                //
                                sources = {},
 
                                        for ( source in splits ) {
 
-                                               sourceLoadScript = sources[source].loadScript;
+                                               sourceLoadScript = sources[source];
 
                                                for ( group in splits[source] ) {
 
                                                        for ( i = 0; i < modules.length; i += 1 ) {
                                                                // Determine how many bytes this module would add to the query string
                                                                lastDotIndex = modules[i].lastIndexOf( '.' );
-                                                               // Note that these substr() calls work even if lastDotIndex == -1
+
+                                                               // If lastDotIndex is -1, substr() returns an empty string
                                                                prefix = modules[i].substr( 0, lastDotIndex );
-                                                               suffix = modules[i].substr( lastDotIndex + 1 );
+                                                               suffix = modules[i].slice( lastDotIndex + 1 );
+
                                                                bytesAdded = moduleMap[prefix] !== undefined
                                                                        ? suffix.length + 3 // '%2C'.length == 3
                                                                        : modules[i].length + 3; // '%7C'.length == 3
                                 *
                                 * The #work method will use this information to split up requests by source.
                                 *
-                                *     mw.loader.addSource( 'mediawikiwiki', { loadScript: '//www.mediawiki.org/w/load.php' } );
+                                *     mw.loader.addSource( 'mediawikiwiki', '//www.mediawiki.org/w/load.php' );
                                 *
                                 * @param {string} id Short string representing a source wiki, used internally for
                                 *  registered modules to indicate where they should be loaded from (usually lowercase a-z).
-                                * @param {Object} props
-                                * @param {string} props.loadScript Url to the load.php entry point of the source wiki.
+                                * @param {Object|string} loadUrl load.php url, may be an object for backwards-compatibility
                                 * @return {boolean}
                                 */
-                               addSource: function ( id, props ) {
+                               addSource: function ( id, loadUrl ) {
                                        var source;
                                        // Allow multiple additions
                                        if ( typeof id === 'object' ) {
                                                throw new Error( 'source already registered: ' + id );
                                        }
 
-                                       sources[id] = props;
+                                       if ( typeof loadUrl === 'object' ) {
+                                               loadUrl = loadUrl.loadScript;
+                                       }
+
+                                       sources[id] = loadUrl;
 
                                        return true;
                                },
                                                }
 
                                                for ( key in mw.loader.store.items ) {
-                                                       module = key.substring( 0, key.indexOf( '@' ) );
+                                                       module = key.slice( 0, key.indexOf( '@' ) );
                                                        if ( mw.loader.store.getModuleKey( module ) !== key ) {
                                                                mw.loader.store.stats.expired++;
                                                                delete mw.loader.store.items[key];
index 79ec310..1968aa9 100644 (file)
                        // on links from hiding a notification.
                        .on( 'click', 'a', function ( e ) {
                                e.stopPropagation();
-                       } );
+                       } )
+                       .hide();
 
                // Prepend the notification area to the content area and save it's object.
                mw.util.$content.prepend( $area );
diff --git a/resources/src/mediawiki/mediawiki.pager.tablePager.less b/resources/src/mediawiki/mediawiki.pager.tablePager.less
new file mode 100644 (file)
index 0000000..d37aec5
--- /dev/null
@@ -0,0 +1,84 @@
+/*!
+ * Structures generated by the TablePager PHP class
+ * in MediaWiki (used e.g. on Special:ListFiles).
+ */
+
+@import "mediawiki.mixins";
+
+.TablePager {
+       min-width: 80%;
+}
+
+.TablePager .TablePager_sort-ascending a {
+       padding-left: 15px;
+       background: none left center no-repeat;
+       .background-image-svg('images/arrow-sort-ascending.svg', 'images/arrow-sort-ascending.png');
+}
+
+.TablePager .TablePager_sort-descending a {
+       padding-left: 15px;
+       background: none left center no-repeat;
+       .background-image-svg('images/arrow-sort-descending.svg', 'images/arrow-sort-descending.png');
+}
+
+.TablePager_nav {
+       margin: 0 auto;
+}
+
+.TablePager_nav td {
+       padding: 3px;
+       text-align: center;
+       vertical-align: center;
+}
+
+.TablePager_nav a {
+       text-decoration: none;
+}
+
+.TablePager_nav td.TablePager_nav-first .TablePager_nav-disabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-disabled-fastforward-rtl.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-prev .TablePager_nav-disabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-disabled-forward-rtl.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-next .TablePager_nav-disabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-disabled-forward-ltr.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-last .TablePager_nav-disabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-disabled-fastforward-ltr.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-first .TablePager_nav-enabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-fastforward-rtl.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-prev .TablePager_nav-enabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-forward-rtl.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-next .TablePager_nav-enabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-forward-ltr.png) center top no-repeat;
+}
+
+.TablePager_nav td.TablePager_nav-last .TablePager_nav-enabled {
+       padding-top: 25px;
+       /* @embed */
+       background: url(images/pager-arrow-fastforward-ltr.png) center top no-repeat;
+}
index 7933f1d..809a65e 100644 (file)
@@ -62,7 +62,7 @@
                                seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
                        for ( i = 0; i < 32; i++ ) {
                                r = Math.floor( Math.random() * seed.length );
-                               id += seed.substring( r, r + 1 );
+                               id += seed.charAt( r );
                        }
                        return id;
                },
                }
        };
 
-       /**
-        * @method name
-        * @inheritdoc #getName
-        * @deprecated since 1.20 Use #getName instead
-        */
-       mw.log.deprecate( user, 'name', user.getName, 'Use mw.user.getName instead.' );
-
-       /**
-        * @method anonymous
-        * @inheritdoc #isAnon
-        * @deprecated since 1.20 Use #isAnon instead
-        */
-       mw.log.deprecate( user, 'anonymous', user.isAnon, 'Use mw.user.isAnon instead.' );
-
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.userSuggest.js b/resources/src/mediawiki/mediawiki.userSuggest.js
new file mode 100644 (file)
index 0000000..aed093c
--- /dev/null
@@ -0,0 +1,42 @@
+/*!
+ * Add autocomplete suggestions for names of registered users.
+ */
+( function ( mw, $ ) {
+       var api, config;
+
+       config = {
+               fetch: function ( userInput ) {
+                       var $textbox = this,
+                               node = this[0];
+
+                       api = api || new mw.Api();
+
+                       $.data( node, 'request', api.get( {
+                               action: 'query',
+                               list: 'allusers',
+                               // Prefix of list=allusers is case sensitive. Normalise first
+                               // character to uppercase so that "fo" may yield "Foo".
+                               auprefix: userInput.charAt( 0 ).toUpperCase() + userInput.slice( 1 )
+                       } ).done( function ( data ) {
+                               var users = $.map( data.query.allusers, function ( userObj ) {
+                                       return userObj.name;
+                               } );
+                               // Set the results as the autocomplete options
+                               $textbox.suggestions( 'suggestions', users );
+                       } ) );
+               },
+               cancel: function () {
+                       var node = this[0],
+                               request = $.data( node, 'request' );
+
+                       if ( request ) {
+                               request.abort();
+                               $.removeData( node, 'request' );
+                       }
+               }
+       };
+
+       $( function () {
+               $( '.mw-autocomplete-user' ).suggestions( config );
+       } );
+}( mediaWiki, jQuery ) );
index 887885e..3a06a02 100644 (file)
                        return null;
                },
 
-               /**
-                * Add the appropriate prefix to the accesskey shown in the tooltip.
-                *
-                * If the `$nodes` parameter is given, only those nodes are updated;
-                * otherwise, depending on browser support, we update either all elements
-                * with accesskeys on the page or a bunch of elements which are likely to
-                * have them on core skins.
-                *
-                * @param {Array|jQuery} [$nodes] A jQuery object, or array of nodes to update.
-                */
-               updateTooltipAccessKeys: function ( $nodes ) {
-                       if ( !$nodes ) {
-                               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' );
-                               }
-                       } else if ( !( $nodes instanceof $ ) ) {
-                               $nodes = $( $nodes );
-                       }
-
-                       $nodes.updateTooltipAccessKeys();
-               },
-
                /**
                 * The content wrapper of the skin (e.g. `.mw-body`).
                 *
                        }
 
                        if ( tooltip ) {
-                               $link.attr( 'title', tooltip ).updateTooltipAccessKeys();
+                               $link.attr( 'title', tooltip );
                        }
 
                        if ( nextnode ) {
+                               // Case: nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
+                               // Case: nextnode is a CSS selector for jQuery
                                if ( nextnode.nodeType || typeof nextnode === 'string' ) {
-                                       // nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
-                                       // or nextnode is a CSS selector for jQuery
                                        nextnode = $ul.find( nextnode );
-                               } else if ( !nextnode.jquery || ( nextnode.length && nextnode[0].parentNode !== $ul[0] ) ) {
-                                       // Fallback
-                                       $ul.append( $item );
-                                       return $item[0];
+                               } else if ( !nextnode.jquery ) {
+                                       // Error: Invalid nextnode
+                                       nextnode = undefined;
                                }
-                               if ( nextnode.length === 1 ) {
-                                       // nextnode is a jQuery object that represents exactly one element
-                                       nextnode.before( $item );
-                                       return $item[0];
+                               if ( nextnode && ( nextnode.length !== 1 || nextnode[0].parentNode !== $ul[0] ) ) {
+                                       // Error: nextnode must resolve to a single node
+                                       // Error: nextnode must have the associated <ul> as its parent
+                                       nextnode = undefined;
                                }
                        }
 
-                       // Fallback (this is the default behavior)
-                       $ul.append( $item );
-                       return $item[0];
+                       // Case: nextnode is a jQuery-wrapped DOM element
+                       if ( nextnode ) {
+                               nextnode.before( $item );
+                       } else {
+                               // Fallback (this is the default behavior)
+                               $ul.append( $item );
+                       }
+
+                       // Update tooltip for the access key after inserting into DOM
+                       // to get a localized access key label (bug 67946).
+                       $link.updateTooltipAccessKeys();
 
+                       return $item[0];
                },
 
                /**
         */
        mw.log.deprecate( util, 'tooltipAccessKeyRegexp', /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/, 'Use jquery.accessKeyLabel instead.' );
 
+       /**
+        * Add the appropriate prefix to the accesskey shown in the tooltip.
+        *
+        * If the `$nodes` parameter is given, only those nodes are updated;
+        * otherwise, depending on browser support, we update either all elements
+        * with accesskeys on the page or a bunch of elements which are likely to
+        * have them on core skins.
+        *
+        * @method updateTooltipAccessKeys
+        * @param {Array|jQuery} [$nodes] A jQuery object, or array of nodes to update.
+        * @deprecated since 1.24 Use the module jquery.accessKeyLabel instead.
+        */
+       mw.log.deprecate( util, 'updateTooltipAccessKeys', function ( $nodes ) {
+               if ( !$nodes ) {
+                       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' );
+                       }
+               } else if ( !( $nodes instanceof $ ) ) {
+                       $nodes = $( $nodes );
+               }
+
+               $nodes.updateTooltipAccessKeys();
+       }, 'Use jquery.accessKeyLabel instead.' );
+
        /**
         * Add a little box at the top of the screen to inform the user of
         * something, replacing any previous message.
diff --git a/resources/src/polyfill-object-create.js b/resources/src/polyfill-object-create.js
new file mode 100644 (file)
index 0000000..607faf6
--- /dev/null
@@ -0,0 +1,62 @@
+/**
+ * Simplified version of es5-sham#Object-create that also works around a bug
+ * in the actual es5-sham: https://github.com/es-shims/es5-shim/issues/252
+ *
+ * Does not:
+ * - Support empty inheritance via `Object.create(null)`.
+ * - Support getter and setter accessors via `Object.create( .., properties )`.
+ * - Support custom property descriptor (e.g. writable, configurtable, enumerable).
+ * - Leave behind an enumerable "__proto__" all over the place.
+ *
+ * @author Timo Tijhof, 2014
+ */
+
+// ES5 15.2.3.5
+// http://es5.github.com/#x15.2.3.5
+if ( !Object.create ) {
+       ( function () {
+               var hasOwn = Object.hasOwnProperty,
+                       // https://developer.mozilla.org/en-US/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
+                       // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
+                       isEnumBug = !{ valueOf: 0 }.propertyIsEnumerable( 'valueOf' );
+
+               // Reusable constructor function for Object.create
+               function Empty() {}
+
+               function defineProperty( object, key, property ) {
+                       if ( hasOwn.call( property, 'value' ) ) {
+                               object[ key ] = property.value;
+                       } else {
+                               object[ key ] = property;
+                       }
+               }
+
+               Object.create = function create( prototype, properties ) {
+                       var object, key;
+
+                       if ( prototype !== Object( prototype ) ) {
+                               throw new TypeError( 'Called on non-object' );
+                       }
+
+                       Empty.prototype = prototype;
+                       object = new Empty();
+
+                       if ( properties !== undefined ) {
+                               if ( !isEnumBug ) {
+                                       for ( key in properties ) {
+                                               if ( hasOwn.call( properties, key ) ) {
+                                                       defineProperty( object, key, properties[ key ] );
+                                               }
+                                       }
+                               } else {
+                                       Object.keys( properties ).forEach( function ( key ) {
+                                               defineProperty( object, key, properties[ key ] );
+                                       } );
+                               }
+                       }
+
+                       return object;
+               };
+
+       }() );
+}
index e2f47f5..a62cc9d 100644 (file)
@@ -7,15 +7,14 @@
 var mediaWikiLoadStart = ( new Date() ).getTime();
 
 /**
- * Returns false when run in a black-listed browser
+ * Returns false for Grade C supported browsers.
  *
- * This function will be deleted after it's used, so do not expand it to be
- * generally useful beyond startup.
+ * This function should only be used by the Startup module, do not expand it to
+ * be generally useful beyond startup.
  *
  * See also:
- * - https://www.mediawiki.org/wiki/Compatibility#Browser
- * - http://jquerymobile.com/gbs/
- * - http://jquery.com/browser-support/
+ * - https://www.mediawiki.org/wiki/Compatibility#Browsers
+ * - https://jquery.com/browser-support/
  */
 
 /*jshint unused: false */
@@ -26,10 +25,19 @@ function isCompatible( ua ) {
 
        // Browsers with outdated or limited JavaScript engines get the no-JS experience
        return !(
-               // Internet Explorer < 7
-               ( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[1] ) < 7 ) ||
+               // Internet Explorer < 8
+               ( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[1] ) < 8 ) ||
                // Firefox < 3
                ( ua.indexOf( 'Firefox/' ) !== -1 && parseFloat( ua.split( 'Firefox/' )[1] ) < 3 ) ||
+               // Opera < 12
+               ( ua.indexOf( 'Opera/' ) !== -1 && ( ua.indexOf( 'Version/' ) === -1 ?
+                       // "Opera/x.y"
+                       parseFloat( ua.split( 'Opera/' )[1] ) < 10 :
+                       // "Opera/9.80 ... Version/x.y"
+                       parseFloat( ua.split( 'Version/' )[1] ) < 12
+               ) ) ||
+               // "Mozilla/0.0 ... Opera x.y"
+               ( ua.indexOf( 'Opera ' ) !== -1 && parseFloat( ua.split( ' Opera ' )[1] ) < 10 ) ||
                // BlackBerry < 6
                ua.match( /BlackBerry[^\/]*\/[1-5]\./ ) ||
                // Open WebOS < 1.5
deleted file mode 100644 (file)
index 6b9464a914398344a7ddcbd239be61441fa68fea..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,194 +0,0 @@
-/**
- * Remote Scripting Library
- * Copyright 2005 modernmethod, inc
- * Under the open source BSD license
- * http://www.modernmethod.com/sajax/
- */
-
-/*jshint camelcase:false */
-/*global alert */
-( function ( mw ) {
-
-/**
- * if sajax_debug_mode is true, this function outputs given the message into
- * the element with id = sajax_debug; if no such element exists in the document,
- * it is injected.
- */
-function debug( text ) {
-       if ( !window.sajax_debug_mode ) {
-               return false;
-       }
-
-       var b, m,
-               e = document.getElementById( 'sajax_debug' );
-
-       if ( !e ) {
-               e = document.createElement( 'p' );
-               e.className = 'sajax_debug';
-               e.id = 'sajax_debug';
-
-               b = document.getElementsByTagName( 'body' )[0];
-
-               if ( b.firstChild ) {
-                       b.insertBefore( e, b.firstChild );
-               } else {
-                       b.appendChild( e );
-               }
-       }
-
-       m = document.createElement( 'div' );
-       m.appendChild( document.createTextNode( text ) );
-
-       e.appendChild( m );
-
-       return true;
-}
-
-/**
- * Compatibility wrapper for creating a new XMLHttpRequest object.
- */
-function createXhr() {
-       debug( 'sajax_init_object() called..' );
-       var a;
-       try {
-               // Try the new style before ActiveX so we don't
-               // unnecessarily trigger warnings in IE 7 when
-               // set to prompt about ActiveX usage
-               a = new XMLHttpRequest();
-       } catch ( xhrE ) {
-               try {
-                       a = new window.ActiveXObject( 'Msxml2.XMLHTTP' );
-               } catch ( msXmlE ) {
-                       try {
-                               a = new window.ActiveXObject( 'Microsoft.XMLHTTP' );
-                       } catch ( msXhrE ) {
-                               a = null;
-                       }
-               }
-       }
-       if ( !a ) {
-               debug( 'Could not create connection object.' );
-       }
-
-       return a;
-}
-
-/**
- * Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php
- *   func_name - the name of the function to call. Must be registered in $wgAjaxExportList
- *   args - an array of arguments to that function
- *   target - the target that will handle the result of the call. If this is a function,
- *            if will be called with the XMLHttpRequest as a parameter; if it's an input
- *            element, its value will be set to the resultText; if it's another type of
- *            element, its innerHTML will be set to the resultText.
- *
- * Example:
- *    sajax_do_call( 'doFoo', [1, 2, 3], document.getElementById( 'showFoo' ) );
- *
- * This will call the doFoo function via MediaWiki's AjaxDispatcher, with
- * (1, 2, 3) as the parameter list, and will show the result in the element
- * with id = showFoo
- */
-function doAjaxRequest( func_name, args, target ) {
-       var i, x, uri, post_data;
-       uri = mw.util.wikiScript() + '?action=ajax';
-       if ( window.sajax_request_type === 'GET' ) {
-               if ( uri.indexOf( '?' ) === -1 ) {
-                       uri = uri + '?rs=' + encodeURIComponent( func_name );
-               } else {
-                       uri = uri + '&rs=' + encodeURIComponent( func_name );
-               }
-               for ( i = 0; i < args.length; i++ ) {
-                       uri = uri + '&rsargs[]=' + encodeURIComponent( args[i] );
-               }
-               //uri = uri + '&rsrnd=' + new Date().getTime();
-               post_data = null;
-       } else {
-               post_data = 'rs=' + encodeURIComponent( func_name );
-               for ( i = 0; i < args.length; i++ ) {
-                       post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] );
-               }
-       }
-       x = createXhr();
-       if ( !x ) {
-               alert( 'AJAX not supported' );
-               return false;
-       }
-
-       try {
-               x.open( window.sajax_request_type, uri, true );
-       } catch ( e ) {
-               if ( location.hostname === 'localhost' ) {
-                       alert( 'Your browser blocks XMLHttpRequest to "localhost", try using a real hostname for development/testing.' );
-               }
-               throw e;
-       }
-       if ( window.sajax_request_type === 'POST' ) {
-               x.setRequestHeader( 'Method', 'POST ' + uri + ' HTTP/1.1' );
-               x.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
-       }
-       x.setRequestHeader( 'Pragma', 'cache=yes' );
-       x.setRequestHeader( 'Cache-Control', 'no-transform' );
-       x.onreadystatechange = function () {
-               if ( x.readyState !== 4 ) {
-                       return;
-               }
-
-               debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
-
-               //if ( x.status != 200 )
-               //      alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText );
-               //else
-
-               if ( typeof target === 'function' ) {
-                       target( x );
-               } else if ( typeof target === 'object' ) {
-                       if ( target.tagName === 'INPUT' ) {
-                               if ( x.status === 200 ) {
-                                       target.value = x.responseText;
-                               }
-                               //else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' );
-                       } else {
-                               if ( x.status === 200 ) {
-                                       target.innerHTML = x.responseText;
-                               } else {
-                                       target.innerHTML = '<div class="error">Error: ' + x.status +
-                                               ' ' + x.statusText + ' (' + x.responseText + ')</div>';
-                               }
-                       }
-               } else {
-                       alert( 'Bad target for sajax_do_call: not a function or object: ' + target );
-               }
-       };
-
-       debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
-       x.send( post_data );
-       debug( func_name + ' waiting..' );
-
-       return true;
-}
-
-/**
- * @return {boolean} Whether the browser supports AJAX
- */
-function wfSupportsAjax() {
-       var request = createXhr(),
-               supportsAjax = request ? true : false;
-
-       request = undefined;
-       return supportsAjax;
-}
-
-// Expose + Mark as deprecated
-var deprecationNotice = 'Sajax is deprecated, use jQuery.ajax or mediawiki.api instead.';
-
-// Variables
-mw.log.deprecate( window, 'sajax_debug_mode', false, deprecationNotice );
-mw.log.deprecate( window, 'sajax_request_type', 'GET', deprecationNotice );
-// Methods
-mw.log.deprecate( window, 'sajax_debug', debug, deprecationNotice );
-mw.log.deprecate( window, 'sajax_init_object', createXhr, deprecationNotice );
-mw.log.deprecate( window, 'sajax_do_call', doAjaxRequest, deprecationNotice );
-mw.log.deprecate( window, 'wfSupportsAjax', wfSupportsAjax, deprecationNotice );
-
-}( mediaWiki ) );
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..6cf8d718503709f208b5fbecec35ab55ea3d9f13
--- /dev/null
@@ -0,0 +1 @@
+../../resources/src/mediawiki.legacy/ajax.js
\ No newline at end of file
diff --git a/skins/common/commonContent.css b/skins/common/commonContent.css
deleted file mode 100644 (file)
index 2ee787b..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-/**
- * MediaWiki style sheet for general styles on complex content
- *
- * Styles for complex things which are a standard part of page content
- * (ie: the CSS classing built into the system), like the TOC.
- */
-
-/* Table of Contents */
-#toc,
-.toc,
-.mw-warning {
-       border: 1px solid #aaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       font-size: 95%;
-}
-
-/**
- * We want to display the ToC element with intrinsic width in block mode. The fit-content
- * value for width is however not supported by large groups of browsers.
- *
- * We use display:table. Even though it should only contain other table-* display
- * elements, there are no known problems with using this.
- *
- * Because IE < 8, FF 2 and other older browsers don't support display:table, we fallback to
- * using inline-block mode, which features at least intrinsic width, but won't clear preceding
- * inline elements. In practice inline elements surrounding the TOC are uncommon enough that
- * this is an acceptable sacrifice.
- */
-#toc,
-.toc {
-       display: -moz-inline-block;
-       display: inline-block;
-       display: table;
-
-       /* IE7 and earlier */
-       zoom: 1;
-       *display: inline;
-
-       padding: 7px;
-}
-
-/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
-table#toc,
-table.toc {
-       border-collapse: collapse;
-}
-
-/* Remove additional paddings inside table-cells that are not present in <div>s */
-table#toc td,
-table.toc td {
-       padding: 0;
-}
-
-#toc h2,
-.toc h2 {
-       display: inline;
-       border: none;
-       padding: 0;
-       font-size: 100%;
-       font-weight: bold;
-}
-
-#toc #toctitle,
-.toc #toctitle,
-#toc .toctitle,
-.toc .toctitle {
-       text-align: center;
-}
-
-#toc ul,
-.toc ul {
-       list-style-type: none;
-       list-style-image: none;
-       margin-left: 0;
-       padding: 0;
-       text-align: left;
-}
-
-#toc ul ul,
-.toc ul ul {
-       margin: 0 0 0 2em;
-}
-
-#toc .toctoggle,
-.toc .toctoggle {
-       font-size: 94%;
-}
-
-.toccolours {
-       border: 1px solid #aaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       font-size: 95%;
-}
-
-/* Warning */
-.mw-warning {
-       margin-left: 50px;
-       margin-right: 50px;
-       text-align: center;
-}
-
-/* Images */
-/* @noflip */div.floatright, table.floatright {
-       margin: 0 0 .5em .5em;
-       border: 0;
-}
-
-div.floatright p {
-       font-style: italic;
-}
-
-/* @noflip */div.floatleft, table.floatleft {
-       margin: 0 .5em .5em 0;
-       border: 0;
-}
-
-div.floatleft p {
-       font-style: italic;
-}
-
-/* Thumbnails */
-div.thumb {
-       margin-bottom: .5em;
-       width: auto;
-       background-color: transparent;
-}
-
-div.thumbinner {
-       border: 1px solid #ccc;
-       padding: 3px !important;
-       background-color: #f9f9f9;
-       font-size: 94%;
-       text-align: center;
-       overflow: hidden;
-}
-
-html .thumbimage {
-       border: 1px solid #ccc;
-}
-
-html .thumbcaption {
-       border: none;
-       line-height: 1.4em;
-       padding: 3px !important;
-       text-align: left;
-       font-size: 94%;
-}
-
-div.magnify {
-       border: none !important;
-       background: none !important;
-       float: right;
-       margin-left: 3px;
-}
-
-div.magnify a, div.magnify img {
-       display: block;
-       border: none !important;
-       background: none !important;
-}
-
-/* @noflip */div.tright {
-       margin: .5em 0 1.3em 1.4em;
-}
-
-/* @noflip */div.tleft {
-       margin: .5em 1.4em 1.3em 0;
-}
-
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
diff --git a/skins/common/commonElements.css b/skins/common/commonElements.css
deleted file mode 100644 (file)
index 392a2a6..0000000
+++ /dev/null
@@ -1,273 +0,0 @@
-/**
- * MediaWiki style sheet for general styles on basic content elements
- *
- * Styles for basic elements: links, lists, etc...
- *
- * This style sheet is used by the Monobook and Vector skins.
- */
-
-/* Links */
-a {
-       text-decoration: none;
-       color: #0645ad;
-       background: none;
-}
-
-a:visited {
-       color: #0b0080;
-}
-
-a:active {
-       color: #faa700;
-}
-
-a:hover, a:focus {
-       text-decoration: underline;
-}
-
-a.stub {
-       color: #772233;
-}
-
-a.new, #p-personal a.new {
-       color: #ba0000;
-}
-
-a.new:visited, #p-personal a.new:visited {
-       color: #a55858;
-}
-
-/* Interwiki Styling */
-.mw-body a.extiw,
-.mw-body a.extiw:active {
-       color: #36b;
-}
-
-.mw-body a.extiw:visited {
-       color: #636;
-}
-
-.mw-body a.extiw:active {
-       color: #b63;
-}
-
-/* External links */
-.mw-body a.external {
-       color: #36b;
-}
-
-.mw-body a.external:visited {
-       color: #636; /* bug 3112 */
-}
-
-.mw-body a.external:active {
-       color: #b63;
-}
-
-/* Inline Elements */
-img {
-       border: none;
-       vertical-align: middle;
-}
-
-hr {
-       height: 1px;
-       color: #aaa;
-       background-color: #aaa;
-       border: 0;
-       margin: .2em 0;
-}
-
-/* Structural Elements */
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-       color: black;
-       background: none;
-       font-weight: normal;
-       margin: 0;
-       overflow: hidden;
-       padding-top: .5em;
-       padding-bottom: .17em;
-       border-bottom: 1px solid #aaa;
-}
-
-h1 {
-       font-size: 188%;
-}
-
-h2 {
-       font-size: 150%;
-}
-
-h3,
-h4,
-h5,
-h6 {
-       border-bottom: none;
-       font-weight: bold;
-}
-
-h3 {
-       font-size: 132%;
-}
-
-h4 {
-       font-size: 116%;
-}
-
-h5 {
-       font-size: 108%;
-}
-
-h6 {
-       font-size: 100%;
-}
-
-/* Some space under the headers in the content area */
-h1,
-h2 {
-       margin-bottom: .6em;
-}
-
-h3,
-h4,
-h5 {
-       margin-bottom: .3em;
-}
-
-p {
-       margin: .4em 0 .5em 0;
-       line-height: 1.5em;
-}
-
-p img {
-       margin: 0;
-}
-
-ul {
-       line-height: 1.5em;
-       list-style-type: square;
-       margin: .3em 0 0 1.6em;
-       padding: 0;
-}
-
-ol {
-       line-height: 1.5em;
-       margin: .3em 0 0 3.2em;
-       padding: 0;
-       list-style-image: none;
-}
-
-li {
-       margin-bottom: .1em;
-}
-
-dt {
-       font-weight: bold;
-       margin-bottom: .1em;
-}
-
-dl {
-       margin-top: .2em;
-       margin-bottom: .5em;
-}
-
-dd {
-       line-height: 1.5em;
-       margin-left: 1.6em;
-       margin-bottom: .1em;
-}
-
-/* IE 6 and 7 lack support for quotes aroud the <q> element ('::before' and '::after'
-   pseudoelements, 'quotes' property). Let's italicize it instead (using the star hack). */
-q {
-       *font-style: italic;
-}
-
-pre, code, tt, kbd, samp, .mw-code {
-       /*
-        * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
-        * Specifying any valid, second value will trigger correct behavior without forcing a different font.
-        */
-       font-family: monospace, Courier;
-}
-
-code {
-       color: black;
-       background-color: #f9f9f9;
-       border: 1px solid #ddd;
-       border-radius: 2px;
-       padding: 1px 4px;
-}
-
-pre, .mw-code {
-       color: black;
-       background-color: #f9f9f9;
-       border: 1px solid #ddd;
-       padding: 1em;
-}
-
-/* Tables */
-table {
-       font-size: 100%;
-}
-
-/* Forms */
-fieldset {
-       border: 1px solid #2f6fab;
-       margin: 1em 0 1em 0;
-       padding: 0 1em 1em;
-       line-height: 1.5em;
-}
-
-fieldset.nested {
-       margin: 0 0 0.5em 0;
-       padding: 0 0.5em 0.5em;
-}
-
-legend {
-       padding: .5em;
-       font-size: 95%;
-}
-
-form {
-       border: none;
-       margin: 0;
-}
-
-textarea {
-       width: 100%;
-       padding: .1em;
-       display: block;
-       -moz-box-sizing: border-box;
-       -webkit-box-sizing: border-box;
-       box-sizing: border-box;
-}
-
-select {
-       vertical-align: top;
-}
-
-/* Emulate Center */
-.center {
-       width: 100%;
-       text-align: center;
-}
-
-*.center * {
-       margin-left: auto;
-       margin-right: auto;
-}
-
-/* Small for tables and similar */
-.small {
-       font-size: 94%;
-}
-
-table.small {
-       font-size: 100%;
-}
diff --git a/skins/common/commonInterface.css b/skins/common/commonInterface.css
deleted file mode 100644 (file)
index 733fd11..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * MediaWiki style sheet for common core styles on interfaces
- *
- * Styles for the Monobook/Vector pattern of laying out common interfaces.
- * These ids/classes are not built into the system,
- * they are outputted by the actual MonoBook/Vector code by convention.
- */
-
-/* Categories */
-.catlinks {
-       border: 1px solid #aaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       margin-top: 1em;
-       clear: both;
-}
-
-/* User Message */
-.usermessage {
-       background-color: #ffce7b;
-       border: 1px solid #ffa500;
-       color: black;
-       font-weight: bold;
-       margin: 2em 0 1em;
-       padding: .5em 1em;
-       vertical-align: middle;
-}
-
-/* Site Notice (includes notices from CentralNotice extension) */
-#siteNotice {
-       position: relative;
-       text-align: center;
-       margin: 0;
-}
-
-#localNotice {
-       margin-bottom: 0.9em;
-}
-
-/* First h1 */
-.firstHeading,
-#firstHeading {
-       margin-bottom: .1em;
-       /* These two rules hack around bug 2013 (fix for more limited bug 11325).
-        * When bug 2013 is fixed properly, they should be removed. */
-       line-height: 1.2em;
-       padding-bottom: 0;
-}
-
-/* Sub-navigation */
-#siteSub {
-       display: none;
-}
-
-#jump-to-nav {
-       /* Negate #contentSub's margin and replicate it so that the jump to links don't affect the spacing */
-       margin-top: -1.4em;
-       margin-bottom: 1.4em;
-}
-
-#contentSub, #contentSub2 {
-       font-size: 84%;
-       line-height: 1.2em;
-       margin: 0 0 1.4em 1em;
-       color: #545454;
-       width: auto;
-}
-
-span.subpages {
-       display: block;
-}
diff --git a/skins/common/commonPrint.css b/skins/common/commonPrint.css
deleted file mode 100644 (file)
index dda17fb..0000000
+++ /dev/null
@@ -1,431 +0,0 @@
-/**
- * MediaWiki Print style sheet for CSS2-capable browsers.
- * Copyright Gabriel Wicke, http://www.aulinx.de/
- *
- * Derived from the plone (http://plone.org/) styles
- * Copyright Alexander Limi
- */
-
-/* Thanks to A List Apart (http://alistapart.com/) for useful extras */
-
-/**
- * Hide all the elements irrelevant for printing
- */
-.noprint,
-div#jump-to-nav,
-.mw-jump,
-div.top,
-div#column-one,
-#colophon,
-.mw-editsection,
-.mw-editsection-like,
-.toctoggle,
-#toc.tochidden,
-div#f-poweredbyico,
-div#f-copyrightico,
-li#viewcount,
-li#about,
-li#disclaimer,
-li#mobileview,
-li#privacy,
-#footer-places,
-.mw-hidden-catlinks,
-tr.mw-metadata-show-hide-extended,
-span.mw-filepage-other-resolutions,
-#filetoc,
-.usermessage,
-.patrollink,
-#mw-navigation,
-#siteNotice {
-       display: none;
-}
-
-/**
- * Pagination
- */
-.wikitable, .thumb, img {
-       page-break-inside: avoid;
-}
-
-h2, h3, h4, h5, h6 {
-       page-break-after: avoid;
-}
-
-p {
-       widows: 3;
-       orphans: 3;
-}
-
-/**
- * Generic HTML elements
- */
-body {
-       background: white;
-       color: black;
-       margin: 0;
-       padding: 0;
-}
-
-ul {
-       list-style-type: square;
-}
-
-h1, h2, h3, h4, h5, h6 {
-       font-weight: bold;
-}
-
-dt {
-       font-weight: bold;
-}
-
-p {
-       margin: 1em 0;
-       line-height: 1.2em;
-}
-
-pre, .mw-code {
-       border: 1pt dashed black;
-       white-space: pre;
-       font-size: 8pt;
-       overflow: auto;
-       padding: 1em 0;
-       background: white;
-       color: black;
-}
-
-/**
- * MediaWiki-specific elements
- */
-#globalWrapper {
-       width: 100% !important;
-       min-width: 0 !important;
-}
-
-#content {
-       background: white;
-       border: none !important;
-       padding: 0 !important;
-       margin: 0 !important;
-       direction: ltr;
-       color: black;
-}
-
-#column-content {
-       margin: 0 !important;
-}
-
-#column-content #content {
-       padding: 1em;
-       margin: 0 !important;
-}
-
-#toc {
-       border: 1px solid #aaaaaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       display: -moz-inline-block;
-       display: inline-block;
-       display: table;
-       /* IE7 and earlier */
-       zoom: 1;
-       *display: inline;
-}
-
-#footer {
-       background: white;
-       color: black;
-       margin-top: 1em;
-       border-top: 1px solid #AAA;
-       direction: ltr;
-}
-
-img {
-       border: none;
-       vertical-align: middle;
-}
-
-/* math */
-span.texhtml {
-       font-family: serif;
-}
-
-/**
- * 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 */
-#content a.external.text:after,
-#content a.external.autonumber:after {
-       content: " (" attr(href) ")";
-}
-
-/* Expand protocol-relative URLs for printing */
-#content a.external.text[href^='//']:after,
-#content a.external.autonumber[href^='//']:after {
-       content: " (https:" attr(href) ")";
-}
-
-/* MSIE/Win doesn't understand 'inherit' */
-a,
-a.external,
-a.new,
-a.stub {
-       color: black !important;
-       text-decoration: none !important;
-}
-
-/* Continue ... */
-a,
-a.external,
-a.new,
-a.stub {
-       color: inherit !important;
-       text-decoration: inherit !important;
-}
-
-/**
- * Floating divs
- */
-div.floatright {
-       float: right;
-       clear: right;
-       position: relative;
-       margin: 0.5em 0 0.8em 1.4em;
-}
-
-div.floatright p {
-       font-style: italic;
-}
-
-div.floatleft {
-       float: left;
-       clear: left;
-       position: relative;
-       margin: 0.5em 1.4em 0.8em 0;
-}
-
-div.floatleft p {
-       font-style: italic;
-}
-
-div.center {
-       text-align: center;
-}
-
-/**
- * Thumbnails
- */
-div.thumb {
-       border: none;
-       width: auto;
-       margin-top: 0.5em;
-       margin-bottom: 0.8em;
-       background-color: transparent;
-}
-
-div.thumbinner {
-       border: 1px solid #cccccc;
-       padding: 3px !important;
-       background-color: White;
-       font-size: 94%;
-       text-align: center;
-       overflow: hidden;
-}
-
-html .thumbimage {
-       border: 1px solid #cccccc;
-}
-
-html .thumbcaption {
-       border: none;
-       text-align: left;
-       line-height: 1.4em;
-       padding: 3px !important;
-       font-size: 94%;
-}
-
-div.magnify {
-       display: none;
-}
-
-/* @noflip */
-div.tright {
-       float: right;
-       clear: right;
-       margin: 0.5em 0 0.8em 1.4em;
-}
-
-/* @noflip */
-div.tleft {
-       float: left;
-       clear: left;
-       margin: 0.5em 1.4em 0.8em 0;
-}
-
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
-
-/**
- * Galleries (see shared.css for more info)
- */
-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 rendering
- */
-table.diff {
-       background: white;
-}
-
-td.diff-otitle {
-       background: #ffffff;
-}
-
-td.diff-ntitle {
-       background: #ffffff;
-}
-
-td.diff-addedline {
-       background: #ccffcc;
-       font-size: smaller;
-       border: solid 2px black;
-}
-
-td.diff-deletedline {
-       background: #ffffaa;
-       font-size: smaller;
-       border: dotted 2px black;
-}
-
-td.diff-context {
-       background: #eeeeee;
-       font-size: smaller;
-}
-
-.diffchange {
-       color: silver;
-       font-weight: bold;
-       text-decoration: underline;
-}
-
-/**
- * Table rendering
- * As on shared.css but with white background.
- */
-table.wikitable,
-table.mw_metadata {
-       margin: 1em 0;
-       border: 1px #aaa solid;
-       background: white;
-       border-collapse: collapse;
-}
-
-table.wikitable > tr > th, table.wikitable > tr > td,
-table.wikitable > * > tr > th, table.wikitable > * > tr > td,
-.mw_metadata th, .mw_metadata td {
-       border: 1px #aaa solid;
-       padding: 0.2em;
-}
-
-table.wikitable > tr > th,
-table.wikitable > * > tr > th,
-.mw_metadata th {
-       text-align: center;
-       background: white;
-       font-weight: bold;
-}
-
-table.wikitable > caption,
-.mw_metadata caption {
-       font-weight: bold;
-}
-
-table.listing,
-table.listing td {
-       border: 1pt solid black;
-       border-collapse: collapse;
-}
-
-a.sortheader {
-       margin: 0 0.3em;
-}
-
-/**
- * Categories
- */
-.catlinks ul {
-       display: inline;
-       margin: 0;
-       padding: 0;
-       list-style: none;
-       list-style-type: none;
-       list-style-image: none;
-       vertical-align: middle !ie;
-}
-
-.catlinks li {
-       display: inline-block;
-       line-height: 1.15em;
-       padding: 0 .4em;
-       border-left: 1px solid #AAA;
-       margin: 0.1em 0;
-       zoom: 1;
-       display: inline !ie;
-}
-
-.catlinks li:first-child {
-       padding-left: .2em;
-       border-left: none;
-}
diff --git a/skins/common/feed.css b/skins/common/feed.css
deleted file mode 100644 (file)
index dc0453d..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
-Make RSS and Atom feeds at least semi-legible to folk who accidentally
-load them in a browser...
-
-Compatibility:
-* Mozilla is fine.
-* Safari 1.2: the RSS <link> text isn't shown
-* Opera 7.5 uses the style sheet instead of its native RSS mode.
-* IE/Mac 5.2: none of the :before content works; doesn't get the charset right and displays garbage for non-ASCII.
-* IE/Win 6.0: No background color, borders, font size, font weight, or :before content.
-
-*/
-
-/* RSS: */ rss, channel, title, link, description, language, generator, lastBuildDate, item, pubDate, author, comments, creator,
-/* Atom: */ feed, id, modified, tagline, entry, issued, created, updated, summary, comment {
-       display: block;
-}
-
-rss, feed {
-       background: white;
-       color: black;
-       margin: 1em;
-       font-family: "Verdana", "Tahoma", "Arial", "Helvetica", sans-serif;
-       line-height: 1.5em;
-       font-size: 76%;
-}
-
-rss:before {
-       content: "This RSS feed is meant to be read in a syndicated news reader, and isn't ideal for a web browser.";
-}
-
-feed:before {
-       content: "This Atom feed is meant to be read in a syndicated news reader, and isn't ideal for a web browser.";
-}
-
-rss:before, feed:before {
-       color: red;
-       text-align: center;
-       line-height: 2em;
-}
-
-channel > title,
-item > title,
-feed > title,
-entry > title {
-       font-weight: bold;
-       border-bottom: solid 1px #aaa;
-       margin-left: -0.5em;
-}
-
-channel > title, feed > title {
-       font-size: larger;
-}
-
-item > title, entry > title {
-       font-size: large;
-}
-
-item, entry {
-       margin-top: 1em;
-       margin-left: 2em;
-}
-
-item > description, entry > summary {
-       white-space: pre;
-       overflow: auto;
-       background: #f8f8ff;
-}
-
-pubDate:before {
-       content: "Date: ";
-}
-
-link:before {
-       content: "Link: ";
-}
-
-author:before, creator:before {
-       content: "Author: ";
-}
-
-description:before {
-       content: "Description: ";
-}
-
-id:before {
-       content: "Id: ";
-}
-
-generator:before {
-       content: "Generator: ";
-}
-
-language:before {
-       content: "Language: ";
-}
-
-lastBuildDate:before {
-       content: "Updated: ";
-}
-
-comments:before {
-       content: "Comments page: ";
-}
-
-tagline:before {
-       content: "Tagline: ";
-}
-
-issued:before {
-       content: "Issued: ";
-}
-
-created:before {
-       content: "Created: ";
-}
-
-modified:before {
-       content: "Modified: ";
-}
-
-updated:before {
-       content: "Updated: ";
-}
-
-summary:before {
-       content: "Summary: ";
-}
-
-comment:before {
-       content: "Comment: ";
-}
-
-pubDate:before, link:before, author:before, description:before,
-language:before, generator:before, lastBuildDate:before, comments:before,
-tagline:before, issued:before, created:before, modified:before,
-summary:before, comment:before, creator:before, id:before, updated:before {
-       color: #224;
-       font-weight: bold;
-}
-
-feed link:after {
-       content: attr(href);
-}
diff --git a/skins/common/images/Arr_d.png b/skins/common/images/Arr_d.png
deleted file mode 100644 (file)
index 58a9fc6..0000000
Binary files a/skins/common/images/Arr_d.png and /dev/null differ
diff --git a/skins/common/images/Arr_u.png b/skins/common/images/Arr_u.png
deleted file mode 100644 (file)
index 1aa543a..0000000
Binary files a/skins/common/images/Arr_u.png and /dev/null differ
diff --git a/skins/common/images/Checker-16x16.png b/skins/common/images/Checker-16x16.png
deleted file mode 100644 (file)
index 3e9e3d0..0000000
Binary files a/skins/common/images/Checker-16x16.png and /dev/null differ
diff --git a/skins/common/images/ajax-loader.gif b/skins/common/images/ajax-loader.gif
deleted file mode 100644 (file)
index 72203fd..0000000
Binary files a/skins/common/images/ajax-loader.gif and /dev/null differ
diff --git a/skins/common/images/ar/button_bold.png b/skins/common/images/ar/button_bold.png
deleted file mode 100644 (file)
index e524f6c..0000000
Binary files a/skins/common/images/ar/button_bold.png and /dev/null differ
diff --git a/skins/common/images/ar/button_headline.png b/skins/common/images/ar/button_headline.png
deleted file mode 100644 (file)
index 398e561..0000000
Binary files a/skins/common/images/ar/button_headline.png and /dev/null differ
diff --git a/skins/common/images/ar/button_italic.png b/skins/common/images/ar/button_italic.png
deleted file mode 100644 (file)
index 6ec73e9..0000000
Binary files a/skins/common/images/ar/button_italic.png and /dev/null differ
diff --git a/skins/common/images/ar/button_link.png b/skins/common/images/ar/button_link.png
deleted file mode 100644 (file)
index c9c63f6..0000000
Binary files a/skins/common/images/ar/button_link.png and /dev/null differ
diff --git a/skins/common/images/ar/button_nowiki.png b/skins/common/images/ar/button_nowiki.png
deleted file mode 100644 (file)
index 743ea61..0000000
Binary files a/skins/common/images/ar/button_nowiki.png and /dev/null differ
diff --git a/skins/common/images/arrow_disabled_first_25.png b/skins/common/images/arrow_disabled_first_25.png
deleted file mode 100644 (file)
index 78a493e..0000000
Binary files a/skins/common/images/arrow_disabled_first_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_disabled_last_25.png b/skins/common/images/arrow_disabled_last_25.png
deleted file mode 100644 (file)
index 2a64fd0..0000000
Binary files a/skins/common/images/arrow_disabled_last_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_disabled_left_25.png b/skins/common/images/arrow_disabled_left_25.png
deleted file mode 100644 (file)
index 83df068..0000000
Binary files a/skins/common/images/arrow_disabled_left_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_disabled_right_25.png b/skins/common/images/arrow_disabled_right_25.png
deleted file mode 100644 (file)
index aa4fbf8..0000000
Binary files a/skins/common/images/arrow_disabled_right_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_first_25.png b/skins/common/images/arrow_first_25.png
deleted file mode 100644 (file)
index 52b32a5..0000000
Binary files a/skins/common/images/arrow_first_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_last_25.png b/skins/common/images/arrow_last_25.png
deleted file mode 100644 (file)
index caf5033..0000000
Binary files a/skins/common/images/arrow_last_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_left_25.png b/skins/common/images/arrow_left_25.png
deleted file mode 100644 (file)
index f363bf6..0000000
Binary files a/skins/common/images/arrow_left_25.png and /dev/null differ
diff --git a/skins/common/images/arrow_right_25.png b/skins/common/images/arrow_right_25.png
deleted file mode 100644 (file)
index 3f8fee3..0000000
Binary files a/skins/common/images/arrow_right_25.png and /dev/null differ
diff --git a/skins/common/images/be-tarask/button_bold.png b/skins/common/images/be-tarask/button_bold.png
deleted file mode 100644 (file)
index 5c10cfe..0000000
Binary files a/skins/common/images/be-tarask/button_bold.png and /dev/null differ
diff --git a/skins/common/images/be-tarask/button_italic.png b/skins/common/images/be-tarask/button_italic.png
deleted file mode 100644 (file)
index 72209d7..0000000
Binary files a/skins/common/images/be-tarask/button_italic.png and /dev/null differ
diff --git a/skins/common/images/be-tarask/button_link.png b/skins/common/images/be-tarask/button_link.png
deleted file mode 100644 (file)
index 09c86fb..0000000
Binary files a/skins/common/images/be-tarask/button_link.png and /dev/null differ
diff --git a/skins/common/images/button_bold.png b/skins/common/images/button_bold.png
deleted file mode 100644 (file)
index 75c3f10..0000000
Binary files a/skins/common/images/button_bold.png and /dev/null differ
diff --git a/skins/common/images/button_extlink.png b/skins/common/images/button_extlink.png
deleted file mode 100644 (file)
index 458943c..0000000
Binary files a/skins/common/images/button_extlink.png and /dev/null differ
diff --git a/skins/common/images/button_headline.png b/skins/common/images/button_headline.png
deleted file mode 100644 (file)
index 9cf751d..0000000
Binary files a/skins/common/images/button_headline.png and /dev/null differ
diff --git a/skins/common/images/button_hr.png b/skins/common/images/button_hr.png
deleted file mode 100644 (file)
index 47e1ca4..0000000
Binary files a/skins/common/images/button_hr.png and /dev/null differ
diff --git a/skins/common/images/button_image.png b/skins/common/images/button_image.png
deleted file mode 100644 (file)
index 6919296..0000000
Binary files a/skins/common/images/button_image.png and /dev/null differ
diff --git a/skins/common/images/button_italic.png b/skins/common/images/button_italic.png
deleted file mode 100644 (file)
index 527fbd1..0000000
Binary files a/skins/common/images/button_italic.png and /dev/null differ
diff --git a/skins/common/images/button_link.png b/skins/common/images/button_link.png
deleted file mode 100644 (file)
index eb5634b..0000000
Binary files a/skins/common/images/button_link.png and /dev/null differ
diff --git a/skins/common/images/button_media.png b/skins/common/images/button_media.png
deleted file mode 100644 (file)
index 4194ec1..0000000
Binary files a/skins/common/images/button_media.png and /dev/null differ
diff --git a/skins/common/images/button_nowiki.png b/skins/common/images/button_nowiki.png
deleted file mode 100644 (file)
index 2ba818d..0000000
Binary files a/skins/common/images/button_nowiki.png and /dev/null differ
diff --git a/skins/common/images/button_sig.png b/skins/common/images/button_sig.png
deleted file mode 100644 (file)
index fe34b3f..0000000
Binary files a/skins/common/images/button_sig.png and /dev/null differ
diff --git a/skins/common/images/button_template.png b/skins/common/images/button_template.png
deleted file mode 100644 (file)
index 94d9d0b..0000000
Binary files a/skins/common/images/button_template.png and /dev/null differ
diff --git a/skins/common/images/cc-0.png b/skins/common/images/cc-0.png
deleted file mode 100644 (file)
index 9d3fe5f..0000000
Binary files a/skins/common/images/cc-0.png and /dev/null differ
diff --git a/skins/common/images/cc-by-nc-sa.png b/skins/common/images/cc-by-nc-sa.png
deleted file mode 100644 (file)
index 0d24a71..0000000
Binary files a/skins/common/images/cc-by-nc-sa.png and /dev/null differ
diff --git a/skins/common/images/cc-by-sa.png b/skins/common/images/cc-by-sa.png
deleted file mode 100644 (file)
index 518fb64..0000000
Binary files a/skins/common/images/cc-by-sa.png and /dev/null differ
diff --git a/skins/common/images/cc-by.png b/skins/common/images/cc-by.png
deleted file mode 100644 (file)
index 9cca2f9..0000000
Binary files a/skins/common/images/cc-by.png and /dev/null differ
diff --git a/skins/common/images/closewindow19x19.png b/skins/common/images/closewindow19x19.png
deleted file mode 100644 (file)
index c96d9ff..0000000
Binary files a/skins/common/images/closewindow19x19.png and /dev/null differ
diff --git a/skins/common/images/cyrl/LICENSE b/skins/common/images/cyrl/LICENSE
deleted file mode 100644 (file)
index bedcec6..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-button_bold.png
----------------
-Source : http://commons.wikimedia.org/wiki/Image:Button_bold_ukr.png
-License: Public domain
-Author : Alexey Belomoev
-
-button_italic.png
-------------------------
-Source : http://commons.wikimedia.org/wiki/Image:Button_italic_ukr.png
-License: Public domain
-Author : Alexey Belomoev
-
-button_link.png
------------------
-Source : http://commons.wikimedia.org/wiki/Image:Button_internal_link_ukr.png
-License: GPL
-Author : Saproj, Erik Möller
diff --git a/skins/common/images/cyrl/button_bold.png b/skins/common/images/cyrl/button_bold.png
deleted file mode 100644 (file)
index eae30d9..0000000
Binary files a/skins/common/images/cyrl/button_bold.png and /dev/null differ
diff --git a/skins/common/images/cyrl/button_italic.png b/skins/common/images/cyrl/button_italic.png
deleted file mode 100644 (file)
index b958d22..0000000
Binary files a/skins/common/images/cyrl/button_italic.png and /dev/null differ
diff --git a/skins/common/images/cyrl/button_link.png b/skins/common/images/cyrl/button_link.png
deleted file mode 100644 (file)
index 12ad373..0000000
Binary files a/skins/common/images/cyrl/button_link.png and /dev/null differ
diff --git a/skins/common/images/de/button_bold.png b/skins/common/images/de/button_bold.png
deleted file mode 100644 (file)
index 367d5bc..0000000
Binary files a/skins/common/images/de/button_bold.png and /dev/null differ
diff --git a/skins/common/images/de/button_italic.png b/skins/common/images/de/button_italic.png
deleted file mode 100644 (file)
index fdd8c9f..0000000
Binary files a/skins/common/images/de/button_italic.png and /dev/null differ
diff --git a/skins/common/images/fa/button_bold.png b/skins/common/images/fa/button_bold.png
deleted file mode 100644 (file)
index c54d094..0000000
Binary files a/skins/common/images/fa/button_bold.png and /dev/null differ
diff --git a/skins/common/images/fa/button_headline.png b/skins/common/images/fa/button_headline.png
deleted file mode 100644 (file)
index 9890d15..0000000
Binary files a/skins/common/images/fa/button_headline.png and /dev/null differ
diff --git a/skins/common/images/fa/button_italic.png b/skins/common/images/fa/button_italic.png
deleted file mode 100644 (file)
index 33f91ed..0000000
Binary files a/skins/common/images/fa/button_italic.png and /dev/null differ
diff --git a/skins/common/images/fa/button_link.png b/skins/common/images/fa/button_link.png
deleted file mode 100644 (file)
index 76b939e..0000000
Binary files a/skins/common/images/fa/button_link.png and /dev/null differ
diff --git a/skins/common/images/fa/button_nowiki.png b/skins/common/images/fa/button_nowiki.png
deleted file mode 100644 (file)
index 743ea61..0000000
Binary files a/skins/common/images/fa/button_nowiki.png and /dev/null differ
diff --git a/skins/common/images/feed-icon.png b/skins/common/images/feed-icon.png
deleted file mode 100644 (file)
index 00f49f6..0000000
Binary files a/skins/common/images/feed-icon.png and /dev/null differ
diff --git a/skins/common/images/feed-icon.svg b/skins/common/images/feed-icon.svg
deleted file mode 100644 (file)
index 6e5f570..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 256 256"><defs><linearGradient x1=".085" y1=".085" x2=".915" y2=".915" id="a"><stop offset="0" stop-color="#E3702D"/><stop offset=".107" stop-color="#EA7D31"/><stop offset=".35" stop-color="#F69537"/><stop offset=".5" stop-color="#FB9E3A"/><stop offset=".702" stop-color="#EA7C31"/><stop offset=".887" stop-color="#DE642B"/><stop offset="1" stop-color="#D95B29"/></linearGradient></defs><rect width="256" height="256" rx="55" ry="55" fill="#CC5D15"/><rect width="246" height="246" rx="50" ry="50" x="5" y="5" fill="#F49C52"/><rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#a)"/><circle cx="68" cy="189" r="24" fill="#FFF"/><path d="M160 213h-34a82 82 0 0 0-82-82v-34a116 116 0 0 1 116 116zM184 213a140 140 0 0 0-140-140v-35a175 175 0 0 1 175 175z" fill="#FFF"/></svg>
\ No newline at end of file
diff --git a/skins/common/images/gnu-fdl.png b/skins/common/images/gnu-fdl.png
deleted file mode 100644 (file)
index 3feaf57..0000000
Binary files a/skins/common/images/gnu-fdl.png and /dev/null differ
diff --git a/skins/common/images/help-question-hover.gif b/skins/common/images/help-question-hover.gif
deleted file mode 100644 (file)
index 515138d..0000000
Binary files a/skins/common/images/help-question-hover.gif and /dev/null differ
diff --git a/skins/common/images/help-question.gif b/skins/common/images/help-question.gif
deleted file mode 100644 (file)
index b4fc9c5..0000000
Binary files a/skins/common/images/help-question.gif and /dev/null differ
diff --git a/skins/common/images/icons/COPYING b/skins/common/images/icons/COPYING
deleted file mode 100644 (file)
index 136530a..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-The icons used here are derived from the crystalsvg icons in the the
-pics/crystalsvg/ directory of kdelibs-3.4.0 they were modified on 2005-05-15
-by Ævar Arnfjörð Bjarmason for use in MediaWiki.
-
-What follows is the contents of the LICENSE.crystalsvg file found in the pics/
-subdirectory of kdelibs-3.4.0:
-
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-This copyright and license notice covers all CrystalSVG images.
-Note the license notice contains an add-on.
-********************************************************************************
-KDE Crystal theme icons.
-Copyright (C) 2002 and following years KDE Artists
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation,
-version 2.1 of the License.
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-    **** NOTE THIS ADD-ON ****
-The GNU Lesser General Public License or LGPL is written for software libraries
-in the first place. We expressly want the LGPL to be valid for this artwork
-library too.
-KDE Crystal theme icons is a special kind of software library, it is an
-artwork library, it's elements can be used in a Graphical User Interface, or
-GUI.
-Source code, for this library means:
- - for vectors svg;
- - for pixels, if applicable, the multi-layered formats xcf or psd, or
-otherwise png.
-The LGPL in some sections obliges you to make the files carry
-notices. With images this is in some cases impossible or hardly useful.
-With this library a notice is placed at a prominent place in the directory
-containing the elements. You may follow this practice.
-The exception in section 6 of the GNU Lesser General Public License covers
-the use of elements of this art library in a GUI.
-kde-artists [at] kde.org
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/skins/common/images/icons/fileicon-c.png b/skins/common/images/icons/fileicon-c.png
deleted file mode 100644 (file)
index 0d603b7..0000000
Binary files a/skins/common/images/icons/fileicon-c.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-cpp.png b/skins/common/images/icons/fileicon-cpp.png
deleted file mode 100644 (file)
index 123688f..0000000
Binary files a/skins/common/images/icons/fileicon-cpp.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-deb.png b/skins/common/images/icons/fileicon-deb.png
deleted file mode 100644 (file)
index 87ca3fa..0000000
Binary files a/skins/common/images/icons/fileicon-deb.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-djvu.png b/skins/common/images/icons/fileicon-djvu.png
deleted file mode 100644 (file)
index 1da2276..0000000
Binary files a/skins/common/images/icons/fileicon-djvu.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-djvu.xcf b/skins/common/images/icons/fileicon-djvu.xcf
deleted file mode 100644 (file)
index 8043dcd..0000000
Binary files a/skins/common/images/icons/fileicon-djvu.xcf and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-dvi.png b/skins/common/images/icons/fileicon-dvi.png
deleted file mode 100644 (file)
index f37878d..0000000
Binary files a/skins/common/images/icons/fileicon-dvi.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-exe.png b/skins/common/images/icons/fileicon-exe.png
deleted file mode 100644 (file)
index dc020eb..0000000
Binary files a/skins/common/images/icons/fileicon-exe.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-h.png b/skins/common/images/icons/fileicon-h.png
deleted file mode 100644 (file)
index 339bf02..0000000
Binary files a/skins/common/images/icons/fileicon-h.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-html.png b/skins/common/images/icons/fileicon-html.png
deleted file mode 100644 (file)
index f28f8a2..0000000
Binary files a/skins/common/images/icons/fileicon-html.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-iso.png b/skins/common/images/icons/fileicon-iso.png
deleted file mode 100644 (file)
index c73d229..0000000
Binary files a/skins/common/images/icons/fileicon-iso.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-java.png b/skins/common/images/icons/fileicon-java.png
deleted file mode 100644 (file)
index a1b4f22..0000000
Binary files a/skins/common/images/icons/fileicon-java.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-mid.png b/skins/common/images/icons/fileicon-mid.png
deleted file mode 100644 (file)
index ce2bebb..0000000
Binary files a/skins/common/images/icons/fileicon-mid.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-mov.png b/skins/common/images/icons/fileicon-mov.png
deleted file mode 100644 (file)
index 952de1f..0000000
Binary files a/skins/common/images/icons/fileicon-mov.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-o.png b/skins/common/images/icons/fileicon-o.png
deleted file mode 100644 (file)
index f3523d9..0000000
Binary files a/skins/common/images/icons/fileicon-o.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-ogg.png b/skins/common/images/icons/fileicon-ogg.png
deleted file mode 100644 (file)
index ef4d801..0000000
Binary files a/skins/common/images/icons/fileicon-ogg.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-ogg.xcf b/skins/common/images/icons/fileicon-ogg.xcf
deleted file mode 100644 (file)
index a91024b..0000000
Binary files a/skins/common/images/icons/fileicon-ogg.xcf and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-pdf.png b/skins/common/images/icons/fileicon-pdf.png
deleted file mode 100644 (file)
index 8c8da92..0000000
Binary files a/skins/common/images/icons/fileicon-pdf.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-ps.png b/skins/common/images/icons/fileicon-ps.png
deleted file mode 100644 (file)
index e872833..0000000
Binary files a/skins/common/images/icons/fileicon-ps.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-psd.png b/skins/common/images/icons/fileicon-psd.png
deleted file mode 100644 (file)
index 598f190..0000000
Binary files a/skins/common/images/icons/fileicon-psd.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-rm.png b/skins/common/images/icons/fileicon-rm.png
deleted file mode 100644 (file)
index 81dbe0b..0000000
Binary files a/skins/common/images/icons/fileicon-rm.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-rpm.png b/skins/common/images/icons/fileicon-rpm.png
deleted file mode 100644 (file)
index 1903aac..0000000
Binary files a/skins/common/images/icons/fileicon-rpm.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-svg.png b/skins/common/images/icons/fileicon-svg.png
deleted file mode 100644 (file)
index b782113..0000000
Binary files a/skins/common/images/icons/fileicon-svg.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-tar.png b/skins/common/images/icons/fileicon-tar.png
deleted file mode 100644 (file)
index e5fd1b7..0000000
Binary files a/skins/common/images/icons/fileicon-tar.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-tex.png b/skins/common/images/icons/fileicon-tex.png
deleted file mode 100644 (file)
index a437284..0000000
Binary files a/skins/common/images/icons/fileicon-tex.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-ttf.png b/skins/common/images/icons/fileicon-ttf.png
deleted file mode 100644 (file)
index 1ed4e74..0000000
Binary files a/skins/common/images/icons/fileicon-ttf.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-txt.png b/skins/common/images/icons/fileicon-txt.png
deleted file mode 100644 (file)
index 9e988e7..0000000
Binary files a/skins/common/images/icons/fileicon-txt.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon-xcf.png b/skins/common/images/icons/fileicon-xcf.png
deleted file mode 100644 (file)
index 1037b50..0000000
Binary files a/skins/common/images/icons/fileicon-xcf.png and /dev/null differ
diff --git a/skins/common/images/icons/fileicon.png b/skins/common/images/icons/fileicon.png
deleted file mode 100644 (file)
index 59696a3..0000000
Binary files a/skins/common/images/icons/fileicon.png and /dev/null differ
diff --git a/skins/common/images/ksh/LICENSE b/skins/common/images/ksh/LICENSE
deleted file mode 100644 (file)
index ba56f97..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-
-button_S_italic.png
--------------------
-Source : http://commons.wikimedia.org/wiki/Image:Button_S_italic.png
-License: Public domain
-Author : Purodha Blissenbach, http://ksh.wikipedia.org/wiki/User:Purodha
-
diff --git a/skins/common/images/ksh/button_S_italic.png b/skins/common/images/ksh/button_S_italic.png
deleted file mode 100644 (file)
index 15496c0..0000000
Binary files a/skins/common/images/ksh/button_S_italic.png and /dev/null differ
diff --git a/skins/common/images/mediawiki.png b/skins/common/images/mediawiki.png
deleted file mode 100644 (file)
index 8c42118..0000000
Binary files a/skins/common/images/mediawiki.png and /dev/null differ
diff --git a/skins/common/images/nextredirectltr.png b/skins/common/images/nextredirectltr.png
deleted file mode 100644 (file)
index cd657c3..0000000
Binary files a/skins/common/images/nextredirectltr.png and /dev/null differ
diff --git a/skins/common/images/nextredirectrtl.png b/skins/common/images/nextredirectrtl.png
deleted file mode 100644 (file)
index b788f33..0000000
Binary files a/skins/common/images/nextredirectrtl.png and /dev/null differ
diff --git a/skins/common/images/poweredby_mediawiki_88x31.png b/skins/common/images/poweredby_mediawiki_88x31.png
deleted file mode 100644 (file)
index 30e1d2e..0000000
Binary files a/skins/common/images/poweredby_mediawiki_88x31.png and /dev/null differ
diff --git a/skins/common/images/public-domain.png b/skins/common/images/public-domain.png
deleted file mode 100644 (file)
index ebf0107..0000000
Binary files a/skins/common/images/public-domain.png and /dev/null differ
diff --git a/skins/common/images/question-small.png b/skins/common/images/question-small.png
deleted file mode 100644 (file)
index f7405d2..0000000
Binary files a/skins/common/images/question-small.png and /dev/null differ
diff --git a/skins/common/images/question.svg b/skins/common/images/question.svg
deleted file mode 100644 (file)
index 98fbe8d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="21.059" height="21.06"><path fill="#575757" d="M10.529 0c-5.814 0-10.529 4.714-10.529 10.529s4.715 10.53 10.529 10.53c5.816 0 10.529-4.715 10.529-10.53s-4.712-10.529-10.529-10.529zm-.002 16.767c-.861 0-1.498-.688-1.498-1.516 0-.862.637-1.534 1.498-1.534.828 0 1.5.672 1.5 1.534 0 .827-.672 1.516-1.5 1.516zm2.137-6.512c-.723.568-1 .931-1 1.739v.5h-2.205v-.603c0-1.517.449-2.136 1.154-2.688.707-.552 1.139-.845 1.139-1.637 0-.672-.414-1.051-1.24-1.051-.707 0-1.328.189-1.982.638l-1.051-1.807c.861-.604 1.93-1.034 3.342-1.034 1.912 0 3.516 1.051 3.516 3.066-.001 1.43-.794 2.188-1.673 2.877z"/></svg>
\ No newline at end of file
diff --git a/skins/common/images/spinner.gif b/skins/common/images/spinner.gif
deleted file mode 100644 (file)
index 6146be4..0000000
Binary files a/skins/common/images/spinner.gif and /dev/null differ
diff --git a/skins/common/images/wiki.png b/skins/common/images/wiki.png
deleted file mode 100644 (file)
index 48595b0..0000000
Binary files a/skins/common/images/wiki.png and /dev/null differ
diff --git a/skins/common/oldshared.css b/skins/common/oldshared.css
deleted file mode 100644 (file)
index 250f15c..0000000
+++ /dev/null
@@ -1,541 +0,0 @@
-/**
- * oldshared.css
- * This file contains CSS settings common to Wikistandard, Nostalgia and
- * CologneBlue, the old pre-Monobook skins
- */
-
-/* For clarity, explicitly state some recommendations from
- * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right
- */
-
-h1 {
-       font-size: 2em;
-}
-
-h2 {
-       font-size: 1.5em;
-}
-
-h3 {
-       font-size: 1.17em;
-}
-
-h4 {
-       font-size: 1.11em;
-}
-
-h5 {
-       font-size: 1.05em;
-}
-
-h6 {
-       font-size: 1em;
-}
-
-h1, h2, h3, h4, h5, h6 {
-       font-weight: bolder;
-}
-
-/* Now the custom parts */
-
-#footer {
-       clear: both;
-}
-
-/* images */
-/* @noflip */
-div.floatright {
-       float: right;
-       clear: right;
-       margin: 0 0 1em 1em;
-}
-
-/* @noflip */
-div.floatright p {
-       font-style: italic;
-}
-
-/* @noflip */
-div.floatleft {
-       float: left;
-       clear: left;
-       margin: 0.3em 0.5em 0.5em 0;
-}
-
-/* @noflip */
-div.floatleft p {
-       font-style: italic;
-}
-
-/* table standards */
-table.rimage {
-       float: right;
-       margin-left: 1em;
-       margin-bottom: 1em;
-       text-align: center;
-       font-size: smaller;
-}
-
-/* thumbnails */
-div.thumb {
-       margin-bottom: .5em;
-       border-style: solid;
-       border-color: white;
-       width: auto;
-}
-
-div.thumbinner {
-       border: 1px solid #ccc;
-       padding: 3px !important;
-       background-color: #f9f9f9;
-       font-size: 94%;
-       text-align: center;
-       overflow: hidden;
-}
-
-html .thumbimage {
-       border: 1px solid #ccc;
-}
-
-html .thumbcaption {
-       border: none;
-       text-align: left;
-       line-height: 1.4em;
-       padding: 3px !important;
-       font-size: 94%;
-}
-
-div.magnify {
-       float: right;
-       border: none !important;
-       background: none !important;
-       margin-left: 3px;
-}
-
-div.magnify a,
-div.magnify img {
-       display: block;
-       border: none !important;
-       background: none !important;
-}
-
-/* @noflip */
-div.tright {
-       clear: right;
-       float: right;
-       border-width: .5em 0 .8em 1.4em;
-}
-
-/* @noflip */
-div.tleft {
-       float: left;
-       clear: left;
-       margin-right: .5em;
-       border-width: .5em 1.4em .8em 0;
-}
-
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
-
-/* Page history styling */
-/* the auto-generated edit comments */
-.autocomment {
-       color: #4b4b4b;
-}
-
-img {
-       border: none;
-}
-
-#toc,
-.toc {
-       border: 1px solid #bba;
-       background-color: #f7f8ff;
-       padding: 5px;
-       font-size: 95%;
-       text-align: center;
-       display: -moz-inline-block;
-       display: inline-block;
-       display: table;
-
-       /* IE7 and earlier */
-       zoom: 1;
-       *display: inline;
-
-       padding: 7px;
-}
-
-/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
-table#toc,
-table.toc {
-       border-collapse: collapse;
-}
-
-/* Remove additional paddings inside table-cells that are not present in <div>s */
-table#toc td,
-table.toc td {
-       padding: 0;
-}
-
-#toc h2,
-.toc h2 {
-       display: inline;
-       border: none;
-       padding: 0;
-       font-size: 100%;
-       font-weight: bold;
-}
-
-#toc ul,
-.toc ul {
-       list-style-type: none;
-       list-style-image: none;
-       padding: 0;
-       text-align: left;
-}
-
-#toc ul ul,
-.toc ul ul {
-       margin: 0 0 0 2em;
-}
-
-#toc .toctoggle,
-.toc .toctoggle {
-       font-size: 94%;
-}
-
-.error {
-       color: red;
-       font-size: larger;
-}
-
-/* preference page with js-genrated toc */
-#preftoc {
-       float: left;
-       margin: 1em 1em 1em 1em;
-       width: 13em;
-}
-
-#preftoc li {
-       border: 1px solid White;
-}
-
-#preftoc li.selected {
-       background-color: #f9f9f9;
-       border: 1px dashed #aaaaaa;
-}
-
-#preftoc a,
-#preftoc a:active {
-       display: block;
-       color: #005189;
-}
-
-.mw-prefs-buttons {
-       clear: left;
-       float: left;
-       margin-top: 1em;
-}
-
-div.htmlform-tip {
-       font-size: 94%;
-       margin-top: 0.4em;
-       color: #666;
-}
-
-fieldset.prefsection {
-       margin-top: 1em;
-}
-
-fieldset.operaprefsection {
-       margin-left: 15em;
-}
-
-/* emulate center */
-.center {
-       width: 100%;
-       text-align: center;
-}
-
-*.center * {
-       margin-left: auto;
-       margin-right: auto;
-}
-
-/* small for tables and similar */
-.small {
-       font-size: 94%;
-}
-
-table.small {
-       font-size: 100%;
-}
-
-/* use this instead of #toc for page content */
-.toccolours {
-       border: 1px solid #aaaaaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       font-size: 95%;
-}
-
-#siteNotice {
-       border: 1px solid #aaaaaa;
-       padding-left: 0.5em;
-       padding-right: 0.5em;
-}
-
-.redirectText {
-       font-size: 150%;
-       margin: 5px;
-}
-
-.sharedUploadNotice {
-       font-style: italic;
-}
-
-span.unpatrolled {
-       font-weight: bold;
-       color: red;
-}
-
-span.updatedmarker {
-       color: black;
-       background-color: #00FF00;
-}
-
-div.gallerybox {
-       width: 150px;
-}
-
-span.comment {
-       font-style: italic;
-}
-
-span.changedby {
-       font-size: 95%;
-}
-
-.previewnote {
-       text-align: center;
-       color: #cc0000;
-}
-
-.editExternally {
-       border-style: solid;
-       border-width: 1px;
-       border-color: gray;
-       background: #ffffff;
-       padding: 3px;
-       margin-top: 0.5em;
-       float: left;
-       font-size: small;
-       text-align: center;
-}
-
-.editExternallyHelp {
-       font-style: italic;
-       color: gray;
-}
-
-li span.deleted {
-       text-decoration: line-through;
-       color: #888;
-       font-style: italic;
-}
-
-/* Classes for Exif data display */
-table.mw_metadata {
-       margin-left: 0.5em;
-}
-
-table.mw_metadata caption {
-       font-weight: bold;
-}
-
-table.mw_metadata th {
-       font-weight: normal;
-}
-
-table.mw_metadata td {
-       padding: 0.1em;
-}
-
-table.mw_metadata {
-       border: none;
-       border-collapse: collapse;
-}
-
-table.mw_metadata td,
-table.mw_metadata th {
-       border: 1px solid #aaaaaa;
-       padding-left: 4px;
-       padding-right: 4px;
-}
-
-table.mw_metadata th {
-       background-color: #f9f9f9;
-}
-
-table.mw_metadata td {
-       background-color: #fcfcfc;
-}
-
-table.mw_metadata td.spacer {
-       background: inherit;
-       border-top: none;
-       border-bottom: none;
-}
-
-table.collapsed tr.collapsable {
-       display: none;
-}
-
-.visualClear {
-       clear: both;
-}
-
-/* Allmessages table */
-#allmessagestable th {
-       background-color: #b2b2ff;
-}
-
-#allmessagestable tr.orig {
-       background-color: #ffe2e2;
-}
-
-#allmessagestable tr.new {
-       background-color: #e2ffe2;
-}
-
-#allmessagestable tr.def {
-       background-color: #f0f0ff;
-}
-
-#jump-to-nav {
-       display: none;
-}
-
-div.multipageimagenavbox {
-       border: solid 1px silver;
-       padding: 4px;
-       margin: 1em;
-       background: #f0f0f0;
-}
-
-div.multipageimagenavbox div.thumb {
-       border: none;
-       margin-left: 2em;
-       margin-right: 2em;
-}
-
-div.multipageimagenavbox hr {
-       margin: 6px;
-}
-
-table.multipageimage td {
-       text-align: center;
-}
-
-/*
-  Table pager (e.g. Special:Imagelist)
-  - remove underlines from the navigation link
-  - collapse borders
-  - set the borders to outsets (similar to Special:Allmessages)
-  - remove line wrapping for all td and th, set background color
-  - restore line wrapping for the last two table cells (description and size)
-*/
-.TablePager_nav a {
-       text-decoration: none;
-}
-
-.TablePager {
-       border-collapse: collapse;
-}
-
-.TablePager,
-.TablePager td,
-.TablePager th {
-       border: 0.15em solid #777777;
-       padding: 0 0.15em 0 0.15em;
-}
-
-.TablePager th {
-       background-color: #eeeeff;
-}
-
-.TablePager td {
-       background-color: #ffffff;
-}
-
-.TablePager tr:hover td {
-       background-color: #eeeeff;
-}
-
-.imagelist td,
-.imagelist th {
-       white-space: nowrap;
-}
-
-.imagelist .TablePager_col_links {
-       background-color: #eeeeff;
-}
-
-.imagelist .TablePager_col_img_description {
-       white-space: normal;
-}
-
-.imagelist th.TablePager_sort {
-       background-color: #ccccff;
-}
-
-.templatesUsed {
-       margin-top: 1em;
-}
-
-.MediaTransformError {
-       border: thin solid #777;
-       background-color: #ccc;
-       padding: 0.1em;
-}
-
-.MediaTransformError td {
-       text-align: center;
-       vertical-align: middle;
-       font-size: 90%;
-}
-
-form#specialpages {
-       display: inline;
-}
-
-body {
-       direction: ltr;
-       unicode-bidi: embed;
-       background-color: #ffffec;
-}
-
-body.ns-0 {
-       background-color: white;
-}
-
-/** RTL specific CSS starts here **/
-
-/**
- * Lists:
- * The following lines don't have a visible effect on non-Gecko browsers
- * They fix a problem with Gecko browsers rendering lists to the right of
- * left-floated objects in an RTL layout.
- */
-/* @noflip */
-html > body.rtl div#article ul {
-       display: table;
-}
-
-/* @noflip */
-html > body.rtl div#bodyContent ul#filetoc {
-       display: block;
-}
-
-/* RTL specific CSS ends here **/
diff --git a/skins/common/protect.js b/skins/common/protect.js
deleted file mode 100644 (file)
index dc142ca..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-( function ( mw, $ ) {
-
-var ProtectionForm = window.ProtectionForm = {
-       existingMatch: false,
-
-       /**
-        * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
-        * on the protection form
-        *
-        * @param opts Object : parameters with members:
-        *     tableId              Identifier of the table containing UI bits
-        *     labelText            Text to use for the checkbox label
-        *     numTypes             The number of protection types
-        *     existingMatch        True if all the existing expiry times match
-        */
-       init: function ( opts ) {
-               var box, boxbody, row, cell, check, label;
-
-               if ( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) ) {
-                       return false;
-               }
-
-               box = document.getElementById( opts.tableId );
-               if ( !box ) {
-                       return false;
-               }
-
-               boxbody = box.getElementsByTagName( 'tbody' )[0];
-               row = document.createElement( 'tr' );
-               boxbody.insertBefore( row, boxbody.firstChild.nextSibling );
-
-               this.existingMatch = opts.existingMatch;
-
-               cell = document.createElement( 'td' );
-               row.appendChild( cell );
-               // If there is only one protection type, there is nothing to chain
-               if ( opts.numTypes > 1 ) {
-                       check = document.createElement( 'input' );
-                       check.id = 'mwProtectUnchained';
-                       check.type = 'checkbox';
-                       $( check ).click( function () {
-                               ProtectionForm.onChainClick();
-                       } );
-
-                       label = document.createElement( 'label' );
-                       label.htmlFor = 'mwProtectUnchained';
-                       label.appendChild( document.createTextNode( opts.labelText ) );
-
-                       cell.appendChild( check );
-                       cell.appendChild( document.createTextNode( ' ' ) );
-                       cell.appendChild( label );
-
-                       check.checked = !this.areAllTypesMatching();
-                       this.enableUnchainedInputs( check.checked );
-               }
-
-               $( '#mwProtect-reason' ).byteLimit( 180 );
-
-               this.updateCascadeCheckbox();
-
-               return true;
-       },
-
-       /**
-        * Sets the disabled attribute on the cascade checkbox depending on the current selected levels
-        */
-       updateCascadeCheckbox: function () {
-               var i, lists, items, selected;
-
-               // For non-existent titles, there is no cascade option
-               if ( !document.getElementById( 'mwProtect-cascade' ) ) {
-                       return;
-               }
-               lists = this.getLevelSelectors();
-               for ( i = 0; i < lists.length; i++ ) {
-                       if ( lists[i].selectedIndex > -1 ) {
-                               items = lists[i].getElementsByTagName( 'option' );
-                               selected = items[ lists[i].selectedIndex ].value;
-                               if ( !this.isCascadeableLevel( selected ) ) {
-                                       document.getElementById( 'mwProtect-cascade' ).checked = false;
-                                       document.getElementById( 'mwProtect-cascade' ).disabled = true;
-                                       return;
-                               }
-                       }
-               }
-               document.getElementById( 'mwProtect-cascade' ).disabled = false;
-       },
-
-       /**
-        * Checks if a cerain protection level is cascadeable.
-        * @param level {String}
-        * @return {Boolean}
-        */
-       isCascadeableLevel: function (  level ) {
-               var cascadeLevels, len, i;
-
-               cascadeLevels = mw.config.get( 'wgCascadeableLevels' );
-               // cascadeLevels isn't defined on all pages
-               if ( cascadeLevels ) {
-                       for ( i = 0, len = cascadeLevels.length; i < len; i += 1 ) {
-                               if ( cascadeLevels[i] === level ) {
-                                       return true;
-                               }
-                       }
-               }
-               return false;
-       },
-
-       /**
-        * When protection levels are locked together, update the rest
-        * when one action's level changes
-        *
-        * @param source Element Level selector that changed
-        */
-       updateLevels: function ( source ) {
-               if ( !this.isUnchained() ) {
-                       this.setAllSelectors( source.selectedIndex );
-               }
-               this.updateCascadeCheckbox();
-       },
-
-       /**
-        * When protection levels are locked together, update the
-        * expiries when one changes
-        *
-        * @param source Element expiry input that changed
-        */
-
-       updateExpiry: function ( source ) {
-               var expiry, listId, list;
-
-               if ( !this.isUnchained() ) {
-                       expiry = source.value;
-                       this.forEachExpiryInput( function ( element ) {
-                               element.value = expiry;
-                       } );
-               }
-               listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
-               list = document.getElementById( listId );
-               if ( list && list.value !== 'othertime' ) {
-                       if ( this.isUnchained() ) {
-                               list.value = 'othertime';
-                       } else {
-                               this.forEachExpirySelector( function ( element ) {
-                                       element.value = 'othertime';
-                               } );
-                       }
-               }
-       },
-
-       /**
-        * When protection levels are locked together, update the
-        * expiry lists when one changes and clear the custom inputs
-        *
-        * @param source Element expiry selector that changed
-        */
-       updateExpiryList: function ( source ) {
-               var expiry;
-               if ( !this.isUnchained() ) {
-                       expiry = source.value;
-                       this.forEachExpirySelector( function ( element ) {
-                               element.value = expiry;
-                       } );
-                       this.forEachExpiryInput( function ( element ) {
-                               element.value = '';
-                       } );
-               }
-       },
-
-       /**
-        * Update chain status and enable/disable various bits of the UI
-        * when the user changes the "unlock move permissions" checkbox
-        */
-       onChainClick: function () {
-               if ( this.isUnchained() ) {
-                       this.enableUnchainedInputs( true );
-               } else {
-                       this.setAllSelectors( this.getMaxLevel() );
-                       this.enableUnchainedInputs( false );
-               }
-               this.updateCascadeCheckbox();
-       },
-
-       /**
-        * Returns true if the named attribute in all objects in the given array are matching
-        */
-       matchAttribute: function ( objects, attrName ) {
-               var i, element, value;
-
-               // Check levels
-               value = null;
-               for ( i = 0; i < objects.length; i++ ) {
-                       element = objects[i];
-                       if ( value === null ) {
-                               value = element[attrName];
-                       } else {
-                               if ( value !== element[attrName] ) {
-                                       return false;
-                               }
-                       }
-               }
-               return true;
-       },
-
-       /**
-        * Are all actions protected at the same level, with the same expiry time?
-        *
-        * @return boolean
-        */
-       areAllTypesMatching: function () {
-               return this.existingMatch
-                       && this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' )
-                       && this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' )
-                       && this.matchAttribute( this.getExpiryInputs(), 'value' );
-       },
-
-       /**
-        * Is protection chaining off?
-        *
-        * @return bool
-        */
-       isUnchained: function () {
-               var element = document.getElementById( 'mwProtectUnchained' );
-               return element
-                       ? element.checked
-                       : true; // No control, so we need to let the user set both levels
-       },
-
-       /**
-        * Find the highest protection level in any selector
-        */
-       getMaxLevel: function () {
-               var maxIndex = -1;
-               this.forEachLevelSelector( function ( element ) {
-                       if ( element.selectedIndex > maxIndex ) {
-                               maxIndex = element.selectedIndex;
-                       }
-               } );
-               return maxIndex;
-       },
-
-       /**
-        * Protect all actions at the specified level
-        *
-        * @param index int Protection level
-        */
-       setAllSelectors: function ( index ) {
-               this.forEachLevelSelector( function ( element ) {
-                       if ( element.selectedIndex !== index ) {
-                               element.selectedIndex = index;
-                       }
-               } );
-       },
-
-       /**
-        * Apply a callback to each protection selector
-        *
-        * @param func callable Callback function
-        */
-       forEachLevelSelector: function ( func ) {
-               var i, selectors;
-
-               selectors = this.getLevelSelectors();
-               for ( i = 0; i < selectors.length; i++ ) {
-                       func( selectors[i] );
-               }
-       },
-
-       /**
-        * Get a list of all protection selectors on the page
-        *
-        * @return Array
-        */
-       getLevelSelectors: function () {
-               var i, ours, all, element;
-
-               all = document.getElementsByTagName( 'select' );
-               ours = [];
-               for ( i = 0; i < all.length; i++ ) {
-                       element = all[i];
-                       if ( element.id.match( /^mwProtect-level-/ ) ) {
-                               ours[ours.length] = element;
-                       }
-               }
-               return ours;
-       },
-
-       /**
-        * Apply a callback to each expiry input
-        *
-        * @param func callable Callback function
-        */
-       forEachExpiryInput: function ( func ) {
-               var i, inputs;
-
-               inputs = this.getExpiryInputs();
-               for ( i = 0; i < inputs.length; i++ ) {
-                       func( inputs[i] );
-               }
-       },
-
-       /**
-        * Get a list of all expiry inputs on the page
-        *
-        * @return Array
-        */
-       getExpiryInputs: function () {
-               var i, all, element, ours;
-
-               all = document.getElementsByTagName( 'input' );
-               ours = [];
-               for ( i = 0; i < all.length; i++ ) {
-                       element = all[i];
-                       if ( element.name.match( /^mwProtect-expiry-/ ) ) {
-                               ours[ours.length] = element;
-                       }
-               }
-               return ours;
-       },
-
-       /**
-        * Apply a callback to each expiry selector list
-        * @param func callable Callback function
-        */
-       forEachExpirySelector: function ( func ) {
-               var i, inputs;
-
-               inputs = this.getExpirySelectors();
-               for ( i = 0; i < inputs.length; i++ ) {
-                       func( inputs[i] );
-               }
-       },
-
-       /**
-        * Get a list of all expiry selector lists on the page
-        *
-        * @return Array
-        */
-       getExpirySelectors: function () {
-               var i, all, ours, element;
-
-               all = document.getElementsByTagName( 'select' );
-               ours = [];
-               for ( i = 0; i < all.length; i++ ) {
-                       element = all[i];
-                       if ( element.id.match( /^mwProtectExpirySelection-/ ) ) {
-                               ours[ours.length] = element;
-                       }
-               }
-               return ours;
-       },
-
-       /**
-        * Enable/disable protection selectors and expiry inputs
-        *
-        * @param val boolean Enable?
-        */
-       enableUnchainedInputs: function ( val ) {
-               var first = true;
-
-               this.forEachLevelSelector( function ( element ) {
-                       if ( first ) {
-                               first = false;
-                       } else {
-                               element.disabled = !val;
-                       }
-               } );
-               first = true;
-               this.forEachExpiryInput( function ( element ) {
-                       if ( first ) {
-                               first = false;
-                       } else {
-                               element.disabled = !val;
-                       }
-               } );
-               first = true;
-               this.forEachExpirySelector( function ( element ) {
-                       if ( first ) {
-                               first = false;
-                       } else {
-                               element.disabled = !val;
-                       }
-               } );
-       }
-};
-
-}( mediaWiki, jQuery ) );
diff --git a/skins/common/shared.css b/skins/common/shared.css
deleted file mode 100644 (file)
index acb3112..0000000
+++ /dev/null
@@ -1,1213 +0,0 @@
-/**
- * CSS in this file is used by *all* skins (that have any CSS at all). Be
- * careful what you put in here, since what looks good in one skin may not in
- * another, but don't ignore the poor pre-Monobook users either.
- */
-
-/* GENERAL CLASSES FOR DIRECTIONALITY SUPPORT */
-
-/**
- * These classes should be used for text depending on the content direction.
- * Content stuff like editsection, ul/ol and TOC depend on this.
- */
-.mw-content-ltr {
-       /* @noflip */
-       direction: ltr;
-}
-
-.mw-content-rtl {
-       /* @noflip */
-       direction: rtl;
-}
-
-/* Most input fields should be in site direction */
-.sitedir-ltr textarea,
-.sitedir-ltr input {
-       /* @noflip */
-       direction: ltr;
-}
-
-.sitedir-rtl textarea,
-.sitedir-rtl input {
-       /* @noflip */
-       direction: rtl;
-}
-
-/* User-Agent styles for new HTML5 elements */
-mark {
-       background-color: yellow;
-       color: black;
-}
-
-/* Helper for wbr element on IE 8+; in HTML5, but not supported by default as of IE 11. */
-/* Note canonical HTML5 styles recommend "content: \u200B", but this doesn't work as of IE 11. */
-wbr {
-       display: inline-block;
-}
-
-/* Input types that should follow user direction, like buttons */
-/* TODO: What about buttons in wikipage content ? */
-input[type="submit"],
-input[type="button"],
-input[type="reset"],
-input[type="file"] {
-       direction: ltr;
-}
-
-/* Override default values */
-textarea[dir="ltr"],
-input[dir="ltr"] {
-       /* @noflip */
-       direction: ltr;
-}
-
-textarea[dir="rtl"],
-input[dir="rtl"] {
-       /* @noflip */
-       direction: rtl;
-}
-
-/* Default style for semantic tags */
-abbr[title],
-.explain[title] {
-       border-bottom: 1px dotted;
-       cursor: help;
-}
-
-/* Colored watchlist and recent changes numbers */
-.mw-plusminus-pos {
-       color: #006400; /* dark green */
-}
-
-.mw-plusminus-neg {
-       color: #8b0000; /* dark red */
-}
-
-.mw-plusminus-null {
-       color: #aaa; /* gray */
-}
-
-/**
- * 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 and username portions of RC entries */
-span.comment {
-       font-style: italic;
-}
-
-span.changedby {
-       font-size: 95%;
-}
-
-/* Math */
-.texvc {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-img.tex {
-       vertical-align: middle;
-}
-
-span.texhtml {
-       font-family: serif;
-}
-
-/**
- * Add a bit of margin space between the preview and the toolbar.
- * This replaces the ugly <p><br /></p> we used to insert into the page source
- */
-#wikiPreview.ontop {
-       margin-bottom: 1em;
-}
-
-/* Stop floats from intruding into edit area in previews */
-#editform,
-#toolbar,
-#wpTextbox1 {
-       clear: both;
-}
-
-#toolbar img {
-       cursor: pointer;
-}
-
-/**
- * File description page
- */
-
-div.mw-filepage-resolutioninfo {
-       font-size: smaller;
-}
-
-/**
- * File histories
- */
-h2#filehistory {
-       clear: both;
-}
-
-table.filehistory th,
-table.filehistory td {
-       vertical-align: top;
-}
-
-table.filehistory th {
-       text-align: left;
-}
-
-table.filehistory td.mw-imagepage-filesize,
-table.filehistory th.mw-imagepage-filesize {
-       white-space: nowrap;
-}
-
-table.filehistory td.filehistory-selected {
-       font-weight: bold;
-}
-
-/**
- * Add a checkered background image on hover for file
- * description pages. (bug 26470)
- */
-.filehistory a img,
-#file img:hover {
-       /* @embed */
-       background: white url(images/Checker-16x16.png) repeat;
-}
-
-/**
- * rev_deleted stuff
- */
-li span.deleted,
-span.history-deleted {
-       text-decoration: line-through;
-       color: #888;
-       font-style: italic;
-}
-
-/**
- * Patrol stuff
- */
-.not-patrolled {
-       background-color: #ffa;
-}
-
-.unpatrolled {
-       font-weight: bold;
-       color: red;
-}
-
-div.patrollink {
-       font-size: 75%;
-       text-align: right;
-}
-
-/**
- * Forms
- */
-td.mw-label {
-       text-align: right;
-}
-
-td.mw-input {
-       text-align: left;
-}
-
-td.mw-submit {
-       text-align: left;
-}
-
-td.mw-label {
-       vertical-align: top;
-}
-
-.prefsection td.mw-label {
-       width: 20%;
-}
-
-.prefsection table {
-       width: 100%;
-}
-
-.prefsection table.mw-htmlform-matrix {
-       width: auto;
-}
-
-.mw-icon-question {
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG).
-        * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-       background-image: url(images/question-small.png);
-       /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/question.svg);
-       /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/question.svg);
-       background-repeat: no-repeat;
-       background-size: 13px 13px;
-       display: inline-block;
-       height: 13px;
-       width: 13px;
-       margin-left: 4px;
-}
-
-.mw-icon-question:lang(ar),
-.mw-icon-question:lang(fa),
-.mw-icon-question:lang(ur) {
-       -webkit-transform: scaleX(-1);
-       -ms-transform: scaleX(-1);
-       transform: scaleX(-1);
-}
-
-td.mw-submit {
-       white-space: nowrap;
-}
-
-table.mw-htmlform-nolabel td.mw-label {
-       width: 1px;
-}
-
-tr.mw-htmlform-vertical-label td.mw-label {
-       text-align: left !important;
-}
-
-.mw-htmlform-invalid-input td.mw-input input {
-       border-color: red;
-}
-
-.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
-       display: inline;
-       margin-right: 1em;
-       white-space: nowrap;
-}
-
-.mw-htmlform-matrix td {
-       padding-left: 0.5em;
-       padding-right: 0.5em;
-}
-
-input#wpSummary {
-       width: 80%;
-       margin-bottom: 1em;
-}
-
-/**
- * Image captions
- */
-/* @noflip */
-.mw-content-ltr .thumbcaption {
-       text-align: left;
-}
-
-/* @noflip */
-.mw-content-rtl .thumbcaption {
-       text-align: right;
-}
-
-/* @noflip */
-.mw-content-ltr .magnify {
-       float: right;
-       margin-left: 3px;
-}
-
-/* @noflip */
-.mw-content-rtl .magnify {
-       float: left;
-       margin-right: 3px;
-}
-
-/**
- * Categories
- */
-#catlinks {
-       /**
-        * Overrides text justification (user preference)
-        * See bug 31990
-        */
-       text-align: left;
-}
-
-.catlinks ul {
-       display: inline;
-       margin: 0;
-       padding: 0;
-       list-style: none;
-       list-style-type: none;
-       list-style-image: none;
-       vertical-align: middle !ie;
-}
-
-.catlinks li {
-       display: inline-block;
-       line-height: 1.25em;
-       border-left: 1px solid #AAA;
-       margin: 0.125em 0;
-       padding: 0 0.5em;
-       zoom: 1;
-       display: inline !ie;
-}
-
-.catlinks li:first-child {
-       padding-left: 0.25em;
-       border-left: none;
-}
-
-/* (bug 5346) make category redirects italic */
-.catlinks li a.mw-redirect {
-       font-style: italic;
-}
-
-/**
- * Hidden categories
- */
-.mw-hidden-cats-hidden {
-       display: none;
-}
-
-.catlinks-allhidden {
-       display: none;
-}
-
-/**
- * Convenience links to edit block, delete and protect reasons
- * and upload licenses
- */
-p.mw-ipb-conveniencelinks,
-p.mw-protect-editreasons,
-p.mw-filedelete-editreasons,
-p.mw-delete-editreasons,
-p.mw-revdel-editreasons,
-p.mw-upload-editlicenses {
-       font-size: 90%;
-       text-align: right;
-}
-
-/* Page history styling */
-
-/* The auto-generated edit comments */
-.autocomment {
-       color: gray;
-}
-
-#pagehistory .history-user {
-       margin-left: 0.4em;
-       margin-right: 0.2em;
-}
-
-#pagehistory span.minor {
-       font-weight: bold;
-}
-
-#pagehistory li {
-       border: 1px solid white;
-}
-
-#pagehistory li.selected {
-       background-color: #f9f9f9;
-       border: 1px dashed #aaa;
-}
-
-.mw-history-revisiondelete-button, #mw-fileduplicatesearch-icon {
-       float: right;
-}
-
-/** Generic minor/bot/newpage styling (recent changes) */
-.newpage,
-.minoredit,
-.botedit {
-       font-weight: bold;
-}
-
-#shared-image-dup,
-#shared-image-conflict {
-       font-style: italic;
-}
-
-/**
- * Recreating deleted page warning
- * Reupload file warning
- * Page protection warning
- * incl. log entries for these warnings
- */
-div.mw-warning-with-logexcerpt {
-       padding: 3px;
-       margin-bottom: 3px;
-       border: 2px solid #2F6FAB;
-       clear: both;
-}
-
-div.mw-warning-with-logexcerpt ul li {
-       font-size: 90%;
-}
-
-/* (show/hide) revision deletion links */
-span.mw-revdelundel-link,
-strong.mw-revdelundel-link {
-       font-size: 90%;
-}
-
-span.mw-revdelundel-hidden,
-input.mw-revdelundel-hidden {
-       visibility: hidden;
-}
-
-td.mw-revdel-checkbox,
-th.mw-revdel-checkbox {
-       padding-right: 10px;
-       text-align: center;
-}
-
-/* red links; see bug 36276 */
-a.new {
-       color: #BA0000;
-}
-
-/* feed links */
-a.feedlink {
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG).
-        * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-       background-image: url(images/feed-icon.png);
-       /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/feed-icon.svg);
-       /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/feed-icon.svg);
-       background-position: center left;
-       background-repeat: no-repeat;
-       background-size: 12px 12px;
-       padding-left: 16px;
-}
-
-/* Plainlinks - this can be used to switch
- * off special external link styling */
-.plainlinks a {
-       background: none !important;
-       padding: 0 !important;
-}
-
-/* External URLs should always be treated as LTR (bug 4330) */
-/* @noflip */ .rtl a.external.free,
-.rtl a.external.autonumber {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-/**
- * wikitable class for skinning normal tables
- * keep in sync with commonPrint.css
- */
-table.wikitable {
-       margin: 1em 0;
-       background-color: #f9f9f9;
-       border: 1px #aaa solid;
-       border-collapse: collapse;
-       color: black;
-}
-
-table.wikitable > tr > th,
-table.wikitable > tr > td,
-table.wikitable > * > tr > th,
-table.wikitable > * > tr > td {
-       border: 1px #aaa solid;
-       padding: 0.2em;
-}
-
-table.wikitable > tr > th,
-table.wikitable > * > tr > th {
-       background-color: #f2f2f2;
-       text-align: center;
-}
-
-table.wikitable > caption {
-       font-weight: bold;
-}
-
-/**
- * Hide collapsable rows in a collapsed table.
- *
- * Used by ImagePage and the mediawiki.action.view.metadata module.
- */
-table.collapsed tr.collapsable {
-       display: none;
-}
-
-/* success and error messages */
-.error,
-.warning,
-.success {
-       font-size: larger;
-}
-
-.error {
-       color: #cc0000;
-}
-
-.warning {
-       color: #705000;
-}
-
-.success {
-       color: #009000;
-}
-
-.errorbox,
-.warningbox,
-.successbox {
-       border: 1px solid;
-       padding: .5em 1em;
-       margin-bottom: 1em;
-       display: -moz-inline-block;
-       display: inline-block;
-       zoom: 1;
-       *display: inline;
-}
-
-.errorbox h2,
-.warningbox h2,
-.successbox h2 {
-       font-size: 1em;
-       color: inherit;
-       font-weight: bold;
-       display: inline;
-       margin: 0 .5em 0 0;
-       border: none;
-}
-
-.errorbox {
-       color: #cc0000;
-       border-color: #fac5c5;
-       background-color: #fae3e3;
-}
-
-.warningbox {
-       color: #705000;
-       border-color: #fde29b;
-       background-color: #fdf1d1;
-}
-
-.successbox {
-       color: #009000;
-       border-color: #b7fdb5;
-       background-color: #e1fddf;
-}
-
-/* general info/warning box for SP */
-.mw-infobox {
-       border: 2px solid #ff7f00;
-       margin: 0.5em;
-       clear: left;
-       overflow: hidden;
-}
-
-.mw-infobox-left {
-       margin: 7px;
-       float: left;
-       width: 35px;
-}
-
-.mw-infobox-right {
-       margin: 0.5em 0.5em 0.5em 49px;
-}
-
-/* Note on preview page */
-.previewnote {
-       color: #c00;
-       margin-bottom: 1em;
-}
-
-.previewnote p {
-       text-indent: 3em;
-       margin: 0.8em 0;
-}
-
-.visualClear {
-       clear: both;
-}
-
-/**
- * Data table style
- *
- * Transparent table with suddle borders
- * and blue row-highlighting.
- */
-.mw-datatable {
-       border-collapse: collapse;
-}
-
-.mw-datatable,
-.mw-datatable td,
-.mw-datatable th {
-       border: 1px solid #aaaaaa;
-       padding: 0 0.15em 0 0.15em;
-}
-
-.mw-datatable th {
-       background-color: #ddddff;
-}
-
-.mw-datatable td {
-       background-color: #ffffff;
-}
-
-.mw-datatable tr:hover td {
-       background-color: #eeeeff;
-}
-
-/**
- * TablePager tables generated by the TablePager PHP class
- * in MediaWiki (e.g. Special:ListFiles).
- */
-.TablePager {
-       min-width: 80%;
-}
-
-.TablePager_nav {
-       margin: 0 auto;
-}
-
-.TablePager_nav td {
-       padding: 3px;
-       text-align: center;
-}
-
-.TablePager_nav a {
-       text-decoration: none;
-}
-
-.imagelist td,
-.imagelist th {
-       white-space: nowrap;
-}
-
-.imagelist .TablePager_col_links {
-       background-color: #eeeeff;
-}
-
-.imagelist .TablePager_col_img_description {
-       white-space: normal;
-}
-
-.imagelist th.TablePager_sort {
-       background-color: #ccccff;
-}
-
-/* filetoc */
-ul#filetoc {
-       text-align: center;
-       border: 1px solid #aaaaaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       font-size: 95%;
-       margin-bottom: 0.5em;
-       margin-left: 0;
-       margin-right: 0;
-}
-
-#filetoc li {
-       display: inline;
-       list-style-type: none;
-       padding-right: 2em;
-}
-
-/* Classes for Exif data display */
-table.mw_metadata {
-       font-size: 0.8em;
-       margin-left: 0.5em;
-       margin-bottom: 0.5em;
-       width: 400px;
-}
-
-table.mw_metadata caption {
-       font-weight: bold;
-}
-
-table.mw_metadata th {
-       font-weight: normal;
-}
-
-table.mw_metadata td {
-       padding: 0.1em;
-}
-
-table.mw_metadata {
-       border: none;
-       border-collapse: collapse;
-}
-
-table.mw_metadata td,
-table.mw_metadata th {
-       text-align: center;
-       border: 1px solid #aaaaaa;
-       padding-left: 5px;
-       padding-right: 5px;
-}
-
-table.mw_metadata th {
-       background-color: #f9f9f9;
-}
-
-table.mw_metadata td {
-       background-color: #fcfcfc;
-}
-
-table.mw_metadata ul.metadata-langlist {
-       list-style-type: none;
-       list-style-image: none;
-       padding-right: 5px;
-       padding-left: 5px;
-       margin: 0;
-}
-
-/* Correct directionality when page dir is different from site/user dir */
-.mw-content-ltr ul,
-.mw-content-rtl .mw-content-ltr ul {
-       /* @noflip */
-       margin: 0.3em 0 0 1.6em;
-       padding: 0;
-}
-
-.mw-content-rtl ul,
-.mw-content-ltr .mw-content-rtl ul {
-       /* @noflip */
-       margin: 0.3em 1.6em 0 0;
-       padding: 0;
-}
-
-.mw-content-ltr ol,
-.mw-content-rtl .mw-content-ltr ol {
-       /* @noflip */
-       margin: 0.3em 0 0 3.2em;
-       padding: 0;
-}
-
-.mw-content-rtl ol,
-.mw-content-ltr .mw-content-rtl ol {
-       /* @noflip */
-       margin: 0.3em 3.2em 0 0;
-       padding: 0;
-}
-
-/* @noflip */
-.mw-content-ltr dd,
-.mw-content-rtl .mw-content-ltr dd {
-       margin-left: 1.6em;
-       margin-right: 0;
-}
-
-/* @noflip */
-.mw-content-rtl dd,
-.mw-content-ltr .mw-content-rtl dd {
-       margin-right: 1.6em;
-       margin-left: 0;
-}
-
-/* Galleries */
-/* These display attributes look nonsensical, but are needed to support IE and FF2 */
-/* Don't forget to update commonPrint.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;
-}
-
-.mw-ajax-loader {
-       /* @embed */
-       background-image: url(images/ajax-loader.gif);
-       background-position: center center;
-       background-repeat: no-repeat;
-       padding: 16px;
-       position: relative;
-       top: -16px;
-}
-
-.mw-small-spinner {
-       padding: 10px !important;
-       margin-right: 0.6em;
-       /* @embed */
-       background-image: url(images/spinner.gif);
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-
-/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */
-/* Languages like hi or ml require slightly more vertical space to show diacritics properly */
-h1:lang(anp),
-h1:lang(as),
-h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
-h1:lang(bho),
-h1:lang(bn),
-h1:lang(gu),
-h1:lang(hi),
-h1:lang(kn),
-h1:lang(ks),
-h1:lang(ml),
-h1:lang(mr),
-h1:lang(my),
-h1:lang(mai),
-h1:lang(ne),
-h1:lang(new),
-h1:lang(or),
-h1:lang(pa),
-h1:lang(pi),
-h1:lang(sa),
-h1:lang(ta),
-h1:lang(te) {
-       line-height: 1.6em !important;
-}
-
-h2:lang(anp), h3:lang(anp), h4:lang(anp), h5:lang(anp), h6:lang(anp),
-h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
-h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho),
-h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh),
-h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn),
-h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu),
-h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
-h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
-h2:lang(ks), h3:lang(ks), h4:lang(ks), h5:lang(ks), h6:lang(ks),
-h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
-h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
-h2:lang(my), h3:lang(my), h4:lang(my), h5:lang(my), h6:lang(my),
-h2:lang(mai), h3:lang(mai), h4:lang(mai), h5:lang(mai), h6:lang(mai),
-h2:lang(ne), h3:lang(ne), h4:lang(ne), h5:lang(ne), h6:lang(ne),
-h2:lang(new), h3:lang(new), h4:lang(new), h5:lang(new), h6:lang(new),
-h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
-h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
-h2:lang(pi), h3:lang(pi), h4:lang(pi), h5:lang(pi), h6:lang(pi),
-h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
-h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta),
-h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) {
-       line-height: 1.2em;
-}
-
-/* Localised ordered list numbering for some languages */
-ol:lang(bcc) li,
-ol:lang(bqi) li,
-ol:lang(fa) li,
-ol:lang(glk) li,
-ol:lang(kk-arab) li,
-ol:lang(mzn) li {
-       list-style-type: -moz-persian;
-       list-style-type: persian;
-}
-
-ol:lang(ckb) li {
-       list-style-type: -moz-arabic-indic;
-       list-style-type: arabic-indic;
-}
-
-ol:lang(hi) li,
-ol:lang(mr) li {
-       list-style-type: -moz-devanagari;
-       list-style-type: devanagari;
-}
-
-ol:lang(as) li,
-ol:lang(bn) li {
-       list-style-type: -moz-bengali;
-       list-style-type: bengali;
-}
-
-ol:lang(or) li {
-       list-style-type: -moz-oriya;
-       list-style-type: oriya;
-}
-
-#toc ul, .toc ul {
-       margin: .3em 0;
-}
-
-/* Correct directionality when page dir is different from site/user dir */
-/* @noflip */ .mw-content-ltr .toc ul,
-.mw-content-ltr #toc ul,
-.mw-content-rtl .mw-content-ltr .toc ul,
-.mw-content-rtl .mw-content-ltr #toc ul {
-       text-align: left;
-}
-
-/* @noflip */ .mw-content-rtl .toc ul,
-.mw-content-rtl #toc ul,
-.mw-content-ltr .mw-content-rtl .toc ul,
-.mw-content-ltr .mw-content-rtl #toc ul {
-       text-align: right;
-}
-
-/* @noflip */ .mw-content-ltr .toc ul ul,
-.mw-content-ltr #toc ul ul,
-.mw-content-rtl .mw-content-ltr .toc ul ul,
-.mw-content-rtl .mw-content-ltr #toc ul ul {
-       margin: 0 0 0 2em;
-}
-
-/* @noflip */ .mw-content-rtl .toc ul ul,
-.mw-content-rtl #toc ul ul,
-.mw-content-ltr .mw-content-rtl .toc ul ul,
-.mw-content-ltr .mw-content-rtl #toc ul ul {
-       margin: 0 2em 0 0;
-}
-
-#toc #toctitle,
-.toc #toctitle,
-#toc .toctitle,
-.toc .toctitle {
-       direction: ltr;
-}
-
-/* tooltip styles */
-.mw-help-field-hint {
-       display: none;
-       margin-left: 2px;
-       margin-bottom: -8px;
-       padding: 0 0 0 15px;
-       /* @embed */
-       background-image: url(images/help-question.gif);
-       background-position: left center;
-       background-repeat: no-repeat;
-       cursor: pointer;
-       font-size: .8em;
-       text-decoration: underline;
-       color: #0645ad;
-}
-
-.mw-help-field-hint:hover {
-       /* @embed */
-       background-image: url(images/help-question-hover.gif);
-}
-
-.mw-help-field-data {
-       display: block;
-       background-color: #d6f3ff;
-       padding: 5px 8px 4px 8px;
-       border: 1px solid #5dc9f4;
-       margin-left: 20px;
-}
-
-#mw-clearyourcache,
-#mw-sitecsspreview,
-#mw-sitejspreview,
-#mw-usercsspreview,
-#mw-userjspreview {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-/* Correct user & content directionality when viewing a diff */
-.diff-currentversion-title,
-.diff {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-/* @noflip */ .diff-contentalign-right td {
-       direction: rtl;
-       unicode-bidi: embed;
-}
-
-/* @noflip */ .diff-contentalign-left td {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-.diff-multi,
-.diff-otitle,
-.diff-ntitle,
-.diff-lineno {
-       direction: ltr !important;
-       unicode-bidi: embed;
-}
-
-#mw-revision-info,
-#mw-revision-info-current,
-#mw-revision-nav {
-       direction: ltr;
-       display: inline;
-}
-
-/* Images */
-
-/* @noflip */ div.tright,
-div.floatright,
-table.floatright {
-       clear: right;
-       float: right;
-}
-
-/* @noflip */ div.tleft,
-div.floatleft,
-table.floatleft {
-       float: left;
-       clear: left;
-}
-
-div.floatright,
-table.floatright,
-div.floatleft,
-table.floatleft {
-       position: relative;
-}
-
-/* bug 12205 */
-#mw-credits a {
-       unicode-bidi: embed;
-}
-
-/* Accessibility */
-.mw-jump,
-#jump-to-nav {
-       overflow: hidden;
-       height: 0;
-       zoom: 1; /* http://webaim.org/techniques/skipnav/#iequirk */
-}
-
-/* Print footer should be hidden by default in screen. */
-.printfooter {
-       display: none;
-}
-
-/* For developers */
-.xdebug-error {
-       position: absolute;
-       z-index: 99;
-}
-
-.mw-editsection,
-.toctoggle,
-#jump-to-nav {
-       -moz-user-select: none;
-       -webkit-user-select: none;
-       -ms-user-select: none;
-       user-select: none;
-}
-
-/* Display editsection links smaller and next to headings */
-.mw-editsection,
-.mw-editsection-like {
-       font-size: small;
-       font-weight: normal;
-       margin-left: 1em;
-       vertical-align: baseline;
-       /* Reset line-height; headings tend to have it set to larger values */
-       line-height: 1em;
-       /* As .mw-editsection is a <span> (inline element), it is treated as part */
-       /* of the heading content when selecting text by multiple clicks and thus */
-       /* selected together with heading content, despite the user-select: none; */
-       /* rule set above. This enforces non-selection without changing the look. */
-       display: inline-block;
-}
-
-/* Correct directionality when page dir is different from site/user dir */
-/* @noflip */
-.mw-content-ltr .mw-editsection,
-.mw-content-rtl .mw-content-ltr .mw-editsection {
-       margin-left: 1em;
-}
-
-/* @noflip */
-.mw-content-rtl .mw-editsection,
-.mw-content-ltr .mw-content-rtl .mw-editsection {
-       margin-right: 1em;
-}
-
-/* Prevent citations and subscripts from interfering with the line-height */
-sup,
-sub {
-       line-height: 1;
-}
diff --git a/skins/common/upload.js b/skins/common/upload.js
deleted file mode 100644 (file)
index 7933caf..0000000
+++ /dev/null
@@ -1,355 +0,0 @@
-/*jshint camelcase:false */
-( function ( mw, $ ) {
-var    licenseSelectorCheck, wgUploadWarningObj, wgUploadLicenseObj, fillDestFilename,
-       ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
-       fileExtensions = mw.config.get( 'wgFileExtensions' ),
-       $spinnerDestCheck, $spinnerLicense;
-
-licenseSelectorCheck = window.licenseSelectorCheck = function () {
-       var selector = document.getElementById( 'wpLicense' ),
-               selection = selector.options[selector.selectedIndex].value;
-       if ( selector.selectedIndex > 0 ) {
-               if ( !selection ) {
-                       // Option disabled, but browser is broken and doesn't respect this
-                       selector.selectedIndex = 0;
-               }
-       }
-       // We might show a preview
-       wgUploadLicenseObj.fetchPreview( selection );
-};
-
-function uploadSetup() {
-       // Disable URL box if the URL copy upload source type is not selected
-       var ein,
-               selector, ua, isMacIe, i,
-               optionsTable, row, td,
-               wpLicense, wpLicenseRow, wpLicenseTbody,
-               uploadSourceIds, len, onchange,
-               e = document.getElementById( 'wpSourceTypeurl' );
-       if ( e ) {
-               if ( !e.checked ) {
-                       ein = document.getElementById( 'wpUploadFileURL' );
-                       if ( ein ) {
-                               ein.disabled = true;
-                       }
-               }
-       }
-
-       // For MSIE/Mac: non-breaking spaces cause the <option> not to render.
-       // But for some reason, setting the text to itself works
-       selector = document.getElementById( 'wpLicense' );
-       if ( selector ) {
-               ua = navigator.userAgent;
-               isMacIe = ua.indexOf( 'MSIE' ) !== -1 && ua.indexOf( 'Mac' ) !== -1;
-               if ( isMacIe ) {
-                       for ( i = 0; i < selector.options.length; i++ ) {
-                               selector.options[i].text = selector.options[i].text;
-                       }
-               }
-       }
-
-       // AJAX wpDestFile warnings
-       if ( ajaxUploadDestCheck ) {
-               // Insert an event handler that fetches upload warnings when wpDestFile
-               // has been changed
-               document.getElementById( 'wpDestFile' ).onchange = function () {
-                       wgUploadWarningObj.checkNow( this.value );
-               };
-               // Insert a row where the warnings will be displayed just below the
-               // wpDestFile row
-               optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0];
-               row = optionsTable.insertRow( 1 );
-               td = document.createElement( 'td' );
-               td.id = 'wpDestFile-warning';
-               td.colSpan = 2;
-
-               row.appendChild( td );
-       }
-
-       wpLicense = document.getElementById( 'wpLicense' );
-       if ( mw.config.get( 'wgAjaxLicensePreview' ) && wpLicense ) {
-               // License selector check
-               wpLicense.onchange = licenseSelectorCheck;
-
-               // License selector table row
-               wpLicenseRow = wpLicense.parentNode.parentNode;
-               wpLicenseTbody = wpLicenseRow.parentNode;
-
-               row = document.createElement( 'tr' );
-               td = document.createElement( 'td' );
-               row.appendChild( td );
-               td = document.createElement( 'td' );
-               td.id = 'mw-license-preview';
-               row.appendChild( td );
-
-               wpLicenseTbody.insertBefore( row, wpLicenseRow.nextSibling );
-       }
-
-       // fillDestFile setup
-       uploadSourceIds = mw.config.get( 'wgUploadSourceIds' );
-       len = uploadSourceIds.length;
-       onchange = function () {
-               fillDestFilename( this.id );
-       };
-       for ( i = 0; i < len; i += 1 ) {
-               document.getElementById( uploadSourceIds[i] ).onchange = onchange;
-       }
-}
-
-wgUploadWarningObj = window.wgUploadWarningObj = {
-       responseCache: { '': '&nbsp;' },
-       nameToCheck: '',
-       typing: false,
-       delay: 500, // ms
-       timeoutID: false,
-
-       keypress: function () {
-               var cached, destFile, warningElt;
-
-               if ( !ajaxUploadDestCheck ) {
-                       return;
-               }
-
-               // Find file to upload
-               destFile = document.getElementById( 'wpDestFile' );
-               warningElt = document.getElementById( 'wpDestFile-warning' );
-               if ( !destFile || !warningElt ) {
-                       return;
-               }
-
-               this.nameToCheck = destFile.value;
-
-               // Clear timer
-               if ( this.timeoutID ) {
-                       clearTimeout( this.timeoutID );
-               }
-               // Check response cache
-               for ( cached in this.responseCache ) {
-                       if ( this.nameToCheck === cached ) {
-                               this.setWarning(this.responseCache[this.nameToCheck]);
-                               return;
-                       }
-               }
-
-               this.timeoutID = setTimeout( function () {
-                       wgUploadWarningObj.timeout();
-               }, this.delay );
-       },
-
-       checkNow: function ( fname ) {
-               if ( !ajaxUploadDestCheck ) {
-                       return;
-               }
-               if ( this.timeoutID ) {
-                       clearTimeout( this.timeoutID );
-               }
-               this.nameToCheck = fname;
-               this.timeout();
-       },
-
-       timeout: function () {
-               if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) {
-                       return;
-               }
-               $spinnerDestCheck = $.createSpinner().insertAfter( '#wpDestFile' );
-
-               var uploadWarningObj = this;
-               ( new mw.Api() ).get( {
-                       action: 'query',
-                       titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(),
-                       prop: 'imageinfo',
-                       iiprop: 'uploadwarning',
-                       indexpageids: ''
-               } ).done( function ( result ) {
-                       var resultOut = '';
-                       if ( result.query ) {
-                               resultOut = result.query.pages[result.query.pageids[0]].imageinfo[0];
-                       }
-                       uploadWarningObj.processResult( resultOut, uploadWarningObj.nameToCheck );
-               } );
-       },
-
-       processResult: function ( result, fileName ) {
-               $spinnerDestCheck.remove();
-               $spinnerDestCheck = undefined;
-               this.setWarning( result.html );
-               this.responseCache[fileName] = result.html;
-       },
-
-       setWarning: function ( warning ) {
-               var warningElt = document.getElementById( 'wpDestFile-warning' ),
-                       ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
-
-               this.setInnerHTML( warningElt, warning );
-
-               // Set a value in the form indicating that the warning is acknowledged and
-               // doesn't need to be redisplayed post-upload
-               if ( !warning ) {
-                       ackElt[0].value = '';
-               } else {
-                       ackElt[0].value = '1';
-               }
-
-       },
-       setInnerHTML: function ( element, text ) {
-               // Check for no change to avoid flicker in IE 7
-               if ( element.innerHTML !== text ) {
-                       element.innerHTML = text;
-               }
-       }
-};
-
-fillDestFilename = window.fillDestFilename = function ( id ) {
-       var e, path, slash, backslash, fname,
-               found, ext, i,
-               destFile;
-       if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
-               return;
-       }
-       if ( !document.getElementById ) {
-               return;
-       }
-       // Remove any previously flagged errors
-       e = document.getElementById( 'mw-upload-permitted' );
-       if ( e ) {
-               e.className = '';
-       }
-
-       e = document.getElementById( 'mw-upload-prohibited' );
-       if ( e ) {
-               e.className = '';
-       }
-
-       path = document.getElementById( id ).value;
-       // Find trailing part
-       slash = path.lastIndexOf( '/' );
-       backslash = path.lastIndexOf( '\\' );
-       if ( slash === -1 && backslash === -1 ) {
-               fname = path;
-       } else if ( slash > backslash ) {
-               fname = path.substring( slash + 1, 10000 );
-       } else {
-               fname = path.substring( backslash + 1, 10000 );
-       }
-
-       // Clear the filename if it does not have a valid extension.
-       // URLs are less likely to have a useful extension, so don't include them in the
-       // extension check.
-       if ( mw.config.get( 'wgStrictFileExtensions' ) && fileExtensions && id !== 'wpUploadFileURL' ) {
-               found = false;
-               if ( fname.lastIndexOf( '.' ) !== -1 ) {
-                       ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
-                       for ( i = 0; i < fileExtensions.length; i += 1 ) {
-                               if ( fileExtensions[i].toLowerCase() === ext.toLowerCase() ) {
-                                       found = true;
-                                       break;
-                               }
-                       }
-               }
-               if ( !found ) {
-                       // Not a valid extension
-                       // Clear the upload and set mw-upload-permitted to error
-                       document.getElementById( id ).value = '';
-                       e = document.getElementById( 'mw-upload-permitted' );
-                       if ( e ) {
-                               e.className = 'error';
-                       }
-
-                       e = document.getElementById( 'mw-upload-prohibited' );
-                       if ( e ) {
-                               e.className = 'error';
-                       }
-
-                       // Clear wpDestFile as well
-                       e = document.getElementById( 'wpDestFile' );
-                       if ( e ) {
-                               e.value = '';
-                       }
-
-                       return false;
-               }
-       }
-
-       // Replace spaces by underscores
-       fname = fname.replace( / /g, '_' );
-       // Capitalise first letter if needed
-       if ( mw.config.get( 'wgCapitalizeUploads' ) ) {
-               fname = fname.charAt( 0 ).toUpperCase().concat( fname.substring( 1, 10000 ) );
-       }
-
-       // Output result
-       destFile = document.getElementById( 'wpDestFile' );
-       if ( destFile ) {
-               // Call decodeURIComponent function to remove possible URL-encoded characters
-               // from the file name (bug 30390). Especially likely with upload-form-url.
-               // decodeURIComponent can throw an exception in input is invalid utf-8
-               try {
-                       destFile.value = decodeURIComponent( fname );
-               } catch ( err ) {
-                       destFile.value = fname;
-               }
-               wgUploadWarningObj.checkNow( fname );
-       }
-};
-
-window.toggleFilenameFiller = function () {
-       if ( !document.getElementById ) {
-               return;
-       }
-       var destName = document.getElementById( 'wpDestFile' ).value;
-       mw.config.set( 'wgUploadAutoFill', !destName );
-};
-
-wgUploadLicenseObj = window.wgUploadLicenseObj = {
-
-       responseCache: { '': '' },
-
-       fetchPreview: function ( license ) {
-               var cached, title;
-               if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) {
-                       return;
-               }
-               for ( cached in this.responseCache ) {
-                       if ( cached === license ) {
-                               this.showPreview( this.responseCache[license] );
-                               return;
-                       }
-               }
-
-               $spinnerLicense = $.createSpinner().insertAfter( '#wpLicense' );
-
-               title = document.getElementById( 'wpDestFile' ).value;
-               if ( !title ) {
-                       title = 'File:Sample.jpg';
-               }
-
-               ( new mw.Api() ).get( {
-                       action: 'parse',
-                       text: '{{' + license + '}}',
-                       title: title,
-                       prop: 'text',
-                       pst: ''
-               } ).done( function ( result ) {
-                       wgUploadLicenseObj.processResult( result, license );
-               } );
-       },
-
-       processResult: function ( result, license ) {
-               $spinnerLicense.remove();
-               $spinnerLicense = undefined;
-               this.responseCache[license] = result.parse.text['*'];
-               this.showPreview( this.responseCache[license] );
-       },
-
-       showPreview: function ( preview ) {
-               var previewPanel = document.getElementById( 'mw-license-preview' );
-               if ( previewPanel.innerHTML !== preview ) {
-                       previewPanel.innerHTML = preview;
-               }
-       }
-
-};
-
-$( uploadSetup );
-
-}( mediaWiki, jQuery ) );
deleted file mode 100644 (file)
index 5c6e63b9ee9285c2de3d2ab68b8d42e6302a4d75..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- * MediaWiki legacy wikibits
- */
-( function ( mw, $ ) {
-       var msg,
-               win = window,
-               ua = navigator.userAgent.toLowerCase(),
-               onloadFuncts = [];
-
-/**
- * User-agent sniffing.
- *
- * @deprecated since 1.17 Use jquery.client instead
- */
-
-msg = 'Use feature detection or module jquery.client instead.';
-
-mw.log.deprecate( win, 'clientPC', ua, msg );
-
-// Ignored dummy values
-mw.log.deprecate( win, 'is_gecko', false, msg );
-mw.log.deprecate( win, 'is_chrome_mac', false, msg );
-mw.log.deprecate( win, 'is_chrome', false, msg );
-mw.log.deprecate( win, 'webkit_version', false, msg );
-mw.log.deprecate( win, 'is_safari_win', false, msg );
-mw.log.deprecate( win, 'is_safari', false, msg );
-mw.log.deprecate( win, 'webkit_match', false, msg );
-mw.log.deprecate( win, 'is_ff2', false, msg );
-mw.log.deprecate( win, 'ff2_bugs', false, msg );
-mw.log.deprecate( win, 'is_ff2_win', false, msg );
-mw.log.deprecate( win, 'is_ff2_x11', false, msg );
-mw.log.deprecate( win, 'opera95_bugs', false, msg );
-mw.log.deprecate( win, 'opera7_bugs', false, msg );
-mw.log.deprecate( win, 'opera6_bugs', false, msg );
-mw.log.deprecate( win, 'is_opera_95', false, msg );
-mw.log.deprecate( win, 'is_opera_preseven', false, msg );
-mw.log.deprecate( win, 'is_opera', false, msg );
-mw.log.deprecate( win, 'ie6_bugs', false, msg );
-
-/**
- * DOM utilities for handling of events, text nodes and selecting elements
- *
- * @deprecated since 1.17 Use jQuery instead
- */
-msg = 'Use jQuery instead.';
-
-// Ignored dummy values
-mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
-mw.log.deprecate( win, 'onloadFuncts', [], msg );
-mw.log.deprecate( win, 'runOnloadHook', $.noop, msg );
-mw.log.deprecate( win, 'changeText', $.noop, msg );
-mw.log.deprecate( win, 'killEvt', $.noop, msg );
-mw.log.deprecate( win, 'addHandler', $.noop, msg );
-mw.log.deprecate( win, 'hookEvent', $.noop, msg );
-mw.log.deprecate( win, 'addClickHandler', $.noop, msg );
-mw.log.deprecate( win, 'removeHandler', $.noop, msg );
-mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg );
-mw.log.deprecate( win, 'getInnerText', function () { return ''; }, msg );
-
-// Run a function after the window onload event is fired
-mw.log.deprecate( win, 'addOnloadHook', function ( hookFunct ) {
-       if ( onloadFuncts ) {
-               onloadFuncts.push(hookFunct);
-       } else {
-               // If func queue is gone the event has happened already,
-               // run immediately instead of queueing.
-               hookFunct();
-       }
-}, msg );
-
-$( win ).on( 'load', function () {
-       var i, functs;
-
-       // Don't run twice
-       if ( !onloadFuncts ) {
-               return;
-       }
-
-       // Deference and clear onloadFuncts before running any
-       // hooks to make sure we don't miss any addOnloadHook
-       // calls.
-       functs = onloadFuncts.slice();
-       onloadFuncts = undefined;
-
-       // Execute the queued functions
-       for ( i = 0; i < functs.length; i++ ) {
-               functs[i]();
-       }
-} );
-
-/**
- * Toggle checkboxes with shift selection
- *
- * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
- */
-msg = 'Use jquery.checkboxShiftClick instead.';
-mw.log.deprecate( win, 'checkboxes', [], msg );
-mw.log.deprecate( win, 'lastCheckbox', null, msg );
-mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
-mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg );
-mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
-
-/**
- * Add a button to the default editor toolbar
- *
- * @deprecated since 1.17 Use mw.toolbar instead
- */
-mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
-mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
-
-/**
- * Spinner creation, injection and removal
- *
- * @deprecated since 1.18 Use jquery.spinner instead
- */
-mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
-mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
-
-/**
- * Escape utilities
- *
- * @deprecated since 1.18 Use mw.html instead
- */
-mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
-mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
-
-/**
- * Display a message to the user
- *
- * @deprecated since 1.17 Use mediawiki.notify instead
- * @param {string|HTMLElement} message To be put inside the message box
- */
-mw.log.deprecate( win, 'jsMsg', function ( message ) {
-       if ( !arguments.length || message === '' || message === null ) {
-               return true;
-       }
-       if ( typeof message !== 'object' ) {
-               message = $.parseHTML( message );
-       }
-       mw.notify( message, { autoHide: true, tag: 'legacy' } );
-       return true;
-}, 'Use mediawiki.notify instead.' );
-
-/**
- * Misc. utilities
- *
- * @deprecated since 1.17 Use mediawiki.util instead
- */
-msg = 'Use mediawiki.util instead.';
-mw.log.deprecate( win, 'updateTooltipAccessKeys', mw.util.updateTooltipAccessKeys, msg );
-mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
-mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
-msg = 'Use jquery.accessKeyLabel instead.';
-mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
-mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
-
-/**
- * Wikipage import methods
- */
-
-// included-scripts tracker
-win.loadedScripts = {};
-
-win.importScript = function ( page ) {
-       var uri = mw.config.get( 'wgScript' ) + '?title=' +
-               mw.util.wikiUrlencode( page ) +
-               '&action=raw&ctype=text/javascript';
-       return win.importScriptURI( uri );
-};
-
-win.importScriptURI = function ( url ) {
-       if ( win.loadedScripts[url] ) {
-               return null;
-       }
-       win.loadedScripts[url] = true;
-       var s = document.createElement( 'script' );
-       s.setAttribute( 'src', url );
-       s.setAttribute( 'type', 'text/javascript' );
-       document.getElementsByTagName( 'head' )[0].appendChild( s );
-       return s;
-};
-
-win.importStylesheet = function ( page ) {
-       var uri = mw.config.get( 'wgScript' ) + '?title=' +
-               mw.util.wikiUrlencode( page ) +
-               '&action=raw&ctype=text/css';
-       return win.importStylesheetURI( uri );
-};
-
-win.importStylesheetURI = function ( url, media ) {
-       var l = document.createElement( 'link' );
-       l.rel = 'stylesheet';
-       l.href = url;
-       if ( media ) {
-               l.media = media;
-       }
-       document.getElementsByTagName('head')[0].appendChild( l );
-       return l;
-};
-
-}( mediaWiki, jQuery ) );
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..c86af5b4cafc2d01d733615599ae1d66fe042639
--- /dev/null
@@ -0,0 +1 @@
+../../resources/src/mediawiki.legacy/wikibits.js
\ No newline at end of file
index 0078d7e..2e8fed4 100644 (file)
@@ -44,6 +44,7 @@ $wgAutoloadClasses += array(
        'ResourceLoaderTestCase' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'ResourceLoaderTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'ResourceLoaderFileModuleTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
+       'ResourceLoaderWikiModuleTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'TestUser' => "$testDir/phpunit/includes/TestUser.php",
        'LessFileCompilationTest' => "$testDir/phpunit/LessFileCompilationTest.php",
 
old mode 100755 (executable)
new mode 100644 (file)
index 92784bf..1ea4eb5 100644 (file)
@@ -4,7 +4,7 @@ GEM
     builder (3.2.2)
     childprocess (0.5.3)
       ffi (~> 1.0, >= 1.0.11)
-    cucumber (1.3.15)
+    cucumber (1.3.16)
       builder (>= 2.1.2)
       diff-lcs (>= 1.1.3)
       gherkin (~> 2.12)
@@ -14,9 +14,9 @@ GEM
       faker (>= 1.1.2)
       yml_reader (>= 0.3)
     diff-lcs (1.2.5)
-    domain_name (0.5.19)
+    domain_name (0.5.20)
       unf (>= 0.0.5, < 1.0.0)
-    faker (1.3.0)
+    faker (1.4.3)
       i18n (~> 0.5)
     faraday (0.9.0)
       multipart-post (>= 1.2, < 3)
@@ -29,15 +29,16 @@ GEM
     headless (1.0.2)
     http-cookie (1.0.2)
       domain_name (~> 0.5)
-    i18n (0.6.9)
+    i18n (0.6.11)
     json (1.8.1)
-    mediawiki_api (0.1.3)
+    mediawiki_api (0.2.1)
       faraday (~> 0.9, >= 0.9.0)
       faraday-cookie_jar (~> 0.0, >= 0.0.6)
-    mediawiki_selenium (0.2.25)
+    mediawiki_selenium (0.3.2)
       cucumber (~> 1.3, >= 1.3.10)
       headless (~> 1.0, >= 1.0.1)
       json (~> 1.8, >= 1.8.1)
+      mediawiki_api (~> 0.2, >= 0.2.1)
       page-object (~> 1.0)
       rest-client (~> 1.6, >= 1.6.7)
       rspec-expectations (~> 2.14, >= 2.14.4)
@@ -46,17 +47,19 @@ GEM
     multi_json (1.10.1)
     multi_test (0.1.1)
     multipart-post (2.0.0)
-    page-object (1.0)
+    netrc (0.7.7)
+    page-object (1.0.2)
       page_navigation (>= 0.9)
       selenium-webdriver (>= 2.42.0)
       watir-webdriver (>= 0.6.9)
     page_navigation (0.9)
       data_magic (>= 0.14)
-    rest-client (1.6.7)
-      mime-types (>= 1.16)
-    rspec-expectations (2.99.1)
+    rest-client (1.7.2)
+      mime-types (>= 1.16, < 3.0)
+      netrc (~> 0.7)
+    rspec-expectations (2.99.2)
       diff-lcs (>= 1.1.3, < 2.0)
-    rubyzip (1.1.5)
+    rubyzip (1.1.6)
     selenium-webdriver (2.42.0)
       childprocess (>= 0.5.0)
       multi_json (~> 1.0)
index d6745ad..0b4e83a 100644 (file)
@@ -1,4 +1,4 @@
-@chrome @clean @en.wikipedia.beta.wmflabs.org @firefox @phantomjs @test2.wikipedia.org
+@chrome @clean @firefox @phantomjs
 Feature: Create account
 
   Scenario Outline: Go to Create account page
index 29dd1c1..a0aa624 100644 (file)
@@ -1,4 +1,4 @@
-@chrome @clean @en.wikipedia.beta.wmflabs.org @firefox @login @phantomjs @test2.wikipedia.org
+@chrome @clean @firefox @login @phantomjs
 Feature: Create Page With Wiki Link
 
   Scenario: Create Page With Wiki Link
index c190a78..b905795 100644 (file)
@@ -1,4 +1,4 @@
-@chrome @clean @en.wikipedia.beta.wmflabs.org @firefox @login @phantomjs @test2.wikipedia.org
+@chrome @clean @firefox @login @phantomjs
 Feature: Edit Page
 
   Scenario: Create and edit page
index 2d3b708..0bd36ed 100644 (file)
@@ -9,7 +9,7 @@
 # qa-browsertests top-level directory and at
 # https://git.wikimedia.org/blob/qa%2Fbrowsertests/HEAD/CREDITS
 #
-@chrome @en.wikipedia.beta.wmflabs.org @firefox @internet_explorer_6 @internet_explorer_7 @internet_explorer_8 @internet_explorer_9 @internet_explorer_10 @phantomjs @test2.wikipedia.org
+@chrome @clean @firefox @internet_explorer_6 @internet_explorer_7 @internet_explorer_8 @internet_explorer_9 @internet_explorer_10 @phantomjs
 Feature: File
 
  Scenario: Anonymous goes to file that does not exist
@@ -20,4 +20,4 @@ Feature: File
  Scenario: Logged-in user goes to file that does not exist
    Given I am logged in
      And I am at file that does not exist
-   Then page should show that no such file exists
\ No newline at end of file
+   Then page should show that no such file exists
index 9ff2a2a..c34d23d 100644 (file)
@@ -9,7 +9,7 @@
 # qa-browsertests top-level directory and at
 # https://git.wikimedia.org/blob/qa%2Fbrowsertests/HEAD/CREDITS
 #
-@chrome @en.wikipedia.beta.wmflabs.org @firefox @internet_explorer_6 @internet_explorer_7 @internet_explorer_8 @internet_explorer_9 @internet_explorer_10 @phantomjs @test2.wikipedia.org
+@chrome @clean @firefox @internet_explorer_6 @internet_explorer_7 @internet_explorer_8 @internet_explorer_9 @internet_explorer_10 @phantomjs
 Feature: Log in
 
   Background:
@@ -39,4 +39,4 @@ Feature: Log in
   @login
   Scenario: Log in with valid credentials
     When I am logged in
-    Then error box should not be visible
\ No newline at end of file
+    Then error box should not be visible
index 561fe53..3613c82 100644 (file)
@@ -1,4 +1,4 @@
-@chrome @clean @en.wikipedia.beta.wmflabs.org @firefox @phantomjs @test2.wikipedia.org
+@chrome @clean @firefox @phantomjs
 Feature: Main Page View History Links
 
   Background:
@@ -16,4 +16,4 @@ Feature: Main Page View History Links
       And I should see a link for Special pages
       And I should see a link for Printable version
       And I should see a link for Permanent link
-      And I should see a link for Page information
\ No newline at end of file
+      And I should see a link for Page information
index 1a958bb..9e3abfd 100644 (file)
@@ -9,7 +9,7 @@
 # qa-browsertests top-level directory and at
 # https://git.wikimedia.org/blob/qa%2Fbrowsertests/HEAD/CREDITS
 #
-@chrome @clean @en.wikipedia.beta.wmflabs.org @firefox @internet_explorer_6 @internet_explorer_7 @internet_explorer_8 @internet_explorer_9 @internet_explorer_10 @login @phantomjs @test2.wikipedia.org
+@chrome @clean @firefox @internet_explorer_6 @internet_explorer_7 @internet_explorer_8 @internet_explorer_9 @internet_explorer_10 @login @phantomjs
 Feature: Preferences
 
   Scenario: Preferences Appearance
index e7b64cd..c24e386 100644 (file)
@@ -16,7 +16,6 @@ class PreferencesAppearancePage
   page_url URL.url("Special:Preferences#mw-prefsection-rendering")
 
   checkbox(:auto_number_check, id: "mw-input-wpnumberheadings")
-  checkbox(:collapse_sidebar_vector_check, id: "mw-input-wpvector-collapsiblenav")
   radio_button(:cologne_blue, id: "mw-input-wpskin-cologneblue")
   radio_button(:day_mo_year_radio, id: "mw-input-wpdate-dmy")
   checkbox(:dont_show_aft_check, id: "mw-input-wparticlefeedback-disable")
index 7b42639..ba61ebd 100644 (file)
@@ -1,4 +1,4 @@
-@chrome @clean @en.wikipedia.beta.wmflabs.org @firefox @phantomjs @test2.wikipedia.org
+@chrome @clean @firefox @phantomjs
 Feature: View History
 
   Scenario: Edit page and view history
@@ -8,4 +8,4 @@ Feature: View History
       And I save the edit
       And the edited page content should contain "Edited and a random string"
       And I click View History
-    Then I should see a link to a previous version of the page
\ No newline at end of file
+    Then I should see a link to a previous version of the page
index 59c18a8..8630f5d 100644 (file)
@@ -44,7 +44,7 @@ module.exports = function ( grunt ) {
                jsonlint: {
                        all: [
                                '.jscsrc',
-                               '{languages,languages,maintenance,resources}/**/*.json',
+                               '{languages,maintenance,resources}/**/*.json',
                                'tests/frontend/package.json'
                        ]
                },
index 386f488..7913363 100644 (file)
@@ -8,7 +8,7 @@
     "grunt": "0.4.2",
     "grunt-contrib-jshint": "0.10.0",
     "grunt-contrib-watch": "0.6.1",
-    "grunt-banana-checker": "0.1.0",
+    "grunt-banana-checker": "0.2.0",
     "grunt-jscs": "0.6.1",
     "grunt-jsonlint": "1.0.4"
   }
index 2c44150..a9df683 100644 (file)
@@ -332,6 +332,7 @@ class ParserTest {
         * Remove last character if it is a newline
         * @group utility
         * @param string $s
+        * @return string
         */
        public static function chomp( $s ) {
                if ( substr( $s, -1 ) === "\n" ) {
@@ -416,6 +417,7 @@ class ParserTest {
        /**
         * Get an input dictionary from a set of parser test files
         * @param array $filenames
+        * @return string
         */
        function getFuzzInput( $filenames ) {
                $dict = '';
@@ -438,6 +440,7 @@ class ParserTest {
 
        /**
         * Get a memory usage breakdown
+        * @return array
         */
        function getMemoryBreakdown() {
                $memStats = array();
@@ -625,7 +628,7 @@ class ParserTest {
                                        return $this->showSkipped();
                                }
                                $out = MWTidy::tidy( $out );
-                               $out = preg_replace( '/\s+$/', '', $out);
+                               $out = preg_replace( '/\s+$/', '', $out );
                        }
 
                        if ( isset( $opts['showtitle'] ) ) {
@@ -663,6 +666,7 @@ class ParserTest {
        /**
         * Refactored in 1.22 to use ParserTestResult
         * @param ParserTestResult $testResult
+        * @return bool
         */
        function showTestResult( ParserTestResult $testResult ) {
                if ( $testResult->isSuccess() ) {
@@ -679,6 +683,7 @@ class ParserTest {
         * @param string $key Name of option val to retrieve
         * @param array $opts Options array to look in
         * @param mixed $default Default value returned if not found
+        * @return mixed
         */
        private static function getOptionValue( $key, $opts, $default ) {
                $key = strtolower( $key );
@@ -782,6 +787,7 @@ class ParserTest {
         * Ideally this should replace the global configuration entirely.
         * @param string $opts
         * @param string $config
+        * @return RequestContext
         */
        private function setupGlobals( $opts = '', $config = '' ) {
                global $IP;
@@ -929,6 +935,7 @@ class ParserTest {
        /**
         * List of temporary tables to create, without prefix.
         * Some of these probably aren't necessary.
+        * @return array
         */
        private function listTables() {
                $tables = array( 'user', 'user_properties', 'user_former_groups', 'page', 'page_restrictions',
@@ -1395,7 +1402,7 @@ class ParserTest {
        /**
         * Print a skipped message.
         *
-        * @return boolean
+        * @return bool
         */
        protected function showSkipped() {
                if ( $this->showProgress ) {
index 3a315e1..c90c4f6 100644 (file)
@@ -4357,7 +4357,7 @@ External links: wiki links within external link (Bug 3695)
 <p><a rel="nofollow" class="external text" href="http://example.com"></a><a href="/index.php?title=Wikilink&amp;action=edit&amp;redlink=1" class="new" title="Wikilink (page does not exist)">wikilink</a><a rel="nofollow" class="external text" href="http://example.com"> embedded in ext link</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:ExtLink" href="http://example.com"></a><a rel="mw:WikiLink" href="./Wikilink">wikilink</a><span> embedded in ext link</span></p>
+<p><a rel="mw:ExtLink" href="http://example.com"></a><a rel="mw:WikiLink" href="./Wikilink" title="Wikilink">wikilink</a><span> embedded in ext link</span></p>
 !! end
 
 !! test
@@ -4590,7 +4590,7 @@ External link containing double-single-quotes with no space separating the url f
 !! html/php+tidy
 <p><a rel="nofollow" class="external text" href="http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm"><i>La muerte de Casagemas</i> (1901) en el sitio de</a> <a href="/index.php?title=Museo_Picasso_(Par%C3%ADs)&amp;action=edit&amp;redlink=1" class="new" title="Museo Picasso (París) (page does not exist)">Museo Picasso</a>.</p>
 !! html/parsoid
-<p><a rel="mw:ExtLink" href="http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm"><i>La muerte de Casagemas</i> (1901) en el sitio de </a><a rel="mw:WikiLink" href="./Museo_Picasso_(París)">Museo Picasso</a><span>.</span></p>
+<p><a rel="mw:ExtLink" href="http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm"><i>La muerte de Casagemas</i> (1901) en el sitio de </a><a rel="mw:WikiLink" href="./Museo_Picasso_(París)" title="Museo Picasso (París)">Museo Picasso</a><span>.</span></p>
 !! end
 
 !! test
@@ -5525,6 +5525,29 @@ Table-cell after a comment-only-empty-line
 
 !! end
 
+!! test
+Build table with {{!}}
+!! wikitext
+{{{!}} class="wikitable"
+! header
+! second header
+{{!}}- style="color:red;"
+{{!}} data {{!}}{{!}} style="color:red;" {{!}} second data
+{{!}}}
+!! html
+<table class="wikitable">
+<tr>
+<th> header
+</th>
+<th> second header
+</th></tr>
+<tr style="color:red;">
+<td> data </td>
+<td style="color:red;"> second data
+</td></tr></table>
+
+!! end
+
 # The expected HTML structure in this test is debatable. The PHP parser does
 # not parse this kind of table at all. The main focus for Parsoid is on
 # round-tripping, so this output is ok for now. TODO: revisit!
@@ -5847,7 +5870,7 @@ Piped link with multiple pipe characters in link text
 <p><a href="/wiki/Main_Page" title="Main Page">|The|Main|Page|</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="Main_Page">|The|Main|Page|</a></p>
+<p><a rel="mw:WikiLink" href="Main_Page" title="Main Page">|The|Main|Page|</a></p>
 !! end
 
 !! test
@@ -5992,7 +6015,7 @@ Anchor containing a #. (bug 63430)
 <p><a href="/wiki/Main_Page#And.23Link" title="Main Page">Main Page#And#Link</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page#And%23Link">Main Page#And#Link</a></p>
+<p><a rel="mw:WikiLink" href="./Main_Page#And%23Link" title="Main Page">Main Page#And#Link</a></p>
 !! end
 
 !! test
@@ -6038,7 +6061,7 @@ parsoid=html2wt,html2html
 !! wikitext
 [[MemoryAlpha:AlphaTest]]
 !! html
-<p><a rel="mw:WikiLink" href="./MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a>
+<p><a rel="mw:WikiLink" href="./MemoryAlpha:AlphaTest" title="MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a>
 </p>
 !! end
 
@@ -6074,7 +6097,7 @@ Link containing % (not as a hex sequence)
 <p><a href="/wiki/7%25_Solution" title="7% Solution">7% Solution</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./7%25_Solution">7% Solution</a></p>
+<p><a rel="mw:WikiLink" href="./7%25_Solution" title="7% Solution">7% Solution</a></p>
 !! end
 
 # note that the parsoid HTML is identical to the previous test output,
@@ -6090,7 +6113,7 @@ parsoid=wt2wt,wt2html,html2html
 <p><a href="/wiki/7%25_Solution" title="7% Solution">7% Solution</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./7%25_Solution">7% Solution</a></p>
+<p><a rel="mw:WikiLink" href="./7%25_Solution" title="7% Solution">7% Solution</a></p>
 !!end
 
 !! test
@@ -6113,7 +6136,7 @@ Example for such a section: == < ==
 <p><a href="#.3C">#&lt;</a><a href="#.3E">#&gt;</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main%20Page#%3C">#&lt;</a><a rel="mw:WikiLink" href="./Main%20Page#%3E">#></a></p>
+<p><a rel="mw:WikiLink" href="./Main%20Page#%3C" title="Main Page">#&lt;</a><a rel="mw:WikiLink" href="./Main%20Page#%3E" title="Main Page">#></a></p>
 !! end
 
 !! test
@@ -6133,7 +6156,7 @@ Link containing an equals sign
 <p><a href="/wiki/Special:BookSources/isbn%3D4-00-026157-6" title="Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a></p>
+<p><a rel="mw:WikiLink" href="./Special:BookSources/isbn=4-00-026157-6" title="Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a></p>
 !! end
 
 !! article
@@ -6153,7 +6176,7 @@ Link containing a tilde
 <p><a href="/wiki/Foo%7Ebar" title="Foo~bar">Foo~bar</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Foo~bar">Foo~bar</a></p>
+<p><a rel="mw:WikiLink" href="./Foo~bar" title="Foo~bar">Foo~bar</a></p>
 !! end
 
 !! test
@@ -6164,7 +6187,7 @@ Link containing double-single-quotes '' (bug 4598)
 <p><a href="/index.php?title=Lista_d%27%27e_paise_d%27%27o_munno&amp;action=edit&amp;redlink=1" class="new" title="Lista d''e paise d''o munno (page does not exist)">Lista d''e paise d''o munno</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Lista_d''e_paise_d''o_munno">Lista d''e paise d''o munno</a></p>
+<p><a rel="mw:WikiLink" href="./Lista_d''e_paise_d''o_munno" title="Lista d''e paise d''o munno">Lista d''e paise d''o munno</a></p>
 !! end
 
 !! test
@@ -6175,7 +6198,7 @@ Some [[Link|pretty ''italics'' and stuff]]!
 <p>Some <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!
 </p>
 !! html/parsoid
-<p>Some <a rel="mw:WikiLink" href="Link">pretty <i>italics</i> and stuff</a>!</p>
+<p>Some <a rel="mw:WikiLink" href="Link" title="Link">pretty <i>italics</i> and stuff</a>!</p>
 !! end
 
 !! test
@@ -6205,9 +6228,9 @@ Link with double quotes in title part (literal) and alternate part (interpreted)
 </p>
 !! html/parsoid
 <meta typeof="mw:Placeholder"/>
-<p><a rel="mw:WikiLink" href="''Pentecoste''">''Pentecoste''</a></p>
-<p><a rel="mw:WikiLink" href="''Pentecoste''">Pentecoste</a></p>
-<p><a rel="mw:WikiLink" href="''Pentecoste''"><i>Pentecoste</i></a></p>
+<p><a rel="mw:WikiLink" href="''Pentecoste''" title="''Pentecoste''">''Pentecoste''</a></p>
+<p><a rel="mw:WikiLink" href="''Pentecoste''" title="''Pentecoste''">Pentecoste</a></p>
+<p><a rel="mw:WikiLink" href="''Pentecoste''" title="''Pentecoste''"><i>Pentecoste</i></a></p>
 !! end
 
 !! test
@@ -6308,7 +6331,7 @@ BUG 2: [[page|http://url/]] should link to page, not http://url/
 <p><a href="/wiki/Main_Page" title="Main Page">http://url/</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page">http://url/</a></p>
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page">http://url/</a></p>
 !! end
 
 # Parsoid does not mark self-links, by design.
@@ -6324,7 +6347,7 @@ title=[[Bug462]]
 !! html/php+tidy
 <p><strong class="selflink">Bug462</strong> <strong class="selflink">Bug462</strong></p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Bug462">Bug462</a> <a rel="mw:WikiLink" href="./Bug462">Bug462</a></p>
+<p><a rel="mw:WikiLink" href="./Bug462" title="Bug462">Bug462</a> <a rel="mw:WikiLink" href="./Bug462" title="Bug462">Bug462</a></p>
 !! end
 
 !! test
@@ -6447,7 +6470,7 @@ Link with multiple ":" in a subpage-supporting namespace (bug 63636)
 <p><a href="/index.php?title=User:Foo/Test/63636:Bar&amp;action=edit&amp;redlink=1" class="new" title="User:Foo/Test/63636:Bar (page does not exist)">Test</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./User:Foo/Test/63636:Bar">Test</a></p>
+<p><a rel="mw:WikiLink" href="./User:Foo/Test/63636:Bar" title="User:Foo/Test/63636:Bar">Test</a></p>
 !! end
 
 !! test
@@ -6470,7 +6493,7 @@ parsoid
 !! wikitext
 {{echo|[[Foo]]}}l
 !! html
-<p><a rel="mw:WikiLink" href="Foo" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Foo]]"}},"i":0}},"l"]}'>Fool</a></p>
+<p><a rel="mw:WikiLink" href="Foo" title="Foo" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Foo]]"}},"i":0}},"l"]}'>Fool</a></p>
 !! end
 
 !! test
@@ -6480,7 +6503,7 @@ parsoid
 !! wikitext
 {{echo|Some [[Fool]]}}s
 !! html
-<p data-parsoid='{}'><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]"}},"i":0}},"s"]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>Some </span><a rel="mw:WikiLink" href="./Fool" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a></p>
+<p data-parsoid='{}'><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]"}},"i":0}},"s"]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>Some </span><a rel="mw:WikiLink" href="./Fool" title="Fool" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a></p>
 !! end
 
 !! test
@@ -6490,7 +6513,7 @@ parsoid
 !! wikitext
 {{echo|Some [[Fool]]s are '''bold and foolish'''}}
 !! html
-<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]s are &#39;&#39;&#39;bold and foolish&#39;&#39;&#39;"}},"i":0}}]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>Some <a rel="mw:WikiLink" href="./Fool" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a> are <b data-parsoid="{}">bold and foolish</b></p>
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]s are &#39;&#39;&#39;bold and foolish&#39;&#39;&#39;"}},"i":0}}]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>Some <a rel="mw:WikiLink" href="./Fool" title="Fool" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a> are <b data-parsoid="{}">bold and foolish</b></p>
 !! end
 
 !! article
@@ -6542,7 +6565,7 @@ parsoid=html2wt,html2html
 !! wikitext
 [[apple]]<nowiki/>s
 !! html
-<p><a rel="mw:WikiLink" href="Apple">apple</a>s</p>
+<p><a rel="mw:WikiLink" href="Apple" title="Apple">apple</a>s</p>
 !! end
 
 !! test
@@ -6553,7 +6576,7 @@ parsoid=html2wt,html2html
 !! wikitext
 Aðrir mótmælenda<nowiki/>[[söfnuður]]
 !! html
-<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður">söfnuður</a></p>
+<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður" title="Söfnuður">söfnuður</a></p>
 !! end
 
 !! test
@@ -6581,7 +6604,7 @@ parsoid
 !! wikitext
 [[Foo|{{echo|a}} b {{echo|c}}]]
 !! html
-<p><a rel="mw:WikiLink" href="Foo"><span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span> b <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c"}},"i":0}}]}'>c</span></a></p>
+<p><a rel="mw:WikiLink" href="Foo" title="Foo"><span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span> b <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c"}},"i":0}}]}'>c</span></a></p>
 !! end
 
 !! test
@@ -6592,7 +6615,7 @@ Link with angle bracket after anchor
 <p><a href="/wiki/Foo#.3Cbar.3E" title="Foo">Foo#&lt;bar&gt;</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Foo#%3Cbar%3E" data-parsoid='{"stx":"simple","a":{"href":"./Foo#%3Cbar%3E"},"sa":{"href":"Foo#&lt;bar>"}}'>Foo#&lt;bar></a></p>
+<p><a rel="mw:WikiLink" href="./Foo#%3Cbar%3E" title="Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo#%3Cbar%3E"},"sa":{"href":"Foo#&lt;bar>"}}'>Foo#&lt;bar></a></p>
 !! end
 
 ###
@@ -6657,6 +6680,8 @@ Different interwiki prefixes mapping to the same URL
 [[wikipedia:en:Foo]]
 
 [[:wikipedia:en:Foo]]
+
+[[  wikiPEdia :Foo]]
 !! html/parsoid
 <p><a rel="mw:ExtLink" href="//en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"//en.wikipedia.org/wiki/Foo"},"sa":{"href":":en:Foo"},"isIW":true}'>en:Foo</a></p>
 
@@ -6669,6 +6694,8 @@ Different interwiki prefixes mapping to the same URL
 <p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/en:Foo" data-parsoid='{"stx":"simple","a":{"href":"http://en.wikipedia.org/wiki/en:Foo"},"sa":{"href":"wikipedia:en:Foo"},"isIW":true}'>wikipedia:en:Foo</a></p>
 
 <p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/en:Foo" data-parsoid='{"stx":"simple","a":{"href":"http://en.wikipedia.org/wiki/en:Foo"},"sa":{"href":":wikipedia:en:Foo"},"isIW":true}'>wikipedia:en:Foo</a></p>
+
+<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"http://en.wikipedia.org/wiki/Foo"},"sa":{"href":"  wikiPEdia :Foo"},"isIW":true}'>  wikiPEdia :Foo</a></p>
 !! end
 
 !! test
@@ -6782,6 +6809,21 @@ Blah blah blah
 <link rel="mw:PageProp/Language" href="//zh.wikipedia.org/wiki/Chinese"/></p>
 !! end
 
+!! test
+Interlanguage link variations
+!! wikitext
+Blah blah blah
+[[   es :Spanish]]
+[[ ZH :Chinese]]
+!! html/php
+<p>Blah blah blah
+</p>
+!! html/parsoid
+<p>Blah blah blah
+<link rel="mw:PageProp/Language" href="//es.wikipedia.org/wiki/Spanish" data-parsoid='{"stx":"simple","a":{"href":"//es.wikipedia.org/wiki/Spanish"},"sa":{"href":"   es :Spanish"}}'/>
+<link rel="mw:PageProp/Language" href="//zh.wikipedia.org/wiki/Chinese" data-parsoid='{"stx":"simple","a":{"href":"//zh.wikipedia.org/wiki/Chinese"},"sa":{"href":" ZH :Chinese"}}'/>
+!! end
+
 !! test
 Interlanguage link, with prefix links
 !! options
@@ -6860,9 +6902,9 @@ parsoid
 
 [[constructor:foo]]
 !! html
-<p><a rel="mw:WikiLink" href="./Constructor" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Constructor&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor&quot;}}">constructor</a></p>
+<p><a rel="mw:WikiLink" href="./Constructor" title="Constructor" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Constructor&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor&quot;}}">constructor</a></p>
 
-<p><a rel="mw:WikiLink" href="./Foo" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Foo&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor:foo&quot;}}">constructor:foo</a></p>
+<p><a rel="mw:WikiLink" href="./Foo" title="Foo" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Foo&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor:foo&quot;}}">constructor:foo</a></p>
 !! end
 
 !! test
@@ -6892,7 +6934,7 @@ parsoid
 !! wikitext
 [[en:Foo]]
 !! html
-<p><a rel="mw:WikiLink" href="./Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo"},"sa":{"href":"en:Foo"}}'>Foo</a></p>
+<p><a rel="mw:WikiLink" href="./Foo" title="Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo"},"sa":{"href":"en:Foo"}}'>Foo</a></p>
 !! end
 
 !! test
@@ -7021,7 +7063,7 @@ parsoid=wt2html,html2html
 !! wikitext
 #REDIRECT [[:Category:Foo]]
 !! html
-<p><a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a></p>
+<p><a rel="mw:WikiLink" href="Category:Foo" title="Category:Foo">Category:Foo</a></p>
 !! end
 
 !! test
@@ -7181,7 +7223,7 @@ Handling html with a br self-closing tag
 <br title=bar />
 <br title=bar/>
 <br title=bar/ >
-!! html
+!! html/php
 <p><br title="title" />
 <br title="title" />
 <br />
@@ -7189,6 +7231,14 @@ Handling html with a br self-closing tag
 <br title="bar" />
 <br title="bar/" />
 </p>
+!! html/parsoid
+<p><br title="" />
+<br title="" />
+<br />
+<br title="bar" />
+<br title="bar" />
+<br title="bar/" />
+</p>
 !! end
 
 !! test
@@ -8550,6 +8600,14 @@ Template with invalid target containing wikilink
 <p><span typeof="mw:Transclusion" about="#mwt1" data-mw='{"parts":[{"template":{"target":{"wt":"[[Main Page]]"},"params":{},"i":0}}]}'>{{</span><a rel="mw:WikiLink" href="./Main_Page" about="#mwt1">Main Page</a><span about="#mwt1">}}</span></p>
 !! end
 
+!! test
+Template with just whitespace in it, bug #68421
+!! wikitext
+{{echo|{{ }}}}
+!! html/parsoid
+<p><span typeof="mw:Transclusion mw:Nowiki" about="#mwt1" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{ }}"}},"i":0}}]}'>{{ }}</span></p>
+!! end
+
 !! article
 Template:test
 !! text
@@ -9526,6 +9584,17 @@ Templates: Block Tags: 2. Back-to-back template uses
 
 !!end
 
+# This is an edge case relating to paragraph wrapping.
+!!test
+Templates: Correctly encapsulate templates producing </p> tag without a corresponding <p> tag
+!! wikitext
+{{echo|a
+b</p>}}
+!! html/parsoid
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\nb&lt;/p>"}},"i":0}}]}'>a
+b</p><p></p>
+!!end
+
 !!test
 Templates: Links: 1. Simple example
 !! wikitext
@@ -10853,12 +10922,12 @@ thumbsize=220
 [[Link2]]
 ]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Caption <a href="/index.php?title=Link1&amp;action=edit&amp;redlink=1" class="new" title="Link1 (page does not exist)">Link1</a> [[]] <a href="/index.php?title=Link2&amp;action=edit&amp;redlink=1" class="new" title="Link2 (page does not exist)">Link2</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Caption <a href="/index.php?title=Link1&amp;action=edit&amp;redlink=1" class="new" title="Link1 (page does not exist)">Link1</a> [[]] <a href="/index.php?title=Link2&amp;action=edit&amp;redlink=1" class="new" title="Link2 (page does not exist)">Link2</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"Caption [[Link1]]\n[[]]\n[[Link2]]\n"}],"dsr":[0,59,2,2]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"dsr":[2,null,null,null]}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption data-parsoid='{"dsr":[null,57,null,null]}'>Caption <a rel="mw:WikiLink" href="./Link1" data-parsoid='{"stx":"simple","a":{"href":"./Link1"},"sa":{"href":"Link1"},"dsr":[32,41,2,2]}'>Link1</a>
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"Caption [[Link1]]\n[[]]\n[[Link2]]\n"}],"dsr":[0,59,2,2]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"dsr":[2,null,null,null]}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption data-parsoid='{"dsr":[null,57,null,null]}'>Caption <a rel="mw:WikiLink" href="./Link1" title="Link1" data-parsoid='{"stx":"simple","a":{"href":"./Link1"},"sa":{"href":"Link1"},"dsr":[32,41,2,2]}'>Link1</a>
 [[]]
-<a rel="mw:WikiLink" href="./Link2" data-parsoid='{"stx":"simple","a":{"href":"./Link2"},"sa":{"href":"Link2"},"dsr":[47,56,2,2]}'>Link2</a>
+<a rel="mw:WikiLink" href="./Link2" title="Link2" data-parsoid='{"stx":"simple","a":{"href":"./Link2"},"sa":{"href":"Link2"},"dsr":[47,56,2,2]}'>Link2</a>
 </figcaption></figure>
 !! end
 
@@ -10889,7 +10958,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb|{{echo|137px}}|This is a caption]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption</div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb mw:ExpandedAttrs" data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["width",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;137px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[24,38,null,null]}\">137px&lt;/span>"}]]}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
@@ -10900,7 +10969,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|{{echo|thumb}}|{{echo|137px}}|This is a caption]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption</div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb mw:ExpandedAttrs" data-mw='{"attribs":[["thumbnail",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;thumb&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[18,32,null,null]}\">thumb&lt;/span>"}],["width",{"html":"&lt;span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;137px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[33,47,null,null]}\">137px&lt;/span>"}]]}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
@@ -10943,7 +11012,7 @@ thumbsize=220
 <p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>456
 </p>
 123<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>456
-123<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>456
+123<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div>456
 
 !! html/php+tidy
 <p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>456</p>
@@ -10953,7 +11022,7 @@ thumbsize=220
 <div class="thumb tright">
 <div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>
 <div class="thumbcaption">
-<div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>
+<div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>
 </div>
 </div>
 </div>
@@ -10995,7 +11064,7 @@ thumbsize=220
 
 [[File:Foobar.jpg|middle|text-top|caption]]
 !! html/php
-<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" style="vertical-align: middle" /></a>
 </p>
 !! html/parsoid
@@ -11156,7 +11225,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb|link=http://example.com/|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>Title</figcaption></figure>
@@ -11169,7 +11238,7 @@ thumbsize=220
 !! wikitext
 [[File:Foobar.jpg|thumb=Thumb.png|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
@@ -11183,7 +11252,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb=Thumb.png|link=Main_Page|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
@@ -11197,7 +11266,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb=Thumb.png|link=http://example.com|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="http://example.com"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="http://example.com"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="http://example.com"><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
@@ -11211,7 +11280,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb=Thumb.png|link=|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" />  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" />  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><span><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" height="135" width="135"/></span><figcaption>Title</figcaption></figure>
@@ -11225,7 +11294,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb=Thumb.png|link=Main_Page|alt=alttext|Title]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="Main_Page"><img alt="alttext" resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
@@ -11241,7 +11310,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page">Main Page</a></figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page" title="Main Page">Main Page</a></figcaption></figure>
 !! end
 
 !! test
@@ -11254,7 +11323,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img alt="Altitude" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page">Main Page</a></figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img alt="Altitude" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page" title="Main Page">Main Page</a></figcaption></figure>
 !! end
 
 !! test
@@ -11326,9 +11395,9 @@ parsoid=wt2html,wt2wt,html2html
 [[File:Foobar.jpg|thumb|frameless|caption]]
 [[File:Foobar.jpg|thumb|frame|caption]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
@@ -11386,7 +11455,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb|50px]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:52px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:52px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="6" width="50"/></a></figure>
@@ -11401,8 +11470,8 @@ parsoid=wt2html,wt2wt,html2html
 
 [[File:Foobar.svg|thumb|2000px]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:2002px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png" width="2000" height="1500" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:2002px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png" width="2000" height="1500" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div></div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure>
@@ -11501,7 +11570,7 @@ thumbsize=220
 !! wikitext
 [[File:Foobar.jpg|thumb|http://example.com]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></figcaption></figure>
@@ -11515,7 +11584,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb|http://example.com|alt=Alteration]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img alt="Alteration" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></figcaption></figure>
@@ -11527,7 +11596,7 @@ SVG thumbnails with no language set
 !! wikitext
 [[File:Foobar.svg|thumb|caption]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" height="165" width="220"/></a><figcaption>caption</figcaption></figure>
@@ -11540,7 +11609,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.svg|thumb|caption|lang=de]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&amp;lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&amp;lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" lang="de" height="165" width="220"/></a><figcaption>caption</figcaption></figure>
@@ -11553,7 +11622,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.svg|thumb|caption|lang=invalid.language.code]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>lang=invalid.language.code</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"></a></div>lang=invalid.language.code</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" height="165" width="220"/></a><figcaption>lang=invalid.language.code</figcaption></figure>
@@ -11564,7 +11633,7 @@ BUG 1887: A ISBN with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|ISBN 1235467890]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption><a href="Special:BookSources/1235467890" rel="mw:ExtLink">ISBN 1235467890</a></figcaption></figure>
@@ -11575,7 +11644,7 @@ BUG 1887: A RFC with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|This is RFC 12354]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>This is <a href="//tools.ietf.org/html/rfc12354" rel="mw:ExtLink">RFC 12354</a></figcaption></figure>
@@ -11586,7 +11655,7 @@ BUG 1887: A mailto link with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|Please mailto:nobody@example.com]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>Please <a rel="mw:ExtLink" href="mailto:nobody@example.com">mailto:nobody@example.com</a></figcaption></figure>
@@ -11669,7 +11738,7 @@ parsoid=wt2html,wt2wt,html2html
 <p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a href="/wiki/Main_Page" title="Main Page">this</a> is just an ordinary link.
 </p>
 !! html/parsoid
-<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a rel="mw:WikiLink" href="Main_Page">this</a> is just an ordinary link.</p>
+<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a rel="mw:WikiLink" href="Main_Page" title="Main Page">this</a> is just an ordinary link.</p>
 !! end
 
 !! test
@@ -11677,7 +11746,7 @@ Image caption containing another image
 !! wikitext
 [[File:Foobar.jpg|thumb|This is a caption with another [[File:Thumb.png|image]] inside it!]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption with another <a href="/wiki/File:Thumb.png" class="image" title="image"><img alt="image" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" /></a> inside it!</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption with another <a href="/wiki/File:Thumb.png" class="image" title="image"><img alt="image" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" /></a> inside it!</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>This is a caption with another <span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"image"}'><a href="File:Thumb.png"><img resource="./File:Thumb.png" src="//example.com/images/e/ea/Thumb.png" height="135" width="135"/></a></span> inside it!</figcaption></figure>
@@ -11701,7 +11770,7 @@ Image: caption containing leading space
 !! wikitext
 [[File:Foobar.jpg|thumb| bar]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>bar</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>bar</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption> bar</figcaption></figure>
@@ -11720,7 +11789,7 @@ parsoid=wt2html,wt2wt,html2html
 |}
 and some more text.]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is an example image thumbnail caption with a table <table> <tr> <th> Foo </th> <th> Bar </th></tr> <tr> <td> Foo1 </td> <td> Bar1 </td></tr></table> and some more text.</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is an example image thumbnail caption with a table <table> <tr> <th> Foo </th> <th> Bar </th></tr> <tr> <td> Foo1 </td> <td> Bar1 </td></tr></table> and some more text.</div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="23" width="200"/></a><figcaption>This is an example image thumbnail caption with a table
@@ -11737,7 +11806,7 @@ Bug 3090: External links other than http: in image captions
 !! wikitext
 [[File:Foobar.jpg|thumb|200x200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This caption has <a rel="nofollow" class="external text" href="irc://example.net">irc</a> and <a rel="nofollow" class="external text" href="https://example.com">Secure</a> ext links in it.</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This caption has <a rel="nofollow" class="external text" href="irc://example.net">irc</a> and <a rel="nofollow" class="external text" href="https://example.com">Secure</a> ext links in it.</div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="23" width="200"/></a><figcaption>This caption has <a rel="mw:ExtLink" href="irc://example.net">irc</a> and <a rel="mw:ExtLink" href="https://example.com">Secure</a> ext links in it.</figcaption></figure>
@@ -11779,7 +11848,7 @@ language=es
 !! wikitext
 [[Archivo:Foobar.jpg|miniatura|izquierda|enlace=foo|caption]]
 !! html/php
-<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/Foo" title="Foo"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/Archivo:Foobar.jpg" class="internal" title="Aumentar"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/Foo" title="Foo"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/Archivo:Foobar.jpg" class="internal" title="Aumentar"></a></div>caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
@@ -11812,9 +11881,9 @@ parsoid=wt2html,wt2wt,html2html
 
 [[File:Foobar.jpg|bogus1|thumb|bogus2|left|bogus3|caption]]
 !! html/php
-<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
-<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
-<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
@@ -12131,8 +12200,8 @@ subpage title=[[Subpage test/1/2/3/4]]
 
 [[../../subpage]]
 !! html
-<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage/">subpage</a></p>
-<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage">Subpage_test/1/2/subpage</a></p>
+<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage/" title="Subpage test/1/2/subpage/">subpage</a></p>
+<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage" title="Subpage test/1/2/subpage">Subpage_test/1/2/subpage</a></p>
 !! end
 
 !! test
@@ -12401,8 +12470,8 @@ parsoid
 [[:Category:Foo|Bar]]
 !! html
 <p>
-<a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a>
-<a rel="mw:WikiLink" href="Category:Foo">Bar</a>
+<a rel="mw:WikiLink" href="Category:Foo" title="Category:Foo">Category:Foo</a>
+<a rel="mw:WikiLink" href="Category:Foo" title="Category:Foo">Bar</a>
 </p>
 !! end
 
@@ -12427,8 +12496,8 @@ parsoid
 [[:File:Foo.png|Bar]]
 !! html
 <p>
-<a rel="mw:WikiLink" href="File:Foo.png">File:Foo.png</a>
-<a rel="mw:WikiLink" href="File:Foo.png">Bar</a>
+<a rel="mw:WikiLink" href="File:Foo.png" title="File:Foo.png">File:Foo.png</a>
+<a rel="mw:WikiLink" href="File:Foo.png" title="File:Foo.png">Bar</a>
 </p>
 !! end
 
@@ -12892,6 +12961,75 @@ section 5
 </p>
 !! end
 
+!! test
+Header with space, plus and underscore as entity
+!! wikitext
+Id should not contain + for spaces
+
+== Space between Text ==
+section 1
+
+== Space-Entity&#32;between&#32;Text ==
+section 2
+
+== Plus+between+Text ==
+section 3
+
+== Plus-Entity&#43;between&#43;Text ==
+section 4
+
+== Underscore_between_Text ==
+section 5
+
+== Underscore-Entity&#95;between&#95;Text ==
+section 6
+
+[[#Space between Text]]
+[[#Space-Entity&#32;between&#32;Text]]
+[[#Plus+between+Text]]
+[[#Plus-Entity&#43;between&#43;Text]]
+[[#Underscore_between_Text]]
+[[#Underscore-Entity&#95;between&#95;Text]]
+!! html
+<p>Id should not contain + for spaces
+</p>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Space_between_Text"><span class="tocnumber">1</span> <span class="toctext">Space between Text</span></a></li>
+<li class="toclevel-1 tocsection-2"><a href="#Space-Entity_between_Text"><span class="tocnumber">2</span> <span class="toctext">Space-Entity&#32;between&#32;Text</span></a></li>
+<li class="toclevel-1 tocsection-3"><a href="#Plus.2Bbetween.2BText"><span class="tocnumber">3</span> <span class="toctext">Plus+between+Text</span></a></li>
+<li class="toclevel-1 tocsection-4"><a href="#Plus-Entity.2Bbetween.2BText"><span class="tocnumber">4</span> <span class="toctext">Plus-Entity&#43;between&#43;Text</span></a></li>
+<li class="toclevel-1 tocsection-5"><a href="#Underscore_between_Text"><span class="tocnumber">5</span> <span class="toctext">Underscore_between_Text</span></a></li>
+<li class="toclevel-1 tocsection-6"><a href="#Underscore-Entity_between_Text"><span class="tocnumber">6</span> <span class="toctext">Underscore-Entity&#95;between&#95;Text</span></a></li>
+</ul>
+</div>
+
+<h2><span class="mw-headline" id="Space_between_Text">Space between Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Space between Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<p>section 1
+</p>
+<h2><span class="mw-headline" id="Space-Entity_between_Text">Space-Entity&#32;between&#32;Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Space-Entity between Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<p>section 2
+</p>
+<h2><span class="mw-headline" id="Plus.2Bbetween.2BText">Plus+between+Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Plus+between+Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<p>section 3
+</p>
+<h2><span class="mw-headline" id="Plus-Entity.2Bbetween.2BText">Plus-Entity&#43;between&#43;Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Plus-Entity+between+Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<p>section 4
+</p>
+<h2><span class="mw-headline" id="Underscore_between_Text">Underscore_between_Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Underscore between Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<p>section 5
+</p>
+<h2><span class="mw-headline" id="Underscore-Entity_between_Text">Underscore-Entity&#95;between&#95;Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Underscore-Entity_between_Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<p>section 6
+</p><p><a href="#Space_between_Text">#Space between Text</a>
+<a href="#Space-Entity_between_Text">#Space-Entity&#32;between&#32;Text</a>
+<a href="#Plus.2Bbetween.2BText">#Plus+between+Text</a>
+<a href="#Plus-Entity.2Bbetween.2BText">#Plus-Entity&#43;between&#43;Text</a>
+<a href="#Underscore_between_Text">#Underscore_between_Text</a>
+<a href="#Underscore-Entity_between_Text">#Underscore-Entity&#95;between&#95;Text</a>
+</p>
+!! end
+
 !! test
 Headers with excess '=' characters
 (Are similar tests necessary beyond the 1st level?)
@@ -13074,6 +13212,31 @@ parsoid
 
 !! end
 
+!! test
+div with multiple empty attribute values
+!! options
+parsoid
+!! wikitext
+<div id= title=>HTML rocks</div>
+!! html
+<div id="" title="">HTML rocks</div>
+
+!! end
+
+!! test
+table with multiple empty attribute values
+!! options
+parsoid
+!! wikitext
+{| title= id=
+| hi
+|}
+!! html
+<table title="" id="">
+<tbody><tr><td> hi</td></tr>
+</tbody></table>
+!! end
+
 # The PHP parser escapes the opening brace to &#123; for some reason, so
 # disabled this test for it.
 !! test
@@ -13456,7 +13619,7 @@ Bug 2095: link with three closing brackets
 <p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>]
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page">Main Page</a>]</p>
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a>]</p>
 !! end
 
 !! test
@@ -13467,7 +13630,7 @@ Bug 2095: link with pipe and three closing brackets
 <p><a href="/wiki/Main_Page" title="Main Page">link</a>]
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page">link</a>]</p>
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page">link</a>]</p>
 !! end
 
 !! test
@@ -13478,7 +13641,7 @@ Bug 2095: link with pipe and three closing brackets, version 2
 <p><a href="/wiki/Main_Page" title="Main Page">[http://example.com/]</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page">[http://example.com/]</a></p>
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page">[http://example.com/]</a></p>
 !! end
 
 
@@ -13513,13 +13676,16 @@ Bug 2304: HTML attribute safety (safe template; regression bug 2309)
 
 !! end
 
+# Parsoid has enough context to handle this case
 !! test
 Bug 2304: HTML attribute safety (dangerous template; 2309)
 !! wikitext
 <div title="{{dangerous attribute}}"></div>
-!! html
+!! html/php
 <div title=""></div>
 
+!! html/parsoid
+<div title='" onmouseover="alert(document.cookie)' about="#mwt2" typeof="mw:ExpandedAttrs" data-mw='{"attribs":[[{"txt":"title"},{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;dangerous attribute&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Dangerous_attribute&amp;quot;},&amp;quot;params&amp;quot;:{},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[]],&amp;quot;dsr&amp;quot;:[12,35,null,null]}\">\" onmouseover=\"alert(document.cookie)&lt;/span>"}]]}' data-parsoid='{"stx":"html","a":{"title":"\" onmouseover=\"alert(document.cookie)"},"sa":{"title":"{{dangerous attribute}}"}}'></div>
 !! end
 
 !! test
@@ -13853,6 +14019,14 @@ Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
 
 !! end
 
+!! test
+evil <math>-wiki-tags without Extension:Math enabled
+!! wikitext
+<math><img src="some evil external link"><script>some_evil_javascript();</script></math>
+!! html+tidy
+<p>&lt;math&gt;&lt;img src="some evil external link"&gt;&lt;script&gt;some_evil_javascript();&lt;/script&gt;&lt;/math&gt;</p>
+!! end
+
 ###
 ### Parser hooks (see tests/parser/parserTestsParserHook.php for the <tag> extension)
 ###
@@ -16281,7 +16455,7 @@ Images with the "|" character in the comment
 !! wikitext
 [[File:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
 !! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>An <a rel="mw:ExtLink" href="http://test/?param1=|left|&amp;param2=|x">external</a> URL</figcaption></figure>
@@ -17529,7 +17703,7 @@ Free external link invading image caption
 !! wikitext
 [[Image:Foobar.jpg|thumb|http://x|hello]]
 !! html
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>hello</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>hello</div></div></div>
 
 !! end
 
@@ -18777,10 +18951,10 @@ A <ref>
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"This is a &lt;b data-parsoid=&#39;{\"dsr\":[19,40,3,3]}&#39;>&lt;a rel=\"mw:WikiLink\" href=\"./Bolded_link\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded link\"},\"dsr\":[22,37,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is a &lt;span about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}&#39; data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[55,76,null,null]}&#39;>transclusion&lt;/span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"This is a &lt;b data-parsoid=&#39;{\"dsr\":[19,40,3,3]}&#39;>&lt;a rel=\"mw:WikiLink\" href=\"./Bolded_link\" title=\"Bolded link\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded link\"},\"dsr\":[22,37,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is a &lt;span about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}&#39; data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[55,76,null,null]}&#39;>transclusion&lt;/span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link" title="Bolded link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
 </li>
 </ol>
 !!end
@@ -19526,11 +19700,11 @@ parsoid
 </li>
 </ul>
 <ul>
-<li><a rel="mw:WikiLink" href="Foo">Foo</a>: bar
+<li><a rel="mw:WikiLink" href="Foo" title="Foo">Foo</a>: bar
 </li>
 </ul>
 <ul>
-<li><a rel="mw:WikiLink" href="Foo">Foo</a>*bar
+<li><a rel="mw:WikiLink" href="Foo" title="Foo">Foo</a>*bar
 </li>
 </ul>
 !!end
@@ -19821,7 +19995,7 @@ parsoid
 |}
 !! html
 <table>
-<tbody><tr><td><a rel="mw:WikiLink" href="./Foo">Foo</a>-bar</td>
+<tbody><tr><td><a rel="mw:WikiLink" href="./Foo" title="Foo">Foo</a>-bar</td>
 <td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>+1</td>
 <td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>-2</td></tr>
 </tbody></table>
@@ -20430,9 +20604,12 @@ HTML tag with 'unnecessary' entity encoding in attributes
 HTML tag with broken attribute value quoting
 !! wikitext
 <span title="Hello world>Foo</span>
-!! html
+!! html/php
 <p><span>Foo</span>
 </p>
+!! html/parsoid
+<p><span title="Hello world">Foo</span>
+</p>
 !! end
 
 !! test
@@ -20452,12 +20629,18 @@ Table with broken attribute value quoting
 {|
 | title="Hello world|Foo
 |}
-!! html
+!! html/php
 <table>
 <tr>
 <td>Foo
 </td></tr></table>
 
+!! html/parsoid
+<table>
+<tr>
+<td title="Hello world">Foo
+</td></tr></table>
+
 !! end
 
 !! test
index 078d8f0..2ee805e 100644 (file)
@@ -2207,13 +2207,6 @@ Log in
 &lt;/td&gt;&lt;td&gt;
 <template lineStart="1"><title>int:Login</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginend&amp;action=edit loginend]&lt;br&gt;
-[[MediaWiki_talk:Loginend|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;nbsp;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginend</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
 [http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginerror&amp;action=edit loginerror]&lt;br&gt;
 [[MediaWiki_talk:Loginerror|Talk]]
 &lt;/td&gt;&lt;td&gt;
index 3c30da9..4a30f56 100644 (file)
@@ -2207,13 +2207,6 @@ Log in
 </td><td>
 {{int:Login}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginend&action=edit loginend]<br>
-[[MediaWiki_talk:Loginend|Talk]]
-</td><td>
-&amp;nbsp;
-</td><td>
-{{int:Loginend}}
-</td></tr><tr><td>
 [http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginerror&action=edit loginerror]<br>
 [[MediaWiki_talk:Loginerror|Talk]]
 </td><td>
index 9965c43..5d21319 100644 (file)
@@ -70,10 +70,6 @@ if ( $wgDBtype == 'sqlite' ) {
        }
 }
 
-# There is a convention that the parser should never
-# refer to $wgTitle directly, but instead use the title
-# passed to it.
-$wgTitle = Title::newFromText( 'Parser test script do not use' );
 $tester = new ParserTest( $options );
 
 if ( isset( $options['file'] ) ) {
index 62157d2..71e0f4b 100644 (file)
@@ -6,7 +6,7 @@
  * @see https://github.com/sebastianbergmann/phpunit/blob/master/src/Extensions/PhptTestCase.php
  * @author Sam Smith <samsmith@wikimedia.org>
  */
-class LessFileCompilationTest extends MediaWikiTestCase {
+class LessFileCompilationTest extends ResourceLoaderTestCase {
 
        /**
         * @var string $file
@@ -38,7 +38,13 @@ class LessFileCompilationTest extends MediaWikiTestCase {
                        "$thisString must refer to a readable file"
                );
 
-               $compiler = ResourceLoader::getLessCompiler( RequestContext::getMain()->getConfig() );
+               $rlContext = static::getResourceLoaderContext();
+
+               // Bleh
+               $method = new ReflectionMethod( $this->module, 'getLessCompiler' );
+               $method->setAccessible( true );
+               $compiler = $method->invoke( $this->module, $rlContext );
+
                $this->assertNotNull( $compiler->compileFile( $this->file ) );
        }
 
index 873d979..4abb4e5 100644 (file)
@@ -88,6 +88,14 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $this->backupStaticAttributes = false;
        }
 
+       public function __destruct() {
+               // Complain if self::setUp() was called, but not self::tearDown()
+               // $this->called['setUp'] will be checked by self::testMediaWikiTestCaseParentSetupCalled()
+               if ( isset( $this->called['setUp'] ) && !isset( $this->called['tearDown'] ) ) {
+                       throw new MWException( get_called_class() . "::tearDown() must call parent::tearDown()" );
+               }
+       }
+
        public function run( PHPUnit_Framework_TestResult $result = null ) {
                /* Some functions require some kind of caching, and will end up using the db,
                 * which we can't allow, as that would open a new connection for mysql.
@@ -192,7 +200,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        protected function setUp() {
                wfProfileIn( __METHOD__ );
                parent::setUp();
-               $this->called['setUp'] = 1;
+               $this->called['setUp'] = true;
 
                $this->phpErrorLevel = intval( ini_get( 'error_reporting' ) );
 
@@ -221,6 +229,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        protected function tearDown() {
                wfProfileIn( __METHOD__ );
 
+               $this->called['tearDown'] = true;
                // Cleaning up temporary files
                foreach ( $this->tmpFiles as $fileName ) {
                        if ( is_file( $fileName ) || ( is_link( $fileName ) ) ) {
@@ -419,6 +428,34 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                return false;
        }
 
+       /**
+        * Insert a new page.
+        *
+        * Should be called from addDBData().
+        *
+        * @since 1.25
+        * @param string $pageName Page name
+        * @param string $text Page's content
+        * @return array Title object and page id
+        */
+       protected function insertPage( $pageName, $text = 'Sample page for unit test.' ) {
+               $title = Title::newFromText( $pageName, 0 );
+
+               $user = User::newFromName( 'WikiSysop' );
+               $comment = __METHOD__ . ': Sample page for unit test.';
+
+               // Avoid memory leak...?
+               LinkCache::singleton()->clear();
+
+               $page = WikiPage::factory( $title );
+               $page->doEditContent( ContentHandler::makeContent( $text, $title ), $comment, 0, false, $user );
+
+               return array(
+                       'title' => $title,
+                       'id' => $page->getId(),
+               );
+       }
+
        /**
         * Stub. If a test needs to add additional data to the database, it should
         * implement this method and do so
@@ -455,7 +492,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                User::resetIdByNameCache();
 
-               //Make sysop user
+               // Make sysop user
                $user = User::newFromName( 'UTSysop' );
 
                if ( $user->idForName() == 0 ) {
@@ -467,7 +504,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        $user->saveSettings();
                }
 
-               //Make 1 page with 1 revision
+               // Make 1 page with 1 revision
                $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
                if ( $page->getId() == 0 ) {
                        $page->doEditContent(
@@ -475,7 +512,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                'UTPageSummary',
                                EDIT_NEW,
                                false,
-                               User::newFromName( 'UTSysop' ) );
+                               User::newFromName( 'UTSysop' )
+                       );
                }
        }
 
@@ -1120,13 +1158,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param string $message
         * @param bool $isHtml
         */
-       public static function assertTag($matcher, $actual, $message = '', $isHtml = true) {
+       public static function assertTag( $matcher, $actual, $message = '', $isHtml = true ) {
                //trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
 
-               $dom     = PHPUnit_Util_XML::load($actual, $isHtml);
-               $tags    = PHPUnit_Util_XML::findNodes($dom, $matcher, $isHtml);
-               $matched = count($tags) > 0 && $tags[0] instanceof DOMNode;
+               $dom = PHPUnit_Util_XML::load( $actual, $isHtml );
+               $tags = PHPUnit_Util_XML::findNodes( $dom, $matcher, $isHtml );
+               $matched = count( $tags ) > 0 && $tags[0] instanceof DOMNode;
 
-               self::assertTrue($matched, $message);
+               self::assertTrue( $matched, $message );
        }
 }
index f316f56..f5f302e 100644 (file)
@@ -1,10 +1,10 @@
 <?php
 
 abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
-       protected static function getResourceLoaderContext() {
+       protected static function getResourceLoaderContext( $lang = 'en' ) {
                $resourceLoader = new ResourceLoader();
                $request = new FauxRequest( array(
-                               'lang' => 'en',
+                               'lang' => $lang,
                                'modules' => 'startup',
                                'only' => 'scripts',
                                'skin' => 'vector',
@@ -46,6 +46,7 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        protected $script = '';
        protected $styles = '';
        protected $skipFunction = null;
+       protected $isRaw = false;
        protected $targets = array( 'test' );
 
        public function __construct( $options = array() ) {
@@ -77,7 +78,18 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        public function getSkipFunction() {
                return $this->skipFunction;
        }
+
+       public function isRaw() {
+               return $this->isRaw;
+       }
 }
 
 class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule {
 }
+
+class ResourceLoaderWikiModuleTestModule extends ResourceLoaderWikiModule {
+       // Override expected via PHPUnit mocks and stubs
+       protected function getPages( ResourceLoaderContext $context ) {
+               return array();
+       }
+}
diff --git a/tests/phpunit/data/css/expected.css b/tests/phpunit/data/css/expected.css
new file mode 100644 (file)
index 0000000..03addcb
--- /dev/null
@@ -0,0 +1,11 @@
+/* All of the combinations should result in the same output in LTR and RTL mode. */
+
+.selector { /*@embed*/ background-image: url(simple-ltr.gif); }
+
+.selector { /*@embed*/ background-image: url(simple-ltr.gif); }
+
+.selector { /*@embed*/ background-image: url(simple-ltr.gif); }
+
+.selector { /*@embed*/ background-image: url(simple-ltr.gif); }
+
+.selector { /*@embed*/ background-image: url(simple-ltr.gif); }
diff --git a/tests/phpunit/data/css/simple-ltr.gif b/tests/phpunit/data/css/simple-ltr.gif
new file mode 100644 (file)
index 0000000..13c43e9
Binary files /dev/null and b/tests/phpunit/data/css/simple-ltr.gif differ
diff --git a/tests/phpunit/data/css/simple-rtl.gif b/tests/phpunit/data/css/simple-rtl.gif
new file mode 100644 (file)
index 0000000..f9e7531
Binary files /dev/null and b/tests/phpunit/data/css/simple-rtl.gif differ
diff --git a/tests/phpunit/data/css/test.css b/tests/phpunit/data/css/test.css
new file mode 100644 (file)
index 0000000..8d0d670
--- /dev/null
@@ -0,0 +1,11 @@
+/* All of the combinations should result in the same output in LTR and RTL mode. */
+
+/*@noflip*/ .selector { /*@embed*/ background-image: url(simple-ltr.gif); }
+
+/*@noflip*/ .selector { background-image: /*@embed*/ url(simple-ltr.gif); }
+
+.selector { /*@noflip*/ /*@embed*/ background-image: url(simple-ltr.gif); }
+
+.selector { /*@embed*/ /*@noflip*/ background-image: url(simple-ltr.gif); }
+
+.selector { /*@noflip*/ background-image: /*@embed*/ url(simple-ltr.gif); }
diff --git a/tests/phpunit/data/cssmin/circle.svg b/tests/phpunit/data/cssmin/circle.svg
new file mode 100644 (file)
index 0000000..6b7d1af
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8">
+<circle cx="4" cy="4" r="2"/>
+</svg>
diff --git a/tests/phpunit/data/localisationcache/en.json b/tests/phpunit/data/localisationcache/en.json
new file mode 100644 (file)
index 0000000..27600cd
--- /dev/null
@@ -0,0 +1,5 @@
+{
+       "present-uk": "en",
+       "present-ru": "en",
+       "present-en": "en"
+}
diff --git a/tests/phpunit/data/localisationcache/ru.json b/tests/phpunit/data/localisationcache/ru.json
new file mode 100644 (file)
index 0000000..79e1444
--- /dev/null
@@ -0,0 +1,4 @@
+{
+       "present-uk": "ru",
+       "present-ru": "ru"
+}
diff --git a/tests/phpunit/data/localisationcache/uk.json b/tests/phpunit/data/localisationcache/uk.json
new file mode 100644 (file)
index 0000000..f63ce5d
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "present-uk": "uk"
+}
index 8e78da3..9f2b7a0 100644 (file)
@@ -4,13 +4,15 @@
  * @group Database
  */
 class ArticleTablesTest extends MediaWikiLangTestCase {
-
        /**
+        * Make sure that bug 14404 doesn't strike again. We don't want
+        * templatelinks based on the user language when {{int:}} is used, only the
+        * content language.
+        *
         * @covers Title::getTemplateLinksFrom
         * @covers Title::getLinksFrom
-        * @todo give this test a real name explaining what is being tested here
         */
-       public function testbug14404() {
+       public function testTemplatelinksUsesContentLanguage() {
                $title = Title::newFromText( 'Bug 14404' );
                $page = WikiPage::factory( $title );
                $user = new User();
index 6537364..702fce4 100644 (file)
@@ -59,6 +59,9 @@ class EditPageTest extends MediaWikiLangTestCase {
         * User input text is passed to rtrim() by edit page. This is a simple
         * wrapper around assertEquals() which calls rrtrim() to normalize the
         * expected and actual texts.
+        * @param string $expected
+        * @param string $actual
+        * @param string $msg
         */
        protected function assertEditedTextEquals( $expected, $actual, $msg = '' ) {
                return $this->assertEquals( rtrim( $expected ), rtrim( $actual ), $msg );
@@ -177,107 +180,83 @@ class EditPageTest extends MediaWikiLangTestCase {
                return $page;
        }
 
-       /**
-        * @todo split into a dataprovider and test method
-        * @covers EditPage
-        */
-       public function testCreatePage() {
-               $this->assertEdit(
-                       'EditPageTest_testCreatePage',
-                       null,
-                       null,
-                       array(
-                               'wpTextbox1' => "Hello World!",
+       public static function provideCreatePages() {
+               return array(
+                       array( 'expected article being created',
+                               'EditPageTest_testCreatePage',
+                               null,
+                               'Hello World!',
+                               EditPage::AS_SUCCESS_NEW_ARTICLE,
+                               'Hello World!'
                        ),
-                       EditPage::AS_SUCCESS_NEW_ARTICLE,
-                       "Hello World!",
-                       "expected article being created"
-               )->doDeleteArticleReal( 'EditPageTest_testCreatePage' );
-
-               $this->assertEdit(
-                       'EditPageTest_testCreatePage',
-                       null,
-                       null,
-                       array(
-                               'wpTextbox1' => "",
+                       array( 'expected article not being created if empty',
+                               'EditPageTest_testCreatePage',
+                               null,
+                               '',
+                               EditPage::AS_BLANK_ARTICLE,
+                               null
                        ),
-                       EditPage::AS_BLANK_ARTICLE,
-                       null,
-                       "expected article not being created if empty"
-               );
-
-               $this->assertEdit(
-                       'MediaWiki:January',
-                       null,
-                       'UTSysop',
-                       array(
-                               'wpTextbox1' => "Not January",
+                       array( 'expected MediaWiki: page being created',
+                               'MediaWiki:January',
+                               'UTSysop',
+                               'Not January',
+                               EditPage::AS_SUCCESS_NEW_ARTICLE,
+                               'Not January'
                        ),
-                       EditPage::AS_SUCCESS_NEW_ARTICLE,
-                       "Not January",
-                       "expected MediaWiki: page being created"
-               )->doDeleteArticleReal( 'EditPageTest_testCreatePage' );
-
-               $this->assertEdit(
-                       'MediaWiki:EditPageTest_testCreatePage',
-                       null,
-                       'UTSysop',
-                       array(
-                               'wpTextbox1' => "",
+                       array( 'expected not-registered MediaWiki: page not being created if empty',
+                               'MediaWiki:EditPageTest_testCreatePage',
+                               'UTSysop',
+                               '',
+                               EditPage::AS_BLANK_ARTICLE,
+                               null
                        ),
-                       EditPage::AS_BLANK_ARTICLE,
-                       null,
-                       "expected not-registered MediaWiki: page not being created if empty"
-               );
-
-               $this->assertEdit(
-                       'MediaWiki:January',
-                       null,
-                       'UTSysop',
-                       array(
-                               'wpTextbox1' => "",
+                       array( 'expected registered MediaWiki: page being created even if empty',
+                               'MediaWiki:January',
+                               'UTSysop',
+                               '',
+                               EditPage::AS_SUCCESS_NEW_ARTICLE,
+                               ''
                        ),
-                       EditPage::AS_SUCCESS_NEW_ARTICLE,
-                       "",
-                       "expected registered MediaWiki: page being created even if empty"
-               )->doDeleteArticleReal( 'EditPageTest_testCreatePage' );
-
-               $this->assertEdit(
-                       'MediaWiki:Ipb-default-expiry',
-                       null,
-                       'UTSysop',
-                       array(
-                               'wpTextbox1' => "",
+                       array( 'expected registered MediaWiki: page whose default content is empty not being created if empty',
+                               'MediaWiki:Ipb-default-expiry',
+                               'UTSysop',
+                               '',
+                               EditPage::AS_BLANK_ARTICLE,
+                               ''
                        ),
-                       EditPage::AS_BLANK_ARTICLE,
-                       "",
-                       "expected registered MediaWiki: page whose default content is empty not being created if empty"
-               );
-
-               $this->assertEdit(
-                       'MediaWiki:January',
-                       null,
-                       'UTSysop',
-                       array(
-                               'wpTextbox1' => "January",
+                       array( 'expected MediaWiki: page not being created if text equals default message',
+                               'MediaWiki:January',
+                               'UTSysop',
+                               'January',
+                               EditPage::AS_BLANK_ARTICLE,
+                               null
+                       ),
+                       array( 'expected empty article being created',
+                               'EditPageTest_testCreatePage',
+                               null,
+                               '',
+                               EditPage::AS_SUCCESS_NEW_ARTICLE,
+                               '',
+                               true
                        ),
-                       EditPage::AS_BLANK_ARTICLE,
-                       null,
-                       "expected MediaWiki: page not being created if text equals default message"
                );
+       }
 
-               $this->assertEdit(
-                       'EditPageTest_testCreatePage',
-                       null,
-                       null,
-                       array(
-                               'wpTextbox1' => "",
-                               'wpIgnoreBlankArticle' => 1,
-                       ),
-                       EditPage::AS_SUCCESS_NEW_ARTICLE,
-                       "",
-                       "expected empty article being created"
-               )->doDeleteArticleReal( 'EditPageTest_testCreatePage' );
+       /**
+        * @dataProvider provideCreatePages
+        * @covers EditPage
+        */
+       public function testCreatePage( $desc, $pageTitle, $user, $editText, $expectedCode, $expectedText, $ignoreBlank = false ) {
+               $edit = array( 'wpTextbox1' => $editText );
+               if ( $ignoreBlank ) {
+                       $edit['wpIgnoreBlankArticle'] = 1;
+               }
+
+               $page = $this->assertEdit( $pageTitle, null, $user, $edit, $expectedCode, $expectedText, $desc );
+
+               if ( $expectedCode != EditPage::AS_BLANK_ARTICLE ) {
+                       $page->doDeleteArticleReal( $pageTitle );
+               }
        }
 
        public function testUpdatePage() {
index e22f505..c3539d0 100644 (file)
@@ -10,7 +10,7 @@ class GitInfoTest extends MediaWikiTestCase {
        }
 
        public function testValidJsonData() {
-               $dir = $GLOBALS['IP'] . '/testValidJsonData';
+               $dir = $GLOBALS['IP'] . DIRECTORY_SEPARATOR . 'testValidJsonData';
                $fixture = new GitInfo( $dir );
 
                $this->assertTrue( $fixture->cacheIsComplete() );
index 84799ff..3acc48e 100644 (file)
@@ -59,13 +59,33 @@ class GlobalTest extends MediaWikiTestCase {
                );
        }
 
+       /*
+        * Test cases for random functions could hypothetically fail,
+        * even though they shouldn't.
+        */
+
        /**
         * @covers ::wfRandom
         */
        public function testRandom() {
-               # This could hypothetically fail, but it shouldn't ;)
                $this->assertFalse(
-                       wfRandom() == wfRandom() );
+                       wfRandom() == wfRandom()
+               );
+       }
+
+       /**
+        * @covers ::wfRandomString
+        */
+       public function testRandomString() {
+               $this->assertFalse(
+                       wfRandomString() == wfRandomString()
+               );
+               $this->assertEquals(
+                       strlen( wfRandomString( 10 ) ), 10
+               );
+               $this->assertTrue(
+                       preg_match( '/^[0-9a-f]+$/i', wfRandomString() ) === 1
+               );
        }
 
        /**
diff --git a/tests/phpunit/includes/GlobalFunctions/wfAppendQueryTest.php b/tests/phpunit/includes/GlobalFunctions/wfAppendQueryTest.php
new file mode 100644 (file)
index 0000000..54e1f89
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @group GlobalFunctions
+ * @covers ::wfAppendQuery
+ */
+class WfAppendQueryTest extends MediaWikiTestCase {
+       /**
+        * @dataProvider provideAppendQuery
+        */
+       public function testAppendQuery( $url, $query, $expected, $message = null ) {
+               $this->assertEquals( $expected, wfAppendQuery( $url, $query ), $message );
+       }
+
+       public static function provideAppendQuery() {
+               return array(
+                       array(
+                               'http://www.example.org/index.php',
+                               '',
+                               'http://www.example.org/index.php',
+                               'No query'
+                       ),
+                       array(
+                               'http://www.example.org/index.php',
+                               array( 'foo' => 'bar' ),
+                               'http://www.example.org/index.php?foo=bar',
+                               'Set query array'
+                       ),
+                       array(
+                               'http://www.example.org/index.php?foz=baz',
+                               'foo=bar',
+                               'http://www.example.org/index.php?foz=baz&foo=bar',
+                               'Set query string'
+                       ),
+                       array(
+                               'http://www.example.org/index.php?foo=bar',
+                               '',
+                               'http://www.example.org/index.php?foo=bar',
+                               'Empty string with query'
+                       ),
+                       array(
+                               'http://www.example.org/index.php?foo=bar',
+                               array( 'baz' => 'quux' ),
+                               'http://www.example.org/index.php?foo=bar&baz=quux',
+                               'Add query array'
+                       ),
+                       array(
+                               'http://www.example.org/index.php?foo=bar',
+                               'baz=quux',
+                               'http://www.example.org/index.php?foo=bar&baz=quux',
+                               'Add query string'
+                       ),
+                       array(
+                               'http://www.example.org/index.php?foo=bar',
+                               array( 'baz' => 'quux', 'foo' => 'baz' ),
+                               'http://www.example.org/index.php?foo=bar&baz=quux&foo=baz',
+                               'Modify query array'
+                       ),
+                       array(
+                               'http://www.example.org/index.php?foo=bar',
+                               'baz=quux&foo=baz',
+                               'http://www.example.org/index.php?foo=bar&baz=quux&foo=baz',
+                               'Modify query string'
+                       )
+               );
+       }
+}
index dd4f9cc..9d55e85 100644 (file)
@@ -186,4 +186,10 @@ class WfBaseConvertTest extends MediaWikiTestCase {
                        strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) - 5 ) )
                );
        }
+
+       public function testLeadingZero() {
+               $this->assertSame( '24', wfBaseConvert( '010', 36, 16 ) );
+               $this->assertSame( '37d4', wfBaseConvert( '0b10', 36, 16 ) );
+               $this->assertSame( 'a734', wfBaseConvert( '0x10', 36, 16 ) );
+       }
 }
index 9b53381..fbd2c31 100644 (file)
@@ -1,6 +1,7 @@
 <?php
+
 /**
- * @group Broken
+ * @group Http
  */
 class HttpTest extends MediaWikiTestCase {
        /**
@@ -92,8 +93,10 @@ class HttpTest extends MediaWikiTestCase {
                        array( true, 'http://user:pass@host', 'Username and password provided' ),
 
                        # (\S+) - host part is made of anything not whitespaces
-                       array( false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ),
-                       array( false, 'http://exam:ple.org/', 'hostname can not use colons!' ),
+                       // 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!' ),
 
                        # (:[0-9]+)? - port number
                        array( true, 'http://example.org:80/' ),
@@ -171,6 +174,310 @@ class HttpTest extends MediaWikiTestCase {
                        $h->getFinalUrl( "Relative file path Location: should keep the latest host and scheme!" )
                );
        }
+
+       /**
+        * Constant values are from PHP 5.3.28 using cURL 7.24.0
+        * @see http://php.net/manual/en/curl.constants.php
+        *
+        * All constant values are present so that developers don’t need to remember
+        * to add them if added at a later date. The commented out constants were
+        * not found anywhere in the MediaWiki core code.
+        *
+        * Commented out constants that were not available in:
+        * HipHop VM 3.3.0 (rel)
+        * Compiler: heads/master-0-g08810d920dfff59e0774cf2d651f92f13a637175
+        * Repo schema: 3214fc2c684a4520485f715ee45f33f2182324b1
+        * Extension API: 20140829
+        *
+        * Commented out constants that were removed in PHP 5.6.0
+        *
+        * @covers CurlHttpRequest::execute
+        */
+       public function provideCurlConstants() {
+               return array(
+                       array( 'CURLAUTH_ANY' ),
+                       array( 'CURLAUTH_ANYSAFE' ),
+                       array( 'CURLAUTH_BASIC' ),
+                       array( 'CURLAUTH_DIGEST' ),
+                       array( 'CURLAUTH_GSSNEGOTIATE' ),
+                       array( 'CURLAUTH_NTLM' ),
+                       // array( 'CURLCLOSEPOLICY_CALLBACK' ), // removed in PHP 5.6.0
+                       // array( 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' ), // removed in PHP 5.6.0
+                       // array( 'CURLCLOSEPOLICY_LEAST_TRAFFIC' ), // removed in PHP 5.6.0
+                       // array( 'CURLCLOSEPOLICY_OLDEST' ), // removed in PHP 5.6.0
+                       // array( 'CURLCLOSEPOLICY_SLOWEST' ), // removed in PHP 5.6.0
+                       array( 'CURLE_ABORTED_BY_CALLBACK' ),
+                       array( 'CURLE_BAD_CALLING_ORDER' ),
+                       array( 'CURLE_BAD_CONTENT_ENCODING' ),
+                       array( 'CURLE_BAD_FUNCTION_ARGUMENT' ),
+                       array( 'CURLE_BAD_PASSWORD_ENTERED' ),
+                       array( 'CURLE_COULDNT_CONNECT' ),
+                       array( 'CURLE_COULDNT_RESOLVE_HOST' ),
+                       array( 'CURLE_COULDNT_RESOLVE_PROXY' ),
+                       array( 'CURLE_FAILED_INIT' ),
+                       array( 'CURLE_FILESIZE_EXCEEDED' ),
+                       array( 'CURLE_FILE_COULDNT_READ_FILE' ),
+                       array( 'CURLE_FTP_ACCESS_DENIED' ),
+                       array( 'CURLE_FTP_BAD_DOWNLOAD_RESUME' ),
+                       array( 'CURLE_FTP_CANT_GET_HOST' ),
+                       array( 'CURLE_FTP_CANT_RECONNECT' ),
+                       array( 'CURLE_FTP_COULDNT_GET_SIZE' ),
+                       array( 'CURLE_FTP_COULDNT_RETR_FILE' ),
+                       array( 'CURLE_FTP_COULDNT_SET_ASCII' ),
+                       array( 'CURLE_FTP_COULDNT_SET_BINARY' ),
+                       array( 'CURLE_FTP_COULDNT_STOR_FILE' ),
+                       array( 'CURLE_FTP_COULDNT_USE_REST' ),
+                       array( 'CURLE_FTP_PORT_FAILED' ),
+                       array( 'CURLE_FTP_QUOTE_ERROR' ),
+                       array( 'CURLE_FTP_SSL_FAILED' ),
+                       array( 'CURLE_FTP_USER_PASSWORD_INCORRECT' ),
+                       array( 'CURLE_FTP_WEIRD_227_FORMAT' ),
+                       array( 'CURLE_FTP_WEIRD_PASS_REPLY' ),
+                       array( 'CURLE_FTP_WEIRD_PASV_REPLY' ),
+                       array( 'CURLE_FTP_WEIRD_SERVER_REPLY' ),
+                       array( 'CURLE_FTP_WEIRD_USER_REPLY' ),
+                       array( 'CURLE_FTP_WRITE_ERROR' ),
+                       array( 'CURLE_FUNCTION_NOT_FOUND' ),
+                       array( 'CURLE_GOT_NOTHING' ),
+                       array( 'CURLE_HTTP_NOT_FOUND' ),
+                       array( 'CURLE_HTTP_PORT_FAILED' ),
+                       array( 'CURLE_HTTP_POST_ERROR' ),
+                       array( 'CURLE_HTTP_RANGE_ERROR' ),
+                       array( 'CURLE_LDAP_CANNOT_BIND' ),
+                       array( 'CURLE_LDAP_INVALID_URL' ),
+                       array( 'CURLE_LDAP_SEARCH_FAILED' ),
+                       array( 'CURLE_LIBRARY_NOT_FOUND' ),
+                       array( 'CURLE_MALFORMAT_USER' ),
+                       array( 'CURLE_OBSOLETE' ),
+                       array( 'CURLE_OK' ),
+                       array( 'CURLE_OPERATION_TIMEOUTED' ),
+                       array( 'CURLE_OUT_OF_MEMORY' ),
+                       array( 'CURLE_PARTIAL_FILE' ),
+                       array( 'CURLE_READ_ERROR' ),
+                       array( 'CURLE_RECV_ERROR' ),
+                       array( 'CURLE_SEND_ERROR' ),
+                       array( 'CURLE_SHARE_IN_USE' ),
+                       // array( 'CURLE_SSH' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLE_SSL_CACERT' ),
+                       array( 'CURLE_SSL_CERTPROBLEM' ),
+                       array( 'CURLE_SSL_CIPHER' ),
+                       array( 'CURLE_SSL_CONNECT_ERROR' ),
+                       array( 'CURLE_SSL_ENGINE_NOTFOUND' ),
+                       array( 'CURLE_SSL_ENGINE_SETFAILED' ),
+                       array( 'CURLE_SSL_PEER_CERTIFICATE' ),
+                       array( 'CURLE_TELNET_OPTION_SYNTAX' ),
+                       array( 'CURLE_TOO_MANY_REDIRECTS' ),
+                       array( 'CURLE_UNKNOWN_TELNET_OPTION' ),
+                       array( 'CURLE_UNSUPPORTED_PROTOCOL' ),
+                       array( 'CURLE_URL_MALFORMAT' ),
+                       array( 'CURLE_URL_MALFORMAT_USER' ),
+                       array( 'CURLE_WRITE_ERROR' ),
+                       array( 'CURLFTPAUTH_DEFAULT' ),
+                       array( 'CURLFTPAUTH_SSL' ),
+                       array( 'CURLFTPAUTH_TLS' ),
+                       // array( 'CURLFTPMETHOD_MULTICWD' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLFTPMETHOD_NOCWD' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLFTPMETHOD_SINGLECWD' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLFTPSSL_ALL' ),
+                       array( 'CURLFTPSSL_CONTROL' ),
+                       array( 'CURLFTPSSL_NONE' ),
+                       array( 'CURLFTPSSL_TRY' ),
+                       // array( 'CURLINFO_CERTINFO' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLINFO_CONNECT_TIME' ),
+                       array( 'CURLINFO_CONTENT_LENGTH_DOWNLOAD' ),
+                       array( 'CURLINFO_CONTENT_LENGTH_UPLOAD' ),
+                       array( 'CURLINFO_CONTENT_TYPE' ),
+                       array( 'CURLINFO_EFFECTIVE_URL' ),
+                       array( 'CURLINFO_FILETIME' ),
+                       array( 'CURLINFO_HEADER_OUT' ),
+                       array( 'CURLINFO_HEADER_SIZE' ),
+                       array( 'CURLINFO_HTTP_CODE' ),
+                       array( 'CURLINFO_NAMELOOKUP_TIME' ),
+                       array( 'CURLINFO_PRETRANSFER_TIME' ),
+                       array( 'CURLINFO_PRIVATE' ),
+                       array( 'CURLINFO_REDIRECT_COUNT' ),
+                       array( 'CURLINFO_REDIRECT_TIME' ),
+                       // array( 'CURLINFO_REDIRECT_URL' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLINFO_REQUEST_SIZE' ),
+                       array( 'CURLINFO_SIZE_DOWNLOAD' ),
+                       array( 'CURLINFO_SIZE_UPLOAD' ),
+                       array( 'CURLINFO_SPEED_DOWNLOAD' ),
+                       array( 'CURLINFO_SPEED_UPLOAD' ),
+                       array( 'CURLINFO_SSL_VERIFYRESULT' ),
+                       array( 'CURLINFO_STARTTRANSFER_TIME' ),
+                       array( 'CURLINFO_TOTAL_TIME' ),
+                       array( 'CURLMSG_DONE' ),
+                       array( 'CURLM_BAD_EASY_HANDLE' ),
+                       array( 'CURLM_BAD_HANDLE' ),
+                       array( 'CURLM_CALL_MULTI_PERFORM' ),
+                       array( 'CURLM_INTERNAL_ERROR' ),
+                       array( 'CURLM_OK' ),
+                       array( 'CURLM_OUT_OF_MEMORY' ),
+                       array( 'CURLOPT_AUTOREFERER' ),
+                       array( 'CURLOPT_BINARYTRANSFER' ),
+                       array( 'CURLOPT_BUFFERSIZE' ),
+                       array( 'CURLOPT_CAINFO' ),
+                       array( 'CURLOPT_CAPATH' ),
+                       // array( 'CURLOPT_CERTINFO' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLOPT_CLOSEPOLICY' ), // removed in PHP 5.6.0
+                       array( 'CURLOPT_CONNECTTIMEOUT' ),
+                       array( 'CURLOPT_CONNECTTIMEOUT_MS' ),
+                       array( 'CURLOPT_COOKIE' ),
+                       array( 'CURLOPT_COOKIEFILE' ),
+                       array( 'CURLOPT_COOKIEJAR' ),
+                       array( 'CURLOPT_COOKIESESSION' ),
+                       array( 'CURLOPT_CRLF' ),
+                       array( 'CURLOPT_CUSTOMREQUEST' ),
+                       array( 'CURLOPT_DNS_CACHE_TIMEOUT' ),
+                       array( 'CURLOPT_DNS_USE_GLOBAL_CACHE' ),
+                       array( 'CURLOPT_EGDSOCKET' ),
+                       array( 'CURLOPT_ENCODING' ),
+                       array( 'CURLOPT_FAILONERROR' ),
+                       array( 'CURLOPT_FILE' ),
+                       array( 'CURLOPT_FILETIME' ),
+                       array( 'CURLOPT_FOLLOWLOCATION' ),
+                       array( 'CURLOPT_FORBID_REUSE' ),
+                       array( 'CURLOPT_FRESH_CONNECT' ),
+                       array( 'CURLOPT_FTPAPPEND' ),
+                       array( 'CURLOPT_FTPLISTONLY' ),
+                       array( 'CURLOPT_FTPPORT' ),
+                       array( 'CURLOPT_FTPSSLAUTH' ),
+                       array( 'CURLOPT_FTP_CREATE_MISSING_DIRS' ),
+                       // array( 'CURLOPT_FTP_FILEMETHOD' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLOPT_FTP_SKIP_PASV_IP' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLOPT_FTP_SSL' ),
+                       array( 'CURLOPT_FTP_USE_EPRT' ),
+                       array( 'CURLOPT_FTP_USE_EPSV' ),
+                       array( 'CURLOPT_HEADER' ),
+                       array( 'CURLOPT_HEADERFUNCTION' ),
+                       array( 'CURLOPT_HTTP200ALIASES' ),
+                       array( 'CURLOPT_HTTPAUTH' ),
+                       array( 'CURLOPT_HTTPGET' ),
+                       array( 'CURLOPT_HTTPHEADER' ),
+                       array( 'CURLOPT_HTTPPROXYTUNNEL' ),
+                       array( 'CURLOPT_HTTP_VERSION' ),
+                       array( 'CURLOPT_INFILE' ),
+                       array( 'CURLOPT_INFILESIZE' ),
+                       array( 'CURLOPT_INTERFACE' ),
+                       array( 'CURLOPT_IPRESOLVE' ),
+                       // array( 'CURLOPT_KEYPASSWD' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLOPT_KRB4LEVEL' ),
+                       array( 'CURLOPT_LOW_SPEED_LIMIT' ),
+                       array( 'CURLOPT_LOW_SPEED_TIME' ),
+                       array( 'CURLOPT_MAXCONNECTS' ),
+                       array( 'CURLOPT_MAXREDIRS' ),
+                       // array( 'CURLOPT_MAX_RECV_SPEED_LARGE' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLOPT_MAX_SEND_SPEED_LARGE' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLOPT_NETRC' ),
+                       array( 'CURLOPT_NOBODY' ),
+                       array( 'CURLOPT_NOPROGRESS' ),
+                       array( 'CURLOPT_NOSIGNAL' ),
+                       array( 'CURLOPT_PORT' ),
+                       array( 'CURLOPT_POST' ),
+                       array( 'CURLOPT_POSTFIELDS' ),
+                       array( 'CURLOPT_POSTQUOTE' ),
+                       array( 'CURLOPT_POSTREDIR' ),
+                       array( 'CURLOPT_PRIVATE' ),
+                       array( 'CURLOPT_PROGRESSFUNCTION' ),
+                       // array( 'CURLOPT_PROTOCOLS' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLOPT_PROXY' ),
+                       array( 'CURLOPT_PROXYAUTH' ),
+                       array( 'CURLOPT_PROXYPORT' ),
+                       array( 'CURLOPT_PROXYTYPE' ),
+                       array( 'CURLOPT_PROXYUSERPWD' ),
+                       array( 'CURLOPT_PUT' ),
+                       array( 'CURLOPT_QUOTE' ),
+                       array( 'CURLOPT_RANDOM_FILE' ),
+                       array( 'CURLOPT_RANGE' ),
+                       array( 'CURLOPT_READDATA' ),
+                       array( 'CURLOPT_READFUNCTION' ),
+                       // array( 'CURLOPT_REDIR_PROTOCOLS' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLOPT_REFERER' ),
+                       array( 'CURLOPT_RESUME_FROM' ),
+                       array( 'CURLOPT_RETURNTRANSFER' ),
+                       // array( 'CURLOPT_SSH_AUTH_TYPES' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLOPT_SSH_PRIVATE_KEYFILE' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLOPT_SSH_PUBLIC_KEYFILE' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLOPT_SSLCERT' ),
+                       array( 'CURLOPT_SSLCERTPASSWD' ),
+                       array( 'CURLOPT_SSLCERTTYPE' ),
+                       array( 'CURLOPT_SSLENGINE' ),
+                       array( 'CURLOPT_SSLENGINE_DEFAULT' ),
+                       array( 'CURLOPT_SSLKEY' ),
+                       array( 'CURLOPT_SSLKEYPASSWD' ),
+                       array( 'CURLOPT_SSLKEYTYPE' ),
+                       array( 'CURLOPT_SSLVERSION' ),
+                       array( 'CURLOPT_SSL_CIPHER_LIST' ),
+                       array( 'CURLOPT_SSL_VERIFYHOST' ),
+                       array( 'CURLOPT_SSL_VERIFYPEER' ),
+                       array( 'CURLOPT_STDERR' ),
+                       array( 'CURLOPT_TCP_NODELAY' ),
+                       array( 'CURLOPT_TIMECONDITION' ),
+                       array( 'CURLOPT_TIMEOUT' ),
+                       array( 'CURLOPT_TIMEOUT_MS' ),
+                       array( 'CURLOPT_TIMEVALUE' ),
+                       array( 'CURLOPT_TRANSFERTEXT' ),
+                       array( 'CURLOPT_UNRESTRICTED_AUTH' ),
+                       array( 'CURLOPT_UPLOAD' ),
+                       array( 'CURLOPT_URL' ),
+                       array( 'CURLOPT_USERAGENT' ),
+                       array( 'CURLOPT_USERPWD' ),
+                       array( 'CURLOPT_VERBOSE' ),
+                       array( 'CURLOPT_WRITEFUNCTION' ),
+                       array( 'CURLOPT_WRITEHEADER' ),
+                       // array( 'CURLPROTO_ALL' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_DICT' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_FILE' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_FTP' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_FTPS' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_HTTP' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_HTTPS' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_LDAP' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_LDAPS' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_SCP' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_SFTP' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_TELNET' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLPROTO_TFTP' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLPROXY_HTTP' ),
+                       // array( 'CURLPROXY_SOCKS4' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLPROXY_SOCKS5' ),
+                       // array( 'CURLSSH_AUTH_DEFAULT' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLSSH_AUTH_HOST' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLSSH_AUTH_KEYBOARD' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLSSH_AUTH_NONE' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLSSH_AUTH_PASSWORD' ), // not present in HHVM 3.3.0-dev
+                       // array( 'CURLSSH_AUTH_PUBLICKEY' ), // not present in HHVM 3.3.0-dev
+                       array( 'CURLVERSION_NOW' ),
+                       array( 'CURL_HTTP_VERSION_1_0' ),
+                       array( 'CURL_HTTP_VERSION_1_1' ),
+                       array( 'CURL_HTTP_VERSION_NONE' ),
+                       array( 'CURL_IPRESOLVE_V4' ),
+                       array( 'CURL_IPRESOLVE_V6' ),
+                       array( 'CURL_IPRESOLVE_WHATEVER' ),
+                       array( 'CURL_NETRC_IGNORED' ),
+                       array( 'CURL_NETRC_OPTIONAL' ),
+                       array( 'CURL_NETRC_REQUIRED' ),
+                       array( 'CURL_TIMECOND_IFMODSINCE' ),
+                       array( 'CURL_TIMECOND_IFUNMODSINCE' ),
+                       array( 'CURL_TIMECOND_LASTMOD' ),
+                       array( 'CURL_VERSION_IPV6' ),
+                       array( 'CURL_VERSION_KERBEROS4' ),
+                       array( 'CURL_VERSION_LIBZ' ),
+                       array( 'CURL_VERSION_SSL' ),
+               );
+       }
+
+       /**
+        * Added this test based on an issue experienced with HHVM 3.3.0-dev
+        * where it did not define a cURL constant.
+        *
+        * @bug 70570
+        * @dataProvider provideCurlConstants
+        */
+       public function testCurlConstants( $value ) {
+               $this->assertTrue( defined( $value ), $value . ' not defined' );
+       }
 }
 
 /**
index f82a756..2fce6bf 100644 (file)
@@ -22,6 +22,7 @@ class ImportTest extends MediaWikiLangTestCase {
         * @covers WikiImporter::handlePage
         * @dataProvider getRedirectXML
         * @param string $xml
+        * @param string|null $redirectTitle
         */
        public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
                $source = $this->getInputStreamSource( $xml );
index 72114e9..7b84107 100644 (file)
@@ -1,5 +1,9 @@
 <?php
 
+/**
+ * @group Database
+ */
+
 class LinkerTest extends MediaWikiLangTestCase {
 
        /**
diff --git a/tests/phpunit/includes/LocalisationCacheTest.php b/tests/phpunit/includes/LocalisationCacheTest.php
deleted file mode 100644 (file)
index f98410a..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/**
- * @covers LocalisationCache
- */
-class LocalisationCacheTest extends MediaWikiTestCase {
-       public function testPuralRulesFallback() {
-               $cache = Language::getLocalisationCache();
-
-               $this->assertEquals(
-                       $cache->getItem( 'ar', 'pluralRules' ),
-                       $cache->getItem( 'arz', 'pluralRules' ),
-                       'arz plural rules (undefined) fallback to ar (defined)'
-               );
-
-               $this->assertEquals(
-                       $cache->getItem( 'ar', 'compiledPluralRules' ),
-                       $cache->getItem( 'arz', 'compiledPluralRules' ),
-                       'arz compiled plural rules (undefined) fallback to ar (defined)'
-               );
-
-               $this->assertNotEquals(
-                       $cache->getItem( 'ksh', 'pluralRules' ),
-                       $cache->getItem( 'de', 'pluralRules' ),
-                       'ksh plural rules (defined) dont fallback to de (defined)'
-               );
-
-               $this->assertNotEquals(
-                       $cache->getItem( 'ksh', 'compiledPluralRules' ),
-                       $cache->getItem( 'de', 'compiledPluralRules' ),
-                       'ksh compiled plural rules (defined) dont fallback to de (defined)'
-               );
-       }
-}
index c82dc42..dcb9856 100644 (file)
@@ -29,7 +29,7 @@ class MWTimestampTest extends MediaWikiLangTestCase {
                $this->assertEquals( '1406833268', $timestamp->__toString() );
        }
 
-       public function provideValidTimestampDifferences() {
+       public static function provideValidTimestampDifferences() {
                return array(
                        array( '1406833268', '1406833269', '00 00 00 01' ),
                        array( '1406833268', '1406833329', '00 00 01 01' ),
index c2acec0..4c5424c 100644 (file)
@@ -34,7 +34,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expectedLang, $langProperty->getValue( $message ) );
        }
 
-       public function provideConstructor() {
+       public static function provideConstructor() {
                $langDe = Language::factory( 'de' );
                $langEn = Language::factory( 'en' );
 
@@ -45,7 +45,7 @@ class MessageTest extends MediaWikiLangTestCase {
                );
        }
 
-       public function provideTestParams() {
+       public static function provideTestParams() {
                return array(
                        array( array() ),
                        array( array( 'foo' ), 'foo' ),
@@ -109,9 +109,15 @@ class MessageTest extends MediaWikiLangTestCase {
                $this->assertInstanceOf( 'Message', wfMessage( 'mainpage' ) );
                $this->assertInstanceOf( 'Message', wfMessage( 'i-dont-exist-evar' ) );
                $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->text() );
-               $this->assertEquals( '&lt;i-dont-exist-evar&gt;', wfMessage( 'i-dont-exist-evar' )->text() );
+               $this->assertEquals( '<i-dont-exist-evar>', wfMessage( 'i-dont-exist-evar' )->text() );
+               $this->assertEquals( '<i<dont>exist-evar>', wfMessage( 'i<dont>exist-evar' )->text() );
                $this->assertEquals( '<i-dont-exist-evar>', wfMessage( 'i-dont-exist-evar' )->plain() );
+               $this->assertEquals( '<i<dont>exist-evar>', wfMessage( 'i<dont>exist-evar' )->plain() );
                $this->assertEquals( '&lt;i-dont-exist-evar&gt;', wfMessage( 'i-dont-exist-evar' )->escaped() );
+               $this->assertEquals(
+                       '&lt;i&lt;dont&gt;exist-evar&gt;',
+                       wfMessage( 'i<dont>exist-evar' )->escaped()
+               );
        }
 
        /**
@@ -271,6 +277,55 @@ class MessageTest extends MediaWikiLangTestCase {
                );
        }
 
+       public function messagePlaintextParamsProvider() {
+               return array(
+                       array(
+                               'one $2 <div>foo</div> [[Bar]] {{Baz}} &lt;',
+                               'plain',
+                       ),
+
+                       array(
+                               // expect
+                               'one $2 <div>foo</div> [[Bar]] {{Baz}} &lt;',
+                               // format
+                               'text',
+                       ),
+                       array(
+                               'one $2 &lt;div&gt;foo&lt;/div&gt; [[Bar]] {{Baz}} &amp;lt;',
+                               'escaped',
+                       ),
+
+                       array(
+                               'one $2 &lt;div&gt;foo&lt;/div&gt; [[Bar]] {{Baz}} &amp;lt;',
+                               'parse',
+                       ),
+
+                       array(
+                               "<p>one $2 &lt;div&gt;foo&lt;/div&gt; [[Bar]] {{Baz}} &amp;lt;\n</p>",
+                               'parseAsBlock',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider messagePlaintextParamsProvider
+        * @covers Message::plaintextParams
+        */
+       public function testMessagePlaintextParams( $expect, $format ) {
+               $lang = Language::factory( 'en' );
+
+               $msg = new RawMessage( '$1 $2' );
+               $params = array(
+                       'one $2',
+                       '<div>foo</div> [[Bar]] {{Baz}} &lt;',
+               );
+               $this->assertEquals(
+                       $expect,
+                       $msg->inLanguage( $lang )->plaintextParams( $params )->$format(),
+                       "Fail formatting for $format"
+               );
+       }
+
        /**
         * @covers Message::inContentLanguage
         */
diff --git a/tests/phpunit/includes/MovePageTest.php b/tests/phpunit/includes/MovePageTest.php
new file mode 100644 (file)
index 0000000..027b877
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+class MovePageTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider provideIsValidMove
+        * @covers MovePage::isValidMove
+        * @covers MovePage::isValidFileMove
+        */
+       public function testIsValidMove( $old, $new, $error ) {
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+               $mp = new MovePage(
+                       Title::newFromText( $old ),
+                       Title::newFromText( $new )
+               );
+               $status = $mp->isValidMove();
+               if ( $error === true ) {
+                       $this->assertTrue( $status->isGood() );
+               } else {
+                       $this->assertTrue( $status->hasMessage( $error ) );
+               }
+       }
+
+       /**
+        * This should be kept in sync with TitleTest::provideTestIsValidMoveOperation
+        */
+       public static function provideIsValidMove() {
+               return array(
+                       // for MovePage::isValidMove
+                       array( 'Test', 'Test', 'selfmove' ),
+                       array( 'Special:FooBar', 'Test', 'immobile-source-namespace' ),
+                       array( 'Test', 'Special:FooBar', 'immobile-target-namespace' ),
+                       array( 'MediaWiki:Common.js', 'Help:Some wikitext page', 'bad-target-model' ),
+                       array( 'Page', 'File:Test.jpg', 'nonfile-cannot-move-to-file' ),
+                       // for MovePage::isValidFileMove
+                       array( 'File:Test.jpg', 'Page', 'imagenocrossnamespace' ),
+               );
+       }
+}
index 3eb58fc..d7e8cd3 100644 (file)
@@ -141,7 +141,15 @@ class OutputPageTest extends MediaWikiTestCase {
                        // Load module script only
                        array(
                                array( 'test.foo', ResourceLoaderModule::TYPE_SCRIPTS ),
-                               '<script src="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.foo&amp;only=scripts&amp;skin=fallback&amp;*"></script>
+                               '<script>if(window.mw){
+document.write("\u003Cscript src=\"http://127.0.0.1:8080/w/load.php?debug=false\u0026amp;lang=en\u0026amp;modules=test.foo\u0026amp;only=scripts\u0026amp;skin=fallback\u0026amp;*\"\u003E\u003C/script\u003E");
+}</script>
+'
+                       ),
+                       array(
+                               // Don't condition wrap raw modules (like the startup module)
+                               array( 'test.raw', ResourceLoaderModule::TYPE_SCRIPTS ),
+                               '<script src="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.raw&amp;only=scripts&amp;skin=fallback&amp;*"></script>
 '
                        ),
                        // Load module styles only
@@ -149,13 +157,24 @@ class OutputPageTest extends MediaWikiTestCase {
                        array(
                                array( array( 'test.baz', 'test.foo', 'test.bar' ), ResourceLoaderModule::TYPE_STYLES ),
                                '<link rel=stylesheet href="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.bar%2Cbaz%2Cfoo&amp;only=styles&amp;skin=fallback&amp;*">
+'
+                       ),
+                       // Load private module (only=scripts)
+                       array(
+                               array( 'test.quux', ResourceLoaderModule::TYPE_SCRIPTS ),
+                               '<script>if(window.mw){
+mw.test.baz({token:123});mw.loader.state({"test.quux":"ready"});
+
+}</script>
 '
                        ),
                        // Load private module (combined)
                        array(
                                array( 'test.quux', ResourceLoaderModule::TYPE_COMBINED ),
-                               '<script>if(window.mw){mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"css":[".mw-icon{transition:none}\n"]},{});}
-</script>
+                               '<script>if(window.mw){
+mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"css":[".mw-icon{transition:none}\n"]},{});
+
+}</script>
 '
                        ),
                        // Load module script with with ESI
@@ -168,6 +187,24 @@ class OutputPageTest extends MediaWikiTestCase {
                        array(
                                array( 'test.foo', ResourceLoaderModule::TYPE_STYLES, true ),
                                '<style><esi:include src="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.foo&amp;only=styles&amp;skin=fallback&amp;*" /></style>
+',
+                       ),
+                       // Load no modules
+                       array(
+                               array( array(), ResourceLoaderModule::TYPE_COMBINED ),
+                               '',
+                       ),
+                       // noscript group
+                       array(
+                               array( 'test.noscript', ResourceLoaderModule::TYPE_STYLES ),
+                               '<noscript><link rel=stylesheet href="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.noscript&amp;only=styles&amp;skin=fallback&amp;*"></noscript>
+'
+                       ),
+                       // Load two modules in separate groups
+                       array(
+                               array( array( 'test.group.foo', 'test.group.bar' ), ResourceLoaderModule::TYPE_COMBINED ),
+                               '<script src="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.group.bar&amp;skin=fallback&amp;*"></script>
+<script src="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.group.foo&amp;skin=fallback&amp;*"></script>
 ',
                        ),
                );
@@ -211,6 +248,22 @@ class OutputPageTest extends MediaWikiTestCase {
                                'styles' => '/* pref-animate=off */ .mw-icon { transition: none; }',
                                'group' => 'private',
                        )),
+                       'test.raw' => new ResourceLoaderTestModule( array(
+                               'script' => 'mw.test.baz( { token: 123 } );',
+                               'isRaw' => true,
+                       )),
+                       'test.noscript' => new ResourceLoaderTestModule( array(
+                               'styles' => '.mw-test-noscript { content: "style"; }',
+                               'group' => 'noscript',
+                       )),
+                       'test.group.bar' => new ResourceLoaderTestModule( array(
+                               'styles' => '.mw-group-bar { content: "style"; }',
+                               'group' => 'bar',
+                       )),
+                       'test.group.foo' => new ResourceLoaderTestModule( array(
+                               'styles' => '.mw-group-foo { content: "style"; }',
+                               'group' => 'foo',
+                       )),
                ) );
                $links = $method->invokeArgs( $out, $args );
                // Strip comments to avoid variation due to wgDBname in WikiID and cache key
index ceb794b..5ad8aca 100644 (file)
@@ -30,4 +30,10 @@ class PasswordTest extends MediaWikiTestCase {
 
                $this->assertFalse( $invalid1->equals( $invalid2 ) );
        }
+
+       public function testInvalidPlaintext() {
+               $invalid = User::getPasswordFactory()->newFromPlaintext( null );
+
+               $this->assertInstanceOf( 'InvalidPassword', $invalid );
+       }
 }
diff --git a/tests/phpunit/includes/PrefixSearchTest.php b/tests/phpunit/includes/PrefixSearchTest.php
new file mode 100644 (file)
index 0000000..5390dba
--- /dev/null
@@ -0,0 +1,210 @@
+<?php
+/**
+ * @group Search
+ * @group Database
+ */
+class PrefixSearchTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               // Avoid special pages from extensions interferring with the tests
+               $this->setMwGlobals( 'wgSpecialPages', array() );
+       }
+
+       protected function searchProvision( Array $results = null ) {
+               if ( $results === null ) {
+                       $this->setMwGlobals( 'wgHooks', array() );
+               } else {
+                       $this->setMwGlobals( 'wgHooks', array(
+                               'PrefixSearchBackend' => array(
+                                       function ( $namespaces, $search, $limit, &$srchres ) use ( $results ) {
+                                               $srchres = $results;
+                                               return false;
+                                       }
+                               ),
+                       ) );
+               }
+       }
+
+       public function addDBData() {
+               $this->insertPage( 'Sandbox' );
+               $this->insertPage( 'Bar' );
+               $this->insertPage( 'Example' );
+               $this->insertPage( 'Example Bar' );
+               $this->insertPage( 'Example Foo' );
+               $this->insertPage( 'Example Foo/Bar' );
+               $this->insertPage( 'Example/Baz' );
+
+               $this->insertPage( 'Talk:Sandbox' );
+               $this->insertPage( 'Talk:Example' );
+
+               $this->insertPage( 'User:Example' );
+       }
+
+       public static function provideSearch() {
+               return array(
+                       array( array(
+                               'Empty string',
+                               'query' => '',
+                               'results' => array(),
+                       ) ),
+                       array( array(
+                               'Main namespace with title prefix',
+                               'query' => 'Ex',
+                               'results' => array(
+                                       'Example',
+                                       'Example/Baz',
+                                       'Example Bar',
+                               ),
+                       ) ),
+                       array( array(
+                               'Talk namespace prefix',
+                               'query' => 'Talk:',
+                               'results' => array(
+                                       'Talk:Example',
+                                       'Talk:Sandbox',
+                               ),
+                       ) ),
+                       array( array(
+                               'User namespace prefix',
+                               'query' => 'User:',
+                               'results' => array(
+                                       'User:Example',
+                               ),
+                       ) ),
+                       array( array(
+                               'Special namespace prefix',
+                               'query' => 'Special:',
+                               'results' => array(
+                                       'Special:ActiveUsers',
+                                       'Special:AllMessages',
+                                       'Special:AllMyFiles',
+                               ),
+                       ) ),
+                       array( array(
+                               'Special namespace with prefix',
+                               'query' => 'Special:Un',
+                               'results' => array(
+                                       'Special:Unblock',
+                                       'Special:UncategorizedCategories',
+                                       'Special:UncategorizedFiles',
+                               ),
+                       ) ),
+                       array( array(
+                               'Special page name',
+                               'query' => 'Special:EditWatchlist',
+                               'results' => array(
+                                       'Special:EditWatchlist',
+                               ),
+                       ) ),
+                       array( array(
+                               'Special page subpages',
+                               'query' => 'Special:EditWatchlist/',
+                               'results' => array(
+                                       'Special:EditWatchlist/clear',
+                                       'Special:EditWatchlist/raw',
+                               ),
+                       ) ),
+                       array( array(
+                               'Special page subpages with prefix',
+                               'query' => 'Special:EditWatchlist/cl',
+                               'results' => array(
+                                       'Special:EditWatchlist/clear',
+                               ),
+                       ) ),
+               );
+       }
+
+       /**
+        * @dataProvider provideSearch
+        * @covers PrefixSearch::search
+        * @covers PrefixSearch::searchBackend
+        */
+       public function testSearch( Array $case ) {
+               $this->searchProvision( null );
+               $searcher = new StringPrefixSearch;
+               $results = $searcher->search( $case['query'], 3 );
+               $this->assertEquals(
+                       $case['results'],
+                       $results,
+                       $case[0]
+               );
+       }
+
+       public static function provideSearchBackend() {
+               return array(
+                       array( array(
+                               'Simple case',
+                               'provision' => array(
+                                       'Bar',
+                                       'Barcelona',
+                                       'Barbara',
+                               ),
+                               'query' => 'Bar',
+                               'results' => array(
+                                       'Bar',
+                                       'Barcelona',
+                                       'Barbara',
+                               ),
+                       ) ),
+                       array( array(
+                               'Exact match not on top (bug 70958)',
+                               'provision' => array(
+                                       'Barcelona',
+                                       'Bar',
+                                       'Barbara',
+                               ),
+                               'query' => 'Bar',
+                               'results' => array(
+                                       'Bar',
+                                       'Barcelona',
+                                       'Barbara',
+                               ),
+                       ) ),
+                       array( array(
+                               'Exact match missing (bug 70958)',
+                               'provision' => array(
+                                       'Barcelona',
+                                       'Barbara',
+                                       'Bart',
+                               ),
+                               'query' => 'Bar',
+                               'results' => array(
+                                       'Bar',
+                                       'Barcelona',
+                                       'Barbara',
+                               ),
+                       ) ),
+                       array( array(
+                               'Exact match missing and not existing',
+                               'provision' => array(
+                                       'Exile',
+                                       'Exist',
+                                       'External',
+                               ),
+                               'query' => 'Ex',
+                               'results' => array(
+                                       'Exile',
+                                       'Exist',
+                                       'External',
+                               ),
+                       ) ),
+               );
+       }
+
+       /**
+        * @dataProvider provideSearchBackend
+        * @covers PrefixSearch::searchBackend
+        */
+       public function testSearchBackend( Array $case ) {
+               $this->searchProvision( $case['provision'] );
+               $searcher = new StringPrefixSearch;
+               $results = $searcher->search( $case['query'], 3 );
+               $this->assertEquals(
+                       $case['results'],
+                       $results,
+                       $case[0]
+               );
+       }
+}
index 6fdc239..2585811 100644 (file)
@@ -47,7 +47,7 @@ class TestSample extends MediaWikiLangTestCase {
         * If you want to run a the same test with a variety of data, use a data provider.
         * see: http://www.phpunit.de/manual/3.4/en/writing-tests-for-phpunit.html
         */
-       public function provideTitles() {
+       public static function provideTitles() {
                return array(
                        array( 'Text', NS_MEDIA, 'Media:Text' ),
                        array( 'Text', null, 'Text' ),
@@ -57,12 +57,12 @@ class TestSample extends MediaWikiLangTestCase {
                );
        }
 
-       // @codingStandardsIgnoreStart Ignore long line warning
        /**
         * @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'" );
index 50c1e50..f960f48 100644 (file)
@@ -6,12 +6,6 @@
  */
 class SanitizerTest extends MediaWikiTestCase {
 
-       protected function setUp() {
-               parent::setUp();
-
-               AutoLoader::loadClass( 'Sanitizer' );
-       }
-
        /**
         * @covers Sanitizer::decodeCharReferences
         */
index 11f867a..628c59b 100644 (file)
@@ -320,7 +320,7 @@ class StatusTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @return array of arrays with values;
+        * @return array Array of arrays with values;
         *    0 => status object
         *    1 => expected string (with no context)
         */
@@ -391,7 +391,7 @@ class StatusTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @return array of arrays with values;
+        * @return array Array of arrays with values;
         *    0 => status object
         *    1 => expected Message parameters (with no context)
         *    2 => expected Message key
index e4c7623..0f7069a 100644 (file)
@@ -64,7 +64,7 @@ class TitleArrayFromResultTest extends MediaWikiTestCase {
                $this->assertEquals( $title, $object->current->mTextform );
        }
 
-       public function provideNumberOfRows() {
+       public static function provideNumberOfRows() {
                return array(
                        array( 0 ),
                        array( 1 ),
index 53e8dc2..fb58381 100644 (file)
@@ -1,9 +1,6 @@
 <?php
 
 /**
- * @group Database
- *        ^--- needed for language cache stuff
- *
  * @group Title
  */
 class TitleTest extends MediaWikiTestCase {
@@ -20,19 +17,6 @@ class TitleTest extends MediaWikiTestCase {
                ) );
        }
 
-       public function addDBData() {
-               $this->db->replace( 'interwiki', 'iw_prefix',
-                       array(
-                               'iw_prefix' => 'externalwiki',
-                               'iw_url' => '//example.com/$1',
-                               'iw_api' => '//example.com/api.php',
-                               'iw_wikiid' => '',
-                               'iw_local' => 0,
-                               'iw_trans' => 0,
-                       )
-               );
-       }
-
        /**
         * @covers Title::legalChars
         */
@@ -55,84 +39,61 @@ class TitleTest extends MediaWikiTestCase {
                }
        }
 
-       /**
-        * See also mediawiki.Title.test.js
-        * @covers Title::secureAndSplit
-        * @todo This method should be split into 2 separate tests each with a provider
-        * @note This mainly tests MediaWikiTitleCodec::parseTitle().
-        */
-       public function testSecureAndSplit() {
-               $this->setMwGlobals( array(
-                       'wgLocalInterwikis' => array( 'localtestiw' ),
-                       'wgHooks' => array(
-                               'InterwikiLoadPrefix' => array(
-                                       function ( $prefix, &$data ) {
-                                               if ( $prefix === 'localtestiw' ) {
-                                                       $data = array( 'iw_url' => 'localtestiw' );
-                                               } elseif ( $prefix === 'remotetestiw' ) {
-                                                       $data = array( 'iw_url' => 'remotetestiw' );
-                                               }
-                                               return false;
-                                       }
-                               )
-                       )
-               ));
-               // Valid
-               foreach ( array(
-                       'Sandbox',
-                       'A "B"',
-                       'A \'B\'',
-                       '.com',
-                       '~',
-                       '#',
-                       '"',
-                       '\'',
-                       'Talk:Sandbox',
-                       'Talk:Foo:Sandbox',
-                       'File:Example.svg',
-                       'File_talk:Example.svg',
-                       'Foo/.../Sandbox',
-                       'Sandbox/...',
-                       'A~~',
-                       ':A',
+       public static function provideValidSecureAndSplit() {
+               return array(
+                       array( 'Sandbox' ),
+                       array( 'A "B"' ),
+                       array( 'A \'B\'' ),
+                       array( '.com' ),
+                       array( '~' ),
+                       array( '#' ),
+                       array( '"' ),
+                       array( '\'' ),
+                       array( 'Talk:Sandbox' ),
+                       array( 'Talk:Foo:Sandbox' ),
+                       array( 'File:Example.svg' ),
+                       array( 'File_talk:Example.svg' ),
+                       array( 'Foo/.../Sandbox' ),
+                       array( 'Sandbox/...' ),
+                       array( 'A~~' ),
+                       array( ':A' ),
                        // Length is 256 total, but only title part matters
-                       'Category:' . str_repeat( 'x', 248 ),
-                       str_repeat( 'x', 252 ),
+                       array( 'Category:' . str_repeat( 'x', 248 ) ),
+                       array( str_repeat( 'x', 252 ) ),
                        // interwiki prefix
-                       'localtestiw: #anchor',
-                       'localtestiw:',
-                       'localtestiw:foo',
-                       'localtestiw: foo # anchor',
-                       'localtestiw: Talk: Sandbox # anchor',
-                       'remotetestiw:',
-                       'remotetestiw: Talk: # anchor',
-                       'remotetestiw: #bar',
-                       'remotetestiw: Talk:',
-                       'remotetestiw: Talk: Foo',
-                       'localtestiw:remotetestiw:',
-                       'localtestiw:remotetestiw:foo'
-               ) as $text ) {
-                       $this->assertInstanceOf( 'Title', Title::newFromText( $text ), "Valid: $text" );
-               }
+                       array( 'localtestiw: #anchor' ),
+                       array( 'localtestiw:' ),
+                       array( 'localtestiw:foo' ),
+                       array( 'localtestiw: foo # anchor' ),
+                       array( 'localtestiw: Talk: Sandbox # anchor' ),
+                       array( 'remotetestiw:' ),
+                       array( 'remotetestiw: Talk: # anchor' ),
+                       array( 'remotetestiw: #bar' ),
+                       array( 'remotetestiw: Talk:' ),
+                       array( 'remotetestiw: Talk: Foo' ),
+                       array( 'localtestiw:remotetestiw:' ),
+                       array( 'localtestiw:remotetestiw:foo' )
+               );
+       }
 
-               // Invalid
-               foreach ( array(
-                       '',
-                       ':',
-                       '__  __',
-                       '  __  ',
+       public static function provideInvalidSecureAndSplit() {
+               return array(
+                       array( '' ),
+                       array( ':' ),
+                       array( '__  __' ),
+                       array( '  __  ' ),
                        // Bad characters forbidden regardless of wgLegalTitleChars
-                       'A [ B',
-                       'A ] B',
-                       'A { B',
-                       'A } B',
-                       'A < B',
-                       'A > B',
-                       'A | B',
+                       array( 'A [ B' ),
+                       array( 'A ] B' ),
+                       array( 'A { B' ),
+                       array( 'A } B' ),
+                       array( 'A < B' ),
+                       array( 'A > B' ),
+                       array( 'A | B' ),
                        // URL encoding
-                       'A%20B',
-                       'A%23B',
-                       'A%2523B',
+                       array( 'A%20B' ),
+                       array( 'A%23B' ),
+                       array( 'A%2523B' ),
                        // 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.
@@ -140,32 +101,70 @@ class TitleTest extends MediaWikiTestCase {
                        //'A &#233; B',
                        //'A &#x00E9; B',
                        // Subject of NS_TALK does not roundtrip to NS_MAIN
-                       'Talk:File:Example.svg',
+                       array( 'Talk:File:Example.svg' ),
                        // Directory navigation
-                       '.',
-                       '..',
-                       './Sandbox',
-                       '../Sandbox',
-                       'Foo/./Sandbox',
-                       'Foo/../Sandbox',
-                       'Sandbox/.',
-                       'Sandbox/..',
+                       array( '.' ),
+                       array( '..' ),
+                       array( './Sandbox' ),
+                       array( '../Sandbox' ),
+                       array( 'Foo/./Sandbox' ),
+                       array( 'Foo/../Sandbox' ),
+                       array( 'Sandbox/.' ),
+                       array( 'Sandbox/..' ),
                        // Tilde
-                       'A ~~~ Name',
-                       'A ~~~~ Signature',
-                       'A ~~~~~ Timestamp',
-                       str_repeat( 'x', 256 ),
+                       array( 'A ~~~ Name' ),
+                       array( 'A ~~~~ Signature' ),
+                       array( 'A ~~~~~ Timestamp' ),
+                       array( str_repeat( 'x', 256 ) ),
                        // Namespace prefix without actual title
-                       'Talk:',
-                       'Talk:#',
-                       'Category: ',
-                       'Category: #bar',
+                       array( 'Talk:' ),
+                       array( 'Talk:#' ),
+                       array( 'Category: ' ),
+                       array( 'Category: #bar' ),
                        // interwiki prefix
-                       'localtestiw: Talk: # anchor',
-                       'localtestiw: Talk:'
-               ) as $text ) {
-                       $this->assertNull( Title::newFromText( $text ), "Invalid: $text" );
-               }
+                       array( 'localtestiw: Talk: # anchor' ),
+                       array( 'localtestiw: Talk:' )
+               );
+       }
+
+       private function secureAndSplitGlobals() {
+               $this->setMwGlobals( array(
+                       'wgLocalInterwikis' => array( 'localtestiw' ),
+                       'wgHooks' => array(
+                               'InterwikiLoadPrefix' => array(
+                                       function ( $prefix, &$data ) {
+                                               if ( $prefix === 'localtestiw' ) {
+                                                       $data = array( 'iw_url' => 'localtestiw' );
+                                               } elseif ( $prefix === 'remotetestiw' ) {
+                                                       $data = array( 'iw_url' => 'remotetestiw' );
+                                               }
+                                               return false;
+                                       }
+                               )
+                       )
+               ));
+       }
+
+       /**
+        * See also mediawiki.Title.test.js
+        * @covers Title::secureAndSplit
+        * @dataProvider provideValidSecureAndSplit
+        * @note This mainly tests MediaWikiTitleCodec::parseTitle().
+        */
+       public function testSecureAndSplitValid( $text ) {
+               $this->secureAndSplitGlobals();
+               $this->assertInstanceOf( 'Title', Title::newFromText( $text ), "Valid: $text" );
+       }
+
+       /**
+        * See also mediawiki.Title.test.js
+        * @covers Title::secureAndSplit
+        * @dataProvider provideInvalidSecureAndSplit
+        * @note This mainly tests MediaWikiTitleCodec::parseTitle().
+        */
+       public function testSecureAndSplitInvalid( $text ) {
+               $this->secureAndSplitGlobals();
+               $this->assertNull( Title::newFromText( $text ), "Invalid: $text" );
        }
 
        public static function provideConvertByteClassToUnicodeClass() {
@@ -238,11 +237,10 @@ class TitleTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider provideBug31100
+        * @dataProvider provideSpecialNamesWithAndWithoutParameter
         * @covers Title::fixSpecialName
-        * @todo give this test a real name explaining what is being tested here
         */
-       public function testBug31100FixSpecialName( $text, $expectedParam ) {
+       public function testFixSpecialNameRetainsParameter( $text, $expectedParam ) {
                $title = Title::newFromText( $text );
                $fixed = $title->fixSpecialName();
                $stuff = explode( '/', $fixed->getDBkey(), 2 );
@@ -258,7 +256,7 @@ class TitleTest extends MediaWikiTestCase {
                );
        }
 
-       public static function provideBug31100() {
+       public static function provideSpecialNamesWithAndWithoutParameter() {
                return array(
                        array( 'Special:Version', null ),
                        array( 'Special:Version/', '' ),
@@ -275,8 +273,10 @@ class TitleTest extends MediaWikiTestCase {
         * @param array|string|bool $expected Required error
         * @dataProvider provideTestIsValidMoveOperation
         * @covers Title::isValidMoveOperation
+        * @covers Title::validateFileMoveOperation
         */
        public function testIsValidMoveOperation( $source, $target, $expected ) {
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
                $title = Title::newFromText( $source );
                $nt = Title::newFromText( $target );
                $errors = $title->isValidMoveOperation( $nt, false );
@@ -290,13 +290,17 @@ class TitleTest extends MediaWikiTestCase {
                }
        }
 
-       /**
-        * Provides test parameter values for testIsValidMoveOperation()
-        */
-       public function dataTestIsValidMoveOperation() {
+       public static function provideTestIsValidMoveOperation() {
                return array(
+                       // for Title::isValidMoveOperation
+                       array( 'Some page', '', 'badtitletext' ),
                        array( 'Test', 'Test', 'selfmove' ),
-                       array( 'File:Test.jpg', 'Page', 'imagenocrossnamespace' )
+                       array( 'Special:FooBar', 'Test', 'immobile-source-namespace' ),
+                       array( 'Test', 'Special:FooBar', 'immobile-target-namespace' ),
+                       array( 'MediaWiki:Common.js', 'Help:Some wikitext page', 'bad-target-model' ),
+                       array( 'Page', 'File:Test.jpg', 'nonfile-cannot-move-to-file' ),
+                       // for Title::validateFileMoveOperation
+                       array( 'File:Test.jpg', 'Page', 'imagenocrossnamespace' ),
                );
        }
 
@@ -417,13 +421,6 @@ class TitleTest extends MediaWikiTestCase {
                return $result;
        }
 
-       public static function provideTestIsValidMoveOperation() {
-               return array(
-                       array( 'Test', 'Test', 'selfmove' ),
-                       array( 'File:Test.jpg', 'Page', 'imagenocrossnamespace' )
-               );
-       }
-
        /**
         * @dataProvider provideGetPageViewLanguage
         * @covers Title::getPageViewLanguage
@@ -550,7 +547,7 @@ class TitleTest extends MediaWikiTestCase {
                );
        }
 
-       public function provideNewFromTitleValue() {
+       public static function provideNewFromTitleValue() {
                return array(
                        array( new TitleValue( NS_MAIN, 'Foo' ) ),
                        array( new TitleValue( NS_MAIN, 'Foo', 'bar' ) ),
@@ -570,7 +567,7 @@ class TitleTest extends MediaWikiTestCase {
                $this->assertEquals( $value->getFragment(), $title->getFragment() );
        }
 
-       public function provideGetTitleValue() {
+       public static function provideGetTitleValue() {
                return array(
                        array( 'Foo' ),
                        array( 'Foo#bar' ),
@@ -591,7 +588,7 @@ class TitleTest extends MediaWikiTestCase {
                $this->assertEquals( $title->getFragment(), $value->getFragment() );
        }
 
-       public function provideGetFragment() {
+       public static function provideGetFragment() {
                return array(
                        array( 'Foo', '' ),
                        array( 'Foo#bar', 'bar' ),
@@ -631,7 +628,7 @@ class TitleTest extends MediaWikiTestCase {
                $this->assertEquals( $isKnown, $title->isAlwaysKnown() );
        }
 
-       public function provideIsAlwaysKnown() {
+       public static function provideIsAlwaysKnown() {
                return array(
                        array( 'Some nonexistent page', false ),
                        array( 'UTPage', false ),
@@ -640,7 +637,14 @@ class TitleTest extends MediaWikiTestCase {
                        array( 'Special:SomeNonexistentSpecialPage', false ),
                        array( 'MediaWiki:Parentheses', true ),
                        array( 'MediaWiki:Some nonexistent message', false ),
-                       array( 'externalwiki:Interwiki link', true ),
                );
        }
+
+       /**
+        * @covers Title::isAlwaysKnown
+        */
+       public function testIsAlwaysKnownOnInterwiki() {
+               $title = Title::makeTitle( NS_MAIN, 'Interwiki link', '', 'externalwiki' );
+               $this->assertTrue( $title->isAlwaysKnown() );
+       }
 }
index ea44f36..62989fa 100644 (file)
@@ -61,7 +61,7 @@ class UserArrayFromResultTest extends MediaWikiTestCase {
                $this->assertEquals( $username, $object->current->mName );
        }
 
-       public function provideNumberOfRows() {
+       public static function provideNumberOfRows() {
                return array(
                        array( 0 ),
                        array( 1 ),
diff --git a/tests/phpunit/includes/UserMailerTest.php b/tests/phpunit/includes/UserMailerTest.php
deleted file mode 100644 (file)
index dca8aeb..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-class UserMailerTest extends MediaWikiLangTestCase {
-
-       /**
-        * @covers UserMailer::quotedPrintable
-        */
-       public function testQuotedPrintable() {
-               $this->assertEquals(
-                       "=?UTF-8?Q?=C4=88u=20legebla=3F?=",
-                       UserMailer::quotedPrintable( "\xc4\x88u legebla?", "UTF-8" ) );
-       }
-
-}
index 36de114..a0c20bb 100644 (file)
@@ -214,8 +214,10 @@ class UserTest extends MediaWikiTestCase {
         */
        public function testEditCount() {
                $user = User::newFromName( 'UnitTestUser' );
-               $user->loadDefaults();
-               $user->addToDatabase();
+
+               if ( !$user->getId() ) {
+                       $user->addToDatabase();
+               }
 
                // let the user have a few (3) edits
                $page = WikiPage::factory( Title::newFromText( 'Help:UserTest_EditCount' ) );
@@ -248,14 +250,17 @@ class UserTest extends MediaWikiTestCase {
         */
        public function testOptions() {
                $user = User::newFromName( 'UnitTestUser' );
-               $user->addToDatabase();
 
-               $user->setOption( 'someoption', 'test' );
+               if ( !$user->getId() ) {
+                       $user->addToDatabase();
+               }
+
+               $user->setOption( 'userjs-someoption', 'test' );
                $user->setOption( 'cols', 200 );
                $user->saveSettings();
 
                $user = User::newFromName( 'UnitTestUser' );
-               $this->assertEquals( 'test', $user->getOption( 'someoption' ) );
+               $this->assertEquals( 'test', $user->getOption( 'userjs-someoption' ) );
                $this->assertEquals( 200, $user->getOption( 'cols' ) );
        }
 
@@ -266,9 +271,9 @@ class UserTest extends MediaWikiTestCase {
         */
        public function testAnonOptions() {
                global $wgDefaultUserOptions;
-               $this->user->setOption( 'someoption', 'test' );
+               $this->user->setOption( 'userjs-someoption', 'test' );
                $this->assertEquals( $wgDefaultUserOptions['cols'], $this->user->getOption( 'cols' ) );
-               $this->assertEquals( 'test', $this->user->getOption( 'someoption' ) );
+               $this->assertEquals( 'test', $this->user->getOption( 'userjs-someoption' ) );
        }
 
        /**
@@ -281,7 +286,7 @@ class UserTest extends MediaWikiTestCase {
                $wgPasswordExpireGrace = 3600 * 24 * 7; // 7 days
 
                $user = User::newFromName( 'UnitTestUser' );
-               $user->loadDefaults();
+               $user->loadDefaults( 'UnitTestUser' );
                $this->assertEquals( false, $user->getPasswordExpired() );
 
                $ts = time() - ( 3600 * 24 * 1 ); // 1 day ago
@@ -323,4 +328,35 @@ class UserTest extends MediaWikiTestCase {
                $this->assertFalse( $user->checkPasswordValidity( 'Passpass' )->isGood() );
                $this->assertEquals( 'password-login-forbidden', $user->getPasswordValidity( 'Passpass' ) );
        }
+
+       /**
+        * @covers User::getCanonicalName()
+        * @dataProvider provideGetCanonicalName
+        */
+       public function testGetCanonicalName( $name, $expectedArray, $msg ) {
+               foreach ( $expectedArray as $validate => $expected ) {
+                       $this->assertEquals(
+                               User::getCanonicalName( $name, $validate === 'false' ? false : $validate ),
+                               $expected,
+                               $msg . ' (' . $validate . ')'
+                       );
+               }
+       }
+
+       public static function provideGetCanonicalName() {
+               return array(
+                       array( ' trailing space ', array( 'creatable' => 'Trailing space' ), 'Trailing spaces' ),
+                       // @todo FIXME: Maybe the createable name should be 'Talk:Username' or false to reject?
+                       array( 'Talk:Username', array( 'creatable' => 'Username', 'usable' => 'Username',
+                               'valid' => 'Username', 'false' => 'Talk:Username' ), 'Namespace prefix' ),
+                       array( ' name with # hash', array( 'creatable' => false, 'usable' => false ), 'With hash' ),
+                       array( 'Multi  spaces', array( 'creatable' => 'Multi spaces',
+                               'usable' => 'Multi spaces' ), 'Multi spaces' ),
+                       array( 'lowercase', array( 'creatable' => 'Lowercase' ), 'Lowercase' ),
+                       array( 'in[]valid', array( 'creatable' => false, 'usable' => false, 'valid' => false,
+                               'false' => 'In[]valid' ), 'Invalid' ),
+                       array( 'with / slash', array( 'creatable' => false, 'usable' => false, 'valid' => false,
+                               'false' => 'With / slash' ), 'With slash' ),
+               );
+       }
 }
index 907ce79..0dbb010 100644 (file)
@@ -14,7 +14,7 @@ class XmlJs extends MediaWikiTestCase {
                $this->assertEquals( $value, $obj->value );
        }
 
-       public function provideConstruction() {
+       public static function provideConstruction() {
                return array(
                        array( null ),
                        array( '' ),
index eb370d9..6681c7a 100644 (file)
@@ -7,6 +7,7 @@
  * @author Thiemo Mättig
  *
  * @group Action
+ * @group Database
  */
 class ActionTest extends MediaWikiTestCase {
 
@@ -116,6 +117,15 @@ class ActionTest extends MediaWikiTestCase {
                $this->assertEquals( 'revisiondelete', $actionName );
        }
 
+       public function testGetActionName_whenCanNotUseWikiPage_defaultsToView() {
+               $request = new FauxRequest( array( 'action' => 'edit' ) );
+               $context = new DerivativeContext( RequestContext::getMain() );
+               $context->setRequest( $request );
+               $actionName = Action::getActionName( $context );
+
+               $this->assertEquals( 'view', $actionName );
+       }
+
        /**
         * @dataProvider actionProvider
         * @param string $requestedAction
index 780cf9e..4bf6deb 100644 (file)
 class ApiMainTest extends ApiTestCase {
 
        /**
-        * Test that the API will accept a FauxRequest and execute. The help action
-        * (default) throws a UsageException. Just validate we're getting proper XML
-        *
-        * @expectedException UsageException
+        * Test that the API will accept a FauxRequest and execute.
         */
        public function testApi() {
                $api = new ApiMain(
-                       new FauxRequest( array( 'action' => 'help', 'format' => 'xml' ) )
+                       new FauxRequest( array( 'action' => 'query', 'meta' => 'siteinfo' ) )
                );
                $api->execute();
-               $api->getPrinter()->setBufferResult( true );
-               $api->printResult( false );
-               $resp = $api->getPrinter()->getBuffer();
-
-               libxml_use_internal_errors( true );
-               $sxe = simplexml_load_string( $resp );
-               $this->assertNotInternalType( "bool", $sxe );
-               $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
+               $data = $api->getResultData();
+               $this->assertInternalType( 'array', $data );
+               $this->assertArrayHasKey( 'query', $data );
        }
 
        public static function provideAssert() {
index 19c0a7d..dab81e1 100644 (file)
@@ -101,6 +101,8 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                        $this->assertTrue( $moduleManager->isDefined( $name, $group ), 'isDefined' );
                        $this->assertNotNull( $moduleManager->getModule( $name, $group, true ), 'getModule' );
                }
+
+               $this->assertTrue( true ); // Don't mark the test as risky if $modules is empty
        }
 
        public function getModuleProvider() {
@@ -147,6 +149,7 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers ApiModuleManager::getModule
         * @dataProvider getModuleProvider
         */
        public function testGetModule( $modules, $name, $expectedClass ) {
@@ -170,6 +173,9 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                $this->assertNotSame( $module1, $module4 );
        }
 
+       /**
+        * @covers ApiModuleManager::getModule
+        */
        public function testGetModule_null() {
                $modules = array(
                        'login' => 'ApiLogin',
@@ -183,6 +189,9 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                $this->assertNull( $moduleManager->getModule( 'login', 'bla' ), 'wrong group' );
        }
 
+       /**
+        * @covers ApiModuleManager::getNames
+        */
        public function testGetNames() {
                $fooModules = array(
                        'login' => 'ApiLogin',
@@ -206,6 +215,9 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                $this->assertArrayEquals( array_keys( $allModules ), $allNames );
        }
 
+       /**
+        * @covers ApiModuleManager::getNamesWithClasses
+        */
        public function testGetNamesWithClasses() {
                $fooModules = array(
                        'login' => 'ApiLogin',
@@ -232,6 +244,9 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                $this->assertArrayEquals( $allModules, $allNamesWithClasses );
        }
 
+       /**
+        * @covers ApiModuleManager::getModuleGroup
+        */
        public function testGetModuleGroup() {
                $fooModules = array(
                        'login' => 'ApiLogin',
@@ -252,6 +267,9 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                $this->assertNull( $moduleManager->getModuleGroup( 'quux' ) );
        }
 
+       /**
+        * @covers ApiModuleManager::getGroups
+        */
        public function testGetGroups() {
                $fooModules = array(
                        'login' => 'ApiLogin',
@@ -271,4 +289,30 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                $this->assertArrayEquals( array( 'foo', 'bar' ), $groups );
        }
 
+       /**
+        * @covers ApiModuleManager::getClassName
+        */
+       public function testGetClassName() {
+               $fooModules = array(
+                       'login' => 'ApiLogin',
+                       'logout' => 'ApiLogout',
+               );
+
+               $barModules = array(
+                       'feedcontributions' => array( 'class' => 'ApiFeedContributions' ),
+                       'feedrecentchanges' => array( 'class' => 'ApiFeedRecentChanges' ),
+               );
+
+               $moduleManager = $this->getModuleManager();
+               $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' ) );
+       }
+
+
 }
index f633315..cd14194 100644 (file)
@@ -47,7 +47,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         * @param string $text Content of the page
         * @param string $summary Optional summary string for the revision
         * @param int $defaultNs Optional namespace id
-        * @return Array as returned by WikiPage::doEditContent()
+        * @return array Array as returned by WikiPage::doEditContent()
         */
        protected function editPage( $pageName, $text, $summary = '', $defaultNs = NS_MAIN ) {
                $title = Title::newFromText( $pageName, $defaultNs );
@@ -121,7 +121,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         * @param array $params Key-value API params
         * @param array|null $session Session array
         * @param User|null $user A User object for the context
-        * @return Result of the API call
+        * @return array Result of the API call
         * @throws Exception In case wsToken is not set in the session
         */
        protected function doApiRequestWithToken( array $params, array $session = null,
index 13da33c..d04766b 100644 (file)
@@ -20,7 +20,7 @@ class PrefixUniquenessTest extends MediaWikiTestCase {
                        $class = get_class( $module );
 
                        $prefix = $module->getModulePrefix();
-                       if ( isset( $prefixes[$prefix] ) ) {
+                       if ( $prefix !== '' && isset( $prefixes[$prefix] ) ) {
                                $this->fail( "Module prefix '{$prefix}' is shared between {$class} and {$prefixes[$prefix]}" );
                        }
                        $prefixes[$module->getModulePrefix()] = $class;
index 328ea8e..6374cfa 100644 (file)
@@ -328,7 +328,7 @@ class RandomImageGenerator {
         * This is used when simulating a rotated image capture with Exif orientation
         * @param array $spec Returned by getImageSpec
         * @param array $matrix 2x2 transformation matrix
-        * @return array transformed Spec
+        * @return array Transformed Spec
         */
        private static function rotateImageSpec( &$spec, $matrix ) {
                $tSpec = array();
@@ -367,7 +367,7 @@ class RandomImageGenerator {
         * @param array $matrix 2x2 rotation matrix
         * @param int $x The x-coordinate number
         * @param int $y The y-coordinate number
-        * @return Transformed with properties x, y
+        * @return array Transformed with properties x, y
         */
        private static function matrixMultiply2x2( $matrix, $x, $y ) {
                return array(
@@ -432,7 +432,7 @@ class RandomImageGenerator {
         * array( array( 'foo', 'bar' ), array( 'quux', 'baz' ) );
         *
         * @param int $number Number of pairs
-        * @return array two-element arrays
+        * @return array Two-element arrays
         */
        private function getRandomWordPairs( $number ) {
                $lines = $this->getRandomLines( $number * 2 );
@@ -454,7 +454,7 @@ class RandomImageGenerator {
         * @param int $number_desired Number of lines desired
         *
         * @throws Exception
-        * @return Array of exactly n elements, drawn randomly from lines the file
+        * @return array Array of exactly n elements, drawn randomly from lines the file
         */
        private function getRandomLines( $number_desired ) {
                $filepath = $this->dictionaryFile;
diff --git a/tests/phpunit/includes/api/format/ApiFormatNoneTest.php b/tests/phpunit/includes/api/format/ApiFormatNoneTest.php
new file mode 100644 (file)
index 0000000..cabd750
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ * @covers ApiFormatNone
+ */
+class ApiFormatNoneTest extends ApiFormatTestBase {
+
+       public function testValidSyntax( ) {
+               $data = $this->apiRequest( 'none', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
+
+               $this->assertEquals( '', $data ); // No output!
+       }
+}
index 5f6d53c..af77570 100644 (file)
@@ -16,15 +16,12 @@ abstract class ApiFormatTestBase extends ApiTestCase {
                $module = $data[3];
 
                $printer = $module->createPrinterByName( $format );
-               $printer->setUnescapeAmps( false );
-
-               $printer->initPrinter( false );
 
                ob_start();
+               $printer->initPrinter( false );
                $printer->execute();
-               $out = ob_get_clean();
-
                $printer->closePrinter();
+               $out = ob_get_clean();
 
                return $out;
        }
index 347cd6f..46f1b7b 100644 (file)
@@ -62,7 +62,8 @@ class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop + 1 list
-               $data = $this->query( $mk( 99, 99, true ), 1, 'g1p', false );
+               $data = $this->query( $mk( 99, 99, true ), 1, 'g1p', false ) +
+                       array( 'batchcomplete' => '' );
                $this->checkC( $data, $mk( 1, 1, true ), 6, 'g1p-11t' );
                $this->checkC( $data, $mk( 2, 2, true ), 3, 'g1p-22t' );
                $this->checkC( $data, $mk( 1, 1, false ), 6, 'g1p-11f' );
index 0379790..328d839 100644 (file)
@@ -68,7 +68,8 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                                'aplimit' => "$l",
                        );
                };
-               $data = $this->query( $mk( 99 ), 1, '1L', false );
+               $data = $this->query( $mk( 99 ), 1, '1L', false ) +
+                       array( 'batchcomplete' => '' );
 
                // 1 list
                $this->checkC( $data, $mk( 1 ), 5, '1L-1' );
@@ -95,7 +96,8 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // 2 lists
-               $data = $this->query( $mk( 99, 99 ), 1, '2L', false );
+               $data = $this->query( $mk( 99, 99 ), 1, '2L', false ) +
+                       array( 'batchcomplete' => '' );
                $this->checkC( $data, $mk( 1, 1 ), 5, '2L-11' );
                $this->checkC( $data, $mk( 2, 2 ), 3, '2L-22' );
                $this->checkC( $data, $mk( 3, 3 ), 2, '2L-33' );
@@ -119,7 +121,8 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop
-               $data = $this->query( $mk( 99, 99 ), 1, 'G1P', false );
+               $data = $this->query( $mk( 99, 99 ), 1, 'G1P', false ) +
+                       array( 'batchcomplete' => '' );
                $this->checkC( $data, $mk( 1, 1 ), 11, 'G1P-11' );
                $this->checkC( $data, $mk( 2, 2 ), 6, 'G1P-22' );
                $this->checkC( $data, $mk( 3, 3 ), 4, 'G1P-33' );
@@ -144,7 +147,8 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 2 props
-               $data = $this->query( $mk( 99, 99, 99 ), 1, 'G2P', false );
+               $data = $this->query( $mk( 99, 99, 99 ), 1, 'G2P', false ) +
+                       array( 'batchcomplete' => '' );;
                $this->checkC( $data, $mk( 1, 1, 1 ), 16, 'G2P-111' );
                $this->checkC( $data, $mk( 2, 2, 2 ), 9, 'G2P-222' );
                $this->checkC( $data, $mk( 3, 3, 3 ), 6, 'G2P-333' );
@@ -177,7 +181,8 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop + 1 list
-               $data = $this->query( $mk( 99, 99, 99 ), 1, 'G1P1L', false );
+               $data = $this->query( $mk( 99, 99, 99 ), 1, 'G1P1L', false ) +
+                       array( 'batchcomplete' => '' );
                $this->checkC( $data, $mk( 1, 1, 1 ), 11, 'G1P1L-111' );
                $this->checkC( $data, $mk( 2, 2, 2 ), 6, 'G1P1L-222' );
                $this->checkC( $data, $mk( 3, 3, 3 ), 4, 'G1P1L-333' );
@@ -214,7 +219,8 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop + 1 list
-               $data = $this->query( $mk( 99, 99, 99, 99, 99 ), 1, 'G2P2L1M', false );
+               $data = $this->query( $mk( 99, 99, 99, 99, 99 ), 1, 'G2P2L1M', false ) +
+                       array( 'batchcomplete' => '' );
                $this->checkC( $data, $mk( 1, 1, 1, 1, 1 ), 16, 'G2P2L1M-11111' );
                $this->checkC( $data, $mk( 2, 2, 2, 2, 2 ), 9, 'G2P2L1M-22222' );
                $this->checkC( $data, $mk( 3, 3, 3, 3, 3 ), 6, 'G2P2L1M-33333' );
@@ -244,7 +250,8 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop
-               $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=P', false );
+               $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=P', false ) +
+                       array( 'batchcomplete' => '' );
 
                $this->checkC( $data, $mk( 1, true, 1, true ), 4, 'G=P-1t1t' );
                $this->checkC( $data, $mk( 2, true, 2, true ), 2, 'G=P-2t2t' );
@@ -290,7 +297,8 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 list
-               $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=L', false );
+               $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=L', false ) +
+                       array( 'batchcomplete' => '' );
 
                $this->checkC( $data, $mk( 1, true, 1, true ), 5, 'G=L-1t1t' );
                $this->checkC( $data, $mk( 2, true, 2, true ), 3, 'G=L-2t2t' );
index d986e69..bce6268 100644 (file)
@@ -38,7 +38,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
         * @param int $expectedCount Max number of iterations
         * @param string $id Unit test id
         * @param bool $continue True to use smart continue
-        * @return Merged results data array
+        * @return array Merged results data array
         */
        protected function checkC( $expected, $params, $expectedCount, $id, $continue = true ) {
                $result = $this->query( $params, $expectedCount, $id, $continue );
@@ -51,7 +51,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
         * @param int $expectedCount Max number of iterations
         * @param string $id Unit test id
         * @param bool $useContinue True to use smart continue
-        * @return Merged results data array
+        * @return array Merged results data array
         * @throws Exception
         */
        protected function query( $params, $expectedCount, $id, $useContinue = true ) {
index f920ce9..56c15b2 100644 (file)
@@ -52,6 +52,8 @@ STR;
        /**
         * Check that the parameter is a valid two element array,
         * with the first element being API request and the second - expected result
+        * @param array $v
+        * @return array
         */
        private function validateRequestExpectedPair( $v ) {
                $this->assertType( 'array', $v, self::PARAM_ASSERT );
@@ -66,6 +68,8 @@ STR;
 
        /**
         * Recursively merges the expected values in the $item into the $all
+        * @param array &$all
+        * @param array $item
         */
        private function mergeExpected( &$all, $item ) {
                foreach ( $item as $k => $v ) {
diff --git a/tests/phpunit/includes/cache/LocalisationCacheTest.php b/tests/phpunit/includes/cache/LocalisationCacheTest.php
new file mode 100644 (file)
index 0000000..fc06a50
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+/**
+ * @group Database
+ * @group Cache
+ * @covers LocalisationCache
+ * @author Niklas Laxström
+ */
+class LocalisationCacheTest extends MediaWikiTestCase {
+       protected function setUp() {
+               global $IP;
+
+               parent::setUp();
+               $this->setMwGlobals( array(
+                       'wgMessagesDirs' => array( "$IP/tests/phpunit/data/localisationcache" ),
+                       'wgExtensionMessagesFiles' => array(),
+                       'wgHooks' => array(),
+               ) );
+       }
+
+       public function testPuralRulesFallback() {
+               $cache = new LocalisationCache( array( 'store' => 'detect' ) );
+
+               $this->assertEquals(
+                       $cache->getItem( 'ar', 'pluralRules' ),
+                       $cache->getItem( 'arz', 'pluralRules' ),
+                       'arz plural rules (undefined) fallback to ar (defined)'
+               );
+
+               $this->assertEquals(
+                       $cache->getItem( 'ar', 'compiledPluralRules' ),
+                       $cache->getItem( 'arz', 'compiledPluralRules' ),
+                       'arz compiled plural rules (undefined) fallback to ar (defined)'
+               );
+
+               $this->assertNotEquals(
+                       $cache->getItem( 'ksh', 'pluralRules' ),
+                       $cache->getItem( 'de', 'pluralRules' ),
+                       'ksh plural rules (defined) dont fallback to de (defined)'
+               );
+
+               $this->assertNotEquals(
+                       $cache->getItem( 'ksh', 'compiledPluralRules' ),
+                       $cache->getItem( 'de', 'compiledPluralRules' ),
+                       'ksh compiled plural rules (defined) dont fallback to de (defined)'
+               );
+       }
+
+       public function testRecacheFallbacks() {
+               $lc = new LocalisationCache( array( 'store' => 'detect' ) );
+               $lc->recache( 'uk' );
+               $this->assertEquals(
+                       array(
+                               'present-uk' => 'uk',
+                               'present-ru' => 'ru',
+                               'present-en' => 'en',
+                       ),
+                       $lc->getItem( 'uk', 'messages' ),
+                       'Fallbacks are only used to fill missing data'
+               );
+       }
+
+       public function testRecacheFallbacksWithHooks() {
+               global $wgHooks;
+
+               // Use hook to provide updates for messages. This is what the
+               // LocalisationUpdate extension does. See bug 68781.
+               $wgHooks['LocalisationCacheRecacheFallback'][] = function (
+                       LocalisationCache $lc,
+                       $code,
+                       array &$cache
+               ) {
+                       if ( $code === 'ru' ) {
+                               $cache['messages']['present-uk'] = 'ru-override';
+                               $cache['messages']['present-ru'] = 'ru-override';
+                               $cache['messages']['present-en'] = 'ru-override';
+                       }
+               };
+
+               $lc = new LocalisationCache( array( 'store' => 'detect' ) );
+               $lc->recache( 'uk' );
+               $this->assertEquals(
+                       array(
+                               'present-uk' => 'uk',
+                               'present-ru' => 'ru-override',
+                               'present-en' => 'ru-override',
+                       ),
+                       $lc->getItem( 'uk', 'messages' ),
+                       'Updates provided by hooks follow the normal fallback order.'
+               );
+       }
+}
diff --git a/tests/phpunit/includes/cache/RedisBloomCacheTest.php b/tests/phpunit/includes/cache/RedisBloomCacheTest.php
new file mode 100644 (file)
index 0000000..3d491e9
--- /dev/null
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Test for BloomCacheRedis class.
+ *
+ * @TODO: some generic base "redis test server conf" for all testing?
+ *
+ * @covers BloomCacheRedis
+ * @group Cache
+ */
+class BloomCacheRedisTest extends MediaWikiTestCase {
+       private static $suffix;
+
+       protected function setUp() {
+               parent::setUp();
+
+               self::$suffix = self::$suffix ? : mt_rand();
+
+               $fcache = BloomCache::get( 'main' );
+               if ( $fcache instanceof BloomCacheRedis ) {
+                       $fcache->delete( "unit-testing-" . self::$suffix );
+               } else {
+                       $this->markTestSkipped( 'The main bloom cache is not redis.' );
+               }
+       }
+
+       public function testBloomCache() {
+               $key = "unit-testing-" . self::$suffix;
+               $fcache = BloomCache::get( 'main' );
+               $count = 1500;
+
+               $this->assertTrue( $fcache->delete( $key ), "OK delete of filter '$key'." );
+               $this->assertTrue( $fcache->init( $key, $count, .001 ), "OK init of filter '$key'." );
+
+               $members = array();
+               for ( $i = 0; $i < $count; ++$i ) {
+                       $members[] = "$i-value-$i";
+               }
+               $this->assertTrue( $fcache->add( $key, $members ), "Addition of members to '$key' OK." );
+
+               for ( $i = 0; $i < $count; ++$i ) {
+                       $this->assertTrue( $fcache->isHit( $key, "$i-value-$i" ), "Hit on member '$i-value-$i'." );
+               }
+
+               $falsePositives = array();
+               for ( $i = $count; $i < 2 * $count; ++$i ) {
+                       if ( $fcache->isHit( $key, "value$i" ) ) {
+                               $falsePositives[] = "value$i";
+                       }
+               }
+
+               $eFalsePositives = array(
+                       'value1763',
+                       'value2245',
+                       'value2353',
+                       'value2791',
+                       'value2898',
+                       'value2975'
+               );
+               $this->assertEquals( $eFalsePositives, $falsePositives, "Correct number of false positives found." );
+       }
+
+       protected function tearDown() {
+               parent::tearDown();
+
+               $fcache = BloomCache::get( 'main' );
+               if ( $fcache instanceof BloomCacheRedis ) {
+                       $fcache->delete( "unit-testing-" . self::$suffix );
+               }
+       }
+}
diff --git a/tests/phpunit/includes/changes/EnhancedChangesListTest.php b/tests/phpunit/includes/changes/EnhancedChangesListTest.php
new file mode 100644 (file)
index 0000000..7a82680
--- /dev/null
@@ -0,0 +1,132 @@
+<?php
+
+/**
+ * @covers EnhancedChangesList
+ *
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class EnhancedChangesListTest extends MediaWikiLangTestCase {
+
+       /**
+        * @var TestRecentChangesHelper
+        */
+       private $testRecentChangesHelper;
+
+       public function __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->testRecentChangesHelper = new TestRecentChangesHelper();
+       }
+
+       public function testBeginRecentChangesList_styleModules() {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $enhancedChangesList->beginRecentChangesList();
+
+               $styleModules = $enhancedChangesList->getOutput()->getModuleStyles();
+
+               $this->assertContains(
+                       'mediawiki.special.changeslist',
+                       $styleModules,
+                       'has mediawiki.special.changeslist'
+               );
+
+               $this->assertContains(
+                       'mediawiki.special.changeslist.enhanced',
+                       $styleModules,
+                       'has mediawiki.special.changeslist.enhanced'
+               );
+       }
+
+       public function testBeginRecentChangesList_jsModules() {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $enhancedChangesList->beginRecentChangesList();
+
+               $modules = $enhancedChangesList->getOutput()->getModules();
+
+               $this->assertContains( 'jquery.makeCollapsible', $modules, 'has jquery.makeCollapsible' );
+               $this->assertContains( 'mediawiki.icon', $modules, 'has mediawiki.icon' );
+       }
+
+       public function testBeginRecentChangesList_html() {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $html = $enhancedChangesList->beginRecentChangesList();
+
+               $this->assertEquals( '<div class="mw-changeslist">', $html );
+       }
+
+       /**
+        * @todo more tests
+        */
+       public function testRecentChangesLine() {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $enhancedChangesList->beginRecentChangesList();
+
+               $recentChange = $this->getEditChange( '20131103092153' );
+               $html = $enhancedChangesList->recentChangesLine( $recentChange, false );
+
+               $this->assertInternalType( 'string', $html );
+
+               $recentChange2 = $this->getEditChange( '20131103092253' );
+               $html = $enhancedChangesList->recentChangesLine( $recentChange2, false );
+
+               $this->assertEquals( '', $html );
+       }
+
+       /**
+        * @todo more tests for actual formatting, this is more of a smoke test
+        */
+       public function testEndRecentChangesList() {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $enhancedChangesList->beginRecentChangesList();
+
+               $recentChange = $this->getEditChange( '20131103092153' );
+               $enhancedChangesList->recentChangesLine( $recentChange, false );
+
+               $recentChange2 = $this->getEditChange( '20131103092253' );
+               $enhancedChangesList->recentChangesLine( $recentChange2, false );
+
+               $html = $enhancedChangesList->endRecentChangesList();
+
+               preg_match_all( '/td class="mw-enhanced-rc-nested"/', $html, $matches );
+               $this->assertCount( 2, $matches[0] );
+       }
+
+       /**
+        * @return EnhancedChangesList
+        */
+       private function newEnhancedChangesList() {
+               $user = User::newFromId( 0 );
+               $context = $this->testRecentChangesHelper->getTestContext( $user );
+
+               return new EnhancedChangesList( $context );
+       }
+
+       /**
+        * @return RecentChange
+        */
+       private function getEditChange( $timestamp ) {
+               $user = $this->getTestUser();
+               $recentChange = $this->testRecentChangesHelper->makeEditRecentChange(
+                       $user, 'Cat', $timestamp, 5, 191, 190, 0, 0
+               );
+
+               return $recentChange;
+       }
+
+       /**
+        * @return User
+        */
+       private function getTestUser() {
+               $user = User::newFromName( 'TestRecentChangesUser' );
+
+               if ( !$user->getId() ) {
+                       $user->addToDatabase();
+               }
+
+               return $user;
+       }
+
+}
index 9783ae3..2ea9f33 100644 (file)
@@ -3,6 +3,10 @@
 /**
  * @covers OldChangesList
  *
+ * @todo add tests to cover article link, timestamp, character difference,
+ *       log entry, user tool links, direction marks, tags, rollback,
+ *       watching users, and date header.
+ *
  * @group Database
  *
  * @licence GNU GPL v2+
@@ -25,7 +29,8 @@ class OldChangesListTest extends MediaWikiLangTestCase {
                parent::setUp();
 
                $this->setMwGlobals( array(
-                       'wgArticlePath' => '/wiki/$1'
+                       'wgArticlePath' => '/wiki/$1',
+                       'wgLang' => Language::factory( 'qqx' )
                ) );
        }
 
@@ -68,16 +73,13 @@ class OldChangesListTest extends MediaWikiLangTestCase {
 
        public function testRecentChangesLine_LogTitle() {
                $oldChangesList = $this->getOldChangesList();
-               $recentChange = $this->getLogChange( 'delete' );
+               $recentChange = $this->getLogChange( 'delete', 'delete' );
 
                $line = $oldChangesList->recentChangesLine( $recentChange, false, 1 );
 
-               $message = new Message( 'dellogpage' );
-               $expectedLinkText = $message->inLanguage( 'en' )->text();
-
                $this->assertRegExp( '/href="\/wiki\/Special:Log\/delete/', $line, 'link has href attribute' );
                $this->assertRegExp( '/title="Special:Log\/delete/', $line, 'link has title attribute' );
-               $this->assertRegExp( "/$expectedLinkText/", $line, 'link text' );
+               $this->assertRegExp( "/dellogpage/", $line, 'link text' );
        }
 
        public function testRecentChangesLine_DiffHistLinks() {
@@ -100,21 +102,51 @@ class OldChangesListTest extends MediaWikiLangTestCase {
                );
        }
 
+       public function testRecentChangesLine_Flags() {
+               $oldChangesList = $this->getOldChangesList();
+               $recentChange = $this->getNewBotEditChange();
+
+               $line = $oldChangesList->recentChangesLine( $recentChange, false, 1 );
+
+               $this->assertContains(
+                       "<abbr class='newpage' title='(recentchanges-label-newpage)'>(newpageletter)</abbr>",
+                       $line,
+                       'new page flag'
+               );
+
+               $this->assertContains(
+                       "<abbr class='botedit' title='(recentchanges-label-bot)'>(boteditletter)</abbr>",
+                       $line,
+                       'bot flag'
+               );
+       }
+
+       public function testRecentChangesLine_Tags() {
+               $recentChange = $this->getEditChange();
+               $recentChange->mAttribs['ts_tags'] = 'vandalism,newbie';
+
+               $oldChangesList = $this->getOldChangesList();
+               $line = $oldChangesList->recentChangesLine( $recentChange, false, 1 );
+
+               $this->assertRegExp( '/<li class="[\w\s-]*mw-tag-vandalism[\w\s-]*">/', $line );
+               $this->assertRegExp( '/<li class="[\w\s-]*mw-tag-newbie[\w\s-]*">/', $line );
+       }
+
        private function getNewBotEditChange() {
                $user = $this->getTestUser();
 
                $recentChange = $this->testRecentChangesHelper->makeNewBotEditRecentChange(
-                       $user, 'Abc', '20131103212153', 0, 0
+                       $user, 'Abc', '20131103212153', 5, 191, 190, 0, 0
                );
 
                return $recentChange;
        }
 
-       private function getLogChange( $logType ) {
+       private function getLogChange( $logType, $logAction ) {
                $user = $this->getTestUser();
 
                $recentChange = $this->testRecentChangesHelper->makeLogRecentChange(
-                       $logType, $user, 'Abc', '20131103212153', 0, 0
+                       $logType, $logAction, $user, 'Abc', '20131103212153', 0, 0
                );
 
                return $recentChange;
@@ -147,9 +179,7 @@ class OldChangesListTest extends MediaWikiLangTestCase {
        private function getContext() {
                $user = $this->getTestUser();
                $context = $this->testRecentChangesHelper->getTestContext( $user );
-
-               $title = Title::newFromText( 'RecentChanges', NS_SPECIAL );
-               $context->setTitle( $title );
+               $context->setLanguage( Language::factory( 'qqx' ) );
 
                return $context;
        }
index c3b8ce6..ee1a4d0 100644 (file)
@@ -123,6 +123,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                                $this->getContext(),
                                $this->getMessages(),
                                $this->testRecentChangesHelper->makeLogRecentChange(
+                                       'delete',
                                        'delete',
                                        $this->getTestUser(),
                                        'Abc',
index bb6ebec..ad64327 100644 (file)
@@ -26,7 +26,7 @@ class TestRecentChangesHelper {
                return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
        }
 
-       public function makeLogRecentChange( $logType, User $user, $titleText, $timestamp, $counter,
+       public function makeLogRecentChange( $logType, $logAction, User $user, $titleText, $timestamp, $counter,
                $watchingUsers
        ) {
                $attribs = array_merge(
@@ -42,7 +42,7 @@ class TestRecentChangesHelper {
                                'rc_type' => 3,
                                'rc_logid' => 25,
                                'rc_log_type' => $logType,
-                               'rc_log_action' => $logType,
+                               'rc_log_action' => $logAction,
                                'rc_source' => 'mw.log'
                        )
                );
@@ -129,6 +129,9 @@ class TestRecentChangesHelper {
 
                $context->setUser( $user );
 
+               $title = Title::newFromText( 'RecentChanges', NS_SPECIAL );
+               $context->setTitle( $title );
+
                return $context;
        }
 }
index 7080b02..70b9e68 100644 (file)
@@ -2,7 +2,55 @@
 
 class GlobalVarConfigTest extends MediaWikiTestCase {
 
-       public function provideGet() {
+       /**
+        * @covers GlobalVarConfig::newInstance
+        */
+       public function testNewInstance() {
+               $config = GlobalVarConfig::newInstance();
+               $this->assertInstanceOf( 'GlobalVarConfig', $config );
+               $this->maybeStashGlobal( 'wgBaz' );
+               $GLOBALS['wgBaz'] = 'somevalue';
+               // Check prefix is set to 'wg'
+               $this->assertEquals( 'somevalue', $config->get( 'Baz' ) );
+       }
+
+       /**
+        * @covers GlobalVarConfig::__construct
+        * @dataProvider provideConstructor
+        */
+       public function testConstructor( $prefix ) {
+               $var = $prefix . 'GlobalVarConfigTest';
+               $rand = wfRandomString();
+               $this->maybeStashGlobal( $var );
+               $GLOBALS[$var] = $rand;
+               $config = new GlobalVarConfig( $prefix );
+               $this->assertInstanceOf( 'GlobalVarConfig', $config );
+               $this->assertEquals( $rand, $config->get( 'GlobalVarConfigTest' ) );
+       }
+
+       public static function provideConstructor() {
+               return array(
+                       array( 'wg' ),
+                       array( 'ef' ),
+                       array( 'smw' ),
+                       array( 'blahblahblahblah' ),
+                       array( '' ),
+               );
+       }
+
+       /**
+        * @covers GlobalVarConfig::has
+        */
+       public function testHas() {
+               $this->maybeStashGlobal( 'wgGlobalVarConfigTestHas' );
+               $GLOBALS['wgGlobalVarConfigTestHas'] = wfRandomString();
+               $this->maybeStashGlobal( 'wgGlobalVarConfigTestNotHas' );
+               $config = new GlobalVarConfig();
+               $this->assertTrue( $config->has( 'GlobalVarConfigTestHas' ) );
+               $this->assertFalse( $config->has( 'GlobalVarConfigTestNotHas' ) );
+       }
+
+       public static function provideGet() {
                $set = array(
                        'wgSomething' => 'default1',
                        'wgFoo' => 'default2',
@@ -19,6 +67,7 @@ class GlobalVarConfigTest extends MediaWikiTestCase {
                        array( 'Foo', 'wg', 'default2' ),
                        array( 'Variable', 'ef', 'default3' ),
                        array( 'BAR', '', 'default4' ),
+                       array( 'ThisGlobalWasNotSetAbove', 'wg', false )
                );
        }
 
@@ -28,9 +77,44 @@ class GlobalVarConfigTest extends MediaWikiTestCase {
         * @param string $expected
         * @dataProvider provideGet
         * @covers GlobalVarConfig::get
+        * @covers GlobalVarConfig::getWithPrefix
         */
        public function testGet( $name, $prefix, $expected ) {
                $config = new GlobalVarConfig( $prefix );
+               if ( $expected === false ) {
+                       $this->setExpectedException( 'ConfigException', 'GlobalVarConfig::get: undefined option:' );
+               }
                $this->assertEquals( $config->get( $name ), $expected );
        }
+
+       public static function provideSet() {
+               return array(
+                       array( 'Foo', 'wg', 'wgFoo' ),
+                       array( 'SomethingRandom', 'wg', 'wgSomethingRandom' ),
+                       array( 'FromAnExtension', 'eg', 'egFromAnExtension' ),
+                       array( 'NoPrefixHere', '', 'NoPrefixHere' ),
+               );
+       }
+
+       private function maybeStashGlobal( $var ) {
+               if ( array_key_exists( $var, $GLOBALS ) ) {
+                       // Will be reset after this test is over
+                       $this->stashMwGlobals( $var );
+               }
+       }
+
+       /**
+        * @dataProvider provideSet
+        * @covers GlobalVarConfig::set
+        * @covers GlobalVarConfig::setWithPrefix
+        */
+       public function testSet( $name, $prefix, $var ) {
+               $this->hideDeprecated( 'GlobalVarConfig::set' );
+               $this->maybeStashGlobal( $var );
+               $config = new GlobalVarConfig( $prefix );
+               $random = wfRandomString();
+               $config->set( $name, $random );
+               $this->assertArrayHasKey( $var, $GLOBALS );
+               $this->assertEquals( $random, $GLOBALS[$var] );
+       }
 }
diff --git a/tests/phpunit/includes/config/HashConfigTest.php b/tests/phpunit/includes/config/HashConfigTest.php
new file mode 100644 (file)
index 0000000..06973b0
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+class HashConfigTest extends MediaWikiTestCase {
+
+       /**
+        * @covers HashConfig::newInstance
+        */
+       public function testNewInstance() {
+               $conf = HashConfig::newInstance();
+               $this->assertInstanceOf( 'HashConfig', $conf );
+       }
+
+       /**
+        * @covers HashConfig::__construct
+        */
+       public function testConstructor() {
+               $conf = new HashConfig();
+               $this->assertInstanceOf( 'HashConfig', $conf );
+
+               // Test passing arguments to the constructor
+               $conf2 = new HashConfig( array(
+                       'one' => '1',
+               ) );
+               $this->assertEquals( '1', $conf2->get( 'one' ) );
+       }
+
+       /**
+        * @covers HashConfig::get
+        */
+       public function testGet() {
+               $conf = new HashConfig( array(
+                       'one' => '1',
+               ));
+               $this->assertEquals( '1', $conf->get( 'one' ) );
+               $this->setExpectedException( 'ConfigException', 'HashConfig::get: undefined option' );
+               $conf->get( 'two' );
+       }
+
+       /**
+        * @covers HashConfig::has
+        */
+       public function testHas() {
+               $conf = new HashConfig( array(
+                       'one' => '1',
+               ) );
+               $this->assertTrue( $conf->has( 'one' ) );
+               $this->assertFalse( $conf->has( 'two' ) );
+       }
+
+       /**
+        * @covers HashConfig::set
+        */
+       public function testSet() {
+               $conf = new HashConfig( array(
+                       'one' => '1',
+               ) );
+               $conf->set( 'two', '2' );
+               $this->assertEquals( '2', $conf->get( 'two' ) );
+               // Check that set overwrites
+               $conf->set( 'one', '3' );
+               $this->assertEquals( '3', $conf->get( 'one' ) );
+       }
+}
diff --git a/tests/phpunit/includes/config/MultiConfigTest.php b/tests/phpunit/includes/config/MultiConfigTest.php
new file mode 100644 (file)
index 0000000..158da46
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+class MultiConfigTest extends MediaWikiTestCase {
+
+       /**
+        * Tests that settings are fetched in the right order
+        *
+        * @covers MultiConfig::get
+        */
+       public function testGet() {
+               $multi = new MultiConfig( array(
+                       new HashConfig( array( 'foo' => 'bar' ) ),
+                       new HashConfig( array( 'foo' => 'baz', 'bar' => 'foo' ) ),
+                       new HashConfig( array( 'bar' => 'baz' ) ),
+               ) );
+
+               $this->assertEquals( 'bar', $multi->get( 'foo' ) );
+               $this->assertEquals( 'foo', $multi->get( 'bar' ) );
+               $this->setExpectedException( 'ConfigException', 'MultiConfig::get: undefined option:' );
+               $multi->get( 'notset' );
+       }
+
+       /**
+        * @covers MultiConfig::has
+        */
+       public function testHas() {
+               $conf = new MultiConfig( array(
+                       new HashConfig( array( 'foo' => 'foo' ) ),
+                       new HashConfig( array( 'something' => 'bleh' ) ),
+                       new HashConfig( array( 'meh' => 'eh' ) ),
+               ) );
+
+               $this->assertTrue( $conf->has( 'foo' ) );
+               $this->assertTrue( $conf->has( 'something' ) );
+               $this->assertTrue( $conf->has( 'meh' ) );
+               $this->assertFalse( $conf->has( 'what' ) );
+       }
+}
index abedc6c..1a90d6e 100644 (file)
@@ -317,6 +317,8 @@ class ContentHandlerTest extends MediaWikiTestCase {
         * page.
         */
        public function testGetAutosummary() {
+               $this->setMwGlobals( 'wgContLang', Language::factory( 'en' ) );
+
                $content = new DummyContentHandlerForTesting( CONTENT_MODEL_WIKITEXT );
                $title = Title::newFromText( 'Help:Test' );
                // Create a new content object with no content
@@ -448,7 +450,7 @@ class DummyContentForTesting extends AbstractContent {
         * Returns native represenation of the data. Interpretation depends on the data model used,
         * as given by getDataModel().
         *
-        * @return mixed the native representation of the content. Could be a string, a nested array
+        * @return mixed The native representation of the content. Could be a string, a nested array
         *  structure, an object, a binary blob... anything, really.
         */
        public function getNativeData() {
@@ -476,7 +478,7 @@ class DummyContentForTesting extends AbstractContent {
         * return $this. That is,  $copy === $original may be true, but only for imutable content
         * objects.
         *
-        * @return Content. A copy of this object.
+        * @return Content A copy of this object
         */
        public function copy() {
                return $this;
@@ -514,7 +516,7 @@ class DummyContentForTesting extends AbstractContent {
         *
         * @param Title $title Context title for parsing
         * @param int|null $revId Revision ID (for {{REVISIONID}})
-        * @param ParserOptions|null $options Parser options
+        * @param ParserOptions $options Parser options
         * @param bool $generateHtml Whether or not to generate HTML
         * @param ParserOutput &$output The output object to fill (reference).
         */
diff --git a/tests/phpunit/includes/content/JSONContentTest.php b/tests/phpunit/includes/content/JSONContentTest.php
deleted file mode 100644 (file)
index acfdc0e..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-/**
- * @author Adam Shorland
- * @covers JSONContent
- */
-class JSONContentTest extends MediaWikiLangTestCase {
-
-       /**
-        * @dataProvider provideValidConstruction
-        */
-       public function testValidConstruct( $text, $modelId, $isValid, $expected ) {
-               $obj = new JSONContent( $text, $modelId );
-               $this->assertEquals( $isValid, $obj->isValid() );
-               $this->assertEquals( $expected, $obj->getJsonData() );
-       }
-
-       public function provideValidConstruction() {
-               return array(
-                       array( 'foo', CONTENT_MODEL_JSON, false, null ),
-                       array( FormatJson::encode( array() ), CONTENT_MODEL_JSON, true, array() ),
-                       array( FormatJson::encode( array( 'foo' ) ), CONTENT_MODEL_JSON, true, array( 'foo' ) ),
-               );
-       }
-
-       /**
-        * @dataProvider provideDataToEncode
-        */
-       public function testBeautifyUsesFormatJson( $data ) {
-               $obj = new JSONContent( FormatJson::encode( $data ) );
-               $this->assertEquals( FormatJson::encode( $data, true ), $obj->beautifyJSON() );
-       }
-
-       public function provideDataToEncode() {
-               return array(
-                       array( array() ),
-                       array( array( 'foo' ) ),
-                       array( array( 'foo', 'bar' ) ),
-                       array( array( 'baz' => 'foo', 'bar' ) ),
-                       array( array( 'baz' => 1000, 'bar' ) ),
-               );
-       }
-
-       /**
-        * @dataProvider provideDataToEncode
-        */
-       public function testPreSaveTransform( $data ) {
-               $obj = new JSONContent( FormatJson::encode( $data ) );
-               $newObj = $obj->preSaveTransform( $this->getMockTitle(), $this->getMockUser(), $this->getMockParserOptions() );
-               $this->assertTrue( $newObj->equals( new JSONContent( FormatJson::encode( $data, true ) ) ) );
-       }
-
-       private function getMockTitle() {
-               return $this->getMockBuilder( 'Title' )
-                       ->disableOriginalConstructor()
-                       ->getMock();
-       }
-
-       private function getMockUser() {
-               return $this->getMockBuilder( 'User' )
-                       ->disableOriginalConstructor()
-                       ->getMock();
-       }
-       private function getMockParserOptions() {
-               return $this->getMockBuilder( 'ParserOptions' )
-                       ->disableOriginalConstructor()
-                       ->getMock();
-       }
-
-       /**
-        * @dataProvider provideDataAndParserText
-        */
-       public function testFillParserOutput( $data, $expected ) {
-               $obj = new JSONContent( FormatJson::encode( $data ) );
-               $parserOutput = $obj->getParserOutput( $this->getMockTitle(), null, null, true );
-               $this->assertInstanceOf( 'ParserOutput', $parserOutput );
-//             var_dump( $parserOutput->getText(), "\n" );
-               $this->assertEquals( $expected, $parserOutput->getText() );
-       }
-
-       public function provideDataAndParserText() {
-               return array(
-                       array(
-                               array(),
-                               '<table class="mw-json"><tbody></tbody></table>'
-                       ),
-                       array(
-                               array( 'foo' ),
-                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;foo&quot;</td></tr></tbody></table>'
-                       ),
-                       array(
-                               array( 'foo', 'bar' ),
-                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;foo&quot;</td></tr>' .
-                               "\n" .
-                               '<tr><th>1</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
-                       ),
-                       array(
-                               array( 'baz' => 'foo', 'bar' ),
-                               '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">&quot;foo&quot;</td></tr>' .
-                               "\n" .
-                               '<tr><th>0</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
-                       ),
-                       array(
-                               array( 'baz' => 1000, 'bar' ),
-                               '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">1000</td></tr>' .
-                               "\n" .
-                               '<tr><th>0</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
-                       ),
-                       array(
-                               array( '<script>alert("evil!")</script>'),
-                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;&lt;script&gt;alert(&quot;evil!&quot;)&lt;/script&gt;&quot;</td></tr></tbody></table>',
-                       ),
-               );
-       }
-}
diff --git a/tests/phpunit/includes/content/JsonContentTest.php b/tests/phpunit/includes/content/JsonContentTest.php
new file mode 100644 (file)
index 0000000..77b542f
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * @author Adam Shorland
+ * @covers JsonContent
+ */
+class JsonContentTest extends MediaWikiLangTestCase {
+
+       /**
+        * @dataProvider provideValidConstruction
+        */
+       public function testValidConstruct( $text, $modelId, $isValid, $expected ) {
+               $obj = new JsonContent( $text, $modelId );
+               $this->assertEquals( $isValid, $obj->isValid() );
+               $this->assertEquals( $expected, $obj->getJsonData() );
+       }
+
+       public static function provideValidConstruction() {
+               return array(
+                       array( 'foo', CONTENT_MODEL_JSON, false, null ),
+                       array( FormatJson::encode( array() ), CONTENT_MODEL_JSON, true, array() ),
+                       array( FormatJson::encode( array( 'foo' ) ), CONTENT_MODEL_JSON, true, array( 'foo' ) ),
+               );
+       }
+
+       /**
+        * @dataProvider provideDataToEncode
+        */
+       public function testBeautifyUsesFormatJson( $data ) {
+               $obj = new JsonContent( FormatJson::encode( $data ) );
+               $this->assertEquals( FormatJson::encode( $data, true ), $obj->beautifyJSON() );
+       }
+
+       public static function provideDataToEncode() {
+               return array(
+                       array( array() ),
+                       array( array( 'foo' ) ),
+                       array( array( 'foo', 'bar' ) ),
+                       array( array( 'baz' => 'foo', 'bar' ) ),
+                       array( array( 'baz' => 1000, 'bar' ) ),
+               );
+       }
+
+       /**
+        * @dataProvider provideDataToEncode
+        */
+       public function testPreSaveTransform( $data ) {
+               $obj = new JsonContent( FormatJson::encode( $data ) );
+               $newObj = $obj->preSaveTransform( $this->getMockTitle(), $this->getMockUser(), $this->getMockParserOptions() );
+               $this->assertTrue( $newObj->equals( new JsonContent( FormatJson::encode( $data, true ) ) ) );
+       }
+
+       private function getMockTitle() {
+               return $this->getMockBuilder( 'Title' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+       }
+
+       private function getMockUser() {
+               return $this->getMockBuilder( 'User' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+       }
+       private function getMockParserOptions() {
+               return $this->getMockBuilder( 'ParserOptions' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+       }
+
+       /**
+        * @dataProvider provideDataAndParserText
+        */
+       public function testFillParserOutput( $data, $expected ) {
+               $obj = new JsonContent( FormatJson::encode( $data ) );
+               $parserOutput = $obj->getParserOutput( $this->getMockTitle(), null, null, true );
+               $this->assertInstanceOf( 'ParserOutput', $parserOutput );
+               $this->assertEquals( $expected, $parserOutput->getText() );
+       }
+
+       public static function provideDataAndParserText() {
+               return array(
+                       array(
+                               array(),
+                               '<table class="mw-json"><tbody></tbody></table>'
+                       ),
+                       array(
+                               array( 'foo' ),
+                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;foo&quot;</td></tr></tbody></table>'
+                       ),
+                       array(
+                               array( 'foo', 'bar' ),
+                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;foo&quot;</td></tr>' .
+                               "\n" .
+                               '<tr><th>1</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
+                       ),
+                       array(
+                               array( 'baz' => 'foo', 'bar' ),
+                               '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">&quot;foo&quot;</td></tr>' .
+                               "\n" .
+                               '<tr><th>0</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
+                       ),
+                       array(
+                               array( 'baz' => 1000, 'bar' ),
+                               '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">1000</td></tr>' .
+                               "\n" .
+                               '<tr><th>0</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
+                       ),
+                       array(
+                               array( '<script>alert("evil!")</script>'),
+                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;&lt;script&gt;alert(&quot;evil!&quot;)&lt;/script&gt;&quot;</td></tr></tbody></table>',
+                       ),
+               );
+       }
+}
index bd4ae35..7becd6f 100644 (file)
@@ -361,6 +361,52 @@ just a test"
                $this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getContentHandler()->getModelID() );
        }
 
+       public function testRedirectParserOption() {
+               $title = Title::newFromText( 'testRedirectParserOption' );
+
+               // Set up hook and its reporting variables
+               $wikitext = null;
+               $redirectTarget = null;
+               $this->mergeMwGlobalArrayValue( 'wgHooks', array(
+                       'InternalParseBeforeLinks' => array(
+                               function ( &$parser, &$text, &$stripState ) use ( &$wikitext, &$redirectTarget ) {
+                                       $wikitext = $text;
+                                       $redirectTarget = $parser->getOptions()->getRedirectTarget();
+                               }
+                       )
+               ) );
+
+               // Test with non-redirect page
+               $wikitext = false;
+               $redirectTarget = false;
+               $content = $this->newContent( 'hello world.' );
+               $options = $content->getContentHandler()->makeParserOptions( 'canonical' );
+               $options->setRedirectTarget( $title );
+               $content->getParserOutput( $title, null, $options );
+               $this->assertEquals( 'hello world.', $wikitext,
+                       'Wikitext passed to hook was not as expected'
+               );
+               $this->assertEquals( null, $redirectTarget, 'Redirect seen in hook was not null' );
+               $this->assertEquals( $title, $options->getRedirectTarget(),
+                       'ParserOptions\' redirectTarget was changed'
+               );
+
+               // Test with a redirect page
+               $wikitext = false;
+               $redirectTarget = false;
+               $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(),
+                       'Redirect seen in hook was not the expected title'
+               );
+               $this->assertEquals( null, $options->getRedirectTarget(),
+                       'ParserOptions\' redirectTarget was changed'
+               );
+       }
+
        public static function dataEquals() {
                return array(
                        array( new WikitextContent( "hallo" ), null, false ),
index 1db6fae..98b4ca0 100644 (file)
@@ -162,6 +162,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                $this->assertEquals( "DROP INDEX foo -- dropping index",
                        $this->replaceVars( "DROP INDEX /*i*/foo ON /*_*/bar -- dropping index" )
                );
+               $this->assertEquals( "INSERT OR IGNORE INTO foo VALUES ('bar')",
+                       $this->replaceVars( "INSERT OR IGNORE INTO foo VALUES ('bar')" )
+               );
        }
 
        /**
index 4ff6165..447bf21 100644 (file)
@@ -115,7 +115,7 @@ abstract class ORMRowTest extends \MediaWikiTestCase {
 
        /**
         * @since 1.20
-        * @return array of IORMRow
+        * @return array Array of IORMRow
         */
        public function instanceProvider() {
                $instances = array();
index 17c6224..6e41de7 100644 (file)
@@ -103,7 +103,7 @@ class MWDebugTest extends MediaWikiTestCase {
                $this->assertInstanceOf( 'ApiResult', $result );
                $data = $result->getData();
 
-               $expectedKeys = array( 'mwVersion', 'phpVersion', 'gitRevision', 'gitBranch',
+               $expectedKeys = array( 'mwVersion', 'phpEngine', 'phpVersion', 'gitRevision', 'gitBranch',
                        'gitViewUrl', 'time', 'log', 'debugLog', 'queries', 'request', 'memory',
                        'memoryPeak', 'includes', 'profile', '_element' );
 
diff --git a/tests/phpunit/includes/deferred/DeferredUpdatesTest.php b/tests/phpunit/includes/deferred/DeferredUpdatesTest.php
new file mode 100644 (file)
index 0000000..5348c85
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+class DeferredUpdatesTest extends MediaWikiTestCase {
+
+       public function testDoUpdates() {
+               $updates = array(
+                       '1' => 'deferred update 1',
+                       '2' => 'deferred update 2',
+                       '3' => 'deferred update 3',
+                       '2-1' => 'deferred update 1 within deferred update 2',
+               );
+               DeferredUpdates::addCallableUpdate(
+                       function () use ( $updates ) {
+                               echo $updates['1'];
+                       }
+               );
+               DeferredUpdates::addCallableUpdate(
+                       function () use ( $updates ) {
+                               echo $updates['2'];
+                               DeferredUpdates::addCallableUpdate(
+                                       function () use ( $updates ) {
+                                               echo $updates['2-1'];
+                                       }
+                               );
+                       }
+               );
+               DeferredUpdates::addCallableUpdate(
+                       function () use ( $updates ) {
+                               echo $updates[3];
+                       }
+               );
+
+               $this->expectOutputString( implode( '', $updates ) );
+
+               DeferredUpdates::doUpdates();
+       }
+
+}
index e1a69e3..5474b96 100644 (file)
@@ -39,7 +39,7 @@ class DifferenceEngineTest extends MediaWikiTestCase {
        }
 
        /**
-        * @return int[] revision ids
+        * @return int[] Revision ids
         */
        protected function doEdits() {
                $title = $this->getTitle();
index c45de36..ef0f2a9 100644 (file)
@@ -87,7 +87,7 @@ class MWExceptionTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedReturn, $e->runHooks( $name, $args ) );
        }
 
-       public function provideRunHooks() {
+       public static function provideRunHooks() {
                return array(
                        array( null, null, null, null ),
                        array( array(), 'name', array(), null ),
@@ -134,7 +134,7 @@ class MWExceptionTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $e->isCommandLine() );
        }
 
-       public function provideIsCommandLine() {
+       public static function provideIsCommandLine() {
                return array(
                        array( false, null ),
                        array( true, true ),
@@ -155,7 +155,7 @@ class MWExceptionTest extends MediaWikiTestCase {
                        "The $exception_class exception should be JSON serializable, got false." );
        }
 
-       public function provideExceptionClasses() {
+       public static function provideExceptionClasses() {
                return array(
                        array( 'Exception' ),
                        array( 'MWException' ),
@@ -192,7 +192,7 @@ class MWExceptionTest extends MediaWikiTestCase {
        /**
         * Returns test cases: exception class, key name, gettype()
         */
-       public function provideJsonSerializedKeys() {
+       public static function provideJsonSerializedKeys() {
                $testCases = array();
                foreach ( array( 'Exception', 'MWException' ) as $exClass ) {
                        $exTests = array(
diff --git a/tests/phpunit/includes/htmlform/HTMLAutoCompleteSelectFieldTest.php b/tests/phpunit/includes/htmlform/HTMLAutoCompleteSelectFieldTest.php
new file mode 100644 (file)
index 0000000..2c7f50c
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Unit tests for HTMLAutoCompleteSelectField
+ *
+ * @covers HTMLAutoCompleteSelectField
+ */
+class HtmlAutoCompleteSelectFieldTest extends MediaWikiTestCase {
+
+       var $options = array(
+               'Bulgaria'     => 'BGR',
+               'Burkina Faso' => 'BFA',
+               'Burundi'      => 'BDI',
+       );
+
+       /**
+        * Verify that attempting to instantiate an HTMLAutoCompleteSelectField
+        * without providing any autocomplete options causes an exception to be
+        * thrown.
+        *
+        * @expectedException        MWException
+        * @expectedExceptionMessage called without any autocompletions
+        */
+       function testMissingAutocompletions() {
+               new HTMLAutoCompleteSelectField( array( 'fieldname' => 'Test' ) );
+       }
+
+       /**
+        * Verify that the autocomplete options are correctly encoded as
+        * the 'data-autocomplete' attribute of the field.
+        *
+        * @covers HTMLAutoCompleteSelectField::getAttributes
+        */
+       function testGetAttributes() {
+               $field = new HTMLAutoCompleteSelectField( array(
+                       'fieldname'    => 'Test',
+                       'autocomplete' => $this->options,
+               ) );
+
+               $attributes = $field->getAttributes( array() );
+               $this->assertEquals( array_keys( $this->options ),
+                       FormatJson::decode( $attributes['data-autocomplete'] ),
+                       "The 'data-autocomplete' attribute encodes autocomplete option keys as a JSON array."
+               );
+       }
+
+       /**
+        * Test that the optional select dropdown is included or excluded based on
+        * the presence or absence of the 'options' parameter.
+        */
+       function testOptionalSelectElement() {
+               $params = array(
+                       'fieldname'    => 'Test',
+                       'autocomplete' => $this->options,
+                       'options'      => $this->options,
+               );
+
+               $field = new HTMLAutoCompleteSelectField( $params );
+               $html = $field->getInputHTML( false );
+               $this->assertRegExp( '/select/', $html,
+                       "When the 'options' parameter is set, the HTML includes a <select>" );
+
+               unset( $params['options'] );
+               $field = new HTMLAutoCompleteSelectField( $params );
+               $html = $field->getInputHTML( false );
+               $this->assertNotRegExp( '/select/', $html,
+                       "When the 'options' parameter is not set, the HTML does not include a <select>" );
+       }
+}
diff --git a/tests/phpunit/includes/installer/DatabaseUpdaterTest.php b/tests/phpunit/includes/installer/DatabaseUpdaterTest.php
new file mode 100644 (file)
index 0000000..abff3e6
--- /dev/null
@@ -0,0 +1,279 @@
+<?php
+
+class DatabaseUpdaterTest extends MediaWikiTestCase {
+
+       public function testSetAppliedUpdates() {
+               $db = new FakeDatabase();
+               $dbu = new FakeDatabaseUpdater( $db );
+               $dbu->setAppliedUpdates( "test", array() );
+               $expected = "updatelist-test-" . time() . "0";
+               $actual = $db->lastInsertData['ul_key'];
+               $this->assertEquals( $expected, $actual, var_export( $db->lastInsertData, true ) );
+               $dbu->setAppliedUpdates( "test", array() );
+               $expected = "updatelist-test-" . time() . "1";
+               $actual = $db->lastInsertData['ul_key'];
+               $this->assertEquals( $expected, $actual, var_export( $db->lastInsertData, true ) );
+       }
+}
+
+class FakeDatabase extends DatabaseBase {
+       public $lastInsertTable;
+       public $lastInsertData;
+
+       function __construct() {
+       }
+
+       function clearFlag( $arg ) {
+       }
+
+       function setFlag( $arg ) {
+       }
+
+       public function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
+               $this->lastInsertTable = $table;
+               $this->lastInsertData = $a;
+       }
+
+       /**
+        * Get the type of the DBMS, as it appears in $wgDBtype.
+        *
+        * @return string
+        */
+       function getType() {
+               // TODO: Implement getType() method.
+       }
+
+       /**
+        * Open a connection to the database. Usually aborts on failure
+        *
+        * @param string $server Database server host
+        * @param string $user Database user name
+        * @param string $password Database user password
+        * @param string $dbName Database name
+        * @return bool
+        * @throws DBConnectionError
+        */
+       function open( $server, $user, $password, $dbName ) {
+               // TODO: Implement open() method.
+       }
+
+       /**
+        * Fetch the next row from the given result object, in object form.
+        * Fields can be retrieved with $row->fieldname, with fields acting like
+        * member variables.
+        * If no more rows are available, false is returned.
+        *
+        * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
+        * @return stdClass|bool
+        * @throws DBUnexpectedError Thrown if the database returns an error
+        */
+       function fetchObject( $res ) {
+               // TODO: Implement fetchObject() method.
+       }
+
+       /**
+        * Fetch the next row from the given result object, in associative array
+        * form. Fields are retrieved with $row['fieldname'].
+        * If no more rows are available, false is returned.
+        *
+        * @param ResultWrapper $res Result object as returned from DatabaseBase::query(), etc.
+        * @return array|bool
+        * @throws DBUnexpectedError Thrown if the database returns an error
+        */
+       function fetchRow( $res ) {
+               // TODO: Implement fetchRow() method.
+       }
+
+       /**
+        * Get the number of rows in a result object
+        *
+        * @param mixed $res A SQL result
+        * @return int
+        */
+       function numRows( $res ) {
+               // TODO: Implement numRows() method.
+       }
+
+       /**
+        * Get the number of fields in a result object
+        * @see http://www.php.net/mysql_num_fields
+        *
+        * @param mixed $res A SQL result
+        * @return int
+        */
+       function numFields( $res ) {
+               // TODO: Implement numFields() method.
+       }
+
+       /**
+        * Get a field name in a result object
+        * @see http://www.php.net/mysql_field_name
+        *
+        * @param mixed $res A SQL result
+        * @param int $n
+        * @return string
+        */
+       function fieldName( $res, $n ) {
+               // TODO: Implement fieldName() method.
+       }
+
+       /**
+        * Get the inserted value of an auto-increment row
+        *
+        * The value inserted should be fetched from nextSequenceValue()
+        *
+        * Example:
+        * $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
+        * $dbw->insert( 'page', array( 'page_id' => $id ) );
+        * $id = $dbw->insertId();
+        *
+        * @return int
+        */
+       function insertId() {
+               // TODO: Implement insertId() method.
+       }
+
+       /**
+        * Change the position of the cursor in a result object
+        * @see http://www.php.net/mysql_data_seek
+        *
+        * @param mixed $res A SQL result
+        * @param int $row
+        */
+       function dataSeek( $res, $row ) {
+               // TODO: Implement dataSeek() method.
+       }
+
+       /**
+        * Get the last error number
+        * @see http://www.php.net/mysql_errno
+        *
+        * @return int
+        */
+       function lastErrno() {
+               // TODO: Implement lastErrno() method.
+       }
+
+       /**
+        * Get a description of the last error
+        * @see http://www.php.net/mysql_error
+        *
+        * @return string
+        */
+       function lastError() {
+               // TODO: Implement lastError() method.
+       }
+
+       /**
+        * mysql_fetch_field() wrapper
+        * Returns false if the field doesn't exist
+        *
+        * @param string $table Table name
+        * @param string $field Field name
+        *
+        * @return Field
+        */
+       function fieldInfo( $table, $field ) {
+               // TODO: Implement fieldInfo() method.
+       }
+
+       /**
+        * Get information about an index into an object
+        * @param string $table Table name
+        * @param string $index Index name
+        * @param string $fname Calling function name
+        * @return mixed Database-specific index description class or false if the index does not exist
+        */
+       function indexInfo( $table, $index, $fname = __METHOD__ ) {
+               // TODO: Implement indexInfo() method.
+       }
+
+       /**
+        * Get the number of rows affected by the last write query
+        * @see http://www.php.net/mysql_affected_rows
+        *
+        * @return int
+        */
+       function affectedRows() {
+               // TODO: Implement affectedRows() method.
+       }
+
+       /**
+        * Wrapper for addslashes()
+        *
+        * @param string $s String to be slashed.
+        * @return string Slashed string.
+        */
+       function strencode( $s ) {
+               // TODO: Implement strencode() method.
+       }
+
+       /**
+        * Returns a wikitext link to the DB's website, e.g.,
+        *   return "[http://www.mysql.com/ MySQL]";
+        * Should at least contain plain text, if for some reason
+        * your database has no website.
+        *
+        * @return string Wikitext of a link to the server software's web site
+        */
+       function getSoftwareLink() {
+               // TODO: Implement getSoftwareLink() method.
+       }
+
+       /**
+        * A string describing the current software version, like from
+        * mysql_get_server_info().
+        *
+        * @return string Version information from the database server.
+        */
+       function getServerVersion() {
+               // TODO: Implement getServerVersion() method.
+       }
+
+       /**
+        * Closes underlying database connection
+        * @since 1.20
+        * @return bool Whether connection was closed successfully
+        */
+       protected function closeConnection() {
+               // TODO: Implement closeConnection() method.
+       }
+
+       /**
+        * The DBMS-dependent part of query()
+        *
+        * @param string $sql SQL query.
+        * @return ResultWrapper|bool Result object to feed to fetchObject,
+        *   fetchRow, ...; or false on failure
+        */
+       protected function doQuery( $sql ) {
+               // TODO: Implement doQuery() method.
+       }
+}
+
+class FakeDatabaseUpdater extends DatabaseUpdater {
+       function __construct( $db ) {
+               $this->db = $db;
+               self::$updateCounter = 0;
+       }
+
+       /**
+        * Get an array of updates to perform on the database. Should return a
+        * multi-dimensional array. The main key is the MediaWiki version (1.12,
+        * 1.13...) with the values being arrays of updates, identical to how
+        * updaters.inc did it (for now)
+        *
+        * @return array
+        */
+       protected function getCoreUpdateList() {
+               return array();
+       }
+
+       public function canUseNewUpdatelog() {
+               return true;
+       }
+
+       public function setAppliedUpdates( $version, $updates = array() ) {
+               parent::setAppliedUpdates( $version, $updates );
+       }
+}
diff --git a/tests/phpunit/includes/jobqueue/JobTest.php b/tests/phpunit/includes/jobqueue/JobTest.php
new file mode 100644 (file)
index 0000000..93069d2
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @author Adam Shorland
+ */
+class JobTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider provideTestToString
+        *
+        * @param Job $job
+        * @param string $expected
+        *
+        * @covers Job::toString
+        */
+       public function testToString( $job, $expected ) {
+               $this->assertEquals( $expected, $job->toString() );
+       }
+
+       public function provideTestToString() {
+               $mockToStringObj = $this->getMock( 'stdClass', array( '__toString' ) );
+               $mockToStringObj->expects( $this->any() )
+                       ->method( '__toString' )
+                       ->will( $this->returnValue( '{STRING_OBJ_VAL}' ) );
+
+               return array(
+                       array(
+                               $this->getMockJob( false ),
+                               'someCommand '
+                       ),
+                       array(
+                               $this->getMockJob( array( 'key' => 'val' ) ),
+                               'someCommand  key=val'
+                       ),
+                       array(
+                               $this->getMockJob( array( 'key' => array( 'inkey' => 'inval' ) ) ),
+                               'someCommand  key={"inkey":"inval"}'
+                       ),
+                       array(
+                               $this->getMockJob( array( 'val1' ) ),
+                               'someCommand  0=val1'
+                       ),
+                       array(
+                               $this->getMockJob( array( 'val1', 'val2' ) ),
+                               'someCommand  0=val1 1=val2'
+                       ),
+                       array(
+                               $this->getMockJob( array( new stdClass() ) ),
+                               'someCommand  0=object(stdClass)'
+                       ),
+                       array(
+                               $this->getMockJob( array( $mockToStringObj ) ),
+                               'someCommand  0={STRING_OBJ_VAL}'
+                       ),
+               );
+       }
+
+       public function getMockJob( $params ) {
+               $mock = $this->getMockForAbstractClass(
+                       'Job',
+                       array( 'someCommand', new Title(), $params ),
+                       'SomeJob'
+               );
+               return $mock;
+       }
+
+}
index bf58ee3..af68ab0 100644 (file)
@@ -123,6 +123,105 @@ class FormatJsonTest extends MediaWikiTestCase {
                );
        }
 
+       public static function provideParse() {
+               return array(
+                       array( null ),
+                       array( true ),
+                       array( false ),
+                       array( 0 ),
+                       array( 1 ),
+                       array( 1.2 ),
+                       array( '' ),
+                       array( 'str' ),
+                       array( array( 0, 1, 2 ) ),
+                       array( array( 'a' => 'b' ) ),
+                       array( array( 'a' => 'b' ) ),
+                       array( array( 'a' => 'b', 'x' => array( 'c' => 'd' ) ) ),
+               );
+       }
+
+       /**
+        * Recursively convert arrays into stdClass
+        * @param array|string|bool|int|float|null $value
+        * @return stdClass|string|bool|int|float|null
+        */
+       public static function toObject( $value ) {
+               return !is_array( $value ) ? $value : (object) array_map( __METHOD__, $value );
+       }
+
+       /**
+        * @dataProvider provideParse
+        * @param mixed $value
+        */
+       public function testParse( $value ) {
+               $expected = self::toObject( $value );
+               $json = FormatJson::encode( $expected, false, FormatJson::ALL_OK );
+               $this->assertJson( $json );
+
+               $st = FormatJson::parse( $json );
+               $this->assertType( 'Status', $st );
+               $this->assertTrue( $st->isGood() );
+               $this->assertEquals( $expected, $st->getValue() );
+
+               $st = FormatJson::parse( $json, FormatJson::FORCE_ASSOC );
+               $this->assertType( 'Status', $st );
+               $this->assertTrue( $st->isGood() );
+               $this->assertEquals( $value, $st->getValue() );
+       }
+
+       public static function provideParseTryFixing() {
+               return array(
+                       array( "[,]", '[]' ),
+                       array( "[ , ]", '[]' ),
+                       array( "[ , }", false ),
+                       array( '[1],', false ),
+                       array( "[1,]", '[1]' ),
+                       array( "[1\n,]", '[1]' ),
+                       array( "[1,\n]", '[1]' ),
+                       array( "[1,]\n", '[1]' ),
+                       array( "[1\n,\n]\n", '[1]' ),
+                       array( '["a,",]', '["a,"]' ),
+                       array( "[[1,]\n,[2,\n],[3\n,]]", '[[1],[2],[3]]' ),
+                       array( '[[1,],[2,],[3,]]', false ), // I wish we could parse this, but would need quote parsing
+                       array( '[1,,]', false ),
+               );
+       }
+
+       /**
+        * @dataProvider provideParseTryFixing
+        * @param string $value
+        * @param string|bool $expected
+        */
+       public function testParseTryFixing( $value, $expected ) {
+               $st = FormatJson::parse( $value, FormatJson::TRY_FIXING );
+               $this->assertType( 'Status', $st );
+               if ( $expected === false ) {
+                       $this->assertFalse( $st->isOK() );
+               } else {
+                       $this->assertFalse( $st->isGood() );
+                       $this->assertTrue( $st->isOK() );
+                       $val = FormatJson::encode( $st->getValue(), false, FormatJson::ALL_OK );
+                       $this->assertEquals( $expected, $val );
+               }
+       }
+
+       public static function provideParseErrors() {
+               return array(
+                       array( 'aaa' ),
+                       array( '{"j": 1 ] }' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideParseErrors
+        * @param mixed $value
+        */
+       public function testParseErrors( $value ) {
+               $st = FormatJson::parse( $value );
+               $this->assertType( 'Status', $st );
+               $this->assertFalse( $st->isOK() );
+       }
+
        /**
         * Generate a set of test cases for a particular combination of encoder options.
         *
diff --git a/tests/phpunit/includes/libs/CSSJanusTest.php b/tests/phpunit/includes/libs/CSSJanusTest.php
deleted file mode 100644 (file)
index 407f11a..0000000
+++ /dev/null
@@ -1,633 +0,0 @@
-<?php
-/**
- * Based on the test suite of the original Python
- * CSSJanus libary:
- * http://code.google.com/p/cssjanus/source/browse/trunk/cssjanus_test.py
- * Ported to PHP for ResourceLoader and has been extended since.
- *
- * @covers CSSJanus
- */
-class CSSJanusTest extends MediaWikiTestCase {
-       /**
-        * @dataProvider provideTransformCases
-        */
-       public function testTransform( $cssA, $cssB = null ) {
-
-               if ( $cssB ) {
-                       $transformedA = CSSJanus::transform( $cssA );
-                       $this->assertEquals( $transformedA, $cssB, 'Test A-B transformation' );
-
-                       $transformedB = CSSJanus::transform( $cssB );
-                       $this->assertEquals( $transformedB, $cssA, 'Test B-A transformation' );
-               } else {
-                       // If no B version is provided, it means
-                       // the output should equal the input.
-                       $transformedA = CSSJanus::transform( $cssA );
-                       $this->assertEquals( $transformedA, $cssA, 'Nothing was flipped' );
-               }
-       }
-
-       /**
-        * @dataProvider provideTransformAdvancedCases
-        */
-       public function testTransformAdvanced( $code, $expectedOutput, $options = array() ) {
-               $swapLtrRtlInURL = isset( $options['swapLtrRtlInURL'] ) ?
-                       $options['swapLtrRtlInURL'] : false;
-               $swapLeftRightInURL = isset( $options['swapLeftRightInURL'] ) ?
-                       $options['swapLeftRightInURL'] : false;
-
-               $flipped = CSSJanus::transform( $code, $swapLtrRtlInURL, $swapLeftRightInURL );
-
-               $this->assertEquals( $expectedOutput, $flipped,
-                       'Test flipping, options: url-ltr-rtl=' . ( $swapLtrRtlInURL ? 'true' : 'false' )
-                               . ' url-left-right=' . ( $swapLeftRightInURL ? 'true' : 'false' )
-               );
-       }
-
-       /**
-        * @dataProvider provideTransformBrokenCases
-        * @group Broken
-        */
-       public function testTransformBroken( $code, $expectedOutput ) {
-               $flipped = CSSJanus::transform( $code );
-
-               $this->assertEquals( $expectedOutput, $flipped, 'Test flipping' );
-       }
-
-       /**
-        * These transform cases are tested *in both directions*
-        * No need to declare a principle twice in both directions here.
-        */
-       public static function provideTransformCases() {
-               return array(
-                       // Property keys
-                       array(
-                               '.foo { left: 0; }',
-                               '.foo { right: 0; }'
-                       ),
-                       // Guard against partial keys
-                       // (CSS currently doesn't have flippable properties
-                       // that contain the direction as part of the key without
-                       // dash separation)
-                       array(
-                               '.foo { alright: 0; }'
-                       ),
-                       array(
-                               '.foo { balleft: 0; }'
-                       ),
-
-                       // Dashed property keys
-                       array(
-                               '.foo { padding-left: 0; }',
-                               '.foo { padding-right: 0; }'
-                       ),
-                       array(
-                               '.foo { margin-left: 0; }',
-                               '.foo { margin-right: 0; }'
-                       ),
-                       array(
-                               '.foo { border-left: 0; }',
-                               '.foo { border-right: 0; }'
-                       ),
-
-                       // Double-dashed property keys
-                       array(
-                               '.foo { border-left-color: red; }',
-                               '.foo { border-right-color: red; }'
-                       ),
-                       array(
-                               // Includes unknown properties?
-                               '.foo { x-left-y: 0; }',
-                               '.foo { x-right-y: 0; }'
-                       ),
-
-                       // Multi-value properties
-                       array(
-                               '.foo { padding: 0; }'
-                       ),
-                       array(
-                               '.foo { padding: 0 1px; }'
-                       ),
-                       array(
-                               '.foo { padding: 0 1px 2px; }'
-                       ),
-                       array(
-                               '.foo { padding: 0 1px 2px 3px; }',
-                               '.foo { padding: 0 3px 2px 1px; }'
-                       ),
-
-                       // Shorthand / Four notation
-                       array(
-                               '.foo { padding: .25em 15px 0pt 0ex; }',
-                               '.foo { padding: .25em 0ex 0pt 15px; }'
-                       ),
-                       array(
-                               '.foo { margin: 1px -4px 3px 2px; }',
-                               '.foo { margin: 1px 2px 3px -4px; }'
-                       ),
-                       array(
-                               '.foo { padding: 0 15px .25em 0; }',
-                               '.foo { padding: 0 0 .25em 15px; }'
-                       ),
-                       array(
-                               '.foo { padding: 1px 4.1grad 3px 2%; }',
-                               '.foo { padding: 1px 2% 3px 4.1grad; }'
-                       ),
-                       array(
-                               '.foo { padding: 1px 2px 3px auto; }',
-                               '.foo { padding: 1px auto 3px 2px; }'
-                       ),
-                       array(
-                               '.foo { padding: 1px inherit 3px auto; }',
-                               '.foo { padding: 1px auto 3px inherit; }'
-                       ),
-                       // border-radius assigns different meanings to the values
-                       array(
-                               '.foo { border-radius: .25em 15px 0pt 0ex; }',
-                               '.foo { border-radius: 15px .25em 0ex 0pt; }'
-                       ),
-                       array(
-                               '.foo { border-radius: 0px 0px 5px 5px; }',
-                       ),
-                       // Ensure the rule doesn't break other stuff
-                       array(
-                               '.foo { x-unknown: a b c d; }'
-                       ),
-                       array(
-                               '.foo barpx 0 2% { opacity: 0; }'
-                       ),
-                       array(
-                               '#settings td p strong'
-                       ),
-                       array(
-                               // Color names
-                               '.foo { border-color: red green blue white }',
-                               '.foo { border-color: red white blue green }',
-                       ),
-                       array(
-                               // Color name, hexdecimal, RGB & RGBA
-                               '.foo { border-color: red #f00 rgb(255, 0, 0) rgba(255, 0, 0, 0.5) }',
-                               '.foo { border-color: red rgba(255, 0, 0, 0.5) rgb(255, 0, 0) #f00 }',
-                       ),
-                       array(
-                               // Color name, hexdecimal, HSL & HSLA
-                               '.foo { border-color: red #f00 hsl(0, 100%, 50%) hsla(0, 100%, 50%, 0.5) }',
-                               '.foo { border-color: red hsla(0, 100%, 50%, 0.5) hsl(0, 100%, 50%) #f00 }',
-                       ),
-                       array(
-                               // Do not mangle 5 or more values
-                               '.foo { -x-unknown: 1 2 3 4 5; }'
-                       ),
-                       array(
-                               '.foo { -x-unknown: 1 2 3 4 5 6; }'
-                       ),
-
-                       // Shorthand / Three notation
-                       array(
-                               '.foo { margin: 1em 0 .25em; }'
-                       ),
-                       array(
-                               '.foo { margin:-1.5em 0 -.75em; }'
-                       ),
-
-                       // Shorthand / Two notation
-                       array(
-                               '.foo { padding: 1px 2px; }'
-                       ),
-
-                       // Shorthand / One notation
-                       array(
-                               '.foo { padding: 1px; }'
-                       ),
-
-                       // text-shadow and box-shadow
-                       array(
-                               '.foo { box-shadow: -6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
-                               '.foo { box-shadow: 6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
-                       ),
-                       array(
-                               '.foo { box-shadow: inset -6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
-                               '.foo { box-shadow: inset 6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
-                       ),
-                       array(
-                               '.foo { text-shadow: orange 2px 0; }',
-                               '.foo { text-shadow: orange -2px 0; }',
-                       ),
-                       array(
-                               '.foo { text-shadow: 2px 0 orange; }',
-                               '.foo { text-shadow: -2px 0 orange; }',
-                       ),
-                       array(
-                               // Don't mangle zeroes
-                               '.foo { text-shadow: orange 0 2px; }'
-                       ),
-                       array(
-                               // Make sure floats are not considered zero
-                               '.foo { box-shadow: inset .5em 0 0 white; }',
-                               '.foo { box-shadow: inset -.5em 0 0 white; }',
-                       ),
-
-                       // Direction
-                       // Note: This differs from the Python implementation,
-                       // see also CSSJanus::fixDirection for more info.
-                       array(
-                               '.foo { direction: ltr; }',
-                               '.foo { direction: rtl; }'
-                       ),
-                       array(
-                               '.foo { direction: rtl; }',
-                               '.foo { direction: ltr; }'
-                       ),
-                       array(
-                               'input { direction: ltr; }',
-                               'input { direction: rtl; }'
-                       ),
-                       array(
-                               'input { direction: rtl; }',
-                               'input { direction: ltr; }'
-                       ),
-                       array(
-                               'body { direction: ltr; }',
-                               'body { direction: rtl; }'
-                       ),
-                       array(
-                               '.foo, body, input { direction: ltr; }',
-                               '.foo, body, input { direction: rtl; }'
-                       ),
-                       array(
-                               'body { padding: 10px; direction: ltr; }',
-                               'body { padding: 10px; direction: rtl; }'
-                       ),
-                       array(
-                               'body { direction: ltr } .myClass { direction: ltr }',
-                               'body { direction: rtl } .myClass { direction: rtl }'
-                       ),
-
-                       // Left/right values
-                       array(
-                               '.foo { float: left; }',
-                               '.foo { float: right; }'
-                       ),
-                       array(
-                               '.foo { text-align: left; }',
-                               '.foo { text-align: right; }'
-                       ),
-                       array(
-                               '.foo { -x-unknown: left; }',
-                               '.foo { -x-unknown: right; }'
-                       ),
-                       // Guard against selectors that look flippable
-                       array(
-                               '.column-left { width: 0; }'
-                       ),
-                       array(
-                               'a.left { width: 0; }'
-                       ),
-                       array(
-                               'a.leftification { width: 0; }'
-                       ),
-                       array(
-                               'a.ltr { width: 0; }'
-                       ),
-                       array(
-                               # <div class="a-ltr png">
-                               '.a-ltr.png { width: 0; }'
-                       ),
-                       array(
-                               # <foo-ltr attr="x">
-                               'foo-ltr[attr="x"] { width: 0; }'
-                       ),
-                       array(
-                               'div.left > span.right+span.left { width: 0; }'
-                       ),
-                       array(
-                               '.thisclass .left .myclass { width: 0; }'
-                       ),
-                       array(
-                               '.thisclass .left .myclass #myid { width: 0; }'
-                       ),
-
-                       // Cursor values (east/west)
-                       array(
-                               '.foo { cursor: e-resize; }',
-                               '.foo { cursor: w-resize; }'
-                       ),
-                       array(
-                               '.foo { cursor: se-resize; }',
-                               '.foo { cursor: sw-resize; }'
-                       ),
-                       array(
-                               '.foo { cursor: ne-resize; }',
-                               '.foo { cursor: nw-resize; }'
-                       ),
-
-                       // Background
-                       array(
-                               '.foo { background-position: top left; }',
-                               '.foo { background-position: top right; }'
-                       ),
-                       array(
-                               '.foo { background: url(/foo/bar.png) top left; }',
-                               '.foo { background: url(/foo/bar.png) top right; }'
-                       ),
-                       array(
-                               '.foo { background: url(/foo/bar.png) top left no-repeat; }',
-                               '.foo { background: url(/foo/bar.png) top right no-repeat; }'
-                       ),
-                       array(
-                               '.foo { background: url(/foo/bar.png) no-repeat top left; }',
-                               '.foo { background: url(/foo/bar.png) no-repeat top right; }'
-                       ),
-                       array(
-                               '.foo { background: #fff url(/foo/bar.png) no-repeat top left; }',
-                               '.foo { background: #fff url(/foo/bar.png) no-repeat top right; }'
-                       ),
-                       array(
-                               '.foo { background-position: 100% 40%; }',
-                               '.foo { background-position: 0% 40%; }'
-                       ),
-                       array(
-                               '.foo { background-position: 23% 0; }',
-                               '.foo { background-position: 77% 0; }'
-                       ),
-                       array(
-                               '.foo { background-position: 23% auto; }',
-                               '.foo { background-position: 77% auto; }'
-                       ),
-                       array(
-                               '.foo { background-position-x: 23%; }',
-                               '.foo { background-position-x: 77%; }'
-                       ),
-                       array(
-                               '.foo { background-position-y: 23%; }',
-                               '.foo { background-position-y: 23%; }'
-                       ),
-                       array(
-                               '.foo { background:url(../foo.png) no-repeat 75% 50%; }',
-                               '.foo { background:url(../foo.png) no-repeat 25% 50%; }'
-                       ),
-                       array(
-                               '.foo { background: 10% 20% } .bar { background: 40% 30% }',
-                               '.foo { background: 90% 20% } .bar { background: 60% 30% }'
-                       ),
-
-                       // Multiple rules
-                       array(
-                               'body { direction: rtl; float: right; } .foo { direction: ltr; float: right; }',
-                               'body { direction: ltr; float: left; } .foo { direction: rtl; float: left; }',
-                       ),
-
-                       // Duplicate properties
-                       array(
-                               '.foo { float: left; float: right; float: left; }',
-                               '.foo { float: right; float: left; float: right; }',
-                       ),
-
-                       // Preserve comments
-                       array(
-                               '/* left /* right */left: 10px',
-                               '/* left /* right */right: 10px'
-                       ),
-                       array(
-                               '/*left*//*left*/left: 10px',
-                               '/*left*//*left*/right: 10px'
-                       ),
-                       array(
-                               '/* Going right is cool */ .foo { width: 0 }',
-                       ),
-                       array(
-                               "/* padding-right 1 2 3 4 */\n#test { width: 0}\n/*right*/"
-                       ),
-                       array(
-                               "/** Two line comment\n * left\n \*/\n#test {width: 0}"
-                       ),
-
-                       // @noflip annotation
-                       array(
-                               // before selector (single)
-                               '/* @noflip */ div { float: left; }'
-                       ),
-                       array(
-                               // before selector (multiple)
-                               '/* @noflip */ div, .notme { float: left; }'
-                       ),
-                       array(
-                               // inside selector
-                               'div, /* @noflip */ .foo { float: left; }'
-                       ),
-                       array(
-                               // after selector
-                               'div, .notme /* @noflip */ { float: left; }'
-                       ),
-                       array(
-                               // before multiple rules
-                               '/* @noflip */ div { float: left; } .foo { float: left; }',
-                               '/* @noflip */ div { float: left; } .foo { float: right; }'
-                       ),
-                       array(
-                               // support parentheses in selector
-                               '/* @noflip */ .test:not(:first) { margin-right: -0.25em; margin-left: 0.25em; }',
-                               '/* @noflip */ .test:not(:first) { margin-right: -0.25em; margin-left: 0.25em; }'
-                       ),
-                       array(
-                               // after multiple rules
-                               '.foo { float: left; } /* @noflip */ div { float: left; }',
-                               '.foo { float: right; } /* @noflip */ div { float: left; }'
-                       ),
-                       array(
-                               // before multiple properties
-                               'div { /* @noflip */ float: left; text-align: left; }',
-                               'div { /* @noflip */ float: left; text-align: right; }'
-                       ),
-                       array(
-                               // after multiple properties
-                               'div { float: left; /* @noflip */ text-align: left; }',
-                               'div { float: right; /* @noflip */ text-align: left; }'
-                       ),
-                       array(
-                               // before a *= attribute selector with multiple properties
-                               '/* @noflip */ div.foo[bar*=baz] { float:left; clear: left; }'
-                       ),
-                       array(
-                               // before a ^= attribute selector with multiple properties
-                               '/* @noflip */ div.foo[bar^=baz] { float:left; clear: left; }'
-                       ),
-                       array(
-                               // before a ~= attribute selector with multiple properties
-                               '/* @noflip */ div.foo[bar~=baz] { float:left; clear: left; }'
-                       ),
-                       array(
-                               // before a = attribute selector with multiple properties
-                               '/* @noflip */ div.foo[bar=baz] { float:left; clear: left; }'
-                       ),
-                       array(
-                               // before a quoted attribute selector with multiple properties
-                               '/* @noflip */ div.foo[bar=\'baz{quux\'] { float:left; clear: left; }'
-                       ),
-
-                       // Guard against css3 stuff
-                       array(
-                               'background-image: -moz-linear-gradient(#326cc1, #234e8c);'
-                       ),
-                       array(
-                               'background-image: -webkit-gradient(linear, 100% 0%, 0% 0%, from(#666666), to(#ffffff));'
-                       ),
-
-                       // CSS syntax / white-space variations
-                       // spaces, no spaces, tabs, new lines, omitting semi-colons
-                       array(
-                               ".foo { left: 0; }",
-                               ".foo { right: 0; }"
-                       ),
-                       array(
-                               ".foo{ left: 0; }",
-                               ".foo{ right: 0; }"
-                       ),
-                       array(
-                               ".foo{ left: 0 }",
-                               ".foo{ right: 0 }"
-                       ),
-                       array(
-                               ".foo{left:0 }",
-                               ".foo{right:0 }"
-                       ),
-                       array(
-                               ".foo{left:0}",
-                               ".foo{right:0}"
-                       ),
-                       array(
-                               ".foo  {  left : 0 ; }",
-                               ".foo  {  right : 0 ; }"
-                       ),
-                       array(
-                               ".foo\n  {  left : 0 ; }",
-                               ".foo\n  {  right : 0 ; }"
-                       ),
-                       array(
-                               ".foo\n  {  \nleft : 0 ; }",
-                               ".foo\n  {  \nright : 0 ; }"
-                       ),
-                       array(
-                               ".foo\n  { \n left : 0 ; }",
-                               ".foo\n  { \n right : 0 ; }"
-                       ),
-                       array(
-                               ".foo\n  { \n left\n  : 0; }",
-                               ".foo\n  { \n right\n  : 0; }"
-                       ),
-                       array(
-                               ".foo \n  { \n left\n  : 0; }",
-                               ".foo \n  { \n right\n  : 0; }"
-                       ),
-                       array(
-                               ".foo\n{\nleft\n:\n0;}",
-                               ".foo\n{\nright\n:\n0;}"
-                       ),
-                       array(
-                               ".foo\n.bar {\n\tleft: 0;\n}",
-                               ".foo\n.bar {\n\tright: 0;\n}"
-                       ),
-                       array(
-                               ".foo\t{\tleft\t:\t0;}",
-                               ".foo\t{\tright\t:\t0;}"
-                       ),
-
-                       // Guard against partial keys
-                       array(
-                               '.foo { leftxx: 0; }',
-                               '.foo { leftxx: 0; }'
-                       ),
-                       array(
-                               '.foo { rightxx: 0; }',
-                               '.foo { rightxx: 0; }'
-                       ),
-               );
-       }
-
-       /**
-        * These cases are tested in one way only (format: actual, expected, msg).
-        * If both ways can be tested, either put both versions in here or move
-        * it to provideTransformCases().
-        */
-       public static function provideTransformAdvancedCases() {
-               $bgPairs = array(
-                       # [ - _ . ] <-> [ left right ltr rtl ]
-                       'foo.jpg' => 'foo.jpg',
-                       'left.jpg' => 'right.jpg',
-                       'ltr.jpg' => 'rtl.jpg',
-
-                       'foo-left.png' => 'foo-right.png',
-                       'foo_left.png' => 'foo_right.png',
-                       'foo.left.png' => 'foo.right.png',
-
-                       'foo-ltr.png' => 'foo-rtl.png',
-                       'foo_ltr.png' => 'foo_rtl.png',
-                       'foo.ltr.png' => 'foo.rtl.png',
-
-                       'left-foo.png' => 'right-foo.png',
-                       'left_foo.png' => 'right_foo.png',
-                       'left.foo.png' => 'right.foo.png',
-
-                       'ltr-foo.png' => 'rtl-foo.png',
-                       'ltr_foo.png' => 'rtl_foo.png',
-                       'ltr.foo.png' => 'rtl.foo.png',
-
-                       'foo-ltr-left.gif' => 'foo-rtl-right.gif',
-                       'foo_ltr_left.gif' => 'foo_rtl_right.gif',
-                       'foo.ltr.left.gif' => 'foo.rtl.right.gif',
-                       'foo-ltr_left.gif' => 'foo-rtl_right.gif',
-                       'foo_ltr.left.gif' => 'foo_rtl.right.gif',
-               );
-               $provider = array();
-               foreach ( $bgPairs as $left => $right ) {
-                       # By default '-rtl' and '-left' etc. are not touched,
-                       # Only when the appropiate parameter is set.
-                       $provider[] = array(
-                               ".foo { background: url(images/$left); }",
-                               ".foo { background: url(images/$left); }"
-                       );
-                       $provider[] = array(
-                               ".foo { background: url(images/$right); }",
-                               ".foo { background: url(images/$right); }"
-                       );
-                       $provider[] = array(
-                               ".foo { background: url(images/$left); }",
-                               ".foo { background: url(images/$right); }",
-                               array(
-                                       'swapLtrRtlInURL' => true,
-                                       'swapLeftRightInURL' => true,
-                               )
-                       );
-                       $provider[] = array(
-                               ".foo { background: url(images/$right); }",
-                               ".foo { background: url(images/$left); }",
-                               array(
-                                       'swapLtrRtlInURL' => true,
-                                       'swapLeftRightInURL' => true,
-                               )
-                       );
-               }
-
-               return $provider;
-       }
-
-       /**
-        * Cases that are currently failing, but
-        * should be looked at in the future as enhancements and/or bug fix
-        */
-       public static function provideTransformBrokenCases() {
-               return array(
-                       // Guard against selectors that look flippable
-                       array(
-                               # <foo-left-x attr="x">
-                               'foo-left-x[attr="x"] { width: 0; }',
-                               'foo-left-x[attr="x"] { width: 0; }'
-                       ),
-                       array(
-                               # <div class="foo" data-left="x">
-                               '.foo[data-left="x"] { width: 0; }',
-                               '.foo[data-left="x"] { width: 0; }'
-                       ),
-               );
-       }
-}
index 2b4d60d..6fa3acf 100644 (file)
@@ -147,9 +147,12 @@ class CSSMinTest extends MediaWikiTestCase {
                // Full paths start with http://localhost/w/.
                // Timestamps in output are replaced with 'timestamp'.
 
-               // data: URIs for red.gif and green.gif
+               // data: URIs for red.gif, green.gif, circle.svg
                $red   = 'data:image/gif;base64,R0lGODlhAQABAIAAAP8AADAAACwAAAAAAQABAAACAkQBADs=';
                $green = 'data:image/gif;base64,R0lGODlhAQABAIAAAACAADAAACwAAAAAAQABAAACAkQBADs=';
+               $svg = 'data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A'
+                       . '%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';
 
                return array(
                        array(
@@ -202,6 +205,11 @@ class CSSMinTest extends MediaWikiTestCase {
                                'foo { /* @embed */ background: url(red.gif); }',
                                "foo { background: url($red); background: url(http://localhost/w/red.gif?timestamp)!ie; }",
                        ),
+                       array(
+                               'Embedded file, other comments before the rule',
+                               "foo { /* Bar. */ /* @embed */ background: url(red.gif); }",
+                               "foo { /* Bar. */ background: url($red); /* Bar. */ background: url(http://localhost/w/red.gif?timestamp)!ie; }",
+                       ),
                        array(
                                'Can not re-embed data: URIs',
                                "foo { /* @embed */ background: url($red); }",
@@ -228,6 +236,11 @@ class CSSMinTest extends MediaWikiTestCase {
                                'foo { /* @embed */ background: url(large.png); }',
                                "foo { background: url(http://localhost/w/large.png?timestamp); }",
                        ),
+                       array(
+                               'SVG files are embedded without base64 encoding and unnecessary IE 6 and 7 fallback',
+                               'foo { /* @embed */ background: url(circle.svg); }',
+                               "foo { background: url($svg); }",
+                       ),
                        array(
                                'Two regular files in one rule',
                                'foo { background: url(red.gif), url(green.gif); }',
index aaee512..d4e5214 100644 (file)
@@ -12,7 +12,7 @@ class IPSetTest extends MediaWikiTestCase {
         * config is an array constructor argument for IPSet, and the tests are
         * an array of IP => expected (boolean) result against the config dataset.
         */
-       public function provider() {
+       public static function provideIPSets() {
                return array(
                        array(
                                'old_list_subset',
@@ -240,7 +240,7 @@ class IPSetTest extends MediaWikiTestCase {
         * Validates IPSet loading and matching code
         *
         * @covers IPSet
-        * @dataProvider provider
+        * @dataProvider provideIPSets
         */
        public function testIPSet( $desc, array $cfg, array $tests ) {
                $ipset = new IPSet( $cfg );
index 334d5b5..f80f78d 100644 (file)
@@ -13,7 +13,7 @@ class MWMessagePackTest extends MediaWikiTestCase {
         * using <https://github.com/msgpack/msgpack-php>, which includes a
         * serialization function.
         */
-       public function provider() {
+       public static function providePacks() {
                $tests = array(
                        array( 'nil', null, 'c0' ),
                        array( 'bool', true, 'c3' ),
@@ -66,7 +66,7 @@ class MWMessagePackTest extends MediaWikiTestCase {
        /**
         * Verify that values are serialized correctly.
         * @covers MWMessagePack::pack
-        * @dataProvider provider
+        * @dataProvider providePacks
         */
        public function testPack( $type, $value, $expected ) {
                $actual = bin2hex( MWMessagePack::pack( $value ) );
diff --git a/tests/phpunit/includes/mail/MailAddressTest.php b/tests/phpunit/includes/mail/MailAddressTest.php
new file mode 100644 (file)
index 0000000..18d2acd
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+
+class MailAddressTest extends MediaWikiTestCase {
+
+       /**
+        * @covers MailAddress::__construct
+        */
+       public function testConstructor() {
+               $ma = new MailAddress( 'foo@bar.baz', 'UserName', 'Real name' );
+               $this->assertInstanceOf( 'MailAddress', $ma );
+       }
+
+       /**
+        * @covers MailAddress::newFromUser
+        */
+       public function testNewFromUser() {
+               if ( wfIsWindows() ) {
+                       $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' ) );
+
+               $ma = MailAddress::newFromUser( $user );
+               $this->assertInstanceOf( 'MailAddress', $ma );
+               $this->setMwGlobals( 'wgEnotifUseRealName', true );
+               $this->assertEquals( 'Real name <foo@bar.baz>', $ma->toString() );
+               $this->setMwGlobals( 'wgEnotifUseRealName', false );
+               $this->assertEquals( 'UserName <foo@bar.baz>', $ma->toString() );
+       }
+
+       /**
+        * @covers MailAddress::toString
+        * @dataProvider provideToString
+        */
+       public function testToString( $useRealName, $address, $name, $realName, $expected ) {
+               if ( wfIsWindows() ) {
+                       $this->markTestSkipped( 'This test only works on non-Windows platforms' );
+               }
+               $this->setMwGlobals( 'wgEnotifUseRealName', $useRealName );
+               $ma = new MailAddress( $address, $name, $realName );
+               $this->assertEquals( $expected, $ma->toString() );
+       }
+
+       public static function provideToString() {
+               return array(
+                       array( true, 'foo@bar.baz', 'FooBar', 'Foo Bar', 'Foo Bar <foo@bar.baz>' ),
+                       array( true, 'foo@bar.baz', 'UserName', null, 'UserName <foo@bar.baz>' ),
+                       array( true, 'foo@bar.baz', 'AUser', 'My real name', 'My real name <foo@bar.baz>' ),
+                       array( true, 'foo@bar.baz', 'A.user.name', 'my@real.name', '"my@real.name" <foo@bar.baz>' ),
+                       array( false, 'foo@bar.baz', 'AUserName', 'Some real name', 'AUserName <foo@bar.baz>' ),
+                       array( false, 'foo@bar.baz', '', '', 'foo@bar.baz' ),
+                       array( true, 'foo@bar.baz', '', '', 'foo@bar.baz' ),
+                       array( true, '', '', '', '' ),
+               );
+       }
+
+       /**
+        * @covers MailAddress::__toString
+        */
+       public function test__ToString() {
+               $ma = new MailAddress( 'some@email.com', 'UserName', 'A real name' );
+               $this->assertEquals( $ma->toString(), (string)$ma );
+       }
+}
diff --git a/tests/phpunit/includes/mail/UserMailerTest.php b/tests/phpunit/includes/mail/UserMailerTest.php
new file mode 100644 (file)
index 0000000..dca8aeb
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+class UserMailerTest extends MediaWikiLangTestCase {
+
+       /**
+        * @covers UserMailer::quotedPrintable
+        */
+       public function testQuotedPrintable() {
+               $this->assertEquals(
+                       "=?UTF-8?Q?=C4=88u=20legebla=3F?=",
+                       UserMailer::quotedPrintable( "\xc4\x88u legebla?", "UTF-8" ) );
+       }
+
+}
index 247e352..f0bd42a 100644 (file)
@@ -32,7 +32,7 @@ class ExifRotationTest extends MediaWikiMediaTestCase {
         * @dataProvider provideFiles
         */
        public function testMetadata( $name, $type, $info ) {
-               if ( !BitmapHandler::canRotate() ) {
+               if ( !$this->handler->canRotate() ) {
                        $this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
                }
                $file = $this->dataFile( $name, $type );
@@ -40,12 +40,29 @@ class ExifRotationTest extends MediaWikiMediaTestCase {
                $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
        }
 
+       /**
+        * Same as before, but with auto-rotation set to auto.
+        *
+        * This sets scaler to image magick, which we should detect as
+        * supporting rotation.
+        * @dataProvider provideFiles
+        */
+       public function testMetadataAutoRotate( $name, $type, $info ) {
+               $this->setMwGlobals( 'wgEnableAutoRotation', null );
+               $this->setMwGlobals( 'wgUseImageMagick', true );
+               $this->setMwGlobals( 'wgUseImageResize', true );
+
+               $file = $this->dataFile( $name, $type );
+               $this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
+               $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
+       }
+
        /**
         *
         * @dataProvider provideFiles
         */
        public function testRotationRendering( $name, $type, $info, $thumbs ) {
-               if ( !BitmapHandler::canRotate() ) {
+               if ( !$this->handler->canRotate() ) {
                        $this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
                }
                foreach ( $thumbs as $size => $out ) {
@@ -133,6 +150,19 @@ class ExifRotationTest extends MediaWikiMediaTestCase {
                $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
        }
 
+       /**
+        * Same as before, but with auto-rotation set to auto and an image scaler that doesn't support it.
+        * @dataProvider provideFilesNoAutoRotate
+        */
+       public function testMetadataAutoRotateUnsupported( $name, $type, $info ) {
+               $this->setMwGlobals( 'wgEnableAutoRotation', null );
+               $this->setMwGlobals( 'wgUseImageResize', false );
+
+               $file = $this->dataFile( $name, $type );
+               $this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
+               $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
+       }
+
        /**
         *
         * @dataProvider provideFilesNoAutoRotate
index 52a51cc..87ffd99 100644 (file)
@@ -116,7 +116,7 @@ class GIFHandlerTest extends MediaWikiMediaTestCase {
                $this->assertEquals( $expected, $actual );
        }
 
-       public function provideGetIndependentMetaArray() {
+       public static function provideGetIndependentMetaArray() {
                return array(
                        array( 'nonanimated.gif', array(
                                'GIFFileComment' => array(
index 8e56245..8f28158 100644 (file)
@@ -33,7 +33,7 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
        }
 
        /**
-        * @return Array Argument for FSRepo constructor
+        * @return array Argument for FSRepo constructor
         */
        protected function getRepoOptions() {
                return array(
@@ -47,7 +47,7 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
         * The result of this method will set the file path to use,
         * as well as the protected member $filePath
         *
-        * @return String path where files are
+        * @return string Path where files are
         */
        protected function getFilePath() {
                return __DIR__ . '/../../data/media/';
@@ -59,7 +59,7 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
         *
         * Override this method if your test case creates thumbnails
         *
-        * @return boolean
+        * @return bool
         */
        protected function createsThumbnails() {
                return false;
index 092be89..36872a7 100644 (file)
@@ -118,7 +118,7 @@ class PNGHandlerTest extends MediaWikiMediaTestCase {
                $this->assertEquals( $expected, $actual );
        }
 
-       public function provideGetIndependentMetaArray() {
+       public static function provideGetIndependentMetaArray() {
                return array(
                        array( 'rgb-na-png.png', array() ),
                        array( 'xmp.png',
index ab33d1c..0241aec 100644 (file)
@@ -6,11 +6,6 @@
  */
 class SVGMetadataExtractorTest extends MediaWikiTestCase {
 
-       protected function setUp() {
-               parent::setUp();
-               AutoLoader::loadClass( 'SVGMetadataExtractorTest' );
-       }
-
        /**
         * @dataProvider provideSvgFiles
         */
index 1361a92..8f7a0d6 100644 (file)
@@ -28,7 +28,7 @@ class SvgTest extends MediaWikiMediaTestCase {
                $this->assertEquals( $res, $expected );
        }
 
-       public function providerGetIndependentMetaArray() {
+       public static function providerGetIndependentMetaArray() {
                return array(
                        array( 'Tux.svg', array(
                                'ObjectName' => 'Tux',
index 97b76fe..f4b469b 100644 (file)
@@ -110,7 +110,7 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       public function provideAllBytes() {
+       public static function provideAllBytes() {
                return array(
                        array( '', '' ),
                        array( 'x', '' ),
index 160ddad..987b6e6 100644 (file)
@@ -23,9 +23,6 @@ class BagOStuffTest extends MediaWikiTestCase {
                $this->cache->delete( wfMemcKey( 'test' ) );
        }
 
-       protected function tearDown() {
-       }
-
        public function testMerge() {
                $key = wfMemcKey( 'test' );
 
index a450972..df891f5 100644 (file)
@@ -83,14 +83,28 @@ class MediaWikiParserTest {
                        . implode( ' ', $filesToTest ) );
 
                $suite = new PHPUnit_Framework_TestSuite;
+               $testList = array();
+               $counter = 0;
                foreach ( $filesToTest as $fileName ) {
-                       $testsName = basename( $fileName, '.txt' );
+                       // Call the highest level directory the extension name.
+                       // It may or may not actually be, but it should be close
+                       // enough to cause there to be separate names for different
+                       // things, which is good enough for our purposes.
+                       $extensionName = basename( dirname( $fileName ) );
+                       $testsName = $extensionName . '⁄' . basename( $fileName, '.txt' );
                        $escapedFileName = strtr( $fileName, array( "'" => "\\'", '\\' => '\\\\' ) );
-                       /* This used to be ucfirst( basename( dirname( $filename ) ) )
-                        * and then was ucfirst( basename( $filename, '.txt' )
-                        * but that didn't work with names like foo.tests.txt
-                        */
-                       $parserTestClassName = str_replace( '.', '_', ucfirst( $testsName ) );
+                       $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 );
+                       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
+                               // is a conflict, append a number.
+                               $counter++;
+                               $parserTestClassName .= $counter;
+                       }
+                       $testList[$parserTestClassName] = true;
                        $parserTestClassDefinition = <<<EOT
 /**
  * @group Database
index 4e8c11f..0df52f5 100644 (file)
@@ -353,6 +353,9 @@ class NewParserTest extends MediaWikiTestCase {
        /**
         * Set up the global variables for a consistent environment for each test.
         * Ideally this should replace the global configuration entirely.
+        * @param array $opts
+        * @param string $config
+        * @return RequestContext
         */
        protected function setupGlobals( $opts = array(), $config = '' ) {
                global $wgFileBackends;
@@ -754,7 +757,7 @@ class NewParserTest extends MediaWikiTestCase {
                                        $this->markTestSkipped( "SKIPPED: tidy extension is not installed.\n" );
                                } else {
                                        $out = MWTidy::tidy( $out );
-                                       $out = preg_replace( '/\s+$/', '', $out);
+                                       $out = preg_replace( '/\s+$/', '', $out );
                                }
                        }
 
@@ -872,6 +875,7 @@ class NewParserTest extends MediaWikiTestCase {
        /**
         * Get an input dictionary from a set of parser test files
         * @param array $filenames
+        * @return string
         */
        function getFuzzInput( $filenames ) {
                $dict = '';
@@ -890,6 +894,7 @@ class NewParserTest extends MediaWikiTestCase {
 
        /**
         * Get a memory usage breakdown
+        * @return array
         */
        function getMemoryBreakdown() {
                $memStats = array();
@@ -926,6 +931,7 @@ class NewParserTest extends MediaWikiTestCase {
        /**
         * Get a Parser object
         * @param Preprocessor $preprocessor
+        * @return Parser
         */
        function getParser( $preprocessor = null ) {
                global $wgParserConf;
@@ -986,6 +992,7 @@ class NewParserTest extends MediaWikiTestCase {
        /**
         * Remove last character if it is a newline
         * @param string $s
+        * @return string
         */
        public function removeEndingNewline( $s ) {
                if ( substr( $s, -1 ) === "\n" ) {
@@ -1070,6 +1077,7 @@ class NewParserTest extends MediaWikiTestCase {
         * @param string $key Name of option val to retrieve
         * @param array $opts Options array to look in
         * @param mixed $default Default value returned if not found
+        * @return mixed
         */
        protected static function getOptionValue( $key, $opts, $default ) {
                $key = strtolower( $key );
index cbf4803..1790086 100644 (file)
@@ -147,6 +147,41 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                        ),
                ), $out->getSections(), 'getSections() with proper value when <h2> is used' );
        }
+
+       /**
+        * @dataProvider provideNormalizeLinkUrl
+        * @covers Parser::normalizeLinkUrl
+        * @covers Parser::normalizeUrlComponent
+        */
+       public function testNormalizeLinkUrl( $explanation, $url, $expected ) {
+               $this->assertEquals( $expected, Parser::normalizeLinkUrl( $url ), $explanation );
+       }
+
+       public static function provideNormalizeLinkUrl() {
+               return array(
+                       array(
+                               'Escaping of unsafe characters',
+                               'http://example.org/foo bar?param[]="value"&param[]=valüe',
+                               'http://example.org/foo%20bar?param%5B%5D=%22value%22&param%5B%5D=val%C3%BCe',
+                       ),
+                       array(
+                               'Case normalization of percent-encoded characters',
+                               'http://example.org/%ab%cD%Ef%FF',
+                               'http://example.org/%AB%CD%EF%FF',
+                       ),
+                       array(
+                               'Unescaping of safe characters',
+                               'http://example.org/%3C%66%6f%6F%3E?%3C%66%6f%6F%3E#%3C%66%6f%6F%3E',
+                               'http://example.org/%3Cfoo%3E?%3Cfoo%3E#%3Cfoo%3E',
+                       ),
+                       array(
+                               'Context-sensitive replacement of sometimes-safe characters',
+                               'http://example.org/%23%2F%3F%26%3D%2B%3B?%23%2F%3F%26%3D%2B%3B#%23%2F%3F%26%3D%2B%3B',
+                               'http://example.org/%23%2F%3F&=+;?%23/?%26%3D%2B%3B#%23/?&=+;',
+                       ),
+               );
+       }
+
        // @todo Add tests for cleanSig() / cleanSigInSig(), getSection(),
        // replaceSection(), getPreloadText()
 }
index 12aac69..f656a74 100644 (file)
@@ -25,7 +25,25 @@ class TidyTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $text, $msg );
        }
 
-       public function provideTestWrapping() {
+       public static function provideTestWrapping() {
+               $testMathML = <<<'MathML'
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+    <mrow>
+      <mi>a</mi>
+      <mo>&InvisibleTimes;</mo>
+      <msup>
+        <mi>x</mi>
+        <mn>2</mn>
+      </msup>
+      <mo>+</mo>
+      <mi>b</mi>
+      <mo>&InvisibleTimes; </mo>
+      <mi>x</mi>
+      <mo>+</mo>
+      <mi>c</mi>
+    </mrow>
+  </math>
+MathML;
                return array(
                        array(
                                '<mw:editsection page="foo" section="bar">foo</mw:editsection>',
@@ -40,6 +58,7 @@ class TidyTest extends MediaWikiTestCase {
                        array( '<mw:toc>foo</mw:toc>', '<mw:toc>foo</mw:toc>', '<mw:toc> should survive tidy' ),
                        array( "<link foo=\"bar\" />\nfoo", '<link foo="bar"/>foo', '<link> should survive tidy' ),
                        array( "<meta foo=\"bar\" />\nfoo", '<meta foo="bar"/>foo', '<meta> should survive tidy' ),
+                       array( $testMathML, $testMathML, '<math> should survive tidy' ),
                );
        }
 }
index 4d5c78a..8ac419f 100644 (file)
@@ -11,7 +11,7 @@ class BcryptPasswordTestCase extends PasswordTestCase {
                ) );
        }
 
-       public function providePasswordTests() {
+       public static function providePasswordTests() {
                /** @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong */
                return array(
                        // Tests from glibc bcrypt implementation
index 03a742b..86e8270 100644 (file)
@@ -26,7 +26,7 @@ class LayeredParameterizedPasswordTest extends PasswordTestCase {
                );
        }
 
-       public function providePasswordTests() {
+       public static function providePasswordTests() {
                /** @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' ),
index 7820d53..78fc3ed 100644 (file)
@@ -51,8 +51,11 @@ abstract class PasswordTestCase extends MediaWikiTestCase {
         * parameter (a password) should match.
         *
         * @return array
+        * @abstract
         */
-       abstract public function providePasswordTests();
+       public static function providePasswordTests() {
+               throw new MWException( "Not implemented" );
+       }
 
        /**
         * @dataProvider providePasswordTests
index ae47120..091853e 100644 (file)
@@ -13,7 +13,7 @@ class Pbkdf2PasswordTest extends PasswordTestCase {
                ) );
        }
 
-       public function providePasswordTests() {
+       public static function providePasswordTests() {
                return array(
                        array( true, ":pbkdf2:sha1:1:20:c2FsdA==:DGDID5YfDnHzqbUkr2ASBi/gN6Y=", 'password' ),
                        array( true, ":pbkdf2:sha1:2:20:c2FsdA==:6mwBTcctb4zNHtkqzh1B8NjeiVc=", 'password' ),
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderLESSTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderLESSTest.php
deleted file mode 100644 (file)
index a3d73e5..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-class ResourceLoaderLESSTest extends MediaWikiTestCase {
-       public static function lessProvider() {
-               $result = array();
-               foreach ( glob( __DIR__ . '/fixtures/*.less' ) as $file ) {
-                       $result[] = array( $file );
-               }
-
-               return $result;
-       }
-
-       /**
-        * @dataProvider lessProvider
-        */
-       public function testLessFile( $lessFile ) {
-               $cssFile = substr( $lessFile, 0, -4 ) . 'css';
-               if ( !file_exists( $cssFile ) ) {
-                       $this->fail( "No css file found to assert equal to $lessFile" );
-                       return;
-               }
-
-               $expect = file_get_contents( $cssFile );
-               $content = file_get_contents( $lessFile );
-               $result = ResourceLoader::getLessCompiler( RequestContext::getMain()->getConfig() )
-                       ->compile( $content, $lessFile );
-               $this->assertEquals( $expect, $result );
-       }
-}
index 6ca4793..b0edaaf 100644 (file)
@@ -10,7 +10,7 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                SkinFactory::getDefaultInstance()->register(
                        'fakeskin',
                        'FakeSkin',
-                       function(){
+                       function () {
                        }
                );
        }
index 0c250bd..a189387 100644 (file)
@@ -9,10 +9,7 @@ class ResourceLoaderStartupModuleTest extends ResourceLoaderTestCase {
                                'modules' => array(),
                                'out' => '
 mw.loader.addSource( {
-    "local": {
-        "loadScript": "/w/load.php",
-        "apiScript": "/w/api.php"
-    }
+    "local": "/w/load.php"
 } );mw.loader.register( [] );'
                        ) ),
                        array( array(
@@ -22,10 +19,7 @@ mw.loader.addSource( {
                                ),
                                'out' => '
 mw.loader.addSource( {
-    "local": {
-        "loadScript": "/w/load.php",
-        "apiScript": "/w/api.php"
-    }
+    "local": "/w/load.php"
 } );mw.loader.register( [
     [
         "test.blank",
@@ -42,10 +36,7 @@ mw.loader.addSource( {
                                ),
                                'out' => '
 mw.loader.addSource( {
-    "local": {
-        "loadScript": "/w/load.php",
-        "apiScript": "/w/api.php"
-    }
+    "local": "/w/load.php"
 } );mw.loader.register( [
     [
         "test.blank",
@@ -73,10 +64,7 @@ mw.loader.addSource( {
                                ),
                                'out' => '
 mw.loader.addSource( {
-    "local": {
-        "loadScript": "/w/load.php",
-        "apiScript": "/w/api.php"
-    }
+    "local": "/w/load.php"
 } );mw.loader.register( [
     [
         "test.blank",
@@ -97,14 +85,8 @@ mw.loader.addSource( {
                                ),
                                'out' => '
 mw.loader.addSource( {
-    "local": {
-        "loadScript": "/w/load.php",
-        "apiScript": "/w/api.php"
-    },
-    "example": {
-        "loadScript": "http://example.org/w/load.php",
-        "apiScript": "http://example.org/w/api.php"
-    }
+    "local": "/w/load.php",
+    "example": "http://example.org/w/load.php"
 } );mw.loader.register( [
     [
         "test.blank",
@@ -140,10 +122,7 @@ mw.loader.addSource( {
                                ),
                                'out' => '
 mw.loader.addSource( {
-    "local": {
-        "loadScript": "/w/load.php",
-        "apiScript": "/w/api.php"
-    }
+    "local": "/w/load.php"
 } );mw.loader.register( [
     [
         "test.x.core",
@@ -238,14 +217,8 @@ mw.loader.addSource( {
                                ),
                                'out' => '
 mw.loader.addSource( {
-    "local": {
-        "loadScript": "/w/load.php",
-        "apiScript": "/w/api.php"
-    },
-    "example": {
-        "loadScript": "http://example.org/w/load.php",
-        "apiScript": "http://example.org/w/api.php"
-    }
+    "local": "/w/load.php",
+    "example": "http://example.org/w/load.php"
 } );mw.loader.register( [
     [
         "test.blank",
@@ -369,7 +342,7 @@ mw.loader.addSource( {
                $rl->register( $modules );
                $module = new ResourceLoaderStartUpModule();
                $this->assertEquals(
-'mw.loader.addSource({"local":{"loadScript":"/w/load.php","apiScript":"/w/api.php"}});'
+'mw.loader.addSource({"local":"/w/load.php"});'
 . 'mw.loader.register(['
 . '["test.blank","1388534400"],'
 . '["test.min","1388534400",["test.blank"],null,"local",'
@@ -390,10 +363,7 @@ mw.loader.addSource( {
                $module = new ResourceLoaderStartUpModule();
                $this->assertEquals(
 'mw.loader.addSource( {
-    "local": {
-        "loadScript": "/w/load.php",
-        "apiScript": "/w/api.php"
-    }
+    "local": "/w/load.php"
 } );mw.loader.register( [
     [
         "test.blank",
index bd6b3f2..7664d5b 100644 (file)
@@ -90,6 +90,47 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] );
        }
 
+       /**
+        * Strip @noflip annotations from CSS code.
+        * @param string $css
+        * @return string
+        */
+       private function stripNoflip( $css ) {
+               return str_replace( '/*@noflip*/ ', '', $css );
+       }
+
+       /**
+        * What happens when you mix @embed and @noflip?
+        * This really is an integration test, but oh well.
+        */
+       public function testMixedCssAnnotations(  ) {
+               $basePath = __DIR__ . '/../../data/css';
+               $testModule = new ResourceLoaderFileModule( array(
+                       'localBasePath' => $basePath,
+                       'styles' => array( 'test.css' ),
+               ) );
+               $expectedModule = new ResourceLoaderFileModule( array(
+                       'localBasePath' => $basePath,
+                       'styles' => array( 'expected.css' ),
+               ) );
+
+               $contextLtr = self::getResourceLoaderContext( 'en' );
+               $contextRtl = self::getResourceLoaderContext( 'he' );
+
+               // Since we want to compare the effect of @noflip+@embed against the effect of just @embed, and
+               // the @noflip annotations are always preserved, we need to strip them first.
+               $this->assertEquals(
+                       $expectedModule->getStyles( $contextLtr ),
+                       $this->stripNoflip( $testModule->getStyles( $contextLtr ) ),
+                       "/*@noflip*/ with /*@embed*/ gives correct results in LTR mode"
+               );
+               $this->assertEquals(
+                       $expectedModule->getStyles( $contextLtr ),
+                       $this->stripNoflip( $testModule->getStyles( $contextRtl ) ),
+                       "/*@noflip*/ with /*@embed*/ gives correct results in RTL mode"
+               );
+       }
+
        /**
         * @dataProvider providePackedModules
         * @covers ResourceLoader::makePackedModulesString
@@ -131,6 +172,43 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                );
        }
 
+       public static function provideAddSource() {
+               return array(
+                       array( 'examplewiki', '//example.org/w/load.php', 'examplewiki' ),
+                       array( 'example2wiki', array( 'loadScript' => '//example.com/w/load.php' ), 'example2wiki' ),
+                       array(
+                               array( 'foowiki' => '//foo.org/w/load.php', 'bazwiki' => '//baz.org/w/load.php' ),
+                               null,
+                               array( 'foowiki', 'bazwiki' )
+                       ),
+                       array(
+                               array( 'foowiki' => '//foo.org/w/load.php' ),
+                               null,
+                               false,
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideAddSource
+        * @covers ResourceLoader::addSource
+        */
+       public function testAddSource( $name, $info, $expected ) {
+               $rl = new ResourceLoader;
+               if ( $expected === false ) {
+                       $this->setExpectedException( 'MWException', 'ResourceLoader duplicate source addition error' );
+                       $rl->addSource( $name, $info );
+               }
+               $rl->addSource( $name, $info );
+               if ( is_array( $expected ) ) {
+                       foreach ( $expected as $source ) {
+                               $this->assertArrayHasKey( $source, $rl->getSources() );
+                       }
+               } else {
+                       $this->assertArrayHasKey( $expected, $rl->getSources() );
+               }
+       }
+
        public static function fakeSources() {
                return array(
                        'examplewiki' => array(
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
new file mode 100644 (file)
index 0000000..9dc1805
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
+
+       /**
+        * @covers ResourceLoaderWikiModule::isKnownEmpty
+        * @dataProvider provideIsKnownEmpty
+        */
+       public function testIsKnownEmpty( $titleInfo, $group, $expected ) {
+               $module = $this->getMockBuilder( 'ResourceLoaderWikiModuleTestModule' )
+                       ->setMethods( array( 'getTitleInfo', 'getGroup' ) )
+                       ->getMock();
+               $module->expects( $this->any() )
+                       ->method( 'getTitleInfo' )
+                       ->will( $this->returnValue( $titleInfo ) );
+               $module->expects( $this->any() )
+                       ->method( 'getGroup' )
+                       ->will( $this->returnValue( $group ) );
+               $context = $this->getMockBuilder( 'ResourceLoaderContext' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $this->assertEquals( $expected, $module->isKnownEmpty( $context ) );
+       }
+
+       public static function provideIsKnownEmpty() {
+               return array(
+                       // No valid pages
+                       array( array(), 'test1', true ),
+                       // 'site' module with a non-empty page
+                       array(
+                               array(
+                                       'MediaWiki:Common.js' => array(
+                                               'timestamp' => 123456789,
+                                               'length' => 1234
+                                       )
+                               ), 'site', false,
+                       ),
+                       // 'site' module with an empty page
+                       array(
+                               array(
+                                       'MediaWiki:Monobook.js' => array(
+                                               'timestamp' => 987654321,
+                                               'length' => 0,
+                                       ),
+                               ), 'site', false,
+                       ),
+                       // 'user' module with a non-empty page
+                       array(
+                               array(
+                                       'User:FooBar/common.js' => array(
+                                               'timestamp' => 246813579,
+                                               'length' => 25,
+                                       ),
+                               ), 'user', false,
+                       ),
+                       // 'user' module with an empty page
+                       array(
+                               array(
+                                       'User:FooBar/monobook.js' => array(
+                                               'timestamp' => 1357924680,
+                                               'length' => 0,
+                                       ),
+                               ), 'user', true,
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/resourceloader/fixtures/001-embeddable.css b/tests/phpunit/includes/resourceloader/fixtures/001-embeddable.css
deleted file mode 100644 (file)
index b291c5e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-.box {
-  content: not-embeddable;
-}
-.box {
-  content: embeddable;
-}
-.box {
-  content: embeddable;
-}
diff --git a/tests/phpunit/includes/resourceloader/fixtures/001-embeddable.less b/tests/phpunit/includes/resourceloader/fixtures/001-embeddable.less
deleted file mode 100644 (file)
index 7018aa2..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-@base: '../fixtures/';
-
-.helper(@url) when (embeddable(@url)) {
-       content: embeddable;
-}
-.helper(@url) when not (embeddable(@url)) {
-       content: not-embeddable;
-}
-
-.box {
-       .helper('path/to/nonexistent/file');
-}
-
-.box {
-       .helper('001-embeddable.css');
-}
-
-.box {
-       .helper("@{base}001-embeddable.css");
-}
index 3da1361..d0cbfa0 100644 (file)
@@ -14,8 +14,6 @@ class SearchEngineTest extends MediaWikiLangTestCase {
         */
        protected $search;
 
-       protected $pageList;
-
        /**
         * Checks for database type & version.
         * Will skip current test if DB does not support search.
@@ -37,10 +35,6 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        'wgSearchType' => $searchType
                ) );
 
-               if ( !isset( self::$pageList ) ) {
-                       $this->addPages();
-               }
-
                $this->search = new $searchType( $this->db );
        }
 
@@ -50,33 +44,32 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                parent::tearDown();
        }
 
-       protected function addPages() {
+       public function addDBData() {
                if ( !$this->isWikitextNS( NS_MAIN ) ) {
                        // @todo cover the case of non-wikitext content in the main namespace
                        return;
                }
 
-               $this->insertPage( "Not_Main_Page", "This is not a main page", 0 );
+               $this->insertPage( 'Not_Main_Page', 'This is not a main page' );
                $this->insertPage(
                        'Talk:Not_Main_Page',
-                       'This is not a talk page to the main page, see [[smithee]]',
-                       1
+                       'This is not a talk page to the main page, see [[smithee]]'
                );
-               $this->insertPage( 'Smithee', 'A smithee is one who smiths. See also [[Alan Smithee]]', 0 );
-               $this->insertPage( 'Talk:Smithee', 'This article sucks.', 1 );
-               $this->insertPage( 'Unrelated_page', 'Nothing in this page is about the S word.', 0 );
-               $this->insertPage( 'Another_page', 'This page also is unrelated.', 0 );
-               $this->insertPage( 'Help:Help', 'Help me!', 4 );
-               $this->insertPage( 'Thppt', 'Blah blah', 0 );
-               $this->insertPage( 'Alan_Smithee', 'yum', 0 );
-               $this->insertPage( 'Pages', 'are\'food', 0 );
-               $this->insertPage( 'HalfOneUp', 'AZ', 0 );
-               $this->insertPage( 'FullOneUp', 'AZ', 0 );
-               $this->insertPage( 'HalfTwoLow', 'az', 0 );
-               $this->insertPage( 'FullTwoLow', 'az', 0 );
-               $this->insertPage( 'HalfNumbers', '1234567890', 0 );
-               $this->insertPage( 'FullNumbers', '1234567890', 0 );
-               $this->insertPage( 'DomainName', 'example.com', 0 );
+               $this->insertPage( 'Smithee', 'A smithee is one who smiths. See also [[Alan Smithee]]' );
+               $this->insertPage( 'Talk:Smithee', 'This article sucks.' );
+               $this->insertPage( 'Unrelated_page', 'Nothing in this page is about the S word.' );
+               $this->insertPage( 'Another_page', 'This page also is unrelated.' );
+               $this->insertPage( 'Help:Help', 'Help me!' );
+               $this->insertPage( 'Thppt', 'Blah blah' );
+               $this->insertPage( 'Alan_Smithee', 'yum' );
+               $this->insertPage( 'Pages', 'are\'food' );
+               $this->insertPage( 'HalfOneUp', 'AZ' );
+               $this->insertPage( 'FullOneUp', 'AZ' );
+               $this->insertPage( 'HalfTwoLow', 'az' );
+               $this->insertPage( 'FullTwoLow', 'az' );
+               $this->insertPage( 'HalfNumbers', '1234567890' );
+               $this->insertPage( 'FullNumbers', '1234567890' );
+               $this->insertPage( 'DomainName', 'example.com' );
        }
 
        protected function fetchIds( $results ) {
@@ -101,30 +94,6 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                return $matches;
        }
 
-       /**
-        * Insert a new page
-        *
-        * @param string $pageName Page name
-        * @param string $text Page's content
-        * @param int $ns Unused
-        */
-       protected function insertPage( $pageName, $text, $ns ) {
-               $title = Title::newFromText( $pageName, $ns );
-
-               $user = User::newFromName( 'WikiSysop' );
-               $comment = 'Search Test';
-
-               // avoid memory leak...?
-               LinkCache::singleton()->clear();
-
-               $page = WikiPage::factory( $title );
-               $page->doEditContent( ContentHandler::makeContent( $text, $title ), $comment, 0, false, $user );
-
-               $this->pageList[] = array( $title, $page->getId() );
-
-               return true;
-       }
-
        public function testFullWidth() {
                $this->assertEquals(
                        array( 'FullOneUp', 'FullTwoLow', 'HalfOneUp', 'HalfTwoLow' ),
index 7b7c7f8..d3663c8 100644 (file)
@@ -35,4 +35,36 @@ class SkinFactoryTest extends MediaWikiTestCase {
                $this->setExpectedException( 'UnexpectedValueException' );
                $factory->makeSkin( 'unittest' );
        }
+
+       /**
+        * @covers SkinFactory::makeSkin
+        */
+       public function testMakeSkinWithValidCallback() {
+               $factory = new SkinFactory();
+               $factory->register( 'testfallback', 'TestFallback', function () {
+                       return new SkinFallback();
+               } );
+
+               $skin = $factory->makeSkin( 'testfallback' );
+               $this->assertInstanceOf( 'Skin', $skin );
+               $this->assertInstanceOf( 'SkinFallback', $skin );
+       }
+
+       /**
+        * @covers SkinFactory::getSkinNames
+        */
+       public function testGetSkinNames() {
+               $factory = new SkinFactory();
+               // A fake callback we can use that will never be called
+               $callback = function () {
+                       // NOP
+               };
+               $factory->register( 'skin1', 'Skin1', $callback );
+               $factory->register( 'skin2', 'Skin2', $callback );
+               $names = $factory->getSkinNames();
+               $this->assertArrayHasKey( 'skin1', $names );
+               $this->assertArrayHasKey( 'skin2', $names );
+               $this->assertEquals( 'Skin1', $names['skin1'] );
+               $this->assertEquals( 'Skin2', $names['skin2'] );
+       }
 }
diff --git a/tests/phpunit/includes/specialpage/SpecialPageFactoryTest.php b/tests/phpunit/includes/specialpage/SpecialPageFactoryTest.php
new file mode 100644 (file)
index 0000000..cb12273
--- /dev/null
@@ -0,0 +1,272 @@
+<?php
+/**
+ * Factory for handling the special page list and generating SpecialPage objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @covers SpecialPageFactory
+ * @group SpecialPage
+ */
+class SpecialPageFactoryTest extends MediaWikiTestCase {
+
+       protected function tearDown() {
+               parent::tearDown();
+
+               SpecialPageFactory::resetList();
+       }
+
+       public function testResetList() {
+               SpecialPageFactory::resetList();
+               $this->assertContains( 'Specialpages', SpecialPageFactory::getNames() );
+       }
+
+       public function testHookNotCalledTwice() {
+               $count = 0;
+               $this->mergeMwGlobalArrayValue( 'wgHooks', array(
+                       'SpecialPage_initList' => array(
+                               function () use ( &$count ) {
+                                       $count++;
+                               }
+               ) ) );
+               SpecialPageFactory::resetList();
+               SpecialPageFactory::getNames();
+               SpecialPageFactory::getNames();
+               $this->assertEquals( 1, $count );
+       }
+
+       public function newSpecialAllPages() {
+               return new SpecialAllPages();
+       }
+
+       public function specialPageProvider() {
+               return array(
+                       'class name' => array( 'SpecialAllPages', false ),
+                       'closure' => array( function () {
+                               return new SpecialAllPages();
+                       }, false ),
+                       'function' => array( array( $this, 'newSpecialAllPages' ), false ),
+               );
+       }
+
+       /**
+        * @covers SpecialPageFactory::getPage
+        * @dataProvider specialPageProvider
+        */
+       public function testGetPage( $spec, $shouldReuseInstance ) {
+               $this->mergeMwGlobalArrayValue( 'wgSpecialPages', array( 'testdummy' => $spec ) );
+               SpecialPageFactory::resetList();
+
+               $page = SpecialPageFactory::getPage( 'testdummy' );
+               $this->assertInstanceOf( 'SpecialPage', $page );
+
+               $page2 = SpecialPageFactory::getPage( 'testdummy' );
+               $this->assertEquals( $shouldReuseInstance, $page2 === $page, "Should re-use instance:" );
+       }
+
+       /**
+        * @covers SpecialPageFactory::getNames
+        */
+       public function testGetNames() {
+               $this->mergeMwGlobalArrayValue( 'wgSpecialPages', array( 'testdummy' => 'SpecialAllPages' ) );
+               SpecialPageFactory::resetList();
+
+               $names = SpecialPageFactory::getNames();
+               $this->assertInternalType( 'array', $names );
+               $this->assertContains( 'testdummy', $names );
+       }
+
+       /**
+        * @covers SpecialPageFactory::resolveAlias
+        */
+       public function testResolveAlias() {
+               $this->setMwGlobals( 'wgContLang', Language::factory( 'de' ) );
+               SpecialPageFactory::resetList();
+
+               list( $name, $param ) = SpecialPageFactory::resolveAlias( 'Spezialseiten/Foo' );
+               $this->assertEquals( 'Specialpages', $name );
+               $this->assertEquals( 'Foo', $param );
+       }
+
+       /**
+        * @covers SpecialPageFactory::getLocalNameFor
+        */
+       public function testGetLocalNameFor() {
+               $this->setMwGlobals( 'wgContLang', Language::factory( 'de' ) );
+               SpecialPageFactory::resetList();
+
+               $name = SpecialPageFactory::getLocalNameFor( 'Specialpages', 'Foo' );
+               $this->assertEquals( 'Spezialseiten/Foo', $name );
+       }
+
+       /**
+        * @covers SpecialPageFactory::getTitleForAlias
+        */
+       public function testGetTitleForAlias() {
+               $this->setMwGlobals( 'wgContLang', Language::factory( 'de' ) );
+               SpecialPageFactory::resetList();
+
+               $title = SpecialPageFactory::getTitleForAlias( 'Specialpages/Foo' );
+               $this->assertEquals( 'Spezialseiten/Foo', $title->getText() );
+               $this->assertEquals( NS_SPECIAL, $title->getNamespace() );
+       }
+
+       /**
+        * @dataProvider provideTestConflictResolution
+        */
+       public function testConflictResolution(
+               $test, $aliasesList, $alias, $expectedName, $expectedAlias, $expectWarnings
+       ) {
+               global $wgContLang;
+               $lang = clone $wgContLang;
+               $lang->mExtendedSpecialPageAliases = $aliasesList;
+               $this->setMwGlobals( 'wgContLang', $lang );
+               $this->setMwGlobals( 'wgSpecialPages',
+                       array_combine( array_keys( $aliasesList ), array_keys( $aliasesList ) )
+               );
+               SpecialPageFactory::resetList();
+
+               // Catch the warnings we expect to be raised
+               $warnings = array();
+               $this->setMwGlobals( 'wgDevelopmentWarnings', true );
+               set_error_handler( function ( $errno, $errstr ) use ( &$warnings ) {
+                       if ( preg_match( '/First alias \'[^\']*\' for .*/', $errstr ) ||
+                               preg_match( '/Did not find a usable alias for special page .*/', $errstr )
+                       ) {
+                               $warnings[] = $errstr;
+                               return true;
+                       }
+                       return false;
+               } );
+               $reset = new ScopedCallback( 'restore_error_handler' );
+
+               list( $name, /*...*/ ) = SpecialPageFactory::resolveAlias( $alias );
+               $this->assertEquals( $expectedName, $name, "$test: Alias to name" );
+               $result = SpecialPageFactory::getLocalNameFor( $name );
+               $this->assertEquals( $expectedAlias, $result, "$test: Alias to name to alias" );
+
+               $gotWarnings = count( $warnings );
+               if ( $gotWarnings !== $expectWarnings ) {
+                       $this->fail( "Expected $expectWarnings warning(s), but got $gotWarnings:\n" .
+                               join( "\n", $warnings )
+                       );
+               }
+       }
+
+       /**
+        * @dataProvider provideTestConflictResolution
+        */
+       public function testConflictResolutionReversed(
+               $test, $aliasesList, $alias, $expectedName, $expectedAlias, $expectWarnings
+       ) {
+               // Make sure order doesn't matter by reversing the list
+               $aliasesList = array_reverse( $aliasesList );
+               return $this->testConflictResolution(
+                       $test, $aliasesList, $alias, $expectedName, $expectedAlias, $expectWarnings
+               );
+       }
+
+       public function provideTestConflictResolution() {
+               return array(
+                       array(
+                               'Canonical name wins',
+                               array( 'Foo' => array( 'Foo', 'Bar' ), 'Baz' => array( 'Foo', 'BazPage', 'Baz2' ) ),
+                               'Foo',
+                               'Foo',
+                               'Foo',
+                               1,
+                       ),
+
+                       array(
+                               'Doesn\'t redirect to a different special page\'s canonical name',
+                               array( 'Foo' => array( 'Foo', 'Bar' ), 'Baz' => array( 'Foo', 'BazPage', 'Baz2' ) ),
+                               'Baz',
+                               'Baz',
+                               'BazPage',
+                               1,
+                       ),
+
+                       array(
+                               'Canonical name wins even if not aliased',
+                               array( 'Foo' => array( 'FooPage' ), 'Baz' => array( 'Foo', 'BazPage', 'Baz2' ) ),
+                               'Foo',
+                               'Foo',
+                               'FooPage',
+                               1,
+                       ),
+
+                       array(
+                               'Doesn\'t redirect to a different special page\'s canonical name even if not aliased',
+                               array( 'Foo' => array( 'FooPage' ), 'Baz' => array( 'Foo', 'BazPage', 'Baz2' ) ),
+                               'Baz',
+                               'Baz',
+                               'BazPage',
+                               1,
+                       ),
+
+                       array(
+                               'First local name beats non-first',
+                               array( 'First' => array( 'Foo' ), 'NonFirst' => array( 'Bar', 'Foo' ) ),
+                               'Foo',
+                               'First',
+                               'Foo',
+                               0,
+                       ),
+
+                       array(
+                               'Doesn\'t redirect to a different special page\'s first alias',
+                               array(
+                                       'Foo' => array( 'Foo' ),
+                                       'First' => array( 'Bar' ),
+                                       'Baz' => array( 'Foo', 'Bar', 'BazPage', 'Baz2' )
+                               ),
+                               'Baz',
+                               'Baz',
+                               'BazPage',
+                               1,
+                       ),
+
+                       array(
+                               'Doesn\'t redirect wrong even if all aliases conflict',
+                               array(
+                                       'Foo' => array( 'Foo' ),
+                                       'First' => array( 'Bar' ),
+                                       'Baz' => array( 'Foo', 'Bar' )
+                               ),
+                               'Baz',
+                               'Baz',
+                               'Baz',
+                               2,
+                       ),
+
+               );
+       }
+
+       public function testGetAliasListRecursion() {
+               $called = false;
+               $this->mergeMwGlobalArrayValue( 'wgHooks', array(
+                       'SpecialPage_initList' => array(
+                               function () use ( &$called ) {
+                                       SpecialPageFactory::getLocalNameFor( 'Specialpages' );
+                                       $called = true;
+                               }
+                       ),
+               ) );
+               SpecialPageFactory::resetList();
+               SpecialPageFactory::getLocalNameFor( 'Specialpages' );
+               $this->assertTrue( $called, 'Recursive call succeeded' );
+       }
+
+}
diff --git a/tests/phpunit/includes/specials/ImageListPagerTest.php b/tests/phpunit/includes/specials/ImageListPagerTest.php
new file mode 100644 (file)
index 0000000..22bdefd
--- /dev/null
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Test class for ImageListPagerTest class.
+ *
+ * Copyright © 2013, Antoine Musso
+ * Copyright © 2013, Siebrand Mazeland
+ * Copyright © 2013, Wikimedia Foundation Inc.
+ *
+ * @group Database
+ */
+
+class ImageListPagerTest extends MediaWikiTestCase {
+       /**
+        * @expectedException MWException
+        * @expectedExceptionMessage invalid_field
+        * @covers ImageListPager::formatValue
+        */
+       public function testFormatValuesThrowException() {
+               $page = new ImageListPager( RequestContext::getMain() );
+               $page->formatValue( 'invalid_field', 'invalid_value' );
+       }
+}
diff --git a/tests/phpunit/includes/specials/SpecialBooksourcesTest.php b/tests/phpunit/includes/specials/SpecialBooksourcesTest.php
new file mode 100644 (file)
index 0000000..d341ccf
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+class SpecialBooksourcesTest extends MediaWikiTestCase {
+       public static function provideISBNs() {
+               return array(
+                       array( '978-0-300-14424-6', true ),
+                       array( '0-14-020652-3', true ),
+                       array( '020652-3', false ),
+                       array( '9781234567897', true ),
+                       array( '1-4133-0454-0', true ),
+                       array( '978-1413304541', true ),
+                       array( '0136091814', true ),
+                       array( '0136091812', false ),
+                       array( '9780136091813', true ),
+                       array( '9780136091817', false ),
+                       array( '123456789X', true ),
+
+                       // Bug 67021
+                       array( '1413304541', false ),
+                       array( '141330454X', false ),
+                       array( '1413304540', true ),
+                       array( '14133X4540', false ),
+                       array( '97814133X4541', false ),
+                       array( '978035642615X', false ),
+                       array( '9781413304541', true ),
+                       array( '9780356426150', true ),
+               );
+       }
+
+       /**
+        * @covers SpecialBooksources::isValidISBN
+        * @dataProvider provideISBNs
+        */
+       public function testIsValidISBN( $isbn, $isValid ) {
+               $this->assertSame( $isValid, SpecialBooksources::isValidISBN( $isbn ) );
+       }
+}
diff --git a/tests/phpunit/includes/specials/SpecialListFilesTest.php b/tests/phpunit/includes/specials/SpecialListFilesTest.php
deleted file mode 100644 (file)
index c042064..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-/**
- * Test class for SpecialListFiles class.
- *
- * Copyright © 2013, Antoine Musso
- * Copyright © 2013, Siebrand Mazeland
- * Copyright © 2013, Wikimedia Foundation Inc.
- *
- */
-
-class SpecialListFilesTest extends MediaWikiTestCase {
-       /**
-        * @expectedException MWException
-        * @expectedExceptionMessage invalid_field
-        * @covers ImageListPager::formatValue
-        */
-       public function testFormatValuesThrowException() {
-               $page = new ImageListPager( RequestContext::getMain() );
-               $page->formatValue( 'invalid_field', 'invalid_value' );
-       }
-}
index bd95281..14d1968 100644 (file)
@@ -1,4 +1,8 @@
 <?php
+/**
+ * @group Database
+ */
+
 class SpecialMIMESearchTest extends MediaWikiTestCase {
 
        /** @var MIMESearchPage */
index fd09043..4dbfc41 100644 (file)
@@ -53,7 +53,7 @@ class SpecialMyLanguageTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $title );
        }
 
-       public function provideFindTitle() {
+       public static function provideFindTitle() {
                return array(
                        array( null, '::Fail', 'en', 'en' ),
                        array( 'Page/Another', 'Page/Another/en', 'en', 'en' ),
index 1f1d750..83489c6 100644 (file)
@@ -8,7 +8,6 @@
  */
 
 class SpecialSearchTest extends MediaWikiTestCase {
-       private $search;
 
        /**
         * @covers SpecialSearch::load
@@ -18,7 +17,8 @@ class SpecialSearchTest extends MediaWikiTestCase {
         * @param array $userOptions User options to test with. For example:
         *   array('searchNs5' => 1 );. Null to use default options.
         * @param string $expectedProfile An expected search profile name
-        * @param array $expectedNs Expected namespaces
+        * @param array $expectedNS Expected namespaces
+        * @param string $message
         */
        public function testProfileAndNamespaceLoading( $requested, $userOptions,
                $expectedProfile, $expectedNS, $message = 'Profile name and namespaces mismatches!'
@@ -96,6 +96,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
        /**
         * Helper to create a new User object with given options
         * User remains anonymous though
+        * @param array|null $opt
         */
        function newUserWithSearchNS( $opt = null ) {
                $u = User::newFromId( 0 );
index b13df89..4171c10 100644 (file)
@@ -24,6 +24,7 @@
  * @covers MediaWikiPageLinkRenderer
  *
  * @group Title
+ * @group Database
  */
 class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
 
@@ -52,7 +53,7 @@ class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
                return $genderCache;
        }
 
-       public function provideGetPageUrl() {
+       public static function provideGetPageUrl() {
                return array(
                        array(
                                new TitleValue( NS_MAIN, 'Foo_Bar' ),
@@ -85,7 +86,7 @@ class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
                $this->assertEquals( $url, $actual );
        }
 
-       public function provideRenderHtmlLink() {
+       public static function provideRenderHtmlLink() {
                return array(
                        array(
                                new TitleValue( NS_MAIN, 'Foo_Bar' ),
@@ -127,7 +128,7 @@ class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
                $this->assertRegExp( $pattern, $actual );
        }
 
-       public function provideRenderWikitextLink() {
+       public static function provideRenderWikitextLink() {
                return array(
                        array(
                                new TitleValue( NS_MAIN, 'Foo_Bar' ),
index bf06e3b..f95b305 100644 (file)
@@ -85,7 +85,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                return new MediaWikiTitleCodec( $lang, $gender );
        }
 
-       public function provideFormat() {
+       public static function provideFormat() {
                return array(
                        array( NS_MAIN, 'Foo_Bar', '', 'en', 'Foo Bar' ),
                        array( NS_USER, 'Hansi_Maier', 'stuff_and_so_on', 'en', 'User:Hansi Maier#stuff and so on' ),
@@ -129,7 +129,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                $this->assertEquals( $normalized, $actual2, 'normalized after round trip' );
        }
 
-       public function provideGetText() {
+       public static function provideGetText() {
                return array(
                        array( NS_MAIN, 'Foo_Bar', '', 'en', 'Foo Bar' ),
                        array( NS_USER, 'Hansi_Maier', 'stuff_and_so_on', 'en', 'Hansi Maier' ),
@@ -148,7 +148,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $actual );
        }
 
-       public function provideGetPrefixedText() {
+       public static function provideGetPrefixedText() {
                return array(
                        array( NS_MAIN, 'Foo_Bar', '', 'en', 'Foo Bar' ),
                        array( NS_USER, 'Hansi_Maier', 'stuff_and_so_on', 'en', 'User:Hansi Maier' ),
@@ -174,7 +174,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $actual );
        }
 
-       public function provideGetFullText() {
+       public static function provideGetFullText() {
                return array(
                        array( NS_MAIN, 'Foo_Bar', '', 'en', 'Foo Bar' ),
                        array( NS_USER, 'Hansi_Maier', 'stuff_and_so_on', 'en', 'User:Hansi Maier#stuff and so on' ),
@@ -196,7 +196,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $actual );
        }
 
-       public function provideParseTitle() {
+       public static function provideParseTitle() {
                //TODO: test capitalization and trimming
                //TODO: test unicode normalization
 
@@ -281,7 +281,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                $this->assertEquals( $title, $actual );
        }
 
-       public function provideParseTitle_invalid() {
+       public static function provideParseTitle_invalid() {
                //TODO: test unicode errors
 
                return array(
@@ -353,7 +353,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                $codec->parseTitle( $text, NS_MAIN );
        }
 
-       public function provideGetNamespaceName() {
+       public static function provideGetNamespaceName() {
                return array(
                        array( NS_MAIN, 'Foo', 'en', '' ),
                        array( NS_USER, 'Foo', 'en', 'User' ),
index 4f17601..f23b264 100644 (file)
@@ -9,21 +9,17 @@ class UploadBaseTest extends MediaWikiTestCase {
        protected $upload;
 
        protected function setUp() {
-               global $wgHooks;
                parent::setUp();
 
                $this->upload = new UploadTestHandler;
-               $this->hooks = $wgHooks;
-               $wgHooks['InterwikiLoadPrefix'][] = function ( $prefix, &$data ) {
-                       return false;
-               };
-       }
-
-       protected function tearDown() {
-               global $wgHooks;
-               $wgHooks = $this->hooks;
 
-               parent::tearDown();
+               $this->setMwGlobals( 'wgHooks', array(
+                       'InterwikiLoadPrefix' => array(
+                               function ( $prefix, &$data ) {
+                                       return false;
+                               }
+                       ),
+               ) );
        }
 
        /**
@@ -112,22 +108,246 @@ class UploadBaseTest extends MediaWikiTestCase {
         * This method should be abstracted so we can test different settings.
         */
        public function testMaxUploadSize() {
-               global $wgMaxUploadSize;
-               $savedGlobal = $wgMaxUploadSize; // save global
-               global $wgFileExtensions;
-               $wgFileExtensions[] = 'txt';
-
-               $wgMaxUploadSize = 100;
+               $this->setMwGlobals( array(
+                       'wgMaxUploadSize' => 100,
+                       'wgFileExtensions' => array(
+                               'txt',
+                       ),
+               ) );
 
-               $filename = $this->createFileOfSize( $wgMaxUploadSize );
+               $filename = $this->createFileOfSize( 100 );
                $this->upload->initializePathInfo( basename( $filename ) . '.txt', $filename, 100 );
                $result = $this->upload->verifyUpload();
                unlink( $filename );
 
                $this->assertEquals(
-                       array( 'status' => UploadBase::OK ), $result );
+                       array( 'status' => UploadBase::OK ),
+                       $result
+               );
+       }
+
+
+       /**
+        * @dataProvider provideCheckSvgScriptCallback
+        */
+       public function testCheckSvgScriptCallback( $svg, $wellFormed, $filterMatch, $message ) {
+               list( $formed, $match ) = $this->upload->checkSvgString( $svg );
+               $this->assertSame( $wellFormed, $formed, $message );
+               $this->assertSame( $filterMatch, $match, $message );
+       }
 
-               $wgMaxUploadSize = $savedGlobal; // restore global
+       public static function provideCheckSvgScriptCallback() {
+               return array(
+                       // html5sec SVG vectors
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"><script>alert(1)</script></svg>',
+                               true,
+                               true,
+                               'Script tag in svg (http://html5sec.org/#47)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:alert(1)"></g></svg>',
+                               true,
+                               true,
+                               'SVG with onload property (http://html5sec.org/#11)'
+                       ),
+                       array(
+                               '<svg onload="javascript:alert(1)" xmlns="http://www.w3.org/2000/svg"></svg>',
+                               true,
+                               true,
+                               'SVG with onload property (http://html5sec.org/#65)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <a xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="javascript:alert(1)"><rect width="1000" height="1000" fill="white"/></a> </svg>',
+                               true,
+                               true,
+                               'SVG with javascript xlink (http://html5sec.org/#87)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">  <animation xlink:href="javascript:alert(1)"/> </svg>',
+                               true,
+                               true,
+                               'SVG with Opera animation xlink (http://html5sec.org/#88 - a)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">  <animation xlink:href="data:text/xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' onload=\'alert(1)\'%3E%3C/svg%3E"/> </svg>',
+                               true,
+                               true,
+                               'SVG with Opera animation xlink (http://html5sec.org/#88 - b)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">  <image xlink:href="data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' onload=\'alert(1)\'%3E%3C/svg%3E"/> </svg>',
+                               true,
+                               true,
+                               'SVG with Opera image xlink (http://html5sec.org/#88 - c)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">  <foreignObject xlink:href="javascript:alert(1)"/> </svg>',
+                               true,
+                               true,
+                               'SVG with Opera foreignObject xlink (http://html5sec.org/#88 - d)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">  <foreignObject xlink:href="data:text/xml,%3Cscript xmlns=\'http://www.w3.org/1999/xhtml\'%3Ealert(1)%3C/script%3E"/> </svg>',
+                               true,
+                               true,
+                               'SVG with Opera foreignObject xlink (http://html5sec.org/#88 - e)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <set attributeName="onmouseover" to="alert(1)"/> </svg>',
+                               true,
+                               true,
+                               'SVG with event handler set (http://html5sec.org/#89 - a)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <animate attributeName="onunload" to="alert(1)"/> </svg>',
+                               true,
+                               true,
+                               'SVG with event handler animate (http://html5sec.org/#89 - a)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>',
+                               true,
+                               true,
+                               'SVG with element handler (http://html5sec.org/#94)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <feImage> <set attributeName="xlink:href" to="data:image/svg+xml;charset=utf-8;base64, PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxzY3JpcHQ%2BYWxlcnQoMSk8L3NjcmlwdD48L3N2Zz4NCg%3D%3D"/> </feImage> </svg>',
+                               true,
+                               true,
+                               'SVG with href to data: url (http://html5sec.org/#95)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" id="foo"> <x xmlns="http://www.w3.org/2001/xml-events" event="load" observer="foo" handler="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Chandler%20xml%3Aid%3D%22bar%22%20type%3D%22application%2Fecmascript%22%3E alert(1) %3C%2Fhandler%3E%0A%3C%2Fsvg%3E%0A#bar"/> </svg>',
+                               true,
+                               true,
+                               'SVG with Tiny handler (http://html5sec.org/#104)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <a id="x"><rect fill="white" width="1000" height="1000"/></a> <rect fill="white" style="clip-path:url(test3.svg#a);fill:url(#b);filter:url(#c);marker:url(#d);mask:url(#e);stroke:url(#f);"/> </svg>',
+                               true,
+                               true,
+                               'SVG with new CSS styles properties (http://html5sec.org/#109)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <a id="x"><rect fill="white" width="1000" height="1000"/></a> <rect clip-path="url(test3.svg#a)" /> </svg>',
+                               true,
+                               true,
+                               'SVG with new CSS styles properties as attributes'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <a id="x"> <rect fill="white" width="1000" height="1000"/> </a> <rect fill="url(http://html5sec.org/test3.svg#a)" /> </svg>',
+                               true,
+                               true,
+                               'SVG with new CSS styles properties as attributes (2)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <path d="M0,0" style="marker-start:url(test4.svg#a)"/> </svg>',
+                               true,
+                               true,
+                               'SVG with path marker-start (http://html5sec.org/#110)'
+                       ),
+                       array(
+                               '<?xml version="1.0"?> <?xml-stylesheet type="text/xml" href="#stylesheet"?> <!DOCTYPE doc [ <!ATTLIST xsl:stylesheet id ID #REQUIRED>]> <svg xmlns="http://www.w3.org/2000/svg"> <xsl:stylesheet id="stylesheet" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <iframe xmlns="http://www.w3.org/1999/xhtml" src="javascript:alert(1)"></iframe> </xsl:template> </xsl:stylesheet> <circle fill="red" r="40"></circle> </svg>',
+                               true,
+                               true,
+                               'SVG with embedded stylesheet (http://html5sec.org/#125)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" id="x"> <listener event="load" handler="#y" xmlns="http://www.w3.org/2001/xml-events" observer="x"/> <handler id="y">alert(1)</handler> </svg>',
+                               true,
+                               true,
+                               'SVG with handler attribute (http://html5sec.org/#127)'
+                       ),
+                       array(
+                               // Haven't found a browser that accepts this particular example, but we
+                               // don't want to allow embeded svgs, ever
+                               '<svg> <image style=\'filter:url("data:image/svg+xml;charset=utf-8;base64, PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxzY3JpcHQ/YWxlcnQoMSk8L3NjcmlwdD48L3N2Zz4NCg==")\' /> </svg>',
+                               true,
+                               true,
+                               'SVG with image filter via style (http://html5sec.org/#129)'
+                       ),
+                       array(
+                               // This doesn't seem possible without embedding the svg, but just in case
+                               '<svg> <a xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="?"> <circle r="400"></circle> <animate attributeName="xlink:href" begin="0" from="javascript:alert(1)" to="" /> </a></svg>',
+                               true,
+                               true,
+                               'SVG with animate from (http://html5sec.org/#137)'
+                       ),
+
+                       // Other hostile SVG's
+                       array(
+                               '<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:xlink="http://www.w3.org/1999/xlink"> <image xlink:href="https://upload.wikimedia.org/wikipedia/commons/3/34/Bahnstrecke_Zeitz-Camburg_1930.png" /> </svg>',
+                               true,
+                               true,
+                               'SVG with non-local image href (bug 65839)'
+                       ),
+                       array(
+                               '<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="/w/index.php?title=User:Jeeves/test.xsl&amp;action=raw&amp;format=xml" ?> <svg> <height>50</height> <width>100</width> </svg>',
+                               true,
+                               true,
+                               'SVG with remote stylesheet (bug 57550)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" viewbox="-1 -1 15 15"> <rect y="0" height="13" width="12" stroke="#179" rx="1" fill="#2ac"/> <text x="1.5" y="11" font-family="courier" stroke="white" font-size="16"><![CDATA[B]]></text> <iframe xmlns="http://www.w3.org/1999/xhtml" srcdoc="&#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x45;&#x44;&#x20;&#x3D;&#x3E;&#x20;&#x44;&#x6F;&#x6D;&#x61;&#x69;&#x6E;&#x28;&#x27;&#x2B;&#x74;&#x6F;&#x70;&#x2E;&#x64;&#x6F;&#x63;&#x75;&#x6D;&#x65;&#x6E;&#x74;&#x2E;&#x64;&#x6F;&#x6D;&#x61;&#x69;&#x6E;&#x2B;&#x27;&#x29;&#x27;&#x29;&#x3B;&#x3C;&#x2F;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;"></iframe> </svg>',
+                               true,
+                               true,
+                               'SVG with rembeded iframe (bug 60771)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" viewBox="6 3 177 153" xmlns:xlink="http://www.w3.org/1999/xlink"> <style>@import url("https://fonts.googleapis.com/css?family=Bitter:700&amp;text=WebPlatform.org");</style> <g transform="translate(-.5,-.5)"> <text fill="#474747" x="95" y="150" text-anchor="middle" font-family="Bitter" font-size="20" font-weight="bold">WebPlatform.org</text> </g> </svg>',
+                               true,
+                               true,
+                               'SVG with @import in style element (bug 69008)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" viewBox="6 3 177 153" xmlns:xlink="http://www.w3.org/1999/xlink"> <style>@import url("https://fonts.googleapis.com/css?family=Bitter:700&amp;text=WebPlatform.org");<foo/></style> <g transform="translate(-.5,-.5)"> <text fill="#474747" x="95" y="150" text-anchor="middle" font-family="Bitter" font-size="20" font-weight="bold">WebPlatform.org</text> </g> </svg>',
+                               true,
+                               true,
+                               'SVG with @import in style element and child element (bug 69008#c11)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <rect width="100" height="100" style="background-image:url(https://www.google.com/images/srpr/logo11w.png)"/> </svg>',
+                               true,
+                               true,
+                               'SVG with remote background image (bug 69008)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <rect width="100" height="100" style="background-image:\55rl(https://www.google.com/images/srpr/logo11w.png)"/> </svg>',
+                               true,
+                               true,
+                               'SVG with remote background image, encoded (bug 69008)'
+                       ),
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <style> #a { background-image:\55rl(\'https://www.google.com/images/srpr/logo11w.png\'); } </style> <rect width="100" height="100" id="a"/> </svg>',
+                               true,
+                               true,
+                               'SVG with remote background image, in style element (bug 69008)'
+                       ),
+                       array(
+                               // This currently doesn't seem to work in any browsers, but in case
+                               // http://www.w3.org/TR/css3-images/ is implemented for SVG files
+                               '<svg xmlns="http://www.w3.org/2000/svg"> <rect width="100" height="100" style="background-image:image(\'sprites.svg#xywh=40,0,20,20\')"/> </svg>',
+                               true,
+                               true,
+                               'SVG with remote background image using image() (bug 69008)'
+                       ),
+
+                       // Test good, but strange files that we want to allow
+                       array(
+                               '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g> <a xlink:href="http://en.wikipedia.org/wiki/Main_Page"> <path transform="translate(0,496)" id="path6706" d="m 112.09375,107.6875 -5.0625,3.625 -4.3125,5.03125 -0.46875,0.5 -4.09375,3.34375 -9.125,5.28125 -8.625,-3.375 z" style="fill:#cccccc;fill-opacity:1;stroke:#6e6e6e;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;display:inline" /> </a> </g> </svg>',
+                               true,
+                               false,
+                               'SVG with <a> link to a remote site'
+                       ),
+                       array(
+                               '<svg> <defs> <filter id="filter6226" x="-0.93243687" width="2.8648737" y="-0.24250539" height="1.4850108"> <feGaussianBlur stdDeviation="3.2344681" id="feGaussianBlur6228" /> </filter> <clipPath id="clipPath2436"> <path d="M 0,0 L 0,0 L 0,0 L 0,0 z" id="path2438" /> </clipPath> </defs> <g clip-path="url(#clipPath2436)" id="g2460"> <text id="text2466"> <tspan>12345</tspan> </text> </g> <path style="fill:#346733;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0;filter:url(\'#filter6226\');fill-opacity:1;opacity:0.79807692" d="M 236.82371,332.63732 C 236.92217,332.63732 z" id="path5618" /> </svg>',
+                               true,
+                               false,
+                               'SVG with local urls, including filter: in style'
+                       ),
+
+               );
        }
 }
 
@@ -143,4 +363,19 @@ class UploadTestHandler extends UploadBase {
 
                return $this->mTitleError;
        }
+
+       /**
+        * Almost the same as UploadBase::detectScriptInSvg, except it's
+        * public, works on an xml string instead of filename, and returns
+        * the result instead of interpreting them.
+        */
+       public function checkSvgString( $svg ) {
+               $check = new XmlTypeCheck(
+                       $svg,
+                       array( $this, 'checkSvgScriptCallback' ),
+                       false,
+                       array( 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback' )
+               );
+               return array( $check->wellFormed, $check->filterMatch );
+       }
 }
index 7125247..ec56b63 100644 (file)
@@ -110,7 +110,7 @@ class UploadFromUrlTest extends ApiTestCase {
                $this->user->addGroup( 'sysop' );
                $data = $this->doApiRequest( array(
                        'action' => 'upload',
-                       'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
+                       'url' => 'http://upload.wikimedia.org/wikipedia/mediawiki/b/bc/Wiki.png',
                        'asyncdownload' => 1,
                        'filename' => 'UploadFromUrlTest.png',
                        'token' => $token,
@@ -182,7 +182,7 @@ class UploadFromUrlTest extends ApiTestCase {
                $data = $this->doApiRequest( array(
                        'action' => 'upload',
                        'filename' => 'UploadFromUrlTest.png',
-                       'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
+                       'url' => 'http://upload.wikimedia.org/wikipedia/mediawiki/b/bc/Wiki.png',
                        'ignorewarnings' => true,
                        'token' => $token,
                ), $data );
@@ -213,7 +213,7 @@ class UploadFromUrlTest extends ApiTestCase {
                $this->doApiRequest( array(
                        'action' => 'upload',
                        'filename' => 'UploadFromUrlTest.png',
-                       'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
+                       'url' => 'http://upload.wikimedia.org/wikipedia/mediawiki/b/bc/Wiki.png',
                        'asyncdownload' => 1,
                        'token' => $token,
                        'leavemessage' => 1,
@@ -234,7 +234,7 @@ class UploadFromUrlTest extends ApiTestCase {
                        $this->doApiRequest( array(
                                'action' => 'upload',
                                'filename' => 'UploadFromUrlTest.png',
-                               'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
+                               'url' => 'http://upload.wikimedia.org/wikipedia/mediawiki/b/bc/Wiki.png',
                                'asyncdownload' => 1,
                                'token' => $token,
                                'leavemessage' => 1,
@@ -270,13 +270,16 @@ class UploadFromUrlTest extends ApiTestCase {
         * Helper function to perform an async upload, execute the job and fetch
         * the status
         *
+        * @param string $token
+        * @param bool $ignoreWarnings
+        * @param bool $leaveMessage
         * @return array The result of action=upload&statuskey=key
         */
        private function doAsyncUpload( $token, $ignoreWarnings = false, $leaveMessage = false ) {
                $params = array(
                        'action' => 'upload',
                        'filename' => 'UploadFromUrlTest.png',
-                       'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
+                       'url' => 'http://upload.wikimedia.org/wikipedia/mediawiki/b/bc/Wiki.png',
                        'asyncdownload' => 1,
                        'token' => $token,
                );
index fdd40b2..d5d1188 100644 (file)
@@ -68,7 +68,7 @@ class UploadStashTest extends MediaWikiTestCase {
                $stash->removeFile( $file->getFileKey() );
        }
 
-       public function provideInvalidRequests() {
+       public static function provideInvalidRequests() {
                return array(
                        'Check failure on bad wpFileKey' =>
                                array( new FauxRequest( array( 'wpFileKey' => 'foo' ) ) ),
@@ -84,7 +84,7 @@ class UploadStashTest extends MediaWikiTestCase {
                $this->assertFalse( UploadFromStash::isValidRequest( $request ) );
        }
 
-       public function provideValidRequests() {
+       public static function provideValidRequests() {
                return array(
                        'Check good wpFileKey' =>
                                array( new FauxRequest( array( 'wpFileKey' => 'testkey-test.test' ) ) ),
index 7e37534..73e4c1a 100644 (file)
@@ -6,6 +6,12 @@
 
 class MWCryptHKDFTest extends MediaWikiTestCase {
 
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgSecretKey', '5bf1945342e67799cb50704a7fa19ac6' );
+       }
+
        /**
         * Test basic usage works
         */
index 89759e5..0fdb8e1 100644 (file)
@@ -35,7 +35,9 @@ class StringUtilsTest extends MediaWikiTestCase {
        }
 
        /**
-        * Print high range characters as an hexadecimal
+        * Print high range characters as a hexadecimal
+        * @param string $string
+        * @return string
         */
        function escaped( $string ) {
                $escaped = '';
index ec51441..cff2e8f 100644 (file)
@@ -276,7 +276,7 @@ class LanguageTest extends LanguageClassesTestCase {
        }
 
        /**
-        * @return array format is ($len, $ellipsis, $input, $expected)
+        * @return array Format is ($len, $ellipsis, $input, $expected)
         */
        public static function provideHTMLTruncateData() {
                return array(
index 45d5ea8..8b6aef5 100644 (file)
@@ -31,7 +31,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * @param Page $page Page to add the revision to
         * @param string $text Revisions text
         * @param string $summary Revisions summare
-        *
+        * @return array
         * @throws MWException
         */
        protected function addRevision( Page $page, $text, $summary ) {
index a13f7bf..e2fc824 100644 (file)
@@ -810,4 +810,21 @@ class MaintenanceTest extends MediaWikiTestCase {
                $m2->simulateShutdown();
                $this->assertOutputPrePostShutdown( "foobar\n\n", false );
        }
+
+       /**
+        * @covers Maintenance::getConfig
+        */
+       public function testGetConfig() {
+               $this->assertInstanceOf( 'Config', $this->m->getConfig() );
+               $this->assertSame( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ), $this->m->getConfig() );
+       }
+
+       /**
+        * @covers Maintenance::setConfig
+        */
+       public function testSetConfig() {
+               $conf = $this->getMock( 'Config' );
+               $this->m->setConfig( $conf );
+               $this->assertSame( $conf, $this->m->getConfig() );
+       }
 }
index 016b7e0..a37a97c 100644 (file)
@@ -434,7 +434,7 @@ class TextPassDumperTest extends DumpTestCase {
         *   revision id increase further and further, while the text
         *   id of the first iteration is reused. The pages and revision
         *   of iteration > 1 have no corresponding representation in the database.
-        * @return string absolute filename of the stub
+        * @return string Absolute filename of the stub
         */
        private function setUpStub( $fname = null, $iterations = 1 ) {
                if ( $fname === null ) {
index b2141d3..4e38418 100644 (file)
@@ -101,7 +101,7 @@ class FetchTextTest extends MediaWikiTestCase {
         * @param WikiPage $page The page to add the revision to
         * @param string $text The revisions text
         * @param string $summary The revisions summare
-        *
+        * @return int
         * @throws MWException
         */
        private function addRevision( $page, $text, $summary ) {
index b2f7fac..e0a72fd 100644 (file)
@@ -35,6 +35,13 @@ class MockImageHandler {
         * a thumbnail at all. That is merely returning a ThumbnailImage that
         * will be consumed by the unit test.  There is no need to create a real
         * thumbnail on the filesystem.
+        * @param ImageHandler $that
+        * @param File $image
+        * @param string $dstPath
+        * @param string $dstUrl
+        * @param array $params
+        * @param int $flags
+        * @return ThumbnailImage
         */
        static function doFakeTransform( $that, $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
                # Example of what we receive:
index 647386d..2396ea2 100644 (file)
@@ -45,6 +45,7 @@ class ResourcesTest extends MediaWikiTestCase {
                $data = self::getAllModules();
                $illegalDeps = array( 'jquery', 'mediawiki' );
 
+               /** @var ResourceLoaderModule $module */
                foreach ( $data['modules'] as $moduleName => $module ) {
                        foreach ( $illegalDeps as $illegalDep ) {
                                $this->assertNotContains(
@@ -63,6 +64,7 @@ class ResourcesTest extends MediaWikiTestCase {
                $data = self::getAllModules();
                $validDeps = array_keys( $data['modules'] );
 
+               /** @var ResourceLoaderModule $module */
                foreach ( $data['modules'] as $moduleName => $module ) {
                        foreach ( $module->getDependencies() as $dep ) {
                                $this->assertContains(
@@ -85,6 +87,7 @@ class ResourcesTest extends MediaWikiTestCase {
                $data = self::getAllModules();
                $validDeps = array_keys( $data['modules'] );
 
+               /** @var ResourceLoaderModule $module */
                foreach ( $data['modules'] as $moduleName => $module ) {
                        $moduleTargets = $module->getTargets();
                        foreach ( $module->getDependencies() as $dep ) {
@@ -103,6 +106,7 @@ class ResourcesTest extends MediaWikiTestCase {
 
        /**
         * Get all registered modules from ResouceLoader.
+        * @return array
         */
        protected static function getAllModules() {
                global $wgEnableJavaScriptTest;
index f5cd892..14461be 100644 (file)
@@ -58,6 +58,8 @@ class StructureTest extends MediaWikiTestCase {
 
        /**
         * Filter to remove testUnitTestFileNamesEndWithTest false positives.
+        * @param string $filename
+        * @return bool
         */
        public function filterSuites( $filename ) {
                return strpos( $filename, __DIR__ . '/../suites/' ) !== 0;
index bd82d21..d4a7bd3 100644 (file)
@@ -95,6 +95,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
 
        /**
         * Remove the dummy uploads directory
+        * @param string $dir
         */
        private function teardownUploadDir( $dir ) {
                if ( $this->keepUploads ) {
index 1005316..e8c5121 100644 (file)
@@ -41,7 +41,7 @@
                // Add two characters using scary black magic
                spanText = $span.text();
                d = findDivergenceIndex( origText, spanText );
-               spanTextNew = spanText.substr( 0, d ) + origText[d] + origText[d] + '...';
+               spanTextNew = spanText.slice( 0, d ) + origText[d] + origText[d] + '...';
 
                assert.gt( spanTextNew.length, spanText.length, 'Verify that the new span-length is indeed greater' );
 
index f156c72..1d5656e 100644 (file)
                } );
        } );
 
-       QUnit.test( 'Deprecated callback methods', function ( assert ) {
-               QUnit.expect( 3 );
-
-               var api = new mw.Api();
-
-               this.suppressWarnings();
-
-               api.get( {}, function () {
-                       assert.ok( true, 'Function argument treated as success callback.' );
-               } );
-
-               api.get( {}, {
-                       ok: function () {
-                               assert.ok( true, '"ok" property treated as success callback.' );
-                       }
-               } );
-
-               api.get( { action: 'doesntexist' }, {
-                       err: function () {
-                               assert.ok( true, '"err" property treated as error callback.' );
-                       }
-               } );
-
-               this.restoreWarnings();
-
-               this.server.respondWith( /action=query/, function ( request ) {
-                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
-               } );
-
-               this.server.respondWith( /action=doesntexist/, function ( request ) {
-                       request.respond( 200, { 'Content-Type': 'application/json' },
-                               '{ "error": { "code": "unknown_action" } }'
-                       );
-               } );
-
-               this.server.respond();
-       } );
-
        QUnit.test( 'getToken( pre-populated )', function ( assert ) {
                QUnit.expect( 2 );
 
                );
        } );
 
+       QUnit.test( 'postWithToken( tokenType, params with assert )', function ( assert ) {
+               QUnit.expect( 2 );
+
+               var api = new mw.Api( { ajax: { url: '/postWithToken/api.php' } } );
+
+               api.postWithToken( 'testasserttoken', { action: 'example', key: 'foo', assert: 'user' } )
+                       .fail( function ( errorCode ) {
+                               assert.equal( errorCode, 'assertuserfailed', 'getToken fails assert' );
+                       } );
+
+               assert.equal( this.server.requests.length, 1, 'Request for token made' );
+               this.server.respondWith( /assert=user/, function ( request ) {
+                       request.respond(
+                               200,
+                               { 'Content-Type': 'application/json' },
+                               '{ "error": { "code": "assertuserfailed", "info": "Assertion failed" } }'
+                       );
+               } );
+
+               this.server.respond();
+       } );
+
        QUnit.test( 'postWithToken( tokenType, params, ajaxOptions )', function ( assert ) {
                QUnit.expect( 3 );
 
index 077ce70..5ece31b 100644 (file)
                }
        } );
 
+       QUnit.test( 'getRelativeText', 5, function ( assert ) {
+               var cases = [
+                       {
+                               text: 'asd',
+                               relativeTo: 123,
+                               expectedResult: ':Asd'
+                       },
+                       {
+                               text: 'dfg',
+                               relativeTo: 0,
+                               expectedResult: 'Dfg'
+                       },
+                       {
+                               text: 'Template:Ghj',
+                               relativeTo: 0,
+                               expectedResult: 'Template:Ghj'
+                       },
+                       {
+                               text: 'Template:1',
+                               relativeTo: 10,
+                               expectedResult: '1'
+                       },
+                       {
+                               text: 'User:Hi',
+                               relativeTo: 10,
+                               expectedResult: 'User:Hi'
+                       }
+               ], i, thisCase, title;
+
+               for ( i = 0; i < cases.length; i++ ) {
+                       thisCase = cases[i];
+
+                       title = mw.Title.newFromText( thisCase.text );
+                       assert.equal( title.getRelativeText( thisCase.relativeTo ), thisCase.expectedResult );
+               }
+       } );
 }( mediaWiki, jQuery ) );
index afa57ee..ece5116 100644 (file)
@@ -40,7 +40,8 @@
                        'gender-msg-currentuser': '{{GENDER:|blue|pink|green}}',
 
                        'plural-msg': 'Found $1 {{PLURAL:$1|item|items}}',
-
+                       // See https://bugzilla.wikimedia.org/69993
+                       '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}}}}',
 
@@ -53,7 +54,9 @@
 
                        'jquerymsg-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
 
-                       'external-link-replace': 'Foo [$1 bar]'
+                       'external-link-replace': 'Foo [$1 bar]',
+                       'external-link-plural': 'Foo {{PLURAL:$1|is [$2 one]|are [$2 some]|2=[$2 two]|3=three|4=a=b|5=}} things.',
+                       'plural-only-explicit-forms': 'It is a {{PLURAL:$1|1=single|2=double}} room.'
                }
        } ) );
 
@@ -84,7 +87,7 @@
                        } );
        }
 
-       QUnit.test( 'Replace', 9, function ( assert ) {
+       QUnit.test( 'Replace', 16, function ( assert ) {
                mw.messages.set( 'simple', 'Foo $1 baz $2' );
 
                assert.equal( formatParse( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
                        'Foo <a href="http://example.org/?x=y&amp;z">bar</a>',
                        'Href is not double-escaped in wikilink function'
                );
+               assert.equal(
+                       formatParse( 'external-link-plural', 1, 'http://example.org' ),
+                       'Foo is <a href="http://example.org">one</a> things.',
+                       'Link is expanded inside plural and is not escaped html'
+               );
+               assert.equal(
+                       formatParse( 'external-link-plural', 2, 'http://example.org' ),
+                       'Foo <a href=\"http://example.org\">two</a> things.',
+                       'Link is expanded inside an explicit plural form and is not escaped html'
+               );
+               assert.equal(
+                       formatParse( 'external-link-plural', 3 ),
+                       'Foo three things.',
+                       'A simple explicit plural form co-existing with complex explicit plural forms'
+               );
+               assert.equal(
+                       formatParse( 'external-link-plural', 4, 'http://example.org' ),
+                       'Foo a=b things.',
+                       'Only first equal sign is used as delimiter for explicit plural form. Repeated equal signs does not create issue'
+               );
+               assert.equal(
+                       formatParse( 'external-link-plural', 5, 'http://example.org' ),
+                       'Foo are <a href="http://example.org">some</a> things.',
+                       'Invalid explicit plural form. Plural fallback to the "other" plural form'
+               );
+               assert.equal(
+                       formatParse( 'external-link-plural', 6, 'http://example.org' ),
+                       'Foo are <a href="http://example.org">some</a> things.',
+                       'Plural fallback to the "other" plural form'
+               );
+               assert.equal(
+                       formatParse( 'plural-only-explicit-forms', 2 ),
+                       'It is a double room.',
+                       'Plural with explicit forms alone.'
+               );
        } );
 
-       QUnit.test( 'Plural', 3, function ( assert ) {
+       QUnit.test( 'Plural', 6, function ( assert ) {
                assert.equal( formatParse( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
                assert.equal( formatParse( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
                assert.equal( formatParse( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
+               assert.equal( formatParse( 'plural-msg-explicit-forms-nested', 6 ), 'Found 6 results', 'Plural message with explicit plural forms' );
+               assert.equal( formatParse( 'plural-msg-explicit-forms-nested', 0 ), 'Found no results in ' + mw.config.get( 'wgSiteName' ), 'Plural message with explicit plural forms, with nested {{SITENAME}}' );
+               assert.equal( formatParse( 'plural-msg-explicit-forms-nested', 1 ), 'Found 1 result', 'Plural message with explicit plural forms with placeholder nested' );
        } );
 
        QUnit.test( 'Gender', 15, function ( assert ) {
index 3bfabe4..16f90df 100644 (file)
                assert.equal( mw.language.getData( 'en', 'invalidkey' ), undefined, 'Getter setter test for mw.language with invalid key' );
        } );
 
+       QUnit.test( 'mw.language.commafy test', 9, function ( assert ) {
+               // Number grouping patterns are as per http://cldr.unicode.org/translation/number-patterns
+               assert.equal( mw.language.commafy( 1234.567, '###0.#####' ), '1234.567', 'Pattern with no digit grouping separator defined' );
+               assert.equal( mw.language.commafy( 123456789.567, '###0.#####' ), '123456789.567', 'Pattern with no digit grouping seperator defined, bigger decimal part' );
+               assert.equal( mw.language.commafy( 0.567, '###0.#####' ), '0.567', 'Decimal part 0' );
+               assert.equal( mw.language.commafy( '.567', '###0.#####' ), '0.567', 'Decimal part missing. replace with zero' );
+               assert.equal( mw.language.commafy( 1234, '##,#0.#####' ), '12,34', 'Pattern with no fractional part' );
+               assert.equal( mw.language.commafy( -1234.567, '###0.#####' ), '-1234.567', 'Negative number' );
+               assert.equal( mw.language.commafy( -1234.567, '#,###.00' ), '-1,234.56', 'Fractional part bigger than pattern.' );
+               assert.equal( mw.language.commafy( 123456789.567, '###,##0.00' ), '123,456,789.56', 'Decimal part as group of 3' );
+               assert.equal( mw.language.commafy( 123456789.567, '###,###,#0.00' ), '1,234,567,89.56', 'Decimal part as group of 3 and last one 2' );
+       } );
+
        function grammarTest( langCode, test ) {
                // The test works only if the content language is opt.language
                // because it requires [lang].js to be loaded.
                        grammarTest( langCode, test );
                }
        } );
+
+       QUnit.test( 'List to text test', 4, function ( assert ) {
+               assert.equal( mw.language.listToText( [] ), '', 'Blank list' );
+               assert.equal( mw.language.listToText( ['a'] ), 'a', 'Single item' );
+               assert.equal( mw.language.listToText( ['a', 'b'] ), 'a and b', 'Two items' );
+               assert.equal( mw.language.listToText( ['a', 'b', 'c'] ), 'a, b and c', 'More than two items' );
+       } );
 }( mediaWiki, jQuery ) );
index 9681330..7e0ee91 100644 (file)
@@ -32,9 +32,7 @@
 
        mw.loader.addSource(
                'testloader',
-               {
-                       loadScript: QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/load.mock.php' )
-               }
+               QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/load.mock.php' )
        );
 
        QUnit.test( 'Initial check', 8, function ( assert ) {
                // Confirm that mw.loader.load() works with protocol-relative URLs
                target = target.replace( /https?:/, '' );
 
-               assert.equal( target.substr( 0, 2 ), '//',
+               assert.equal( target.slice( 0, 2 ), '//',
                        'URL must be relative to test relative URLs!'
                );
 
index 4401ead..9b620de 100644 (file)
                );
 
                assert.equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
-               assert.strictEqual( $tbMW.next()[0], tbRL, 'Link is in the correct position (by passing nextnode)' );
+               assert.strictEqual( $tbMW.next()[0], tbRL, 'Link is in the correct position (nextnode as Node object)' );
 
                cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
                $cuQuux = $( cuQuux );
                tbRLDM = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm', 'List of all default modules ', 'd', '#t-rl' );
 
-               assert.equal( $( tbRLDM ).next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing CSS selector)' );
+               assert.strictEqual( $( tbRLDM ).next()[0], tbRL, 'Link is in the correct position (CSS selector as nextnode)' );
 
                caFoo = mw.util.addPortletLink( 'p-test-views', '#', 'Foo' );
 
                assert.strictEqual( $( caFoo ).find( 'span' ).length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
 
                addedAfter = mw.util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
-               assert.strictEqual( $( addedAfter ).next()[0], tbRL, 'Link is in the correct position (by passing a jQuery object as nextnode)' );
+               assert.strictEqual( $( addedAfter ).next()[0], tbRL, 'Link is in the correct position (jQuery object as nextnode)' );
 
                // test case - nonexistent id as next node
                tbRLDMnonexistentid = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-nonexistent', 'List of all default modules ', 'd', '#t-rl-nonexistent' );
 
-               assert.equal( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[0], 'Nonexistent id as nextnode adds the portlet at end' );
+               assert.equal( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[0], 'Fallback to adding at the end (nextnode non-matching CSS selector)' );
 
                // test case - empty jquery object as next node
                tbRLDMemptyjquery = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-empty-jquery', 'List of all default modules ', 'd', $( '#t-rl-nonexistent' ) );
 
-               assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[0], 'Empty jquery as nextnode adds the portlet at end' );
+               assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[0], 'Fallback to adding at the end (nextnode as empty jQuery object)' );
        } );
 
        QUnit.test( 'jsMessage', 1, function ( assert ) {
index dcab387..6011961 100644 (file)
@@ -1,7 +1,6 @@
 /*global isCompatible: true */
 ( function ( $ ) {
        var testcases = {
-               // Supported: Compatible
                gradeA: [
                        // Chrome
                        'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16',
                        'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1',
                        // Safari 5.0+
                        'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 10_6_7; ru-ru) AppleWebKit/534.31+ (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',
-                       // Opera 11+
-                       'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.10',
-                       // Internet Explorer 7+
-                       'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US)',
+                       // Opera 12+ (Presto-based)
+                       'Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00',
+                       'Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.17',
+                       // Opera 15+ (Chromium-based)
+                       'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 OPR/15.0.1147.153',
+                       'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 OPR/16.0.1196.62',
+                       'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 OPR/23.0.1522.75',
+                       // Internet Explorer 8+
                        'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)',
                        'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)',
                        'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
                        // Android
                        'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17'
                ],
-               // Supported: Uncompatible, serve basic content
                gradeC: [
-                       // Internet Explorer < 7
+                       // Internet Explorer < 8
                        'Mozilla/2.0 (compatible; MSIE 3.03; Windows 3.1)',
                        'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)',
                        'Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;)',
                        'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
                        'Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)',
-                       // Firefox < 3.6
+                       'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US)',
+                       // Firefox < 3
                        'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2',
                        'Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1.1) Gecko/20070311 Firefox/2.0.0.1',
+                       // Opera < 12
+                       'Mozilla/5.0 (Windows NT 5.0; U) Opera 7.54 [en]',
+                       'Opera/7.54 (Windows NT 5.0; U) [en]',
+                       'Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.0',
+                       'Opera/8.0 (X11; Linux i686; U; cs)',
+                       'Opera/9.00 (X11; Linux i686; U; de)',
+                       'Opera/9.62 (X11; Linux i686; U; en) Presto/2.1.1',
+                       'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.2.15 Version/10.00',
+                       'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.10',
+                       'Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62',
                        // BlackBerry < 6
                        'BlackBerry9300/5.0.0.716 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133',
                        'BlackBerry7250/4.0.0 Profile/MIDP-2.0 Configuration/CLDC-1.1',
@@ -75,8 +88,7 @@
                        // Google Glass
                        'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; Glass 1 Build/IMM76L; XE11) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
                ],
-               // No explicit support for or against these browsers, they're
-               // given a shot at Grade A at their own risk.
+               // No explicit support for or against these browsers, they're given a shot at Grade A.
                gradeX: [
                        // Firefox 3.6
                        'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
@@ -84,6 +96,7 @@
                        'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060928 (Debian|Debian-1.8.0.7-1) Epiphany/2.14',
                        'Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.6) Gecko/20070817 IceWeasel/2.0.0.6-g2',
                        // KHTML
+                       'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.4 (like Gecko)',
                        'Mozilla/5.0 (compatible; Konqueror/4.3; Linux) KHTML/4.3.5 (like Gecko)',
                        // Text browsers
                        'Links (2.1pre33; Darwin 8.11.0 Power Macintosh; x)',
index 2f5fa9e..b5fc800 100644 (file)
  */
 interface ITestRecorder {
 
-       /** Called at beginning of the parser test run */
+       /**
+        * Called at beginning of the parser test run
+        */
        public function start();
 
-       /** Called after each test */
+       /**
+        * Called after each test
+        * @param string $test
+        * @param bool $result
+        */
        public function record( $test, $result );
 
-       /** Called before finishing the test run */
+       /**
+        * Called before finishing the test run
+        */
        public function report();
 
-       /** Called at the end of the parser test run */
+       /**
+        * Called at the end of the parser test run
+        */
        public function end();
 
 }
@@ -107,6 +117,7 @@ class DbTestPreviewer extends TestRecorder {
 
        /**
         * This should be called before the table prefix is changed
+        * @param TestRecorder $parent
         */
        function __construct( $parent ) {
                parent::__construct( $parent );
@@ -220,6 +231,9 @@ class DbTestPreviewer extends TestRecorder {
         * Returns a string giving information about when a test last had a status change.
         * Could help to track down when regressions were introduced, as distinct from tests
         * which have never passed (which are more change requests than regressions).
+        * @param string $testname
+        * @param string $after
+        * @return string
         */
        private function getTestStatusInfo( $testname, $after ) {
                // If we're looking at a test that has just been removed, then say when it first appeared.
@@ -423,7 +437,7 @@ class TestFileIterator implements Iterator {
                $input = $this->checkSection( array( 'wikitext', 'input' ), false );
                $result = $this->checkSection( array( 'html/php', 'html/*', 'html', 'result' ), false );
                // some tests have "with tidy" and "without tidy" variants
-               $tidy = $this->checkSection( array( 'html/php+tidy', 'html+tidy'), false );
+               $tidy = $this->checkSection( array( 'html/php+tidy', 'html+tidy' ), false );
                if ( $tidy != false ) {
                        if ( $this->nextSubTest == 0 ) {
                                if ( $result != false ) {
@@ -475,9 +489,11 @@ class TestFileIterator implements Iterator {
 
        function readNextTest() {
                # Run additional subtests of previous test
-               while ( $this->nextSubTest > 0 )
-                       if ( $this->setupCurrentTest() )
+               while ( $this->nextSubTest > 0 ) {
+                       if ( $this->setupCurrentTest() ) {
                                return true;
+                       }
+               }
 
                $this->clearSection();
                # Reset hooks for the delayed test object
@@ -542,7 +558,7 @@ class TestFileIterator implements Iterator {
                                                $line = trim( $line );
 
                                                if ( $line ) {
-                                                       $delayedParserTest->requireTransparentHook( $line );
+                                                       $this->delayedParserTest->requireTransparentHook( $line );
                                                }
                                        }
 
@@ -554,8 +570,9 @@ class TestFileIterator implements Iterator {
                                if ( $this->section == 'end' ) {
                                        $this->checkSection( 'test' );
                                        do {
-                                               if ( $this->setupCurrentTest() )
+                                               if ( $this->setupCurrentTest() ) {
                                                        return true;
+                                               }
                                        } while ( $this->nextSubTest > 0 );
                                        # go on to next test (since this was disabled)
                                        $this->clearSection();
@@ -600,6 +617,7 @@ class TestFileIterator implements Iterator {
         * mentioned before closing this section
         * @param bool $fatal True iff an exception should be thrown if
         * the section is not found.
+        * @return bool|string
         */
        private function checkSection( $tokens, $fatal = true ) {
                if ( is_null( $this->section ) ) {
@@ -672,6 +690,7 @@ class DelayedParserTest {
         * Called whenever we actually want to run the hook.
         * Should be the case if we found the parserTest is not disabled
         * @param ParserTest|NewParserTest $parserTest
+        * @return bool
         */
        public function unleash( &$parserTest ) {
                if ( !( $parserTest instanceof ParserTest || $parserTest instanceof NewParserTest )     ) {
index d8ed246..3d8612d 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -32,7 +32,7 @@ if ( defined( 'THUMB_HANDLER' ) ) {
        wfThumbHandle404();
 } else {
        // Called directly, use $_GET params
-       wfThumbHandleRequest();
+       wfStreamThumb( $_GET );
 }
 
 wfLogProfilingData();
@@ -43,19 +43,6 @@ $factory->shutdown();
 
 //--------------------------------------------------------------------------
 
-/**
- * Handle a thumbnail request via query parameters
- *
- * @return void
- */
-function wfThumbHandleRequest() {
-       $params = get_magic_quotes_gpc()
-               ? array_map( 'stripslashes', $_GET )
-               : $_GET;
-
-       wfStreamThumb( $params ); // stream the thumbnail
-}
-
 /**
  * Handle a thumbnail request via thumbnail file URL
  *